首页 > > > 这是一段用面向过程的方式写的一个简单计算器,
#include
struct {
chardata[MaxSize];//用于存放运算符int top;
} op;
inti =0;//exp_new的下标intdh =1;
op.top = -1;
while(*exp_old !='\0')//一直循环直到检测到式子结束 {
switch(*exp_old)//检测输入表达式中的每一个字符 {
case'(':
op.top++;//top就变成了0op.data[op.top] = *exp_old;//检测到左括号时将左括号装进data数组的第一个元素里面dh =1;
exp_old++;break;//完成左括号的入栈之后就开始往后面检测case')':
while(op.data[op.top] !='(')
{
exp_new[i] = op.data[op.top];
op.top--; i++;
}
op.top--; exp_old++; dh =0;break;
case'+':
case'-':
if(dh ==1)
{
if(*exp_old =='-')
op.top++;
op.data[op.top] ='@';
exp_old++;break;
}
while(op.top != -1&& op.data[op.top] !='(')
{
exp_new[i] = op.data[op.top];
op.top--;
i++;
}
op.top++;
op.data[op.top] = *exp_old;
exp_old++;
dh =0;break;
case'*':
case'/':
while(op.data[op.top] =='*'|| op.data[op.top] =='/'|| op.data[op.top] =='s')
{
exp_new[i] = op.data[op.top];
op.top--;
i++;
}
op.top++;
op.data[op.top] = *exp_old;
exp_old++;
dh =0;break;
case'^':
while(op.data[op.top] =='^')
{
exp_new[i] = op.data[op.top];
op.top--;
i++;
}
op.top++;
op.data[op.top] = *exp_old;
exp_old++; dh =0;break;
case'%':
while(op.data[op.top] =='%')
{
exp_new[i] = op.data[op.top];
op.top--;
i++;
}
op.top++;
op.data[op.top] = *exp_old;
exp_old++;
dh =0;break;
case'': exp_old++;break;
case's':
case'S':
if((*(exp_old +1) =='i'|| *(exp_old +1) =='I') && (*(exp_old +2) =='n'|| *(exp_old +2) =='N'))
{
op.top++;
op.data[op.top] ='s';
exp_old +=3;
dh =0;break;
}
elseif((*(exp_old +1) =='q'|| *(exp_old +1) =='Q') && (*(exp_old +2) =='r'|| *(exp_old +2) =='R') && (*(exp_old +3) =='t'|| *(exp_old +3) =='T'))
{
op.top++;
op.data[op.top] ='q';
exp_old +=4;
dh =0;break;
}
else
{
cout<<"\n有错误符号s";
return0;
}
case'c':
case'C':
if((*(exp_old +1) =='o'|| *(exp_old +1) =='O') && (*(exp_old +2) =='s'|| *(exp_old +2) =='S'))
{
op.top++;
op.data[op.top] ='c';
exp_old +=3;
dh =0;break;
}
else
{
cout<<"\n有错误符号s";
return0;
}
case'T':
case't':
if((*(exp_old +1) =='a'|| *(exp_old +1) =='A') && (*(exp_old +2) =='n'|| *(exp_old +2) =='N'))
{
op.top++;
op.data[op.top] ='t';
exp_old +=3;
dh =0;break;
}
else
{
cout<<"\n有错误符号s";
return0;
}
case'e':
case'E':
if((*(exp_old +1) =='x'|| *(exp_old +1) =='X') && (*(exp_old +2) =='p'|| *(exp_old +2) =='P'))
{
op.top++;
op.data[op.top] ='e';
exp_old +=3;
dh =0;break;
}
else
{
cout<<"\n有错误符号s";
return0;
}
case'a':
case'A':
if((*(exp_old +1) =='b'|| *(exp_old +1) =='B') && (*(exp_old +2) =='s'|| *(exp_old +2) =='S'))
{
op.top++;
op.data[op.top] ='a';
exp_old +=3;
dh =0;break;
}
else
{
cout<<"\n有错误符号s";
return0;
}
case'l':
case'L':
if((*(exp_old +1) =='o'|| *(exp_old +1) =='O') && (*(exp_old +2) =='g'|| *(exp_old +2) =='G'))
{
op.top++;
op.data[op.top] ='g';
exp_old +=3;
dh =0;break;
}
elseif((*(exp_old +1) =='n'|| *(exp_old +1) =='N'))
{
op.top++;
op.data[op.top] ='n';
exp_old +=2;
dh =0;break;
}
else
{
cout<<"\n有错误符号s";
return0;
}
default:
while(*exp_old >='0'&& *exp_old <='9')
{
exp_new[i] = *exp_old; i++;
exp_old++;
}
if(*exp_old =='.')
{
exp_new[i] ='.'; i++; exp_old++;
while(*exp_old >='0'&& *exp_old <='9')
{
exp_new[i] = *exp_old; i++;
exp_old++;
}
}
exp_new[i] ='#'; i++; dh =0;
}
}
while(op.top != -1)
{
exp_new[i] = op.data[op.top];
i++; op.top--;
}
exp_new[i] ='\0';
return1;
}doublecompvalue(char*exp_new)
{
struct {
float data[MaxSize];
int top;
} st;
double d, x;
st.top = -1;
while(*exp_new !='\0')
{
switch(*exp_new)
{
case'+':st.data[st.top -1] = st.data[st.top -1] + st.data[st.top];
st.top--;break;
case'-':st.data[st.top -1] = st.data[st.top -1] - st.data[st.top];
st.top--;break;
case'*':st.data[st.top -1] = st.data[st.top -1] * st.data[st.top];
st.top--;break;
case'/':
if(st.data[st.top] !=0)
st.data[st.top -1] = st.data[st.top -1] / st.data[st.top];
else {
cout<<"\n\t除数不能为零!\n";
return0;
}
st.top--;break;
case'^':st.data[st.top -1] = pow(st.data[st.top -1], st.data[st.top]);
st.top--;break;
case'%':st.data[st.top -1] = fmod(st.data[st.top -1], st.data[st.top]);
st.top--;break;
case'@':st.data[st.top] = -(st.data[st.top]);
break;
case's':st.data[st.top] = sin(st.data[st.top]);
break;
case'c':st.data[st.top] = cos(st.data[st.top]);
break;
case'q':
if(st.data[st.top] >=0)
st.data[st.top] = sqrt(st.data[st.top]);
else {
cout<<"\n\t开方内的数不能小于零!\n";
return0;
}
break;
case'e':st.data[st.top] = exp(st.data[st.top]);
break;
case't':st.data[st.top] = tan(st.data[st.top]);
break;
case'a':st.data[st.top] = abs(st.data[st.top]);
break;
case'g':
if(st.data[st.top]>0)
st.data[st.top] = log10(st.data[st.top]);
else {
cout<<"\n\tlog10内的数不能小于等于零!\n";
return0;
}
break;
case'n':
if(st.data[st.top]>0)
st.data[st.top] = log(st.data[st.top]);
else {
cout<<"\n\tln内的数不能小于等于零!\n";
return0;
}
break;
default:
d =0;
while(*exp_new >='0'&& *exp_new <='9')
{
d =10* d + (*exp_new -'0');
exp_new++;
}
x =0.1;
if(*exp_new =='.')
{
exp_new++;
while(*exp_new >='0'&& *exp_new <='9')
{
d = d + x*(*exp_new -'0');
x *=0.1;
exp_new++;
}
}
st.top++; st.data[st.top] = d;
}
exp_new++;
}
return st.data[st.top];
}intmain(intargc,char* argv[])
{
charexp[300], exp_new[400];
cout <<"Please enter:";
while(1)
{
cout <<"请输入一个表达式:(按0结束本程序)\n";
cin >> exp;
if(strcmp(exp,"0") ==0)
return0;
if(trans(exp, exp_new) ==1)
{
doubleres = compvalue(exp_new);
cout <<"="<< res << endl;
}
}
return0;
}
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/4565/viewspace-3138205/ ,如需转载,请注明出处,否则将追究法律责任。