Динамічні об’єкти-списки в С++. Написання програми переміщення графічних об’єктів по екрану, використовуючи динамічний об’єкт-список С++

Страницы работы

Содержание работы

Лабораторна робота №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. Результати виконання.

Отримали зображення:  крапка -> трикутник -> трикутник у трикутнику->коло у трикутнику та трикутнику.

Висновок:  написали програму переміщення графічних об’єктів по екрану, використовуючи динамічниу об’єкт-список С++ та динамічне виділення пам’ті.

Похожие материалы

Информация о работе