Смекни!
smekni.com

Строение идеалов полукольца натуральных чисел (стр. 5 из 5)

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.