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;