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

преобразование к типу double (класс рациональных дробей)

15.08.2016, 11:41. Просмотров 302. Ответов 1

Имеется класс рациональных дробей (чтоб код лишним не нагружать оставил только перегрузки операций сложения дробей и чисел). все работает и компилирует без ошибок, но при перегрузке операции приведения типа, вылазиют предупреждения, хотя и запускается и работает исправно

source.cpp
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
#include <iostream>
#include <conio.h>
#include "ComplexNumber.h"
 
using namespace::std;
 
int main() {
    setlocale(LC_ALL, "Russian");
 
    cout << "\n\n\tТест калькулятора рациональных чисел\n" << endl;
 
    RationalNumber rn1(-5,4);
    RationalNumber rn2(7,3);
    RationalNumber rn3(-4,2);
 
    cout << rn1 << endl;
    cout << rn2 << endl;
    cout << rn3 << endl;
 
    cout << "\nСложение:" << endl;
    cout << rn1 << " + " << rn2 << " = " << rn1+rn2 << endl;
    cout << rn1 << " + " << 3 << " = " << rn1+3 << endl;
    cout << 3 << " + " << rn1 << " = " << 3+rn1 << endl;
 
    cout << "\n Преобразование: " << endl;
    cout << rn1 << " = " << (double)rn1 << endl;
    cout << rn2 << " = " << (double)rn2 << endl;
 
 
    _getch();
    return 0;
}
ComplexNumber.h
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
#pragma once
#include <iostream>
#include <cmath>
 
//класс рациональных чисел
class RationalNumber
{
private:
    int numerator;
    int denumerator;
    void Reduction();
public:
    RationalNumber();
    RationalNumber(int,int);
    friend std::ostream& operator<<(std::ostream&, RationalNumber); //вывод (если надо, преобразует)
    friend int NOD(int, int);
    friend int NOK(int, int);
 
    RationalNumber operator+(const RationalNumber) const;   //сложение двух дробей
    RationalNumber operator+(const int);    //сложение дроби и числа
    friend const RationalNumber operator+(const int, RationalNumber);   //число плюс дробь
 
    operator double();
};
ComplexNumber.cpp
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
#include "ComplexNumber.h"
 
RationalNumber::RationalNumber() {
    numerator = 0;
    denumerator = 1;
}
 
RationalNumber::RationalNumber(int a, int b) {
    if(b != 0) {
        numerator = a;
        denumerator = b;
        Reduction();
    }
}
 
int NOD(int a, int b) {
 
    while(a && b) {
        if(a >= b) a %= b;
        else b %= a;
    }
 
    if(b) return b;
    else if (a) return a;
}
 
int NOK(int a, int b) {
    int nok = 1;
    while((nok%a != 0) || (nok%b != 0))
        nok++;
 
    #ifdef DEBUG
    std::cout << "nok = " << nok << std::endl;
    #endif
 
    return nok;
}
 
 
void RationalNumber::Reduction() {
    int a = abs(numerator),
    b = abs(denumerator);
 
    numerator /= NOD(a,b);
    denumerator /= NOD(a,b);
 
 
}
 
std::ostream& operator<<(std::ostream& os, RationalNumber rn) {
    if((rn.numerator % rn.denumerator) == 0)
        os << rn.numerator/rn.denumerator;
 
    else {
        if(rn.numerator < 0 && rn.denumerator < 0)
            os << -rn.numerator << "/" << -rn.denumerator;
        else
            os << rn.numerator << "/" << rn.denumerator;
 
    }
 
    return os;
}
 
RationalNumber RationalNumber::operator+(const RationalNumber rn) const {
    RationalNumber result;
    int a = abs(denumerator), b = abs(rn.denumerator);
    result.denumerator = NOK(a, b);
 
    result.numerator = numerator*(result.denumerator/denumerator) + rn.numerator*(result.denumerator/rn.denumerator);
 
    return result;
}
 
RationalNumber RationalNumber::operator+(const int N) {
    return RationalNumber(numerator+N*denumerator, denumerator);
}
 
const RationalNumber operator+(const int N, RationalNumber rn) {
    return rn+N;
}
 
RationalNumber::operator double() {
    return (double)numerator/denumerator;
}
Список предупреждений:
Кликните здесь для просмотра всего текста
d:\mingw-w64\mingw32\bin>g++ D:\programming\cpp\denmarkov\lesson21\test\source.cpp D:\programming\cpp\denmarkov\lesson21\test\complexnumber.cpp -o test.exe
D:\programming\cpp\denmarkov\lesson21\test\source.cpp: In function 'int main()':
D:\programming\cpp\denmarkov\lesson21\test\source.cpp:21:46: warning: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second:
cout << rn1 << " + " << rn2 << " = " << rn1+rn2 << endl;
^
In file included from D:\programming\cpp\denmarkov\lesson21\test\source.cpp:3:0:
D:\programming\cpp\denmarkov\lesson21\test\ComplexNumber.h:19:17: note: candidate 1: RationalNumber RationalNumber::operator+(RationalNumber) const
RationalNumber operator+(const RationalNumber) const; //ёыюцхэшх фтєї фЁюсхщ
^
D:\programming\cpp\denmarkov\lesson21\test\ComplexNumber.h:20:17: note: candidate 2: RationalNumber RationalNumber::operator+(int)
RationalNumber operator+(const int); //ёыюцхэшх фЁюсш ш ўшёыр

По отдельности таких проблем не возникает. мб это и не важно, но все равно неприятно, хотелось бы выяснить, что не так
компилятор g++, ооп изучать только начал
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.08.2016, 11:41
Ответы с готовыми решениями:

Класс рациональных дробей
Написать пользоват. тип рациональных дробей. Внутреннее представление типа: int a, b; должно быть...

Разработать класс рациональных дробей
азработать класс рациональных дробей. Предусмотреть в нём все методы, которые необходимы, чтобы...

Матрица рациональных дробей
П.5.4.Правил Запрещено создавать темы с бессмысленными названиями вроде &quot;Помогите!&quot;, &quot;Вопрос&quot; и...

Калькулятор рациональных дробей
Первая программа принимает от пользователя три строки, (первая и третья строки – это правильные...

Усовершенствованный калькулятор рациональных дробей
Добавил операторы сравнения и равно, всё скомпилировалось, ровно работает, при добавлении &lt;=,&gt;=,!=...

1
hoggy
Эксперт С++
7096 / 3143 / 648
Регистрация: 15.11.2014
Сообщений: 7,217
Завершенные тесты: 1
15.08.2016, 13:00 2
Цитата Сообщение от DannyConnor Посмотреть сообщение
мб это и не важно, но все равно неприятно
если в кратце, то компилятор сблевал от говнокода предупреждает,
что в коде мина замедленного действия.

лекарство:
http://rextester.com/NRAM99172

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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#include <iostream>
#include <cassert>
#include <cmath>
 
//класс рациональных чисел
class RationalNumber
{
private:
    int numerator;
    int denumerator;
    void Reduction();
public:
    RationalNumber();
    RationalNumber(int,int);
    friend std::ostream& operator<<(std::ostream&, const RationalNumber&); //вывод (если надо, преобразует)
    friend int NOD(int, int);
    friend int NOK(int, int);
 
    RationalNumber operator+(const RationalNumber&) const;   //сложение двух дробей
    RationalNumber operator+(const int)const;    //сложение дроби и числа
    friend RationalNumber operator+(const int, const RationalNumber&);   //число плюс дробь
 
    operator double()const;
};
 
RationalNumber::RationalNumber()
    : numerator()
    , denumerator(1)
{}
 
RationalNumber::RationalNumber(int a, int b) {
    if(b != 0) {
        numerator = a;
        denumerator = b;
        Reduction();
    }
    else{
        assert(0 && "fuck of and die!");
    }
}
 
int NOD(int a, int b) {
 
    while(a && b) {
        if(a >= b) a %= b;
        else b %= a;
    }
 
    if(b) 
        return b;
    else if (a) 
        return a;
    else {
        assert(0 && "fuck off and die!");
        return 0;
    }
        
        
}
 
int NOK(int a, int b) {
    int nok = 1;
    while((nok%a != 0) || (nok%b != 0))
        nok++;
 
    #ifdef DEBUG
    std::cout << "nok = " << nok << std::endl;
    #endif
 
    return nok;
}
 
 
void RationalNumber::Reduction() {
    int a = abs(numerator),
    b = abs(denumerator);
 
    numerator /= NOD(a,b);
    denumerator /= NOD(a,b);
 
 
}
 
std::ostream& operator<<(std::ostream& os, const RationalNumber& rn) {
    if((rn.numerator % rn.denumerator) == 0)
        os << rn.numerator/rn.denumerator;
 
    else {
        if(rn.numerator < 0 && rn.denumerator < 0)
            os << -rn.numerator << "/" << -rn.denumerator;
        else
            os << rn.numerator << "/" << rn.denumerator;
 
    }
 
    return os;
}
 
RationalNumber RationalNumber::operator+(const RationalNumber& rn) const {
    RationalNumber result;
    int a = abs(denumerator), b = abs(rn.denumerator);
    result.denumerator = NOK(a, b);
 
    result.numerator = numerator*(result.denumerator/denumerator) + rn.numerator*(result.denumerator/rn.denumerator);
 
    return result;
}
 
RationalNumber RationalNumber::operator+(const int N)const {
    return RationalNumber(numerator+N*denumerator, denumerator);
}
 
RationalNumber operator+(const int N, const RationalNumber& rn) {
    return rn + N;
}
 
RationalNumber::operator double()const {
    return (double)numerator/denumerator;
}
 
#include <iostream>
 
 
using namespace::std;
 
int main() {
    setlocale(LC_ALL, "Russian");
 
    cout << "\n\n\tТест калькулятора рациональных чисел\n" << endl;
 
    RationalNumber rn1(-5,4);
    RationalNumber rn2(7,3);
    RationalNumber rn3(-4,2);
 
    cout << rn1 << endl;
    cout << rn2 << endl;
    cout << rn3 << endl;
 
    cout << "\nСложение:" << endl;
    cout << rn1 << " + " << rn2 << " = " << rn1+rn2 << endl;
    cout << rn1 << " + " << 3 << " = " << rn1+3 << endl;
    cout << 3 << " + " << rn1 << " = " << 3+rn1 << endl;
 
    cout << "\n Преобразование: " << endl;
    cout << rn1 << " = " << (double)rn1 << endl;
    cout << rn2 << " = " << (double)rn2 << endl;
}
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.08.2016, 13:00

Олимпиадное задание "Калькулятор рациональных дробей"
Калькулятор рациональных дробей (выполнение операций сложения, вычитания, умножения, деления).

Класс: Создать класс дробь - рациональных чисел, являющихся отношением двух целых чисел...
Создать класс дробь - рациональных чисел, является отношением двух целых чисел. Определить...

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


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

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

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