- •Объектно-ориентированное программирование.
- •Методические указания к лабораторным работам Омск 2007
- •Лабораторная работа 1
- •Задания к лабораторной работе 1
- •Лабораторная работа 2 конструкторы и деструкторы
- •Задания к лабораторной работе 2
- •Лабораторная работа 3 наследование
- •Задания к лабораторной работе 3
- •Лабораторная работа 4 полиморфизм. Перегрузка операций и функций
- •Задания к лабораторной работе 4
- •Лабораторная работа 5 дружественные функции
- •Void ff(...) тело функции .
- •Задания к лабораторной работе 5
- •Библиографический список
- •Содержание
Задания к лабораторной работе 1
1. Создайте класс с именем Complex для выполнения ариф- метических действий с комплексными числами. Напишите программу драйвера для проверки вашего класса. Комплексные числа имеют форму realPart + imaginaryPart * j , где j – квадратный корень из (-1).
Используйте переменные с плавающей запятой для представления закрытых данных этого класса. Создайте функцию конструктор, которая позволяет объекту этого класса принимать начальные значения при его объявлении. Создайте открытые функции-элементы для каждого из следующих пунктов:
a) сложения двух комплексных чисел: отдельно складываются действительные и мнимые части;
б) вычитания двух комплексных чисел: действительная часть правого операнда вычитается из действительной части левого операнда, а мнимая часть правого операнда вычитается из мнимой части левого операнда;
в) печати комплексных чисел в форме (a, b), где a – действительная часть, b –мнимая часть.
2. Создайте класс по имени Rational для выполнения арифметических действий с дробями. Напишите программу драйвера для вашего класса.
Используйте целые переменные для представления закрытых данных класса – числителя и знаменателя. Создайте функцию-конструктор, которая позволяет объекту этого класса принимать начальные значения при его объявлении. Конструктор должен содержать значения по умолчанию на случай отсутствия заданных начальных значений и должен хранить дроби в сокращенном виде (т.е. дробь 2/4 должна храниться в объекте как 1 в числителе и 2 в знаменателе). Создайте открытые функции-элементы для каждого из следующих случаев:
a) сложения двух чисел Rational (результат должен храниться в сокращенной форме);
б) вычитания двух чисел Rational;
в) перемножения двух чисел Rational;
г) деления двух чисел Rational;
д) печати чисел Rational в форме a / b, где а – числитель, b – знаменатель;
е) печати чисел Rational в форме с плавающей точкой.
3. Создайте класс Rectangle (прямоугольник). Класс имеет атрибуты length (длина) и width (ширина), каждый из которых по умолчанию равен единице. Он имеет функции-элементы, которые вычисляют периметр (perimeter) и площадь (area) прямоугольника, а также функции записи и чтения как для length, так и для width. Функции записи должны проверять, что length и width – числа с плавающей запятой, находящиеся в пределах от 0.0 до 20.0.
4. Создайте более совершенный (по отношению к предшествующему заданию) класс Rectangle. Он должен хранить только декартовы координаты четырех углов прямоугольника. Конструктор вызывает набор функций, которые принимают четыре группы координат и проверяют, чтобы каждая из координат x и y находилась в первом квадранте, в диапазоне от 0.0 до 20.0. Также должна выполняться проверка: действительно ли переданные координаты определяют прямоугольник. Должны быть предусмотрены функции-элементы, вычисляющие length, width, perimeter и area. Длиной считается большее из двух измерений. Включите предикатную функцию square, которая определяла бы, не является ли прямоугольник квадратом.
5. Модифицируйте класс Rectangle в предыдущем задании так, чтобы добавить в него функцию draw, которая изображает прямоугольник внутри окна 25 на 25, перекрывающего часть первого квадранта, в котором находится прямоугольник. Включите функцию setFillCharacter, чтобы задавать символ, которым будет заполняться прямоугольник внутри. Добавьте функцию setPerimeterCharacter, чтобы задавать символ, которым будут печататься границы прямоугольника. Можете включить функции масштабирования размера прямоугольника, его вращения и перемещения в пределах первого квадранта.
6. Создайте класс HugeInteger, который использует массив из 40 элементов для хранения целых чисел, содержащих до 40 цифр. Создайте функции элементы inputHugeInteger, outputHugeInteger, addHugeIntegers и substractHugeIntegers для ввода, вывода, сложения и вычитания этих больших целых. Для сравнения объектов HugeInteger создайте функции isEqualTo (равно), isNotEqualTo (неравно), isGreaterThan (больше), isLessThan (меньше), isGreaterThanOrEqualTo (больше или равно), isLessThanOrEqualTo (меньше или равно) – каждая из них является предикатной функцией, которая просто возвращает единицу (истина), если соответствующее соотношение между двумя большими целыми выполняется. Создайте предикатную функцию isZero (нуль). Можно подготовить также функции-элементы multiplayHugeIntegers (умножение), divideHugeIntegers (деление) и modulusHugeIntegers (нахождение абсолютной величины).
7. Создайте класс Date со следующими возможностями:
a) с выводом дат в форматах: DD YYYY; MM/DD/YY; Июнь 14, 2007;
b) с использованием перегруженных конструкторов для создания объектов Date с начальными значениями дат в форматах пункта а);
c) с конструктором Date, который читает системную дату, используя стандартные библиотечные функции заголовочного файла time.h, и передает ее элементам Date.
Напишите демонстрационную программу.
8. Создайте класс SavingsAccount (хранение вкладов) со статическим элементом данных annualInterestRate (процентная ставка) для хранения информации о каждом вкладчике. Каждый элемент этого класса содержит закрытый элемент данных savingsBalance, указывающий сумму, которую вкладчик имеет на депозите. Напишите функцию-элемент calculateMonthlyInterest (расчет ежемесячного дохода), которая ежемесячно вычисляет доход путем деления на 12 произведения balance и annualInterestRate; этот доход $ + 7 % должен прибавляться к savingsBalance. Напишите статическую функцию-элемент modifyInterestRate (изменение процентной ставки), которая задает annualnterestRate новое значение. Напишите программу-драйвер для проверки класса SavingsAccount saver1 и saver2, с балансами $2000.00 и $3000.00 соответственно. Установите annualInterstRate равным 3 %, затем вычислите месячный доход по вкладу и напечатайте новые балансы для каждого из вкладчиков. Затем установите annualInterestRate равным 4 % и повторите операции.
9. Создайте класс IntegerSet (множество целых). Каждый объект класса может вмещать целые в диапазоне от 0 до 100. Множество представляется массивом из нулей и единиц. Элемент массива a[i] равен единице, если целое i находится во множестве. Элемент массива a[j] равен нулю, если целого j нет во множестве. Конструктор по умолчанию инициализирует множество как пустое, т.е. множество, содержащее только нули. Напишите функции-элементы для типичных операций над множествами: функцию-элемент unionOfIntegerSet, которая создает третье множество, являющееся теоретико-множественным объединением двух существующих. (Элемент массива третьего множества устанавливается равным единице, если соответствующий элемент равен единице хотя бы в одном или обоих существующих множествах, и элемент массива третьего множества устанавливается равным нулю, если этот элемент равен нулю в обоих существующих множествах). Функция-элемент intersectionOfIntegerSets создает третье множество, являющееся теоретико-множественным пересечением двух существующих наборов (т.е. элемент массива третьего множества устанавливается равным нулю, если этот элемент равен нулю в одном или обоих существующих множествах, и элемент массива третьего множества устанавливается равным единице, если этот элемент единичный в обоих существующих).
10. Создайте класс SalesPerson, отслеживающий суммы продаж служащего за определенный срок работы. Полями класса должны быть имя продавца PersonName и динамический массив или самоссылочная конструкция для хранения сумм вырученных от продаж средств за каждый месяц MonthlySales. С помощью конструктора всем данным должны присваиваться нулевые начальные значения. Класс должен содержать функции-члены по анализу объемов продаж. Функция-член TotalSales возвращает сумму продаж за весь период работы. MonthSales возвращает сумму, вырученную за один определенный месяц. PeriodSales возвращает сумму продаж за указанный промежуток времени. Все функции-члены класса должны выводить информацию на экран в удобном и понятном для пользователя виде.
11. Создайте три способа работы с данными логического типа boolean:
а) традиционный с использованием препроцессора
#define TRUE 1
#define FALSE 0
#define Boolean int
б) в ANSI C и С++ c использованием перечислимых типов
enum Boolean {false, true};
в) в С++ как класс
class Boolean
{
public: // различные функции-члены, включая перегрузку ! && || == !=
};
Выделите преимущества и недостатки каждого способа. Учтите контекст и проблемы преобразования, а также видимость имен.
12. Разработайте класс person, который содержит соответствующие члены для хранения имени, возраста, пола и телефонного номера. Напишите функции-члены, которые смогут изменять члены-данные индивидуально. Напишите функцию-член person::print(), которая печатает хорошо отформатированные данные о человеке.
13. Напишите функцию swap, которая меняет содержимое двух строк. Если вы поместили строку символов в стек и вытолкнули их во вторую строку, они появятся в обратном порядке. При перестановке двух строк необходимо оставить начальный порядок следования символов. Для того чтобы поменять местами две строки, используйте двустороннюю очередь. Строки будут храниться в двух символьных массивах одинаковой длины, но строки сами по себе могут иметь разные длины. Прототип функции: void swap(char s1[], char s2[]);
14. Определите dequeue (двустороннюю очередь), которая является симмет-ричной очередью, допускающей помещение и выталкивание с обеих сторон.
class dequeue
{ char s[max_len];
int bottom, top;
public:
void reset() {top = bottom = max_len / 2; top--;}
};
Объявите и реализуйте push_t, pop_t, push_t, pop_b, out_stack, top_of, bottom_of, empty и full. Функция push_t означает вталкивание на дно. Функция out_stack должна выводить стек от дна до вершины. Функция pop_t и pop_b соответствуют выталкиванию из вершины и выталкиванию со дна. Пустой стек обозначается наличием падения вершины ниже дна. Проверьте каждую функцию.
15. Расширьте тип данных двусторонняя очередь (dequeue), добавляя функцию-член relocate (перемещение). Если двусторонняя очередь полна, тогда вызывается relocate, и содержимое двусторонней очереди перемещается для уравновешивания свободной памяти около центра max_len/ 2 массива s. Функция должна возвращать true, если relocate успешно, false, если она терпит неудачу
boolean dequeue::relocate().
В следующих заданиях предлагается описать указанный класс и продемон-стрировать его использование.
16. Вектор в трехмерном евклидовом пространстве задается своими полярными координатами. Обязательны функции-члены класса для ввода вектора и вывода квадрата вектора;
17. Угол на плоскости с членами класса:
– величина угла в градусах;
– функции-члены для ввода/вывода величины угла;
– перевода угла в радианы;
– нахождение sin угла.
18. Квадратная целочисленная матрица с функциями-членами класса для ввода/вывода матрицы и вычисления произведения матриц.
19. Создание очереди с функциями-членами для ввода/вывода членов очереди;
пополнение и обслуживание членов этой очереди.
20. Точка в текстовом режиме. Должны быть предоставлены возможности:
– высветить точку в определенном месте экрана с определенным цветом;
– определить, видима ли точка в данный момент;
– получить координаты точки после поворота отрезка, соединяющего эту точку с началом координат, на заданный угол.
21. Кольцевой список. Обязательны функции-члены класса:
– для добавления/удаления элемента;
– проверки присутствия указанного элемента;
– вывода текущих элементов списка.
22. Создайте класс stopwatch для имитации секундомера (примечание: используйте конструктор для начальной установки секундомера в нуль). Обязательны функции-члены класса для запуска секундомера, для его остановки, снятия показаний секундомера (примечание: используйте функцию clock() из библиотеки <time.h>).
Отчет должен содержать:
1) номер работы, название;
2) тексты и результаты выполнения программы;
3) выводы: изученные теоретические знания.