数据结构课程设计说明书表达式求值_第1页
数据结构课程设计说明书表达式求值_第2页
数据结构课程设计说明书表达式求值_第3页
数据结构课程设计说明书表达式求值_第4页
数据结构课程设计说明书表达式求值_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

1、*大学数据结构课 程 设 计 说 明 书   学生姓名: *学 号: *学 院:*学院专 业: 网络工程题 目:利用栈求表达式的值成绩 指导教师*  2009 年 7 月 9 日1 设计目的数据结构课程设计的目的是,通过设计掌握数据结构课程中学到的基本理论和算法并综合运用于解决实际问题中,它是理论与实践相结合的重要过程。设计要求学会如何对实际问题定义相关数据结构,并采用恰当的设计方法和算法解决问题,同时训练学生进行复杂程序设计的技能和培养良好的程序设计习惯。2 设计内容和要求利用栈求解表达式的值。设计内容

2、:1) 建立试题库文件,随机产生n个题目;2) 题目涉及加减乘除,带括弧的混合运算;3) 利用栈求解表达式的值;4) 随时可以退出;5) 保留历史分数,能回顾历史,给出与历史分数比较后的评价基本要求:1)系统功能的完善;2)代码中有必要的注释3本设计所采用的数据结构栈的数组表示方法(静态分配整型指针)typedef structtypedef dataMAXSIZE;int top;4功能模块详细设计1.功能一:中缀表达式转化为后缀表达式;2.功能二:后缀表达式求值;3.功能三:文件读写;4.功能四:作业评分;5.功能五:历史成绩本次成绩比较;6.功能六:输入“”符号退出程序4.1 详细设计思

3、想1.首先实现表达式的求值: 要用栈求解一个表达式,就要将这个表达式翻译成正确求值的一个机器指令序列,即正确解释表达式,了解算术四则混合运算的规则:(1).先乘除,后加减;(2).从左算到右;(3).先括号内,后括号外再根据这个运算优先的规定来实现对表达式的编译或解释执行. 任何一个表达式都是由操作数(st)和操作符(op)组成的,根据四则运算基本法则,在运算的每一步中,任意两个相继出现的操作符op1和op2之间的优先关系最多有以下3种:(1).op1的优先级低于op2(2).op1的优先级等于op2(3).op1的优先级小于op2为实现运算符优先,可以使用两个操作栈,操作栈st,用于存放操作

4、数及运算结果;操作栈op,用于存放操作符。算法思想:(1).首先将中缀表达式转换成后缀表达式:<1>.从左至右依次扫描中缀表达式的每一个字符,如果是数字字符和“.” ,则直接将它们写入后缀表达式中。<2>.如果遇到的是开括号“(”,则将它压入一个操作符栈中,它表明一个新的计算层次的开始,在遇到和它匹配的闭括号时,将栈中元素弹出并放入后缀表达式中,直到栈顶元素为开括号“(”时,将栈顶元素“(”弹出,表明这一层括号内的操作处理完毕。<3>.如果遇到的是操作符,则将该操作符和操作符栈顶元素比较: a)当所遇到的操作符的优先级小于或等于栈顶元素的优先级时,则取出栈顶

5、元素放入后缀表达式,并弹出该栈顶元素,反复执行直到栈顶元素的优先级小于当前操作符的优先级;b)当所遇到的操作符的优先级大于栈顶元素的优先级时,则将它压入栈中。重复上述步骤直到遇到中缀表达式的结束0,弹出栈中的所有元素并放入后缀表达式中,算法结束。(2).对后缀表达式求值: 将遇到的操作数暂存在一个操作数栈中,凡是遇到操作符,便从栈中弹出两个操作数执行相应的操作,并将结果存于操作数栈中,直到表达式处理完毕,最后压入栈中的数就是表达式的结果。2.建立试题库文件“shitiku.txt”和成绩库文件“chengji.txt”。 试题库文件“shitiku.txt”中存储20道带括号的四则混合运算;成

6、绩库文件“chengji.txt”中存储历史成绩。3.从试题库文件“shitiku.txt”中读出“total”道题: 当做的题目数小于“total”时,用随机函数产生每次要做的题号。4.对本次作业进行评分: 本次作业共做题“total”道,每道“100/total”分; 做对题目数为“r”,本次作业得分为“r*(100/total)”。5.输入“”符号时,退出程序。4.2 源代码#include<stdio.h>#include<stdlib.h>#define MAXSIZE 30int length20=13,15,12,9,11,17,13,15,9,11,11

7、,11,12,10,15,13,18,16,16,9; /*shitiku文件中20个字符串数组的长度*/typedef structfloat dataMAXSIZE;int top;float compvalue(char *postexp) /*后缀表达式求值*/ struct float dataMAXSIZE; int top; st; float a,b,c,d;int k=0; st.top=-1; while(*postexp!='0') switch(*postexp) case '+': a=st.datast.top; st.top-; b

8、=st.datast.top; st.top-; c=b+a; st.top+; st.datast.top=c; break; case '-': a=st.datast.top; st.top-; b=st.datast.top; st.top-; c=b-a; st.top+; st.datast.top=c; break; case '*': a=st.datast.top; st.top-; b=st.datast.top; st.top-; c=b*a; st.top+; st.datast.top=c; break; case '/'

9、;: a=st.datast.top; st.top-; b=st.datast.top; st.top-; if(a!=0) c=b/a; st.top+; st.datast.top=c; else printf("nterror!n"); return(0); break; default: d=0; while(*postexp>='0'&&*postexp<='9') /*读整数部分*/ d=10*d+*postexp-'0' /*整数部分处理*/ postexp+; if(*postex

10、p='.') /*读数时遇到小数点*/postexp+;while(*postexp>='0'&&*postexp<='9') /*读小数部分*/d=d*10+*postexp-'0' postexp+;k+;while(k!=0) /*小数部分处理*/d=d/10.0;k=k-1; st.top+; st.datast.top=d; break; postexp+; return st.datast.top; /*操作栈st中最终剩下表达式运算结果*/void trans(char *exp,char

11、 *postexp) /*将中缀表达式转换成后缀表达式*/ struct char dataMAXSIZE; int top; op; int i=0; op.top=-1; while(*exp!='0') switch(*exp) case '(': op.top+;op.dataop.top=*exp; exp+;break; case ')': while(op.dataop.top!='(') postexpi+=op.dataop.top; op.top-; op.top-;exp+;break; case '

12、+': case '-': while(op.top!=-1&&op.dataop.top!='(') postexpi+=op.dataop.top; op.top-; op.top+;op.dataop.top=*exp;exp+;break; case '*': case '/': while(op.dataop.top='*'|op.dataop.top='/') postexpi+=op.dataop.top; op.top-; op.top+;op.dataop.

13、top=*exp;exp+;break; case ' ':break; default: while(*exp>='0'&&*exp<='9'|*exp='.') postexpi+=*exp; exp+; postexpi+='#' while(op.top!=-1) postexpi+=op.dataop.top; op.top-; postexpi='0'void main()int i;int n;int t; int former,mark; /*former

14、:历史成绩 mark:本次成绩*/char exp30; /*存储中缀表达式*/float result,answer; /*result:从键盘输入的结果 answer:程序中函数求得的正确答案*/int total,r; /*total:要做的题的总数 r:做对的题目总数*/char postexpMAXSIZE; /*存储后缀表达式*/char s12030; /*存储所有的表达式*/FILE *fp;r=0; randomize(); /*产生随机种子*/fp=fopen("shitiku.txt","r");if(fp=NULL)printf(

15、"file cant open!n");exit (2);for(i=0;i<20;i+)fgets(s1i,30,fp); /*将所有20个表达式存入二维数组s12030中*/fclose(fp);printf("n");printf("input total(0<total<21):");scanf("%d",&total); if(total<0|total>=21) /*total小于0或大于21时,退出*/ exit (0);t=total;while(t>0)

16、 n=random(21);/*产生一个小于21的随机整数*/for(i=0;i<lengthn;i+)expi=s1ni; /*将第n题存入exp中*/expi='0'printf("nn%s=",exp);scanf("%f",&answer);trans(exp,postexp);result=compvalue(postexp); if(answer='') /*输入“”即退出*/exit (0); else if(result-answer)<=0.01)/*比较计算结果与正确答案*/ pri

17、ntf("Congratulations! You are right!");r+;elseprintf("The right answer is:%f",result);for(i=0;i<30;i+)expi='0' /*清空用来存放表达式的数组*/t-;mark=r*100/total; /*赋分*/printf("nnYour mark is:%d",mark);fp=fopen("chengji.txt","r"); fscanf(fp,"%d"

18、;,&former); /*读取文件中存储的历史分数*/ fp=fopen("chengji.txt","w");fprintf(fp,"%dn",mark); /*将本次分数存入文件中*/fclose(fp);printf("n");if(mark<=former) /*比较历史分数与本次分数并给出评价*/printf("ntry hardn");elseprintf("nGreat!");4.3运行结果:.选择本次要做的题目数:3;每道题为100/3=33分;做对题目,输出“Congratulations! You are right!”; 做错题目,输出“The right an

温馨提示

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

评论

0/150

提交评论