P1957 口算练习题 C语言实现~

难度标签是普及-,对我这个蒟蒻来说应该是不难完成但是也要费一点劲的)

通读题目,大概理解了题目的需求,输出时第二行输出该运算式的总长度,很容易想到printf函数的返回值

简单来说,输出成功时,printf函数会返回输出的字符数量,包括数字,字母,标点符号,空格,转义字符

以本题的‘a’即加法为例,

k = printf("%d+%d=%d\n", a[i][1], a[i][2], a[i][1] + a[i][2]);
printf("%d\n", k-1);

 另外,由于转义字符'\n'也包含在输出内容中,输出总长度k时需要-1,当然,另写一句putchar('\n')也完全可行。

创建一个二维数组用来存储输入的数据,第一个存储abc即运算类型,后两个位置存储运算数据

int a[50][3];

 输出就很好写啦:

for (int i = 0; i < n; i++)
{
	if (a[i][0] == 'a')
	{
		k = printf("%d+%d=%d\n", a[i][1], a[i][2], a[i][1] + a[i][2]);
		printf("%d\n", k-1);
	}
	if (a[i][0] == 'b')
	{
		k = printf("%d-%d=%d\n", a[i][1], a[i][2], a[i][1] - a[i][2]);
		printf("%d\n", k-1);
	}		
	if (a[i][0] == 'c')
	{
		k = printf("%d*%d=%d\n", a[i][1], a[i][2], a[i][1] * a[i][2]);
		printf("%d\n", k-1);
	}
}

输出解决完后,再来关注本题困住蒟蒻们的一个点

若该行为两个数据,则表示本题的运算类型与上一题的运算类型相同,而这两个数据为运算数。

也就是说,在数据输入时,可能是三个数据,也可能是两个数据,并且后者的情况在输出时还需要用到上一行甚至上n行的第一个数据(运算符)

刚开始写时,我对我该如何储存第一个数据造成了很大的困惑,并且也不知道该如何处理输入只有两个数据时的输出

针对第一个问题,应该有更方便的处理方法,不过我这个蒟蒻只能想到下面这个了

首先

创建一个字符串数组来存储第一个输入

char ch[5];

(没什么好说的)

输入第一个数据时,单独写一个输入

scanf("%s",ch);

不管第一个数据是数字还是字母,都会被一位一位的存储进ch中

判断:

if (ch[0] < 'a' || ch[0]>'c')
/*...*/
else
/*...*/

由于需要判断第一个输入数据是数字,还是'abc'中的某一个,取字符串数组ch的第一个数据出来做判断就可以啦!

接下来是第二个问题,如果输入是两个数据,该如何统一存储进数组a[50][3]方便后续输出呢?

本蒟蒻第一想到的方法是创建一个tmp变量用来“缓存”第一个数据,也就是运算符,如果是三个数据,就把第一个数据存储在tmp变量中;两个数据输入时,便把tmp赋给数组第一个数据;再次遇到三个输入时,更新tmp变量

代码实现:

for (int i = 0; i < n; i++)
{
	scanf("%s",ch);
	if (ch[0] < 'a' || ch[0]>'c')
	{
		a[i][0] = tmp;
		a[i][1] = atoi(ch);
		scanf("%d", &a[i][2]);
	}
	else
	{
		a[i][0] = ch[0];
		tmp = ch[0];
		scanf("%d %d", &a[i][1], &a[i][2]);
	}
}

另外,if中出现的atoi()函数的作用是把字符串中的整数提取出来(int),具体使用有特殊的规则~可以自己去查找一下~

蒟蒻代码金刚,合体!(洛谷不要直接复制我的代码哦~)

int main()
{
	int n;
	scanf("%d", &n);
	getchar();
	int a[50][3];
	int tmp = 0;
	char ch[5];
	for (int i = 0; i < n; i++)
	{
		scanf("%s",ch);
		if (ch[0] < 'a' || ch[0]>'c')
		{
			a[i][0] = tmp;
			a[i][1] = atoi(ch);
			scanf("%d", &a[i][2]);
		}
		else
		{
			a[i][0] = ch[0];
			tmp = ch[0];
			scanf("%d %d", &a[i][1], &a[i][2]);
			
		}
	}
	int k = 0;
	for (int i = 0; i < n; i++)
	{
		if (a[i][0] == 'a')
		{
			k = printf("%d+%d=%d\n", a[i][1], a[i][2], a[i][1] + a[i][2]);
			printf("%d\n", k-1);
		}
		if (a[i][0] == 'b')
		{
			k = printf("%d-%d=%d\n", a[i][1], a[i][2], a[i][1] - a[i][2]);
			printf("%d\n", k-1);
		}		
		if (a[i][0] == 'c')
		{
			k = printf("%d*%d=%d\n", a[i][1], a[i][2], a[i][1] * a[i][2]);
			printf("%d\n", k-1);
		}

	}
	return 0;
}

(库的调用懒得打了)

  • 14
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值