首页 > 其他 > 详细

Codeup 1000 A+B输出练习

时间:2021-05-11 17:19:58      阅读:30      评论:0      收藏:0      [点我收藏+]

 

(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体现了这种输出要求。

问题 G: A+B 输入输出练习VII

题目描述
你的任务是计算两个整数的和。
输入
输入包含若干行,每行输入两个整数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函数

 

Codeup 1000 A+B输出练习

原文:https://www.cnblogs.com/migang/p/14753555.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!