表达式求解课程设计

合集下载

表达式求值问题课程设计

表达式求值问题课程设计

表达式求值问题课程设计一、课程目标知识目标:1. 学生能理解并掌握表达式求值的基本概念和规则,包括运算符优先级、括号的运用等。

2. 学生能够正确构建并简化数学表达式,熟练运用算术运算规则进行求值。

3. 学生能运用所学知识解决实际问题,如根据给定的条件编写表达式,并计算出结果。

技能目标:1. 学生培养逻辑思维能力,通过分析问题,能合理设计表达式并进行求值。

2. 学生通过实际操作,提高解决数学问题的计算速度和准确性。

3. 学生通过小组讨论和问题解决,提升合作能力和交流表达能力。

情感态度价值观目标:1. 学生培养对数学的兴趣,认识到数学在日常生活和未来学习中的重要性。

2. 学生在学习过程中树立正确的价值观,明白诚实求是的科学态度是学习数学的基础。

3. 学生通过解决表达式求值问题,增强自信心,培养勇于尝试和克服困难的积极态度。

课程性质分析:本课程为数学学科,针对五年级学生设计。

该阶段学生具备一定的数学基础和逻辑思维能力,需要通过表达式求值问题进一步巩固算术运算规则,提高解题能力。

学生特点分析:五年级学生处于好奇心强、求知欲旺的时期,他们喜欢探索和解决问题。

但同时,个别学生可能在数学学习上存在困难,需要教师关注并给予个性化指导。

教学要求:1. 教学内容紧密联系课本,确保学生能够掌握基础知识。

2. 教学过程中注重启发式教学,引导学生主动思考、积极参与。

3. 教学评价关注学生的过程表现,鼓励合作与交流,注重培养学生的综合能力。

二、教学内容本课程依据课程目标,结合课本第五章“数的运算”相关内容,组织以下教学大纲:1. 表达式求值基本概念:- 运算符的种类及优先级- 表达式的构成要素- 括号在表达式中的作用2. 算术运算规则:- 加、减、乘、除四则运算- 混合运算的表达式构建与简化- 乘方和开方的运算规则3. 表达式求值方法:- 逐步计算法- 分步骤代入法- 运用算术性质简化表达式4. 实际问题与表达式求值:- 根据实际问题编写表达式- 应用表达式求解问题- 分析实际问题的数量关系教学内容安排与进度:第一课时:表达式求值基本概念及运算符优先级第二课时:算术运算规则及表达式构建第三课时:表达式求值方法及简化技巧第四课时:实际问题与表达式求值的综合应用教材章节关联:《数学》五年级上册第五章“数的运算”:- 第1节 运算顺序与运算定律- 第2节 四则混合运算- 第3节 乘方与开方- 第4节 应用题与表达式求值三、教学方法为有效达成教学目标,本课程将采用以下多样化的教学方法:1. 讲授法:教师通过生动的语言和形象的比喻,对表达式求值的基本概念、运算规则进行讲解,确保学生掌握必要的理论知识。

C语言_算数表达式求值_课程设计报告

C语言_算数表达式求值_课程设计报告

目录一.概述1二.总体方案设计2三.详细设计3四.程序的调试与运行结果说明4五.课程设计总结5参考文献错误!未定义书签。

附录 (8)一概述一、课程设计的目的与要求本课程设计是为了配合?数据构造?课程的开设,通过设计一个完整的程序,使学生掌握数据构造的应用,算法的编写,类C语言的算法转换成C程序并用Turbo C2.0或Visual C++6.0上机调试的根本方法。

要求如下:1.要充分认识课程设计对自己的重要性,认真做好课程设计前的各项准备工作。

2.既要虚心承受教师的指导,又要充分发挥主观能动性.结合课题,独立思考,努力钻研,勤于实践,勇于创新。

3.独立按时完成规定的工作任务,不得弄虚作假,不准抄袭他人容,否那么成绩以不及格计。

4.课程设计期间,无故缺席按旷课处理;缺席时间达四分之一以上者,其成绩按不及格处理。

5.在设计过程中,要严格要求自己,树立严肃,严密,严谨的科学态度,必须按时,按质,按量完成课程设计。

6.小组成员之间,分工明确,但要保持联系畅通,密切合作,培养良好的互相帮助和团队协作精神。

二、需求分析本课程设计的课题为表达式求值,要求:1.用户将表达式原样输入〔在表达式结尾加上#〕,能得出结果〔为减小难度,运算结果的10进制形式的值,不超过longdouble的存储围〕;2.输入的数可以为小数〔为减小难度,小数的整数与小数局部均不超过10位〕,负数〔如果负数前有运算符,那么应将负数括起来〕,以及2进制,8进制,10进制,16进制的数〔为减小难度,数出的结果都以10进制形式表示〕;3.运算符号包括〔〕、+、—、*、/;括号可以多重;二总体方案设计1.使用双链表的数据构造表示数据的存储,将用户输入的表达式以字符形式存入双链表中。

2.对以负数开头、以括号开头、左括号后紧跟负数的特殊情况作处理。

3.将数与运算符分开;4.依次找到表达式最层括号,次层括号..................每次找到括号的表达式,便将其进展只有加减乘除运算的计算。

数据结构课程设计-表达式求值【

数据结构课程设计-表达式求值【

数据结构课程设计-表达式求值【完整版】.数据结构课程设计——表达式求值大学XXXXXX 《数据结构》课程设计报告班级:学号:姓名:指导老师:页 18 共页 2 第数据结构课程设计——表达式求值目录一算术表达式求值一、需求分析二、程序的主要功能三、程序运行平台四、数据结构五、算法及时间复杂度六、测试用例七、程序源代码二感想体会与总结页 18 共页 3 第数据结构课程设计——表达式求值算术表达式求值一、需求分析一个算术表达式是由操作数(operand)、运算符(operator)和界限符(delimiter)组成的。

假设操作数是正整数,运算符只含加减乘除等四种运算符,界限符有左右括号和表达式起始、结束符“#”,如:#(7+15)*(23-28/4)#。

引入表达式起始、结束符是为了方便。

编程利用“算符优先法”求算术表达式的值。

程序的主要功能二、(1)从键盘读入一个合法的算术表达式,输出正确的结果。

(2)显示输入序列和栈的变化过程。

三、程序运行平台Visual C++ 6.0版本数据结构四、本程序的数据结构为栈。

(1)运算符栈部分:struct SqStack //定义栈{char *base; //栈底指针char *top; //栈顶指针int stacksize; //栈的长度};int InitStack (SqStack &s) //建立一个空栈S{if (!(s.base = (char *)malloc(50 * sizeof(char))))exit(0);s.top=s.base;s.stacksize=50;return OK;}char GetTop(SqStack s,char &e) //运算符取栈顶元素{if (s.top==s.base) //栈为空的时候返回ERROR{牰湩晴尨运算符栈为空!\n);return ERROR;}elsee=*(s.top-1); //栈不为空的时候用e做返回值,返回S的栈顶元素,并返回OK页 18 共页 4 第数据结构课程设计——表达式求值return OK;}int Push(SqStack &s,char e) //运算符入栈{if (s.top-s.base >= s.stacksize){牰湩晴尨运算符栈满!\n);s.base=(char*)realloc (s.base,(s.stacksize+5)*sizeof(char) ); //栈满的时候,追加5个存储空间if(!s.base) exit (OVERFLOW);s.top=s.base+s.stacksize;s.stacksize+=5;}*(s.top)++=e; //把e入栈return OK;}int Pop(SqStack &s,char &e) //运算符出栈{if (s.top==s.base) //栈为空栈的时候,返回ERROR{牰湩晴尨运算符栈为空!\n);return ERROR;}else{e=*--s.top; //栈不为空的时候用e做返回值,删除S的栈顶元素,并返回OKreturn OK;}}int StackTraverse(SqStack &s) //运算符栈的遍历{char *t;t=s.base ;if (s.top==s.base){牰湩晴尨运算符栈为空!\n); //栈为空栈的时候返回ERRORreturn ERROR;while(t!=s.top){printf( %c,*t); //栈不为空的时候依次取出栈内元素t++;}页 18 共页 5 第数据结构课程设计——表达式求值return ERROR;}(2)数字栈部分:struct SqStackn //定义数栈{int *base; //栈底指针int *top; //栈顶指针int stacksize; //栈的长度};int InitStackn (SqStackn &s) //建立一个空栈S{s.base=(int*)malloc(50*sizeof(int));if(!s.base)exit(OVERFLOW); //存储分配失败s.top=s.base;s.stacksize=50;return OK;}int GetTopn(SqStackn s,int &e) //数栈取栈顶元素{if (s.top==s.base){牰湩晴尨运算数栈为空!\n); //栈为空的时候返回ERRORreturn ERROR;}elsee=*(s.top-1); //栈不为空的时候,用e作返回值,返回S的栈顶元素,并返回OK return OK;int Pushn(SqStackn &s,int e) //数栈入栈{if (s.top-s.base >=s.stacksize){牰湩晴尨运算数栈满!\n); //栈满的时候,追加5个存储空间s.base=(int*)realloc (s.base,(s.stacksize+5)*sizeof(int) );if(!s.base) exit (OVERFLOW);s.top=s.base+s.stacksize; //插入元素e为新的栈顶元素s.stacksize+=5;}*(s.top)++=e; //栈顶指针变化return OK;页 18 共页 6 第数据结构课程设计——表达式求值}int Popn(SqStackn &s,int &e) //数栈出栈{if (s.top==s.base){printf( 运算符栈为空!\n); //栈为空栈的视时候,返回ERRORreturn ERROR;}else{e=*--s.top; //栈不空的时候,则删除S的栈顶元素,用e返回其值,并返回OK return OK;}}int StackTraversen(SqStackn &s) //数栈遍历{int *t;t=s.base ;if (s.top==s.base){printf( 运算数栈为空!\n); //栈为空栈的时候返回ERRORreturn ERROR;}while(t!=s.top){printf( %d,*t); //栈不为空的时候依次输出t++;}return ERROR;}五、算法及时间复杂度1、算法:建立两个不同类型的空栈,先把一个‘# '压入运算符栈。

算术表达式的求解-数据结构课程设计报告

算术表达式的求解-数据结构课程设计报告

算术表达式的求解-数据结构课程设计报告数据结构》课程设计报告书题目:算术表达式的求解系别:计算机科学与应用数据结构课程设计目录一、需求分析1、设计要求:本程序需要实现对算术表达式的求解功能,可以支持基本的四则运算,包括加、减、乘、除,同时还需要支持括号的使用。

2、设计构想:我们将使用栈来实现算术表达式的求解。

具体地,我们将把中缀表达式转换为后缀表达式,然后再利用栈来求解后缀表达式。

二、概要设计1、本程序包含的模块:本程序包含两个模块:中缀表达式转后缀表达式模块和后缀表达式求解模块。

三、详细设计1、定义栈结构我们定义一个栈结构,用来存储算术表达式中的运算符和操作数。

具体地,栈中的每个元素都包含两个属性:元素的值和元素的类型。

元素的值可以是一个数字或一个运算符,元素的类型可以是数字或运算符。

我们使用一个数组来实现栈的结构。

为了方便起见,我们还需要定义一些基本的栈操作,如入栈、出栈、判断栈是否为空等。

2、栈的基本操作栈是一种常见的数据结构,具有后进先出(LIFO)的特点。

栈的基本操作包括初始化栈、入栈、出栈、取栈顶元素和运算模块。

1) 初始化栈初始化栈是指将栈的各项属性设置为初始状态。

通常包括将栈顶指针设为-1,表示栈为空。

2) 入栈入栈是指将元素压入栈顶。

入栈操作需要将栈顶指针加1,并将元素存入栈顶位置。

3) 出栈出栈是指将栈顶元素弹出。

出栈操作需要将栈顶元素取出,并将栈顶指针减1.4) 取栈顶元素取栈顶元素是指获取栈顶元素的值,但不将其弹出。

取栈顶元素操作只需要返回栈顶元素的值即可。

5) 运算模块栈可以用于实现各种运算,例如中缀表达式的转换和计算、括号匹配等。

运算模块需要根据具体需求进行设计和实现。

3、判断运算符的优先级在进行中缀表达式的转换和计算时,需要判断运算符的优先级。

通常采用栈来实现这一功能。

具体实现方法是将运算符入栈,当遇到新的运算符时,将其与栈顶运算符进行比较,如果新运算符的优先级高于栈顶运算符,则将其入栈,否则将栈顶运算符弹出并输出,直到新运算符可以入栈为止。

表达式求值程序设计说明书

表达式求值程序设计说明书

汇编语言实训课程设计任务书题目:表达式求值程序班级:计算机科学与技术一班学生姓名:赵旭尧学号: 14730141 题目类型:软件工程(R)指导教师:刘树群一.题目简介该设计要求学生使用汇编语言,设计并开发出针对四则运算表达式进行求值的命令行或窗口程序。

通过该题目的设计过程,可以培养学生结构化程序设计的思想,加深对汇编语言基本语言要素和流程结构的理解,针对汇编语言中的重点和难点内容进行训练,独立完成有一定工作量的程序设计任务,同时强调好的程序设计风格。

得到软件工程的综合训练,提高解决实际问题的能力。

二.设计任务1、查阅文献资料,一般在5篇以上;2、通过键盘输入表达式,进行针对整数的“加减乘除”四则运算表达式进行求值,有良好的界面;3、完成软件结构设计和算法设计;4、完成系统的软件开发和测试工作;5、撰写设计说明书;6、做好答辩工作。

三.主要内容、功能及技术指标1、实现功能及指标:①使用Win32的窗口程序模式,实现表达式求值程序及测试界面程序的设计与开发;②支持整数的四则运算、位运算和小括号等;③使用文本框对表达式进行交互式编辑和输出。

2、问题分析及解决方案框架确定:充分地分析和理解问题本身,弄清要求做什么。

在确定解决方案框架过程中,综合考虑系统功能,考虑怎样使系统结构清晰、合理、简单和易于调试。

最后确定每个过程和函数的简单功能,以及过程(或函数)之间的调用关系,并画出函数之间的调用关系图。

3、详细设计和编码:定义相应的存储结构,确定各个函数的算法,并画出流程图,在此基础上进行代码设计,每个明确的功能模块程序一般不超过200行,否则要进一步划分。

4、完成课程设计报告①需求和规格说明:设计题目和问题描述:题目要解决的问题是什么;②设计思路:主要算法思想,程序功能图,函数之间的调用关系图;设计表示:每个函数或过程的功能,列出每个过程或函数所调用的过程或函数,并画出各函数的流程图;详细设计:主要算法的伪代码;③调试报告:调试过程中遇到的主要问题,是如何解决的;对设计和编码的回顾讨论和分析;改进设想;经验和体会等;④程序实现注释;⑤附录:源程序清单和结果。

算术表达式的求解-数据结构课程设计报告

算术表达式的求解-数据结构课程设计报告

《数据结构》课程设计报告书题目:算术表达式的求解系别:计算机科学与应用目录一、需求分析 (3)1、设计要求: (3)2、设计构想: (3)二、概要设计 (4)1、本程序包含的模块: (4)三、详细设计 (4)1、定义栈结构 (5)2、栈的基本操作 (5)(1)初始化栈 (5)(2)入栈 (5)(3)出栈 (6)(4)取栈顶元素 (6)(5)运算模块 (6)3、判断运算符的优先级 (7)4、运算函数 (8)(1) 基础运算函数: (8)(2)运算函数 (9)(3)主程序模块 (12)四、调试分析 (12)1、测试结果 (12)2、程序时间复杂度为O(n); (13)3、设计中出现的问题: (13)4、算法改进: (14)五、课程设计总结 (15)课程设计报告一、需求分析1、设计要求:给定一个算术表达式,通过程序求出最后的结果1>、从键盘输入要求解的算术表达式;2>、采用栈结构进行算术表达式的求解过程;3>、能够判断算术表达式正确与否;4>、对于错误表达式给出提示;5>、对于正确的表达式给出最后的结果;2、设计构想:为了实现算符优先算法使用两个工作栈,一个称作OPTR,以寄存运算符;另一个称作OPND,用以寄存操作数或运算结果。

在操作数和操作符入栈前,通过一个函数来判别,输入的是操作数还是操作符,操作数入OPND,操作符入OPTR。

在输入表达式的最后输入‘#’,设定‘#’的优先级最低,代表表达式输入结束。

在表达式输入过程中,遇操作数则直接入栈,遇到运算符则与栈顶运算符比较优先级,若当前运算符优先级高,则当前运算符入栈,扫描下一符号;否则栈顶运算符出栈,两操作数出栈,进行运算,所得结果入数栈,重新比较当前运算符与新栈顶运算符。

如此重复直到栈顶运算符与当前符号均为‘#’,运算结束。

二、概要设计1、本程序包含的模块:(1)栈模块——实现栈抽象数据类型(2)运算模块——实现数据表达式的运算(3)主程序模块三、详细设计(1)栈模块1、定义栈结构struct Sqstack{int *top;//栈顶元素int *base; //栈底元素int stacksize;//栈的大小};2、栈的基本操作(1)初始化栈int initstack(struct Sqstack &s){s.base=(int *)malloc(stack_size*sizeof(int));if(!s.base)return OVERFLOW;s.top=s.base;s.stacksize=stack_size;return OK;}(2)入栈int push(struct Sqstack &s,int e){if(s.top-s.base>=s.stacksize){s.base=(int*)realloc(s.base,(s.stacksize+stack_increasement)*sizeof(int));if(!(s.base))return OVERFLOW;s.top=s.base+s.stacksize;s.stacksize+=stack_increasement;}* s.top++=e;return OK;}(3)出栈int pop(struct Sqstack &s){int e;if(s.top==s.base)return ERROR;e=*--s.top;return e;}(4)取栈顶元素int gettop(struct Sqstack &s){int e;if(s.top==s.base)return ERROR;e=*(s.top-1);return e;}(5)运算模块1、判断输入字符c是否为操作符:若是,则返回1;否则,返回0int In(int c){char p[10]="+-*/()#^";int i=0;while(p[i]!='\0'){if(p[i]==c)return 1;i++;}return 0;}3、判断运算符的优先级char precede(char top,char c)//该函数为判断当前运算符与前一个运算符的优先级,前一个运算符高于或等于当前运算符的优先级则返回'>',前一个运算符小于当前运算符的优先级则返'<',当前一个运算符为'('当前运算符为')'时返回'=',用于去除表达式的括号。

算数表达求解课程设计

算数表达求解课程设计

算数表达求解课程设计一、课程目标知识目标:1. 学生能理解并掌握算数表达式的构成要素,包括数字、运算符和变量。

2. 学生能够正确识别与求解简单算数表达式,包括加减乘除和括号的使用。

3. 学生能够理解算数表达式求解的优先级规则,并应用于实际问题中。

技能目标:1. 学生能够运用算数表达式解决生活中的实际问题,如购物找零、时间计算等。

2. 学生通过练习,提高算数表达式的列写和计算速度,培养逻辑思维和运算能力。

3. 学生能够运用图表和文字描述来表示算数问题,并进行有效沟通。

情感态度价值观目标:1. 学生在学习过程中,培养对数学的兴趣和好奇心,增强解决数学问题的自信心。

2. 学生通过小组合作,培养团队协作精神,学会互相尊重和倾听。

3. 学生能够认识到数学在生活中的重要性,培养用数学的眼光观察世界,解决问题的积极态度。

本课程针对小学四年级学生设计,结合学生年龄特点和认知水平,通过情境创设、实践操作和问题解决,帮助学生掌握算数表达式的求解方法。

课程注重培养学生的实际应用能力,提高数学思维和解决实际问题的能力,同时关注学生情感态度的发展,使学生在轻松愉快的学习氛围中感受数学的魅力。

二、教学内容本章节教学内容主要包括以下三个方面:1. 算数表达式的构成要素:- 数字的认识与运用- 运算符的认识与运用(加减乘除、括号)- 变量的认识与表示2. 算数表达式的求解方法:- 优先级规则的掌握与应用- 算数表达式列写与计算方法- 解决实际问题的方法与步骤3. 算数表达式在实际问题中的应用:- 购物找零问题- 时间计算问题- 其他生活情境中的算数问题教学内容参照教材第四章“算数表达式”的内容进行组织,教学进度安排如下:第一课时:算数表达式的构成要素及运算符的认识第二课时:算数表达式的优先级规则与求解方法第三课时:算数表达式在实际问题中的应用与练习第四课时:复习与拓展,提高学生的实际应用能力三、教学方法针对本章节内容,采用以下多样化的教学方法,旨在激发学生的学习兴趣,提高学生的主动性和参与度:1. 讲授法:教师以生动形象的语言,结合课本第四章内容,系统讲解算数表达式的构成要素、优先级规则及求解方法。

算术表达式的求解课程设计说明书

算术表达式的求解课程设计说明书

一、设计题目算术表达式的求解二、设计内容给定一个算术表达式,通过程序求出最后的结果。

具体内容如下:(1)从键盘输入要求解的算术表达式;(2)采用栈结构进行算术表达式的求解过程;(3)能够判断算术表达式正确与否;(4)对于错误表达式给出提示;(5)对于正确的表达式给出最后的结果;三、概要设计设计的内容,可以确定所需的模块及模块间调用关系如流程图所示:模块的关系图四、算法描述栈结构进行算术表达式的求解过程,其各个模块的流程图,如下图所示:创建栈出栈栈的索引值index遍历栈设计源代码#include "iostream.h" #include "stdlib.h" #include "math.h" #include "time.h" #define TRUE 1 #define FALSE 0 #define ERROR -1压栈简单的四则运算运算符typedef int Status; //用模板实现的链式结构堆栈类template <class T>class stack{private:struct link{T data; //结点数据域link *next; //下一结点指针link(T Data,link* Next){//结构体构造函数data=Data;next=Next;}}*head; //堆栈顶指针public:stack(); //构造函数(初始化栈)~stack(); //析构函数(销毁栈)void push(T Data); //压栈操作T gettop()const; //取栈顶元素T pop(); //出栈操作T getvalue(int index); //返回栈底开始第INDEX个栈中值void traverse(int n); //遍历栈N个数换行int empty(); //判断栈是否为空,1是,0非int sizeofstack(); //返回栈的大小void clear(); //清空栈};//类模板成员函数的实现template<class T> stack<T>::stack()//构造函数{head=0;}template<class T> stack<T>::~stack()//析构函数{link* cursor=head;while(head){cursor=cursor->next;delete head;head=cursor;}}template<class T>void stack<T>::push(T Data)//压栈操作{head=new link(Data,head);}template<class T>T stack<T>::gettop()const //取栈顶元素{return head->data;}template<class T>T stack<T>::pop() //出栈操作{if(head==0)return 0;T result=head->data;link* oldhead=head;head=head->next;delete oldhead;return result;}template <class T>T stack<T>::getvalue(int index)//返回栈底开始第INDEX个栈中值{link *cursor=head;int i=1;int stacklen=sizeofstack();if(index<=0||index>stacklen)return 0;while(i<=(stacklen-index)){cursor=cursor->next;i++;}return cursor->data;}template <class T> void stack<T>::traverse(int n)//遍历栈{link * cursor=head;int iEnterSign=1; //换行标识while(cursor){cout<<cursor->data<<" ";if(iEnterSign%n==0)cout<<endl;cursor=cursor->next;iEnterSign++;}if((iEnterSign-1)%n!=0)cout<<endl;}template <class T>int stack<T>::empty() //判断栈是否为空,1是,0非{return head==0?1:0;}template <class T>int stack<T>::sizeofstack() //返回栈的大小{int size=0;link *cursor=head;while(cursor){cursor=cursor->next;size++;}return size;}template<class T> void stack<T>:: clear() //清空栈{link *cursor=head;while(cursor&&cursor->next){cursor=cursor->next;delete head;head=cursor;}}int Operator(char ch){if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='#')return(TRUE);elsereturn(FALSE);}char Precede(char ch1,char ch2){char ch;switch(ch1){case '+':case '-':{switch(ch2){case '+':case '-':case ')':case '#':ch='>'; break;case '*':case '/':case '(':ch='<';break;}break;}case '*':case '/':{if(ch2=='(')ch='<';elsech='>';break;}case '(':{if(ch2==')')ch='=';elsech='<';break;}case ')':{ch='>';break;}case '#':{if(ch2=='#')ch='=';elsech='<';break;}}return(ch);}int calc(int x,char ch,int y){int z;switch(ch){case '+': z=x+y; break;case '-': z=x-y; break;case '*': z=x*y; break;case '/': if(y!=0)z=x/y;else//z=0;cout<<"分母不能仅为0!"<<endl;break;}return(z);}int middexpression(char *exp) //求解算式表达式{stack<int> *opnd=new(stack<int>);stack<char> *optr=new(stack<char>);char ch=*exp;int x=0,y,z;int result;optr->push('#');while(ch!='#'||optr->gettop()!='#'){if(!Operator(ch)){x=ch-48;opnd->push(x);ch=*++exp;if(ch!='\0'&&!Operator(ch)){cout<<"不符合要求,运算数必须是0~9之间的数"<<endl;exit(0);}}else{switch(Precede(optr->gettop(),ch)){case '<': //栈顶元素优先权低optr->push(ch);ch=*++exp;break;case '=': //脱括号并接收下一字符optr->pop();ch=*++exp;break;case '>': //退栈并将运算结果入栈if(opnd->sizeofstack()<2){cout<<"表达式不合法!"<<endl;exit(0);}x=opnd->pop();y=opnd->pop();z=calc(y,optr->pop(),x);opnd->push(z);x=0;break;}}if(ch=='\0'){cout<<"表达式应该以'#'结束!"<<endl;exit(0);}}result=opnd->pop();if(opnd->empty()&&optr->pop()=='#')return(result);else{cout<<"输入不合法!"<<endl;exit(0);}}void main(void) //程序入口函数{char exp[50];cout<<"数据结构课程设计-请输入算术表达式(以#结束):"<<endl;cin>>exp;cout<<middexpression(exp)<<endl;}五、测试结果及分析运行程序,输入数据及所得结果如下表;通过实际的将程序输入软件中,执行后所列出的表中,并且通过记录的所得的上表可知,给定的一个算术表达式,通过程序所求出来的值是正确的,并且当输入数值出现错误或者是表达式输入错误时,也会给出相应的错误提示,所以程序达到了原先所要的设计的要求。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

摘要本程序是关于表达式求解的问题,其主要功能是进行简单的四则运算,其特点之一是支持带括号的四则运算;二是用到栈的一些相关操作,不但对操作有提示,还对与异常输入信息报错。

通过该题目的设计过程,可以加深理解线性表及栈的逻辑结构、存储结构,掌握线性表及栈上基本运算的实现,进一步理解和熟练掌握课本中所学的各种数据结构,学会如何把学到的知识用于解决实际问题,培养学生的动手能力。

在表达式求解用到的算法中,c语言算法可读性很强,一方面,是因为c语言是高级语言,是面向程序员的语言,二是c语言的功能是很完备的,可以达到事半功倍的效果,和其他语言相比量是比较少。

栈的应用使该程序更出色。

关键字:堆栈,初始化栈,入栈,出栈。

AbstractThis program is about expression to solve the problem, its main function is to carry out operations of four simple, one of its features is support four operations with brackets; two is the number of operations used stack, not only has the cue for the operation of abnormal input information, and error.Through the design process of the subject, to deepen understanding of the logical structure, storage structure of linear table and stack, mastering the linear table and the stack to achieve the basic operation, to further understand and master the various data structures in the book, learn how to learn knowledge to solve practical problems, to cultivate students' ability.In the expression used in solving algorithm, the algorithm C language readability is very strong, on the one hand, because the C language is a high-level language for programmers, the language, the two is the C language function is complete, can achieve a multiplier effect, and the amount is less than any other language. Stack of applications make the program more outstanding.Keywords: initialize the stack, stack, the stack, the stack.目录摘要 (1)1概述 (4)1.1开发背景 (4)1.2开发意义 (4)1.3内容与要求 (4)2概要设计 (5)2.1算法时间和空间性能分析 (5)2.2模块功能图 (5)3详细设计 (7)3.1函数关系调用模块 (7)3.2用C语言构造运算符栈函数 (7)3.3用C语言构造运算数栈函数 (9)4调试分析 (12)4.1调试中遇到的问题及对问题的解决方法 (12)4.2测试结果的输出 (12)总结 (15)参考文献 (16)致谢 (17)附录(源程序): (18)1概述1.1开发背景在c语言和c++的环境中,综合数据结构所学的知识,开始将‘#’入操作符栈,通过一个函数来判别算术运算符的优先级。

且规定‘#’的优先级最低。

在输入表达式的最后输入‘#’,代表表达式输入结束。

在表达式输入过程中,遇操作数则直接入栈。

遇到运算符则与栈顶运算符比较优先级,当前运算符优先级高(前面的运算还不应执行)则当前运算符入栈,扫描下一符号;否则栈顶运算符出栈,两操作数出栈,进行运算,所得结果入数栈,重新比较当前运算符(注意当前运算符未变)与新栈顶运算符。

如此重复直到栈顶运算符与当前符号均为‘#’,运算结束。

编写出对应的程序来实现它。

1.2开发意义数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象及它们之间相互关系及操作的学科。

数据结构按其元素之间的关系可分为四种:1.集合2.线性结构3.树形结构4.网状结构。

而栈作为一种重要的线性结构,从数据结构的角度看,其特殊性在于其操作是线性表操作的子集。

她是操作受限的线性表。

因此可称其为限定性数据结构。

但从数据类型的角度看,它是与线性表大不相同的一类重要的抽象数据类型。

由于其后进先出的特性,被广泛地应用于各种软件系统中。

1.3内容与要求(1)使用顺序栈存储算术表达式,主要功能有:输入并建立算术表达式、输出算术表达式、算术表达式的计算及显示输出等;(2)至少要用10个测试数据,算法对于这些合法的输入数据都能产生满足规格说明要求的结果;(3)算法对于精心选择的典型、苛刻而带有刁难性的几组输入数据能够得出满足规格说明要求的结果;对算法实现过程中的异常情况能给出有效信息;(4)假设算术表达式中只含加减乘除等四种运算符,操作数是实数,界限符有括号有“()”、“[]”、“{ }”、表达式起始、结束符“#”等;(5)要求对自己设计的程序进行多次的调试;若表达式在输入出错时能够提示并进行修正;显示栈的变化过程。

(6)通过本次程序设计,更好的掌握建栈、入栈和出栈的顺序,深化数据结构所学的基本内容,提高自己的程序设计能力和编写能力。

2概要设计2.1算法时间和空间性能分析时间上,对于含n个字符的表达式,无论是对其进行合法性检测还是对其进行入栈出栈操作n次,因此其时间复杂度为O(n)。

空间上,由于在本程序中,在为算符栈(OPTR)和操作数栈(OPND)涉及到两种情况时申请空间,一方面分别为OPTR栈和OPND栈申请了初始的存储单元,均为STACK_INITSIZE=100个;另一方面,考虑到两个栈在处理具体的算术表达式时,有可能会出现溢出的情况,即栈的初始的存储空间不够用,这时需要为其申请额外的存储空间,每溢出一次,就为其申请存储单元STACKINCREMENT=10个;所以,本程序的算法的空间复杂度一方面取决于算术表达式的长度,另一方面取决于本程序的所有代码所占用的存储空间大小。

2.2模块功能图设计一个程序,首先要了解程序的设计思路和程序的基本构成框架,图2.1为设计程序的基本思路和概要,通过逐步的模块间的关系调用来实现整个程序的完整性:图2.1模块功能图3详细设计3.1函数关系调用模块下图是各函数间的调用关系图,主要是将各个函数间的调用和程序中用到的函数用图形的形式表现出来,可以更好地理解程序中各个函数的用法。

图3.1函数关系调用图3.2用C语言构造运算符栈函数该模块是用C语言构造出运算符栈函数,首先构造一个空运算符栈,并分配空间,然后实现运算符进栈、出栈等等运算符的栈操作。

void Optr_InitStack(Optr_Stack &S1)//构造一个空运算符栈S1{S1.base=(char *)malloc(STACK_INIT_SIZE *sizeof(char));if(!S1.base)cout<<"存储分配失败!";//存储分配失败S1.top=S1.base;S1.stacksize=STACK_INIT_SIZE;}void Optr_Push(Optr_Stack &S1,char e)//运算符入栈{if(S1.top-S1.base>=S1.stacksize)//如果栈满,追加存储空间{S1.base=(char*)realloc(S1.base,(S1.stacksize+STACKINCREMENT)*sizeof(c har));if(!S1.base) cout<<"存储分配失败!";else{S1.top=S1.base+S1.stacksize;S1.stacksize=S1.stacksize+STACKINCREMENT;}}*S1.top=e;S1.top=S1.top+1;//将运算符压入栈中,指针上移}char Optr_GetTop(Optr_Stack &S1)//取栈顶运算符{char e;if(S1.top==S1.base)cout<<"\n\t\t\t运算符栈已空!\n";else e=*(S1.top-1);return e;}void Optr_DispStack(Optr_Stack &S1)//从运算符栈底到栈顶依次输出各运算符{char e,*p;if(S1.top==S1.base)cout<<" ";else{p=S1.base;while(p<S1.top){e=*p;p++;cout<<e;}}}char Optr_Pop(Optr_Stack &S1)//运算符出栈{char e;if(S1.top==S1.base)cout<<"\n\t\t\t运算符栈已空!\n";e=*(--S1.top);return e;}3.3用C语言构造运算数栈函数该模块是用C语言构造出运算符栈函数,首先构造一个空运算符栈,并分配空间,然后实现运算数进栈、出栈等等运算数的栈操作。

void Opnd_InitStack(Opnd_Stack &S2)//构造一个空运算数栈S2{S2.base=(float *)malloc(STACK_INIT_SIZE *sizeof(float));if(!S2.base)cout<<"存储分配失败!";//存储分配失败S2.top=S2.base;S2.stacksize=STACK_INIT_SIZE;}void Opnd_Push(Opnd_Stack &S2,float e)//运算数入栈{if(S2.top-S2.base>=S2.stacksize)//栈满,追加存储空间{S2.base=(float*)realloc(S2.base,(S2.stacksize+STACKINCREMENT)*sizeof( float));if(!S2.base)cout<<"存储分配失败!";else{S2.top=S2.base+S2.stacksize;S2.stacksize=S2.stacksize+STACKINCREMENT;}}*S2.top=e;S2.top=S2.top+1;//将数e入栈,指针上移}void Opnd_DispStack(Opnd_Stack &S2)//从运算数栈底到栈顶依次输出各元素{float e,*p;if(S2.top==S2.base)cout<<" ";else{p=S2.base;while(p<S2.top){e=*p;p++;cout<<e;}}}float Opnd_GetTop(Opnd_Stack &S2)//取栈顶元素{float e;if(S2.top==S2.base) cout<<"\n\t\t运算数栈已空!";else e=*(S2.top-1);return e;}float Opnd_Pop(Opnd_Stack &S2)//出栈{float e;if(S2.top==S2.base)cout<<"\n\t\t运算数栈已空!";e=*(--S2.top);return e;}4调试分析4.1调试中遇到的问题及对问题的解决方法本程序一开始面临精确度不高的问题,具体说就是它只能计算整数,对于小数它会报告输入错误,这种性能缺陷是致命的,打个比方,就像一个大个子,长了两只很短的胳膊。

相关文档
最新文档