(1)while…EOF型
如果题目没有给定输入的结束条件,那么就默认读取到文件末尾。对黑盒测试来说,所
有输入数据都是放在一个文件里的,系统会让程序去读取这个文件里的输入数据,然后执行
程序并输出结果。那么如果题目没有指定何时结束输入,一般都是指输入完所有数据(即到
达文件末尾)为止。codeup1000就体现了这种输入要求。
那么如何解决这种输入要求呢?首先需要知道,虽然scanf函数平时可以直接作为一条语
句使用,但它也是有返回值的,scanf函数的返回值为其成功读入的参数的个数。这就是说,
如果语句scanf(”%d”,&n)成功读入了一个整数n,那么scanf的返回值就是1:如果语句
scanf"%d%d”,&n,&m)成功读入了两个整数n、m,那么scanf的返回值就是2。
于是可能会有读者问,仕么时候会读入失败?读入失败时scanf函数是否返回0?对前一
个问题我们需要知道,正常的控制台(屏幕黑框框)中的输入一般是不会失败的,只有在读
取文件时到达文件末尾导致的无法读取现象,才会产生读入失败。这个时候,scanf函数会返
回-1而不是0,且C语言中使用EOF(即End Of File)来代表-1。
这就给我们一个启发:当题目没有说明有多少数据需要读入时,就可以利用scanf的返回
值是否为EOF来判断输入是否结束。于是就有了下面这种写法:
while (scanf("%d", &n) != EOF) { }
上述代码的含义是:只要scanf的返回值不为EOF(即文件中的数据没有读完),就反复
读入n,执行while函数体的内容:当读入失败(到达文件末尾)时,结束while循环。
例题如下:
Codeup 1000 问题A:A+B输出练习I
题目描述
你的任务是计算a+b。这是为了acm初学者专门设计的题目。你肯定发现还有其他题目跟这道题的标题类似,这些问题也都是专门为初学者提供的。
输入:
输入包含一系列的a和b对,通过空格隔开。一对a和b占一行。
输出:
对于输入的每对a和b,你需要依次输出a、b的和。
如对于输入中的第二对a和b,在输出中它们的和应该也在第二行。
样例输入
1 5 10 20
样例输出
6 30
下面给出的是codeup 1000 A的通过代码:
#include <stdio.h> int main(){ int a,b; while(scanf("%d %d",&a,&b)!=EOF){ printf("%d\n",a+b);} return 0;
}
另外,当在黑框里输入数据时,并不会触发EOF状态。因此如果想要在黑框里面手动触
发EOF,可以按<Ctrl+Z>组合键,这时就会显示一个^Z,按<Enter>键就可以结束while了。
还需要指出,如果读入字符串,则有scanf("%s”,str)与gets(str)两种方式可用,其对应的
输入写法如下所示:
while(scanf("%s",str)!=EOF){ .... } while(gets(str)!= NULL){ .... }
(2)while…break型
例如codeup1002 就是当输入的两个a和b都为0时结束输入。
问题 C: A+B 输入输出练习III
题目描述
你的任务是计算a+b。
输入
输入中每行是一对a和b。其中会有一对是0和0标志着输入结束,且这一对不要计算。
输出
对于输入的每对a和b,你需要在相应的行输出a、b的和。
如第二对a和b,他们的和也输出在第二行。
样例输入
1 5 10 20 0 0
样例输出
6 30
这种类型是while….EOF型的延伸,题目要求当输入的数据满足某个条件时停止输入。
这种类型有两种写法,一种是在while.….EOF的内部进行判断,当满足退出条件时中断(break)
当前while循环,如下所示:
#include<stdio.h> int main() { int a, b; while (scanf("%d%d", &a, &b) != EOF) { if (a == 0 && b == 0) break; printf("%d\n", a + b); } return 0; }
而另一种更简洁的写法是,把退出条件的判断放到while语句中,令其与scanf用逗号隔
开,如下所示:
#include<stdio.h> int main() { int a, b; while (scanf("%d%d", &a, &b), a || b) { printf("%d\n", a + b); } return 0; }
上面循环条件的含义为,当a和b有一个不为0时就进行循环(循环条件 a || b 的全写为a !=0 || b!=0 )。
(3)while(T--)型
在这种类型中,题目会给出测试数据的组数,然后才给出相应数量组数的输入数据。例
如codeup1001就属于这种类型(即本节练习题中的B题)。
由于给定了测试数据的组数,因此需要用一个变量T来存储,并在程序开始时读入。在
卖入T后,下面就可以进行T次循环,每次循环解决一组数据的输入与输出,while(T--)就是
盾环执行T次的含义。下面的代码体现了这种写法:
#include<stdio.h> int main() { int T, a, b; scanf("%d", &T); while (T--) { scanf("%d%d", &a, &b); printf("%d\n", a + b); } return 0; }
以上就是多点测试的三种输入类型,下面开始将三种常见的输出类型
(1)正常输出
这种输出类型要求需要每两组输出数据中间没有额外的空行,即输出数据是连续的多行。
(2)每组数据输出之后都额外加一个空行
这个要求非常容易实现,只需要在每组输出结束之后额外输出一个换行符\n即可。例如
codeup1006体现了这种输出要求。
题目描述
你的任务是计算两个整数的和。
输入
输入包含若干行,每行输入两个整数a和b,由空格分隔。
输出
对于每组输入,输出a和b的和,每行输出后接一个空行。
样例输入
1 5
10 20
样例输出
6
30
代码如下:
#include <stdio.h> int main(){ int a,b,N; while(scanf("%d %d",&a,&b) != EOF){ printf("%d\n",a+b); printf("\n"); } return 0; }
(3)两组输出数据之间有一个空行,最后一组数据后面没有空行
这一般是在第三种输入类型while(T--)的情况下,只需要通过判断T是否已经减小到0来
判断是否应当输出额外的换行。例如codeup1007体现了这种输出要求
问题 H: A+B 输入输出练习VIII
题目描述
你的任务是计算若干整数的和。
输入
输入的第一行为一个整数N,接下来N行每行先输入一个整数M,然后在同一行内输入M个整数。
输出
对于每组输入,输出M个数的和,每组输出之间输出一个空行。
样例输入
3 4 1 2 3 4 5 1 2 3 4 5 3 1 2 3
样例输出
10 15 6
代码如下:
#include<stdio.h> int main() { int T, a,n; scanf("%d", &T); while (T--) { int sum = 0; scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%d", &a); sum = sum + a; } printf("%d\n", sum); if (T > 0) printf("\n"); } return 0; }
与这种要求类似的要求是:输出一行N个整数,每两个整数之间用空格隔开,最后一个
数后面不允许加上空格。做法是类似的,如下面的代码所示:
for (int i = 0; i < N; i++) { printf("%d", a[i]); if (i < N - 1) printf(" "); else printf("\n"); }
最后需要指出,在多点测试中,每一次循环都要重置一下变量和数组,否则在下一组数
据来临的时候变量和数组的状态就不是初始状态了。例如上面codeup1007的代码中,sum=0
的语句就必须放在while之内,如果放在while之外,则第二组数据来临时sum就不是0了。
而重置数组一般使用memset函数或fill函数。
原文:https://www.cnblogs.com/migang/p/14753555.html