Aufgabe 1. Die nicht gelistete Fälle sind korrekt.
si = ORD(CHR(71))
i := 1 + ENTIER(r)
si := SHORT(ENTIER(3.14))
b := 3 < MAX(REAL) OR li > i + 4
ch := "this is true"
i := 4 + CHR("a")
Aufgabe 2.
(a.) X * Y
(b.) x := x-1
Aufgabe 3.
M.i ist in M, C sichtbar
M.j ist in M, A, C sichtbar
M.A ist in M, A, B, C sichtbar
M.A.i ist in A sichbar
M.A.B ist in A, B sichtbar
M.A.B.i ist in B sichtbar
M.A.B.j ist in B sichtbar
M.A.B.k ist in B sichtbar
M.C ist in C, M sichtbar
Fehler: [ B* ] eine lokale Prozedur darf nicht exportiert werden.
i = 4; j = 2;
Aufgabe 4. Die zweite und die letzte Prozedursignaturen sind legal
Aufgabe 5. Die nicht gelistete Fälle sind korrekt.
Root(1, 3, 4, x1, x2, x3, x4)
Sin(3.14159)
i := Min(x, x1)
Root(a, b, c, 3, 4, 5, 6)
Aufgabe 6. Sonst wird die übergebene Variable nicht modifiziert
Aufgabe 7.
COPY(src, dst)
Aufgabe 8.
(a.)
PROCEDURE Length(x: ARRAY OF CHAR): INTEGER;
VAR i: INTEGER;
BEGIN
i := 0; WHILE x[i] # 0X DO INC(i) END;
RETURN i
END Length;
(b.)
6 7 5 32
Aufgabe 9.
Proc2: 0
Proc4: 1
Proc5: 0
Die Variable global in Proc5 is local definiert, während Proc3 die globale Variable ändert
Aufgabe 10.
5 25 25
Aufgabe 11.
PROCEDURE Min(a: ARRAY OF REAL): REAL;
VAR m: REAL; i: INTEGER;
BEGIN
m := a[0];
FOR i := 1 TO LEN(a)-1 DO
IF a[i] < m THEN m := a[i] END
END;
RETURN m
END Min;
PROCEDURE Max(a: ARRAY OF REAL): REAL;
VAR m: REAL; i: INTEGER;
BEGIN
m := a[0];
FOR i := 1 TO LEN(a)-1 DO
IF a[i] > m THEN m := a[i] END
END;
RETURN m
END Max;
PROCEDURE Average(a: ARRAY OF REAL): REAL;
VAR s: REAL; i: INTEGER;
BEGIN
s := a[0];
FOR i := 1 TO LEN(a)-1 DO s := s + a[i] END;
RETURN s / LEN(a)
END Average;
Aufgabe 12.
3 2 1 1 2 3
Aufgabe 13.
PROCEDURE Concat(a, b: Node): Node;
VAR c: Node;
BEGIN
IF a = NIL THEN
RETURN b
ELSIF b = NIL THEN
RETURN a
ELSE
c := a;
WHILE c.next # NIL DO c := c.next END;
c.next := b;
RETURN a
END
END Concat;
PROCEDURE Mix(a, b: Node): Node;
VAR r, na, nb: Node;
BEGIN
IF a = NIL THEN
r := b
ELSIF b = NIL THEN
r := a
ELSE
r := a;
LOOP
na := a.next; a.next := b;
IF na = NIL THEN EXIT END;
nb := b.next; b.next := na;
IF nb = NIL THEN EXIT END;
a := na; b := nb
END
END;
RETURN r
END Mix;
Aufgabe 14.
PROCEDURE Height(tree: Node): INTEGER;
VAR n: INTEGER;
PROCEDURE Max(a, b): INTEGER;
BEGIN
IF a > b THEN RETURN a ELSE RETURN b END
END Max;
BEGIN
IF tree = NIL THEN
RETURN 0
ELSE
RETURN Max(Height(tree.left), Height(tree.right))+1
END
END Height;
Aufgabe 15. Falls diese Funktionen Seiteneffekte haben (d.h. sie lesen/schreiben globale Variablen)
Aufgabe 16.
(a)
FOR i := 0 TO LEN(A) DO c[i] := 0;
FOR j := 0 TO LEN(A,1) DO
c[i] := c[i] + a[i, j]*b[j]
END
END
(b) Katastrophe! Jede Änderung von c wirkt auf b!
(c) b soll kein VAR-Parameter sein
Aufgabe 17. Lösung fehlt (noch).
Aufgabe 18. Lösung fehlt (noch).
Aufgabe 19. Lösung fehlt (noch).
Aufgabe 20.
PROCEDURE Merge (VAR dst : Element; src1, src2 : Element); VAR tmp : Element; BEGIN /* First check for special cases: is one or both of the input lists empty? */ IF (src1 = NIL) & (src2 = NIL) THEN dst := NIL; ELSE IF src1 = NIL THEN dst := src2; src2 := src2.next; ELSE IF src2 = NIL THEN dst := src1; src1 := src1.next; ELSE IF src1.val < src2.val THEN dst := src1; src1 := src1.next; ELSE dst := src2; src2 := src2.next; END; END; END; /* Main loop: append the smallest element of src1/src2 to list. */ tmp := dst; /* tmp always points to the last element of list. */ WHILE (src1 # NIL) & (src2 # NIL) DO IF src1.val < src2.val THEN tmp.next := src1; src1 := src1.next; ELSE tmp.next := src2; src2 := src2.next; END; tmp := tmp.next; END; /* Append the rest of the non-empty list. */ IF src1 # NIL THEN tmp.next := src1; ELSE tmp.next := src2; END; END; END Merge;