Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на Delphi и Lazarus


РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты в разделе

puporev
Статус: Профессор
Рейтинг: 92
∙ повысить рейтинг »
Лысков Игорь Витальевич
Статус: Мастер-Эксперт
Рейтинг: 0
∙ повысить рейтинг »
Асмик Гаряка
Статус: Советник
Рейтинг: 0
∙ повысить рейтинг »

∙ Pascal / Delphi / Lazarus

Номер выпуска:1847
Дата выхода:02.07.2020, 10:45
Администратор рассылки:Зенченко Константин Николаевич (Старший модератор)
Подписчиков / экспертов:39 / 38
Вопросов / ответов:1 / 1

Консультация # 198973: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: помогите решить проблемы мне выдает ошибку давление плавающей точки на ноль. вот панель: вот код:
Код (Pascal) ::
...

Консультация # 198973:

Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:
помогите решить проблемы мне выдает ошибку давление плавающей точки на ноль.
вот панель:

вот код:

Код (Pascal) :: выделить код
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.

Дата отправки: 27.06.2020, 10:28
Вопрос задал: JonMoxley (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Зенченко Константин Николаевич (Старший модератор):

Здравствуйте, JonMoxley!

Деление на ноль происходит в подпрограмме

Код (Pascal) :: выделить код
procedure TForm1.Button1Click(Sender: TObject);


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

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

Удачи!

Консультировал: Зенченко Константин Николаевич (Старший модератор)
Дата отправки: 01.07.2020, 13:04
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!


В избранное