лаб3 отчет (Лабораторная работа №3)
Описание файла
Файл "лаб3 отчет" внутри архива находится в следующих папках: Лабораторная работа №3, 3. Документ из архива "Лабораторная работа №3", который расположен в категории "". Всё это находится в предмете "объектно-ориентированное программирование (ооп)" из 3 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "лабораторные работы", в предмете "объектно-ориентированное программирование (ооп)" в общих файлах.
Онлайн просмотр документа "лаб3 отчет"
Текст из документа "лаб3 отчет"
Московский Государственный Технический Университет им. Н. Э. Баумана |
Лабораторная работа №3 по курсу Объектно-Ориентированное Программирование «Изучение классов LIST и LISTITERATOR » |
Выполнил: Студент группы ИУ5-34 Белоус К.С. _____________________ Принял: Гапанюк Ю.Е. _____________________ |
Москва 2009 |
Цель работы
Целью лабораторной работы является продвинутое изучение оболочки (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) и с помощью броузера классов и просмотра каталогов СП.
Действия и операции, необходимые к выполнению
-
Описание списков А и В (см. 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.
-
Перечень ошибок
1. Синтаксические ошибки.
2. Неправильное переопределение виртуальных функций в собственном классе.
Диаграмма классов.
ios – сохраняет информацию о потоке, содержит операторы для форматирования.
ostream – содержит перегрузку операции <<.
istream – содержит перегрузку операции >>.
iostream – обобщенный класс классов ostream и istream.
streambuf – обеспечивает операции ввода/вывода на низком уровне (взаимодействие с устройствами).
ostream_withassign, istream_withassign, iostream_withassign – содержат перегрузку операций =.
TShouldDelete – абстрактный класс, предоставляющий интерфейс для контейнеров, в котором определена операция удаления элемента.
Collection – содержит описание функции добавление элемента в массив, поиск элемента в массиве.
Container – содержит функции печати массива и др.
ListElement – является родителем всего, что мы захотим хранить в нашей структуре данных.
ContainerIterator – определяет функции иерархического прохождения через объекты.
ListIterator – итератор списка.
Диаграмма объектов программы
Листинг программы
Файл lab3.cpp
#include <LIST.H>
#include <STRING.h>
#include <STRNG.h>
#include <iostream.h>
#include <iostream.h>
#include <list.h>
#include <conio.h>
class MyObj: public Object //новый класс MyObj на основе класса Object
{
float i;
static MyObj *start;
MyObj *firstst;
MyObj *next;
MyObj *prev;
public: virtual classType isA() const { return 0; };
virtual char _FAR *nameOf() const { return "Real list"; };
virtual hashValueType hashValue() const { return 0; };
virtual int isEqual( const Object _FAR &obj) const
{ return (i==((MyObj &)obj).i);};
virtual void printOn(ostream _FAR &os) const
{ os<<"Number is "<<i; };
MyObj(float num) { i=num; };
MyObj(ostream _FAR &) { cin>>i; };
~MyObj() {cout<<"\n Destruct! "<<i<<" "; };
};
void Delete(List &Dl, int pos) //процедура удаления конкретного по номеру в списке элемента
{
ListIterator IDl(Dl);
IDl.restart();
for (int i=0; i<pos; i++) IDl++;
Dl.detach(IDl.current(), TShouldDelete::Delete);
}
void Info(void);
main()
{ int total_in_list=5;
clrscr(); //очистка экрана
Info(); //вывод начальной информации
List A, B; //описание объектов типа List через имя
MyObj *MyListObj;
for (int i=0; i<total_in_list; i++) //ввод элементов в список А
{ MyListObj=new MyObj(cout<<"Enter real value: ");
A.add(*MyListObj);
}
ListIterator Ai(A); //итератор списка для списка А
Ai.restart(); //сброс указателя списка на начало
cout<<"\nContents of List A:";
while (Ai.current()!= NOOBJECT)//вывод списков А и В
{ Ai.current().printOn(cout<<endl); Ai++;}
B.printOn(cout<<"\nContents of List B:\n");
List temp; //временный список для заполнения В из А
Ai.restart();
while (Ai.current()!=NOOBJECT)
{ temp.add(*new MyObj((MyObj &)(Ai.current()))); Ai++; }
ListIterator Itemp(temp);
Itemp.restart();
while (Itemp.current()!=NOOBJECT)
{ B.add(*new MyObj((MyObj &)(Itemp.current()))); Itemp++; }
B.printOn(cout<<"\nContents of List B:\n"); //вывод заполненного В
for (i=0; i<3; i++)
{ MyListObj = new MyObj(cout<<"Enter real value: "); //добавление в лист А 3-х новых элементов
A.add(*MyListObj); }
A.printOn(cout<<"\nContents of List A after adding new 3 elements:\n"); //вывод А
Delete(A, 0); //удаление в А первого элемента
A.printOn(cout<<"\nContents of List A after deleted 1rd element:\n");
getch();
ListIterator Bi(B); //создание новых итераторов дял списков А и В
ListIterator Aii(A);
Bi.restart();
Aii.restart();
cout<<"\nContents of List A:";
while (int (Aii) != 0)
{ Aii.current().printOn(cout<<endl);
Aii++;
}
return 0;
}
Файл lab32.cpp
#include <iostream.h>
void Info(void){
cout << "\tLab #3"; //vivod spravki
cout << "\nMade by student of group IU5-34 Belous K., Var. 3"<<endl;
}
Результаты работы программы