




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实习报告题目:设计一个演示用运算优先法对算数表达式求值过程的程序。班级: 姓名: 学号: 完成日期: 一、 需求分析1建立运算数栈sqstack1和运算符栈sqstack2辅助分析算符有限关系.2用户输入以“#”结尾的算数表达式,本程序需要用户自行输入表达式(运算符可以是加(+);减(-);乘(*);除(/);括号(),以字符形式读入,在读入的同时,完成运算符和运算数的识别处理,在识别出运算数的同时,要将其字符序列形式转换成整数形式。3在程序的适当位置输出运算符栈、运算数栈、输入字符和主要操作的内容,即演示运算操作。4测试数据见原题。5程序执行的命令包括:(1) 建立算数表达式;(2) 得到运
2、算表达式的值;(3) 演示运算过程。二、 概要设计1. 设定栈的抽象数据类型定义:adt stack数据对象 d ai | ai charset, i=1,2,.,n, n0 数据关系: r1 | ai-1, aid, i=2,.,n (约定an 端为栈顶,a1 端为栈底)基本操作:initstack(&s)操作结果:构造一个空栈s。gettop(s,&e)初始条件:栈s已存在。操作结果:若栈s不空,则以e返回栈顶元素。push(&s,e)初始条件:栈 s 已存在。操作结果:插入元素 e 为新的栈顶元素。pop(&s,&e)初始条件:栈 s 已存在且非空。操作结果:删除 s 的栈顶元素,并用
3、e 返回其值。adt stack2. 本程序包括三个模块(1)主程序模块:void main( )初始化;函数; (2)栈模块实现栈抽象数据类型(3)运算模块实现运算并演示其过程模块各模块之间调用关系如下:主程序模块运算模块栈模块三、详细设计1、 元素类型、结点类型typedef structint *base;int *top;int stacksize;sqstack1;/操作数栈typedef structchar *base;char *top;int stacksize;sqstack2;/操作符栈2、 栈类型typedef structchar *base;char *top;in
4、t stacksize;stack;/栈类型栈的基本操作设置如下:void initstack(stack &s)/初始化,设s为空栈(s.top=null)status gettop(stack s,elemtype e)/若栈s不空,则以e带回栈顶元素并返回true,否则返回falsestatus push(stack&s,elemtype e)/若分配空间成功,则在s的栈顶插入新的栈顶元素e,并返回true,/否则返回false其中部分操作的算法:status push(stack &s,elemtype e)/若分配空间成功,则在s的栈顶插入新的栈顶元素e,并返回true;/否则栈不变
5、,并返回falseif(makenode(p,e) p.next=s.top;s.top=p; s.size+; return true; else return false;status pop(stack &s,elemtype &e)/若栈不空,则删除s的栈顶元素并以e带回其值,且返回true,/否则返回false,且e无意义if(stackempty(s) return false;elsep=s.top;s.top=s.top-next;e=p-:data;s.size-;return true;3、运算代码int operate(int a,char theta,int b) /计
6、算表达式值:主要是将大的表达式转化成小的表达式进行逐步求值 int c;if(theta=+) c=a+b;else if(theta=-) c=a-b;else if(theta=*) c=a*b;else c=a/b;return c;/operateint result(sqstack1 *opnd,sqstack2 *optr) /求值char a=0;char theta;int b,c,number=0;intinitstack(opnd);charinitstack(optr);charpush(optr,#);a=getchar();while(a!=# | chargetto
7、p(optr)!=#) printf(输入字符:%c ,a);if(!in(a)/不是运算符则进栈number=0;while(!in(a)number = number*10 +(a-48);/处理多位整数z=10*x+ya = getchar();intpush(opnd,number); printf(主要操作:push(opnd,%d) ,number);else switch(precede(a,chargettop(optr)case :theta=charpop(optr);c=intpop(opnd);b=intpop(opnd);intpush(opnd,operate(b,
8、theta,c);printf(主要操作:operate(%d,%c,%d) ,b,theta,c);break;printf(opnd栈:%d optr栈:%cn,intgettop(opnd),chargettop(optr);printf(the result is %d.n,intgettop(opnd); /打印输出表达式值return ok;4.主函数和其他函数的代码void main() /主函数,使用自定义函数完成功能 sqstack1 s1,*opnd;sqstack2 s2,*optr;opnd=&s1;optr=&s2;printf(please enter an exp
9、ression with a end of #.n);printf(the expression:);result(opnd,optr);char precede(char a,char b)/运算优先级判断int i,j;char table88= ,+,-,*,/,(,),#,+,-,*,/,(, ,#, ,=,; /优先级表格for(i=0;i8;i+)if(table0i=a) /纵坐标寻找break;for(j=0;j8;j+) /横坐标寻找if(tablej0=b)break;return tableji;int in(char c) /判断c是否为操作符if ( c=( | c=
10、+ | c=- | c = * | c=/ | c=) | c=# | c=)return 1;/如果是操作符返回1elsereturn 0;/不是,返回05函数的调用关系图反映了演示程序的层次结构: mainresultinitstackpushgettopinprecedepop四、调试分析算术表达式求值程序较为庞大,调试花费时间较多,主要是在for循环和while循环时容易出错,对于涉及的循环的操作开始和结束条件设置很关键。五、用户手册1. 本程序开发环境为vc 6.0,运行环境为dos操作系统,执行文件为:1.exe2. 运行该程序后,产生如下图所示的界面:3. 按照提示输入一组表达式
11、。4. 输入完成后,按回车键。5. 屏幕上打印出对应于该表达式的后缀表达式。6. 打印表达式计算结果。六、测试结果1.2.34.七、附录源程序文件名清单:1.cpp /主程序1.exe /可执行文件stdio.h /程序中用到的头文件stdlib.h /程序中用到的头文件string.h /程序中用到的头文件math.h /程序中用到的头文件程序代码:#include #include #include#include#define stack_init_size 100#define stackincrement 10#define error 0#define ok 1/*栈模块typed
12、ef struct sqstack1/运算数栈int *base;int *top;int stacksize;sqstack1; typedef struct sqstack2/运算符栈char *base;char *top;int stacksize;sqstack2; void intinitstack(sqstack1 *s)s-base=(int *)malloc(stack_init_size*sizeof(int);if(!s-base) exit(error);s-top=s-base;s-stacksize=stack_init_size;void charinitstac
13、k(sqstack2 *s)s-base=(char *)malloc(stack_init_size*sizeof(char);if(!s-base) exit(error);s-top=s-base;s-stacksize=stack_init_size;int intgettop(sqstack1 *s) /取栈顶元素 int e;if(*s).top=(*s).base) return 0;e=*(*s).top-1);return e;char chargettop(sqstack2 *s) /取栈顶元素 char e;if(*s).top=(*s).base) return 0;e
14、=*(*s).top-1);return e;int intpush(sqstack1 *s,int e)*(*s).top+=e;return ok;int charpush(sqstack2 *s,char e)*(*s).top+=e;return ok;int intpop(sqstack1 *s)int e;if(*s).top=(*s).base) return 0;e=*-(*s).top;return e;int charpop(sqstack2 *s)char e;if(*s).top=(*s).base) return 0;e=*-(*s).top;return e;/*运
15、算模块char precede(char a,char b)/运算优先级判断int i,j;char table88= ,+,-,*,/,(,),#,+,-,*,/,(, ,#, ,=,; /优先级表格for(i=0;i8;i+)if(table0i=a) /纵坐标寻找break;for(j=0;j8;j+) /横坐标寻找if(tablej0=b)break;return tableji;int operate(int a,char theta,int b) /计算表达式值:主要是将大的表达式转化成小的表达式进行逐步求值 int c;if(theta=+) c=a+b;else if(thet
16、a=-) c=a-b;else if(theta=*) c=a*b;else c=a/b;return c;/operateint in(char c) /判断c是否为操作符if ( c=( | c=+ | c=- | c = * | c=/ | c=) | c=# | c=)return 1;/如果是操作符返回1elsereturn 0;/不是,返回0int result(sqstack1 *opnd,sqstack2 *optr) /求值char a=0;char theta;int b,c,number=0;intinitstack(opnd);charinitstack(optr);c
17、harpush(optr,#);a=getchar();while(a!=# | chargettop(optr)!=#) printf(输入字符:%c ,a);if(!in(a)/不是运算符则进栈number=0;while(!in(a)number = number*10 +(a-48);/处理多位整数z=10*x+ya = getchar();intpush(opnd,number); printf(主要操作:push(opnd,%d) ,number);else switch(precede(a,chargettop(optr)case :theta=charpop(optr);c=intpop(opnd);b=intpop(opnd);intpush(opnd,operate(b,theta,c);printf(主要操作:operate(%d,%c,%d) ,b
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 护厂巡逻管理办法
- 报纸杂志管理办法
- 施工扣分管理办法
- 材料现场管理办法
- 2024年四川省宣汉县急诊医学(副高)考试题含答案
- 村镇规划管理办法
- 执行项目管理办法
- 报刊流通管理办法
- 恩平公园管理办法
- 房产公寓管理办法
- 创伤严重程度(AIS)(ISS)评分表(完整版)
- 仓储业务基础知识培训课件
- 苏教版二年级数学下册第六单元《三位数的加法笔算》教案
- 7年级数学试卷(有答案)
- 干热河谷优秀课件
- 误吸预防与处理
- 台风过后复工前安全检查表
- GB/T 20840.8-2007互感器第8部分:电子式电流互感器
- GB/T 2007.1-1987散装矿产品取样、制样通则手工取样方法
- 《歌唱祖国》-课件
- 天津临港海洋重工建造基地码头工程(PPT)
评论
0/150
提交评论