C ++程序没有正确递减

问题描述 投票:-2回答:1

所以,我正在制作一个程序,你可以在其中添加大理石。你选择你想要的颜色,然后你想要添加的大理石的数量,然后选择那种颜色大理石是酷,无聊或奇怪的。所以,如果你想添加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--;

预期的结果会说我添加了十个蓝色和凉爽的大理石。当我去除一块随意的大理石时,它将减少一块蓝色和凉爽的大理石,因为这是袋子里唯一的价值。目前,甚至没有任何东西被删除。

c++ loops random
1个回答
0
投票

原始问题中的代码因为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的变量设置为1:

#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();
}
© www.soinside.com 2019 - 2024. All rights reserved.