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

 

Міністерство освіти та науки України

Вінницький Державний Технічний університет

кафедра обчислювальної техніки












Курсова робота з дисципліни

Програмування

Тема:

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



Допущена до захисту

Розробив студент Групи 1КС - 01

Осадчук Андрій

Залікова книжка № 178

Керівник

Черняк О.І.




Вінниця 2002

Завдання до курсової роботи


У файлі задано координати вершин трикутників і координати верщин відрізка. Вивести на екран ці трикутники і відрізок. Другим кольором вивести найменший за площею трикутник. Записати в інший файл координати вершин тих трикутників, які перетинаються з відрізком.

Аннотація


Курсова робота виконувалась з метою якомога точніше відобразити вимоги індивідуального завдання.

Було спроектовано і описано ряд класів, що відображали сутність геометричних фігур, і їх (класів) методів, в яких і реалізовано рішення завдання.

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

Опис таких типів, як Boolean і Byte здійснено для спрощення розуміння коду програми і уточнення дій, що можна проводити над даними цих типів.

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

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

Як альтернатива їм були вибрані динамічні списки, що забезпечують необхідну гнучкість і, окрім того, були бажаною реалізацією, що зазначалось в завдані до курсової роботи.

Таким чином робота повністю відповідає поставленим в індивідуальному завданні вимогам і є рішенням запропонованої задачі.

Зміст


Завдання до курсової роботи

Аннотація

Зміст

Вступ

Загальна структура роботи

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

Список використаних джерел

Додатки


Вступ


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

Загальна структура роботи


Курсова робота складається з файлу проекту, написаного на мові Borland C++ version 3.1 (розширення .cpp) і його скомпільованого варіанту (розщирення .exe).

Також можуть бути (але не обовязково) присутні файли з збереженими даними Test.dat і Tria.dat".

Розробка алгоритму виконання основного завдання на курсову роботу і програмна його реалізація з використанням засобів обєктно-орієнтованого програмування


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

Отож, сформулювати концепцію ООП можна так: ООП - це дані, що доповнені функціями для роботи з ними і тільки ними. Це називається - інкапсуляція.

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

Один раз добре написаний обєкт може бути використано безліч разів, без необхідності його дублювати, тестувати і, як воно зазвичай буває, переписувати. Завдяки тому, що всі (чи майже всі) дані в програмі повязані і нерідко мають багато спільного, скориставшись відомим математичним прийомом, можна винести усі спільні риси за дужки і опрацювати окремо. А один раз добре відпрацьоване ядро можна доповнювати різними властивостями для будь-яких конкретних випадків.

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

В першу чергу - це положення. Тому у кожної (будь-якої, квадрата чи кола) фігури мають бути її координати (X і Y). Ще одною властивістю фігури є, наприклад, її колір. Це основні властивості класу Фігура, їх прийнято називати її властивостями (або полями обєкта). Після визначення властивостей обєкта, потрібно визначити, які дії можна провести над ним. Для фігури - це переміщення (що випливає з наявності у неї координат) і зміна кольору (аналогічно). Також фігуру можна вивести на екран, що є логічним результатом її існування.

Цих три дії - переміщення, зміна кольору і рисування фігури є методами обєкта Фігура.

Таким чином отримали остаточно сформований клас Фігура.

Опишемо клас Квадрат. У нього є всі властивості фігури: координати і колір, його можна перемішувати і т. д. Але у нього є нові, притаманні саме йому властивості, наприклад - розмір сторін.

При класичному підході до програмування сутностей, необхідно ще раз описати в програмі, що у квадрата є колір, координати і т. д. Але з ООП цього робити непотрібно. Зазначимо у програмі, що клас Фігура є базовим для класу Квадрат, тоді класу Квадрат стануть доступні всі властивості класу Фігура. Якщо у Фігури було б декілька десятків (сотень) властивостей, це стало б суттєвою економією часу. Також це зменшує кількість помилок в описах класів і їх методів.

Або інший приклад. Нехай на базі класу Фігура було написано декілька класів - квадрат, коло, трикутник і т. д. І виникла необхідність їх пронумерувати. В такому випадку кожен клас має мати властивість номер.

При написанні програми в класичному, не обєктному, стилі, потрібно було б до кожного з описів класів (квадрата, кола …) додавати властивість номер. Це довго і не гарантує, що програміст не забуде жодної з описаних фігур. В з ООП, коли описано базовий клас Фігура, до його властивостей потрібно просто додати ще одну - номер, і тоді всі класи, для яких Фігура є базовим (нащадки класу Фігура) зразу отримають властивість номер. Таким чином, ООП зберігає час і сили програміста, а здатність класу-нащадка мати доступ до властивостей класу-предка (базового класу) називається наслідуванням.

Розглянемо ще таку ситуацію. Клас Фігура має метод відображення її на екрані. Цей метод мають і всі її нащадки. Але квадрат і коло мають виводити себе на екран по різному! На даному етапі всі нащадки класу Фігура виводять себе на екран однаково - так само, як сама фігура. Так як Фігура - поняття абстрактне, то вони виводити себе на екран не будуть взагалі. У цієї проблеми в ООП є рішення. А саме: ті методи, що мають однакову назву і виконують однакову дію, але по-різному для кожного з нащадків, слід описувати як віртуальні. Метод класу, що описаний як віртуальний, не буде використовувати такий самий метод предка, а свій власний, що і треба було реалізувати. Можливість різних класів мати методи з однаковими назвами, що виконують при цьому різні дії називається поліформізмом.

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

Але саме визначення класу Квадрат ще не призводить до появи квадрату на екрані. І взагалі, квадратів може бути декілька, різного кольору, в різних місцях на екрані.

Кожен з них є обєктом класу Квадрат. Виходячи з цього можна можна дати визначення поняттю обєкт. Отже, обєкт класу - це конкретний елемент типу даних, що має властивості свого класу і при цьому є його практичною реалізацією. Тобто, при опису класу вказується тільки те, що у обєкта квадрат мають бути координати, а у обєктів Квадрат1, Квадрат2, Квадрат3 і т. д., ці координати конкретизуються. Опис класу завжди один, обєктів класу - скільки завгодно.

В програмі описано такі класи:. Це структура, з полями Х і У, що забезпечують програмне представлення точки на координаційній площині.. Предок всіх фігур, є нащадком TListItem і тому має відповідні властивості для використання вTShapeLst . В цьому класі описані основні , спільні для всіх фігур, властивості, що зберігають інформацію про колір, номер, пересічення і т.д. Також описані методи для роботи з цими властивостями.. Нащадок TShape. Окрім властивостей, описаних у своєму предку, має координати точок кінців і довжину. Також доповнені методи TShape.. Нащадок TShape. Має площу і три сторони - A, B, C.. Нащадок TList.Описаний для зберігання списку обєктів TShape і його нащадків. Описане поле Smaller вказуює на найменший обєкт в списку. Методи базового класу доповнені новими - Repaint, що забезпечує прорисовку всіх членів в списку, LoadFromFile та SaveToFile, які забезпечують операції з файлами. Останні два на рівні TShapeLst абстрактні.. Нащадок TShapeLst. Не вносить нових полей, але окрім конкретної реалізації методів LoadFromFile і SaveToFile, доповнює клас методами для фільтрації списку фігур згідно з умовою індивідуального завдання.

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

Функція GetLength, що отримує на вході два обєкта типу TPoint, повертає відстань між точками, чиї координати визначені цими обєктами.

Таким чином реалізовано ієрархію класів, основою якої є TListItem і TList, що забезпечує програмі велику гнучкість, та TShape і TShapeLst, що забезпечує підтримку графічних обєктів і роботи з ними.

Короткий опис методів описаних у програмі класів з обґрунтуванням використаних алгоритмів. Так як реалізація власне завдання на курсову роботу починається з класу TShape, є сенс не розглядати класи TList і TListItem особливо докладно, вони відповідають за низькорівневі операції з памяттю, її виділенням та звільненням для обєктів.

Методи класу TShape не відрізняються нічим вартим уваги. Їх дія очевидна і не потребує додаткових пояснень.

Методи TLine теж виконують тільки службову функцію ініціалізації обєктів класу і їх прорисовки.

Клас TShapeLst описаний як ядро і базовий клас будь-якого списку фігур, тому його єдиний неабстрактний метод Repaint просто викликає метод Draw кожного з елементів списку, перебираючи їх від першого ( FirstItem) до останнього (Item->Next = = 0). Реалізація власне завдання на курсову роботу починається тільки з класу TTriangleLst. Його метод Generate генерує задану як вхідний параметр кількість елементів списку з довільними координатами. Змістовний алгоритм відсутній, а маштаб розмірів обєктів вибраний довільно, і не заперечує умові.

Метод LoadFromFile є альтернативою методу Generate і за допомогою звичайних функцій роботи з файлами і потоками заповнює раніше збережений на диску список відрізків. SaveToFile виконує роль, протилежну методу LoadFromFile - зберігає на диску згенерований методом Generate список елементів.

За допомогою цих трьох методів реалізовано звязок між елементами і їх координатами у файл .

Методом SetBiggSmall ініціалізується поле Smaller класу TTriangleLst. За таким алгоритмом: перебираючи всі відрізки від другого до останнього потрібно порівняти їх з кожним відрізком (від першого - до останнього) в списку (окрім самого себе). В разі, якщо відрізок менший від Smaller (що спочатку вказує на перший елемент списку) то Smaller змінює своє значення на значення активного на даній ітерації елементу списку.

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

Метод Filter концептуально не відрізняється від SetBiggSmall. Перебираючи всі елементи списку, для кожного (з допомогою функції Cross) перевіряється його пересічення з будь-яким іншим, і в разі позитивного результату перевірки результат відображається в полі Crossed класу TTriangle. Таким чином виконується фільтрація елементів згідно завдання курсової роботи.

Власне код функції main виконує послідовний визов функцій-членів і додаткових пояснень не потребує.

функція файл поле power

Список використаних джерел


  1. Методичні вказівки до виконання курсової роботи. Вінниця, ВДТУ - 1998.
  2. Страуструп Б. Язык программирования Си++. Москва, Радио и связь - 1991.
  3. Керниган, Ричи. Язык C. В электронном виде.

Додатки


Додаток А. Лістинг програми


#include <StdIo.h>

#include <ConIo.h>

#include <Graphics.h>

#include <Math.h>

#include <StdLib.h>

#include <String.h>

#include <FStream.h>Boolean

{= 0, True = 1

};char Byte;TListItem;TListItem

{* Next;* Prev;

};TList

{:ItemCount;* FirstItem;* CurrItem;();void Add(TListItem* Item);void Del();void Clear();~TList();

};

//*** TList methods::TList()

{= 0;= 0;= FirstItem;

};TList::Add(TListItem* Item)

{>Next = 0;>Prev = CurrItem;(CurrItem != 0)>Next = Item;= Item;= Item;++;

};TList::Del()

{* Item;* PrevItem;= CurrItem->Prev;= CurrItem->Next;>Prev = PrevItem;(CurrItem);= Item;-;

};TList::Clear()

{= FirstItem;(FirstItem != 0)

{= FirstItem->Next;();= FirstItem;

};

};::~TList()

{();

};

//*** Ctrls

#define VK_ESC 27

#define VK_ENTER 13

#define VK_LEFT 75

#define VK_RIGHT 77

#define VK_UP 72

#define VK_DOWN 80

#define VK_DEL 83

#define VK_BACK 8

#define LF = 10

#define CF = 13

#define CR = CF+LFchar TCaption[12+1];TExitFlag

{, efNext, efPrev

};TObject :public TListItem

{

//*** Abstract

};TApplication;void (*PButtonClick)(void* Sender);void (TApplication::*PAppButtonClick)(void* Sender);TControl:public TObject

{

//*** Предок всех элементов управления,

//*** содержит свойства для работы в TControlList:X, Y;Color, BkCol, ActiveCol;Active;ExitFlag;Tag;Caption;(Byte AX, Byte AY, TCaption ACaption, Byte ACol, Byte ABkCol,Byte AActiveCol,int ATag);void SetClr(Byte AItem, Byte ACol);void Enter();void Exit();void Draw() = 0;

~TControl(){};

};TButton :public TControl

{:* Owner;onClick;(TApplication* AOwner, Byte AX, Byte AY, TCaption ACaption, int ATag, PAppButtonClick AClick);void Draw();void Enter();void Run();

~TButton(){};

};TControlLst :public TList

{

//*** Динамический список элементов управления:();Run();void Repaint();

};TApplication

{:(){};

};TProga;ReadKey(char* Key, Boolean* CtrlKey);

//*** Types and declarationsTPoint

{X,Y;

};TLinePnt: public TListItem

{:Pnt;(){}

};TRect

{Left, Top, Right, Bottom;

};TShape: public TListItem

{

//*** Предок всех фигур,

//*** содержит свойства для работы в TShapeList:Crossed;Color;Tag;(){Color = RED; Tag = 0;};(Byte ACol, int ATag);void SetClr(Byte ACol);void Draw() = 0;~TShape();

};TLine: public TShape

{:A, B;Len;():TShape(){};(TPoint AA, TPoint AB, Byte ACol, int ATag);SetLen();void Draw();

};TTriangle: public TShape

{:A, B, C;Area;Smaller;(TPoint AA, TPoint AB, TPoint AC, Byte ACol, int ATag);void Draw();SetArea();void SetClr(Byte ACol);

};TShapeLst: public TList

{

//*** Динамический список фигур ***):* Smaller;();void Repaint();void LoadFromFile(char* FileName) = 0;void SaveToFile(char* FileName) = 0;

};TTriangleLst: public TShapeLst

{:* Line;();void Generate(int ACount);void LoadFromFile(char* FileName);void SaveToFile(char* FileName);SaveCrossedTria(char* FileName);void Filter();Boolean Cross(TLine* Item, TLine* SubItem);void SetBiggSmall();void Repaint();

};Power(long X)

{(X*X);

};GetLength(TPoint P1, TPoint P2)

{Result;= Power(P2.X - P1.X) + Power(P2.Y - P1.Y);(Result > 0)= sqrt(Result);//*** Иначе координаты двух точек равны= 0;(Result);

};

//*** TShape methodsTShape::TShape(Byte ACol, int ATag)

{= ACol;= ATag;

};TShape::SetClr(Byte ACol)

{= ACol;

};::~TShape()

{

//*** must be

};

//*** TLine methods::TLine(TPoint AA, TPoint AB, Byte ACol, int ATag): TShape(ACol,ATag)

{= AA;= AB;= SetLen();= False;

};TLine::SetLen()

{(GetLength(A,B));

};TLine::Draw()

{(Crossed)(YELLOW);(Color);(A.X, A.Y, B.X, B.Y);

};

//*** TTriangle methods::TTriangle(TPoint AA, TPoint AB, TPoint AC, Byte ACol, int ATag):(ACol,ATag)

{= TLine(AA,AB,Color,0);= TLine(AB,AC,Color,0);= TLine(AC,AA,Color,0);= False;= SetArea();= False;

};TTriangle::SetArea()

{P = A.Len + B.Len + C.Len;(sqrt(P*(P-A.Len)*(P-B.Len)*(P-C.Len)));

};TTriangle::SetClr(Byte ACol)

{.SetClr(ACol);.SetClr(ACol);.SetClr(ACol);

};TTriangle::Draw()

{(Crossed)

{.SetClr(YELLOW);.SetClr(YELLOW);.SetClr(YELLOW);

};(Smaller)

{.SetClr(BLUE);.SetClr(BLUE);.SetClr(BLUE);

};.Draw();.Draw();.Draw();

};

//*** TShapeLst methods::TShapeLst():TList()

{= 0;

};TShapeLst::Repaint()

{* Item;= (TShape*)FirstItem;(Item)

{>Draw();= (TShape*)Item->Next;

};

};

//*** TTrianlgeLst methods::TTriangleLst(): TShapeLst()

{

//*** must be

};TTriangleLst::Generate(int ACount)

{I;A, B, C;* T;(I = 1; I <= ACount; I++)

{.X = 50+random(450);.Y = 100+random(200);.X = A.X+random(50);.Y = A.Y-random(100);.X = B.X + (B.X - A.X);.Y = A.Y;= new TTriangle(A,B,C,GREEN,I);(T);

};.X = 50+random(450);.Y = 100+random(200);.X = 50+random(400);.Y = 100+random(300);= new TLine(A,B,WHITE,0);

};TTriangleLst::LoadFromFile(char* FileName)

{* Item;A, B, C;f;(f.open(FileName,ios::in) == 0)("Не могу открыть входной файл %s",FileName);from(&f);>> (A.X);.get();>> (A.Y);.get();>> (B.X);.get();>> (B.Y);.get();.get();= new TLine(A,B,WHITE,0);(!(from.eof()))

{>> (A.X);.get();>> (A.Y);.get();>> (B.X);.get();>> (B.Y);.get();>> (C.X);.get();>> (C.Y);.get();.get();= new TTriangle(A,B,C,GREEN,0);(Item);

};.close();

};TTriangleLst::SaveToFile(char* FileName)

{* Item;(FileName);f;(f.open(FileName,ios::out) == 0)("Не могу открыть выходной файл %s",FileName);to(&f);<< (Line->A.X) << '\n';<< (Line->A.Y) << '\n';<< (Line->B.X) << '\n';<< (Line->B.Y) << '\n';<< '\n';= (TTriangle*)FirstItem;(Item)

{<< (Item->A.A.X) << '\n';<< (Item->A.A.Y) << '\n';<< (Item->B.A.X) << '\n';<< (Item->B.A.Y) << '\n';<< (Item->C.A.X) << '\n';<< (Item->C.A.Y) << '\n';(Item->Next)<< '\n';= (TTriangle*)Item->Next;

};.close();("Tria.dat");

};TTriangleLst::SaveCrossedTria(char* FileName)

{* Item;(FileName);f;(f.open(FileName,ios::out) == 0)("Не могу открыть выходной файл %s",FileName);to(&f);= (TTriangle*)FirstItem;(Item)

{(Item->Crossed)

{<< (Item->A.A.X) << '\n';<< (Item->A.A.Y) << '\n';<< (Item->B.A.X) << '\n';<< (Item->B.A.Y) << '\n';<< (Item->C.A.X) << '\n';<< (Item->C.A.Y) << '\n';(Item->Next)<< '\n';

};= (TTriangle*)Item->Next;

};.close();

};TTriangleLst::SetBiggSmall()

{* Item;= (TShape*)FirstItem;= (TTriangle*)FirstItem->Next;(Item)

{(Item->Area < ((TTriangle*)Smaller)->Area)= Item;= (TTriangle*)Item->Next;

};

((TTriangle*)Smaller)->Smaller = True;

};TTriangleLst::Cross(TLine* Item, TLine* SubItem)

{x,y;x11 = Item->A.X, y11 = Item->A.Y;x12 = Item->B.X, y12 = Item->B.Y;x21 = SubItem->A.X, y21 = SubItem->A.Y;x22 = SubItem->B.X, y22 = SubItem->B.Y;b1,b2,d,dx,dy;k11,k12,k21,k22;

//*** Вычисл.= y12-y11;= x11-x12;= y22-y21;= x21-x22;= x11*k11+y11*k12;= x21*k21+y21*k22;= k11*k22-k12*k21;= b1*k22-b2*k12;= k11*b2-b1*k21;(d != 0)= dx/d;= dx;(d != 0)= dy/d;= dy;Result = False;//*** Дефолтово НЕ пересекаются(

(((x11<=x)&&(x<=x12))&&((y11<=y)&&(y<=y12))||

((x12<=x)&&(x<=x11))&&((y11<=y)&&(y<=y12))||

((x11<=x)&&(x<=x12))&&((y12<=y)&&(y<=y11))||

((x12<=x)&&(x<=x11))&&((y12<=y)&&(y<=y11)))

&&

(((x21<=x)&&(x<=x22))&&((y21<=y)&&(y<=y22))||

((x22<=x)&&(x<=x21))&&((y21<=y)&&(y<=y22))||

((x21<=x)&&(x<=x22))&&((y22<=y)&&(y<=y21))||

((x22<=x)&&(x<=x21))&&((y22<=y)&&(y<=y21))))= True;(Result);

};TTriangleLst::Filter()

{* Item;Accept;= (TTriangle*)FirstItem;(Item)

{= False;((Cross(&(Item->A),Line)) ||

(Cross(&(Item->B),Line)) ||

(Cross(&(Item->C),Line)))= True;(Accept)

{>Crossed = True;

};= (TTriangle*)Item->Next;

};

};TTriangleLst::Repaint()

{::Repaint();>Draw();

};TProgaMenu :public TControlLst

{:Repaint();

};TProga :public TApplication

{:Menu;Tag;Lines;MainMenu();onNew;onLoad;onSave;onRun;onExit;doNew(void* Sender);doLoad(void* Sender);doSave(void* Sender);doExit(void* Sender);doRun(void* Sender);BkRepaint();();

};

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

// RealiZation

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

//*** TControl methods::TControl(Byte AX, Byte AY, TCaption ACaption, Byte ACol, Byte ABkCol,Byte AActiveCol,int ATag)

{= efNext;= AX;= AY;(Caption,ACaption);= ACol;= ABkCol;= AActiveCol;= False;= ATag;

};TControl::SetClr(Byte AItem, Byte ACol)

{(AItem)

{0:Color = ACol;break;1:ActiveCol = ACol;break;2:BkCol = ACol;

};

};TControl::Enter()

{= True;();

};TControl::Exit()

{= False;();

};

//*** TButtons methods::TButton(TApplication* AOwner, Byte AX, Byte AY, TCaption ACaption, int ATag, PAppButtonClick AClick):(AX,AY,ACaption,BLUE,LIGHTGRAY,RED,ATag)

{= AOwner;= AClick;();

};TButton::Draw()

{text_info ti;(&ti);(X,Y);(Active)(ActiveCol);(BkCol);(Color);(int I = 0;I < strlen(Caption);I++)(Caption[I]);(ti.attribute);

};TButton::Enter()

{::Enter();();

};TButton::Run()

{Key;CtrlKey;Quit;= False;

{(&Key,&CtrlKey);(Key)

{VK_UP:if (CtrlKey)

{= True;= efPrev;

};break;VK_ENTER:

{= True;= efNext;

((Owner)->*onClick)(this);

};break;VK_DOWN:if (CtrlKey)

{= True;= efNext;

};break;VK_ESC:

{= True;= efExit;

};break;

};();

} while (!Quit);();

};

//*** TControlList methods::TControlLst():TList()

{

//must be

};TControlLst::Repaint()

{* Item = (TControl*)FirstItem;(Item)

{>Draw();= (TControl*)(Item)->Next;

};

};TControlLst::Run()

{

//*** CurrItem тут - синоним ActiveControl= FirstItem;

{

((TControl*)CurrItem)->Enter();(((TControl*)CurrItem)->ExitFlag)

{efNext:if (CurrItem->Next)= CurrItem->Next;break;efPrev:if (CurrItem->Prev)= CurrItem->Prev;break;

};();

} while ( !((TControl*)CurrItem)->ExitFlag == efExit );

};

//*** TProgaMenu methodsTProgaMenu::Repaint()

{::Repaint();

};ReadKey(char* Key, Boolean* CtrlKey)

{

*Key = getch();(*Key == 0)

{

*Key = getch();

*CtrlKey = True;

}

*CtrlKey = False;

};* DltChr(char* S,int Pos)

{

//*** S - строка, Pos - номер удаляемого символа (начиная с 1)* Begin = S;I = 1;(*S)

{(I >= Pos)

*S = *(S+1);++;++;

};(Begin);

};* InsChr(char* S,int Pos, char Ch)

{

//*** S - строка, Pos - номер вставляемого символа Ch* Begin = S;Chr;I = 1;(*S)

{(I >= Pos)

{= *S;

*S = Ch;= Chr;

};++;++;

};

*S = Ch;(Begin);

};

//*** TProga methods::TProga():TApplication()

{= (PAppButtonClick)&TProga::doNew;= (PAppButtonClick)&TProga::doLoad;= (PAppButtonClick)&TProga::doSave;= (PAppButtonClick)&TProga::doRun;= (PAppButtonClick)&TProga::doExit;

};TProga::MainMenu()

{* Btn;= new TButton(this,2,2," Новий ",1,onNew);.Add(Btn);= new TButton(this,2,3," Зчитати ",2,onLoad/*&doLoad*/);.Add(Btn);= new TButton(this,2,4," Записати ",3,onSave);.Add(Btn);= new TButton(this,2,5," Запуск ",4,onRun);.Add(Btn);= new TButton(this,2,6," Вихiд ",4,onExit);.Add(Btn);();.Repaint();.Run();

};TProga::doNew(void* Sender)

{.Clear();();.Generate(26);(0);

};TProga::doLoad(void* Sender)

{.Clear();.LoadFromFile("Test.dat");(0);

};TProga::doSave(void* Sender)

{.SaveToFile("test.dat");

};TProga::doExit(void* Sender)

{

((TControl*)(Menu.CurrItem))->ExitFlag = efExit;

};TProga::doRun(void* Sender)

{I;BLen, SLen, Len;* S;grDriver, grMode, errorcode;= DETECT;(&grDriver, &grMode,"..\\BGI\);.Filter();.SetBiggSmall();

//*** Инфа("%d треугольников\n",Lines.ItemCount);("Синий - наименьший\n");("Желтым - те, что пересекаются с линией\n");("Белым - линия\n");.Repaint();();();();

};TProga::BkRepaint()

{(0);(7);();(int I = 1;I <= 25;I++)(int J = 1;J <= 80;J++)('?');(I = 20;I < 70;I++)

{(I,4);('?');

};(I = 20;I < 70;I++)

{(I,8);('?');

};(20,5);("%-50s","Курсова робота з програмування");(20,6);("%50s","Перевiряючий:");(20,7);("%50s","Черняк О. I.");(I = 53;I < 70;I++)

{(I,21);('?');

};(I = 53;I < 70;I++)

{(I,23);('?');

};(53,22);("%s","ВДТУ, ФIТКI, 2001");

};

//*** Mainmain()

{Proga;.MainMenu();(0);

}


Міністерство освіти та науки України Вінницький Державний Технічний університет кафедра обчислювальної техніки

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ