编程挑战系统的输入和输出详细说明

在高校俱乐部线上编程挑战中,一道题目的所有测试数据是放在一个文本文件中,选手将一道题目的程序提交给评判系统运行,程序从该文件中读取测试数据,再把运行结果输出到另一个文本文件中。系统把输出文件与标准答案比对,来评判程序编写得正确与否。

本系统采用标准的输入输出,输入结束有文件末尾标识(EOF),这可以用于确定输入结束。

一、四种基本输入形式

1.      一组输入数据

示例:整数求和

描述

给定两个整数,求它们之和。

输入

两个整数A,B.

输出

两个整数的和。

样例输入

1 2

样例输出

3

在此列出用C/C++语言的答题示例如下:

C语法:

#include <stdio.h>

int main()

{

 int a,b;

 scanf("%d %d",&a, &b);

 printf("%d\n",a+b);

}

注意:输入前不要打印提示信息。输出完毕后立即终止程序,不要等待用户按键。

C++语法:

#include<iostream>

using namespace std;

int main()

{

 int a ,b;

 cin>>a>>b;

 cout<<a+b<<endl;

 return 0;

}

Java语法:

import java.util.*;

public class Main

{

     public static void main(String [] args)

     {

            Scanner cin = new Scanner(System.in);

            int a = cin.nextInt();

            int b = cin.nextInt();

            System.out.println(a+b);

            cin.close();

     }

 }

C#语法:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ConsoleApplication1

{

    class Program

    {

        static void Main(string[] args)

        {

           string[] ss = Console.ReadLine().Split();

            Console.WriteLine(int.Parse(ss[0]) + int.Parse(ss[1]));

        }

     }

  }

2.      多组输入数据,不说明多少组,直到读至输入文件末尾为止

示例:整数求和

描述

给定两个整数,求它们之和。

输入

输入由一系列包含两个整数的数组构成,由两个数字由空格分开,一行一组数据

输出

针对每组输入数据,输出之和

样例输入

2 7

样例输出

9

在此列出用C/C++语言的答题示例如下:

C语法:

#include <stdio.h>

int main()

{

 int a,b;

 while (scanf("%d %d",&a, &b) != EOF)

 printf("%d\n",a+b);

}

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

C++语法:

#include<iostream>

using namespace std;

int main()

{

 int a ,b;

 while (cin>>a>>b)

 cout<<a+b<<endl;

 return 0;

}

cin是一个对象,表达式cin >> m >> n在读入发生错误返回0,否则返回cin的地址。

Java语法:

import java.util.*;

public class Main

{

     public static void main(String [] args)

     {

            Scanner cin = new Scanner(System.in);

            int a ,b;

            while(cin.hasNext())

      {

a= cin.nextInt();

b=cin.nextInt();

System.out.println(a+b);

        }

        cin.close();

    }

}

C#语法:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ConsoleApplication1

{

    class Program

    {

        static void Main(string[] args)

        {

            string line;

            while ((line = Console.ReadLine()) != null)

            {

                string[] ss = line.Split();

                Console.WriteLine(int.Parse(ss[0]) + int.Parse(ss[1]));

            }

        }

    }

}

3.      多组输入数据,不说明多少组,以某特殊输入为结束标志

示例:整数求和

描述

给定两个整数,求它们之和。

输入

输入由一系列包含两个整数的数组构成,由空格分开,一行一组数据。最后一行为0 0,且不做运算处理;

输出

针对每组输入数据,输出之和

样例输入

2 7

1 6

0 0

样例输出

9

在此列出用C/C++语言的答题示例如下:

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;

}

Java语法:

import java.util.*;

public class Main

{

     public static void main(String [] args)

     {

            Scanner cin = new Scanner(System.in);

            int a ,b;

            while(cin.hasNext())

            {

a= cin.nextInt();

b=cin.nextInt();

if(a==0&&b==0)break;

System.out.println(a+b);

 }

            cin.close();

        }

  }

C#语法:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ConsoleApplication1

{

    class Program

    {

        static void Main(string[] args)

        {

            string line;

            int a, b;

            while ((line = Console.ReadLine()) != null)

            {

                string[] ss = line.Split();

                a=int.Parse(ss[0]);

                b=int.Parse(ss[1]);

                if (a == 0 && b == 0) break;

                Console.WriteLine(a+b);

            }

        }

    }

}

4.      多组输入数据,开始输入一个N,接下来是N组数据

示例:整数求和

描述

给定两个整数,求它们之和。

输入

输入数据每行由N开头,

输入由一系列包含两个整数的数组构成,由空格分开,一行一组数据。第一行为N,表明后续数组的个数;

输出

针对每组输入数据,输出之和

样例输入

2

1 6

5 3

样例输出

7

8

在此列出用C/C++语言的答题示例如下:

C语法:

#include<stdio.h>

int main()

{

 int a ,b,n;

 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--)

 {

 cin>>a>>b;

 cout<<a+b<<endl;

 }

 return 0;

}

Java语法:

import java.util.*;

public class Main

{

     public static void main(String [] args)

     {

            Scanner cin = new Scanner(System.in);

            int a ,b,n=cin.nextInt();;

            while((n--)>0)

           {

a= cin.nextInt();

b=cin.nextInt();

System.out.println(a+b);

}

            cin.close();

        }

   }

C#语法:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ConsoleApplication1

{

    class Program

    {

        static void Main(string[] args)

        {

            int n = int.Parse(Console.ReadLine());

            while ((n--)>0)

            {

                string[] ss = Console.ReadLine().Split();

                Console.WriteLine(int.Parse(ss[0]) + int.Parse(ss[1]));

            }

        }

    }

}

二、字符串输入

对字符串的输入分三种情况:

1.      每个字符串中不含空格、制表符及回车

这种情况,用scanf("%s",str)是再好不过的了,比如,测试数据中只有两个字符串:abc def

要读入abc与def,可以这样写:

char str1[1000], str2[1000];

scanf("%s%s", str1, str2);

2.      字符串中含有空格、制表符,但不含回车

对于这种情况,scanf("%s",str)无能为力,因为scanf用空格、制表符及回车作为字符串的分界符。对于一个含有空格、制表符及回车的字符串,如果用scanf("%s",str)来读,将读到若干个字符串,这个字符串被scanf分开了。

可以用另外一个函数gets。gets函数用回车作为字符串的分界符,比如,有以下的一个字符串:

Hello world!

要读入这个字符串,这样写:

char str[1000];

gets(str);

这样,str的内容就是"Hello world!"了。另外,gets返回NULL表示出错或end of file。

3.      字符串中含回车

在这种情况下,如果没有题目的说明,程序无法知道哪里是字符串的分界。那么,用scanf("%c",&ch)来读,一边读,一边判断分界条件是否满足,如果满足,则把当前读到的东西存到一个字符串中。

三、输出处理

在初次接触ACM程序设计竞赛时,可能认为:样例中都是输入数据和输入数据在一起,输出结果和输出结果在一起,可能会开个数组,把每组的结果存起来,等输入完了再一起输出。当遇到不知有多少组测试数据的题,就难以处理了。

在高校俱乐部线上编程挑战中,输入数据和输出数据是分别在两个不同的文件中进行的,程序的输入和输出是相互独立的,所以读入一组数据就输出一组结果,跟先读入所有数据再输出所有的结果,效果是完全一样的。因此,每当处理完一组测试数据,就应当按题目要求进行相应的输出操作。而不必将所有结果储存起来一起输出。在处理输出时,一般要注意:每行输出均以回车符结束,包括最后一行。

1.      关于空行(Blank line)

很多题目都要求在输出数据的恰当位置加空行。一个空行就是一个单独的"\n"。这里,有的题目说:“After each test case, you should output one blank line”,而有的题目说:“Between each test case, you should ouput one blank line”。要注意After和Between的区别,因为如果多了一或少了空行,将导致Presentation Error甚至Wrong Answer。

(1)    After

这种情况最简单,只需要输出结果后,再加一个printf("\n")或puts("")就行了,就像这样:

int i;

for (i = 0; i < 10; i++)

{

 printf("%d\n", a);

 printf("\n");

}

在此列出用C/C++语言的答题示例如下:

示例:整数求和

描述

给定几个整数,求它们之和。

输入

输入包含多个测试用例。每个测试用例包含N+1个整数,第一位为整数N,后面跟随N个整数;

最后一行第一位数字为0,此行不做运算处理。

输出

对每一行输入数据求和;最后一行输出空行

样例输入

4 1 2 3 4

5 1 2 3 4 5

0

样例输出

10

15

程序示例:

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);

printf("\n");

   }

   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;

 cout<<endl;

}

   return 0;

}

Java语法:

import java.util.*;

public class Main

{

     public static void main(String [] args)

            {

                   Scanner cin = new Scanner(System.in);

                   int x,n,sum;

                   while(cin.hasNext())

                    {

n= cin.nextInt();

if(n<=0)break;

sum=0;

while((n--)>0)

{

x=cin.nextInt();

sum+=x;

}

System.out.println(sum);

}

                   cin.close();

     }

}

C#语法:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            string line;
            int n,sum;
            while ((line = Console.ReadLine()) != null)
            {
                n = int.Parse(line);
                if (n <= 0) break;
                sum = 0;
                string[] ss = Console.ReadLine().Split();
                for (int i = 0; i < n; ++i)
                {
                    sum += int.Parse(ss[i]);
                }
                Console.WriteLine(sum);
            }
        }
    }
}

(2)    Between

Between和After不同的是,最后一组结果后面不应该再加单独的"\n",应该像这样:

int i;

for (i = 0; i < 10; i++)

{

   printf("%d\n", a);

   if (i != 9)

     printf("\n");

}

由于有时候我们并不知道测试数据有几组(比如测试数据是以end of file 结束的),用上面的方法就不行了,于是,可以换一种写法:

int a;

bool bFirst = true;

while (scanf("%d", &a) == 1)

{

   if (!bFirst)

     puts("");

   else

     bFirst = false;

   printf("%d\n", a);

}

这样,从第二组测试数据起,在输出每组测试数据的结果之前就会输出一个空行,和想要的效果是一样的。

2.      关于空格、逗号以及其他分隔符

这种情况与空行的情况相当相似,处理方法也是一样的,只不过把"\n"改成相应的分隔符就行了。

3.      带格式的字符串输出

有些题目要求输出这样的字符串

abc*****de****f

其中“*”代表空格。

要求是这样的:str1在前5个字符中左对齐,str2在第6到第10个字符中右对齐,str3在第11到第15个字符中右对齐。

可行的做法是,先初始化一个数组,用‘ ‘(空格)填充,再在相应的位置填相应的内容。用程序来表述:

01:char str[1000];

02:char str1[] = "abc", str2[] = "de", str3[] = "f";

03:memset(str, ‘ ‘, 1000 * sizeof(char));

04:sprintf(str, "%s", str1);

05:str[strlen(str1)] = ‘ ‘;

06:sprintf(str + 5, "%5s", str2);

07:str[10] = ‘ ‘;

08:sprintf(str + 10, "%5s", str3);

09:str[15] = ‘\0‘;

10:puts(str);

关键的部分:

(1)在调用sprintf后,要清除不恰当字符串结束符(第5,7行);

(2)在恰当的位置添加字符串结束符(第9行)。

4.      二维数组的输出

首先要考虑的是数组是按行排列还是按列排列,如果是按行排列,就应该这样写:

int i, j;

01: for (i = 0; i < nRow; i++)

02: {

03:    for (j = 0; j < nCol; j++)

{

if (j > 0)

printf(" ");

printf("%d", a[j]);

}

puts("");

}

如果是按列,就要把1行和3行交换。

来源:http://student.csdn.net/mcd/topic/235300/758992

编程挑战系统的输入和输出详细说明,布布扣,bubuko.com

时间: 2024-10-26 05:25:55

编程挑战系统的输入和输出详细说明的相关文章

Shell编程基础教程3--Shell输入与输出

3.Shell输入与输出    3.1.echo        echo命令可以显示文本行或变量,或者把字符串输出到文件        echo [option] string            -e:解析转义字符            -n:回车不换行,linux系统默认回车换行            转义字符:\c,\f,\t,\n……        例子程序 #!/bin/bash #echo echo -e "This echo's 3 new lines\n\n\n" e

Java I/O系统学习系列二:输入和输出

编程语言的I/O类库中常使用流这个抽象概念,它代表任何有能力产出数据的数据源对象或者是有能力接收数据的接收端对象.“流”屏蔽了实际的I/O设备中处理数据的细节. 在这个系列的第一篇文章:<<Java I/O系统学习系列一:File和RandomAccessFile>>中,我们讲到RandomAccessFile可以写入和读取文件,具备I/O功能,但是其只能针对文件,而I/O还涉及到很多其他场景比如网络.读取内存中的字符串等,所以Java类库中提供了一系列的类库来对其进行支持,也就是

《C程序设计语言(第2版&#183;新版)》第7章 输入与输出

输入与输出并非C语言本身的组成部分.本章讲述标准库,重点讲输入/输出,以及介绍字符串处理.存储管理和数学函数: ANSI标准精确定义了这些库函数,所以任何可使用C的系统中都有这些函数的兼容形式:如果程序的系统交互部分仅仅使用了标准库提供的功能,那么就可以不经修改地从一个系统移植到另一个上: 这些库函数得属性分别在十几个头文件中声明.附录B对标准库进行了详细描述. 7.1 标准输入/输出 标准库实现了简单的文本输入/输出模式:文本流由一系列行组成,每一行的结尾是一个换行符:(若系统未遵循此模式,标

C++学习笔记之输入、输出和文件

一.流的概念 数据从内存的一个地址移动到另一个地址称为数据流动——流操作 流操作是通过缓冲区(buffer)机制实现的. 缓冲区:内存的一块区域——用作文件与内存交换数据. 数据从文件中读出:文件 → 缓冲区 → 内存 将数据写入文件:内存 → 缓冲区 → 文件 为什么要使用缓冲区而不直接从文件中读取数据到内存或者直接有内存写入文件呢?我们的文件通常都存在磁盘中,程序从磁盘读取一个字符需要大量的硬件活动,速度非常慢.缓冲方法则从磁盘上读取大量信息,将这些信息存储在缓冲区,然后每次从缓冲区里读取一

python 3 输入和输出

一.普遍的输入和输出 1.输入 在python3中,函数的输入格式为:input(),能够接受一个标准输入数据,返回string类型. input() 函数是从键盘作为字符串读取数据,不论是否使用引号("或""). Name=input("请输入你的名字:") print(Name) 也接受多个数据输入,使用eval()函数,间隔符必须是逗号 a,b,c=eval(input()) 2.输出 产生输出的最简单方法是使用print语句,可以通过用逗号分隔零个

CString中Format函数与格式输入与输出

CString中Format函数与格式输入与输出 Format是一个很常用,却又似乎很烦的方法,以下是它的完整概貌,以供大家查询之用: 格式化字符串forma("%d",12)意思是将一个整形的格式化的字符(我认为是保持其形状不变) 1).格式说明总是以%字符开始,以下是不同类型数据的格式方式%号后的说明: d输出带符号十进制数 o输出无符号八进制数 x输出无符号十六进制数 u输出无符号数 c输出单个字符 s输出一串字符 f输出实数(6位小数) e以指数形式输出实数 g选用f与e格式中

CSDN编程挑战——《高斯公式》

高斯公式 题目详情: 高斯在上小学时发明了等差数列求和公式:1+2+..+100=5050.现在问题在于给你一个正整数n,问你他可以表示为多少种连续正整数之和?(自身也算). 输入格式: 多组数据,每组数据一行,一个正整数n. 0<n<2000000000 输出格式: 每组数据一行,包含一个正整数,表示结果. 答题说明: 输入样例 5 120 输出样例: 2 4 解释: 5=2+3=5 120=1+2+...+15=22+23+24+25+26=39+40+41=120 初稿代码: /* 3:

C++——输入、输出和文件

一.C++输入和输出概述 1.1.流和缓冲区 C++程序把输入和输出看作字节流.输入时,程序从输入流中抽取字节:输出时,程序将字节插入到输出流中.对于面相文本的程序,每个字节代表一个字符,更通俗地说,字节可以构成字符或数值数据的二进制表示.输入流中的字节可能来自键盘,也可能来自存储设备(如硬盘)或其他程序.输出流中的字节可以流向屏幕.打印机.存储设备或其他程序.流充当了程序和流源或流目标之间的桥梁.这使得C++程序可以以相同的方式对待来自键盘的输入和来自文件的输入.C++程序只检查字节流,而不需

(csdn高校俱乐部编程挑战)2的补码

题目详情 在计算机中,整数是以2的补码的形式给出的. 给出整数A和B,假设计算机是32位机,求从A到B之间的所有二进制数中,一共用了多少个1. 输入格式: 多组数据,每组数据一行,由两个整数A,B, -2147483648<=A<=B<=2147483647 输出格式: 每组输出一行,从A到B使用的1的个数. 答题说明 输入样例 -2 0 0 0 0 1 输出样例: 63 0 1 刚开始觉得这个题灰常简单,可是代码写完提交上去挑战失败,看了半天也没搞懂问题出在哪里了~~ 我的理解是因为有