- •Лабораторная работа № 1 рациональные числа
- •Теоретические сведения
- •Синтаксис объявления класса tRational
- •Программа работы
- •Исходные данные
- •Контрольные вопросы
- •Лабораторная работа № 2 комплексные числа
- •Теоретические сведения
- •Синтаксис объявления класса tComplex
- •Программа работы
- •Исходные данные
- •Контрольные вопросы
- •Лабораторная работа № 3 векторы
- •Теоретические сведения
- •Синтаксис объявления класса tVector
- •Программа работы
- •Контрольные вопросы
- •Лабораторная работа № 4 матрицы
- •Теоретические сведения
- •Арифметические операции с матрицами
- •Синтаксис объявления класса tMatrix
- •Основные свойства и методы компонента StringGrid
- •Программа работы
- •Исходные данные
- •Исходные данные
- •Контрольные вопросы
- •Лабораторная работа № 5 строки
- •Теоретические сведения
- •Программа работы
- •Исходные данные
- •Контрольные вопросы
- •Лабораторная работа № 6 стек
- •Теоретические сведения
- •Синтаксис объявления класса tStack
- •Программа работы
- •Контрольные вопросы
- •Лабораторная работа № 7 очередь
- •Теоретические сведения
- •Синтаксис объявления класса tQueue
- •Программа работы
- •Контрольные вопросы
- •Лабораторная работа № 8 деревья
- •Теоретические сведения
- •Синтаксис объявления класса tTreeNode
- •Синтаксис объявления класса tTree
- •Программа работы
- •Контрольные вопросы
- •Библиографический список
- •Содержание
Синтаксис объявления класса tRational
class 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;
returnResult;
}
Заголовки этих методов, первоначально, необходимо поместить в объявление класса TRational.
TRational();
TRational operator +(TRational Rat);
TRational operator -(TRational Rat);
TRational operator *(TRational Rat);
TRationaloperator/(TRationalRat);
Для более эффективного ввода рациональных чисел в классе 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 __fastcallTForm1:: Button1Click(TObject *Sender)
{
TRational a(Edit1->Text), b(Edit2->Text), c;
c=a+b;
Edit3->Text = c.ToStr();
}