您好,更新值后,我的 while 循环不会响应其设置的条件。代码一直持续到最后 [已关闭]

Hello, my while loops aren't responding to their set conditions once the value is updated. the code just keeps going until it reaches the end [closed]

提问人:00' 提问时间:10/9/2020 最后编辑:Alan Birtles00' 更新时间:10/9/2020 访问量:56

问:


编辑问题以包括所需的行为、特定问题或错误以及重现问题所需的最短代码。这将有助于其他人回答这个问题。

3年前关闭。

代码链接:https://onlinegdb.com/B1DsFDa8D

您好,更新值后,我的 while 循环不会响应其设置的条件。代码一直持续到最后。如果你运行代码,你会看到我在说什么(事实上,你有必要这样做)。当参数的值更新时,该值会相加并更改。当我在代码末尾打印出它的值时,它实际上确实注册为在整个循环中应该分配给它的数字,但循环在应该停止时没有任何作用。基本上我的问题可能是一个无限循环。唯一与之相反的是循环末尾的“return 0;”。

我的教授给出了具体的指示:创建一个刽子手游戏。该游戏通常涉及一名玩家猜测一个秘密单词的字母。错误的猜测会导致刽子手的图片一次画一段。一旦有 7 个错误的猜测,刽子手的图片就画好了,猜的玩家输掉了游戏。在您的游戏中,16 道多项选择题中的任何一道的 7 个错误答案都会导致游戏失败。 程序 1 将 16 个问题写入名为“infile.txt”的文件 程序 2 读取“infile.txt”并使用刽子手游戏的问题

使用名为“is_hung”的布尔值返回函数。此函数采用名为“num_errors”的整数参数。此参数使用“if-else”语句进行测试,以根据错误答案的数量确定要向屏幕显示多少刽子手。

整个刽子手可以通过下面的代码段显示:

{
cout << "\t \t \t" << " O " << endl;
cout << "\t \t \t" << "/|\\" << endl;
cout << "\t \t \t" << " | " << endl;
cout << "\t \t \t" << "/ \\" << endl;
cout << " YOU ARE HUNG" endl;
return false; 
}

1 个错误答案显示头部

2 个错误答案显示左臂

3 个错误答案显示右臂

4 个错误答案显示上半身

5 个错误答案显示下半身

6 个错误答案显示左腿

7 个错误答案显示右腿

我的代码:

#include <stdio.h>
#include <iostream>
#include <string>
#include <fstream>

using namespace std;

bool is_hung(int, bool);

int main()
{
    string question1;
    string answer1;
    string answer2;
    string answer3;
    string answer4;
    string question2;
    string answer5;
    string answer6;
    string answer7;
    string answer8;
    string question3;
    string answer9;
    string answer10;
    string answer11;
    string answer12;
    string question4;
    string answer13;
    string answer14;
    string answer15;
    string answer16;
    string question5;
    string answer17;
    string answer18;
    string answer19;
    string answer20;
    string question6;
    string answer21;
    string answer22;
    string answer23;
    string answer24;
    string question7;
    string answer25;
    string answer26;
    string answer27;
    string answer28;
    string question8;
    string answer29;
    string answer30;
    string answer31;
    string answer32;

    ifstream reader;

    reader.open("infile.txt");

    int num_right = 0;
    int num_error = 0;
    bool power = true;
    cout << power << endl;
    string user_answer1 = "";
    string user_answer2 = "";
    string user_answer3 = "";
    string user_answer4 = "";
    string user_answer5 = "";
    string user_answer6 = "";
    string user_answer7 = "";
    string user_answer8 = "";

    while (power == true) {
        while (num_error < 7) //should stop the while loop when number of incorrect answers are equal to 7
        {
            //1
            getline(reader, question1); //get line from infile.txt
            getline(reader, answer1);
            getline(reader, answer2);
            getline(reader, answer3);
            getline(reader, answer4);
            cout << question1 << endl; //print out line from file
            cout << answer1 << endl;
            cout << answer2 << endl;
            cout << answer3 << endl;
            cout << answer4 << endl;
            cout << "Enter Answer: ";
            cin >> user_answer1; //have the user input answer
            if (user_answer1 == "B") //if statement to determine correct answer
            {
                cout << "correct" << endl;
                num_right++; //adds 1 to num_right
                cout << "" << endl;
            }
            else //if user_answer is not equal answer/wrong answer
            {
                cout << "incorrect" << endl;
                num_error++; //add 1 to num_error
                power = is_hung(num_error, power); //get function
            }
            //2
            getline(reader, question2);
            getline(reader, answer5);
            getline(reader, answer6);
            getline(reader, answer7);
            getline(reader, answer8);
            cout << question2 << endl;
            cout << answer5 << endl;
            cout << answer6 << endl;
            cout << answer7 << endl;
            cout << answer8 << endl;
            cout << "Enter Answer: ";
            cin >> user_answer2;
            if (user_answer2 == "B") {
                cout << "correct" << endl;
                num_right++;
                cout << "" << endl;
            }
            else {
                cout << "incorrect" << endl;
                num_error++;
                power = is_hung(num_error, power);
            }
            //3
            getline(reader, question3);
            getline(reader, answer9);
            getline(reader, answer10);
            getline(reader, answer11);
            getline(reader, answer12);
            cout << question3 << endl;
            cout << answer9 << endl;
            cout << answer10 << endl;
            cout << answer11 << endl;
            cout << answer12 << endl;
            cout << "Enter Answer: ";
            cin >> user_answer3;
            if (user_answer3 == "C") {
                cout << "correct" << endl;
                num_right++;
                cout << "" << endl;
            }
            else {
                cout << "incorrect" << endl;
                num_error++;
                power = is_hung(num_error, power);
            }
            //4
            getline(reader, question4);
            getline(reader, answer13);
            getline(reader, answer14);
            getline(reader, answer15);
            getline(reader, answer16);
            cout << question4 << endl;
            cout << answer13 << endl;
            cout << answer14 << endl;
            cout << answer15 << endl;
            cout << answer16 << endl;
            cout << "Enter Answer: ";
            cin >> user_answer4;
            if (user_answer4 == "D") {
                cout << "correct" << endl;
                num_right++;
                cout << "" << endl;
            }
            else {
                cout << "incorrect" << endl;
                num_error++;
                power = is_hung(num_error, power);
            }
            //5
            getline(reader, question5);
            getline(reader, answer17);
            getline(reader, answer18);
            getline(reader, answer19);
            getline(reader, answer20);
            cout << question5 << endl;
            cout << answer17 << endl;
            cout << answer18 << endl;
            cout << answer19 << endl;
            cout << answer20 << endl;
            cout << "Enter Answer: ";
            cin >> user_answer5;
            if (user_answer5 == "A") {
                cout << "correct" << endl;
                num_right++;
                cout << "" << endl;
            }
            else {
                cout << "incorrect" << endl;
                num_error++;
                power = is_hung(num_error, power);
            }
            //6
            getline(reader, question6);
            getline(reader, answer21);
            getline(reader, answer22);
            getline(reader, answer23);
            getline(reader, answer24);
            cout << question6 << endl;
            cout << answer21 << endl;
            cout << answer22 << endl;
            cout << answer23 << endl;
            cout << answer24 << endl;
            cout << "Enter Answer: ";
            cin >> user_answer6;
            if (user_answer6 == "D") {
                cout << "correct" << endl;
                num_right++;
                cout << "" << endl;
            }
            else {
                cout << "incorrect" << endl;
                num_error++;
                power = is_hung(num_error, power);
            }
            //7
            getline(reader, question7);
            getline(reader, answer25);
            getline(reader, answer26);
            getline(reader, answer27);
            getline(reader, answer28);
            cout << question7 << endl;
            cout << answer25 << endl;
            cout << answer26 << endl;
            cout << answer27 << endl;
            cout << answer28 << endl;
            cout << "Enter Answer: ";
            cin >> user_answer7;
            if (user_answer7 == "A") {
                cout << "correct" << endl;
                num_right++;
                cout << "" << endl;
            }
            else {
                cout << "incorrect" << endl;
                num_error++;
                power = is_hung(num_error, power);
            }
            cout << power << endl;
            //8
            getline(reader, question8);
            getline(reader, answer29);
            getline(reader, answer30);
            getline(reader, answer31);
            getline(reader, answer32);
            cout << question8 << endl;
            cout << answer29 << endl;
            cout << answer30 << endl;
            cout << answer31 << endl;
            cout << answer32 << endl;
            cout << "Enter Answer: ";
            cin >> user_answer8;
            if (user_answer8 == "D") {
                cout << "correct" << endl;
                num_right++;
                cout << "" << endl;
            }
            else {
                cout << "incorrect" << endl;
                num_error++;
                power = is_hung(num_error, power);
            }
            cout << "" << endl;
            if (num_error > 7) {
                cout << "You got " << num_right << " out of 8. You lose." << endl;
            }
            else if (num_error < 7) {
                cout << "You got " << num_right << " out of 8. You Win." << endl;
            }
            reader.close();
            return 0;
        }
    }
    reader.close();
    cout << "" << endl;
    if (num_error > 7) {
        cout << "You got " << num_right << " out of 16. You lose." << endl;
    }
    else if (num_error < 7) {
        cout << "You got " << num_right << " out of 16. You Win." << endl;
    }
    return 0;
}

bool is_hung(int num_errors2, bool power2)
{
    if (num_errors2 == 1) {
        cout << "\t \t \t"
             << " O " << endl;
        cout << "" << endl;
        power2 = true;
        return power2;
    }
    else if (num_errors2 == 2) {
        cout << "\t \t \t"
             << " O " << endl;
        cout << "\t \t \t"
             << "/" << endl;
        cout << "" << endl;
        power2 = true;
        return power2;
    }
    else if (num_errors2 == 3) {
        cout << "\t \t \t"
             << " O " << endl;
        cout << "\t \t \t"
             << "/ \\" << endl;
        cout << "" << endl;
        power2 = true;
        return power2;
    }
    else if (num_errors2 == 4) {
        cout << "\t \t \t"
             << " O " << endl;
        cout << "\t \t \t"
             << "/|\\" << endl;
        cout << "" << endl;
        power2 = true;
        return power2;
    }
    else if (num_errors2 == 5) {
        cout << "\t \t \t"
             << " O " << endl;
        cout << "\t \t \t"
             << "/|\\" << endl;
        cout << "\t \t \t"
             << " | " << endl;
        cout << "" << endl;
        power2 = true;
        return power2;
    }
    else if (num_errors2 == 6) {
        cout << "\t \t \t"
             << " O " << endl;
        cout << "\t \t \t"
             << "/|\\" << endl;
        cout << "\t \t \t"
             << " | " << endl;
        cout << "\t \t \t"
             << "/ " << endl;
        cout << "" << endl;
        power2 = true;
        return power2;
    }
    else if (num_errors2 == 7) {
        cout << "\t \t \t"
             << " O " << endl;
        cout << "\t \t \t"
             << "/|\\" << endl;
        cout << "\t \t \t"
             << " | " << endl;
        cout << "\t \t \t"
             << "/ \\" << endl;
        cout << " YOU ARE HUNG" << endl;
        cout << "" << endl;
        power2 = false;
        return power2;
    }
}
C++ 函数 while-loop fstream iostream

评论

2赞 Lukas-T 10/9/2020
哇,这是一大块旧代码。你能把它修剪成一个最小的可重复的例子吗?似乎这段代码做了 16 次完全相同的事情。使用字符串向量和循环而不是手动枚举所有变量将大大改进代码。
0赞 Remy Lebeau 10/9/2020
@churill数组会比向量更好
0赞 Remy Lebeau 10/9/2020
顺便说一句,没有充分的理由将变量传递给函数,因为它从未被使用过。poweris_hung()
0赞 william_ 10/9/2020
你应该减少你的代码,有很多重复 -->使用一个循环,你应该使用你的调试器并遍历循环,等到 num 错误达到 7 并查看会发生什么
0赞 Lukas-T 10/9/2020
@RemyLebeau 是的,我想我明白你的意思,确实数组似乎更适合这里。可能类似于 Then 循环 16 次并重用变量。std::string question; std::array<std::string, 6> answers; std::string userAnswer;

答:

1赞 Remy Lebeau 10/9/2020 #1

有大量浪费、重复的代码,这使得阅读和调试变得极其困难,并大大增加了犯错的风险。

通过使用更少的变量、更好的循环和一点算术,可以大大减少此代码,例如:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

bool is_hung(int);

int main()
{
    string question;
    string answer;
    string user_answer;

    const string correct_answers = “BBCDADADBDABCABB”;

    int num_right = 0;
    int num_error = 0;

    ifstream reader("infile.txt");

    for(int i = 0; i < 16; ++i)
    {
        getline(reader, question); // get line from infile.txt
        cout << question << endl; // print out line from file
        for (int j = 0; j < 4; ++j)
        {
            getline(reader, answer);
            cout << answer << endl;
        }
        cout << "Enter Answer: ";
        cin >> user_answer; // have the user input answer
        if (user_answer == correct_answers[i]) // if statement to determine correct answer
        {
            cout << "correct" << endl;
            num_right++; // adds 1 to num_right
            cout << endl;
        }
        else // if user_answer is not equal answer/wrong answer
        {
            cout << "incorrect" << endl;
            num_error++; // add 1 to num_error
            if (is_hung(num_error)) // get function
                break;
        }
    }

    reader.close();
    cout << endl;

    if (num_error == 7)
    {
        cout << "You got " << num_right << " out of 16. You lose." << endl;
    }
    else
    {
        cout << "You got " << num_right << " out of 16. You Win." << endl;
    }

    return 0;
}

bool is_hung(int num_errors)
{
    cout << "\t \t \t" << " O ";

    if (num_errors >= 2)
    {
        cout << endl;
        cout << "\t \t \t" << "/";
    }
    if (num_errors >= 3)
    {
        cout << (num_errors >= 4 ? ‘|’ : ‘ ‘) << “\\”;
    }
    if (num_errors >= 5)
    {
        cout << endl;
        cout << "\t \t \t" << " | ";
    }
    if (num_errors >= 6)
    {
        cout << endl;
        cout << "\t \t \t" << "/";
    }
    if (num_errors >= 7)
    {
        cout << " \\" << endl;
        cout << " YOU ARE HUNG";
    }

    cout << endl;
    return (num_errors < 7);
}

你不觉得这更容易合作吗?