Помощь - Поиск - Пользователи - Календарь
Полная версия: Опредеитель матрицы
Форум «Всё о Паскале» > Разработка ПО, алгоритмы, общие вопросы > Алгоритмы
Ilius
Не могу вызвать функцию определителя от переменной. blink.gif Помогите.Посмотрите в чем ошибка. Очень надо!
Lapp
Скажи конкретнее: где возникает ошибка, при каких твоих действиях, какая именно ошибка (номер и т.п.)
Ilius
Когда пытаюсь вызвать функцию определителя при нажатии на кнопку:(Ошибка такая:[Error] kalkulyator_matric.pas(500): Record, object or class type required)
Код

procedure TForm1.DetermClick(Sender: TObject);
var
   A : TMatrixData;
   i, j : integer;
   X : real;
begin
    for i:=0 to StringGrid1.ColCount-1 do
    for j:=0 to StringGrid1.RowCount-1 do
    begin
     A[i,j]:=StrToFloat(StringGrid1.Cells[i,j]);
    end;
            // вычсиление определителя
X := A.Det; <- тут

form2.rezdet.Text:=floatTostr(x);
form2.Show;
form1.Hide;
end;

из отдельного модуля в котором содержится эта функция:
Код
function TMatrix.Det: Extended;
var
  Temp, A: TMatrixData;
  Cols, Rows, Count: Word;
  i, j, k: Integer;
begin
  if not Square then
    Error(SNotSquare, 1);
  Count := Length(FData);
  Result := 1;
  SetLength(A, Count, Count);
  SetLength(Temp, 1, Count);
  for i := 0 to Count - 1 do
    for j := 0 to Count - 1 do
      A[i, j] := FData[i, j];
  for i := 0 to Count - 2 do {Начало преобразования к верхнему треугольному виду}
  begin
    for j := i to Count - 1 do                                 {*  Поиск    }
    begin                                                      {*  нулевых  }
      Rows := 0;                                               {*  строк    }
      Cols := 0;                                               {*  и        }
      for k := i to Count - 1 do                               {*  столбцов }
      begin                                                    {*  в        }
        Rows := Rows + Ord(A[j, k] = 0);                       {*  матрице  }
        Cols := Cols + Ord(A[k, j] = 0);                       {*           }
      end;                                                     {*           }
      if Rows + Cols = 0 then                                  {*           }
        Break;                                                 {*           }
      if (Cols = Count - i) or (Rows = Count - i) then         {*           }
      begin                                                    {*           }
        Result := 0;                                           {*           }
        Exit                                                   {*           }
      end                                                      {*           }
    end;                                                       {*           }
    if A[i, i] = 0 then
      for j := i + 1 to Count - 1 do
        if A[j, i] <> 0 then
        begin
          Result := -Result;                {* меняем строку              }
          Temp[0] := A[i];                  {* на строку с                }
          A[i] := A[j];                     {* первым                     }
          A[j] := Temp[0];                  {* ненулевым                  }
          Break                             {* элементом                  }
        end;
    for j := i + 1 to Count - 1 do
      if A[j, i] <> 0 then
      begin
        for k := i + 1 to Count - 1 do
          A[j, k] := A[j, k] - A[i, k] * A[j, i] / A[i, i];
        A[j, i] := 0
      end
  end; {Конец преобразования}
  for i := 0 to Count - 1 do     { Определитель как произведение }
    Result := Result * A[i, i];  { элементов на главной диагонали}
end;

Ilius
Короче сделал сам. И еще посмотрите почему пишет при компиляции этой процедуры(что то не то с индексами i и j?):
Код
procedure TForm1.umnnachClick(Sender: TObject);
var
   A, X  : TMatrix;
   i, j : integer;y:real;
begin
  y:=StrtoFloat(Edit1.Text);
   A:= TMatrix.Create( StringGrid1.RowCount, StringGrid1.ColCount);
   try // finally
      for i:=0 to StringGrid1.ColCount-1 do
         for j:=0 to StringGrid1.RowCount-1 do
            A[j, i]:= StrToFloat(StringGrid1.Cells[i,j]);
      X :=A.MultNum(y);
      for i:=0 to form2.StringGrid1.RowCount-1 do
      for j:=0 to form2.StringGrid1.ColCount-1 do
     form2.StringGrid1.Cells[i,j]:= floatTostr(X[i,j]);
     form2.Show;
     form1.Hide;
   finally A.Free;
   end;
end;


пишет:
[Warning] kalkulyator_matric.pas(426): FOR-Loop variable 'i' may be undefined after loop
[Warning] kalkulyator_matric.pas(423): FOR-Loop variable 'j' may be undefined after loop
[Warning] kalkulyator_matric.pas(426): Variable 'j' might not have been initialized
volvo
Цитата
Короче сделал сам.

dry.gif Что ты говоришь? RuSA тут совсем ни при чем? Ну, коли сделал сам, то значит и с этим вопросом справишься...
Ilius
о какой умный можно было и не предиратсья к словам если все знаешь а просто помочь!
Ilius
Почему эта процедура(транспонирование матрицы) работает токо когда в результате получается квадратная матрица:
Код
procedure TForm1.TransClick(Sender: TObject);
var
   A, X  : TMatrix;
   i, j : integer;
begin
    form2.StringGrid1.ColCount:=StringGrid1.ColCount;
    form2.StringGrid1.RowCount:=StringGrid1.RowCount;
   A:= TMatrix.Create( StringGrid1.RowCount, StringGrid1.ColCount);
      for i:=0 to StringGrid1.ColCount-1 do
         for j:=0 to StringGrid1.RowCount-1 do
            A[j, i]:= StrToFloat(StringGrid1.Cells[i,j]);
      X := A.Transposing;
       for i:=0 to form2.StringGrid1.RowCount-1 do
      for j:=0 to form2.StringGrid1.ColCount-1 do
     form2.StringGrid1.Cells[i,j]:= floatTostr(X[j,i]);
     form2.Show;
     form1.Hide;
end;
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.