




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 一 课程设计题目:模拟计算器程序设计内容:设计一个程序来模拟一个简单的手持计算器。程序支持算术运算+、-、*、/、=、以及(清除)、A(全清除)操作。程序运行时,显示一个窗口,等待用户输入,用户可以从键盘输入要计算的表达式,输入的表达式显示在窗口中,用户键入= 符号后,窗口显示出结果。选作内容如果用户输入的表达式不合法,可以判别出来并给出相应的错误提示。测试数据程序输入不少于5种不同的表达式进行测试。二问题的分析此程序设计主要运用了栈,利用栈后进先出的原理,建立两个栈,操作数栈和操作符栈,先将数据和运算符分别压入这两个栈,判断栈内和栈外运算符的优先级,依据运算符的优先级判断是应再次压入运算符
2、,还是将数据和运算符弹出栈,在栈外进行运算,再将所得的结果压入栈,继续进行与计算,直至运算结束。例如;计算5/2+1-2*3= 操作数2入操作数栈,2运算符”/”入运算符栈,操作数5入操作数栈5/ 数字栈 运算符栈。运算符“+”入运算符栈顶比较后,将2,5出栈运算,并将结果入数字栈2.5 数字栈 字符栈运算符“+”入字符栈,操作 1数1入数字栈 2.5+ 数字栈 字符栈 运算符“”入运算符栈顶比较后,将1, 2.5出栈运算,并将结果压入操作数栈3.5 运算符“”入运算符栈 数字栈 字符栈操作数2入操作数栈,运算符“*”入运算符栈顶比较后压入运算符栈3将操作数3压入操作数栈 2* 3.5 数字栈
3、 字符栈当扫描到=号时,操作数3和2出栈运算符*出栈,进行运算,运算结果入操作数栈 63.5 数字栈 字符栈操作数6和2出栈,运算符“”出栈,进行运算,运算结果入操作数栈6 3.5 数字栈 字符栈 运算符栈空,操作数栈中运算为运算2.5 结果 数字栈 字符栈分析:设置两个栈,运算数栈和运算符栈,然后,自左向右扫描表达式,遇操作数进操作数栈,遇操作符栈则与操作符栈顶运算符比较:若当前操作符大于操作符栈顶,则当前操作符进入操作符栈;若当前操作符小于等于运算符栈顶,次栈顶出栈,同时操作数栈顶也出栈,形成一个运算,并将运算的结果压入数字栈。流程图开始 初始化数字栈和字符栈 读入字符c 是否为“=”号
4、Y N N 是否为运算符 Y 字符栈是否为空 Y N C入数字栈 Y 是否比字符栈顶优先级高N C入字符栈 数字栈顶元素和次栈顶元素 出栈,运算符栈顶出栈,运算结果入数字栈 结束三算法的设计1、 创建一个calculator类,将计算器需要用到的函数都封装起来,形成一个整体。2、 设计成员函数及数据。首先定义两个私有的结构体save1和save2分别用来存放数字和运算符,在结构体内定义整型的栈顶元素top,和存放数据及运算符的数组double nMAX和char nMAX。定义了一个空的构造函数calculator()。函数bool stack1empty(save1 s),bool stac
5、k2empty(save2 s)分别判断数字栈和字符栈是否为空,若栈顶为-1则空则返回1表示真,否则返回0表示假。函数void push1(save1 &s,double num);,void push2(save2 &s,char op);分别将数字和字符压入栈。若所存储的内容已经数组的最大限度,则显示“栈已满”,否则将数字和字符压入栈顶。函数void pop1(save1 &s,double &num),void pop2(save2 &s,char &op)分别是将栈内的数字和字符弹栈,存储在num和op中。首先判断栈是否为空,若空则显示“
6、栈为空”,否则将栈顶元素分别赋值给num和op。函数int in(char op),int out(char op)分别判断栈内和栈外运算符的优先级。 在栈内,“+”“”返回2,“*”“/”返回4,在栈外“+”“”返回1,“*”“/”返回3,当遇到“+” 或“”和“*”或“/”同时存在时,“*”“/”的优先级高于“+”“”,首选“*”“/”运算。当遇到同级运算符时在时,先进行栈内运算。通过返回值的大小选择进行在哪里的哪种运算。函数void count(double a,char op,double b)是用来进行计算的,并将计算的结果压入栈。以便下一次的运算。函数void cal ()是最主要
7、的操作函数。首先提示输入表达式,并在表达式之后加上=,然后输入表达式。分别清空存放数字和字符的栈。总体用一个while语句,以“=”结束。由于是用char定义的表达式expressionMAX,所以要将里面的数字提取出来,转化成int或float类型,利用库函数isdigit()查找,若读入的字符为数字,则继续判断下一个字符,直到下个字符不是数字或者不是小数点,即可保证该操作数是完整的小数,然后将该数入操作数栈。库函数atof()将char类型进行转换。当栈内和栈外同时都有运算符时,利用int in(char op) 和 int out(char op)函数根据其返回值的大小判断运算符的优先级
8、,判断是将栈外的运算符压入栈还是将站内的数据及运算符弹出栈进行运算。若为后者,运算完后再将所得的结果压入栈顶,再次进行判断,直至栈顶为空,运算结束。主函数void main(),首先提示此程序设计者的信息。然后进行正式的计算环节,将整个主函数分为part1 和part2两部分,运用goto语句使程序在执行的流程可以跳转到part1部分,进行多次运算。定义calculator mycal,进行运算。运算结束提示是否继续进行运算,输入选择y(是) n(否) A(退出)利用while语句,当输入A时结束运算。当输入“y”时,运用system("cls")对前面的运算进行全清除,然
9、后利用goto语句跳转到part1再次进行计算。当输入“n”时停止运算,输出“谢谢使用!”程序运行结束。类:calculator数据:struct save1struct save1函数:calculator();bool stack1empty(save1 s);bool stack2empty(save2 s);void push1(save1 &s,double num);void push2(save2 &s,char op);void pop1(save1 &s,double &num);void pop2(save2 &s,char &
10、;op);int in(char op);int out(char op);void count(double a,char op,double b);void cal();系统类图基类的数据成员和函数成员描述 属性和方法定义类名成员类别类型成员名描述calculator属性structSave1存储数字Struct Save2存储运算符Boolstack1empty(save1s)判断数字栈是否为空Boolstack2empty(save2s)判断运算符栈是否为空voidpush1(save1&s,doublenum)将数据压入数字栈voidpush2(save2 &s,ch
11、ar op)将运算符压入运算符栈voidpop1(save1&s,double&num)将栈顶的数据元素取出,存放在num中voidintintvoidvoidpop2(save2 &s,char &op)in(char op)out(char op)count(double a,char op,double b)cal()将栈顶的运算符取出,存放在op中在栈内优先级的判断栈外优先级的判断进行计算并将所得的结果压入栈顶主要进行运算的函数用户手册程序运行时,首先显示此程序设计者的信息。提示欢迎使用计算机请输入表达式(输完之后请加=),然后输入所要进行计算的表达式,
12、进行计算。计算结束后提示:继续计算吗?,输入y表示同意继续计算,输入n表示结束计算,并显示谢谢使用!输入A时退出,选择你所需的形式,进行计算。(四) 上机调试过程 (1) 刚开始只能进行两个数字的运算,不能进行多个数字的计算,想到用for循环解决输入数字上的问题,但只能进行一种运算,达不到多重运算的要求。 (2)想到在用for循环解决次问题,但改来改去都弄不好,最后经老师提示,运用栈的知识解决问题。 (3)开始对栈一点都不了解,全部程序都需要重新写,完全没有一点头绪,把课本关于栈的部分看了好多遍,和同学讨论,大概知道栈是什么样的了,开始写我的程序了。 (4)本来只是考虑到建立一个数字栈的,但这
13、样运算符的优先级不能进行,得不出正确的结果,经同学提示,建立两个栈,一个存储数字,另一个存放运算符,判断运算符的优先级以后,将数字和运算符弹出栈,进行计算,把计算的结果压入栈,以便下一次运算。 (5)解决了多个多个数和多个运算符计算的问题,又想到了可不可以进行多次运算,当想结束时,按指定的键,结束运算,想到了用goto语句进行跳转,达到循环计算的目的。说明:此程序清除的功能还不能实现,只能进行全清除,修改了好长时间也未能找到一个好方法解决。(五) 运行实例选择继续运算,跳转到part1部分。 经验与体会此次c+课程设计,在指导教师的精心教导下,我们学会了如何用C+编写一个简单的应用程序。首先要
14、对程序的设计要求有一个比较明确的认识,然后系统分析与系统设计,最后是代码设计与调试。程序实现上,设计了简单的查询界面,将各个功能集中出来按照程序编写原则,便于查询。根据C+课程所学的概念、理论和方法,按照C+程序设计的基本步骤,设计出一个适当规模的程序;进一步加深对C+语言的理解和掌握。理论联系实际,加深和巩固所学的理论知识,提高实践能力和计算机的综合运用能力。我们编写程序的过程是辛苦与快乐的,程序的编写原则很重要,只要我们在编程,就必须不断改进,才能更好提高编程能力。课程设计是培养学生综合运用所学知识、发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考
15、察过程.随着科学技术发展的日新日异,C+已经成为当今计算机应用中空前活跃的领域, 在生活和学习中可以说得是无处不在。因此作为二十一世纪的大学来说掌握C+软件开发技术是十分重要的。此次课程设计使我们将理论教学中涉及到的知识点贯穿起来,对不同的数据类型、程序控制结构、数据结构作一比较和总结,结合设计题目进行综合性应用,对所学知识达到融会贯通的程度。通过课程设计,使我们在各方面的能力应该得到锻炼,不仅进一步巩固、加深学生所学专业课程C+语言教程的基本理论知识,理论联系实际,进一步培养学生综合分析问题,解决问题的能力。而且全面考核我们所掌握的基本理论知识及其实际业务能力,从而达到提高学生素质的最终目的
16、。并且利用所学知识,开发小型应用系统,掌握运用C+语言编写调试应用系统程序,训练独立开发应用系统,进行数据处理的综合能力。还使我们懂得了对于给定的设计题目,如何进行分析,理清思路,并给出相应的数学模型。 同时也使我们掌握自顶而下的设计方法,将大问题进行模块化,领会结构化程序设计的方法。熟练掌握C+语言的基本语法,灵活运用各种数据类型。进一步掌握在集成环境下如何调试程序(单步调试,设置断点、观察表达式,分块调试)和修改程序。这次课程设计历时二周,通过这次设计让我对C+有了更新的认识,认识到了它的实际应用价值,可以及大的减少工作量,节省人力物力,同时也让我认识发现到自己再学习上的存在的不足,再以后
17、的生活学习中要多加练习编程,力求改变自己的不足。课程设计学习让我学到了很多,学会了用所学习的知识去解决实际问题,一开始拿到题目,根本就不知道要从什么地方下手,感觉写这个也不行写那个不行,但经过时间的磨练以及和同学之间的交流开始有点头绪,脑海中有个大概,但还是无法全部写出来,只能实现一部分功能,而且在写程序时遇到了很多问题,程序出错自己无法修改,后来经过学长的指导和同学以及指导老师的帮助大部分功能都可以实现,自己再慢慢摸索,程序终于写出来了,这期间感觉以前好多不懂的,通过这次的学习都可以一一解决,但发现自己也有很多的不足,很多以前学过的知识点都不记得了,而且无法将它们联系在一起,除了课本上的知识
18、还有好多跟本课程有关的知识点都不懂,所以通过这次的学习,我知道自己不仅仅要把课本上的东西学好,还要了解相关的东西,让自己的知识面更广,同时我也更深刻的认识到了任何事都不可能一个人独立完成,同学和老师的帮助是非常重要的。(六) 参考资料1 郑莉 等编著C+语言程序设计(第三版)北京:清华大学出版社2 郑莉 等编著C+语言程序设计(第三版)学生用书北京: 清华大学出版社3 刘振安 等编著C+程序设计课程设计 机械工业出版社4 吴乃陵 等编著C+程序设计北京:高等教育出版社5 李春葆 等编著C+程序设计学习与上机实验指导 北京:清华大学出版社6 范辉 等编著Visual C+6.0程序设计简明教程
19、高等教育出版社7 李龙澍C+程序设计实训教程北京:清华大学出版社 8 洪国胜 等编著 C+ Builder程序设计轻松上手北京:清华大学出版社9 宁正元数据结构(c语言) 南京:东南大学出版社。2000年6月第1版10 严蔚敏等 数据结构(c语言版) 北京:清华大学出版社,1997年4月第1版。11 胡学钢等数据结构算法设计指导北京:清华大学出版社,1999年 第1版。 源程序:#include <stdlib.h>#include<iostream.h>#include<ctype.h> # define MAX 1000class calculatorp
20、rivate:struct save1 /存储数字double nMAX;int top;stack1;struct save2 /存储运算符char nMAX;int top;stack2;public:calculator(); /空的构造函数bool stack1empty(save1 s);bool stack2empty(save2 s);void push1(save1 &s,double num);void push2(save2 &s,char op);void pop1(save1 &s,double &num);void pop2(save2
21、 &s,char &op);int in(char op);int out(char op);void count(double a,char op,double b);void cal();bool calculator:stack1empty(save1 s) /判断数字栈是否为空if(s.top=-1)return 1;else return 0;bool calculator:stack2empty(save2 s)/判断运算符栈是否为空if(s.top=-1)return 1;else return 0;void calculator:push1(save1 &
22、;s,double num)/将数据压入数字栈if(s.top=MAX-1)cout<<"栈已满 "elses.top+;s.ns.top=num;void calculator:push2(save2 &s,char op)/将运算符压入运算符栈if(s.top=MAX-1)cout<<"栈已满"elses.top+;s.ns.top=op;void calculator:pop1(save1 &s,double &num)/将栈顶的数据元素取出,存放在num中if(s.top=-1)cout<&l
23、t;"栈为空"<<endl;else num=s.ns.top;s.top-;void calculator:pop2(save2 &s,char &op)/将栈顶的运算符取出,存放在op中if(s.top=-1)cout<<"栈为空"<<endl;else op=s.ns.top;s.top-;int calculator:in(char op)/在栈内优先级的判断if(op='-'|op='+')return 2;else if(op='*'|op=&
24、#39;/')return 4;else return -1;int calculator:out(char op)/早栈外优先级的判断if(op='-'|op='+')return 1;else if(op='*'|op='/')return 3;else return -1;void calculator:count(double a,char op,double b)/进行计算并将所得的结果压入栈顶double sum;switch(op)case '+':sum=a+b;break;case
25、9;-':sum=a-b;break;case '*':sum=a*b;break;case '/':sum=a/b;break;default:break;push1(stack1,sum);void calculator:cal(void)int i=0,j;double a,b,c;char expressionMAX,operate,temp20;cout<<"请输入表达式(输完之后请加=):"cin>>expression;stack1.top=-1;/清空数字栈stack2.top=-1;/清空运算
26、符栈while(expressioni!='=')/以=号结尾if(isdigit(expressioni)/*若读入的字符为数字,则继续判断下一个字符,直到下个字符不是数字或者不是小数点,即可保证该操作数是完整的小数,然后将该数入操作数栈*/j=0;while(isdigit(expressioni)|expressioni='.')tempj+=expressioni;i+;tempj='0'c=atof(temp);/char类型进行转换push1(stack1,c);elseif(expressioni='-'|expressioni='+'|expressioni='*'|expressioni='/')/若读入的字符为运算符的情况if(in(stack2.nstack2.top)<out(expressioni)|stack2empty(stack2)/读入的运算符与运算符栈顶元素相比,并进行相应的操作push2(stack2,expressioni);i+;else pop1(stack1,a);pop1(stack1,b);pop2(stack
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 跨区域输电线路及电站承包合同2025
- 软件公司装修合同范本版
- 平安医院建设合同范本
- 美国物业合同范本
- 酒水订货合同范本
- 卖房合同范本
- 购销合同范本中编号
- 水电劳务合同范本
- xx小学学生体质健康测试制度
- 中考语文记叙文阅读之标题理解
- 湖南省2024年对口升学考试计算机综合真题试卷
- 2024年江苏省南通市国家保安员资格考试题库国编版
- QB/T 2660-2024 化妆水(正式版)
- 《我与集体共成长》的主题班会
- 高中客观题的10大解题技法
- Q∕CR 9604-2015 高速铁路隧道工程施工技术规程
- 生产线直通率统计表
- 常用有缝钢管的规格及有关参数
- 大肠杆菌及大肠菌群计数方法
- 圆盘剪切机结构设计说明
- 好盈电调中文使用说明书
评论
0/150
提交评论