Как узнать, почему в моей программе бесконечный цикл? - PullRequest
1 голос
/ 10 октября 2019

Кажется, я не могу найти, что не так с моим кодом, я пытаюсь завершить цикл, когда ответы равны 0, но он продолжает бесконечный цикл.

#include <iostream>
int main() {
    using namespace std;
    int x, remainder;
    cout << "please enter a positive integer number: " << endl;
    string tab;
    tab = '\t';
    cin >> x;
    remainder = x % 2;

    do{
        while ( x % 2 != 0)
        {
            cout << x << " is odd" << tab << "Subtract 1" << tab << " Half of " << x - 1 << " is " << x / 2;
            x = (x - 1) / 2;
            cout  << endl;

        }

        while (x % 2 == 0)
        {
            cout << x << " is even" << tab << "Subtract 0" << tab << "Half of  " << x << " is " << x / 2;
            x = x / 2;
            cout << endl;
        }

    }
    while (x >= 0);  
}

1 Ответ

2 голосов
/ 10 октября 2019

По сути, в вашем коде есть две проблемы, каждая из которых сама по себе сделает ваш цикл бесконечным.

Начиная снаружи и работая вовнутрь: тест в конце вашего (external) while цикл всегда будет "истинным", так как у вас есть while (x >= 0);таким образом, даже когда x достигнет нуля (как и будет), цикл продолжит работать! (И, если x равен нулю, он останется нулем!)

Во-вторых, два «внутренних» цикла while не должны быть циклами вообще! Вы хотите, чтобы один или другой «блок» выполнялся только один раз для каждого основного цикла - поэтому используйте структуру if ... else.

Ниже приведена исправленная версиявашего кода:

#include <iostream>

int main() {
//  using namespace std; // Generally, not good practice (and frowned-upon here on SO)
    using std::cin;  using std::cout; using std::endl; // Use only those you want to!
    using std::string;
    int x, remainder;
    cout << "please enter a positive integer number: " << endl;
    string tab;
    tab = '\t';
    cin >> x;
    remainder = x % 2;

    do {
        if (x % 2 != 0)
        {
            cout << x << " is odd" << tab << "Subtract 1" << tab << " Half of " << x - 1 << " is " << x / 2;
            x = (x - 1) / 2;
            cout << endl;
        }
        else // if (x % 2 == 0) ... but we don't need to test this again.
        {
            cout << x << " is even" << tab << "Subtract 0" << tab << "Half of  " << x << " is " << x / 2;
            x = x / 2;
            cout << endl;
        }
    } while (x > 0); // You run forever if you have x >= 0!
    return 0;
}

Есть несколько других вещей, которые можно изменить, чтобы сделать код более "эффективным", но я позволю вам просмотреть MNC (минимально необходимое изменение) до того, какмы начинаем редактирование в сторону BPC (наилучший возможный код)!

РЕДАКТИРОВАТЬ: ОК, из-за «давления со стороны сверстников» из комментариев ?, я добавлю предлагаемый БПЦ сейчас:

#include <iostream>

int main() {
    using std::cin;  using std::cout; using std::endl; // Use only those you want to!
    int x;// , remainder; // "remainder" is never used, so we can scrap it!
    cout << "Please enter a positive integer number: " << endl;
    cin >> x; // Not critical, but I like to put such a cin right after the prompting cout.
    std::string tab{ "\t" }; // Let's initialise more directly!
    do {
        // As there is only one line (now) inside each if/else block, we can leave out the {} ...
        if (x % 2 != 0)
            cout << x << " is odd" << tab << "Subtract 1" << tab << "Half of " << x - 1 << " is " << x / 2;
        else
            cout << x << " is even" << tab << "Subtract 0" << tab << "Half of  " << x << " is " << x / 2;
        // We can put the following two line outside the tests, as they will be the same in both cases:
        x = x / 2; // When x is ODD, this will give the SAME answer as x = (x - 1)/2 (as you noticed in your first cout)
        cout << endl;
    } while (x > 0); // You run forever if you have x >= 0!
    return 0;
}
...