КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Синтаксис объявления класса TRationalclass 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; return Result; } Заголовки этих методов, первоначально, необходимо поместить в объявление класса TRational. TRational(); TRational operator +(TRational Rat); TRational operator -(TRational Rat); TRational operator *(TRational Rat); TRational operator /(TRational Rat); Для более эффективного ввода рациональных чисел в классе 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 __fastcall TForm1:: Button1Click(TObject *Sender) { TRational a(Edit1->Text), b(Edit2->Text), c; c=a+b; Edit3->Text = c.ToStr(); }
|