当循环应该只运行一次时,执行两次while循环(C++)

Do-while loop running twice when it should run only once (C++)

本文关键字:循环 执行 两次 C++ while 一次 运行      更新时间:2023-10-16

朋友。我有个问题。

问题:计算机必须从36个字符串的数组中随机选择一个字符串。如果它偶然选择字符串#34或#35(最后两个),它必须从同一数组中再抽取两个随机字符串。我尝试了一个临时解决方案,它"几乎"有效(请参阅下面的代码)。

随机化工作得很好,称为srand in main()。有一个强制的"x2"绘制(出于测试原因),所以计算机又绘制了两个字符串。这两个新的随机选择不是"x2",但循环仍然会再次启动——但只是又一次!这一次,计算机又选择了两个"chits",它们也不是"x2",所以,正如预期的那样,它返回"chits have draw"语句,函数终止。为什么同一个代码运行两次,结果相同,但if/else行为不同?事先非常感谢。

        string mortalityCalc ()
{
        string mortalityChits[36] = {"1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","-","-","-","-","x2","x2"};
        int mortalityResult;
        // mortalityResult = rand() %36;
        mortalityResult = 35; // for testing only. Delete afterwards.
        string drawnChit = mortalityChits[mortalityResult];
        string drawnChit1;
        string drawnChit2;
        if (drawnChit != "-" && drawnChit != "x2")
        {
            string returnText = string("The computer has drawn the chit '") + drawnChit + "'.";
            return returnText;
        }
        else if (drawnChit == "-")
        {
            string returnText = string("The computer has drawn the chit '") + drawnChit + "'. No senators died this year.";
            return returnText;
        }
        do
        {
            cout << "The computer has drawn the 'x2' chit." << endl;
            cout << "Two more chits will be drawn.n" << endl;
            mortalityResult = rand() %36;
            drawnChit1 = mortalityChits[mortalityResult];
            cout << "The first draw is the chit '" << drawnChit1 << "'. ";
            mortalityResult = rand() %36;
            drawnChit2 = mortalityChits[mortalityResult];
            cout << "The second draw is the chit '" << drawnChit2 << "'." << endl;
        } while (drawnChit1 == "x2" || drawnChit2 == "x2");
        return "The mortality chits have been drawn. The corresponding senators are dead.";
}

UPDATE:尝试将此代码与程序的其余部分隔离运行,其行为与预期一致。所以我想发布之前的内容很重要:

cout << "If you are a lazy bastard, the computer can pick one senator randomly for you.nAre you a lazy bastard? [y/n]" << endl;
        string lazyBastard;
        cin >> lazyBastard;
        cout << endl;
        if (lazyBastard == "y" || lazyBastard == "Y" || lazyBastard == "yes" || lazyBastard == "YES" || lazyBastard == "Yes")
        {
            mortalityCalc ();
            cout << mortalityCalc () << endl;
            cout << "Very well. Now, imminent wars become active (Only one of each match)." << endl;
            cout << "Get ready for the next phase." << endl;

通过阅读这里的其他一些问题,我的猜测是,cin在某种程度上扰乱了循环行为,尽管它们不相关,并且循环的语句或条件中没有任何用户输入。这可能吗?如果是,为什么以及如何补救?

再次感谢。

在第一个循环中,您强制执行'x2',这样您就进入了do-while循环。两次调用"rand()%36"的结果总是19,并且是一个介于30和34之间的数字。关键是,如果你不给随机数生成器一个种子"srand(…)",随机数生成器总是生成相同的数字序列

    do {
        // ...
        cout << rand()%36;
        // ...
    } while( /*...*/ )

请参阅http://ideone.com/zl8ggH您必须创建随机数,并且您的代码能够满足您的期望。

终于来了!我以为这会是一件愚蠢的事情!我刚刚意识到我调用了mortalityCalc()函数两次!这就是它循环两次的原因!

感谢所有试图提供帮助的人!