1、C语言课程设计 简单计算器程序课程设计名称:C语言课程设计课程设计题目:简单计算器程序 第1章 需求分析 设计要求(1)用 C 语言数据结构实现程序设计; (2)利用结构体、栈、进行相关信息处理; (2)系统的各个功能模块要求用函数的形式实现; (4)界面简单,可操作性高。 任务(1)定义一个结构体类型数组,输入 09 及+、-、*等符号的信息,将其信息存储起来; (2)输入简单的加减乘除算术计算式,并在屏幕上显示逆波兰(后缀式)表达式和计算结果; (3)编写代码; (4)程序分析与调试。说明: 本课程设计将实现一个简单计算器。在功能上尽量模仿 windows 的计算器。系统界面不做牵制要求。
2、该程序能实现标准型中+、-、*、/、(、)、.、的 混 合运算表达式(一般意义上的中缀表达式),将其转换成逆序波兰表达式(后缀表达式) 并计算输出结果。在进行运算后可以选择继续运算或者结束当前运算。即时准确地获得 需要的计算的结果,充分降低了数字计算的难度和节约了时间,对人们的生活有一定的帮助。 第2章 总体设计设计简介及设计方案论述逆波兰表达式又叫做后缀表达式。在通常的表达式中,二元运算符总是置于与之相 关的两个运算对象之间,所以,这种表示法也称为中缀表达式。波兰逻辑学家 于 1929 年提出了另一种表示表达式的方法。按此方法,每一运算符都置 于其运算对象之后,故称为后缀表达式。后缀表达式的
3、优点是显而易见的, 编译器在处理时候按照从左至右的顺序读取逆波 兰表达式,遇到运算对象直接压入堆栈,遇到运算符就从堆栈提取后进的两个对象进行计算,这个过程正好符合了计算机计算的原理。后缀表达式比前缀表达式更加易于转换,并且它的最左面一定为数字,这一点在实 际编程的时候就会体会到它的好处了。 逆波兰表达式有一个更大的优点,就是拆括号,根据运算符的级别将中缀表达式转 换成逆波兰表达式后,运算顺序就已经替代了运算符的级别,这样也避免了括号提高运 算级别的特殊处理。功能模块层次图 将算术表达式转化为逆波兰表达式 计算逆波兰表达式的值 第3章 详细设计 栈的定义与使用首先定义两个栈,一个字符型,一个双精
4、度型,程序代码如下 :Struct char dataMaxSize; *p=+j; while(xj=0&xj=9) j+; for(i=*p;ij;i+) n=n+pow,i-*p+1)*(xi-0); *p=j; if(sign=-) return(-n); return(n); 功能模块流程图(以下有简易图与详细图) 由(后缀)逆波兰表达式计算中缀表达式原理计算机处理(后缀)逆波兰表达式求值问题是比较方便的,即将遇到的操作数暂存于一个操作 数栈中,凡是遇到操作数,便从栈中 pop 出两个操作数,并将结果存于操作数栈中,直 到对(后缀)逆波兰表达式中最后一个操作数处理完,最后压入栈中的数
5、就是后最表达式的计算结 果。中缀表达式转换为等价的(后缀)逆波兰表达式 ,中缀表达式不方便与计算机处理,通常要讲中缀表达式转换为一个与之等价的(后缀)逆波兰 表达式。等价是指两个表达式的计算顺序和计算结果完全相同。中缀表达式:(5*2+1)=的等价(后缀)逆波兰表达式是: 5 2 * 1 + /= 仔细观察这两个等价的表达式可知,操作数的出现次序是相同的,但运算符的出现 次序是不同的。在(后缀)逆波兰表达式中,运算符的出现次序是实际进行操作的次序;在中追表 达式中,由于受到操作符的优先级和括号的影响,操作符出现次序与实际进行操作的次序很可能是不一样的。算法描述将中缀表达式转换为等价的(后缀)逆
6、波兰表达式的过程要使用一个栈放“(”,具体可以按 照下面的方式进行。 (1)从左到右一次扫描中缀表达式的每一个字符,如果是数字字符和圆点“.”则 直接将它们写入(后缀)逆波兰表达式中。 (2)如果遇到的是开括号“(”,则将它们压入一个操作符栈(不需要与栈顶操作 符相比较),它表明一个新的计算层次的开始,在遇到和它匹配的闭括号“)”时,将 栈中的元素弹出来并放入(后缀)逆波兰表达式中,直到栈顶元素为“(”时,将栈顶元素“(” 弹出(不需要加入(后缀)逆波兰表达式),表明这一层括号内的操作处理完毕。 (3)如果遇到的是操作符,则将该操作符和操作符栈顶元素比较:a 当所遇到的操作符的优先级小于或等于
7、栈顶元素的优先级时,则取出栈顶元素放 入(后缀)逆波兰表达式,并弹出该栈顶元素,反复执行直到栈顶元素的优先级小于当前操作符的 优先级; b、当所遇到的操作符的优先级大于栈顶元素的优先级的时则将它压入栈中。 (4)重复上述步骤直到遇到中缀表达式的结束符标记“=”,弹出栈中的所有元素并 放入(后缀)逆波兰表达式中,转换结束。 第4章 调试分析 程序设计中所遇到的错误及犯错的原因(1)在编辑程序时,往往需要输入汉字作为提示信息,而此时,忘记切换输入法,导致用搜狗输入法输进去的字符使得程序无法编译成功。(2)在编辑程序时,将关键字输入错误,如:else打成else,printf打成print.(3)调
8、试程序时,运行界面还未关闭,有点击运行,致使程序无法运行。(4)清屏函数不会使用。(5)运行程序之后,输入时,因输入法的问题可能会出现运算错误。 错误的解决方法(1)先找到错误出现的大概区域,然后仔细盘查,最终发现问题所在。(2)解决方法同上。(3)请教同学,在同学的指导下解决了此错误。(4)用手机上网XX搜索并请教同学,从而解决了问题。(5)进行多次调试后发现问题所在,并独立解决。第5章 用户手册 对于此“计算器程序”,操作简单方便,能快速算出您所需的计算结果。 开始时,进入运行界面,根据程序运行提示进行输入,如图所示: 图 要输入正常运算表达式,如:12*2334/15*(+)= 注意:在
9、输入表达式时,切记使用电脑原自带输入法,不要使用搜狗等输入法,否则程序可能无法正确读取字符,从而使运算结果出错 !如图所示: 图 输入之后请按回车键,之后程序便自动会将表达式转化为逆波兰表达式(后缀式),并输出计算结果!如图所示: 图 继续计算请输入 y ,退出请输入 n 。如图所示: 输入 y 的显示界面 图 输入 n 的显示界面 切记: 运行程序时,请客户务必按照程序运行提示,进行一系列的相关操作,否则,程序可能会运行出错,所以,请用户谨慎操作!总 结经过了两个多星期的 C语言程序设计, 终于在老师的细心指导和同学的热情帮助下基 本完成了计算器课题的设计任务!虽然有些地方不尽如人意但是初步
10、达到了对自己 的要求!刚开始设计的时候找不到头绪,不知道该从哪里下手!通过向同学询问和查找资料找走进了设计的门槛!通过网上查找到很多成功的计算器程序,通过对那些 已经成功地程序进行分析找到自己的设计思路,制定设计流程。并通过比较各种程序了解各个程序的利弊,从而明确自己计算器的设计方向和如何通过技术手段达到自己的目的! 万事开头难,可是对于并不是很熟悉的 C语言数据结构的我,在一开始的设计中,困难重重,.通过查找 C语言数据结构的教材,去图书馆查找相关的资料和同学一起讨论终于把一个个棘手的陌生的问题解决!程序编好后,在测试阶段中发现了几处错误导致程序不能运行,通过耐心的分析源代码终于编好了一个完
11、整无误的程序。 参考文献1 C程序设计(第三版)谭浩强 清华大学出版社 2012年1月2 数据结构(c语言版) 杨薇薇 清华大学出版社 2011年3 数据结构精讲与习题详解 殷人昆 清华大学出版社 2012年4 数据结构 殷人昆 清华大学出版社 2012年5c语言课程设计案例精编 郭翠英 中国水利出版社 6c程序设计语言 克尼汉,徐宝文附 录(程序清单)#include#include #include #include #include #define MaxSize 99 char calcMaxSize,exprMaxSize; int i,t; struct char dataMaxS
12、ize; 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*p; if(sign=+|sign=-) *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,i-*p+1)*(xi-0); *p=j; if(sign=-) return(-n); return(n); void InitStack() =-1;
13、 void SymPush() if=0) expr+t=; else printf(Sym 栈空n); return; void NumPush() if=0) if(expri!= ) switch(expri) case+:=+;break;case-:=;break; case*:=*;break; case/:=/;break; ; else printf(Num 栈空n); return; int main(void) loop1: i=0,t=-1; system(cls); printf( Calculator 计算器 n); printf(*n); printf(* 欢迎使用
14、 Welcome!: *n); printf(*n); printf(请输入算术表达式(中缀表达式):n); InitStack(); gets(calc); while(calci!=0&calci!=) if(calci=0&calci=0&calci=0&calci-1=0&!=() SymPop(); expr+t= ; SymPush(); else if(calci=*|calci=/) while=0&=*|=/) SymPop(); expr+t= ; SymPush(); else i+; while=0) SymPop(); expr+t= ; expr+t=+= ; pr
15、intf(n);printf(*n); printf(逆波兰表达式(后缀表达式):n%s =n,expr); for(i=0;expri!= ;i+) If (expri=0&expri=9) NumPush(); else NumPop(); printf(n); printf(运算结果为:n%gn,0); printf(*n); printf(Continue input y Exit input nn); printf( 继续输入计算 y 退出 nn); switch(getch() case y:system(cls);goto loop1; case n: default :exit(0); getch(); return 0;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1