Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:
помогите решить проблемы мне выдает ошибку давление плавающей точки на ноль.
вот панель:
вот код:
[code lang=pascal h=400]unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Spin, Grids, ComCtrls, ShellAPI;
type
Masiv = array[1..10, 1..10] of real;
Vector = array[1..10] of real;
type
TForm1 = class(TForm)
Panel1: TPanel;
Button1: TButton;
Button2: TButton;
StringGrid1: TStringGrid;
StringGrid2: TStringGrid;
Label1: TLabel;
Label3: TLabel;
Memo1: TMemo;
SpinEdit1: TSpinEdit;
Label2: TLabel;
procedure SpinEdit1Change(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure Label1MouseLeave(Sender: TObject);
procedure Label1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
var
A: Masiv;
b, X: Vector;
procedure TForm1.SpinEdit1Change(Sender: TObject);
var R: TRect;
begin
StringGrid1.RowCount := SpinEdit1.Value;
StringGrid1.Height := 24 * SpinEdit1.Value + SpinEdit1.Value + 3;
StringGrid2.RowCount := SpinEdit1.Value;
StringGrid2.Height := 24 * SpinEdit1.Value + SpinEdit1.Value + 3;
StringGrid1.ColCount := SpinEdit1.Value;
StringGrid1.Width := 32 * SpinEdit1.Value + SpinEdit1.Value + 3;
R := Rect(StringGrid1.Left, StringGrid1.Top, StringGrid1.Left + StringGrid1.Width, StringGrid1.Top + StringGrid1.Height); {Gets the boundaries of the current window}
Canvas.FillRect(Canvas.ClipRect);
Canvas.MoveTo(R.Left-3, R.Top);
Canvas.LineTo(R.Left-3, R.Bottom);
Canvas.MoveTo(R.Right+3, R.Top);
Canvas.LineTo(R.Right+3, R.Bottom);
Label3.Top := StringGrid1.Top + Round((StringGrid1.Height - Label3.Height)/2);
Label3.Left := StringGrid1.Left + StringGrid1.Width + 12;
Label3.Visible := True;
StringGrid2.Top := StringGrid1.Top;
StringGrid2.Left := StringGrid1.Left + StringGrid1.Width + 30;
StringGrid2.RowCount := StringGrid1.RowCount;
StringGrid2.Height := StringGrid1.Height;
StringGrid2.Visible := True;
R := Rect(StringGrid2.Left, StringGrid2.Top, StringGrid2.Left + StringGrid2.Width, StringGrid2.Top + StringGrid2.Height);
Canvas.MoveTo(R.Left-3, R.Top);
Canvas.LineTo(R.Left-3, R.Bottom);
Canvas.MoveTo(R.Right+3, R.Top);
Canvas.LineTo(R.Right+3, R.Bottom);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i, j, k, n, count: integer;
S: real;
begin
for i := 0 to Memo1.Lines.Count-1 do
Memo1.Lines.Delete(i);
count := 0;
n := SpinEdit1.Value;
for i := 0 to n - 1 do
begin
for j := 0 to n - 1 do
begin
if (StringGrid1.Cells[i, j] = '') or (StringGrid2.Cells[0, i] = '') then
count := count + 1;
end;
end;
if (count = 0) then
begin
for i := 1 to n do
begin
for j := 1 to n do
A[i, j] := StrToFloat(StringGrid1.Cells[j-1, i-1]);
b[i] := StrToFloat(StringGrid2.Cells[0, i-1]);
end;
for k := 1 to n - 1 do
begin
for j := k + 1 to n do
A[k, j] := A[k, j] / A[k, k];
b[k] := b[k] / A[k, k];
for i := k + 1 to n do
begin
for j := k + 1 to n do
A[i, j] := A[i, j] - A[i, k] * A[k, j];
b[i] := b[i] - A[i, k] * b[k];
end;
end;
X[n] := b[n] / A[n, n];
for i := n - 1 downto 1 do
begin
S := 0;
for j := i + 1 to n do
S := S + A[i, j] * X[j];
X[i] := b[i] - S;
end;
Memo1.Lines[0] := 'Ответ:';
for i := 1 to n do
Memo1.Lines.Add('X[' + IntToStr(i) + '] = ' + FloatToStr(X[i]));
end
else
ShowMessage('Заполни поля!');
end;
procedure TForm1.Button2Click(Sender: TObject);
var
i, j: integer;
R: TRect;
begin
for i := 1 to 10 do
begin
for j := 1 to 10 do
A[i, j] := 0;
b[i] := 0;
X[i] := 0;
end;
for i := 0 to SpinEdit1.Value-1 do
begin
for j := 0 to SpinEdit1.Value-1 do
StringGrid1.Cells[i, j] := '';
StringGrid2.Cells[0, i] := '';
end;
StringGrid2.Visible := False;
Label3.Visible := False;
R := Rect(StringGrid1.Left, StringGrid1.Top, StringGrid1.Left + StringGrid1.Width, StringGrid1.Top + StringGrid1.Height); {Gets the boundaries of the current window}
Canvas.FillRect(Canvas.ClipRect);
Canvas.MoveTo(R.Left-3, R.Top);
Canvas.LineTo(R.Left-3, R.Bottom);
Canvas.MoveTo(R.Right+3, R.Top);
Canvas.LineTo(R.Right+3, R.Bottom);
R := Rect(StringGrid2.Left, StringGrid2.Top, StringGrid2.Left + StringGrid2.Width, StringGrid2.Top + StringGrid2.Height);
Canvas.MoveTo(R.Left-3, R.Top);
Canvas.LineTo(R.Left-3, R.Bottom);
Canvas.MoveTo(R.Right+3, R.Top);
Canvas.LineTo(R.Right+3, R.Bottom);
for i := 0 to Memo1.Lines.Count-1 do
Memo1.Lines.Delete(i);
end;
procedure TForm1.FormPaint(Sender: TObject);
var R: TRect;
begin
R := Rect(StringGrid1.Left, StringGrid1.Top, StringGrid1.Left + StringGrid1.Width, StringGrid1.Top + StringGrid1.Height); {Gets the boundaries of the current window}
Canvas.MoveTo(R.Left-3, R.Top);
Canvas.LineTo(R.Left-3, R.Bottom);
Canvas.MoveTo(R.Right+3, R.Top);
Canvas.LineTo(R.Right+3, R.Bottom);
Label3.Top := StringGrid1.Top + Round((StringGrid1.Height - Label3.Height)/2);
Label3.Left := StringGrid1.Left + StringGrid1.Width + 12;
Label3.Visible := True;
StringGrid2.Top := StringGrid1.Top;
StringGrid2.Left := StringGrid1.Left + StringGrid1.Width + 30;
StringGrid2.RowCount := StringGrid1.RowCount;
StringGrid2.Height := StringGrid1.Height;
StringGrid2.Visible := True;
R := Rect(StringGrid2.Left, StringGrid2.Top, StringGrid2.Left + StringGrid2.Width, StringGrid2.Top + StringGrid2.Height);
Canvas.MoveTo(R.Left-3, R.Top);
Canvas.LineTo(R.Left-3, R.Bottom);
Canvas.MoveTo(R.Right+3, R.Top);
Canvas.LineTo(R.Right+3, R.Bottom);
end;
procedure TForm1.FormResize(Sender: TObject);
var R: TRect;
begin
R := Rect(StringGrid1.Left, StringGrid1.Top, StringGrid1.Left + StringGrid1.Width, StringGrid1.Top + StringGrid1.Height); {Gets the boundaries of the current window}
Canvas.MoveTo(R.Left-3, R.Top);
Canvas.LineTo(R.Left-3, R.Bottom);
Canvas.MoveTo(R.Right+3, R.Top);
Canvas.LineTo(R.Right+3, R.Bottom);
end;
procedure TForm1.Label1MouseLeave(Sender: TObject);
begin
Label1.Font.Style := [];
end;
procedure TForm1.Label1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
Label1.Font.Style := Label1.Font.Style + [fsUnderline];
end;
end.[/code]