Программа на C ++ некорректно убывает - PullRequest
0 голосов
/ 22 апреля 2019

Итак, я создаю программу, в которой вы можете добавлять шарики в сумку.Вы выбираете нужный цвет, затем количество шариков, которое хотите добавить, и затем, если мрамор этого цвета либо крутой, скучный, либо странный.Так что если вы хотите добавить 10 синих шариков, а затем вы выбрали круто.Всего у вас будет десять шариков и десять шариков синего и холодного цвета.Я иду, чтобы удалить случайный мрамор из мрамора, который хранится уже после добавления.По некоторым причинам, это не работает вообще.Я пытаюсь получить случайное число и назначить это случайное описание текущего мрамора, который уже был добавлен.Скажем, если сгенерированное случайное число равно 1, оно удалит «красный прохладный мрамор».Я, очевидно, не могу удалить шарик, который не был добавлен, поэтому я добавил петлю do - while, которая в основном повторяет цикл через генератор случайных чисел, пока не найдет число, которое удовлетворяет критериям.Вот мой код, есть мысли?:

Я попытался изменить положение моего цикла Do while.

  void remove() {


do {
srand(time(0));


randomnum = (rand () % max) +1 ;





if (randomnum == 1 && redcool > 0)  {

  red--;
  redcool--;
  cout << "The random marble removed was a red and cool marble" <<endl;
}
else if (randomnum == 2 && redweird > 0) {
cout << "The random marble removed was a red and weirdl marble" <<endl;
  red--;
  redweird--;
}
else if (randomnum == 3 && redboring > 0) {
cout << "The random marble removed was a red and boring marble" <<endl;
  red--;
  redboring--;
}
else if (randomnum == 4 && greencool > 0) {
cout << "The random marble removed was a green and cool marble" <<endl;
  green--;
  greencool--;
}
else if (randomnum == 5 && greenweird > 0) {
cout << "The random marble removed was a green and weird marble" <<endl;
  green--;
  greenweird--;

}
else if (randomnum == 6 && greenboring > 0) {
cout << "The random marble removed was a green and boring marble" <<endl;
  greenboring--;
  green--;
}
else if (randomnum == 7 && bluecool > 0) {
  cout << "The random marble removed was a green and cool marble" <<endl;
  blue--;
  bluecool--;

}
else if (randomnum == 8 && blueboring >0) {
cout << "The random marble removed was a blue and cool marble" <<endl;
  blue--;
  blueboring--;

}
else if (randomnum == 9 && blueweird > 0) {
cout << "The random marble removed was a blue and weird marble" <<endl;
  blue--;
  blueweird--;
}


}while (randomnum == 1 && redcool > 0 || randomnum == 2 && redweird >0 || randomnum == 3
&& redboring > 0 || randomnum == 4 && greencool > 0 || randomnum == 5 && greenweird >0 || randomnum == 6
&& greenboring > 0 || randomnum == 7 && bluecool > 0 || randomnum == 8 && blueweird >0 || randomnum == 9
&& blueboring > 0);



bag--;

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

1 Ответ

0 голосов
/ 22 апреля 2019

Код в исходном вопросе был ошибочным из-за наличия лишнего регистра для randomnum == 7.Отредактированный код имеет недостатки из-за наличия srand внутри цикла.

Пример рабочего кода с минимальными изменениями по сравнению с оригиналом:

#include <iostream>
#include <cstdlib>

using namespace std;


void remove(void)
{
    int max = 9;
    int randomnum;

    int redcool = 2;
    int redweird = 2;
    int redboring = 2;
    int red = redcool + redweird + redboring;
    int greencool = 2;
    int greenweird = 2;
    int greenboring = 2;
    int green = greencool + greenweird + greenboring;
    int bluecool = 2;
    int blueweird = 2;
    int blueboring = 2;
    int blue = bluecool + blueweird + blueboring;
    int bag = red+green+blue;

    srand(time(0));

    do
    {
        randomnum = (rand() % max) + 1;

        if (randomnum == 1 && redcool > 0)
        {
            red--;
            redcool--;
            cout << "The random marble removed was a red and cool marble" << endl;
        }
        else if (randomnum == 2 && redweird > 0)
        {
            cout << "The random marble removed was a red and weird marble" << endl;
            red--;
            redweird--;
        }
        else if (randomnum == 3 && redboring > 0)
        {
            cout << "The random marble removed was a red and boring marble" << endl;
            red--;
            redboring--;
        }
        else if (randomnum == 4 && greencool > 0)
        {
            cout << "The random marble removed was a green and cool marble" << endl;
            green--;
            greencool--;
        }
        else if (randomnum == 5 && greenweird > 0)
        {
            cout << "The random marble removed was a green and weird marble" << endl;
            green--;
            greenweird--;

        }
        else if (randomnum == 6 && greenboring > 0)
        {
            cout << "The random marble removed was a green and boring marble" << endl;
            greenboring--;
            green--;
        }
        else if (randomnum == 7 && bluecool > 0)
        {
            cout << "The random marble removed was a blue and cool marble" << endl;
            blue--;
            bluecool--;

        }
        else if (randomnum == 8 && blueweird > 0)
        {
            cout << "The random marble removed was a blue and weird marble" << endl;
            blue--;
            blueweird--;
        }
        else if (randomnum == 9 && blueboring > 0)
        {
            cout << "The random marble removed was a blue and boring marble" << endl;
            blue--;
            blueboring--;
        }

    } while (
        randomnum == 1 && redcool > 0 ||
        randomnum == 2 && redweird > 0 ||
        randomnum == 3 && redboring > 0 ||
        randomnum == 4 && greencool > 0 ||
        randomnum == 5 && greenweird > 0 ||
        randomnum == 6 && greenboring > 0 ||
        randomnum == 7 && bluecool > 0 ||
        randomnum == 8 && blueweird > 0 ||
        randomnum == 9 && blueboring > 0);

    bag--;

    std::cout << "redcool = " << redcool << ".\n";
    std::cout << "redweird = " << redweird << ".\n";
    std::cout << "redboring = " << redboring << ".\n";
    std::cout << "red = " << red << ".\n";
    std::cout << "greencool = " << greencool << ".\n";
    std::cout << "greenweird = " << greenweird << ".\n";
    std::cout << "greenboring = " << greenboring << ".\n";
    std::cout << "green = " << green << ".\n";
    std::cout << "bluecool = " << bluecool << ".\n";
    std::cout << "blueweird = " << blueweird << ".\n";
    std::cout << "blueboring = " << blueboring << ".\n";
    std::cout << "blue = " << blue << ".\n";
    std::cout << "bag = " << bag << ".\n";
}


int main(void)
{
    remove();
}

Обратите внимание, что когда любая категория начинается пустым, этокод остановится, как только он будет выбран генерацией случайных чисел.Если необходимо остановить только при переходе категории из непустой в пустую, необходимо внести изменения.Один из способов сделать это - использовать другую переменную, чтобы указать, был ли виден такой переход.В приведенном ниже коде переменная с именем trigger устанавливается в единицу, когда только что измененный счетчик становится равным нулю:

#include <iostream>
#include <cstdlib>

using namespace std;


void remove(void)
{
    int max = 9;
    int randomnum;

    int redcool = 0;
    int redweird = 0;
    int redboring = 0;
    int red = redcool + redweird + redboring;
    int greencool = 0;
    int greenweird = 0;
    int greenboring = 0;
    int green = greencool + greenweird + greenboring;
    int bluecool = 10;
    int blueweird = 0;
    int blueboring = 0;
    int blue = bluecool + blueweird + blueboring;
    int bag = red+green+blue;

    srand(time(0));

    int trigger = 0;
    do
    {
        randomnum = (rand() % max) + 1;

        if (randomnum == 1 && redcool > 0)
        {
            red--;
            redcool--;
            trigger = redcool == 0;
            cout << "The random marble removed was a red and cool marble" << endl;
        }
        else if (randomnum == 2 && redweird > 0)
        {
            cout << "The random marble removed was a red and weird marble" << endl;
            red--;
            redweird--;
            trigger = redweird == 0;
        }
        else if (randomnum == 3 && redboring > 0)
        {
            cout << "The random marble removed was a red and boring marble" << endl;
            red--;
            redboring--;
            trigger = redboring == 0;
        }
        else if (randomnum == 4 && greencool > 0)
        {
            cout << "The random marble removed was a green and cool marble" << endl;
            green--;
            greencool--;
            trigger = greencool == 0;
        }
        else if (randomnum == 5 && greenweird > 0)
        {
            cout << "The random marble removed was a green and weird marble" << endl;
            green--;
            greenweird--;
            trigger = greenweird == 0;

        }
        else if (randomnum == 6 && greenboring > 0)
        {
            cout << "The random marble removed was a green and boring marble" << endl;
            greenboring--;
            green--;
            trigger = greenboring == 0;
        }
        else if (randomnum == 7 && bluecool > 0)
        {
            cout << "The random marble removed was a blue and cool marble" << endl;
            blue--;
            bluecool--;
            trigger = bluecool == 0;

        }
        else if (randomnum == 8 && blueweird > 0)
        {
            cout << "The random marble removed was a blue and weird marble" << endl;
            blue--;
            blueweird--;
            trigger = blueweird == 0;
        }
        else if (randomnum == 9 && blueboring > 0)
        {
            cout << "The random marble removed was a blue and boring marble" << endl;
            blue--;
            blueboring--;
            trigger = blueboring == 0;
        }

    } while (!trigger);

    bag--;

    std::cout << "redcool = " << redcool << ".\n";
    std::cout << "redweird = " << redweird << ".\n";
    std::cout << "redboring = " << redboring << ".\n";
    std::cout << "red = " << red << ".\n";
    std::cout << "greencool = " << greencool << ".\n";
    std::cout << "greenweird = " << greenweird << ".\n";
    std::cout << "greenboring = " << greenboring << ".\n";
    std::cout << "green = " << green << ".\n";
    std::cout << "bluecool = " << bluecool << ".\n";
    std::cout << "blueweird = " << blueweird << ".\n";
    std::cout << "blueboring = " << blueboring << ".\n";
    std::cout << "blue = " << blue << ".\n";
    std::cout << "bag = " << bag << ".\n";
}


int main(void)
{
    remove();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...