




已阅读5页,还剩13页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课程设计报告课程设计题目: 表达式求值 姓 名 胡*其学 号20162018*班 级 *17Z指导教师 徐*2017年 12月 30日东华理工大学课程设计评分表学生姓名:胡*其 班级:*17Z 学号:20162018*课程设计题目:表达式求值项目内容满分实 评选题能结合所学课程知识、有一定的能力训练。符合选题要求(1人一题)10工作量适中,难易度合理10能力水平能熟练应用所学知识,有一定查阅文献及运用文献资料能力10理论依据充分,数据准确,公式推导正确10能应用计算机软件进行编程、资料搜集录入、加工、排版、制图等10能体现创造性思维,或有独特见解10成果质量总体设计正确、合理,各项技术指标符合要求。10说明书综述简练完整,概念清楚、立论正确、技术用语准确、结论严谨合理;分析处理科学、条理分明、语言流畅、结构严谨、版面清晰10设计说明书栏目齐全、合理,符号统一、编号齐全。格式、绘图、表格、插图等规范准确,符合国家标准10有一定篇幅,字符数不少于500010总 分100指导教师评语: 指导教师签名: 年 月 日目 录一.题目:1二.设计任务:1三.问题分析:1四.结构分析:14.1用于存储操作数和运算结果(Sfloat)14.2用于存储运算符(Schar)24.2系统中子程序及功能要求2五.实现流程35.1程序主流程图35.2求值操作流程3六.个性功能介绍4七.部分问题及解决方案57.1不能进行带有小数点的数的运算57.2在输错后,跳回主界面直接提示指令输入错误,重输6八.课程设计小结7九.附录一:部分测试数据7十.附录二:源代码7一、题目: 表达式求值二、课程设计任务:要求能输入一个带“( )”的任意多位实数的表达式。要求:1、有合理的提示;2、有非法数据的判断;3、能够进行多次计算。测试数据及测试结果请在上交的资料中写明;三、问题分析:任何一个表达式都是由操作符,运算符组成的。我们分别用顺序栈来寄存表达式的操作数和运算符。栈是限定于紧仅在表尾进行插入或删除操作的线性表。顺序栈的存储结构是利用一组连续的存储单元依次存放自栈底到栈顶的数据元素。为了实现算符优先算法。可以使用两个栈。一个称为Schar,用以寄存运算符,另一个称做Sfloat,用以寄存操作数或运算结果。1.首先置操作数栈为空栈,表达式起始符”#”为运算符栈的栈底元素;2.依次读入表达式,若是操作符即进Sfloat栈,若是运算符则和Schar栈的栈顶运算符比较优先权后作相应的操作,直至整个表达式求值完毕(即Schar栈的栈顶元素和当前读入的字符均为”#”)。四、结构分析:1.用于存储操作数和运算结果(Sfloat):ADT s_float数据元素:此链栈中的所有元素类型为字符型的数字字符数据关系:栈中数据元素之间是线性关系。基本操作:(1) Init(Sfloat *S);初始化数字栈(2)Push(Sfloat*S,float e)进栈(3)Pop(Sfloat*S,float*x)出栈(4)GetTop(Sfloat *S,float *x)取栈顶(5)void ClearStack(Sfloat *S)清空栈 ADT s_float2.用于存储运算符(Schar):ADT s_char数据对象D:元素类型为字符型的符号字符数据关系R:栈中数据元素之间是线性关系。基本操作: (1)Init(Schar *S)初始化字符栈(2)Push(Schar *S,char x)进栈 (3)Pop(Schar *S,char *x)出栈 (4)GetTop(Schar *S,char *x)取栈顶(5)ClearStack(Schar *S)清空栈 ADT s_char3.系统中子程序及功能要求:(1)bool IsFloat(char ch)判断输入的是否为数字 (2)bool IsChar(char ch)判断输入的是否为所需要的字符 (3)float GetNumber(char *ch)将字符型数字转化为浮点型 (4)float Operation(float a,char sign,float b)+、-、*、/的基本运算(5)int Cmp(char x,char ch)比较字符的优先级(6)void Master();程序主功能函数(7)void Error()错误提示界面(8)void Welcome()程序欢迎界面(9)void End()结束选择界面五、实现流程1.程序主流程图2.求值操作流程 (下例为3*(7-2)的操作流程)步骤Schar栈Sfloat栈输入表达式主要操作1#3*(7-2)#Push(Sfloat,3)2#3*(7-2)#Push(Schar,*)3#*3(7-2)#Push(Schar,()4#*(37-2)#Push(Sfloat,7)5#*(3 7-2)#Push(Schar,-)6#*(-3 72)#Push(Sfloat,2)7#*(-3 7 2)#Operation(7,-,2)8#*(3 5)#Pop(Sfloat)9#*3 5#Operation(3,*,5)10#15#Return(GetTop (Sfloat)六、个性功能介绍在本程序中,通过windows头文件的作用,实现了程序背景色的改变,不在是原本的黑白色,让人看得很新颖。通过Sleep函数,让程序出错或跳转其它界面时,不是迅速跳过,而是先提示即将跳转,让使用者更方便地了解程序的基本执行过程。七、实验过程中遇到的部分问题及解决方案1.不能进行带有小数点的数的运算错误运行结果解决方案解决后运行结果2.在输入错误后,跳回主界面时直接提示指令输入错误,重新输入。解决方案导致这个的原因是错误后跳回主界面没有清除缓存,所以需要在错误提示函数中添一个fflush(stdin)来刷新当前内存。运行结果八、课程设计小结通过这次的课程设计,让我更加地了解到C语言和数据结构的魅力。课程设计不仅要求对课本知识有较深刻的了解,同时要求程序设计者有较强的思维和动手能力,同时这也使我更加了解编程思想和编程技巧。这次课程设计让我有一个深刻的体会,那就是细节决定成败,编程最需要的是严谨,如何的严谨都不过分,往往检查了半天发现错误发生在某个括号,分号,引号,或者数据类型上,还有函数或变量命名一般要遵循其默认命名规则。就像我在写Master ()函数时,起初将各种标识符名称设置的乱七八糟,导致我后面自己都对各种变量名的指向的作用都混淆了,后来还浪费了大量的时间进行优化命名,所以说细节很重要。程序设计时,也不要怕遇到错误,在实际操作过程中犯的一些错误还会有意外的收获,感觉课程设计很有意思。在具体操作中这学期所学的数据结构的理论知识得到巩固,达到课程设计的基本目的,也发现自己的不足之出,在以后的上机中应更加注意。以后我们会继续努力,大胆创新,争取能编写出透射着自己思想的程序。这次课程设计让我们充分认识到了自己的不足,认识到了动手能力的重要性。我们会在以后的学习中更加努力锻炼自己,提高自己,让自己写出更好更完善的程序,为以后的编程打好基础!附录一:部分测试数据组别表达式正确值11.23+4.5*1046.2321.5*(1+9)-10/5133-(100-101)/50.2041.23.5+6.5*12错误55+4*1.25)错误附录二:源代码#include#include#include#define MAXSIZE 20/建立字符栈typedef structchar arrMAXSIZE;int top;Schar;void Init(Schar *S)/初始化S-top=-1;int Push(Schar *S,char x)/进栈 if(S-top=MAXSIZE-1) return 0; S-top+; S-arrS-top=x; return 1;int Pop(Schar *S,char *x)/出栈 if(S-top=-1) return 0; else *x=S-arrS-top; S-top-; return 1; int GetTop(Schar *S,char *x) /取栈顶if(S-top=-1) return 0; else *x=S-arrS-top; return 1; char GetTop(Schar S) char x; GetTop(&S,&x); return x;void ClearStack(Schar *S)/清空栈 if(S-top!=-1) S-top=-1;/建立数字栈typedef structfloat arrMAXSIZE;int top;Sfloat;void Init(Sfloat *S)/初始化 S-top=-1;int Push(Sfloat *S,float e) /进栈 if(S-top=MAXSIZE-1)return 0; else S-top+; S-arrS-top=e; return 1; int Pop(Sfloat *S,float *x)/出栈 if(S-top=-1) return 0; else *x=S-arrS-top; S-top-; return 1; int GetTop(Sfloat *S,float *x)/ 取栈顶 if(S-top=-1)return 0; else *x=S-arrS-top; return 1; float GetTop(Sfloat S) float x; GetTop(&S,&x); return x;void ClearStack(Sfloat *S) /清空栈 if(S-top!=-1) S-top=-1;char a7=+,-,*,/,(,),#;int pri77= /优先权集合1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1, 1,1,1,1,-1,1,1, 1,1,1,1,-1,1,1, -1,-1,-1,-1,-1,0,2, 1,1,1,1,2,1,1, -1,-1,-1,-1,-1,2,0;bool IsFloat(char ch)/判断数字 if(ch=48&ch=57)|ch=46)return true;/输入数字或小数点返回真,否则为假else return false;bool IsChar(char ch)/判断字符 if(ch=+|ch=-|ch=*|ch=/|ch=(|ch=)|ch=#)return true;/输入指定字符返回真,否则为假else return false; float GetNumber(char *ch)/将字符型数字转化为浮点型 return float(*ch)-0;float Operation(float a,char sign,float b)/基本运算 switch(sign) case+:return(a+b);break; case-:return(a-b);break; case*:return(a*b);break; default:return(a/b);break; int Cmp(char x,char ch)/比较优先级 int i,j,k; for(i=0;i1)/若一个数有两个小数点Error(); ch=getchar(); if(IsChar(ch)/输入的为指定的字符 if(ch=()kh_sign=1;/kh_sign标记为1if(fu_sign=1) /最前面有负号if(shu_sign=0) /没记录到有数字if(kh_sign=1) /记录到输入了(Push(&s_char,ch); /将(存入字符栈中kh_sign=0; /重新将标记kh_sign置0m=2; /记录负的左括号ch=getchar();continue;elseError(); else /记录到前面有数字 n=-n; /乘上负号fu_sign=0; /将负号标记记置0if(m=2)n=-n;m-; if(shu_sign=1) if(num_times=1) Error(); if(num_point) n=n/num_times; Push(&s_float,n); /将数字存入数字栈中 n=0;/初始化为0 shu_sign=0;/当前n值已被存进栈中 num_point=0;/小数点标识符置零 num_times=1;/n进位初值 if(char_sign=1) if(GetTop(s_char)=(&ch=-) fu_sign=1;/负号标识fu_sign置1ch=getchar(); else if(ch=() kh_sign=1;/记录左括号 elseError();/调用错误提示函数 if(char_sign=0|kh_sign=1) switch(Cmp(GetTop(s_char),ch)/比较优先级 case -1:/当优先级小 Push(&s_char,ch);/进栈 char_sign=1; kh_sign=0; ch=getchar(); break; case 1:/当优先级大 Pop(&s_char,&op); Pop(&s_float,&b); Pop(&s_float,&a); if(op=/&b=0) Error(); value=Operation(a,op,b); if(m=1)/当负号标识符为1 value=-value;/取相反值 m=0; Push(&s_fl
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论