Лабораторна робота №7
Тема: Динамічні об’єкти-списки в С++ .
Мета роботи: Вивчення динамічних об’єктів-списків, ознайомлення з принципом полного поліморфізма і використання деструкторів в С++
1.Індивідуальне завдання.
У відповідності до лабораторної роботи №5 написати програму переміщення графічних об’єктів по екрану, використовуючи динамічниу об’єкт-список С++ та динамічне виділення пам’ті.
Завдання: крапка -> трикутник -> трикутник у трикутнику->коло у трикутнику та трикутнику.
2.Текст програми.
#include <graphics.h> // graphics library declarations
#include <conio.h> // for getch() function
#include <stdlib.h> // for randomize() function
#include <dos.h> // for delay() function
#include <iostream.h>
#include <iomanip.h>
#include <stdio.h>
#include <math.h>
class CPoint
{
protected:
int x,y,r;
public:
CPoint(int IX, int IY, int IR);
virtual void Show();
virtual void Hide();
void Zoom(int DR);
void Move(int DX, int DY, int DR);
};
class CTtreyg: public CPoint
{
public:
CTtreyg(int IX, int IY, int IR):CPoint(IX, IY, IR){};
virtual void Show(void);
virtual void Hide(void);
};
class CTtrInCir: public CTtreyg
{
public:
CTtrInCir(int IX, int IY, int IR):CTtreyg(IX, IY,IR){};
virtual void Show(void);
virtual void Hide(void);
};
class CTCirTrSq : public CTtrInCir
{
public:
CTCirTrSq(int IX, int IY, int IR):CTtrInCir(IX, IY,IR){};
virtual void Show(void);
virtual void Hide(void);
};
//--------------------------------------------------------}
struct CNode
{
CNode *PNext;
CPoint *PObj;
};
class CList
{
public:
CNode *PHead,*PTemp;
CList(void);
void AddNode(CPoint *PNObj);
void ShowAll(void);
void MoveAll(void);
~CList(void);
};
//--------------------------------------------------------}
void CPoint::CPoint(int IX, int IY, int IR)
{
x=IX;
y=IY;
r=IR;
};
void CPoint::Show(void)
{
putpixel(x,y, 14);
};
void CPoint::Hide(void)
{
putpixel(x,y, 0);
};
void CPoint::Zoom(int DR)
{
r=r+DR;
if (r<4) r++;
};
void CPoint::Move(int DX, int DY, int DR)
{
Hide();
x += DX;
y += DY;
Zoom(DR);
Show();
};
//--------------------------------------------------------}
//--------------------------------------------------------}
void CTtreyg::Show()
{
setcolor(11);
line(x,y-r,x+(int)(r*(sqrt(3)/2)),(int)(y+r/2));
line(x+(int)(r*(sqrt(3)/2)),(int)(y+r/2),x-(int)(r*(sqrt(3)/2)),(int)(y+r/2));
line(x-(int)(r*(sqrt(3)/2)),(int)(y+r/2),x,(int)(y-r));
};
void CTtreyg::Hide()
{
setcolor(0);
line(x,y-r,x+(int)(r*(sqrt(3)/2)),(int)(y+r/2));
line(x+(int)(r*(sqrt(3)/2)),(int)(y+r/2),x-(int)(r*(sqrt(3)/2)),(int)(y+r/2));
line(x-(int)(r*(sqrt(3)/2)),(int)(y+r/2),x,(int)(y-r));
};
//--------------------------------------------------------}
//--------------------------------------------------------}
void CTtrInCir::Show()
{
setcolor(13);
line(x,y-r,x+(int)(r*(sqrt(3)/2)),(int)(y+r/2));
line(x+(int)(r*(sqrt(3)/2)),(int)(y+r/2),x-(int)(r*(sqrt(3)/2)),(int)(y+r/2));
line(x-(int)(r*(sqrt(3)/2)),(int)(y+r/2),x,(int)(y-r));
line(x,y+(r div 2),x-(int)((r div 2)*(sqrt(3)/2)),(int)(y-(r div 2)/2));
line(x-(int)((r div 2)*(sqrt(3)/2)),(int)(y-(r div 2)/2),x+(int)((r div 2)*(sqrt(3)/2)),(int)(y-(r div 2)/2));
line(x+(int)((r div 2)*(sqrt(3)/2)),(int)(y-(r div 2)/2),x,(int)(y+(r div 2)));
};
void CTtrInCir::Hide()
{
setcolor(0);
line(x,y-r,x+(int)(r*(sqrt(3)/2)),(int)(y+r/2));
line(x+(int)(r*(sqrt(3)/2)),(int)(y+r/2),x-(int)(r*(sqrt(3)/2)),(int)(y+r/2));
line(x-(int)(r*(sqrt(3)/2)),(int)(y+r/2),x,(int)(y-r));
line(x,y+(r div 2),x-(int)((r div 2)*(sqrt(3)/2)),(int)(y-(r div 2)/2));
line(x-(int)((r div 2)*(sqrt(3)/2)),(int)(y-(r div 2)/2),x+(int)((r div 2)*(sqrt(3)/2)),(int)(y-(r div 2)/2));
line(x+(int)((r div 2)*(sqrt(3)/2)),(int)(y-(r div 2)/2),x,(int)(y+(r div 2)));
};
//--------------------------------------------------------}
//--------------------------------------------------------}
void CTCirTrSq ::Show()
{
setcolor(17);
line(x,y-r,x+(int)(r*(sqrt(3)/2)),(int)(y+r/2));
line(x+(int)(r*(sqrt(3)/2)),(int)(y+r/2),x-(int)(r*(sqrt(3)/2)),(int)(y+r/2));
line(x-(int)(r*(sqrt(3)/2)),(int)(y+r/2),x,(int)(y-r));
line(x,y+(r div 2),x-(int)((r div 2)*(sqrt(3)/2)),(int)(y-(r div 2)/2));
line(x-(int)((r div 2)*(sqrt(3)/2)),(int)(y-(r div 2)/2),x+(int)((r div 2)*(sqrt(3)/2)),(int)(y-(r div 2)/2));
line(x+(int)((r div 2)*(sqrt(3)/2)),(int)(y-(r div 2)/2),x,(int)(y+(r div 2)));
circle(x,y, r div 4);
};
void CTCirTrSq ::Hide()
{
setcolor (0);
line(x,y-r,x+(int)(r*(sqrt(3)/2)),(int)(y+r/2));
line(x+(int)(r*(sqrt(3)/2)),(int)(y+r/2),x-(int)(r*(sqrt(3)/2)),(int)(y+r/2));
line(x-(int)(r*(sqrt(3)/2)),(int)(y+r/2),x,(int)(y-r));
line(x,y+(r div 2),x-(int)((r div 2)*(sqrt(3)/2)),(int)(y-(r div 2)/2));
line(x-(int)((r div 2)*(sqrt(3)/2)),(int)(y-(r div 2)/2),x+(int)((r div 2)*(sqrt(3)/2)),(int)(y-(r div 2)/2));
line(x+(int)((r div 2)*(sqrt(3)/2)),(int)(y-(r div 2)/2),x,(int)(y+(r div 2)));
circle(x,y,r div 4);
};
//------------------------------------------------------
CList::CList(void)
{
PHead=NULL;
};
void CList::AddNode(CPoint *PNObj)
{
PTemp=new CNode;
PTemp->PNext=PHead;
PTemp->PObj=PNObj;
PHead=PTemp;
};
void CList::ShowAll(void)
{
PTemp=PHead;
while(PTemp!=NULL)
{
PTemp->PObj->Show();
PTemp=PTemp->PNext;
}
};
void CList::MoveAll(void)
{
PTemp=PHead;
while(PTemp!=NULL)
{
PTemp->PObj->Move(1-random(3),1-random(3),2-random(5));
PTemp=PTemp->PNext;
}
};
CList::~CList(void)
{
while(PHead!=NULL)
{
PTemp=PHead->PNext;
delete PHead->PObj;
delete PHead;
PHead=PTemp;
}
};
//-----------------------------------------
void main(void)
{
// initialize the graphics system
CList *PList;
int i,x;
int graphdriver = DETECT, graphmode;
initgraph(&graphdriver, &graphmode, "q:\\bc\\bgi");
cleardevice();
randomize();
PList=new CList;
for (i=0;i<5;i++)
{
PList->AddNode(new CPoint(200+random(100),150+random(100),0));
PList->AddNode(new CTtreyg(100+random(200),50+random(200),20));
PList->AddNode(new CTtrInCir(300+random(200),100+random(200),30));
PList->AddNode(new CTCirTrSq (250+random(200),200+random(200),40));
}
PList->ShowAll();
while(!kbhit())
{
PList->MoveAll();
delay(40); }
delete PList;
closegraph();
}
3. Результати виконання.
Отримали зображення: крапка -> трикутник -> трикутник у трикутнику->коло у трикутнику та трикутнику.
Висновок: написали програму переміщення графічних об’єктів по екрану, використовуючи динамічниу об’єкт-список С++ та динамічне виділення пам’ті.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.