学校の課題について、どうしてもやり方が分からないので質問させて頂きます。
かなり初歩的な質問になってしまうと思いますが、よろしくお願い致します。
ある程度自由に作ることが許されている課題なのですが、
yes、noの二択で答えていく多分岐の心理テストのような物を作りたいと思っています。
仕様としては質問は各ルート5問ずつ、結果と問題数は32ずつの予定です。
まず始めの質問があり、その後はifとelseを使って分岐させていこうと思ったのですが、
上手くいきません。
現在教わって使えるものとしてはplintf、scanf、while、if、switch、rand、forといった所です。
宜しくお願い致します。
分かりにくい説明かと思いますので、改めて以下に簡単な仕様説明をさせて頂きます。
質問1
yes or no
質問2
yes or no
質問3
yes or no
質問4
yes or no
質問5
yes or no
結果
あなたは◯◯タイプです
質問1は共通で、二問目以降がyesかnoかで変わります。
学校の課題
Re: 学校の課題
すみません、遅くなりました。PCから失礼します。
まだ途中で申し訳ないのですが、
まだ途中で申し訳ないのですが、
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
int y,a,b;
printf("あなたにぴったりの職業を診断します。\n5問ほど質問しますので直感で答えて下さい。");
printf("1を押して下さい\n");
scanf("%d",&a);
while(a != 1)
{
printf("入力された数値が間違っています。\n\n");
printf("あなたにぴったりの職業を診断します。\n5問ほど質問しますので直感で答えて下さい。");
printf("1を押して下さい\n");
scanf("%d",&a);
}
if(a == 1)
{
printf("どちらかというと目立ちたい方だ\nYES=1、NO=2\n");
scanf("%d",&a);
}
if(a == 1)
{
printf("武器が好きだ\nYES=1、NO=2\n");
scanf("%d",&a);
}
else
{
printf("サポートが好きだ\nYES=1、NO=2\n");
scanf("%d",&a);
}
if(a == 1)
{
printf("出来れば感謝されたい\nYES=1、NO=2\n");
scanf("%d",&a);
}
else
{
printf("暗いところが好き\n");
scanf("%d",&a);
return 0;
}
Re: 学校の課題
問題数は1+2+4+8+16=31ではないかと。
すると本当に if else で2つずつに分けていけという課題なのでしょうか。
なんと、面倒なだけで、面白くない課題でしょう。先生の出題した真意がわからない。
if else は習いましたね。最初の問題で if と else にyes と noに分けます。
この分かれた中で、各々再び yes と no に分けると、4通りになります。
この分かれた中を、また、全部 2つにわけてと、繰り返す。
これを5層まで行えば32通りに分かれます。
ひたすら、面倒なだけです。
すると本当に if else で2つずつに分けていけという課題なのでしょうか。
なんと、面倒なだけで、面白くない課題でしょう。先生の出題した真意がわからない。
if else は習いましたね。最初の問題で if と else にyes と noに分けます。
この分かれた中で、各々再び yes と no に分けると、4通りになります。
この分かれた中を、また、全部 2つにわけてと、繰り返す。
これを5層まで行えば32通りに分かれます。
ひたすら、面倒なだけです。
non
Re: 学校の課題
学校の課題であるなら、習っているものを活用してコードを作成すべきです。
重複するコードが多いので、それらをwhile文でまとめて、
質問文の表示は、while文の中でswitch,caseを使って分岐させるのが単純だと思います。
while文は質問の数だけ(5回分)ループできる様にして、
while文中のswitch文にcaseを総問題数分用意すれば実装できます。
ただしcaseを一括で管理するのは大変なので、
現在何問目かで一度分岐させてから質問のswitch文に繋ぐのが無難です。
分岐の管理は変数(初期値0)にyesなら1、noなら0を足していき
次の質問で足す前に2倍していけば、質問の方の分岐と合わせ易いです。
重複するコードが多いので、それらをwhile文でまとめて、
質問文の表示は、while文の中でswitch,caseを使って分岐させるのが単純だと思います。
while文は質問の数だけ(5回分)ループできる様にして、
while文中のswitch文にcaseを総問題数分用意すれば実装できます。
ただしcaseを一括で管理するのは大変なので、
現在何問目かで一度分岐させてから質問のswitch文に繋ぐのが無難です。
分岐の管理は変数(初期値0)にyesなら1、noなら0を足していき
次の質問で足す前に2倍していけば、質問の方の分岐と合わせ易いです。
最後に編集したユーザー 長峰 on 2013年5月31日(金) 16:37 [ 編集 1 回目 ]
Re: 学校の課題
提示されたコードのようにifで気合で分岐するような方法を取るんだとすれば…
自分で関数を作ることがOKなら,↓のような関数を作るとかすれば少しだけ楽になるかなぁ?
自分で関数を作ることがOKなら,↓のような関数を作るとかすれば少しだけ楽になるかなぁ?
const int YES = 1;
const int NO = 0;
//質問を表示し,ユーザにY/Nの入力を行わせる関数
//[引数]
// pQuestionString : 質問文文字列の先頭位置
//[戻り値]
// ユーザの入力結果に応じて,YESかNOの値を返す.
int Question( const char *pQuestionString )
{
printf( "%s\nYES=1, NO=それ以外\n", pQuestionString );
int UserInput = 0;
scanf( "%d", &UserInput );
if( UserInput==YES )
{ return YES; }
else
{ return NO; }
}
//main側
int main()
{
if( Question( "ちょっとした猫大好き?" ) == YES ) //毎回scanf()を書く手間くらいは省ける
{ .... } //以降の質問への返答によっては結果は”猫ブリーダー”とかに!
else
{ .... } //個人的に,こっちにくる人とは友達になれないかもしれない
}
Re: 学校の課題
面倒くさいのを一度体験しておくのは良いことではないでしょうか。
面倒くさい説明を省いて簡単な実装方法だけを教え込まれる授業のほうがつまらないとわたしは思います。
面倒くさい説明を省いて簡単な実装方法だけを教え込まれる授業のほうがつまらないとわたしは思います。