Другие языки программирования и технологии

C++ как сделать двойное условия цикла?

Добрый день!
Подскажите как сделать двойную проверку, проверка на то число выведено правильно (число не буква а int) и на то что они меньше 100000 (какого то определённого числа )
Так проверяет только на правильность ввода, как добавить ещё проверку на условия до какого то определённого числа

do
{
cout << "Vvedite cenu tovar :";
cin >> cena;
cin.clear();
system("cls");
cin.ignore(100, '\n');
} while (!cena);

} while (!cena && cena >1000000); пробовал как то так но не работает.
Maksim Kurkovs, Вам следовало бы знать особенность потокового ввода: если ввод оказался некорректным, то переменная сохраняет то значение, которое содержала до выполнения операции ввода.

Представьте себе, что в первой итерации (или нескольких первых итерациях) ввод был корректным, и переменная cena содержит последнее числовое значение. Что случится, если после этого ввод будет некорректным? Тогда в переменной cena останется неактуальное значение!!! И как же программно выявить эту неактуальность, если это же значение на предыдущем шаге было признано корректным? К сожалению никак… увы…

У класса istream есть метод fail(), который показывает, был ли ввод корректным. Он возвращает значение True, если ввод был некорректным, и False в противном случае. Метод fail() не имеет параметров и вызывается вместе с объектом: cin.fail().

• Вот только вызов cin.clear() сбрасывает состояние ошибки ввода, после чего вызов cin.fail() будет возвращать значение False, пока не будет введено очередное значение. Поэтому не следует помещать cin.clear() между операцией ввода и проверкой cin.fail(). Порядок вызовов должен быть таким:

  cin.clear()
  cin >> cena;
    // • • • прочий код
  // проверка cin.fail()

Плюс: если ввод был некорректным, то проверять введённое значение переменной cena не имеет смысла. Значит, не сто́ит объединять условия по „&&“. Лучше использовать тернарную условную операцию.

while (cin.fail() ? True : cena > 1000000); // так правильно
Александр Люпа
Александр Люпа
16 172
Лучший ответ
Александр Люпа ✓ Если ввод был некорректным, то значение тернарной операции будет True, и сравнение переменной cena выполняться не будет. Так!

✓ И только, если ввод прошёл корректно, условие цикла будет зависеть от переменной cena: cena > 1000000.
Александр Люпа do
{
system("cls");
cout << "Vvedite cenu tovara: ";
cin.clear();
cin >> cena;
cin.ignore(100, '\n');
} while (cin.fail() ? True : cena > 1000000);

// можно и с предусловием, но для этого переменная cena должна быть инициализирована!
Александр Люпа То же можно сделать и другим способом, так, что операция ввода (cin >> cena) окажется в условии цикла. Вот только строку cin.ignore(100, '\n'); придётся перенести.
Александр Люпа ДОП:   cin.sync(); очищает буфер ввода.
Александр Люпа Для случаев, когда условие цикла некоммутативно, хорошо подходит бесконечный цикл с флагом.

• Флаг — булевская переменная, при объявлении инициализируется значением True.

• Флаг является единственным условием цикла, следовательно, если внутри цикла значение флага не изменится, то цикл останется бесконечным.

Однако, в теле цикла можно предусмотреть изменение флага по условию, в том числе и по составному некоммутативному условию.

bool Flag = True;
while (Flag) {
……………
if (……) Flag = False;
……………
}

Примечание: поток cin содержит в себе такой флаг (метод cin.fail() проверяет именно его, а метод cin.clear() — сбрасывает), к сожалению, влиять на этот флаг извне невозможно.
Николай Калюня Спасибо, полезный совет.
Выкрутился таки решением
do
{
do
{
cout << "Vvedite cenu tovar :";
cin >> cena;
cin.clear();
cin.ignore(100, '\n');
} while (!cena);
} while (cena > 10000);
while (!cena && cena < 1000000);
Роман Шевченко
Роман Шевченко
11 032
Николай Калюня не так не работает
Проверить можно всё в условии цикла.
Если я тебя правильно понял, то это вот так!
while ( !cena && (cena < 1000000) )
Yan Vanifatev
Yan Vanifatev
127