blikk info infothek forum galerie sitemap

Determinante von Matrix in Pascal

anfang zurueck weiter ende nach oben
(*
 Gruppe       : 1
 Autor        : J. B.
 Schule       : Gewerbeoberschule "Max Valier" Bozen
 Klasse       : 3Ia
 Aufgabe      : Laplacescher Entwicklungssatz
 Beschreibung : Implementierung des Laplaceschen Entwicklungssatzes in Pascal
                mit Hilfe von rekursivenFunktionen
 Lizenz       : GPL
 Anmerkung    : Beschränken Sie die Matrix auf 10 x 10, da man sonst
                einerseits zu viele Werte eingeben werden müssen, andererseits
                der Rechenaufwand zu hoch wird (bei meinen Tests dauerte
                die Berechnung der Determinante einer 10 x 10 REAL-Matrix auch
                schon mal 10 Sekunden!)
*)
PROGRAM laplace;
TYPE
  tmat = ARRAY [1..10, 1..10] OF REAL;
(*Untermatrix bilden*)
PROCEDURE TakeUntermat (mat : tmat;
                        VAR untermat :tmat;
                        grosse : INTEGER;
                        auslass : INTEGER);
VAR
  i, j : INTEGER; (*Laufvariablen*)
  spalte : INTEGER; (*Zu streichendeStelle*)
BEGIN
  (*Initialisierung*)
  spalte := 0;
  (*Wandere durch Spalten*)
  FOR j := 1 TO grosse DO
    IF j <> auslass THEN BEGIN
      (*Spalte der Untermatrix*)
      spalte := spalte + 1;
      (*Uebernehme gesamte Spalte*)
      FOR i := 1 TO grosse - 1 DO
        untermat[i, spalte] := mat [i+1,j]
    END
END;
(*Rekursive Funktion zur Berechnung der Determinanten der Matrix*)
FUNCTION Det (mat : tmat; grosse : INTEGER) : REAL;
VAR
  sum : REAL; (*Variable fuer die Summe*)
  fakt : INTEGER; (*Variable fuer dieVorzeichen*)
  j : INTEGER; (*Laufvariable*)
  untermat : tmat; (*Untermatrix*)
BEGIN
  (*Initialisierung*)
  fakt := -1;
  sum := 0;
  (*Ausstiegsbedingung*)
  IF grosse = 1 THEN
    Det := mat[1, 1]
  ELSE BEGIN
    FOR j := 1 TO grosse DO BEGIN
      (*Vorzeichen*)
      fakt := fakt * (-1);
      TakeUntermat(mat, untermat, grosse,j);
      (*Aufsummieren*)
      sum := sum + mat[1, j] * fakt *Det(untermat, grosse - 1)
    END;
    (*Wertuebergabe*)
    Det := sum
  END
END;
(*Benutzerabfrageprozedur*)
PROCEDURE BeneAbfr (VAR tab : tmat; VAR n : INTEGER);
VAR
  i, j : INTEGER; (*Laufvariable*)
BEGIN
  (*Initialisierung*)
  n := 11;
  WHILE n > 10 DO BEGIN
    Write('  Zeilen- und Spaltenanzahl der Matrix (max =10) : ');
    Readln(n);
  END;
  Writeln;
  FOR i := 1 TO n DO
    FOR j := 1 TO n DO BEGIN
      Write('  Wert in der ',i,'. Zeile, ',j,'. Spalte: ');
      Readln(tab[i, j])
    END
END;
(*=============================Hauptprogramm========================*)
VAR
  matrix : tmat;
  grosse : INTEGER; (*Anzahl der Zeilenund Spalten*)
  i, j : INTEGER; (*Laufvariable*)
BEGIN
  Writeln;
  BeneAbfr(matrix, grosse);
  Writeln;
  Write(' Die Determinante der Matrix');
  {AusReaMat(matrix, grosse);}
  Writeln(' betraegt');
  Writeln('    ',Det(matrix, grosse):0:3);
  Readln
END.

-Zruück zum Pseudocode
-Zurück zur Aufgabenstellung
nach oben