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

Лабораторная работа № 3 векторы

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

Теоретические сведения

Вектором(Vector) называется направленный отрезок с заданными координатами начала и конца.

Вектор, началом которого служит точка А, а концом – точка B, обозначается как , , илиа.

В

Рис. 3. Вектор

ектор задается координатами (X,Y,Z). В декартовой системе координат они находятся через координаты точек его началаи концапо следующим формулам:

, ,.

Расстояние между точками называется длиной вектора или его модулем:

.

Для векторов предусмотрены следующие арифметические операции:

  1. Сложение (Addition):

.

  1. Вычитание (Subtraction):

.

  1. Умножение вектора на число (Multiplication by number):

.

  1. Векторное умножение (Multiplication):

.

  1. Скалярное произведение (Scalar Multiplication):

.

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

ADT – формат класса TVector

ADT TVector

Поля

Координаты вектора (FX, FY, FZ): Вещественный тип

Методы

Чтение координат вектора (X, Y, Z) – подстановочный метод

Вход: Нет

Предусловие: Нет

Процесс: Нет

Постусловие: Нет

Выход: Координата вектора

Модуль вектора (Module)

Вход: Нет

Предусловие: Нет

Процесс: Нет

Постусловие: Нет

Выход: Координаты вектора

Конструктор

Вход: Координаты вектора X, Y, Z

Предусловие: Нет

Начальные значения: Нет

Процесс: Инициализация полей объекта

Сложение с присвоением (+=)

Вход: Второе слагаемое

Предусловие: Нет

Процесс: Сложение векторов

Постусловие: Результат сложения присвоен полям объекта

Выход: Результат сложения векторов

Вычитание с присвоением (-=)

Вход: Вычитаемое

Предусловие: Нет

Процесс: Вычитание векторных чисел

Постусловие: Результат вычитания присвоен полям объекта

Выход: Результат вычитания векторов

Умножение вектора на число с присвоением (*=)

Вход: Значение числа

Предусловие: Нет

Процесс: Умножение вектора на число

Постусловие: Результат умножения присвоен полям объекта

Выход: Результат умножения вектора на числа

Умножение векторов с присвоением (*=)

Вход: Второй сомножитель

Предусловие: Нет

Процесс: Векторное произведение

Постусловие: Результат умножения присвоен полям объекта

Выход: Результат умножения векторов

Скалярное умножение (%)

Вход: Второй сомножитель

Предусловие: Нет

Процесс: Скалярное произведение векторов

Постусловие: Результат умножения присвоен полям объекта

Выход: Результат скалярного произведения векторов

Конец ADT TVector

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

classTVector

{

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);

doubleoperator%(TVectorVector);

};

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

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

#defineEVectorErrorException

Чтобы использовать этот класс, в исполняемом разделе модуля с расширением 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 __fastcallTForm1:: Button1Click(TObject *Sender)

{

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

c=a+b;

Edit3->Text = c.ToStr();

}