Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.05.2010, 17:37   #1
Fataller
Пользователь
 
Регистрация: 04.03.2009
Сообщений: 62
По умолчанию Перегрузка операций для класса дробей

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

Код:
#include<stdio.h>
#include<math.h>
#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
 
class drob
{
        private:
        int chisl, znam;
        public:
        drob(){};
        drob(int chisl0, int znam0)
        {
                chisl=chisl0;
                znam=znam0;
        }
        ~drob()
        {
                printf("\n Destructor dlya drob");
        }
 
        void sokr()
        {
                int N=0;
                if (chisl>znam) N=znam; else N=chisl;
                for (int i=N; i>0; i--)
                {
                        if ((fmod(chisl,i)==0)&&(fmod(znam,i)==0))
                        {
                                chisl=chisl/i;
                                znam=znam/i;
                        }
                }
        }
 
        void show()
        {
                printf("\ndrob %d/%d",chisl, znam);
        }
 
        drob operator+(drob d) 
        {
                int buf;
                if (znam!=d.znam) 
                {
                        buf=znam;
                        znam=znam*d.znam;
                        chisl=chisl*d.znam;
                        d.chisl=d.chisl*buf;
                        d.znam=znam;
                }
                int x=chisl-d.chisl;
                return drob(x,znam);
        }
 
        
        drob operator-(drob d)
        {
                int buf;
                if (znam!=d.znam) 
                {
                        buf=znam;
                        znam=znam*d.znam;
                        chisl=chisl*d.znam;
                        d.chisl=d.chisl*buf;
                        d.znam=znam;
                }
                int x=chisl-d.chisl;
                return drob(x,znam);
        }
 
        drob operator*(drob d)
        {
                int x=chisl*d.chisl;
                int y=znam*d.znam;
                return drob(x,y);
        }
 
        drob operator/(drob d)
        {
                int x=chisl*d.znam;
                int y=znam*d.chisl;
                return drob(x,y);
        }
};
 
int main()
{
        drob dr1(9,6);
        drob dr2(4,5);
        drob dr3=dr1+dr2;
        dr3.show();
        dr3=dr1-dr2;
        dr3.show();
        return 0;
}
Fataller вне форума Ответить с цитированием
Старый 23.05.2010, 17:42   #2
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Сделайте проще:
Код:
        drob operator-(drob d)
        {
                drob dd = d;
                dd.chisl *= -1;
                return *this + dd;
        }
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 23.05.2010, 18:37   #3
Fataller
Пользователь
 
Регистрация: 04.03.2009
Сообщений: 62
По умолчанию

Это все равно не помогает, проблема в чем то другом. Проверьте те результаты, которые выводятся.
Fataller вне форума Ответить с цитированием
Старый 24.05.2010, 10:43   #4
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

Оператор - Гром правильно перегрузил, а вот оператор присваивания думаю лучше сделать так:
Код:
        drob operator+(drob d) 
        {
                drob dd = d;
                drob fd(chisl, znam);
                int buf;
                if (fd.znam!=dd.znam) 
                {
                        buf=fd.znam;
                        fd.znam=fd.znam*dd.znam;
                        fd.chisl=fd.chisl*dd.znam;
                        dd.chisl=dd.chisl*buf;
                        dd.znam=fd.znam;
                }
                fd.chisl -= dd.chisl;
                return fd;
        }
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.
mrChester вне форума Ответить с цитированием
Старый 29.05.2010, 18:08   #5
Fataller
Пользователь
 
Регистрация: 04.03.2009
Сообщений: 62
По умолчанию

Спасибо, помогло.
Fataller вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
перегрузка операций nastya081108 Помощь студентам 0 18.05.2010 21:16
Перегрузка стандартных операций Новичек_Rudik Помощь студентам 1 19.04.2010 23:32
перегрузка операций в си++ Serjuk Общие вопросы C/C++ 9 20.03.2010 21:30
С++ перегрузка операций для шаблонного класса TIN Помощь студентам 7 29.03.2009 15:24