ооп3 (1077297)
Текст из файла
Московский Государственный Технический Университет имени Н. Э. Баумана
Отчет к лабораторной работе №3
“ Изучение классов LIST и LISTITERATOR ”
Работу выполнила студентка группы ИУ-5-31
Черненькая И.С.
Работу проверил преподаватель
Гапанюк Ю.Е.
Москва
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) и с помощью броузера классов и просмотра каталогов СП.
Порядок выполнения работы
-
Составить диаграммы классов 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]);
При распечатке массива 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;
Диаграмма классов
Текст программы
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 << "Лабораторная работа №3 \nЧерненькая Ирина, ИУ5-31 \nВариант №30\n\n";
}
Результаты работы
7
Характеристики
Тип файла документ
Документы такого типа открываются такими программами, как Microsoft Office Word на компьютерах Windows, Apple Pages на компьютерах Mac, Open Office - бесплатная альтернатива на различных платформах, в том числе Linux. Наиболее простым и современным решением будут Google документы, так как открываются онлайн без скачивания прямо в браузере на любой платформе. Существуют российские качественные аналоги, например от Яндекса.
Будьте внимательны на мобильных устройствах, так как там используются упрощённый функционал даже в официальном приложении от Microsoft, поэтому для просмотра скачивайте PDF-версию. А если нужно редактировать файл, то используйте оригинальный файл.
Файлы такого типа обычно разбиты на страницы, а текст может быть форматированным (жирный, курсив, выбор шрифта, таблицы и т.п.), а также в него можно добавлять изображения. Формат идеально подходит для рефератов, докладов и РПЗ курсовых проектов, которые необходимо распечатать. Кстати перед печатью также сохраняйте файл в PDF, так как принтер может начудить со шрифтами.















