科学计算器
C++编写计算器代码:
1 #include<iostream> 2 #include<stack> 3 #include<sstream> 4 #include<cstdio> 5 #include<string> 6 7 using namespace std; 8 9 char ch; 10 stringstream ss; 11 stringstream ss2; 12 stack<char> st; 13 stack<double> st2; 14 string str; 15 string str2; 16 double t; 17 18 inline int diy(char ch) 19 { 20 if(ch=='*'||ch=='/')return 2; 21 if(ch=='+'||ch=='-')return 1; 22 else return 0; 23 } 24 25 void fun()//中缀式转后缀式 26 { 27 str2.clear (); 28 while(!st.empty ())st.pop (); 29 st.push ('#'); 30 ss.clear(); 31 ss<<str; 32 while(ss>>ch) 33 { 34 if(ch=='=') 35 { 36 while(st.top ()!='#') 37 { 38 39 str2+=st.top (); 40 str2+=' '; 41 st.pop (); 42 } 43 } 44 else if(ch=='.'||(ch<='9'&&ch>='0')) 45 { 46 str2+=ch; 47 while(ss>>ch) 48 { 49 if(ch=='.'||(ch<='9'&&ch>='0')) 50 { 51 str2+=ch; 52 } 53 else 54 { 55 ss.unget (); 56 str2+=' ';break; 57 } 58 } 59 } 60 else if(ch=='(') 61 { 62 st.push ('('); 63 } 64 else if(ch==')') 65 { 66 while(st.top ()!='(') 67 { 68 str2+=st.top (); 69 str2+=' '; 70 st.pop (); 71 } 72 st.pop ();//删除左括号 73 } 74 else //是运算符 75 { 76 while(diy(st.top ())>=diy(ch)) 77 { 78 str2+=st.top (); 79 str2+=' '; 80 st.pop (); 81 } 82 st.push (ch); 83 } 84 } 85 } 86 87 double fun2()//后缀式求值 88 { 89 ss2.clear (); 90 ss2<<str2; 91 while(!st2.empty ())st2.pop (); 92 st2.push (0); 93 while(ss2>>ch) 94 { 95 if(ch>='0'&&ch<='9') 96 { 97 ss2.unget (); 98 ss2>>t; 99 st2.push (t); 100 } 101 else 102 { 103 switch (ch) 104 { 105 case '+':t=st2.top ();st2.pop ();t+=st2.top ();st2.pop ();st2.push (t);break; 106 case '-':t=st2.top ();st2.pop ();t=st2.top ()-t;st2.pop ();st2.push (t);break; 107 case '*':t=st2.top ();st2.pop ();t*=st2.top ();st2.pop ();st2.push (t);break; 108 case '/':t=st2.top ();st2.pop ();t=st2.top ()/t;st2.pop ();st2.push (t);break; 109 } 110 } 111 } 112 return st2.top (); 113 } 114 115 int main() 116 { 117 cout << "欢迎使用科学计算器,仅适用于合法的四则运算. 输入只能是: “+” “-” “*” “/” “()” “.” “0到9的数字” 结尾必须是“=”" << endl; 118 cout << " 输入结束快捷键:Ctrl + Z 计算开始 " << endl; 119 while(getline(cin,str)) 120 { 121 fun(); 122 printf("%.4lf ",fun2()); 123 } 124 cout << "计算结束,欢迎再次使用!!!" << endl; 125 return 0; 126 }