С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 12.12.2017
Сообщений: 54
1

Блок try-catch и ввод

12.10.2018, 20:32. Показов 1189. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть метод класса, который устанавливает дату в переменные типа int, я перелавливаю некоректный ввод с помощью try-catch, но вводится лишь 1ая переменная а остальные пропускаются. В чем проблема?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
void Note::setDate()
{
    setlocale(LC_ALL, "Russian");
    cout << "Введите дату рождения: \n";
    try
    {
        cout << "День: "; 
        if (!cin >> day)
            throw "Некоректный ввод!";
        cin.get();
        cout << "Месяц: "; 
        if (!cin >> month)
            throw "Некоректный ввод!";
        cin.get(); 
        cout << "Год: "; 
        if (!cin >> year)
            throw "Некоректный ввод!";
        cin.get();
    }
    catch (const char* s)
    {
        cout << s << endl;
        day = 0, month = 0, year = 0;
        cout << "День: ";
        cin >> day; cin.get();
        cout << "Месяц: ";
        cin >> month; cin.get();
        cout << "Год: ";
        cin >> year; cin.get();
    }
}
P.S. без блока try-cath все было нормально.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.10.2018, 20:32
Ответы с готовыми решениями:

Конструкция try catch в цикле while. Зацикливается блок catch
Здравствуйте. Столкнулся с проблемой: при попытке запихнуть в цикл конструкцию try catch -...

Try/catch. Проверка на ввод букв в int
Как сделать проверку на ввод букв в переменную типа int? Хочу это реализовать через try/catch, но...

Блок try.catch
В одном из тестов наткнулся на такой код public static void main(String args) { ...

Блок try и catch
В этой програме нужно сделать чтобы нельзя было вводить символы кроме цифр. И если k&gt;n выводить...

3
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
12.10.2018, 20:56 2
Приоритеты операторов не знаешь. Вначале с cin выполняется оператор ! (перед которым cin преобразуется из std::istream в bool). Нужно
C++
1
if (!(cin >> day))
и аналогично для других действий. cin.get(); не нужен.
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,884
Записей в блоге: 1
12.10.2018, 20:59 3
Andaluz, не надо так делать
C++
1
2
3
4
5
6
7
8
9
10
11
    catch (const char* s)
    {
        cout << s << endl;
        day = 0, month = 0, year = 0;
        cout << "День: ";
        cin >> day; cin.get();
        cout << "Месяц: ";
        cin >> month; cin.get();
        cout << "Год: ";
        cin >> year; cin.get();
    }
если повторно ввод будет не верным? и перед чтением из потока после ошибки нужно его востановить.
0
0 / 0 / 0
Регистрация: 12.12.2017
Сообщений: 54
12.10.2018, 21:48  [ТС] 4
Цитата Сообщение от _stanislav Посмотреть сообщение
Andaluz, не надо так делать

* * catch (const char* s)
* * {
* * * * cout << s << endl;
* * * * day = 0, month = 0, year = 0;
* * * * cout << "День: ";
* * * * cin >> day; cin.get();
* * * * cout << "Месяц: ";
* * * * cin >> month; cin.get();
* * * * cout << "Год: ";
* * * * cin >> year; cin.get();
* * }
если повторно ввод будет не верным? и перед чтением из потока после ошибки нужно его востановить.
Была б моя воля я б вообще try-catch сюда не лепил в такую пустышку, а так в универе хотят.

Добавлено через 42 минуты
Окей, чтобы не плодить много тем, то напишу тут:
Вылезла другая проблема, есть класс Vector, где хранятся данные типа Note, но когда пробую отсортировать вылазит ерор, сортировка происходит через перегрузку оператора < , дружественной функции к классу Note.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
vector<Note> list;  // то что сортируем
//Сортировка
    Notebook& operator=(Notebook& N) //потому что в задании дано перегрузить именно =
        Note tmp;
        int x = 0;
        int size = N.list.size();
        for (int i = size - 1; i >= x; i--)
        {
            for (int j = size - 1; j >= x; j--) 
            {
                if (N.list[j] < N.list[j - 1]) 
                {
                    tmp = N.list[j];
                    N.list[j] = N.list[j - 1];
                    N.list[j - 1] = tmp;
                }
 
            }
            x++;
        }
        return N;
    }
 
friend bool operator<(Note& n1, Note& n2)
    {
        if ((n1.day < n2.day) && (n1.month < n2.month) && (n1.year < n2.year))
            return true;
        return false;
    };
Где ошибка?
0
12.10.2018, 21:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.10.2018, 21:48
Помогаю со студенческими работами здесь

Блок try-catch
В некоторых программах он хорошо работает и в блоке catch выводит то что написал, а в некоторых...

Не работает блок catch
Я создаю программу, которая выводит все решения задачи о 8 ферзях (если не знаете - погуглите, но...

блок try {} catch() и быстродействие.
Приветствую! Проблема встала об оптимизации ВСЕГО кода по быстродействию. Пришлось уделять...

Бесполезный блок CATCH ?
Внутри него я не могу ни чего сделать стоящего! Мне нужно хотя бы присвоить значение переменным,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru