Помогите сделать так, чтобы после неверного ввода числа снова приходило уведомление с повторной просьбой ввода
#include <cstdlib>
#include <iostream>
#include <ctime>
using namespace std;
int main(){
const int size = 13;
int matrix[size];
srand(time(NULL));
//заполнение массива случайными числами
int max = 7, min = -16;
for(int i = 0; i < size; i++)
{
matrix[i] = 1 + rand() % (max - min) + min;
cout<< " M["<<i<<"]="<<matrix[i]<<endl;
}
int x;
cout<<"Введите число от -16 до 7:";
cin>>x;
for(int i=0;i<size;i++){
if(matrix[i]>=x) cout<<"Число, которое не меньше за то, что вводил пользователь:"<<matrix[i]<<endl;
if(x > 7 || x < -16)
cout<<"Неверно! Введите наново:"; //Вот здесь програма зависает.
cin>>x;
}
return 0;
}
Ответы (2 шт):
Автор решения: Andrey Kanevskoi
→ Ссылка
Просто добавьте флаг перед циклом и проверяйте его внутри цикла. Пока число не будет введено верно, будет выполняться первое условие. Как только Х станет верным, сработает вторая ветвь и цикл завершится (мы поменяли флаг).
…
cin >> x;
bool isRightNumber = false;
while(!isRightNumber) {
if(x > 7 || x < -16) {
cout<<"Неверно! Введите наново:";
cin>>x;
}
else {
cout<<"Число, которое не меньше за то, что вводил пользователь:"<<matrix[i]<<endl;
isRightNumber = true;
}
}
…
Автор решения: Harry
→ Ссылка
Я бы и не отвечал... но приведенные ответы смотрят только на диапазон. А если пользователь введет что-то типа abc (ну, не число)?
Я как-то, фрилансируя :), для студентов набросал такой способ чтения с обработкой ошибок, смотрите, может, пригодится :)
int inputInt(const char * prompt, int m = INT_MIN, int M = INT_MAX)
{
int N;
for (;;) {
std::cout << prompt << " (целое от " << m << " до " << M << "): " << std::flush;
if ((std::cin >> N).good() && (m <= N) && (N <= M)) return N;
if (std::cin.fail()) {
std::cin.clear();
std::cout << "Неверный ввод, повторите.\n";
} else {
std::cout << "Число вне допустимого диапазона значений. Повторите ввод.\n";
}
std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
}
}
a = inputInt("Введите размер массива",1,10);