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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.06.2011, 00:40   #1
Alexander1205
Пользователь
 
Аватар для Alexander1205
 
Регистрация: 22.01.2011
Сообщений: 78
По умолчанию дроби

Господа, делали лабу, задачка на дроби. С помощью дружественного класса нужно было складывать, вычитать натуральные дроби. Вроде что-то наваял(сам,честно), но у меня вопрос: можно ли сделать подобное с помощью перегрузки операторов?

Код:
#include<iostream>
#include<string.h>
using namespace std;
 
class Fract
{
private:
        int top,bottom;
public:
        Fract(int t = 0,int b = 1)
        {
                top = t;
                bottom = b;
        }
        friend class FractFriend;
};
 
 
class FractFriend
{
public:
Fract F;
public:
        void Set(int top,int bottom);
        char* GetN();
        float GetF();
        Fract Add(Fract F2);
        Fract Sub(Fract F2);
};
 
void FractFriend::Set(int top,int bottom)
{
        F.top = top;
        F.bottom = bottom;
}
float FractFriend::GetF()
{
        return (float)F.top/F.bottom;
}
Fract FractFriend::Add(Fract F2)
{
        Fract tmp;
        tmp.top=F.top*F2.bottom + F2.top*F.bottom;
        tmp.bottom = F.bottom*F2.bottom;
        return tmp;
}
Fract FractFriend::Sub(Fract F2)
{
        Fract res;
        res.top=F.top*F2.bottom - F2.top*F.bottom;
        res.bottom = F.bottom*F2.bottom;
        return res;
}
char* FractFriend::GetN()
{
        char* tmp = new char[100];
        char a[50];
        itoa(F.top,a,10);
        strcpy(tmp,a);
        strcat(tmp,"/");
        itoa(F.bottom,a,10);
        strcat(tmp,a);
        return tmp;
}
void main()
{
FractFriend F1;
F1.Set(3,4);
cout<<F1.GetN()<<" "<<"\t";
cout<<F1.GetF()<<" "<<"\t";
 
FractFriend S2;
S2.Set(1,2);
cout<<S2.GetN()<<" "<<"\t";
cout<<S2.GetF()<<" "<<"\t";
FractFriend res;
res.F = F1.Add(S2.F);
cout<<"\n\n";
cout<<" Addition result of two fractions is: "<<res.GetN()<<"\n";
res.F = F1.Sub(S2.F);
cout<<" Substruction result of two fractions is: "<<res.GetN()<<"\n";
cout<<"\n\n";
}
Alexander1205 вне форума Ответить с цитированием
Старый 10.06.2011, 00:49   #2
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Код:
Fract Add(Fract F2);
замени на
Код:
Fract operator + (Fract F2);
...
Fract FractFriend::operator + (Fract F2){
...
};
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 10.06.2011, 00:49   #3
mMAg
Форумчанин
 
Аватар для mMAg
 
Регистрация: 11.08.2009
Сообщений: 433
По умолчанию

Можно. И будет куда короче, чем нынче.

Угу, только оператор перегружай в своем Fract. А дружественный класс вообще убирается.
mMAg вне форума Ответить с цитированием
Старый 10.06.2011, 00:55   #4
Alexander1205
Пользователь
 
Аватар для Alexander1205
 
Регистрация: 22.01.2011
Сообщений: 78
По умолчанию

Спасибо, все оказалось проще, чем я себе представлял.
Alexander1205 вне форума Ответить с цитированием
Старый 10.06.2011, 00:57   #5
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Цитата:
А дружественный класс вообще убирается.
Вроде по заданию нужно с дружественным классом)
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 10.06.2011, 17:20   #6
Alexander1205
Пользователь
 
Аватар для Alexander1205
 
Регистрация: 22.01.2011
Сообщений: 78
По умолчанию

такб,чтоли?

Код:
#include<iostream>
#include<string.h>
using namespace std;

class Fract
{
private:
	int top,bottom;
public:
	Fract(int t = 0,int b = 1)
	{
		top = t;
		bottom = b;
	}
	friend class FractFriend;
};


class FractFriend
{
public:
Fract F;
public:
	void Set(int top,int bottom);
	char* GetN();
	float GetF();
	Fract operator+(Fract F2);
	Fract operator-(Fract F2);
};

void FractFriend::Set(int top,int bottom)
{
	F.top = top;
	F.bottom = bottom;
}
float FractFriend::GetF()
{
	return (float)F.top/F.bottom;
}
Fract FractFriend::operator+(Fract F2)
{
	Fract tmp;
	tmp.top=F.top*F2.bottom + F2.top*F.bottom;
	tmp.bottom = F.bottom*F2.bottom;
	return tmp;
}
Fract FractFriend::operator-(Fract F2)
{
	Fract res;
	res.top=F.top*F2.bottom - F2.top*F.bottom;
	res.bottom = F.bottom*F2.bottom;
	return res;
}
char* FractFriend::GetN()
{
	char* tmp = new char[100];
	char a[50];
	itoa(F.top,a,10);
	strcpy(tmp,a);
	strcat(tmp,"/");
	itoa(F.bottom,a,10);
	strcat(tmp,a);
	return tmp;
}
void main()
{
FractFriend F1;
F1.Set(1,2);
cout<<F1.GetN()<<" "<<"\t";
cout<<F1.GetF()<<" "<<"\t";

FractFriend S2;
S2.Set(1,2);
cout<<S2.GetN()<<" "<<"\t";
cout<<S2.GetF()<<" "<<"\t";
FractFriend res;
res.F = F1.operator+(S2.F);
cout<<"\n\n";
cout<<" Addition result of two fractions is: "<<res.GetN()<<"\n";
res.F = F1.operator-(S2.F);
cout<<" Substruction result of two fractions is: "<<res.GetN()<<"\n";
cout<<"\n\n";
}
Alexander1205 вне форума Ответить с цитированием
Старый 10.06.2011, 20:30   #7
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Ну в принципе да, хотя можно было сделать немного по-другому и поудобнее.
Например, сложение реализовать как
Код:
FractFriend FractFriend::operator + (FractFriend X){...};
И вместо
Код:
res.F = F1.operator+(S2.F);
использовать запись
Код:
res=F1+S2;
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 10.06.2011, 20:40   #8
Alexander1205
Пользователь
 
Аватар для Alexander1205
 
Регистрация: 22.01.2011
Сообщений: 78
По умолчанию

принял, благодарствую
Alexander1205 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Десятичные дроби в С ранетка Общие вопросы C/C++ 4 21.01.2010 00:08
Упрощение дроби k1r1ch Общие вопросы Delphi 2 10.10.2009 16:16
Период дроби! prosport91 Паскаль, Turbo Pascal, PascalABC.NET 0 09.06.2009 15:57
Простые дроби 4aineg Паскаль, Turbo Pascal, PascalABC.NET 5 09.12.2006 15:01