Смекни!
smekni.com

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

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


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 <stdio.h>

#include <conio.h>

#include <graphics.h>

#include <math.h>

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<n; 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<p[0].getx() || (x==p[0].getx() && y<p[0].gety()))

{

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<n; i++)

{

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

int nom = i;

for(j=i+1; j<n; j++)

{

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

if (an<An)

{

An = an; nom = j;

}

}

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

}

int gd=DETECT, gm;

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

if (graphresult()!=grOk)

{

printf("ERROR!&bsol;n");

return 1;

}

setcolor(GREEN);

for(i=0; i<n; i++)

p[i].draw(GREEN);

int i1, i2, i3, i4;

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

for(i1=0; i1<n; i1++)

for(i2=i1+1; i2<n; i2++)

for(i3=i2+1; i3<n; i3++)

for(i4=i3+1; i4<n; 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.gets())

pmin=pp;

}

pmin.draw(RED);

pmax.draw(YELLOW);

getch();

closegraph();

}


Додаток Б.

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

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

#include<stdio.h>

#include<conio.h>

#include<iostream.h>

#include<graphics.h>

#include<string.h>

#include<process.h>

#include <stdlib.h>

#include <math.h>

#include <dir.h>

#include "clases.h"

#define LEFT 75

#define RIGHT 77

#define ENTER 13

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

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

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:&bsol;tc&bsol;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 << "&bsol;nЌҐ¬®¦г §­ ©вЁ । Єв®а д ©«iў.";

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

cout << "&bsol;nЌ ЇаЁЄ« ¤ C:&bsol;bc&bsol;bin&bsol;bc.exe Ў® exit ¤«п ўЁе®¤г.&bsol;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 << "&bsol;n” ©«&bsol;n"<<bc_path<<"&bsol;n­Ґ§­ ©¤Ґ­® Ў® ­ҐЄ®а­Єв­Ґ i'¬п д ©«г&bsol;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);

}