ACM基本输入输出

       在开始做ACM时,会面临一个输入输出数据的问题,ACM里的输入输出数据和平时的写程序不大一样。为什么会不一样呢,这就牵涉到评测系统怎么判断你提交的程序是正确的。实际上评测系统是把程序的标准输入输出数据都是放在文本文件里,你提交的程序会先经过编译,然后运行,从输入文件中读取数据,然后把结果输出到一个文本文件中,评测系统再把标准的输出文件和你提交的程序运行的结果的输出文件进行对比,从而判断你提交的程序的正确与否。既然是这样,要判断提交的程序的正确性就依赖于系统的测试数据,这时就不可能只是用一组测试数据来判断程序的正确性,需要有很多组测试数据,而国际ACM比赛标准的评测系统是PC2,它只支持一个题目一个输入数据文件、一个输出数据文件。所以这时候就得把多组测试数据放在一个文件里,提交的程序必须把这个文件里的多组输入数据都得出结果。

一、输入:

  1、只有一组测试数据,这时候是最简单的了,请看题目SDUTOJ1000

C语言代码:

#include < stdio.h >
int main()
{
int a,b;
scanf(
"%d %d",&a, &b);
printf(
"%d\n",a+b);
return 0;
}

C++语言代码:

#include < iostream >
using namespace std;
int main()
{
int a,b;
cin
>> a >> b;
cout
<< a+b << endl;
return 0;
}

  2、有多组测试数据,直到读至输入文件结尾为止,这时需要用到while(scanf("%d",&n)!=EOF)或while (cin>>n),请看题目:SDUTOJ1010

C语言代码:

#include < stdio.h >
int main()
{
int a,b;
while(scanf("%d %d",&a, &b) != EOF)
printf(
"%d\n",a+b);
return 0;
}

 说明:scanf函数返回值就是读出的变量个数,如:scanf( “%d %d”, &a, &b );如果只有一个整数输入,返回值是1,如果有两个整数输入,返回值是2,如果一个都没有,则返回值是-1。EOF是一个预定义的常量,等于-1。

C++语言代码:

#include < iostream >
using namespace std;
int main()
{
int a,b;
while(cin >> a >> b)
cout
<< a+b << endl;
return 0;
}

 3、 在开始的时候输入一个N,接下来是N组数据,请看题目:SDUTOJ1011

C语言代码:

#include<stdio.h>
int main()
{
int n,i;
int a,b;
scanf(
"%d",&n);
for(i=0;i<n;i++)
{
scanf(
"%d%d",&a,&b);
printf(
"%d\n",a+b);
}
return 0;
}

或者

#include<stdio.h>

int main() {
int n, i;
int a, b;
scanf(
"%d", &n);
while (n--) {
scanf(
"%d%d", &a, &b);
printf(
"%d\n", a + b);
}
return 0;
}

C++代码:

#include <iostream>
using namespace std;
int main() {
int a, b, n;
cin
>> n;
while (n--) {
cout
<< a + b << endl;
}
return 0;
}

  4、  输入不说明有多少组数据,但以某个特殊输入为结束标志。请看题目:SDUTOJ1012,这个题目是以0 0 代表输入结束。

C语言代码:

#include <stdio.h>
int main()
{
int a,b;
while(scanf("%d %d",&a, &b) &&(a||b))
printf(
"%d\n",a+b);
}

C++语言代码:

#include<iostream>
using namespace std;
int main()
{
int a ,b;
while(cin>>a>>b&&(a||b))
{cout
<<a+b<<endl;}
return 0;
}

  5、还有一种是前几种的组合,请看题目:SDUTOJ1013

C语言代码:

#include<stdio.h>
int main()
{
int n,sum,a;
while(scanf("%d",&n) && n)
{
sum
=0;
while(n--)
{
scanf(
"%d",&a);
sum
+=a;
}
printf(
"%d\n",sum);
}
return 0;
}

C++语言代码:

#include<iostream>
using namespace std;
int main()
{
int n,sum,a;
while(cin>>n&&n)
{
sum
=0;
while(n--)
{
cin
>>a;
sum
+=a;
}
cout
<<sum<<endl;
}
return 0;
}  

  6、输入字符串。  

    输入是一整行的字符串的,C语法:
    char buf[20];
    gets(buf);
    C++语法:
    如果用string buf;来保存:
           getline( cin , buf );
    如果用char buf[ 255 ]; 来保存:
          cin.getline( buf, 255 );
       scanf(“ %s%s”,str1,str2),在多个字符串之间用一个或多个空格分隔;
    若使用gets函数,应为gets(str1); gets(str2); 字符串之间用回车符作分隔。
    通常情况下,接受短字符用scanf函数,接受长字符用gets函数。
     而getchar函数每次只接受一个字符,经常c=getchar()这样来使用。
    getline 是一个函数,它可以接受用户的输入的字符,直到已达指定个数,或者用户输入了特定的字符。它的函数声明形式(函数原型)如下:
          istream& getline(char line[], int size, char endchar = '\n');
    不用管它的返回类型,来关心它的三个参数:
    char line[]: 就是一个字符数组,用户输入的内容将存入在该数组内。
    int size : 最多接受几个字符?用户超过size的输入都将不被接受。
    char endchar :当用户输入endchar指定的字符时,自动结束。默认是回车符。
    结合后两个参数,getline可以方便地实现: 用户最多输入指定个数的字符,如果超过,则仅指定个数的前面字符有效,如果没有超过,则用户可以通过回车来结束输入。
    char name[4];cin.getline(name,4,'\n');
    由于 endchar 默认已经是 '\n',所以后面那行也可以写成:
    cin.getline(name,4);
    最后需要说明的是,C++的输入输出流用起来比较方便,但速度比C要慢得多。在输入输出量巨大时,用C++很可能超时,应采用C的输入输出。

二、输出:

  输出有不同的格式要求,不注意的话经常会出现“Presentation Error”,而且PC2很多时候还判断不出来输出格式错误,就简单的判为"Wrong Answer",所以输出格式一定要注意。

  1、一组输出接着一组输出,中间没有空行,这也是最简单的,请看题目SDUTOJ1010

C语言代码:

#include < stdio.h >
int main() //把main函数定义成int类型
{
int a,b;
while(scanf("%d %d",&a, &b) != EOF)
printf(
"%d\n",a+b);
return 0;
}

每输出一组结果换行就可以了。

  2、一组接着一组,每一组后面有一空行。请看SDUTOJ1016

C语言代码:

#include<stdio.h>

int main() {
int a, b;
while (scanf("%d%d", &a, &b) != EOF)
printf(
"%d\n\n", a + b);
return 0;
}

每输出一组结果后输出两个换行就可以了。

  3、一组接着一组,每两组之间有一个空行,注意与前一种区分开,请看题目:SDUTOJ1017  

#include<stdio.h>

int main() {
int n,m,sum,a;
int i;
scanf(
"%d",&n);
for (i = 0; i < n;i++) {
scanf(
"%d",&m);
sum
= 0;
while (m--){
scanf(
"%d",&a);
sum
+=a;
}
printf(
"%d\n",sum);
if (i != n-1)
printf(
"\n");
}
return 0;
}
判断是否到达最后一组测试数据了,如果不是最后一组测试数据就多输出一个换行

posted on 2011-04-08 14:36 chenqiangjsj 阅读(...) 评论(...) 编辑 收藏

导航

公告