程序设计方法学简易计算器_第1页
程序设计方法学简易计算器_第2页
程序设计方法学简易计算器_第3页
程序设计方法学简易计算器_第4页
程序设计方法学简易计算器_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验1简易计算器:第一步:程序基本架构:#include <iostream>#include <fstream>#include <string>using namespace std;#define maxlength 1024bool fail = false;数据结构:操作数栈struct stack_cchar datamaxlength;int top; od;操作符栈struct stack_ddouble datamaxlengthl;int top; op;int main()ifstream infile;ofstream outfile

2、;string expr;infile.open("infile.txtn);outfile.open(ncalc.logn);if (infile.fail()outfile « ”无法读取表达式! ” « endl;elsewhile (!infile.eof()infile » expr;calc(expr);outfile « endl « endl;infile.close(); outfile.close();return 0;第二步:对calc (expr)进行精细主程序void calc(string s) bool

3、b = check(s); if(b=false)cout « "表达式不合法"« endl; else mycalc(s);计算void mycalc(string s)表达式合法性检查bool check(string s)第三步:对 check(),mycalc()函数精细bool check(string s) if(bool check _bars(s) return false;if(bool check_all_letters(s) return false;return true;bool check _bars(string s)boo

4、l check_all_letters(string s) void mycalc(string expr) op.top = od.top = 0;int now = 0;double tmp = 0, weg;bool point = false;fail = false;while (now < expr.length()if (now = 0)od.data+od.top =开始读入表达式时,将压入符号栈中switch (exprnow)/m读入的表达式中的字符进彳亍分枝操作 一case : opl(exprnow);/遇到时,进行 opl 操作break;case *('

5、;: op2(exprnow); /遇到'('时,进行 op2 操作break;case : op3(exprfnow); 遇到'+'吋,进彳亍 op3 操作break;case : op4(exprnow); 遇至时,进行 op4 操作break;case' 1 case 2case 3case 4case 5case 6case 7case !8'case 9op5(exprnow); 遇到数字时,进彳亍op5操作 break;case y:op6(exprnow); 遇到了吋,进彳亍op6操作 break;case 7:point = tr

6、ue;/遇到t吋开启小数模式 weg = 0.1;break;now+;if (fail)break;void opl(exprnow)void op2(exprnow)void op3(exprnow)void op4(exprnow)void op5(exprnow)void op6(exprnow)第四步:对 check_bars(),check_all_letters(),opl(),op2(),op3(),op4(),op5(),op6()函 数精细bool check_alletters(string e)for (int i = 0; i < e.length(); i+)

7、操作数if (ei >= 48) && (ei <= 57) continue;if (efi = t) continue;运算符if (ei = 4)continue; if (ei = '-*) continue;讦(efi ='*') continue;if (ei = 7)continue;界限符讦(ei = continue; if (ei = *(*) continue;if (ei = 7) continue;return false; return true;bool check_bars(string e)int r=0,1

8、=0;for (int i = 0; i < eength(); i+) 讦(ei = *)') r+4-;else if (efi = '(') 1+;if (r != 1)outfilevv”发现不匹配的括号,请检查您的表达式:” vvevvendl; outfilevv” 中止计算!” « endl;return false;return true;void opl(exprnow)if ( now = expr.length。-1)while (od.dataod.top !=if (od.top <= 0) ii (op.top <

9、= 0) fail_op_od(); op.dataop.top-l=mycalc(op.dataop.top-l,od.dataod.top, op.dataop.top);od.top-;op.top-;if (fail) break;讦(op.top != 1) ii (od.top != 1) fail_op_od();讦(fail) break;expr.erase(exp r.length()-l, 1);outfile « expr « "=outfile « op.dataop.top « endl;else fail = tr

10、ue;void op2(exprnow)od.data+od.top = exprnow;void op3(exprnow)if (getpid(od.dataod.top) >=getpid(exprnow) && (getpid(od.dataod.top) <3)讦(od.top <= 0) ii (op.top <= 0) fail_op_od();op.dataop.top-ll = mycalc(op.dataf op.top-11, od.datafod.top, op.dataop.top);op.top;od.top;讦(fail) b

11、reak;od.data+od.top = exprnow;void op4(exprnow)od.data+od.top = exprnow;void op5(exprnow)if (!point)tmp = tmp*10 + (exprnow-48);tmp += weg * (exprnow-48);weg /= 10;if (exprnow+l = t)now+;continue;if (exprnow+l < 48) ii (exprnow+l > 57)point = false;op.data+op.top = tmp;tmp = 0;if (getpid(od.da

12、taod.top)>getpid(od.dataod. top-1 )&&(od.dataod.top != '(*)if (od.top <= 0) ii (op.top <= 0) fail_op_od();op.datafop.top 1= mycalc(op.dataop.topl,od.dataf od.top, op.dataop.top);op.top;od.top-;if (fail) break;void op6(exprfnow)while (od.dataod.top) != '(*)讦(od.top <= 0) i

13、i (op.top <= 0) fail_op_od();op.dataop.top-l = mycalc(op.dataop.top-1, od.dataod.top,op.datafop.top);op.top;od.top;if (fail) break;if (od.datafod.top = *(') od.top;else fail_op_od();第四步:对 void fail_op_od(), int getpid(char tmp)进彳亍精细 void fail_op_od()if (fail) return;outfile « ”发现无效的运算操作,可能您的操作数与操作符不相匹配” vv endl;outfile « "屮止计算! “vvendl;fail = true; int getpid(char tmp)if (tmp = '+') return 1; if (tmp = '-*) return 1;if (tmp = '*) return 2; if (tmp = 7') return 2;if (tmp = '(') return 3;return 100;实

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论