如何结束while循环

How do you end while loop

本文关键字:while 循环 结束 何结束      更新时间:2023-10-16

当输入"NOMORE"这个词时,我很难弄清楚如何结束我的程序。
我研究了类似的线程,建议使用"if, break"或"if, go to"。

虽然程序将在进入"NOMORE"后结束,但我想知道是否有可能在不处理剩余模块(calcTicket, printInfo)的情况下结束。

int main ()
{
string licensePlate;
double vehicleSpeed = 0, zoneSpeed = 0, ticketPrice, base = 0, fee = 0;
while (licensePlate !="NOMORE")
{
   getInfo(licensePlate, vehicleSpeed, zoneSpeed);
   if (licensePlate == "NOMORE")
      break;
   calcTicket(vehicleSpeed, zoneSpeed, ticketPrice, base, fee);
   printInfo(licensePlate, vehicleSpeed, zoneSpeed, ticketPrice);
}
return 0;
}

我认为,在询问是否"可能结束"时,您指的是终止循环,而不是程序。

如果你不能改变getInfo(),我将结构为do-while而不是while

do
{
     getInfo(licensePlate, vehicleSpeed, zoneSpeed);
     if (licensePlate == "NOMORE") break;
     calcTicket(vehicleSpeed, zoneSpeed, ticketPrice, base, fee);
     printInfo(licensePlate, vehicleSpeed, zoneSpeed, ticketPrice);
} while (true);

前提是getInfo()需要至少调用一次,如果进入"NOMORE"则要求后续处理不发生,否则循环将永远继续。

如果你可以改变getInfo()返回bool是可能的…

while (getInfo(licensePlate, vehicleSpeed, zoneSpeed))
{
    calcTicket(vehicleSpeed, zoneSpeed, ticketPrice, base, fee);
    printInfo(licensePlate, vehicleSpeed, zoneSpeed, ticketPrice);
}

假设getInfo()看到"NOMORE"返回false,并且不管vehicleSpeedzoneSpeed如何处理。一个优点是,如果满足结束条件,getInfo()实际上不需要读取这些值。显然,getInfo()内部会有一个测试,但调用者不需要关心如何完成。

如果我正确理解了这个问题,试试这个:

int main ()
{
    string licensePlate;
    double vehicleSpeed = 0, zoneSpeed = 0, ticketPrice, base = 0, fee = 0;
    while (licensePlate !="NOMORE")
    {
        getInfo(licensePlate, vehicleSpeed, zoneSpeed);
        if (licensePlate != "NOMORE")
        {
            calcTicket(vehicleSpeed, zoneSpeed, ticketPrice, base, fee);
            printInfo(licensePlate, vehicleSpeed, zoneSpeed, ticketPrice);
        }
    }
    return 0;
}

您将始终使用CAL票证函数,因为在您的代码中没有不使用CAL票证的条件。在这段代码中你检查NOMORE条件如果它存在你就不会调用这些函数

如果由于某种原因不能使用break,则可以将calcTicketprintInfo包装在if语句中,如if(licensePlate != "NOMORE")

如果你能够使用break,我会做(只有一个比较)

while (true)
  {
  getInfo(licensePlate, vehicleSpeed, zoneSpeed);
  if (licensePlate == "NOMORE")
    break;
  calcTicket(vehicleSpeed, zoneSpeed, ticketPrice, base, fee);
  printInfo(licensePlate, vehicleSpeed, zoneSpeed, ticketPrice);
}

也许问题是你的输入,你根本没有输入你的if声明?例如,你是否全部用大写字母输入"NOMORE"?

另一种解决方案是使用当用户想要退出时设置的标志,并在循环条件中使用该标志:

bool userWantsToQuit = false;
while (!userWantsToQuit)
{
   getInfo(licensePlate, vehicleSpeed, zoneSpeed);
   userWantsToQuit = (licensePlate == "NOMORE");
   if (!userWantsToQuit)
   {
      calcTicket(vehicleSpeed, zoneSpeed, ticketPrice, base, fee);
      printInfo(licensePlate, vehicleSpeed, zoneSpeed, ticketPrice);
   }
}

那么,为什么不使用异常呢?

void getInfo(licensePlate, vehicleSpeed, zoneSpeed)
{
    licensePlate = /*get logic*/;
    if (licensePlate == "NOMORE")
        throw std::invalid_argument("NO MORE");
}
/*..define other functions..*/
int main ()
{
    string licensePlate;
    double vehicleSpeed = 0, zoneSpeed = 0, ticketPrice, base = 0, fee = 0;
    while(true)
    {
        try
        {
            getInfo(licensePlate, vehicleSpeed, zoneSpeed);
            calcTicket(vehicleSpeed, zoneSpeed, ticketPrice, base, fee);
            printInfo(licensePlate, vehicleSpeed, zoneSpeed, ticketPrice);
        }
        catch(...)
        {
            /*exit logic*/
        }
    }
    return 0;
}