• ベストアンサー

質問項目をランダムで選択する方法(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

  • C言語初心者です。 ジャンケンゲーム

    今、授業の課題でジャンケンゲームを作成していますが、なかなかできません。もし、良かったら何処が違うのか教えてください。 // main.c #include <stdio.h> #include <time.h> //#include <time.h> #include "my.h" main(int argc, char* argv[]){ int i; char s[7]; printf("これはジャンケンゲームです。\n"); printf("手を入力します(グー:1 チョキ:2 パー:3)\n"); scanf("%s",&s[7]); srand((unsigned)time(NULL)); printf("%s\n",jyan(dice(3))); if(s == jyan){ printf("あいこです。\n"); }else if(s == 1 && jyan ==2){ printf("あなたの勝ちです。\n"); }else if(s == 2 && jyan == 3){ printf("あなたの勝ちです。\n"); }else if(s == 3 && jyan ==1){ printf("あなたの勝ちです。\n"); }else{ printf("コンピュターの勝ちです。\n"); } } // dice.c #include <time.h> int dice(int n){ srand((unsigned)time(NULL)); return(rand()%n+1); } // jyan.c char *jyan(int n){ static char s[][7]={"グー","チョキ","パー"}; return s[--n]; } // my.h #include <stdio.h> char *jyan(int hand); //int dice(int n); 見づらくて申し訳ありません。4つのファイルに分けて作成しています。上記のプログラムだと自分の手、コンピューターの手がランダムに出てくるのですが判定が出来ませんでした。アドバイス、よろしくお願いします。 長文になってしまい申し訳ありません。

  • c言語についての質問です。

    #include<stdio.h> int main(void){ int a; printf("1文字たいぷしてください。\n"); scanf("%d",&a); if(a>=65 && a<=90){ printf("大文字です。\n"); } else if(a>=97 && a<=122){ printf("小文字です。\n"); } else{ printf("大文字でも小文字でもありません\n"); } return 0; } このプログラムは正しくなくて、 intをchar %dを%cにかえなければなりません。 なぜintはダメなんでしょうか? できれば丁寧に教えてください。 お願いします。

  • C言語でのじゃんけん

    こんちには。 C言語の乱数を用いてじゃんけんプログラムを作ろうと思っているのですが、 エラーメッセージが出てしまいうまくいきません。 どこがおかしいのでしょうか? #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int i,j,k; printf("じゃんけんをしましょう(ぐー:1、ちょき:2、ぱー:3)¥n"); for(k=k; k<=10; k++) { srand(time(NULL)); j=rand()%3+1; scanf("%d",&i); if(i==1&&j==1) printf("私はグーなので、あいこです¥n"); else if(i==1&&j==2) printf("私はチョキなので、あなたの勝ちです¥n"); else if(i==1&&j==3) printf("私はパーなので、あなたの負けです¥n"); else if(i==2&&j==1) printf("私はグーなので、あなたの負けです¥n"); else if(i=2&&j==2) printf("私はチョキなので、あいこです¥n"); else if(i==2&&j==3) printf("私はパーなので、あなたの勝ちです¥n"); else if(i==3&&j==1) printf("私はグーなので、あなたの勝ちです¥n"); else if(i==3&&j==2) printf("私はチョキなので、あなたの負けです¥n"); else if(i==3&&j==3) printf("私はパーなので、あいこです¥n"); else printf("1か2か3を入力してください¥n"); } } OS mountain lionで利用中ですが、 「じゃんけんをしましょう(ぐー:1、ちょき:2、ぱー:3)」 と表示されたまま、うまく動作しません。 教えてください。

    • ベストアンサー
    • Mac
  • c言語について。

    #include<stdio.h> #include<string.h> #include<math.h> #include<stdlib.h> #include<time.h> int goukei=0; //goukei関数の定義 int detame; //detame関数の定義 void gusu(){printf("偶数%dが出ました。ゲームオーバーです。\n",detame); getchar(); exit(1);} int kisu(){ goukei=goukei+detame; printf("奇数%dがでました。合計%d点です。\n",detame,goukei); } main(){ char answer[20]; //文字型変数answerの宣言 int amari; //amari関数の宣言 //ゲームの説明・開始 printf("さいころの目が奇数なら、出た目だけ得点が加算され、\n"); printf("偶数が出たら、その場でゲームオーバーです。\n"); printf("さいころを振ってください。\n"); getchar(); srand((unsigned)time(NULL));//rand関数の初期化 detame=rand()%6+1;//1から6までの乱数の発生 amari=detame%2; if(amari==0){gusu();}else{kisu();} while(1) { printf("ゲームを続けますか?yesかnoで答えてください。\n"); scanf("%s",&answer); if(strcmp(answer,"no")==0){ break;} printf("ゲームを続けます。\n"); printf("さいころを振ってください。\n"); getchar(); detame=rand()%6+1; amari=detame%2; if(amari==0){gusu();}else{kisu();} } //合計得点とゲームの終了 printf("合計で%d点でした。ゲームを終了します。\n",goukei); } このプログラミングはさいころを振って、奇数なら出た目が加算され奇数ならゲームオーバーというものなんですが、さいころを二つにするときはどういうプログラムになるのか教えてください。お願いします。

  • c言語のフローチャートについての質問です

    #include <stdio.h> int main (void) { int n; for (n=1900; n<2000; n++) { if (n%4==0 && n%100!=10) printf ("%d",n); else if(n%400==0) printf ("%d",n); } printf("\n"); return 0; } をどなたかフローチャートに直してください JIS規格のものでお願いします

  • 高(1)男子 初めてC言語でコードを書きました!!

    C言語を独学し始めた高校一年男子です。 「猫でもわかる C言語プログラミング」という本で勉強しています。 その本のポインタなどの難しいところを除いて 一通り読んで1~100までの数を当てる数当てゲームを作ってみました! これまでは、本に書かれていることを写してやっていたので、自分で組むのは初めてです。 これからは、もっと高度なプログラムやゲームを作っていきたいと思っています。 それを踏まえて、今後どのようなことを気をつけて書いていけばいいかなどの アドバイスをコードを見てしてもらいたいのですが、 だれか、お願いできないでしょうか? これが、そのコードです↓ //<if,goto,rand関数を使った数当てゲーム>// #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { printf("いまから数当てゲームをします\n"); R: printf("0~100のうちどれが答えなのか当ててください\n"); int Q,A,Y,i; srand((unsigned)time(NULL)); Q=rand()%100+1; for(i=1; i<6; i++) {printf("あと%d回で当ててください!\n",6-i); scanf("%d",&A); if(Q<A){printf("もっと小さい数です\n"); } else if(Q>A){printf("もっと大きい数です\n"); } else{printf("正解です!!(^O^)/\nもう一回やりますか??\nはい→1\nいいえ→それ以外の数字\n選択してください\n"); scanf("%d",&Y); if(1==Y){goto R;} if(1!=Y){}break;}} printf("\n「「「終了します」」」\n"); return 0; } 長くなりましたが、アドバイスお願いします m(._.)m

  • c言語のフローチャートについての質問です

    #include <stdio.h> int main (void) { int n; for (n=1900; n<2000; n++) { if (n%4==0 && n%100!=10) printf ("%d",n); else if(n%400==0) printf ("%d",n); } printf("\n"); return 0; } をフローチャートに直したいのですがいまいち方法が解りません、どなたか詳しい回答お願いします JIS規格のものでお願いします

  • C言語について

    次のような問題です。 問 自然数nを入力し、nを3で割って割り切れるかどうかを判定し結果を表示する。「割り切れる」、「1余る」、「「2余る」のいずれかが入るものとする。 このようなものをつくりました。 #include<stdio.h> int main(void) { int n; printf("自然数:"); scanf("%d",&n); if(n==0){ printf("割り切れる\n"); }else if(n==1){ printf("1余る\n"); }else{ printf("2余る"); } return(0); } これで合っているかよろしくお願いします。

  • 基準値をランダムに選んでの選択ソート

    配列要素から基準値(pivot)をランダムに選び、K番目に小さい要素を検索するプログラムを書いているのですが、うまくいきません。かなり考えているのですが、何が間違っているのか全然わかりません。どなたか教えていただけないでしょうか? #include<stdio.h> #include<stdlib.h> #include<time.h> int pivotpoint; void partition3(int *s,int low,int high,int *pivotpoint) { int i,j,randspot; int tmp; int pivotitem; randspot=rand()%(high+1); pivotitem=s[randspot]; j=low; for(i=low+1;i<=high;i++){ if(s[i]<pivotitem){ j++; tmp=s[i]; s[i]=s[j]; s[j]=tmp; } } *pivotpoint=j; tmp=s[low]; s[low]=s[*pivotpoint]; s[*pivotpoint]=tmp; } int selection3(int *s,int low,int high,int k) { if(low==high) return s[low]; else{ partition3(s,low,high,&pivotpoint); if(k==pivotpoint) return s[pivotpoint]; else if(k<pivotpoint) return selection3(s,low,pivotpoint-1,k); else return selection3(s,pivotpoint+1,high,k); } } main() { int num,i,k; int high; int low=0; int s[1000]; struct timeval t1,t2; int seed=2; printf("How many elements?:"); scanf("%d",&high); printf("?n"); printf("What is the kth smallest number?:"); scanf("%d",&k); printf("?n"); srand(seed); for(i=0;i<high;i++){ s[i]=rand(); printf("%d ",s[i]); } printf("?n"); gettimeofday(&t1,0); num=selection3(s,low,high-1,k-1); gettimeofday(&t2,0); printf("Time=%dmicrosec?n", t2.tv_usec-t1.tv_usec); printf("The %dth smallest is %d?n ", k,num); }

  • じゃんけんゲームをつくったのですが・・・。

    自分でじゃんけんゲームを作ってみたのですが、他の人のソースで どういう風に組んでいるのか研究したいのでソースお願いします。 後、もっとこういう風にした方がいいとおもう所があればおねがいします。 <ソース> #include<stdio.h> #include<time.h> #include<stdlib.h> int main() { int i; int n; srand(time(NULL)); n=rand()%3; printf("じゃんけんをします,0がグーで1がチョキで2がパーです\n"); printf("じゃんけんぽい!"); scanf("%d",&i); if(i==0&&n==0){ printf("あいこです\n"); } else if(i==0&&n==1){ printf("勝ちました\n"); } else if(i==0&&n==2) { printf("負けました\n"); } if(i==1&&n==0){ printf("負けました\n"); } else if(i==1&&n==1){ printf("あいこです\n"); } else if(i==1&&n==2) { printf("勝ちました\n"); } if(i==2&&n==0){ printf("勝ちました\n"); } else if(i==2&&n==1){ printf("負けました\n"); } else if(i==2&&n==2){ printf("あいこです\n"); } if(i>2) { printf("やりなおしてください\n"); } return 0; }