PAT 06-1. 简单计算器(20)

#PAT 06-1. 简单计算器(20)
—–
###题目内容:
模拟简单运算器的工作。假设计算器只能进行加减乘除运算,运算数和结果都是整数,4种运算符的优先级相同,按从左到右的顺序计算。

输入格式:

输入在一行中给出一个四则运算算式,没有空格,且至少有一个操作数。遇等号”=”说明输入结束。

输出格式:

在一行中输出算式的运算结果,或者如果除法分母为0或有非法运算符,则输出错误信息“ERROR”。

输入样例:
1+2*10-10/2=
输出样例:
10

——
#####详细注释版:

/******************* 
 *中间采用了栈结构来存储操作数据操作符 
 *符合范围的数入栈,对于多位数,以-1为分隔符并且在第三个栈中再重组操作数 
 ******************/
 #include<stdio.h> 
 int main(){
 
 int steck[100];
 int i,j=0,k=0,flag,m=0,n=0,num[100]={0};
 char opration[50];
 char input[100];
 int steck_flag,num_flag,operation_flag;
 
for(i=0;i<100;i++){
    scanf("%c",&input[i]);
    //判断符号 
    if(input[i]=='+'||input[i]=='-'||input[i]=='*'||input[i]=='/'){
        opration[k]=input[i];
        k++;
        steck[j]=-1;
        j++; 
        continue;
    }
    //判断结束 
    else if(input[i]=='='){
        flag = i;//输入标记 
        break;
    }
    //放入缓存 
    else if(input[i]>'0'&&input[i]<'9'){
        steck[j] = (int)(input[i]-'0');
    j++;    
    }
    else{
        printf("ERROR");
        return 0;
    }
}
steck[j]=-1;
steck_flag=j;//操作数长度标记 
operation_flag =k;//操作符长度标记
 
//计算模块//
//从数字栈中取数字 
for(n=0;n<=steck_flag;n++){
    if(steck[n]!=-1){
        num[m]=num[m]*10+steck[n];//从单个数字栈中取出数据,不遇到-1就把当前的栈位*10可以保证在两个-1之间的数成为一个数 
    }
    else if(steck[n]==-1){
        m++;//遇到-1 把整数栈中的指针往后移 
        num[m]=0;//将当前的栈位置零,下次*10的时候不会影响, 
    }
}
/数字取完 了
  
num_flag=m;//操作数标记 
printf("<=====操作栈输出=====>\n");
for(j-=1;j>=0;j--){
    printf("steck[%d] = %d \n",j,steck[j]);
}
printf("<=====操作数取出=====>\n");
 for(m-=1;m>=0;m--){
    printf("num[%d] = %d \n",m,num[m]);
}
printf("<=====操作符取出=====>\n");
for(k-=1;k>=0;k--){
    printf("opration[%d] = %c \n",k,opration[k]);
}
printf("<=====结果输出=====>\n");
printf("num_flag = %d\n",num_flag);
printf("===================\n");
int x,y=0,result=num[0];
for(x=1;x<num_flag;x++){
    switch(opration[y]){
    case'+':
        result += num[x];
        y++; 
        break;
    case'-':
        result -= num[x];
        y++;
        break;
    case '*':
        if(result==0){
            result=1;
        }
        result *= num[x];
        y++;
        break;
    case '/':
        if(num[x]==0){
            printf("ERROR");
            return 0;
         } 
        result /= num[x];
        y++;
        break;
    default:{
        printf("ERROR");
        return 0;
     }
      
 } 
}
 
printf("return = %d",result);
return 0;
}


精简Ac版

#include<stdio.h> 
int main(){
 
int steck[100];
int i,j=0,k=0,flag,m=0,n=0,num[100]={0};
char opration[50];
char input[100];
int steck_flag,num_flag,operation_flag;
 
for(i=0;i<100;i++){
    scanf("%c",&input[i]);
    if(input[i]=='+'||input[i]=='-'||input[i]=='*'||input[i]=='/'){
        opration[k]=input[i];
        k++;
        steck[j]=-1;
        j++; 
        continue;
    }
    else if(input[i]=='='){
        flag = i;
        break;
    }
    else if(input[i]>'0'&&input[i]<'9'){
        steck[j] = (int)(input[i]-'0');
    j++;    
    }
    else{
        printf("ERROR");
        return 0;
    }
}
steck[j]=-1;
steck_flag=j;
operation_flag =k;
for(n=0;n<=steck_flag;n++){
    if(steck[n]!=-1){
        num[m]=num[m]*10+steck[n];
    }
    else if(steck[n]==-1){
        m++;
        num[m]=0;
    }
}
num_flag=m;
int x,y=0,result=num[0];
for(x=1;x<num_flag;x++){
    switch(opration[y]){
    case'+':
        result += num[x];
        y++; 
        break;
    case'-':
        result -= num[x];
        y++;
        break;
    case '*':
        if(result==0){
            result=1;
        }
        result *= num[x];
        y++;
        break;
    case '/':
        if(num[x]==0){
            printf("ERROR");
            return 0;
         } 
        result /= num[x];
        y++;
        break;
    default:{
        printf("ERROR");
        return 0;
     }
      
 } 
}
 
printf("%d",result);
return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值