1. 最簡單的輸入
Description 計算 a+b Input 兩個整數 a,b Output a+b的值 Sample Input 1 2 Sample Output 3
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. 一次運行,要輸入多組資料,直到讀至輸入檔案末尾(EOF)為止
Description 計算 a + b Input 多組由兩個整數(a和b)構成的輸入,a和b之間用空格隔開,每組輸入單獨佔一行 Output 每組的兩個整數(a和b)求和並輸出,每組的求和結果獨佔一行 Sample Input 1 5 10 20 400 516 Sample Output 6 30 916
C:
#include <stdio.h> int main() { int a,b; while(scanf("%d %d",&a, &b) != EOF) // 輸入結束時,scanf函數傳回值為EOF(-1),即沒有資料輸入時會退出while迴圈 { printf("%d\n",a+b); } return 0; }
說明:scanf函數傳回值就是讀出的變數個數,如果一個都沒有,則傳回值是-1。EOF是一個預定義的常量,等於-1。
C++:
#include <iostream> using namespace std; int main() { int a,b; while(cin >> a >> b) { cout << a+b << endl; } return 0; }
說明:當讀到輸入結束時,cin >> a >> b返回 0,迴圈也結束
3. 一次運行,要輸入多組資料,組數由第一個輸入資料決定(在開始的時候輸入一個N,接下來是N組資料)
Description 計算 a + b Input 第一行是資料的組數N,從第二行是N組由兩個整數(a和b)構成的輸入,a和b之間用空格隔開,每組輸入單獨佔一行 Output 每組的兩個整數(a和b)求和並輸出,每組的求和結果獨佔一行 Sample Input 2 1 5 10 20 Sample Output 6 30
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; }
C++:
#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分的,這個結束資料可以要得。
Description 計算 a + b Input 多組由兩個整數(a和b)構成的輸入,a和b之間用空格隔開,每組輸入單獨佔一行。當輸入為 0 0 時,輸入結束。 Output 每組的兩個整數(a和b)求和並輸出,每組的求和結果獨佔一行。 Sample Input 1 5 10 20 0 0 Sample Output 6 30
C:
#include <stdio.h> int main() { int a,b; while(scanf("%d %d",&a, &b) &&(a||b)) { printf("%d\n",a+b); } return 0; }
C++:
#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(這個名字可以自己定義)。
重新導向後,原先從鍵盤(標準輸入的預設裝置)接受的輸入,將統統從檔案讀取input.txt讀取,這就是重新導向。
C:
#include<stdio.h> int main() { freopen("input.txt","r",stdin); //只加這一句輸入將被重新導向到檔案input.txt int a,b; scanf("%d%d",&a,&b); printf("%d\n",a+b); return 0; }
C++:
#include<iostream> #include<fstream> using namespace std; int main() { ifstream fin("input.txt"); //只加這一句輸入將被重新導向到檔案input.txt int a,b; fin>>a>>b; cout<<a+b<<endl; fin.close(); //記得關掉 return 0; }
於是,在運行程式前,將本該由鍵盤輸入的資料,寫到檔案input.txt中。而在運行程式時,資料將不再需要人去輸入。那個快,很享受。
需要注意的是,調試通過的程式,千萬不要直接提交到OJ平台上去。如果競賽中這樣做了,罰你的20分鐘不要算到我的頭上。提交的程式要把輸入重新導向的一行刪除,這樣才算是符合要求的,可以獲得AC的程式。
除了刪除那一行,還有一種簡單的做法是,提交前將這一行前加上注釋符"//",效果是一樣的。
文章來源:
ACM題目中輸入資料的處理(C++版),見:http://blog.csdn.net/sxhelijian/article/details/8978850
ACM題目中輸入資料的處理(C語言版)見:http://blog.csdn.net/sxhelijian/article/details/8978794