C++实现简单计算器
本文实例为大家分享了C实现简单计算器的具体代码供大家参考具体内容如下工具stackmap步骤初始化读取字符串去空格负号处理判断为空检查格式计算示例代码123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210#include iostream#include string#include stdio.h#include stack#include map#include math.h#include stdlib.h#include sstreamusingnamespacestd;charop[8][8];mapchar,int m;voidinit(){m[] 1, m[-] 2, m[*] 3, m[/] 4, m[(] 5, m[)] 6, m[#] 7;op[1][1] , op[1][2] , op[1][3] , op[1][4] , op[1][5] , op[1][6] , op[1][7] ;op[2][1] , op[2][2] , op[2][3] , op[2][4] , op[2][5] , op[2][6] , op[2][7] ;op[3][1] , op[3][2] , op[3][3] , op[3][4] , op[3][5] , op[3][6] , op[3][7] ;op[4][1] , op[4][2] , op[4][3] , op[4][4] , op[4][5] , op[4][6] , op[4][7] ;op[5][1] , op[5][2] , op[5][3] , op[5][4] , op[5][5] , op[5][6] ;op[6][1] , op[6][2] , op[6][3] , op[6][4] , op[6][6] , op[6][7] ;op[7][1] , op[7][2] , op[7][3] , op[7][4] , op[7][5] , op[7][7] ;}doubleoperate(doublenum1,charoper,doublenum2){if(oper )returnnum1 num2;if(oper -)returnnum1 - num2;if(oper *)returnnum1 * num2;if(oper /)returnnum1 / num2;}string trim(string str){index 0;if(!str.empty()){while((index str.find( ,index) ! string::nops)str.erase(index,1);}returnstr;}string change(string str){intstart;start #;for(inti 0; i str.length(); i){if(str[i] -){if(i 0 || i ! 0 (m[str[i-1]] 1 m[str[i-1]] 5 str[i1] 0 str[i1] 9){str ;intj i1;start j;while(m[str[j]] 0)j;for(intk str.length() - 1; k j; k--)str[k] str[k-3];str[i] (, str[i1] 0, str[i2] -;intl i3;string s str.substr(start, j - start);for(intk 0; k s.length(); k)str[lk] s[k];str[ls.length()] );}}}str.erase(str.length()-1, 1);returnstr;}booltest(string str){boolifOK true;intflag 0;stackchar s;intstart, e;str #;for(inti 0; i str.length(); i){//判断非法字符if((str[i] 0|| str[i] 9) m[str[i]] 0 str[i] !.)returnfalse;if(str[i] # i! str.length()-1)returnfalse;//判断小数点if(m[str[i]] 0){if(flag 0){start i;flag 1;}}if(m[str[i]] ! 0){if(flag 1){e i;string st str.substr(start, e - start);intpointNum 0;if(st[0] .)returnfalse;for(intj 0; j st.length(); j){if(st[j] .) pointNum;}if(pointNum 1)returnfalse;}flag 0;}//判断运算符if(str[i] || str[i] -|| str[i] *|| str[i] /){if(i 0)returnfalse;if((str[i-1] 0|| str[i-1] 9) str[i-1] !))returnfalse;if((str[i1] 0|| str[i1] 9) str[i1] !()returnfalse;}//判断括号if(str[i] ()s.push(str[i]);if(str[i] )){if(s.empty())returnfalse;charc s.top();if(c ()s.pop();elsereturnfalse;}}//判断括号if(!s.empty())ifOK false;returnifOK;}voidcaculate(string str){str #;intflag 0;intstart, e;stackdouble numStack;//操作数栈stackchar operStack;//运算符栈operStack.push(#);inti 0;while(str[i] !#|| operStack.top() !#){if(m[str[i]] 0){if(flag 0){start i;flag 1;}}else{if(flag 1){e i;//string 转 doublestringstream s (str.substr(start, e - start));doublenum;s num;numStack.push(num);flag 0;}charc operStack.top;if(op[m[c]][m[str[i]]] ){operStack.push(str[i]);i;}elseif(op[m[c]][m[str[i]]] ){operStac.pop();i;}else{charoper operStack.top();operStac.pop();doublenum2 numStack.top();numStack.pop();doublenum1 numStack.top();numStack.pop();doubleresult operate(num1, oper, num2);numStack.push(result);}}}printf(\t\t\t %f\n,numStack.top());}intmain(){init();//初始化printf(\n\n\n\t\t\t请输入表达式 退出请输入end\n);string s;getline(cin, s,\n);//读取字符串s trim(s);//去空格s change(s);//处理负号if(s end){break;}elseif(s.length() 0){//判断为空if(!test(s))//检查格式printf(\t\t\t格式错误\n);elsecaculate(s);//计算}else{printf(\t\t\t输入不能为空\n);}}以上就是本文的全部内容希望对大家的学习有所帮助
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2567426.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!