PTA 7-20 简单计算器

模拟简单运算器的工作。假设计算器只能进行加减乘除运算,运算数和结果都是整数,四种运算符的优先级相同,按从左到右的顺序计算。

输入格式:

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

输出格式:

在一行中输出算式的运算结果,或者如果除法分母为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;
 } 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值