Использование классов в языке Си++
Работа добавлена: 2015-12-26





Тема: " Использование классов в языке Си++"

1. Постановка задачи

Постановка задачи

Составить программу, которая в диалоговом режиме управляет графическими объектами, отображаемыми на экране дисплея.

Программа должна поддерживать следующие общие элементы поведения графических объектов:

1. Активизация/визуализация по выбору.

2. Передвижение со следом/без.

3. Восстановление первоначального состояния образа.

4. Изменение цвета.

5. Изменение состояния видимый/невидимый.

За основу программы взять прилагаемый учебный пример исходного текста работающей программы FIGDEMO.CPP.

Индивидуальные варианты заданий

Варианты поведения объектов.

1. Завершение работы с объектом:

0. Исчезает.

1. Остается на экране.

2. Движение объекта в автоматическом режиме:

0. По заданному закону.

1. По запомненной траектории.

3. Изменение цвета:

0. По команде.

1. Под воздействием другого объекта.

4. Деформация образа:

0. По команде.

1. Под воздействием другого объекта.

5. Сборка/запоминание агрегированного образа:

0. Дублированием имеющихся.

1. Удалением имеющихся.

Номер индивидуального    варианта    представляет    собой

последовательность нулей и единиц. Выбор варианта следует производить в зависимости от личного номера студента N в журнале академгруппы следующим образом: поставим в соответствие i-му пункту задания (5-i)-ю степень двойки в двоичном представлении номера N. Номера подпунктов задания будем считать коэффициентами разложения N по степеням двойки.

Таким образом, например, номеру N=12 соответствует номер индивидуального задания 01100 (8+4), т.е. пункты 1.0, 2.1, 3.1,

4.0, 5.0. (Мои задания подчеркнуты!)

2. Описание решения

Родительским классом для фигуры квадрат является класс точка;

для окружности – класс квадрат;

для квадрата в окружности – класс квадрат и класс окружность;

для агрегата – класс точка.

сlass.h

#if !defined(__CLASS_H)

#define __CLASS_H

#include <dos.h>

#include <time.h>

#include <math.h>

#include <conio.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <graphics.h>

class point;

struct figures

{

 figures *prev;

 point *figure;

 figures *next;

};

struct keys

{

int key;

keys *next;

};

class point

{

protected:

double x,y;

double temp_x,temp_y;

int color,visible;

int temp_color,temp_visible;

public:

point(){};

point(double, double, int); // Конструктор

virtual void show();// Вывод объекта на экран

 virtual void mark();// Выделение объекта указателем

 virtual void randcolor();// Смена цвета объекта

 virtual void deform();// Изменение формы объекта

 virtual void reset();// Восстановить первоначальное состояние

 virtual void move(int,int); // Движение объекта

virtual void showhide();//Видимый\невидимый объект

 virtual void add(point *){};// Добавление в агрегат

 virtual int isagregate(){return 0;} // Возвращает 1 если агрегат

};

class quad: public point

{

protected:

double delta;

double temp_delta;

public:

quad(){};

quad(double, double, double, int); // Конструктор

void show();// Вывод объекта на экран

 void deform();// Изменение формы объекта

 void reset();// Восстановить первоначальное состояние

};

class circ: public quad

{

public:

circ(){};

circ(double, double, double, int); // Конструктор

void show();// Вывод объекта на экран

 void mark();// Выделение объекта указателем

};

class quadincirc: public virtual quad, public virtual circ

{

public:

 quadincirc(double, double, double, int); // Конструктор

void show();// Вывод объекта на экран

 void mark();// Выделение объекта указателем

 void randcolor();// Смена цвета объекта

 void deform();// Изменение формы объекта

 void reset();// Восстановить первоначальное состояние

 void move(int,int); // Движение объекта

void showhide();//Видимый\невидимый объект

};

class  agregate: public point

{

protected:

figures *figlist;

public:

agregate(){figlist=NULL;}

 void show();// Вывод объекта на экран

 void deform();// Изменение формы объекта

 void randcolor();// Смена цвета объекта

 void showhide();//Видимый\невидимый объект

 void reset();// Восстановить первоначальное состояние

 void mark();// Восстановить первоначальное состояние

void move(int, int); // Движение объекта

 void add(point *);// Добавление в агрегат

 int isagregate(){return 1;} // Возвращает 1 если агрегат

};

figures *add2list(figures *, point *);

point *cut(figures *, figures *&);

void drawscene(figures *,figures *);

#endif

class.cpp

#include "class.h"

point::point(double x, double y, int color)

{

this->x=temp_x=x;

this->y=temp_y=y;

this->color=temp_color=color;

visible=temp_visible=1;

}

void point::show()

{

if (!visible) return;

putpixel(x,y,color);

putpixel(x+1,y,color);

putpixel(x-1,y,color);

putpixel(x,y+1,color);

putpixel(x,y-1,color);

}

void point::mark()

{

outtextxy(x-27,y-2,">>>");

}

void point::randcolor()

{

color=rand()%16;

}

void point::deform()

{

x+=rand()%10-5;

y+=rand()%10-5;

}

void point::reset()

{

x=temp_x;

y=temp_y;

color=temp_color;

visible=temp_visible;

}

void point::move(int deltax, int deltay)

{

x+=deltax;

y+=deltay;

}

void point::showhide()

{

if (visible)

visible=0;

else

visible=1;

}

quad::quad(double x, double y, double delta, int color)

{

this->x=temp_x=x;

this->y=temp_y=y;

this->delta=temp_delta=delta;

this->color=temp_color=color;

visible=temp_visible=1;

}

void quad::show()

{

int tcolor=getcolor();

setcolor(color);

if (visible)

rectangle(x,y,x+delta,y+delta);

setcolor(tcolor);

}

void quad::deform()

{

delta=rand()%20+5;

}

void quad::reset()

{

x=temp_x;

y=temp_y;

delta=temp_delta;

color=temp_color;

visible=temp_visible;

}

circ::circ(double x, double y, double delta, int color)

{

this->x=temp_x=x;

this->y=temp_y=y;

this->delta=temp_delta=delta;

this->color=temp_color=color;

visible=temp_visible=1;

}

void circ::show()

{

int tcolor=getcolor();

setcolor(color);

if (visible)

circle(x,y,delta);

setcolor(tcolor);

}

void circ::mark()

{

outtextxy(x-27-delta,y-2,">>>");

}

quadincirc::quadincirc(double x, double y, double delta, int color)

{

 this->quad::x=quad::temp_x=x;

this->quad::y=quad::temp_y=y;

this->quad::delta=quad::temp_delta=delta;

this->quad::color=quad::temp_color=color;

quad::visible=quad::temp_visible=1;

this->circ::delta=this->circ::temp_delta=ceil(delta/sqrt(2));

this->circ::x= this->circ::temp_x=x+this->circ::delta/sqrt(2);

this->circ::y=this->circ::temp_y=y+this->circ::delta/sqrt(2);

this->circ::color=circ::temp_color=color;

circ::visible=circ::temp_visible=1;

}

void quadincirc::show()

{

int tcolor=getcolor();

setcolor(quad::color);

if (quad::visible)

{

quad::show();

circ::show();

}

setcolor(tcolor);

}

void quadincirc::move(int deltax, int deltay)

{

quad::move(deltax, deltay);

circ::move(deltax, deltay);

}

void quadincirc::showhide()

{

quad::showhide();

circ::showhide();

}

void quadincirc::randcolor()

{

quad::randcolor();

circ::color=quad::color;

}

void quadincirc::mark()

{

circ::mark();

}

void quadincirc::deform()

{

quad::deform();

circ::delta=ceil(quad::delta/sqrt(2));

circ::x=quad::x+circ::delta/sqrt(2);

circ::y=quad::y+circ::delta/sqrt(2);

}

void quadincirc::reset()

{

quad::reset();

circ::reset();

}

void agregate::add(point *figure)

{

figlist=add2list(figlist,figure);

}

void agregate::show(){

figures *active=figlist;

while (active) {active->figure->show(); active=active->next;}

}

void agregate::deform(){

figures *active=figlist;

while (active) {active->figure->deform(); active=active->next;}

}

void agregate::randcolor(){

figures *active=figlist;

while (active) {active->figure->randcolor(); active=active->next;}

}

void agregate::reset(){

figures *active=figlist;

while (active) {active->figure->reset(); active=active->next;}

}

void agregate::showhide(){

figures *active=figlist;

while (active) {active->figure->showhide(); active=active->next;}

}

void agregate::mark(){

figures *active=figlist;

while (active) {active->figure->mark(); active=active->next;}

}

void agregate::move(int deltax, int deltay){

figures *active=figlist;

while (active) {active->figure->move(deltax,deltay); active=active->next;}

}

figures *add2list(figures *list, point *add){

if (!list)

{ list= new figures;

  list->figure=add;

  list->next=NULL;

  list->prev=NULL;

}

else

{

 figures *tlist=list;

 while (tlist->next) tlist=tlist->next;

 tlist->next=new figures;

 tlist->next->prev=tlist;

 tlist=tlist->next;

 tlist->figure=add;

 tlist->next=NULL;

}

return list;

}

point *cut(figures *cutit, figures *&scene)

{

if(!cutit) return 0;

point *ret;

if (cutit->next && cutit->prev)

{

cutit->prev->next=cutit->next;

cutit->next->prev=cutit->prev;

ret=cutit->figure;

delete cutit;

return ret;

}

if (cutit->next){

scene=cutit->next;

cutit->next->prev=NULL;

ret=cutit->figure;

}

if (cutit->prev)

{

cutit->prev->next=NULL;

ret=cutit->figure;

}

delete cutit;

return ret;

}

void drawscene(figures *scene_, figures *current)

{

if (!scene_) return;

scene_->figure->show();

while (scene_=scene_->next) scene_->figure->show();

current->figure->mark();

}

main.cpp

#include "class.h"

figures *scene=NULL;

keys *addkey(keys *list,int key)

{

if (!list)

{ list= new keys;

  list->key=key;

  list->next=NULL;

}

else

{

 keys *tlist=list;

 while (tlist->next) tlist=tlist->next;

 tlist->next=new keys;

 tlist=tlist->next;

 tlist->key=key;

 tlist->next=NULL;

}

return list;

}

keys *dellist(keys *list){

keys *active;

while (list) {active=list; list=list->next; delete active;}

return NULL;

}

void main(){

clrscr();

int key=0, rkey=0;

int repeat=1;

int step=1;

int track=0;

int automove=0;

keys *keylist=NULL,*currkey=NULL;

char keyc[15],*pkeyc=keyc;

figures *current=NULL,*current_agregate=NULL;

time_t t;

srand((unsigned) time(&t));

int gdriver = VGA, gmode=VGAHI, errorcode;

initgraph(&gdriver, &gmode, "");

errorcode = graphresult();

if (errorcode != grOk)  /* an error occurred */

{  printf("Graphics error: %s\n", grapherrormsg(errorcode));

  printf("Press any key to halt:");

  getch();

  exit(1);             /* return with error code */

}

while (repeat)

{

if (!automove)

{

 while (!kbhit());

 key=getch();

}

else if (currkey){

delay(50);

key=currkey->key;

if (!(currkey=currkey->next)) {automove=0; currkey=keylist;}}

switch (key)

 {

  case 27: repeat=0; break;

  case 43: step++; break;

  case 45: if (step>1) step--; break;

  case 9: if (!current) break;

   if (current->next)

    current=current->next;

   else

    current=scene;

   break;

  case 75: if (!current) break;

    current->figure->move(-step,0);

    break;

  case 77: if (!current) break;

    current->figure->move(step,0);

    break;

  case 72: if (!current) break;

    current->figure->move(0,-step);

    break;

  case 80: if (!current) break;

    current->figure->move(0,step);

    break;

  case 'c': if (!current) break;

    current->figure->randcolor();

    break;

  case 'd': if (!current) break;

    current->figure->deform();

    break;

  case 'r': if (!current) break;

    current->figure->reset();

    break;

  case 'v': if (!current) break;

    current->figure->showhide();

    break;

  case 't': if (track)

      track=0;

     else

      track=1;

     break;

  case 'f': if (current && current->figure->isagregate()) current_agregate=current;

     if (current && !current->figure->isagregate() && current_agregate) {current_agregate->figure->add(cut(current,scene));

     current=current_agregate;

     }

  break;

  case 'a':   outtextxy(0,30,"Press R to Record, P to play, D to Delete");

       switch(getch()){

       case 'r': outtextxy(0,40,"Recording now...");

       while (1){

       if (kbhit()) {

       if(!(rkey=getch())) rkey=getch();

       if (rkey==13) break;

       if (rkey!='a') keylist=addkey(keylist,rkey);

       }}

       currkey=keylist;

       rkey=0;

      break;

      case 'p':  automove=1;

      break;

      case 'd':  currkey=keylist=dellist(keylist);

      break;

      }

  break;

  case 'n': outtextxy(0,0,"Press 'P' to put new POINT");

     outtextxy(0,10,"Press 'Q' to put new QUAD");

     outtextxy(0,20,"Press 'C' to put new CIRCLE");

     outtextxy(0,30,"Press 'V' to put new QUAD IN CIRCLE");

     outtextxy(0,40,"Press 'A' to put new AGREGATE");

     switch (key=getch())

      {

       case 'p': scene=add2list(scene, new point(rand()%getmaxx(),rand()%getmaxy(),rand()%16));

       break;

       case 'q': scene=add2list(scene, new quad(rand()%getmaxx(),rand()%getmaxy(),rand()%20+5,rand()%16));

       break;

       case 'c': scene=add2list(scene, new circ(rand()%getmaxx(),rand()%getmaxy(),rand()%20+5,rand()%16));

       break;

       case 'v': scene=add2list(scene, new quadincirc(rand()%getmaxx(),rand()%getmaxy(),rand()%20+40,rand()%16));

       break;

       case 'a': scene=add2list(scene, new agregate);

       break;

      }

     if (!current && scene) current=scene;

     break;

}

if (!track) cleardevice();

drawscene(scene,current);

itoa(step,pkeyc,10);

moveto(0, getmaxy()-10);

outtext("Step is: ");

outtext(pkeyc);

strset(pkeyc,0);

itoa(key,pkeyc,10);

outtextxy(0,getmaxy()-20,pkeyc);

outtextxy(500,0,"T track...");

outtextxy(500,10,"N New...");

outtextxy(500,20,"V Show\Hide...");

outtextxy(500,30,"D Deformation...");

outtextxy(500,40,"C Color...");

outtextxy(500,50,"A Automove...");

outtextxy(500,60,"TAB Next figure...");

outtextxy(500,70,"F select agregate or add to agregate...");

outtextxy(500,80,"+ INC step");

outtextxy(500,90,"- DEC step");

outtextxy(500,100,"Esc exit...");

if (current && current->figure->isagregate()) outtextxy(0,getmaxy()-30,"AGREGATE selected");

}

closegraph();

}

4. Описание интерфейса (руководство пользователя)

Интерфейс программы является интуитивно понятным. Все действия пользователя иллюстрируются исчерпывающими подсказками.

5. Описание тестовых примеров

Данная программа на тестовых проверках показала себя как отлично работающая.

6. Анализ ошибок (описание и устранение замечаний)




Возможно эти работы будут Вам интересны.

1. Программирование на языке С++ с использованием классов

2. Разработка классов, создание конструкторов и деструкторов. Использование статических членов класса

3. Использование библиотеки классов WEKA. Обработка и классификация данных при помощи Weka API

4. Наследования классов

5. ПРОЕКТИРОВАНИЕ КЛАССОВ

6. Речевые ошибки учащихся начальных классов

7. Входная диагностическая работа для учащихся 1-х классов

8. Основные характеристики и области применения ЭВМ различных классов

9. Программирование на языке JavaScript

10. Фразеологизмы в русском языке