学校の課題

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アキ

学校の課題

#1

投稿記事 by アキ » 6年前

学校の課題について、どうしてもやり方が分からないので質問させて頂きます。
かなり初歩的な質問になってしまうと思いますが、よろしくお願い致します。
ある程度自由に作ることが許されている課題なのですが、
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かで変わります。

box
記事: 1737
登録日時: 8年前

Re: 学校の課題

#2

投稿記事 by box » 6年前

アキ さんが書きました: まず始めの質問があり、その後はifとelseを使って分岐させていこうと思ったのですが、
上手くいきません。
その、うまくいっていないソースコードを載せてください。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アキ

Re: 学校の課題

#3

投稿記事 by アキ » 6年前

すみません、遅くなりました。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;
}

non
記事: 1097
登録日時: 8年前

Re: 学校の課題

#4

投稿記事 by non » 6年前

アキ さんが書きました: 仕様としては質問は各ルート5問ずつ、結果と問題数は32ずつの予定です。
問題数はなぜ、32問ですか?
配列は使っていいのですか?
non

アキ

Re: 学校の課題

#5

投稿記事 by アキ » 6年前

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

non
記事: 1097
登録日時: 8年前

Re: 学校の課題

#6

投稿記事 by non » 6年前

問題数は1+2+4+8+16=31ではないかと。

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

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

長峰
記事: 32
登録日時: 6年前

Re: 学校の課題

#7

投稿記事 by 長峰 » 6年前

学校の課題であるなら、習っているものを活用してコードを作成すべきです。

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

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

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

分岐の管理は変数(初期値0)にyesなら1、noなら0を足していき
次の質問で足す前に2倍していけば、質問の方の分岐と合わせ易いです。
最後に編集したユーザー 長峰 on 2013年5月31日(金) 16:37 [ 編集 1 回目 ]

アバター
usao
記事: 1546
登録日時: 6年前

Re: 学校の課題

#8

投稿記事 by usao » 6年前

提示されたコードのように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
    {    ....    }  //個人的に,こっちにくる人とは友達になれないかもしれない
}

ISLe
記事: 2645
登録日時: 8年前
連絡を取る:

Re: 学校の課題

#9

投稿記事 by ISLe » 6年前

面倒くさいのを一度体験しておくのは良いことではないでしょうか。

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

閉鎖

“C言語何でも質問掲示板” へ戻る