Отчет_лаб3 (Лабораторная работа №3)
Описание файла
Файл "Отчет_лаб3" внутри архива находится в следующих папках: Лабораторная работа №3, lab3. Документ из архива "Лабораторная работа №3", который расположен в категории "". Всё это находится в предмете "объектно-ориентированное программирование (ооп)" из 3 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "лабораторные работы", в предмете "объектно-ориентированное программирование (ооп)" в общих файлах.
Онлайн просмотр документа "Отчет_лаб3"
Текст из документа "Отчет_лаб3"
Московский государственный технический университет им. Н.Э.Баумана
_________________________________________________________________
Лабораторная работа №3 по дисциплине ПППО
«Изучение классов LIST и LISTITERATOR »
ИСПОЛНИТЕЛЬ: | |
студент группы ИУ5-63 | _____________________ |
Абламцев Д.М. | "__"_____________2006 г. |
Москва - 2006
________________________________________________________________
-
Цель работы
Целью лабораторной работы является продвинутое изучение оболочки (IDE) системы программирования BC 3.1 C++ и семейства классов для работы со списками (OBJECT, LIST и LISTITERATOR) библиотеки CLASSLIB. В результате студенты должны приобрести навыки изучения классов и навыки работы со стандартными классами (по материалам лекций, справочной информации BC 3.1, документации и файлам LIST.CPP, OBJECT.CPP , OBJECT.H И LIST.H), освоить структуру классов, описание объектов этих классов и методы использования классов сложной контейнерной структуры. Cоздать собственный класс MyObj на основе абстрактного класса (OBJECT), перегрузить стандартные чистые виртуальные функции.
Код задания: 1В, 2.3В, 3.2В, 4.4В
-
Порядок работы:
В лабораторной работе в изложенном ниже порядке должны быть отражены следующие действия:
Обязательные требования:
-
Описание списков А и В (см. 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););
Дополнительные требования:
-
Создать порожденный класс на основе списка LIST и создать и перегрузить в нем операции:
-
Печати списка PrintList;
-
Добавление нового элемента в конец ("хвост") списка - addTail.
-
Присваивания существующему списку значения другого существующего списка – операция "=". Перед присваиванием новый список очищается.
-
Добавление нового элемента в список после заданного - addCurrent.
-
-
Перечень ошибок исправленных при отладке программы
Трудностей и ошибок не возникло.
-
Диаграмма классов
5. Листинги программ.
Lab3.cpp
#include <iostream.h>
#include <list.h>
#include "info.h"
class _CLASSTYPE MyObj : public Object
{
public:
MyObj(int i=0) { inum=i; }
MyObj(MyObj& obj) { inum=obj.get_inum(); }
~MyObj() {}
virtual void printOn(ostream& out) const
{ out << inum << endl; }
virtual char _FAR *nameOf() const
{return "Int Number";}
virtual classType isA() const
{ return 0xAA; }
virtual hashValueType hashValue() const
{ return 0xAA; }
virtual int isEqual( const Object _FAR & m) const
{ return ((MyObj&)m).inum==inum; }
int get_inum(void) {return inum;}
private:
int inum;
};
class _CLASSTYPE MyList : public List
{
public:
MyList() { List(); }
virtual ~MyList() { flush();}
MyList& operator=(const MyList& A);
};
MyList& MyList::operator=(const MyList& A)
{
this->flush();
MyList B;
ListIterator IA(A);
while(IA)
{
B.add(*new MyObj((MyObj&)IA.current()));
IA++;
}
ListIterator IB(B);
while(IB)
{
this->add(*new MyObj((MyObj&)IB.current()));
IB++;
}
return *this;
}
void main(void)
{
MyList A, *B = new MyList;
MyObj obj;
int n;
PrintInfo();
cout << "Ââåäèòå èíèöèàëèçèðóåùåå ÷èñëî: ";
cin >> n;
for(int i=0;i<5;i++,n++)
A.add(* new MyObj(n*n+n+1));
cout << "List A(printOn): " << endl;
// A.printOn(cout);
ListIterator IA(A);
for(i=0;i<A.getItemsInContainer();i++)
IA++.printOn(cout);
cout << "List B(empty): " << endl;
B->printOn(cout);
*B=A;
cout << "List B(B=A): " << endl;
B->printOn(cout);
cout << "Äîáàâëåíèå 1îãî íîâîãî ýëåìåíòà â À..." << endl << "Ââåäèòå íîâûé ýëåìåíò: ";
cin >> n;
A.add(* new MyObj(n));
cout << "Óäàëåíèå òðåòüåãî ýëåìåíòà èç Â..." << endl;
IA=(ListIterator&)(B->initIterator());
IA.restart();
IA++;
IA++;
B->detach((MyObj&)IA.current(),TShouldDelete::Delete);
cout << "List A: " << endl;
A.printOn(cout);
cout << "List B(B=A): " << endl;
B->printOn(cout);
}
5