算法表达式语法检查(数据结构课程设计).doc

上传人:xin****828 文档编号:6698596 上传时间:2020-03-02 格式:DOC 页数:24 大小:173.50KB
返回 下载 相关 举报
算法表达式语法检查(数据结构课程设计).doc_第1页
第1页 / 共24页
算法表达式语法检查(数据结构课程设计).doc_第2页
第2页 / 共24页
算法表达式语法检查(数据结构课程设计).doc_第3页
第3页 / 共24页
点击查看更多>>
资源描述
中南民族大学计算机科学学院课程设计报告课 程 数据结构题 目 算法表达式语法检查年 级 2014专 业 软件工程学 生 柳真学 号 201421092073指导教师 刘赛 2015年12 月20 日中南民族大学计算机科学学院本科课程设计任 务 书设计名称: 算术表达式语法检查指导教师: 下达时间: 2015-11-30 学生姓名: 学 号: 年级专业: 2014级软件工程一、 课程设计的基本要求利用数据结构课程的相关知识完成一个具有一定难度的综合设计题目,利用C/C+语言进行程序设计,并规范地完成课程设计报告。通过课程设计,巩固和加深对线性表、栈、队列、字符串、树、图、查找、排序等理论知识的理解;掌握现实复杂问题的分析建模和解决方法(包括问题描述、系统分析、设计建模、代码实现、结果分析等);提高利用计算机分析解决综合性实际问题的基本能力。具体要求如下:1、 对现实复杂问题中的数据对象特性及组织方法进行分析和研究,设计适当的数据逻辑结构、存贮结构以及相应运算操作,把现实世界问题建模转化为计算机内部表示并进行处理。2、 采取模块化方式进行程序设计,要求程序的功能设计、数据结构设计及整体结构设计合理。学生也可根据自己对题目的理解增加新的功能模块(视情况可另外加分)。3、 系统以菜单界面方式(至少采用文本菜单界面,如能采用图形菜单界面更好)工作,运行界面友好,演示程序以用户和计算机的对话方式进行,利用文件进行数据的提取与存储。4、 程序算法说明清晰,理论分析与计算正确,运行情况良好,实验测试数据无误,容错性强(能对错误输入进行判断控制)。5、 编程风格良好(包括缩进、空行、适当注释、变量名和函数名见名知意,程序容易阅读等);6、 写出规范的课程设计报告,具体要求见相关说明文档。二、 课程设计的主要内容 题目描述:算术表达式语法检查。功能要求及说明:(1)键盘读入一个四则运算算术表达式,对其进行语法检查;(2)算术表达式允许嵌套,如果出错,指出出错位置;(3)不需要计算结果;(4)尽量不使用栈。三、 课程设计的进程安排12015年11月30日:布置并下达课程设计题目。22015年12月7日之前:联系指导教师,理解课程设计题目及相关要求,查阅相关资料,进行课程设计(地点:9-204,9-206)。32015年12月7日至12月31日(第15周-第18周):课程设计源程序的调试、修改与检查,书写课程设计报告(地点:计算机科学学院实验机房)。42016年12月31日之前:上交、检查设计报告(地点:计算机科学学院实验机房)。指导教师:2015年 11月20日算术表达式语法检查一 目的根据课题要求,完成算法表达式语法检查。具体完成以下四点要求:(1)键盘读入一个四则运算算术表达式,对其进行语法检查;(2)算术表达式允许嵌套,如果出错,指出出错位置;(3)不需要计算结果;(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代表栈中运算符(或#)出栈;-1代表当前运算符进栈;-2代表当前输入)错误;-3代表算术表达式末尾少输入)。2、程序流程图开始输入一个算术表达式c!=#| GetTob(B)!=#定义一个栈A,用来存放数字;定义一个栈B用来存放运算符从表达式首字符开始,获取一个字符存放到c中,开始依次检查定义一个字符变量c,一个字符数组d100如果是(进栈,否则报错检查下一个字符首字符是运算符字符是运算符字符是数字是是否否是是结束否字符是数字将字符串数组d100转化为数字,存入栈A字符是运算符字符是(字符是运算符检查下一个字符报错判断运算符优先级,将结果放入b中跳出本次循环,进行下一次循环检查下一个字符数字放入字符数组d100否是否是是是否否否b = 1A中最后进栈的两个数出栈,B中最后进栈的运算符出栈,进行运算,运算结果存入栈A进行下一个字符检查,若字符是),报错。检查下一个字符b = -1字符是(字符是运算符运算符进栈B是跳出本次循环,进行下一次循环否是运算符进栈B是进行下一个字符检查否报错是跳出本次循环,进行下一次循环否否否报错,输入非法字符检查下一个字符结束b = 0B中运算符出栈跳出本次循环,进行下一次循环进行下一个字符检查是b = -2否报错,输入)错误进行下一个字符检查跳出本次循环,进行下一次循环是否跳出本次循环,进行下一次循环否b = -3B中运算符出栈,并报错。第i位少输入)跳出本次循环,进行下一次循环是否四 详细设计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);/若栈不为空,返回栈顶元素值SElemType 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 *: 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的二维数组表,依次填入优先级,并返回相应优先等级。具体表格信息见概要设计中运算符优先等级划分表。/执行运算int 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)!=#) if(i = 1 & judgePrecedence(c) != 7) 首字符是运算符,报错; if(c = 0 & c = 9) 字符是数字,存放在数组d100中,后转化为数字存入栈A中; else if(judgePrecedence(c) != 7) 字符是运算符,进行判断,有错则报错,没有则进栈B; else 报错,输入非法字符。五 调试分析1、算法逻辑问题及输出错误检查一个算术表达式错误时,要具体要第几位以及是哪些错误,在刚开始的检查功能检查设计的时候,我的代码只能检查到+、-、*、/相关输入错误,对于(、)运算符不能完全检查出输入错误 ,其中有关除数为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)(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键即可得到算术表达式语法检查结果。八 课程设计总结在本次课程设计实施的过程中,遇到了很多问题,当然收获也很多。起初,让我感觉很难的地方在于如何确定算术表达式错误的位置以及有哪些错误要确定。在此过程中,我用了一个整形变量来计算依次检查的字符数,来确定错误的具体位置。其中错误的类型要分类进行查找,在算法实施之前我把错误类型进行分类,并初步画出算法的程序流程图,不断反复推敲和检查,从中也发现了我很多逻辑上的错误。通过不断修改和测试,也让我设计的核心功能函数不断完善,最终达到课题的要求。附具体源码:#include#include#includeusing 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);/若栈不为空,返回栈顶元素值SElemType 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);/具体应用操作void Yunsuan();int main() while(1) cout请输入算术表达式(按#结束):; Yunsuan(); /* cout继续输入算术表达式请输入$,退出请输入#:i; if(i = # ) break;*/ return 0;void InitStack(SqStack &S)S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType);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);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; 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,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 -: 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 = getchar();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第i位输入c错误= 0 & c = 0 & c = 9) dt+ = c;c = getchar();+i;dt = 0;a = atoi(d); /字符型转换为整形 push(A,a);else 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;push(A,Operate(a,e,b); break;case -1: push(B,c); c = getchar();+i;if(c = ) cout第i位输入c错误endl; c =getchar(); +i;if(c = ()push(B,c); c = getchar();+i;while(panduan(c)cout第i位输入c错误endl;c = getchar();+i;break;case 0: Pop(B,e); c =getchar(); +i;break;case -2:cout第i位输入c错误endl;c = getchar();+i;break;case -3:Pop(B,e); cout第i位少输入)endl;break;elsecout第i位非法输入cendl;c = getchar();+i;c = getchar();cout算术表达式语法检查完毕,已退出!;coutendlendl;
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 中学资料


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

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


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