您好,欢迎访问三七文档
当前位置:首页 > 幼儿/小学教育 > 小学教育 > C++四则运算程序代码
1四则表达式计算一、程序分析和设计把整个表达式存为字符数组,按照四则运算规则寻找其中的运算符号,然后提取左右两侧操作数计算,用计算结果替换掉计算的表达式,这样整体表达式会被简化,继续重复这个过程,直到找不到运算符为止。1)运算表达式的存储定义字符数组来存储即可,注意由于运算过程中可能会出现小数,而小数会导致表达式长度增加,所以定义时字符数组长度应该足够(比如1000)并且计算结果应该减少精度,比如保留小数点后面三位。2)数和字符数组之间的转化提取出来的操作数实际为字符序列,计算前我使用atof(定义在stdlib.h)转化为浮点数运算,同样的,运算结果要替换表达式中的字符序列也需要先转化为字符串才行,我使用sprintf函数,该函数定义在stdio.h中字符串的连接使用了strcat(string.h)等函数。3)计算逻辑设pstr为计算表达式//先算乘除for(inti=1;istrlen(pstr);i++){If(如果当前位置字符为*或者/){把运算符保存在ysf中从该位置左边找前边的操作符获取左边要计算的数据coml和该数据前的字符串strleft从该位置右边找后边的操作符获取右边要计算的数据comr和该数据后的字符串strright将数据变换成浮点型运算再转换为字符型的结果连接strleft+结果+stright组成新字符串替换掉pstr}}//再找加减//代码与找乘除的过程类似2为了代码简单,中途设计了几个计算函数doublejia(charx[],chary[]);//字符加法返回double的值doublejian(charx[],chary[]);//字符减法返回double的值doublecheng(charx[],chary[]);//字符乘法返回double的值doublechu(charx[],chary[]);//字符除法返回double的值doublexsd(charx[]);//字符检测是否有小数,返回double的值为了可以重复输入,开头使用了个dowhile,为了可以输入-1+2这种表达式,我设计了个判断,如果第一字符是+或-我给整体表达式前加了个0字符这样就转化为一般的字符了!如果是*/则提示出错,别重新输入!二、程序主要代码#includeiostream.h#includestdlib.h//atof函数的头文件#includestdio.h//sprintf函数的头文件#defineMAX255//宏定义常量#includestring.hdoublecmjia(charx[],chary[]);//声明函数doublecmjian(charx[],chary[]);doublecmcheng(charx[],chary[]);doublecmchu(charx[],chary[]);doublecompute(charpstr[]);doublexsd(charx[]);//主函数voidmain(){do{doublet;//存储运算结果chara[]=0;charlinshi[MAX];//计算临时用的charbiaodashi[MAX];//用来存放表达式for(;;)//输入表达式{cout请输入一个正确的数学表达式,形如7+8*6,按回车结束endl;//输入表达式cinbiaodashi;if(biaodashi[0]=='*'||biaodashi[0]=='/')cout您输入的表达式有误,请重新输入endl;//判断首字符是否为*/,如果是提示错误别返回重新输入elsebreak;3}if(biaodashi[0]=='-'||biaodashi[0]=='+')//判断首字符是否为+-,如果是给字符前加字符0{strcat(a,biaodashi);strcpy(biaodashi,a);}strcpy(linshi,biaodashi);t=compute(linshi);//计算cout运算结果是:biaodashi'='tendl;//输出结果}while(1);//计算完返回,接着输入}//自定义函数doublexsd(charx[])//判断是否有小数点,并把字符型转化为浮点型{for(inti=0;istrlen(x);i++)if(x[i]=='.'){doublenum=0.0;sscanf(x,%f,&num);//returnnum;}elsereturnatof(x);}doublecmjia(charx[],chary[])//计算两字符加法,并返回double型值{doublea,b;a=xsd(x);b=xsd(y);doublec=a+b;returnc;}doublecmjian(charx[],chary[])//计算两字符减法,并返回double型值{doublea,b;a=xsd(x);b=xsd(y);doublec=a-b;returnc;}doublecmcheng(charx[],chary[])//计算两字符乘法,并返回double型值{4doublea,b;a=xsd(x);b=xsd(y);doublec=a*b;returnc;}doublecmchu(charx[],chary[])//计算两字符除法,并返回double型值{doublea,b;a=xsd(x);b=xsd(y);doublec=a/b;returnc;}doublecompute(charpstr[])//{charstrleft[MAX],strright[MAX],coml[MAX],comr[MAX],com[MAX],ysf;//ysf代表运算符doublecomzhi,zhi;//comzhi代表中途计算的值,com代表comzhi所对应的字符型intn=0;//先算乘除for(inti=0;istrlen(pstr);i++){if(pstr[i]=='*'||pstr[i]=='/'){ysf=pstr[i];//获取左边要计算的数据coml和该数据前的字符串strleftfor(intj=i-1;j=0;j--){if(pstr[j]=='-'||pstr[j]=='+'){for(intk=0;k=j;k++)strleft[k]=pstr[k];strleft[k]='\0';//获取左边要计算数据前的字符串strleftfor(k=j+1,n=0;ki;k++,n++)coml[n]=pstr[k];coml[n]='\0';//获取左边要计算的数据comlbreak;}elsefor(intk=0;ki;k++){coml[k]=pstr[k];strleft[0]='\0';}}5//获取右边要计算的数据comr和该数据后的字符串strrightfor(j=i+1;j=strlen(pstr);j++){if(pstr[j]=='-'||pstr[j]=='+'||pstr[j]=='*'||pstr[j]=='/'||pstr[j]=='\0'){for(intk=0,n=j;kstrlen(pstr)-i-1;k++,n++)strright[k]=pstr[n];strright[k]='\0';for(k=i+1,n=0;kj;k++,n++)comr[n]=pstr[k];comr[n]='\0';break;}}if(ysf=='*')//如果是*{comzhi=cmcheng(coml,comr);sprintf(com,%.3f,comzhi);}else//如果是/{comzhi=cmchu(coml,comr);sprintf(com,%.3f,comzhi);}strcat(strleft,com);//把数据前的字符和运算后的字符连接strcat(strleft,strright);//把数据后的字符和运算后的字符连接strcpy(pstr,strleft);//替换pstr}//重新找操作符}//再找加减for(i=0;istrlen(pstr);i++){if(pstr[i]=='+'||pstr[i]=='-'){ysf=pstr[i];//获取左边要计算的数据comlfor(intk=0;ki;k++)coml[k]=pstr[k];coml[k]='\0';//获取右边要计算的数据和该数据后的字符串strrightfor(intj=i+1;j=strlen(pstr);j++){if(pstr[j]=='-'||pstr[j]=='+'||pstr[j]=='\0'){for(intk=0,n=j;k=strlen(pstr)-j;k++,n++)strright[k]=pstr[n];strright[k]='\0';6for(k=i+1,n=0;kj;k++,n++)comr[n]=pstr[k];comr[n]='\0';break;}}if(ysf=='+'){comzhi=cmjia(coml,comr);sprintf(com,%.3f,comzhi);}else{comzhi=cmjian(coml,comr);sprintf(com,%.3f,comzhi);}strcat(com,strright);strcpy(pstr,com);}}//没找到,说明全部+-都计算完了zhi=atof(pstr);returnzhi;}三、运行效果四、总结7还无法提醒形如3-45*+或输入sgfs-34等式的错误,别重新输入,无法计算带括号和函数的表达式等更复杂的四则表达式。另外程序虽然可以运行,但是仍有4个warnings,而且代码显得有点长,其实可以再简练一点。
本文标题:C++四则运算程序代码
链接地址:https://www.777doc.com/doc-5407959 .html