云裂变营销网

标题: C语言计算器小程序(源代码+实习报告) [打印本页]

作者: 匿名    时间: 2021-12-30 14:48
标题: C语言计算器小程序(源代码+实习报告)
目   录

1.  需求分析……………………………………………2
1.1 程序的功能…………………………………………2
1.2 输入输出的要求……………………………………2
1.3 测试数据……………………………………………2
2.  概要设计……………………………………………3
3.  详细设计……………………………………………4
3.1 模块功能说明………………………………………4
4. 调试分析……………………………………………6
5.  核心源程序清单和执行结果………………………6

1.需求分析
1.1 程序的功能
本程序是一个计算器小程序,利用算符优先关系,实现对算术四则混合运算表达式的求值并输出结果。
1.2 输入输出的要求
    输入的形式:算术表达式,以井号“#”结束。例如2*(3+4)#;
                包含的运算符只能有'+' 、'-' 、'*' 、'/' 、'('、 ')';
输出的形式:运算结果,例如Answer is:14;
1.3 测试数据
    第一组: 输入 3*(9-4)#       输出 Answer is:15

C语言计算器小程序(源代码+实习报告)-1.jpg

第二组: 输入140/(57+13)#   输出 Answer is:2

C语言计算器小程序(源代码+实习报告)-2.jpg

第三组: 输入 56*(12-10)#  输出 Answer is:112

C语言计算器小程序(源代码+实习报告)-3.jpg


C语言计算器小程序(源代码+实习报告)-4.jpg

3.详细设计
  主要部分详细流程:
     (1)设置两个工作栈,分别存放操作数和运算结果

C语言计算器小程序(源代码+实习报告)-5.jpg

   (2)判断字符的优先级   

C语言计算器小程序(源代码+实习报告)-6.jpg

C语言计算器小程序(源代码+实习报告)-7.jpg

C语言计算器小程序(源代码+实习报告)-8.jpg

C语言计算器小程序(源代码+实习报告)-9.jpg

错误提示1:

C语言计算器小程序(源代码+实习报告)-10.jpg

错误原因 :在中文输入法下输入的“;”,导致程序不能识别。
调试方法 :调到英文输入法下输入即可。
错误提示2:

C语言计算器小程序(源代码+实习报告)-11.jpg

错误原因: 在Init_OPND,Init_OPTR后边都忘加了“&”符号,    导致程序不识别。
调试方法:在  Init_OPND,Init_OPTR后边加上“&”即可。

全部源代码如下:
#include <stdio.h>  
#include <stdlib.h>  
#define MAX 100  
typedef struct    /*定义一个栈存放运算数*/  
{  
int a[MAX];  
int top;  
}OPND;   
typedef struct   /*定义一个栈存放运算符*/  
{  
char a[MAX];  
int top;  
}OPTR;  
void Init_OPND(OPND *s)    /*初始化运算数栈*/  
{  
s->top =0;  
}  
void Init_OPTR(OPTR *s)   /*初始化运算符栈*/  
{  
s->top =0;  
}  
void Push_OPND(OPND *s,int x)   /*压入一个运算数*/  
{  
s->top ++;  
s->a [s->top ]=x;  
}   
void Push_OPTR(OPTR *s,char x)   /*压入一个运算符*/  
{  
s->top ++;  
s->a [s->top ]=x;  
}   
int Pop_OPND(OPND *s)     /*取出一个运算数*/  
{  
int x;  
x=s->a [s->top];  
s->top --;  
return x;  
}   
char Pop_OPTR(OPTR *s)    /*取出一个运算符*/  
{  
char x;  
x=s->a [s->top];  
s->top --;  
return x;  
}  
int GetTop_OPND(OPND *s) /*取栈顶运算数*/  
{  
return (s->a[s->top]);  
}  
char GetTop_OPTR(OPTR *s)   /*取栈顶运算符*/  
{  
return (s->a[s->top]);  
}  
int IsOpr(char c)   /*判断输入字符是否为运算符*/   
{  
if (c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='#')  
   return 1;  
else  
     return 0;  
}  
char Precede(char s,char c) /*判断字符的优先级*/   
{  
switch(s)  
{  
case '+':  
case '-':  
{  
if(c=='+'||c=='-')  
    return '>';  
   else if (c=='*'||c=='/')  
      return '<';  
   else if(c=='(')   
    return '<';   
   else if(c==')')   
    return '>';   
   else   
    return '>';  
}  
break;  
case '*':  
case '/':  
{  
if(c=='+'||c=='-')  
    return '>';  
   else if (c=='*'||c=='/')  
    return '>';  
   else if(c=='(')   
    return '<';   
   else if(c==')')   
    return '>';   
   else   
return '>';   
}  
break;  
case '(':  
{  
if(c==')')  
    return '=';  
   else   
    return '<';  
}  
break;  
case ')':  
{  
   return '>';  
}  
break;  
case '#':  
{  
if(c=='#')  
     return '=';  
    else  
    return '<';  
}  
break;  
}  
}  
int Operate(int x,char opr,int y)   /*计算*/  
{  
int result;   
switch (opr)   
{   
case '+':   
     result = x + y;   
     break;   
case '-':   
     result = x - y;   
     break;  
case '*':   
     result = x * y;   
    break;  
case '/':   
     result = x / y;   
     break;  
}  
return result;  
}  
void main()  
{  
OPND sdata;   
OPTR soper;  
int a,b,result,i;  
char ch,theta;  
Init_OPND(&sdata);  
Init_OPTR(&soper);  
Push_OPTR(&soper,'#');  
ch=getchar();  
while(ch!='#'||GetTop_OPTR(&soper)!='#') //当读入的字符和OPTR栈顶的字符均为‘#’时结束运算*/  
{  
if(!IsOpr(ch))                           /*是运算数的情况*/  
{  
   i=atoi(&ch);                           /*将字符型转为整型*/  
   ch=getchar();                          /*使得可以输入几位数*/  
   while(!IsOpr(ch))            
   {  
    i=i*10+atoi(&ch);  
    ch=getchar();  
   }  
   Push_OPND(&sdata,i);   
}  
else  
{  
   switch(Precede(GetTop_OPTR(&soper),ch))    /*比较栈顶运算符和刚输入运算符的优先级*/  
   {      
   case '<':  
    Push_OPTR(&soper,ch);  
    ch=getchar();  
    break;  
   case '=':  
    theta=Pop_OPTR(&soper);  
    ch=getchar();  
    break;  
   case '>':  
    theta=Pop_OPTR(&soper);  
    b=Pop_OPND(&sdata);  
    a=Pop_OPND(&sdata);  
    result=Operate(a,theta,b);  
    Push_OPND(&sdata,result);  
    break;  
   }  
}  
}   
printf("Anwser is: %d\n",GetTop_OPND(&sdata));  
}




欢迎光临 云裂变营销网 (https://www.yunliebian.com/yingxiao/) Powered by Discuz! X3.4