Текст модуля 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.



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: