• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:プログラミング)

プログラミング:ランダムな数値を判定するプログラムの作成方法

このQ&Aのポイント
  • プログラミングで、ランダムな数値を入力して、その数値が正解より大きい場合は「正解より大きい」と表示し、小さい場合は「正解より小さい」と表示し、正解の場合は「正解」と表示するプログラムを作成しています。
  • また、正解までの試行回数も表示する予定です。
  • しかし、上手く実行できないため、アドバイスをいただきたいです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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)
回答No.5

#4さん、#3の回答者です。 笑ってしまいました。はずかしい。。。。 もういじらないでください。。。。(爆笑)

全文を見る
すると、全ての回答が全文表示されます。
  • kakuritsu
  • ベストアンサー率23% (62/261)
回答No.4

#3さん これだと ・1以上100以下のどの数を入れても正解しない場合があります。(=プログラムが終わらない) ・また答えとして 100 を入れて正解することは、このプログラムを何回動作させてもありません。 というバグがあります。 質問者さんのためにも、どことは指摘しません。

全文を見る
すると、全ての回答が全文表示されます。
  • w_HIRO_w
  • ベストアンサー率47% (9/19)
回答No.3

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)
回答No.2

>プログラムをつくっています 質問者が「作っている」としたら、/* 無限ループ */のコメントは、ありえないです。 >break; /* 無限ループ */ この「無限ループ」とやらで、「入力/判定」部分を包んでやればイイだけだから。 そうすれば、「無限ループ」の { を追加することになり、//return0; の後にも、} を追加できて、これが main() の { と対になります。 というか、{} の数を揃えて投稿したんだから、揃えたとき、return0; の後に、} が無くともなぜ揃うのか、と考えるべき・・。 なんで、return0; の前に // を付けなくてはいけないのか、と考えるべき・・。 また、コンパイラも指摘したはず。 なお、間違っても無限ループ構文内に、「正解を生成する」部分を含めないこと。 よっぽど運が良くないと、「正解」にたどり着けないプログラムとなる(笑)。   y = 0;   while( 1 ){ /* 無限ループ */     入力/判定     判定で正解の時、break; /* 無限ループ脱出 */   }   return 0;  } ・デバック時に、printf( "%d\n", i ); で、i の値を表示するのはすごくいいと思います(昨年に教わったとおりに記述して、正しい位置に入れて、だけど)。 ・細かいことだけど、「( x < i )なのに、『正解より大きい』」・・・    ・    ・ 30行ほど拙いこと、怒りに任せて書いたんだけど、無益だから割愛します。 (昨年から直前の質問/回答の流れ等、少しでも振り返っていただければ、内容は判るかな・・) 上だって、「拙い」といわれればそれまでだけど、「怒り」はあまり・・ありません。

全文を見る
すると、全ての回答が全文表示されます。
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

> 上手く実行できないので 何がどう「上手く実行できない」のでしょうか? 「期待している結果とどう違うのか」 まずそれを分析するのが、プログラム修正の基本中の基本です。軽微なミスなら、これだけですぐに解決策がわかります。 プログラミングを勉強するなら、これを習慣付けましょう。命令を覚えるだけが勉強ではありません。 さて、ぱっと見てあきらかなのは ・期待する動作: 正解するまで入力を繰り返す ・実際の動作: 1回の入力で終了する ということ。繰り返し動作がおかしい、ということなら、その主な原因は ・繰り返し動作の継続/終了条件に問題がある ・そもそも繰り返し動作する構造になっていない の2つ。で、プログラムを見ると、あきらかに後者。繰り返し実行するようなしくみがまったく入っていない。 どこになにを入れるかは、まず御自身で考えてみてください。 その他には.... > printf("%\n",i); まず、書式がおかしいです。また、ここで i を表示する意図がわかりません。 > i=rand()%100; //0以上100以下の整数を生成 このコメントが間違い。 コメントが間違っていても、プログラムが間違ってなければ、動作自体は問題はありません。 しかし、プログラムの作成、検討時の重要なヒントです。間違ったコメントを信じたら、間違ったプログラムを作ってしまし、修正時にも「正しいつもり」になってしまいます。 ここでは「100で割った余り」がいくつになるか、よく考えてみてください。 そうすると > 1以上100以下の整数を入力してください と入力を促すのに対して、用意する「答え」がこの範囲ではないことにも気付きませんか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 配列の要素数に変数を入れたい

    配列に数の入力履歴を入れて最後にその数を出力したいのですが、変数を入れることはできないと勉強した記憶がありまさにその通りコンパイルエラーが出ました。 他に何か方法はありませんでしょうか。 /* 課題1-3 */ #include <time.h> #include <stdio.h> #include <stdlib.h> #include <math.h> int main(void) { int i; int no1; /* 範囲1 */ int no2; /* 範囲2 */ int max; /* 大きい乱数 */ int min; /* 小さい乱数 */ int y; /* 当てさせる数 */ int stage; /* 入力回数 */ int x; /* 読み込んだ値 */ int n; /* 入力制限 */ srand(time(NULL)); no1 = rand(); no2 = rand(); if(no1 > no2){ max = no1; min = no2; } else{ max = no2; min = no1; } y = min + rand() % (max-min); n = ceil(log(max-min)/log(2)); int a[n]; /*←配列の要素数をn個にしたい*/ printf("%d以上%d以下の整数を当ててください。\n", min, max); stage = 0; do{ printf("残り%d回。いくつでしょう:\n", n - stage); scanf("%d", &x); a[stage++] = x; if(y > x) printf("小さいです。\n"); else if(y < x) printf("大きいです。\n"); }while(y != x && stage < n); if(y != x) printf("残念でした。正解は%dです。", y); else printf("正解です。%d回目で正解しました。", stage); puts("\n---入力履歴---"); for(i=0; i<stage; i++) printf("%2d : %4d %+4d\n", i+1, a[i], a[i] - y); return (0); }

  • 数当てゲーム

    たのしいCという本でプログラミングの勉強をしています。 演習問題の解答がないので質問します。 2つの乱数を決定し、x以上y以下の整数を当てるプログラムです。 入力した数に対してヒントがあり、正解よりも小さければ"小さいです"と表示されます。 入力回数の制限を設け、乱数によって適切な入力回数にする計算方法の仕方がわかりません。 0以上1000以下の乱数の場合10回が適切みたいです。 よって0以上2000以下の場合は11回だということだと思います。 下のプログラムは回数の計算はしませんが、x以上y以下の整数を当てるプログラムになっていると思います。 適当な変数の名前や見にくいプログラムですいません。 /* 課題1-3 */ #include <time.h> #include <stdio.h> #include <stdlib.h> #define MAX_STAGE 11 /* 最大入力回数 */ int main(void) { int i; int no1; /* 範囲1 */ int no2; /* 範囲2 */ int max; /* 大きい乱数 */ int min; /* 小さい乱数 */ int y; /* 当てさせる数 */ int k; /* maxとminの差 */ int stage; /* 入力回数 */ int x; /* 読み込んだ値 */ int xbuf[MAX_STAGE]; srand(time(NULL)); no1 = rand(); no2 = rand(); if(no1 > no2){ max = no1; min = no2; } else{ max = no2; min = no1; } k = max - min; y = min + rand() % (k+1); printf("%d以上%d以下の整数を当ててください。\n", min, max); stage = 0; do{ printf("残り%d回。いくつでしょう:\n", MAX_STAGE - stage); scanf("%d", &x); xbuf[stage++] = x; if(y > x) printf("小さいです。\n"); else if(y < x) printf("大きいです。\n"); }while(y != x && stage < MAX_STAGE); if(y != x) printf("残念でした。正解は%dです。", y); else printf("正解です。%d回目で正解しました。", stage); puts("\n---入力履歴---"); for(i=0; i<stage; i++) printf(" %2d : %4d %+4d\n", i+1, xbuf[i], xbuf[i] - y); return (0); } 自分が考えた入力回数の設定は、kの値をif文で場合分けして入力回数を決定するという方法が思いつきました。他に何か良いアイデアとかってあるのでしょうか。 また、ごちゃごちゃと文を書いているので改善点などもあればよろしくお願いします。

  • C言語の課題が分からなくて困っています。

    http://www.picamatic.com/view/5868047_かかか/ URLの画像のような数当てゲームのプログラムを作成しているのですが、(1)~(5)の部分が分からなくて困っています。 面倒だとは思いますが、教えていただけないでしょうか。 #include<stdio.h> #include<stdlib.h> #include<time.h> int mani(void){ int i,x,y; srand((unsigned int)time(NULL)); (1) //1~1000の数をランダムに作成   y=0; //入力回数yを0にセットする for(;;){ //break文があるまで以下の処理を繰り返す printf("1以上1000以下の整数を入力してください。\n"); (2) //答えの入力 y=y+1; //入力回数yを1を増やす (3) //あたりの場合 printf("%d回目で当たりました。\n",y); (4) } else{ //外れの場合    (5) printf("違います。もっと大きな数です。\n"); else printf("違います。もっと小さな数です。\n"); } } return 0; }

  • このプログラミングで。

    #include <stdio.h> int main(void) { int x; printf("長い河はどれ?\n 1天の川 2三途の川 3谷川\n"); scanf("%d",&x); if(x == 1){ printf("なるほど"); } else if(x == 2){ printf("フーン"); } else if(x == 3){ printf("やっぱり?"); } else if(x != 1){ printf("ハァ?"); } else if(x != 2){ printf("ハァ?"); } else if(x != 3){ printf("ハァ?"); } return 0; } これを実行して 等しくないときハァ?と表示させて、ふたたび、入力をさせる方法を教えてください。何度でも入力を求める方法もありましたら教えていただきたいです。 とても理解に苦しむような質問ですがよろしくおねがいします。

  • ファイル分割について

    今本をみながら練習中なのですが、ファイル分割がうまくいきません。以下のような3つのプログラムをかいたのですが実行できません。 (一つ目:myfunc.h) int max(int x,int y); (二つ目:myfunc.c) int max(int x,int y){ if(x > y) return x; else return y;} (三つ目:sample.c) #include <stdio.h> #include "myfunc.h" int main(void){ int x,y,c; printf("1番目の整数\n"); scanf("%d",&x); printf("2番目の整数\n"); scanf("%d",&y); c = max(x,y); printf("最大値は%d\n",c); return 0;} すべてコンパイルしてsample.cを実行してもだめでした。ご指導お願いします><

  • 数当てゲームについて

    #include<stdio.h> #include<time.h> #include<stdlib.h> int main(void) { int num; int no; int max=11; int limit=0; srand(time(NULL)); /*乱数の値を初期化*/ no = rand() %1000; do{ printf("あと入力回数は%d回です。数字を入力してください。\n",max-limit); scanf("%d",&num); limit++; if(num>=1000 || num<=-1000) { printf("-999以上999以下の整数を入力してください。\n"); return -1; } if(num>no) { printf("\a大きいです。\n"); } else if(num<no) { printf("\a小さいです。\n"); } }while(no!=num && limit<max); if(no==num) { printf("正解です。\n"); printf("%d回で当たりました。\n",limit); } else { printf("残念です。当たりませんでした。\n"); printf("正解は%dでした。\n",no); } return 0; } これは、0以上999以下の整数を入力させて11回以内にランダムで 入力した値を当てさせるゲームです。 質問内容としては 「0以上999以下」→「-999以上999以下」に変更するにはどうすれば よいかです。 一部、「-999以上999以下」の値を入力してくださいとなっていますが 結局わからずにそのままになっているためです。 よろしくお願いいたします。

  • プログラミング

    “初項1公差1の等差数列において、数値XとYを入力して、この数列におけるX項からY項までの数列の和を算出する”プログラムを作っています。 実行結果を 『第X項から:1  第Y項まで:10  初項1公差1の等差数列において、  第1項から第10項までの和は55です。』としたいのですが、 上手くいきません。どこが間違っているのでしょうか? (初心者なのでかなりミスがあると思いますが…。) ↓作ったプログラム #include<stdio.h> main() { int X; int sum = 0; int Y; printf("第X項から:"); scanf("%d",&X); printf("第Y項まで:"); scanf("%d",&Y); while(X <= Y); { sum = sum + X; X = X + 1; } printf("初項1公差1の等差数列において、\n"); printf("第%d",X); printf("項から第%d",Y); printf("項までの数列の和は%d",sum); printf("です。"); }

  • 3つの整数が等しいかどうか調べるプログラム

    3つの整数が等しいかどうか調べるプログラムがよくわからないので、どなたか教えていただけないでしょうか?ちなみに、わからないながらに作ってみました。 #include <stdio.h> int main(void) { int x, y, z; puts("3つの整数を入力してください。"); printf("整数1:"); scanf("%d",&x); printf("整数2:"); scanf("%d",&y); printf("整数3:"); scanf("%d",&z); if (x==y==z) puts("3つの整数の値は同じです。"); else puts("3つの整数の値は違います。"); return (0); }

  • C言語プログラミングの問題がわかりません・・・。

    ただいまC言語を勉強している者です。 【入力するデータ数と各データ(整数)を入力していき,0 以下の整数の数,正の整数の数,0 以下の整数の合計,正の整数の合計を求めるプログラムを作成せよ。】 という問題があり、とりあえず #include "stdio.h" void main() { int i,j,k,l=0,m=0,goukeisei=0,goukeifu=0; printf("入力するデータ数:"); scanf("%d",&i); for(j=1;j<=i;j++); { printf("データを入力してください(整数):"); scanf("%d",&k); if(k>0){ l++; goukeisei+=k; }else{ m++; goukeifu+=k; } } printf("正の整数の数%d\n",l); printf("0以下の整数の数%d\n",m); printf("正の整数の合計%d\n",goukeisei); printf("0以下の整数の合計%d\n",goukeifu); } と作ってみたのですが、入力するデータ数の繰り返しがされません(1回入力して終わりになってしまいます);; for文の使い方が間違っているのでしょうか・・・ 詳しい方教えてくださいm( _ _ )m 尚環境はXPでVC++2008を使っています。よろしくお願いします。

  • 分割コンパイルの手順と方法について

    Visual Studio 2010でファイルを分割してコンパイル、リンクする方法がわかりません。以下のような3つのファイルです。 [myfunc.h] /* max関数の宣言 */ int max(int x, int y); [myfunc.c] int max(int x, int y) { if (x > y) return x; else return y; } [Sample13.c] #include <stdio.h> #include "myfunc.h" int main(void) { int num1, num2, ans; printf("1番目の整数を入力してください。\n"); scanf("%d", &num1); printf("2番目の整数を入力してください。\n"); scanf("%d", &num2); ans = max(num1, num2); printf("最大値は%dです。\n", ans); return 0; } 以上3つのファイルはあくまでも便宜的なもので、複数のファイルのコンパイル・リンクの手順を具台的に理解するために 用意したものです。