Порядок выполнения работы. 1. Определить пользовательский класс в соответствии с вариантом задания;

 

1. Определить пользовательский класс в соответствии с вариантом задания;

2. Определить в классе соответствующие конструкторы и деструктор

3. Определить в классе компоненты-функции для просмотра и установки полей данных.

4. Реализовать все необходимые операции в соответствии с вариантом задания;

5. Написать демонстрационную программу, наглядно демонстрирующую реализацию перегрузки операций.

Варианты задания.

Вариант 1.

Вектор в пятимерном евклидовом пространстве задается пятеркой своих координат. Реализовать:

сложение (вычитание) векторов;

скалярное произведение векторов;

векторное произведение векторов (операция %);

умножение вектора на скаляр.

Вариант 2.

Строка символов. Реализовать операции:

сравнения строк (операция ==);

удаления из строки указанного символа (операция - );

переворота строки (операция ~),

Кроме того, членом класса сделать также функцию с именем strset() для удаления из первой строки всех символов, встречающихся во второй строке.

 

Вариант 3.

В британском формате дата задается как число/месяц/год. Реализовать с учётом високосных годов:

а) сложение даты и определенного пользователем количества дней;

б) вычитание из даты определенного пользователем количества дней;

в) вычисление числа дней, прошедших между двумя датами (оператор %).

 

Вариант 4.

Ввести класс для работы с прямоугольной матрицей. Реализовать следующие операции:

а) сложение (вычитание) двух матриц (операции +, -);

б) умножение двух матриц (операция *).

 

Вариант 5.

Комплексное число задается своим модулем и углом (например, число 10 * (cos(p / 6) + i * sin(p / 6)) задается парой (10, p/ 6).

Реализовать:

а) сложение (вычитание) чисел;

б) произведение двух чисел;

в) деление чисел;

г) возведение в целочисленную степень (оператор ^);

д) извлечение квадратного корня (функция sqrt()).

 

Вариант 6.

Комплексное число задается своей вещественной и мнимой частями (например, 5+3 задается парой (5, 3)). Реализовать:

а) сложение (вычитание) чисел (операции +, - );

б) произведение двух чисел (операция * );

в) деление чисел (операция /);

г) возведение в целочисленную степень (оператор ^);

д) извлечение квадратного корня (функция sqrt()).

 

Вариант 7.

Время задается в формате час.минута.секунда.

Реализовать следующие операции (учесть переход через 24 ч):

а) сложение времени и определенного пользователем количества секунд;

б) вычитание из времени указанного пользователем количества секунд;

в) сложение двух моментов времени;

г) вычитание из одного момента времени другого;

д) подсчет числа секунд между двумя моментами времени, лежащими в пределах одних суток (оператор %).

 

Вариант 8.

Ввести класс для работы с объектом "полином". Реализовать следующие операции:

а) сложение (вычитание) двух полиномов;

б) умножение (деление) двух полиномов;

в) умножение полинома на число (ТОЛЬКО КОЭФФИЦИЕНТЫ)(операция &);

г) вычисление значения полинома в заданной точке X (операция ());

д) дифференцирование полинома (операция ~ );

е) интегрирование полинома (операция !).

 

Вариант 9.

Ввести класс для работы с объектом "множество целых чисел". Реализовать следующие операции:

а) объединение двух множеств (операция +);

б) пересечение двух множеств (операция &);

в) разность двух множеств (операция -);

г) добавление элемента во множество;

д) удаление элемента из множества.

 

Вариант 10.

Ввести класс для работы с объектом "рациональная дробь" (вида m/n). Реализовать:

а) сложение/вычитание двух дробей;

б) умножение/деление двух дробей;

в) приведение дроби к несократимому виду (операция !);

г) сравнения двух дробей (операция ||).

Методические указания.

Пример решения задачи

Переопределим операцию + так, чтобы можно было складывать (сцеплять) символьные строки.

#include <stdio.h>

#include <string.h>

const LEN=80;

struct String

{

char s[LEN];

int len;

};

String operator + (String S1, String S2)

{

String TmpS;

if((TmpS.len=S1.len+S2.len)>=LEN)

{ TmpS.s[0]='\0';

TmpS.len=0;

} else

{

strcpy(TmpS.s, S1.s);

strcat(TmpS.s, S2.s);

}

return TmpS;

}

void main()

{

String S1,S2,S3;

strcpy(S1.s, "Перегрузка операций - ");

S1.len=strlen(S1.s);

strcpy(S2.s, "классная вещь!");

S2.len=strlen(S2.s);

printf("Были строки: \n %s\n %s\n с длинами %d и %d\n",S1.s, S2.s, S1.len, S2.len);

S3=S1+S2;//генерируется код, <=> вызову: operator+(s1, s2);

printf("Получилась строка:\n\t%s длиной %d\n", S3.s,S3.len);

}

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

 

1. Титульный лист: название дисциплины; номер и наименование работы; фамилия, имя, отчество студента; дата выполнения.

2. Постановка задачи. Следует дать конкретную постановку, т.е. указать, какой класс должен быть реализован, какие должны быть в нем конструкторы, компоненты-функции и т.д.

3. Определение пользовательского класса с комментариями.

4. Реализация конструкторов и деструктора.

5. Реализация перегрузки операций с объяснением алгоритма работы для данного типа данных;

6. Листинг основной программы.

Контрольные вопросы

 

1. Какова цель перегрузки функций и операций?

2. Что такое дружественные функции, как они описываются и вызывается?

3. Какие операции должны быть функциями - друзьями, а какие - только членами?

4. Какие операции нельзя переопределять?

5. Особенности переопределения бинарных и унарных операций.

6. Особенности операций между переменными пользовательских и стандартных типов.

7. Использование конструктора для операции преобразования типов.

8. Перегрузка операций new и delete.

9. Перегрузка операции приведения типа.

10. Перегрузка операции вызова функции.

11. Перегрузка операции индексирования.


 

Лабораторная работа № 13

 

«НАСЛЕДОВАНИЕ И ВИРТУАЛЬНЫЕ ФУНКЦИИ»

Цель. Получить практические навыки создания иерархии классов и использования статических компонентов класса. Написать программу, в которой создается иерархия классов. Включить полиморфные объекты в связанный список, используя статические компоненты класса. Показать использование виртуальных функций.