【问题标题】:C++ program not decrementing correctlyC++ 程序没有正确递减
【发布时间】:2019-04-22 11:07:08
【问题描述】:

所以,我正在制作一个程序,您可以在其中将弹珠添加到袋子中。你选择你想要的颜色,然后是你想添加的弹珠数量,然后是那个颜色的弹珠是酷、无聊还是怪异。所以如果你想加10个蓝色弹珠,那么你就选择cool。您将总共有十个弹珠和十个蓝色和凉爽的弹珠。我从添加后已经存储的弹珠中取出随机弹珠。由于某种原因,它根本不起作用。我尝试获取一个随机数并将该随机数分配给已添加的当前弹珠的描述。假设生成的随机数为 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--;

预期的结果是我添加了十个蓝色和凉爽的弹珠。当我去移除随机弹珠时,它会减少蓝色和凉爽的弹珠,因为这是包中唯一的值。目前,甚至没有删除任何内容。

【问题讨论】:

  • 那个while条件注定要失败
  • @EricPostpischil 感谢您回复我的人!修复了更改,但仍然没有减少任何内容。
  • @o_weisman 哎呀,看起来我搞砸了并用 java 编写了我的作业!
  • @EricPostpischil 我刚刚将我的原始帖子编辑为我现在拥有的代码!再次感谢队友
  • srand 放入循环会导致rand 每次都生成相同的数字,直到至少一秒钟过去。因此,在“蓝色和酷”案例的数字上发生可能需要几秒钟。 srand 只应在启动随机数序列时调用一次(通常只在程序开始时调用一次)。

标签: c++ loops random


【解决方案1】:

原始问题中的代码存在缺陷,因为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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-04
    • 2023-03-31
    • 2020-07-04
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多