Lab4 - Report (Лабораторная работа №4)

2018-01-10СтудИзба

Описание файла

Файл "Lab4 - Report" внутри архива находится в следующих папках: Лабораторная работа №4, лаба 4, 2. Документ из архива "Лабораторная работа №4", который расположен в категории "". Всё это находится в предмете "объектно-ориентированное программирование (ооп)" из 3 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "лабораторные работы", в предмете "объектно-ориентированное программирование (ооп)" в общих файлах.

Онлайн просмотр документа "Lab4 - Report"

Текст из документа "Lab4 - Report"

Московский Государственный Технический Университет

имени Н.Э. Баумана.

УТВЕРЖДАЮ

"___"__________2000 г.

_____________________

(Большаков С.А.)

"Лабораторная работа по ПППО № 4"

Вариант № 4

Группа ИУ5-62

Отчет

(тип документа)

Бумага формата А4

(вид носителя)

9

(количество листов)

ИСПОЛНИТЕЛЬ

" " 2000 г.

_____________________

(Бидяк И.Н.)

Москва – 2000

  1. Цель работы

Целью лабораторной работы является изучение оболочки (IDE) системы программирования BC 3.1 C++ и способов наследования классов, использование виртуальных функций. Студенты создают свои классы и исследуют механизмы вызова виртуальных функций.

  1. Порядок работы

  1. Изучение оболочки BC 3.1 C++ в интерактивном режиме( всех пунктов меню и окон настройки работы оболочки)

  2. Составление блок-схемы и написание программы, состоящей из двух исходных файлов.

  3. Редактирование текстов в среде оболочки

  4. Создание проектного файла

  5. Отладка программы с помощью отладчика

  6. Формирование листинга программы и листинга результатов

  7. Оформление отчета

  1. Диаграмма классов Abstr, Deriv1, Deriv2, Deriv3, MyList

  1. Диаграмма объектов программы

Штриховая линия на вышеприведенном рисунке означает, что объект pa_4 в разное время указывает на объекты d1_4, d2_4, d3_4.

  1. Ошибки, допущенные при написании и отладке программы

  1. При удалении из списка AList4 всех объектов классов Deriv2 и Deriv3 сначала присваивал i4=0 вместо i4=1. Это приводило к удалению из списка не только объектов классов Deriv2 и Deriv3, но и вообще всех объектов (из-за особенностей метода MyList::detachAt класса MyList).

  2. После удаления очередного объекта из списка AList4 не удалял и вновь выделял память под iterator4 с последующим вызовом метода iterator4->restart(), а просто вызывал iterator4->restart(), что при удалении первого элемента списка приводило к неправильному результату.

  3. Сначала не определял для класса Deriv1 виртуальные методы isA, nameOf, hashValue, isEqual, что приводило к выдаче ошибки типа "Cannot create instance of absract class ‘Deriv1’".

  4. Сначала не определял для классов Deriv2, Deriv3 виртуальный метод nameOf(), и поэтому при вызове метода Зrint для объектов классов Deriv2 и Deriv3 вместо правильного имени класса выдавалось “Deriv1”.

  1. Листинг программы

//Начало файла 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

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5167
Авторов
на СтудИзбе
437
Средний доход
с одного платного файла
Обучение Подробнее