機試指南 | 數據輸入的處理



數據輸入的處理

C 語言版

簡單的輸入一組數據

【Example Subject】

Description
計算 a+b

Input
兩個整數 a,b

Output
a+b的值

Sample Input
1 2

Sample Output
3

這種簡單輸入,接受一組輸入,針對這種輸入計算出值即可。

【Method】

#include <stdio.h>
int main()
{
    int a,b;
    scanf("%d %d",&a, &b);
    printf("%d\n",a+b);
    return 0;
}

一次運行輸入多組數據直到讀至 EOF

一次運行,要輸入多組數據,直到讀至輸入文件末尾(EOF)爲止

【Example Subject】

Description
計算 a + b

Input
多組由兩個整數(a和b)構成的輸入,a和b之間用空格隔開,
每組輸入單獨佔一行 

Output
每組的兩個整數(a和b)求和並輸出,每組的求和結果獨佔一行

Sample Input
1 5
10 20
400 516

Sample Output
6
30
916

這種輸入包含多對輸入數據,需要構造一個循環讀取。因爲沒有指出到底有多少對輸入,要有辦法判斷輸入何時結束。解決辦法是:

【Method】

#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; 
}

注 1:scanf 函數返回值就是讀出的變量個數,如果一個都沒有,則返回值是 -1。EOF是一個預定義的常量,等於 -1。

注 2:在調試程序時,鍵盤輸入的數據,用 CTRL-Z(即按住 CTRL 鍵不放,再按下 Z)組合作爲輸入結束,此謂鍵盤輸入設備的“文件末尾”。

一次運行輸入多組數據由 N 決定

一次運行,要輸入多組數據,組數由第一個輸入數據決定(在開始的時候輸入一個 N,接下來是 N 組數據)

【Example Subject】

Description
計算 a + b

Input
第一行是數據的組數N,從第二行是N組由兩個整數(a和b)構成的輸入,a和b之間用空格隔開,
每組輸入單獨佔一行 

Output
每組的兩個整數(a和b)求和並輸出,每組的求和結果獨佔一行

Sample Input
2
1 5
10 20

Sample Output
6
30

需要先讀入第一行確定組數 N,而後寫一次執行 N 次的循環進行處理即可。解決辦法是:

【Method】

#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;
}

輸入多組數據以特殊輸入爲結束標誌

輸入不說明有多少組數據,但以某個特殊輸入爲結束標誌。平時做題中常見諸如“輸入學生成績,以 -1 結束”,沒有學生得 -1 分的,這個結束數據可以要得。

【Example Subject】

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

構造循環對數據進行處理,將是否遇到了要求結束的輸入,作爲循環是否結束的依據。解決辦法是:

【Method】

#include <stdio.h>
int main()
{
    int a,b;
    while(scanf("%d %d",&a, &b) &&(a||b))
	{
		printf("%d\n",a+b);
	}
	return 0;
}

利用文件重定向提高調試效率

編程得到正確結果前,往往需要多次運行程序,每次運行都需要花費不少的時間從鍵盤輸入數據。每次輸入的數據都是相同的時,會給人的心理帶來不爽的感覺,並造成時間上的浪費。無論平時練習還是 ACM 競賽實戰,這些都是可以避免的。方法是,運用重定向。

用下面的形式調用函數 freopen() 會將標準輸入 stdin 重定向到文件 input.txt(這個名字可以自己定義)。

//設置輸入和輸出文件
freopen("input.txt","r",stdin);    

重定向後,原先從鍵盤(標準輸入的默認設備)接受的輸入,將統統從文件讀取 input.txt 讀取,這就是重定向。程序可以寫作:

#include<stdio.h>
int main()
{
    //只加這一句輸入將被重定向到文件input.txt
	freopen("input.txt","r",stdin);  
	int a,b;
	scanf("%d%d",&a,&b);
	printf("%d\n",a+b);
	return 0;
}

於是,在運行程序前,將本該由鍵盤輸入的數據,寫到文件 input.txt 中。而在運行程序時,數據將不再需要人去輸入。那個快,很享受。

需要注意的是,調試通過的程序,千萬不要直接提交到 OJ 平臺上去。如果競賽中這樣做了,罰你的 20 分鐘不要算到我的頭上。提交的程序要把輸入重定向的一行刪除,這樣纔算是符合要求的,可以獲得 AC 的程序。

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

#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++ 版

簡單的輸入一組數據

【Example Subject】

Description
計算 a+b

Input
兩個整數 a,b

Output
a+b的值

Sample Input
1 2

Sample Output
3

這種簡單輸入,接受一組輸入,針對這種輸入計算出值即可。

【Method】

#include <iostream>
using namespace std;
int  main()
{
    int a,b;
    //cin以空格或者回車作爲輸入輸出分隔符
    cin >> a >> b;
    cout << a+b << endl;   
    return 0;
}

一次運行輸入多組數據直到讀至 EOF

一次運行,要輸入多組數據,直到讀至輸入文件末尾(EOF)爲止

【Example Subject】

Description
計算 a + b

Input
多組由兩個整數(a和b)構成的輸入,a和b之間用空格隔開,
每組輸入單獨佔一行 

Output
每組的兩個整數(a和b)求和並輸出,每組的求和結果獨佔一行

Sample Input
1 5
10 20
400 516

Sample Output
6
30
916

這種輸入包含多對輸入數據,需要構造一個循環讀取。因爲沒有指出到底有多少對輸入,要有辦法判斷輸入何時結束。解決辦法是:

【Method】

#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)組合作爲輸入結束,此謂鍵盤輸入設備的“文件末尾”。

一次運行輸入多組數據由 N 決定

一次運行,要輸入多組數據,組數由第一個輸入數據決定(在開始的時候輸入一個 N,接下來是 N 組數據)

【Example Subject】

Description
計算 a + b

Input
第一行是數據的組數N,從第二行是N組由兩個整數(a和b)構成的輸入,a和b之間用空格隔開,
每組輸入單獨佔一行 

Output
每組的兩個整數(a和b)求和並輸出,每組的求和結果獨佔一行

Sample Input
2
1 5
10 20

Sample Output
6
30

需要先讀入第一行確定組數 N,而後寫一次執行 N 次的循環進行處理即可。解決辦法是:

【Method】

#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;
}

輸入多組數據以特殊輸入爲結束標誌

輸入不說明有多少組數據,但以某個特殊輸入爲結束標誌。平時做題中常見諸如“輸入學生成績,以 -1 結束”,沒有學生得 -1 分的,這個結束數據可以要得。

【Example Subject】

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

構造循環對數據進行處理,將是否遇到了要求結束的輸入,作爲循環是否結束的依據。解決辦法是:

【Method】

#include<iostream>
using namespace std;
int main()
{
    int a ,b;
    while(cin>>a>>b&&(a||b))
    {
		cout<<a+b<<endl;
	}
    return 0;
}

利用文件重定向提高調試效率

編程得到正確結果前,往往需要多次運行程序,每次運行都需要花費不少的時間從鍵盤輸入數據。每次輸入的數據都是相同的時,會給人的心理帶來不爽的感覺,並造成時間上的浪費。無論平時練習還是 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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章