КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Синтаксис объявления класса TComplexclass TComplex { private: double FRe; double FIm; public: double Re(){return FRe;}; double Im(){return FIm;}; double Module(); double Angle(); TComplex(double Re, double Im); TComplex operator +=(TComplex Comlex); TComplex operator -=(TComplex Comlex); TComplex operator *=(TComplex Comlex); TComplex operator /=(TComplex Comlex); }; Класс TComplex содержит два поля для хранения значений действительной и мнимой части числа, два метода для их вывода, конструктор для ввода их значений, два метода для нахождения модуля и угла, а также четыре метода для выполнения арифметических операций с комплексными числами. В модуле с данным классом можно определить два класса исключительных ситуаций EComplexError и EZiroDivide для обработки ошибок, которые могут возникать при работе с комплексными числами. #define ERationalError Exception #define EZiroDivide ERationalError Чтобы использовать эти классы, в исполняемом разделе модуля с расширением cpp необходимо подключить модуль SysUtils.hpp, в котором хранить базовый класс исключительных ситуаций Exception. После объявления класса TComplex необходимо определить все его методы в исполняемом разделе модуля с расширением cpp в соответствии с ADT – форматом. TComplex::TComplex(double Re, double Im) { FRe = Re; FIm = Im; }
TComplex TComplex::operator +=(TComplex Complex) { FRe += Complex.FRe; FIm += Complex.FIm; return *this; } ......................................................................................................................................................... TComplex TComplex::operator /=(TComplex Complex) { if ((Complex.FRe == 0) || (Complex.FIm == 0)) throw EZiroDivide("Деление на ноль"); double NewRe; NewRe = (FRe*Complex.FRe + FIm*Complex.FIm)/ (pow(Complex.FRe,2) + pow(Complex.FIm,2)); FIm = (FIm*Complex.FRe - FRe*Complex.FIm)/ (pow(Complex.FRe,2) + pow(Complex.FIm,2)); FRe = NewRe; return *this; } После того, как определен класс TComplex, его можно использовать в любом месте программы, подключив соответствующий модуль. void __fastcall TForm1::Button1Click(TObject *Sender) { TComplex a(1,2), b(3,4); a += b; Edit3->Text = a.Re(); Edit4->Text = a.Im(); } Из примера видно, что реализация класса TComplex далека от совершенства. Для расширения его функциональных возможностей можно добавить к нему дополнительные методы так, чтобы исходное число не передавалось конструктору, а методы арифметических операций выполняли бы действия без присвоения.
TComplex::TComplex() { FRe = 0; FIm = 0; }
TComplex TComplex::operator+(TComplex Complex) { TComplex Result(FRe,FIm); Result+=Complex; return Result; } .................................................................................................................................................... TComplex TComplex::operator/(TComplex Complex) { TComplex Result(FRe,FIm); Result/=Complex; return Result; } Заголовки этих методов, первоначально, необходимо поместить в объявление класса TComplex. TComplex(); TComplex(AnsiString Comlex); TComplex operator +(TComplex Comlex); TComplex operator -(TComplex Comlex); TComplex operator *(TComplex Comlex); TComplex operator /(TComplex Comlex); Для более эффективного ввода комплексных чисел в классе TComplex можно предусмотреть дополнительный конструктор так, чтобы исходное число передавалось ему в виде строки AnsiString в формате ‘Действительная часть + i Мнимая часть’. TComplex::TComplex(AnsiString Complex) { int Separator, Sign, Index; bool ImBool; Complex = Complex.Trim(); Separator = 0; Sign = 1; Index = Complex.Length(); ImBool = false; while ((Index != 0)&&(Separator == 0)) { switch (Complex[Index]){ case 'i': ImBool = true; Complex[Index] = ' '; break; case '+': Separator = Index; break; case '-': Sign = -1; Separator = Index; } Index--; } if (ImBool) { if (Index == 0) FRe = 0; elseFRe=Complex.SubString(1, Separator-1).ToDouble(); if (Complex.SubString(Separator + 1, Complex.Length() - Separator).Trim() =="") FIm = Sign; else FIm = Sign*Complex.SubString(Separator + 1, Complex.Length() - Separator).ToDouble(); } Else { FRe = Complex.ToDouble(); FIm = 0; } } Для более эффективного вывода комплексных чисел можно предусмотреть специальный метод преобразования типов из TComplex в строку AnsiString, реализация которого имеет следующий вид: AnsiString TComplex::ToStr() { AnsiString Result; if (FIm > 0) Result = "+i" + FloatToStr(FIm); else if (FIm < 0) Result = "-i" + FloatToStr(-FIm); if (FRe != 0) Result = FloatToStr(FRe) + Result; else if (FIm = 0) Result = "0"; return Result; } Перед определением дополнительного конструктора и метода преобразования типов их заголовки необходимо объявить внутри класса TComplex, первоначально подключив модуль System.hpp, в котором храниться объявление класса строк AnsiString. TComplex(AnsiString Complex); AnsiString ToStr(); Использовать дополнительные методы можно следующим образом: void __fastcall TForm1:: Button1Click(TObject *Sender) { TComplex a(Edit1->Text), b(Edit2->Text), c; c=a+b; Edit3->Text = c.ToStr(); }
|