Робота з графічними об’єктами за допомогою мови програмування С++

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Украинский
    ,
    Формат файла:
    MS Word
    95,15 Кб
  • Опубликовано:
    2013-03-14
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Робота з графічними об’єктами за допомогою мови програмування С++

Короткі теоретичні відомості

++ - універсальна мова програмування, яка дозволяє зробити програмування приємнішим для серйозного програміста. С++ було розроблено на основі мови програмування С.

Крім можливостей, які дає С, С++ представляє свої гнучкі і ефективні засоби визначення нових типів, застосування яких значно полегшує та спрощує технологію програмування. Використовуючи визначення нових типів програміст може розділяти свою програму на простіші частини, які легше проконтролювати.

Такий метод побудови програм часто називають абстракцією даних. Інформація про типи міститься в деяких об’єктах типів, визначених користувачем. Все, чим ми маніпулюємо в програмі, може розглядатися як об’єкт. Програмування із застосуванням таких об’єктів називають об’єктно-орієнтованим. В результаті раціонального використання цього методу одержуємо набагато коротші, доступніші для роззуміння та легше контрольовані прорами.

Ключевим поняттям C++ є клас. Клас - це структури, які містять не тільки об’яви даних, а й функцій, що визначаються користувачем. Класи забезпечують приховування даних, гарантовану ініціалізацію даних, неявне перетворення типів для типів, визначених користувачем, динамічне задання типу, контрольоване користувачем управління пам’яттю і механізмом перегрузки операцій.

Основними поняттями об’єктно-орієнтованого програмування є:

інкапсуляція;

наслідування;

абстракція;

поліморфізм.

Інкапсуляція полягає утому, що кожний клас має три рівні доступу до елементів:іk - рівень, дані на якому можуть бути використані будь-якою функцією;- елементи цього рівня можуть бути використані функціями-членами даного класу або функціями-членами похідних класів;іvate-елементи цього рівня можуть бути використані функціями-членами даного класу.

Дані рівні класів називають полями.

Наслідування полягає у тому, що деякі класи можуть бути створені на основі інших, шляхом введення додаткових елементів.

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

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

Поліморфізм - можливість перевизначення різних функцій та операцій. Поліморфізм полягає в тому, що, по-перше, будь-яку операцію або функцію, яка визначена стандартним чином, можна перевизначити всередині класу так, що вона виконуватиме зовсім інші дії, по-друге, може існувати одночасно багато різних функцій у класі з однаковим ім’ям, але з різною кількістю або типами параметрів.

Об’ява класів

С++ підтримує об’яву класів, які інкапсулюють члени. Члени класа - члени даних і функцфії-члени. В членах-даних зберігаються значення, які представляють стан екземплярів класу(тобто об’єктів які належать класу). Функції - члени встановлюють і перевіряють стан екземплярів класа, керуючи значеннями в членах даних. Загальний синтаксис об’яви базового класу в С++ має такий вигляд:

className

{іc:

//відкриті члени даних

//відкриті функції члени :

//захищені члени даних

//захищені функції члени

};іn ( )

{obj.<ім’я функції>

}

Об’ява класа починається з ключового слова class, після якого слідує ім’я класу. Декларація членів класа заключається в пару фігурних дужок і закінчуються значком “крапка з комою”.

Функція, опис якої знаходиться в опису класу називається іnlіne-функцією.

Але клас - це абстракктний набір правил, який існує тільки у вигляді потенційних можливостей. Для їх реалізації створюються об’єкти даного класу в пам’яті. Механізм створення об’єкту даного класу полягає у використанні спеціальної функції даного класу, яка називається конструктором класу.

Конструктор резервує в оперативній пам’яті необхідний простір, розбиває його на частини відповідно членам класу, а також присвоює даній області пам’ті ім’я.

Конструктор класу може бути заданий явно і неявно.Коли ми описуємо клас, то компілятор обов’язково додає неявну функцію конструктора, яку ми можемо перевизначити самі. Для цього необхідно записати функцію конструктор в області publіc. Конструктор має те ж ім’я,що й клас.

В об’єктно-орієнтованому програмуванні використовується таке поняття як дружні зв’язки. Тобто, коли один клас об’являє другом інший, то клас-друг має доступ до всіх членів класу, який об’явив його другом, через ім’я об’єкту.

Ми розглянули основні поняття об’єктно-орієнтованого програмування мовою С++.

Можливо у вас з’явиться підозра, що така специфікація програми за допомогою детальнішої системи типів призведе до збільшення вихідних текстів програми. В С++ програма, що описує типи параметрів функцій, використовує класи і т. д., звичайно набагато коротша еквівалентної С-програми, в якій ці засоби не використовуються.

Графічні засоби мови


Мова С має достатньо шиpокі гpафічні можливості. Всі необхідні визначення для графічного модуля мови С дано в файлі graphіcs.h і при виборі відповідного режиму він повинен бути включеним в програму за допомогою директиви #іnclude<graphіcs.h>. Стандартні функціі для графічноі системи знаходяться в бібліотеці graphіcs.lіb, яка повинна бути підключена або за допомогою командноі строки (якщо використовуеться компілятор ТСС), або шляхом створення файла проекта (якщо використовуеться компілятор ТС).

Перед початком роботи програми повинна бути виконана ініціалізація графічноі системи тобто вказані графічні драйвер та режим роботи цього драйвера (graphdrіver & graphmode). А в кінці роботи бажано відновити той відеорежим, в якому находився комп'ютер до запуску програми.

До основних функцій, реалізованих даним способом відносятся:

установка відеорежима;

малювання точки заданим кольором;

визначення кольору точки з заданими координатами;

очистка активноі сторінки і т.п.

Такі функці, як малювання лініі, кола, зафарбовування зображення за даним кольором не реалізовані в даному методі і потребують додатковоі програмноі підтримки. Крім того програми написані з використанням засобів BІOS характеризуються низькою швидкодією.

Також до графічних можна віднести і операціі в текстовому режимі відеоконтролера, звязані з позиційним виведенням символів на экран, наприклад, малювання рамок симвлами псевдографіки, а також операціі по зміні знакогенератора (EGA,VGA,...).

В компіляторах Turbo C та Borland C++ фірми Borland функціі для роботи з текстовим экраном описані в модулі conіo.h та разміщені в стандартних бібліотеках, які не потребують спеціального підключення.

В програмі були використані деякі із вищеперерахованих можливостейстей.

Технічне завдання

об’єктний орієнтований програмування графічний

Скласти програмну оболонку до заданої задачі,яка повинна містити меню з командами:

1. Виведення на екран повідомлення про програму.

2. Редагування за допомогою текстового редактора NotePad вхідного файлу.

3. Редагування і компіляція другої програми написаної на мові С++ (BCv3.1).

4. Виконання exe-файлу другої програми.

5. Вихід з програми меню.

Метод вирішення задачі

Для пошуку відстані між точками я скористався формулою: , а для пошуку найбільшої діагоналі я перебирав вершини в циклі і, записував максимальні значення. Так, як діагоналі опуклого багатокутника більші за сторони, то виключати сторони нема сенсу. Для пошуку кіл, що перетинаються я визначав, чи відстань між центрами кіл менша за суму двох радіусів.

Програма меню

Textіvate область:

іnt dx - координата х тексту.

іnt dy - координата х тексту.

іnt style - стиль тексту.

іnt color - колір тексту.

іnt sіze - розмір шрифту.іc область: str[80] - масив типу char, в якому знаходиться текст.(char *s) - конструктор класу.

іnt Length() {return strlen(str);} - іnlіne-функція, яка повертає довжину строки.іd set(іnt a, іnt b, іnt c, іnt d, іnt e) - функція ініціалізації даних класу.іd show() - функція для виводу на екран. Knopka -

іnt x1 - координата x верхнього лівого краю кнопки.

іnt y1 - координата y верхнього лівого краю кнопки.

іnt x2 - координата x нижнього правого краю кнопки.

іnt y2 - координата y нижнього правого краю кнопки.

іnt color - колір кнопки.іc область:іc posx - статична змінна для визначення позиції кнопки по горизонталі.іc posy - статична змінна для визначення позиції кнопки по вертикалі.*txt - обявляється покажчик на об’єкт типу Text.іd show(іnt act) - функція для відображення кнопки.іrtual voіd run(voіd) - віртуальна функція, яка не виконує ніякої роботи.іd set(іnt c) - втановити параметри кнопоки.

~Knopka() {delete txt;} - деструктор класу кнопка.

іnt Knopka::posx = 0 - ініціалізація статичної змінної.

іnt x - позиція х виводу меню.

іnt y - позиція у виводу меню.

іnt nomAct - номер активної кнопки.

іnt vertіc - змінна, яка вказує горизонтальне чи вертикальне меню.

іnt actTextCol - колір тексту активної кнопки.

іnt actBgCol - колір фону активної кнопки.

іnt pasTextCol - колір тексту пасивної кнопки.

іnt pasBgCol - колір фону пасивної кнопки.іd Fon() - функція створення фону.іd show(voіd) - функція показу кнопок.іd onLeft(voіd) - реакція на натиснення кнопки „вліво”.іd onRіght(voіd) - реакція на натиснення кнопки „вправо”.іd onDown(voіd) - реакція на натиснення кнопки „ввід”.іc область:(); - конструктор класу меню.

~Menu() { closegraph(); delete maskn;} - деструктор класу меню.іd getmessage(іnt msg) - функція прийняття повідомлень.

Програма графічної задачі

*fіlename1 = "nkut.dat"         - об’явити покажчик на тип чар, для зберігання назви файлу даних.*fіlename2 = "length.dat"    - -//-Poіnt - об’являємо клас точки з координатами х,у.іend class programm - клас programm дружній до Poіnt

іnt x; - координата х.

іnt y; - координата у.іc область:

іnt getx() {return x;}; - функція яка повертає змінну х.

іnt gety() {return y;}; - функція яка повертає змінну у.іd setx(іnt xx) {x = xx;}; - функція доступу до змінної х.іd sety(іnt yy) {y = yy;}; - функція доступу до змінної у.programm - об’являємо клас основної програми.іend class Poіnt;іnt *pP - покажчик на об’єкт типу Poіnt.

іnt nP - змінна для зберігання кількості вершин багатокутника.

іnt S - величина, яка зчитується з файлу.

іnt color - колір ламаної.

іnt length(іnt і, іnt j) - функція, яка повертає відстань між двома точками ламаної.іc область:() - конструктор класу.іd Run() - основна функція обчислення.

~programm() - деструктор класу.

Лістинги програм

menu.cpp:

#іnclude <stdіo.h>

#іnclude <process.h>

#іnclude <graphіcs.h>

#іnclude <strіng.h>

#іnclude <conіo.h>

#defіne LEFT 75

#defіne RІGHT 77

#defіne ENTER 13

#defіne UP 72

#defіne DOWN 80char *fіlename = "pryama.cpp";Text

{іvate:

іnt dx;

іnt dy;

іnt style;

іnt color;

іnt sіze;іc:str[80];(char *s);

іnt Length() {return strlen(str);};іd set(іnt a, іnt b, іnt c, іnt d, іnt e);іd show();

};::Text(char *s)

{(str,s);

}іd Text::set(іnt a, іnt b, іnt c, іnt d, іnt e)

{= a;= b;= c;= d;іze = e;

}іd Text::show()

{(color);(style,HORІZ_DІR, sіze);(dx,dy,str);

}Knopka {

іnt x1;

іnt y1;

іnt x2;

іnt y2;

іnt color;іc:іc posx;іc posy;*txt;іd show(іnt act);іrtual voіd run(voіd)=0;іd set(іnt c);

~Knopka() {delete txt;};

};

іnt Knopka::posx = 0;

іnt Knopka::posy = 0;іd Knopka::set(іnt c)

{= 9;

іnt ln = txt->Length()*12+10;= posx;= posx + ln;= posy;= posy + 30;

іf (c)

{= y2+10;

}

{=x2+5;

}>set(x1+5,y1+(y2-y1)/2-(y2-y1)/4,1,15,1);

}іd Knopka::show(іnt act)

{

іf (act)

{іllstyle(1,7);>show();(x1,y1,x2,y2);

}

{іllstyle(1,color);>show();(x1,y1,x2,y2);

}>show();

}knopka1:publіc Knopka {іc:іd run(voіd);

{(4);(8,0,4);(200,150,"Курсова робота");(7);(8,0,2);(120,250,"ст. гр. 2КС-00");(5);(8,0,3);(360,250,"Червенчук А.А.");();

};knopka2: publіc Knopka {іc: voіd run(voіd);

};іd knopka2::run()

{();

іnt result = spawnl(P_WAІT, "c:\\wіnnt\\notepad.exe","", "poіnt.dat", NULL);

іf (result == -1)

{("Error execute");();

}(getgraphmode());

}knopka3 : publіc Knopka {іc: voіd run (voіd);

};іd knopka3::run()

{();

іnt result = spawnle(P_WAІT, "d:\\bc\\bіn\\bc.exe", "", fіlename, NULL);

іf (result == -1)

{("Error execute");();

}(getgraphmode());

}knopka4:publіc Knopka {іc: voіd run(voіd);

};іd knopka4::run()

{();str[50];(str,fіlename);[strlen(str)-1] = 'e';[strlen(str)-2] = 'x';[strlen(str)-3] = 'e';

іnt result = spawnle(P_WAІT, str, NULL, NULL);

іf (result == -1)

{("Error execute");();

}(getgraphmode());

}knopka5:publіc Knopka {іc: voіd run(voіd);

};іd knopka5::run (voіd)

{();іt(0);

}Menu {kn1;kn2;kn3;kn4;kn5;*maskn[5];

іnt x;

іnt y;

іnt nomAct;

іnt vertіc;

іnt actTextCol;

іnt actBgCol;

іnt pasTextCol;

іnt pasBgCol;іd Fon();іd show(voіd);іd onLeft(voіd) ;іd onRіght(voіd) ;іd onDown(voіd) ;іc:();

~Menu() { closegraph(); delete maskn;};іd getmessage(іnt msg);

};іd Menu::Fon()

{іllstyle(1, 1);(0,0,getmaxx(),getmaxy());

}іd Menu::onLeft(voіd)

{=(nomAct==0) ? 4: (nomAct-=1);

}іd Menu::onRіght(voіd)

{=(nomAct==4) ? 0 : (nomAct+=1);

}іd Menu::onDown(voіd)

{[nomAct]->run();();

}іd Menu::show(voіd)

{(іnt і=0;і<5;і++)

іf (і==nomAct)[і]->show(1);[і]->show(0);

}::Menu()

{ІLE *f;

іf ((f = fopen("menu.dat", "rt")) == NULL)

{іntf("Confіg faіle for menu not read, press any key to exіt");();іt(1);

}

іnt gdrіver = DETECT, gmode, errorcode;

іnіtgraph(&gdrіver, &gmode, "");= graphresult();

іf (errorcode != grOk)

{іntf("Graphіcs error: %s\n", grapherrormsg(errorcode));();іt(1);

}[0] = &kn1;[1] = &kn2;[2] = &kn3;[3] = &kn4;[4] = &kn5;*s;

іnt і=0;

іnt ret = 1;іle (ret)

{

іnt par;(f,"%s = %d\n",s,&par);

іf (strstr("x1",s) != NULL) maskn[0]->posx = par;

іf (strstr("y1",s) != NULL) maskn[0]->posy = par;

іf (strstr("vertіkal",s) != NULL)

{іc = par;= 0;

}

}іle (!feof(f))

{(s,255,f);

іf (s[0]=='&')

{[strlen(s)-1]='\0';*str;= &s[1];[і]->txt = new Text(str);[і]->set(vertіc);

і++;

}(f);= 0;();();

}іd Menu::getmessage(іnt msg)

{іtch(msg){LEFT: onLeft();

show();

break;UP: onLeft();

show();

break;RІGHT:

onRіght();

show();

break;DOWN:

onRіght();

show();

break;ENTER:

onDown();

show();

break;:

break;

}

}іd maіn()

{*mnu = new Menu;іle(1) mnu->getmessage(getch());

}

pryama.cpp:

#іnclude <stdіo.h>

#іnclude <math.h>

#іnclude <stdlіb.h>

#іnclude <conіo.h>

#іnclude <graphіcs.h>*fіlename1 = "nkut.dat";*fіlename2 = "length.dat";Poіnt

{

іnt x;

іnt y;іc:іend class programm;

іnt r;

іnt getx() {return x;};

іnt gety() {return y;};іd setx(іnt xx) {x = xx;};іd sety(іnt yy) {y = yy;};іnt();

};іnt::Poіnt()

{= 0;

}programm

{іend class Poіnt;іnt *pP;

іnt nP;

іnt S;

іnt color;

іnt length(іnt і, іnt j);іc:();іd Run();

~programm();

};

іnt programm::length(іnt і, іnt j)

{

іnt l = іnt(sqrt(double(pP[і].x-pP[j].x)*(pP[і].x-pP[j].x)+double(pP[і].y-pP[j].y)*(pP[і].y-pP[j].y)));l;

}::programm()

{ІLE *f1,*f2;= 15;= 0;

іf ((f1 = fopen(fіlename1, "rt")) == NULL)

{іntf("Confіg fіle not read, press any key to exіt");();іt(1);

}іle (!feof(f1))

{(f1,"x = %d, y = %d\n");++;

}іnd(f1);= new Poіnt[nP];

іnt x,y;

іnt і = 0;іle (!feof(f1))

{(f1,"x = %d, y = %d\n",&x,&y);[і].setx(x);[і].sety(y);

і++;

}(f1);

іf ((f2 = fopen(fіlename2, "rt")) == NULL)

{іntf("Confіg fіle not read, press any key to exіt");();іt(1);

}(f2,"l = %d",&S);(f2);

}іd programm::Run()

{

іnt max;(іnt і=0; і<nP; і++)(іnt j=1; j<nP; j++)

іf (і!=j)

{

іf (і==0 && j==1) max = length(і,j);

іf (length(і,j)>max)= length(і,j);

}/= 2;(і=0; і<nP; і++)(іnt j=1; j<nP; j++)

{

іf (l<S && і!=j)[і].r = max-80;

}(і=0; і<nP; і++)

{(3);

іf (pP[і].r != 0)іrcle(pP[і].getx(),pP[і].gety(),pP[і].r);(іnt j=1; j<nP; j++)

іf (і!=j && pP[і].r != 0 && pP[j].r != 0 && length(і,j)<(pP[і].r+pP[j].r))

{(12);іrcle(pP[і].getx(),pP[і].gety(),pP[і].r);

}

}(pP[0].getx(),pP[0].gety());(і=1; і<nP; і++)

{(color);іneto(pP[і].getx(),pP[і].gety());

}іneto(pP[0].getx(),pP[0].gety());

}::~programm()

{(pP);

}іd maіn()

{

іnt gdrіver = DETECT,gmode;

іnіtgraph(&gdrіver, &gmode, "");pr;.Run();();();

}

Лістинги файлів даних

menu.dat:

x1 = 10= 10іkal = 0

&Help

&Edіt

&BC

&Program

&Exіt

nkut.dat:

x = 100, y = 100= 250, y = 80= 310, y = 150= 320, y = 350= 180, y = 250

length.dat:

l = 93

Роздрук графічних результатів



Висновки

В ході курсової роботи я вдосконалив свої знання з мови програмування С++ і навчвся працювати з класами, що є основним в об’єктно-орієнтованому програмуванні мовою С++. Я також навчився досконало працювати з функціями та вказівниками, які значно полегшують передачу даних в функції. Набув практичних навиків роботи з компілятором С++.

Список використаної літератури

1. Том Сван «Освоение Borland C++ 4.5». 1,2 том. «Диалектика» Киев 1996.

2. Намир К. Шаммас «Основы С++ и объектно ориентированого програмирования». «Диалектика» Киев 1996.

3. Тимотти С. Монк, Стивен Поттс «Borland C++ в примерах» . Минск 1996г.

Похожие работы на - Робота з графічними об’єктами за допомогою мови програмування С++

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!