模拟简单运算器的工作。假设计算器只能进行加减乘除运算,运算数和结果都是整数,四种运算符的优先级相同,按从左到右的顺序计算。
输入格式:
输入在一行中给出一个四则运算算式,没有空格,且至少有一个操作数。遇等号”=”说明输入结束。
输出格式:
在一行中输出算式的运算结果,或者如果除法分母为0或有非法运算符,则输出错误信息“ERROR”。
输入样例:
1+2*10-10/2=
输出样例:
10
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
注意:除0问题,逻辑或逻辑与问题,最后一个操作数的保存问题(使读入'='时也进行记录储存,并通过break跳出而不通过外部设定循环条件跳出) ,for循环条件的正序与逆序
#include<stdio.h>
#include<string.h>
int main()
{
char str[15] = "";
int lenstr;
char ch;
int i = 0;
int cnt = 0; // 记录运算符个数
int number[150] = {0}; // 记录操作数,从下标为1时开始计算
char op[150] = "0"; // 记录出现的运算符,从下标为1时开始计算
int result; // 最终运算结果
int check = 0; // 错误输入检查,有错误输入时不为0
scanf("%c", &ch);
while( cnt<150 ){
if( ch=='+' || ch=='-' || ch=='*' || ch=='/' || ch=='='){ // 如果输入运算符则进行上一轮次的计算
cnt ++;
i = 0; // 用于储存非运算符的操作数字符串下标
lenstr = strlen(str); // 该运算符前的操作数的位数
int j;
int index = 1;
for( j=lenstr-1 ; j>=0 ; j--){ // 计算该运算符前的操作数
number[cnt] += (str[j]-'0') * index;
index *= 10;
}
op[cnt] = ch;
if( cnt==1 ){
result = number[cnt];
}
if( cnt>1 ){
if( op[cnt-1]=='+') result += number[cnt] ;
if( op[cnt-1]=='-') result -= number[cnt] ;
if( op[cnt-1]=='*') result *= number[cnt] ;
if( op[cnt-1]=='/' && number[cnt]!=0 ) result /= number[cnt] ;
if( op[cnt-1]=='/' && number[cnt]==0 ) check ++; // 发生除0时
}
for( j=0 ; j<15 ; j++ ){ // 每次都需要对储存操作数的字符数组初始化,否则如果下一个操作数比上一个位数少结果则会错误,例如202/2,如果不初始化则会被认为是202/202
str[j] = '\0';
}
if( ch=='=' ) break; // 读到等号跳出
} else{ // 储存操作数
if( ch<'0' || ch>'9') { // 输入合法检查
check ++;
}
str[i] = ch;
i ++;
}
scanf("%c", &ch);
}
// 输出
if( check ){
printf("ERROR\n");
} else {
printf("%d\n", result);
}
return 0;
}
但后来意识到完全用字符读入过于麻烦,还需要记录,换算等,实际可以按照数字和字符分别对操作数和运算符进行读取
#include<stdio.h>
int main()
{
int a,b; // a是运算符前的数,也用于储存每一步的运算结果,b是运算符后的数
char ch; // 运算符
int check = 0; // 检查输入合法性,合法为0
// 至少有一个操作数的输入
scanf("%d", &a);
scanf("%c", &ch);
// 运算符不为'='就继续
while( ch!='='){
if( ch!='+' && ch!='-' && ch!='*' && ch!='/' ){ // 违规运算符检查
check ++;
}
scanf("%d", &b);
if( ch=='/' && b==0 ){ // 除数为0检查
check ++;
} else{ // 根据运算符进行对应计算
switch( ch ){
case '+': a += b; break;
case '-': a -= b; break;
case '*': a *= b; break;
case '/': a /= b; break;
}
}
scanf("%c", &ch);
}
// 输出
if( check ){
printf("ERROR\n");
} else {
printf("%d\n", a);
}
return 0;
}