Lab4 - Report (Лабораторная работа №4)
Описание файла
Файл "Lab4 - Report" внутри архива находится в следующих папках: Лабораторная работа №4, лаба 4, 2. Документ из архива "Лабораторная работа №4", который расположен в категории "". Всё это находится в предмете "объектно-ориентированное программирование (ооп)" из 3 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "лабораторные работы", в предмете "объектно-ориентированное программирование (ооп)" в общих файлах.
Онлайн просмотр документа "Lab4 - Report"
Текст из документа "Lab4 - Report"
Московский Государственный Технический Университет
имени Н.Э. Баумана.
УТВЕРЖДАЮ
"___"__________2000 г.
_____________________
(Большаков С.А.)
"Лабораторная работа по ПППО № 4"
Вариант № 4
Группа ИУ5-62
Отчет
(тип документа)
Бумага формата А4
(вид носителя)
9
(количество листов)
ИСПОЛНИТЕЛЬ
" " 2000 г.
_____________________
(Бидяк И.Н.)
Москва – 2000
-
Цель работы
Целью лабораторной работы является изучение оболочки (IDE) системы программирования BC 3.1 C++ и способов наследования классов, использование виртуальных функций. Студенты создают свои классы и исследуют механизмы вызова виртуальных функций.
-
Порядок работы
-
Изучение оболочки BC 3.1 C++ в интерактивном режиме( всех пунктов меню и окон настройки работы оболочки)
-
Составление блок-схемы и написание программы, состоящей из двух исходных файлов.
-
Редактирование текстов в среде оболочки
-
Создание проектного файла
-
Отладка программы с помощью отладчика
-
Формирование листинга программы и листинга результатов
-
Оформление отчета
-
Диаграмма классов Abstr, Deriv1, Deriv2, Deriv3, MyList
-
Диаграмма объектов программы
Штриховая линия на вышеприведенном рисунке означает, что объект pa_4 в разное время указывает на объекты d1_4, d2_4, d3_4.
-
Ошибки, допущенные при написании и отладке программы
-
При удалении из списка AList4 всех объектов классов Deriv2 и Deriv3 сначала присваивал i4=0 вместо i4=1. Это приводило к удалению из списка не только объектов классов Deriv2 и Deriv3, но и вообще всех объектов (из-за особенностей метода MyList::detachAt класса MyList).
-
После удаления очередного объекта из списка AList4 не удалял и вновь выделял память под iterator4 с последующим вызовом метода iterator4->restart(), а просто вызывал iterator4->restart(), что при удалении первого элемента списка приводило к неправильному результату.
-
Сначала не определял для класса Deriv1 виртуальные методы isA, nameOf, hashValue, isEqual, что приводило к выдаче ошибки типа "Cannot create instance of absract class ‘Deriv1’".
-
Сначала не определял для классов Deriv2, Deriv3 виртуальный метод nameOf(), и поэтому при вызове метода Зrint для объектов классов Deriv2 и Deriv3 вместо правильного имени класса выдавалось “Deriv1”.
-
Листинг программы
//Начало файла LAB4MAIN.CPP
//Лабораторная работа по ПППО № : 4
//Номер варианта по списку : 4
//Группа : ИУ5-62
//Автор и исполнитель : Бидяк Иван Николаевич
//Назначение данного файла : Основной файл программы
#include <iostream.h>
#include <iomanip.h>
#include <list.h>
#include <conio.h>
#include "AD1D2D3.h"
#include "MyList.h"
//основная процедура
void main( void )
{
//производим необходимые приготовления для выполнения программы
clrscr();
//Объявляем указатели на объекты классов Abstr, Deriv1, Deriv2, Deriv3
Abstr* pa_4;
Deriv1* pd1_4;
Deriv2* pd2_4;
Deriv3* pd3_4;
//Задаем значения объекты классов Deriv1, Deriv2, Deriv3
cout << "Введите значение для объекта класса Deriv1=>";
Deriv1 d1_4( cin );
cout << "Введите значение для объекта класса Deriv2=>";
Deriv2 d2_4( cin );
cout << "Введите значение для объекта класса Deriv3=>";
Deriv3 d3_4( cin );
//Вызываем метод Print для d1_4, d2_4, d3_4
cout << endl;
cout<<"Вызов метода Print для объектов классов Deriv1, Deriv2, Deriv3:"<<endl;
d1_4.Print( cout );
d2_4.Print( cout );
d3_4.Print( cout );
//Определяем значения указателей pd1_4, pd2_4, pd3_4
pd1_4 = &d1_4;
pd2_4 = &d2_4;
pd3_4 = &d3_4;
//Выводим имена классов и значения объектов для объектов классов
// Deriv1, Deriv2, Deriv3 с помощью виртуального метода Print
cout << endl;
cout << "Вызов метода Print для указателей на ";
cout << "объекты классов Deriv1, Deriv2, Deriv3:" << endl;
pd1_4->Print( cout );
pd2_4->Print( cout );
pd3_4->Print( cout );
//ждем нажатия пользователем любой клавиши
getch();
//Виртуально вызываем метод Print для объектов классов Deriv1, Deriv2, Deriv3
// с использованием указателя типа Abstr pa_4
cout << endl;
cout << "Виртуальный вызов метода Print для объектов классов Deriv1, Deriv2";
cout << " ,Deriv3 " << endl;
cout << "с использованием указателя типа Abstr pa_4:" << endl;
pa_4 = &d1_4;
pa_4->Print( cout );
pa_4 = &d2_4;
pa_4->Print( cout );
pa_4 = &d3_4;
pa_4->Print( cout );
//ждем нажатия пользователем любой клавиши
getch();
//Описываем объект класса MyList
MyList AList4;
//Добавляем в список 5 объектов класса Deriv1
int i4;
for (i4=0; i4<5; i4++)
AList4.add( *(new Deriv1( (i4+1)*1 )) );
//Добавляем в список 5 объектов класса Deriv2
for (i4=0; i4<5; i4++)
AList4.add( *(new Deriv2( (i4+1)*2 )) );
//Добавляем в список 5 объектов класса Deriv2
for (i4=0; i4<5; i4++)
AList4.add( *(new Deriv3( (i4+1)*3 )) );
//Распечатываем содержимое списка AList
cout << endl << "Распечатка списка с помощью метода printOn:" <<endl;
ListIterator* iterator4 = 0;
iterator4 = new ListIterator( AList4 );
iterator4->restart();
cout << "{";
while ( iterator4->current()!=NOOBJECT )
{
cout<<" ";
iterator4->current().printOn( cout );
(*iterator4)++;
if ( iterator4->current()!=NOOBJECT )
cout<< ",";
}
cout << " }" <<endl;
//ждем нажатия пользователем любой клавиши
getch();
//Распечатываем содержимое списка AList с помощью указателя на базовый класс
cout << endl << "Распечатка списка с помощью указателя на ";
cout << "базовый класс и метода Print:" << endl;
iterator4->restart();
while ( iterator4->current()!=NOOBJECT )
{
((Abstr*)&iterator4->current())->Print( cout );
(*iterator4)++;
}
//ждем нажатия пользователем любой клавиши
getch();
//Удаляем из списка AList4 все объекты классов Deriv2 и Deriv3
iterator4->restart();
i4=1;
while ( iterator4->current() != NOOBJECT )
{
int q=((Deriv1&)(iterator4->current())).isA();
if ( iterator4->current().isA() == DERIV2CLASS
||
iterator4->current().isA() == DERIV3CLASS
)
{
AList4.detachAt( i4 );
delete iterator4;
iterator4 = new ListIterator( AList4 );
iterator4->restart();
i4 = 1;
}
else
{
(*iterator4)++;
i4++;
}
}
//Распечатываем итоговый список
cout << endl << "Распечатка списка после удаления всех объектов ";
cout << "классов Deriv2 и Deriv3:" << endl;
iterator4->restart();
while ( iterator4->current()!=NOOBJECT )
{
((Abstr*)&iterator4->current())->Print( cout );
(*iterator4)++;
}
//ждем нажатия пользователем любой клавиши
if ( !iterator4 )
delete iterator4;
while( !kbhit() );
}
//Конец файла LAB4MAIN.CPP
//Начало файла AD1D2D3.H
//Лабораторная работа по ПППО № : 4
//Номер варианта по списку : 4
//Группа : ИУ5-62
//Автор и исполнитель : Бидяк Иван Николаевич
//Назначение данного файла : Заголовочный файл для классов
// Abstr, Deriv1, Deriv2, Deriv3
//Описание класса Abstr
#if !defined(__OBJECT_H)
#include <Object.h>
#endif
#define DERIV1CLASS 201
#define DERIV2CLASS 202
#define DERIV3CLASS 203
class Abstr : public Object
{
protected:
double doubleValue;
public:
double GetValue() { return doubleValue; };
Abstr( double newValue ) { doubleValue = newValue; };
Abstr( istream& inputStream ) { inputStream >> doubleValue; };
~Abstr() { };
virtual void printOn(ostream& outputStream) const { cout<<doubleValue; };
virtual void Print(ostream& outputStream) const = 0;
};
//Описание класса Deriv1
class Deriv1 : public Abstr
{
public:
virtual classType isA() const { return DERIV1CLASS; };
virtual hashValueType hashValue() const { return 123; };
virtual int isEqual(const Object& testObject) const;
virtual char* nameOf() const { return "Deriv1"; };
Deriv1( double newValue ) : Abstr( newValue ) { };
Deriv1( istream& inputStream ) : Abstr( inputStream ) { };
~Deriv1() {};
virtual void Print(ostream& outputStream) const;
};
//Описание класса Deriv2
class Deriv2 : public Deriv1
{
public:
virtual classType isA() const { return DERIV2CLASS; };
virtual char* nameOf() const { return "Deriv2"; };
Deriv2( double newValue ) : Deriv1( newValue ) { };
Deriv2( istream& inputStream ) : Deriv1( inputStream ) { };
};
//Описание класса Deriv3
class Deriv3 : public Deriv1
{
public:
virtual classType isA() const { return DERIV3CLASS; };
virtual char* nameOf() const { return "Deriv3"; };
Deriv3( double newValue ) : Deriv1( newValue ) { };
Deriv3( istream& inputStream ) : Deriv1( inputStream ) { };
};
//Конец файла AD1D2D3.H
//Начало файла AD1D2D3.CPP
//Лабораторная работа по ПППО № : 4
//Номер варианта по списку : 4
//Группа : ИУ5-62
//Автор и исполнитель : Бидяк Иван Николаевич
//Назначение данного файла : Файл с телами методов классов
// Abstr, Deriv1, Deriv2, Deriv3
#include "AD1D2D3.h"
//Методы класса Deriv1
void Deriv1::Print( ostream& outputStream ) const
{
outputStream << "Имя класс : " << nameOf() << endl;
outputStream << "Значение : " << doubleValue << endl;
}
int Deriv1::isEqual( const Object& testObject ) const
{
if ( doubleValue == ((Abstr&)testObject).GetValue() )
return 1;
else
return 0;
}
//Конец файла AD2D3D4.CPP
//Начало файла MYLIST.H
//Лабораторная работа по ПППО № : 4
//Номер варианта по списку : 4
//Группа : ИУ5-62
//Автор и исполнитель : Бидяк Иван Николаевич
//Назначение данного файла : Заголовочный файл для класса MyList
#include <list.h>
class MyList : public List