OJ 輸入問題



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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章