ооп 4 (1077319)
Текст из файла
Московский Государственный Технический Университет имени Н. Э. Баумана
Отчет к лабораторной работе №4
“ Наследование, виртуальные функции и абстрактные классы ”
Работу выполнила студентка группы ИУ-5-31
Черненькая И.С.
Работу проверил преподаватель
Гапанюк Ю.Е.
Москва
2009
Цель работы
Целью лабораторной работы является дополнительное изучение оболочки (IDE) системы программирования BC 3.1 C++ , способов наследования классов, использование виртуальных функций, понятий абстрактного класса и виртуального вызова функций. Студенты создают свои классы и исследуют механизмы вызова виртуальных функций. Учатся проектировать собственные классы и отображать результаты на диаграммах классов и объектов.
Порядок выполнения работы
-
Продолжить изучение оболочки BC 3.1 C++ в интерактивном режиме( всех пунктов меню и окон настройки работы оболочки)
-
Составить диаграммы классов своей программы
-
Составление блок-схемы и написание программы, состоящей из двух исходных файлов.
-
Составить диаграмму объектов собственной программы
-
Освоить редактирование текстов в среде оболочки для много модульных программ, используя броузер классов для поиска необходимых модулей.
-
Создать и грамотно настроить проектный файл для программы ЛР, во втором файле должна быть выделена функция для вывода справки о программ (на COUT) с номером варианта, группой и ФИО студента.
-
Отладить программу с помощью отладчика с просмотром объектов классов
-
Сформировать листинг программы и листинг результатов
-
Оформить отчет по ЛР.
Требования к работе
-
Описание четырех классов( Absrt, Deriv1 ,Deriv2 и Deriv3), требования к которым описаны выше (см. 1-й пункт вариантов).
-
В классе Absrt определяется свойство, задаваемое вариантом (см. 2-й пункт вариантов).
-
В классах должна быть определена и переопределена виртуальная функция print, для печати переменной и названия класса объекта.
-
Описать объекты классов Absrt, Deriv1 ,Deriv2 и Deriv3( a1, d1, d2, d3) и их инициализация и указателей на эти типы( pa1, pd1, pd2, pd3);
-
Выполнить вызов функции print для имен объектов ( d1, d2, d3).
-
Задаются значения указателей( pd1, pd2, pd3) и выполняется вызов функции print для этих указателей.
-
Задается значение pa1 как указатель на d1 и вызывается функции print через этот указатель. Задается значение pa1 как указатель на d2 и вызывается функции print через этот указатель. Задается значение pa1 как указатель на d3 и вызывается функции print через этот указатель( виртуальный вызов !!).
-
Описать объект типа список LIST ListDerive.
-
Тремя циклами в список ( add) последовательно заполнить по пять объектов каждого из типов Deriv1 ,Deriv2 и Deriv3. Объекты порождаются оператором new. Все объекты должны быть различимы.
-
Выполнить распечатку списка с помощью цикла (с использованием класса LISTITERATOR см. 3ЛР) и функции printOn, перегруженной в классах Deriv1 ,Deriv2 и Deriv3( current, restart, int).
-
Выполнить распечатку списка с помощью одного цикла (с использованием класса LISTITERATOR см. 3ЛР) и функции print, перегруженной в классах Deriv1 ,Deriv2 и Deriv3( используя current, restart, int) и вычисляемого указателя на базовый класс (pa1). Для примера ссылки: (( Absrt*) &AI.current())->print();
-
Выполнить удаление элементов из общего списка по вариантам (см. 3-й пункт вариантов).
Диаграмма классов
Диаграмма объектов программы
Текст программы
lab4.cpp
#include <iostream.h>
#include <object.h>
#include <list.h>
#include <dbllist.h>
#include <conio.h>
void about();
class Abstr: public Object
{
private:
float val;
public:
Abstr (float fl=0) {val=fl;}
virtual void print(ostream& )const = 0;
virtual int isToDel() const = 0;
virtual char _FAR *nameOf() const = 0;
virtual classType isA() const = 0;
virtual hashValueType hashValue() const = 0;
virtual int isEqual( const Object _FAR & ) const = 0;
virtual void printOn( ostream _FAR & ) const = 0;
float get_val() const {return(val);}
};
class Deriv1: public Abstr
{
public:
Deriv1 (float fl=0): Abstr(fl) {}
virtual void print(ostream& out) const {out << nameOf() << ": " << get_val();}// << "\n";}
virtual int isToDel() const {return 0;};
virtual char _FAR *nameOf() const {return "Deriv1";}
virtual classType isA() const {return 1;};
virtual hashValueType hashValue() const {return 1;};
virtual void printOn( ostream _FAR & out) const {print(out);};
virtual int isEqual( const Object _FAR & obj) const
{
if (isA()==obj.isA())
{
Deriv1& test = (Deriv1&) obj;
if (test.get_val()==get_val()) return 1; else return 0;
}
return 0;
};
};
class Deriv2: public Deriv1
{
public:
Deriv2(float fl=0): Deriv1(fl) {}
virtual int isToDel() const {return 1;};
virtual char* nameOf() const{return "Deriv2";}
virtual classType isA() const {return 2;};
virtual hashValueType hashValue() const {return 3;};
virtual int isEqual( const Object _FAR & obj) const
{
if (isA()==obj.isA())
{
Deriv2& test = (Deriv2&) obj;
if (test.get_val()==get_val()) return 1; else return 0;
}
return 0;
};
};
class Deriv3: public Deriv1
{
public:
Deriv3(float fl=0): Deriv1(fl) {}
virtual int isToDel() const {return 1;};
virtual char* nameOf() const {return "Deriv3";}
virtual classType isA() const {return 3;};
virtual hashValueType hashValue()const {return 3;};
virtual int isEqual( const Object _FAR & obj) const
{
if (isA()==obj.isA())
{
Deriv3& test = (Deriv3&) obj;
if (test.get_val()==get_val()) return 1; else return 0;
}
return 0;
};
};
void main()
{ about();
//Abstr a1;
Deriv1 d1(23.1);
Deriv2 d2(2.0);
Deriv3 d3;
Abstr* pa1;
Deriv1* pd1;
Deriv2* pd2;
Deriv3* pd3;
cout << " Print (object): \n";
d1.print(cout << "\n");
d2.print(cout << "\n");
d3.print(cout << "\n");
cout << "\n Print (pointer): \n";
pd1=new Deriv1(d1);
pd2=new Deriv2(d2);
pd3=new Deriv3(d3);
pd1->print(cout << "\n");
pd2->print(cout << "\n");
pd3->print(cout << "\n");
cout << "\n Print (abstract class): \n";
pa1=new Deriv1(d1);
pa1->print(cout << "\n");
pa1=new Deriv2(d2);
pa1->print(cout << "\n");
pa1=new Deriv3(d3);
pa1->print(cout << "\n");
List ListDerive;
// Zapolnenie spiska
int i;
cout.precision(2);
for(i=0; i<5; i++) {ListDerive.add(*new Deriv1(i+10.11));}
for(i=0; i<5; i++) {ListDerive.add(*new Deriv2(i+20.22));}
for(i=0; i<5; i++) {ListDerive.add(*new Deriv3(i+30.33));}
// PrintList
getch();
cout << "\n\n Pechat' elementov iz spiska (ListIterator & printOn): " ;
ListIterator iter(ListDerive);
while (iter.current()!=NOOBJECT)
{
iter.current().printOn(cout << "\n");
iter++;
}
getch();
cout << "\n\n Pechat' elementov iz spiska (printOn): \n" ;
iter.restart();
while (iter.current()!=NOOBJECT)
{
(( Abstr*) &iter.current() )->print(cout << "\n");
iter++;
}
getch();
cout << "\n\n Deleting Derive2 & Derive3 objects: \n";
iter.restart();
while (iter.current()!=NOOBJECT)
{
pa1=(Abstr*) &iter.current();
iter++;
if (pa1->isToDel())
{
pa1->print(cout << "\nDeleting: ");
ListDerive.detach(*pa1, TShouldDelete :: Delete);
}
}
ListDerive.printOn(cout << "\n\n ListDerive after Deleting: \n");
getch();
////Dop
clrscr();
DoubleList DoubleListDerive;
// Zapolnenie dbl_spiska
cout.precision(2);
for(i=0; i<5; i++) {DoubleListDerive.add(*new Deriv1(i+10.11));}
for(i=0; i<5; i++) {DoubleListDerive.add(*new Deriv2(i+20.22));}
for(i=0; i<5; i++) {DoubleListDerive.add(*new Deriv3(i+30.33));}
// PrinDoubletList
getch();
cout << "\n\n Pechat' elementov iz dbl_spiska (DoubleListIterator & printOn): " ;
DoubleListIterator db_iter(DoubleListDerive);
DoubleListDerive.initIterator();
while (db_iter.current()!=DoubleListDerive.peekAtTail())
{ db_iter.current().printOn(cout << "\n");
db_iter++;
}
getch();
cout << "\n\n Pechat' elementov iz dbl_spiska (printOn): \n" ;
getch();
db_iter.restart();
while (db_iter.current()!=DoubleListDerive.peekAtTail())
{ (( Abstr*) &db_iter.current() )->print(cout << "\n");
db_iter++;
}
getch();
cout << "\n\n Deleting Derive2 & Derive3 objects: \n";
db_iter.restart();
while (db_iter.current()!=DoubleListDerive.peekAtTail())
{ pa1=(Abstr*) &db_iter.current();
db_iter++;
if (pa1->isToDel())
{ pa1->print(cout << "\nDeleting: ");
DoubleListDerive.detach(*pa1, TShouldDelete :: Delete);
}
}
DoubleListDerive.printOn(cout << "\n\n DoubleListDerive after Deleting: \n");
}
lab4-2.cpp
#include <iostream.h>
void about()
{
cout << "Лабораторная работа №4 \nЧерненькая Ирина, ИУ5-31 \nВариант №30\n\n";
}
Результаты работы
Результаты работы доп. требований.
10
Характеристики
Тип файла документ
Документы такого типа открываются такими программами, как Microsoft Office Word на компьютерах Windows, Apple Pages на компьютерах Mac, Open Office - бесплатная альтернатива на различных платформах, в том числе Linux. Наиболее простым и современным решением будут Google документы, так как открываются онлайн без скачивания прямо в браузере на любой платформе. Существуют российские качественные аналоги, например от Яндекса.
Будьте внимательны на мобильных устройствах, так как там используются упрощённый функционал даже в официальном приложении от Microsoft, поэтому для просмотра скачивайте PDF-версию. А если нужно редактировать файл, то используйте оригинальный файл.
Файлы такого типа обычно разбиты на страницы, а текст может быть форматированным (жирный, курсив, выбор шрифта, таблицы и т.п.), а также в него можно добавлять изображения. Формат идеально подходит для рефератов, докладов и РПЗ курсовых проектов, которые необходимо распечатать. Кстати перед печатью также сохраняйте файл в PDF, так как принтер может начудить со шрифтами.















