Добрый день! Излагаю суть дела: есть проверка, согласно которой пользователь не должен ввести символы или ещё какую-то ерунду вместо обычного числа. Использую try\catch внутри цикла, чтобы дать пользователю шанс занести правильные данные. В catch-е для пользователя дополнительно выводится уведомление, мол, Вы ошиблись, данные некорректно ввели. Однако есть проблема. Во время первого прохода цикла в try проверяются введённые данные, я заведомо их вношу неправильно, чтобы получить второй шанс на ввод. Однако шанса этого нет. Уведомление, расположенное для пользователя в catch-е, зацикливается в консоли. Путём экспериментов было установлено, что try просто не хочет работать последующие разы. Что делать? Помогите, пожалуйста, перепробовала уже всё.
Код:
#include"Struct.cpp"
#include"Functions.cpp"
using namespace std;
int main()
{
int counter, user_cost;//кол-во произведений; цена пользователя
bool flag;
cout << "How many pieces of art you wanna describe?" << endl;
do
{
flag = true;
try
{
cin >> counter;//ввод кол-ва описываемых произведений
Art *PiecesOfArt = new Art[counter];//массив структур
Input(PiecesOfArt, counter);//заполнение массива
Files(PiecesOfArt, counter);//запись данных в файл
Output(PiecesOfArt, counter);//вывод структуры
cout << endl << "Input your cost, please: ";//ввод пользовательской цены
cin >> user_cost;
Search(PiecesOfArt, counter, user_cost);//поиск и вывод удовлетворяющих лотов
delete[]PiecesOfArt;//удаление динам. массива структур
}
catch (...)
{
flag = false;
cout << "Incorrect input! Try again, please! "<< endl;
}
} while (!flag);
system("pause");
return 0;
}
Решение ловить исключение в конструкции do / while логически неправильное. Пишите например так:
bool flag = true;
while (flag)
{
try
{
// ваши функции
}
catch (...)
{
flag = false;
cout << "Incorrect input! Try again, please! "<< endl;
}
}
В блоке do while сначала выполняется тело цикла а потом проверяется условие . Соответственно когда в блоке catch вы выставляете flag = false условие (!flag) выдает true и вас возвращает в начало цикла . Можно избавиться от данного эффекта перенеся
flag = true;
в конец блока try :
try
{
cin >> counter;//ввод кол-ва описываемых произведений
Art *PiecesOfArt = new Art[counter];//массив структур
Input(PiecesOfArt, counter);//заполнение массива
Files(PiecesOfArt, counter);//запись данных в файл
Output(PiecesOfArt, counter);//вывод структуры
cout << endl << "Input your cost, please: ";//ввод пользовательской цены
cin >> user_cost;
Search(PiecesOfArt, counter, user_cost);//поиск и вывод удовлетворяющих лотов
delete[]PiecesOfArt;//удаление динам. массива структур
flag = true
}
но тогда вы выполните блок try 2 раза ( Если вы как-то подкорректируете данные для того чтобы исключения не возникало ). Добавив break в конец блока try получите рабочее решение :
try
{
cin >> counter;//ввод кол-ва описываемых произведений
Art *PiecesOfArt = new Art[counter];//массив структур
Input(PiecesOfArt, counter);//заполнение массива
Files(PiecesOfArt, counter);//запись данных в файл
Output(PiecesOfArt, counter);//вывод структуры
cout << endl << "Input your cost, please: ";//ввод пользовательской цены
cin >> user_cost;
Search(PiecesOfArt, counter, user_cost);//поиск и вывод удовлетворяющих
//..лотов
delete[]PiecesOfArt;//удаление динам. массива структур
flag = true;
break;
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
В учебниках по C++ пишут, что динамические массивы нужны, когда заранее неизвестны размеры этих массивовПотом идет объяснение, как выделять...
1-2 дня назад я задал вопрос, но не совсем корректный, поэтому сейчас я постараюсь поставить его более правильноДопустим, есть игра, в которой...
Добрый день, друзьяПодскажите, пожалуйста, алгоритм применения вихря Мерсенна в заданном диапазоне значений (н-р 1-100), можно и реализацию...