C++程序未正确递减

C++ program not decrementing correctly

本文关键字:程序 C++      更新时间:2023-10-16

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

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

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