表达式求值课程设计

合集下载

表达式求值问题课程设计

表达式求值问题课程设计

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

表达式求值课程设计报告

表达式求值课程设计报告

表达式求值课程设计报告表达式求值《数据结构》课程设计报告题目: 栈的应用:表达式求值(系): 信息科学与工程学院院专业班级: 软件工程1102班学生姓名:学号: 指导教师:20 13 年 6 月 8 日至20 13 年 6 月 21 日表达式求值目录目录 (2)1 概述 (1)1.1 课程设计目的 (1)1.2 课程设计内容 (1)2 系统需求分析 ......................................................12.1 系统目标 (1)2.2 主体功能 (1)2.3 开发环境 (1)3 系统概要设计 ....................................................23.1 系统的功能模块划分 (2)3.2 系统流程图 (2)4系统详细设计 .....................................................35 测试 ............................................................65.1 测试方案 (6)5.2 测试结果 (6)6 小结 ............................................................8参考文献 ..........................................................9附录1 源程序清单 (10)2数据结构课程设计报告(2012)表达式求值1 概述1.1 课程设计目的1(要求学生达到熟练掌握C语言的基本知识和技能。

2(了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力。

3(提高程序设计和调试能力。

学生通过上机实习,验证自己设计的算法的正确性。

学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改。

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

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

课程设计报告课程名称数据结构课程设计题目算术表达式求值指导教师设计起始日期 4.18~4.25学院计算机学院系别计算机科学与工程学生姓名班级/学号成绩一、需求分析设计一个算术表达式四则运算的程序,要求完成包括加、减、乘、除运算,包含括号的基本整数表达式的运算。

在这里运算数可以1位长度,也可以多位长度。

在运算之后输出的正确运算结果,输入表达式后演示在求值中运算数栈内的栈顶数据变化过程,最后得到运算结果。

(1)输入:3*(7-2)(2)输出:数据栈栈顶元素:3,7,2,7,5,3,15结果:15(3)自选数据二、概要设计1、使用栈的数据结构表示数据的存储。

2、设计算法将中缀表达式转换成后缀表达式,用栈的数据结构实现表达式的运算。

3、把中缀表达式转换为后缀表达式算法的基本思路是从头到尾地扫描中缀表达式中的每个字符,对于不同类型的字符按不情况进行处理。

三、详细设计数据结构:字符类型栈/* 定义字符类型栈*/typedef struct{char stackname[20];char *base;char *top;} Stack;算法:将中缀表达式转换为后缀表达式void Change(char* s1, char* s2)// 将字符串s1中的中缀表达式转换为存于字符串s2中的后缀表达式{Stack R; // 定义用于暂存运算符的栈InitStack(R); // 初始化栈Push(R,'#'); // 给栈底放入’#’字符,它具有最低优先级0int i,j;i=0; // 用于指示扫描s1串中字符的位置,初值为0j=0; // 用于指示s2串中待存字符的位置,初值为0char ch=s1[i]; // ch保存s1串中扫描到的字符,初值为第一个字符while( ch!='#'){ // 顺序处理中缀表达式中的每个字符if(ch==' ')// 对于空格字符不做任何处理,顺序读取下一个字符ch=s1[++i];else if(ch=='('){ // 对于左括号,直接进栈Push(R,ch);ch=s1[++i];}else if(ch==')'){ // 对于右括号,使括号内的仍停留在栈中的运算符依次// 出栈并写入到s2中while(Peek(R)!='(')s2[j++]=Pop(R);Pop(R); // 删除栈顶的左括号ch=s1[++i];}else if(ch=='+'||ch=='-'||ch=='*'||ch=='/'){ // 对于四则运算符,使暂存在栈中的不低于ch优先级// 的运算符依次出栈并写入到s2中char w=Peek(R);while(Precedence(w)>=Precedence(ch)){ // Precedence(w)函数返回运算符形参的优先级s2[j++]=w;Pop(R); w=Peek(R); }}四、调试分析调试:在设计过程中出现程序不能运行,发现不能找到结束标识符,因此在设计的时候需要人为动态添加结束标识符‘#’,顺利运行算法时间和空间分析:算法的运行时间主要花在while循环上,它从头到尾扫描后缀表达式中的每一个数据(每个操作数或运算符均为一个数据),若后缀表达式由n个数据组成,则此算法的时间复杂度为O(n)。

算术表达式求值课程设计报告

算术表达式求值课程设计报告

编号:学号:课程设计教学院课程名称题目专业班级姓名同组人员指导教师2013 年 6 月22 日(完成时间)目录一.概述 (2)二.总体方案设计 (4)三.详细设计 (6)四.程序的调试与运行结果说明 (14)五.课程设计总结 (14)六.附录 (16)参考文献 (3233)(“目录”要求必须自动生成)一概述(宋体,三号,加粗,居中)1.课程设计的目的(小标题,宋体,四号,加粗,左对齐顶格)(1).理解和掌握该课程中的有关基本概念,程序设计思想和方法。

(2).培养综合运用所学知识独立完成课题的能力。

(3).培养勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。

(4).掌握从资料文献、科学实验中获得知识的能力,提高学生从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。

2.课程设计的要求算术表达式求值程序实现以下功能:(1)构造一个空栈S,初始条件:栈S已存在(2)用P返回S的栈顶元素(3)插入元素ch为新的栈顶元素(4)删除S的栈顶元素(5)判断字符是否是运算符,运算符即返回1(6)判断运算符优先权,返回优先权高的(7)输入表达式(8)返回表达式的最终结果。

二总体方案设计a)需求分析该程序能实现算术四则运算表达式的求值,显示运算过程。

输入的形式:表达式,例如5*(3+7)#。

包含的运算符只能有'+'、 '-'、'*'、 '/'、 ' (' ') ';程序所能达到的功能:对表达式求值并输出。

b)总体设计本程序使用的是编程工具是Visual c++ 6.0,实现了运算器的功能和仿真界面(大体界面如下图所示)。

在基本要求的基础上,运算数可以是实数类型,同时增加了乘方运算的功能;可以实现对负数的运算,例如用户输入表达式6*(-0.25),则程序会在负号的前面自动加上一个0。

表达式求值课程设计报告

表达式求值课程设计报告

目录1 需求分析 (1)1.1问题描述 (1)1.2基本要求 (1)2 概要设计 (1)2.1 数据结构 (1)2.2 各模块间的调用关系及算法设计 (2)2.2.1 栈的抽象数据类型的定义 (3)2.2.2栈的基本功能 (4)3 详细设计 (6)3.1数据存储结构设计 (6)3.2 主函数和其它函数的设计与实现 (6)3.3函数功能分析 (8)3.4 函数间的调用关系 (9)4 调试与分析 (9)4.1 程序调试 (9)4.2 数据分析 (12)5 用户手册 (13)5.1 运行环境 (13)5.2 执行文件 (13)6 参考文献 (13)7 心得体会 (13)8小组成员任务分配及工作进度安排 (14)1 需求分析1.1问题描述在计算机中,算术表达式由常量、变量、运算符和括号组成。

由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。

因而在程序设计时,借助栈实现。

算法输入:一个算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)操作符为+、-*、/,用#表示结束。

算法输出:表达式运算结果。

算法要点:设置运算符栈和运算数栈辅助分析算符优先关系。

在读入表达式的字符序列的同时,完成运算符和运算数的识别处理,以及相应运算。

本算法的时间复杂度与输入的表达式的长度有密切的关系,在此不作深入分析。

1.2基本要求设计友好的用户界面,利用所学工具开发一个简单的表达式求值应用程序,该程序能够对表达式进行加、减、乘、除运算,表达式中的操作数要求在实数范围内;对于异常表达式应能给出错误提示。

针对前面的要求分别设计合理的测试数据,比如3.154*(12+18)-23的结果应该是71.62等。

2概要设计2.1 数据结构表达式求值是程序设计语言编译中的一个最基本的问题。

它的实现是栈应用的一个典型例子。

本程序使用通常使用的算法为“算符优先法”。

要把一个表达式翻译成正确求值的一个机器指令序列,或者直接对求值首先要能够正确解释表达式。

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

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

《数据结构》课程设计利用栈求表达式的值班级: 2学号: 100171021330姓名:吴迪指导老师:王方利用栈求表达式的值1、设计思路这个程序的关键是对数字与运算符的判断和运算符优先级的判断,以及出栈的运算。

建立两个栈,分别存储数字与运算符,栈1存运算符,栈2存数字。

依次读取表达式的字符串,先判断是数字还是运算符,如果是数字不能马上压入栈2,因为可能是大于10的数字,应该继续循环,如果还是数字,则利用计算保存数值,直到指到运算符时停止,将计算后的数字压入栈2。

压入运算符之前先将要压入的与栈顶的运算符优先级相比较,如果栈顶是‘(’而当前不是‘)’,则不需比较优先级,直接压入;如果栈顶是‘(’,当前是‘)’,则抵消(弹出‘(’,指向表达式下一个字符);若当前的运算符优先级大于栈顶的,则压入;若当前的运算符优先级小于栈內时,弹出栈顶的运算符,同时弹出两组数字,经过运算符的运算后再重新压到栈内。

为了方便判断运算结束,在存储运算符之前先将‘#’压入栈1中,在输入表达式时以‚#‛结束,所以可以以运算符==‘#’并且栈1顶==‘#’来结束运算,弹出栈2的数值,即为表达式求值的最终结果。

上述操作的算法步骤:(1)初始化算符S1,数字栈S2;,将‘#’压入算符栈S1中。

(2)读表达式字符=>w。

(3)当栈顶为‘#’并且w也是‘#’时结束;否则循环做下列步骤:(3-1)如果w是数字,存储到m,再经过计算存储到num中。

m=w-‘0’;num=num*pow(10,n)+m;n++;读下一个字符=>w,如果是运算符,则跳出循环;转3-2。

(3-2)w若是运算符,则:(3-2-1)如果栈顶为‘(’并且w为‘)’则‘(’出栈,读下一个字符=>w;转(3)。

(3-2-2)如果栈顶为‘(’或者栈顶优先级小于w优先级,则w入栈,读下一个字符=>w;转(3)。

否则:从算符栈中出栈,并从数字栈中弹出两组数字进行运算,将结果重新压入数字栈,转(3)。

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

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

课程设计(论文)题目名称表达式求值问题课程名称数据结构课程设计学生姓名 XXX学号xxxxxxxxx系、专业信息工程系、信息工程类指导教师 xxxxxx2010年 1 月 3 日目录1 问题描述 (2)2 需求分析 (2)3 概要设计 (2)3.1抽象数据类型定义 (2)3.2模块划分 (3)4 详细设计 (4)4.1数据类型的定义 (4)4.2主要模块的算法描述 (4)5 测试分析 (7)5.1程序运行结果 (7)5.2程序调试与体会 (8)6 课程设计总结 (8)参考文献 (8)附录(源程序清单) (9)1 问题描述编写一个表达式求值程序,使输入一个四则运算表达式后,能够返回正确的结果。

该表达式由数字0~9、+、-、*、/、括号组成,且表达式必须正确无误。

程序的编写可用到栈或队列的基本算法,求出该表达式的值,并分析算法的时间复杂度和运算的结果。

2 需求分析(1)为实现算符优先算法,可以使用两个工作栈。

一个称做OPTR,用以寄存运算符;另一个称做OPND;用以寄存操作数或运算结果。

算法的基本思想是:①首先置操作数栈为空栈,表达式起始符“#”为运算符栈的栈底元素;②依次读入表达式中每个字符,若是操作数则OPND栈,若是运算符,则和OPTR栈的栈顶运算符比较优先权后做相应操作,直至整个表达式求值完毕(即OPTR栈的栈顶元素和当前读入的字符均为"#")。

(2)该程序实现表达式的求值问题:从键盘读入一个合法的算术表达式,利用算符优先关系,实现对算术四则混合运算的求值,输出正确的结果。

3 概要设计3.1抽象数据类型定义设定栈抽象数据类型的定义采用两个栈的入栈与出栈的操作来进行“运算符和操作数的配对”。

程序中主要用到以下抽象数据类型:1)ADT Stack {数据对象:D={ ai | ai∈ElemSet, i=2,...,n,n≥0 }数据关系:R1={ <ai-1, ai >| ai-1, ai∈D, i=2,...,n }约定an端为栈顶,a1端为栈底。

数据结构课程设计-表达式求值【完整版】

数据结构课程设计-表达式求值【完整版】

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

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

引入表达式起始、结束符就是为了方便.编程利用“算符优先法”求算术表达式得值.二、程序得主要功能(1)从键盘读入一个合法得算术表达式,输出正确得结果。

(2)显示输入序列与栈得变化过程。

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

(1)运算符栈部分:struct SqStack //定义栈{char *base; //栈底指针char *top; //栈顶指针intstacksize; //栈得长度};intInitStack (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{ﻩ printf("运算符栈为空!\n");ﻩ return ERROR;}elsee=*(s、top-1); //栈不为空得时候用e做返回值,返回S得栈顶元素,并返回OK returnOK;}int Push(SqStack&s,char e) //运算符入栈{if (s、top—s、base >= s、stacksize)ﻩ{printf("运算符栈满!\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{printf("运算符栈为空!\n”);ﻩ return ERROR;}else{ﻩﻩe=*-—s、top;//栈不为空得时候用e做返回值,删除S得栈顶元素,并返回OK return OK;}}int StackTraverse(SqStack&s)//运算符栈得遍历{ﻩchar *t;ﻩt=s、base;ﻩif (s、top==s、base){ﻩ printf(”运算符栈为空!\n”); //栈为空栈得时候返回ERRORreturn ERROR;}while(t!=s、top){ﻩﻩprintf(" %c",*t); //栈不为空得时候依次取出栈内元素t++;ﻩ}return ERROR;}(2)数字栈部分:struct SqStackn//定义数栈{int *base; //栈底指针int*top; //栈顶指针int stacksize; //栈得长度};intInitStackn (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){printf("运算数栈为空!\n");//栈为空得时候返回ERRORﻩ return ERROR;}elseﻩe=*(s、top-1);//栈不为空得时候,用e作返回值,返回S得栈顶元素,并返回OKreturnOK;}int Pushn(SqStackn &s,int e) //数栈入栈{if(s、top—s、base>=s、stacksize){ﻩﻩprintf("运算数栈满!\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; //栈顶指针变化returnOK;}int Popn(SqStackn &s,int &e)//数栈出栈{ﻩif (s、top==s、base){ﻩ printf("运算符栈为空!\n");//栈为空栈得视时候,返回ERRORﻩ return ERROR;ﻩ}else{ﻩﻩe=*—-s、top;//栈不空得时候,则删除S得栈顶元素,用e返回其值,并返回OK ﻩreturnOK;}}int StackTraversen(SqStackn &s)//数栈遍历{ﻩint*t;ﻩt=s、base ;ﻩif(s、top==s、base)ﻩ{printf("运算数栈为空!\n”);//栈为空栈得时候返回ERRORﻩ return ERROR;ﻩ}ﻩwhile(t!=s、top)ﻩ{printf(” %d”,*t); //栈不为空得时候依次输出t++;}return ERROR;}五、算法及时间复杂度1、算法:建立两个不同类型得空栈,先把一个‘#’压入运算符栈。

表达式求值c++ 数据结构课设报告

表达式求值c++  数据结构课设报告

数据结构课程设计院别计算机与通信工程学院专业计算机科学与技术班级学号姓名指导教师成绩2013 年7 月18 日目录一、设计课题 (3)二、需求分析 (3)三、算法设计 (3)四、调试分析 (9)五、用户手册 (10)六、测试结果 (10)七、附录(源代码) (13)八、参考文献 (21)一、设计课题: 表达式求值 二、需求分析:当用户输入一个合法的算术表达式后,能够返回正确的结果。

能够计算的运算符包括:加、减、乘、除、括号;能够计算的操作数要求在实数范围内;对于异常表达式能给出错误提示。

三、算法设计:概要说明:为实现上述程序功能,1. 首先置操作数栈为空栈,表达式起始符#为运算符栈的栈底元素;2. 依次扫描表达式中每个字符,若是操作数则进OPND 栈;若是运算符,则和OPTR 栈的栈顶运算符比较优先权后作相应操作,直至整个表达式求值完毕。

3. 先做一个适合个位的+-*/运算, 其次就要考虑到对n 位和小数点的运算。

模块间调用关系:调用主程序模块————>输出模块详细说明(ADT 描述) :ADT SqStack{数据对象:D={i a |i a ∈ElemSet,i=1,2,…,n, n ≧0} 数据对象:R1={<1,-i i a a >|1-i a ,D a i ∈,i=2,…,n}约定n a 端为栈顶,i a 端为栈底。

基本操作:InitStack(&S)操作结果:构造一个空栈S 。

GetTop(S)初始条件:栈S 已存在。

操作结果:用P 返回S 的栈顶元素。

Push(&S ,e)初始条件:栈S 已存在。

操作结果:插入元素ch 为新的栈顶元素。

Pop(&S ,e)初始条件:栈S 已存在。

操作结果:删除S 的栈顶元素。

In(c)操作结果:判断字符是否是运算符,运算符即返回1。

Precede(c1, c2)初始条件:c1,c2为运算符。

操作结果:判断运算符优先权,返回优先权高的。

表达式求值课程设计

表达式求值课程设计

表达式求值课程设计一、课程目标知识目标:1. 学生能理解并掌握表达式求值的基本概念和方法。

2. 学生能运用算术运算规则,正确进行整式和分式的求值。

3. 学生了解代数式中字母所表示的含义,能进行简单的代数式求值。

技能目标:1. 学生能运用所学知识解决实际问题,构建并简化表达式。

2. 学生通过练习,提高逻辑思维能力和解决问题的能力。

3. 学生学会使用计算器或其他工具进行表达式求值,提高计算速度和准确性。

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

2. 学生在合作学习中培养团队精神和沟通能力,学会尊重他人意见。

3. 学生在解决问题过程中,培养勇于尝试、克服困难的信心和毅力。

课程性质:本课程为初中数学表达式求值部分,强调理论与实践相结合,注重培养学生的计算能力和逻辑思维能力。

学生特点:学生处于初中阶段,具有一定的数学基础和逻辑思维能力,但个别学生可能对数学存在恐惧心理,需要鼓励和引导。

教学要求:结合学生特点,采用启发式教学,引导学生主动参与课堂,通过实例讲解、练习巩固、拓展提高等环节,帮助学生掌握表达式求值的方法和技巧。

同时,关注学生的情感态度,激发学生的学习兴趣,培养良好的学习习惯。

在教学过程中,将课程目标分解为具体的学习成果,便于教学设计和评估。

二、教学内容1. 表达式求值的基本概念:通过课本第二章第三节的内容,讲解表达式求值的定义和意义,使学生理解表达式求值在数学中的应用。

- 整式求值:介绍整式的组成,以及如何代入数值进行求值。

- 分式求值:讲解分式的性质,以及如何代入数值计算分式的值。

2. 算术运算规则的应用:结合课本第二章第四节,复习加减乘除等基本运算规则,并应用于表达式求值。

- 运算顺序:强调运算顺序对求值结果的影响,介绍括号的使用。

3. 代数式求值:利用课本第二章第五节,引导学生理解代数式中字母的含义,并进行简单的代数式求值。

- 代数式的代入:学会将字母代表的数值代入代数式中进行求值。

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

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

实验表达式求值问题1. 问题描述表达式是数据运算的基本形式。

人们的书写习惯是中缀式,如:11+22* (7-4 )/3. 中缀式的计算按运算符的优先级及括号优先的原则,相同级别从左到右进行计算。

表达式还有后缀表达式(如:11 22 7 4 - * 3 / + )和前缀表达式(+ 11 / * 22 - 7 4 3 )。

后缀表达式和前缀表达式中没有括号,给计算带来方便。

如后缀表达式计算时按运算符出现的先后进行计算。

本设计的主要任务是进行表达式形式的转换及不同形式的表达式计算。

2. 数据结构设计1)顺序栈类定义:首先应在类中定义成员函数,以此来完成顺序栈的相关操作,如下:class SqStackprivate:T *base; // 栈底指针int top; // 栈顶int stacksize; // 栈容量public:SqStack(int m); // 构建函数~SqStack(){delete [] base;top=0;stacksize=0;} // 析构函数void Push(T x); // 入栈T Pop(); // 出栈T GetTop(); // 获取栈顶元素int StackEmpty(); // 测栈空void ClearStack(); // 清空栈void StackTop(); // 返回栈顶指针void StackTranverse(); // 显示栈中元素};2)顺序栈类实现:对顺序栈进行初始化,初始化的首要操作就是创建一个空顺序栈。

Step1 :申请一组连续的内存空间为顺序栈使用:base=new T[m];i f(base==NULL)cout<<" 栈创建失败,退出!"<<endl; exit(1);}{Step2 :给栈顶、栈容量赋相应的值:stacksize=m;t op=-1;(2)顺序栈入栈:入栈需要在栈顶插入一个新元素并相应的调整栈顶。

表达式求值课程设计c++

表达式求值课程设计c++

表达式求值课程设计1. 项目背景表达式求值是计算机科学中一个重要的基础概念,也是众多编程语言中必不可少的组成部分。

表达式求值的过程可以理解为将一个表达式中包含的运算符和操作数按照一定的规则进行计算,最终得到一个结果。

在计算机编程中,表达式求值广泛应用于各种场景,例如变量赋值、函数调用、循环控制、条件判断等。

2. 项目目标本课程设计旨在实现一个表达式求值器,能够解析和求值各种形式的表达式。

表达式求值器的主要功能包括:•支持多种运算符,包括算术运算符、逻辑运算符、关系运算符等。

•支持多种操作数,包括常量、变量、函数调用等。

•支持括号,以便对表达式进行分组。

•支持各种表达式,包括算术表达式、逻辑表达式、关系表达式等。

3. 项目实现表达式求值器可以按照以下步骤实现:1.词法分析:将表达式字符串解析为一系列标记(token),每个标记代表一个运算符、操作数或括号。

2.语法分析:将标记序列解析为一个语法树,语法树代表表达式的结构。

3.语义分析:对语法树进行语义检查,确保表达式是合法的。

4.代码生成:将语法树转换为计算机可以执行的代码。

5.代码执行:执行生成的代码,得到表达式的值。

4. 项目测试表达式求值器可以按照以下方法进行测试:1.单元测试:编写单元测试用例,测试表达式求值器的各种功能。

2.集成测试:将表达式求值器集成到其他程序中,测试表达式求值器在实际应用中的表现。

3.性能测试:测试表达式求值器的性能,包括执行速度和内存消耗等。

5. 项目总结表达式求值器是一个重要的计算机科学基础项目,可以帮助学生理解表达式求值的过程和原理,并掌握表达式求值器如何实现。

本项目设计实现了表达式求值器,支持多种运算符、操作数和表达式,并通过单元测试、集成测试和性能测试对表达式求值器进行了全面的测试。

通过本项目设计,学生可以提高自己的编程能力和对表达式求值原理的理解。

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

数据结构课程设计报告-表达式求值
OPTR->top--;
}
double Calculate(double a,double b,char c){ //进行二元运算
double result;
switch(c){
case '+':result=a+b;break;
case '-':result=a-b;break;
case '*':result=a*b;break;
void PushNum(OPND *OPND,double num){ //操作数进栈
OPND->top++;
OPND->array[OPND->top-1]=num;
}
void PopNum(OPND *OPND,double *num){ //操作数出栈
*num=OPND->array[OPND->top-1];
default:priority='E';
}
return priority;
}
void Process(OPND *OPND,OPTR *OPTR,char x){ //计算表达式
double a,b;char c;
static double tempnum=0.00000000;
static int len=10; //用于各数位上的值的转换
double array[N];
int top;//栈顶指针
}OPND;
typedef struct{ //定义运算符栈
char array[N];
int top;//栈顶指针
}OPTR;
int Cint(char mychar){ //将字符0-9转换成数值

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

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

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

参考文献附录 (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. ........................................................................................ 依次找到表达式最内层括号,次内层括号............... 每次找到括号内的表达式,便将其进行只有加减乘除运算的计算。

表达式求值的课程设计

表达式求值的课程设计

表达式求值的课程设计一、课程目标知识目标:1. 理解并掌握算术表达式的组成要素,包括运算符、变量和常量。

2. 学会运用算术运算规则,正确进行表达式的求值。

3. 掌握基本的算术优先级原则,并能运用到复杂的表达式求值中。

技能目标:1. 能够根据给定的算术表达式,准确地识别各组成元素及其作用。

2. 能够运用所学知识,完成简单到复杂算术表达式的求值,包括整数和小数的混合运算。

3. 能够分析并解决求值过程中出现的问题,提高逻辑思维和问题解决能力。

情感态度价值观目标:1. 培养学生对数学表达式的兴趣,激发学习数学的热情。

2. 培养学生细心、耐心和严谨的学习态度,对待每个求值步骤都能认真负责。

3. 培养学生的合作意识,通过小组讨论和交流,共同解决问题,提高团队协作能力。

分析课程性质、学生特点和教学要求,将目标分解为具体学习成果:1. 通过课堂讲解和实例分析,确保学生理解算术表达式的组成和求值规则。

2. 通过课堂练习和课后作业,让学生掌握不同类型的算术表达式的求值方法。

3. 通过小组讨论和问题解答,培养学生主动思考、合作解决问题的能力。

4. 结合实际情境,设计有趣的教学活动,提高学生对数学学科的兴趣和热情。

本节教学内容围绕算术表达式的求值,依据课程目标进行选择和组织。

主要包括以下几部分:1. 算术表达式的组成:介绍表达式中的运算符、变量和常量的概念,让学生了解各元素在表达式中的作用。

2. 算术运算规则:讲解加、减、乘、除等基本运算的法则,以及运算的优先级原则。

3. 表达式求值方法:教授从左到右的求值顺序,以及括号改变运算优先级的方法。

4. 混合运算表达式求值:涵盖整数、小数和分数的混合运算,使学生掌握不同类型数据的运算规则。

5. 复杂表达式求值:引导学生运用所学知识解决包含多个运算符和括号的复杂表达式的求值问题。

教学内容安排和进度:第一课时:算术表达式的组成、基本运算规则及优先级原则。

第二课时:简单表达式的求值方法,以及混合运算表达式的求值。

数据结构课程设计说明书(表达式求值)

数据结构课程设计说明书(表达式求值)

**大学数据结构课程设计说明书学生姓名:***学号: **********学院: **********学院专业: 网络工程题目: 利用栈求表达式的值成绩指导教师******2009 年 7 月 9 日1.设计目的数据结构课程设计的目的是,通过设计掌握数据结构课程中学到的基本理论和算法并综合运用于解决实际问题中,它是理论与实践相结合的重要过程。

设计要求学会如何对实际问题定义相关数据结构,并采用恰当的设计方法和算法解决问题,同时训练学生进行复杂程序设计的技能和培养良好的程序设计习惯。

2.设计内容和要求利用栈求解表达式的值。

设计内容:1)建立试题库文件,随机产生n个题目;2)题目涉及加减乘除,带括弧的混合运算;3)利用栈求解表达式的值;4)随时可以退出;5)保留历史分数,能回顾历史,给出与历史分数比较后的评价基本要求:1)系统功能的完善;2)代码中有必要的注释3.本设计所采用的数据结构栈的数组表示方法(静态分配整型指针)typedef struct{typedef data[MAXSIZE];int top;};4.功能模块详细设计1.功能一:中缀表达式转化为后缀表达式;2.功能二:后缀表达式求值;3.功能三:文件读写;4.功能四:作业评分;5.功能五:历史成绩本次成绩比较;6.功能六:输入“~”符号退出程序4.1 详细设计思想1.首先实现表达式的求值:要用栈求解一个表达式,就要将这个表达式翻译成正确求值的一个机器指令序列,即正确解释表达式,了解算术四则混合运算的规则:(1).先乘除,后加减;(2).从左算到右;(3).先括号内,后括号外再根据这个运算优先的规定来实现对表达式的编译或解释执行.任何一个表达式都是由操作数(st)和操作符(op)组成的,根据四则运算基本法则,在运算的每一步中,任意两个相继出现的操作符op1和op2之间的优先关系最多有以下3种:(1).op1的优先级低于op2(2).op1的优先级等于op2(3).op1的优先级小于op2为实现运算符优先,可以使用两个操作栈,操作栈st,用于存放操作数及运算结果;操作栈op,用于存放操作符。

数据结构(C语言版)课程设计报告表达式求值说明书

数据结构(C语言版)课程设计报告表达式求值说明书

数据结构(C语言版)课程设计报告表达式求值说明书XX大学数据结构课程设计说明书题目:表达式求值院系:计算机科学与工程学院专业班级:计算机班学号:学生姓名:指导教师:2021年X月X日XX大学课程设计(论文)任务书计算机科学与工程学院学号学生姓名专业(班级)设计题目表达式求值设计技术参数系统平台:Windows7/WindowsXP开发工具:VC++6.0设计要求(1)能够计算的运算符包括:加、减、乘、除、圆括号。

(2)能够计算的数要求在实数范围内。

(3)能执行多重括号嵌套运算。

(4)对于异常表达式给出错误提示。

工作量课程设计报告要求不少于3000字。

源程序要求不少于300行工作计划2021.11.21-12.01根据课程设计大纲的要求,查找相关资料,完成需求分析;2021.12.02-12.16进行系统的概要设计;2021.12.17-12.31进行系统的详细设计和源代码的书写;2021.01.01-01.17对系统进行调试分析,写出课程设计报告。

参考资料[1]何钦铭主编.C语言程序设计.北京:高等教育出版社,2021.[2]谭浩强编著.C程序设计(第四版).北京:清华大学出版社,2021.[3]严蔚敏,吴伟民编著.数据结构(C语言版)北京:清华大学出版社,2021.[4]严蔚敏,吴伟民编著.数据结构题集北京:清华大学出版社,2021.指导教师签字教研室主任签字2021年X月X日学生姓名:学号:专业班级:课程设计题目:表达式求值指导教师评语:成绩:指导教师:年月日XX大学课程设计(论文)成绩评定表目录1需求分析12概要设计12.1设计思路12.2存储结构设计12.3功能模块设计13详细设计14运行与测试15总结1参考文献2(要求:给出一级目录和二级目录,宋体,四号字,1.5倍行距,页码使用罗马数字,居中)(报告正文部分):(要求:正文部分一律用小四号字,宋体,行距20磅。

一级标题靠左,加粗。

二级大标题靠左,不加粗。

课程设计表达式求值

课程设计表达式求值

课程设计报告课程名称:数据结构课程设计课程设计题目:表达式求值问题姓名:余明旭系:计算机科学与技术专业:计算机科学与技术年级:2010级学号:100310236指导教师:陈老师职称:学生详细设计此算法的基本思想:首先置操作数栈OPS为空栈,表达式起始符“#”为运算符的栈底元素;依次读入表达式中每个字符,若是操作数则进栈,若是运算符则和OPF栈的栈顶运算符比较优先权作相应操作,直至整个表达式求值完毕(即OPF栈的栈顶元素和当前读入的字符均为“#”)此算法的伪代码:ElementType EvaluateExpression(char *exp){ 定义两个字符变量c和ch,c代表输入表达式中的字符,ch代表栈顶运算符;定义字符指针*p,*q,*temp;temp指向运算符后面的一个字符double i=0,a=0,b=0;将传入的实参赋给p,q;定义一个运算符栈OPF;定义一个操作数栈OPS;调用函数InitStack()初始化栈OPS;调用函数CInitCharStack()初始化栈OPF;调用函数CPush(OPF,'#')将#压入运算符栈;c=*p;temp=p;p++;if(第一个字符就为‘-’){c=*p;temp=p;p++;}while(栈不为空或表达式没有结束){//进入最外层循环if(不是运算符)//则解析数字字符串然后进操作数栈{整数部分m=0;小数部分n=0;while(没有遇到小数点并且为数字字符){ 解析整数部分m }if(遇到小数点){ 解析小数部分c=*p;将p指针移到第一个出现的字符;将q指针指向小数的最后一位;while(p指针不指向’.’){将p指向的字符转为小数np--;}p=q;p++;}if(运算符为‘-’并且运算符前一个为‘(’或者为表达式的开始)调用Push(OPS,-(m+n))将m+n的相反数入栈;else调用Push(OPS,m+n)将m+n入栈;}数字进栈结束else//是运算符时则进栈OPF{ if(运算符为‘-’&&运算符前一个为‘(’){ c=*p;temp=p;p++;}else{ 调用函数CGetTop(OPF,ch)得到OPF的栈顶元素;switch(调用函数Precede(ch,c)判断栈顶元素与接收的字符的优生级别) {case 栈顶运算符优先权低:调用函数CPush(OPF,c)将c入运算符栈;接收下一个字符;case 栈顶运算符优先权高:运算符出栈得到ch;数字栈连续出栈两次得到a,b ;调用Operate(a,ch,b)并将结果入栈到数字栈;break;case 优生权相等:脱括号并接收下一个字符;调用CPop(OPF,ch)脱括号;接收下一个字符;default:接收下一个字符;}退出switch循环}//else1}//else2}//退出最外层while循环调用函数GetTop(OPS,i)得到栈顶元素i;将两个栈消毁;}EvaluateExpression函数结束源代码#include<stdlib.h># include <stdio.h># include <string.h>#define ERROR 0#define OK 1#define TRUE 1#define FALSE 0typedef char ElemType;typedef int Status;typedef double ElementType;typedef int Status;# define STACK_INIT_SIZE 30# define STACKINCREAMENT 10# define NUMBER 30typedef struct node{ElementType data;struct node *next;}StackNode, *LinkStack;void InitStack(LinkStack &head){head=(LinkStack)malloc(sizeof(StackNode));head->next=NULL;}Status IsEmpty(LinkStack head){if(head->next==NULL)return TRUE;else return ERROR;}Status Push(LinkStack &head,ElementType element){//入栈LinkStack p;p=(LinkStack)malloc(sizeof(StackNode));if(p== NULL) return FALSE;p->data=element;p->next=head->next;head->next=p;return OK;}Status Pop(LinkStack &head,ElementType &element){//出栈if(IsEmpty(head))return FALSE;LinkStack temp=head->next;element=temp->data;head->next=temp->next;free(temp);return OK;}Status GetTop(LinkStack head, ElementType &element){ if(head->next==NULL)return ERROR;element =head->next->data;return OK;}Status DestroyStack(LinkStack &head){LinkStack q;while(head){q=head->next;free(head);head=q;}return TRUE;}//这个栈是用来存储符号字符的typedef struct node1{ElemType data;struct node1 *next;}StackCharNode,*LinkCharStack;void CInitCharStack(LinkCharStack &head){head=(LinkCharStack)malloc(sizeof(StackCharNode));head->next=NULL;}Status CIsEmpty(LinkCharStack head){return (head->next==NULL)?TRUE:FALSE;}Status CPush(LinkCharStack &head,ElemType element){LinkCharStack temp=(LinkCharStack)malloc(sizeof(StackCharNode));if(!temp)return ERROR;temp->data=element;temp->next=head->next;head->next=temp;return TRUE;}Status CPop(LinkCharStack &head,ElemType &element){if(CIsEmpty(head))return FALSE;StackCharNode *temp=head->next;element=temp->data;head->next=temp->next;free(temp);return TRUE;}Status CGetTop(LinkCharStack head,ElemType &element){if(head->next!=NULL){element=head->next->data;return TRUE;}element='#';return FALSE;}Status CDestroyStack(LinkCharStack &head){LinkCharStack q;while(head){q=head->next;free(head);head=q;}return TRUE;}//判断ch是否为运算符int Comop(char ch){switch(ch){case '+':case '-':case '*':case '/':case '(':case ')':case '[':case ']':case '{':case '}':case '#':return 1;default:return 0;}}//Comop//比较两个运算符的优先级char Precede(char ch,char c)//ch是栈顶字符,c 是表达式字符{switch(ch){case '+':case '-':if(c=='+'||c=='-'||c==')'||c=='#'||c==')'||c==']'||c=='}')return '>';if(c=='*'||c=='/'||c=='('||c=='['||c=='{')return '<';case '*':case '/':if(c=='+'||c=='-'||c=='*'||c=='/'||c==')'||c==']'||c=='}'||c=='#')return '>';if(c=='('||c=='['||c=='{')return '<';case '(':if(c=='+'||c=='-'||c=='*'||c=='/')return '<';if(c==')')return '=';case ')':if(c=='+'||c=='-'||c=='*'||c=='/'||c==']')return '>';if(c=='#')return '>';case'[':if(c=='+'||c=='-'||c=='*'||c=='/'||c=='(')return '<';if(c==']')return '=';case']':if(c=='+'||c=='-'||c=='*'||c=='/'||c=='}')return '>';if(c=='#')return '>';case'{':if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c=='[')return '<';if(c=='}')return '=';case'}':if(c=='+'||c=='-'||c=='*'||c=='/')return '>';if(c=='#')return '>';case '#':if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c=='['||c=='{')return '<';if(c=='#')return '=';default:return '$';}}//precede//运算函数ElementType Operate(ElementType a,char ch,ElementType b){switch(ch){case '+':return a+b;case '-':return a-b;case '*':return a*b;case '/':if(b==0){return -32767;}return a/b;default:return -32767;}}//Operate//错误提示函数int error(char *str){int i=0;while(str[i]!='#') //主要通过判断所有输入的字符数组str[30]{if( ((str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/'||str[i]=='.')&& //其它函数只要一声明err=1也就说明输入有误(str[i+1]==')'||str[i+1]==']'||str[i+1]=='}'))||((str[i]=='+'||str[i]=='*'||str[i]=='/'||str[i]=='.')&&(str[i-1]=='('||str[i-1]=='['||str[i-1]=='{'))||((str[i]==')' || str[i]==']'||str[i]=='}')&& str[i+1]=='.')||(str[i]=='.' &&( str[i+1]=='('||str[i+1]=='['||str[i+1]=='{'))||(str[i]==')' && str[i+1]=='(')||(str[i]=='(' && str[i+1]==')')||(str[i]=='[' && str[i+1]==']')||(str[i]==']' && str[i+1]=='[')||(str[i]=='{' && str[i+1]=='}')||(str[i]=='}' && str[i+1]=='{')||((str[i]==')'||str[i]==']'||str[i]=='}') && str[i+1]>='0'&&str[i+1]<='9')||((str[i]>='0'&&str[i]<='9'&& (str[i+1]=='('||str[i+1]=='['||str[i+1]=='{'))||(str[0]=='+'||str[0]=='*'||str[0]=='/'||str[0]==')'||str[0]==']'||str[0]=='}')||((str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/'||str[i]=='.')&&(str[i+1]=='+'||str[i+1]=='-'||str[i+1]=='*'||str[i+1]=='/'||str[i+1]=='.'))||(int(str[i])>57&&(int(str[i])!=91 && int(str[i])!=93 && int(str[i])!=123 && int(str[i])!=125))||(str[i]=='/' && str[i+1]=='0')||(int(str[i])>31 && int(str[i])<38)))return 1;else if(str[i]=='#')return 0;i++;}//whilereturn 0;}//错误提示函数//表达式计算函数ElementType EvaluateExpression(char *exp){char c,ch; //c代表输入表达式中的字符,ch代表栈顶运算符char *p,*q,*temp;//temp指向运算符后面的一个字符double i=0,a=0,b=0;p=q=exp;LinkCharStack OPF;//运算符栈LinkStack OPS;//操作数栈CInitCharStack(OPF);CPush(OPF,'#');InitStack(OPS);c=*p;temp=p;p++;if(c=='-'){c=*p;temp=p;p++;}while(c!='#'||!CIsEmpty(OPF)) //栈不为空或表达式没有结束{//*********************进入最外层循环********************* if(!Comop(c))//不是运算符则解析数字字符串然后进操作数栈{double m=0,n=0;while(c!='.'&&c>='0'&&c<='9'){//解析整数部分m=m*10+(c-48);c=*p;p++;}if(c=='.'){//解析小数部分c=*p;while(c>='0'&&c<='9'){p++;c=*p;}q=p;p--;while(*p!='.'){n=n/10+(*p-48)/10.0;p--;}p=q;p++;}if(*(temp-2)=='('&&*(temp-1)=='-'||temp-1==exp) Push(OPS,-(m+n));elsePush(OPS,m+n);}//*****数字进栈结束******else//是运算符时则进栈OPF{if(c=='-'&&*(p-2)=='('){c=*p;temp=p;p++;}else//else1{CGetTop(OPF,ch);switch(Precede(ch,c)){case '<'://栈顶运算符优先权低CPush(OPF,c);c=*p;temp=p;p++;break;case '>'://栈顶运算符优先权高CPop(OPF,ch);Pop(OPS,b);Pop(OPS,a);Push(OPS,Operate(a,ch,b));break;case '='://脱括号并接收下一个字符CPop(OPF,ch);c=*p;temp=p;p++;break;default:c=*p;temp=p;p++;}//switch}//else1}//else2}//退出最外层循环GetTop(OPS,i);DestroyStack(OPS);CDestroyStack(OPF);return i;}//EvaluateExpression函数结束//菜单函数void MenuPrint(){printf("\t\t┌─────────┐\n");printf("\t\t│多功能计算器│\n");printf("\t\t├(a)表达式求解│\n");printf("\t\t├(b)清屏│\n");printf("\t\t├(c)退出│\n");printf("\t\t└─────────┘\n");} //菜单函数//清屏函数void Clear(){ system("cls");MenuPrint();}//清屏函数//main主函数void main(){double result=0;char exp[NUMBER],c;freopen("DS1.in", "r", stdin);freopen("DS1.out", "w", stdout);Clear();printf("\t\t请输入你要进行的操作:\n");while(1){scanf("%c",&c);switch(c){ case 'a':Clear();sr:printf("输入要计算的表达式,以##结束\n");scanf("%s",exp);if(!error(exp)){ result=EvaluateExpression(exp);printf("计算结果为:%lf\n",result);printf("请根据屏幕提示选择要进行的操作:\n");scanf("%d",&c);break;}else if(error(exp)){printf("您输入的表达式有误!");goto sr;}case 'b':Clear();printf("\t\t请输入你要进行的操作:");scanf("%d",&c);break;break;case 'c':system("cls");exit(1);default:printf("输入有误!");}//switch}//while}//main调试分析与结果测试数据组别表达式正确值1 12+(9-8)*7-(-6*5)492 3.14*(67.305-65.305)+3.14 9.423 3+{2*[2*(3+4)]} 314 4.3-{2.5*[9.9/(1.1+2.2)]} -3.25 12-(3-6*7)8-4 错误表达式表达式一运算结果表达式二运行结果表达式三运行结果表达式四运行结果由表二可知以上四组表达式运行结果皆正确。

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

C语言_算数表达式求值_课程设计报告
达式的输入,得出了正确结果,但不排除还有某些漏洞使得一些特殊情况的表达式不能得出正确结果,还有待进一步的测试。
特点:本程序能进行小数、以及2进制、8进制、16进制的运算。
不足:结果都以10进制形式表示,用户不能改变;结果的10进制形式不能超
出longdouble型数据能存储的数的范围;
进一步的设想:将数分段存储,内存动态分配,使其能进行天文数字运算;录入其他的运算符例如指数运算,开方运算,取余运算,解一元一次方程,解二元一次方程组。
三 详细设计
我任务是整个程序的算法设计, 以及部分子函数的编写, 经过其他组员编写的子函数的处理, 将表达式变为一个普通的表达式, 其中数与运算符已经分开,将这个表达式的头指针传递到我所编写函数
中,运算思想为:找到最内层的一对括号, 计算括号间的表达式的值,得到值之后,用这个值替换掉原始位置上的一对括号, 以及其中的表达式。例如(((6.5-2*2.25)*2-6)/2+1.5)+3#,第一次替换后为((2*2-6)/2+1.5)+3#,第二次替换后为(-2/2+1.5)+3#,第三次替换后为0.5+3#,当没有括号时调用四则运算函数直接计算。
Node *node,*head;
Node_ys_char *node_char;
switch(m)
{
case 2:
JiWei=2;
max=50;
break;
case 8:
JiWei=8;
max=56;
break;
case 10:
JiWei=10;
max=97;
break;
case 16:
JiWei=16;
p->c='+';
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计报告书题目:表达式求值学院:数学学院专业:数学与应用数学(统计学方向)学生姓名: ***学生学号: ***指导教师: ***课程编号:课程学分: 2学分起始日期: 2016.1.22表达式求值一、任务与需求本课题应解决的主要问题:从键盘中输入一串运算表达式,由计算机求出表达式的运算结果并输出。

要求输入的表达式为以字符序列形式输入的、语法正确的、不含变量操作数的算术表达式。

要解决上述问题,需要使用数据结构中的堆栈和队列。

表达式中的操作数为正负实数,表达式中的运算符为加(+)、减(-)、乘(*)、除(/)、乘方号(^)、对数(log简写为“l”)、正负号(+,-)、绝对值运算(| |)以及小括号(( )),需要考虑运算符号的优先级。

二、总体设计算术表达式有三种:中缀表达式(如a+b)、前缀表达式(如+ab)、后缀表达式(ab+)。

日常用的算术表达式为中缀表达式,其计算数值时虽令人一目了然,却不易被计算机解释,其主要原因是在中缀表达式中,各运算符的优先级存在不同,不能简单地从表达式的左边直接计算到右边(如a-b/c,若先计算a-b再/c,结果显然不正确)。

由于计算机比较容易解释后缀表达式,故采取的解决方案为:先求出中缀表达式对应的后缀表达式,再让计算机从表达式的左边扫描到右边,同时进行计算即可,而运算的优先顺序在生成后缀表达式时已做考虑,此时已不需要再判断运算符的优先级别顺序。

1、中缀表达式转换成后缀表达式由于中缀表达式运算符有优先级,而后缀表达式中运算的顺序不依赖运算符的优先级,而是依赖于运算符在表达式中的先后顺序。

因此需要借助两个数据结构A、B来储存数据,从左到右扫描中缀表达式,遇到操作数则用A结构先保存,扫描到运算符则用B结构保存。

举例说明,如a*b^c+d,a、b、c、d分别代表一个操作数,先扫描a,把a放到A结构中,然后扫描到“*”号,放到B结构中,再扫描到b,依然放到A结构中,再扫描到“^”号,这时将“^”号与上次扫描的运算符“*”进行优先级比较,“^”号优先级高于“*”,依然将“^”号放进B结构中。

又扫描到c,放到结构A中,然后扫描到“+”号,“+”号优先级小于上一运算符“^”,此时应将“^”从B结构取出并放入A结构中,同时“+”号优先级比“*”小,再将“*”从B结构取出并放入A结构中。

最后扫描到d,d放入A结构中,此时表达式已经扫描完毕,则将B结构中的运算符依次取出,放入A结构中,A结构的最终结果即为后缀表达式,本例为abc^*d+。

从上述分析可知,A结构应为顺序的,先进先出,采用队列结构,B结构是逆序的,后进后出,采用堆栈结构。

本例的A、B结构内容变化如下图图1所示:前面提到了运算符的优先级,加、减、乘、除、幂、取对数运算的优先级好确定,但是小括号的优先级需要另外考虑。

若扫描到左小括号,则直接压入B结构中,若扫描到右小括号,则直接“扔掉”,并将B结构中左小括号之后进栈的运算符逐一放入A结构中,最后将左小括号也出栈“扔掉”。

后面代码中的main函数和Priority函数主要完成优先级判断和处理的功能。

2、后缀表达式的计算得到后缀表达式后,只需对后缀表达式计算便可求出最后的结果。

对后缀表达式的元素进行扫描,原则是扫描时,若遇到的是操作数则暂时保存,若遇到的是运算符则取出两个操作数进行运算。

仍以上例说明,此时后缀表达式为abc^*d+,保存在A结构中。

首先依次扫描到操作数a、b、c,分别放入数据结构C中,扫描到运算符“^”,此时应将C中的后两个操作数取出进行计算,设h=b^c,再将h放入C中。

然后继续扫描到“*”,计算a*h,设为i,将i放入C中。

继续扫描得到d,放入C中,再扫描,得到运算符“+”号,从C中取出i和d,将a+d的结果设为j,将j放进C中,再扫描A 结构,此时A结构已扫描完毕,而C结构只有j,将j从C中取出,j即为输入表达式的最终计算结果。

可以看出,C也是一个逆序结构,后进后出,也用堆栈结构来描述。

本例的A、C结构内容变化如下图图二:三、详细设计1、采用的逻辑结构要解决表达式求值的问题,需要用到栈和队列两种结构。

栈是限制在表的一端进行插入和删除的线性表。

而队列是允许在表的一端进行插入,另一端进行删除的线性表。

通过上述分析,在中缀表达式转换成后缀表达式的过程中,需要建立一个队列结构和一个栈结构。

上述的A结构为队列结构,用于在中缀表达式转换成后缀表达式的过程中储存操作数,转换完成后,A结构中储存的是后缀表达式。

另一方面,B结构为栈结构,用于在中缀表达式转换成后缀表达的过程中进行储存操作符号,转换完成后,B结构为空。

而在后缀表达式求值过程中也需要一个栈结构C,用于在后缀表达式求值过程中储存中间结果。

2、采用的存储结构由于输入的中缀表达式的长度不受限制,为了操作的简便和灵活,栈和队列均采取链式结构存储。

在链栈结构中,结点结构由数据域和指针域组成,top指示栈顶位置,如图3.1所示。

而在链式队列结构中,结点结构也由数据域和指针域组成,分别由头指针(front)和尾指针(rear)指向队列的头和尾,如图3.2所示。

3、采用的算法本程序采用的算法大多是栈和队列的基本运算。

与栈相关的算法有:建立堆栈、判断堆栈是否为空、置空栈、入栈运算、出栈运算、取栈顶元素、计算栈中元素个数。

与队列相关的算法有:建立队列、判断队列是否为空、置空栈、入队运算、出队运算、取队首元素、计算队列中的元素个数。

进行对数运算的算法:利用C语言已有的<math.h>库和数学的运算法则便可进行一切的对数运算。

中缀表达式转换成后缀表达式的算法:完成此算法用到一个队列和一个堆栈。

程序在主函数中完成此功能,用stack_opr为堆栈的栈顶指针,queue_exp为队列的尾指针。

扫描输入的算术表达式,遇到操作数进队列,遇到操作符号进栈。

当算术表达式扫描完毕,把栈中操作符号依次出栈并依次进入队列。

最后,队列中从队首到队尾就是后缀表达式。

后缀表达式的计算算法:完成此算法也用到一个队列和一个堆栈。

用Queue的指针变量q表示队列的头指针,Stack型的指针变量stack_num表示栈顶的指针。

此时后缀表达式保存在队列中,对队列中的元素进行顺序扫描,扫描时遇到操作数则取出暂时存在栈中,遇到运算符则从栈中取两个操作数进行运算,直到队列为空,取出栈中元素便可输出结果。

四、编码#include"stdio.h"#include"conio.h"#include"string.h"#include"stdlib.h"#include"math.h"#include"windows.h"#define Maxsize 200 //输入字符不超过Maxsize数位//定义链式栈typedef struct node{char item[10];struct node*next;}Node;typedef struct stack{Node*top;}Stack;//定义链式队列typedef struct queueNode{char item[10];struct queueNode*next;}QueueNode;typedef struct queue{QueueNode*front;QueueNode*rear;}Queue;//声明函数Stack *CreateStack();//建立堆栈int StackEmpty(Stack*);//判断堆栈是否为空void Push(char*,Stack*);//进栈void Pop(char*,Stack*);//出栈void ClearStack(Stack*);//清空堆栈int StackSize(Stack*);//得到堆栈大小void StackTop(char*,Stack*);//取栈顶元素Node* MakeNode(char*);//申请堆栈元素空间,生成堆栈元素结点QueueNode *MakeQueueNode(char*);//申请队列元素空间,生成队列元素结点Queue *CreateQueue();//建立队列int QueueEmpty(Queue*);//判断队列是否为空void Append(char*,Queue*);//增加队列元素void Serve(char*,Queue*);//队列元素出队int QueueSize(Queue*);//得到队列元素大小void ClearQueue(Queue*);//清空队列void QueueFront(char*,Queue*);//取得队首元素int Priority(char);//得到运算符优先级void PrintQueue(Queue*);//打印队列void PrintStack(Stack*);//打印堆列void Caculate(Queue*);//计算结果double logab(double,double);//进行对数运算//下列函数是创建栈的函数,功能是初始化一个空栈。

Stack*CreateStack(){Stack*s=(Stack*)malloc(sizeof(Stack));if(s==NULL)exit(0);elses->top=NULL;return s;}//下列函数是判断栈是否为空的函数,如果是空栈则返回1,如果不是空栈则返回0。

int StackEmpty(Stack*s){if(!s){printf("\n堆栈不存在!");exit(0);}if(s->top==NULL)return 1;elsereturn 0;}//下列函数的功能是创建一个链栈的结点,并给这个结点的数据域赋值为item所指的字符串。

Node *MakeNode(char*item){Node*pNode;pNode=(Node*)malloc(sizeof(Node));if(!pNode)exit(0);else{strcpy(pNode->item,item);pNode->next=NULL;}return pNode;}//下列函数是进栈函数,功能是一个创建的链栈结点进入栈顶。

void Push(char*item,Stack*s){Node *pNode=MakeNode(item);pNode->next=s->top;s->top=pNode;}//下列函数是出栈函数,功能是栈顶指针所指的结点数据取出,并在栈顶删除这个结点。

相关文档
最新文档