Determinanta

poruka: 6
|
čitano: 3.022
|
moderatori: Lazarus Long, XXX-Man, vincimus
1
+/- sve poruke
ravni prikaz
starije poruke gore
13 godina
neaktivan
offline
Determinanta Pascal

Pozdrav,

 

ovako : dobio sam zadatak da uradim program koji računa n jednačina sa n nepoznatih u Pascalu. Problem dolazi kod računanja determinante kada je format veći od 3. To ne bi bio problem da je Turbo Pascal kakav razvijen programski jezik (ne pričam o Delphi-u). Ovako ne znam gdje mi je greška u programu. Free Pascal mi izbacuje grešku "exitcode:201" a Lazarus mi izbacuje Error:External : SIGSEGv.

 

Bilo bi lijepo kad bi ko bacio oko na ovaj zadatak i pokušao naći grešku. Meni je više pukao film koliko ga radim.

 

program NjednacinaNnepoznatih(input, output);

uses crt;

const MAX = 10; //Maksimalan broj jednacina

type Vektor = array [1 .. MAX] of real;
     Matrica = array [1 .. MAX , 1 .. MAX] of real;

var A : Matrica;
    B : Vektor;
    i,j,n : integer;

procedure UnesiVektor(Ime : Char ; _n : integer ; var _vektor : Vektor);

  begin
    for i:= 1 to _n do
      begin
        write(Ime,'[',i,']= ');
        read(_vektor[i]);
      end;
  end;

procedure UnesiMatricu(Ime : char ; _n : integer ; var _matrica : Matrica);

  begin
    for i:= 1 to _n do
      for j:= 1 to _n do
        begin
          write(Ime,'[',i,',',j,']= ');
          read(_matrica[i,j]);
        end;
  end;

procedure IspisiMatricu(_matrica : Matrica ; _n : integer);

  begin
    for i:=1 to _n do
      begin
      writeln;
      for j:=1 to _n do
        begin
          if (j=1) then write('| ');
          write(_matrica[i,j]:7:2,' ');
          if (j=n) then write(' |');
        end;
      end;
  end;

function Zamijeni(k,_n : integer ; _vektor : Vektor ; _matrica : Matrica) : Matrica;

  var PRV : real;
      X : Matrica;
  begin
    for i:=1 to n do
      for j:=1 to n do
        begin
          X[i,j]:= _matrica[i,j];
          PRV:= _vektor[i];
          _vektor[i]:= X[i,k];
          X[i,k]:= PRV;
        end;
    Zamijeni:=X;
  end;

function Minor(_n : integer ; _matrica : Matrica ; ix,jx : integer) : Matrica;

  var X : Matrica;
      p,q : integer;

  begin
    p:=0;
    q:=0;
    for i:=1 to _n do
      begin
        if i<>ix then p:=p+1;
        q:=0;
        for j:=1 to _n do
          begin

            if j<>jx then q:=q+1;

            if (i<>ix) and (j<>jx) then
              begin
                X[p,q]:=_matrica[i,j];
              end;
          end;
      end;
  Minor:=X;
  end;

function power(xx,yx : integer) : real;
  var rez : real;
  begin
  rez:= 1;
    for i:=1 to yx do
      begin
        rez :=rez * xx;
      end;
  power:=rez;
  end;

function Determinanta(_matrica : Matrica ;_n : integer) : real;

  var rezultat : real;
      min : Matrica;

  begin  //Lazarus prijavljuje grešku u ovoj liniji ako je n>3
    rezultat:=0;
    for i:= 1 to _n do
       for j:= 1 to _n do
         begin
           min[i,j]:=_matrica[i,j];
         end;

    if (n= 1) then
      begin
        rezultat:= min[1,1]
      end
    else if (n= 2) then
      begin
        rezultat:= (min[1,1]*min[2,2])-(min[2,1]*min[1,2])
      end
    else if (n= 3) then
      begin
        rezultat:= (min[1,1]*min[2,2]*min[3,3])+(min[1,2]*min[2,3]*min[3,1])+(min[1,3]*min[2,1]*min[3,2])-(min[1,3]*min[2,2]*min[3,1])-(min[1,2]*min[2,1]*min[3,3])-(min[1,1]*min[2,3]*min[3,2]);
      end
    else if (n>3) then
      begin
        for i:=1 to _n do
          begin
            rezultat:=rezultat*power(-1,i)*_matrica[i,1]*Determinanta(Minor(n,_matrica,i,1),n-1);
          end;
      end;
    determinanta:=rezultat;
  end;

var test : Matrica;
begin
clrscr;
  writeln('Unesi n: ');read(n);
  UnesiMatricu('A',n,A);
  IspisiMatricu(A,n);writeln;writeln;
  test:=minor(n,A,1,1); //Testiranje minora
  IspisiMatricu(test,n-1);
  writeln('Determinanta matrice je',Determinanta(A,n):7:2);
  readkey
end.

 

Hvala.

 

 

 

 

 

 

 

 

Dafuq I just read?
Moj PC  
0 0 hvala 0
12 godina
neaktivan
offline
Re: Determinanta Pascal

Varijable "i" i "j" nisu lokalne varijable, nego su zajedničke svim funkcijama. Ovo je vjerojatno razlog zašto program puca pri rekurziji funkcije "Determinanta" za n > 3.

Izbriši ove dvije varijable iz deklaracije na vrhu pa stavi ih u svaku proceduru/funkciju koja ih koristi, npr.

 

procedure UnesiVektor(Ime : Char ; _n : integer ; var _vektor : Vektor);
  var i: Integer; // dodaj ovo
  begin
    for i:= 1 to _n do
...

procedure UnesiMatricu(Ime : char ; _n : integer ; var _matrica : Matrica);
  var i, j: Integer; // dodaj ovo
  begin
    for i:= 1 to _n do
      for j:= 1 to _n do
...

 

i tako za sve ostale.

 

13 godina
neaktivan
offline
Re: Determinanta Pascal
Bobobo-bo Bo-bobo kaže...

Varijable "i" i "j" nisu lokalne varijable, nego su zajedničke svim funkcijama. Ovo je vjerojatno razlog zašto program puca pri rekurziji funkcije "Determinanta" za n > 3.

Izbriši ove dvije varijable iz deklaracije na vrhu pa stavi ih u svaku proceduru/funkciju koja ih koristi, npr.

 

procedure UnesiVektor(Ime : Char ; _n : integer ; var _vektor : Vektor);
  var i: Integer; // dodaj ovo
  begin
    for i:= 1 to _n do
...

procedure UnesiMatricu(Ime : char ; _n : integer ; var _matrica : Matrica);
  var i, j: Integer; // dodaj ovo
  begin
    for i:= 1 to _n do
      for j:= 1 to _n do
...

 

i tako za sve ostale.

 

 Program i dalje puca kod rekurzije.

Dafuq I just read?
17 godina
neaktivan
offline
Determinanta

Nakon pol sata prtljanja nisam uspio naći grešku. Doduše nisam neki majstor za fpc i pascal. Anyway preporučam ti par stvari: 1) riješi se globalnih varijabli - Determinanta koristi n i _n - nije baš jasno u kojoj su vezi, 2) napravi full rekurzivnu funkciju za determinantu (dakle, kak već ide po definiciji same determinante), 3) procedura Determinanta nikad niti neće vratiti rezultat koji nije nula za n > 3. Pogodi zašto.

 

Poruka je uređivana zadnji put sri 19.9.2012 13:52 (Black Deus Typhon).
 
0 0 hvala 0
12 godina
neaktivan
offline
Re: Determinanta Pascal

Program puca zbog beskonačne rekurzije: funkcija Determinanta koristi varijablu n, a trebala bi poslani parametar _n. Istu grešku imaš i u funkcijama IspisiMatricu i Zamijeni.

 

Nakon ove promjene program ne puca, ali uvijek vraća nulu za n > 3. Petlja koja računa determinantu za taj slučaj treba glasiti ovako:

 

 

...
  else if (_n > 3) then
    for i := 1 to _n do
      rezultat := rezultat + power(-1, i - 1) * _matrica[i, 1] * Determinanta(Minor(_n, _matrica, i, 1), _n - 1);


 

13 godina
neaktivan
offline
Re: Determinanta Pascal
Bobobo-bo Bo-bobo kaže...

Program puca zbog beskonačne rekurzije: funkcija Determinanta koristi varijablu n, a trebala bi poslani parametar _n. Istu grešku imaš i u funkcijama IspisiMatricu i Zamijeni.

 

Nakon ove promjene program ne puca, ali uvijek vraća nulu za n > 3. Petlja koja računa determinantu za taj slučaj treba glasiti ovako:

 

 

...
  else if (_n > 3) then
    for i := 1 to _n do
      rezultat := rezultat + power(-1, i - 1) * _matrica[i, 1] * Determinanta(Minor(_n, _matrica, i, 1), _n - 1);


 

 Hvala. To je bilo to. Samo je meni logičnije da se stavi:

... + power(-1,i+1) * ...

 

jer po formuli predznak se računa kao

-1^(i+j)

 

a kod nas je "j" uvijek 1, a "i" se mijenja.

U svakom slučaju hvala.

Dafuq I just read?
1
Nova poruka
E-mail:
Lozinka:
 
vrh stranice