#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;
}