ifかswitchか

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
JJJuto
記事: 29
登録日時: 3年前

ifかswitchか

#1

投稿記事 by JJJuto » 3年前

 適当な乱数を代入した5×5のビンゴカードを作って、乱数生成によって抽選を行い、縦横斜めのいずれかが揃ったらループを抜けるというプログラムを書いています。

 まず、ビンゴカードの表示と、抽選の乱数生成まで終わりました。

 この後、生成した乱数とビンゴカードの数がアタリかどうかを判定し、『アタリ』『ハズレ』と表示するソースを書きたいのですが、このときif文を繰り返しで行うのと、switch文で書くのとどちらが良いでしょうか?
 個人的にはifを繰り返す方が良いのかなと考えていて、

コード:

for (n = 0; n <= 100; n++)
	{
		x = rand() % (n + 1);

		printf("抽選 %2d回目:%3d", n, x);

		if (x == b[i][j]) {
			printf(" アタリ\n");
		}
		else {
			printf(" ハズレ\n");
		}
	}
 と書いてみたのですが、乱数とビンゴの数が合っていてもハズレと表示されます。
 (x==b[j])の部分が違うのかなというところまではなんとなくわかっているのですが、そこからがわかりません。どう書けば良いのでしょうか? また、ifじゃ書きづらくswitchの方が良い場合、そちらでの書き方を教えていただきたいです。

 また、ビンゴの縦横斜めのいずれかがアタリになった場合に、ループを抜けて『ビンゴしました!』といったようなことを表示させるにはどうしたら良いでしょうか?
 アタリを1,ハズレを0として、表示までさせたいです。

 まだ知識が浅く、プログラミング歴の長い方には簡単な問題かもしれませんが教えていただけると嬉しいです。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: ifかswitchか

#2

投稿記事 by みけCAT » 3年前

JJJuto さんが書きました:
3年前
この後、生成した乱数とビンゴカードの数がアタリかどうかを判定し、『アタリ』『ハズレ』と表示するソースを書きたいのですが、このときif文を繰り返しで行うのと、switch文で書くのとどちらが良いでしょうか?
ifを繰り返すのがいいでしょう。
すなわち、ビンゴカード全体について判定を行い、どれかが一致すればアタリとするのが一般的でしょう。

コード:

for (n = 0; n <= 100; n++)
	{
		x = rand() % (n + 1);

		printf("抽選 %2d回目:%3d", n, x);

		int atari = 0; /* 当たったか */
		/* カード全体に対し判定を行う *?
		for (int r = 0; r < 5; r++) {
			for (int c = 0; c < 5; c++) {
				if (x == b[r][c]) {
					/* どれか当たっていたらアタリ */
					printf(" アタリ\n");
					atari = 1;
				}
			}
		}
		if (!atari) {
			/* 当たらなかったらハズレ */
			printf(" ハズレ\n");
		}
	}
JJJuto さんが書きました:
3年前
また、ビンゴの縦横斜めのいずれかがアタリになった場合に、ループを抜けて『ビンゴしました!』といったようなことを表示させるにはどうしたら良いでしょうか?
 アタリを1,ハズレを0として、表示までさせたいです。
1. アタリになった場所を記録する
2. ループを回し、縦横斜めのいずれかに全部がアタリになっている列があるかを調べる
3. あれば、ループを抜けて『ビンゴしました!』といったようなことを表示させる
としたらいいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

JJJuto
記事: 29
登録日時: 3年前

Re:Re: ifかswitchか

#3

投稿記事 by JJJuto » 3年前

ご返答ありがとうございます。無事、アタリハズレ判定をすることができました。
その後、ビンゴ判定について考えて見たいのですが、

1.アタリになった場所を記録する

がいまいちわからず、自分なりに、ビンゴ判定をアタリハズレ判定の後に、以下のように書いてみました。

コード:

for (r = 0; r < 5; r++) {
if (b[r][c]==atari) {
break;
r = r + 1;
printf("おめでとう!%d行目がビンゴです!",r);
}
}

for (c = 0; c < 5; c++) {
if (b[r][c] == atari) {
break;
c = c + 1;
printf("おめでとう!%d列目がビンゴです!", c);
}
}
上手く実行せず、また斜めの判定の仕方がわからないので、お手数おかけしますが、教えていただけると嬉しいです。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: Re:Re: ifかswitchか

#4

投稿記事 by みけCAT » 3年前

出た数字をatari (-1とか?) に変える仕様だと仮定すると、以下のようにできます。

コード:

for (int r = 0; r < 5; r++) { // どの行を調べるか
	int bingo = 1; // その行が全部atariか?
	for (int c = 0; c < 5; c++) {
		if (b[r][c] != atari) bingo = 0; // その行にatariじゃないマスがあるか?
	}
	if (bingo) {
		// 全部atariだった! (atariじゃないマスが無かった!)
		printf("おめでとう!%d行目がビンゴです!", r);
	}
}
for (int c = 0; c < 5; r++) { // どの列を調べるか
	int bingo = 1; // その列が全部atariか?
	for (int r = 0; r < 5; c++) {
		if (b[r][c] != atari) bingo = 0; // その列にatariじゃないマスがあるか?
	}
	if (bingo) {
		// 全部atariだった! (atariじゃないマスが無かった!)
		printf("おめでとう!%d列目がビンゴです!", c);
	}
}
// 左上から右下の斜めを調べる
{
	int bingo = 1; // 左斜めが全部atariか?
	for (int i = 0; i < 5; i++) {
		if (b[i][i] != atari) bingo = 0; // 左斜めにatariじゃないマスがあるか?
	}
	if (bingo) {
		// 全部atariだった! (atariじゃないマスが無かった!)
		printf("おめでとう!左斜めがビンゴです!");
	}
}
// 右上から左下の斜めを調べる
{
	int bingo = 1; // 右斜めが全部atariか?
	for (int i = 0; i < 5; i++) {
		if (b[i][4 - i] != atari) bingo = 0; // 右斜めにatariじゃないマスがあるか?
	}
	if (bingo) {
		// 全部atariだった! (atariじゃないマスが無かった!)
		printf("おめでとう!右斜めがビンゴです!");
	}
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

JJJuto
記事: 29
登録日時: 3年前

Re:Re:Re:Re: ifかswitchか

#5

投稿記事 by JJJuto » 3年前

できました。ありがとうございます

返信

“C言語何でも質問掲示板” へ戻る