实验二报告Word下载.docx

上传人:b****5 文档编号:21379624 上传时间:2023-01-30 格式:DOCX 页数:13 大小:99.07KB
下载 相关 举报
实验二报告Word下载.docx_第1页
第1页 / 共13页
实验二报告Word下载.docx_第2页
第2页 / 共13页
实验二报告Word下载.docx_第3页
第3页 / 共13页
实验二报告Word下载.docx_第4页
第4页 / 共13页
实验二报告Word下载.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

实验二报告Word下载.docx

《实验二报告Word下载.docx》由会员分享,可在线阅读,更多相关《实验二报告Word下载.docx(13页珍藏版)》请在冰豆网上搜索。

实验二报告Word下载.docx

1、概要设计

(1)抽象数据类型定义

ADTStack{

数据对象:

D=

数据关系:

R1=

约定

端为栈顶,

端为栈底。

基本操作:

Pop_OPTR(char*str)

操作结果:

运算符出栈,如果成功返回1,否则返回0

Pop_OPND(int*d)

数字出栈,如果成功返回1,否则返回0

char_to_int(charstr,char*str1)

初始条件:

(str1>

='

0'

&

&

str1<

9'

)||str1=='

.'

把小数转换为整型变量

Precede(chara,charb)

返回两个运算符的优先级

Push(charstr)

需要进栈及求值操作

中间步骤不必运算返回0,分母为零返回1否则返回2

EvalExpr()

输入表达式合法

返回表达式的最终结果。

}ADTStack

(2)宏定义

#include<

iostream>

usingnamespacestd;

stdlib.h>

math.h>

#defineMAX_SIZE200

(3)主程序流程

(4)模块调用关系

程序分为下述模块,且调用关系由上至下为:

主函数模块——执行输入操作,并调用计算表达式模块

计算表达式模块——每次读取一个字符,判断其为运算符还是数值,还是结束符

数值转换模块——把数值转换成整数

返回结果模块——入栈返回0,优先级高的前提下根据运算符返回中间结果

优先级判断模块——返回两个运算符的优先级

运算符出栈模块

数字出栈模块

2、详细设计

1)数据类型设计

structSTACK{

charexpression[MAX_SIZE];

//表达式最大长度

inttop;

//栈头

}stack;

2)各模块的基本操作设置

intPop_OPTR(char*str)//运算符的出栈,如果成功返回1,否则返回0

intPop_OPND(int*d)//数字的出栈,如果成功返回1,否则返回0

charPrecede(chara,charb)//返回两个运算符的优先级

intchar_to_int(charstr,char*str1)//把数字从char型转化成int,小数点后不计

intPush(charstr)//表达式错误返回0分母为0返回1否则返回2

EvalExpr()//表达式错误返回0分母为0返回1否则返回2

四、程序调试分析

1、问题与改进措施

最初的时候,缺少if语句判断,使得1/0这样的式子没有报错,出现了输出结果。

在优先级的比较中出现了细节的问题。

2、体会与收获

流程图很重要,本来想一上来就把程序编出来。

但是觉得很混乱。

但是在流程图与模块化设计以后,很多问题迎刃而解。

程序讲究严谨,要规范,严谨与规范的程序是解决问题最根本也是最重要的东西。

五、用户使用说明

1、本程序的运行环境为Windows操作系统下的MicrosoftVisualC++6.0。

2、在VC环境下打开程序后,先按照提示输入要操作的次数,然后输入表达式,务必以等号结尾,返回Error为输入表达式有错误。

3、按下任意键退出。

六、程序运行结果

测试样例1:

测试样例2:

七、程序清单

charoper[10]="

+-*%/^()#"

;

charges;

charprio[9][9]={//判断优先级

//+-*%/^()#

/*+*/'

>

'

'

<

/*-*/'

/***/'

/*%*/'

/*/*/'

/*^*/'

/*(*/'

='

/*)*/'

/*#*/'

};

structSTACK{

intnum[MAX_SIZE*2],top_num;

intPop_OPTR(char*str)//运算符的出栈

{

if(stack.top==0){

return0;

}

*str=stack.expression[stack.top-1];

stack.top--;

return1;

}

intPop_OPND(int*d)//数字的出栈

if(top_num==0){

*d=num[top_num-1];

top_num--;

charPrecede(chara,charb)

inti,location_a,location_b,flag=0;

for(i=0;

i<

9;

i++){

if(oper[i]==a){

location_a=i;

flag++;

}

if(oper[i]==b){

location_b=i;

if(flag==2){

break;

if(flag!

=2){//不是正确的运算符返回0

return'

else{

returnprio[location_a][location_b];

intchar_to_int(charstr,char*str1)

chara[5],temp='

\0'

inti=1,n=0,l;

a[0]=str;

while((temp=getchar())&

((temp>

temp<

)||temp=='

)){

a[i++]=temp;

n=atoi(a);

*str1=temp;

returnn;

intPush(charstr)

intk,num_1,num_2;

charstr_temp,ch;

if(!

Pop_OPTR(&

str_temp)){

ch=Precede(str_temp,str);

if(ch=='

){

while(ch!

if(ch=='

if(!

(Pop_OPND(&

num_2)&

Pop_OPND(&

num_1))){

return0;

if(str_temp=='

-'

k=num_1-num_2;

elseif(str_temp=='

*'

k=num_1*num_2;

+'

k=num_1+num_2;

/'

if(num_2==0){

return1;

}

k=num_1/num_2;

^'

if(num_2<

0){

return0;

k=(int)pow(num_1*1.0,num_2*1.0);

%'

k=num_1%num_2;

num[top_num++]=k;

(Pop_OPTR(&

str_temp))){

ch=Precede(str_temp,str);

stack.expression[stack.top++]=str_temp;

stack.expression[stack.top++]=str;

return2;

intEvalExpr()

{

intk,flag=0;

//下一个输入的如果应该是数字则falg=0如果应该是运算符flag=1

charstr1;

top_num=0;

stack.expression[0]='

#'

stack.top=1;

ges='

//用来判断判断表达式错误后后面还有没有项(默认为有即ges='

str1=getchar();

while

(1){

if(str1=='

str1=getchar();

k=Push('

);

ges='

1'

//表达式输入完毕

if(k==1){

if(k==0||stack.top!

=0||top_num!

=1){

if(((str1>

)&

flag==0){

k=char_to_int(str1,&

str1);

num[top_num++]=k;

flag=1;

elseif(str1=='

if(flag==1){//'

为减号

k=Push(str1);

if(k==0){

return0;

}

if(k==1){

return1;

str1=getchar();

flag=0;

else{//'

为负号

k=char_to_int('

&

num[top_num++]=-1*k;

flag=1;

elseif(flag==1||(flag==0&

str1=='

('

k=Push(str1);

if(k==0){

elseif(k==1){

if(str1=='

)'

else{

else{

intmain()

intn,k;

chara[MAX_SIZE];

printf("

Howmanyexpressionsdoyouwanttoevaluate?

\n"

scanf("

%d"

&

n);

Pleaseinputexpressionswith=ending:

getchar();

while(n--){

k=EvalExpr();

if(k==0){

printf("

Error.\n"

elseif(k==1){

Divide0.\n"

ans=%d\n"

num[0]);

if(k!

=2&

ges=='

gets(a);

return0;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 司法考试

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

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