计算器程序编程实习报告范本.docx

上传人:b****8 文档编号:10648934 上传时间:2023-02-22 格式:DOCX 页数:11 大小:52.11KB
下载 相关 举报
计算器程序编程实习报告范本.docx_第1页
第1页 / 共11页
计算器程序编程实习报告范本.docx_第2页
第2页 / 共11页
计算器程序编程实习报告范本.docx_第3页
第3页 / 共11页
计算器程序编程实习报告范本.docx_第4页
第4页 / 共11页
计算器程序编程实习报告范本.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

计算器程序编程实习报告范本.docx

《计算器程序编程实习报告范本.docx》由会员分享,可在线阅读,更多相关《计算器程序编程实习报告范本.docx(11页珍藏版)》请在冰豆网上搜索。

计算器程序编程实习报告范本.docx

计算器程序编程实习报告范本

程序实习报告

一、需求分析:

编写简易计算器程序,主要实现四则运算,运算符号包括“—”,“+”,“/”,“*”,“(”,“)”,按照“先乘除后加减,先算括号后算括号外,从左到右”的原则的原则进行计算。

考虑到程序的编写困难度,暂时不予考虑多位数的四则运算,也不考虑平方、阶乘、三角函数的运算。

只进行一位数的四则运算,所需要的存空间不会很大,也就放弃空间不足自动添加空间的情况。

输入:

输入一个只含一位数的四则运算式,以#结束,运算符只包括“—”,“+”,“*”,“/”,“(”,“)”。

输出:

直接输出结果“结果是:

”。

测试数据:

例如9—(3—2)*3—1#

二、概要设计:

 

 

 

 

JI

 

三、详细设计:

1、主函数首先定义两个栈,分别取名是OPTR,OPND,其中OPTR存放字符,OPND存放数字。

将optr中压入#作为栈底元素,然后从键盘上获取表达式的字符

如果是数字,将该字符转化为数字,压入到栈opnd中。

如果是字符,和optr的栈顶元素比较优先级

1,、栈顶元素优先级<键入的元素,该调用push()函数,将字符压入到optr栈中

2、如果栈顶元素的优先级等于键入元素,则得知此符号为括号,调用pop()函数,将该字符栈中的栈顶元素退出,即为脱括号。

3、如果栈顶元素的优先级高于键入元素,调用pop()函数,分别将取两次数字栈的栈顶元素,pop(opnd,b),pop(opnd,a),,同时将optr中的栈顶元素去取出,pop(optr,theta),调用operate()函数,进行计算。

将operate(a,theta,b)压入到opnd栈中,继续进行循环。

直到#结束。

模块1、定义2中栈,定义栈,区分两种数据类型

typedefstruct{

intstack[MAXSIZE];

inttop;

}SqStack;

模块2、定义两种出栈入栈函数,以便后来调用不同数据类型的pop(*s,x),.push(*s,*x);intPush1(SqStack*s,intx)

{if(s->top>=MAXSIZE)

printf("ERROR,Overflow!

\n");

else

{s->stack[s->top]=x;s->top++;}

return1;}

 

模块3、Operate函数定义:

operate函数,利用switch()语句来

operate(inta,charb,intc)写定义3个实参,inta,bchartheta;

{theta代表运算符,依次判断运算符的+—

switch(b)*,/,情况,进行运算,{case'+':

a=a+c;break;令a=a+c,a=a-c,a=a*c,a=a/c,

case'-':

a=a-c;break;返回a的值

case'*':

a=a*c;break;

case'/':

a=a/c;break;}

returna;

}

模4、优先级判断

将+—*/()#的优先级做成如下的图

+'>',>','>','<','<','<','>','>',

—'>','>','<','<','<','>','>',

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

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

('<','<','<','<','<','=',0,

)'>','>','>','>',0,'>','>',

#'<','<','<','<','<',0,'=',寻找优先级即将左表中的对应坐标用程序语言找到即可,设计一个二维数组,str[7[,[7],将字符进行定位,i,j分别代表横纵坐标,利用switch,语句进行选择,对应的str[i][j]即为优先级符号,所以将str[i][j],作为函数的返回值

调试中的问题:

1、最初只定义了一种数据类型的栈,出栈入栈函数也只有一种int数据类型,导致之后的函数调用数据类型不匹配,无法识别。

2、在定义入栈函数时,未能将push(*s,*x)中的x定义成指针类型,在pop(*s,x)中误将x定义成指针类型。

3、在调用函数时对栈的调用中数据类型不一致。

4、对主函数,从键盘键入的C为字符型,没有能够将字符型转化成整型进行计算,使得在计算中是用的0~9的ASCII码值进行的计算,在ASCII码表中0~9的ASCII码表依次为48~57,intm

m=c—48,即‘c'-48,得到真实的数值。

5、取栈顶元素的函数定义错误,使得程序无法进行,由于gettop函数定义错误,在optr中一直重复取#的循环运算,导致“error

Underflow”刷屏出现。

源代码;#include

#include

#include

#defineMAXSIZE100

#definetrue1

#definefalse0

typedefstruct{//定义堆栈数据类型

intstack[MAXSIZE];

inttop;

}SqStack;

typedefstruct{//定义堆栈数据类型

charstack[MAXSIZE];

inttop;

}sqstack;

voidInitStack(SqStack*s)

{//初始化栈,栈顶指针为0

s->top=0;

}

voidInitStack2(sqstack*s)

{//初始化栈,栈顶指针为0

s->top=0;

}

intPush1(SqStack*s,intx)

{//入栈

if(s->top>=MAXSIZE)

printf("ERROR,Overflow!

\n");

else

{

s->stack[s->top]=x;s->top++;

}

return1;}

intGettop1(SqStack*s,int*x)

//取栈顶元素

{

if(s->top==0)

{

printf("error,gettop1");

return0;}

else

{

*x=s->stack[s->top];

return1;}

}

intPop1(SqStack*s,int*x){//出栈

if(s->top==0)

printf("ERROR,pop1!

\n");

else

{

s->top--;

*x=s->stack[s->top];

}

return1;}

charPush2(sqstack*s,charx)

{//入栈

if(s->top==MAXSIZE+1)

printf("ERROR,push2!

\n");

else

{

s->stack[s->top]=x;

s->top++;

}

return1;

}

charGettop2(sqstack*s,char*ch){//取栈顶元素

if(s->top>0)

{*ch=s->stack[s->top-1];return*ch;}

else

return0;

}

charPop2(sqstack*s,char*x){//出栈

if(s->top==0)

printf("ERROR,pop2!

\n");else

s->top--;

*x=s->stack[s->top];

return1;}

 

charprocede(charc1,charc2)

{

inti=0,j=0;

charstr[7][7]={

'>','>','<','<','<','>','>',

'>','>','<','<','<','>','>',

'>','>','>','>','<','>','>',

'>','>','>','>','<','>','>',

'<','<','<','<','<','=',0,

'>','>','>','>',0,'>','>',

'<','<','<','<','<',0,'=',};

switch(c1)

{

case'+':

i=0;break;

case'-':

i=1;break;

case'*':

i=2;break;

case'/':

i=3;break;

case'(':

i=4;break;

case')':

i=5;break;

case'#':

i=6;break;

}

switch(c2)

{

case'+':

j=0;break;

case'-':

j=1;break;

case'*':

j=2;break;

case'/':

j=3;break;

case'(':

j=4;break;

case')':

j=5;break;

case'#':

j=6;break;

}

return(str[i][j]);

}//返回优先级判断结果

intoperate(inta,charb,intc)

{

switch(b)

{case'+':

a=a+c;break;

case'-':

a=a-c;break;

case'*':

a=a*c;break;

case'/':

a=a/c;break;}

returna;

}

main()

{

sqstackOPTR;

SqStackOPND;

chartheta,c,x;

inta,b,m;

InitStack2(&OPTR);

Push2(&OPTR,'#');

InitStack(&OPND);

printf("请输入一个计算式,以#结束\n");

c=getchar();

{while(c!

='#'||OPTR.stack[OPTR.top-1]!

='#')

if(c>='0'&&c<='9')

{

m=c-48;

Push1(&OPND,m);

c=getchar();

}

else

{

switch(procede(OPTR.stack[OPTR.top-1],c))

{

case'<':

Push2(&OPTR,c);

c=getchar();

break;

case'=':

Pop2(&OPTR,&x);

c=getchar();

break;

case'>':

Pop2(&OPTR,&theta);//退栈并将运算结果入栈

Pop1(&OPND,&b);

Pop1(&OPND,&a);

Push1(&OPND,operate(a,theta,b));

break;

}

}

}

printf("结果:

%d\n",OPND.stack[OPND

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

当前位置:首页 > 法律文书 > 辩护词

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

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