c++计算器要点_第1页
c++计算器要点_第2页
c++计算器要点_第3页
c++计算器要点_第4页
c++计算器要点_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

1、程序设计课程设计要求一、课程设计说明书包括的内容及装订顺序1 .封面(附件1)2 .课程设计任务书(附件2)3 .课程设计评分表(附件3)4 .正文包括目录(推荐使用 Word目录自动生成功能)、系统概述、系统分 析(包括整体程序的流程图)、系统详细设计(包括每个窗体或函数 的流程图以及代码)、总结(项目或程序的不足、遇到的困难、解决 办法、心得体会)、参考文献。二、排版要求1 .纸型A42 .字体、格式要求1. xxxxxxxx (一级标题,三号,居左,黑体,2倍行距)(1) xxxxxxxx (二级标题,四号,居左,黑体,1.5倍行距) xxxxxxxx (正文字体,五号,宋体,1.25倍

2、行距)2. xxxxxxxx图名、表名采用小五号,黑体,表中的文字采用五号,宋体。参考文献(五号,宋体,单倍行距)3 .图形及流程图用Word中的绘制工具绘制图形或流程图,最后将整个图形进行组合 以确保排版效果。标注文字用文本框插入。4 .公式使用Word中自带的“公式编辑器”5 .装订左侧装订三、考核方式(供参考)1 .作业提交:源文件(压缩文件命名:学号 _姓名_班级)、书面课程设 计说明书(各占30%2 .考勤:10%3 .答辩:30%(1)随机抽取班级人数的30%S行公开答辩(2)可自愿申请参加答辩。(3)未参加答辩的同学成绩最高为中。(4)答辩时长每人8-10分钟,介绍本人的作品或程

3、序,并回答老师 提出的问题。姓名:学号班级:课程设计说明书用C+外程设计简易计算器州交通大学电信学院软件工程系2016年 7 月 7 日课程设计任务书课程 名称程序设计课程设计(C+力题目用C+编程设计简易计算器姓名学号班级设计任务用windows系统卜的visual C+6.0编程环境,编程设计简易计算器。要求实现“+” 、“-” 、 、“/” 、“(” 、“)”五种运算符和数 值各种结合下的计算。此次编程,我们主要使用了 “栈”、“string”存储变量表达式、“deque作为存储容器,运用了栈“先入后出”的特点, 队列“先入先出”的特点,以及缓冲空间,三者结合实现基础计算的目 的。设计要

4、求程序质量:1 .符合课题要求,实现相应功能;可以加以其他功能或修饰,使程序更加完善、合理。2 .要求界面友好美观(版权页、登录页 ),功能明确,操作方便。(登录页的 用户 名:abcd,密码:1234)3 .代码应适当缩进,并给出必要的注释,以增强程序的可读性。4 .程序调试完后需生成可执行文件。课程设计说明书:课程结束后,上交课程设计说明书和源程序。课程设计说明书的内容及格式参见课程设计要求。指导教师 签字课程设计评分表课程设计题目:用C+魏程设计简易计算器姓名学号学院专业评价指标指标内涵分值评分选题与设计完成情况选题难度选题难度分为两个等级,A类选题为一级,B类选 题为二级30工作量工作

5、量饱满,工作认真、严谨,遵守纪律,与同学 团结协作、协调能力强,能按时完成设计任务。综合运用知 识综合运用知识能力强,能较系统地运用有关理论与 知识解决实际问题。能够独立查阅文献资料,从事 调查研究;具有收集、整埋、加上各种信息及状取 新知识的能力。设计水平与 实际能力能独立开展设计工作,能熟练掌握和运用所学基本 理论、基本知识和基本技能分析解决相关理论和实 际问题,设计力荣/埋引行,界向友好,符合课题 要求,实现相应功能;可以加以其他功能或修饰, 使程序更加完善、合理;操作方便易行。说 明 书 撰 写写作水平语言表达清晰,报告内容详实,能对本人所做工作 进行详细论述。30文档质量能够按照给定

6、格式用卜版,页而美观。答解思路清晰,语言流畅,回答问题准确。(无此环节则删除此行)30考 勤按时出勤,不迟到早退,以每次点名为准10成 绩评阅时间:2016年7月 日目录1 .系统概述 62 .系统分析 6(一)功能分析 6(二)流程图 73 .系统详细设计 9(1)获得符号的优先级 9(2)判断符号的优先性 9(3)前缀表达式转换为后缀表达式 10(4)前缀表达式转换为后缀表达式 114 .程序测验: 11(1)计算 “7+2=”,计算2果是 “ 9”。 11(2)计算 “ 7-2=”,计算2果是 “ 5”。 12(3)计算“9/3=",计算结果是“ 3”。 12(4)计算“4*5

7、=",计算结果是“ 20”。 12(5)计算 “(3+4)*2- 5/3= ",计算结果是 “ 13”。. 13(6)计算 “(3-5)*3- 5)/6= ",计算结果是 “ -1. . 135 .程序代码 136 .总结 177 .参考文献 18首先从string读入一连串表达式,取出每一个字符后装入一个deque容器coll1中。再从该容器取出每一个元素,利用栈将中缀表达式转换为后缀表达式,使用相对便于求值的后缀表达式来求值。之后,我们将转换成的后缀表达式,装入容器coll3中。最后,从coll3中取出元素,逐一处理,然后根据后缀表达式的计算公式(可根据相关资

8、料查找),计算出相关表达式的值,实现简易计算器的功能。二.系统分析(一)功能分析我们先定义输入流并建立栈 A存放运算符,B存放结果,从输入流中读入一个操作数压进B,读入一个运算符压进 A,如此反复。则有:读入一个元素i ,如果i是操作数,压入 B,跳转到1,如果i是运算符(不包含括号),跳转3.1,.如果i是,跳转4.1 ,如果i是EOF,即 输入流结束,反复弹出 A栈顶压入B,直到A为空,算法结束,B从栈底到栈顶的符号即为 后缀表达式(需要把 B翻个个儿)(注:3.1.判断A的栈定符号t,如果t不为(,且优先级大于等于i,则弹出t压入B,跳转, 如果t为空,即栈中为空,或其他情况直接把 i压

9、入A,跳转到1 , 4.1.弹出A的栈顶压入到 B,如此反复直到弹出的符号为 (,(和)不要压入B,跳转到1)1 .从后缀表达式队列中依次取出元素 2 .如果是操作数,那么将其压入“结果栈”中;3 .如果是操作符,从“结果栈”中取出两个元素,进行计算。(注意从栈中取元素的顺序和操作数的顺序是相反的)4 .遍历后缀表达式结束后,“结果栈”中的元素就是最终的结果(二)流程图三.系统详细设计(1)获得符号的优先级switch(c)(case '+':case '-':return 0; /如果是加减,返回0break;case如果是乘除,返回1如果是括号,返回-1ca

10、se '/': return 1; / break;case '(': case ')': return -1; /(2)判断符号的优先性void check(char c,stack<char>&coll2,deque<char>&coll3)(if(coll2.empty()(coll2.push(c);return;if(isPra(c)(if(c='(') coll2.push(c);else(while(coll2.top()!='(') /弹出所有元素直到遇到左括

11、号char ch = coll2.top();coll3.push_back(ch);coll2.pop();coll2.pop(); /当遇到左括号时,弹出但不加入 coll3(后缀表达式中)else /如果不是括号char sym = coll2.top(); /取出栈顶元素,与当前符号进行优先性比较if(getPri(c)<=getPri(sym) /比较两符号的优先性coll2.pop(); / 如果c的优先性比栈顶符号小或等于,弹出栈顶元素coll3.push_back(sym); /并将其压入coll3 (后缀表达式)中check(c,coll2,coll3); /递归调用c

12、heck,比较当前符号c与下一个栈顶符号的优先性 elsecoll2.push(c); / 如果c比栈顶符号优先级大,那将c压入coll2(操作符栈)1(3)前缀表达式转换为后缀表达式void check(char c,stack<char>&coll2,deque<char>&coll3) /判断符号的优先性if(coll2.empty()coll2.push(c);return;if(isPra(c)if(c='(') coll2.push(c);elsewhile(coll2.top()!='(') /弹出所有元素直

13、到遇到左括号char ch = coll2.top();coll3.push_back(ch);coll2.pop();coll2.pop(); /当遇到左括号时,弹出但不加入coll3(后缀表达式中) else /如果不是括号char sym = coll2.top(); /取出栈顶元素,与当前符号进行优先性比较if(getPri(c)<=getPri(sym) /比较两符号的优先性10coll2.pop(); /如果c的优先性比栈顶符号小或等于,弹出栈顶元素coll3.push_back(sym); / check(c,coll2,coll3); / 号的优先性)else并将其压入c

14、oll3 (后缀表达式)中递归调用check,比较当前符号c与下一个栈顶符(coll2.push(c); /中)如果c比栈顶符号优先级大,那将c压入coll2(操作符栈)(4)前缀表达式转换为后缀表达式void allocate(deque<char>&coll1,stack<char>&coll2,deque<char>&coll3) / 从coll中取出元素,分配元素到 coll2和coll3中while(!coll1.empty()(char c = coll1.front();coll1.pop_front();if(c>

15、;='0'&&c<二'9')(coll3.push_back(c);).else check(c,coll2,coll3); /作)while(!coll2.empty() /后缀表达式中char c = coll2.top();coll3.push_back(c);coll2.pop();)调用check函数,针对不同情况作出不同操如果输入结束,将coll2的元素全部弹出,加入(注:不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则,如:(2 + 1) * 3 ,即2 1 +

16、 3 )四.程序测验:(1)计算“7+2="计算结果是“ 9”。(2)计算“ 7-2=”,计算结果是“ 5(3)计算“9/3="计算结果是“ 3(4)计算“ 4*5= ",计算结果是“ 2012(5)计算“(3+4)*2-5/3=: 计算结果是“ 13”。(6)计算“(3-5)*3-5)/6="计算结果是“ -1”。五.程序代码#include<stack>13#include<iostream>#include<deque>#include<string> using namespace std; con

17、st int MAX = 10000; bool isPra(char c) /判断是否为括号if(c='('|c=')')return true;else return false;int getPri(char c) /获得符号的优先性switch(c)case '+':case '-': return 0; / break;case '*':case '/': return 1; / break;case '(':case ')': return -1; /如果

18、是加减,返回0如果是乘除,返回1注意,这里将括号设为最低优先级,因此括号不会被弹出,除非遇到右括号break;void check(char c,stack<char>&coll2,deque<char>&coll3) /判断符号的优先性if(coll2.empty()coll2.push(c);return; if(isPra(c)if(c='(') coll2.push(c); else弹出所有元素直到遇到左括号while(coll2.top()!='(') / char ch = coll2.top();14coll

19、3.push_back(ch);coll2.pop();)coll2.pop(); /当遇到左括号时,弹出但不加入coll3(后缀表达式中) else / 如果不是括号char sym = coll2.top(); /取出栈顶元素,与当前符号进行优先性比较if(getPri(c)<=getPri(sym) /比较两符号的优先性coll2.pop(); / 如果c的优先性比栈顶符号小或等于,弹出栈顶元素coll3.push_back(sym); /并将其压入coll3 (后缀表达式)中check(c,coll2,coll3); /递归调用check,比较当前符号c与下一个栈顶符号的优先性)

20、 elsecoll2.push(c); / 如果c比栈顶符号优先级大,那将c压入coll2(操作符栈)1)void allocate(deque<char>&coll1,stack<char>&coll2,deque<char>&coll3) / 从coll中取出元素,分配元素到 coll2和coll3中while(!coll1.empty()char c = coll1.front();coll1.pop_front();if(c>='0'&&c<='9')coll3.pu

21、sh_back(c);).else check(c,coll2,coll3); /调用check函数,针对不同情况作出不同操)while(!coll2.empty() / 如果输入结束,将 coll2 的元素全部弹出,加入后缀表达式中char c = coll2.top();coll3.push_back(c);coll2.pop();)void calculate(deque<char>&coll3,stack<int>&coll4)15 /计算后缀表达式while(!coll3.empty()char c = coll3.front();coll3.

22、pop_front();if(c>='0'&&c<='9') /如果是操作数,压入栈中int op = c-'0' /减去0'得出偏移值,即为真实数值(如果直接转换成int ,结果不对,因为char转换为int是其编码值,例如'1'的编码值为49coll4.push(op);else / 如果是操作符,从栈中弹出元素进行计算int op1 = coll4.top();coll4.pop();int op2 = coll4.top();coll4.pop();switch(c)case '

23、+': string str;coll4.push(op2+op1); break;case '-':coll4.push(op2-op1); break;case '*':coll4.push(op2*op1); break;case '/':coll4.push(op2/op1); break;int main()deque<char> colli; / stack<char> coll2; / deque<char> coll3; / stack<int>coll4; /注意是 op2

24、(op)op1 而不是 op1(op)op2盛放中缀表达式盛放操作符盛放后缀表达式计算后缀表达式的辅助容器cout<<"请输入表达式,按 enter结束:"<<endl;cin>>str;16for(int i=0;i!=str.size();+i)coll1.push_back(stri); /在两端删除法加的速度最快/*测试所用for(int i=0;i!=coll1.size();+i)cout<<"初始化完成,coll1*/allocate(coll1,coll2,coll3); /coll3 中/*测试所用

25、for(int i=0;i!=coll3.size();+i)cout<<"分配化完成,coll3*/逐一加入每个字符,这里使用deque因为deque内的数据为:从 coll内的数据为:"<<coll1i<<endl;中取出元素,分配元素到 coll2和"<<coll3i<<endl;计算后缀表达式calculate(coll3,coll4); / cout<<"计算结果为:"<<coll4.top()<<endl;六.总结经过长达一个星期的 VC+课程设计和多番

温馨提示

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

评论

0/150

提交评论