Как исправить: петли не читаются для вектора - PullRequest
0 голосов
/ 15 июня 2019

Школьное задание по кодированию игры коров и быков. Конечные зачетные петли не работают, и я не знаю, в чем причина.

Я попытался переименовать векторы, изменить итераторы, изменить, где в коде векторы объявлены / инициализированы (все еще не уверен точно разница)

//Get Number to Guess
if (numlen == 0) {
    cout << "Enter the number to guess: ";
    cin >> num;
    cout << "Enter the number of digits in code: ";
    cin >> numlen;
    numstr = to_string(num);
    if (numstr.length() < numlen) {
        int diff = numlen - numstr.length();
        addz = (diff, "0");
        for (int z = 1; z <= diff; ++z) {
            numstr = addz + numstr;
        }
        num = stoi(numstr);
    }
    vector<int> numvct(numlen, 0);
    max1 = 1;
    for (l = 1; l < numlen; ++l) {
        max1 = max1 * 10;
    }
    for (j = max1, k = 0; j >= 1, k < numlen; j = j / 10, ++k) {
        int addval1 = num / j;
        num = num - (addval1 * j);
        numvct.at(k) = addval1;
    }
    cout << "Number to guess: ";
    for (r = 0; r < numlen; ++r) {
        if (r == (numlen - 1)) {
            cout << numvct.at(r) << endl;
        }
        else {
            cout << numvct.at(r) << "-";
        }
    }
}

else {
    //Fill vector to pick from
    for (i = 0; i <= 9; ++i) {
        pickvct.push_back(i);
    }

    //Pull to random number
    vector<int> numvct(numlen);
    for (k = 0; k < numlen; ++k) {
        tempnum1 = rand() % (pickvct.size() - 1);
        numvct.at(k) = pickvct.at(tempnum1);
        pickvct.erase(pickvct.begin() + tempnum1);
    }
    cout << "Number to guess: ";
    for (r = 0; r < numlen; ++r) {
        if (r == (numlen - 1)) {
            cout << numvct.at(r) << endl;
        }
        else {
            cout << r << "-";
        }
    }
}

//Get guess
do {
    do {
        cout << "Enter guess: ";
        cin >> guess;
        guessstr = to_string(guess);
        guesslen = guessstr.length();
        if (guesslen < numlen) {
            int diff = numlen - guesslen;
            addz = (diff, "0");
            for (int z = 1; z <= diff; ++z) {
                guessstr = addz + guessstr;
            }
            guess = stoi(guessstr);
            guesssame = true;
        }
        if (guesslen == numlen) {
            guesssame = false;
        }
        while (guesslen > numlen) {
            cout << "You can only enter " << numlen << " digits." << endl;
            cout << "Enter guess: ";
            cin >> guess;
            guessstr = to_string(guess);
            guesslen = guessstr.length();
        }
        for (s = 0; s < guesslen; ++s) {
            for (t = s + 1; t < guesslen; ++t) {
                if (guessstr.at(s) == guessstr.at(t)) {
                    guesssame = true;
                }
                else {
                    guesssame = false;
                }
            }
        }
        if (guesssame == true) {
            cout << "Each number must be different." << endl;
            guesssame = true;
        }
    } while (guesssame == true);
    vector<int> guessvct(guesslen, 0);
    max2 = 1;
    for (m = 1; m < guesslen; ++m) {
        max2 = max2 * 10;
    }
    for (n = max2, o = 0; n >= 1, o < guesslen; n = n / 10, ++o) {
        addval2 = guess / n;
        guess = guess - (addval2 * n);
        guessvct.at(o) = addval2;
    }

    //Check the guess
    for (p = 0; p < guesslen; ++p) {
        guessdigit = guessvct.at(p);
        cout << "Guess digit at " << p << ": " << guessdigit << endl;
        for (q = 0; q < guesslen; ++q) {
            numdigit = numvct.at(q);
            cout << "Num digit at " << q << ": " << numdigit << endl;
            if (numdigit == guessdigit && q == p) {
                bulls = bulls + 1;
                if (bulls == numlen) {
                    win = true;
                    break;
                }
                cout << bulls << " bulls" << endl;
            }
            else {
                if (numdigit == guessdigit && q != p) {
                    cows = cows + 1;
                    cout << cows << " cows" << endl;
                }
            }
        }
    }
} while (win == false);

Чтобы убедиться, что цикл работал правильно, я добавил операторы cout, но он печатает только первый: Введите предположение: #### Угадай цифру в 0: # Программа завершена

1 Ответ

0 голосов
/ 15 июня 2019
//Get Number to Guess
if (numlen == 0) {
  ...
}

else {
  //Fill vector to pick from
  ...
}

Внутри блока if else у вас есть две следующие строки:

vector<int> numvct(numlen, 0);

и

vector<int> numvct(numlen);

Эти строки объявляют и инициализируют векторы, которые выходят из области видимости, когда программа покидает их соответствующие блоки if / else. Впоследствии вы снова используете этот вектор numvct, поэтому я предполагаю, что вы также объявили и инициализировали его перед любым из показанного кода, и он, вероятно, начинается с пустого. Поскольку эти два вектора numvct в блоке if / else выходят из области видимости, вся работа, которую вы с ними делаете, также уходит. Это означает, что когда вы попытаетесь использовать numvct позже, вы работаете с (предположительно) пустым, который вы объявили в самом начале программы.

Вместо переопределения numvct, попробуйте просто изменить его размер:

//vector<int> numvct(numlen);
      numvct.resize(numlen);

и

//vector<int> numvct(numlen, 0);
      numvct.resize(numlen, 0);

Также вы можете попытаться сократить количество переменных, которые вы здесь используете, и попытаться объявить их только в тех блоках кода, где они действительно необходимы. Это облегчит отслеживание происходящего.

Редактировать: Я просто хочу добавить, что я предлагаю изменить размеры векторов, в отличие от любой другой операции, которую вы могли бы выполнить над вектором, потому что я действительно не знаю, для чего конкретно вы их использовали. Я запустил ваш код с этими изменениями, а также с добавлением ~ 25 других объявлений переменных, которые вы не включили в свой пост, и он делал вещи, которые казались разумными, то есть позволял мне выбирать число, угадывать его цифры, печатать номер коров и быков и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...