Порядок выполнения работы. 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
«НАСЛЕДОВАНИЕ И ВИРТУАЛЬНЫЕ ФУНКЦИИ»
Цель. Получить практические навыки создания иерархии классов и использования статических компонентов класса. Написать программу, в которой создается иерархия классов. Включить полиморфные объекты в связанный список, используя статические компоненты класса. Показать использование виртуальных функций.