Lösung der Hauptklausur PR29 SS'97

Aufgabe 1.

procedure Eintragen (Schlange: in out UWarteschlange; Element: in TElement) is

begin

if

Schlange.Anzahl = Schlange.Groesse then raise ESchlange_voll;

elsif Schlange.Letztes = Schlange.Speicher'Last then

Schlange.Letztes := Schlange.Speicher'First;

else

Schlange.Letztes := TIndex'Succ (Schlange.Letztes);

end if;

Schlange.Speicher (Schlange.Letztes) := Element; Schlange.Anzahl := Schlange.Anzahl + 1;

end Eintragen;

Aufgabe 2:

type PGeraet;

type TErsetzbares_Geraet is new TGeraet with record

Ersatz: PGeraet;

end record;

type PGeraet is access TErsetzbares_Geraet;

Aufgabe 3:

(X) Richtig Verkettete Listen sollen nur als eingeschränkt private Typen implementiert werden.

Grund: Sonst vergleicht "=" nicht ihren Inhalt, sondern die Verweise

(X) Falsch Ein dazwischengeschobenes Leerzeichen verändert den Wert eines Ganzzahlliterals nicht.

Grund: Unterstrich

(X) Falsch Jedes Objekt vom Typ File_Type beinhaltet genau eine Datei auf der Festplatte.

Grund: Nur wenn es geöffnet und Open der Dateiname übergeben wurde.

(X) Richtig Mit Sequential_IO.Float_IO können keine Dateien beschrieben werden.

Grund: Sequential_IO exportiert keine Paketschablone namens Float_IO

(X) Richtig Jede Schleife kann mit Hilfe von Rekursion simuliert werden.

Grund: Es gibt Programmiersprachen (Prolog) ohne Schleife

(X) Richtig Es gibt Verweise, die Objekte unterschiedlicher, aber nicht aller Datentypen referieren können.

Grund: Polymorphe Verweise von einem Klassentyp

(X) Falsch Die Anzahl der Wiederholungen in einer Zählschleife steht bei der Übersetzung fest.

Grund: einer Festschleife; für Zählschleife erst beim Eintritt in die Schleife

(X) Falsch Jeder Ada-Prozeß wird mit Hilfe eines Pakets realisiert.

Grund: Ein task kann unabhängig vom package vereinbart werden.

Aufgabe 4.

package Modul is

end Modul;

package body Modul is

task Prozess;

task body Prozess is

begin

null; -- oder andere Aktivitaeten

end Prozess;

end Modul;

Aufgabe 5.

package MStapel_IO is new Sequential_IO (TMultibehaelter);

procedure Laden (Multibehaelter: out TMultibehaelter; Dateiname: in String) is

Datei: MStapel_IO.File_Type;

begin

MStapel_IO.Open (Datei, MStapel_IO.In_File, Dateiname);

MStapel_IO.Read (Datei, Multibehaelter);

MStapel_IO.Close (Datei);

end Speichern;

Aufgabe 6.

type TZahl_Eimer is record

Wert: Long_Integer;

Ueberlauf: Boolean;

end record;

Aufgabe 7.

procedure Verdoppeln (Feld: TFeld) is

Index: TFeld'Range := Feld'First;

procedure Rekursiv is

begin

Feld (Index) := 2 * Feld (Index); -- raises Constraint_Error:

begin

Index := Index + 1; -- raises Constraint_Error:

Rekursiv;

exception

when Constraint_Error => null;

end;

end Rekursiv;

begin

Rekursiv;

end Verdoppeln;