实验二报告.docx

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

实验二报告.docx

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

实验二报告.docx

实验二报告

 

《数据结构与算法设计》

实验报告

——实验二

 

学院:

自动化学院

班级:

06111103

学号:

1120111615

姓名:

王硕

 

一、实验目的

1、熟悉VC6.0环境,使用C++语言编写一个能进行幂、求余和四则运算的简单计算器。

2、在编程与上机调试的过程中,加深对栈这一数据结构知识点的理解。

3、锻炼自我逻辑思维和动手能力,并熟悉编程的思想与技巧。

二、实验内容

请按照四则运算加、减、乘、除、幂(^)和括号的优先关系和惯例,编写计算器程序。

要求:

从键盘输入一个完整的表达式,以回车作为表达式输入结束的标志。

输入表达式中的数值均为大于等于零的整数。

中间的计算过程如果出现小数也只取整。

例如,输入:

4+2*5=输出:

14

输入:

(4+2)*(2-10)=输出:

-48

三、程序设计

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

usingnamespacestd;

#include

#include

#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:

 

七、程序清单

#include

usingnamespacestd;

#include

#include

#defineMAX_SIZE200

charoper[10]="+-*%/^()#";

charges;

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

//+-*%/^()#

/*+*/'>','>','<','<','<','<','<','>','>',

/*-*/'>','>','<','<','<','<','<','>','>',

/***/'>','>','>','>','>','<','<','>','>',

/*%*/'>','>','>','>','>','<','<','>','>',

/*/*/'>','>','>','>','>','<','<','>','>',

/*^*/'>','>','>','>','>','<','<','>','>',

/*(*/'<','<','<','<','<','<','<','=','0',

/*)*/'0','0','0','0','0','0','0','0','0',

/*#*/'<','<','<','<','<','<','<','0','='

};

structSTACK{

charexpression[MAX_SIZE];

inttop;

}stack;

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){

return0;

}

*d=num[top_num-1];

top_num--;

return1;

}

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;

flag++;

}

if(flag==2){

break;

}

}

if(flag!

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

return'0';

}

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>='0'&&temp<='9')||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)){

return0;

}

ch=Precede(str_temp,str);

if(ch=='0'){

return0;

}

while(ch!

='<'){

if(ch=='='){

break;

}

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;

}

elseif(str_temp=='+'){

k=num_1+num_2;

}

elseif(str_temp=='/'){

if(num_2==0){

return1;

}

k=num_1/num_2;

}

elseif(str_temp=='^'){

if(num_2<0){

return0;

}

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

}

elseif(str_temp=='%'){

k=num_1%num_2;

}

num[top_num++]=k;

if(!

(Pop_OPTR(&str_temp))){

return0;

}

ch=Precede(str_temp,str);

if(ch=='0'){

return0;

}

}

if(ch=='<'){

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='0';//用来判断判断表达式错误后后面还有没有项(默认为有即ges='0')

str1=getchar();

while

(1){

if(str1=='='){

str1=getchar();

k=Push('#');

ges='1';//表达式输入完毕

if(k==1){

return1;

}

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

=0||top_num!

=1){

return0;

}

break;

}

if(((str1>='0'&&str1<='9')||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('0',&str1);

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

flag=1;

}

}

elseif(flag==1||(flag==0&&str1=='(')){

k=Push(str1);

if(k==0){

return0;

}

elseif(k==1){

return1;

}

if(str1==')'){

flag=1;

}

else{

flag=0;

}

str1=getchar();

}

else{

return0;

}

}

return2;

}

intmain()

{

intn,k;

chara[MAX_SIZE];

printf("Howmanyexpressionsdoyouwanttoevaluate?

\n");

scanf("%d",&n);

printf("Pleaseinputexpressionswith=ending:

\n");

getchar();

while(n--){

k=EvalExpr();

if(k==0){

printf("Error.\n");

}

elseif(k==1){

printf("Divide0.\n");

}

else{

printf("ans=%d\n",num[0]);

}

if(k!

=2&&ges=='0'){

gets(a);

}

}

return0;

}

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

当前位置:首页 > 求职职场 > 职业规划

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

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