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
- PAT 06-1. 简单计算器(20)
- PAT:6-1. 简单计算器(20)
- 06-1. 简单计算器(20)
- 06-1. 简单计算器(20)
- 06-1. 简单计算器(20)
- 06-1. 简单计算器(20)
- 06-1. 简单计算器(20)
- 06-1. 简单计算器(20)
- 6-1. 简单计算器(20)
- 6-1. 简单计算器(20)
- 6-1. 简单计算器(20)
- 6-1. 简单计算器(20)
- PAT-两个数的简单计算器(简单编程题)
- 6-1. 简单计算器
- 简单计算器(20)
- 循环-17. 简单计算器(20)
- 循环-17. 简单计算器(20)
- 循环-17. 简单计算器(20)
- PAT 07-1. 换个格式输出整数 (15)
- HPUX上oracle10g安装与卸载简记
- SQL Server中的事务与锁
- java application session request 使用示例
- PAT 10-0. 说反话 (20)
- PAT 06-1. 简单计算器(20)
- ESP和EBP 栈顶指针和栈底指针
- 《C陷阱和缺陷》整理四
- js中iframe的操作
- Linux中LCD设备驱动--framebuffer(帧缓冲)
- ZOJ 2773 Triangular Sums (水)
- SEM和SEM如何互相帮助?
- VC Theory: Hoeffding Inequality
- 几个很重要的指令