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

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

课程设计

教学院

课程名称

题目

专业

班级

姓名

同组人员

指导教师

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)算符包括加(+)、减(-)、乘(*)、除(/)、乘方(^);另一个称作

OPND,用以寄存操作数和运算结果,操作数可以是float型的浮点数。

算法的基本思想是:

2)首先置操作数栈为空栈,表达式起始符“#”为运算符栈的栈底元素;

依次读入表达式中的每个字符,若是操作数(浮点数)则进OPND栈,

若是运算符(+、—、*、/、^)则和OPTR栈的栈顶运算符比较优先权

后作相应操作,直至整个表达式求值完毕(即OPTR栈的栈顶元素和当

前读入的字符均为“#”)。

3)编写一个原型为void strtofloat(char str[ ],int n,int i),把一

个数字串转换为一个实型数,并压入运算数栈中。(整个程序的源代码

见附录,并有具体解释)

c)数据结构与模块说明

1)主要采用DLL封装和前台MFC界面使用到Layout菜单中的Align功能对各个按钮进行对其,使界面更加整洁。拖出的控件有上面的一个Edit控件用于显示数字,Button控件用于处理鼠标的消息。

2)建立的变量,控件的命名,对应的消息处理函数对应表

double poz; //保存小数点的位置,初始化为1,表示poz-1个小数点。

double m_Dis; //Edit控件上需要显示的数字

BOOL point_flag; //小数点表示位,判定是否是小数,是小数为1,不是小数为0。

double numfirst; //保存计算过程中的前一个数字,

double numsecond;//保存计算过程中的第二个数字

char op;//记录当前的计算符号,可以为’+’,’-’,’*’,’/’,’=’,’c’,’n’

变量初始化:

poz=1;

m_Dis = 0.0;

numfirst=0;

numsecond=0;

op=0;

三详细设计

1:数据结构与模块说明:

设定栈的抽象数据类型定义:

ADT Stack{

数据对象:D={ai|ai属于CharSet,i=1,2,……n,n>=0} 数据关系:R1={|ai-1,ai属于D,i=2,……,n} 基本操作:

InitStack(&S)

操作结果:构造一个空栈。

GetTop(S,&e)

初始条件:栈S已存在。

操作结果:若栈S不空,则以e返回栈顶元素。Push(&S,e)

初始条件:栈S已存在。

操作结果:在栈S的栈顶插入新的栈顶元素e。

Pop(&S,e)

初始条件:栈S已存在。

操作结果:删除S的栈顶元素,并以e 返回其值。

}ADT Stack

2、栈的类型

struct SqStackTR struct SqStackND

{ {

float *base; //栈底指针char *base; //栈底指针

float *top; //栈顶指针char *top; //栈顶指针

int stacksize; //栈的长度int stacksize; //栈的长度

}OPND; //定义运算数栈}OPTR; //定义运算符栈

3、模块说明

按照运算器界面Button的类型,本程序分为三个模块:运算数和运算符事件响应函数

模块、“=”事件响应函数模块、“清除”事件响应函数模块。

(1)运算数和运算符事件响应函数完成的主要功能是向Edit1->Text中输入运算数和运算符,这些Button分别是标有“1”、“2”、“3”,“4”,“5”,“6”,“7”,“8”,“9”,“0”,“.”,

“+”,“-”,“*”,“/”,“(”,“)”,“^”的Button。函数的另外一个任务是把这些字符存入一个事先定义好的全局变量字符型数组s中。举一例说明(其它类同):

void __fastcall TForm1::Button17Click(TObject *Sender)

{

Edit1->Text=Edit1->Text+'('; // 向Edit1->Text中输入运算符“(”

s[m++]='('; //把字符“(”存入数组s,m是全局变量

}

(2)、“=”事件响应函数完成的功能是计算Edit1->Text中表达式的值,并将结果送入文本框Edit2->Text中。这是整个源程序的主体部分。这部分的伪码算法如下:

void __fastcall TForm1::Button12Click(TObject *Sender)

{把“#”送入数组s,“#”就成了数组中的最后一个元素;

初始化字符栈,并把“#”压入字符栈中;

逐个读出字符数组s中的元素;

while(s[m]!=’#’&&GetTopTR(&OPTR)!='#')

{if(读出的不是一个数字)

{直到读入下一个字符是一个字符,就把刚才读入数字串用一个函数名字为strtofloat 的函数转化成一个实型数,并把它压入数字栈中;如果下一个字符是“-”,就作标记tack=0,说明用户没有输入负数}

else

{判断用户是否输入了负数,如果是,就把0压入数字栈中。例如用户输入了(-2.5),程序就把它转化成(0-2.5)进行运算。

switch(Precede(GetTopTR(&OPTR),s[m])) //Precede比较两个运算符的优先级{case '<': PushTR(&OPTR,s[m]); //把s[m]压入符号栈中

m++; //找到下一个符号

break;

case '=': PopTR(&OPTR);m++;break;

case '>': theta=PopTR(&OPTR); //运算符出栈,并赋给theta

num_2=PopND(&OPND); //运算数出栈,并赋给num_2

num_1=PopND(&OPND); //运算数出栈,并赋给num_2

zancun=Operate(num_1,theta,num_2); //运算结果赋给zancun

PushND(&OPND,zancun);break; //把运算结果压入栈中

} //switch语句结束

} // else语句结束

} //while语句结束

把栈顶元素取出并使之显示在文本框Edit2->Text中;

} //“=”事件响应函数结束

(3)、“清除”事件响应函数比较简单,作用是把文本框Edit1->Text和文本框Edit2->Text清空,并准备进行下一个算术表达式的运算。

void __fastcall TForm1::Button20Click(TObject *Sender)

{

Edit1->Clear( ); //清空文本框Edit1->Text

Edit2->Clear( ); //清空文本框Edit2->Text

m=1; //为新的表达式的输入作好准备

}

(所完成的具体功能及用到的算法(详细分析)。

程序流程图:

主要部分的详细流程图)

我所负责的部分算术符优先级的判定。

部分代码如下

char Precede(char x,char y)//运算符优先级判断{

int i,j;

int from[5][5]

={

{0,0,-1,-1,1},

{0,0,-1,-1,1},

{1,1,0,0,1},

{1,1,0,0,1},

{-1,-1,-1,-1,0}

};//定义一个二维数组存放算术符号的优先级switch(x)

{

case '+':i=0;break;

case '-':i=1;break;

case '*':i=2;break;

case '/':i=3;break;

case '#':i=4;break;

}

switch(y)

{

case '+':j=0;break;

case '-':j=1;break;

case '*':j=2;break;

case '/':j=3;break;

case '#':j=4;break;

}

if(from[i][j]==1)//说明运算符i的优先级比j的优先级高

return '>';

if(from[i][j]==-1)

return '<';

else

return '=';

}

程序中用switch将运算符转化为对应的数字,即:+ ——,0,- ——1,*——2,/ ——4,#——5.再用一个二维数组存储优先级,亮两两比较当数组中的元素form[i][j]=0时表示i所对应的运算符的优先级大于j。同理form[i][j]=1时i>j;form[i][j]=-1时i

运算符的优先级如下表

对应的二维数组为:

四程序的调试与运行结果说明1.十进制运算:

2.二进制计算:

3.八进制计算:

4.十六进制计算:

5.多次计算及退出:

五课程设计总结

(是否达到了要求、功能完善、特点、不足、进一步设想、困难及解决途径)本次课程设计在其他同学与我的努力下圆满完成,程序达到了课程设计的要求,本程序主要的功能是实现表达式求值的功能,我们在此基础上添加了可以计算不同进制数所组成的表达式将结果转化为十进制的功能。但由于时间紧张和一

些其他问题,我们的界面仍不够完美。程序仍有可改进的地方,程序可以加入一个新功能,将结果转化为其他进制的数。程序中采用过多的指针,显得有些繁琐,可设两个栈,输入时直接判断是数还是计算符,直接进入不同的栈,没必要先一起存入在分。

通过这段时间的课程设计,本人对计算机的应用、数据结构的作用以及C语言的使用都有了更深的了解。当然也遇到不少问题,也正是国为这些问题引发的思考给我带来了收获。从当初不喜欢上机写程序到现在能主动写程序,从当初拿着程序不知从何下手到现在知道如何分析问题,如何用专业知识解决实际问题的转变。我发现无论是专业知识还是动手能力,自己都有很大程度的提高。在实际上机操作过程中,不仅是让我们了解数据结构的理论知识,更重要的是培养解决实际问题的能力,为后续课程的学习及实践打下良好的基础。这次课程设计让我更加了解学到的C和这个学期学到的数据结构的紧密联系。设计题目不仅要求设计者对课本知识有较深刻的了解,同时要有较强的思维动手能力。这次的课程设计让我有一个深刻的体会:严谨!编程最需要的就是严谨,往往检查到的错误是中文与英文字符没有区分开,还有就是分号等不应该犯错的地方上。程序设计时难免遇到错误,但这不是坏事情,它可以让我发现自己的薄弱环节,在具体操作中还可以巩固所学的C及数据结构。更加体会到了C的语句简洁、使用灵活、执行效率高的特点。

六附录(程序代码)

#include

#include

#include

//用来存储字符的栈的结点类型

typedef struct CharNode

{

char c;

struct CharNode *next;

}CharNode;

//用来存储数字的栈的结点类型

typedef struct IntNode

{

long double i;

struct IntNode *next;

}IntNode;

//

typedef struct Node

{

long double n;

struct Node_ys_char *next;

}Node;

//

typedef struct Node_ys_char

{

char c;

struct Node_ys_char *next_c;

struct Node *next;

}Node_ys_char;

char Precede(char x,char y)//运算符优先级判断{

int i,j;

int from[5][5]

={

{0,0,-1,-1,1},

{0,0,-1,-1,1},

{1,1,0,0,1},

{1,1,0,0,1},

{-1,-1,-1,-1,0}

};//定义一个二维数组存放算术符号的优先级switch(x)

{

case '+':i=0;break;

case '-':i=1;break;

case '*':i=2;break;

case '/':i=3;break;

case '#':i=4;break;

}

switch(y)

{

case '+':j=0;break;

case '-':j=1;break;

case '*':j=2;break;

case '/':j=3;break;

case '#':j=4;break;

}

if(from[i][j]==1)//说明运算符i的优先级比j的优先级高return '>';

if(from[i][j]==-1)

return '<';

else

return '=';

}

//建立寄存器栈,并能从键盘输入无限个字符存入栈CharNode *CreatRegister()

{

CharNode *top,*p,*q,*e;

top=(CharNode *)malloc(sizeof(CharNode));

p=q=top;

scanf("%c",&p->c);

scanf("%c",&p->c);

if(q->c=='-')

{

p=(CharNode *)malloc(sizeof(CharNode));

p->c='0';

p->next=q;

top=p;

p=q;

}

if(q->c=='(')

{

e=(CharNode *)malloc(sizeof(CharNode));

e->c='0';

p=(CharNode *)malloc(sizeof(CharNode));

p->c='+';

数据结构课程设计_表达式求值【完整版】[精品文档]

XXXXXX大学《数据结构》课程设计报告 班级: 学号: 姓名: 指导老师:

目录 一算术表达式求值 一、需求分析 二、程序的主要功能 三、程序运行平台 四、数据结构 五、算法及时间复杂度 六、测试用例 七、程序源代码 二感想体会与总结

算术表达式求值 一、需求分析 一个算术表达式是由操作数(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 { printf("运算符栈为空!\n"); return ERROR; } else e=*(s.top-1); //栈不为空的时候用e做返回值,返回S的栈顶元素,并返回OK

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

竭诚为您提供优质文档/双击可除数据结构表达式求值实验报告 篇一:数据结构实验二——算术表达式求值实验报告 《数据结构与数据库》 实验报告 实验题目算术表达式求值 学院:化学与材料科学学院 专业班级:09级材料科学与工程系pb0920603 姓学 邮名:李维谷号:pb09206285箱: liwg@https://www.360docs.net/doc/0e16053445.html,指导教师:贾伯琪 实验时间:20XX年10月10日 一、需要分析 问题描述: 表达式计算是实现程序设计语言的基本问题之一,它的实现是栈的应用的一个典型例子。设计一个程序,演示通过将数学表达式字符串转化为后缀表达式,并通过后缀表达式结合栈的应用实现对算术表达式进行四则混合运算。

问题分析: 在计算机中,算术表达式由常量、变量、运算符和括号组成。由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。因而在程序设计时,借助栈实现。 设置运算符栈(字符型)和运算数栈(浮点型)辅助分析算符优先关系。在读入表达式的字符序列的同时完成运算符和运算数的识别处理,然后进行运算数的数值转换在进行四则运算。 在运算之后输出正确运算结果,输入表达式后演示在求值中运算数栈内的栈顶数据变化过程,最后得到运算结果。 算法规定: 输入形式:一个(:数据结构表达式求值实验报告)算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。为使实验更完善,允许操作数为实数,操作符为(、)、.(表示小数点)、+、-、*、/、^(表示乘方),用#表示结束。 输出形式:演示表达式运算的中间结果和整个表达式的最终结果,以浮点型输出。 程序功能:对实数内的加减乘除乘方运算能正确的运算出结果,并能正确对错误输入和无定义的运算报错,能连续测试多组数据。 测试数据:正确输入:12*(3.6/3+4^2-1)#

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

课程设计报告 题目:算术表达式求值 一、需求分析 1、设计要求: 给定一个算术表达式,通过程序求出最后的结果 1>、从键盘输入要求解的算术表达式; 2>、采用栈结构进行算术表达式的求解过程; 3>、能够判断算术表达式正确与否; 4>、对于错误表达式给出提示; 5>、对于正确的表达式给出最后的结果; 2、设计构想: 为了实现算符优先算法使用两个工作栈,一个称作OPTR,以寄存运算符;另一个称作OPND,用以寄存操作数或运算结果。在操作数和操作符入栈前,通过一个函数来判别,输入的是操作数还是操作符,操作数入OPND,操作符入OPTR。在输入表达式的最后输入‘#’,设定‘#’的优先级最低,代表表达式输入结束。在表达式输入过程中,遇操作数则直接入栈,遇到运算符则与栈顶运算符比较优先级,若当前运算符优先级高,则当前运算符入栈,扫描下一符号;否则栈顶运算符出栈,两操作数出栈,进行运算,所得结果入数栈,重新比较当前运算符与新栈顶运算符。如此重复直到栈顶运算符与当前符号均为‘#’,运算结束。 二、概要设计 1、本程序包含的模块:

(1)栈模块——实现栈抽象数据类型 (2)运算模块——实现数据表达式的运算(3)主程序模块 三、详细设计 (1)栈模块 1、定义栈结构 struct Sqstack

{ elemtype *top;//栈顶元素 elemtype *base; //栈底元素 int stacksize;//栈的大小 }; 2、栈的基本操作 ①初始化栈 status initstack(struct Sqstack &s) { s.base=(elemtype *)malloc(stack_size*sizeof(elemtype)); if(!s.base) return OVERFLOW; s.top=s.base; s.stacksize=stack_size; return OK; } ②入栈 status push(struct Sqstack &s,elemtype e) {

表达式求值课程设计

数据结构课程设计 设计说明书 算术表达式求值问题 学生姓名白子健 学号1318014057 班级计本1302 成绩 指导教师李军 计算机科学与技术系 2015年9月10日

数据结构课程设计评阅书

课程设计任务书 2015—2016学年第一学期 专业:计算机科学与技术学号:1318014057 姓名:白子健 课程设计名称:课程设计Ⅰ---数据结构课程设计 设计题目:表达式求值算法的实现 完成期限:自2015 年9 月 1 日至2015 年9 月12 日共 2 周 设计内容及要求: 算术表达式求值是程序设计语言编译中的一个基本问题,通过栈实现表达式运算优先级的匹配和运算。用C/C++语言编程实现任意算术表达式的求值,设计内容要求如下:(1)表达式共有三种基本表示方法:前缀法、中缀法、后缀法。从表达式的这三种基本方法中任选一种方法进行编程求值。 (2)分析所选的表示方法,根据选定的表示方法确定对应的存储结构和相关算法。 (3)算法要能正确处理算术运算的优先级规则,即: 先括号内,后括号外的规则;运算先乘除,后加减;同级运算从左到右。 如下表达式: 50+(6*3+2) 要求: (1)用C/C++语言编写一个程序将这组学生成绩输入到计算机中,数据运算的存储 逻辑结构为栈。 (2)程序要能正确处理表达式的优先级、输出正确运算结果。 最终设计成果形式为: 1、设计好的软件一套; 2、撰写一份课程设计说明书一份,打印并装订成册。 指导教师(签字):教研室主任(签字): 批准日期:年月日

目录 1 课题描述 (1) 2 设计思路 (2) 3 算法设计 (3) 4 程序代码 (5) 5 测试及分析 (12) 6 总结 (13) 参考文献 (13)

数据结构实验二——算术表达式求值实验报告

《数据结构与数据库》 实验报告 实验题目 算术表达式求值 学院:化学与材料科学学院 专业班级:09级材料科学与工程系PB0920603 姓名:李维谷 学号:PB09206285 邮箱:liwg@https://www.360docs.net/doc/0e16053445.html, 指导教师:贾伯琪 实验时间:2010年10月10日 一、需要分析 问题描述:

表达式计算是实现程序设计语言的基本问题之一,它的实现是栈的应用的一个典型例子。设计一个程序,演示通过将数学表达式字符串转化为后缀表达式,并通过后缀表达式结合栈的应用实现对算术表达式进行四则混合运算。 问题分析: 在计算机中,算术表达式由常量、变量、运算符和括号组成。由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。因而在程序设计时,借助栈实现。 设置运算符栈(字符型)和运算数栈(浮点型)辅助分析算符优先关系。在读入表达式的字符序列的同时完成运算符和运算数的识别处理,然后进行运算数的数值转换在进行四则运算。 在运算之后输出正确运算结果,输入表达式后演示在求值中运算数栈内的栈顶数据变化过程,最后得到运算结果。 算法规定: 输入形式:一个算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。为使实验更完善,允许操作数为实数,操作符为(、)、.(表示小数点)、+、-、*、/、^(表示乘方),用#表示结束。 输出形式:演示表达式运算的中间结果和整个表达式的最终结果,以浮点型输出。 程序功能:对实数内的加减乘除乘方运算能正确的运算出结果,并能正确对错误输入和无定义的运算报错,能连续测试多组数据。 测试数据:正确输入:12*(3.6/3+4^2-1)# 输出结果:194.4

算术表达式求值演示程序

数理学院 课程设计报告书 课程名称数据结构课程设计 设计题目算术表达式求值演示 专业班级 学号 姓名 指导教师

2014 年12 月

4.2.2 基本操作: InitStack(&S) 操作结果:构造一个空栈S。 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 主程序的流程:

EvaluateExpression() 函数实现了对表达式求值的功能,main() 函数直接调用EvaluateExpression() 对输入的表达式求值输出。 4.2.3 函数的调用关系图

4.3 详细设计 4.3.1 ① . Precede(char c1,char c2)判断运算符优先权,返回优先权高的 算符间的优先关系 如下: 算法伪代码如下: char Precede(char c1,char c2) { static char array[49]={ >', '>', '<', '<', '<', '>', '>', >', '>', '<', '<', '<', '>', '>', >', '>', '>', '>', '<', '>', '>', >', '>', '>', '>', '<', '>', '>', <', '<', '<', '<', '<', '=', '!', >', '>', '>', '>', '!', '>', '>', <', '<', '<', '<', '<', '!', '='}; // 用一维数组存储 49 种情况 switch(c1) { /* i 为下面 array 的横标 */ case '+' : i=0;break; case '-' : i=1;break; case '*' : i=2;break;

表达式求值课程设计报告

表达式求值课程设计报告 表达式求值 《数据结构》 课程设计报告 题目: 栈的应用:表达式求值 (系): 信息科学与工程学院院 专业班级: 软件工程1102班学生姓名: 学号: 指导教师: 20 13 年 6 月 8 日至20 13 年 6 月 21 日 表达式求值 目录 目录 (2) 1 概述 (1) 1.1 课程设计目的 (1) 1.2 课程设计内容 (1) 2 系统需求分析 ...................................................... 1 2.1 系统目标 (1) 2.2 主体功能 (1) 2.3 开发环境 (1) 3 系统概要设计 .................................................... 2 3.1 系统的功能模块划分 (2)

3.2 系统流程图 (2) 4系统详细设计 ..................................................... 3 5 测试 ............................................................ 6 5.1 测试方案 (6) 5.2 测试结果 (6) 6 小结 ............................................................ 8 参考文献 .......................................................... 9 附录1 源程序清单 (10) 2 数据结构课程设计报告(2012) 表达式求值 1 概述 1.1 课程设计目的 1(要求学生达到熟练掌握C语言的基本知识和技能。 2(了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力。 3(提高程序设计和调试能力。学生通过上机实习,验证自己设计的算法的正确性。学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改。 4(培养算法分析能力。分析所设计算法的时间复杂度和空间复杂度,进一步提 高程序设计水平。

嵌入式--计算器--实验报告

计算器设计实验报告 一、实验设计主要分工 04009320 文斌:算法设计,LCD显示。 04** 张希:界面(按钮控件)设计,文件内容读取。 共同调试、完善设计。 二、程序设计实现功能效果 (1)支持整数、小数基本加减乘除运算; (2)有优先级的判别计算。优先级由高到低一次为括号运算、乘除运算、加减运算。(3)支持键盘输入和触摸屏输入; (4)能读取指定目录下文本内容(内容为计算表达式)并计算得出结果,将内容和结果显示在LCD上。 程序任务开始后,等待键盘或触摸屏的输入。输入键有0~9数字键、+-*/()运算符、del退格键、clear清屏键、read读指定目录文本内容并计算键、enter'='键、‘.’小数点键。 每当有字符输入时,触摸屏相应键显示“AAA”,100ms后恢复原相应按键符号,同时LCD 屏幕上显示相应字符。当输入'del'键时,屏幕显示去掉最后一位字符。当输入'='号后,得出计算结果,结果显示于表达式的下一行。若是除零错误,则结果显示为“/0ERROR!”。若有非法字符(触摸点不能识别为设计按键符则视为非法字符),则结果输出为“Syntax Error!!”。若表达式有运算符连续输入,则忽略前面的运算符,只取最后一位运算符计算,正常显示数字结果。当输入'clear'键时,情况显示区域。当输入'read'键时,从指定目录文本文件中读取表达式并计算。将表达式内容和计算结果显示在LCD上。 三、程序算法实现 1、计算算法 首先将输入的0~9数字、+-*/()运算符的内容存储于一个全局变量cal[number]中, 表达为中缀表达式。用void str2repol()函数,将输入字符串cal[number]转换成逆波 兰表达式并存于全局数组char repol[maxs]中。str2repol()函数中缀表达式转成逆波兰 后缀表达式算法如下: (1)首先构造一个运算符栈stack[maxs],此运算符在栈内遵循越往栈顶优先级越高的 原则。

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

软件技术基础实验报告 实验名称:表达式计算器 系别:通信工程 年级: 班级: 学生学号: 学生姓名: 《数据结构》课程设计报告 题目简易计算表达式的演示 【题目要求】 要求:实现基本表达式计算的功能 输入:数学表达式,表达式由整数和“+”、“-”、“×”、“/”、“(”、“)”组成输出:表达式的值 基本操作:键入表达式,开始计算,计算过程和结果记录在文档中 难点:括号的处理、乘除的优先级高于加减

1.前言 在计算机中,算术表达式由常量、变量、运算符和括号组成。由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。因而在程序设计时,借助栈实现。 算法输入:一个算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。为简化,规定操作数只能为正整数,操作符为+、-*、/、=,用#表示结束。 算法输出:表达式运算结果。 算法要点:设置运算符栈和运算数栈辅助分析算符优先关系。在读入表达式的字符序列的同时,完成运算符和运算数的识别处理,以及相应运算。 2.概要设计 2.1 数据结构设计 任何一个表达式都是由操作符,运算符和界限符组成的。我们分别用顺序栈来寄存表达式的操作数和运算符。栈是限定于紧仅在表尾进行插入或删除操作的线性表。顺序栈的存储结构是利用一组连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top 指示栈顶元素在顺序栈中的位置,base 为栈底指针,在顺序栈中,它始终指向栈底,即top=base 可作为栈空的标记,每当插入新的栈顶元素时,指针top 增1,删除栈顶元素时,指针top 减1。 2.2 算法设计 为了实现算符优先算法。可以使用两个工作栈。一个称为OPTR ,用以寄存运算符,另一个称做OPND ,用以寄存操作数或运算结果。 1.首先置操作数栈为空栈,表达式起始符”#”为运算符栈的栈底元素; 2.依次读入表达式,若是操作符即进OPND 栈,若是运算符则和OPTR 栈的栈顶运算符比较优先权后作相应的操作,直至整个表达式求值完毕(即OPTR 栈的栈顶元素和当前读入的字符均为”#”)。 2.3 ADT 描述 ADT Stack{ 数据对象: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}

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

实验表达式求值问题 1.问题描述 表达式是数据运算的基本形式。人们的书写习惯是中缀式,如:11+22*(7-4)/3.中缀式的计算按运算符的优先级及括号优先的原则,相同级别从左到右进行计算。表达式还有后缀表达式(如:11 22 7 4 - * 3 / +)和前缀表达式(+ 11 / * 22 - 7 4 3)。后缀表达式 和前缀表达式中没有括号,给计算带来方便。如后缀表达式计算时按运算符出现的先后进行计算。本设计的主要任务是进行表达式形式的转换及不同形式的表达式计算。 2.数据结构设计 (1)顺序栈类定义:首先应在类中定义成员函数,以此来完成顺序栈的相关操作,如下: class SqStack { private: 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<<"栈创建失败,退出!"<

算术表达式语法检查实验报告

中南民族大学计算机科学学院本科课程设计 任务书 设计名称:算术表达式语法检查 指导教师:下达时间: 2015-5-8 学生姓名:学号: 专业: 一、课程设计的基本要求 根据所学知识,编写指定题目的C++语言程序,并规范地完成课程设计报告。通过课程设计,加深对《C++面向对象程序设计》课程所学知识的理解,熟练掌握和巩固C++语言的基本知识和语法规范,掌握C++语言的基础知识,理解面向对象系统的封装性、继承性和多态性;熟练使用C语言中的函数、数组、指针、链表和字符串等基本知识;掌握类的定义、标准String类和向量;理解掌握友元函数和重载操作符,动态数组;理解掌握继承和多态性;掌握模版的使用;能够进行程序调试过程中的异常处理;进一步掌握利用C++进行类的定义和操作方法;进一步掌握类的继承和派生方法;进一步理解虚函数和多态;综合利用上述知识,学习设计并编写面向对象的C++简单应用程序;培养解决复杂任务功能分解方法(自顶向下逐步求精、模块化设计、信息隐藏等)。 学会编制结构清晰、风格良好、数据结构适当的C++语言程序,从而具备利用计算机编程分析解决综合性实际问题的初步能力。 具体要求如下: 1、采取模块化方式进行程序设计,要求程序的功能设计、数据结构设计及整体结构设计合理。学生也可根据自己对题目的理解增加新的功能模块(视情况可另外加分)。 2、系统以菜单界面方式(至少采用文本菜单界面,如能采用图形菜单界面更好)工作,运行界面友好,演示程序以用户和计算机的对话方式进行。 3、程序算法说明清晰,理论分析与计算正确,运行情况良好,实验测试数据无误,容错性强(能对错误输入进行判断控制)。 4、编程风格良好(包括缩进、空行、适当注释、变量名和函数名见名知意,程序容易阅读等); 5、写出规范的课程设计报告,具体要求见相关说明文档。

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

课程设计 教学院 课程名称 题目 专业 班级 姓名 同组人员 指导教师 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)算符包括加(+)、减(-)、乘(*)、除(/)、乘方(^);另一个称作 OPND,用以寄存操作数和运算结果,操作数可以是float型的浮点数。 算法的基本思想是: 2)首先置操作数栈为空栈,表达式起始符“#”为运算符栈的栈底元素; 依次读入表达式中的每个字符,若是操作数(浮点数)则进OPND栈, 若是运算符(+、—、*、/、^)则和OPTR栈的栈顶运算符比较优先权 后作相应操作,直至整个表达式求值完毕(即OPTR栈的栈顶元素和当 前读入的字符均为“#”)。 3)编写一个原型为void strtofloat(char str[ ],int n,int i),把一 个数字串转换为一个实型数,并压入运算数栈中。(整个程序的源代码 见附录,并有具体解释)

表达式求值实验报告

淮海工学院计算机工程学院 课程设计报告 设计名称:数据结构课程设计 选题名称:表达式求值 姓名:学号: 专业班级: 系(院):计算机工程学院 设计时间: 设计地点:软件工程实验室、教室 指导教师评语: 成绩: 签名: 年月日

1.课程设计目的 1、训练学生灵活使用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题。 2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能; 3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力; 4.训练用系统的观点和软件开发一般规范进行软件开发,巩固、深化学生的理论知识,提高编程水平,并在此过程中培养他们严谨的科学态度和良好的工作作风。 2.课程设计任务和要求: 任务 根据教材《数据结构-C语言描述》(耿国华主编)和参考书《数据结构题集(C语言版)》(严蔚敏、吴伟民主编)选择课程设计题目,要求通过设计,在数据结构的逻辑特性和物理表示、数据结构的选择使用、算法的设计及其实现等方面加深对课程基本内容的理解和综合运用。 设计题目从任务书所列选题表中选取,每班每题不得超过2人。 学生自选课题 学生原则上可以结合个人爱好自选课题,要求课题有一定的深度和难度,有一定的算法复杂性,能够巩固数据结构课程所学的知识。学生自选课题需在18周前报课程设计指导教师批准方可生效。 要求: 1、在处理每个题目时,要求从分析题目的需求入手,按设计抽象数据类型、构思算法、通过设计实现抽象数据类型、编制上机程序和上机调试等若干步骤完成题目,最终写出完整的分析报告。前期准备工作完备和否直接影响到后序上机调试工作的效率。在程序设计阶段应尽量利用已有的标准函数,加大代码的重用率。 2、.设计的题目要求达到一定工作量(300行以上代码),并具有一定的深度和难度。 3、程序设计语言推荐使用C/C++,程序书写规范,源程序需加必要的注释; 4、每位同学需提交可独立运行的程序; 5 、每位同学需独立提交设计报告书(每人一份),要求编排格式统一、规范、内容充实,不少于10页(代码不算); 6、课程设计实践作为培养学生动手能力的一种手段,单独考核。 3.课程设计说明书

算术表达式与二叉树

目录 一、系统开发的背景 (1) 二、系统分析与设计 (1) (一)系统功能要求 (1) (二)系统模块结构设计 (1) 三、系统的设计与实现 (3) (一)二叉树的遍历 (3) (二)算术表达式求值 (5) 四、系统测试 (9) (一)测试二叉树遍历函数 (9) (二)测试算术表达式求值函数 (10) 五、总结 (10) 六、附件(代码、部分图表) (10) (一)程序代码 (10) (二)实验截图 (15)

算术表达式与二叉树 一、系统开发的背景 为了方便进行基本的算术运算,减轻对数字较大的数操作时所带来的麻烦,及其在运算过程中错误的避免。因此设计算术表达式与二叉树的程序来解决此问题。 二、系统分析与设计 (一)系统功能要求 由于一个表达式和一棵二叉树之间,存在着自然的对应关系。遍写一个程序,实现基于二叉树表示的算术表达式的操作。算术表达式内可以含有变量(a~z)、常量(0~9)和二元运算符(+,-,*,/,^(乘幂))。 具体实现以下操作: 1以字符序列的形式输入语法正确的前缀表达式并构造表达式。 2用带括弧的中缀表达式输出表达式。 3实现对变量V的赋值(V=c),变量的初值为0。 4对算术表达式E求值。 (二)系统模块结构设计 通过对系统功能的分析,基于二叉树表示的算术表达式的功能 如图(1)所示。

图1:基于二叉树表示的算术表达式的功能图 通过上图的功能分析,把整个系统划分为主要的两大个模块: 1、将语法正确的前缀表达式用二叉树的遍历转换成相应的遍历序列,必要时可以求出此二叉树的结点数及其树的深度。该模块借助函数BiTree Create(BiTree T)创建二叉树,void Preorder(BiTree T) 先序遍历, void InOrder(BiTree T)中序遍历,void PostOrder(BiTree T)后序遍历,int Sumleaf(BiTree T)统计叶结点的数目,int Depth(BiTree T)二叉树的深度6个函数联合来实现; 2、计算中序遍历所得的算术表达式的值。其中先要将扫描得到的中缀表达式转换为后缀表达式,然后利用栈的初始化,进栈与取栈顶元素操作进行对后缀表达式进行计算。该模块借助函数void InitStack(SeqStack *S)初始化栈,int PushStack(SeqStack *S,char e)进栈,int GetTop(SeqStack

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

目录 1.前言 (2) 2.问题描述 (3) 3.总体设计·····················································································错误!未定义书签。 3.1 概要设计 ······························································································错误!未定义书签。 3.1.1 数据结构的选择 (3) 3.1.2 相关功能函数 (3) 3.1.3 函数模块调用关系 (4) 3.2详细设计和编码 (5) 4.运行与测试 (9) 4.1 上机调试 (9) 4.2 算法时间和空间性能分析 (10) 4.3程序运行测试结果 (11) 5. 总结与心得 (13) 5.1设计中难点的总结以及其它解决方案 (13) 5.2 实验心得 (14) 6. 用户使用说明 (16) 7. 参考文献 (16) 8. 附录1(源代码清单) (16) 9. 附录2(成绩评定表) (25) 1

1.前言 课程设计是实践性教学中的一个重要环节,它以某一课程为基础,它可以涉及和课程相关的各个方面,是一门独立于课程之外的特殊课程。课程设计是让同学们对所学的课程更全面的学习和应用,理解和掌握课程的相关知识。《数据结构》是一门重要的专业基础课,是计算机理论和应用的核心基础课程。 在数据结构的学习和课程设计过程中,我发现它要求学生在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面,都必须加深对课程基本内容的理解。同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。对于我们专业来说,虽然说对技术要求不是特别高,但是在实际操作过程中,没有足够的专业知识对于编程来说是远远不可以达到要求的,所以对于这次的课程设计,我们必须要通过自己额外补充知识来完成它。 在这次的课程设计中我选择的题目是表达式的求值演示。它的基本要求是:以字符序列的形式从终端输入语法正确的,不含变量的表达式。利用算符优先关系,实现对算术四则混合运算表达式的求值,并演示在求值中运算符栈、运算数栈、输入字符和主要操作的变化过程。表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的一个典型例子。设计一个程序,演示用算符优先法对算术表达式求值的过程。深入了解栈和队列的特性,以便在解决实际问题中灵活运用它们,同时加深对这种结构的理解和认识。对于表示出栈在每执行一个过程中都要输出它的变化,这点我认为在编程中是比较困难的,以我自身的能力,是不可能在规定的时间内完成任务的,所以我参考了很多有价值的书籍来帮助我完成我的程序设计。 2

C语言程序设计实验报告实验数据类型运算符和表达式

凯里学院C 语言程序设计实验报告 ×××××专业××年级××班,学号××××××姓名××成绩 合作者实验日期年月日 指导教师评阅日期年月日 实验二数据类型、运算符和表达式 一、实验目的: (1)掌握C 语言数据类型,熟悉如何定义一个整型、字符型、实型变量、以及对它们赋值的方法,了解以上类型数据输出时所用的格式转换符。 (2)学会使用C 的有关算术运算符,以及包含这些运算符的表达式,特别是自加(++)和自减(――)运算符的使用。 (3)掌握C 语言的输入和输出函数的使用 (4)进一步熟悉C 程序的编辑、编译、连接和运行的过程,学会使用stepbystep 功能。 (5)认真阅读教材数据类型,算术运算符和表达式,赋值运算符和表达式部分内容。 二、实验内容: (1)输人并运行下面的程序 #include voidmain() { charc1,c2; c1='a'; c2='b'; 装 订 线 装 订 线

printf("%c%c\n",c1,c2); } (2)按习题3.7的要求编程序并上机运行 该题的要求是: 要将“China”译成密码,密码规律是:用原来字母后面的第4个字母代替原来的字母。 例如,字母“A”后面第4个字母是“E”,用“E”代替“A”。因此,“China”应译为“Glmre"。 请编一程序,用赋初值的方法使。cl,c2,c3,c4,c5五个变量的值分别为‘C’、‘h’、‘i’、‘n’、‘a’,经过运算,使cl,c2,c3,c4,c5分别变为‘G’、‘l’、‘m’、‘r’、‘e’,并输出。 三、实验步骤: (1)输人并运行下面的程序 #include voidmain() { charc1,c2; c1='a'; c2='b'; printf("%c%c\n",c1,c2); } ①运行此程序。 程序结果为:

编译原理语法分析 算术表达式

package语法分析; public class displymain { public static void main(String args[]) { new frame(); } } package 语法分析; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; public class frame implements ActionListener{ JFrame frame1; JLabel L1,L2; JButton bt,bt2; JTextField input,result; top_down_grammar a =new top_down_grammar(); public frame() { frame1=new JFrame(""); input=new JTextField(20); result=new JTextField(20); L1=new JLabel("请输入表达式以#结束"); L2=new JLabel("结果是:"); bt=new JButton("语法分析"); bt2=new JButton("关闭"); frame1.setTitle("递归下降子程序分析语法"); frame1.setLayout(new GridLayout(3,1)); frame1.add(L1); frame1.add(input); frame1.add(L2); frame1.add(result); frame1.add(bt); frame1.add(bt2); bt.addActionListener(this); bt2.addActionListener(this); frame1.setSize(500, 500); frame1.setVisible(true); } public void actionPerformed(ActionEvent e) { a.i=0; a.x.str=input.getText();

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

表达式求值 一目的 通过课程设计,巩固和加深对线性表、栈、队列、字符串、树、图、查找、排序等理论知识的理解;掌握现实复杂问题的分析建模和解决方法(包括问题描述、系统分析、设计建模、代码实现、结果分析等);提高利用计算机分析解决综合性实际问题的基本能力。 二需求分析 此次课程设计的目标是能够设计一个程序,演示算术表达式求值的过程。 ①输入的形式和输入值的范围:以字符串的形式输入表达式,以换行符结束; ②输出的形式:在计算过程中遇到的问题或最终的答案将回显到屏幕上,同时所计算的表达式和最终的显示也将保存至文件中; ③程序所能达到的功能:能够处理以字符序列的形式输入的不含变量的实数表达式,正确处理负数与小数,判断表达式是否语法正确(包含分母不能为零的情况),正确实现对算术四则混合运算表达式的求值,能够将计算中遇到的问题和结果以文件的形式予以存储; ④初步的测试计划:当输入正确表达式时,以换行符结束,能得到最终的正确结果;当输入含有非正常符号的错误表达式时,以换行符结束,能得到最终的提示语句;当遇到分数为0的轻快是,能得到提示语句。 三概要设计 1、本程序中用到的数据类型 该设计主要运用的是栈的知识。为实现表达式求值的功能,需分别定义数字栈与符号栈。其结构体定义如下: typedef struct tagstack1{ /*数据栈*/ double* base; /*栈底指针*/ int top; /*栈顶*/ int len; /*栈的容量*/ }STACK1; typedef struct tagstack2{ /*符号栈*/ char* base; /*栈底指针*/ int top; /*栈顶*/ int len; /*栈的容量*/ }STACK2; 为了便于标记程序运行的正确与否,为了便于文件指针的应用,该程序定义了两个全局变量,如下:

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

清华大学数据结构课程实验报告(20 -20 学年第学期) 报告题目:算术表达式求值 任课老师: 专业: 学号: 姓名: 二0一年月日

摘要:现代科学技术高速发展,各种高科技产品频频问世,而各种技术的基础都离不开基本的表达式求值,它虽然简单,但却是任何复杂系统的基本执行操作。栈是一种重要的线性结构,从数据结构的角度看,它是一种特殊的线性表,具有先入先出的特点。而算符优先法的设计恰巧符合先入先出的思想。故我们基于栈这种数据结构,利用算符优先法,来实现简单算术表达式的求值。 关键字:算符优先法;算术表达式;数据结构;栈 一、课题概述 1、问题描述 一个算术表达式是由运算数、运算符、界限符组成。假设操作数是正整数,运算符只含有加“+”、减“-”、乘“*”、除“/”四种二元运算符,界限符有左括号“(”、右括号“)”和表达式起始、结束符“#”。利用算符优先法对算术表达式求值。 2、设计目的 (1)通过该算法的设计思想,熟悉栈的特点和应用方法; (2)通过对算符优先法对算术表达式求值的算法执行过程的演示,理解在执行相应栈的操作时的变化过程。 (3)通过程序设计,进一步熟悉栈的基本运算函数; (4)通过自己动手实现算法,加强从伪码算法到C语言程序的实现能力。3、基本要求: (1)使用栈的顺序存储表示方式; (2)使用算符优先法; (3)用C语言实现; (4)从键盘输入一个符合要求的算术表达式,输出正确的结果。 4、编程实现平台 Microsoft Visual C++ 6.0 二、设计思路及采取方案 1、设计思路: 为了实现算符优先法,可以使用两个工作栈。一个称做OPTR,用以寄存运

算术表达式求值

题目:算术表达式求值问题 内容: 一个算术表达式是由操作数(operand)、运算符(operator)和界限符(delimiter)组成的。假设操作数是正整数,运算符只含加减乘除等四种运算符,界限符有左右括号和表达式起始、结束符“#”,如:#(7+15)*(23-28/4)#。引入表达式起始、结束符是为了方便。编程利用“算符优先法”求算术表达式的值。要求:(1)从键盘读入一个合法的算术表达式,输出正确的结果。(2)显示输入序列和栈的变化过程。选作内容:操作数类型扩充到实数。 一:问题分析和任务定义 1.问题分析: 分析题目并参考书目可以基本了解完成一个算术表达式所存在的问题。对一个表达式来说,由于各种运算符和界限符的运用,运算符和界限符的优先级决定了算术表达式不是简单的从左往右的运算。因此设计算法完成算术表达式时就要考虑各运算符和界限符的优先级,同时还要注意操作数与算符的判断。在算法中要求完成操作数、运算符和界限符的出入栈,运算符和界限符的优先级比较和操作数之间的运算。最后完成的算法要求输入一个算术表达式,能够正确的计算出来它的最后结果并输出。为了不用考虑算符优先级,将输入的中缀表达式转换成后缀表达式。 这样就可以知道实现本程序需要进行的操作: 1)建立空栈,存储信息; 2)运用函数实现出入栈和取栈顶元素操作。 3)将中缀表达式转换成后缀表达式。 4)实现后缀表达式的求解。 5)建立一个函数使中缀表达式能够被有效输入。 本程序的关键是中缀表达式转换成后缀表达式 对于栈的操作(1)建空栈setStack() 运算的结果是将栈顶元素返回。(2)清空栈EmptyStack(),可以用于判断栈内元素的有无,在栈顶元素的输出被使用。(3)入栈push(),出栈pop()和取栈顶元素top()。 2.任务定义 1).本演示程序中,利用栈将输入的中缀表达式转换成后缀表达式,并完成其求解过程来 达到计算表达式的目的。 2).演示程序以用户和计算机的对话方式执行,即在计算机终端上显示"提示信息"之后, 由用户在键盘上输入演示程序中需要输入的数据,以“回车符”为结束标志。相应的输入数据和运算结果显示在其后。 3).程序执行的命令包括: 1)输入任意一个整数表达式;2)是否继续。 4).测试数据 输入一个整数表达式:3+(5*8-9) 输出: 后缀表达式:3 5 8 *9 -+ 结果为:34 继续?(y/n) 二、数据结构的选择和概要设计 算术表达式中各数据元素间存在一种线性关系,设计的数据类型如下:

相关文档
最新文档