版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、中北大学数 据 结 构课 程 设 计 说 明 书学生姓名:张蓓学 号:1021011602学 院:软件学院专 业:软件工程题 目:算术表达式的求解指导教师何志英2011年12月20日1. 设计任务概述(包括系统总体框图及功能描述) 利用栈结构,求解用户正确输入的算术表达式,并实现保存、读取、清除功能,且对用户输入的错误信息进行提示,重新输入.按下”q”键表达式错误表达式正确按下”s”键按下”r”键按下”e”键 求解算术表达式系统输入算术表达式 判断表达式 是否正确求解运算,得到结果提示错误,重新输入按下“n”键按下“y”键退出?(y/n)退出运算系统读取刚才保存的得数保存得数按下“q”键2.
2、本设计所采用的数据结构(如:链表、栈、树、图等)本设计采用了栈结构,创建了两个栈,一个压入数字,另一个压入符号。3. 功能模块详细设计3.1 详细设计思想求解表达式的主要思想是创建两个栈,一个是符号栈,另一个是数字栈。符号栈关键是运算优先顺序,数字栈关键是多位数与小数的计算。本程序设计了四个模块,第一个模块double result(double num1,char op,double num2),主要目的是进行加减乘除运算的操作方法,num1与num2的关系;第二个模块int compute(char str),主要目的是对用户输入的算术表达式进行求解,其中对多位数与小数进行了定义与数值计算
3、,以及带括号的表达式运算的优先顺序;第三个模块void face(),主要目的是设计用户主界面;第四个模块是主函数,主要目的是将上述模块集中运用,进行求解。至此完成利用栈结构求解表达式运算。3.2 核心代码调用的库函数:#include #include #include #include #include 自己定义的函数:1) double result(double num1,char op,double num2) 进行加减乘除运算2) int compute(char str) 对用户输入的算术表达式进行求解3) void face() 用户主界面4) main() 主函数核心定义函数
4、设计:int compute(char str) double num=0; int i=0,j=1,k=1; int flag=0; numtop=optop=0; while(stri!=0|optop0) if(stri=0&stri0&!op(stri-1)&stri!=(&stri-1!=) numstacknumtop+=num*k; num=0; j=1; flag=0; k=1; if(optop=0|stri=() opstackoptop+=stri; else if(stri=) while(optop0&opstack-optop!=() numstacknumtop-
5、2=result(numstacknumtop-2,opstackoptop,numstacknumtop-1); numtop-; if(opstackoptop!=() return 0; else if(stri=0&numtop=0) return 0; while(optop0&op(stri)=op(opstackoptop-1) numstacknumtop-2=result(numstacknumtop-2,opstack-optop,numstacknumtop-1); numtop-; if(stri!=0) opstackoptop+=stri; if(stri!=0)
6、i+; if(numtop!=1|optop!=0) return 0; return 1; 3.3 程序运行结果(拷屏)1 运行程序,打开程序界面 2 用户正确输入算术表达式的值 3 如果在输入过程中出现错误,例如,出现两个乘号,按c键清除 4 清除后5 正确输入算术表达式后按e得到正确结果6 按s键保存所得到的结果7 按r读出被保存的数据8 按q退出程序9 按y退出4. 课程设计心得、存在问题及解决方法通过本次课程设计,我巩固了栈的建立,入栈,出栈的操作,提高了发现问题进而解决问题的能力,深化了数据结构的基本知识,并进行了拓展实践。最终,加强了程序设计的能力,并且能够有条理的安排各个函数的
7、功能和位置。曾经存在的问题:1) 利用栈判断小数存在,并求解小数运算。2) 考虑各个运算符的优先顺序。解决方法:1) 利用小数点存在的判断,以及位数与数值的关系,除以十的倍数进行数值运算。2) 优先顺序自己先罗列一遍,以免遗漏。将+-*/数字化,以此代表优先顺序。()单独处理。附:程序源代码:#include #include #include #include #include #define n 100 double numstackn=0; /*操作数堆栈*/int numtop; /*操作数堆栈栈顶相对栈底的偏移量,可以用来判断堆栈是否为空*/char opstackn; /*界符堆栈
8、*/int optop; /*界符堆栈栈顶相对栈底的偏移量,可以用来判断堆栈是否为空*/int op(char ch) /*将运算符映射为数字,表示优先级*/ if(ch=+|ch=-) return 2; if(ch=*|ch=/) return 3; if(ch=() return -1; return 0; double result(double num1,char op,double num2) /*执行运算*/ if(op=+) return num1+num2; if(op=-) return num1-num2; if(op=*) return num1*num2; if(op
9、=/) return num1/num2; return 0; int compute(char str) /*利用栈结构对算术表达式进行求解,分析表达式*/ double num=0; int i=0,j=1,k=1; /*j代表小数点后位数,k代表数字符号(正负)*/ int flag=0; /*flag=0表示不是小数位,1表示是小数位*/ numtop=optop=0; while(stri!=0|optop0) /*如果算术表达式不为空*/ if(stri=0&stri0&!op(stri-1)&stri!=(&stri-1!=) /*i0且前一字符不是+,-,*,/,(,)这些字符
10、,且当前字符不是(*/ numstacknumtop+=num*k; /*压num*k入操作数堆栈*/ num=0; j=1; flag=0; k=1; if(optop=0|stri=() opstackoptop+=stri; /*如界符堆栈为空或当前字符为(,将当前字符压入界符堆栈*/ else if(stri=) /*若当前字符为)*/ while(optop0&opstack-optop!=() numstacknumtop-2=result(numstacknumtop-2,opstackoptop,numstacknumtop-1); numtop-; /*分别从操作数堆栈,界符
11、堆栈出栈响应元素执行计算,结果送入操作数堆栈*/ /*直到遇到界符(,这是正常情况,或者界符堆栈为空,这表明表达式是有错误的*/ if(opstackoptop!=() return 0; else /*界符堆栈非空,当前字符不是(,也不是)*/ if(stri=0&numtop=0) return 0; /*如果表达式结束,或操作数堆栈已空,返回调用处*/while(optop0&op(stri)=0&ch=0&ch=9 ) numj+=ch; numj=0; else j=0; if(ch=s|ch=s) /*保存数据*/ if(strlen(num) face(); /*调用face函数
12、*/ printf(%s 已经被保存n,strcpy(save,num); /*将num中的算术表达式保存到save中*/ printf(请输入一个算术表达式,按e得到结果n); printf(%s,str); else face(); /*调用face函数*/ printf(没有数据被保存!n); /*没有输入算术表达式*/ printf(请输入一个算术表达式,按e得到结果n); printf(%s,str); if(ch=r|ch=r) /*读取数据*/ if(strlen(save) /*将保存的数据读出*/ face(); /*调用face函数*/ printf(请输入一个算术表达式,
13、按e得到结果n); printf(%s,strcat(str,save); /*输出保存的数据*/ i+=strlen(save); if(ch=c|ch=c) /*清除数据*/ if(strlen(str) str-i=0; face(); /*调用face函数*/ printf(请输入一个算术表达式,按e得到结果n); printf(%s,str); if(ch=e|ch=e) /*求算术表达式的值*/ if(compute(str) printf(n=%gn,numstack0); j=0; temp=numstack0; else face(); /*调用face函数*/ printf(请输入一个算术表达式,按e得到结果n); printf(%s,str); printf(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 无人机精准农业-洞察分析
- 虚拟现实技术在言语康复中的应用研究-洞察分析
- 舞台视觉特效-第3篇-洞察分析
- 网络化维修服务模式-洞察分析
- 网络文学与传统文学的叙事比较-洞察分析
- 异常安全风险评估-洞察分析
- 向厂长提出调换工作岗位的申请书范文(7篇)
- 艺术空间激活社区活力-洞察分析
- 微纳光学器件在量子计算中的应用-洞察分析
- 水热处理对茶叶品质影响-洞察分析
- 地方政府应急物资采购供应协议2024年版
- 糖尿病患者体重管理专家共识(2024版)解读
- 2023-2024学年初三物理第一学期期末模拟试题和答案
- 一元二次方程基础练习50题含详细答案
- 李白杜甫酒诗
- 军事理论(上海公安学院)学习通超星期末考试答案章节答案2024年
- 2024年广州海珠区卫生事业位招聘179人历年高频难、易错点500题模拟试题附带答案详解
- 疗养院建筑设计规范
- 河南省南阳市桐柏县2023-2024学年五年级上学期期末学情调研语文试卷
- 古代诗人作家人物介绍-苏东坡
- 现代药物制剂与新药研发智慧树知到答案2024年苏州大学
评论
0/150
提交评论