算术表达式的求解数据结构课程设计说明书

上传人:仙*** 文档编号:203115984 上传时间:2023-04-24 格式:DOC 页数:18 大小:184KB
收藏 版权申诉 举报 下载
算术表达式的求解数据结构课程设计说明书_第1页
第1页 / 共18页
算术表达式的求解数据结构课程设计说明书_第2页
第2页 / 共18页
算术表达式的求解数据结构课程设计说明书_第3页
第3页 / 共18页
资源描述:

《算术表达式的求解数据结构课程设计说明书》由会员分享,可在线阅读,更多相关《算术表达式的求解数据结构课程设计说明书(18页珍藏版)》请在装配图网上搜索。

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(n输入的算术表达式有误!); i=0; j=0; str0=0; if(ch=Q|ch=q) /*退出程序*/ printf(n退出?(是Y/否N)n); ch=getch(); if(ch=Y|ch=y) break; else /*否定退出,程序继续运行*/ face(); /*调用face函数*/ printf(请输入一个表达式,按E得到结果n); printf(%s,str); ch=getch();

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!