03-表达式求值程序-任务书

合集下载

表达式求值问题课程设计

表达式求值问题课程设计

表达式求值问题课程设计一、课程目标知识目标: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(提高程序设计和调试能力。

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

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

表达式求值林德荣计算机一班1025113009

表达式求值林德荣计算机一班1025113009

实验报告题目:表达式求值班级:计算机一班姓名:林德荣学号1025113009一、需求分析1、问题描述:表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的一个典型的例子。

设计一个程序,演示用算符优先法对算术表达式求值的过程。

2、基本要求:以字符序列的形式从终端输入语法正确的、不含变量的整数表达式。

利用教科书表3.1 给出的算符优先关系,实现对算术四则混合运算表达式的求值,并仿照教科书的例3-1 演示在求值中运算符栈、运算数栈、输入字符和主要操作的变化过程。

3、测试数据:教科书例3-1 的算术表达式3*(7-2),以及下列表达式8;1+2+3+4;88-1*5;1024/4*8;(20+2)*(6/2);3-3-3;8/(9-9);2*(6+2*(3+6*(6+6)));(((6+6)*6+3)*2+6)*2;二、概要设计1. 结构定义://*********************************定义数据栈和相关操作typedef struct snode1{char data;snode1 *next;}*linkstack1;; typedef struct snode2{int data;snode2 *next;}*linkstack2;//*******************************定义数据栈及进栈出栈操作typedef struct snode2{int data;snode2 *next;}*linkstack2;2.主要函数:int char_or_int(char c)//************************判断输入的是字符还是数字char precede(char c1,char c2) //*****************************该函数用于比较优先级void fun()//*********************计算实现的函数3.算法思路建立一个数据栈和字符栈,分别存放输入的数字和运算符,同时还要有一个判断运算先级别的函数三.详细设计#include<iostream.h>#include<stdlib.h>//*********************************定义数据栈和相关操作typedef struct snode1{char data;snode1 *next;}*linkstack1;//*******************************定义数据栈及进栈出栈操作void initial1(linkstack1 &s){s=new snode1;s->next=NULL;}void push1(linkstack1 &s,char c){snode1 *p=new snode1;p->data=c;p->next=s->next;s->next=p;}char pop1(linkstack1 &s){if(s->next==NULL){cout<<"栈已空,不可退栈"<<endl;exit(1);}snode1 *p=s->next;s->next=p->next;char c=p->data;delete p;return c;}char get_top_char(linkstack1 &s){return s->next->data;}//*******************************定义数据栈及进栈出栈操作typedef struct snode2{int data;snode2 *next;void initial2(linkstack2 &s){s=new snode2;s->next=NULL;}void push2(linkstack2 &s,int e){snode2 *p=new snode2;p->data=e;p->next=s->next;s->next=p;}int pop2(linkstack2 &s){if(s->next==NULL){cout<<"栈已空!不可退栈"<<endl;exit(1);}snode2 *p=s->next;s->next=p->next;int i=p->data;delete p;return i;cout<<i<<"进占成功"<<endl;}//************************判断输入的是字符还是数字int char_or_int(char c){if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='#')return 1;return 0;}//*****************************该函数用于比较优先级char precede(char c1,char c2){char ch1[7][7]={'>','>','<','<','<','>','>','>','>','<','<','<','>','>','>','>','>','>','<','>','>','>','>','>','>','<','>','>','<','<','<','<','<','=','@','>','>','>','>','@','>','>','<','<','<','<','<','@','='};char ch2[7]={'+','-','*','/','(',')','#'};for(i=0;i<7;i++)if(c1==ch2[i])break;for(j=0;j<7;j++)if(c2==ch2[j])break;return ch1[i][j];}//***********************对出栈的两个数字和字符进行相应的计算并返回计算结果int caculate(char ch,int i,int j){if(ch=='+') return i+j;if(ch=='-') return i-j;if(ch=='*') return j*i;if(ch=='/') return i/j;elseexit(1);}//*********************计算实现的函数void fun(){char ch;linkstack1 optr;initial1(optr);linkstack2 opnd;initial2(opnd);push1(optr,'#');cout<<"请输入表达式,以#号结束:"<<endl;while(1){cin>>ch;if(!char_or_int(ch)){int temp=ch-'0';cin>>ch;while(char_or_int(ch)==0){temp=temp*10+ch-'0';cin>>ch;}push2(opnd,temp);}if(char_or_int(ch)){switch(precede(get_top_char(optr),ch)){case'<':push1(optr,ch);break;case'>':if(ch==')'||ch=='#'){while(1){push2(opnd,caculate(pop1(optr),pop2(opnd),pop2(opnd)));if(get_top_char(optr)=='#')break;if(get_top_char(optr)=='('){pop1(optr);break;}}}else{ push2(opnd,caculate(pop1(optr),pop2(opnd),pop2(opnd)));push1(optr,ch);}break;case'=':pop1(optr);break;case'@':cout<<"输入错误!"<<endl;exit(1);}}if(get_top_char(optr)=='#')break;}cout<<"计算结果为:"<<pop2(opnd)<<endl;}//*******************************主函数void main(){ cout<<" 请输入计算表达式,以#结束"<<endl;fun();}四、测试结果。

表达式求值——精选推荐

表达式求值——精选推荐

数据结构(双语)——项目文档报告用两种方式实现表达式自动计算专业:计算机科学与技术班级:11计2指导教师:****名:**学号:************目录一、设计思想 (02)二、算法流程图 (04)三、源代码 (06)四、运行结果 (13)五、遇到的问题及解决 (14)六、心得体会 (15)一、设计思想第一种算法先把算术表达式转化成后缀表达式,在对后缀表达式进行计算。

首先建立一个符号栈,用于存放字符和字符的优先级别;然后在建立一个数栈,用于辅助后缀表达式的计算;最后在定义一个字符串数组,用于存放后缀表达式。

建立一个计算的函数,该函数用于两个数的计算,在调用这个函数的时候,传入三个参数,两个浮点型参数和一个字符型参数,根据不同的符号进行不同的计算。

定义一个判断优先级别的函数,用于判断两个操作符的优先级别,在根据优先级的不同决定不同的操作。

后缀表达式的取得,对算术表达式字符串进行挨个的扫描,如果是数字或者是小数点,则将数字或者小数点存放到字符数组中,每取完一个数字,则在后面用“|”隔开,如果是操作符,则和栈中得操作符进行比较,若扫描到的符号优先级比栈里的符号优先级低,则栈中元素出栈并存放到字符数组中。

每出一个字符到字符数组中就在后面加“|”分隔。

继续检查栈顶比较优先级,直到栈中元素优先级比扫描到的符号优先级低或者符号栈为空,则将此操作符入栈。

若是“(”则无条件入字符栈,若是“)”则从字符栈中出字符直到遇到“(”为止。

当字符数组扫描到最后的时候,计算并没有结束。

然后得进行字符栈的判断,看是否已经为空栈,若不是空栈,则出栈字符,将字符存放到数组中。

最后字符串数组中存放的就是后缀表达式。

得到后缀表达式后,要用数栈进行后缀表达式的计算,后缀表达式的计算中,对新的数组进行从道到尾的扫描,如果遇到数字,以“|”为标记取出完整的操作数,用辅助数组存放,然后转化成浮点数存放到数栈中,遇到“|”则直接将数组下标往后走。

表达式求值课程设计报告

表达式求值课程设计报告

目录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 数据结构表达式求值是程序设计语言编译中的一个最基本的问题。

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

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

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

数据结构实验报告 表达式求值

数据结构实验报告 表达式求值

(一) 需求分析1、输入的形式和输入值的范围:根据题目要求与提示,先选择你要使用的表达式形式(中缀用1,后缀用0),在输入一个中缀表达式,输入数的范围为int型,此时,程序将计算出表达式的结果。

2、输出的形式:当按照程序要求选择了1或0之后,再输入表达式;如果选择的是1,则程序将自动运算出表达式结果;如果之前选择的是0,则程序将现将中缀表达式转化为后缀表达式并计算出结果。

3、程序所能达到的功能:本程序能计算出含+、-、*、/、(、)等运算符的简单运算。

4、测试数据:输入一个表达式,如果你之前选择的是“中缀表达式”,那么输入5*(4-2)#,那么输出结果是10;如果之前选择的是“后缀表达式”,那么输入5*(4-2)#,那么他将先转换成后缀表达式5 4 2 - * #,再输出结果10。

如果输入表达式没有结束标示符#,如5*(4-2),那将不会输出任何结果,或出现错误结果。

(二) 概要设计为了实现上述操作,应以栈为存储结构。

1.基本操作:(1). int GetTop(SqStack *s)初始条件:栈存在;操作结果:若栈为空,则返回s的栈顶元素;否则返回ERROR。

(2).void Push(SqStack *s,int e)初始条件:栈存在;操作结果:插入e为新的栈顶元素。

(3).int Pop(SqStack *s)初始条件:栈存在;操作结果:若栈不空,则删除之,并返回其值;否则返回REEOR。

(4).void InitStack(SqStack *s)初始条件:栈存在;操作结果:置栈为空。

(5).int Empty(SqStack *s)初始条件:栈存在;操作结果:判定s是否为空栈。

(6).int Operate(int a,char theta, int b)初始条件:操作数a和b存在,且theta是+、-、*、/四则运算;操作结果:返回a与b间theta运算的结果。

(7).int In(char s,char* TestOp)初始条件:s为待判断字符,TestOp为已知的算符集合;操作结果:s为算符集合中的元素则返回1,否则返回0.(8).int ReturnOpOrd(char op,char* TestOp)初始条件:op为待确定运算符,TestOp为已知的算符集合;操作结果:确定运算符类型。

表达式求值算法

一、设计思想1.中缀表达式转换为前缀表达式。

首先创建算术符栈OPTR和表达式栈RESULT并置空,然后依次逆序检查中缀表达式每个字符,不同字符按不同情况处理:(1).若是空格直接跳过。

(2).若是操作数直接压入RESULT栈。

(3).若是‘)’直接存入OPTR栈,等待和它匹配的‘(’出现。

(4).若是‘(’表明括号中的终追表达式已转换完毕,则循环弹出OPTR栈的操作符,并压入RESULT栈,直到取出一个和它匹配的‘)’为止,‘)’出栈丢弃。

(5).若是运算符,如果OPTR栈是空的或者该运算符优先级高于或等于OPTR栈的栈顶运算符则入栈,如果该运算符优先级低,则循环弹出OPTR栈的运算符并存入RESULT,直到遇到栈顶的运算符优先级等于或小于该算法或栈空为止,然后将当前操作符存入OPTR栈。

若表达式扫描完后OPTR栈还有运算符,则依次弹出压入RESULT栈,直至栈空。

最后RESULT栈中的元素依次出栈存入字符串中,并向字符串中写入‘\0’,则字符串中存放的就是前缀表达式。

2.前缀表达式求值。

首先建立一个栈并置空,然后从右到左扫描前缀表达式,从右边第一个字符开始判断,如果当前字符是数字则一直到数字串的末尾再将整个数字串作为一个整体压人栈,如果是运算符,则将栈顶和次栈顶的两个“数字串”出栈并作相应的运算,然后将计算结果入栈。

扫描完前缀式后,栈中剩余的最后一个值就是前缀表达式的值。

3.中缀表达式转换成后缀表达式。

首先创建栈并置空,然后依次检查中缀表达式每个字符,不同字符按不同情况处理:(1).若是操作数,就直接将存入字符串exp[]中。

(2).若是‘(’则将其压入栈中。

(3).若是‘)’则依次弹栈并存入字符串exp[]中,直到遇到取出和它匹配的‘(’为止,‘(’出栈丢弃。

(4).若是操作符,如果栈空或者该操作符的优先级大于栈顶操作符则将其放入到栈中。

如果该操作符的优先级小于等于栈顶操作符则弹出栈中的操作符存入字符串exp[]中,直到该操作符的优先级大于栈顶操作符或栈空,然后将该操作符入栈。

表达式求值算法总结(C++)

表达式求值算法总结(C++)表达式求值,一般采用栈和队列的方式来求值,下面介绍表达式求值的两种算法。

方法一、使用两个栈,一个为操作符栈OPTR(operator),一个是操作数栈OPND(operand)算法过程:当输入3 * ( 4 - 1 * 2 ) + 6 / ( 1 + 1 )时,为简单方便,我们输入时,按照字符的顺序一个一个的处理,比如ch = getchar()。

然后根据ch 的值判断:若ch 是数字,直接压入操作数栈OPND;若ch 是'(',直接入栈OPTR;若ch 是')',若OPTR 和OPND 非空,弹出OPTR的栈顶操作符,弹出OPND栈顶的两个操作数,做运算,然后见个结果压入栈OPND,直到弹出的OPTR栈顶元素时')';若ch 是操作符(比如+, -, *, /),如果OPTR栈顶元素是(,直接入栈OPTR,如果不是'('且OPTR栈非空且栈顶元素操作符的优先级大于ch,那么弹出OPTR的栈顶操作符,并弹出OPND中栈顶的两个元素,做运算,将运算结果入栈OPND,此时,重复这一步操作;否则将ch入栈OPTR;若ch为EOF,说明表达式已经输入完成,判断OPTR是否为空,若非空,一次弹出OPTR 栈顶操作符,并与OPND栈顶两个元素做运算,将运算结果入栈OPND,最后表达式的结果即OPND的栈底元素。

以表达式3 * ( 4 - 1 * 2 ) + 6 / ( 1 + 1 )为例,计算过程如下所示:通过上述的计算过程,写出伪代码如下所示:void GetExpress(Stack * OPTR, Stack * OPND){char ch;while ((ch = getchar ()) != EOF) {if (IsDigit (ch)) {PushStack (OPND, ch);}else if (ch == '(')PushStack (OPTR, ch);else if (ch == ')') {while (!IsStackEmpty(OPTR)) {PopStack (OPTR, op);if (op == ')')break;PopStack (OPND, num2);PopStack (OPND, num1);res = Calc (num1, num2, op);PushStack (OPND, res);}}else if (ch == '+' || ch == '-'|| ch == '*' || ch == '/') {while (!IsStackEmpty (OPTR) && GetTop (OPTR)!='(' && GetTop (OPTR)>ch) { PopStack (OPTR, op);PopStack (OPND, num2);PopStack (OPND, num1);res = Calc (num1, num2, op);PushStack (OPND, res);}if (IsStackEmpty (OPTR) || GetTop(OPTR)=='(')PushStack (OPTR, ch);}}}// 当表达式输入完成后,需要对OPTR栈和OPND中的元素进行运算int GetValue(Stack * OPTR, Stack * OPND){while (!IsStackEmpty (OPTR)) {PopStack (OPTR, op);PopStack (OPND, num2);PopStack (OPND, num1);res = Calc (num1, num2, op);PushStack (OPND, res);}// 最后的操作数栈OPND栈顶元素即是表达式的值return GetTop(OPND);}PS: 上面没有指出表达式非法的情况方法二:采用中缀表达式的方法,求取表达式的中缀表达式,借用一个操作符栈OPTR和中缀表达式队列Queue,求取中缀表达式,然后对中缀表达式求值。

数据结构课程设计_实验报告(一)表达式求值(计算器)

数据结构课程设计实验报告起止时间:2015.12.28-2015.12.311、输入:tan452、输出:13、执行结果::设计过程中遇到的问题及解决办法:问题:算数表达式以字符串输入,操作数和操作符的提取;解决办法:两两操作符之间如有数字将中间的数字提取强制转换成double型;参考文献:(在设计中参考的书籍、网站等资料)1. 朱振元,《数据结构——C++语言描述》,清华大学出版社,2008年,页码:2. /detail/gszhouyi/738777指导老师评议:成绩评定:指导教师签名:附件:(程序源代码)#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>#define N 100#define pai 3.1415926typedef struct yxj{char operat;int rank;}yxj;typedef struct str{char data[N];}zs;void sjhs(void){char s[10],a[10];double y,x;printf("请输入(sin cos tan 角度制)表达式:\n");scanf("%s",s);if(strstr(s,"sin")!=0){int i=0,j=0;while(s[i]!='\0'){if(s[i]>='0'&&s[i]<='9')s[j++]=s[i];i++;}s[j]='\0';x=atof(s);y=sin(x*pai/180);}else if(strstr(s,"cos")!=0){int i=0,j=0;while(s[i]!='\0'){if(s[i]>='0'&&s[i]<='9')s[j++]=s[i];i++;}s[j]='\0';x=atof(s);y=cos(x*pai/180);}else if(strstr(s,"tan")!=0){int i=0,j=0;while(s[i]!='\0'){if(s[i]>='0'&&s[i]<='9')s[j++]=s[i];i++;}s[j]='\0';x=atof(s);y=tan(x*pai/180);}else{printf("格式错误\n");return;}printf("%lf\n",y);printf("*****1、继续*****\n");printf("*****0、返回上一层*****\n");scanf("%s",a);if(strcmp(a,"0")==0)return;else if(strcmp(a,"1")==0)sjhs();elseprintf("没有该选项\n");}void szys(yxj mark[]){yxj os[N];char a[10];char ch;double ns[N];zs zhan[20];int numb[N];int Len,p=0,q=1,i,o=1,n=0;char data[N];os[0]=mark[0];ns[0]=0;printf("请输入算术(+ - * / ^)表达式(以= 结束):\n");scanf("%s",data);if(strcmp(data,"+")==0||strcmp(data,"-")==0||strcmp(data,"*")==0||strcmp(data,"/")==0 ||strcmp(data,"^")==0||strcmp(data,"=")==0){printf("格式错误\n");return;}Len=strlen(data);numb[0]=0;for(i=0;i<20;i++)zhan[i].data[0]='\0';for(i=0;i<Len;i++){int t=0;if((data[i]=='^'||data[i]=='+'||data[i]=='-'||data[i]=='*'||data[i]=='/'||data[i]=='('||data[i]==')'||data[i]=='=')) {int j,k=0;if((data[i]=='='||data[i]=='^'||data[i]=='+'||data[i]=='-'||data[i]=='*'||data[i]=='/')&&(data[i-1]=='^'||data[i-1]=='+'||data[i-1]=='-'||data[i-1]=='*'||data[i-1]=='/')){printf("格式错误\n");return;}numb[q++]=i;while(zhan[(p+k)/2].data[0]!='\0'){k++;}for(j=numb[q-2];j<numb[q-1];j++)if(data[j]>='0'&&data[j]<='9'||data[j]=='.')zhan[(p+k)/2].data[t++]=data[j];zhan[(p+k)/2].data[t]='\0';if(zhan[(p+k)/2].data[0]!='\0')ns[n++]=atof(zhan[(p+k)/2].data);p++;for(j=0;j<8;j++)if(mark[j].operat==data[i])break;while(1){.if(mark[j].operat=='('){os[o++]=mark[j];break;}else if(mark[j].rank>os[o-1].rank&&mark[j].operat!='(') {os[o++]=mark[j];break;}else{double numb1,numb2,numb;switch(ch=os[--o].operat){case '+':{numb1=ns[--n];numb2=ns[--n];numb=numb1+numb2;ns[n++]=numb;break;}case '-':{numb1=ns[--n];numb2=ns[--n];numb=numb2-numb1;ns[n++]=numb;break;}case '*':{numb1=ns[--n];numb2=ns[--n];numb=numb2*numb1;ns[n++]=numb;break;}case '/':{numb1=ns[--n];numb2=ns[--n];if(numb1==0){printf("无效操作\n");return;}else{numb=numb2/numb1;ns[n++]=numb;}break;}case '^':{numb1=ns[--n];numb2=ns[--n];numb=pow(numb2,numb1);ns[n++]=numb;break;}}}}}else if(data[i]>='0'&&data[i]<='9');else if(data[i]=='.');else{printf("格式错误,请重新输入:\n");szys(mark);break;}}printf("%lf\n",ns[0]);printf("*****1、继续*****\n");printf("*****0、返回上一层*****\n");scanf("%s",&a);if(strcmp(a,"0")==0)return;else if(strcmp(a,"1")==0)szys(mark);elseprintf("没有该选项\n");}int main (){yxj mark[9];mark[0].operat='#';mark[0].rank=-1;mark[1].operat='+';mark[1].rank=1;mark[2].operat='-';mark[2].rank=1;mark[3].operat='*';mark[3].rank=2;mark[4].operat='/';mark[4].rank=2;mark[5].operat='(';mark[5].rank=-1;mark[6].operat=')';mark[6].rank=-1;mark[7].operat='=';mark[7].rank=0;mark[8].operat='^';mark[8].rank=3;while(1){char i[10];printf("*****1、四则运算计算器*****\n");printf("*****2、三角函数计算器*****\n");printf("*****0、退出*****\n");scanf("%s",&i);if(strcmp(i,"0")==0)break;else if(strcmp(i,"1")==0)szys(mark);else if(strcmp(i,"2")==0)sjhs();elseprintf("没有该选项\n");}}。

武汉工程大学实验报告03

r = a[++I];
}
Push(S2, x);
}
else
switch (precede(GetTop(S1), r))
{
case -1:
Push(S1, r); r = a[++I]; break;//把运算符放进栈1
case 0:
Pop(S1, ch);
r = a[++I];
//r=a[I];
break; //弹出一个运算符
if (S.up == MAXSIZE)
return ERROR;
S.data[++S.up] = m;
return OK;
}
//出栈
int Pop(LinkStack &S, char &m) {
if (S.up == 0) return ERROR;
m = S.data[S.up];
S.up--;
若字符串postexp扫描完毕,则数值栈op中的栈顶元素就是表达式的值。
实验内容
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<stack>
#define MAXSIZE 100
#define Status int
case 1:
Pop(S1, ch); Pop(S2, x1); Pop(S2, x2);
Push(S2, operate(ch, x2, x1));
//r=a[++I];
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

汇编语言实训 课程设计任务书
题 目: 表达式求值程序 班 级:
学生姓名: 学 号:
学生姓名: 学 号:
学生姓名: 学 号:
题目类型: 软件工程(R) 指导教师: 刘树群

一. 题目简介
该设计要求学生使用汇编语言,设计并开发出针对四则运算表达式进行求值
的命令行或窗口程序。
通过该题目的设计过程,可以培养学生结构化程序设计的思想,加深对汇编
语言基本语言要素和流程结构的理解,针对汇编语言中的重点和难点内容进行训
练,独立完成有一定工作量的程序设计任务,同时强调好的程序设计风格。得到
软件工程的综合训练,提高解决实际问题的能力。

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

三. 主要内容、功能及技术指标
1、实现功能及指标:①使用Win32的窗口程序模式,实现表达式求值程序
及测试界面程序的设计与开发;②支持整数的四则运算、位运算和小括号等;③
使用文本框对表达式进行交互式编辑和输出。
2、问题分析及解决方案框架确定:充分地分析和理解问题本身,弄清要求
做什么。在确定解决方案框架过程中,综合考虑系统功能,考虑怎样使系统结构
清晰、合理、简单和易于调试。最后确定每个过程和函数的简单功能,以及过程
(或函数)之间的调用关系,并画出函数之间的调用关系图。
3、详细设计和编码:定义相应的存储结构,确定各个函数的算法,并画出
流程图,在此基础上进行代码设计,每个明确的功能模块程序一般不超过200
行,否则要进一步划分。
4、完成课程设计报告
① 需求和规格说明:设计题目和问题描述:题目要解决的问题是什么;
② 设计思路:主要算法思想,程序功能图,函数之间的调用关系图;
设计表示:每个函数或过程的功能,列出每个过程或函数所调用的过程
或函数,并画出各函数的流程图;
详细设计:主要算法的伪代码;
③ 调试报告:调试过程中遇到的主要问题,是如何解决的;对设计和编码
的回顾讨论和分析;改进设想;经验和体会等;
④ 程序实现注释;
⑤ 附录:源程序清单和结果。如果题目规定了测试数据,则结果要求包含
这些测试数据和运行输出,当然还可以含其他测试数据和运行输出。

四. 提交的成果
1. 设计说明书一份,内容包括:
1) 中文摘要100字;关键词3-5个;
2) 前言;
3) 系统分析(包含需要的系统流程图);
4) 系统总体设计(包含总体软件结构图、总体数据结构);
5) 详细设计;
6) 系统测试(包含测试方案、测试用例、测试结果及软件可靠性分析);
7) 软件使用说明书(核心界面说明);
8) 设计总结、参考文献、致谢等。
2. 刻制光盘一张。

五. 主要参考文献
1 王爽.汇编语言(第二版).清华大学出版社, 2008。
2 沈美明,温冬婵.IBM-PC汇编语言程序设计(第二版).清华大学出版社, 2001。
3 [美]Kip R.Irvine著,温玉洁,等译.Intel汇编语言程序设计(第五版).电子工
业出版社, 2007。
4 钱晓捷.汇编语言程序设计(第二版). 电子工业出版社, 2003。
5 罗云彬.Windows环境下32位汇编语言程序设计(第二版).电子工业出版社,
2006。
6 Windows API函数参考手册.人民邮电出版社, 2002。

六. 各阶段时间安排(共1周):
日期 内容 地点
星期一 教师讲解设计要求,准备参考资料 机房
星期二 分析系统,方案设计 机房
星期三 方案设计,编程 机房

星期四 编程 机房
星期五 编程,答辩 机房

2016年6月26日

相关文档
最新文档