Краткие сведения из теории. Разработка структуры классов

Лабораторная работа №9.

Разработка структуры классов. Создание полей и свойств

 

Цель работы

Овладеть практическими навыками разработки классов.

 

Краткие сведения из теории

Рациональное число (лат. ratio – отношение, деление, дробь) – число, представляемое обыкновенной дробью m / n, где m, n – целые числа.

Правильной называется дробь, у которой модуль числителя меньше модуля знаменателя. Правильные дроби представляют рациональные числа, принадлежащие интервалу (-1, 1). Дробь, не являющаяся правильной, называется неправильной. У нее модуль числителя больше или равен модулю знаменателя.

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

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

1. Переменные и методы класса «Рациональное число»

Из определения следует, что любое рациональное число в смешанном виде определяется четырьмя составляющими:

знаком числа (число положительное или отрицательное);

целой частью;

числителем;

знаменателем.

Все составляющие дроби являются целыми числами. Знак дроби тоже будем представлять в виде целого числа (1 – положительная дробь, -1 – отрицательная дробь), поскольку это удобно при реализации арифметических операций:

// класс "Рациональное число"

class Fraction

{

int sign; // знак дроби (+ или -)

int intPart; // целая часть дроби

int numerator; // числитель дроби

int denominator; // знаменатель дроби

. . .

}

 

При описании операций с дробями предполагаем, что объекты класса Fraction находятся в смешанном виде. Результатом операции над дробями может быть неправильная дробь, которую, согласно предположению, необходимо перевести в смешанный вид. Для этого необходимы методы «преобразования в смешанный вид», «сокращения дроби» и «выделения целой части». Данные методы будут применяться при выполнении арифметических операций над дробями или при создании дроби, гарантируя, что дробь после завершения операции будет иметь смешанный вид. Таким образом, пользователю класса нет необходимости выполнять операции приведения дроби к смешанному виду, поскольку эта операция выполняется автоматически. Поэтому методы преобразования в смешанный вид, сокращения дроби и выделения целой части можно описать как закрытые элементы класса.

// класс "Рациональное число"

class Fraction

{

int sign; // знак дроби (+ или -)

int intPart; // целая часть дроби

int numerator; // числитель дроби

int denominator; // знаменатель дроби

// метод преобразование дроби в смешанный вид

void GetMixedView()

{

. . .

}

// метод сокращения дроби

void Cancellation()

{

. . .

}

// метод выделения целой части дроби

void GetIntPart()

{

. . .

}

. . .

}

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

Таким образом, полный состав класса Fraction может выглядеть так:

2. Конструкторы и деструктор класса «Рациональное число»

Для создания объекта определим конструктор с четырьмя параметрами, соответствующими четырем структурным элементам класса:

значение числителя;

значение знаменателя;

значение целой части;

знак числа.

 

Прототип конструктора имеет следующий вид:

// конструктор с параметрами

public Fraction(int n, int d, int i = 0, int s = 1)

Если при создании объекта не указываются значения целой части и знака, то по умолчанию считается, что целая часть числа равна нулю и число является положительным. Это определяется заданием значений по умолчанию соответствующих параметров конструктора в его объявлении (прототипе). Параметры, для которых указываются значения по умолчанию, должны располагаться в конце списка формальных параметров.

//конструктор класса «Рациональное число»

Fraction::Fraction(int n, int d, int i, int s)

{

intPart = i;

numerator = n;

denominator = d;

sign = s;

GetMixedView();

}

При создании объекта конструктору могут быть переданы значения числителя и знаменателя, образующие неправильную или сократимую дробь. В этом случае в теле конструктора после инициализации свойств нужно преобразовать дробь в смешанный вид. Это можно сделать путем вызова метода преобразования GetMixedView().

Также определим в классе конструктор без параметров, который может использоваться при создании дроби, равной нулю. В конструкторе без параметров структурным свойствам присваиваются конкретные значения:

// конструктор без параметров класса «Рациональное число»

Fraction ::Fraction()

{

intPart = 0;

numerator = 0;

denominator = 1;

sign = 1;

}

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

// метод преобразования дроби в смешанный вид

void Fraction :: GetMixedView()

{

GetIntPart(); // выделение целой части числа

Cancellation(); // сокращение дроби

}

Если числитель дроби больше знаменателя, то выделяется целая часть:

// метод выделения целой части рационального числа

void Fraction :: GetIntPart()

{

if(numerator >= denominator)

{

intPart += (numerator / denominator);

numerator %= denominator;

}

}

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

// метод сокращения рациональной дроби

void Fraction :: Cancellation()

{

if(numerator != 0)

{

int m = denominator,

n = numerator,

ost = m%n;

// вычисление НОД(числителя, знаменателя)

// алгоритмом Евклида

while(ost != 0)

{

m = n;

n = ost;

ost = m % n;

}

int nod = n;

if(nod != 1)

{

numerator /= nod;

denominator /= nod;

}

}

}

Деструктор класса выводит сообщение о том, что уничтожен объект класса Fraction.

// деструктор

Fraction :: ~Fraction()

{

Cout<<"Дробь " << (*this) << " уничтожена."<<endl;

}

Далее в функции Main() приведены различные способы создания объектов класса Fraction с помощью конструкторов.

void Main(void)

{

// создание дроби 2/3

Fraction d1 (2, 3, 0, 1);

// создание дроби -2 4/5

Fraction d2 (4, 5, 2, -1);

// создание дроби 2 1/3

Fraction d3 (4, 3, 1, 1);

// создание дроби 1 2/3

Fraction d4 (10, 6);

// создание дроби 3/7

Fraction d5 (3, 7);

// создание дроби 2 3/8

Fraction d6 (3, 8, 2);

// создание рационального числа 0

Fraction d7 ;

. . .

}

 

 

Порядок выполнения работы

 

1. Создать приложение, демонстрирующее работу с классом «Рациональное число», приведенным в теории.

2. Разработать класс согласно варианту.

3. Создать приложение, демонстрирующее использование разработанного класса.

 

Варианты заданий:

1. Разработать класс «Комплексное число». Определить в нем конструктор, перегрузить арифметические операции, операции сравнения, операцию преобразования в строку и статический метод получения комплексного числа из строки.

2. Разработать класс «Комплексное число в тригонометрической форме». Определить в нем конструктор, перегрузить арифметические операции, операции сравнения, операцию преобразования в строку и статический метод получения комплексного числа из строки.

3. Разработать класс «Дата». Определить в нем конструкторы и деструктор, перегрузить операцию добавления к дате заданного количества дней, операцию вычитания двух дат, операции сравнения и операцию преобразования в символьную строку, а также статический метод получения даты из строки.

4. Разработать класс «Время». Определить в нем конструкторы и деструктор, перегрузить операцию добавления к времени заданного количества минут, операцию вычитания двух моментов времени, операцию преобразования в символьную строку и метод получения момента времени из строки.

5. Разработать класс «Прямоугольник». Определить в нем конструкторы и деструктор, перегрузить операцию пересечения прямоугольников (операция “*”), операцию вычисления площади прямоугольника, операции сравнения (по площади), операцию преобразования в символьную строку и метод получения объекта-прямоугольника из строки.

6. Разработать класс «Треугольник». Определить в нем конструкторы и деструктор, перегрузить операцию преобразования в вещественное число (площадь треугольника), операцию проверки включения точки в треугольник, операции сравнения треугольников (по площади), операцию преобразования в символьную строку и метод получения объекта-треугольника из строки.

7. Разработать класс «Круг». Определить в нем конструкторы и деструктор, перегрузить операцию преобразования в вещественное число (площадь круга), операцию проверки включения точки в круг, операции сравнения кругов (по радиусу), операцию преобразования в символьную строку и метод получения объекта-круга из строки.

8. Разработать класс «Отрезок». Определить в нем конструкторы и деструктор, перегрузить операцию преобразования в вещественное число (длина отрезка), операцию проверки параллельности отрезка осям координат, операции сравнения отрезков (по длине), операцию преобразования в символьную строку и метод получения объекта-отрезка из строки.

9. Разработать класс «Прямая». Определить в нем конструкторы и деструктор, перегрузить операцию сложения прямой с числом (смещение вдоль оси у: вверх или вниз), операцию умножения на число (изменение угла наклона), операцию проверки параллельности прямой осям координат, операцию преобразования в символьную строку и метод получения объекта-прямой из строки.

10. Разработать класс «Вектор». Определить в нем конструктор, перегрузить арифметические операции, операции сравнения, операцию преобразования в строку и статический метод получения вектора из строки.

 

4. Содержание отчёта

1. Название, цель работы

2. Протокол выполнения работы со всеми распечатками, скриншотами, комментариями и наблюдениями согласно разделу «Выполнение работы».

3. Ответы на контрольные вопросы.