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

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

06.10.2014, 21:09. Просмотров 2332. Ответов 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
http://www.cyberforum.ru/cpp-beginners/thread843545.html
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.10.2014, 21:09
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Класс "Дроби" и перегрузка операторов для этого класса (C++):

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

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

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

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

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

2
zss
Модератор
Эксперт С++
6953 / 6515 / 4136
Регистрация: 18.12.2011
Сообщений: 17,184
Завершенные тесты: 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
Привет! Вот еще темы с решениями:

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

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

Класс "Прямая". Перегрузка операторов
Очень нужна ваша помощь, скоро сдавать лабораторную, а у меня затруднения.. Не...

Класс "Дата", перегрузка операторов
Доброго времени суток,многоуважаемые форумчане! Делали лабу, по перегрузке...


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

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

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