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

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

Восстановить пароль Регистрация
 
wsa
0 / 0 / 0
Регистрация: 20.05.2013
Сообщений: 202
14.01.2014, 21:59     ООП. нахождение суммы обыкновенных дробей с выделенной целой частью #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");
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.01.2014, 21:59     ООП. нахождение суммы обыкновенных дробей с выделенной целой частью
Посмотрите здесь:

Сложение обыкновенных дробей C++
нахождение среднего значения суммы дробей C++
C++ Массив. Наименьший член последовательности заменить целой частью среднего арифметического всех членов
Калькулятор для обыкновенных дробей C++
C++ найти сумму обыкновенных дробей с выделенной целой частью
C++ Заменить наименьший член последовательности целой частью среднего арифметического
Наименьший член последовательности заменить целой частью среднего арифметического всех членов C++
Выполнить перегрузку функции вычитания для обыкновенных и десятичных дробей C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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;
}
Yandex
Объявления
15.01.2014, 00:27     ООП. нахождение суммы обыкновенных дробей с выделенной целой частью
Ответ Создать тему
Опции темы

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