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.