Консультация № 198973
27.06.2020, 10:28
0.00 руб.
27.06.2020, 11:39
0 9 1
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:
помогите решить проблемы мне выдает ошибку давление плавающей точки на ноль.
вот панель:

вот код:
[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]

Обсуждение

давно
Профессор
401888
1232
27.06.2020, 11:16
общий
Адресаты:
давление плавающей точки на ноль

Это как???
давно
Посетитель
403446
21
27.06.2020, 11:23
общий
Я не знаю я когда ввожу числа нажимаю на кнопку решить мне выдает такую ошибку
давно
Старший Модератор
31795
6196
27.06.2020, 11:44
общий
Цитата: JonMoxley
вот панель:

Сделайте скан экрана, нажав PrtSc, смартфон плохо экран фотографирует.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
27.06.2020, 11:49
общий
Адресаты:
Или сам проэкт зипните(не рарните) и выложите.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
27.06.2020, 13:01
общий
27.06.2020, 13:08
Адресаты:
Посмотрел Ваш код. Ваша ошибка - Вы вырезали код из подпрограммы Gauss(см. предыдущую консультацию), не разобравшись что там к чему:
Цитата: Метод Гаусса
На первом этапе осуществляется так называемый прямой ход, когда путём элементарных преобразований над строками систему приводят к ступенчатой или треугольной форме, либо устанавливают, что система несовместна. Для этого среди элементов первого столбца матрицы выбирают ненулевой, перемещают содержащую его строку в крайнее верхнее положение, делая эту строку первой. Далее ненулевые элементы первого столбца всех нижележащих строк обнуляются путём вычитания из каждой строки первой строки, домноженной на отношение первого элемента этих строк к первому элементу первой строки. После того, как указанные преобразования были совершены, первую строку и первый столбец мысленно вычёркивают и продолжают, пока не останется матрица нулевого размера. Если на какой-то из итераций среди элементов первого столбца не нашёлся ненулевой, то переходят к следующему столбцу и проделывают аналогичную операцию.


Вчитайтесь внимательно:
Для этого среди элементов первого столбца матрицы выбирают ненулевой, перемещают содержащую его строку в крайнее верхнее положение, делая эту строку первой.

Этот код как раз и делает это, но Вы его ВЫБРОСИЛИ
[code lang=pascal] if a[b,b]<e then
begin
i:=b+1;
while(i<n)and(abs(a[i,b])<e) do inc(i);
if i=n then ShowMessage('two and more')else
for j:=b to n do
begin
c:=a[b,j];
a[b,j]:=a[i,j];
a[i,j]:=c;
end;
end;[/code]
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
30.06.2020, 10:55
общий
Адресаты:
Разобрались?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
403446
21
30.06.2020, 10:58
общий
Да
давно
Старший Модератор
31795
6196
30.06.2020, 11:13
общий
Адресаты:
А, было что?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
01.07.2020, 13:04
общий
это ответ
Здравствуйте, JonMoxley!

Деление на ноль происходит в подпрограмме
[code lang=pascal]procedure TForm1.Button1Click(Sender: TObject);[/code]

Цитата: Метод Гаусса
  • На первом этапе осуществляется так называемый прямой ход, когда путём элементарных преобразований над строками систему приводят к ступенчатой или треугольной форме, либо устанавливают, что система несовместна.
  • Для этого среди элементов первого столбца матрицы выбирают ненулевой, перемещают содержащую его строку в крайнее верхнее положение, делая эту строку первой.
  • Далее ненулевые элементы первого столбца всех нижележащих строк обнуляются путём вычитания из каждой строки первой строки, домноженной на отношение первого элемента этих строк к первому элементу первой строки.
  • После того, как указанные преобразования были совершены, первую строку и первый столбец мысленно вычёркивают и продолжают, пока не останется матрица нулевого размера. Если на какой-то из итераций среди элементов первого столбца не нашёлся ненулевой, то переходят к следующему столбцу и проделывают аналогичную операцию.

В этоц подпрограмме нет поиска ненулевых элементов первого столбца их перестановки.

Удачи!
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа