Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Eragorn2013
0 / 0 / 0
Регистрация: 01.04.2016
Сообщений: 11
#1

Обработка ошибок

12.06.2016, 17:02. Просмотров 185. Ответов 0
Метки нет (Все метки)

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. Расскажите, пожалуйста, как это работает?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.06.2016, 17:02
Ответы с готовыми решениями:

обработка ошибок
Есть класс треугольника, нужно, чтобы при вводе в конструктор нулей или...

Обработка ошибок
void error(string s1, string s2) { throw runtime_error(s1 + s2); } int...

Обработка ошибок
Есть главный класс и несколько дочерних, входящих как в состав главного, так и...

Обработка ошибок
Где почитать обработку ошибок при работе с текстовыми и бинарными...

Обработка ошибок
while (1) { sh *newelem; newelem=new sh; cout&lt;&lt;&quot;Write number of the...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.06.2016, 17:02

Обработка ошибок (исключений)
Всем привет. Делаю обработку исключений и не много не допонимаю как это...

Обработка ошибок ввода
Как решить? Можете помочь 9 вариант Прочитайте правила: Правила форума Пункт...

Обработка исключений и ошибок
Я недавно начал изучать обработку ошибок try catch. И сразу появились вопросы:...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

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