Лидеры рейтинга

ID: 401284

Михаил Александров

Советник

376

Россия, Санкт-Петербург


ID: 259041

Алексеев Владимир Николаевич

Мастер-Эксперт

357

Россия, пос. Теплоозёрск, ЕАО


ID: 401888

puporev

Профессор

215

Россия, Пермский край


ID: 405338

vovaromanov.jr

1-й класс

125


ID: 400669

epimkin

Профессионал

111


ID: 242862

Hunter7007

Мастер-Эксперт

29

Россия, Омск


ID: 137394

Megaloman

Мастер-Эксперт

25

Беларусь, Гомель


8.10.2

13.10.2021

JS: 2.10.2
CSS: 4.6.0
jQuery: 3.6.0
DataForLocalStorage: 2021-10-20 22:46:01-standard


Создание программ на языках C и C++.

Администратор раздела: CradleA (Мастер-Эксперт)

Консультация онлайн # 160214

Раздел: С / С++
Автор вопроса: Bvif fvif ivbif
Дата: 11.02.2009, 17:30 Консультация закрыта
Поступило ответов: 1

Добрый вечер! Помогите пожалуйста решить задачу.
Постановка задачи
: Создайте класс Rational,воплощающий абстракцию рациональных чисел,представляемых в виде дробей с числителем(numerator) и знаменателем(denominator).Инкапсулируйте в классе Rational функции-члены класса, реализующие основные действия над рациональными числами (+,-,умножение и деление). Не забудьте о необходимости сокращения дробей в ходе вычислений. Определите функцию печати рационального числа. Продумайте способ задания рационального числа,представляемого переменными-членами класса(нужно ли ограничить доступ к ним извне?).Какие еще методы класса Вы могли бы предложить? Напишите тестирующую программу для проверки спроектированного класса.
Сколько это будет стоить?

Ответ # 243425 от Micren
Здравствуйте, Bvif fvif ivbif!
Вот Ваш класс:
Код
#include <iostream>
#include <exception>

using namespace std;

// НОД
int nod(int a, int b);	

class rational
{
private:
	int _numerator;
	int _denominator;
	// Нормализация дроби
	void normalize(void);
public:
	// Класс-исключение числитель равен 0
	class zerodenom:exception{};
	// Конструктор
	rational(int numerator=0, int denominator=1);
	// Опрератор сложения
	friend rational operator+(const rational& r1,const rational& r2);
	rational& operator+=(const rational& r);
	// Опрератор вычитания
	friend rational operator-(const rational& r1,const rational& r2);
	rational& operator-=(const rational& r);
	// Опрератор умножения
	friend rational operator*(const rational& r1,const rational& r2);
	rational& operator*=(const rational& r);
	// Опрератор деления
	friend rational operator/(const rational& r1,const rational& r2);
	rational& operator/=(const rational& r);
	// Операторы сравнения
	friend bool operator==(const rational& r1,const rational& r2);
	friend bool operator!=(const rational& r1,const rational& r2);
	friend bool operator<(const rational& r1,const rational& r2);
	friend bool operator<=(const rational& r1,const rational& r2);
	friend bool operator>(const rational& r1,const rational& r2);
	friend bool operator>=(const rational& r1,const rational& r2);
	// Оператор вывода
	friend ostream& operator<<(ostream& stream,const rational& r);
};

int main()
{
	rational A(2,4),B(30,50);
	cout<<"A="<<A<<endl;
	cout<<"B="<<B<<endl;
	cout<<"(A==B)="<<boolalpha<<(A==B)<<endl;
	cout<<"(A!=B)="<<(A!=B)<<endl;
	cout<<"(A<B)="<<(A<B)<<endl;
	cout<<"(A>B)="<<(A>B)<<noboolalpha<<endl;
	cout<<"A+B="<<A+B<<endl;
	cout<<"3+A="<<3+A<<endl;
	cout<<"(B+=4)="<<(B+=4)<<endl;
	cout<<"A-B="<<A-B<<endl;
	cout<<"8-B="<<8-B<<endl;
	cout<<"(B-=4)="<<(B-=4)<<endl;
	cout<<"A*B="<<A*B<<endl;
	cout<<"5*A="<<5*A<<endl;
	cout<<"(B*=10)="<<(B*=10)<<endl;
	cout<<"A/B="<<A/B<<endl;
	cout<<"5/B="<<5/B<<endl;
	cout<<"(B/=10)="<<(B/=10)<<endl;
	system("PAUSE");
	return 0;
}

// Конструктор
rational::rational(int numerator, int denominator)
:_numerator(numerator)
,_denominator(denominator)
{
	normalize();
}

ostream& operator<<(ostream& stream,const rational& r)
{
	if(!r._denominator)stream<<"ERR";
	else
	{
		stream<<r._numerator;
		if(r._denominator!=1)stream<<'/'<<r._denominator;
	}
	return stream;
}

// Нормализация дроби
void rational::normalize(void)
{
	if(!_denominator)throw zerodenom();
	else
	{
		int n=nod(_numerator,_denominator);
		_numerator/=n;
		_denominator/=n;
		if(_denominator<0)
		{
			_denominator*=-1;
			_numerator*=-1;
		}
	}
}

// НОД
int nod(int a, int b)
{
	while(a&&b)
	{
		if(abs(a)>abs(b))a=a-static_cast<int>(a/b)*b;
		else b=b-static_cast<int>(b/a)*a;
	}
	return (a==0)?b:a;
}

rational operator+(const rational& r1,const rational& r2)
{
	int den=r1._denominator*r2._denominator/nod(r1._denominator,r2._denominator);
	return rational(den/r1._denominator*r1._numerator+den/r2._denominator*r2._numerator,den);
}
rational& rational::operator+=(const rational& r)
{
	int den=_denominator*r._denominator/nod(_denominator,r._denominator);
	_numerator=den/_denominator*_numerator+den/r._denominator*r._numerator;
	_denominator=den;
	normalize();
	return *this;
}

rational operator-(const rational& r1,const rational& r2)
{
	int den=r1._denominator*r2._denominator/nod(r1._denominator,r2._denominator);
	return rational(den/r1._denominator*r1._numerator-den/r2._denominator*r2._numerator,den);
}
rational& rational::operator-=(const rational& r)
{
	int den=_denominator*r._denominator/nod(_denominator,r._denominator);
	_numerator=den/_denominator*_numerator-den/r._denominator*r._numerator;
	_denominator=den;
	normalize();
	return *this;
}

rational operator*(const rational& r1,const rational& r2)
{
	return rational(r1._numerator*r2._numerator,r1._denominator*r2._denominator);
}
rational& rational::operator*=(const rational& r)
{
	_numerator*=r._numerator;
	_denominator*=r._denominator;
	normalize();
	return *this;
}

rational operator/(const rational& r1,const rational& r2)
{
	return rational(r1._numerator*r2._denominator,r1._denominator*r2._numerator);
}
rational& rational::operator/=(const rational& r)
{
	_numerator*=r._denominator;
	_denominator*=r._numerator;
	normalize();
	return *this;
}

bool operator==(const rational& r1,const rational& r2)
{
	int den=r1._denominator*r2._denominator/nod(r1._denominator,r2._denominator);
	return (den/r1._denominator*r1._numerator==den/r1._denominator*r2._numerator);
}
bool operator!=(const rational& r1,const rational& r2)
{
	int den=r1._denominator*r2._denominator/nod(r1._denominator,r2._denominator);
	return (den/r1._denominator*r1._numerator!=den/r1._denominator*r2._numerator);
}
bool operator<(const rational& r1,const rational& r2)
{
	int den=r1._denominator*r2._denominator/nod(r1._denominator,r2._denominator);
	return (den/r1._denominator*r1._numerator<den/r1._denominator*r2._numerator);
}
bool operator<=(const rational& r1,const rational& r2)
{
	int den=r1._denominator*r2._denominator/nod(r1._denominator,r2._denominator);
	return (den/r1._denominator*r1._numerator<=den/r1._denominator*r2._numerator);
}
bool operator>(const rational& r1,const rational& r2)
{
	int den=r1._denominator*r2._denominator/nod(r1._denominator,r2._denominator);
	return (den/r1._denominator*r1._numerator>den/r1._denominator*r2._numerator);
}
bool operator>=(const rational& r1,const rational& r2)
{
	int den=r1._denominator*r2._denominator/nod(r1._denominator,r2._denominator);
	return (den/r1._denominator*r1._numerator>=den/r1._denominator*r2._numerator);
}


Пример работы:
Код
A=1/2
B=3/5
(A==B)=false
(A!=B)=true
(A<B)=true
(A>B)=false
A+B=11/10
3+A=7/2
(B+=4)=23/5
A-B=-41/10
8-B=17/5
(B-=4)=3/5
A*B=3/10
5*A=5/2
(B*=10)=6
A/B=1/12
5/B=5/6
(B/=10)=3/5

Программа тестировалась на MS Visual Studio 2008.

Насчет последней части вопроса это как совесть подскажет smile

Micren

Посетитель
11.02.2009, 20:00
Мини-форум консультации # 160214
Нет сообщений в мини-форуме
Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.

Лучшие эксперты раздела

Зенченко Константин Николаевич

Старший модератор

Рейтинг: 164

Gluck

8-й класс

Рейтинг: 60

Коцюрбенко Алексей Владимирович

Старший модератор

Рейтинг: 47

CradleA

Мастер-Эксперт

Рейтинг: 1

Лысков Игорь Витальевич

Мастер-Эксперт

Рейтинг: 0

Асмик Гаряка

Советник

Рейтинг: 0