Лабораторная работа №9. Множественное наследование. Полиморфизм.

Выполните задания в строгом соответствии с условиями задачи.

Крайний срок сдачи работы: 9 мая 2009 г.

Выполнение заданий – строго индивидуальное. Случаи обнаружения плагиата будут наказываться выставлением баллов с отрицательным коэффициентом за украденные задания (исправить штрафные баллы можно будет, лишь выполняя дополнительные задания). Архив, содержащий исходные и исполняемые файлы лабораторной работы, должен быть размещен на персональном блоге студента на сайте ps. margtu. ru не позднее крайнего срока сдачи. Ссылка (с указанием ФИО и группы) на страницу с выполненной работой должна быть размещена в виде комментария к записи в блоге преподавателя, посвященной данной лабораторной работе.

Каждая выполненная программа должна располагаться в 2-х папках – bin и src (не scr, а именно src). Папка bin должна содержать исполняемый файл (собранный в Release-конфигурации) и набор входных файлов, необходимых для автоматической проверки заданий. Папка src должна содержать набор исходных файлов и файлов проекта Visual Studio, необходимых и достаточных для сборки проекта. Папки, содержащие временные файлы (*.obj и прочие), а также автоматически генерируемые файлы с расширением. ncb, .opt, .aps, .plg, .suo в архиве с выполненной работой содержаться не должны.

Внимание, программы, претендующие на оценку «отлично», должны удовлетворять требованиям соглашений о стиле кодирования на Си и Си++. Системные ресурсы (открытые файлы, динамически выделенная память) должны освобождаться как только в них отпадает нужда (строго говоря, это касается работ и на другие оценки, но именно к работам на оценку «отлично» будут предъявляться наиболее высокие требования по качеству исполнения).

НЕ нашли? Не то? Что вы ищете?

Задания

На оценку «удовлетворительно» необходимо набрать не менее 80 баллов

На оценку «хорошо» необходимо набрать не менее 150 баллов

На оценку «отлично» необходимо набрать не менее 300 баллов

Задания на оценку «удовлетворительно»

Задание 1. 10 баллов

Создайте класс CBase, в котором должна быть функция Print().Разместите в теле функции код, выполняющий вывод строки «<Название класса> .Print()”

Создайте класс CDerived, в котором также присутствует функция Print().Разместите в теле функции код, выполняющий вывод строки «<Название класса> .Print()”

В функции main создайте экземпляры классов CBase и CDerived и вызовите для них метод Print()

Создайте указатель на класс CBase, назовите его pBase.

Присвойте указателю pBase адрес объекта базового класса. Вызовите метод Print(). Присвойте указателю pBase адрес объекта производного класса. Вызовите метод Print().

Уберите ключевое слово virtual из определения функции. Проделайте шаги 1 и 2. Запишите в блог сделанные выводы.

Задание 2. 60 баллов

Создайте класс CBase, в котором в качестве данных объявите указатель на целочисленный тип. 10 баллов

    Создайте конструктор, в котором проинициализируйте выделение памяти под N элементов. Разместите в теле конструктора класса код, выполняющий вывод строки «<Название класса> instance was created” (экземпляр класса «название класса» был создан). Создайте деструктор, где выделенную память очистите. Разместите в теле деструктора код, выводящий надпись «<Название класса> instance was destroyed» (экземпляр класса «Название класса» был разрушен).

Создайте класс CDerived, в котором в качестве данных объявите указатель на символьный тип. 10 баллов

    Создайте конструктор, в котором проинициализируйте выделение памяти под M элементов. Разместите в теле конструктора класса код, выполняющий вывод строки «<Название класса> instance was created” (экземпляр класса «название класса» был создан). Создайте деструктор, где выделенную память очистите. Разместите в теле деструктора код, выводящий надпись «<Название класса> instance was destroyed» (экземпляр класса «Название класса» был разрушен).

Создайте экземпляр класса CBase, создайте экземпляр класса CDerived. Создайте указатель на класс CBase и присвойте ему адрес объекта класса CDerived. Вызовите деструктор для указателя. Утечки памяти? Доработайте программу, чтобы локализовать утечки памяти. 10 баллов

Задание 3. 40 баллов

Создайте абстрактный базовый класс CFigure с виртуальными функциями – GetVolume и функцией Print, которая выводит информацию о фигуре 5 баллов

Создайте производный класс “Параллелепипед”, в котором переопределите функцию GetVolume. Объем параллелепипеда вычисляется по формуле: V=xyz. Переопределите функцию печати о фигуре. В классе должен присутствовать конструктор; а также функции, которые позволяют изменять(получать) значения x, y и z; . 15 баллов

Создать производный класс “пирамида”, в котором переопределите функцию GetVolume. Объем пирамиды: V=xyh (x, y, - стороны, h - высота) Переопределите функцию печати о фигуре. В классе должен присутствовать конструктор и функции, которые позволяют изменять (получать) значения x, y и h 15 баллов

Создать производный класс “шар, в котором переопределите функцию GetVolume. Переопределите функцию печати о фигуре. Объем шара: V=4p r3/3. В классе должен присутствовать конструктор и функции, которые позволяют изменять(получать) значения r. 15 баллов

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

Задание 4. Множественное наследование. 40 баллов

Создайте базовый класс CBase в котором хранится целочисленная переменная m_baseCount (данные) и определены след. функции: конструктор, в который передается переменная типа int; функция show(), которая выводит содержимое переменной на экран. Вывод на экран должен выглядеть приблизительно так: “CBase. show() m_baseCount =10” 5 баллов

Определите класс CLeft, производный от CBase, в котором есть целочисленная переменная m_leftCount. В этом классе должны присутствовать след. функции:

    конструктор инициализации, который инициализирует переменных m_leftCount и m_baseCount переданными пользователем значениями 5 баллов функция show(), которая выводит содержимое переменной на экран. Вывод на экран должен выглядеть приблизительно так: “CLeft. show() m_leftCount=10” 5 баллов

Определите класс CRight, производный от CBase, в котором есть целочисленная переменная m_rightCount. В этом классе должны присутствовать след. функции:

    конструктор инициализации, который инициализирует переменных m_rightCount и m_baseCount переданными пользователем значениями 5 баллов функция show(), которая выводит содержимое переменной на экран. Вывод на экран должен выглядеть приблизительно так: “CRight. show() m_rightCount=10” 5 баллов

Создайте класс CBottom и унаследуйте его от классов CLeft и CRight. Наследование открытое: “is a”. 5 баллов

Создайте объект класса CBottom с именем bottom и вызовите у него функцию show() Какая проблема у вас возникла? Как ее можно решить? 5 баллов

Создайте указатель на СBase с именем pBase и присвойте ему адрес объекта bottom. Какая проблема возникла? Решите ее, используя виртуальный базовый класс. Исправьте класс CBase так, чтобы вам не приходилось вызывать конструктор CBase внутри CBottom. 10 баллов

Задание 5. Классы, содержащие массивы встроенных типов данных 100 баллов

Изучение особенностей определения класса, содержащего указатели на встроенные типы данных. Определение конструкторов, деструктора, операций присваивания и индексирования.

Создайте класс CIntSet - множество из элементов типа целые положительные числа, который состоит из следующих данных:

·  указатель на тип unsigned int или int;

·  мощность множества (максимальное количество элементов в множестве);

·  количество элементов в данном множестве.

Множество - совокупность однотипных неповторяющихся элементов, для которого определены следующие операции:

·  пересечение двух множеств состоит из элементов, входящих как в одно, так и другое множество (обозначается *);

·  объединение двух множеств состоит из элементов, входящих или в одно или в другое множество или в оба вместе(обозначается +);

·  разность множеств A и B состоит из элементов A, не принадлежащих B (обозначается -);

·  множество A содержится в множестве B (обозначается <), если каждый элемент A содержится в B;

·  множества A и B эквивалентны, если A<B и B<A (обозначается ==), т. е. каж-дый элемент из A содержится в B и наоборот каждый элемент из B содержится в A.

·  множество называется пустым (обозначается 0), если оно не содержит ни одного элемента.

·  Мощность множества одинакова для всех объектов Intset, и поэтому должна иметь описатель static.

Дополнительно к общему заданию определить для класса Intset:

·  конструктор по умолчанию, определяющий пустое множество;

·  функцию member с параметром положительное целое число, возвращающее "истинно", если множество содержит элемент с соответствующим значением, и "ложно" в противном случае;

·  функцию insert c параметром положительное целое число, осуществляющую добавление элемента в множество в том случае, если оно еще не содержит такого элемента.

Создайте в функции main() код, демонстрирующий следующие вычисления:

·  A * B + C;

·  (A-B)*C;

·  C = (A == B) ? A : 0

·  C = (A < B) ? A : B

Задание 6. 150 баллов

Создайте базовый класс односвязный список. В классе должны присутствовать след. функции:

    конструктор по умолчанию конструктор с параметрами конструктор копирования деструктор добавление элементов удаление элементов

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

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

Обеспечить возможность получение информации сколько объектов данного типа существует.

Все функции, не меняющие состояние объекта должны быть описаны как константные.