Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка2.doc
Скачиваний:
34
Добавлен:
13.02.2015
Размер:
1.4 Mб
Скачать

Синтаксис объявления класса tRational

class TRational

{

private:

int FNum;

int FDen;

public:

int Num(){return FNum;};

int Den(){return FDen;};

TRational(int Num, int Den = 1);

TRational operator +=(TRational Rat);

TRational operator -=(TRational Rat);

TRational operator *=(TRational Rat);

TRational operator /=(TRational Rat);

};

Класс TRationalсодержит два поля для хранения значений числителя и знаменателя числа, два метода для их вывода, конструктор для ввода их значений и четыре метода для выполнения арифметических операций с рациональными числами.

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

#define ERationalError Exception

#define EZiroDivide ERationalError

Чтобы использовать эти классы, в исполняемом разделе модуля с расширением cppнеобходимо подключить модульSysUtils.hpp, в котором хранить базовый класс исключительных ситуацийException.

После объявления класса TRationalнеобходимо определить все его методы в исполняемом разделе модуля с расширениемcpp в соответствии сADT– форматом.

TRational::TRational(int Num, int Den)

{

if (Den==0)

throw ERationalError("Знаменатель равен нулю");

FNum = Num;

FDen = Den;

}

TRational TRational::operator +=(TRational Rat)

{

FNum = FNum*Rat.FDen + FDen*Rat.FNum;

FDen = FDen*Rat.FDen;

return *this;

}

TRational TRational::operator /=(TRational Rat)

{

if (Rat.FNum == 0)

throw EZiroDivide("Деление на ноль");

FNum = FNum*Rat.FDen;

FDen = FDen*Rat.FNum;

return*this;

}

После того, как определен класс TRational, его можно использовать в любом месте программы, подключив соответствующий модуль.

void __fastcall TForm1::Button1Click(TObject *Sender)

{

TRational a(1,2), b(3);

a += b;

Edit3->Text = a.Num();

Edit4->Text = a.Den();

}

Из примера видно, что реализация класса TRationalдалека от совершенства. Для расширения его функциональных возможностей можно добавить к нему дополнительные методы так, чтобы исходное число не передавалось конструктору, аметоды арифметических операций выполняли бы действия без присвоения.

TRational::TRational()

{

FNum = 0;

FDen = 1;

}

TRational TRational::operator+(TRational Rat)

{

TRational Result(FNum,FDen);

Result+=Rat;

return Result;

}

TRational TRational::operator/(TRational Rat)

{

TRational Result(FNum,FDen);

Result/=Rat;

returnResult;

}

Заголовки этих методов, первоначально, необходимо поместить в объявление класса TRational.

TRational();

TRational operator +(TRational Rat);

TRational operator -(TRational Rat);

TRational operator *(TRational Rat);

TRationaloperator/(TRationalRat);

Для более эффективного ввода рациональных чисел в классе TRationalможно предусмотреть дополнительный конструктор так, чтобы исходное число передавалось ему в виде строкиAnsiStringв формате ‘Числитель / Знаменатель’.

TRational::TRational(AnsiString Rat)

{

int Separator;

Separator = Rat.Pos('/');

if (Separator == 0)

{

FNum = Rat.ToInt();

FDen = 1;

}

else

{

FNum = Rat.SubString(1,Separator -1).ToInt();

FDen = Rat.SubString(Separator + 1, Rat.Length()-Separator).ToInt();

};

if (FDen == 0)

throw ERationalError("Знаменатель равен нулю");

}

Для более эффективного вывода рациональных чисел можно предусмотреть специальный метод преобразования типов из TRationalв строкуAnsiString, реализация которого имеет следующий вид:

AnsiString TRational::ToStr()

{

return IntToStr(FNum) + '/' + IntToStr(FDen);

}

Перед определением дополнительного конструктора и метода преобразования типов их заголовки необходимо объявить внутри класса TRational, первоначально подключив модульSystem.hpp, в котором храниться объявление класса строкAnsiString.

TRational(AnsiString Rat);

AnsiString ToStr();

Использовать дополнительные методы можно следующим образом:

void __fastcallTForm1:: Button1Click(TObject *Sender)

{

TRational a(Edit1->Text), b(Edit2->Text), c;

c=a+b;

Edit3->Text = c.ToStr();

}