unit Uses_Massiv;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus, Grids, StdCtrls, Buttons, ExtCtrls; type
TForm2 = class(TForm)
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
StringGrid1: TStringGrid;
Label1: TLabel;
Edit1: TEdit;
Panel1: TPanel;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
Label3: TLabel;
Label2: TLabel;
N7: TMenuItem;
Label4: TLabel;
procedure FormActivate(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure N4Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure N5Click(Sender: TObject);
procedure N6Click(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure Edit1Change(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure N7Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
Uses Massiv, Matrisa;
var x,y,z,m:TMas; M1,M2,M3:TMatr;
n,k,nz:integer;
{$R *.dfm}
procedure z1(sgr1:TStringGrid;label3:TLabel);
var i:Integer;
s,d:Real;
begin
try
x:=TMas.Create(1,3);
y:=TMas.Create(1,3);
for i:=1 to 3 do x.Elem[i]:=strtofloat(Sgr1.cells[i-1,1]);
for i:=1 to 3 do y.Elem[i]:=strtofloat(Sgr1.cells[i-1,2]);
y.Sub(x);
S:=0;
for i:=1 to 3 do s:=s+sqr(y.Elem[i]);
d:=sqrt(s);
label3.caption:='Расстояние между двумя точками:=
'+floattostrf(d,ffFixed,5,1);
except
on EConvertError do ShowMessage ('Ошибка в записи числа);
on EOverflow do ShowMessage ('Переполнение');
on EMathError do ShowMessage ('Ошибка при вычислениях);
end;
x.Free;
y.Free;
end;
procedure z2(sgr1:TStringGrid;lbl3:TLabel);
var i:integer;
a:array[1..3]of real;
begin
try
x:=TMas.Create(1,3);
y:=TMas.Create(1,3);
for i:=1 to 3 do x.Elem[i]:=strtofloat(Sgr1.cells[i-1,1]);
for i:=1 to 3 do y.Elem[i]:=strtofloat(Sgr1.cells[i-1,2]);
x.Add(y);
for i:=1 to 3 do a[i]:=x.Elem[i]/2;
lbl3.caption:= 'Координаты середины отрезка'+chr(13);
lbl3.caption:=lbl3.caption+'x='+floattostrf(a[1],ffFixed,5,1)+'
y='+floattostrf(a[2],ffFixed,5,1)+' z='+floattostrf(a[3],ffFixed,5,1)
except
on EConvertError do ShowMessage('Ошибка в записи числа');
on EOverflow do ShowMessage ('Переполнение');
on EMathError do ShowMessage ('Ошибка при вычислениях');
end;
x.Free;
y.Free;
end;
procedure z3(sgr1:TStringGrid;lbl3:TLabel);
var i:Integer;
sm,cx,cy,cz:Real;
begin
try
x:=TMas.Create(1,n);
y:=TMas.Create(1,n);
z:=TMas.Create(1,n);
m:=TMas.Create(1,n);
for i:=1 to n do x.Elem[i]:=strtofloat(Sgr1.cells[0,i]);
for i:=1 to n do y.Elem[i]:=strtofloat(Sgr1.cells[1,i]);
for i:=1 to n do z.Elem[i]:=strtofloat(Sgr1.cells[2,i]);
for i:=1 to n do m.Elem[i]:=strtofloat(Sgr1.cells[3,i]);
x.Mul(m); y.Mul(m); z.Mul(m);
sm:=m.Sum();
cx:=x.Sum()/sm; cy:=y.Sum()/sm; cz:=z.Sum()/sm;
lbl3.caption:= Координаты центра тяжести'+floattostr(n)+ ' точек+ chr(13);
lbl3.caption:=lbl3.caption+'x=' +floattostrf(cx,ffFixed,5,1)+'
y='+floattostrf(cy,ffFixed,5,1)+ ' z='+floattostrf(cz,ffFixed,5,1)
except
on EConvertError do ShowMessage('Ошибка в записи числа);
on EOverflow do ShowMessage ('Переполнение');
on EMathError do ShowMessage ('Ошибка при вычислениях с плавающей
точкой');
end;
x.Free; y.Free;
z.Free; m.Free;
end;
procedure z4(sgr1:TStringGrid;lbl3:TLabel);
var i:integer;
sp:Real;
begin
try
x:=TMas.Create(1,n);
y:=TMas.Create(1,n);
for i:=1 to n do x.Elem[i]:=strtofloat(Sgr1.cells[0,i]);
for i:=1 to n do y.Elem[i]:=strtofloat(Sgr1.cells[1,i]);
sp:=x.PMn(x,y);
lbl3.caption:= 'Площадь многоугольника:= '+floattostr(sp);
except
on EConvertError do ShowMessage('Ошибка в записи числа');
on EOverflow do ShowMessage ('Переполнение');
on EMathError do ShowMessage ('Ошибка при вычислениях');
end;
x.Free;
y.Free;
end;
procedure z5(sgr1:TStringGrid;lbl3:TLabel);
var i:integer; chis,znam,rast: Real;
begin
try
x:=TMas.Create(1,3);
y:=TMas.Create(1,3);
z:=TMas.Create(1,3);
M1:=TMatr.Create(1,2,1,2);
M2:=TMatr.Create(1,2,1,2);
M3:=TMatr.Create(1,2,1,2);
for i:=1 to 3 do x.Elem[i]:=strtofloat(Sgr1.cells[i-1,1]);
for i:=1 to 3 do y.Elem[i]:=strtofloat(Sgr1.cells[i-1,2]);
for i:=1 to 3 do z.Elem[i]:=strtofloat(Sgr1.cells[i-1,3]);
M1[1,1]:=y[1]-x[1];
M1[1,2]:=y[2]-x[2];
M1[2,1]:=z[1];
M1[2,2]:=z[2];
M2[1,1]:=y[2]-x[2];
M2[1,2]:=y[3]-x[3];
M2[2,1]:=z[2];
M2[2,2]:=z[3];
M3[1,1]:=y[3]-x[3];
M3[1,2]:=y[1]-x[1];
M3[2,1]:=z[3];
M3[2,2]:=z[1];
chis:=sqr(M1.Det2)+sqr(M2.Det2)+sqr(M3.Det2);
znam:=sqr(z[1])+sqr(z[2])+sqr(z[3]);
rast:=sqrt(chis/znam);
lbl3.caption:= 'Расстояние от точки до прямой:=
'+floattostrf(rast,ffFixed,5,1);
except
on EConvertError do ShowMessage('Ошибка в записи числа');
on EOverflow do ShowMessage ('Переполнение');
on EMathError do ShowMessage ('Ошибка при вычислениях');
end;
x.Free; y.Free; M1.Free;
z.Free; M2.Free; M3.Free;
end;
procedure TForm2.FormActivate(Sender: TObject);
begin
StringGrid1.fixedrows:=1;
StringGrid1.colCount:=4;
StringGrid1.cells[0,0]:='X';
StringGrid1.cells[1,0]:='Y';
StringGrid1.cells[2,0]:='Z';
StringGrid1.cells[3,0]:='m';
StringGrid1.Enabled:=False;
StringGrid1.Visible:=False;
Label1.visible:=False;
Label2.visible:=False;
Label3.visible:=False;
edit1.Enabled:=False;
edit1.Visible:=False;
Bitbtn1.Enabled:=False;
Bitbtn2.Enabled:=False;
Label4.visible:=false;
end;
procedure TForm2.N3Click(Sender: TObject);
begin
StringGrid1.RowCount:=3;
StringGrid1.colCount:=3;
nz:=1; n:=3; k:=3;
Bitbtn1.Enabled:=true;
Label1.visible:=true;
Label3.visible:=true;
Label1.caption:= 'ВВЕДИТЕ КООРДИНАТЫ ДВУХ ТОЧЕК';
StringGrid1.Enabled:=true;
StringGrid1.Visible:=true;
Label4.caption:= 'Расстояние между двумя точками';
Label4.visible:=true;
Label4.Enabled:=true;
end;
procedure TForm2.N4Click(Sender: TObject);
begin
StringGrid1.RowCount:=3;
StringGrid1.colCount:=3;
nz:=2; n:=3; k:=3;
Label1.visible:=True;
Label3.visible:=true;
Label1.caption:= 'ВВЕДИТЕ КООРДИНАТЫ ДВУХ ТОЧЕК';
Bitbtn1.Enabled:=True;
StringGrid1.Enabled:=true;
StringGrid1.Visible:=true;
Label4.Caption:= 'Координаты середины отрезка';
Label4.visible:=true;
Label4.Enabled:=true;
end;
procedure TForm2.N5Click(Sender: TObject);
begin
StringGrid1.colCount:=4;
Label2.Caption:= 'ВВЕДИТЕ ЧИСЛО ТОЧЕК';
Label4.Caption:= 'Координаты центра тяжести матер-х точек';
Label4.visible:=true;
Label4.Enabled:=true;
Label2.visible:=true;
Label2.Enabled:=true;
Edit1. Enabled:=True;
Label3.Visible:=True;
Edit1. Visible:=True;
nz:=3; k:=4;
end;
procedure TForm2.N6Click(Sender: TObject);
var
sp:Real;i:integer;
begin
StringGrid1.colCount:=2;
Label2.Caption:= 'ВВЕДИТЕ ЧИСЛО ВЕРШИН';
Label2.visible:=true;
Label2.Enabled:=true;
Label3.Visible:=True;
Edit1.Enabled:=True;
Edit1.Visible:=True;
Label4.Caption:= 'Площадь многоугольника';
Label4.visible:=true;
Label4.Enabled:=true;
nz:=4; k:=2;
end;
procedure TForm2.N7Click(Sender: TObject);
begin
StringGrid1.RowCount:=4;
StringGrid1.colCount:=3;
nz:=5; n:=4; k:=3;
Bitbtn1.Enabled:=true;
Label1.visible:=true;
Label3.visible:=true;
Label1.caption:= 'Введите координаты 2-х точек и вектора прямой';
StringGrid1.Enabled:=true;
StringGrid1.Visible:=true;
label4.Caption:= 'Расстояние от точки до прямой';
Label4.visible:=true;
Label4.Enabled:=true;
end;
procedure TForm2.N2Click(Sender: TObject);
begin
Close;
end;
procedure TForm2.BitBtn1Click(Sender: TObject);
begin
Bitbtn1.Enabled:=False;
Bitbtn2.Enabled:=true;
case nz of
1:z1(stringGrid1,label3);
2:z2(stringGrid1,label3);
3:z3(stringGrid1,label3);
4:z4(stringGrid1,label3);
5:z5(stringGrid1,label3);
end;
end;
procedure TForm2.BitBtn2Click(Sender: TObject);
var i,j:Integer;
begin
Label2.caption:='';
Label3.caption:='';
Label1.caption:='';
Edit1.Text:='';
for i:=1 to n do
for j:=0 to k-1 do
StringGrid1.cells[j,i]:='';
StringGrid1.Enabled:=false;
StringGrid1.Visible:=false;
Bitbtn2.Enabled:=False;
Label1.visible:=false;
Label4.visible:=false;
Label4.Enabled:=false;
end;
procedure TForm2.Edit1Change(Sender: TObject);
begin
if strlen(PAnsiChar(Edit1.text))<>0 then
begin
n:=strtoint(edit1.text);
ShowMessage(inttostr(n));
StringGrid1.RowCount:=n+1;
StringGrid1.Enabled:=true;
StringGrid1.Visible:=true;
Label1.visible:=true;
bitbtn1.Enabled:=True;
end;
end;
procedure TForm2.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
try
n:=strtoint(edit1.text);
StringGrid1.RowCount:=n+1;
StringGrid1.Enabled:=true;
StringGrid1.Visible:=true;
Label1.visible:=true;
if nz=3 then Label1.caption:= 'ВВЕДИТЕ КООРДИНАТЫ И МАССЫ
'+inttostr(n)+' ТОЧЕК';
if nz=4 then Label1.caption:= 'ВВЕДИТЕ КООРДИНАТЫ '+inttostr(n)+'
ТОЧЕК';
bitbtn1.Enabled:=true;
Edit1.Visible:=False;
label2.Visible:=False;
Edit1.Enabled:=false;
label2.Enabled:=False;
except
on EConvertError do ShowMessage('Ошибка в записи числа');
end;
end;
end.