- •Лабораторная работа № 1 рациональные числа
- •Теоретические сведения
- •Синтаксис объявления класса tRational
- •Программа работы
- •Исходные данные
- •Контрольные вопросы
- •Лабораторная работа № 2 комплексные числа
- •Теоретические сведения
- •Синтаксис объявления класса tComplex
- •Программа работы
- •Исходные данные
- •Контрольные вопросы
- •Лабораторная работа № 3 векторы
- •Теоретические сведения
- •Синтаксис объявления класса tVector
- •Программа работы
- •Контрольные вопросы
- •Лабораторная работа № 4 матрицы
- •Теоретические сведения
- •Арифметические операции с матрицами
- •Синтаксис объявления класса tMatrix
- •Основные свойства и методы компонента StringGrid
- •Программа работы
- •Исходные данные
- •Исходные данные
- •Контрольные вопросы
- •Лабораторная работа № 5 строки
- •Теоретические сведения
- •Программа работы
- •Исходные данные
- •Контрольные вопросы
- •Лабораторная работа № 6 стек
- •Теоретические сведения
- •Синтаксис объявления класса tStack
- •Программа работы
- •Контрольные вопросы
- •Лабораторная работа № 7 очередь
- •Теоретические сведения
- •Синтаксис объявления класса tQueue
- •Программа работы
- •Контрольные вопросы
- •Лабораторная работа № 8 деревья
- •Теоретические сведения
- •Синтаксис объявления класса tTreeNode
- •Синтаксис объявления класса tTree
- •Программа работы
- •Контрольные вопросы
- •Библиографический список
- •Содержание
Лабораторная работа № 3 векторы
Цель работы: разработать классTVector, который будет содержать все арифметические операции с векторными величинами, а также получить практический навык его использования.
Теоретические сведения
Вектором(Vector) называется направленный отрезок с заданными координатами начала и конца.
Вектор, началом которого служит точка А, а концом – точка B, обозначается как , , илиа.
В
Рис. 3. Вектор
, ,.
Расстояние между точками называется длиной вектора или его модулем:
.
Для векторов предусмотрены следующие арифметические операции:
Сложение (Addition):
.
Вычитание (Subtraction):
.
Умножение вектора на число (Multiplication by number):
.
Векторное умножение (Multiplication):
.
Скалярное произведение (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();
}