求C++编写的科学计算器源代码

最近刚学习了C++语言。一次在用计算器时,突然想到用C++实现计算器功能。细想之下,发现这问题实在是很难啊。求高手赐教代码该怎么编?百度上的其他答案都不行啊。不是太过简单就是不能够运行。我主要想了解基本的算法怎么实现?类该怎样设计?要求能实现含括号在内的混合四则运算。比如输入(3+5*2)/2之类的表达式,就能输出双精度型结果。首先是怎么存储这个表达是我就郁闷了好久,用double的话,操作符怎么办?用char的话,操作数怎么办?分开存储的话,怎么分?优先级如何解决?各位大侠们帮帮忙啦!最好能有源代码。如果代码太长懒得打的话,请教教我算法的设计和类的设计。最好能详细点,我是一个初学者。先多谢啦!

#include <iostream.h>
#include <malloc.h>
#include <stdio.h>

#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OK 1
#define ERROR 0
#define TRUE 1
#define FLASE 0
#define OVERFLOW 0
typedef int Status;
typedef double SElemType;
typedef struct {
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
Status InitStack(SqStack &S) //构造一个空栈
{
S.base = ( SElemType * )malloc(STACK_INIT_SIZE * sizeof(SElemType) );
if(!S.base) return OVERFLOW;
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}
Status Push(SqStack &S,SElemType e)//入栈操作
{
*S.top++=e;
return OK;
}
Status Pop(SqStack &S,SElemType &e)//出栈操作
{
if(S.top==S.base) return ERROR;
e=*--S.top;
return OK;
}
double GetTop(SqStack S)//取栈顶元素
{
if(S.base==S.top) return 0;
SElemType e=*(S.top-1);
return e;
}
int In(char c)//判断是不是运算数
{
if(c<='9'&&c>='0'||c=='.') return 0;
else return 1;
}
char Precede(char a,char c)//判断运算符的优先关系
{
char b[7][7]={'>','>','<','<','<','>','>',
'>','>','<','<','<','>','>',
'>','>','>','>','<','>','>',
'>','>','>','>','<','>','>',
'<','<','<','<','<','=',' ',
'>','>','>','>',' ','>','>',
'<','<','<','<','<',' ','='};
int i,j;
switch(a){
case '+' : i=0;break;
case '-' : i=1;break;
case '*' : i=2;break;
case '/' : i=3;break;
case '(' : i=4;break;
case ')' : i=5;break;
case '#' : i=6;break;}
switch(c){
case '+' : j=0;break;
case '-' : j=1;break;
case '*' : j=2;break;
case '/' : j=3;break;
case '(' : j=4;break;
case ')' : j=5;break;
case '#' : j=6;break;}
return b[i][j];
}
double operate (double a,double theta,double b)//计算表达式
{ //a-=48,b-=48; //ascll码变为数字
int theta1=theta;
switch(theta1){
case '+':
return a+b;
case '-':
return a-b;
case '*':
return a*b;
case '/':
return a/b;
default : return 0;
}//switch
}
double EvaluateExpress()
{ SqStack OPTR,OPND;
InitStack(OPTR);
Push(OPTR, '#');
InitStack(OPND);
cout<<"输入整个表达式,以#号键结束"<
double x,a,b;
double theta;
char c=getchar();
while(c!='#'|| GetTop(OPTR)!='#'){
if(!In(c)) {
double d=c-48,dian=0; //化为10进制
for( c=getchar();In(c)==0;c=getchar())/*读入数字序列*/
if(c=='.')
{dian=1;}
else
{d=10*d+c-48;dian=dian*10.;}
if(dian!=0.)d=d/dian;
Push(OPND,d);
} //c为运算数,先化ASCll码为十进制数,再入OPND栈,
//if(In(c))//不能只用一个else,否则发生错误
switch(Precede(GetTop(OPTR),c)){
case '<':
Push(OPTR, c);c=getchar(); //栈顶元素优先?
break;
case '=':
Pop(OPTR, x); c=getchar(); //脱括号并接受下一个字符
break;
case '>': //退栈并将运算结果入栈
Pop(OPTR,theta);
Pop(OPND,b);
Pop(OPND,a);
Push(OPND,operate(a,theta,b));
break;
case ' ':
return ERROR;
}//switch
}//while
return GetTop(OPND);
}
void main()
{double result;
result=EvaluateExpress();
cout<<"表达式的运算结果是"<<
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-06-11
给你个地址,自己去下载。
★★[源码库]811款导弹-制导-弹道-惯性导航-GPS-雷达等仿真源代码★★
http://bbs.81tech.com/read.php?tid=209564

其中有两款计算机源代码:
1. 科学计算器程序--VC++源代码.rar (30 K)
2. 非常实用的一款计算器-VC++源代码.rar (138 K)本回答被提问者采纳
第2个回答  2010-06-11
用字符串(CString)类存储,然后判断是字符还是数字或者是括号,然后可以将其采用2叉树进行存储,然后从2叉树的子叶计算到跟就可以计算出结果,在将字符串转存成2叉树是,遇见“(”就分支,在计算时,遇见“)”就求子树结果,等到达根时就可求出结果了。
第3个回答  2010-06-11
Reverse Polish Notion Using Stacks

infix (1+3)+7
postfix 1 3 +7+
prefix +1 3+7

计算器一般用的是 postfix (可先将infix 转化为postfix )这两个都有现成的算法
相似回答