Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
Vuzy
0 / 0 / 4
Регистрация: 06.10.2014
Сообщений: 48
Завершенные тесты: 1
1

Класс "Дроби" и перегрузка операторов для этого класса

06.10.2014, 21:09. Просмотров 2592. Ответов 2
Метки нет (Все метки)

Всем Доброго времени суток.

Есть учебная задача по условиям которой необходимо реализовать класс "Дроби" и перегрузку операторов для этих классов. Что бы можно было выполнять действия: сложения, вычитания, умножения и деления.

Так же необходимо выполнять упрощение дроби что бы не было бессмысленных 20/24 и тп.

Но возникает проблема. Если упрощать то при выполнении действий итоговая дробь становится большим отрицательным числом. как решить проблему не хватает знаний и опыта.

код прилагается:
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
#include <iostream>
#include <fstream>
#include <conio.h>
#include "time.h"
using namespace std;
 
 
void main()
{
setlocale(LC_ALL, "Russian");
 
drob a(2,4);
drob b(2,6);
drob c=a+b;
 
cout << "результат сложения дроби " << a << ", с дробью " << b << " ровняется" << c << endl;
cout << "результат сложения дроби " << a << ", с дробью " << b << " ровняется" << a+b << endl;
 
cout << "результат вычитания из дроби " << a << ", дроби " << b << " ровняется" << a-b << endl;
cout << "результат умножения дроби " << a << ", на дробь " << b << " ровняется" << a*b << endl;
cout << "результат деления дроби " << a << ", на дробь " << b << " ровняется" << a/b << endl;
cout << "результат деления дроби " << b << ", на дробь " << a << " ровняется" << b/a << endl;
 
 
 
cout << "\n\n\n\t\t*** Нажмите любую клавишу что бы закончить ***";
_getch();
}
реализация класса file time.h

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
#pragma once
#define _USE_MATH_DEFINES
#include <iostream>
#include <cmath>
#include <math.h>
typedef unsigned int ui;
unsigned nod(unsigned m, unsigned n); //прототип функции НОД
 
class drob
{
private:
    int chis;
    int znam;
    /*
    void prost()
    {
        int a,b;
        a=chis;
        b=znam;
        if (nod(chis, znam)>1)
        {
            int t=nod(chis, znam);
            znam=b/t;
            chis=a/t;
        }
    }
    */
    public:
    drob(void)
    {
    chis=1;
    znam=1;
    }
    drob(int a, int b)
    {
        if(a!=0)
            chis=a;
        else
            chis=1;
        if(b!=0)
            znam=b;
        else
            znam=1;
        //prost();
    }
//  drob(drob& a)
//  {
//      a.prost();
//  }
 
 
    drob operator+(drob& a)
    {
        drob result;
        if (znam==a.znam)
        {
            result.znam=znam;
            result.chis=chis+a.chis;
        }
        else
        {
            result.znam=znam*a.znam;
            result.chis=(chis*a.znam)+(a.chis*znam);
        }
        //result.prost();
        return result;
    }
    drob operator-(drob& a)
    {
        drob result;
        if (znam==a.znam)
        {
            result.znam=znam;
            result.chis=chis-a.chis;
 
        }
        else
        {
            result.znam=znam*a.znam;
            result.chis=(chis*a.znam)-(a.chis*znam);
        }
        //result.prost();
        return result;
    }
    drob operator*(drob& a)
    {
        drob result;
        result.chis=chis*a.chis;
        result.znam=znam*a.znam;
        //result.prost();
        return result;
    }
    drob operator*(int a)
    {
        drob result;
        result.chis=chis*a;
        result.znam=znam;
        //result.prost();
        return result;
    }
    drob operator/(drob& a)
    {
        drob result;
        drob result1;
        drob result2;
        result1=drob(a.znam, a.chis);
        result2=drob(chis, znam);
        result=result1*result2;
        //result.prost();
        return result;
            
    }
    
    friend std::ostream& operator<<(std::ostream& os, drob& a)
    {
        os << a.chis << "/" << a.znam;
        return os;
    }
 
    ~drob()
    {
    }
 
};
В том виде как есть код ошибки не возвращает. если раскоментировать строки то компилится тоже без ошибок но дроби приобретают значение -8558934.

Добавлено через 2 часа 47 минут
->up
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.10.2014, 21:09
Ответы с готовыми решениями:

Перегрузка операторов для класса "множество целых чисел"
Собственно, в этом и вопрос. Как перегрузить операторы &quot;+&quot; и &quot;-&quot; для...

Перегрузка операторов (==, <<, >>, +) для класса "Денежная сумма"
Реализовать класс «Денежная сумма». Данные класса: размер суммы, код валюты,...

Перегрузка операторов для класса "Матрица"
Доброго времени суток. Помогите довести до ума код: #include &quot;stdafx.h&quot;...

Перегрузка операторов ==, !=, <, > для класса "Дробь"
Не могу найти ошибку, почему то числитель второй дроби увеличивается... Думал...

Класс "Парабола", перегрузка операторов "||" и "/"
класс: парабола y=ax^2+bx+c; Члены класса: Коэффициенты a,b,c; Методы:...

2
zss
Модератор
Эксперт С++
7250 / 6699 / 4240
Регистрация: 18.12.2011
Сообщений: 17,680
Завершенные тесты: 1
06.10.2014, 21:49 2
Похоже, ошибка в nod, код которой Вы не привели...
0
Vuzy
0 / 0 / 4
Регистрация: 06.10.2014
Сообщений: 48
Завершенные тесты: 1
06.10.2014, 21:53  [ТС] 3
Лучший ответ Сообщение было отмечено Vuzy как решение

Решение

привожу НОД:
в файле time.cpp
C++
1
2
3
4
5
6
7
#include "time.h"
 
 
unsigned nod(unsigned m, unsigned n) // функция для нахождения наибольшего общего делителя
{
    return n ? nod(n, m % n) : m;
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.10.2014, 21:53

Класс "Матрица": конструктор, деструктор и перегрузка операторов
Матрица – KMatrix Методы: конструкторы,...

Класс "динамический массив", перегрузка операторов +, =
Делаю класс динамического массива. Перегружая при этом операторы. На данный...

Класс "Точка", перегрузка операторов
не могу найти где накосячил. тестил только арифметику. при выполнении получаю...


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

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

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