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

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

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

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

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

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

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

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

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

Чтение числа из потока и обработка ошибок - C++
Есть поток. Из потока читается число. При чтении происходит сбой. Как узнать что конкретно сбойнуло (число слишком большое/это не число/в...

Обработка ошибок неправильного заполнения структуры tm? - C++
Это простой вопрос. Допустим такой код: void main(){ int day=31, mon=5,year=82; time_t seconds = time(NULL); tm* timeinfo =...

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


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

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

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