1. 程式人生 > >ACM題目中輸入資料的處理(C++版)

ACM題目中輸入資料的處理(C++版)

               

  ACM競賽題目的輸入資料常要求有多組,並且格式多種多樣,這是初次登OJ平臺的同學的一個障礙。實際上,這些格式可以歸為固定的幾種型別,本文介紹各種型別的處理方法,以幫助同學們克服這些障礙。

  實際上,這些模式不僅是OJ平臺上做題的需要。在平時的自由程式設計練習中,也可以自行使用這些模式,以提高除錯程式的效率。對程式測試的意識也將在此過程中得到提升。  本文1-4部分介紹了幾種型別輸入的處理,第5部分介紹通過輸入重定向提高除錯程式效率的方法。1. 最簡單的輸入例1:
Description計算 a+bInput兩個整數 a,bOutputa+b的值Sample Input1 2Sample Output3
  這種最簡單的輸入,接受一組輸入,針對這組輸入計算出值即可。這與平時的程式設計並無差異。解決辦法是:
#include <iostream>using namespace std;int  main(){    int a,b;    cin >> a >> b;    cout << a+b << endl;   //對其他題目,換成要求的複雜處理與輸出    return 0;}
2. 一次執行,要輸入多組資料,直到讀至輸入檔案末尾(EOF)為止例2:
Description計算 a + bInput多組由兩個整數(a和b)構成的輸入,a和b之間用空格隔開,每組輸入單獨佔一行 Output每組的兩個整數(a和b)求和並輸出,每組的求和結果獨佔一行Sample Input1 510 20400 516Sample Output630916
  這種輸入包含多對輸入資料,需要構造一個迴圈讀取。因為沒有指出到底有多少對輸入,要有辦法判斷輸入何時結束。解決辦法是:
#include <iostream> using namespace std;int main()int a,b; while(cin >> a >> b) {  cout << a+b << endl; } return 0;} 

  說明1:當讀到輸入結束時,cin >> a >> b返回 0,迴圈也結束。

  說明2:在除錯程式時,鍵盤輸入的資料,用CTRL-Z(即按住CTRL鍵不放,再按下Z)組合作為輸入結束,此謂鍵盤輸入裝置的“檔案末尾”。

3. 一次執行,要輸入多組資料,組數由第一個輸入資料決定(在開始的時候輸入一個N,接下來是N組資料)例3:
Description計算 a + bInput第一行是資料的組數N,從第二行是N組由兩個整數(a和b)構成的輸入,a和b之間用空格隔開,每組輸入單獨佔一行 Output每組的兩個整數(a和b)求和並輸出,每組的求和結果獨佔一行Sample Input21 510 20Sample Output630
  需要先讀入第一行確定組數N,而後寫一次執行N次的迴圈進行處理即可。解決辦法是:
#include <iostream>using namespace std;int main() {    int a, b, n;    cin >> n; for(i=0;i<n;i++) {  cin >> a >> b;  cout << a + b << endl; }    return 0;}
4.  輸入不說明有多少組資料,但以某個特殊輸入為結束標誌。平時做題中常見諸如“輸入學生成績,以-1結束”,沒有學生得-1分的,這個結束資料可以要得。例4:
Description計算 a + bInput多組由兩個整數(a和b)構成的輸入,a和b之間用空格隔開,每組輸入單獨佔一行。當輸入為 0 0 時,輸入結束。Output每組的兩個整數(a和b)求和並輸出,每組的求和結果獨佔一行。Sample Input1 510 200 0Sample Output630
  構造迴圈對資料進行處理,將是否遇到了要求結束的輸入,作為迴圈是否結束的依據。解決辦法是:
#include<iostream>using namespace std;int main(){    int a ,b;    while(cin>>a>>b&&(a||b))    {  cout<<a+b<<endl; }    return 0;}
  有關字元和字串資料的輸入,在此不再多講,只要將相關的函式用好即可,也可以找到相關資料參考。5. 利用檔案重定向提高除錯效率  程式設計得到正確結果前,往往需要多次執行程式,每次執行都需要花費不少的時間從鍵盤輸入資料。每次輸入的資料都是相同的時,會給人的心理帶來不爽的感覺,並造成時間上的浪費。無論平時練習還是ACM競賽實戰,這些都是可以避免的。方法是,運用重定向。  用下面的形式呼叫函式freopen()會將標準輸入stdin重定向到檔案input.txt(這個名字可以自己定義)。
freopen("input.txt","r",stdin);    //設定輸入和輸出檔案
  重定向後,原先從鍵盤(標準輸入的預設裝置)接受的輸入,將統統從檔案讀取input.txt讀取,這就是重定向。程式可以寫作:
#include<iostream>#include<cstdio>using namespace std;int main(){    freopen("input.txt","r",stdin);  //只加這一句輸入將被重定向到檔案input.txt    int a,b;    cin>>a>>b;    cout<<a+b<<endl;    return 0;}
  於是,在執行程式前,將本該由鍵盤輸入的資料,寫到檔案input.txt中。而在執行程式時,資料將不再需要人去輸入。那個快,很享受。  需要注意的是,除錯通過的程式,千萬不要直接提交到OJ平臺上去。如果競賽中這樣做了,罰你的20分鐘不要算到我的頭上。提交的程式要把輸入重定向的一行刪除,這樣才算是符合要求的,可以獲得AC的程式。

  除了刪除那一行,還有一種簡單的做法是,提交前將這一行前加上註釋符"//",效果是一樣的。

#include<iostream>#include<cstdio>using namespace std;int main(){    //freopen("input.txt","r",stdin);  //只加這一句輸入將被重定向到檔案input.txt    int a,b;    cin>>a>>b;    cout<<a+b<<endl;    return 0;}
  還有用條件編譯處理的方法,暫不講了。

==================== 迂者 賀利堅 CSDN部落格專欄=================

======== 為IT菜鳥起飛鋪跑道,和學生一起享受快樂和激情的大學 =======