ITPub博客

首页 > > > 这是一段用面向过程的方式写的一个简单计算器,

这是一段用面向过程的方式写的一个简单计算器,

作者:jenliang 时间:2019-09-24 15:08:20 0 删除 编辑

#include #include #include usingnamespace std;constintMaxSize =300;inttrans(char*exp_old,charexp_new[])//算法核心:将中缀表达式转化为后缀表达式 ,其中exp_old为原表达式,exp_new为转化后的表达式{

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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-07-15

  • 博文量
    189
  • 访问量
    858