Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
тех прог.doc
Скачиваний:
38
Добавлен:
14.11.2019
Размер:
3.59 Mб
Скачать

Задачи 203-212. Наследование классов

  1. Отсортируйте людей по убыванию даты рождения (от более поздней даты к более ранней).

  2. Напишите функцию сравнения людей по фамилиям. С помощью этой функции отсортируйте группу людей в алфавитном порядке их фамилий.

  3. В функции Add класса Persons, программы 58, предусмотрите проверку, чтобы дважды в группу не попали лица с одинаковыми именами.

  4. Добавьте в класс Date функцию int DayOfWeek(), возвращающую номер дня недели: 1 – понедельник, 2 – вторник,… Напишите функцию сравнения людей по дням недели их рождения и с ее помощью отсортируйте людей из группы по дням недели.

  5. Сделайте класс Plgn (многоугольники) из программы 49 производным от класса Point (точка). Базовую точку считайте центром масс многоугольника. Предусмотрите конструктор, создающий многоугольник со случайными координатами вершин, отстоящими от базовой точки не более чем на заданную величину R, которую можно сделать параметром конструктора. Напишите также конструктор, который создает многоугольник по двум заданным массивам координат. В нем следует скорректировать заданные координаты вершин так, чтобы базовая точка действительно оказалась центром масс. Как видно из рис.70, если B – базовая точка, то для этого она совпала с центром масс C, координаты всех вершин следует уменьшить соответственно на Δx и Δy.

  6. Перепишите программу 55, выделив в отдельный класс, например, Vct математические операции над компонентами векторов, и сделав класс Bivect производным от Vct.

  7. Добавьте в класс Matrix функцию преобразования матрицы к треугольному виду и функцию вычисления определителя.

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

  9. Предложенная реализация класса матриц в виде совокупности векторов-столбцов не самая эффективная, так как велики накладные расходы на вызовы конструкторов и деструкторов класса векторов при работе с матрицами. Реализуйте класс матриц, используя ее представление в виде одномерного массива double* a; в котором подряд в памяти расположены строки матрицы.

  10. В классе Persons, программа 60, перегрузите оператор доступа к элементу массива личных данных Pers& operator[](char *name) по имени человека name. Используйте этот оператор для получения справок о дате рождения людей по их фамилиям.

Глава 21.Шаблоны, исключения

21.1.Шаблоны

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

21.2.Шаблоны функций

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

В определении шаблона семейства функций используются ключевое слово template. Например, шаблон семейства функций для обмена значений двух аргументов может иметь вид:

template <class T>

void swap(T *x, T *y)

{T tmp; tmp = *x; *x = *y; *y = tmp;}

Здесь T – формальный параметр шаблона, обозначаемый ключевым словом class. Параметры шаблона заключаются в угловые скобки < и >. Теперь функцию swap можно использовать для аргументов любых типов. Например,

long k = 4, d = 8;

swap(&k, &d);

Компилятор автоматически сформирует определение функции:

void swap(long *x, long *y)

{long tmp; tmp = *x; *x = *y; *y = tmp;}

Имя типа в шаблоне является параметром, вместо которого можно подставлять любые типы.

Параметризовать можно типы аргументов функции и тип возвращаемого значения. Шаблон функции может иметь также и непараметризованные аргументы, например,

template <class T, int n>

Шаблон может иметь несколько параметров, например,

template <class T1, class T2>

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