procedure EditKeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
masA: variant;
KolObraz: integer;
i, j, l, koef, d, kol, VspomChislo, Chislo: integer;
S: Set of Char = ['0'..'9', ',', #8];
p: boolean;
implementation
{$R *.dfm}
{Сортировка массива}
Procedure SORT;
var min: integer;
begin
min := masA[1,1];;
for i := 1 to KolObraz-1 do
for j := i+1 to KolObraz do
if masA[i,1] > masA[j,1] then begin
min := masA[j,1];
masA[j,1] := masA[i,1];
masA[i,1] := min;
end;
end;
//ищем НОД (алгоритм Евклида)
Function NOD(a,b: integer): integer;
begin
while (a <> 0) and (b <> 0) do
if a > b then a := a mod b
else b := b mod a;
if a = 0 then nod := b
else nod := a;
end;
//проверка на линейность
Procedure Lin (n, j, Chislo: integer; var p: boolean; m1: integer);
var x :integer;
begin
while (n<=m1) and not (p) and (Chislo > 0) do
begin
if j = 0 then x := 0
else x := masA[n,1];
Chislo := Chislo - x;
if Chislo = 0 then p := true
else Lin(n+1, 0, Chislo, p, m1);
if p then masA[n,2] := j;
inc(j);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
list: TStringList;
ss: string;
begin
Memo.Clear;
//разбиениестроки
ss := Edit.Text;
list := TStringList.Create; //создаем список list
//в нем будут хранится коэффициенты, полученные в результате разбиения строки
//с помощью процедуры extractStrings (разделителем будет ',')
extractStrings([','], [], PChar(ss), list);
KolObraz := list.Count; //количество переменных
masA := VarArrayCreate([1,KolObraz,1,2], varInteger); //создание двумерного массива
for i := 1 to KolObraz do
masA[i,1] := StrToInt(list.Strings[i-1]);
list.Free;
SORT;
ss := '';
for i := 1 to KolObraz do ss := ss + ' ' + IntToStr(masA[i,1]);
memo.Items.Add('ИСХОДНАЯ СИСТЕМА ОБРАЗУЮЩИХ В ПОРЯДКЕ ВОЗРАСТАНИЯ:');
memo.Items.Add(ss);
memo.Items.Add('');
memo.Items.Add('ЛИНЕЙНО ЗАВИСИМЫЕ ЭЛЕМЕНТЫ СИСТЕМЫ ОБРАЗУЮЩИХ:');
l := 0; i := 1;
while i <= KolObraz-l do begin
p := false;
Lin(1, 0, masA[i,1], p, i-1);
//если p = true то выводим линейную комбинацию и удаяем этот элемент из массива
ifpthenbegin
//вывод разложения элемента на линейную комбинацию
ss := IntToStr(masA[i,1]) + ' = ';
if i = 2 then ss := ss + IntToStr(masA[i-1,2]) + '*' + IntToStr(masA[i-1,1])
else begin
for j := 1 to i-2 do ss := ss + IntToStr(masA[j,2]) + '*' + IntToStr(masA[j,1]) + ' + ';
ss := ss + IntToStr(masA[i-1,2]) + '*' + IntToStr(masA[i-1,1]);
end;
memo.Items.Add(ss);
//смещаем элементы массива
for j := i to KolObraz-l-1 do begin masA[j,1] := masA[j+1,1]; masA[j,2] := masA[j+1,2]; end;
inc(l);
end
else inc(i);
end;
if l = 0 then memo.Items.Add('нет');
memo.Items.Add('');
KolObraz := KolObraz-l;
memo.Items.Add('ЛИНЕЙНО НЕЗАВИСИМАЯ СИСТЕМА ОБРАЗУЮЩИХ:');
ss := '';
for i := 1 to KolObraz do ss := ss + ' ' + IntToStr(masA[i,1]);
memo.Items.Add(ss);
memo.Items.Add('');
d := NOD(masA[1,1], masA[2,1]);
if KolObraz > 2 then for i := 3 to KolObraz do d := NOD(d, masA[i,1]);
for i := 1 to KolObraz do begin masA[i,1] := masA[i,1] div d; masA[i,2] := 0; end;
Chislo := masA[1,1];
p := false;
kol := 0;
VspomChislo := Chislo;
while kol<Chislo do begin
Lin(1, 0, VspomChislo, p, KolObraz);
if p then inc(kol)
else kol := 0;
inc(VspomChislo);
p := false;
end;
ss := 'ПЕРВЫЙ ЭЛЕМЕНТ В АРИФМЕТИЧЕСКОЙ ПРОГРЕССИИ ' + IntToStr((VspomChislo - kol) * d);
p := false; j := 0;
for i := 1 to KolObraz do masA[i,2] := 0;
Lin(1, j, (VspomChislo - kol) * d, p, KolObraz);
ss := ss + ' = ';
for j := 1 to KolObraz-1 do ss := ss + IntToStr(masA[j,2]) + '*' + IntToStr(masA[j,1]) + ' + ';
ss := ss + IntToStr(masA[KolObraz,2]) + '*' + IntToStr(masA[KolObraz,1]);
ss := ss + ' с разностью ' + IntToStr(d);
memo.Items.Add(ss);
masA := Unassigned;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Close;
end;
procedure TForm1.EditKeyPress(Sender: TObject; var Key: Char);
begin
if not (Key in S) then Key := #0
end;
procedure TForm1.EditKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if Edit.Text = '' then Button1.Enabled := false
else Button1.Enabled := true;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Button1.Enabled := false;
Memo.Clear;
Edit.Clear;
end;
end.