c言語のクイズを作っているのですが...

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

c言語のクイズを作っているのですが...

#1

投稿記事 by まゆ » 16年前

c言語のクイズを作っているのですが、

do{
printf("番号を入力 >"); scanf("%d",&n);
if( 3!=n ) printf("ハズレ\n");
} while( 3!=n );
printf("当たり☆\n\n");

上のようにdo~while文を使って作っているのですが、
正解数をカウントする方法がわかりません

すみません教えてください
お願いします

ざこ

Re:c言語のクイズを作っているのですが...

#2

投稿記事 by ざこ » 16年前

int countでも作って
正解の度にcount++;で
1ずつ増やしてやればいいのでは

Dixq (管理人)

Re:c言語のクイズを作っているのですが...

#3

投稿記事 by Dixq (管理人) » 16年前

普通に正解した時に数をカウントしてみたらいいですよ^^
ちとサンプル作ってみました。
#include <stdio.h>

typedef struct{
	char Quest[128];
	char Ans[3][128];
	int AnsNum;
}Question_t;

Question_t Question[4]={
	{
		{"ここのHPの名前は何ですか?"},
		{{"C言語何でも丸投げサイト"},{"C言語何でも回答サイト"},{"C言語何でも質問サイト"}},
		3,
	},
	{
		{"3つある館のうち最も後に出来た館は何ですか?"},
		{{"ゲームプログラミングの館"},{"サンプルプログラミングの館"},{"龍神録プログラミングの館"}},
		2,
	},
	{
		{"管理人の昨日の晩飯は何だったでしょうか?"},
		{{"特上寿司"},{"松坂牛サーロインステーキ"},{"鯖の缶詰"}},
		3,
	},
};

int main(void){

	int i,j;
	int AnsNum;
	int CorrectAnsNum=0;

	printf("以下の問題に対する答えを1~3の数字を入力する事によって回答して下さい。\n\n");

	for(i=0; i<3; i++){
		printf("Q.%d: %s\n",i+1,Question.Quest);
		for(j=0; j<3; j++){
			printf("(%d):%s, ",j+1,Question.Ans[j]);	
		}
		printf("\n");
		scanf("%d",&AnsNum);
		if(AnsNum == Question.AnsNum){
			printf("正解です!\n\n");
			CorrectAnsNum++;
		}
		else{
			printf("ブー\n\n");
		}
	}
	printf("\n\n");
	printf("正解数は%d個でした!\n",CorrectAnsNum);

	return 0;
}

実行結果例

以下の問題に対する答えを1~3の数字を入力する事によって回答して下さい。

Q.1: ここのHPの名前は何ですか?
(1):C言語何でも丸投げサイト, (2):C言語何でも回答サイト, (3):C言語何でも質問サイト,
1
ブー

Q.2: 3つある館のうち最も後に出来た館は何ですか?
(1):ゲームプログラミングの館, (2):サンプルプログラミングの館, (3):龍神録プログラミングの館,
2
正解です!

Q.3: 管理人の昨日の晩飯は何だったでしょうか?
(1):特上寿司, (2):松坂牛サーロインステーキ, (3):鯖の缶詰,
1
ブー


正解数は1個でした!
 

色々と書きましたが、結局やってる事は

・問題文表示
・回答番号受け取り
・正解かどうかの判断と正解数の加算

だけです。構造体についてもしご存じなかったらいまいちわからないプログラムだったかもしれません。
何か解らない点があれば言って下さい^^

TOMONORI

Re:c言語のクイズを作っているのですが...

#4

投稿記事 by TOMONORI » 16年前

正解数を数えるということは何種類か問題があって、何問中何問正解!みたいな感じですよね?
Dixqさんの仰るとおり構造体を使うのがいいです。
とはいえいきなりこんなに充実したプログラムでは畏怖の対象になりかねないので、
もっとレベルの低い人による、レベルの低いサンプルが役に立つかもしれません。

とりあえず構造体を実装すると・・・
#include <stdio.h>

/* 問題構造体 */
struct Quiz
{
	/* 問題文 */
	const char * quest;	/* questを文字列として宣言 */
	/* 答え */
	int correctAns;		/* 答えはint型に限定 */
};

int
main()
{
	int ans;		/* プレーヤーの解答 */
	int correctAnsNum = 0;	/* 正解数のカウンタ */
	struct Quiz q1;		/* 問題構造体"struct Quiz"が型名(intみたいな役割) */
	/* 問題文の設定 */
	q1.quest = "1+3は?";
	/* 答えの設定 */
	q1.correctAns = 4;

	do{
		printf(q1.quest);
		scanf("%d", &ans); 
		if(ans != q1.correctAns)
		{
			printf("ハズレ\n");
		}

		++ correctAnsNum;	/* 毎回1増やします */
	}while(ans != q1.correctAns); 
	printf("当たり☆\n\n"); 

	return 0;
}
このままだと問題数1で、正解数は必ず1回の変なプログラムになってしまうので改良します。
問題数が1のままだとまずいから、構造体を配列にして・・・
#include <stdio.h>

/* 問題構造体 */
struct Quiz
{
	/* 問題文 */
	const char * quest;	/* questを文字列として宣言 */
	/* 答え */
	int correctAns;		/* 答えはint型に限定 */
};

int
main()
{
	int ans;			/* プレーヤーの解答 */
	int correctAnsNum = 0;		/* 正解数のカウンタ */
	int questNum;			/* 問題番号 */
	struct Quiz q[2];		/* 問題構造体配列*/
	/* 問題の初期化 */
	q[0].quest = "1+3は?";
	q[0].correctAns = 4;
	q[1].quest = "2+1は?";
	q[1].correctAns = 3;

	for(questNum = 0;
		questNum < 2;
		++ questNum)
	{
		printf(q[questNum].quest);
		scanf("%d", &ans);
		if(ans == q[questNum].correctAns)
		{
			++ correctAnsNum;	/* 合ってたら正解数を増やす */
			printf("当たり☆\n");
		}
		else
		{
			printf("どんまいヽ(´ー`)ノ\n");
		}
	}

	printf("正解数:%d / 2", correctAnsNum);
	return 0;
}
とりあえず追加で必要な知識は構造体だけだと思うのですぐに理解できると思います。
それと、今回はdo-whileの活躍場所はあんまりない気がします。
課題で指定されている場合は使うしかないですけどね。

SCI

Re:c言語のクイズを作っているのですが...

#5

投稿記事 by SCI » 16年前

TOMONORIさん、そのコードは翻訳確認・動作確認をしましたか?

SCI

Re:c言語のクイズを作っているのですが...

#6

投稿記事 by SCI » 16年前

と思ったらちゃんと動きますね。私の勘違いでした(笑

TOMONORI

Re:c言語のクイズを作っているのですが...

#7

投稿記事 by TOMONORI » 16年前

>>SCIさん
びっくりさせないでください。自分は小心者なので心臓が止まりましたよ(嘘)。
でもあれですよ、『こりゃ動くけど普通そうは書かないだろー』みたいな箇所があったら
教えてくださるとうれしいです。この板の趣旨とは少しずれてしまうかもしれませんが、
標準的な書き方のほうが参考になると思いますし。

SCI

Re:c言語のクイズを作っているのですが...

#8

投稿記事 by SCI » 16年前

const char * quest;

char * const quest;
を見間違えてしまっただけです(笑)

閉鎖

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