Обработка массивов
Интерфейс:
Код программы:
Unit Unit8;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Grids, Menus, Buttons, ComCtrls;
type
TForm8 = class(TForm)
grdMatrix: TStringGrid;
txtRazmer: TEdit;
Label1: TLabel;
grdVector: TStringGrid;
grdX: TStringGrid;
BitBtn1..3: TBitBtn;
UpDown1: TUpDown;
Label1..6: TLabel;
procedure txtRazmerKeyPress(Sender: TObject; var Key: Char);
procedure txtRazmerExit(Sender: TObject);
procedure mnuExitClick(Sender: TObject);
procedure mnuMatrixClearClick(Sender: TObject);
procedure mnuMatrixFillClick(Sender: TObject);
procedure mnuMatrixCalcClick(Sender: TObject);
procedure grdMatrixSelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form8: TForm8;
procedure TForm8.txtRazmerKeyPress(Sender: TObject; var Key: Char); // работа с TEdit (ранг матрицы) //
var
n,i,j:integer;
begin
if key<>#13 then exit;
txtRazmerExit(Sender);
end;
procedure TForm8.txtRazmerExit(Sender: TObject); // процедура ввода ранга матрицы,связывание её со StringGrid (матрица А и И)//
var
n,i,j:integer;
begin
n:= StrToInt(txtRazmer.text);
if (n<1) or (n>10000) then
begin
application.MessageBox('Неправильный Размер','Ошибка',48);
txtRazmer.SetFocus;
exit;
end;
grdMatrix.ColCount:=n+1;
grdMatrix.RowCount:=n+1;
grdX.RowCount:=n+1;
grdVector.RowCount:=n+1;
grdVector.Cols[0][0]:='b';
grdX.Cols[0][0]:='X';
for i:=1 to n do
begin
grdMatrix.Cols[i][0]:=IntToStr(i);
grdMatrix.Rows[i][0] := IntToStr(i);
end;
for i:= 1 to n do
for j:= 1 to n do
If grdMatrix.Rows[i][j]='' then grdMatrix.Rows[i][j]:='0';
for i:=1 to n do
begin
If grdVector.Rows[i][0]='' then grdVector.Rows[i][0]:='0';
grdX.Rows[i][0]:='';
end;
end;
procedure TForm8.mnuExitClick(Sender: TObject);
begin
if Application.MessageBox('Завершить Работу Программы?','Выход',
32+MB_YESNO+MB_DEFBUTTON2) = IDYES
then halt;
end;
procedure TForm8.mnuMatrixClearClick(Sender: TObject);
var n,i,j:integer;
begin
n:= StrToInt(txtRazmer.text);
if (n<1) or (n>100000) then
begin
application.MessageBox('Неправильный Размер','Ошибка',48);
txtRazmer.SetFocus;
exit;
end;
grdMatrix.ColCount:=n+1;
grdMatrix.RowCount:=n+1;
grdX.RowCount:=n+1;
grdVector.RowCount:=n+1;
for i:=1 to n do
begin
grdMatrix.Cols[i][0]:=IntToStr(i);
grdMatrix.Rows[i][0] := IntToStr(i);
end;
for i:= 1 to n do
for j:= 1 to n do
grdMatrix.Rows[i][j]:='0';
for i:=1 to n do
begin
grdVector.Rows[i][0]:='0';
grdX.Rows[i][0]:='';
end;
end;
procedure TForm8.mnuMatrixFillClick(Sender: TObject);
var n,i,j:integer;
begin
n:= StrToInt(txtRazmer.text);
if (n<1) or (n>10000) then
begin
application.MessageBox('Неправильный Размер','Ошибка',48);
txtRazmer.SetFocus;
exit;
end;
grdMatrix.ColCount:=n+1;
grdMatrix.RowCount:=n+1;
grdX.RowCount:=n+1;
grdVector.RowCount:=n+1;
for i:=1 to n do
begin
grdMatrix.Cols[i][0]:=IntToStr(i);
grdMatrix.Rows[i][0] := IntToStr(i);
end;
for i:= 1 to n do
for j:= 1 to n do
grdMatrix.Rows[i][j]:=IntToStr(-10+Random(20));
for i:=1 to n do
begin
grdVector.Rows[i][0]:=IntToStr(-10+Random(20));
grdX.Rows[i][0]:='';
end;
end;
procedure TForm8.mnuMatrixCalcClick(Sender: TObject); // заполнение стринг грида рандомными числами черзе массив)//
var n,i,j,k,imax:integer;
a:array[1..100,1..100] of real;
ai:array[1..100] of real;
x:array[1..100] of real;
koef,max,sum,s,m:real;
begin
n:=grdMatrix.ColCount-1;
for i:= 1 to n do
begin // решение уравнения //
for j:= 1 to n do
a[i][j]:= StrToFloat(grdMatrix.Rows[i][j]);
a[i][n+1]:=StrToFloat(grdVector.Rows[i][0]);
grdX.Rows[i][0]:='';
end;
for i:=1 to n-1 do
begin
max:=abs(a[i][i]);
imax:=i;
for j:= i+1 to n do
if abs(a[j][i])>max then
begin
max:=abs(a[j][i]);
imax:= j;
end;
if i<>imax then
begin
for j:= i to n+1 do
begin
max:=a[i][j];
a[i][j]:=a[imax][j];
a[imax][j]:=max;
end
end;
if abs(a[i][i])<1e-10 then
begin
application.MessageBox('Деление на ноль','Ошибка!',16);
exit;
end;
for j:=1 to n+1 do ai[j]:=a[i][j]/a[i][i];
for k:=i+1 to n do
begin
koef:=a[k][i];
for j:=1 to n+1 do
a[k][j]:=a[k][j]-ai[j]*koef;
end;
end;
for i:= n downto 1 do
begin
sum:=0;
for j:= i+1 to n do
sum:=sum+a[i][j]*x[j];
for i:= 1 to n do
grdX.Rows[i][0]:=FloatToStrF(x[i],ffGeneral,7,4);
procedure TForm8.grdMatrixSelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
begin
grdVector.Row:=Arow;
grdX.Row:=Arow;
end
end.
