如何把一个表达式(用户输入的),形如"3.4+3*x"的字符串,插入到代码中,如z=3.4+3*x(double z,x;在程序中已经定义了)。
我看了一些资料,都是不带变量的所谓“常式”,如"1+1+5*5"。它们可以用堆栈处理。但是怎么用堆栈处理带变量的变式呢?另外,还有人用cl.exe带动态库的方法来处理,具体应该怎么做。
附:我的程序主要内容是用户输入公式(表达式的字符串),然后我通过公式计算一些结论。
我看了一些资料,都是不带变量的所谓“常式”,如"1+1+5*5"。它们可以用堆栈处理。但是怎么用堆栈处理带变量的变式呢?另外,还有人用cl.exe带动态库的方法来处理,具体应该怎么做。
附:我的程序主要内容是用户输入公式(表达式的字符串),然后我通过公式计算一些结论。
解决方案 »
- VC 2008 导入Microsoft excel 11.0 object library后出错
- 关于静态控件响应鼠标消息的问题
- 请问在VC中如何实现显示桌面的功能即全部最小化显示桌面以及恢复
- 10038 ------->>dlg->msgsock[msgcount]=accept(dlg->sock,(SOCKADDR*)&(dlg->serv),&len);
- [COM新手提问]COM组件调用不起来,达人来看看
- 程序调用另外一个程序可否把被调用程序作为子窗口固定在调用程序窗口内的某一个区域内(frame)?
- 有没有功能与PostThreadMessage基本相似,只不过它是在线程处理完其发送的消息后才返回的函数?
- 有关在vc中运用DataGrid的问题
- 请问,如何插入内容
- VC 怎么获取windows7系统管理员权限!!!
- 关于坐标系的问题
- ●●我的SQL语句特别长,在watch窗口中只能显示一部分。怎样才能全部显示出来?●●
http://www.csdn.net/cnshare/soft/4/4589.shtm
具体的思想是,把数据和操作符从一个纯虚类继承出来,实现相同的操作,比如operate。数据类的operate返回数据,操作类的operate返回对数据操作后的结果。在你解析字符串的时候,需要把所有的内容做成一个二叉数的逻辑结构,最外层叶子为数据,中间的为操作。这样的话,对于计算就比较简单了。计算时,只需要调用root节点的operate即可。
对于未知数,只需要对特定的数据节点赋值即可实现。
//用递归方式求解表达式
//本程序在Borland C++ 3.1下编译通过,
#include <iostream.h>
#include <math.h>
#define N 200
#define Q 0x3a
//#define Q 0x35
//char a[10]="5((x+x)*x)";
//char a[10]="5((x*x)+x)";
//char a[10]="5(x*x)";
//char a[15]="5(x*((x*x)+x))";
char a[100]="5((((x+x)*(x*x))*((x*x)+(x+x)))+x)";
int az=5;
int sc(char aa[N]);
int t(char s[N]);
main()
{
a[0]=Q;
cout<<t(a);
cin>>az;
}
int t(char s[N])
{
int lj=0,i,kh=0;
char aa[N],bb[N];
if(s[1]=='x')return(1);
else
{
do
{
lj++;
if(s[lj]=='(')kh++;
if(s[lj]==')')kh--;
}while((s[lj]!='+'&&s[lj]!='*')||kh!=1);aa[0]=a[0];
bb[0]=a[0];
for(i=2;i<lj;i++)
aa[i-1]=s[i];
for(i=lj+1;i<=N;i++)
bb[i-lj]=s[i];
// cout<<"aa="<<aa<<" bb="<<bb<<endl;;
if(s[lj]=='+')
return t(aa)+t(bb);
if(s[lj]=='*')
return t(aa)*sc(bb)+sc(aa)*t(bb);
}
}
int sc(char aa[N])
{
int b[N]={{0}};
char d[N];//B为系数 C为指数栈 D为符号栈
int ks=1,kf=1,kh=1,i=0;//ks系数指针 kf符号指针 kh括号计数if(aa[1]=='x')return(a[0]-0x30);
do
{
i++;
switch(aa[i])
{
case '(':
kh++;
break;
case 'x':
b[ks]=a[0]-0x30;ks++;
break;
case '+':
d[kf]='+';kf++;
break;
case '*':
d[kf]='*';kf++;
break;
case ')':
if(kh!=1)
{
kh--;
kf--;
if(d[kf]=='+')
{
b[ks-2]=b[ks-2]+b[ks-1];
ks--;b[ks]=0;
}
if(d[kf]=='*')
{
b[ks-2]=b[ks-2]*b[ks-1];
ks--;b[ks]=0;
}
}
}
}while(kh!=1);
// cout<<"sc aa="<<aa<<" "<<b[1]<<endl;
return b[1];
}