帶括號、可去除漢字浮點數四則計算器
阿新 • • 發佈:2018-12-10
參考:https://www.cnblogs.com/GC-hahaha/p/9457720.html
本應用功能:
對一行表示式(可包含漢字等其他字元)進行運算,若該表示式被劃分為幾個部分,則對這幾個部分進行求和
使用:
1、先將表示式貼上在in文字中
2、執行dtest1.exe
3、結果會顯示在黑窗中,也可以去result文字檢視結果
1 #include <bits/stdc++.h> 2 using namespace std; 3 stack<double> nums; 4 stack<char> op; 5 void change()//初始字串去漢字處理 6 { 7 fstream in("in.txt"); 8 string str; 9 fstream file("out.txt",ios::out);//清空文件 10 while (getline(in,str)) 11 { 12 string::iterator it=str.begin(); 13 for (int i=0;i<str.size();) 14 { 15 if (str[i]==9)//讀入製表符 16 {17 str[i]='+'; 18 i++; 19 } 20 else if ((str[i]>='0'&&str[i]<='9')||str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/'|| 21 str[i]=='('||str[i]==')'||str[i]=='.') 22 { 23 i++; 24continue; 25 } 26 else if (str[i]==-93&&str[i+1]==-88)//讀入中文左括號 27 { 28 str[i]='('; 29 i++; 30 str.erase(it+i); 31 } 32 else if (str[i]==-93&&str[i+1]==-87)//讀入中文右括號 33 { 34 str[i]=')'; 35 i++; 36 str.erase(it+i); 37 } 38 else//刪除其他字元 39 { 40 str.erase(it+i); 41 } 42 } 43 ofstream oswrite("out.txt",ofstream::app); 44 oswrite<<str<<endl;//把轉化後的串寫入out 45 oswrite.close(); 46 } 47 } 48 void math(char c)//進行運算 49 { 50 double a,b,temp; 51 b=nums.top();//注意除法和減法的先後順序,所以是b在前,a在後! 52 nums.pop(); 53 a=nums.top(); 54 nums.pop(); 55 switch (c) 56 { 57 case '+': 58 temp=a+b; 59 break; 60 case '-': 61 temp=a-b; 62 break; 63 case '*': 64 temp=a*b; 65 break; 66 case '/': 67 if (b==0) 68 { 69 printf("the divisor cann't be 0\n"); 70 } 71 else 72 { 73 temp=a/b; 74 } 75 break; 76 } 77 nums.push(temp);//運算後放回數字棧 78 } 79 void test() 80 { 81 if (!nums.empty()) 82 { 83 printf("[%d]%lf ",nums.size(),nums.top()); 84 } 85 else 86 { 87 printf("null "); 88 } 89 if (!op.empty()) 90 { 91 printf("%c[%d]\n",op.top(),op.size()); 92 } 93 else 94 { 95 printf("null\n"); 96 } 97 } 98 void instack()//中綴轉字尾進行運算 99 { 100 string str; 101 freopen("out.txt","r",stdin); 102 fstream file("result.txt",ios::out);//以輸出的方式建立檔案型別file 輸出流,清空文字 103 while (cin>>str) 104 { 105 while (!nums.empty()) nums.pop(); 106 while (!op.empty()) op.pop(); 107 for (int i=0;i<str.length();i++) 108 { 109 if (str[i]=='(') 110 { 111 op.push(str[i]); 112 } 113 if(str[i]==')') 114 { 115 while (op.top()!='(') 116 { 117 math(op.top()); 118 op.pop(); 119 } 120 op.pop();//要記得把左括號也彈出! 121 } 122 int jump=0; 123 if(str[i]>='0'&&str[i]<='9')//把小數字符串轉換為浮點數 124 { 125 double temp=str[i]-'0'; 126 i++; 127 int flag=0;//標記是小數點左邊還是右邊 128 double rate=10;//小數倍率,要放在下邊的迴圈前面! 129 for (;i<str.length();i++) 130 { 131 if (str[i]>='0'&&str[i]<='9'&&flag==0)//整數部分 132 { 133 temp=temp*10+str[i]-'0'; 134 } 135 else if (str[i]=='.')//小數點 136 { 137 flag=1; 138 } 139 else if (str[i]>='0'&&str[i]<='9'&&flag==1)//小數部分 140 { 141 temp+=(str[i]-'0')/rate; 142 rate*=10; 143 } 144 else 145 { 146 i--; 147 jump=1; 148 break; 149 } 150 151 } 152 nums.push(temp);//轉換後進入數字棧 153 } 154 if (jump) 155 { 156 continue; 157 } 158 if(str[i]=='/'||str[i]=='*') 159 { 160 op.push(str[i]); 161 } 162 if (str[i]=='+'||str[i]=='-') 163 { 164 while (!op.empty()&&(op.top()=='*'||op.top()=='/'||op.top()=='+'||op.top()=='-'))//注意只要是同級的+,-都要先彈出進行運算! 165 { 166 math(op.top()); 167 op.pop(); 168 } 169 op.push(str[i]); 170 } 171 } 172 while (nums.size()!=1)//把棧中剩餘元素進行運算 173 { 174 math(op.top()); 175 op.pop(); 176 } 177 FILE *fp; 178 if ((fp=fopen("result.txt","a"))==NULL) 179 { 180 printf("result.txt open error!\n"); 181 exit(0); 182 } 183 fprintf(fp,"%g\n",nums.top());//輸出到文件 184 printf("%g\n",nums.top());//輸出到螢幕 185 if (fclose(fp)) 186 { 187 printf("can not close result.txt\n"); 188 } 189 } 190 } 191 int main() 192 { 193 change(); 194 instack(); 195 printf("finish!\n"); 196 197 return 0; 198 }