Об’єктно-орієнтоване програмування у середовищі програмування Delphi7
Зміст
Вступ
Основні поняття про ООП
. Визначення ООП
. Фундаментальні поняття
Відомості про СЛО
. Система лінійних
нерівностей та опуклі багатогранники
. Системи лінійних
рівнянь лінійної алгебри як частковий випадок СЛО
Практична частина
. Опис задачі та шлях її
вирішення
. Текст програми
· Текст модуля
Class_Lin_Obmezh
· Текст модуля Form1
· Текст основної
програми
. Приклади роботи
програми
Висновок
Список використаної літератури
Вступ
В даній курсовій роботі я показую
можливості та потенціал використання об’єктно орієнтованого програмування для
вирішення задач певного типу. Моєю головною метою курсової роботи є дослідження
та вивчення ООП та побудови програми яка б створювала систему лінійних
обмежень, а також давала можливість подальшого її оброблення. Для реалізації
поставленої задачі буду використовувати середовище програмування Delphi7.
Основні поняття про ООП
. Визначення ООП
Об'єктно-орієнтоване програмування -
це метод програмування, заснований на поданні програми у вигляді сукупності
взаємодіючих об'єктів, кожен з яких є екземпляром певного класу, а класи є
членами певної ієрархії наслідування. Програмісти спочатку пишуть клас, а на
його основі при виконанні програми створюються конкретні об'єкти (екземпляри
класів). На основі класів можна створювати нові, які розширюють базовий клас і
таким чином створюється ієрархія класів.
На думку Алана Кея
<#"786196.files/image001.gif">
Це система m лінійних нерівностей з
n невідомими, де:
є невідомими,
є коефіцієнтами
системи,
- вільними членами.
Теорема (Вейля - Мінковського)
Множина є
багатогранником тоді і тільки тоді коли -
обмежений багатогранник (поліедр).
Теорема показує, що будь-який
багатогранник у певній системі координат може бути описаний за допомогою системи,
яка складається з деякого скінченного числа лінійних нерівностей. Ця
властивість з одного боку, дозволяє використовувати для вивчення
багатогранників гарно розроблену теорію лінійних нерівностей, а з іншого боку,
геометричним властивостям багатогранника надати алгебраїчну інтерпретацію.
Нехай нам задано деяку СЛО із
двома змінними, тоді геометрично, в двовимірному просторі, кожну нерівність
такої системи можна тлумачити як деяку півплощину, обмежену прямою, рівняння
якої можна дістати з відповідної нерівності, змінивши знак нерівності знаком
рівності. Аналогічно відбувається і в тривимірному просторі, якщо СЛО сумісна
тоді вона утворює деякий безкінечний багатогранник, а в окремих випадках
опуклий багатогранник . У випадку якщо СЛО складається лише з одної нерівності
то така система утворює півпростір - простір який є однією з двох частин, на
які гіперплощина
<#"786196.files/image006.gif">,
де n є розмірністю простору, що
містить політоп, який розглядають. Отже замкнений опуклий політоп можна
розглядати як множину рішень системи лінійних нерівностей:
,
де m є числом півпросторів, що
описують політоп. Це може бути стисло переписано у вигляді матричної
нерівності:
,
де A є m×n
матрицею, x є n×1 вектор-стовпець
змінних, і b є постійним m×1 вектор-стовпцем.
Відкритий опуклий політоп задається
заміною нестрогих нерівностей на строгі у попередньому визначенні.
. Системи лінійних алгебраїчних
рівнянь лінійної алгебри як частковий випадок СЛО
Система лінійних алгебраїчних
рівнянь (СЛАР) - в лінійній алгебрі <#"786196.files/image009.gif">
Це система m лінійних рівнянь
з n невідомими, де:
є невідомими,
є коефіцієнтами системи,
- вільними членами.
Розв'язком системи лінійних
алгебраїчних рівнянь є будь-яка сукупність дійсних чисел
<#"786196.files/image010.gif">, яка при
підстановці кожне рівняння системи перетворює його в тотожність
<#"786196.files/image011.gif">, система
лінійних алгебраїчних рівнянь називається однорідною. Однорідна система має
очевидний розв'язок, у якому всі . Цей розв'язок заведено називати
тривіальним. Відмінні від тривіального розв'язки існують тільки тоді, коли
матриця вироджена
<#"786196.files/image014.jpg">
Рис. 1
Розглянемо кнопки по порядку
розташування:
Exit - виконує
вихід з програми-клієнта;
Reset
-
скидає всі налаштування для введення нових даних
Write
LO -
виписує СЛО у компонент Memo1;
Check
solution - перевіряє
чи введений користувачем вектор задовольняє СЛО;
Open
-
відкриває СЛО з текстового файлу та заповнює таблицю
Save
-
зберігає СЛО в текстовий файл;
Sort
LO -
сортує СЛО (розбиває на групи);
Текст програми
Текст модуля
Class_Lin_ObmezhClass_Lin_Obmezh;, Dialogs, Grids;=array of integer;=array of
String;=array of TIVector;=class:TIVector;:String;:integer;:byte;Set_koef(V:TIVector);Get_koef:TIVector;Set_znak(Znak:String);Get_znak:String;Set_lim(Lim:integer);Get_lim:integer;Set_Sort(V:TIVector);Get_Sort:Integer;Get_koef_String:String;Lo_IntoString:String;Check_solution(V:TIVector):boolean;Koef:TIVector
read Get_koef write Set_koef;Znak:String read Get_znak write
Set_znak;Lim:Integer read Get_Lim write Set_Lim;Sort:integer read
Get_Sort;;=array of Lo;=class:TArrLo;Create(N:byte);Destroy;
override;Set_Sys(SG:TStringGrid);Get_SLO:TArrLo;Check(SG:TStringGrid):boolean;Into_text:TSVector;Sort_SLO;;
//------------Операції із
коефіцієнтами ЛО-----------------Lo.Set_koef
(V:TIVector);(fKoef,length(V));:=V;_Sort(V);;Lo.Get_koef:TIVector;:=fKoef;;
Lo.Get_koef_String:String;:byte;:='';i:=0
to high(fKoef) do:=result+IntToStr(fKoef[i])+' ';;
//------------Отримання даних про
знаки елементів Ло-------Lo.Set_Sort(V:TIVector);,j:byte;:=0;i:=0 to high(V) do
//fSort = 0 => all +(V[i]<0) or (V[i]=0) then //fSort = 1 => all
-//fSort = 2 => +,-,0:=1;j:=0 to high(V) do(V[j]=0) or (V[j]>0)
then:=2;;;Lo.Get_Sort:Integer;:=fSort;;
//------------Операції із
знаком---------------------------Lo.Set_znak(Znak:String);(Znak = '=') or (Znak
= '>=')or (Znak = '<=') then:=Znak('Неправильно заповнений символ
нерівності');;;;Lo.Get_znak:String;:=fZnak;;
//------------Операції з
границею--------------------------Lo.Set_lim(Lim:integer);:=Lim;;Lo.Get_lim:integer;:=fLim;;
//------------Вивід ЛО як
тексту---------------------------Lo.Lo_IntoString:String;i:byte;:='';i:=0 to
high(fKoef) dofKoef[i]>0 theni<>0 thenfKoef[i] = 1
then:=result+'+x'+IntToStr(i+1)+'
':=result+'+'+IntToStr(fKoef[i])+'x'+IntToStr(i+1)+' 'fKoef[i] = 1
then:=result+'x'+IntToStr(i+1)+'
':=result+IntToStr(fKoef[i])+'x'+IntToStr(i+1)+' 'fKoef[i] = 0 then:=result+''fKoef[i]
= -1 then:=result+'-x'+IntToStr(i+1)+'
':=result+IntToStr(fKoef[i])+'x'+IntToStr(i+1)+' ';:=result+' '+fZnak+'
'+IntToStr(fLim);;
//------------Перевірка можливого
розв'язку----------------Lo.Check_solution(V:TIVector):boolean;:byte;:integer;:=0;i:=0
to high(fKoef) do:=temp+fKoef[i]*V[i];fZnak = '<' thentemp < fLim
then:=true:=falsefZnak = '>' thentemp > fLim then:=true:=falsefZnak =
'<=' thentemp <= fLim then:=true:=falsefZnak = '>=' thentemp >=
fLim then:=true:=falsefZnak = '=' thentemp = fLim then:=true:=false;;
//-----------------Class_SLO-------------------------------SLO.Create(N:byte);:byte;(fSys,n);i:=0
to high(fSys) do[i]:=Lo.Create;;SLO.Destroy;:byte;i:=0 to high(fSys)
do[i].Free();Destroy;;
//---------------------------------------------------------SLO.Set_Sys(SG:TStringGrid);,j:integer;:TSVector;:TIVector;:Matrix;(MK,SG.RowCount-1);i:=0
to high(MK) do(MK[i],SG.ColCount-2);(VZ,SG.RowCount-1);(VL,SG.RowCount-1);i:=0
to SG.ColCount-3 doj:=1 to SG.RowCount-1
do[j-1][i]:=StrToInt(SG.Cells[i,j]);i:=1 to SG.RowCount-1
do[i-1]:=SG.Cells[SG.ColCount-2,i];[i-1]:=StrToInt(SG.Cells[SG.ColCount-1,i]);;i:=0
to high(fSys)
do[i].Koef:=MK[i];[i].Znak:=VZ[i];[i].Lim:=VL[i];;;SLO.Get_SLO:TArrLo;(result,length(fSys));:=fSys;;
//---------------------------------------------------------SLO.Check(SG:TStringGrid):boolean;:integer;:TIVector;(VS,
SG.ColCount);i:=0 to SG.ColCount-1 do[i]:=StrToInt(SG.Cells[i,1]);:=true;i:=0
to high(fSys) doNot fSys[i].Check_Solution(VS)
then:=false;;;;SLO.Into_text:TSVector;:integer;(result,length(fSys));i:=0 to
high(result) do[i]:=fSys[i].Lo_IntoString;;
//---------------------------------------------------------SLO.Sort_SLO;,j:integer;length(fSys)>1
then(fSys,length(fSys)+1);i:=1 to high(fSys)
do:=i-1;[high(fSys)]:=fSys[i];(j>-1) and (fSys[high(fSys)].fSort <
fSys[j].fSort)
do[j+1]:=fSys[j];:=j-1;;[j+1]:=fSys[high(fSys)];;(fSys,length(fSys)-1);;;.
delphi об'єктний
орієнтований програмування
Текст модуля Form1
Class_Form1;, Messages, SysUtils,
Variants, Classes, Graphics, Controls, Forms,, StdCtrls, Spin,
Grids,_Lin_Obmezh, ExtCtrls;=array of integer;=array of String;=array of
TIVector;= class(TForm): TStringGrid;: TSpinEdit;: TSpinEdit;: TLabel;:
TLabel;: TButton;: TButton;: TButton;: TRadioGroup;: TStringGrid;: TLabel;:
TMemo;: TButton;: TOpenDialog;: TSaveDialog;: TButton;: TButton;:
TButton;SpinEdit1Change(Sender: TObject);Button1Click(Sender:
TObject);SpinEdit2Change(Sender: TObject);Button2Click(Sender:
TObject);FormCreate(Sender: TObject);Button3Click(Sender:
TObject);RadioGroup1Click(Sender: TObject);Button4Click(Sender:
TObject);Button5Click(Sender: TObject);Button6Click(Sender:
TObject);FormClose(Sender: TObject);Button7Click(Sender:
TObject);IsEmpty1(Sender: TObject):boolean;IsEmpty2(Sender: TObject):boolean;;:
TForm1;_1:SLO;
{$R *.dfm}TForm1.FormCreate(Sender:
TObject);.ColCount:=3;.RowCount:=2;.Cells[0,0]:='a1';.Cells[1,0]:='=,<=,>=';.Cells[2,0]:='Limit';.Cells[0,0]:='x1';;TForm1.FormClose(Sender:
TObject);_1.Free;;
//-----------------Button_Exit-----------------------------TForm1.Button1Click(Sender:
TObject);;;
//-----------------Ввід к-сті елементів ЛО та
к-сті ЛО-----
procedure
TForm1.SpinEdit1Change(Sender:
TObject);,i,j:byte;.Enabled:=True;:=SpinEdit1.Value;.ColCount:=n+2;.ColCount:=n;i:=0
to SpinEdit1.Value doj:=1 to SpinEdit2.Value
do.Cells[i,j]:='';.Cells[i,j]:='';;i:=0 to n-1 do.Cells[i,0]:='a'+IntToStr(i+1);.Cells[i,0]:='x'+IntToStr(i+1);;.Cells[n,0]:='=,<=,>=';.Cells[n+1,0]:='Limit';Click(Sender);;TForm1.SpinEdit2Change(Sender:
TObject);:byte;.Enabled:=True;:=SpinEdit2.Value;.RowCount:=n+1;Click(Sender);;
//-----------------Button Reset----------------------------TForm1.Button2Click(Sender:
TObject);,j:integer;.Value:=1;.Value:=1;.ColCount:=3;.RowCount:=2;.ItemIndex:=0;i:=0
to 2 doj:=1 to 1 do.Cells[i,j]:='';i:=Memo1.Lines.Count downto 0
do.Lines.Delete(i);.Cells[0,1]:='';.Enabled:=False;SLO_1<>nil
then_1.Free;_1:=nil;;
end;
//-----------------Вибір способу
вводу---------------------
procedure
TForm1.RadioGroup1Click(Sender: TObject);,j,k:byte;;RadioGroup1.ItemIndex=1
theni:=0 to StringGrid1.ColCount-3 doj:=1 to StringGrid1.RowCount-1
do.Cells[i,j]:=IntToStr(random(10)-5);i:=1 to StringGrid1.RowCount-1
do.Cells[SpinEdit1.Value+1,i]:=IntToStr(random(10));:=random(3);k=0
then.Cells[SpinEdit1.Value,i]:='<='k=1
then.Cells[SpinEdit1.Value,i]:='>='k=2 then.Cells[SpinEdit1.Value,i]:='=';i:=0
to StringGrid1.ColCount-1 doj:=1 to StringGrid1.RowCount-1 do.Cells[i,j]:='';;
//-----------------Вивід ЛО в Memo
та стврення класу-------
procedure
TForm1.Button3Click(Sender: TObject);:integer;SLO_1<>nil
then_1.Free;_1:=nil;;i:=Memo1.Lines.Count downto 0
do.Lines.Delete(i);IsEmpty1(Sender) then('Заповніть таблицю
значень');;;_1:=SLO.Create(SpinEdit2.Value);
//-----------------_1.Set_Sys(StringGrid1);
//-----------------i:=0 to
high(SLO_1.Into_text) do.Lines.Add(SLO_1.Into_text[i]);;
//-----------------Button Check
Solution-------------------TForm1.Button4Click(Sender:
TObject);IsEmpty1(Sender) then('Заповніть таблицю значень');;;IsEmpty2(Sender)
then('Не
введено жодного можливого розв`язку в таблицю!');
exit;;Click(Sender);SLO_1.Check(StringGrid2)
then('Даний розв`язок задовольняє системі лінійних обмежень')('Даний розв`язок
HE задовольняє системі лінійних обмежень');SLO_1<>nil
then_1.Free;_1:=nil;;;
//-----------------Button
Open-----------------------------TForm1.Button5Click(Sender:
TObject);:TextFile;_FName,Str,temp_Str:string;_Lo,kilkist_zminnuh,i,j,k:Integer;OpenDialog1.Execute
thenClick(Sender);_FName:=Opendialog1.FileName;(F,temp_FName);(F);(F,kilkist_Lo);(F,kilkist_zminnuh);.Value:=kilkist_Lo;.Value:=kilkist_zminnuh;
//-----------------i:=1 to
kilkist_Lo do(F,Str);:=1;_Str:='';j:=1 to length(Str) doStr[j]=' '
then.Cells[k-1,i]:=temp_Str;_Str:='';:=k+1;_Str:=temp_Str+Str[j];;
//-----------------i:=1 to
kilkist_Lo do(F,Str);.Cells[kilkist_zminnuh,i]:=Str;;
//-----------------i:=1 to
kilkist_Lo do(F,Str);.Cells[kilkist_zminnuh+1,i]:=Str;;
//-----------------(F);;;
//-----------------Button
Save-----------------------------TForm1.Button6Click(Sender:
TObject);:TextFile;_FName:string;:byte;IsEmpty1(Sender) then('Заповніть таблицю
значень');;Click(Sender);SaveDialog1.Execute
then_FName:=Savedialog1.FileName;(F,temp_FName);(F);(F,IntToStr(SpinEdit2.Value));(F,IntToStr(SpinEdit1.Value));i:=0
to high(SLO_1.Get_SLO) do(F,SLO_1.Get_SLO[i].Get_koef_String);i:=0 to
high(SLO_1.Get_SLO) do(F,SLO_1.Get_SLO[i].Znak);i:=0 to high(SLO_1.Get_SLO)
do(F,IntToStr(SLO_1.Get_SLO[i].Lim));(F);;;;
//-----------------Button Sort
Lo--------------------------TForm1.Button7Click(Sender:
TObject);:byte;Click(Sender);IsEmpty1(Sender) then;.Lines.Add('');_1.Sort_SLO;i:=0
to high(SLO_1.Into_text) do.Lines.Add(SLO_1.Into_text[i]);SLO_1<>nil
then_1.Free;_1:=nil;;;.
Текст основної
програми
Main_Program;,_Form1 in
'Form1\Class_Form1.pas' {Form1},_Lin_Obmezh in
'Class_Lin_Obmezh\Class_Lin_Obmezh.pas';
{$R *.res}.Initialize;.CreateForm(TForm1,
Form1);.Run;.
Приклади роботи програми
Рис. 2
На рис. 2 створюємо СЛО з трьома
змінними та трьома нерівностями. Автоматично вводимо в таблицю деякі дані та
нажимаємо кнопку виводу СЛО на компоненту Memo.
Отримуємо
результат з трьох нерівностей які і утворюють СЛО.
Рис. 3
На рисунку 3 показано роботу функції
Check Solution
яка перевіряє чи задовольняє вектор введений в
таблицю нижче СЛО. Як бачимо з рисунку то даний вектор (1,2,3) не задовольняє
СЛО.
Рис. 4
На рисунку 4 бачимо що введений
вектор задовольняє СЛО
Рис. 5
На рисунку 5 показана робота кнопки Sort
Lo яка
відсортовує систему лінійних обмежень. Сортування відбувається таким чином: в
кожній нерівності перевіряється знак коефіцієнта .
Першими виводяться ті ЛО в яких всі коефіцієнти додатні, другими - ті в яких
всі коефіцієнти від’ємні і останніми ті в яких коефіцієнти різні або дорівнюють
нулеві.
Висновок
В даній курсовій роботі показано
основні можливості ООП для реалізації моделювання систем лінійних обмежень та
моделювання об’єктів в загальному. Використання ООП для вирішення задач такого
типу значно полегшує програмісту роботу, робить код більш структурованим та
дозволяє легше його читати. Для себе можу зробити важливий висновок, що ООП -
гнучкий інструмент який ідеально підходить для написання складних програм які
потребують описання деяких об’єктів та їх поведінки.
Список використаної літератури
. Емеличев
В.А. Многогранники, графы, оптимизация (комбинаторная теория многогранников).
Емеличев В.А., Ковалев М.М., Кравцов М.К. - М.: Наука, 1981.- 344 с. Глава 1.
Параграфы 1,2,4.
. Семйон
І.В. Основи об’єктно-орієнтованого програмування. Навчальний посібник / Семйон
І.В., Чупов С. В., Брила А. Ю., Апшай А. І. - Ужгород, 2011.- 141с.
3. Матеріал з вільної енциклопедії
Вікіпедії http://uk.wikipedia.org/wiki/Опуклий_політоп
<http://uk.wikipedia.org/wiki/%D0%9E%D0%BF%D1%83%D0%BA%D0%BB%D0%B8%D0%B9_%D0%BF%D0%BE%D0%BB%D1%96%D1%82%D0%BE%D0%BF>
http://uk.wikipedia.org/wiki/Багатогранник
<http://uk.wikipedia.org/wiki/%D0%91%D0%B0%D0%B3%D0%B0%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D0%BD%D0%BD%D0%B8%D0%BA>