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

Обработка ошибок - C++

Восстановить пароль Регистрация
 
Eragorn2013
0 / 0 / 0
Регистрация: 01.04.2016
Сообщений: 9
12.06.2016, 17:02     Обработка ошибок #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
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
#include <iostream>
using namespace std;
 
class fraction
{
private:
    int num; // числитель
    int den; // знаменатель
public:
    fraction( ) : num( 0 ), den( 1 ) { }
    fraction( int n, int d ) : num( n ), den( d ) { }
 
    fraction operator+ ( fraction f )
    {
        int n = num * f.den + den * f.num;
        int d = den * f.den;
        return fraction( n, d );
    }
    fraction operator- ( fraction f )
    {
        int n = num * f.den - den * f.num;
        int d = den * f.den;
        return fraction( n, d );
    }
    fraction operator* ( fraction f )
    {
        int n = num * f.num;
        int d = den * f.den;
        return fraction( n, d );
    }
    fraction operator/ ( fraction f )
    {
        int n = num * f.den;
        int d = den * f.num;
        return fraction( n, d );
    }
    friend ostream& operator<<( ostream&, fraction& );
    friend istream& operator>>( istream&, fraction& );
    void lowterms( );
};
ostream& operator<<( ostream& s, fraction& f )
{
    s << f.num << "/" << f.den; 
    return s;
}
istream& operator>>( istream& s, fraction& f )
{ 
    s.unsetf( ios :: skipws );
    char ch;
    while( true )
    {    
       s.sync( );
 
       s >> f.num >> ch >> f.den;   
        
       if( !s.good( ) )
       { cout<<"Ошибка ввода! Нужны цифры\nВведите дробь заново: "; }
       else if( f.den == 0 )
       { cout<<"Ошибка ввода! Знаменатель не может иметь значение 0\nВведите дробь заново: "; }
       else
       { s.sync( ); s.clear( ); break; }
       s.clear( );
       s.sync( );
    }
    return s;
}
int main( )
{setlocale(LC_ALL,"rus");
 
fraction f1, f2, f3; char op;
 
    cout << "Введите первую дробь: "; cin >> f1;
    cout << "Введите оператор: "; cin >> op;
    cout << "Введите вторую дробь: "; cin >> f2;
 
switch( op )
{
case '+': f3 = f1 + f2; cout<<"Результат: "; f3.lowterms( ); cout << f3 << endl; ; break;
case '-': f3 = f1 - f2; cout<<"Результат: "; f3.lowterms( ); cout << f3 << endl; ; break;
case '*': f3 = f1 * f2; cout<<"Результат: "; f3.lowterms( ); cout << f3 << endl; ; break;
case '/': f3 = f1 / f2; cout<<"Результат: "; f3.lowterms( ); cout << f3 << endl; ; break;
default: cout <<"Неверный оператор!" << endl; system("pause");exit(1); 
}
cout<<"Программа завершена"<<endl;
 
system("pause");
return 0;
}
void fraction :: lowterms( )
{ 
    long tnum, tden, temp, gcd;
    tnum = labs( num );
    tden = labs( den );
    if( tden == 0 )
    { cout << "Недопустимый знаменатель" << endl; system("pause");exit( 1 ); }
    else if( tnum == 0 )
    { num = 0; den = 1; }
 
    while( tnum != 0 )
    {
        if( tnum < tden )
        { temp = tnum; tnum = tden; tden = temp; }
        tnum = tnum - tden;
    }
    gcd = tden;
    num = num / gcd;
    den = den / gcd;
}
Имеется вот такой РАБОЧИЙ код. Это калькулятор дробей. Вводится первая дробь, затем оператор и вторая дробь, затем выводится результат. В этом коде интересует только кусок, который отвечает за ввод данных и проверку этих данных на ошибки ( СТРОКА 46 - 66 ). Эту часть кода написал сам, но можно сказать, что методом тыка. Совершенно не понимаю как работают биты ошибок. Например в строке 52 обязательно нужна функция s.sync( ); для очистки буфера. Без этой функции вторую дробь ввести корректно будет нельзя, потому что сперва вылезет непонятно откуда взявшаяся ошибка, затем только можно будет ввести вторую дробь, хотя по идее, при вызове этой функции для ввода данных во вторую дробь буфер и так чист, потому что он, как я понимаю, отчищается после ввода первой дроби в строке 63. Расскажите, пожалуйста, как это работает?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.06.2016, 17:02     Обработка ошибок
Посмотрите здесь:

Обработка ошибок C++
Обработка исключений и ошибок C++
Обработка ошибок C++
C++ Обработка ошибок
C++ Обработка ошибок неправильного заполнения структуры tm?
C++ Чтение числа из потока и обработка ошибок
C++ Обработка ошибок в процессе написания кода
Обработка ошибок ввода C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 10:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru