解题思路:
这道题目有很多的限制,完全可以拿来好好利用。
“每道题目(包括弟弟的答案)的 格式为 a+b=c 或者 a-b=c,其中a和b是作业中给出的,均为不超过100的非负整数;c是弟弟算出的答案,可能是不超过200的非负整数,也可能是单个字符"?",表示他不会算。”
“输入文件包含不超过100行,以文件结束符结尾。每行包含一道题目,格式保证符合上述规定,且不包含任何空白字符。输入的所有整数均不含前导0。”
1.直接按照格式 scanf("%d%c%d=%d",&a,&op,&b,&c) 读取。
2.判断读入是否正常,不正常 则清除缓冲区,继续下一次读入。
正常 则判断计算,计算正确得分加一。
参考代码:
#include<stdio.h> main() { char op; int a,b,c,k,score=0; while(~(k=scanf("%d%c%d=%d",&a,&op,&b,&c))){ if(k==3) getchar();//读取缓存区回车 else if(op=='+' && c==a+b) score++; else if(c==a-b) score++; } printf("%d",score); }
0.0分
124 人评分
试了一下,感觉这个程序还是很优秀,虽然在第二个else if那逻辑出现了问题(应该是考虑op='-',不然所有a+a=0的算式都算对。)但总的来看还是学了不少东西。 1.对于while判断条件取反,我试了下,这里scanf语句的返回值即k 有-1,0,1,2,3,4这些值,其中只有0才能终止循环,取反后-1对应0;0对应-1;1,2,3,4取反对应-2,要终止循环,就得输入文件结束符,Ctrl+z,使得k=-1,取反后为0。 2.对于k=3,这里为什么不是k=4,因为有可能结果为?,不是int类型,所以读取会出错,这时读取的值是3。另外排除了0,1,2等乱七八糟的情况。
这个答案错了,可以试试1+1=0
不是很明白getchar的作用,如果是读取回车为什么是k==3而不是k==4呢
while(~(k=scanf("%d%c%d=%d",&a,&op,&b,&c))) 大佬,这句是干什么用的吖
pingfan443 2019-10-07 16:17:40 |
k用来读取scanf函数的返回值,~代表取反 还是不懂可以去看 训练题第一道题的题解 第一个人讲的很详细 关于scanf函数的返回值 以及文件的结尾
Tourist 2019-11-09 11:12:48 |
谢谢,我懂了
諾言╮ 2020-08-14 22:47:07 |
那可不可以写成scanf("%d%c%d=%d",&a,&op,&b,&c)!=EOF
諾言╮ 2020-08-14 22:47:17 |
@AmosAlbert ?
零露 2021-12-04 17:36:20 |
不考虑op也可以的 ,题目说了,不是+就是-,只有两种可能,所以作者没有考虑