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;
}
判斷是否到達最後一組測試數據了,如果不是最後一組測試數據就多輸出一個換行。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章