本文章是杭电ACM在线刷题记录第一篇,刷题主要是为了提高自己的编程能力和快速应答能力。学习没有理由,只是想让自己变得更优秀。
原题回顾
Problem Description
Calculate A + B
Input
Each line will contain two integers A and B. Process to end of file.
Output
For each case, output A + B in one line.
Sample Input
1 1
Sample Output
2
这题看似是非常简单的,凡是学过c语言的人基本都能写出相应的意思,但是在在线系统上要完全正确的提交上自己的代码,还是有点难度的,下面我们就来看看几种常见的错误。
NO.1 错误点一
大家很容易写出如下类似普遍错误的代码:
#include <stdio.h>
int main(void)
{
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",a+b);
return 0;
}
当你信心满满的将上述代码提交之后发现结果是wrong answer,什么原因呢?那就怪自己看题太粗心,再看看我们题目描述“For each case”,貌似自己的代码没有这个功能体现吧,在这里不只是一个测试用例,而是很多个,怎么体现可以使用很多个用例呢?当然是循环了,必须将输入输出语句用循环括起来。然后再把改过后的代码进行提交,发现结果是另一种报错“Output Limit Exceeded ”,看吧,有没有崩溃的感觉,这么简单的一道题竟然弄了几次还不对,顿时感觉自己弱爆了吧。下面正是我们的另一个错误。
NO.2 错误点二
当你还为自己的错在哪里一头雾水沉思的时候,最好的办法就是回到原题要求,看看自己还漏下什么没有体现的。当你看到“ Process to end of file.”这一句的时候恍然大悟了吧,这一句是什么意思呢?他的意思就是就是处理到文件的结束,这道题的意思就是读一个文件,把每一行的两个数字加起来,然后打印出来,直到文件末尾。这个我们就需要从scanf函数的定义说起。函数 scanf() 是从标准输入流stdio (标准输入设备,一般是键盘)中读内容的通用子程序,可以说明的格式读入多个字符,并保存在对应地址的变量中。
其调用形式为:
scanf(“<格式说明字符串>”,<变量地址>);
变量地址要求有效,并且与格式说明的次序一致。scanf()函数返回成功赋值的数据项数,读到文件末尾出错时则返回EOF。例如:
scanf("%d %d",&a,&b);
- 如果a和b都被成功读入,那么scanf的返回值就是2
- 如果只有a被成功读入,返回值为1
- 如果a和b都未被成功读入,返回值为0
- 如果遇到错误或遇到end of file,返回值为EOF。
且返回值为int型.
所以我们的代码中在读取流的时候必须有EOF判断,EOF其实是一个宏,他的值为-1。
好了,这是这道题常见的两种错误,做错了不要紧,积累经验,将知识慢慢捡起来你就成功了。正确的代码如下:
#include <stdio.h>
int main(void)
{
int a,b;
while(scanf("%d%d",&a,&b)!=EOF)
{
printf("%d\n",a+b);
}
return 0;
}
当你看到结果是Accept,一种自豪感油然而生。