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

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

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

ООП. нахождение суммы обыкновенных дробей с выделенной целой частью - C++

14.01.2014, 21:59. Просмотров 641. Ответов 1
Метки нет (Все метки)

Неправильно высчитывает сумму. что не так? помогите. само задание такое. написать класс, реализующий понятия обыкновенных дробей с выделенной целой частью. Найти их сумму. перегрузка суммы. конструктор, деструктор.
C++ (Qt)
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#include <iostream>
#include <ostream>
#include <locale>
#include <conio.h>
using namespace std;
 
class Rational 
{
int ch;
int a;
int b;
public:
Rational(){ch=0; a = 0; b = 0;} // Конструктор по умолчанию
Rational(const int& _ch, const int& _a, const int& _b) // Конструктор с данными
{
  ch=_ch;
  if (_b<0)
     exit(1);
     a = _a;
  if (_b)
     b = _b;
  else
     exit(1);
     reduce();
}
Rational operator+( Rational T)
{
   Rational Temp;
   Temp.a=(Temp.ch*Temp.b)+Temp.a;
   if( this->b == T.b )
   {
       Temp.a = this->a + T.a;
       Temp.b = this->b;
   }
   else
   {
       Temp.b = this->b * T.b;
       Temp.a = (Temp.b / this->b * this->a ) + (Temp.b / T.b * T.a );
   }
   Temp.reduce();
   return Temp;
}
 
// Нахождение НОДа
int NOD(const int& a1,const int& b1)
{
   int a = abs(a1), b = abs(b1);
   while(a!=0 && b!=0)
   {
   if (a>=b)
      a = a%b;
   else
      b = b%a;
   }
   return a+b;
}
// Сокращение дроби
void Rational::reduce()
{
     int nod = NOD(a,b);
     a = a/nod;
     b = b/nod;
}
 
// Перегрузка оператора cin
friend istream& operator» (istream& istr, Rational& b)
{
    char* str = new char [1024];
    cin.getline(str, sizeof(str));
    int i = 0;
    unsigned int bt = 0;
    bool flag = false;
l1:
    int len = strlen(str)-1;
    while (str[len]==' ')
    {
        str[len] = NULL;
        goto l1;
    }
    if (strlen(str)==0)
        exit(1);
    while (str[i]==' ')
        ++i;
    if (str[i]=='-')
    {
        flag = true;
        ++i;
    }
    while (str[i]!='.' && str[i]!='/' && i<(int)strlen(str))
    {
        bt = (str[i] - '0') + bt*10;
        ++i;
    }
    ++i;
    switch (str[i-1]){
    case '.': {
        int j = 0;
        while (i<(int)strlen(str))
        {
            bt = (str[i] - '0') + bt*10;
            ++i, ++j;
        } 
        b.b = int(pow(10.0,j));
        break;
              }
    case '/': {
        b.b = 0;
        while (i<(int)strlen(str))
        {
            b.b = (str[i]-'0') + b.b*10;
            ++i;
        }
        break;
              }
    }
    b.a = flag ? -int(bt) : bt;
    b.reduce();
    return istr;
}
 
// Перегрузка оператора сout
friend ostream& operator << (ostream &out, Rational& drob)
{
    drob.ch=drob.a/drob.b;
    if (drob.b== 1 || drob.a == 0)
        out << drob.a+drob.ch;
    else 
        out << drob.ch << '('<< drob.a-(drob.ch*drob.b)<< '/' << drob.b <<')';
    return out;
}
};
 
 
void main()
{
    int s,d,f;
    int l,k,m;
    setlocale(LC_ALL,"Russian");
    cout <<"Введите целую часть первой дроби: ";
    cin >> s;
    cout <<"Введите числитель первой дроби: ";
    cin >> d;
    cout <<"Введите знаменатель первой дроби: ";
    cin >> f;
 
    Rational A(s,d,f);
    Rational Result;
    cout <<"Введите целую часть второй дроби: ";
    cin >> l;
    cout <<"Введите числитель второй дроби: ";
    cin >> k;
    cout <<"Введите знаменатель второй дроби: ";
    cin >> m;
    
    Rational B(l,k,m);
    cout << "A" <<" + "<< "B" <<" = " << A+B << endl;
    system ("pause");
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.01.2014, 21:59
Я подобрал для вас темы с готовыми решениями и ответами на вопрос ООП. нахождение суммы обыкновенных дробей с выделенной целой частью (C++):

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

нахождение среднего значения суммы дробей - C++
Здравствуйте! Дело такое, нужно, имея класс fraction с 2мя полями int nominator, int denominator ( числитель / знаменатель) соответственно,...

Сложение обыкновенных дробей - C++
Две дроби a/b и c/d можно сложить следующим образом: a/b + c/d = (a*d + b* c)/(b*d) Например, 1/4 + 2/3 = (1*3 + 4*2)/4*3 = 11/12 ...

Калькулятор для обыкновенных дробей - C++
Не компилируется( #include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; class Calc

Вывод чисел в виде обыкновенных дробей - C++
Как осуществить вывод чисел в виде обыкновенных дробей в С++?

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

1
Dzzirt
0 / 0 / 0
Регистрация: 14.01.2014
Сообщений: 6
15.01.2014, 00:27 #2
Вот рабочая программа с перегруженными операциями +, -, *, /, == и !=
Для твоей задачи тебе нужно модифицировать конструктор( добавить дополнительный параметр ) и методы setRational() и printRational()
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
// Rational.h
#ifndef RATIONAL_H
#define RATIONAL_H
 
class Rational
{
public:
    Rational( int num = 1, int denum = 1 );
    void setRational( int, int );
    Rational operator+( const Rational & ) const;
    Rational operator-( const Rational & ) const;
    Rational operator*( const Rational & ) const;
    Rational operator/( const Rational & ) const;
    bool operator==( const Rational & ) const;
    bool operator!=( const Rational &right ) const
    {
        return !( *this == right ); // invokes Rational::operator==
    } // end function operator!=
    bool operator>( const Rational & ) const;
    bool operator<( const Rational & ) const;
    void printRational();
    void printRationalFloat();
    //function greatest common divisor
    int gcd( );
    //function greatest common divisor
    int gcd( int, int );
private:
    int numerator;
    int denumerator;
     
 
};
 
#endif // RATIONAL_H_INCLUDED
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
// Rational.cpp
#include <iostream>
#include <stdexcept>
#include "Rational.h"
 
using namespace std;
 
Rational::Rational( int num, int denum )
{
    setRational( num, denum );
}
 
void Rational::setRational( int num, int denum )
{
    if ( denum > 0 )
    {
        int commonDiv = gcd(denum ,  num);
        numerator = num / commonDiv;
        denumerator = denum / commonDiv;
    }
    else
        throw invalid_argument ( "Denumerator must be greater than 0");
    }
 
Rational Rational::operator+( const Rational &op2 ) const
{
    Rational temp;
    temp.denumerator = denumerator * op2.denumerator;
    temp.numerator = numerator * op2.denumerator + op2.numerator * denumerator;
 
    int commonDiv = temp.gcd( );
    temp.denumerator = temp.denumerator / commonDiv;
    temp.numerator = temp.numerator / commonDiv;
 
    return temp;
}
 
Rational Rational::operator-( const Rational &op2 ) const
{
    Rational temp;
    temp.denumerator = denumerator * op2.denumerator;
    temp.numerator = numerator * op2.denumerator - op2.numerator * denumerator;
 
    int commonDiv = temp.gcd( );
    temp.denumerator = temp.denumerator / commonDiv;
    temp.numerator = temp.numerator / commonDiv;
 
    return temp;
}
 
Rational Rational::operator*( const Rational &op2 ) const
{
    Rational temp;
    temp.denumerator = denumerator * op2.denumerator;
    temp.numerator = numerator * op2.numerator;
 
    int commonDiv = temp.gcd( );
    temp.denumerator = temp.denumerator / commonDiv;
    temp.numerator = temp.numerator / commonDiv;
 
    return temp;
}
 
Rational Rational::operator/( const Rational &op2 ) const
{
    Rational temp;
    temp.denumerator = denumerator * op2.numerator;
    temp.numerator = numerator * op2.denumerator;
 
    int commonDiv = temp.gcd( );
    temp.denumerator = temp.denumerator / commonDiv;
    temp.numerator = temp.numerator / commonDiv;
 
    return temp;
}
 
void Rational::printRational()
{
        cout << numerator << " / " << denumerator << endl;
}
 
void Rational::printRationalFloat()
{
    cout << static_cast<double>( numerator / denumerator ) << endl;
}
 
    // recursive function greatest common divisor
int Rational::gcd( int denum, int num )
{
  if ( num == 0 )
        return denum;
  return gcd( num, denum % num );
}
 
int Rational::gcd( )
{
  if ( numerator == 0 )
        return denumerator;
  return gcd( numerator, denumerator % numerator );
}
 
bool Rational::operator==( const Rational &right ) const
{
    if ( numerator * right.denumerator == right.numerator * denumerator )
        return true;
    else
        return false;
}
 
bool Rational::operator>( const Rational &right ) const
{
    if ( numerator * right.denumerator > right.numerator * denumerator )
        return true;
    else
        return false;
}
 
bool Rational::operator<( const Rational &right ) const
{
    if ( numerator * right.denumerator < right.numerator * denumerator )
        return true;
    else
        return false;
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.01.2014, 00:27
Привет! Вот еще темы с ответами:

Выполнить перегрузку функции вычитания для обыкновенных и десятичных дробей - C++
Написать перегруженные функции и основную программу, которая их вызывает. а) для вычитания десятичных дробей; б) для вычитания...

Выполнить перегрузку функции вычитания для обыкновенных и десятичных дробей - C++
Написать перегруженные функции и основную программу, которая их вызывает. а) для деления десятичных дробей; б) для деления обыкновенных...

Заменить наименьший член последовательности целой частью среднего арифметического - C++
Всем привет. Такая проблема, написал програмку, но работает некорректно, т.е она в среднем арифм не берет целую часть и еще не заменяет...

Наименьший член последовательности заменить целой частью среднего арифметического всех ее членов - C++
Помогите сделать задачу. Нужно сделать её через конструктор и диструктор пробовал сделать но не выходит. Дана последовательность целых...


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

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

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