您的位置:首页 > 运维架构

表达式四则运算。

2008-05-03 12:32 483 查看
实现方法一:用递归来实现。


CString CCalculatorDlg::calc(CString str)




...{




CString str1,str2,str3,str4;


str.Replace("+-","-");


str.Replace("--","+");


char ch = opera(str);


str4 = str;


switch( ch )




...{




case '(':


str1 = str.Left(str.Find('('));


str2 = str.Right(str.GetLength() - str.Find('(') - 1);


str2 = str2.Left(str2.Find(')'));


if (str2.Find('(') != -1)




...{


str1 = str1+'(';


str2.Delete(str2.Find('('), 1);


}


str3 = str.Right(str.GetLength() - str.Find(')') - 1);


return calc(str1 + calc(str2) + str3);


break;




case '+':


str4.Delete(str.Find("+"), 1);


if ((opera(str4) == '1') || (opera(str4) == '-'))




...{


str1 = str.Left(str.Find('+'));


float a = atof(str1);


str3 = str.Right(str.GetLength() - str.Find('+') - 1);


float b = atof(str3);


float c = a+b;


str2 = "";


str2.Format("%f",c);


return str2;


}


else




...{


str1 = str.Left(str.Find('+'));


str2 = str.Right(str.GetLength() - str.Find('+') - 1);


return calc(calc(str1) + '+' + calc(str2));


}


break;




case '-':


str4.Delete(str.Find("-"), 1);


if (opera(str4) == '1')




...{


str1 = str.Left(str.Find('-'));


float a = atof(str1);


str3 = str.Right(str.GetLength() - str.Find('-') - 1);


float b = atof(str3);


float c = a-b;


str2 = "";


str2.Format("%f",c);


return str2;


}


else if (opera(str4) == '*')




...{


str1 = str4.Left(str4.Find('*'));


float a = atof(str1);


str3 = str4.Right(str4.GetLength() - str4.Find('*') - 1);


float b = atof(str3);


float c = a*b;


str2 = "";


str2.Format("%f",c);


return "-" + str2;


}


else if (opera(str4) == '/')




...{


str1 = str.Left(str4.Find('/'));


float a = atof(str1);


str3 = str.Right(str4.GetLength() - str4.Find('/') - 1);


float b = atof(str3);


float c = a/b;


str2 = "";


str2.Format("%f",c);


return "-" + str2;


}


else




...{


str1 = str.Left(str.Find('-'));


str2 = str.Right(str.GetLength() - str.Find('-') - 1);


if (str1 != "")




...{


return calc(calc(str1) + '-' + calc(str2));


}


else




...{


return calc('-' + calc(str2));


}


}


break;




case '*':


str4.Delete(str.Find("*"), 1);


if (opera(str4) == '1')




...{


str1 = str.Left(str.Find('*'));


float a = atof(str1);


str3 = str.Right(str.GetLength() - str.Find('*') - 1);


float b = atof(str3);


float c = a*b;


str2 = "";


str2.Format("%f",c);


return str2;


}




else




...{


str1 = str.Left(str.Find('*'));


str2 = str.Right(str.GetLength() - str.Find('*') - 1);


return calc(calc(str1) + '*' + calc(str2));


}


break;




case '/':


str4.Delete(str.Find("/"), 1);


if (opera(str4) == '1')




...{


str1 = str.Left(str.Find('/'));


float a = atof(str1);


str3 = str.Right(str.GetLength() - str.Find('/') - 1);


float b = atof(str3);


float c = a/b;


str2 = "";


str2.Format("%f",c);


return str2;


}


else




...{


str1 = str.Left(str.Find('/'));


str2 = str.Right(str.GetLength() - str.Find('/') - 1);


return calc(calc(str1) + '/' + calc(str2));


}


break;






default:


return str;


}


}




char CCalculatorDlg::opera(CString str)




...{


if (str.Find("(") != -1)




...{


return '(';


}


if (str.Find("+") != -1)




...{


return '+';


}


if (str.Find("-") != -1)




...{


return '-';


}




if (str.Find("*") != -1)




...{


return '*';


}


if (str.Find("/") != -1)




...{


return '/';


}




return '1';//字符串中不包含以上几种符号。


}



实现方法二:用堆栈来实现。

此程序只能实现1-9的四则运算。在表达式最后加一个‘#’表示表达式结束进行运算。


#include<stdio.h>


#include<stdlib.h>


#define stack_init_size 100


#define increment 10




typedef struct




...{


char *base;


char *top;


int stacksize;


}sqstack;




typedef struct




...{


int *base;


int *top;


int stacksize;


}sqstackint;






void initstack(sqstack &s)/**//*构造char空栈*/




...{


s.base=(char *)malloc(stack_init_size*sizeof(char));


if(!s.base) printf("申请栈失败!!! ");


s.top=s.base;


s.stacksize=stack_init_size;


}






void initstackint(sqstackint &s) /**//*构造int空栈*/




...{


s.base=(int *)malloc(stack_init_size*sizeof(int));


if(!s.base) printf("申请栈失败!!! ");


s.top=s.base;


s.stacksize=stack_init_size;


}






char gettop(sqstack s) /**//*取char栈顶元素*/




...{


if(s.top==s.base) printf("错误!!! ");


s.top=s.top-1;


return(*(s.top));


}




int gettopint(sqstackint s)/**//*取int栈顶元素*/




...{


if(s.top==s.base) printf("错误!!! ");


s.top=s.top-1;


return(*(s.top));


}






void push(sqstack &s,char e)/**//*将e压入栈*/




...{




if(s.top-s.base>=s.stacksize)...{


s.base=(char *)realloc(s.base,(s.stacksize+increment)*sizeof(char));


if(!s.base) printf("额外申请空间失败!!! ");


s.top=s.base+s.stacksize;


s.stacksize+=increment;


}


*(s.top)=e;


s.top=s.top+1;


}




void pushint(sqstackint &s,int e) /**//*将e压入栈*/




...{




if(s.top-s.base>=s.stacksize)...{


s.base=(int *)realloc(s.base,(s.stacksize+increment)*sizeof(int));


if(!s.base) printf("额外申请空间失败!!! ");


s.top=s.base+s.stacksize;


s.stacksize+=increment;


}


*(s.top)=e;


s.top=s.top+1;


}






void pop(sqstack &s,char &e)/**//*将栈顶元素出栈*/




...{


if(s.top==s.base) printf("错误!!! ");


s.top=s.top-1;


e=*(s.top);


}






void popint(sqstackint &s,int &e)/**//*将栈顶元素出栈*/




...{


if(s.top==s.base) printf("错误!!! ");


s.top=s.top-1;


e=*(s.top);


}






int compare(char c) /**//*比较c是否为数字,是则返回1,否则返回0*/




...{


if((c!='+')&&(c!='-')&&(c!='*')&&(c!='/')&&(c!='(')&&(c!=')')&&(c!='#'))


return 1;


return 0;


}






char precede(char c1,char c2)/**//*比较算符的优先级*/




...{


if(c1=='+')




...{


switch(c2)




...{


case'+':return('>');break;


case'-':return('>');break;


case'*':return('<');break;


case'/':return('<');break;


case'(':return('<');break;


case')':return('>');break;


case'#':return('>');break;


default:printf("比较出错! ");break;


}


}


else if(c1=='-')




...{


switch(c2)




...{


case'+':return('>');break;


case'-':return('>');break;


case'*':return('<');break;


case'/':return('<');break;


case'(':return('<');break;


case')':return('>');break;


case'#':return('>');break;


default:printf("比较出错! ");break;


}


}


else if(c1=='*')




...{


switch(c2)




...{


case'+':return('>');break;


case'-':return('>');break;


case'*':return('>');break;


case'/':return('>');break;


case'(':return('<');break;


case')':return('>');break;


case'#':return('>');break;


default:printf("比较出错! ");break;


}


}


else if(c1=='/')




...{


switch(c2)




...{


case'+':return('>');break;


case'-':return('>');break;


case'*':return('>');break;


case'/':return('>');break;


case'(':return('<');break;


case')':return('>');break;


case'#':return('>');break;


default:printf("比较出错! ");break;


}


}


else if(c1=='(')




...{


switch(c2)




...{


case'+':return('<');break;


case'-':return('<');break;


case'*':return('<');break;


case'/':return('<');break;


case'(':return('<');break;


case')':return('=');break;


default:printf("比较出错! ");break;


}


}


else if(c1==')')




...{


switch(c2)




...{


case'+':return('>');break;


case'-':return('>');break;


case'*':return('>');break;


case'/':return('>');break;


case')':return('>');break;


case'#':return('>');break;


default:printf("比较出错! ");break;


}


}


else if(c1=='#')




...{


switch(c2)




...{


case'+':return('<');break;


case'-':return('<');break;


case'*':return('<');break;


case'/':return('<');break;


case'(':return('<');break;


case'#':return('=');break;


default:printf("比较出错! ");break;


}


}


else return('0');


}




int operate(int c1,char theta,int c2)/**//*进行二元运算*/




...{


if(theta=='+')




...{


return(c1+c2);


}


if(theta=='-')




...{


return(c1-c2);


}


if(theta=='*')




...{


return(c1*c2);


}


if(theta=='/')




...{


return(c1/c2);


}


return(0);


}




/**//*此实验仅能实现[-9~9]之间数据的运算*/


void main()




...{


char c,theta,x;


int m,c1,c2,y;


printf("此程序仅能实现[-9~9]之间数据的运算,#号为结束运算的标志。 ");


printf("请输入计算表达式: ");


sqstack optr;


sqstackint opnd;


initstack(optr);


push(optr,'#');


initstackint(opnd);


while(1)




...{


c=getchar();


while(c!='#'||gettop(optr)!='#')




...{




if(compare(c))...{m=c-'0';pushint(opnd,m);c=getchar();}


else


switch(precede(gettop(optr),c))




...{


case'<':


push(optr,c);c=getchar();break;


case'=':


pop(optr,x);c=getchar();break;


case'>':


pop(optr,theta);popint(opnd,c2);


popint(opnd,c1);


pushint(opnd,operate(c1,theta,c2));break;


}


}


y=gettopint(opnd);


printf("运算结果为:%d ",y);getchar();


}


}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  opera c