Почему мой цикл C sentinel продолжается после ввода значения sentinel?

#c #loops #sentinel

#c #циклы #sentinel

Вопрос:

Когда я ввожу строку «NOMORE», она переходит к следующей строке, где запрашивает у меня скорость транспортного средства. Он останавливает циклы только тогда, когда завершает цикл for . Как я могу сделать так, чтобы он немедленно останавливался при вводе «NOMORE»? Спасибо за любую помощь. Я действительно ценю это. И извините, что потратил ваше время, если я это сделал: (

 #include <iostream>
#include <string>
#include <iomanip>

using namespace std;

int main()
{
    string plate;
    int totalCount;
    int ticketCount = 0;
    double speed;
    double base = 150;
    double limit;
    double ticket;
    double overspeed;

    for (totalCount = 0; plate != "NOMORE"; totalCount  )
    {
        cout << "Enter a license plate number  --> ";
        cin >> plate;
        cout << "Enter current vehicle's speed --> ";
        cin >> speed;
        cout << "Enter speed limit in the zone --> ";
        cin >> limit;

        overspeed = speed - limit;

        if (overspeed >= 5 amp;amp; overspeed <= 20)
        {
            ticket = base   5 * overspeed;
            cout << "A ticket of " << setprecision(2) << fixed << ticket << " is issued to " << plate << "nn";

            ticketCount  ;
        }
        else if (overspeed > 20  amp;amp; overspeed <= 50)
        {
            ticket = base   10 * overspeed;
            cout << "A ticket of " << setprecision(2) << fixed << ticket << " is issued to " << plate << "nn";

            ticketCount  ;
        }
        else if (overspeed > 50)
        {
            ticket = base   1000   (10 * overspeed);
            cout << "A ticket of " << setprecision(2) << fixed << ticket << " is issued to " << plate << "nn";

            ticketCount  ;
        }
        else
            cout << "No ticket is issued to " << plate << ".nn";
    }

    cout << ticketCount << " out of " << totalCount << " timesn";

    return 0;
}
  

Комментарии:

1. cin >> plate; if (plate == "NOMORE") break;

2. Причина, по которой ваш цикл делает это, заключается в том, что именно для этого вы написали свою программу.

3. @vincelam1998 Если вы хотите выйти из цикла сразу после ввода cin sentinel, вам нужно сообщить вашей программе, чтобы она это сделала. См. Комментарий @IgorTandetnik. Условие в for цикле проверяется только между итерациями, а не после каждого оператора.

4. Условие цикла проверяется один раз на каждой итерации , поэтому, если вы вводите sentinel первым делом на итерации, проверка не повторится, пока не будет выполнено все тело цикла. Нет волшебного способа, чтобы конструкция цикла внезапно проверяла условие на полпути.

5. Вашему профессору нужен подзатыльник!

Ответ №1:

Как прокомментировал @IgorTandetnik, добавьте это сразу после получения пользовательского ввода:

 cout << "Enter a license plate number  --> ";
cin >> plate;
if (plate == "NOMORE") break; // add this
cout << "Enter current vehicle's speed --> ";
...
  

Условие в for цикле проверяется только между итерациями, а не после каждого оператора. Эта блок-схема суммирует, как они ведут себя:

Для блок-схемы цикла

Комментарии:

1. Должно было побудить Игоря опубликовать ответ, просто перефразировав его комментарий IMO.

2. Я думаю, вы правы, хотя я все равно собирался дать тот же ответ. Плюс я добавил объяснение