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

来源:互联网 发布:html5程序员招聘 编辑:程序博客网 时间:2024/05/22 08: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
原创粉丝点击