ページ 11

入力の最後まで処理する

Posted: 2012年2月27日(月) 20:56
by Cr
『入力の最後まで処理する』方法が分かりません
AOJの↓を解いています。
http://judge.u-aizu.ac.jp/onlinejudge/d ... 14&lang=jp
『複数のデータセットが与えられます。各データセットには整数 d が一行に与えられます。入力の最後まで処理して下さい。 』
とあるのですが、その方法が分かりません。
今のところコードは以下のようになっています。

コード:

#include <iostream>
using namespace std;
int main(){
	int d;
	int answer;
{	//ここを繰り返したい
	answer = 0;
	cin >> d;
	for(int i = d; i != 600; i += d)
		answer += i*i;
	cout << answer*d << endl;
}
	return 0;
}

Re: 入力の最後まで処理する

Posted: 2012年2月27日(月) 22:05
by a5ua
入力に失敗するまでループするというコードを書きます。
書き方を3通り紹介します。

コード:

#include <iostream>

using namespace std;

int main()
{
	int d;
	
	// (1) 
	for (;;) {
		cin >> d;
		if (cin.fail()) break;
		/* d を使った計算 */
	}

	// (2)
	while (cin >> d) {
		/* d を使った計算 */
	}

	// (3)
	while (scanf("%d", &d) != EOF) {
		/* d を使った計算 */
	}
}
(1)では、無限ループの中で、整数dを読み込んだ後、
ストリームの状態をチェックし、エラーが発生していたらループを抜けます。

(2)では、void *への暗黙変換を利用して、入力が失敗するまでループを続けます。
(エラーが発生した場合、nullポインタに変換されるため、結果として条件式はfalseとなります。)

(3)は、C言語のライブラリ関数であるscanfを使った書き方です。

普通は、(2) or (3)の書き方を使うと思います。

Re: 入力の最後まで処理する

Posted: 2012年2月28日(火) 19:19
by Cr
a5uaさん、ありがとうございます。
以下コードでacceptがもらえたので解決とさせていただきます。

コード:

#include <iostream>
using namespace std;
int main(){
	int d;
	int answer = 0;
	while(cin >> d)
	{
		for(int i = d; i != 600; i += d)
			answer += i*i;
		cout << answer*d<<endl;
		answer = 0;
	}
	return 0;
}