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

Обсуждение

Неизвестный
11.02.2009, 20:00
общий
это ответ
Здравствуйте, 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.

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