PTA 7-20 简单计算器(中M22春C、Java入门练习)

7-20 简单计算器

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

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

输出格式:
在一行中输出算式的运算结果,或者如果除法分母为0或有非法运算符,则输出错误信息“ERROR”。

输入样例:

1+2*10-10/2=

输出样例:

10
代码长度限制                                                    16 KB
时间限制                                                       400 ms
内存限制                                                        64 MB

个人思路:

  1. 一个字符一个字符接收,需要注意的是第一个我单独接收了
  2. 符号用一个 flag 来判断,0 1 2 3 分别代表 加 减 乘 除

直接上代码:

#include <stdio.h>

int main()
{
	char c;
	char d;
	d = getchar(); //记录第一个数字 
	int re;
	re = d - 48;
	int a=re,b=0;
	int flag=0; //记录运算符号 0 1 2 3 对应 加 减 乘 除 
	int error=0; //记录是否出现错误,无错误时为 0, 需注意此处接收到等号我也对其加 1,最后判断错误大于 1 
	int no_single=0; //记录此数是否是个位数,如果不是就加 1 
	int flag_show=0; //判断第一个数字是否是个位数,如果下一个接收到了符号,则 flag_show++, 注意,当 flag_show==0 时,flag恒为0,于是在加法处判断即可 
	
	while ( c!=61 )
	{
		c = getchar();
		
		if ( c==43 ) //加法 
		{
			flag = 0;
			no_single = 0;
			flag_show++; //只要出现运算符就重置数字个位判断 
		}
		else if ( c==45 ) //减法 
		{
			flag = 1;
			no_single = 0;
			flag_show++;
		}
		else if ( c==42 ) //乘法 
		{
			flag = 2;
			no_single = 0;
			flag_show++;
		}
		else if ( c==47 ) //除法 
		{
			flag = 3;
			no_single = 0;
			flag_show++;
		}
		
		
		
		else if ( c>=48 && c<=57 ) 
		{
			if ( no_single!=0  ) //如果不是个位数,那么取消上一步的运算结果,并且将 a乘 10再加上下一个数字 
			{
				re = b;
				a = a*10 + (c-48);
			}
			else
			{
				a = c-48;
				no_single++;
			}
			
			//计算,并且用 b记录上次运算结果,防止计算错误 
			if ( flag == 0 )  
			{
				if ( flag_show==0 )
				{
					re = re*10 +a;
					no_single=0;
				}
				else
				{
					b = re;
					re += a;
				}
			}
			else if ( flag == 1 )
			{
				b = re;
				re -= a;
			}
			else if ( flag == 2 )
			{
				b = re;
				re *= a;
			}
			else if ( flag == 3 )
			{
				if ( a==0 )
				{
					error++;
				}
				else
				{
					b = re;
					re /= a;
				}
			}
			
		}
		else
		{
			error++;
		}
		
	}
	
	
	if ( error-1==0 )
	{
		printf("%d",re);
	}
	else
	{
		printf("ERROR");
	}
	
	return 0;
}

最终结果:
在这里插入图片描述
需要尤为注意
判断十位数、百位数的方法:

  1. 第一个字符需要单独判断,我用了一个 flag_show 变量,如果没有出现符号就恒为0,此时的 flag 恒为初始值 0,那么我只需要在 flag == 0 时判断一下 flag_show 是不是为 0 即可。
  2. 其它的字符使用 no_single 变量来判断,如果已经读入一个数字我会将 no_single++,如果出现符号就将 no_single 置为 0,一旦 no_single 不为 0,那么说明读入了连续两个数字,此时代表这一步运算出错(由于我读到字符马上就计算,所以会出错),这时将此时计算结果回到上一步(我用 b 来保存这个结果),再将上一位乘10加上新的数值就可以组成 10 位数,百位数亦可。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值