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

下载本文档

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

文档简介

1、课程设计名称:C 语言课程设计语言课程设计课程设计题目:简单计算器程序简单计算器程序 目目 录录第第 1 章章 需求分析需求分析.11.1 设计要求.11.2 任务.1第第 2 章章 总体设计总体设计.22.1 设计简介及设计方案论述.22.2 功能模块层次图.2第第 3 章章 详细设计详细设计.33.3 由(后缀)逆波兰表达式计算中缀表达式原理.83.3.1 算法描述.8第第 4 章章 调试分析调试分析.104.1 程序设计中所遇到的错误及犯错的原因.104.2 错误的解决方法.10第第 5 章章 用户手册用户手册.11总总 结结.15参考文献参考文献.16附附 录(程序清单)录(程序清单)

2、.17-0-第 1 章 需求分析1.1 设计要求设计要求(1)用 C 语言数据结构实现程序设计; (2)利用结构体、栈、进行相关信息处理; (2)系统的各个功能模块要求用函数的形式实现; (4)界面简单,可操作性高。1.2 任务任务(1)定义一个结构体类型数组,输入 09 及+、-、*等符号的信息,将其信息存储起来; (2)输入简单的加减乘除算术计算式,并在屏幕上显示逆波兰(后缀式)表达式和计算结果; (3)编写代码; (4)程序分析与调试。说明: 本课程设计将实现一个简单计算器。在功能上尽量模仿 windows 的计算器。系统界面不做牵制要求。该程序能实现标准型中+、-、*、/、 (、 )

3、、.、的 混 合运算表达式(一般意义上的中缀表达式) ,将其转换成逆序波兰表达式(后缀表达式) 并计算输出结果。在进行运算后可以选择继续运算或者结束当前运算。即时准确地获得 需要的计算的结果,充分降低了数字计算的难度和节约了时间,对人们的生活有一定的帮助。 -1-第 2 章 总体设计2.1 设计简介及设计方案论述设计简介及设计方案论述逆波兰表达式又叫做后缀表达式。在通常的表达式中,二元运算符总是置于与之相 关的两个运算对象之间,所以,这种表示法也称为中缀表达式。波兰逻辑学家 J.Lukasiewicz 于 1929 年提出了另一种表示表达式的方法。按此方法,每一运算符都置 于其运算对象之后,故

4、称为后缀表达式。后缀表达式的优点是显而易见的, 编译器在处理时候按照从左至右的顺序读取逆波 兰表达式,遇到运算对象直接压入堆栈,遇到运算符就从堆栈提取后进的两个对象进行计算,这个过程正好符合了计算机计算的原理。后缀表达式比前缀表达式更加易于转换,并且它的最左面一定为数字,这一点在实 际编程的时候就会体会到它的好处了。 逆波兰表达式有一个更大的优点,就是拆括号,根据运算符的级别将中缀表达式转 换成逆波兰表达式后,运算顺序就已经替代了运算符的级别,这样也避免了括号提高运 算级别的特殊处理。2.2 功能模块层次图功能模块层次图 将算术表达式转化为逆波兰表达式 计算逆波兰表达式的值 简单计算器简单计算

5、器表表达达式式格格式式转转换换系系统统 求求 值值 计计 算算 系系 统统-2-第 3 章 详细设计3.1 栈的定义与使用栈的定义与使用首先定义两个栈,一个字符型,一个双精度型,程序代码如下 :Struct char dataMaxSize; / 存放表达式的字符数组 int top; /栈顶指针 Sym; /*符号*/ /作为存放运算表达式的栈使用 struct double dataMaxSize; /存放运算结果的数组 int top; /栈顶指针 Num; /*数*/ 存储逆波兰表达式(后缀式)计算器的运算数 /作为存放运算结果的栈使用 void InitStack() Sym.top

6、=Num.top=-1; /栈的初始化 void SymPush() /压栈 if(Sym.top=0) expr+t=Sym.dataSym.top-;else printf(Sym 栈空n); return; void NumPush() /压栈 If(Num.top=0) if(expri!= ) switch(expri) -4-case+:Num.dataNum.top-1=Num.dataNum.top-1+Num.dataNum.top;break; case -:Num.dataNum.top-1=Num.dataNum.top-1-Num.dataNum.top;break;

7、 case *:Num.dataNum.top-1=Num.dataNum.top-1*Num.dataNum.top;break; case /:Num.dataNum.top-1=Num.dataNum.top-1/Num.dataNum.top;break; Num.top-; else printf(Num 栈空n 定义一个对逆波兰表达式中,数字的处理函数 double ston(char x,int *p) int j=*p+1,i; double n=0; char sign=x*p; if(sign=+|sign=-) *p=*p+1; while(xj=0&xj=9)

8、j+; for(i=*p;i=0&xj=9) j+; for(i=*p;ij;i+)-5- n=n+pow(0.1,i-*p+1)*(xi-0); *p=j; if(sign=-) return(-n); return(n); 3.2 功能模块流程图(以下有简易图与详细图)功能模块流程图(以下有简易图与详细图) 主函数 输入遇到数字压栈,括号删除,运算符压栈从而转化为逆波兰表达式将逆波兰表达式压栈,遇到运算符,取出两个操作数进行运算,并将结果压栈以此类推,最后栈中只剩下最后结果从栈中取出结果并输出-6- 数字 运算符 小于或等于 取出栈顶元素 运算符 操 作数 运算结果 是 否 开始输

9、入表达式逐个字符扫描直至=或0判断字符类型写入逆波兰表达式第一个字符直接压栈,其余的与栈顶元素比较优先级大于压入栈中如果是(直接压栈直至遇到) ,取出栈中元素输出逆波兰表达式 逐个扫描字符直至遇到0 判断字符类型 压栈取出栈中两个操作数,执行运算,得出运算结果取出栈顶元素输出栈顶元素,也即最终运算结果是否继续使用计算器 结束-7-3.3 由(后缀)逆波兰表达式计算中缀表达式原理由(后缀)逆波兰表达式计算中缀表达式原理计算机处理(后缀)逆波兰表达式求值问题是比较方便的,即将遇到的操作数暂存于一个操作 数栈中,凡是遇到操作数,便从栈中 pop 出两个操作数,并将结果存于操作数栈中,直 到对(后缀)

10、逆波兰表达式中最后一个操作数处理完,最后压入栈中的数就是后最表达式的计算结 果。中缀表达式转换为等价的(后缀)逆波兰表达式 ,中缀表达式不方便与计算机处理,通常要讲中缀表达式转换为一个与之等价的(后缀)逆波兰 表达式。等价是指两个表达式的计算顺序和计算结果完全相同。中缀表达式:0.3/(5*2+1)=的等价(后缀)逆波兰表达式是:0.3 5 2 * 1 + /= 仔细观察这两个等价的表达式可知,操作数的出现次序是相同的,但运算符的出现 次序是不同的。在(后缀)逆波兰表达式中,运算符的出现次序是实际进行操作的次序;在中追表 达式中,由于受到操作符的优先级和括号的影响,操作符出现次序与实际进行操作

11、的次序很可能是不一样的。3.3.1 算法描述算法描述将中缀表达式转换为等价的(后缀)逆波兰表达式的过程要使用一个栈放-8-“(”,具体可以按 照下面的方式进行。 (1)从左到右一次扫描中缀表达式的每一个字符,如果是数字字符和圆点“.”则 直接将它们写入(后缀)逆波兰表达式中。 (2)如果遇到的是开括号“(”,则将它们压入一个操作符栈(不需要与栈顶操作 符相比较) ,它表明一个新的计算层次的开始,在遇到和它匹配的闭括号“) ”时,将 栈中的元素弹出来并放入(后缀)逆波兰表达式中,直到栈顶元素为“(”时,将栈顶元素“(” 弹出(不需要加入(后缀)逆波兰表达式) ,表明这一层括号内的操作处理完毕。

12、(3)如果遇到的是操作符,则将该操作符和操作符栈顶元素比较:a 当所遇到的操作符的优先级小于或等于栈顶元素的优先级时,则取出栈顶元素放 入(后缀)逆波兰表达式,并弹出该栈顶元素,反复执行直到栈顶元素的优先级小于当前操作符的 优先级; b、当所遇到的操作符的优先级大于栈顶元素的优先级的时则将它压入栈中。 (4)重复上述步骤直到遇到中缀表达式的结束符标记“=”,弹出栈中的所有元素并 放入(后缀)逆波兰表达式中,转换结束。 -9-第 4 章 调试分析4.1 程序设计中所遇到的错误及犯错的原因程序设计中所遇到的错误及犯错的原因(1)在编辑程序时,往往需要输入汉字作为提示信息,而此时,忘记切换输入法,导

13、致用搜狗输入法输进去的字符使得程序无法编译成功。(2)在编辑程序时,将关键字输入错误,如:else 打成 else,printf 打成print.(3)调试程序时,运行界面还未关闭,有点击运行,致使程序无法运行。(4)清屏函数不会使用。(5)运行程序之后,输入时,因输入法的问题可能会出现运算错误。4.2 错误的解决方法错误的解决方法(1)先找到错误出现的大概区域,然后仔细盘查,最终发现问题所在。(2)解决方法同上。(3)请教同学,在同学的指导下解决了此错误。(4)用手机上网百度搜索并请教同学,从而解决了问题。(5)进行多次调试后发现问题所在,并独立解决。-10-第 5 章 用户手册5.1 对于

14、此“计算器程序” ,操作简单方便,能快速算出您所需的计算结果。5.2 开始时,进入运行界面,根据程序运行提示进行输入,如图所示: 图 5.1要输入正常运算表达式,如:12*2334/15*(26.5+3.4)= 注意:在输入表达式时,切记使用电脑原自带输入法,不要使用搜狗等输入法,否则程序可能无法正确读取字符,从而使运算结果出错 !如图所示:-11- 图 5.2输入之后请按回车键,之后程序便自动会将表达式转化为逆波兰表达式(后缀式) ,并输出计算结果!如图所示: 图 5.3-12-继续计算请输入 y ,退出请输入 n 。如图所示: 输入 y 的显示界面 图 5.4 输入 n 的显示界面 -13

15、-切记: 运行程序时,请客户务必按照程序运行提示,进行一系列的相关操作,否则,程序可能会运行出错,所以,请用户谨慎操作!-14-总 结经过了两个多星期的 C 语言程序设计, 终于在老师的细心指导和同学的热情帮助下基 本完成了计算器课题的设计任务!虽然有些地方不尽如人意但是初步达到了对自己 的要求!刚开始设计的时候找不到头绪,不知道该从哪里下手!通过向同学询问和查找资料找走进了设计的门槛!通过网上查找到很多成功的计算器程序,通过对那些 已经成功地程序进行分析找到自己的设计思路,制定设计流程。并通过比较各种程序了解各个程序的利弊,从而明确自己计算器的设计方向和如何通过技术手段达到自己的目的! 万事

16、开头难,可是对于并不是很熟悉的 C 语言数据结构的我,在一开始的设计中,困难重重,.通过查找 C 语言数据结构的教材,去图书馆查找相关的资料和同学一起讨论终于把一个个棘手的陌生的问题解决!程序编好后,在测试阶段中发现了几处错误导致程序不能运行,通过耐心的分析源代码终于编好了一个完整无误的程序。 -15-参考文献1 C 程序设计(第三版)谭浩强 清华大学出版社 2012 年 1 月2 数据结构(c 语言版) 杨薇薇 清华大学出版社 2011 年3 数据结构精讲与习题详解 殷人昆 清华大学出版社 2012 年4 数据结构 殷人昆 清华大学出版社 2012 年5c 语言课程设计案例精编 郭翠英 中国

17、水利出版社 2004.036c 程序设计语言 克尼汉,徐宝文 2004.01.01-16-附 录(程序清单)#include#include #include #include #include #define MaxSize 99 char calcMaxSize,exprMaxSize; int i,t; struct char dataMaxSize; int top; Sym; struct double dataMaxSize; int top; Num; double ston(char x,int *p) int j=*p+1,i; double n=0; char sign=x

18、*p; if(sign=+|sign=-)-17- *p=*p+1; while(xj=0&xj=9) j+; for(i=*p;i=0&xj=9) j+; for(i=*p;ij;i+) n=n+pow(0.1,i-*p+1)*(xi-0); *p=j; if(sign=-) return(-n); return(n); void InitStack() Sym.top=Num.top=-1; void SymPush() if(Sym.top=0) expr+t=Sym.dataSym.top-;else printf(Sym 栈空栈空n); return; void Nu

19、mPush() if(Num.top=0) if(expri!= ) switch(expri) case+:Num.dataNum.top-1=Num.dataNum.top-1+Num.dataNum.top;break;case-:Num.dataNum.top-1=Num.dataNum.top-1-Num.dataNum.top;break; case*:Num.dataNum.top-1=Num.dataNum.top-1*Num.dataNum.top;break;-19- case/:Num.dataNum.top-1=Num.dataNum.top-1/Num.dataNum.top;break; Num.top-; else printf(Num 栈空栈空n); return; int main(void) loop1: i=0,t=-1; system(cls); printf( Calculator 计算器计算器 n); printf(*n); printf(* 欢迎使用欢迎使用 Welcome!: *n); printf(*n); printf(请输入算术表达式请输入算术表达式(中缀表达式中缀表达式):n); InitStack(); gets(calc); while(calci!=0&calci!=)

温馨提示

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

评论

0/150

提交评论