ページ 1 / 1
ifかswitchか
Posted: 2020年11月06日(金) 11:04
by JJJuto
適当な乱数を代入した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として、表示までさせたいです。
まだ知識が浅く、プログラミング歴の長い方には簡単な問題かもしれませんが教えていただけると嬉しいです。
Re: ifかswitchか
Posted: 2020年11月06日(金) 21:48
by みけCAT
JJJuto さんが書きました: ↑4年前
この後、生成した乱数とビンゴカードの数がアタリかどうかを判定し、『アタリ』『ハズレ』と表示するソースを書きたいのですが、このとき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 さんが書きました: ↑4年前
また、ビンゴの縦横斜めのいずれかがアタリになった場合に、ループを抜けて『ビンゴしました!』といったようなことを表示させるにはどうしたら良いでしょうか?
アタリを1,ハズレを0として、表示までさせたいです。
1. アタリになった場所を記録する
2. ループを回し、縦横斜めのいずれかに全部がアタリになっている列があるかを調べる
3. あれば、ループを抜けて『ビンゴしました!』といったようなことを表示させる
としたらいいでしょう。
Re:Re: ifかswitchか
Posted: 2020年11月08日(日) 12:02
by JJJuto
ご返答ありがとうございます。無事、アタリハズレ判定をすることができました。
その後、ビンゴ判定について考えて見たいのですが、
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);
}
}
上手く実行せず、また斜めの判定の仕方がわからないので、お手数おかけしますが、教えていただけると嬉しいです。
Re: Re:Re: ifかswitchか
Posted: 2020年11月08日(日) 16:49
by みけCAT
出た数字を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("おめでとう!右斜めがビンゴです!");
}
}
Re:Re:Re:Re: ifかswitchか
Posted: 2020年11月14日(土) 17:29
by JJJuto
できました。ありがとうございます