Мегаобучалка Главная | О нас | Обратная связь


Лабораторная работа N 10



2018-07-06 402 Обсуждений (0)
Лабораторная работа N 10 0.00 из 5.00 0 оценок




Наследование классов в языке С++

Цель работы: Получение навыка работы с наследованием классов в языке С++

 

Домашнее задание

1.1. Тщательно изучите листинг программ №1. Постройте графы иерархии классов.

1.2 Письменно поясните термины инкапсуляция и интерфейс, наследование интерфейса и наследование реализации, композиция и агрегация в языке С++. С помощью каких средств языка они реализованы.

 

Лабораторное задание

2.1. Наберите программу №1.

// Figura.cpp:

#include "stdafx.h"

#include "afxwin.h"

#include "iostream"

using namespace std ;

 

class Figure{

static HWND hwnd;

protected:

static HDC hdc;

public:

Figure(){/*cout<<"\n Figure()";*/}

void show(){}

void hide(){}

void move(int x, int y){}

static void InitGraphic(){hwnd=FindWindow(_T("ConsoleWindowClass"),_T("C:\\Windows\\system32\\cmd.exe"));hdc=GetWindowDC(hwnd);}

static void CloseGraphic(){ReleaseDC(hwnd, hdc); CloseHandle(hwnd);}

~Figure(){/*cout<<"\t ~Figure()";*/}

};

HWND Figure::hwnd = 0;

HDC Figure::hdc = 0;

 

class Square: public Figure {

POINT pt[5];

public:

Square(POINT* p){

for(int i =0 ; i <5; i++){pt[i].x = p[i].x;pt[i].y = p[i].y;}

}

void show(){

CPen pen(PS_SOLID,2,RGB(255,0,0));

SelectObject(hdc,pen);

Polyline(hdc,pt,5 );

}

void hide(){

CPen pen(PS_SOLID,2,RGB(0,0,0));

SelectObject(hdc,pen);

Polyline(hdc,pt,5 );

}

void move(int x, int y){for(int i = 0; i<5;i++){ pt[i].x+=x;pt[i].y+=y;} }

~Square(){/*cout<<"\t ~Square()";*/}

};

 

class ClsEllipse: public Figure {

 

 

public:

CPoint pt1,pt2;

ClsEllipse(){/*cout<<"\t ClsEllipse()";*/

pt1.x=100; pt1.y=100;

pt2.x=200; pt2.y=200;

}

void show(){

CPen pen(PS_SOLID,2,RGB(0,255,0));

SelectObject(hdc,pen);

Arc(hdc,pt1.x,pt1.y,pt2.x,pt2.y,100,200,0,100);

}

void hide(){

CPen pen(PS_SOLID,2,RGB(0,0,0));

SelectObject(hdc,pen);

Arc(hdc,pt1.x,pt1.y,pt2.x,pt2.y,100,200,0,100);

}

void move(int x, int y){ pt1.x+=x,pt1.y+=y,pt2.x+=x,pt2.y+=y; }

~ClsEllipse(){/*cout<<"\t ~ClsEllipse()";*/}

};

//Включение объектов

class MyObject{

Square sq1, sq2; //Композиция (агрегирование по значению)

ClsEllipse& elp; //Агрегация (агрегирование по ссылке)

public:

MyObject(const Square& p1,const Square& p2,ClsEllipse& el):sq1(p1),sq2(p2), elp(el){/*cout<<"\t MyObject()";*/}

void show(){sq1.show(); sq2.show();elp.show();}

void move(int x, int y){sq1.move(x,y); sq2.move(x,y);elp.move(x,y);}

void hide(){sq1.hide(); sq2.hide(); elp.hide();}

~MyObject(){/*cout<<"\n ~MyObject()";*/}

};

//Множественное наследование

class Heir: Square, ClsEllipse{

public:

Heir(POINT *p):Square(p),ClsEllipse(){/*cout<<"\t Heir()";*/ }

void show(){Square::show(); ClsEllipse::show();}

void move(int x, int y){Square::move(x,y); ClsEllipse::move(x,y);}

void hide(){Square::hide(); ClsEllipse::hide();}

~Heir(){/*cout<<"\n ~Heir()";*/}

};

 

void ShowMyObject(MyObject obj){

for(int i = 0 ; i <100 ; i++){obj.show(); Sleep(24); obj.hide(); obj.move(4,0);}

}

void main(){

POINT pt1[5];

pt1[0].x = 40;pt1[0].y=40;

pt1[1].x = 40;pt1[1].y=140;

pt1[2].x = 140;pt1[2].y=140;

pt1[3].x = 140;pt1[3].y=40;

pt1[4].x = 40;pt1[4].y=40;

 

Figure::InitGraphic();

{

Square sq1(pt1); ClsEllipse elp;

for(int i = 0 ; i <100 ; i++){ sq1.show();elp.show(); Sleep(24); sq1.hide(); elp.hide(); sq1.move(1,1); elp.move(2,2);}

}

ClsEllipse elp;

Square sq2(pt1);

sq2.move(20,20);

MyObject obj(pt1, sq2, elp);

getchar();

ShowMyObject(obj);

{

Heir hr(pt1);

getchar();

for(int i = 0 ; i <100 ; i++){hr.show(); Sleep(24); hr.hide(); hr.move(0,3);}

}

Figure::CloseGraphic();

}

 

2.2. Определите классы линия, треугольник, трапеция.

2.3. Получите у преподавателя рисунок и, используя разработанные классы, нарисуйте его на экране, применив множественное наследование и включение.

2.4 Переопределить один из классов с помощью указателей.

 

Содержание отчета

3.1 Титульный лист отчета должен содержать название, цель лабораторной работы, группу и фамилию студента, выполнившего её, и фамилию преподавателя, проверившего отчет.

3.2 Выполненное домашнее задание.

3.3 Тексты программ, написанные при выполнении 2.2, 2.3 и 2.4 пунктов лабораторного задания.

 

 

Вопросы к защите

4.1. Расскажите о методах декомпозиции системы.

4.2. Приведите примеры иерархичных систем.

4.3. Расскажите о переопределении данных и методов базового класса в производном классе.

4.4. Раскройте понятия инкапсуляция и интерфейс класса. С помощью каких средств языка они реализованы.

4.5. Реализуйте класс Square, используя динамическую память.

4.6. Реализуйте класс ClsEllipse, используя динамическую память.

4.7. Реализуйте класс MyObject, используя динамическую память.

4.8. Напишите классы абитуриент и производный от него студент. Поясните механизм наследования.

4.9. Напишите классы университет и факультет и на их примере поясните, что такое композиция.

4.10. Напишите классы преподаватель и факультет и на их примере поясните, что такое агрегация.

 

Лабораторная работа N 11

Абстрактные классы и виртуальные функции С++

Цель работы: Получение навыка работы с виртуальными функциями и абстрактными классами в языке С++

 

Домашнее задание

1.1. Тщательно изучите листинг программ №1. Постройте граф иерархии классов.

1.2 Поясните письменно термины: инкапсуляция, интерфейс, наследование, полиморфизм, агрегирование, делегирование в отношении классов языка С++. С помощью каких средств языка они реализованы.

 

Лабораторное задание

2.1. Наберите программу №1.

 

// В свойствах проекта в опциях по C/С++ ->Библиотека времени выполнения; установить /MTd

//В свойствах проекта Компоновщик->Ввод->Дополнительные зависимости; поставьте на первое место uafxcwd.lib

#include "stdafx.h"

#include "afxwin.h"

#include "iostream"

using namespace std ;

 

HWND hwnd = 0;

HDC hdc = 0;

void InitGraphic(){

system("mode con cols=168 lines=55"); system("pause >> void");

hwnd=FindWindow(_T("ConsoleWindowClass"),_T("C:\\Windows\\system32\\cmd.exe"));hdc=GetWindowDC(hwnd);

}

void CloseGraphic(){ReleaseDC(hwnd, hdc); CloseHandle(hwnd);}

 

//-------------------------------------------------------------------------- IFigure

class IFigure{ //интерфейсный класс

protected:

int fMove; //0 - фигура двигается; 1 - фигура мигает на месте; 2 - фигура стоит на месте;

int fClr; //0 - фигура цвет не меняет; 1 - фигура меняет цвет

public:

IFigure(): fMove(0), fClr(0){/*cout<<"\n IFigure()";*/}

virtual void show()=0;

virtual void hide()=0;

virtual void move(int x, int y)=0;

};

 

//-------------------------------------------------------------------------Square

class Square:virtual public IFigure {

POINT pt[5];

COLORREF color;

public:

Square(POINT* p): color(RGB(255,0,0)){ for(int i =0 ; i <5; i++) pt[i] = p[i]; }

void SetColor(COLORREF cl){color = cl;}

void show(){

CPen pen(PS_SOLID,2,color);

SelectObject(hdc,pen);

Polyline(hdc,pt,5 );

}

void hide(){

CPen pen;

pen.CreatePen(PS_SOLID,2,RGB(0,0,0));

SelectObject(hdc,pen);

Polyline(hdc,pt,5 );

}

void move(int x, int y){for(int i = 0; i<5;i++){ pt[i].x+=x;pt[i].y+=y;} }

virtual ~Square(){/*cout<<"\t ~Square()";*/}

};

//---------------------------------------------------------------------------ClsEllipse

class ClsEllipse: virtual public IFigure {

CPoint pt1,pt2;

public:

ClsEllipse():pt1(100,100),pt2(200,200) {}

virtual void show() {

CPen pen(PS_SOLID,2,RGB(0,255,0));

SelectObject(hdc,pen);

Arc(hdc,pt1.x,pt1.y,pt2.x,pt2.y,100,200,0,100);

}

virtual void hide() {

CPen pen(PS_SOLID,2,RGB(0,0,0));

SelectObject(hdc,pen);

Arc(hdc,pt1.x,pt1.y,pt2.x,pt2.y,100,200,0,100);

}

virtual void move(int x, int y) { pt1.x+=x,pt1.y+=y,pt2.x+=x,pt2.y+=y; }

virtual ~ClsEllipse(){/*cout<<"\t ~ClsEllipse()";*/}

};

//-------------------------------------------------------------------------Rectan

class Rectan: public IFigure {

Square* pSq;

public:

//дописать operator=

virtual void show(){pSq->show();}//Делегирование

virtual void move(int x, int y){pSq->move(x,y);}//Делегирование

virtual void hide(){pSq->hide();}//Делегирование

void SetColor(COLORREF cl){pSq->SetColor(cl);}

Rectan (Square& p){pSq = new Square(p);}

virtual ~Rectan(){delete pSq;}

};

//-------------------------------------------------------------------------DrowTxt

class DrowTxt{

CString str;

public:

DrowTxt(CString s):str(s){}

void show(){

CDC* pCDC = CDC::FromHandle(hdc);

pCDC->SetTextColor(RGB(255,0,0));

pCDC->SetBkColor(RGB(0,0,0));

pCDC->TextOutW(300,100,str); pCDC->TextOutW(0,0," ");

}

};

 

//-------------------------------------------------------------------------Heir

class Heir: public Square, public ClsEllipse{ //Виртуальный базовый класс

public: //(Множественное наследование)

Heir(POINT *p):Square(p),ClsEllipse(){/*cout<<"\t Heir()";*/ }

void show(){Square::show(); ClsEllipse::show();}

void move(int x, int y){Square::move(x,y); ClsEllipse::move(x,y);}

void hide(){Square::hide(); ClsEllipse::hide();}

virtual ~Heir(){/*cout<<"\n ~Heir()";*/}

};

//------------------------------------------------------------------------RecordPlayer

class RecordPlayer{ //Чтобы воспользоваться классом, объекты должны поддерживать интерфейс IFigure

IFigure**pFig;//Массив указателей IFigure*

int n; //Текущее количество указателей в массиве

int N; //Размерность массива

public:

void Insert(IFigure* pF){if (n<N) pFig[n++] =pF; }

RecordPlayer(int Nfig): N(Nfig), n(0) { pFig = new IFigure*[N]; }

virtual void show(){ for(int i = 0; i < n; i++) pFig[i]->show(); }//Полиморфизм

virtual void hide(){ for(int i = 0; i < n; i++) pFig[i]->hide(); }//Полиморфизм

virtual void move(int x, int y){ for(int i = 0; i < n; i++) pFig[i]->move(x,y); }//Полиморфизм

void PlayMyObject(int x, int y){ for(int i = 0; i <150 ; i++){show();Sleep(24);hide(); move(x,y);} show();}

virtual ~RecordPlayer(){delete []pFig;}

};

 

void main(){

 

POINT pt1[5];

pt1[0].x = 40;pt1[0].y=40;

pt1[1].x = 40;pt1[1].y=140;

pt1[2].x = 140;pt1[2].y=140;

pt1[3].x = 140;pt1[3].y=40;

pt1[4].x = 40;pt1[4].y=40;

 

InitGraphic();

 

DrowTxt dtxt("Привет");

dtxt.show();

getchar();

 

Heir hr(pt1);

for(int i = 0 ; i <100 ; i++){hr.show(); Sleep(24); hr.hide(); hr.move(0,3);}

getchar();

 

ClsEllipse elp;

Square sq1(pt1), sq2(pt1), sq3(pt1);

sq1.SetColor(RGB(255,255,0)); sq2.SetColor(RGB(0,255,0));

sq3.SetColor(RGB(0,0,255)); hr.SetColor(RGB(0,255,255));

sq2.move(20,20); sq3.move(40,30); hr.move(0,-150);

Rectan rec(sq3);

RecordPlayer RPlayer(5);

RPlayer.Insert(&elp);

RPlayer.Insert(&sq1);

RPlayer.Insert(&sq2);

RPlayer.Insert(&rec);

RPlayer.Insert(&hr);

RPlayer.PlayMyObject(3,0);

 

getchar();

CloseGraphic();

}

2.2 Доопределите класс Rectan.

2.3 Модифицируйте класс ClsEllipse так, чтобы параметры эллипса можно было задавать через конструктор, и объекты этого класса могли менять свой цвет.

2.4 Модифицируйте класс DrowTxt так, чтобы он мог быть использован классом RecordPlayer для воспроизведения на экране.

2.5 Напишите класс «текст в прямоугольнике» так, чтобы он мог быть использован классом RecordPlayer для воспроизведения на экране.

2.6 Модифицируйте программу так, чтобы объекты на экране с помощью класса RecordPlayer могли двигаться, оставаться неподвижными, мигать, изменять свой цвет.

2.7 Получите рисунок у преподавателя и напишите программу, рисующую его на экране с помощью класса RecordPlayer.

 

Содержание отчета

3.1 Титульный лист отчета должен содержать название, цель лабораторной работы, группу и фамилию студента, выполнившего её, и фамилию преподавателя, проверившего отчет.

3.2 Выполненное домашнее задание.

3.3 Тексты классов, написанных при выполнении 2.2 – 2.7 пунктов лабораторного задания.

 

Вопросы к защите

4.1. Расскажите о виртуальных функциях и полиморфизме.

4.2. Что такое абстрактные классы, для чего они нужны?

4.3. Расскажите о переопределении данных и методов базового класса в производном классе.

4.4. Раскройте понятия инкапсуляция и интерфейс класса. С помощью каких средств языка они реализованы.

4.5. Реализуйте класс круг, вписанный в квадрат, и выведите его на экран с помощью класса RecordPlayer.

4.6. Реализуйте класс ClsEllipse, используя динамическую память.

4.7. Реализуйте класс Square, используя динамическую память.

4.8. Напишите класс «магазин», который работает с объектами абстрактного класса «товар». Определите 2-3 класса, производных от класса «товар». Продемонстрируйте примеры полиморфного поведения.

4.9. Напишите класс «вагон», который работает с объектами абстрактного класса «груз». Определите 2-3 класса, производных от класса «груз». Продемонстрируйте примеры полиморфного поведения.



2018-07-06 402 Обсуждений (0)
Лабораторная работа N 10 0.00 из 5.00 0 оценок









Обсуждение в статье: Лабораторная работа N 10

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Генезис конфликтологии как науки в древней Греции: Для уяснения предыстории конфликтологии существенное значение имеет обращение к античной...
Как построить свою речь (словесное оформление): При подготовке публичного выступления перед оратором возникает вопрос, как лучше словесно оформить свою...
Модели организации как закрытой, открытой, частично открытой системы: Закрытая система имеет жесткие фиксированные границы, ее действия относительно независимы...
Почему люди поддаются рекламе?: Только не надо искать ответы в качестве или количестве рекламы...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (402)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.006 сек.)