• 締切済み

Cでの数当てプログラム

現在、Cで数当てプログラムを作っておりますが、C初心者で、何が何だか分からない状態です。 <プログラムの内容> ・0から2の数値から1つ選択して入力してもらう。 ・コンピュータが選んだ値と一致したら"あたり"、不一致なら"はずれ"を出力。 ・10回繰り返したら、1回目から入力された数値と、コンピュータが選んだ数値を表示。 ・最終的に、当たった確立を%で表示。 <条件> 1.以下の構造体を使う。 typedef struct{ int m_inputNumber; int m_selectNumber; char m_result[7]; }NUMBERDATA; 2.以下の関数を作る。 ・数値入力関数:int inputNumber(); ・選択された数値と入力された数値を比較して当たり、はずれ出力し、それを構造体に格納する関数: void judge(int i_inputnumber,NUMBERDATA* o_numberdata); ・結果表示関数:void outputData(NUMBERDATA* i_numberdata); 3.乱数発生プログラムの埋め込み。 #include <stdlib.h> #include <time.h> int selectnumber; time_t seed; time(&seed); srand(seed); selectnumber = rand() % 3; 4.strcpy,strcmp関数を使う。 5.main関数を以下のように設定。 int main(){ NUMBERDATA I_data[10]; int i; for(i = 0; i < 10; i++){ judge(inputNumber(),&I_data[i]); } outputData(I_data); return 0; } <サンプル画面> 0から2の数値から値を1つ入力してください > 1 結果 = あたり 0から2の数値から値を1つ入力してください > 0 結果 = はずれ ……(10回繰り返し) =結果= 1回目 入力値:1 コンピュータが選択した値:1 (あたり) 2回目 入力値:0 コンピュータが選択した値:1 (はずれ) ……(10回分出力) 確立 = **% と、こんな感じなのですが、理解力不足で完成には程遠くなっています。 Cに詳しい方が居ましたら、書き方、図々しいですが、ソースなんかあれば非常に助かります。 色々と無茶な事言ってますが、ご回答の方お願い致します。

みんなの回答

回答No.2

>理解力不足で 「(C言語の)理解不足」ではなく「課題の理解不足」と「必要な処理を検討する能力不足」です。 ・乱数を発生させる処理 ・数字入力を促す処理 ・入力した数字を取得する処理 ・取得した数字と乱数を比較する処理 ・上記を10回行い結果を保存する処理 ・一致したかどうか表示する処理 を作ればできます。 >図々しいですが、ソースなんかあれば非常に助かります。 「課題」でしょ? 自分で考えなくてどうするのでしょうか? 「この部分がわからない」ならともかく「全部わからないからソース」というのは虫が良すぎます。

izumoer
質問者

お礼

返答ありがとうございます。 友人や先輩に教えてもらいながら、完成させることが出来ました。 我侭で不快にさせてしまい、申し訳ありませんでした。

回答No.1

...要するに"課題の丸投げ"ですね。 > C初心者で、何が何だか分からない状態です。 ならばちょっとでも分かる程度には勉強してください。 じゃないとソースまるごと貰ったところで理解できんでしょう。

izumoer
質問者

お礼

返答ありがとうございます。 友人や先輩に教えてもらいながら、完成させることが出来ました。 我侭で不快にさせてしまい、申し訳ありませんでした。

関連するQ&A

  • C言語でscanfを用いた入力

    C言語でscanfの動作を確かめる為に、次のプログラムを作成して実行してみました。 #include <stdio.h> int main(void){ int i; printf("Input1:"); scanf("%d",&i); printf("Input2:"); scanf("%d",&i); printf("Output:%d",i); return 0; } このプログラムは1回目と2回目に数値を入力すると正常に出力します。 例 1回目の入力に10、2回目の入力に20を入力した時の出力結果 Input1:10 Input2:20 Output:20 今度は1回目で数値、2回目で文字を入力してみました。 そしたら2回目の入力が無視されました。 例 1回目の入力に10、2回目の入力にAを入力した時の出力結果 Input1:10 Input2:A Output:10 今度は1回目で文字を入力してみました。 そしたら2回目の入力は要求せず、いきなりよく分からない数値が出力されました。 例 1回目でAを入力した時の出力結果 Input1:A Input2:Output:-858993460 どうして文字を入力したら正常に出力しなくなるのでしょうか?

  • 数当てゲームを作っているのですが

    数当てゲームを作っているのですが 乱数を設定してその値よりも小さい値を入力したら「小さい」、 大きい値を入力したら「大きい」と表示して その値を入力したときは「正解」と表示するような数当てゲームを作っています。 一応コードは書けたのですが、コンパイル、実行がうまくいかないのです。 ご指摘お願いします。 以下コード /* 1~99の乱数を発生させる */ #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int i,random; // 乱数の種を植える,種に時間を使う srand((unsigned)time(NULL)); for(i=0; i<1; i++) { //乱数の発生 random = 1 + rand()%99; printf("%d\n",random); } printf("数当てゲームをはじめます。\nコンピュータが当たり数を用意しました。当たり数は1~99の間にあります。\n"); for(;;) { printf("あなたの予想は? > "); scanf("%d",&i); if(i>random) puts("大きい"); else puts("小さい"); break; } if(random - i = 0) printf("正解"); return (0); }

  • C言語について質問なんですが((。繰り返しを指示するプログラムがどうも

    C言語について質問なんですが((。繰り返しを指示するプログラムがどうも上手くいきません・・・ C言語について質問なんですが((。繰り返しを指示するプログラムがどうも上手くいきませんorz。詳しい方是非応援に(TAT)! 今打ち込んでいるとこなんですがどうもうまくいかなくて(orz どんな内容かといいますとテキストボックス1に入力した数値を テキストボックス2に入力した回数分掛けた値をもとめ テクストボックス3に出力するものです 例えばテクストボックス1に「13」と入力し、テクストボックス2に「2」と入力したら 169とテクストボックス3に出力したいのですが上手くいかなくて。。。 for(i=0;i<b;i++)この後に繰り返しの式を書かなければと思うのですが・・・それも思いつかず(TAT) っていうか他に2~3個方法があるのですがこの for(i=0;i<b;i++)があっているのかもわからず・・・orz 是非、是非力をかしてください! ちなみにプログラムはこんな感じになってます↓ private void button5_Click(object sender, EventArgs e) { //2の0乗=1 //2の1乗=1*2*2=2 //2の2乗=1*2*2=4 //2の3乗=1*2*2*2=8 //2の4乗=1*2*2*2*2*=16 int a, b, c,i; //入力 //textboxの数値を変数aに入力 a = int.Parse(textBox1.Text); //↑がわからに場合数字のドキュメントで数値入力を確認 //textbox2の数値を変数bに入力 b = int.Parse(textBox2.Text); //処理 //cに1を代入 //b回繰り返す //cにaを掛ける c = 1; //出力 //求めた答えをtextbox4に出力 textBox3.Text = c.ToString(); for(i=0;i<b;i++) { }}

  • 数当てゲーム

    たのしい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言語のプログラムについて。

    C言語のプログラミングについて質問です。 入力されたデータの配列とデータ数を渡すと配列に格納された値を逆順にして、格納し直す関数reverse関数を書き結果を出力せよ、というものなのですが下のように書いたのですが、うまく作動しません。どこがいけないのでしょうか...?教えていただきたいです。 #include <stdio.h> void reverse(int *data[], int n); #define MAX 100 int main() { int data[MAX]; int n, i; scanf("%d", &n); if (n >= MAX) n = MAX; for (i = 0; i < n; i ++){ scanf("%d", &data[i]); } reverse(data, n); for (i = 0; i < n; i ++) { printf("%d\n", data[i]); } return 0; } void reverse(int *data[], int n) { int c, i; for (i = 0; i < n; i ++) { c = *data[i]; *data[i] = *data[n - (i + 1)]; *data[n - (i + 1)] = c; } }

  • スタックを用いたプログラム

    http://okwave.jp/qa4433705.html 先日教えて戴いた事でスタックがどういったものなのかは わかりましたが、実際にプログラムを作ってみると、 なかなかうまくいけません。再びアドバイスを戴ければと思ってます。 <プログラムの仕様> 入力数値をスタックに格納し'a'が入力されたら、 スタックに格納されている数値を全て取り出し、 平均値を出力するプログラム ・スタックは、push()関数およびpop()関数を実装する ・スタックへの要素の追加はpush()関数で行う ・スタックからの要素の取出はpop()関数で行う ・スタックのサイズは任意とする int push(int push_data);  引数: スタックに追加するデータ  戻り値: 成功の場合1、失敗の場合0を返す int pop(int *pop_data);  引数: スタックから取り出した値を格納するポインタ  戻り値: 成功の場合1、失敗の場合0を返す いざ、自分で作ってみると、 仕様通りには全く作れず、結局main関数ですべてを作って しまうことになってしまいます・・

  • 数当てゲームについて

    #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以下」の値を入力してくださいとなっていますが 結局わからずにそのままになっているためです。 よろしくお願いいたします。

  • C++プログラム問題(初心者です)

    C++の勉強初めて1ヶ月ぐらいです。 以下にある問題がわかりません。 解説付きでお願いします。 [問題] 関数 funcのみを修正することで、標準出力に 2 が表示する。 [プログラム] #include <iostream> using namespace std; int func(int i) {return i;} int main() { int i = 1; cout << ++func(i) << "\n"; return 0; }

  • 因数分解プログラム(C言語)について(1)

    ”因数分解を行うプログラムについて”の質問と同じ者です。 みなさんのご回答を参考にして、作ってみたのですが、 ポインタとかの使い方などがわからず、実行すると、 不正な処理を行ったので終了しますとなってしまいます。 どなたか、具体的にどこが悪いのか、 そしてどのように直せば正しく実行されるのか、 教えて下さい。お願いします。 以下↓がプログラムです。 800文字以上のため二つに分割しました。 #include <stdio.h> #include <math.h> #include <process.h> /*関数プロトタイプ宣言*/ int input(int *,int *,int *); int judge(int *,int *,int *); int bunkai1(int *,int *,int *,int *,int *,float *); int bunkai2(int *,int *,int *,int *,int *,float *); int yakubun1(int *,int *,int *,int *,int *,int *,int *); int yakubun2(int *,int *,int *,int *,int *,int *,int *); int output(int *,int *,int *,int *); /*関数の呼び出し*/ int main(void) { int a,b,c,q,n1,m1,min1,flag,i,d,e,m2,n2,min2,f,g; float D; input(&a,&b,&c); judge(&a,&b,&c); bunkai1(&a,&b,&q,&n1,&m1,&D); bunkai2(&a,&b,&q,&n2,&m2,&D); yakubun1(&m1,&n1,&min1,&flag,&i,&d,&e); yakubun2(&m2,&n2,&min2,&flag,&i,&f,&g); output(&d,&e,&f,&g); return (0); } /*数値入力関数*/ int input(int *a,int *b,int *c) { printf("a*x^2+b*x+c=0で,a,b,cを入力して下さい。\n"); printf("a="); scanf("%d",a); printf("b="); scanf("%d",b); printf("c="); scanf("%d",c); if(*a == 0){ printf("a = 0なので因数分解できません。\n"); exit(1); } return 0; } つづく

  • C言語でサイコロのプログラムを作ってみたのですが

    まず、以下のような”実行するたびに1~6の数字をランダムに出力するプログラム”を 作ってみたのですが、特定の数字が出てこないのです。 例えば、1と4、2と5、3と6 が出ない ここで気がついた事は、 1、出ない目の2数の差は3であること。 2、乱数自体を表示させたところ、ちゃんと1秒毎に乱数は変わっている。こちらには問題はない 3、約1分間隔で、出ない数字の組み合わせが変わる。 (例えば 1,3,4,6,1,6,3,6,4(2と5が出ない)  →1分間実行し続けると・・・  2,3,6,5,3,2,2,6(1と4が出ない)) この原因は一体なんなのでしょうか・・・ とても気になって仕方がありません。わかる方教えてください。 以下、ソースコードになります #include<stdio.h> #include<time.h> #include<stdlib.h> int func(void); int main(void){ int number=0; number=func(); //サイコロの目の表示 printf("%d\n",number); return 0; } int func(){ //乱数の初期化 srand((int unsigned)time(NULL)); //サイコロの目をランダムで出力し、返す return rand()%6+1; } プログラムの仕組みは パソコンから現在の歴時刻を元に乱数の初期値を変更 ↓ rand関数で適当な値を受け取り、6で割った余剰+1を計算し値を返却する

専門家に質問してみよう