找回密码
 立即注册

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

匿名  发表于 2021-12-30 14:48:52 阅读模式 打印 上一主题 下一主题
目   录

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));  
}
回复

使用道具

说点什么

您需要登录后才可以回帖 登录 | 立即注册
HOT • 推荐

神回复

站长姓名:王殿武 杭州共生网络科技 创始人 云裂变新零售系统 创始人 飞商人脉对接平台 创始人 同城交友聚会平台 创始人 生活经验分享社区 创始人 合作微信:15924191378(注明来意)