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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.11.2009, 18:00   #1
JeyKip
Форумчанин
 
Регистрация: 18.09.2009
Сообщений: 133
Радость Класс "Дроби"

Всем доброе время суток!!! Помогите, пожалуйста, исправить код программы, которая задает класс "Дроби" и включает в себя операции сложения, вычитания, деления, умножения и поиск наименьшего общего знаменателя при сложении и вычитании...исходник работает, но препод говорит, что не тот принцип построения...

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

class Drobi {
private:
	int x1,y1,x2,y2;
public:
	Drobi(int a, int b, int e, int f)
	{
	x1=a;
	y1=b;
	x2=e;
	y2=f;
	}

float summa (float c, float d, float k)
{
	return (c+d)/k;
}

float raznost (float c, float d, float k)
{
	return (c-d)/k;
}

float proizv (float x1, float y1, float x2, float y2)
{
	return ((x1/y1)*(x2/y2));
}

float chastnoe (float x1, float y1, float x2, float y2)
{
	return ((x1/y1)/(x2/y2));
}
};
void main ()
{
	setlocale (0,"");
	int a,b,e,f;
	cout<<"Введите числитель первой дроби: ";
	cin>>a;
	cout<<endl;
	cout<<"Введите знаменатель первой дроби: ";
	cin>>b;
	cout<<endl;

	cout<<"Введите числитель второй дроби: ";
	cin>>e;
	cout<<endl;
	cout<<"Введите знаменатель второй дроби: ";
	cin>>f;
	Drobi A(a,b,e,f);
	cout<<endl;
int c=0;
int s1,s2;
	for (int i=1;c!=1; i++)
	{
		if ((i%b==0)&&(i%f==0))
		{
			c=1;
			s1=a*(i/b);
			s2=e*(i/f);
			cout<<"\nПервая дробь: "<<a<<"/"<<b<<"\n";
		cout<<"\nВторая дробь: "<<e<<"/"<<f<<"\n";
		cout<<"\nНаименьший общий знаменатель = "<<i<<endl;
		cout<<"\nСумма дробей = ("<<s1<<"+"<<s2<<")/"<<i<<" = "<<A.summa(s1,s2,i)<<endl; 
		cout<<"\nРазность дробей равна = ("<<s1<<"-"<<s2<<")/"<<i<<" = "<<A.raznost (s1,s2,i)<<endl;
		}
	}
	
	cout<<"\nПроизведение дробей равно = "<<A.proizv (a,b,e,f)<<endl;
	cout<<"\nЧастное дробей равно = "<<A.chastnoe (a,b,e,f)<<endl;
	getch();
}
JeyKip вне форума Ответить с цитированием
Старый 29.11.2009, 18:17   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Вероятнее всего имелось ввиду, что класс должен представляет одну единственную дробь, в то время как у вас он представляет сразу две дроби. Операции сложения, вычитания, умножения и деления скорее всего надо было делать перегрузкой соответствующих операторов(если вы такое уже проходили, естественно). То есть примерно так:
Код:
class Drobi {
    int chislitel;
    unsigned int znamenatel;
public:
    Drobi();
    Drobi(int);
    Drobi(int, unsigned int);
//  Drobi(double); // Это в общем не обязательно, но если реализуете, то, вероятно, положительно скажется на оценке :)

    Drobi operator+ (Drobi);
    Drobi operator+ (int);
//    Drobi operator+ (double);
    Drobi operator- (Drobi);
    Drobi operator- (int);
//... то же самое для *, /
Реализацию сами опишите. Должна быть возможность использовать так:
Код:
int main()
{
    Drobi n(2, 3);
    Drobi m(3, 2);

    Drobi l = m + n;
    l = l / 2;

    Drobi d(10);
    d = d * l;

    return 0;
}
Желательно также реализовать операторы *=, /=, +=, -=, а также перегрузить хотя бы оператор вывода для ostream( << ). Нахождение наименьшего общего знаменателя должно быть также методом класса, имхо.

Последний раз редактировалось netrino; 29.11.2009 в 18:31.
netrino вне форума Ответить с цитированием
Старый 30.11.2009, 00:00   #3
mishutka999
Новичок
Джуниор
 
Регистрация: 29.11.2009
Сообщений: 3
По умолчанию

Мы писали такую прогу. Вот она:

Код:
class Rational
	{int a,b; //a-числитель b-знаменатель//
public: 
		Rational (int=0, int=1);
		Rational Add (const Rational&) const;
		Rational Sub (const Rational&) const;
		Rational Mult (const Rational&) const;
		Rational Div (const Rational&) const;
		void Print () const;
		void Change (int,int);
private:
	int Nod (int, int) const;
};
Код:
Rational::Rational (int chislit, int znamenat)
	{a=chislit;
	if(znamenat)
		b=znamenat;
	else
		{cout<<"Ne mogu podelit na ZERO"<<endl;
		exit(1);}
	}
Rational Rational::Add (const Rational&s) const
	{
	int c;
	Rational Sum;
	Sum.a=a*s.b+b*s.a;
	Sum.b=b*s.b;
	if (Sum.a>Sum.b)
		c=Nod (Sum.b, Sum.a);
	else
	c=Nod (Sum.b, Sum.a);
	Sum.a=Sum.a/c;
	Sum.b=Sum.b/c;
	return Sum;
	}

Rational Rational::Sub (const Rational&s) const
	{
	int c;
	Rational Sum;
	Sum.a=a*s.b-b*s.a;
	Sum.b=b*s.b;
	if (Sum.a>Sum.b)
		c=Nod (Sum.b, Sum.a);
	else
	c=Nod (Sum.b, Sum.a);
	Sum.a=Sum.a/c;
	Sum.b=Sum.b/c;
	return Sum;
	}

Rational Rational::Mult (const Rational&s) const
	{
	int c;
	Rational Sum;
	Sum.a=a*s.a;
	Sum.b=b*s.b;
		if (Sum.a>Sum.b)
		c=Nod (Sum.b, Sum.a);
	else
	c=Nod (Sum.b, Sum.a);
	Sum.a=Sum.a/c;
	Sum.b=Sum.b/c;
	return Sum;
	}

Rational Rational::Div (const Rational&s) const
	{
	int c;
	Rational Sum;
	Sum.a=a*s.b;
	Sum.b=b*s.a;
	if  (s.a==0)
		{cout<<"nelzia delit na Zero"<<endl;
		exit (1);};
	if (Sum.a>Sum.b)
		c=Nod (Sum.b, Sum.a);
	else
	c=Nod (Sum.b, Sum.a);
	Sum.a=Sum.a/c;
	Sum.b=Sum.b/c;
	return Sum;
	}
void Rational::Print () const
	{cout<<a<<"/"<<b<<endl;}
void Rational::Change (int d, int e)
	{int f;
	a=d;
	if (e)
		b=e;
	else
	{cout<<"ne mogu delit na zero"<<endl;
	exit (1);};
	if (a>b)
		f=Nod(a,b);
	else 
		f=Nod(b,a);
	a=a/f;
	b=b/f;
	}

int Rational::Nod (int c, int d) const
	{
	if (d==0)
		return c;
	if (c%d==0)
	return 1;
	return Nod (d, c%d);
	}
Код:
int main ()
{
	Rational R1 (7,11), R2 (0,7), R3;
R3=R1.Add(R2);
R1.Print();
R2.Print();
R3.Print();

R3=R1.Sub(R2);
R3.Print();
R3=R2.Sub(R1);
R3.Print();
R3=R1.Mult(R2);
R3.Print();
R3=R1.Div(R2);
R3.Print();



return 0;
}
mishutka999 вне форума Ответить с цитированием
Старый 16.01.2010, 22:19   #4
ahab
Пользователь
 
Регистрация: 22.07.2009
Сообщений: 17
По умолчанию

во всех функциях-членах в роли параметра
Цитата:
const Rational&s
обьясните пож. почему именно в таком виде? где об этом можно поподробней почитать?
мы в универе тоже делали класс дробь, перегружали операторы, и тоже параметр такого вида, но что-то не пойму почему такого? что и как
спасибо
ahab вне форума Ответить с цитированием
Старый 16.01.2010, 22:30   #5
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

& указывает, что нам нужна ссылка на объект, а не копия объекта(чтобы не тратить времени на копирование), а const говорит, что объект по этой ссылке менять нельзя. Если не будет const, то действия над объектом по ссылке смогут изменить его состояние(поля) и эту ошибку трудно будет отловить
netrino вне форума Ответить с цитированием
Старый 16.01.2010, 23:25   #6
ahab
Пользователь
 
Регистрация: 22.07.2009
Сообщений: 17
По умолчанию

?
в общем как следствие выполнения функции-члена, эта самая функция возращает константную сслыку (допустим) &s типа Rational (наш класс дробь)
???
спасибо
ahab вне форума Ответить с цитированием
Старый 16.01.2010, 23:27   #7
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от ahab Посмотреть сообщение
?
в общем как следствие выполнения функции-члена, эта самая функция возращает константную сслыку (допустим) &s типа Rational (наш класс дробь)
???
спасибо
Нет, константную ссылку метод принимает в качестве параметра, возвращает он новый объект.
Принимает ссылкой, чтобы работало быстрее, константной, чтобы нигде случайно не изменить объект, что по ссылке.
netrino вне форума Ответить с цитированием
Старый 16.01.2010, 23:29   #8
ahab
Пользователь
 
Регистрация: 22.07.2009
Сообщений: 17
По умолчанию

точно )
тормознул, спасибо огромное
ahab вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04
блок "cont" с права не принимает значение "margin: 10px;" которое описано в body tabikA HTML и CSS 5 24.02.2009 21:50
Под прикрытием "кризиса" наши доблестные "управители" хотят утопить нас в радиоактивных отходах mihali4 Свободное общение 1 17.01.2009 01:43
если пользователь наберет какой-то другой символ не "y" или "n" и нажмет enter, программа проигнорирует skobets Общие вопросы C/C++ 2 03.06.2008 06:51
Класс "векторные операции" для трехмерных векторов. Студентка@ Помощь студентам 1 30.01.2008 19:21