算法表达式语法检查(数据结构课程设计)_第1页
算法表达式语法检查(数据结构课程设计)_第2页
算法表达式语法检查(数据结构课程设计)_第3页
算法表达式语法检查(数据结构课程设计)_第4页
算法表达式语法检查(数据结构课程设计)_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

1、数据结构课程设计中南民族大学计算机科学学院课程设计报告课 程 数据结构题 目 算法表达式语法检查年 级 2014专 业 软件工程学 生 柳真学 号 201421092073指导教师 刘赛 2015年12 月20 日中南民族大学计算机科学学院本科课程设计任 务 书设计名称: 算术表达式语法检查指导教师: 下达时间: 2015-11-30 学生姓名: 学 号: 年级专业: 2014级软件工程一、 课程设计的基本要求利用数据结构课程的相关知识完成一个具有一定难度的综合设计题目,利用C/C+语言进行程序设计,并规范地完成课程设计报告。通过课程设计,巩固和加深对线性表、栈、队列、字符串、树、图、查找、排

2、序等理论知识的理解;掌握现实复杂问题的分析建模和解决方法(包括问题描述、系统分析、设计建模、代码实现、结果分析等);提高利用计算机分析解决综合性实际问题的基本能力。具体要求如下:1、 对现实复杂问题中的数据对象特性及组织方法进行分析和研究,设计适当的数据逻辑结构、存贮结构以及相应运算操作,把现实世界问题建模转化为计算机内部表示并进行处理。2、 采取模块化方式进行程序设计,要求程序的功能设计、数据结构设计及整体结构设计合理。学生也可根据自己对题目的理解增加新的功能模块(视情况可另外加分)。3、 系统以菜单界面方式(至少采用文本菜单界面,如能采用图形菜单界面更好)工作,运行界面友好,演示程序以用户

3、和计算机的对话方式进行,利用文件进行数据的提取与存储。4、 程序算法说明清晰,理论分析与计算正确,运行情况良好,实验测试数据无误,容错性强(能对错误输入进行判断控制)。5、 编程风格良好(包括缩进、空行、适当注释、变量名和函数名见名知意,程序容易阅读等);6、 写出规范的课程设计报告,具体要求见相关说明文档。二、 课程设计的主要内容 题目描述:算术表达式语法检查。功能要求及说明:(1)键盘读入一个四则运算算术表达式,对其进行语法检查;(2)算术表达式允许嵌套,如果出错,指出出错位置;(3)不需要计算结果;(4)尽量不使用栈。三、 课程设计的进程安排12015年11月30日:布置并下达课程设计题

4、目。22015年12月7日之前:联系指导教师,理解课程设计题目及相关要求,查阅相关资料,进行课程设计(地点:9-204,9-206)。32015年12月7日至12月31日(第15周-第18周):课程设计源程序的调试、修改与检查,书写课程设计报告(地点:计算机科学学院实验机房)。42016年12月31日之前:上交、检查设计报告(地点:计算机科学学院实验机房)。指导教师:2015年 11月20日算术表达式语法检查一 目的根据课题要求,完成算法表达式语法检查。具体完成以下四点要求:(1)键盘读入一个四则运算算术表达式,对其进行语法检查;(2)算术表达式允许嵌套,如果出错,指出出错位置;(3)不需要计

5、算结果;(4)尽量不使用栈。二 需求分析1、选择存放算术表达式的数据结构本次课设,我选择了本学期数据结构中所学的栈来实现算术表达式中的字符存放。2、运算符优先级划分一个完整的算术表达式中包含+、-、*、/、(、)六种运算符,当遇到这些字符时要确定其优先级的高低,并依次存放进栈或者出栈。并且还可以进行发现输入错误提示判断,达到课题中相关要求。三 概要设计1、运算符优先级等级划分表+-*/()#+11-1-1-111-11-1-1-111*1111-111/1111-111(-1-1-1-1-10-3)1111-111#-1-1-1-1-1-20 上表中1代表栈中运算符出栈,进行运算;0代表栈中运

6、算符(或#)出栈;-1代表当前运算符进栈;-2代表当前输入)错误;-3代表算术表达式末尾少输入)。2、程序流程图开始输入一个算术表达式c!=#| GetTob(B)!=#定义一个栈A,用来存放数字;定义一个栈B用来存放运算符从表达式首字符开始,获取一个字符存放到c中,开始依次检查定义一个字符变量c,一个字符数组d100如果是(进栈,否则报错检查下一个字符首字符是运算符字符是运算符字符是数字是是否否是是结束否字符是数字将字符串数组d100转化为数字,存入栈A字符是运算符字符是(字符是运算符检查下一个字符报错判断运算符优先级,将结果放入b中跳出本次循环,进行下一次循环检查下一个字符数字放入字符数组

7、d100否是否是是是否否否b = 1A中最后进栈的两个数出栈,B中最后进栈的运算符出栈,进行运算,运算结果存入栈A进行下一个字符检查,若字符是),报错。检查下一个字符b = -1字符是(字符是运算符运算符进栈B是跳出本次循环,进行下一次循环否是运算符进栈B是进行下一个字符检查否报错是跳出本次循环,进行下一次循环否否否报错,输入非法字符检查下一个字符结束b = 0B中运算符出栈跳出本次循环,进行下一次循环进行下一个字符检查是b = -2否报错,输入)错误进行下一个字符检查跳出本次循环,进行下一次循环是否跳出本次循环,进行下一次循环否b = -3B中运算符出栈,并报错。第i位少输入)跳出本次循环,

8、进行下一次循环是否四 详细设计1、栈的结构及相关功能函数构造伪代码typedef int SElemType;const int STACK_INIT_SIZE = 100; /存储空间初始分配量const int STACKINCREMENT = 10; /存储空间分配增量typedef structSElemType *base; / 栈底指针,在栈构造前和销毁后,其值均为空SElemType *top; /栈顶指针int stacksize; /当前已分配的存储空间SqStack;/构造一个空栈void InitStack(SqStack &S);/若栈不为空,返回栈顶元素值SE

9、lemType GetTop(SqStack & S);/插入元素e为栈的新栈顶元素void push(SqStack &S,SElemType e);/用e返回栈顶元素,并删除栈顶元素void Pop(SqStack &S,SElemType &e);2、实现表达式语法检查功能函数构造伪代码/判定输入的运算符,并分类标记int judgePrecedence(char a)int i = 7;switch(a) case '+': i = 0; break; case '-': i = 1; break; case '*

10、': i = 2; break; case '/': i = 3; break; case '(': i = 4; break; case ')': i = 5; break; case '#': i = 6; break; return i;/比较运算符的优先级,并标记分类int Precedence(char a,char b) 根据judgePrecedence()函数确定a、b的运算符种类,然后构建一个7*7的二维数组表,依次填入优先级,并返回相应优先等级。具体表格信息见概要设计中运算符优先等级划分表。/执行运算i

11、nt Operate(int a,char b,int c) 其中a、c是数字,b是运算符(+、-、*、/),实现具体运算操作,并返回运算结果值。/判断c是否是运算符int panduan(char c) 根据judgePrecedence()函数,判断c是否是运算符,如果是怎返回1,否则返回0。/具体应用操作void Yunsuan() SqStack A,B; /创建栈A、B push(B,'#'); /栈B中栈底存入# c = getchar(); /获取算术表达式中字符 int i = 1; while(c !='#' | GetTop(B)!='

12、;#') if(i = 1 && judgePrecedence(c) != 7) 首字符是运算符,报错; if(c >= '0' && c <= '9') 字符是数字,存放在数组d100中,后转化为数字存入栈A中; else if(judgePrecedence(c) != 7) 字符是运算符,进行判断,有错则报错,没有则进栈B; else 报错,输入非法字符。五 调试分析1、算法逻辑问题及输出错误检查一个算术表达式错误时,要具体要第几位以及是哪些错误,在刚开始的检查功能检查设计的时候,我的代码只能检查到+、

13、-、*、/相关输入错误,对于(、)运算符不能完全检查出输入错误 ,其中有关除数为0的输入错误时,程序不能检查除数0后面表达式中的错误,直接程序终止。后来,我在程序加了一个条件关于除数为0的运算限定,成功解决了除数为0后面表达式的语法无法检查的问题。其中,最为重要的是,通过设计不同类型的算术表达式进行语法检查,不断地发现程序设计过程中的逻辑错误,并不断修改,最后成功解决了本次课设中难点。六 测试结果1、设计输入的算术表达式(1) +-*/1+2/(4-4*2/4) (2) (3a+2b)*4-8/2(3) a!c1+2a*(3-4/2)(4) 1+23*(4/5)(5) 1+2*(2*4/0-3

14、)(6) 1+2*(3-4/2(7) 1-2/(3-4*2)(8) 2*3+)(3/3-4)(9) 2+4-5*(3+2+(2*1)(10) (2+4)-5/0*(3+2*(2+1)2、具体运算检查分析结果截图图一:上图一是设计输入的算术表达式(1)(4)运行结果截图;图二:上图二是设计输入的算术表达式(5)(8)运行结果截图;图三:上图三是输入设计的算术表达式(9)(10)运行结果截图。七 用户使用说明1、输入规则输入一个算术表达式,其中对应的运算符是+、-、*、/、(、)表达的意思是加、减、乘、除、顺括号、反括号。 要求输入一个算术表达式完毕后,在输入一个#结束输入,最后按enter键即可

15、得到算术表达式语法检查结果。八 课程设计总结在本次课程设计实施的过程中,遇到了很多问题,当然收获也很多。起初,让我感觉很难的地方在于如何确定算术表达式错误的位置以及有哪些错误要确定。在此过程中,我用了一个整形变量来计算依次检查的字符数,来确定错误的具体位置。其中错误的类型要分类进行查找,在算法实施之前我把错误类型进行分类,并初步画出算法的程序流程图,不断反复推敲和检查,从中也发现了我很多逻辑上的错误。通过不断修改和测试,也让我设计的核心功能函数不断完善,最终达到课题的要求。附具体源码:#include<iostream>#include<cstdio>#include&

16、lt;cstdlib>using namespace std;typedef int SElemType;const int STACK_INIT_SIZE = 100; /存储空间初始分配量const int STACKINCREMENT = 10; /存储空间分配增量typedef structSElemType *base; / 栈底指针,在栈构造前和销毁后,其值均为空SElemType *top; /栈顶指针int stacksize; /当前已分配的存储空间SqStack;/构造一个空栈void InitStack(SqStack &S);/若栈不为空,返回栈顶元素值S

17、ElemType GetTop(SqStack & S);/插入元素e为栈的新栈顶元素void push(SqStack &S,SElemType e);/用e返回栈顶元素,并删除栈顶元素void Pop(SqStack &S,SElemType &e);/判定输入的运算符,并分类标记int judgePrecedence(char a);/比较运算符的优先级,并标记分类int Precedence(char a,char b);/执行运算int Operate(int a,char b,int c);/判断c是否是运算符int panduan(char c);

18、/具体应用操作void Yunsuan();int main() while(1) cout<<"请输入算术表达式(按#结束):" Yunsuan(); /* cout<<"继续输入算术表达式请输入$,退出请输入#:"<<endl; char i; cin>>i; if(i = '#' ) break;*/ return 0;void InitStack(SqStack &S)S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SEle

19、mType);S.top = S.base;S.stacksize = STACK_INIT_SIZE;return ;SElemType GetTop(SqStack & S)if(S.top = S.base) return 0;return *(S.top-1);void push(SqStack &S,SElemType e)if(S.top - S.base >= S.stacksize)S.base = (SElemType * )realloc(S.base,(S.stacksize + STACKINCREMENT) * sizeof(SElemType)

20、;if(!S.base) exit(0);S.top = S.base + S.stacksize;S.stacksize += STACKINCREMENT;*S.top+ = e;return ;void Pop(SqStack &S,SElemType &e)if(S.top = S.base) return ;e = * -S.top;return ;int judgePrecedence(char a)int i = 7;switch(a) case '+': i = 0; break; case '-': i = 1; break;

21、case '*': i = 2; break; case '/': i = 3; break; case '(': i = 4; break; case ')': i = 5; break; case '#': i = 6; break; return i;int Precedence(char a,char b)int i,j;i = judgePrecedence(a);j = judgePrecedence(b);int Pre77 = 1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,

22、1,1,1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,0,-3,1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,-2,0;if(Preij = 1)return 1;else if(Preij = -1)return -1;else if(Preij = -2)return -2;else if(Preij = -3)return -3;elsereturn 0;int Operate(int a,char b,int c)switch(b) case '+': return a+c; break; case '-':

23、 return a-c; break; case '*': return a*c; break; case '/': if(c = 0) return 1; else return a/c; break; return 0;int panduan(char c)int i = 0;if(judgePrecedence(c) != 7)i = 1;return i;void Yunsuan()SqStack A,B;int a,b,e;char c,d100;InitStack(A);InitStack(B);push(B,'#');c = get

24、char();int i = 1;while(c !='#' | GetTop(B)!='#')int t = 0; if(i = 1 && judgePrecedence(c) != 7) if(judgePrecedence(c) = 4) push(B,c); c = getchar();+i;else cout<<"第1位输入"<<c<<"错误"<<endl; c = getchar(); +i; while(panduan(c) cout<&l

25、t;"第"<<i<<"位输入"<<c<<"错误"<<endl; c = getchar(); +i;if(c >= '0' && c <= '9')while(c >= '0' && c <= '9') dt+ = c;c = getchar();+i;dt = '0'a = atoi(d); /字符型转换为整形 push(A,a);else

26、 if(judgePrecedence(c) != 7)if(judgePrecedence(c) = 4)cout<<"第"<<i<<"位输入"<<c<<"错误"<<endl;c = getchar();+i;while(panduan(c)cout<<"第"<<i<<"位输入"<<c<<"错误"<<endl;c = getchar();+i;break; b = Precedence(GetTop(B),c);switch(b)case 1: Pop(A,b);Pop(A,a);Pop(B,e); if(e = '/' && b = 0)cout<<"第"<<(i-1)<<"位非法输入,除数不能为0!"<<endl;pus

温馨提示

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

评论

0/150

提交评论