ACM入门之输入输出

ACM入门之输入输出


      #include  < stdio.h >
int main() 

int a,b; 
scanf("%d %d",&a, &b); 
printf("%d\n",a+b); 
return 0; 

 在开始做ACM时,会面临一个输入输出数据的问题,ACM里的输入输出数据和平时写的程序不大一样。下面详解ACM有关输入输出的问题。

一、输入:

  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,如果一个都没有,则返回值是-1EOF是一个预定义的常量,等于-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

               {

                     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;

        }

   判断是否到达最后一组测试数据了,如果不是最后一组测试数据就多输出一个换行。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值