LAB3PPPO (Лабораторная работа №3)
Описание файла
Файл "LAB3PPPO" внутри архива находится в следующих папках: Лабораторная работа №3, [ООП - 2 курс] Лабораторная работа №3. Документ из архива "Лабораторная работа №3", который расположен в категории "". Всё это находится в предмете "объектно-ориентированное программирование (ооп)" из 3 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "лабораторные работы", в предмете "объектно-ориентированное программирование (ооп)" в общих файлах.
Онлайн просмотр документа "LAB3PPPO"
Текст из документа "LAB3PPPO"
6
ООП – Большаков С.А. 2008/2009Требования к ЛР № 3 по курсу ООП
(3 курс ИУ5 5 семестр 2008 г.)
“ Изучение классов LIST и LISTITERATOR”
-
Цель работы
Целью лабораторной работы является продвинутое изучение оболочки (IDE) системы программирования BC 3.1 C++ и семейства классов для работы со списками (OBJECT, LIST и LISTITERATOR) библиотеки CLASSLIB. В результате студенты должны приобрести навыки изучения классов и навыки работы со стандартными классами (по материалам лекций, справочной информации BC 3.1, документации и файлам LIST.CPP, OBJECT.CPP , OBJECT.H И LIST.H), освоить структуру классов, описание объектов этих классов и методы использования классов сложной контейнерной структуры. Студенты знакомятся также с понятием наследованием классов, создают собственный класс MyObj на основе абстрактного класса (OBJECT), перегружают стандартные чистые виртуальные функции и другие методы, а также получают навыки поиска информации о классах по исходным текстам программ (*.cpp, *.hpp, *.h) и с помощью броузера классов и просмотра каталогов СП.
-
Изучаемые вопросы
В процессе лабораторной работы № 2 (она рассчитана на 6 часов плюс время на оформление отчета) необходимо изучить следующие действия и вопросы:
-
Освоить порядок и особенности работы с оболочкой: просмотр структуры классов с помощью BROWSER CLASES (для этого необходимо правильно выполнить настройки компилятора и редактора связей)
-
Изучать файлы описания классов и их методов: LIST.CPP, OBJECT.CPP, OBJECT.H и LIST.H. Детально рассмотреть их структуру, цепочки наследования и состав классов (свойства и метода);
-
Освоить приемы самостоятельного описания класса наследников от абстрактного класса OBJECT (класс MyObj). Тип данного класса определяется вариантом задания.
-
Создание объектов типа LIST и LISTITERATOR;
-
Создание объектов типа LIST с помощью копирования из одного списка в другой список (A->B);
-
Добавление элементов в список (типа MyObj) с помощью стандартного метода add;
-
Печать списков с помощью метода printOn;
-
Оценить недостатки классов список BC 3.1 C++ (трудности при работе с объектами);
-
Изучать использование класса LISTITERATOR для навигации по спискам;
-
Выполнить удаление элементов из списка с помощью метода detach;
-
Изучить вложенный класс ListElement в класс LIST (его свойств и методов). Отображение его на диаграмме классов и в отчете по ЛР. Его назначение и использование. Тип отношения между классами ListElement и LIST.
-
Изучить другие методы класса LIST, в частности: getItemsInContainer и др.
-
Изучить последовательность удаления объектов, включенных в контейнер, при удалении самого контейнера (для этого нужно в новом объекте определить деструктор типа: ~MyObj(){ cout << "delete MyObj"<< Num << endl; };
где Num, переменная, определяющая содержание нового объекта (выбирается по вариантам, данном случае объект целое число).
-
Освоить построение многомодульных проектов (минимум два файла) и плюс заголовочные файлы, которые тоже нужно включить в проект. Узнать преимущества работы с проектами для программистов.
-
Порядок работы
Для выполнения лабораторной работы в полном объеме студенты должны выполнить следующие действия и пункты:
-
Составить диаграммы классов LIST и LISTITERATOR.
-
Составить диаграмму объектов собственной программы для заданной точки выполнения программы.
-
Составить блок-схемы методов, и написать программу в соответствии с требованиями (ниже), состоящей из двух исходных файлов.
-
Создать (Project-> Open Project -> <новое имя>, Project-> Add Item -> <выбор модуля> и кнопка Add) и грамотно настроить проектный файл для программы ЛР (option -> directories, option ->compilers->Code generation <small>), во втором файле должна быть описана функция для вывода справки о программе (на COUT) с номером варианта, группой и ФИО студента.
-
Освоить работу в отладчике: пошаговое выполнение, просмотр переменных и объектов, установку точек останова, просмотр стека вызова, выходного экрана, условные остановы и изменения значений переменных при выполнении программ, просмотр сложных объектов и структур.
-
Отладить программу с помощью отладчика с просмотром классов, используемых для создания объектов программы. Прогнать программу в пошаговом режиме с просмотром переменных.
-
Сформировать листинг программы и листинг результатов.
-
Оформить отчет по ЛР.
-
Требования к работе
В лабораторной работе в изложенном ниже порядке должны быть отражены следующие действия:
Обязательные требования:
-
Описание списков А и В (см. 1-й пункт вариантов). При описании через указатели первоначально описывается указатель на объект (List *A;), а затем вод объект выделяется память ( А= new List;). Или сразу: List *A = new List;
-
Описание нового класса с именем MyObj, наследованного от класса OBJECT (см. 2-й пункт вариантов). При описании нового класса необходимо перегрузить все чистые виртуальные функции, определенные в классе OBJECT (см. OBJECT.H), создать конструкторы и деструктор, описать данные и методы класса, кроме описания стандартных методов (см. ниже). Перечень этих функций и пример их определения для нового целого типа дан ниже:
virtual classType isA() const { return 0; };
virtual char _FAR *nameOf() const { return "Number";};
virtual hashValueType hashValue() const {return 0;};
virtual int isEqual( const Object _FAR & )const { return 0; };
virtual void printOn( ostream _FAR & ) const { cout << " Число - " << Num ;};
-
Ввод данных типа MyObj выполнить с консоли и из программы (способ для ввода определяется типом конструкторов объекта при вводе с клавиатуры и вычислением изменяемого параметра в программе). Занести в цикле новые объекты в список A (минимально 5 элементов). При занесении в список нужно учитывать, что всегда занесение элементов выполняется в начало списка ("в голову"). Объекты должны создаваться с помощью оператора new.
-
Выполнить распечатку содержимого списка А с помощью цикла (используется специальные объекты класса LISTITERATOR, специально создаваемые для списка А) и с помощью функции печати класса LISTITERATOR (printOn). Для нового объекта MyObj должна быть перегружена printOn, которая будет вызываться при печати списка (в этом методе должен быть указан тип объекта для печати).
-
Распечатать пустой список В с помощью printOn;
-
Сформировать список В, как копию списка А (необходим цикл). При выполнении копирования, ввиду того, что занесение идет в начало списка, поэтому нужно воспользоваться либо дополнительным списком, выполнив цикл дважды (A->B1 и B1->B), либо дополнительным массивом указателей (MyObj *MasMyObj[10];) на объекты массива А, который должен быть сформирован при вводе списка (также получается два цикла, заполнение MasN[i] = new MyObj ( i );). Для навигации по списку А должен также использоваться объект класса LISTITERATOR. При занесении в списки используется метод add (пример):
B.add(*new MyObj ( (MyObj &) AI.current()));
Или
B.add(*new MyObj (*MasMyObj[i]));
Или
B.add(*MasMyObj[i]);
В последнем случае не создается нового объекта, а его адрес заносится в новый список B.
Примечние: Запись B.add(*new MyObj ( (MyObj &) AI.current())); означает: в список В добавляется новый элемент, построенный на основе текущего элемента списка А, указываемого итератором AI, который построен для списка А ( нужно описать ListIterator AI((List)A); и вызвать A.initIterator();), содержащего элементы в виде строк (String или другие варианты).
При распечатке массива MasMyObj (массив указателей) можно воспользоваться оператором типа: MasMyObj [i]->printOn(cout);
-
Распечатать список В с помощью метода printOn;
-
Обеспечить добавление в список А новых элемента по варианту (см. 3-й пункт вариантов). Элементы добавляются в начало списка А.
-
Показать удаление из списка B или А элементов c помощью метода detach (см. 4-й пункт вариантов). При удалении нужно использовать метод detach из класса LIST и указывать тип удаления TShouldDelete :: Delete для 2-го параметра. Первый параметр функции detach определяет адрес объекта, поэтому необходимо использовать указатель из массива MasMyObj[i] (пределяющий удаляемый объект) или отдельный указатель для запоминания адреса удаляемого объекта. Обратите внимание и на то, что для правильного удаления в классе MyObj должна быть корректно переопределена виртуальная функция isEqual. Примеры переопределения для разных вариантов даны ниже (для чисел и строк):
virtual int isEqual( const Object _FAR & test)const
{ return ((MyObj & ) test).Num == Num; }; - для чисел
или
virtual String isEqual( const Object& testString ) const
{
return ( len == ((String &)testString).len &&
!strcmp( theString, ((String &)testString).theString ) ); } – для строк
-
Распечатать списки А и В с помощью объекта ListIterator (нужно описать ListIterator AI((List)A); и вызвать A.initIterator();) цикла, построенного на основе методов этого класса ListIterator. Использовать методы: int, restart и current. При печати каждого элемента списка использовать метод printOn( используется вызов функции через итератор - BI.current().printOn(cout););
-
Продемонстрируйте в программе использование методов flush и isEmpty для объектов класса LIST;
Дополнительные требования:
-
Создать порожденный класс на основе списка LIST и создать и перегрузить в нем операции:
-
Печати списка PrintList;
-
Добавление нового элемента в конец ("хвост") списка - addTail.
-
Присваивания существующему списку значения другого существующего списка – операция "=". Перед присваиванием новый список очищается.
-
Добавление нового элемента в список после заданного - addCurrent.
-
-
Оформление отчета
В отчет по ЛР должно быть включено:
-
Титульный лист, цель и порядок работы
-
Перечень ошибок при отладке, недостатки классов LIST
-
Диаграмма классов OBJECT, LIST и LISTITERATOR (или новых)
-
Описание изучаемых классов (назначение, свойства и методы).
-
Диаграмма объектов программы ЛР
-
Листинг программы и листинг результатов ее работы.
-
Варианты (см. таблицу вариантов ниже)
Для индивидуализации задания студента введены вариантные требования, смысл которых раскрывается ниже. Окончательный вариант задания выделен в таблице.
Вариантные требования:
-
Создание списка В с помощью указателя или без указателя на основе имени объекта (1 – используется имя без указателя, 1В – с указателем)
-
Использование нового типа MyObj для работы со списками (2В)
-
Тип действительное число(2.1В) – собственный простой класс
-
Тип строка (2.2В) – собственный простой класс
-
Тип целого числа (2.3В) – собственный простой класс
-
Динамическое добавление элемента в список (3В)
-
2-х новых элементов (3.1В)
-
1-го нового элемента (3.2В)
-
3-х новых элементов (3.3 В)
Обеспечить удаление элементов из списков А или В (4В):
-
Из А - 1-го (4.1В)
-
Из В - 1-го (4.2В)
-
Из А – 5-го (4.3В)
-
Из В - 3-го (4.4В)
-
Из А - 3-го (4.5В)
-
Из В – 5-го (4.6В)
Варианты | 1-10(по сп.) | 13-24(по сп.) | 24-35(по сп.) |
ИУ5- 61 | 1, 2.3В, 3.1В, 4.3В | 1, 2.2В, 3.1В, 4.4В | 1, 2.2В, 3.1В, 4.4В |
ИУ5- 62 | 1В, 2.2В, 3.1В, 4.1В | 1В, 2.1В, 3.2В, 4.5В | 1, 2.3В, 3.1В, 4.3В |
ИУ5- 63 | 1, 2.1В, 3.3В, 4.1В | 1, 2.2В, 3.2В, 4.2В | 1В, 2.3В, 3.2В, 4.4В |
ИУ5- 64 | 1В, 2.2В, 3.3В, 4.6В | 1В, 2.1В, 3.2В, 4.6В | 1, 2.3В, 3.3В, 4.5В |
Примечание: 1-10(по сп.) – означает 1 – 10 варианты по списку группы.
1В, 2.2В, 3.2В, 4.6В – означает: использование указателя (1В), тип строка (2.2В), добавление 1-го элемента в список (3.2В), удаление 5-го элемента из списка В (4.6В)
-
Контрольные вопросы к ЛР №3
-
Поясните структуру классов для LIST по диаграмме классов?
-
Какие данные и методы определены в этом классе?
-
Для чего используется класс LISTITERATOR? Его методы?
-
Поясните структуру объектов для программы по диаграмме объектов? Какие объекты являются временными, и какие сохраняются в программе все время ее работы?
-
Что такое наследование классов? Поясните на примере MyObj?
-
Для чего нужен класс Object в системе классов BC 3.1?
-
Что такое абстрактный класс?
-
Какие преимущества появляются у программиста при использовании проектов в BC++?
-
Какие классы являются дружественными классу LIST, классу ListElement? Покажите эти отношения на диаграмме классов.
-
В каком отношении находятся классы LIST и ListElement?
-
Почему нужно перегружать стандартные виртуальные функции класса Object?
-
Для чего может быть использован метод – findPred класса LIST? Можно ли его использовать в программе, в порожденном классе? Если нет, то почему?
-
Как должен быть описан класс наследник от Object( MyObj)?
-
Назначение и использование метода detach, flush? Чем ониотличаются?
-
Назначение и использование методов int, restart и current?
-
Поясните запись – “ListIterator LBI((List)LB);”?
-
Поясните записи – “int(LBI)” и “LBI++”?
-
Что нужно для просмотра классов программы? Как ее распечатать?
-
Для чего нужен класс ListElement и где можно найти его описание?
-
Можно ли создавать объекты класса ListElement вне методов класса LIST?
-
Можно ли по текущему элементу списка определить следующий или предыдущий объект списка?
-
Какие чистые виртуальные функции переопределены в класса LIST?
-
Какие чистые виртуальные функции переопределены в класса LISTITERATOR?
-
Можно ли удалить элемент в списке по номеру?
-
Почему новые объекты могут быть добавлены только в начало списка? Пояснить по распечатке метода add в исходном модуле.
-
Можно ли использовать для объектов класса LIST методы printHeader, printSeparator и printTrailer из класса родителя Container класса LIST? И как?
Срок сдачи ЛР № 3 - 7-я неделя семестра.