已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
设计分析: 我做的是一个计算器程序,属于B级。题目要求如下: 1、完善计算器程序,改为可对实数操作。 2、完善程序,改为多个操作数基本四则运算,遇到z为止。 3、增加函数,完成四则混合运算,增加相应的主菜单选项 4、添加语句,使四则运算具有测试功能。 5、可扩充其功能。 所给的计算器源程序中已有基本的加、减、乘、除和开方运算,我所要做的就是添加一个可以进行四则混合运算功能的类。 本程序所要用到的头文件有如下几种: process,iostream,conio,stdlib,math和assert. 原程序中已经定义了加、减、乘、除和开方的运算,它用了类oopcalc将这几个基本运算进行封装。类中包含以下几个函数: void calcadd(); void calcsub(); void calcdiv(); void calcmult(); void calcfartocel(); void calcceltofar(); void calcsroot(); void exitprog(); void menu(); void badinput(); 每个函数的参数形式如下: int add(float x,float y); int sub(float x, float y); int div(float x, float y); int mult(float x, float y); int fartocel(float x); int celtofar(float x); int sqroot(float x); 原程序对这几个函数分别做了如下定义: int oopcalc:add(float x, float y) val = x + y; return val; int oopcalc:sub(float x,float y) val = x - y; return val; int oopcalc:div(float x, float y) val = x / y; return val; int oopcalc:mult(float x, float y) val = x * y; return val; int oopcalc:fartocel(float x) int cel = (x - 32) * 5) / 9; return cel; int oopcalc:celtofar(float x) int f; f = x * 9 / 5 + 32; return f; int oopcalc:sqroot(float x) int g = sqrt(x); return g; 首先要把程序改为可对实数进行操作,由于原程序中的操作数类型都是整形,因此我所采用的办法就是把“int”依次改成“float”。这是最简单的修改办法,也是最有效的修改办法。 在menu()函数中使用了 switch()语句来对功能进行选择,以便于操作。不同的数字则对应不同的功能。 下面所要进行的修改就是添加四则运算功能。 首先在switch()语句中添加一个新的选项,以用于作为进行四则运算的入口。然后设计一个简单的计算器类,增加四则运算功能。 简单的运算只要求有两个操作数,如原程序中的加、减、乘除。而所增加的四则运算则要求输入多个操作数,有计算机自己通过程序来解决多个数字的运算。这就要求设计的程序能够自动辨别“+”,“-”,“*”,“/”的优先级和结合性。在这里,我运用了栈的功能进行对程序的修改。 设有表达式: a+b*c-d/e= 为实现运算符的优先级,采用两个栈:一个数栈,一个运算符栈。数栈暂时存放操作数,运算符栈暂时存放运算符。从左向右扫描算术表达式,遇到操作数,压入数栈;遇到运算符,则与运算符栈栈顶的运算符比较优先级。若新的运算符优先级高或运算符栈空,则压栈;否则,将栈顶运算符出栈,与数字栈出栈的两个数据进行运算,结果压入数栈,再将新运算符压栈。继续扫描,直到遇到=号,扫描结束。栈中数据继续按前面规则出栈。上面所列表达式运算过程如下图所示: (A) (B) (C) (D) (E) N O N O N O N O N O - - - - - - - - - - - - - - - - - - - - - - e - - - - - - - - - - c - b*c-t1 d / d/e-t2 t2 - t1-t2-t3 - - a+t3-t4 - - b * t1 _ t1 _ t3 - - - a + a + a + a + - - 首先a入数栈,“+”入运算符栈,b入数栈,“*”入运算符栈,c入数栈,见图(A);再扫描到“-”号,则“*”和c、b出栈,b*c得t1压入数栈,“-”号压入运算符栈,“/号压入运算符栈,e压入数栈,遇到=,扫描结束,见图(B);”/“号弹出运算符栈,e、d弹出数栈,d/e得t2压数栈,见图C;”-“号出栈,t2、t1出栈,t1-t2得t3、t4压栈,见图(D);”+“号出栈,t3、a出栈,栈全空,a+t3得t4,即运算结果。增加四则混合运算的功能要解决的问题是怎样使计算机能分辨出运算符的优先级。这里我想到了我们上课学的栈和链表的知识这题我用到了链栈。首先建立一个链栈的类模板和一个结点链表。templateclass Stack;这一行是类结点的声明。因为在类中也同样遵循“先声明后使用”的原则。 templateclass Node T info;Node*link;public:Node(T data=0,Node*next=NULL)info=data;link=next;friend class Stack;这一段是结点模板的定义。Info是结点,“Node*link”是定义了一个结点指针。“friend class Stack;”定义了类Node的友元函数Stack。“info=data;”设置第一个接点的值,“link=next;”把下一个指针的值赋给link指针。templateclass Stack Node*top; public:Stack()top=NULL;Stack();void Push(const T &data); T Pop(); T GetTop(); void MakeEmpty(); bool IsEmpty()return top=NULL;这一段是类模板的定义。其中“Node*top”是栈顶指针的定义。“Stack()”是类的构造函数,在构造函数中把栈顶指针指向NULL.“Stack()”是析构函数。“void Push(const T &data)”是用于压栈的函数。“T Pop()”是用于将数据弹出栈的函数。“T GetTop()”是用于取栈顶元素的函数。“void Makeempty()”是用于将栈中的元素清空的函数。templatevoid Stack:MakeEmpty()Node*temp;while(top!=NULL)temp=top;top=top-link;delete temp;这一段是对清空链表的函数进行定义。设置了一个指针temp,当头结点不等于NULL是进行while循环。循环是将头结点的值赋给temp,再把头结点的指针指向下一个结点。templatevoid Stack:Push(const T &data)top=new Node(data,top); 链栈向前生成,新压栈的结点在链栈头templateT Stack:Pop()assert(!IsEmpty();Node *temp=top;T data=temp-info;top=top-link; delete temp; return data; 这是对弹出函数的定义。“top=top-link;” 丢弃栈顶结点。“delete temp; ”释放栈顶结点。“return data; ”返回栈顶数据。class Calculator Stack Nstack;Stack Ostack;public:Calculator(void);void Cal(void); /计算器运算程序void GetTowNum(int &Num1,int&Num2);void Compute(char Opr);void Clear(void);这是简单计算器的类定义。在这个类里,将链栈Nstack和Ostack都定义为了私有函数,还声明了一个构造函数“Calculator(void);”。“void Clear(void);”是用于清空计算器数据的函数,其中分别调用了“Nstack.MakeEmpty();”和“Ostack.MakeEmpty();”。“void GetTowNum(int &Num1,int&Num2);”定义了两个数字Num1和Num2,调用了函数“Nstack.Pop();”。“void Compute(char Opr);”则定义了各种运算符的计算,这些运算符是“+”、“-”、“*”、“/”和“=”。“void Cal(void);”是简易的计算器程序,定义如下:void Calculator:Cal()cout进行四则运算:ch1;if(ch1=0&ch1=0)strk+1=0; /数字串生成Nstack.Push(atoi(str); /数字串转换为整数后压栈k=-1;switch(ch1) /用switch语句对不同的运算符进行定义casec:Clear(); /清空栈break;case+:case-:while(!Ostack.IsEmpty()ch2=Ostack.Pop(); /不会有比+、-优先级低的Compute(ch2);Ostack.Push(ch1);break;case*:case/:while(!Ostack.IsEmpty()&b1)ch2=Ostack.Pop(); /弹出栈顶运算符if(ch2=*|ch2=/) /比较优先级Compute(ch2); /新的优先级并不高else /新的优先级高Ostack.Push(ch2); /先把原栈中的运算符压回去b1=false;Ostack.Push(ch1); /再把新的运算符压栈b1=true; /此句保证乘除从左到右进行break;case=:while(!Ostack.IsEmpty()ch2=Ostack.Pop();Compute(ch2);Compute(ch1);break;if(ch1=z)b2=false; /当输入z时结束程序在Menu函数中也用了switch函数来把所选菜单项和对应的函数联系起来。比如在操作时选了“3”,则对应的调用除法函数calcdiv() ,其他的运算符也是一样。void main()oopcalc s; s.menu();Calculator p;主函数很简单,只定义了一个类oopcalc的对象s和类Calculator的对象p以及对象s的函数menu().我的整个的计算
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 防踩踏培训课件
- 企业财务管理体系建立与实施实施手册(标准版)
- 企业合同风险防范实施手册
- 2025年儿童教育机构教学活动指导手册
- 防腐培训教学课件
- 2026年厨师职业技能等级鉴定笔试模拟卷
- 2025年城市污水处理与排放标准手册
- 2026年施工组织与协调合同
- 2026年生态修复工程合同
- 金融风险管理与控制手册
- 2025版6G智能轨道交通白皮书
- 《超纯水制备培训资料》课件
- 定制手机采购合同协议
- CNAS-CL05-2009 实验室生物安全认可准则
- 2024-2025学年湖北省新高考联考协作体高一上学期12月联考生物B及答案
- 攻击面管理技术应用指南 2024
- 电梯井道脚手架搭设方案
- DL∕T 622-2012 立式水轮发电机弹性金属塑料推力轴瓦技术条件
- 传染病学-病毒性肝炎
- 重庆市沙坪坝小学小学语文五年级上册期末试卷
- 陶瓷岩板应用技术规程
评论
0/150
提交评论