算术表达式求值演示程序

更新时间:2023-12-15 07:39:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

软 件 学 院

课程设计报告书

课程名称 数据结构 设计题目 算术表达式求值演示程序 专业班级 学 号

姓 名 指导教师

2012年 1月

0

目录

1.设计时间 ..................................................... 2 2.设计目的 ..................................................... 2 3.设计任务 ..................................................... 2 4.设计内容 ..................................................... 2 4.1需求分析 ................................................... 2 4.2总体设计 ................................................... 2 4.2.1抽象数据类型的定义 ........................................ 2 4.2.2函数模块说明 .............................................. 3 4.2.3主函数流程图 .............................................. 4 4.2.4函数模块调用关系 .......................................... 5 4.2.5运算符间的优先关系 ........................................ 5 4.3详细设计 ................................................... 6 4.3.1数据类型的定义 ............................................ 6 4.3.2函数调用关系 .............................................. 8 4.3.3主要模块的算法描述 ........................................ 8 4.4测试与分析 ................................................ 10 4.4.1测试 .................................................... 10

word文档 可自由复制编辑

4.4.2分析 .................................................... 11 4.5附录 ...................................................... 11 5.总结与心得体会 .............................................. 16 参考文献 ...................................................... 17 成绩评定 ......................................................

word文档 可自由复制编辑

17

1 设计时间 2012.1.4-2012.1.6 2 设计目的 掌握栈的使用和把一个表达式翻译成能够正确求值的一个机器指令序列的原理。 3设计任务 设计一个程序,演示用算符优先法对算术表达式求值的过程。 4 设计内容 4.1需求分析 1、程序所能达到的功能:能够处理以字符序列的形式输入的不含变量的实数表达式,正确处理负数与小数,判断表达式是还语法正确(包含分母不能为零的情况),正确实现对算术四则混合运算表达式的求值,能够将计算中遇到的问题和结果以文件的形式予以存储。 2、输入的形式和输入值的范围:以字符串的形式输入表达式,以“#”结束。 3、输出的形式:在计算过程中遇到的问题或最终的答案将显示在屏幕上,同时所计算的表达式的最终的结果也将保存在文件中。 4、测试数据:输入“3*(7-2)#”时,输出“15.000000”,测试正确;输入“!(9-2)#”时,输出“输入错误!”,测试正确。 4.2总体设计 4.2.1抽象数据类型定义 ADT Stack{ 数据对象:D={ai |ai∈ElemSet,i=1,2,…,n, n≧0} 数据对象:R1={|ai?1,ai?D,i=2,…,n} 约定an端为栈顶,ai端为栈底。 基本操作: InitStack(&S) 操作结果:构造一个空栈S。 word文档 可自由复制编辑

GetTop(S) 初始条件:栈S已存在。 操作结果:用P返回S的栈顶元素。 Push(&S,ch) 初始条件:栈S已存在。 操作结果:插入元素ch为新的栈顶元素。 Pop(&S) 初始条件:栈S已存在。 操作结果:删除S的栈顶元素。 In(ch) 操作结果:判断字符是否是运算符,运算符即返回1。 Precede(c1, c2) 初始条件:c1,c2为运算符。 操作结果:判断运算符优先权,返回优先权高的。 Operate(a,op,b) 初始条件:a,b为整数,op为运算符。 操作结果:a与b进行运算,op为运算符,返回其值。 num(n) 操作结果:返回操作数的长度。 EvalExpr() 初始条件:输入表达式合法。 操作结果:返回表达式的最终结果。 }ADT Stack 4.2.2函数模块说明 为实现算符优先算法,可以使用两个工作栈。一个称做OPTR,用以寄存运算符;另一个称做OPND,用以寄存操作数或运算结果。算法的基本思想是: (1)首先置操作数栈为空栈,表达式起始符“#”为运算符栈底元素 (2)依次读入表达式中每个字符,若是操作数则进OPND栈,若是运算符则和OPTR栈的栈顶运算符比较优先权后作相应操作,直至整个表达式求值完毕(即OPTR栈的栈顶word文档 可自由复制编辑

元素和当前读入的字符均为“#”)。 算法中还调用了两个函数。其中Precede是判定运算符栈顶运算符θ1与读入的运算符θ2之间优先关系的函数;Operateo为进行二元运算aθb的函数,如果是编译表达式,则产生这个运算的一组相应指令并返回存放结果的中间变量名;如果是解释执行表达式,则直接进行该运算,并返回运算结果。 4.2.3主函数流程图 C!=’#’||GetTop(OPTR)!=’#’ 开始 Char c; SqStack OPTR,OPND;c=getchar() C=getchar() c>=’0’&&c<=’9’ Pop(OPTR,theta);Pop(OPND,b);Pop(OPND,a); Push(OPND,Operate(a,tehta,b)); Precede(GetTop(OPTR),c) Push(OPTR,c) Pop(OPTR,c) Return GetTop(OPND) 结束 word文档 可自由复制编辑

4.2.4函数模块调用关系 主程序模块 栈的建立及初始化模块 判断输入是否结束模块 判断字符类型模块 运算数进栈模块 运算符优先级比较模块 运算符进栈模块 运算符运算数出栈模块 运算模块 输入结束 输出结果 4.2.5运算符间的优先关系 θ1 θ2 + - * / ( ) # + > > > > < > < - > > > > < > < * > > > > < > < / < < > > < > < ( < < < < < < ) > > > > = > # > > > > > = word文档 可自由复制编辑

4.3详细设计 4.3.1数据类型的定义及基本操作 //===== ADT Stack的表示与实现 ===== //----- 栈的顺序存储表示 ----- #define STACK_INIT_SIZT 100; #define STACKINCREMENT 10 typedef struct{ SElemType *base; SElemType *top; int stacksize; }SqStack; //----- 基本操作的算法描述 ----- Status InitStack(SqStack &S){ S.base = (SElemType * )malloc(STACK_INIT_SIZE * sizeof(SElemType)); if(!S.base) exit (OVERFLOW); S.top = S.base; S.stacksize = STACK_INIT_SIZE; return OK; } Status GetTop(SqStack S, SElemType &e){ if(S.top == S.base) return ERROR; e = * (S.top-1); return OK; } Status 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(OVERFLOW); word文档 可自由复制编辑

S.top=S.base+S.stacksize; S.stacksize += STACKINCREMENT; } *S.top++ =e; return OK; } Status Pop(SqStack &S,SElemType &e){ if(S.top == S.base) return ERROR; e = * --S.top; return OK; } OperandType EvaluateExpession(){ InitStack(OPTR); Push(OPTR,’#’); InitStack(OPND); c = getchar(); while(c!’#’||GetTop(OPTR)!=’#’){ if(!In(c,OP)){Push((OPND,c); c = getchar();) else switch(Precede(GetTop(OPTR),c)){ case’<’:Push(OPTR,c); c = getchar(); break; case’=’:Pop(OPTR,x); c = getchar(); break; case’>’:Pop(OPTR,theta); Pop(OPND,b); Pop(OPND,a); Push(OPND,Operate(a,theta,b)); break; } } } word文档 可自由复制编辑

4.3.2函数调用关系 main() SqStack C=getchar() InitStack c Push_N(&OPND,i) switch(Predece(GetTop_T(&OPTR),c)) theta=Pop_T(&OPTR); b=Pop_N(&OPND);a=Pop_N(&OPND); Push_N(&OPND,Operate(a,theta,b)) Push_T(&OPTR,c) GetTop_N(&OPND) 4.3.3主要模块的算法描述 void main(){ SqStack_T OPTR;SqStack_N OPND; float a,b,i; char theta,c,x; InitStack_T(&OPTR);Push_T(&OPTR,’#’); InitStack_N(&OPND); printf(“请输入表达式关以’#’结尾:\\n”); c=getchar(); if(c==35||(c>=40&&c<=43)||c==45||(c>=47&&c<=57)) { word文档 可自由复制编辑

本文来源:https://www.bwwdw.com/article/esj5.html

Top