Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Eragorn2013
0 / 0 / 0
Регистрация: 01.04.2016
Сообщений: 11
#1

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

12.06.2016, 17:02. Просмотров 175. Ответов 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
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Обработка ошибок (C++):

Обработка ошибок - C++
Есть главный класс и несколько дочерних, входящих как в состав главного, так и друг в друга (не важно) Нужно в другой класс передать члена...

Обработка ошибок - C++
void error(string s1, string s2) { throw runtime_error(s1 + s2); } int main() { setlocale(LC_ALL, &quot;ru&quot;); try { ...

обработка ошибок - C++
Есть класс треугольника, нужно, чтобы при вводе в конструктор нулей или минусовых значений вместо сторон, выдавало ошибку,получается...

Обработка ошибок - C++
while (1) { sh *newelem; newelem=new sh; cout&lt;&lt;&quot;Write number of the car&quot;&lt;&lt;&quot;\n&quot;; s=getch(); if (s=='*') ...

Обработка ошибок - C++
Где почитать обработку ошибок при работе с текстовыми и бинарными файлами(считывание и запись),не в теории а конкретно на примерах...

Обработка ошибок ввода - C++
Доброго времени суток. Имеется код который я написал для обработки ошибок ввода: #include &lt;iostream&gt; #include &lt;cctype&gt; #include...

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

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

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

Обработка ошибок ввода - C++
Как решить? Можете помочь 9 вариант Прочитайте правила: Правила форума Пункт 5.18: Запрещено размещать задания и решения в виде...

Обработка ошибок cin (тип bool) - C++
Доброго времени суток. Собственно, проблема. Надо поймать все ошибки при вводе в тип bool: буквы, ентеры, пробелы, цифры, отличные от 0 и...


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

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

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