2017-10-30 8 views
1

私はユーザーが1-5の質問を解決しなければならないクイズタイプの数学ゲームを開発しようとしています。私はクイズの最後にすべての正解と誤答を表示するカウンタを追加したいと思いますが、これまではelse文を使用していましたが、もっと効率的なやり方があるはずです。私のコード:Cを使ってクイズゲームのカウンターを作成するより効率的な方法はありますか?

if (questions == 2) 
    { 
     printf (" What is 2 + 2\n"); 
     scanf("%d",&A1); 
      if(A1 == 4)  
      { 
        correct ++; 
       } 
       else 
       { 
        incorrect ++; 
      } 

     printf (" What is 5 + 2\n"); 
     scanf("%d",&A2); 
      if(A2 == 7)  
      { 
       correct ++; 
      } 
      else 
      { 
       incorrect ++; 
      } 

    } 

ここにコードは私が同じオプションを5回書くことができますユーザーが選ぶことができます。すべての助力は、前もって感謝しています!

+1

ただ1つのカウンタを使用しますか? 「正しい」ものが「間違っている」ものでなければ、私は2つのカウンターの必要性を見ません。 –

+0

スイッチ(質問) { ケース1: ... 休憩; ケース2: ... 休憩; ケース3: ... 休憩; ケース4: ... 休憩; ケース5: ... 休憩; デフォルト: /*入力は1 ... 5 */ exit(1)にする必要があります。 } – alinsoar

+0

ユーザーがプレイしたすべてのラウンドの正解と誤答の数を表示したいので、2つのカウンターを使用しています –

答えて

1

switch文はあなたのif (questions == 0...5)と同じように使用することができる(何度も同じ質問を書き換えないようにするために、我々は使用することができますスイッチ文が次のケースに自然にオーバーランして、必要な質問の数に応じてカスケードします。

最後に、他のいくつかの指摘があるように、正しいか正しくない答えを追跡するために変数を分ける必要はありません;正解を正確に追跡し、最後に間違った答えはquestions - correctとなります。 これをすべてまとめると、 E本:

int questions; 
printf("Number of questions?\n"); 
scanf("%d",&questions); 

int correct = 0; 
int answer = 0; 

switch(questions) { 
    case 5: 
     printf("What is 2 + 2?\n"); 
     scanf("%d",&answer); 
     if(answer == 4)  
     { 
      correct++; 
     } 
     //note - no break at end of each case 
    case 4: 
     //ask another question 
    case 3: 
     //ask another question 
    case 2: 
     //ask another question 
    case 1: 
     //ask another question 
    default: 
     break; 
} 
printf("Results:\nCorrect = %d\nIncorrect = %d", correct, questions - correct); 
+0

これは本当に助けてくれてありがとう!その大学のassingment私はやっていると私は私たちがスイッチの文とiveを学ぶしようとしていたときに私はそれらを使用する方法の周り本当に私の頭を得るcouldntを逃した。しかし、それについてのちょうど1つの質問は、それぞれの場合は、可変 "質問"のためのユーザーによって設定された値ですか? –

+0

複数の 'if()else if()'のようなスイッチを考えてください。基本的には、「質問が5の場合は最初のケースの後に、それ以外の場合は4、それ以外の場合は2番目のケースなど」と表示されます。通常は、各ケースの終わりに折れ、スイッチは他のケースを実行しません。しかし、私たちのケースを壊さないので、ケース5の後のもの、ケース4のもの、ケース3のもの、などがあります。 –

+0

実際には、すべての 'case'の終わりに' break; 'がおすすめ。 [Duffのデバイス](https://en.wikipedia.org/wiki/Duff%27s_device)は例外的なトリックです。 –

3

質問の合計を使用して、正しい回答を減算して、誤った回答の数を取得することができます。ここではサンプルです:あなたは、複数の値に対して一つの変数をチェックする必要がある場合

#include <stdio.h> 
#include <stdlib.h> 
int main() 
{ 
    char arQuestions[5][20] = { "2 + 2 =", 
           "2 * 2 =", 
           "2 - 2 =", 
           "2/2 =", 
           "2^2 ="}; 
    int answers[5] = {4,4,0,1,4}; 
    int i = 0; 
    int answer = 0; 
    int correct = 0; 

    for(;i<5;++i) 
    { 
     printf("%s ", arQuestions[i]); 
     if(1 == scanf("%d", &answer)) 
     if(answer == answers[i]) 
      correct++; 
     printf("correct<%d> incorrect<%d>\n", correct, (i+1)-correct); 
    } 
    return(0); 
} 
1

もう少し効率的であるかもしれない別のオプションは、あなたがcorrectincorrectグローバル変数を作るか、またはそれらへのポインタを作成し、入力された答えをかどうかを確認するために別の関数を作成することができますがあります正しく、それに応じてcorrectまたはincorrectを更新:

// initiate global variable's 
int correct = 0, incorrect = 0; 

void checkanswer(int var1, int var2, int useranswer) 
{ 
    if(useranswer == var1 + var2) 
     correct++; 
    else 
     incorrect++; 
} 

int main(void) 
{ 
... 
    printf (" What is 2 + 2\n"); 
    scanf("%d", &A1); 
    checkanswer(2, 2, A1); 
//next question 
} 

この方法では、代わりに自分自身を繰り返すの、あなたが書いた関数を使用します。

いくつか他のもの:

  • scanfに代わるものを探してみてください、それはあなたのコードのvurnableを作る危険な機能です。 thisを参照してください。または、このトピックにオンラインでたくさんの質問があるので、さらに回答を検索してください。
  • 私は数学のゲームも書いています。私のゲームではスコア10を取得する必要があり、質問は任意のゲームでランダムです。興味があればhereを参照してください。

私は助けました! ご質問やその他のご質問がある場合は、私のゲームについてお気軽にお問い合わせください:)

+0

フォーマット文字列が常に "%d"であると仮定して、printfとscanfの呼び出しを関数にマージすることもできます。また、scanfは正しく使用すると完全に安全です。これは、引数リスト内の値を正常に割り当てた変数の数を返すので、無効な入力を簡単に検出して適切に応答することができます。また、fgets/sscanfやfgets/strtoulには独自の問題があります。安全なコードを書くことは、邪悪な機能のリストを避けるだけの問題ではありません。これらのアプローチの3つはすべて、時には最適な選択肢であり、別の時には悪い考えです。 – Ray

+0

あなたの入力に感謝、 私はまだ学習している:) –

1

ここでは実際に方程式を計算し、ユーザーの回答と照合するより一般的なバージョンです。

#include <stdio.h> 

typedef enum 
{ 
    ADD, 
    SUB, 
    MUL, 
    DIV, 
} operation_t; 

typedef struct 
{ 
    int op1; 
    int op2; 
    operation_t op; 
} equation_t; 

char operation_to_char (operation_t op) 
{ 
    const char CH_OP[] = {'+', '-', '*', '/'}; 
    return CH_OP[op]; 
} 

int solve (const equation_t* eq) 
{ 
    switch(eq->op) 
    { 
    case ADD: return eq->op1 + eq->op2; 
    case SUB: return eq->op1 - eq->op2; 
    case MUL: return eq->op1 * eq->op2; 
    case DIV: return eq->op1/eq->op2; 
    } 
    return 0; // to silence compiler warning, should never happen 
} 

int main (void) 
{ 
    const equation_t EQUATIONS[] = 
    { 
    {1, 1, ADD}, 
    {2, 2, ADD}, 
    {1, 1, SUB}, 
    {2, 2, MUL}, 
    {9, 3, DIV}, 
    }; 
    const size_t EQUATIONS_N = sizeof(EQUATIONS)/sizeof(*EQUATIONS); 

    for(size_t i=0; i<EQUATIONS_N; i++) 
    { 
    printf("What is %d %c %d? ", 
      EQUATIONS[i].op1, 
      operation_to_char(EQUATIONS[i].op), 
      EQUATIONS[i].op2); 

    int answer; 
    scanf("%d", &answer); 
    getchar(); // discard line feed 

    int solution = solve(&EQUATIONS[i]); 
    if(answer == solution) 
    { 
     puts("Correct"); 
    } 
    else 
    { 
     printf("Incorrect, the solution is %d\n", solution); 
    } 
    } 
} 

このコードには、ユーザー入力のエラー処理はありません。

関連する問題