Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторні роботи по програмуванні(14 лаб).doc
Скачиваний:
77
Добавлен:
16.05.2015
Размер:
1.43 Mб
Скачать

Структура наслідування класів

СShape

СTriangle

СQuadrangle

СCircle

СPoint

Обґрунтування вибору методу

Дану задачу можливо вирішити декількома способами

а) За допомогою структурного програмування.

Розробляється структура яка описую фігуру, потім ця структура використовується різними функціями.

б) За допомогою модульного програмування

розробляється модуль (набір функцій) для роботи з фігурами на екрані комп’ютера.

в) За допомогою класів.

Розробляється клас фігури, потім він використовується для роботи

розробленою фігурою.

Обираємо третій метод для вирішення поставленої задачі. Перерахуємо основні переваги використання класів для вирішення задач даного типу:

а) Найбільш економічне використання коду.

б) Можливість легко змінити і розширити клас за допомогою таких можливостей класу як наслідування, використання віртуальних функцій, множинне наслідування, використання шаблонів в класах та ін.

в) За допомогою класів можна легко вирішити задачі великої складності, які важко вирішити іншими способами а в деяких випадках і неможливо.

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

Розробити базовий клас для опису фігур на екрані.

Створимо клас який буде представляти будь – яку геометричну фігуру на екрані, та який передбачає можливість її руху. В клас входить вказівник на масив точок фігури. Функції які добавляють точку, забезпечують рух фігури та вивід і виділення її на екрані. Також передбачена структура, яка задає тип руху геометричної фігури на екрані і функції, які обслуговують її.

Типи руху геометричної фігури на екрані.

enum TYPE {MT_LINE=0,/*рух по прямій лінії */

MT_OBERT, /* поворот фігури */

MT_RESHAPE,/* зміна її розмірів */

MT_USER};/* тип руху що задає користувач */

class СShape{

protected:

POINT*p;/*вказівник на масив точок які зберігають координати точок на екрані*/

int count;/*кількість точок в фігури*/

int current; /*поточна точка фігури*/

PMOVE m_move;/*структура яка зберігає в собі тип руху фігури на екрані комп’ютера*/

public:

CShape(int); /* Конструктор вхідний параметр якого задає кількість точок на екрані комп’ютера */

virtual~shape();/* деструктор */

void set_point(int,int); // встановлює координати точки фігури

void set_move(PMOVE); /* задає тип руху фігури на екрані */

virtual void show() {};/* Віртуальна функція показує фігуру на екрані монітора, вона в кожному класі насліднику повинна переоприділена*/

virtual void move();/* Рух фігури на екрані монітора */

virtual void hide();/* стирає фігуру на екрані комп’ютера */

PMOVE get_move(){ return m_move;} // повертає структуру move

};

CShape::CShape(int count){

//cout <<"constructor shape" <<count <<endl;

if (count<1) count =1;

current=0;

this->count=count;

p=new POINT[this->count];

}

void CShape::hide(){

setwritemode(XOR_PUT);

show();

for(int i=0;i<count;i++) putpixel(p[i].x,p[i].y,0);

}

void CShape::set_move(PMOVE move) {

m_move=move;

}

void CShape::set_point(int x,int y) {

if (current<count) {

p[current].x=x;

p[current].y=y;

current++;

}

//cout<<current<<endl;

}

CShape::~CShape() {

if(p!=NULL) {

delete[] p;

}

}

void CShape::move() {

if(m_move->erase) hide();

if(m_move->type=MT_LINE) {

for(int i=0;i<count;i++) {

p[i].x+=m_move->stepx;

p[i].y+=m_move->stepy;

}

}

if (m_move->type=MT_RESHAPE) {

for (int i=0;i<count;i++) {

p[i].x+=m_move->stepx;

p[i].y+=m_move->stepy;

}

}

if(m_move->type=MT_OBERT) {

for(int i=0;i<count;i++) {

p[i].x+=m_move->stepx;

p[i].y+=m_move->stepy;

}

}

show();

}