ページ 11

学校の課題

Posted: 2013年5月30日(木) 20:54
by アキ
学校の課題について、どうしてもやり方が分からないので質問させて頂きます。
かなり初歩的な質問になってしまうと思いますが、よろしくお願い致します。
ある程度自由に作ることが許されている課題なのですが、
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: 学校の課題

Posted: 2013年5月30日(木) 21:15
by box
アキ さんが書きました: まず始めの質問があり、その後はifとelseを使って分岐させていこうと思ったのですが、
上手くいきません。
その、うまくいっていないソースコードを載せてください。

Re: 学校の課題

Posted: 2013年5月30日(木) 22:25
by アキ
すみません、遅くなりました。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: 学校の課題

Posted: 2013年5月30日(木) 22:46
by non
アキ さんが書きました: 仕様としては質問は各ルート5問ずつ、結果と問題数は32ずつの予定です。
問題数はなぜ、32問ですか?
配列は使っていいのですか?

Re: 学校の課題

Posted: 2013年5月30日(木) 23:05
by アキ
問題数は、質問を考える際に各ルート5問で計算したら計32問になったので深い意味はありません。
配列は、まだ授業で教わっていないので出来れば使わない方向で考えたいのですが・・・
使った方が良いのでしょうか?
使い方やどういった際に使うかも良く分かっていません。

Re: 学校の課題

Posted: 2013年5月31日(金) 07:19
by non
問題数は1+2+4+8+16=31ではないかと。

すると本当に if else で2つずつに分けていけという課題なのでしょうか。
なんと、面倒なだけで、面白くない課題でしょう。先生の出題した真意がわからない。

if else は習いましたね。最初の問題で if と else にyes と noに分けます。
この分かれた中で、各々再び yes と no に分けると、4通りになります。
この分かれた中を、また、全部 2つにわけてと、繰り返す。
これを5層まで行えば32通りに分かれます。
ひたすら、面倒なだけです。

Re: 学校の課題

Posted: 2013年5月31日(金) 07:37
by 長峰
学校の課題であるなら、習っているものを活用してコードを作成すべきです。

重複するコードが多いので、それらをwhile文でまとめて、
質問文の表示は、while文の中でswitch,caseを使って分岐させるのが単純だと思います。

while文は質問の数だけ(5回分)ループできる様にして、
while文中のswitch文にcaseを総問題数分用意すれば実装できます。

ただしcaseを一括で管理するのは大変なので、
現在何問目かで一度分岐させてから質問のswitch文に繋ぐのが無難です。

分岐の管理は変数(初期値0)にyesなら1、noなら0を足していき
次の質問で足す前に2倍していけば、質問の方の分岐と合わせ易いです。

Re: 学校の課題

Posted: 2013年5月31日(金) 10:29
by usao
提示されたコードのようにifで気合で分岐するような方法を取るんだとすれば…
自分で関数を作ることが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: 学校の課題

Posted: 2013年5月31日(金) 17:56
by ISLe
面倒くさいのを一度体験しておくのは良いことではないでしょうか。

面倒くさい説明を省いて簡単な実装方法だけを教え込まれる授業のほうがつまらないとわたしは思います。