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

Фундаментальні поняття об'єктно-орієнтованого програмування. Система лінійних нерівностей та опуклі багатогранники. Системи лінійних рівнянь лінійної алгебри як частковий випадок систем лінійних обмежень. Використання середовища програмування Delphi7.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык украинский
Дата добавления 20.05.2015
Размер файла 222,7 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Зміст

Вступ

Основні поняття про ООП

1. Визначення ООП

2. Фундаментальні поняття

Відомості про СЛО

1. Система лінійних нерівностей та опуклі багатогранники

2. Системи лінійних рівнянь лінійної алгебри як частковий випадок СЛО

Практична частина

1. Опис задачі та шлях її вирішення

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

· Текст модуля Class_Lin_Obmezh

· Текст модуля Form1

· Текст основної програми

3. Приклади роботи програми

Висновок

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

Вступ

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

Основні поняття про ООП

1. Визначення ООП

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

На думку Алана Кея, розробника мови Smalltalk, якого вважають одним з «батьків-засновників» ООП, об'єктно-орієнтований підхід полягає в наступному наборі основних принципів:

· Все є об'єктами.

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

· Кожен об'єкт має незалежну пам'ять, яка складається з інших об'єктів.

· Кожен об'єкт є представником (екземпляром, примірником) класу, який виражає загальні властивості об'єктів.

· У класі задається поведінка (функціональність) об'єкта. Таким чином усі об'єкти, які є екземплярами одного класу, можуть виконувати одні й ті ж самі дії.

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

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

2. Фундаментальні поняття

В результаті дослідження Дебори Дж. Армстронг (англ. Deborah J. Armstrong) комп'ютерної літератури, що була видана протягом останніх 40 років, вдалось відокремити фундаментальні поняття (принципи), використані у переважній більшості визначень об'єктно-орієнтованого програмування. До них належить:

v Клас

Клас визначає абстрактні характеристики деякої сутності, включаючи характеристики самої сутності (її атрибути або властивості) та дії, які вона здатна виконувати (її поведінки, методи або можливості). Наприклад, клас Собака може характеризуватись рисами, притаманними всім собакам, зокрема: порода, колір хутра, здатність гавкати. Класи вносять модульність та структурованість в об'єктно-орієнтовану програму. Як правило, клас має бути зрозумілим для не - програмістів, що знаються на предметній області, що, у свою чергу, значить, що клас повинен мати значення в контексті. Також, код реалізації класу має бути досить самодостатнім. Властивості та методи класу, разом називаються його членами.

ь Об'єкт

Окремий екземпляр класу (створюється після запуску програми і ініціалізації полів класу). Клас Собака відповідає всім собакам шляхом опису їхніх спільних рис; об'єкт Сірко є одним окремим собакою, окремим варіантом значень характеристик. Собака має хутро; Сірко має коричнево-біле хутро. Об'єкт Сірко є екземпляром (примірником) класу Собака. Сукупність значень атрибутів окремого об'єкта називається станом. На основі класу Собака можна, також, створити інший об'єкт Дружок, який відрізнятиметься від об'єкта Сірко своїм станом (наприклад кольором хутра). Обидва об'єкта (Сірко і Дружок) є екземплярами класу Собака.

ь Метод

Можливості об'єкта. Оскільки Сірко -- Собака, він може гавкати. Тому гавкати є одним із методів об'єкта Сірко. Він може мати й інші методи, зокрема: місце, або їсти. В межах програми, використання методу має впливати лише на один об'єкт; всі Собаки можуть гавкати, але треба щоб гавкав лише один окремий собака.

ь Обмін повідомленнями

Передача даних від одного процесу іншому, або надсилання викликів методів.

ь Успадкування (наслідування)

Клас може мати «підкласи», спеціалізовані, розширені версії надкласу. Можуть навіть утворюватись цілі дерева успадкування. Наприклад, клас Собака може мати підкласи Коллі, Пекінес, Вівчарка і т.п. Так, Сірко може бути екземпляром класу Вівчарка. Підкласи успадковують атрибути та поведінку своїх батьківських класів, і можуть вводити свої власні. Успадкування може бути одиничне (один безпосередній батьківський клас) та множинне (кілька батьківських класів). Це залежить від вибору програміста, який реалізовує клас та мови програмування. Так, наприклад, в Java дозволене лише одинарне успадкування, а в С++ і те і інше.

ь Приховування інформації (інкапсуляція)

Приховування деталей про роботу класів від об'єктів, що їх використовують або надсилають їм повідомлення. Так, наприклад, клас Собака має метод гавкати. Реалізація цього методу описує як саме повинно відбуватись гавкання (приміром, спочатку вдихнути а потім видихнути на обраній частоті та гучності). Петро, хазяїн пса Сірка, не повинен знати як він гавкає. Інкапсуляція досягається шляхом вказування, які класи можуть звертатися до членів об'єкта. Як наслідок, кожен об'єкт представляє кожному іншому класу певний інтерфейс -- члени, доступні іншим класам. Інкапсуляція потрібна для того, аби запобігти використанню користувачами інтерфейсу тих частин реалізації, які, швидше за все, будуть змінюватись. Це дозволить полегшити внесення змін, тобто, без потреби змінювати і користувачів інтерфейсу. Наприклад, інтерфейс може гарантувати, що щенята можуть додаватись лише до об'єктів класу Собака кодом самого класу. Часто, члени класу позначаються як публічні (англ. public), захищені (англ. protected) та приватні (англ. private), визначаючи, чи доступні вони всім класам, підкласам, або лише до класу в якому їх визначено. Деякі мови програмування йдуть ще далі: Java використовує ключове слово private для обмеження доступу, що буде дозволений лише з методів того самого класу, protected -- лише з методів того самого класу і його нащадків та з класів із того ж самого пакету, C# та VB.NET відкривають деякі члени лише для класів із тієї ж збірки шляхом використання ключового слова internal (C#) або Friend (VB.NET).

ь Абстрагування

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

ь Поліморфізм

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

Відомості про СЛО

1. Система лінійних нерівностей та опуклі багатогранники

Система лінійних нерівностей (обмежень) -- система лінійних нерівностей які мають вигляд:

Це система m лінійних нерівностей з n невідомими, де:

є невідомими,

є коефіцієнтами системи,

-- вільними членами.

Теорема (Вейля - Мінковського)

Множина є багатогранником тоді і тільки тоді коли -- обмежений багатогранник (поліедр).

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

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

Опуклий багатогранник -- частковий випадок багатогранника (політопу) з додатковою умовою опуклості. Опуклий політоп можна визначити як перетин кінцевого числа замкнутих півпросторів які утворені СЛО.

Замкнений півпростір може бути записаний лінійною нерівністю:

,

де n є розмірністю простору, що містить політоп, який розглядають. Отже замкнений опуклий політоп можна розглядати як множину рішень системи лінійних нерівностей:

,

де m є числом півпросторів, що описують політоп. Це може бути стисло переписано у вигляді матричної нерівності:

,

де A є mЧn матрицею, x є nЧ1 вектор-стовпець змінних, і b є постійним mЧ1 вектор-стовпцем.

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

2. Системи лінійних алгебраїчних рівнянь лінійної алгебри як частковий випадок СЛО

Система лінійних алгебраїчних рівнянь (СЛАР) -- в лінійній алгебрі система лінійних рівнянь, яка має вигляд:

Це система m лінійних рівнянь з n невідомими, де:

є невідомими,

є коефіцієнтами системи,

-- вільними членами.

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

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

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

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

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

Практична частина

Опис задачі та шлях її вирішення

Користувач задає в програмі, вручну або автоматично, деяку систему лінійних обмежень та вектор який може слугувати одним з розв'язків СЛО. В програмі потрібно створити такі функції:

ь оформити клас лінійного обмеження (ЛО) який би зберігав одну нерівність, а також методи та властивості для його опрацювання;

ь оформити клас СЛО на базі класу ЛО;

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

ь вивід СЛО як тексту;

ь можливість збереження у файл та його відкриття з файлу;

ь сортування обмежень (розбиття на групи);

Поставлену переді мною задачу я вирішив використовуючи мову програмування Delphi. Дана мова програмування є об'єктно орієнтованою тому вона чудово підійшла для розробки програми. Саму ж програму я виконав використовуючи візуальні компоненти (рис.1). СЛО вводиться через таблицю StrinGrid1, причому є два варіанти вводу: ручний та автоматичний з можливістю редагування. Регулювати розмір таблиці можна за допомогою двох компонент SpinEdit1 та SpinEdit2 кожна з яких відповідає за кількість змінних та кількість ЛО у таблиці.

Рис. 1

Розглянемо кнопки по порядку розташування:

Exit -- виконує вихід з програми-клієнта;

Reset -- скидає всі налаштування для введення нових даних

Write LO -- виписує СЛО у компонент Memo1;

Check solution -- перевіряє чи введений користувачем вектор задовольняє СЛО;

Open -- відкриває СЛО з текстового файлу та заповнює таблицю

Save -- зберігає СЛО в текстовий файл;

Sort LO -- сортує СЛО (розбиває на групи);

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

Текст модуля Class_Lin_Obmezh

unit Class_Lin_Obmezh;

interface

uses

SysUtils, Dialogs, Grids;

Type

TIVector=array of integer;

TSVector=array of String;

Matrix=array of TIVector;

Lo=class

private

fKoef:TIVector;

fZnak:String;

fLim:integer;

fSort:byte;

Procedure Set_koef(V:TIVector);

Function Get_koef:TIVector;

Procedure Set_znak(Znak:String);

Function Get_znak:String;

Procedure Set_lim(Lim:integer);

Function Get_lim:integer;

Procedure Set_Sort(V:TIVector);

Function Get_Sort:Integer;

public

Function Get_koef_String:String;

Function Lo_IntoString:String;

Function Check_solution(V:TIVector):boolean;

Property Koef:TIVector read Get_koef write Set_koef;

Property Znak:String read Get_znak write Set_znak;

Property Lim:Integer read Get_Lim write Set_Lim;

Property Sort:integer read Get_Sort;

end;

TArrLo=array of Lo;

SLO=class

private

fSys:TArrLo;

public

Constructor Create(N:byte);

Destructor Destroy; override;

procedure Set_Sys(SG:TStringGrid);

function Get_SLO:TArrLo;

function Check(SG:TStringGrid):boolean;

function Into_text:TSVector;

procedure Sort_SLO;

end;

implementation

//------------Операції із коефіцієнтами ЛО-----------------

Procedure Lo.Set_koef (V:TIVector);

begin

setlength(fKoef,length(V));

fKoef:=V;

Set_Sort(V);

end;

Function Lo.Get_koef:TIVector;

begin

result:=fKoef;

end;

Function Lo.Get_koef_String:String;

var

i:byte;

begin

result:='';

for i:=0 to high(fKoef) do

result:=result+IntToStr(fKoef[i])+' ';

end;

//------------Отримання даних про знаки елементів Ло-------

Procedure Lo.Set_Sort(V:TIVector);

var

i,j:byte;

begin

fSort:=0;

for i:=0 to high(V) do //fSort = 0 => all +

if (V[i]<0) or (V[i]=0) then //fSort = 1 => all -

begin //fSort = 2 => +,-,0

fSort:=1;

for j:=0 to high(V) do

if (V[j]=0) or (V[j]>0) then

fSort:=2;

end;

end;

Function Lo.Get_Sort:Integer;

begin

result:=fSort;

end;

//------------Операції із знаком---------------------------

Procedure Lo.Set_znak(Znak:String);

begin

if (Znak = '=') or (Znak = '>=')or (Znak = '<=') then

fZnak:=Znak

else

begin

ShowMessage('Неправильно заповнений символ нерівності');

exit;

end;

end;

Function Lo.Get_znak:String;

begin

result:=fZnak;

end;

//------------Операції з границею--------------------------

Procedure Lo.Set_lim(Lim:integer);

begin

fLim:=Lim;

end;

Function Lo.Get_lim:integer;

begin

result:=fLim;

end;

//------------Вивід ЛО як тексту---------------------------

Function Lo.Lo_IntoString:String;

var i:byte;

begin

result:='';

for i:=0 to high(fKoef) do

if fKoef[i]>0 then

if i<>0 then

if fKoef[i] = 1 then

result:=result+'+x'+IntToStr(i+1)+' '

else

result:=result+'+'+IntToStr(fKoef[i])+'x'+IntToStr(i+1)+' '

else

if fKoef[i] = 1 then

result:=result+'x'+IntToStr(i+1)+' '

else

result:=result+IntToStr(fKoef[i])+'x'+IntToStr(i+1)+' '

else

if fKoef[i] = 0 then

result:=result+''

else

if fKoef[i] = -1 then

result:=result+'-x'+IntToStr(i+1)+' '

else

result:=result+IntToStr(fKoef[i])+'x'+IntToStr(i+1)+' ';

result:=result+' '+fZnak+' '+IntToStr(fLim);

end;

//------------Перевірка можливого розв'язку----------------

Function Lo.Check_solution(V:TIVector):boolean;

var

i:byte;

temp:integer;

begin

temp:=0;

for i:=0 to high(fKoef) do

temp:=temp+fKoef[i]*V[i];

if fZnak = '<' then

if temp < fLim then

result:=true

else

result:=false

else

if fZnak = '>' then

if temp > fLim then

result:=true

else

result:=false

else

if fZnak = '<=' then

if temp <= fLim then

result:=true

else

result:=false

else

if fZnak = '>=' then

if temp >= fLim then

result:=true

else

result:=false

else

if fZnak = '=' then

if temp = fLim then

result:=true

else

result:=false;

end;

//-----------------Class_SLO-------------------------------

Constructor SLO.Create(N:byte);

var

i:byte;

begin

setlength(fSys,n);

for i:=0 to high(fSys) do

fSys[i]:=Lo.Create;

end;

Destructor SLO.Destroy;

var

i:byte;

begin

for i:=0 to high(fSys) do

fSys[i].Free();

inherited Destroy;

end;

//---------------------------------------------------------

procedure SLO.Set_Sys(SG:TStringGrid);

var

i,j:integer;

VZ:TSVector;

VL:TIVector;

MK:Matrix;

begin

setlength(MK,SG.RowCount-1);

for i:=0 to high(MK) do

setlength(MK[i],SG.ColCount-2);

setlength(VZ,SG.RowCount-1);

setlength(VL,SG.RowCount-1);

for i:=0 to SG.ColCount-3 do

for j:=1 to SG.RowCount-1 do

MK[j-1][i]:=StrToInt(SG.Cells[i,j]);

for i:=1 to SG.RowCount-1 do

begin

VZ[i-1]:=SG.Cells[SG.ColCount-2,i];

VL[i-1]:=StrToInt(SG.Cells[SG.ColCount-1,i]);

end;

for i:=0 to high(fSys) do

begin

fSys[i].Koef:=MK[i];

fSys[i].Znak:=VZ[i];

fSys[i].Lim:=VL[i];

end;

end;

function SLO.Get_SLO:TArrLo;

begin

setlength(result,length(fSys));

result:=fSys;

end;

//---------------------------------------------------------

function SLO.Check(SG:TStringGrid):boolean;

var

i:integer;

VS:TIVector;

begin

setlength(VS, SG.ColCount);

for i:=0 to SG.ColCount-1 do

VS[i]:=StrToInt(SG.Cells[i,1]);

result:=true;

for i:=0 to high(fSys) do

if Not fSys[i].Check_Solution(VS) then

begin

result:=false;

break;

end;

end;

function SLO.Into_text:TSVector;

var

i:integer;

begin

setlength(result,length(fSys));

for i:=0 to high(result) do

result[i]:=fSys[i].Lo_IntoString;

end;

//---------------------------------------------------------

procedure SLO.Sort_SLO;

var

i,j:integer;

begin

if length(fSys)>1 then

begin

setlength(fSys,length(fSys)+1);

for i:=1 to high(fSys) do

begin

j:=i-1;

fSys[high(fSys)]:=fSys[i];

while (j>-1) and (fSys[high(fSys)].fSort < fSys[j].fSort) do

begin

fSys[j+1]:=fSys[j];

j:=j-1;

end;

fSys[j+1]:=fSys[high(fSys)];

end;

setlength(fSys,length(fSys)-1);

end;

end;

end.

delphi об'єктний орієнтований програмування

Текст модуля Form1

unit Class_Form1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, Spin, Grids,

Class_Lin_Obmezh, ExtCtrls;

type

TIVector=array of integer;

TSVector=array of String;

Matrix=array of TIVector;

TForm1 = class(TForm)

StringGrid1: TStringGrid;

SpinEdit1: TSpinEdit;

SpinEdit2: TSpinEdit;

Label1: TLabel;

Label2: TLabel;

Button1: TButton;

Button2: TButton;

Button3: TButton;

RadioGroup1: TRadioGroup;

StringGrid2: TStringGrid;

Label3: TLabel;

Memo1: TMemo;

Button4: TButton;

OpenDialog1: TOpenDialog;

SaveDialog1: TSaveDialog;

Button5: TButton;

Button6: TButton;

Button7: TButton;

procedure SpinEdit1Change(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure SpinEdit2Change(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure RadioGroup1Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

procedure Button5Click(Sender: TObject);

procedure Button6Click(Sender: TObject);

procedure FormClose(Sender: TObject);

procedure Button7Click(Sender: TObject);

function IsEmpty1(Sender: TObject):boolean;

function IsEmpty2(Sender: TObject):boolean;

end;

var

Form1: TForm1;

SLO_1:SLO;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);

begin

StringGrid1.ColCount:=3;

StringGrid1.RowCount:=2;

StringGrid1.Cells[0,0]:='a1';

StringGrid1.Cells[1,0]:='=,<=,>=';

StringGrid1.Cells[2,0]:='Limit';

StringGrid2.Cells[0,0]:='x1';

end;

procedure TForm1.FormClose(Sender: TObject);

begin

SLO_1.Free;

end;

//-----------------IsEmpty1,2------------------------------

Function TForm1.IsEmpty1(Sender: TObject):boolean;

begin

result:=StringGrid1.Cells[0,1]='';

end;

Function TForm1.IsEmpty2(Sender: TObject):boolean;

begin

result:=StringGrid2.Cells[0,1]='';

end;

//-----------------Button_Exit-----------------------------

procedure TForm1.Button1Click(Sender: TObject);

begin

Close;

end;

//-----------------Ввід к-сті елементів ЛО та к-сті ЛО-----

procedure TForm1.SpinEdit1Change(Sender: TObject);

var

n,i,j:byte;

begin

Button2.Enabled:=True;

N:=SpinEdit1.Value;

StringGrid1.ColCount:=n+2;

StringGrid2.ColCount:=n;

for i:=0 to SpinEdit1.Value do

for j:=1 to SpinEdit2.Value do

begin

StringGrid1.Cells[i,j]:='';

StringGrid2.Cells[i,j]:='';

end;

for i:=0 to n-1 do

begin

StringGrid1.Cells[i,0]:='a'+IntToStr(i+1);

StringGrid2.Cells[i,0]:='x'+IntToStr(i+1);

end;

StringGrid1.Cells[n,0]:='=,<=,>=';

StringGrid1.Cells[n+1,0]:='Limit';

RadioGroup1Click(Sender);

end;

procedure TForm1.SpinEdit2Change(Sender: TObject);

var

n:byte;

begin

Button2.Enabled:=True;

N:=SpinEdit2.Value;

StringGrid1.RowCount:=n+1;

RadioGroup1Click(Sender);

end;

//-----------------Button Reset----------------------------

procedure TForm1.Button2Click(Sender: TObject);

var

i,j:integer;

begin

SpinEdit1.Value:=1;

SpinEdit2.Value:=1;

StringGrid1.ColCount:=3;

StringGrid1.RowCount:=2;

RadioGroup1.ItemIndex:=0;

for i:=0 to 2 do

for j:=1 to 1 do

StringGrid1.Cells[i,j]:='';

for i:=Memo1.Lines.Count downto 0 do

Memo1.Lines.Delete(i);

StringGrid1.Cells[0,1]:='';

Button2.Enabled:=False;

if SLO_1<>nil then

begin

SLO_1.Free;

SLO_1:=nil;

end;

end;

//-----------------Вибір способу вводу---------------------

procedure TForm1.RadioGroup1Click(Sender: TObject);

var

i,j,k:byte;

begin

randomize;

if RadioGroup1.ItemIndex=1 then

begin

for i:=0 to StringGrid1.ColCount-3 do

for j:=1 to StringGrid1.RowCount-1 do

StringGrid1.Cells[i,j]:=IntToStr(random(10)-5);

for i:=1 to StringGrid1.RowCount-1 do

begin

StringGrid1.Cells[SpinEdit1.Value+1,i]:=IntToStr(random(10));

k:=random(3);

if k=0 then

StringGrid1.Cells[SpinEdit1.Value,i]:='<='

else

if k=1 then

StringGrid1.Cells[SpinEdit1.Value,i]:='>='

else

if k=2 then

StringGrid1.Cells[SpinEdit1.Value,i]:='='

end;

end

else

for i:=0 to StringGrid1.ColCount-1 do

for j:=1 to StringGrid1.RowCount-1 do

StringGrid1.Cells[i,j]:='';

end;

//-----------------Вивід ЛО в Memo та стврення класу-------

procedure TForm1.Button3Click(Sender: TObject);

var

i:integer;

begin

if SLO_1<>nil then

begin

SLO_1.Free;

SLO_1:=nil;

end;

for i:=Memo1.Lines.Count downto 0 do

Memo1.Lines.Delete(i);

if IsEmpty1(Sender) then

begin

ShowMessage('Заповніть таблицю значень');

exit;

end;

SLO_1:=SLO.Create(SpinEdit2.Value);

//-----------------

SLO_1.Set_Sys(StringGrid1);

//-----------------

for i:=0 to high(SLO_1.Into_text) do

Memo1.Lines.Add(SLO_1.Into_text[i]);

end;

//-----------------Button Check Solution-------------------

procedure TForm1.Button4Click(Sender: TObject);

begin

if IsEmpty1(Sender) then

begin

ShowMessage('Заповніть таблицю значень');

exit;

end;

if IsEmpty2(Sender) then

begin

ShowMessage('Не введено жодного можливого розв`язку в таблицю!');

exit;

end;

Button3Click(Sender);

if SLO_1.Check(StringGrid2) then

ShowMessage('Даний розв`язок задовольняє системі лінійних обмежень')

else

ShowMessage('Даний розв`язок HE задовольняє системі лінійних обмежень');

if SLO_1<>nil then

begin

SLO_1.Free;

SLO_1:=nil;

end;

end;

//-----------------Button Open-----------------------------

procedure TForm1.Button5Click(Sender: TObject);

var

F:TextFile;

temp_FName,Str,temp_Str:string;

kilkist_Lo,kilkist_zminnuh,i,j,k:Integer;

begin

if OpenDialog1.Execute then

begin

Button2Click(Sender);

temp_FName:=Opendialog1.FileName;

AssignFile(F,temp_FName);

Reset(F);

readln(F,kilkist_Lo);

readln(F,kilkist_zminnuh);

SpinEdit2.Value:=kilkist_Lo;

SpinEdit1.Value:=kilkist_zminnuh;

//-----------------

for i:=1 to kilkist_Lo do

begin

readln(F,Str);

k:=1;

temp_Str:='';

for j:=1 to length(Str) do

if Str[j]=' ' then

begin

StringGrid1.Cells[k-1,i]:=temp_Str;

temp_Str:='';

k:=k+1;

end

else

temp_Str:=temp_Str+Str[j];

end;

//-----------------

for i:=1 to kilkist_Lo do

begin

Readln(F,Str);

StringGrid1.Cells[kilkist_zminnuh,i]:=Str;

end;

//-----------------

for i:=1 to kilkist_Lo do

begin

Readln(F,Str);

StringGrid1.Cells[kilkist_zminnuh+1,i]:=Str;

end;

//-----------------

CloseFile(F);

end;

end;

//-----------------Button Save-----------------------------

procedure TForm1.Button6Click(Sender: TObject);

var

F:TextFile;

temp_FName:string;

i:byte;

begin

if IsEmpty1(Sender) then

begin

ShowMessage('Заповніть таблицю значень');

exit;

end

else

begin

Button3Click(Sender);

if SaveDialog1.Execute then

begin

temp_FName:=Savedialog1.FileName;

AssignFile(F,temp_FName);

Rewrite(F);

writeln(F,IntToStr(SpinEdit2.Value));

writeln(F,IntToStr(SpinEdit1.Value));

for i:=0 to high(SLO_1.Get_SLO) do

writeln(F,SLO_1.Get_SLO[i].Get_koef_String);

for i:=0 to high(SLO_1.Get_SLO) do

writeln(F,SLO_1.Get_SLO[i].Znak);

for i:=0 to high(SLO_1.Get_SLO) do

writeln(F,IntToStr(SLO_1.Get_SLO[i].Lim));

CloseFile(F);

end;

end;

end;

//-----------------Button Sort Lo--------------------------

procedure TForm1.Button7Click(Sender: TObject);

var

i:byte;

begin

Button3Click(Sender);

if IsEmpty1(Sender) then

exit;

Memo1.Lines.Add('');

SLO_1.Sort_SLO;

for i:=0 to high(SLO_1.Into_text) do

Memo1.Lines.Add(SLO_1.Into_text[i]);

if SLO_1<>nil then

begin

SLO_1.Free;

SLO_1:=nil;

end;

end;

end.

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

program Main_Program;

uses

Forms,

Class_Form1 in 'Form1\Class_Form1.pas' {Form1},

Class_Lin_Obmezh in 'Class_Lin_Obmezh\Class_Lin_Obmezh.pas';

{$R *.res}

begin

Application.Initialize;

Application.CreateForm(TForm1, Form1);

Application.Run;

end.

Приклади роботи програми

Рис. 2

На рис. 2 створюємо СЛО з трьома змінними та трьома нерівностями. Автоматично вводимо в таблицю деякі дані та нажимаємо кнопку виводу СЛО на компоненту Memo. Отримуємо результат з трьох нерівностей які і утворюють СЛО.

Рис. 3

На рисунку 3 показано роботу функції Check Solution яка перевіряє чи задовольняє вектор введений в таблицю нижче СЛО. Як бачимо з рисунку то даний вектор (1,2,3) не задовольняє СЛО.

Рис. 4

На рисунку 4 бачимо що введений вектор задовольняє СЛО

Рис. 5

На рисунку 5 показана робота кнопки Sort Lo яка відсортовує систему лінійних обмежень. Сортування відбувається таким чином: в кожній нерівності перевіряється знак коефіцієнта . Першими виводяться ті ЛО в яких всі коефіцієнти додатні, другими -- ті в яких всі коефіцієнти від'ємні і останніми ті в яких коефіцієнти різні або дорівнюють нулеві.

Висновок

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

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

1. Емеличев В.А. Многогранники, графы, оптимизация (комбинаторная теория многогранников). Емеличев В.А., Ковалев М.М., Кравцов М.К. - М.: Наука, 1981.- 344 с. Глава 1. Параграфы 1,2,4.

2. Семйон І.В. Основи об'єктно-орієнтованого програмування. Навчальний посібник / Семйон І.В., Чупов С. В., Брила А. Ю., Апшай А. І. -- Ужгород, 2011.-- 141с.

3. Матеріал з вільної енциклопедії Вікіпедії http://uk.wikipedia.org/wiki/Опуклий_політоп http://uk.wikipedia.org/wiki/Багатогранник

Размещено на Allbest.ru


Подобные документы

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

    курсовая работа [123,3 K], добавлен 14.03.2013

  • Об’єктно-орієнтоване програмування мовою С++. Основні принципи об’єктно-орієнтованого програмування. Розробка класів з використанням технології візуального програмування. Розробка класу classProgressBar. Базовий клас font. Методи тестування програми.

    курсовая работа [211,3 K], добавлен 19.08.2010

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

    отчет по практике [2,0 M], добавлен 19.03.2015

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

    курсовая работа [2,5 M], добавлен 24.12.2011

  • Прототип об'єктно-орієнтованого програмування. Управління процесом реалізації програми. Розвиток апаратних засобів. Об'єктно-орієнтовані мови програмування. Надійність і експлуатаційні якості програм. Візуальне об’єктна-орієнтовне проектування Delphi.

    контрольная работа [28,9 K], добавлен 18.05.2009

  • Розгляд особливостей мови програмування С++: основні можливості, характеристика функцій. Аналіз файлів з вхідними даними. Використання похідних класів як ефективний засіб об’єктно-орієнтованого програмування. Способи роздруківки графічного вирішення.

    курсовая работа [510,9 K], добавлен 14.03.2013

  • Модель в об’єктно-орієнтованих мовах програмування. Програмна модель створена на мові програмування С++, в середовищі програмування Borland С++ Builder 6.0. Вибір засобів реалізації програми. Види інструментів для об'єктно-орієнтованої розробки.

    курсовая работа [116,9 K], добавлен 06.06.2010

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.