版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、设计题目:模拟计算器程序学生姓名:谢先斌系别:计算机与通信工程学院专业:计算机科学与技术班级:1班学号:541007010144 指导教师:卢冰李晔XX 年 6 月 21 日郑州轻工业学院课程设计任务书题目模拟计算器程序专业、班级计算机科学与技术10-01班学号 541007010144 姓名谢先斌主要内容:设计一个模拟计算器的程序,要求能对包含加、减、乘、除、括号运算符及SQR和ABS函数的任意整型表达式进行求解。基本要求:要检查有关运算的条件,并对错误的条件产生报警。主要参考资料:严蔚敏吴伟民编著数据结构(C语言版)清华大学出版社第44页栈、第52页表达式求值完成期限: XX年6月21日指
2、导教师签名:课程负责人签名:XX年 6月 21 日一、设计题目模拟计算器的程序设计一个模拟计算器的程序,要求能对包含加、减、乘、除、括号运算符及SQR和ABS函数的任意整型表达式进行求解。设计要求:要检查有关运算的条件,并对错误的条件产生报警。二、算法设计的思想本程序设计主要是应用了栈,利用栈的“先进后出”原理,建立了两个栈,分别为运算符栈pOStack和运算数栈pDStack。算法的基本思想(参考课本p53页)是:(1) 首先置操作数栈为pDStack空栈,表达式起始符为“=”,位运算符栈的栈底元素; (2) 依次读入表达式中的每个字符,若是操作数则进入pDStack栈,若是运算符则和pOS
3、tack栈的栈定运算符比较优先权后作相应操作,直到整个表达式求值完毕(即pOStack栈的栈定元素和当前读入的字符均为“=” )。三、算法的流程图本程序的流程如下附图1所示:附图1 程序流程图四、算法设计分析首先创建了两个栈:typedef struct OPStack /定义运算符栈 char opStack; int top; OPStack, *pOPStack; typedef struct DATAStack /定义运算数栈 double stack; int top; DATAStack, *pDATAStack; 来分别存放运算符和运算数。在两个结构体中均有一个top数据域,当t
4、op=-1时,表示该站为空栈。定义一个Evaluateexpression_r()函数来完成函数运算的主要功能:读入表达式,并计算结果。以下是对该函数的分析:当一次运算开始时,分别调用InitpOPStack(pOPStack &pOStack)函数和InitpDATAStack(pDATAStack &pDStack)函数分别对运算符栈和运算数栈进行初始化。调用PushOPStack(pOStack, =)函数来完成运算符栈栈低元素的设置。通过PushOPStack(pOPStack &pOStack, char ch)函数、PopOPStack(pOPStack &pOStack, cha
5、r &ch)函数、PushDATAStack(pDATAStack &pDStack, double d)函数和PopDATAStack(pDATAStack &pDStack, double &d)函数来分别完成运算符和运输数的进出栈操作。getToppOPStack(pOPStack &pOStack)函数和getToppDATAStack(pDATAStack &pDStack) 函数主要是进行得到栈定元素的作用,特别是在对运算符栈优先级的比较中十分重要,其中还会调用IsOP(char &ch) 函数来区分读入的是运算符还是运算数。ChangeChar(char &c)函数当每次读入一个
6、字符是都会调用一次,主要的作用就是完成不用区分A、S的大小的功能。Precede(char op1, char op2)函数主要是通过一个二维字符串数组来存放9种运算符的优先级比较的结果,每当读到一个运算符后就进行与运算符栈顶元素比较,通过返回的“、=”结果来进行下一步的操作:表示运算符和运算数各退栈一次并调用Operate(double a, char theta, double b)函数(主要是对出栈的运算符和运算数进行计算),最后将运算结果压入运算数栈pDStack。当操作结束时运算数栈的栈顶元素就是计算结果,分别调用ClearpOPStack(pOStack)函数清空运算符栈、Clea
7、rpDATAStack(pDStack)函数清空运算数栈以待下一次继续进行相关操作。print_user()函数和exit_E()函数开始和结束时个调用一次,分别完成欢迎界面和退出界面的布置。main()是本程序的主函数,主要通过while语句和switch语句来完成本程序的运行,当输入Y(y)时调用Evaluateexpression_r()函数完成计算,当输入N(n)时,调用exit_E()函数退出本程序的运行。本程序还考虑到各种异常的处理,如运算时除数为0、被开方数为0等情况的出现,最终的处理是直接退出程序的运行。五、运行结果分析1. 程序开始界面,如附图2:附图2 开始界面2.如下附图
8、3,附图4分别是选择进入和退出程序界面:附图3(在以下界面输入计算式即可运行出计算结果如附图5) 附图4退出界面附图5 运行界面2. 对异常的处理a) 对异常1除数为0,如输入“1 2/0=”程序将直接退出,如附图6:附图6 异常1除数为0 b) 对异常2被开方数为负数,如输入“3 S(-9)=”程序将直接退出,如附图7:附图7 异常2被开方数为负数3.以下是对各种简单运算的运行结果,如附图8:附图8 简单运算3. 综合运算:如式子“1/2 A(7-8)-S(9*8)=”运行结果如附图9 附图9 综合运算六、收获及体会本程序以C语言的栈的相关知识为基础,通过控制两个栈(运算数栈和运算符栈)的进
9、出的栈操作,来实现对包含加、减、乘、除、括号运算符及SQRT和ABS函数的任意整型表达式的求解运算。从程序的编写来看,感觉这次自己真的学到了好多,特别是对程序的开发流程。从最初的选定程序,到最终的程序运行成功,让我感到如果是仅仅掌握课本上的知识是远远不能够很好的应用到实际的编程中去的。在这个过程中还需要我们更多的去考虑到实际条件的种种限制和约束。我在写本程序的过程中也遇到了很多的问题,当然本程序的核心问题就是对两个栈的压出栈操作,需要做优先级判断,并要考虑什么时候进栈,什么时候出栈等操作。我采用了课本上第52-54页讲的通过一个二维字符串数组来控制比较“ -*、()AS=”共9个运算符的优先级
10、控制。对异常,如除数为0、被开方数小于0等异常也进行了精心的处理。对操作过程中要用到的Y、N、A、S等字符也进行了改进,最终本程序可以不区分大小写就完成相关操作。总之,经过本次专业课程设计,让我掌握了开发应用软件的基本流程,运用所学编程技能的基本技巧,也让我初步了解了软件设计的基本方法,提高进行工程设计的基本技能及分析、解决实际问题的能力,为以后毕业设计和工程实践等打下良好的基础。相信通过这次的课程设计,我对所学的数据结构(C语言版)和各种编程语言都有了一个全新的认识。我也会积极吸取本次课程设计的经验,继续研究数据结构和所学的各种编程语言。七、源代码# include # include #
11、include # include # define MAX_OPERATOR_NUM 100 /运算符栈数组长度# define MAX_DATA_NUM 100 /运算数栈数组长度typedef struct OPStack /定义运算符栈 char opStack; int top; OPStack, *pOPStack; typedef struct DATAStack /定义运算数栈 double stack; int top; DATAStack, *pDATAStack; void InitpOPStack(pOPStack &pOStack) /初始化运算符栈 if( !(pO
12、Stack = (pOPStack)malloc(sizeof(OPStack) /为运算符栈分配空间 printf(分配内存空间失败! ); exit(-1); pOStack-top = -1; void InitpDATAStack(pDATAStack &pDStack) /初始化运算数栈 if( !(pDStack = (pDATAStack)malloc(sizeof(DATAStack) /为运算数栈分配空间 printf(分配内存空间失败! ); exit(-1); pDStack-top = -1; void PushOPStack(pOPStack &pOStack, ch
13、ar ch) /运算符进栈 pOStack-opStack = ch; void PopOPStack(pOPStack &pOStack, char &ch) /运算符出栈 ch = pOStack-opStack; pOStack-top-; void PushDATAStack(pDATAStack &pDStack, double d) /运算数进栈 (pDStack-top); pDStack-stack = d; void PopDATAStack(pDATAStack &pDStack, double &d) /运算数出栈 d = pDStack-stack; pDStack-t
14、op-; void ClearpOPStack(pOPStack &pOStack) /清空运算符栈 pOStack-top = -1; void ClearpDATAStack(pDATAStack &pDStack) /清空运算数栈 pDStack-top = -1; char GetToppOPStack(pOPStack &pOStack) /获取运算符栈顶元素 return pOStack-opStack; double GetToppDATAStack(pDATAStack &pDStack) /获取运算数栈顶元素 return pDStack-stack; bool IsOP(c
15、har &ch) /区分运算符和运算数的函数,是运算符时返回true,否则返回false /判断是否为符号if ( (ch = ) | (ch = -) | (ch = *) | (ch = /) | (ch = =) | (ch = A) | (ch = S) | (ch = a) | (ch = s) | (ch = () | (ch = ) ) return true; else return false; char Precede(char op1, char op2) /参考数据结构(C语言版)第53页表达式求值表 char tab; /定义字符串的二维数组来存放运算符优先级的关系s
16、trcpy( tab, ); strcpy( tab, ); strcpy( tab, ); strcpy( tab, ); strcpy( tab, strcpy( tab, E ); strcpy( tab, ); strcpy( tab, ); strcpy( tab, printf( | *欢迎您的下次使用!谢谢!* | ); /退出使用printf( | ); double Operate(double a, char theta, double b) /对出栈的运算符和运算数进行计算 double s; switch(theta) case : s = a b; break; ca
17、se -: s = a - b; break; case *: s = a * b; break; case /: if ( b != 0 ) /判断除数是否为0,若为0,退出程序 s = a/b; break; else printf( # 除数为0,非法运算。程序终止! # ); exit_E(); /打印结束菜单exit(-1); case A: s = fabs(b); /调用FABS()函数break; case S: if( b = 0) /判断被开方数是否为0,若为0,退出程序 s = sqrt(b); /调用SQRT()函数break; else printf( # 求负数的平
18、方根是非法运算。程序终止! # ); exit_E(); /打印结束菜单exit(-1); return s; char ChangeChar(char &c) /通过ChangeChar函数来把a、s的小写字母改为大写的 if( c = a ) c = A; else if( c = s ) c = S; return c; /参考数据结构(C语言版)第53页表达式求值算法 Evaluateexpression_r()函数void Evaluateexpression_r() /计算函数:读入表达式,并计算结果 pOPStack pOStack; /声明运算符栈pDATAStack pDSt
19、ack; /声明运算数栈double result; /存运算的结果char x, theta, c; /c存放读取的字符,x、theta存放运算符栈的栈顶元素int flag, data; /标识符,用来读入连续的数字double s; double getd; /存放GetTop*的结果double a, b, cc; /a,b存放数据栈出栈的栈顶元素, c存放运算结果flag = 0; /初始化标识符,用来判断字符串中的连续数字data = 0; / InitpOPStack(pOStack); /初始化运算符栈InitpDATAStack(pDStack); /初始化运算数栈PushO
20、PStack(pOStack, =); /在运算符栈底放入= printf( &请输入表达式以=结束:); c = get); /读入字符ChangeChar(c); /通过调用函数来实现把小写的a、s改为大写的A、S while( c != = | GetToppOPStack(pOStack) != =) if( !IsOP(c) ) /不是运算符进栈 s = c - 0; /把字符转化为数字if ( flag = 1 ) PopDATAStack(pDStack, getd); s = getd*10 s; PushDATAStack(pDStack, s); flag = 1; c =
21、 get); ChangeChar(c); else flag = 0; switch( Precede(GetToppOPStack(pOStack), c) ) /输入元素和运算符栈顶元素比较 case PushOPStack(pOStack, c); c = get); ChangeChar(c); break; case =: /托括号并接受下一个字符PopOPStack(pOStack, x); c = get); ChangeChar(c); break; case : /退栈并将运算结果进栈PopOPStack(pOStack, theta); PopDATAStack(pDSt
22、ack, b); PopDATAStack(pDStack, a); cc = Operate(a, theta, b); PushDATAStack(pDStack, cc); break; /switch /else /while result = GetToppDATAStack(pDStack); /运算结束时,运算数栈的栈底元素就是计算结果ClearpOPStack(pOStack); /清空运算符栈ClearpDATAStack(pDStack); /清空运算数栈printf( -计算结果为:%.2f , result); /输出运算结果return ; void print_user() /欢迎界面 printf( 欢迎使用C语言版模拟计算器 )
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 水粉烟花课件教学课件
- 出游应急预案
- 旅游业安全规范解析
- 2024年大型并网风力发电机组发电机项目资金需求报告代可行性研究报告
- 物业小区危险源识别
- 吉林省2024七年级数学上册第1章有理数1.7有理数的减法课件新版华东师大版
- 彩色的雨教案反思
- 建筑业薪酬政策
- 林业安防施工合同
- 影视制作薪酬管理
- 2024年北京联通新苗计划校园招聘笔试参考题库含答案解析
- 《左心室肥厚诊断和治疗临床路径中国专家共识2023》解读
- 老年医学专业技能培训课件
- 牛肉拉面创业计划书
- 入院患者健康宣教课件
- 软件开发成果移交单
- 重庆渝中区2023-2024学年七年级上学期期末数学评估卷(含答案)
- 酸汤火锅推广方案
- 孩子的性格特点及其培养方法
- 《珍惜青春主题班会》课件
- LED封装工艺流程图解
评论
0/150
提交评论