本章开始,将以简单的A+B问题为例,着重讲解ACM、蓝桥杯比赛种的输入输出格式,让大家快速了解学习
题目为英文描述,但题目非常简单,故不用在意英文。
本节题目详细描述及提交评测见:A + B | 问题
本题的题目非常简单,就是求a+b的和的问题,不存在大数问题,因此非常简单,唯独需要注意的题目当中描述有提到多组数据,且样例中也明显举例:
1 5
10 20
输出
6
30
所以非常明显,即要求你的程序接收两个数字1 5算出和为6输出之后还能继续接收10 20输出30,因此程序一定要有循环可以不断的接收才可以实现题目多组输入的要求。这是很多初学C语言的同学所不理解的,也无法完成的。
故而,我们给大家介绍本题的写法,首先以大家都熟悉的C语言为例,先看完整的代码:
#include<stdio.h>
int main()
{
int a,b;
while(scanf(“%d%d”,&a,&b)==2) //利用scanf的返回值
{
printf(“%d\n”,a+b);
}
return 0;
}
请大家注意,输出两个数的和几乎没有难度,这是大家都能理解的。本题最大的难度在于使用循环接收,并且将scanf接收的语句优雅的放到了while循环里,通过判断scanf返回值是否等于2来作为循环条件。
这可能是许多初学编程同学无法理解的(还能这么写?这是啥意思!)
如果大家明白:scanf函数也是有返回值的,其返回值的意义表示成功接收变量的数量,那么这种写法就不难理解了
本代码即,接收两个数字,如果接收成功,那么进去循环,计算两个数的和。进而继续等待接受下一组数据。
当然,你可能不禁要问,scanf难道还有不接收成功的时候吗?有的!
一旦属于的数据过多,其大小超过了一个缓冲文件的大小,是有接收不到两个数字的时候,scanf可能返回1甚至0甚至-1,详细scanf的返回值可以参考这篇文章 scanf 函数用法末尾部分
那么,大家再来看代码想必也就豁然开朗了!对于另外一种写法,大家也就能理解了,即将scanf的返回值与EOF相比,代码如下:
#include<stdio.h>
int main()
{
int a,b;
while(scanf(“%d%d”,&a,&b)!=EOF) //利用scanf的返回值
{
printf(“%d\n”,a+b);
}
return 0;
}
C语言中EOF是什么意思
大家在C/C++的学习训练中,会看到EOF这个东西,但在常见的教材上往往没有EOF这样的写法,下面为大家详细介绍
首先大家明确一点,教材上没有,并不是没有给大家讲解完整,大家应该借助我们学习的语法来理解这个东西是什么EOF,如果完整学习过C语言,看到三个大写字母,你首先应该联想到C语言当中的宏定义,因为宏定义有个不成文的规定,那就是宏名往往是大写,因此我们就可以按照这个思路,在编译器当中查找这个宏定义是否存在来验证。
EOF本身就是一个-1的常量! 通过宏定义起了一个别名而已!
为什么叫EOF是因为文件末尾的英文翻译过来是End of File,因此取前三个字母就是EOF了!所以EOF通常用来表示已经到达文件末尾的意思。
那么相应的,在ACM或蓝桥杯等程序竞赛中,大家在经常会看到类似while(scanf("%d",&a)!=EOF)这样的代码的时候也就明白什么意思了吧!
很明显,是通过判断scanf的返回值与-1相比作为while的循环条件,不断的接收用户从键盘输入的值来达到效果。
下面,其他语言版本的代码也就触类旁通了
C++代码版本:
#include<iostream>
using namespace std;
int main()
{
int a,b;
while(cin>>a>>b)
cout<<(a+b)<<endl;
return 0;
}
Java代码版本:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
int a = scanner.nextInt();
int b = scanner.nextInt();
int c = a + b;
System.out.println(c);
}
}
}
Python代码版本:
while True:
try:
a,b=map(int,input().strip().split())
print(a+b)
except:
break