改进计算器(代码片段)

hml-xxbj hml-xxbj     2023-01-03     727

关键词:

只改了主程序calc.cpp

  1 #include <iostream>
  2 #include "Comp.h"
  3 #include "Isop.h"
  4 #include <stack>
  5 #include <string>
  6 #include <math.h>
  7 using namespace std;
  8 /**
  9 1. 接收用户输入//没有判断是否有非法字符
 10 2. 处理
 11 3. 输出
 12 */
 13 
 14 
 15 /**
 16     stl中的栈pop()返回空值,top()返回引用(左值,可改)和常引用(做右值,不可改)
 17     top的定义:
 18     T& top(void);
 19     const T& top(void) const;
 20 
 21   为什么pop()没有返回值?
 22   为了防止复制失败,栈顶的值也消失
 23   T t = s.pop();//pop()如果返回值,取出值(栈中无该值),然后赋值失败,值消失
 24 */
 25 
 26 
 27 /*
 28 要自己写一个类,分别来存放float和char
 29 用string的话,float用不了,并且不能双位数
 30 */
 31 
 32 void cleanfz(float * num1,float * num2,char * oper1,stack<float> & fz,stack<float> & num);
 33 bool isNum(char c);
 34 float calc(float num1,float num2,char c);    //做计算的函数
 35 int main()
 36 
 37     stack<float> num;        //数据
 38     stack<char> op;            //操作符
 39     stack<float> fz;        //注意类型要转换回去
 40     string exp;                //保存表达式
 41     Comp com;                //作比较,决定什么时候计算
 42     Isop isop;                //判断是否是操作符
 43     char oper1;
 44     char oper2;
 45     float num1;
 46     float num2;
 47     float result;
 48     int flag = 0;
 49 
 50     //1. 
 51     cout << "welcome to MyCalculator!
";
 52     cout << "please input your expression:
";
 53     cin>>exp;
 54     cin.ignore();
 55     //string 自己的函数,为什么要两次回车
 56     //getline(cin,exp);
 57 
 58 
 59     //2.边入栈边处理
 60     for(int i=0;i<exp.length();i++)
 61     
 62         if(isop((char)exp[i]))            //操作符
 63         
 64             if(exp[i]==))                //如果是反括号,
 65             
 66 
 67                 if(!num.empty())
 68                 
 69                     num1 = (float)num.top();
 70                     num.pop();
 71                 
 72                 else
 73                 
 74                     cout << "please input something!" << endl;
 75                     exit(1);
 76                 
 77                 if(!op.empty())
 78                 
 79                     oper1 = op.top();
 80                     op.pop();
 81                 
 82                 else
 83                 
 84                     cout << "please input something!" << endl;
 85                     exit(1);
 86                 
 87                 while(oper1!=()            //出栈是(,丢弃,一次计算完成
 88                     
 89                     if(op.empty())        //小括号不成对
 90                     
 91                         cout << "input errorn";
 92                         exit(0);
 93                     
 94                     
 95                     if(!op.empty())
 96                     
 97                         oper2 = op.top();
 98                         op.pop();
 99                         if(com(oper1,oper2))
100                         
101                             if(!num.empty())
102                                 num2 = (float)num.top();
103                                 num.pop();
104                             
105                             else
106                             
107                                 cout << "no elements1!" << endl;
108                                 exit(1);
109                             
110                             //做计算
111                             result = calc(num2,num1,oper1);
112                             num.push(result);
113                             //1种做法是把辅助栈弹回,2是把辅助栈中的计算出来,实现第二种
114                             //cleanfz(&num1,&num2,&oper1,fz,num);
115                             while(!fz.empty())
116                             
117                                 oper1 = (char)fz.top();
118                                 fz.pop();
119                                 if(!fz.empty())
120                                     num1 = (float)fz.top();
121                                     fz.pop();
122                                 
123                                 else
124                                 
125                                     cout << "no element2!" <<endl;
126                                     exit(1);
127                                 
128                                 if(!num.empty())
129                                 
130                                     num2 = (float)num.top();
131                                     num.pop();
132                                 
133                                 else
134                                 
135                                     cout << "no element3!" << endl;
136                                     exit(1);
137                                 
138                                 result = calc(num1,num2,oper1);
139                                 num.push(result);
140                             
141                             oper1 = oper2;
142                             if(!num.empty())
143                             
144                                 num1 = (float)num.top();
145                                 num.pop();
146                             
147                             else
148                             
149                                 cout << "no element3!" << endl;
150                             
151                         
152                         else
153                         
154                             fz.push(num1);
155                             fz.push(oper1);
156                             oper1 = oper2;
157                             if(!num.empty())
158                             
159                                 num1 = (float)num.top();
160                                 num.pop();
161                             
162                             else
163                             
164                                 cout << "no element3!" << endl;
165                                 exit(1);
166                             
167                         
168                     
169                 //直到取出小括号
170                 num.push(num1);
171             
172             else if(exp[i]==])        //如果是反大括号
173             
174             
175             
176             else                        //以上都不是,就是普通符号,入栈
177                 
178                 op.push(exp[i]);
179             
180             
181         else if(isNum(exp[i]))                            //数据入栈
182         
183             float res = 0;
184             if(isNum(exp[i]))
185             
186                 res = 0;
187                 while(isNum(exp[i]))
188                 
189                     res = res*10+exp[i]-48;
190                     if(exp[i+1]==.)
191                     
192                         i+=2;
193                         int count = 0;
194                         while(isNum(exp[i]))
195                         
196                             count++;
197                             res += (exp[i]-48)*pow(0.1,count);
198                             i++;
199                         
200                         i--;//退回非数字的字符
201                     
202                     i++;
203                 
204                 i--;    //退回        
205             
206             num.push(res);
207         
208         else ///输入不是操作符不是数字
209         
210             cout << "input error!" << endl;
211         
212             
213     //入栈完毕,做处理,没有括号的情况
214 
215 
216     if(!num.empty())
217     
218         num1 = (float)num.top();
219         num.pop();
220     
221     else
222     
223         cout << "no element4!" << endl;
224         exit(1);
225     
226     if(!op.empty())
227         oper1 = op.top();
228         op.pop();
229     
230     else
231     
232         cout << "no element5!" << endl;
233         exit(1);
234         
235     while(!op.empty())
236     
237         oper2 = op.top();
238         op.pop();
239         if(com(oper1,oper2))
240         
241             if(!num.empty())
242             
243                 num2 = (float)num.top();
244                 num.pop();
245             
246             else
247             
248                 cout << "no elementt6!" << endl;
249                 exit(1);
250             
251             //做计算
252             result = calc(num1,num2,oper1);
253             num.push(result);
254             //1种做法是把辅助栈弹回,2是把辅助栈中的计算出来,实现第二种
255             //处理逻辑与之前一样,可写成函数
256             //判断是否可以取值,栈是否为空,可以写成函数
257             //cleanfz(&num1,&num2,&oper1,fz,num);
258 
259             while(!fz.empty())
260             
261                 oper1 = (char)fz.top();
262                 fz.pop();
263                 if(!fz.empty())            //第一个数
264                 
265                     num1 = (float)fz.top();
266                     fz.pop();
267                 
268                 else
269                 
270                     cout << "no element7!" << endl;
271                     exit(1);
272                 
273                 if(!num.empty())        //第二个数
274                 
275                     num2 = (float)num.top();
276                     num.pop();
277                 
278                 else
279                 
280                     cout << "no element8!" << endl;
281                     exit(1);
282                 
283                 result = calc(num1,num2,oper1);
284                 num.push(result);
285             
286         
287         else
288         
289             fz.push(num1);
290             fz.push(oper1);
291         
292                 
293         oper1 = oper2;        //回到最初状态
294         if(!num.empty())
295         
296             num1 = (float)num.top();
297             num.pop();
298         
299         else
300         
301             cout << "no element9!" << endl;
302             
303     
304     //计算op栈中最后一个元素
305     if(!num.empty())
306     
307         num2 = (float)num.top();
308         num.pop();
309     
310     else
311     
312         cout << "no element10!" << endl;
313         exit(1);
314     
315     result = calc(num1,num2,oper1);
316     num.push(result);
317 
318     //op栈空,但是fz没空的情况
319     //cleanfz(&num1,&num2,&oper1,fz,num);
320         while(!fz.empty())
321             
322                 oper1 = (char)fz.top();
323                 fz.pop();
324                 if(!fz.empty())            //第一个数
325                 
326                     num1 = (float)fz.top();
327                     fz.pop();
328                 
329                 else
330                 
331                     cout << "no element7!" << endl;
332                     exit(1);
333                 
334                 if(!num.empty())        //第二个数
335                 
336                     num2 = (float)num.top();
337                     num.pop();
338                 
339                 else
340                 
341                     cout << "no element8!" << endl;
342                     exit(1);
343                 
344                 result = calc(num1,num2,oper1);
345                 num.push(result);
346             
347 
348     cout << "the expression equals to "<< result << endl;
349     return 0;
350 
351 
352 
353 float calc(float num1,float num2,char c)
354 
355     float r=0;
356     switch(c)
357     
358         case +:
359             r = num2+num1;
360             break;
361         case -:
362             r = num2-num1;
363             break;
364         case *:
365             r = num2*num1;
366             break;
367         case /:
368             if(num1==0)
369             
370                 cout << "error:divede 0!
";
371                 exit(0);
372             
373             r = num2/num1;
374             break;
375         default:
376             cout << "there are some bugs!" <<endl;
377             
378     
379     return r;
380 
381 
382 
383 bool isNum(char c)
384 
385     c = (int)c;
386     if((47<c)&&(c<58))
387     
388         return true;
389     
390         
391     return false;
392 
393 
394 
395 void cleanfz(float * num1,float * num2,char * oper1,stack<float> & fz,stack<float> & num)
396 
397     int result=0;
398     while(!fz.empty())
399     
400         *oper1 = (char)fz.top();
401         fz.pop();
402         if(!fz.empty())            //第一个数
403         
404             *num1 = (float)fz.top();
405             fz.pop();
406         
407         else
408         
409             cout << "no element7!" << endl;
410             exit(1);
411         
412         if(!num.empty())        //第二个数
413         
414             *num2 = (float)num.top();
415             num.pop();
416         
417         else
418         
419             cout << "no element8!" << endl;
420             exit(1);
421         
422         result = calc(*num1,*num2,*oper1);
423         num.push(result);
424     
425 

 

基于用户的协同过滤算法:用户相似度计算的改进(代码片段)

用户相似度计算的改进上一节介绍了计算用户兴趣相似度的最简单的公式(余弦相似度公式),但这个公式过于粗糙,本节将讨论如何改进该公式来提高UserCF的推荐性能。首先,以图书为例,如果两个用户都曾经买过《新华字典... 查看详情

斐波那契数列改进(代码片段)

#include<iostream>usingnamespacestd;intfei(intn)staticinta[50]=0;//此处数组必须声明为static,否则会运行极慢!因为如果是普通数组,递归调用每调用一次就定义一次。而static变量只会定义一次。if(n<=1)return1;if(!a[n-2])//为防止重复计算,... 查看详情

cc3--(代码片段)

...走吧2.3假的POC2.4为何outermap.put()会报错?2.5为何不弹计算器???2.6弹计算器的Good-POC2.7版本限制,还是8u71之前的。3.关于去掉_tfactory4.改进4.1改进的种类之说4.2利用CC6进行改进5.参考1.前言接着 查看详情

基于用户的协同过滤算法:用户相似度计算的改进(代码片段)

用户相似度计算的改进上一节介绍了计算用户兴趣相似度的最简单的公式(余弦相似度公式),但这个公式过于粗糙,本节将讨论如何改进该公式来提高UserCF的推荐性能。首先,以图书为例,如果两个用户都曾经买过《新华字典... 查看详情

pat(basiclevel)1005(有空请改进)(代码片段)

1005 继续(3n+1)猜想 (25分) 卡拉兹(Callatz)猜想已经在1001中给出了描述。在这个题目里,情况稍微有些复杂。当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数。例如对 n=3 ... 查看详情

十条改进代码性能小建议(代码片段)

一,避免在循环条件中使用复杂的表达式在循环中,循环条件会被反复计算,如果不使用复杂表达式而使循环条件值不变的化,程序会运行的更快 importjava.util.List;publicclassforeachvoidmethod(Listlist)for(inti=0;i<list.size();i++)System.out.... 查看详情

网络四则运算结对编程(代码片段)

...代码只实现简单的两位数之间的加减乘除,而我们为需要改进其功能,实现了三位数的计算,并加了括号改进后界面:改进前类图:改进后类图:2、程序设计3、代码展示关键代码展示:··· 查看详情

智能语音计算器(代码片段)

这边来说界面的实现,个人觉得该模块实现有点乱,因为其中包括了录音功能,还需要改进。#ifndefCALCULATORUI_H#defineCALCULATORUI_H#include<qt5/QtWidgets/QWidget>#include<qt5/QtWidgets/QLineEdit>#include<qt5/QtWidgets/QPushButton> 查看详情

基于改进criminisi算法的图像修复(代码片段)

...复效果,且存在修复时间过长等缺陷,提出一种改进Criminisi算法的图像修复算法。改进优先权计算方式找到最优待修复块,完善最优匹配块搜索策略,找到最优匹配块,采用新的置信值更新方式以获得更为理... 查看详情

文本分类基于类信息的tf-idf权重分析与改进(代码片段)

摘要:改进TFIDF,增加了类间因子、类内因子,应用于文本的特征选择,提高了精度。参考文献:[1]姚严志,李建良.基于类信息的TF-IDF权重分析与改进[J].计算机系统应用,2021,30(09):237-241.一、引言  权重计算的... 查看详情

文本分类混合chi和mi的改进文本特征选择方法(代码片段)

摘要:改进CHI算法、改进MI算法,结合改进CHI+改进MI,应用于文本的特征选择,提高了精度。参考文献:[1]王振,邱晓晖.混合CHI和MI的改进文本特征选择方法[J].计算机技术与发展,2018,28(04):87-90+94.一、引言... 查看详情

基于改进east算法的文本检测(代码片段)

这段时间阅读研究了EAST算法以及在EAST算法上的改进并完成了复现运用到其他场景中去。当今社会已进入图像大数据时代,图像数量庞大种类繁多,包含大量的有用知识。从图像中高效、精准、全面地提取文本和地理信息... 查看详情

基于改进chi和pca的文本特征选择(代码片段)

摘要:改进CHI算法后,结合PCA算法,应用于文本的特征选择,提高了精度。参考文献:[1]文武,万玉辉,张许红,文志云.基于改进CHI和PCA的文本特征选择[J].计算机工程与科学,2021,43(09):1645-1652.一、引言  文本特... 查看详情

通过visualstudio的“代码度量值”来改进代码质量(代码片段)

1软件度量值指标1.1可维护性指数  表示源代码的可维护性,数值越高可维护性越好。该值介于0到100之间。绿色评级在20到100之间,表明该代码具有高度的可维护性;黄色评级在10到19之间,表示该代码适度可维护;红色评级在0... 查看详情

matlab改进灰狼算法求解路径优化(代码片段)

灰狼优化算法(greywolfoptimizationalgo-rithm,GWO)是模仿灰狼等级划分和灰狼捕食行为而提出的群智能搜索算法。该算法具有控制参数少、收敛速度快和计算简单等优点,已在机器学习、函数寻优、数据挖掘、电力调度、控制器... 查看详情

matlab改进灰狼算法求解路径优化(代码片段)

灰狼优化算法(greywolfoptimizationalgo-rithm,GWO)是模仿灰狼等级划分和灰狼捕食行为而提出的群智能搜索算法。该算法具有控制参数少、收敛速度快和计算简单等优点,已在机器学习、函数寻优、数据挖掘、电力调度、控制器... 查看详情

改进yolov5系列:增加swin-transformer小目标检测头(代码片段)

...构建不同的YOLO目标检测模型。🌟本项目包含大量的改进方式,降低改进难度,改进点包含【Backbone特征主干】、【Neck特征融合】、【Head检测头】、【注意力机制】、【IoU损失函数】、【NMS】、【Loss计算方式】、【自注意力机... 查看详情

cssclearfix改进(代码片段)

查看详情