Добрый день!
Подскажите как сделать двойную проверку, проверка на то число выведено правильно (число не буква а int) и на то что они меньше 100000 (какого то определённого числа )
Так проверяет только на правильность ввода, как добавить ещё проверку на условия до какого то определённого числа
do
{
cout << "Vvedite cenu tovar :";
cin >> cena;
cin.clear();
system("cls");
cin.ignore(100, '\n');
} while (!cena);
} while (!cena && cena >1000000); пробовал как то так но не работает.
Другие языки программирования и технологии
C++ как сделать двойное условия цикла?
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); // так правильно
Представьте себе, что в первой итерации (или нескольких первых итерациях) ввод был корректным, и переменная 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); // так правильно
while (!cena && cena < 1000000);
Николай Калюня
не так не работает
Проверить можно всё в условии цикла.
Если я тебя правильно понял, то это вот так!
while ( !cena && (cena < 1000000) )
Если я тебя правильно понял, то это вот так!
while ( !cena && (cena < 1000000) )
Похожие вопросы
- C++, как сделать задержку выполнения цикла, например на 5 сек.
- Учу C++! Уже знаю: типы данных, циклы. условия, привидения и т. д учу 5дней. вот программа! Как норм за 5 дней?
- C#. Как сделать, чтобы программа проверяла тип введённой переменной?
- C# Как сделать сохранение игры и запуск сохраненной игры?
- Правда ли что на C++\C# можно сделать все что угодно, от простенькой утилиты до целой оси?
- C# C++ Как сделать, чтобы при появлении форма раскручивалась в центре экрана.(подскажите алгоритм)
- C++. Никогда не выполняется условие (stroka.SubString(i,1)==" ") почему-то.
- C++. Можно сделать так, что бы тип переменной определялся сам? (Калькулятор) ...
- Объясните тему Циклы, а пальцах? C++
- Вопрос по трассировке цикла со вложенностью. C++
✓ И только, если ввод прошёл корректно, условие цикла будет зависеть от переменной cena: cena > 1000000.
{
system("cls");
cout << "Vvedite cenu tovara: ";
cin.clear();
cin >> cena;
cin.ignore(100, '\n');
} while (cin.fail() ? True : cena > 1000000);
// можно и с предусловием, но для этого переменная cena должна быть инициализирована!
• Флаг — булевская переменная, при объявлении инициализируется значением 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);