Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.84
.::.DIMA.::.
143 / 143 / 4
Регистрация: 26.10.2008
Сообщений: 782
#1

Обработка исключений - C++

11.02.2009, 01:33. Просмотров 2382. Ответов 3
Метки нет (Все метки)

Как сделать обработку исключения так, чтобы, если, например, вводим количество координат больше, чем можно, программа предлагала, или выйти, или попробовать ввести ещё раз.
Я пробовал с помощью switch, но там если ввести первый раз неправильно, то он запускается, если ещё раз неправильно, то уже обработка исключения не идёт, то есть, нужно под каждый неправильный ввод писать новый ввод объекта и обработку для него try { cin >> … } catch () {..}
Можно ли как-нибудь по-другому, не используя при этом, оператор goto?

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#include <iostream>
using namespace std;
int const nmax = 100;
class Vector
{
public:
    Vector ();              
    Vector (int, int);
    ~Vector ();
    void SetItsAmount (int);
    void SetItsCoordinates (int , int); 
    int GetItsAmount () const;
    int GetItsCoordinates (int) const;
    
    class xTooBig {};
    class xErrorInput {};
    class xZero {};
    
private:
    int itsAmount;          
    int itsCoordinates [nmax];          
      friend istream &operator>> (istream &, Vector &);     
    friend ostream &operator<< (ostream &, const Vector &); 
};
 
Vector::Vector ()
{
}
Vector::Vector (int value, int amount)
{
    int i;
    for (i = 0; i < nmax; i++)
        itsCoordinates [i] = value;
    itsAmount = amount;
}
Vector::~Vector ()
{
}
void Vector::SetItsAmount (int amount)
{
    itsAmount = amount;
}
void Vector::SetItsCoordinates (int value, int i)
{
    itsCoordinates [i] = value;
}
int Vector::GetItsAmount () const
{
    return itsAmount;
}
int Vector::GetItsCoordinates (int i) const
{
    return itsCoordinates [i];
}
istream &operator>> (istream & input, Vector & rhs)
{
    int value;
    cout << "Введите количество координат\n";
    input >> rhs.itsAmount;
    if (rhs.itsAmount > nmax)
        throw Vector::xTooBig ();
    if (rhs.itsAmount == 0)
        throw Vector::xZero ();
    for (int i = 0; i < rhs.GetItsAmount (); i++)
    {
        cout << "Координата " << i + 1 << " = ";
        if (!(input >> value))
            throw Vector::xErrorInput ();
        rhs.SetItsCoordinates (value, i);
    }
    return input;
}
ostream &operator<< (ostream & output, const Vector & rhs)
{
    int i;
    for (i = 0; i < rhs.GetItsAmount (); i++)
        output << "Координата " << i + 1 
        << " = " << rhs.GetItsCoordinates (i) << endl;
    return output;
}
void PrintAboutError ()
{
    cout << "Произошла ошибка\n";
    exit (1);
}
int main ()
{
    set_terminate (PrintAboutError);
    setlocale (LC_ALL,".1251");
    Vector Vector1 (0, 0), Vector2 (0,0), Vector3 (0, 0);
 
    try
    {
        cout << "Первый вектор:\n";
        cin >> Vector1;
        cout << endl;
 
        cout << "Второй вектор:\n";
        cin >> Vector2;
        cout << endl;
    }
    catch (Vector::xTooBig)
    {
        cout << "Введено слишком большое количество координат\n";
        return 0;
    
    }
    catch (Vector::xErrorInput)
    {
        cout << "Ошибка ввода значения координаты\n";
        return 0;
    }
    catch (Vector::xZero)
    {
        cout << "Нет смысла работать с вектором без координат\n";
        return 0;
    }
    catch (...)
    {
        cout << "Произошла ошибка\n";
        return 0;
    }
 
    cout << Vector1 << endl << Vector2 << endl;
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.02.2009, 01:33     Обработка исключений
Посмотрите здесь:

C++ обработка исключений
C++ Обработка исключений
Обработка исключений C++
Обработка исключений C++
C++ Обработка исключений
Обработка исключений C++
Обработка исключений C++
Обработка исключений с пмощью структурированной обработки исключений C++
Обработка исключений C++
Обработка исключений C++
Обработка исключений C++
C++ Обработка исключений

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
XuTPbIu_MuHTAu
Эксперт С++
2222 / 737 / 10
Регистрация: 27.05.2008
Сообщений: 1,508
11.02.2009, 08:03     Обработка исключений #2
Цитата Сообщение от qwert Посмотреть сообщение
Можно ли как-нибудь по-другому, не используя при этом, оператор goto?
Конечно! while
virus_system
132 / 128 / 6
Регистрация: 03.02.2009
Сообщений: 594
11.02.2009, 13:10     Обработка исключений #3
Проверяй в цикле, если правильно - то выходи, иначе проси еще раз ввести...
.::.DIMA.::.
143 / 143 / 4
Регистрация: 26.10.2008
Сообщений: 782
12.02.2009, 00:42  [ТС]     Обработка исключений #4
Спасибо. Сейчас приходится кардинально менять реализацию задачи. Когда переделаю попробую сделать с while.
Yandex
Объявления
12.02.2009, 00:42     Обработка исключений
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru