- ベストアンサー
プログラミング:ランダムな数値を判定するプログラムの作成方法
- プログラミングで、ランダムな数値を入力して、その数値が正解より大きい場合は「正解より大きい」と表示し、小さい場合は「正解より小さい」と表示し、正解の場合は「正解」と表示するプログラムを作成しています。
- また、正解までの試行回数も表示する予定です。
- しかし、上手く実行できないため、アドバイスをいただきたいです。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
作った直後に自身が使うのでなければ困りそうな仕様ですね。 > ランダムの数値を入力してその数値より大きければ正解より大きいと表示して小さければ小さいと表示し正解なら正解ともだすプログラムをつくっています 入力した値がとかランダムな値がとか表示しないと、単に「大きい」「小さい」だと何の事かわからなさそうに思います。 > 0以上100以下の整数を生成 という事は、0と100を含むのですね。 0より大きくだと1からになるし100未満だと99までになりますが、100以下という事は100も含めるという事でしょうね。 問題の日本語が正しかったとして。 #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int count=0, input, target; srand((unsigned int)time(NULL)); target=rand()%101; /* 0以上100以下の整数を生成 */ printf( "対象の数値を設定しました。数値を当ててください。\n" ); do { printf( "値を入力してください: " ); scanf( " %d", &input ); ++ count; if( target < input ) printf( "入力値は大きすぎました。\n" ); if( target > input ) printf( "入力値は小さすぎました。\n" ); } while( target != input ); printf( "正解です。 %d回目で到達したランダムな数値は%dでした。\n", count, target ); return 0; } === 実行結果 === 対象の数値を設定しました。数値を当ててください。 値を入力してください: 44 入力値は小さすぎました。 値を入力してください: 88 入力値は大きすぎました。 値を入力してください: 66 入力値は大きすぎました。 値を入力してください: 55 入力値は大きすぎました。 値を入力してください: 50 入力値は大きすぎました。 値を入力してください: 46 入力値は大きすぎました。 値を入力してください: 45 正解です。 7回目で到達したランダムな数値は45でした。
その他の回答 (5)
- w_HIRO_w
- ベストアンサー率47% (9/19)
#4さん、#3の回答者です。 笑ってしまいました。はずかしい。。。。 もういじらないでください。。。。(爆笑)
- kakuritsu
- ベストアンサー率23% (62/261)
#3さん これだと ・1以上100以下のどの数を入れても正解しない場合があります。(=プログラムが終わらない) ・また答えとして 100 を入れて正解することは、このプログラムを何回動作させてもありません。 というバグがあります。 質問者さんのためにも、どことは指摘しません。
- w_HIRO_w
- ベストアンサー率47% (9/19)
kmeeさん、yama5140さん、ごめんなさい。 たぶん、きちんと動作するまでの道のりが遠いようなので・・・載せてしまいます。 ※数年(もう2ケタ近いかも・・・)ぶりなので、あまりきれいではないですが。。。 #include <stdio.h> #include <stdlib.h> #include <time.h> int main( void ){ int i, x, y; /* 1以上100以下の整数を生成 */ srand( (unsigned)time( NULL ) ); for( ;; ){ i = rand() % 100; if ( i != 0 ) { break; } } /* 生成値の確認 */ //printf( "%d\n", i ); printf( "1以上100以下の整数を入力してください。\n" ); y = 0; for( ;; ){ /* 回答の入力待ち */ scanf( "%d", &x ); /* 回答回数カウントアップ */ y = y + 1; /* 回答の範囲チェック */ if ( x < 1 || x > 100 ){ printf( "1以上100以下の整数を入力してください。\n" ); }else{ /* 正解判定 */ if( i == x ){ printf( "%d回目で当たりました。\n", y ); /* 回答を入力させる */ printf( "何か数字を入力してください。終了します。\n", y ); scanf( "%d", &x ); /* 無限ループ終了 */ break; }else{ if ( i < x ){ printf( "正解より大きいです。\n" ); }else{ printf( "正解より小さいです。\n" ); } } } } } 個人的な意見ですが、考えていることと書いているプログラムにギャップが大きいです。 考えていることを「どんな構造にしたらいいのか」ということをもっと考えないと駄目。 例えば、 1.答えとなる値を生成する 2.正解するまで繰り返す 2.1.値を入力してもらう 2.2.入力された値のチェック NGなら、2.1へ 2.3.答えと入力値を比較 OKなら、「正解」メッセージを表示して終了 NGなら、「大きい or 小さい」を表示して2.1へ といった具合に。 まずは、日本語で紙に書いて、足りないことはないか、うまく動作するのかを考えてからプログラミングするようにした方がいいですよ。
- yama5140
- ベストアンサー率54% (136/250)
>プログラムをつくっています 質問者が「作っている」としたら、/* 無限ループ */のコメントは、ありえないです。 >break; /* 無限ループ */ この「無限ループ」とやらで、「入力/判定」部分を包んでやればイイだけだから。 そうすれば、「無限ループ」の { を追加することになり、//return0; の後にも、} を追加できて、これが main() の { と対になります。 というか、{} の数を揃えて投稿したんだから、揃えたとき、return0; の後に、} が無くともなぜ揃うのか、と考えるべき・・。 なんで、return0; の前に // を付けなくてはいけないのか、と考えるべき・・。 また、コンパイラも指摘したはず。 なお、間違っても無限ループ構文内に、「正解を生成する」部分を含めないこと。 よっぽど運が良くないと、「正解」にたどり着けないプログラムとなる(笑)。 y = 0; while( 1 ){ /* 無限ループ */ 入力/判定 判定で正解の時、break; /* 無限ループ脱出 */ } return 0; } ・デバック時に、printf( "%d\n", i ); で、i の値を表示するのはすごくいいと思います(昨年に教わったとおりに記述して、正しい位置に入れて、だけど)。 ・細かいことだけど、「( x < i )なのに、『正解より大きい』」・・・ ・ ・ 30行ほど拙いこと、怒りに任せて書いたんだけど、無益だから割愛します。 (昨年から直前の質問/回答の流れ等、少しでも振り返っていただければ、内容は判るかな・・) 上だって、「拙い」といわれればそれまでだけど、「怒り」はあまり・・ありません。
- kmee
- ベストアンサー率55% (1857/3366)
> 上手く実行できないので 何がどう「上手く実行できない」のでしょうか? 「期待している結果とどう違うのか」 まずそれを分析するのが、プログラム修正の基本中の基本です。軽微なミスなら、これだけですぐに解決策がわかります。 プログラミングを勉強するなら、これを習慣付けましょう。命令を覚えるだけが勉強ではありません。 さて、ぱっと見てあきらかなのは ・期待する動作: 正解するまで入力を繰り返す ・実際の動作: 1回の入力で終了する ということ。繰り返し動作がおかしい、ということなら、その主な原因は ・繰り返し動作の継続/終了条件に問題がある ・そもそも繰り返し動作する構造になっていない の2つ。で、プログラムを見ると、あきらかに後者。繰り返し実行するようなしくみがまったく入っていない。 どこになにを入れるかは、まず御自身で考えてみてください。 その他には.... > printf("%\n",i); まず、書式がおかしいです。また、ここで i を表示する意図がわかりません。 > i=rand()%100; //0以上100以下の整数を生成 このコメントが間違い。 コメントが間違っていても、プログラムが間違ってなければ、動作自体は問題はありません。 しかし、プログラムの作成、検討時の重要なヒントです。間違ったコメントを信じたら、間違ったプログラムを作ってしまし、修正時にも「正しいつもり」になってしまいます。 ここでは「100で割った余り」がいくつになるか、よく考えてみてください。 そうすると > 1以上100以下の整数を入力してください と入力を促すのに対して、用意する「答え」がこの範囲ではないことにも気付きませんか?