c++简单计算器课程设计_第1页
c++简单计算器课程设计_第2页
c++简单计算器课程设计_第3页
c++简单计算器课程设计_第4页
c++简单计算器课程设计_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

1、 攀枝花学院 Panzhihua university学生课程设计(论文) 题 目: 简单计算器 学生姓名: 00000 学 号:000000000000所在院(系): 数学与计算机学院 专 业: 网络工程 班 级: 2012级网络工程1班 指 导 教 师: 秦振涛 职称: 讲师 2013年 6月 20 日攀枝花学院教务处制攀枝花学院本科学生课程设计任务书题目计算器1、课程设计的目的本课程设计的目的和任务:(1)巩固和加深学生对C语言课程的基本知识的理解和掌握;(2)掌握C语言编程和程序调试的基本技能;(3)利用C语言进行简单软件设计的基本思路和方法;(4)提高运用C语言解决实际问题的能力。2

2、、课程设计的内容和要求(包括原始数据、技术要求、工作要求等)一、用C实现如下功能:使用C语言编写一个类似于Windows附件提供的计算器软件,实现计算器的基本功能,能进行浮点数的加、减、乘、除、乘方和求模运算。二、撰写课程设计报告或课程设计总结课程设计报告要求:总结报告包括需求分析、总体设计、详细设计、编码(详细写出编程步骤)、测试的步骤和内容、课程设计总结、参考资料等,不符合以上要求者,则本次设计以不及格记。3、主要参考文献1 揣锦华.面向对象程序设计与VC+实践.西安电子科技大学出版社,20052 张建宏,汤练兵,马德骏.计算机程序设计基础-C语言程序设计.科学出版社,20063 陈清华.

3、Visual C+课程设计案例精选与编程指导.东南大学出版社,20044 谭浩强,c+程序设计(第二版),清华大学出版社,20114、课程设计工作进度计划课程设计时间为两周,分四个阶段完成:1. 分析设计阶段。引导学生自主学习和钻研问题,明确设计要求,找出实现方法,按照需求分析、总体设计、详细设计这几个步骤进行。这一阶段前第1-2天完成。2. 编码调试阶段:根据设计分析方案编写C语言代码,然后调试该代码,实现课题要求的功能。这一阶段在第3-7天完成。3. 总结报告阶段:总结设计工作,写出课程设计说明书,要求学生写出需求分析、总体设计、详细设计、编码、测试的步骤和内容。这一阶段在第8-9天完成。

4、4. 考核阶段。这一阶段在第10天完成。指导教师(签字)日期年 月 日教研室意见:年 月 日学生(签字): 接受任务时间: 年 月 日注:任务书由指导教师填写。课程设计(论文)指导教师成绩评定表题目名称评分项目分值得分评价内涵工作表现20%01学习态度6遵守各项纪律,工作刻苦努力,具有良好的科学工作态度。02科学实践、调研7通过实验、试验、查阅文献、深入生产实践等渠道获取与课程设计有关的材料。03课题工作量7按期圆满完成规定的任务,工作量饱满。能力水平35%04综合运用知识的能力10能运用所学知识和技能去发现与解决实际问题,能正确处理实验数据,能对课题进行理论分析,得出有价值的结论。05应用文

5、献的能力5能独立查阅相关文献和从事其他调研;能提出并较好地论述课题的实施方案;有收集、加工各种信息及获取新知识的能力。06设计(实验)能力,方案的设计能力5能正确设计实验方案,独立进行装置安装、调试、操作等实验工作,数据正确、可靠;研究思路清晰、完整。07计算及计算机应用能力5具有较强的数据运算与处理能力;能运用计算机进行资料搜集、加工、处理和辅助设计等。08对计算或实验结果的分析能力(综合分析能力、技术经济分析能力)10具有较强的数据收集、分析、处理、综合的能力。成果质量45%09插图(或图纸)质量、篇幅、设计(论文)规范化程度5符合本专业相关规范或规定要求;规范化符合本文件第五条要求。10

6、设计说明书(论文)质量30综述简练完整,有见解;立论正确,论述充分,结论严谨合理;实验正确,分析处理科学。11创新10对前人工作有改进或突破,或有独特见解。成绩指导教师评语指导教师签名: 年月日攀枝花学院C及C+课程设计报告摘要本课程设计将实现一个简单计算器。其类似于Windows附件中自带的计算器。这个计算器不仅实现了简单的四则运算功能,还实现了高级的科学计算功能,而且具有简洁大方的图文外观。它的设计按软件工程的方法进行,系统具有良好的界面、必要的交互信息和较好的健壮性使用人员能快捷简单地进行操作。即时准确地获得需要的计算的结果,充分降低了数字计算的难度和节约了时间,对人们的生活有一定的帮助

7、。在课程设计中,系统开发平台为Windows 2000XP,程序设计设计语言采用Visual C+,在程序设计中,采用了结构化与面向对象两种解决问题的方法。关键词: 程序设计,计算器,MFC,按钮控件目录摘要1 前言31.1 课题背景31.2 课程设计目的31.3 可行性分析32 相关技术分析43 设计与实现83.1 算法的实现83.1.1 头文件83.1.2 取字符83.1.3 运算的处理113.2 计算器的结果测试143.2.1 测试一143.2.2 测试二153.2.3 测试三163.2.4 测试四174 源程序代码18结论20参 考 文 献211 前言简单计算器包括双目运算和单目运算功

8、能。双目运算符包含基本的四则运算及乘幂功能,单目运算符包含正余弦,阶乘,对数,开方,倒数等运算。可对输入任意操作数,包括小数和整数及正数和负数进行以上的所有运算并能连续运算。出现错误会给出相应提示,同时包含清除,退格,退出功能以及有与所有按钮相对应的菜单项。1.1 课题背景 计算器是日常生活中十分便捷有效的工具,能实现加、减、乘、除、开方、求倒数等简单运算的工具。要实现计算功能,可以用VC+的知识编写程序来解决此问题。该计算器大大的降低了数字计算的难度及提高了计算的准确度和精确度。该计算器使用非常简单和方便,对广大中小学生的学习有巨大帮助作用,也对在职人员的工作有点帮助作用。1.2 课程设计目

9、的 在程序设计中,通过设计、编制、调试一个模拟计算器的程序,加深对语法及语义分析原理的理解,并实现对命令语句的灵活应用。在程序设计中,可以用两种方法解决问题:一是传统的结构化程序设计方法,二是更先进的面向对象程序设计方法。由于多个函数均需要访问某些数据,这些数据常被设计为全局变量。而在面向对象程序设计中关键是如何将问题域中的实体(即日常所见的概念)抽取出来,作为C+程序中的类,而属性与行为作为类的两类要素通常是必不可少的,甚至还应考虑类必须满足的约束。1.3 可行性分析本设计是简单计算器。日常计算机使用中,常常涉及到一些有关计算的问题,一个小型的计算器软件变得非常有用,该校型计算器需要空间资源

10、较少,对电脑其他程序的应用影响较小。它的设计按软件工程的方法进行,系统具有良好的界面、必要的交互信息和较好的健壮性;醒目美观的软件封面。使用人员能快捷简单地进行操作。即时准确地获得需要的计算的结果,充分降低了数字计算的难度和节约了时间,对人们的生活有一定的帮助。1.4 需求分析 本软件主要用于计算机windows 2000/XP以上版本的用户的使用,这次课程设计一般是实现简单计算器的功能。要程序能实现:加,减,乘,除,开方,倒数等运算功能;还要实现数据的输入,输出,计算,显示及程序退出等功能。另外还可以实现多种科学计算的功能,如:三角函数的计算,弧度与角度间的转换,对数指数的计算等等。2 相关

11、技术分析如图是整个计算器的流程图,打开计算器程序,输入数据,调用输入数据子程序。子程序开始时m_num为零。按下数字按钮后,判断m_num的正负号,对其进行相关处理,然后在判断是否有小数点,处理后输出结果。回到总流程图中,输完第一个操作数后,若按下双目运算符,则把m_num存入num2,按下输入第二个操作数并算出结果。若按下的是单目运算符,则直接对其处理得出结果。若按下清零,则m_num等于0.在运算中还要判断运算是否合法,以及结果是否超出显示范围,以做出相关提示,按下清零。算出后把结果保存至num2。若需用算出的结果继续运算则回到输入完第一个操作数后,若不需要则判断试否需要开始新一轮的运算,

12、不需要则结束。它的设计按软件工程的方法进行,系统具有良好的界面;必要的交互信息;简约美观的效果。使用人员能快捷简单地进行操作。即可单机按钮进行操作,也可直接通过键盘直接输入。即时准确地获得需要的计算的结果,充分降低了数字计算的难度和节约了时间,对人们的生活有一定的帮助。(1)包含的功能有:加、减、乘、除运算,开方、求倒数等功能1(2)计算器上数字09为一个控件数组,加、减、乘、除为一个控件数组,其余为单一的控件。(3)给对话框添加菜单。(4)制定高级按钮控件,该按钮具有不规则的形状,可以根据用户鼠标的位置和单击状态的不同,显示不同的颜色3。(5)制定高级编辑控件,该编辑控件可以指定文本文字的字

13、体和颜色。(6)输入的原始数据、运算中间数据和结果都显示在窗口顶部的同一个标签中。(7)实现对话框的扩展功能2。(8)计算功能基本上是用系统内部函数。(9)程序可以能自动判断输入数据的正确性,保证不出现多于一个小数点、以0开头等不正常现象。NNY键入一个数是否为正数?m_num =10*m_num+im_num =10*m_num-i是否为小数?用UpdateData(FALSE)刷新显示还原m_num根据小数点后位数将键入的数除以n次10累加到m_numYN继续键入数字?Y输入数据子函数编辑框关联变量m_num=0 图2.1 输入数据子函数流程图Y开始输入数据子函数编辑框关联的变量保存至nu

14、m2输入数据子函数进行运算运算是否合法把结果保存到num2m_num清零弹出对话框显示ERRORNY是否用保存的结果继续进行运算N结束jie双目运算符单目运算符是否开始新一轮的计算YN 图2.2 简单计算器总流程图3 设计与实现3.1 算法的实现3.1.1 头文件首先对于一个程序的实现,我们需要运用很多的类,而对于我们的一个简单的程序来说,再编写一个类是很麻烦的。头文件可以定义很多宏定义,就是一些全局静态变量的定义,在这样的情况下,只要修改头文件的内容,程序就可以做相应的修改,不用亲自跑到繁琐的代码内去搜索。所以我们需要应用前辈的经验,他们将很多的头文件写好,以便我们使用。对于我所设计的简单计

15、算器 ,就将应用很多的头文件。如:#include <iostream>#include <map> #include <string>#include <cctype>3.1.2 取字符在一个简易计算器中,计算器值得输入与输出也是至关重要的,在本程序中,首先应用枚举理出计算式所有可能出现的值,C+编程语言作为一种强大的语言,在写程序的时候,我们常常需要为某个对象关联一组可选的alternative属性,所以我们常常就需要建立一个取值范围,在本函数中应用enum TOKEN value枚举函数;同时运用switch()函数来进行去自字符运算,这个

16、函数的代码如下:enum Token_value /首先定义Taken_value为enum函数,Token_value为枚举类型,枚举了该语言中的各种终结符标记(token)值。NAME, NUMBER, END,PLUS='+', MINUS='-', MUL='*', DIV='/', PRINT='', ASSIGN='=',LP='(',RP=')',; /中间所包含的就是枚举中的成员 定义:Token_value curr_tok = PRINT; /cu

17、rr_tok:在get_token中设置,在expr、term、prim中的switch中使用。它表示的是当前读入的标记的类别,用来控制分类别的求值及其它处理。map<string,double> table; /number_value:在get_token中设置,在prim中使用。它表示的是当前读入数的字面值。double number_value; /table:在prim中设置,在prim中使用。它表示的是已经读入的符号名对应数值,符号名可以增加,对应数值通过引用类型隐含地赋值。 string string_value; /string_value:在get_token中设

18、置, 在prim中使用。它表示的是当前读入的符号名,用来在table中查找对应的数值。int no_of_errors; /no_of_errors:在error中设置,在main中使用。它表示的是已经发生的错误数量。 取字符的主代码:Token_value get_token() /取字符,由程序中的get_token函数实现,它完成程序的输入和词法分析。char ch; /定义字符chdo if(!cin.get(ch) return curr_tok = END;/没有输入字符或者输入的为空,将返回值为curr_tok = END。while(ch!='n' &&

19、amp; isspace(ch); /直到ch !=换行符时和返回值为非零值时结束dowhile()循环。switch(ch) case '':case 'n':return curr_tok = PRINT; /当ch得值为;或者n时,返回curr_tok = PRINTcase '*':case '/':case '+':case '-':case '(':case ')':case '=':return curr_tok = Token_valu

20、e(ch); /当ch得值为'*'、'/'、'+'、'-'、'('、')'、'='时, 返回值为 curr_tok = Token_value (ch),即取出该值。case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8':

21、 case '9': case '.':cin.putback(ch);cin>>number_value;return curr_tok = NUMBER; /如果输入的是数字字符及.时,就将运行花括号中的程序,cin.putback(ch)是将ch放回到输入流中去,后面可以直接读完整的数字,使输入数字时,能够保证输入的数字与想法相协调。并返回值curr_tok = NUMBER。default: /由程序中map类型的table实现,用以保存程序的输入和词法分析。if(isalpha(ch) string_value = ch;while(cin

22、.get(ch) && isalnum(ch) string_value += ch;cin.putback(ch);return curr_tok = NAME; /本段主要是对符号的输入,isalpha(ch)判断是否为中英文,若是,则返回非0值,否则,返回0值。error("bad token");return curr_tok = PRINT;3.1.3 运算的处理计算器的核心组成部分,它将对人们所输入的数字进行运算处理,将得到我们想要的结果。定义double expr(bool get);double prim (bool get); 在初始的时候

23、get为真,根据不同的if()函数来判断,并将所要取的字符判断出来进行运算处理。代码如下:double expr(bool get); /加和减double prim(bool get) /处理初等项if(get) get_token();switch(curr_tok) case NUMBER: /运用switch函数,当case NUMBER;时,将把取符号时输入的number_value的值赋给v,并将值返回。 double v = number_value;get_token();return v;case NAME: /首先运用map函数,对tablestring_value对应输入

24、,并将字符赋给double &v;if输入的字符与枚举列表中的ASSIGN一样的,即expr(true)为+,并将字符返回v。double &v = tablestring_value; /把v设置为 tablestring_value的引用。if(get_token() = ASSIGN) v = expr(true); /如果所获得的字符与枚举中的ASSIGN即加号符号相同,则expr为真,运行加法运算。return v;case MINUS: /把v设置为 tablestring_value的引用;if输入的字符与枚举列表中的MINUS一样的,即-prim(true)为-

25、,并将字符返回v。return -prim(true); /case LP: /如果函数满足LP,则返回到error函数。double e = expr(true);if(curr_tok!=RP) return error(") expected");get_token(); /重新取字符return e;default:return error("primary expected");double term(bool get) /乘除运算double left = prim(get);for(;)switch(curr_tok) case MUL:l

26、eft *= prim(true); /在prim函数中去乘以leftbreak;case DIV:if(double d = prim(true) /同理,是为除left /= d;break;return error("divide by 0");default:return left;double expr(bool get) /加减double left = term(get);for(;)switch(curr_tok) case PLUS:left += term(true);break;case MINUS:left -= term(true);break;d

27、efault:return left;3.2 计算器的结果测试3.2.1 测试一输入“90.5”,“-”,“60.7”,“+”,“2.36”,“ =”,运算结果32.16,与实际结果相同。3.2.2测试二 输入“910”,“/”,“10”,运算结果为91,与实际相符。3.2.3 测试三 输入“3”,“*”,“6”,“*”,“2”。计算结果为36,与实际结果相同。3.2.4 测试四 输入“9”,“/”,“3”,“+”,“5”,“-”,“2”,“*”,“1”得,运算结果为6,与实际结果相同。4 源程序代码20#include <iostream>#include <map>

28、#include <string>#include <cctype>using namespace std;enum Token_value NAME,NUMBER,END,PLUS='+',MINUS='-',MUL='*',DIV='/',PRINT='',ASSIGN='=',LP='(',RP=')',;Token_value curr_tok = PRINT;map<string,double> table;double

29、number_value;string string_value;int no_of_errors;double error(const string &s)no_of_errors+;cerr<<"error: "<<s<<endl;return 1;Token_value get_token() /取字符char ch;do if(!cin.get(ch) return curr_tok = END;while(ch!='n' && isspace(ch);switch(ch) case 

30、9;':case 'n':return curr_tok = PRINT;case '*':case '/':case '+':case '-':case '(':case ')':case '=':return curr_tok = Token_value(ch);case '0': case '1': case '2': case '3': case '4': case 

31、9;5': case '6': case '7': case '8': case '9': case '.':cin.putback(ch);cin>>number_value;return curr_tok = NUMBER;default:if(isalpha(ch) string_value = ch;while(cin.get(ch) && isalnum(ch) string_value += ch;cin.putback(ch);return curr_tok = N

32、AME;error("bad token");return curr_tok = PRINT;double expr(bool get); /加和减double prim(bool get) /处理初等项if(get) get_token();switch(curr_tok) case NUMBER:double v = number_value;get_token();return v;case NAME:double &v = tablestring_value;if(get_token() = ASSIGN) v = expr(true);return v;c

33、ase MINUS:return -prim(true);case LP:double e = expr(true);if(curr_tok!=RP) return error(") expected");get_token();return e;default:return error("primary expected");double term(bool get) /乘除double left = prim(get);for(;)switch(curr_tok) case MUL:left *= prim(true);break;case DIV:if(double d = prim(true) left /= d;break;return error("divide by 0");default:return left;double expr(bool get) /加减double left = term(get);for(;)switch(curr_tok) case

温馨提示

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

评论

0/150

提交评论