______________________________________________________________

Aufgabe 6.1
___________
Quelltext:

MODULE Matrix;
IMPORT IO;

(*-------------------------------------------------------------------*)
(* Prozedur Init, uebernimmt Matrix: a, keine Rueckgabewerte, erzeugt*)
(* symmetrische Matrix, Elemente erhalten jew. Summe aus Zeilen- und *)
(* Spaltenindex.                                                     *)
(*-------------------------------------------------------------------*)

PROCEDURE Init(VAR a : T) =

BEGIN

 FOR i:=1 TO n DO

  FOR j:=1 TO n DO

   a[i,j]:= i+j;

  END;

 END;

END Init;

(*-------------------------------------------------------------------*)
(* Prozedur Put, liest Matrix: a, keine Rueckgabewerte, gibt Elemente*)
(* durch Tabulatoren getrennt aus.                                   *)
(*-------------------------------------------------------------------*)

PROCEDURE Put(READONLY a : T) =

BEGIN

 FOR i:=1 TO n DO

  FOR j:=1 TO n DO

   IO.PutInt(a[i,j]);
   IO.Put("\t");

  END;

   IO.Put("\n");

 END;
END Put;

(*-------------------------------------------------------------------*)
(* Prozedur Add, liest Matritzen: a,b als Werte, uebernimmt Matrix c,*)
(* keine Rueckgabewerte, formt um: c in Summe von a und b.           *)
(*-------------------------------------------------------------------*)

PROCEDURE Add(READONLY a,b : T; VAR c : T) =

BEGIN


 FOR i:=1 TO n DO

  FOR j:=1 TO n DO

   c[i,j]:= a[i,j]+b[i,j];

  END;

 END;
END Add;

(*-------------------------------------------------------------------*)
(* Prozedur ScalarProd, liest Matrix: a als Wert, liest Argument: b, *)
(* uebernimmt Matrix c, keine Rueckgabewerte, formt um: c in Produkt *)
(* der Elemente aus a multipliziert b                                *)
(*-------------------------------------------------------------------*)

PROCEDURE ScalarProd(READONLY a: T;READONLY b : INTEGER; VAR c : T) =

BEGIN

 FOR i:=1 TO n DO

  FOR j:=1 TO n DO

   c[i,j]:= a[i,j]*b;

  END;

 END;

END ScalarProd;

(*-------------------------------------------------------------------*)
(* Prozedur Mult, liest Matritzen: a,b als Werte, uebernimmt Matr. c,*)
(* keine Rueckgabewerte, formt um: c in Produkt der Matritzen a und b*)
(*-------------------------------------------------------------------*)

PROCEDURE Mult(READONLY x,y : T; VAR c : T) =


VAR a,b : T;

BEGIN


a:=x;b:=y;

 FOR i:=1 TO n DO

  FOR j:=1 TO n DO

    FOR k:=1 TO n DO

      IF k=1 THEN c[i,j]:=0 END;

      INC(c[i,j],a[i,k]*b[k,j]);

    END;

  END;

 END;

END Mult;

BEGIN

END Matrix.

Testlauf:

Testprogramm fuer das Matrix-Modul aus Aufgabenblatt 6
Es werden zwei Matrizen ausgegeben ...

Testausgabe 1:

505     570     635     700     765     830     895     960     1025    1090
570     645     720     795     870     945     1020    1095    1170    1245
635     720     805     890     975     1060    1145    1230    1315    1400
700     795     890     985     1080    1175    1270    1365    1460    1555
765     870     975     1080    1185    1290    1395    1500    1605    1710
830     945     1060    1175    1290    1405    1520    1635    1750    1865
895     1020    1145    1270    1395    1520    1645    1770    1895    2020
960     1095    1230    1365    1500    1635    1770    1905    2040    2175
1025    1170    1315    1460    1605    1750    1895    2040    2185    2330
1090    1245    1400    1555    1710    1865    2020    2175    2330    2485
Ist die obere Ausgabe auch ordentlich formatiert?

Testausgabe 2:

0       0       0       0       0       0       0       0       0       0
0       0       0       0       0       0       0       0       0       0
0       0       0       0       0       0       0       0       0       0
0       0       0       0       0       0       0       0       0       0
0       0       0       0       0       0       0       0       0       0
0       0       0       0       0       0       0       0       0       0
0       0       0       0       0       0       0       0       0       0
0       0       0       0       0       0       0       0       0       0
0       0       0       0       0       0       0       0       0       0
0       0       0       0       0       0       0       0       0       0

Die zweite Matrix besteht nur aus Nullen.
Das sieht schon nicht schlecht aus

Testlaufende.

Aufgabe 6.2
___________
Lsungstext:

Es gibt einen einleuchtenden Grund, warum die bergabe als Variablenparameter
hier vorzuziehen ist: Ein Returnwert mte aufgrund der Natur der Aufgabe
eine komplette Matrix zurckliefern. Das bedeutet aber, da hierfr eine
"Phantommatrix" geschaffen werden mte, die das Ergebnis der Prozedur
aufnehmen kann, da die Operanden hierfr denkbar ungeeignet sind- da sie
unverndert bleiben mssen- und als Rckgabewert fungiert.
Dies erfordert nicht nur mehr Speicher, sondern auch mehr Rechenzeit, da die
bereits zugewiesene Matrix erneut zugewiesen werden mte -
der Zielmatrix nmlich. Zudem verliert man dadurch die direkte Kontrolle ber
die Zielmatrix.
Die Prozedur "Mult" hat eigentlich nur eine Besonderheit. Ebenso wie bei den
vorhergehenden Prozeduren soll in eine, mglicherweise nicht leere, Zielmatrix
geschrieben werden. Im Gegensatz zu den anderen Prozeduren ist hierbei aller-
dings zu beachten, da die Zielmatrix zuvor in die Nullmatrix berfhrt wird,
da hier keine absolute, sondern eine relative Zuordnung vorgenommen wird.
Zudem ist zu beachten, da hier mit Hilfsvariablen, welche den Wert der
Ausgangsvariablen bernehmen gearbeitet wird. Ansonsten wrde durch wiederholten
Zugriff auf inzwischen vielleicht genderte Werte ein nicht vorhersehbares
Ergebnis erzeugt.

Protokollende.