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

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);
}
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] を出題します。

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

No.1
- 回答日時:
>5つの質問に答えた跡にポイントを表示したいのですが、なかなかうまくいきません。
どのようにうまくいかないのでしょうか。
ソースが途中できれてますので、全体の意味がとらえられませんが、
for (mondai<2;)
はfor(;mondai<5;)のように思われますが。
5つの質問に答えた場合ということは、mondaiの値が5になった場合のことで良いのでしょうか?
この回答への補足
早速の回答ありがとうございます。
ソースが途切れていて申し訳ありません。ポイントに関しては計算ができるようになりました。うまくいっていないところは、
1)1度選んだ質問は2度と選ばないようにできない(1度選ばれた質問が再度登場してしまう)
2)10の質問から5つピックアップするのができない
以上です。上記のソースを使わなくともできる方法がありましたら、重ねてお教え願えたらと思います。
よろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# 未解決の外部シンボル _printfが関数_mainで参照されました 1 2022/09/18 15:28
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# C言語でif文が予想と違う動きをする件について7 4 2023/03/20 00:26
- C言語・C++・C# プログラムの時、フローチャートはどうなりますか?図でお願いします。 int main(void) { 1 2022/10/01 22:45
- C言語・C++・C# プログラミングのペーパーテスト 実行結果がどのように表示されるか答えよ #include <stdi 1 2022/07/09 14:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「指定されたキャストは有効で...
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語での引数の省略方法
-
複数桁10進数の*桁目だけを抽出...
-
(マルチスレッド)_beginthrea...
-
ラップ関数とはどんなものですか?
-
実数の整数部,小数部の取得
-
c言語の配列を使ってサイコロを...
-
C言語 エラーの原因がわからな...
-
「{ } で囲むだけ」は正しい?
-
C言語への変換について
-
リストビューに隠しパラメータ
-
数字列を3桁ごとにカンマで区切...
-
read関数をノンブロッキングで...
-
C言語で、一桁の整数4つを、四...
-
VC++の配列で
-
【C++】関数ポインタの使い方
-
4けたの数字で15になる組み合わせ
-
atoi関数の自作
-
Win32APIで作るコンボボックス...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
複数桁10進数の*桁目だけを抽出...
-
C言語 エラーの原因がわからな...
-
#define _CRT_SECURE_NO_WARNIN...
-
最早開始時間と最遅完了時刻を...
-
【C++】関数ポインタの使い方
-
ラップ関数とはどんなものですか?
-
(int *)の意味
-
実数の整数部,小数部の取得
-
「{ } で囲むだけ」は正しい?
-
if と配列の組み合わせ
-
ColorをRGBで指定する方法
-
acceptをalarmでタイムアウトさ...
-
systemの戻り値を取得する方法
-
足して100になるような乱数のア...
-
PowerShellがうまくいかない
-
構造体の勉強中です 合計点の高...
-
std::set<int> で、ある値が何...
-
C言語の配列をC++のvectorに高...
おすすめ情報