プロが教える店舗&オフィスのセキュリティ対策術

現在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つの質問に答えた跡にポイントを表示したいのですが、なかなかうまくいきません。

どなたかご教授願えないでしょうか?よろしくお願いいたします。

A 回答 (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);
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/07/20 15:34

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] を出題します。
    • good
    • 0

以下の手順でどうでしょうか。


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回選択させることが出来ます。

この回答への補足

お教えいただいてありがとうございます。

回答のほうを見させていただいたのですが、こちらの不勉強&説明不足のようでしたので再度説明を加えさせていただきます。

質問は10個あって、それぞれ下記のようなものとなっています。
質問:あなたは昨夜何を食べましたか?
1:和食 2:洋食 3:その他 4:食べていない
それぞれの回答にはポイントがあり
1:5pt 2:4pt 3:3pt 4:2pt
のように割り振られています。似た形式の質問10の中からランダムに5つを選び、最後に各質問で与えられたポイントを表示する

といったものです。ご迷惑をおかけしますがよろしくお願いいたします(*_ _)人

補足日時:2004/07/19 23:58
    • good
    • 0

>5つの質問に答えた跡にポイントを表示したいのですが、なかなかうまくいきません。


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

この回答への補足

早速の回答ありがとうございます。

ソースが途切れていて申し訳ありません。ポイントに関しては計算ができるようになりました。うまくいっていないところは、

1)1度選んだ質問は2度と選ばないようにできない(1度選ばれた質問が再度登場してしまう)

2)10の質問から5つピックアップするのができない

以上です。上記のソースを使わなくともできる方法がありましたら、重ねてお教え願えたらと思います。

よろしくお願いいたします。

補足日時:2004/07/19 22:53
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!