48308 (Програмування мовою С++ з використанням об’єктно-орієнтованого програмування), страница 2

2016-07-30СтудИзба

Описание файла

Документ из архива "Програмування мовою С++ з використанням об’єктно-орієнтованого програмування", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "курсовые/домашние работы", в предмете "информатика, программирование" в общих файлах.

Онлайн просмотр документа "48308"

Текст 2 страницы из документа "48308"

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

З об'єктно-орієнтованого аналізу, як правило, починається цикл розробки; ми розглядаємо задачу з погляду класів і об'єктів.

На стадії проектування в нас уже сформувалося виразне уявлення про проблему як сукупності сутностей і їхніх взаємин, і ми починаємо розбивати задачу на реальні класи й об'єкти.

Об’єктно-орієнтоване програмування полягає власне у втіленні в життя наших класів і об'єктів (використовуючи, у даному випадку, C++).

Темі об'єктно-орієнтованого аналізу і проектування присвячено чимало чудових глибоких праць: але практично всі автори — як теоретики, так і практики— згодні з думкою батька-засновника C++ Бъярна Страуструпа (Bjarne Stroustrop), який стверджує, що досконалих правил ідентифікації об'єктів проблемної області не буває. Експериментування, навчання на своїх успіхах і своїх помилках — це найкраще правило.

Методи аналізу

Об'єктно-орієнтований аналіз переслідує своєю ціллю розглянути об'єкти у вашій проблемній області. Можна намагатися класифікувати об'єкти по подібності в поведінці чи характерних рисах. Це непроста задача, але давайте згадаємо — існує безліч наук набагато більш древніх, ніж обчислювальна техніка, у яких класифікація об'єктів своєї предметної області дотепер залишається улюбленим проводженням часу. Так що нічого немає правильного або неправильного — потрібно працювати з тим, що працює!

Аналіз поведінки

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

Аналіз області застосування

Коли йде розробка якоїсь системи, то це, найчастіше, не перша система такого роду. Можна поговорити із людьми, знайомими з предметом. Наприклад, якщо йде розробка вексельної системи для юридичної фірми, можна поговорити з юристами і нотаріусами. Вони, напевно, користалися схожими системами і можуть розповісти масу цікавого не тільки про те, що повинна робити нова система, але і про те, чого вона робити не повинна. І ще вони прекрасно знайомі з "об'єктами", що будуть фігурувати в системі — протоколами, звітами і т.п. Ніколи не можна недооцінювати знання і можливу допомогу кінцевих користувачів.

Аналіз "з кінця"

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

Структурний аналіз

Ми всі дуже добре знайомі з практикою поділу задачі на підзадачі. Чи то це обумовлено нашим освітою, чи це в нашій природі, але для більшості з нас це не представляє особливих зусиль. Виділивши етапи і під етапи, спробуємо побачити об'єкти і їхні взаємозв'язки.

Який би аналітичний підхід до проблеми не застосовувався, завжди потрібно пам'ятати, що ж ми шукаємо. Ключові характеристики об'єктів — це абстракція, інкапсуляція, модульність і ієрархія. Коли ми окреслили об'єкти — будь-яким доступним нам методом — почнемо з того, що постараємося зрозуміти, яка інформація абсолютно необхідна взаємодіючим класам (інкапсуляція). Розберемося, які класи взаємозалежні, а які ні (модульність). І нарешті подивимося, які класи мають схожі характеристики і функціонування (ієрархія). Поки ми перебуваємо в стадії аналізу і проектування, ми вільні як завгодно комбінувати об'єкти, розділяти їх і так далі. Коли ж почнеться реалізація, повертатися буде вже занадто пізно. Давайте експериментувати, поки є можливість!

Проектування

Як уже згадувалося, об'єктно-орієнтовані аналіз і проектування — дуже близькі родичі. Коли задача проаналізована, залишається насправді тільки уточнити деталі реалізації. Тут самий час зосередитися на взаємозв'язках між об'єктами і модулями. Роздивитися типи спадкування між об'єктами, визначити необхідні типи повідомлень, число параметрів і так далі. Існує ряд систем позначення для відтворення проекту на папері. Гарне документування проекту може істотно полегшити його втілення в життя.

Вигоди

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

Проект повинен

• Грамотно використовувати об'єктно-орієнтовані конструкції C++. Широко використовуйте класи і наслідування.

• Створювати по можливості самодостатні класи — вони будуть гарними кандидатами на повторне використання.

• Бути зрозумілим. Найбільша вигода об'єктно-орієнтованого проектування — в представленні проблеми в легкодоступному, тим хто розуміє, вигляді.

Захоплення ресурсів при ініціалізації

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

У такий спосіб в об'єктно-орієнтованому програмуванні досягається одна з заповітний цілей – якщо об'єкт створений, то можна бути упевненим у тому, що він створений цілком а не залишається в якому-небудь нестійкому половинчатому стані.

2. Розробка програми виконання завдання

2.1. Розробка методу вирішення задачі

Нехай а, в, с, d – сторони трикутника.

Для розв’язання поставленої задачі нам потрібно шукати точку перетину прямих, а точніше не прямих в відрізків прямих, з яких складається чотирикутник.

Запишемо рівняння прямої через 2-ві точки:

Y0=Y2-Y1;

X0=X2-X1;

X*Y0–X1*Y0 = X0*Y–X0Y1

X*Y0– X0*Y = X1*Y0 –X0Y1

X1*Y0 –X0Y1=Z

(ми отримали рівняння прямих)

X11*Y01 –X01Y11=W;

Знайдемо розв’язок даної системи рівнянь

Це і буде розв’язок. Щоб дізнатись чи точка належить відрізку, потрібно перевірити чи відповідні координати точки лежать в межах відповідних координат кінців відрізка.

2.2 Структура даних і функцій

В програмі TRIK.H описаний власний клас Point. В цьому класі зберігаються всі відомості про чотирикутники. В класі описані слідуючи члени:

int x;– координати Х точки.

int y;– координати У точки.

Також в даному класі описані слідуючи методи:

void drow(int col);- виводить на екран точку вказаним кольором.

class Point

{

int x, y;

public:

Point(){}

Point(int _x, int _y) { x=_x; y=_y; }

int getx(){ return x; }

int gety(){ return y; }

void draw(int color) { setcolor(color); circle(x, y, 3); }

};

3. Розробка програми меню

class MenuItem // головний клас опису кнопок

{

int x1;

int y1;

int x2;

int y2;

char str[80];

public:

void setParam(int xx1,int yy1,int xx2,int yy2,char *sstr) // введення координат кнопок

{

x1=xx1;

y1=yy1;

x2=xx2;

y2=yy2;

strcpy(str,sstr); // копіює назву меню

};

void showAct(void); // показує кнопку в момент натиску

void showPas(void); // показує кнопку в інший момент

void About(void); // показує кнопку About

void Run(int); // показує кнопку Run

};

/***************************************************/

class Menu // клас меню для керування кнопок

{

MenuItem mits[5]; // масив кнопок

int nomAct;

int oldNomAct;

void onLeft(void); // функція для руху кнопки вліво

void onRight(void); // функція для руху кнопки вправо

void onEnter(void); // функція для відкриття кнопки

void show(void);

void show1(void);

public:

Menu(int xx,int yy);

void getMessage(int msg); // яка кнопка вибрана

};

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

Тексти вхідних файлових даних

4.1 Текст файлу rect.txt

wer

Point 1: x= 0; y= 0;

Point 2: x= 0; y= 100;

Point 3: x= 100; y= 0;

Point 4: x= 100; y= 100;

Point 5: x= 32; y= 206;

Point 5: x= 32; y= 20;

Point 13: x= 35; y= 79;

4.2 Текст файлу About.dat

Vukonav:

Chernenko Yuriy "2KI - 07"

4.3 Текст файлу MENUDATA.TXT

About

Edit File

Edit Program

Run

Exit

5. Інструкція користувача

Запуск програми виконується через файл MENU.EXE .

Відкривається меню програми. При натиснення на кнопку About , користувач получає інформацію про розробника програми. Кнопки Edit File та Edit Program дозволяє редагувати текст вхідних даних та саму програму відповідно. При натисканні на кнопку Run виконується програма . Кожна наступна дія в програмі виконується після натисканні на клавішу клавіатури. Кнопка Exit дозволяє користувачу вийти з програми.

Висновки

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

Перелік посилань

В.В. Подбєльский, С.С. Фомін “Програмування на мові Сі”

М. Уєйт, С. Прата, Д. Мартін “Мова Сі”

П. Кіммел “Borland C++ 5”

Джесс Ліберті “Освой самостоятельно С++ за 21день”

Гіберт Шілдт “Язык С для проффесионалов ”

Додатки

Додаток А.

(обов’язковий)

Текст програми

#include

#include

#include

#include

class Point

{

int x, y;

public:

Point(){}

Point(int _x, int _y) { x=_x; y=_y; }

int getx(){ return x; }

int gety(){ return y; }

void draw(int color) { setcolor(color); circle(x, y, 3); }

};

long sd(Point p1, Point p2, Point p3)

{

return ((long)(p3.getx()-p1.getx())*(long)(p2.gety()-p1.gety())-(long)(p2.getx()-p1.getx())*(long)(p3.gety()-p1.gety()));

}

int Peretyn(Point p1, Point p2, Point p3, Point p4)

{

if (sd(p1, p2, p3)*sd(p1, p2, p4)<=0 && sd(p3, p4, p1)*sd(p3, p4, p2)<=0) return 1;

return 0;

}

class Polygon

{

Point p1, p2, p3, p4;

long s;

public:

Polygon(){ s = 0; }

Polygon(Point _p1, Point _p2, Point _p3, Point _p4)

{

p1=_p1; p2=_p2; p3=_p3; p4=_p4; s=0;

Point t;

if (Peretyn(p1, p2, p3, p4))

{

t=p2; p2=p3; p3=t;

}

else

if (Peretyn(p2, p3, p4, p1))

{

t=p1; p1=p2; p2=t;

}

}

void Calc()

{

s+=(long)(p1.getx()-p2.getx())*(long)(p1.gety()+p2.gety());

s+=(long)(p2.getx()-p3.getx())*(long)(p2.gety()+p3.gety());

s+=(long)(p3.getx()-p4.getx())*(long)(p3.gety()+p4.gety());

s+=(long)(p4.getx()-p1.getx())*(long)(p4.gety()+p1.gety());

s=labs(s)/2;

}

long gets() { return s; }

void sets(long _s) { s=_s; }

void draw(int color)

{

setcolor(color);

moveto(p4.getx(), p4.gety());

lineto(p1.getx(), p1.gety());

lineto(p2.getx(), p2.gety());

lineto(p3.getx(), p3.gety());

lineto(p4.getx(), p4.gety());

}

};

float Angle(Point p1, Point p2)

{

long dx = (p2.getx()-p1.getx());

long dy = (p2.gety()-p1.gety());

if (dx==0 && dy==0) return 0;

float res = float(dx*dx)/(float(dx*dx+dy*dy));

if (dx<0) res=-res;

return res;

}

int main()

{

clrscr();

FILE *f=fopen("rect1.txt", "r");

int i, j, n;

char s[200];

fgets(s, 200, f);

for(n=0;!feof(f);++n) fgets(s, 200, f);

rewind(f);

Point* p=new Point[n];

fgets(s, 200, f);

for(i=0; i

{

int x, y;

fscanf(f, "%s%s%s%d%s%s%d%s", s, s, s, &x, s, s, &y, s);

p[i]=Point(x, y);

if (x

{

Point t=p[0]; p[0]=p[i]; p[i]=t;

}

}

Polygon test(Point(10, 0), Point(10, 1), Point(9, 1), Point(9, 2));

for(i=1; i

{

float An = Angle(p[0], p[i]);

int nom = i;

for(j=i+1; j

{

float an = Angle(p[0], p[j]);

if (an

{

An = an; nom = j;

}

}

Point t = p[i]; p[i]=p[nom]; p[nom]=t;

}

int gd=DETECT, gm;

initgraph(&gd, &gm, "e:\\tc\\bgi");

if (graphresult()!=grOk)

{

printf("ERROR!\n");

return 1;

}

setcolor(GREEN);

for(i=0; i

p[i].draw(GREEN);

int i1, i2, i3, i4;

Polygon pmin, pmax; pmin.sets(1000000000);

for(i1=0; i1

for(i2=i1+1; i2

for(i3=i2+1; i3

for(i4=i3+1; i4

{

if (i1==40 && i2==43 && i3==47 && i4==49)

{

i2=i2;

}

Polygon pp = Polygon(p[i1], p[i2], p[i3], p[i4]);

pp.Calc();

if (pp.gets()>pmax.gets()) pmax=pp;

if (pp.gets()

pmin=pp;

}

pmin.draw(RED);

pmax.draw(YELLOW);

getch();

closegraph();

}

Додаток Б.

(обов’язковий)

Текст програми меню

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include "clases.h"

#define LEFT 75

#define RIGHT 77

#define ENTER 13

char bc_path[255]="e:\\tc\\BIN\\tc.exe";

char bc_path1[255]="e:\\tc\\BIN\\";

int findfile(void);

void f_file(char *fname);

void generateNewInfile(void);

/**********************************************/

class MenuItem

{

int x1;

int y1;

int x2;

int y2;

char str[80];

public:

void setParam(int xx1,int yy1,int xx2,int yy2,char *sstr)

{

x1=xx1;

y1=yy1;

x2=xx2;

y2=yy2;

strcpy(str,sstr);

};

void showAct(void);

void showPas(void);

void About(void);

void Run(int);

};

void MenuItem::showPas(void)

{

setviewport(x1,y1,x2,y2,1);

setfillstyle(1,0);

bar(1,1,x2,15);

setfillstyle(1,8);

bar(1,1,x2-1,14);

setfillstyle(1,15);

bar(0,0,x2-2,13);

setfillstyle(1,7);

bar(1,1,x2-2,13);

setcolor(15);

outtextxy(6,4,str);

setcolor(0);

outtextxy(5,3,str);

};

void MenuItem::showAct(void)

{

setviewport(x1,y1,x2,y2,1);

setfillstyle(1,0);

bar(0,0,x2,15);

setfillstyle(1,9);

bar(2,3,x2,14);

setcolor(12);

outtextxy(7,5,str);

setcolor(10);

outtextxy(6,4,str);

};

void MenuItem::About(void)

{

char str[80];

window(10,5,70,15);

FILE*f1=fopen("About.dat","r");

for(int i=0;i<3;i++)

{

fgets(str,80,f1);

gotoxy(1,i+1);

printf("%s",str);

i++;

};

getch();

};

void MenuItem::Run(int activ)

{

switch (activ) {

case 0: About();

break;

case 1: f_file("input.txt");

break;

case 2: f_file("menu.cpp");

break;

case 3: int res = spawnl(P_WAIT,"circles.exe",NULL);

break;

case 4: closegraph();

exit(0);

break;

};

};

/***************************************************/

class Menu

{

MenuItem mits[5];

int nomAct;

int oldNomAct;

void onLeft(void);

void onRight(void);

void onEnter(void);

void show(void);

void show1(void);

public:

Menu(int xx,int yy);

void getMessage(int msg);

};

Menu::Menu(int xx,int yy)

{

int x,y;

x=xx;

y=yy;

char str[80];

FILE *f;

f=fopen("menudata.txt","r");

for(int i=0;i<5;i++)

{

fgets(str,80,f);

mits[i].setParam(x,y,x+strlen(str)*8+1,y+15,str);

x+=strlen(str)*8+3;

};

nomAct=0;

oldNomAct=1;

show();

};

void Menu::getMessage(int msg)

{

switch(msg)

{

case LEFT:

onLeft();

show1();

break;

case RIGHT:

onRight();

show1();

break;

case ENTER:

onEnter();

show1();

};

};

void Menu::onLeft(void)

{

oldNomAct=nomAct;

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

};

void Menu::onRight(void)

{

oldNomAct=nomAct;

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

};

void Menu::onEnter(void)

{

mits[nomAct].Run(nomAct);

};

void Menu::show(void)

{

int gdr=DETECT,gm;

initgraph(&gdr,&gm,"e:\\tc\\bgi");

setfillstyle(1,0);

bar(0,0,639,479);

for(int i=0;i<5;i++)

if(i==nomAct)

mits[i].showAct();

else

mits[i].showPas();

};

void Menu::show1(void)

{

for(int i=0;i<5;i++)

if(i==nomAct)

mits[i].showAct();

else

mits[i].showPas();

};

//**********************************************

main()

{

Menu mnu(40,40);

while(1)

mnu.getMessage(getch());

}

int findfile()

{

struct ffblk ffblk;

if(findfirst(bc_path,&ffblk,0)==0) return 1;

for(;;)

{

cleardevice();

gotoxy(1,1);

cout << "\nЌҐ¬®¦г §­ ©вЁ । Єв®а д ©«iў.";

cout << "\n‚ўҐ¤iвм и«пе в i¬'п д ©«г вЁЇг bc.exe";

cout << "\nЌ ЇаЁЄ« ¤ C:\\bc\\bin\\bc.exe Ў® exit ¤«п ўЁе®¤г.\n";

cin >> bc_path;

if(bc_path[0]=='e'&&bc_path[1]=='x')

{

cleardevice();

return 0;

}

if(findfirst(bc_path,&ffblk,0)==0)

{

cleardevice();

return 1;

}

else

{

cout << "\n” ©«\n"<

getch();

}

}

}

void f_file(char *fname)

{

if(findfile()==0) return;

char cmd[250];

strcpy(cmd, "notepad ");

strcat(cmd,bc_path1);

strcat(cmd,fname);

system(cmd);

}

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Нет! Мы не выполняем работы на заказ, однако Вы можете попросить что-то выложить в наших социальных сетях.
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
4125
Авторов
на СтудИзбе
667
Средний доход
с одного платного файла
Обучение Подробнее