• ベストアンサー

質問項目をランダムで選択する方法(C++)

現在C++でアンケートのようなプログラムを作成しています。いまのところ… #include<stdio.h> #include<stdlib.h> #include<time.h> int main(void) { int mondai, q_number; int answer01, answer02, answer03; int point; point = 0; srand( (unsigned int)time(0) ); mondai = 0; for (mondai<2;) { q_number = (rand() % 3)+1; switch(q_number) { case 1: if(mondai<2) { printf("質問1 今何をしたいですか?\n"); printf("1:食べる\n"); printf("2:寝る\n"); printf("3:遊ぶ\n"); printf("4:勉強する\n"); scanf("%d",&answer01); if(answer01==1) {point=point+2;}else if(answer01==2){point=point+4;}else if(answer01==3){point=point+6;}else{point=point+8;} mondai++; } { printf("問題1を選択しましたが、すでに行ったのでパスします\n"); } break; のように作っています。10項目のなかからランダムに5つほど選択し、4択の質問の中にはそれぞれポイントが課されています。5つの質問に答えた跡にポイントを表示したいのですが、なかなかうまくいきません。 どなたかご教授願えないでしょうか?よろしくお願いいたします。

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

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.4

以下のようにして下さい。 不明点があれば質問して下さい。 たぶん、これがあなたの望んでいる結果かと思います。 #include<stdio.h> #include<stdlib.h> #include<time.h> //質問のテキスト char qes[10][256] = { "質問1 今なにがしたいですか。\n", "質問2 ここを変える。\n", "質問3 ここを変える。\n", "質問4 ここを変える。\n", "質問5 ここを変える。\n", "質問6 ここを変える。\n", "質問7 ここを変える。\n", "質問8 ここを変える。\n", "質問9 ここを変える。\n", "質問10 ここを変える。\n" }; //質問内容の詳細(1から最大9迄とする) char det[10][256] = { //質問1用 "1:食べる\n2:ねる\n3:勉強4:なにもしない\n", //質問2用 "1:ここを変える\n....9:ここを変える\n", "1:ここを変える\n....9:ここを変える\n", "1:ここを変える\n....9:ここを変える\n", "1:ここを変える\n....9:ここを変える\n", "1:ここを変える\n....9:ここを変える\n", "1:ここを変える\n....9:ここを変える\n", "1:ここを変える\n....9:ここを変える\n", "1:ここを変える\n....9:ここを変える\n", //質問10用 "1:ここを変える\n....9:ここを変える\n", }; //回答に対するポイント int point[10][9] = { //質問1の回答 {10,20,30,0,-1,-1,-1,-1,-1}, {10,20,30,0,-1,-1,-1,-1,-1}, {10,20,30,0,-1,-1,-1,-1,-1}, {10,20,30,0,-1,-1,-1,-1,-1}, {10,20,30,0,-1,-1,-1,-1,-1}, {10,20,30,0,-1,-1,-1,-1,-1}, {10,20,30,0,-1,-1,-1,-1,-1}, {10,20,30,0,-1,-1,-1,-1,-1}, {10,20,30,0,-1,-1,-1,-1,-1}, //質問10の回答 {10,20,30,0,-1,-1,-1,-1,-1} //上記の例は全て4つ回答があるケース }; int main(void) { //10問から5問をピックアップする int flag[10]; //質問を出題するか否かのフラグ int no_q = 0; //質問の数 int ix; int i; int total_point = 0; int answer; for (i=0;i<10;i++) flag[i]=0; //フラグを0クリア srand(time(NULL)); //乱数の種をセット while(no_q < 5){ ix = (rand()%10); if (flag[ix]==0){ flag[ix] = 1; no_q++; } } //これでflag[0]~flag[9]に1が設定された(5件分) for (i=0;i<10;i++){ //出題対象ならその問題を表示する if (flag[i]==1){ printf("flag[%d]=%d\n",i,flag[i]); //質問を表示 printf(qes[i]); //質問毎の回答を表示 printf(det[i]); //正しい入力が行われるまで繰り返す while(1){ scanf("%d",&answer); //ポイントが0以上は正しい回答、負の時は範囲外なのでエラー if (answer > 0 && answer < 10 && point[i][answer-1] >= 0){ total_point += point[i][answer]; break; } printf("入力エラー\n"); } } } printf ("あなたの得点は%d点です\n",total_point); }

isshy1151
質問者

お礼

ご丁寧な回答ありがとうございます。 早速入力してみたいと思います。

その他の回答 (3)

回答No.3

1. 質問番号を 0..9 とし、配列に設定します。 int q_num[10]; for ( i = 0; i < 10; ++i ) q_num[i] = i; 2. 乱数でq_num[] の中身をかき混ぜます。 for ( i = 0; i < 100 /*適当*/; ++i ) { q_num[0] と q_num[10未満の乱数] を交換 } 3. q_num[0..4] を出題します。

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

以下の手順でどうでしょうか。 int flag[10];として、このフラグは flag[0]が問題1、flag[9]が問題10に対応します。 flagの値が0の時、問題が未選択、1の時、選択済とします。 1.flagを全て0クリアする。 2.選択済の問題が5になるまで以下を繰り返す。 1)0から9の乱数を発行する。 2)flag[乱数値]==0の時、その問題は未選択なので、その問題を表示する。 3)上記1)2)を表示した問題の数が5になるまで繰り返し行う。 4)問題を選択させ、選択した問題に対応したflagに1をセットする。 上記によって、5問ずつ、5回選択させることが出来ます。

isshy1151
質問者

補足

お教えいただいてありがとうございます。 回答のほうを見させていただいたのですが、こちらの不勉強&説明不足のようでしたので再度説明を加えさせていただきます。 質問は10個あって、それぞれ下記のようなものとなっています。 質問:あなたは昨夜何を食べましたか? 1:和食 2:洋食 3:その他 4:食べていない それぞれの回答にはポイントがあり 1:5pt 2:4pt 3:3pt 4:2pt のように割り振られています。似た形式の質問10の中からランダムに5つを選び、最後に各質問で与えられたポイントを表示する といったものです。ご迷惑をおかけしますがよろしくお願いいたします(*_ _)人

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

>5つの質問に答えた跡にポイントを表示したいのですが、なかなかうまくいきません。 どのようにうまくいかないのでしょうか。 ソースが途中できれてますので、全体の意味がとらえられませんが、 for (mondai<2;) はfor(;mondai<5;)のように思われますが。 5つの質問に答えた場合ということは、mondaiの値が5になった場合のことで良いのでしょうか?

isshy1151
質問者

補足

早速の回答ありがとうございます。 ソースが途切れていて申し訳ありません。ポイントに関しては計算ができるようになりました。うまくいっていないところは、 1)1度選んだ質問は2度と選ばないようにできない(1度選ばれた質問が再度登場してしまう) 2)10の質問から5つピックアップするのができない 以上です。上記のソースを使わなくともできる方法がありましたら、重ねてお教え願えたらと思います。 よろしくお願いいたします。

関連するQ&A

専門家に質問してみよう