关键词:
只改了主程序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计算方式】、【自注意力机... 查看详情