Студопедия

КАТЕГОРИИ:

АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника


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




class TVector

{

private:

double FX, FY, FZ;

public:

double X(){return FX;};

double Y(){return FY;};

double Z(){return FZ;};

double Module();

TVector(double X, double Y, double Z = 0);

TVector operator +=(TVector Vector);

TVector operator -=(TVector Vector);

TVector operator *=(double Number);

TVector operator *=(TVector Vector);

double operator %(TVector Vector);

};

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

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

#define EVectorError Exception

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

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

TVector::TVector(double X, double Y, double Z)

{

FX = X;

FY = Y;

FZ = Z;

}

 

TVector TVector::operator+=(TVector Vector)

{

FX += Vector.FX;

FY += Vector.FY;

FZ += Vector.FZ;

return *this;

}

 

TVector TVector::operator-=(TVector Vector)

{

FX -= Vector.FX;

FY -= Vector.FY;

FZ -= Vector.FZ;

return *this;

}

 

TVector TVector::operator*=(double Number)

{

FX *= Number;

FY *= Number;

FZ *= Number;

return *this;

}

 

TVector TVector::operator*=(TVector Vector)

{

double NewX, NewY;

NewX = FY * Vector.FZ - Vector.FY * FZ;

NewY = FZ * Vector.FX - Vector.FZ * FX;

FZ = FX * Vector.FY - Vector.FX * FY;

FX = NewX;

FY = NewY;

return *this;

}

 

double TVector::operator%(TVector Vector)

{

return FX * Vector.FX + FY * Vector.FY + FZ * Vector.FZ;

}

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

void __fastcall TForm1::Button1Click(TObject *Sender)

{

TVector a(1,2,3), b(4,5,6);

a += b;

Edit3->Text = a.X();

Edit4->Text = a.Y();

Edit5->Text = a.Z();

}

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

TVector::TVector()

{

FX = 0;

FY = 0;

FZ = 0;

}

 

TVector TVector::operator+(TVector Vector)

{

TVector Result(FX, FY, FZ);

Result+=Vector;

return Result;

}

 

TVector TVector::operator-(TVector Vector)

{

TVector Result(FX, FY, FZ);

Result-=Vector;

return Result;

}

 

TVector TVector::operator*(double Number)

{

TVector Result(FX, FY, FZ);

Result*=Number;

return Result;

}

 

TVector TVector::operator*(TVector Vector)

{

TVector Result(FX, FY, FZ);

Result*=Vector;

return Result;

}

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

TVector();

TVector operator +(TVector Vector);

TVector operator -(TVector Vector);

TVector operator *(double Number);

TVector operator *(TVector Vector);

Для более эффективного ввода векторных чисел в классе TVector можно предусмотреть дополнительный конструктор так, чтобы исходное число передавалось ему в виде строки AnsiString в формате ‘(X, Y, Z)’.

TVector::TVector(AnsiString Vector)

{

int Separator1, Separator2;

Vector = Vector.Trim();

if ((Vector[1]!='(') || (Vector[Vector.Length()]=!')'))

throw EVectorError("Неправильный формат вектора");

Separator1 = Vector.Pos(',');

FX = Vector.SubString(2, Separator1 - 1).ToDouble();

Vector[Separator1] = ' ';

Separator2 = Vector.Pos(',');

if (Separator2 = 0)

{

FY = Vector.SubString(Separator1 + 1,Vector.Length()

- Separator1 - 1).ToDouble();

FZ = 0;

}

Else

{

FY = Vector.SubString(Separator1 + 1, Separator2

– Separator1 - 1).ToDouble();

FY = Vector.SubString(Separator2 + 1,Vector.Length()

- Separator2 - 1).ToDouble();

}

}

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

AnsiString TVector::ToStr()

{

return "(" + FloatToStr(FX) + ", " + FloatToStr(FY) +
", " + FloatToStr(FZ);

}

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

TVector(AnsiString Complex);

AnsiString ToStr();

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

void __fastcall TForm1:: Button1Click(TObject *Sender)

{

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

c=a+b;

Edit3->Text = c.ToStr();

}


Поделиться:

Дата добавления: 2015-08-05; просмотров: 110; Мы поможем в написании вашей работы!; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2024 год. (0.007 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты