1

質問と回答に 1 の 2 つの異なる配列を使用しようとしていますが、「2」を超える選択した質問のいずれかに対して正しい回答を選択すると、常に間違った回答が返され、なぜ誰かが私を抱きしめることができるのかわかりません。

#include "Questions.h"

using namespace std;


//struct quiz
//{
//    string question[MAXITEMS];
//  string answers[MAXITEMS];
//};


const int MAXITEMS = 10;

int main ()
{
//quiz listQuiz[MAXITEMS];
//
//ifstream QuestionFile("Questions2.txt");
//char a;
//int count = 0;
//
//  if(!QuestionFile) // file testing
//  {
//    cout<< " error opening file" << endl;
//    return 1;
//  }
//
//  for (int i=0; i<MAXITEMS; i++)
//  {
//      QuestionFile>>listQuiz[i].

  //return 0;

    string question[MAXITEMS] = {"How_many_cards_of_each_suit_are_there?", "How_many_suits_are_there_in_a_standard_pack_of_cards?", "How_many_kings_are_in_a_standard_pack_of_cards?", "How_many_cards_are_in_a_standard_deck_of_cards?","How_many_black_suits_are_there_in_a_standard_pack_of_cards?", "How_many_red_suits_are_in_a_standard_pack_of_cards?", "Whats_the_number_of_the_card_that_comes_before_jack?", "How_many_cards_in_each_set_of_suits_are_there?", "What_is_the_lowest_number_in_a_standard_pack_of_cards?", "What_is_the_highest_number_in_a_standard_pack_of_cards?"};
    string answers[MAXITEMS] = {"4", "4", "4", "52", "2", "2", "10", "13", "2", "10"};

    int userInput = 0;
    int tries = 0;


    bool isGameOver = false;

    cout << "select 1 to start game" << endl;  //gives option to start and quit game
    cout << "select 2 to quit game" << endl;
    cin >> userInput;

    if (userInput == 2)
    {
        isGameOver = true;
        return 0;   
    };
    // error message if 1 or 2 is not input
    do
    {
        if (userInput!=1 && userInput!=2)
        {
            cout << " Your input is not valid! please try again:" << endl; // try switch cases for the different outcomes

            cout << "select 1 to start game" << endl;  
            cout << "select 2 to quit game" << endl;
            cin >> userInput;

            if (userInput == 2)
    {
        isGameOver = true;
        return 0;   
    };
            while (!(cin >> userInput))
            {
                cin.clear(); // clear the error flags
                cin.ignore(INT_MAX, '\n'); // discard the row

                cout << "Your input is not valid! please try again: ";

                cout << "select 1 to start game" << endl;  
                cout << "select 2 to quit game" << endl;
            }
            cout << userInput << endl;


        }
        // reprisent all characters as number to stop while roblem
        // when game starts gives option to select question and shows all questions
        if(userInput == 1)
        {

 //      // system("pause");
    //  //return-1;
 //// };

 // while(QuestionFile)      // while read is working
 // {
    //
    //      // for display

    //QuestionFile >> question[count];    // read into array
    //cout << count << " " << question << endl;
    // count++;

 // }
 // 
 // for (int i = 0; i < count ; ++i)
 // {cout << " array" << i << " is ::";
 // cout << question[i]<< endl;
 // }

 // cout << question[0]; //reads data in cell


 // //QuestionFile.close();

 // //system ("pause");
            do
            {
                cout << "select question" << endl;

                for(int i = 0; i != MAXITEMS; i++)
                {
                    cout << i << " " << question[i] << endl;
                }

                int selectQestion;
                cin >> selectQestion;

                if(selectQestion == 0||1||2||3||4||5||6||7||8||9  && tries != 2)
                {
                    cout << "Enter your answer" << endl;
                    string userAnswer;

                    cin >> userAnswer;

                    while (!(cin >> userAnswer))
                    {
                        cin.clear(); // clear the error flags
                        cin.ignore(INT_MAX, '\n'); // discard the row
                        cout << "Your input is not valid! please try again: ";
                    }

                    if (userAnswer == answers[0])
                    {
                        cout << "Correct answer" << endl;
                    }
                    else{

                        cout << "incorrect try again" << endl;
                        tries++;

                        cin >> userAnswer;
                        if (userAnswer == answers[0])
                        {
                            cout << "Correct answer" << endl;
                        }
                        else 
                            cout << "Incorrect" << endl;

                    }
                }
                if (selectQestion == 0||1||2||3||4||5||6||7||8||9  && tries == 2)
                {
                    cout << "you can no longer answer this question" << endl;
                    cout << "try another question" << endl;
                }

            }
            while(userInput == 1);

        }


    }
    while(isGameOver == false);

}
4

3 に答える 3

4

私たちは以前にこれを経験したと確信しています

if (selectQestion == 0||1||2||3||4||5||6||7||8||9  && tries == 2)

間違っています。このバージョンは正しいです。

if ((selectQestion == 0 || selectQestion == 1 || selectQestion == 2 || selectQestion == 3 || selectQestion == 4 || selectQestion == 5 || selectQestion == 6|| selectQestion == 7|| selectQestion == 8 || selectQestion == 9) && tries == 2)

しかし、実際には少しロジックを使用して単純化する必要があります。このバージョンはさらに優れています。

if (selectQestion >= 0 && selectQestion <= 9 && tries == 2)

ずっといい。

その問題を修正し (少なくとも 2 か所に問題があります)、プログラムがまだ機能しない場合は、再度投稿してください。

于 2013-04-28T21:46:25.867 に答える
0

これは意味がありません:

string question[MAXITEMS] = {"How_many_cards_of_each_suit_are_there?",
"How_many_suits_are_there_in_a_standard_pack_of_cards?",
"How_many_kings_are_in_a_standard_pack_of_cards?", 
"How_many_cards_are_in_a_standard_deck_of_cards?",
"How_many_black_suits_are_there_in_a_standard_pack_of_cards?", 
"How_many_red_suits_are_in_a_standard_pack_of_cards?", 
"Whats_the_number_of_the_card_that_comes_before_jack?", 
"How_many_cards_in_each_set_of_suits_are_there?", 
"What_is_the_lowest_number_in_a_standard_pack_of_cards?", 
"What_is_the_highest_number_in_a_standard_pack_of_cards?"};

string answers[MAXITEMS] = {"4", "4", "4", "52", "2", "2", "10", "13", "2", "10"};

私にとって、答えと質問は同期していません。もちろん、構造体 (またはクラス) の一部として質問と回答がある場合は、これに対処するのがはるかに簡単になります。

struct QuestionAndAnswer
{
   std::string question;
   std::string answer;
}

QuestionAndAnswer qAndA[MAXITEMS] = 
{
   { "Question 1", "Answer for question 1" }, 
   { "Question 2", "Answer for question 2" },
   ...
};

そして、このコードはあなたが思っていることをしません:

 if(selectQestion == 0||1||2||3||4||5||6||7||8||9  && tries != 2)

別の回答で示唆されているように、あなたはすることができますが、ステートメントif (selectOption == 0 || selectOption == 1 ...を使用することをお勧めします:switch

 switch(selectOption)
 {
    case 0:
    case 1:
     ... // more cases go here. 
    case 9:
       if (tries != 2)
        ... 
       else // tries == 2
        ... 
       break;
    default:
      ... Stuff to do when input was not a valid selection. 

      break;
  }

11 項目の長さの if 条件よりも、switch の方がはるかに読みやすいです。

さらなる問題はこれです:

do {
 ... 
} while(userInput == 1);

変数userInputはそのループ内で変化していません...

ここにもバグがあります:

 if (userAnswer == answers[0])

回答が最初の質問ではなく、選択した質問に対する回答であることを確認したい場合があります。

一度にコードの小さな部分を開発することをお勧めします。小さなことを 1 つ変更してテストし、機能しない場合は理由を突き止めてから、もう少しコードを記述してください。私はあなたのコードをコンパイルしたり実行したりさえしていませんが、少なくとも 4 つの明確なエラーを発見しました - はい、私は 30 年以上プログラミングを行ってきたので、エラーを発見した経験があります。

于 2013-04-28T21:48:18.060 に答える
-1

これ:

if (selectQestion == 0||1||2||3||4||5||6||7||8||9 ...)

次と同等です。

if (selectQuestion == 1 ...)

== 記号の右側は、C++ が値を計算し、長い一連の || の代わりにその値を代入する式です。

于 2013-04-28T21:51:30.377 に答える