ImageVerifierCode 换一换
格式:DOCX , 页数:19 ,大小:116.64KB ,
资源ID:22408622      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/22408622.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(表达式求值课程设计报告文档格式.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

表达式求值课程设计报告文档格式.docx

1、运算先乘除,后加减;同级运算从左到右。如下表达式:50+(6*3+2)要求:(1)用C/C+语言编写一个程序将这组学生成绩输入到计算机中,数据运算的存储逻辑结构为栈。(2)程序要能正确处理表达式的优先级、输出正确运算结果。最终设计成果形式为:1、设计好的软件一套;2、撰写一份课程设计说明书一份,打印并装订成册。指导教师(签字): 教研室主任(签字): 批准日期:1 课题描述12 设计思路23 算法设计34 程序代码55 测试及分析.126 总结.13参考文献.131 课题描述 表达式求值是程序设计语言编译中的一个最基本问题。表达式求值在计算机中的实现是栈结构在计算机中的一个典型应用。这里使用“

2、算符优先算法”实现表达式求值。 要把一个表达式翻译成正确求值的一个机器指令序列,或者直接对表达式求值,首先要能够正确解释表达式。例如对表达式求值:首先要了解算术四则运算的规则。即:先算括号内,后算括号外;先乘除后加减;同级运算顺序从左到右;所以,这个表达式的运算顺序为:50+(6*3+2)=50+(18+2)=50+20=70算符优先算法就是根据这个运算优先关系来编译或者解释执行的。2 设计思路2.1表达式的输入:表达式从键盘输入,存入字符串数组中。2.2运算的实现:任何一个表达式都是由操作数(operand)、运算符(operator)和界限符(delimiter)组成的。可以把运算符和界限

3、符统称为算符,根据算术运算规则,在运算的每一步中,任意两个相继出现的算符opt1和opt2之间的优先关系至多是下面三种关系之一:opt1opt2,即opt1的优先级高于opt2。表1定义了算符间的优先关系: Opt2Opt1+-*/()#=NULL表1输入的表达式(包含运算符和操作数)以字符串的形式输入,故需要一个字符串数组存储键盘的输入。在对输入的表达式求值前,应先检查输入的合法性。只有正确的输入才能输出正确的计算结果。算符优先算法运算需要两个栈:操作数栈(OPND)和运算符栈(OPTR)。栈可以采用数组实现,并定义栈的相关操作:初始化、压栈、出栈、判断栈满、判断栈空等相关操作。输入的字符串

4、解析分离出操作数和运算符,分别进入操作数栈和运算符栈。运算始终在栈顶实现,最终操作数栈只剩一个元素,即运算结果。3算法设计使用两个工作栈:一个称作OPTR,用以寄存运算符;另一个称作OPTD,用以寄存操作数或运算结果。算法的基本思想是:(1)置操作数栈为空栈,表达式起始符“#”为运算符栈的栈底元素;(2)依次读入表达式中的每个字符,若是操作数则进入OPND栈,若是运算符则和OPTR栈的栈顶元素比较优先级后进行相应的操作,直至整个表达式求值完毕(即OPTR栈的栈顶元素和当前字符串读入的字符均为“#”)。算法如下:OperandType EvaluateExpression()/算术表达式求值的算

5、符优先算法。OPTR和OPND分别为运算符栈和运算数栈/OP为运算符集合+、-、*、/、(、)、#、. InitStack(OPTR); Push(OPTR, #); InitStack(OPND); c = getchar(); while (c!=# | GetTop(OPTR)!=#) if (!IsOpt(c)Push(OPND, c); /不是运算符则进栈;else switch (Precede(GetTop(OPTR), c) case /退栈并将运算结果入栈 Pop(OPTR, theta); Pop(OPND, b); Pop(OPND, a); Push(OPND, Ope

6、rate(a, theta, b);/switch/whileReturn GetTop(OPND);/EvaluateExpression算法中还调用了两个函数。其中Precede是判定运算符栈的栈顶运算符opt1与读入的运算符opt2之间优先关系的函数;Operate为进行二元运算a opt b的函数,如果是编译表达式,则产生这个运算的一组相应指令并返回存放结果的中间变量名;如果是解释执行表达式,则直接进行该运算,并返回运算的结果。程序流程图如下:4程序代码#if 0/*2015年9月8日09:10:14表达式求值算法算符优先算法的实现*/#endif#define Debuging 0

7、/当值为一时,开启调试#include stdlib.hstring.h#define OVERFLOW -2#define ERROR 0#define INFEASIBLE -1#define OK 1#define TRUE 1#define FALSE 0#define OPERAND double#define OPERATOR char#define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define MAX_QUEUE_SIZE 100#define OPERATORNUM 8 /操作符的数量typedef struct /*定

8、义操作数栈*/ OPERAND * base; OPERAND * top; int iStackSize;OPNDStack, *pOPNDStack; /*定义运算符栈*/ OPERATOR * base; OPERATOR * top;OPTRStack, *pOPTRStack;char cOpt = +, -*/()#.;char cPriority77 = ,=, NULL, NULL, int InitOPNDStack(pOPNDStack S);OPERAND GetOPNDTop(pOPNDStack S);int PushOPND(pOPNDStack, OPERAND

9、e);int PopOPND(pOPNDStack S, OPERAND * e);int InitOPTRStack(pOPTRStack S);OPERATOR GetOPTRTop(pOPTRStack S);int PushOPTR(pOPTRStack S, OPERATOR e);int PopOPTR(pOPTRStack S, OPERATOR * e);OPERAND Operate(OPERAND fOperandA, OPERATOR cOperator, OPERAND fOperandB);OPERAND EvaluateExpression(char * Expre

10、ssion);int WhichOptNum(char opt);int IsOpt(char opt);int CheckExpression(char *Expression);int main(void) /表达式求值算符优先算法 OPERAND e = 0.0; char Expression50 = ; system(color f0); while(OK) fflush(stdin); printf(输入表达式: gets(Expression); strcat(Expression, # /printf(%s, cPriority); if (CheckExpression(Ex

11、pression) e = EvaluateExpression(Expression); printf(Answer = %fn, e); else输入中缀表达式有误!n continue; return 0;/mainint InitOPNDStack(pOPNDStack S) /构造一个空栈,栈内数据类型为OPND(浮点数据) S-base = (OPERAND *)malloc(STACK_INIT_SIZE * sizeof(OPERAND);S-base) exit(OVERFLOW); /这么写错误处理显然还不成熟top = S-base;iStackSize = STACK_

12、INIT_SIZE; return OK;/InitOPNDStackOPERAND GetOPNDTop(pOPNDStack S) /读取栈顶元素,不删除栈顶元素 if (S-top = S- /栈空 return *(S-top - 1);/GetOPNDTopint PushOPND(pOPNDStack S, OPERAND e) /将新的OPND元素入栈,栈满则增加空间top - S-base = S-iStackSize) S-base=(OPERAND*)realloc(S-base, (S-iStackSize+STACKINCREMENT)*sizeof(OPERAND);

13、 if (! exit(OVERFLOW); /空间不够了base + S-iStackSize;iStackSize += STACKINCREMENT;#if Debuging增加OPND空间辣! system(pause /if *(S-top+) = e;/PushOPNDint PopOPND(pOPNDStack S, OPERAND * e) /若栈不空,删除S栈顶元素,并用e返回其值 return ERROR; *e = *(-S-top);/PopOPNDint InitOPTRStack(pOPTRStack S) /构造一个空栈,栈内数据类型为OPTRbase = (OP

14、ERATOR *)malloc(STACK_INIT_SIZE * sizeof(OPERATOR);/InitOPTRStackOPERATOR GetOPTRTop(pOPTRStack S) /栈空/GetOPTRTop/哎。重复造轮子int PushOPTR(pOPTRStack S, OPERATOR e) /将新的OPTR元素入栈,栈满则增加空间base=(OPERATOR*)realloc(S-iStackSize + STACKINCREMENT)*sizeof(OPERATOR); /空间不够增加OPTR空间辣!/PshOPTRint PopOPTR(pOPTRStack S

15、, OPERATOR * e)/PopOPTROPERAND Operate(OPERAND fOperandA, OPERATOR cOperator, OPERAND fOperandB) /将操作数计算后返回 switch (cOperator) case : return (fOperandA + fOperandB); break; return (fOperandA - fOperandB); return (fOperandA * fOperandB); return (fOperandA / fOperandB); default:运算出了BUG。中彩蛋了。 /OperateO

16、PERAND EvaluateExpression(char * Expression) /算符优先算法 OPNDStack NumStack; OPTRStack OptStack; char c = int i = 0; OPERATOR opt = 0; OPERAND tmp = 0.0, fTmp = 0.0, iTmp, j = 0.0, fOperandB, fOperandA; InitOPNDStack(&NumStack); InitOPTRStack(&OptStack); PushOPTR(&OptStack, c = Expressioni+; while(c !=

17、| GetOPTRTop(&OptStack) !)IsOpt(c) fTmp = 0.0; iTmp = c-0 c = Expressioni+; while(! iTmp = iTmp * 10 + c- c = Expressioni+; if (c = for (j = 0.1; !IsOpt(c); j *= 0.1) fTmp += j * (c - c = Expressioni+; /这里不需要了else tmp = iTmp + fTmp; PushOPND(&NumStack, tmp); else switch (cPriorityWhichOptNum(GetOPTR

18、Top(&OptStack)WhichOptNum(c) case PushOPTR(&OptStack, c); break; PopOPTR(&OptStack, &c); /脱括号接收下一字符opt); PopOPND(&NumStack, &fOperandB);fOperandA); PushOPND(&NumStack, Operate(fOperandA, opt, fOperandB); /switch tmp = GetOPNDTop(& free(NumStack.base); free(OptStack.base); return tmp;int WhichOptNum(

19、char opt) /检测操作符所在的位置 for (i = 0; i & Expressioni 9) | IsOpt(Expressioni) if (IsOpt(Expressioni)&IsOpt(Expressioni+1) (Expressioni!Expressioni+1!) return 0; else +i; continue; return 0;Expressioni) return 1;/CheckExpression5 测试及分析在数据范围不溢出的情况下本设计仅可能出现两种情况:(1)输入正确的中缀表达式,输出正确的计算结果。(2)输入错误的中缀表达式,报告输入错误并要求重新输入。表5.1设计的试验结果:输入输出(1)输入正确705+5+5+5+5+5+5354.5*3-(1+2)/110.5(2)输入错误6+8“输入中缀表达式有误”3+dh“输入中缀表

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1