输入输出
多组数据的处理
由于ACM竞赛题目的输入数据和输出数据一般有多组(不确定),并且格式多种多样。在输入和输出的格式上,跟学校的C语言作业是不一样的。C语言作业一般都是一组数据的处理,但OJ平台一般都是多组数据的处理(不要感觉加一个循环就行)。例如:
//请计算这个梯形的面积
#include <stdio.h>
int main()
{
int a,b,c,S;//a为上底,b为下底,c为高
printf("请依次输入梯形的上底,下底,高:");
scanf("%d%d%d",&a,&b,&c);
S=(a+b)*c/2;
printf("所求梯形的面积为:%d",S);
return 0;
}
通过运行和计算可以看出,这道题只需要进行一次数据的输入,程序就结束了。
OJ平台的一个程序是需要进行多组数据的输入输出的。例如:
(题目:HDU1000)
#include <stdio.h>
int main()
{
int a,b;
while(scanf("%d%d",&a,&b)==2)
printf("%d\n",a+b);
return 0;
}
如果你提交的是下面的代码
#include<stdio.h>
int main()
{
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",a+b);
return 0;
}
OJ会因为无法再次进行数据的输入而直接判你为错。
那有的人就会说,如果是要求多组数据,那么我直接来一个死循环不就行了?那么OJ平台也会很简答粗暴的判你超时。就像下面这样:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int m,n;
while(1)
{
scanf("%d%d",&m,&n);
printf("%d\n",m+n);
}
return 0;
}
不信的话,就可以提交一下。
下面介绍一下几种常见的数据的输入输出:
输入
核心内容:scanf
函数的返回值是成功读取数据的个数
不给你说有几组输入
常见形式如下(HDU1089):
这道题在C语言的角度来看,是极为简单的,只需要写出下面的代码即可:
#include<stdio.h>
int main()
{
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",a+b);
return 0;
}
但是在OJ上,这道题就是错的。因为它无法读入多组数据。应当写成
#include <stdio.h>
int main()
{
int a,b;
while(scanf("%d%d",&a,&b)!=EOF)
printf("%d\n",a+b);
return 0;
}
此处注意的是scanf的含义是成功读取数据的个数。 C语言中,EOF常被作为文件结束的标志。还有很多文件处理函数处错误后的返回值也是EOF,因此常被用来判断调用一个函数是否成功(如果还不清楚就去查查EOF的含义),EOF的值为-1。 当然如果对EOF的理解不深刻的话,程序也可以写成下面的形式:
#include <stdio.h>
int main()
{
int a,b;
while(scanf("%d%d",&a,&b)==2)
printf("%d\n",a+b);
return 0;
}
假如OJ上有三组测试数据,据需要输入到程序中,那么下面的程序就可以正确的在程序运行结束之前输入OJ想要测试的数据。那么我们分析一下我们的第一个程序,首先进入while循环,因为我们输入的数据一直都是两个数,所以2!=-1因此在程序结束之前,循环会一直进行下去,直到OJ的测试数据结束。与C语言的思路写出的程序相比,这个程序不仅可以处理多组数据而且可以在程序结束的时候也可以顺利结束。
为什么还有后面的那个好处?因为有的人想使用循环去处理数据,那么就会有一个问题,就是程序该结束的时候不结束。
给你说输入几组
常见格式如下(HDU1090):
在程序的一开始就告诉你要输入几组数据,然后直接一个循环就行。
#include <stdio.h>
int main()
{
int n,i,a,b;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d%d",&a,&b);
printf("%d\n",a+b);
}
return 0;
}
就像上面的这个,它给你说它就两组数据了,你只需要做n组循环就行了。所以你即使只知道C语言的答题方式,你也可以写出来。
不给你说有几组输入,但是会有一个特殊输入作为结束标志。
常见格式如下(HDU1091):
这种类型与第一种相比,多了一个结束的标志。在书写程序的时候只需要加上程序结束的标志即可。
#include <stdio.h>
int main()
{
int a,b;
while (scanf("%d%d",&a,&b)==2)
{
if(a==0&&b==0) break;
printf("%d\n",a+b);
}
return 0;
}
输出
两组数据之间没有空行
常见格式(HDU1089)
每一个输出对应一个输出,输出之间没有空行。
通过观察可以得知,两组数据之间不存在空行,输入的每一行对应输出的每一行。
两组数据之间存在空行
常见格式(HDU1095):一个输入对应一个输出,每个输出之间都有空行,每个输出之后都有空行。
#include<stdio.h>
int main()
{
int m,n,j,sum;
while(scanf("%d%d",&m,&n)!=EOF)
{
sum=m+n;
printf("%d\n\n",sum);//此处就是多打印出一个换行符
}
}
输出之间有空行
一个输入对应一个输出,输出之间有空行(最后一组数据没有空行)。
常见格式(HDU1001):
处理方式有两种,个人感觉第一种好一点。
第一种:把最后一个特殊处理,前面每一组数据加两个换行符,最后一组数据加一个回车,把最后一个数据特殊处理。即:
第二种:把第一个特殊处理,把第一个正常输出一个数,不进行换行操作,但是在后续操作中,把前面一个换行符和下一个数据一同处理。
int a,b,sum = 0,i=1;
while(scanf("%d",&b)!=EOF)
{
for(i =1;i<=b;i++)
sum+=i;
printf("%d\n\n",sum);
sum=0;
}
return 0;
刷题:HDU1089~1096,后续闲下来的话,会写题解