Wyznacznik macierzy-problem

0

czy moze ktos mi powiedziec gdzie popelnilem blad bardzo prosze o pomoc.

    StringGrid1: TStringGrid;
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    procedure Edit1Change(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Label1Click(Sender: TObject);




  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TmyArray = array[0..9,0..9] of real;


var
  Form1: TForm1;
  stopien: byte;
  tablica:Tmyarray;
implementation

{$R *.dfm}

procedure TForm1.Edit1Change(Sender: TObject);
begin
stopien:=strtoint(Edit1.Text);
stringgrid1.ColCount:=stopien;
stringgrid1.RowCount:=stopien;
end;
 

procedure TForm1.Button1Click(Sender: TObject);
var
i,j:byte;
begin
  for i:=0 to stopien-1 do
    for j:=0 to stopien-1 do
      tablica[i,j]:=strtoint(stringgrid1.cells[i,j]);

Label1.Caption:=floattostr(det(Tablica))

end;

procedure TForm1.Label1Click(Sender: TObject);
begin
 for i:=1 to n-1 do 
 
  for j:=i+1 to n do 
 
    for k:=i+1 to n do 

      a[j,k] := a[j,k] - a[j,i]/a[i,i] * a[i,k]; 
 
det := 1; 
 
for i:=1 to n do det := det * a[i,i]; 

end;

end.












unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    StringGrid1: TStringGrid;
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    procedure Edit1Change(Sender: TObject);
    procedure Button1Click(Sender: TObject);




  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TmyArray = array[0..9,0..9] of real;


var
  Form1: TForm1;
  stopien: byte;
  tablica:Tmyarray;
implementation

{$R *.dfm}

procedure TForm1.Edit1Change(Sender: TObject);
begin
stopien:=strtoint(Edit1.Text);
stringgrid1.ColCount:=stopien;
stringgrid1.RowCount:=stopien;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
i,j:byte;
begin
  for i:=0 to stopien-1 do
    for j:=0 to stopien-1 do
      tablica[i,j]:=strtoint(stringgrid1.cells[i,j]);

Label1.Caption:=floattostr(det(Tablica))

end;

end.
0
  1. Wklej ten kod porządnie.
  2. Błędy np tutaj
tablica[i,j]:=strtoint(stringgrid1.cells[i,j]);

i tutaj

floattostr(det(Tablica))
  1. Co mówi kompilator?
0

Undeclared identifier det.

aha, i z gory dziekuje za odpowiedz

0

czyli co powinienem teraz wpisac? bardzo prosze o pomoc, poniewaz nie jest ort! raczej ort! informatyk..

0
lukasz napisał(a)

czyli co powinienem teraz wpisac?

Tak jak napisałem powyżej. Wklej porządnie kod tego programu, bo to co umieściłeś w pierwszym poście nie da się nawet przeanalizować. Wtedy pewnie znajdzie się konkretna rada.

0
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    StringGrid1: TStringGrid;
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    procedure Edit1Change(Sender: TObject);
    procedure Button1Click(Sender: TObject);




  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TmyArray = array[0..9,0..9] of real;


var
  Form1: TForm1;
  stopien: byte;
  tablica:Tmyarray;
implementation

{$R *.dfm}

procedure TForm1.Edit1Change(Sender: TObject);
begin
stopien:=strtoint(Edit1.Text);
stringgrid1.ColCount:=stopien;
stringgrid1.RowCount:=stopien;
end;
 

procedure TForm1.Button1Click(Sender: TObject);
var
i,j:byte;
begin
  for i:=0 to stopien-1 do
    for j:=0 to stopien-1 do
      tablica[i,j]:=strtoint(stringgrid1.cells[i,j]);

Label1.Caption:=floattostr(det(Tablica))

end;

end.
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    StringGrid1: TStringGrid;
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    procedure Edit1Change(Sender: TObject);
    procedure Button1Click(Sender: TObject);




  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TmyArray = array[0..9,0..9] of real;


var
  Form1: TForm1;
  stopien: byte;
  tablica:Tmyarray;
implementation

{$R *.dfm}

procedure TForm1.Edit1Change(Sender: TObject);
begin
stopien:=strtoint(Edit1.Text);
stringgrid1.ColCount:=stopien;
stringgrid1.RowCount:=stopien;
end;
 

procedure TForm1.Button1Click(Sender: TObject);
var
i,j:byte;
begin
  for i:=0 to stopien-1 do
    for j:=0 to stopien-1 do
      tablica[i,j]:=strtoint(stringgrid1.cells[i,j]);

Label1.Caption:=floattostr(det(Tablica))

end;

end.
0

wklejone, bardzo prosze o porade...najlepiej prostym jezykiem= krok po kroku

0

Ale dalej nie wiadomo co to ma być za Det i do czego służyć, poza tym wiesz że jeżeli wyczyścisz na chwilę pole edycyjne to otrzymasz wyjątek. Powinieneś sprawdzać poprawnośc liczb procedurą: Val lub funkcją: TryStrToInt i ja jestem cieńki z matmy, coś tam kiedyś się uczyłem o macierzach, ale to było dawno, więć już nie pamiętam, bo się na tym nie skupiłem za bardzo. Napisz co chcesz osiągnąć, bo podejrzewam, że Det to ma być jakaś funkcja, która u Ciebie nie jest w ogóle zadeklarowana ani nie jest jej kod zdefiniowany stąd błąd. Jak wklejasz kod z jakiś zewnętrznych źródeł to rób to z głową i uważnie. Tyle póki co mogę doradzić.

0

no tak to ma byc wyznacznik macierzy metoda laplace...no i wlasnie nie mam tego algorytmu calego ..i to jest moj problem...

0

jeszcze raz prosze o pomoc

0

Nie lubię dawać gotowców ale chciałem sprawdzić jak to będzie działać, więc masz.
Sprawdziłem dla macierzy 2x2. Dla większych nie chce mi się ręcznie liczyć wyznaczników.
Nie ma zabezpieczenia w przyp. gdy w tabelce ktoś wpisze nie liczby.
Najlepiej stwórz całkiem nową aplikację.
Na formie połóż StringGrid1, Button1, Edit1 i Label1.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    Button1: TButton;
    Edit1: TEdit;
    Label1: TLabel;
    procedure Edit1Change(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TmyArray = array[0..9,0..9] of real;

var
  Form1: TForm1;
  stopien: byte;
  tablica:Tmyarray;

implementation

{$R *.dfm}

procedure TForm1.Edit1Change(Sender: TObject);
var n:Integer;
begin
  if TryStrToInt(Edit1.Text,n) and (n<=10) then
  begin
    stopien:=n;
    stringgrid1.ColCount:=n;
    stringgrid1.RowCount:=n;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i,j,k:byte;
  det:Real;
begin
  for i:=0 to stopien-1 do
    for j:=0 to stopien-1 do
      tablica[i,j]:=StrToFloat(stringgrid1.cells[i,j]);

  for i:=0 to stopien-1 do
    for j:=i+1 to stopien-1 do
      for k:=i+1 to stopien-1 do
        tablica[j,k] := tablica[j,k] - tablica[j,i]/tablica[i,i] * tablica[i,k];

  det:=1;
  for i:=0 to stopien-1 do
    det:=det*tablica[i,i];

  Label1.Caption:=floattostr(det);
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  stringgrid1.FixedCols:=0;
  stringgrid1.FixedRows:=0;
  stringgrid1.Options:=stringgrid1.Options+[goEditing,goAlwaysShowEditor];
  edit1.Text:='2';
  button1.Caption:='Oblicz wyznacznik';
end;

end.
0

dzieki wam bardzo za pomoc

0
var
  stopien:byte;
{...}
  stopien := strtoint(edit1.text);

Jeżeli ktoś poda więcej niż jeden znak, to ci troche pomniesza. Byte może pomieścić tylko 1 bajt więc cyfrę 0..255 lub 1 znak ASCII

Myślę że powinno być

var
  Stopien: Integer;
{...}
procedure TForm1.EditKeyPress(Sender: TObject; var Key: Char);
begin
  if not (Key in ['0'..'9', #8]) then
    Key := #0;
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
  if Edit1.Text <> '' then
    Stopien := IntToStr(Edit1.Text);
end;
0

aha i jeszcze jedno pytanie ma ktos moze gotowy algorytm o wyznacznika metoda laplace'a?bo niechce mi sie myslec a pewnie troche by mi zeszlo;p...jezeli nie to trudno..ale jezeli ktos ma bardzo prosze o przeslanie

0

A jak się nazywa metoda którą zastosowałeś w tym programie?

0

to jest metoda klasyczna a ja potrzebowalbym rekurencji czyli laplacea

0
Łukasz napisał(a)

bo niechce mi sie myslec

Pisać po polsku też nie? Jak Ci się nie chce myśleć, to daruj sobie informatykę :P

0

no tak tylko mam taki program na zaliczenie, ok poradze sobie juz dzieki

1 użytkowników online, w tym zalogowanych: 0, gości: 1