Prüfungsteilnehmer Prüfungstermin Einzelprüfungsnummer Kennzahl: Kennwort: Herbst 6 6 1 1 6 Arbeitsplatz-Nr.: 2 0 1 4 Erste Staatsprüfung für ein Lehramt an öffentlichen Schulen — Prüfungsaufgaben — Fach: Informatik (vertieft studiert) Einzelprüfung: Datenbanksysteme, Softwaretechnologie Anzahl der gestellten Themen (Aufgaben): 2 Anzahl der Druckseiten dieser Vorlage: 15 Bitte wenden! Herbst 2014 Einzelprüfungsnummer 66116 Seite 2 Thema Nr. 1 Teilaufgabe 1: Aufgabe 1: Entwerfen Sie ein ER-Modell für die folgende Miniwelt, die sich mit Zügen, Verbindungen, Orten usw. befasst. Geben Sie Kardinalitäten in (min, max)-Notation an. Sie brauchen Schlüsselattribute nicht zu kennzeichnen. - Ein Zugtyp hat eine Bezeichnung, eine Höchstgeschwindigkeit und eine Kapazität. - Es gibt Strecken, die einen Start- und ein Zielort haben. - Fin Zug hat einen Namen und ist von einem bestimmten Zugtyp. Ein Zug kann auf einer Strecke verkehren und jede Strecke wird von mindestens einem Zug bedient. Jeder Zug, der auf einer Strecke fährt, bekommt für diese Fahrt eine eigene Bezeichnung. - Bahnunternehmen besitzen Züge und bieten Verbindungen auf bestimmten Strecken an. - Reisende nutzen auf Strecken angebotene Züge. Der Preis für die Strecke mit dem Zug soll protokolliert werden. Reisende haben Namen. Ein Zug verkehrt nur auf einer Strecke, wenn mindestens 10 Reisende mitfahren. Aufgabe 2: Wir betrachten die Schüler-Datenbank mit den folgenden Tabellen: - Schüler(Snr, Vorname, Nachname, Geburtsdatum, Klasse): Persönliche Angaben zu den Schülern. - Abschlussnote(Snr, Fach, Note): Notenspiegel der Schüler. - RaumfRnr, Typ, Sitzplätze): Typ und Anzahl der Sitzplätze der Räume. - Raumbelegung(Klasse, Fach, Rnr): Raumbelegung nach Klassen und Fächern. Erstellen Sie in SQL folgende Anfragen: a) Bestimmen Sie alle Räume und die Anzahl ihrer Sitzplätze, in denen die Klasse ’7b’ Unterricht hat. b) Bestimmen Sie alle Paare von Schülern (jeweils gegeben durch die beiden Schülernummern), die in dieselbe Klasse gehen und am selben Tag Geburtstag haben. c) Bestimmen Sie die Durchschnittsnote des Schülers mit der Nummer ’1’. d) Bestimmen Sie die Fächer, in denen der Schüler mit der Nummer ’1’ seine schlechtesten Noten hat. Fortsetzung nächste Seite! Herbst 2014 Einzelprüfungsnummer 66116 Seite 3 Augabe 3: Wir erweitern die Datenbank aus Aufgabe 2 um die folgenden beiden Tabellen: - Fach(Fach, Fachbetreuer). - Klasse(Klasse, Klassleiter) a) Geben Sie ein ER-Diagramm für die erweiterte Datenbank an, in dem möglichst viele Relationen als Relationships modelliert sind. b) Geben Sie geeignete Create Table-Statements mit Primär- und Fremdschlüsselbedingungen zur Erzeugung der Tabellen Schüler, Abschlussnote und Fach an. c) Fügen Sie mit Hilfe eines SQL-Statements ein Attribut Ausbildungsrichtung mit einem geeigneten Wertebereich zur Tabelle Schüler hinzu. d) Löschen Sie alle Abschlussnoten von Schülern der Klasse ’9a’. Aufgabe 4: Gegeben seien die funktionalen Abhängigkeiten F={ B-.AC, | (i) BE-C, (ii) F - AE, (iii) DEF } (iv) der Relation R(A,B,C,D,E,F). a) Berechnen Sie eine kanonische Überdeckung F- von F. Geben Sie alle Zwischenschritte und die angewendeten Transformationen an. b) Geben Sie alle Kandidatenschlüssel für das Relationenschema R (jeweils mit Begründung) sowie die Nichtschlüsselattribute an. c) In welcher Normalform ist R? Geben Sie eine Begründung an. Fortsetzung nächste Seite! Herbst 2014 Einzelprüfungsnummer 66116 Seite 4 Teilaufgabe 2: Aufgabe 1: Gegeben sei folgendes UML-Klassendiagramm: unterstützt die Verdauung von» <> <> digestif _ Trinkbar Essbar ’ We i menge: long = 42L menge: String = "0.815 kg" Vodka a! verdauen (drinks:long): String verdauen (portionen:int): String menge: String = "3 Flaschen" A +verdauen (stamperl:int): String i77 1 return "dauert mehrere Stunden”; l +verdauen (humpen:long): String MilchShake <> return "ist unverdaulich"; - - ObstGericht menge: String = "1 Becher" bananen: String = "Hola Chica" bananen: int = 4711 „laktosefrei: boolean = false +verdauen (portionen:int): String +verdauen (portionen:long): String P——L>Jreturn Integer.toString(bananen); return Long.toString(portionen); +schaelen fel:int): Strin +schaelen(aepfel:long): rin return "Apfelringe”; return "Apfelmus“; +schaelen(birnen:String): String +schaelen(birnen:String): String return "Birnenringe”; return "Birnenmus”; Zur besseren Lesbarkeit ist die abstrakte Klasse ObstGericht zusätzlich mit dem Stereotyp <> gekennzeichnet. Die return-Zeile der jeweiligen Methode ist als Kommentar unmittelbar unter der Methodensignatur kursiv angegeben. a) Angenommen, die Klasse Mahlzeit mit der folgenden Methode liegt mit den Klassen aus dem obigen UML-Diagramm im gleichen package. Geben Sie zu jeder System.out.printin-Zeile die jeweils zu erwartende Ausgabe des Programms während der Ausführung an: public static void main(String[] args) { ey Trinkbar tv = new Vodka(); System.out.printin(tv.verdauen(1)); [RR A I / Trinkbar tm = new MilchShake(); System.out.printin(tm.menge) ; System.out.printin(tm. verdauen(2));- ObstGericht om = new MilchShake(); System.out.printin(om.menge); System.out.printin(om.bananen); System.out.printin(om.verdauen(3)); System.out.printin(om.schaelen(Integer..MAX_VALUE + 123)); System.out.printin(om.schaelen("Kiwi")); b) Geben Sie eine Implementierung der Schnittstelle Essbar in einer geeigneten objektorientierten Programmiersprache Ihrer Wahl an. c) Geben Sie nun eine Implementierung der Klasse MilchShake in der vorangehend gewählten Programmiersprache an. d) Jemand möchte „Island Breeze“ als Unterklasse von Vodka und MilchShake modellieren, schließlich enthält der genannte Cocktail sowohl Vodka als auch Milch und Banane. Wieso ist das keine gute Idee, wenn Java die Zielsprache ist? In welcher gängigen Programmiersprache wäre das kein Problem? Fortsetzung nächste Seite! Herbst 2014 Einzelprüfungsnummer 66116 Seite 5 Aufgabe 2: In dieser Aufgabe sollen Sie einen abstrakten Datentypen (kurz: ADT) Stechuhr zur Arbeitszeiterfassung mit folgenden Vereinfachungen spezifizieren und umsetzen: Die Stechuhr wird jeweils um Mitternacht ausgelesen und zurückgesetzt — zu einer Zeit, zu der sich kein Mitarbeiter mehr im Gebäude aufhalten darf. Daher muss beim Ermitteln der arbeitszeit (des heutigen Tages) nur das letzte Paar an Ein- und Ausbuchungsvorgängen berücksichtigt werden. Ein- und Ausbuchungszeiten sowie Arbeitszeiten werden in der Einheit „Minuten seit 0:00 Uhr des laufenden Tages“ vom Typ Long verarbeitet und gespeichert. Mitarbeiter werden über ihren Personalstammdatensatz identifiziert, der garantiert eineindeutig ist und dessen ADT (vereinfacht) wie folgt aussieht: adt Mitarbeiter sorts Mitarbeiter, String, Long ops einstellen: String x Long — Mitarbeiter // Konstruktor name: Mitarbeiter — String id: Mitarbeiter — Long // eindeutige Kennung axs name(einstellen(n, i)) =n id(einstellen(n, i)) = i id(einstellen(n, i)) = id(einstellen(m, j)) Stechuhr // Konstruktor axs end Stechuhr Für die ADTs String und Long stehen alle bekannten Operationen zur Verfügung. a) b) Ergänzen Sie den obigen Ausschnitt der algebraischen Spezifikation des ADTs Stechuhr um die notwendigen Signaturen und Axiome folgender Operationen: i) einbuchen: vermerkt die Ankunftszeit eines Mitarbeiters (beide als Parameter übergebenen) in „Minuten seit 0:00 Uhr des laufenden Tages“ ii) ausbuchen: wie einbuchen, nur für das Verlassen des Gebäudes ii) leeren: setzt die Stechuhr zurück (nach dem Auslesen um Mitternacht) iv) arbeitszeit: bestimmt die heutige Arbeitszeit (Datentyp: Long) eines (als Parameter übergebenen) Mitarbeiters Hinweis: Sie dürfen bei Bedarf zusätzlich auch Hilfsoperationen ergänzen! Geben Sie eine Implementierung des ADT Mitarbeiter in einer geeigneten objektorientierten Programmiersprache Ihrer Wahl an. Der Konstruktor einstellen des ADTs soll in der implementierten Klasse sowohl durch den Konstruktor selbst als auch durch eine gleichnamige Klassenmethode umgesetzt werden. Stellen Sie in der Klasse Mitarbeiter außerdem eine Methode Long getNewID() bereit, die bei jedem Aufruf eine neue eindeutige ID generiert. Fortsetzung nächste Seite! Herbst 2014 Einzelprüfungsnummer 66116 Seite 6 Aufgabe 3: Gegeben seien folgende Java-Methode sowie ihre Vor- und Nachbedingung: public static long funI(final int n) { /* P*/long a=1,b=6; P=nz] for (int i = @; i ae — R4al Cm) Cm) ra o L R4a2 N ( 2 ) Sn _ RS aa) Fortsetzung nächste Seite! ll Herbst 2014 Einzelprüfungsnummer 66116 Seite 10 Aufgabe 3: Gegeben ist folgender Auszug aus einer Datenbank zur Verwaltung von Kochrezepten: Autor (ID, Vorname, Nachnane) Rezept (Rezeptnummer, Name, Verfasser[Autor], Beschreibung) Zutat (Bezeichnung, Einkaufspreis) Rezept _ Zutat (Rezept [Rezept], Zutat[Zutat], Menge) Primärschlüssel sind unterstrichen, Fremdschlüssel dadurch gekennzeichnet, dass hinter ihnen in eckigen Klammern der Name der Relation angegeben ist, auf die sie sich beziehen. Verwenden Sie bei der Formulierung der Anfragen nur standardkonformes SQL. Die Verwendung von Views ist erlaubt und empfohlen. a) Schreiben Sie SQL-Statements, die die Tabellen zu den oben angegebenen Relationen anlegen. Sie können beliebige sinnvolle Datentypen wählen. Denken Sie auch an die Schlüssel und referentiellen Beziehungen. b) Schreiben Sie ein SQL-Statement, das Vor- und Nachname des Autors mit der ID 42 ausgibt. c) Schreiben Sie ein SQL-Statement, das alle Autoren, die weniger als 10 Rezepte verfasst haben, ausgibt, sortiert nach der Anzahl der von ihnen verfassten Rezepte. Ausgegeben werden soll die Anzahl der verfassten Rezepte, sowie Vor- und Nachname des Autors. Auch Autoren, die keine Rezepte verfasst haben, sollen in der Ausgabe enthalten sein. d) Schreiben Sie eine SQL-Anfrage, die die Namen aller Rezepte zusammen mit der Anzahl verschiedener für sie benötigter Zutaten ausgibt, absteigend sortiert nach Anzahl der Zutaten. e) Schreiben Sie eine SQL-Anfrage, die die Top-Ten der Rezepte mit den höchsten Zutatenkosten ausgibt. Die Kosten eines Rezepts berechnen sich als Summe über das Produkt aus Menge und Einkaufspreis aller Zutaten. Ausgegeben werden soll der Name des Rezepts, die Kosten und der Rang (1 = teuerstes Rezept bis 10), aufsteigend sortiert nach Rang. Gehen Sie davon aus, dass keine zwei Rezepte gleiche Kosten aufweisen. Verwenden Sie keine nicht-standardisierten Erweiterungen, wie rownum und ebenfalls nicht das Schlüsselwort fetch! Aufgabe 4: a) Von wann bis wann werden von einer Transaktion verwendete Sperren gehalten (dynamisches Sperren)? Begründen Sie, warum genau diese Zeitpunkte sinnvoll sind. b) Bei der Transaktionsverarbeitung kann es zu Verklemmungen (Deadlocks) kommen. Erklären Sie anhand eines Beispiels, wie diese entstehen können. Erläutern Sie, wie ein Datenbankverwaltungssystem diese Situation erkennen und was es tun kann, um eine Verklemmung aufzulösen. Gehen Sie auch auf die entstehenden Konsequenzen ein. Fortsetzung nächste Seite! Herbst 2014 Einzelprüfungsnummer 66116 Seite 11 Teilaufgabe 2: Aufgabe 1: In Abbildung 1 ist eine Version des Algorithmus von Euklid zur Berechnung des größten gemeinsamen Teilers zweier ganzer, positiver Zahlen angegeben. Der Algorithmus nimmt als Eingabe eine ganze Zahl A>0 undeine ganze Zahl B>0 . Nach Ausführen des Algorithmus soll der größte gemeinsame Teiler von A und B in der Variable a stehen. Die Funktion ggt(A,B) bezeichnet dabei eine Funktion die den größten gemeinsamen Teiler zweier ganzer, positiver Zahlen A und B berechnet. {A>0aB>0} a:=A; b:=B: while (a # b) { if (a>b) { a:=a—b; } else { b:=b-a; } {a = ggt( A, B)} Abbildung 1 Zeigen Sie die korrekte Funktionsweise des Algorithmus. Führen Sie dabei folgende Schritte aus': 1. Geben Sie die Schleifeninvariante an. 2. Annotieren Sie das Programm unter Verwendung von Hoare Logik. 3. Begründen Sie für jede Anwendung der Konsequenzregel, warum die Implikation gilt. Fortsetzung nächste Seite! - Sie dürfen dabei die Funktion ggl verwenden. Herbst 2014 Einzelprüfungsnummer 66116 Seite 12 Aufgabe 2: Sie sollen das Design für ein einfaches Wahlsystem entwerfen. Das System soll dabei die Verteilung der Stimmen auf die einzelnen Parteien ermöglichen. Zusätzlich soll es verschiedene Darstellungen dieser Daten erlauben: Eine Tabelle, in der die Daten gelesen und auch eingegeben werden können, und ein Diagramm als alternative Darstellung der Informationen. Das System soll mit dem ModelView-Controller Muster modelliert werden. 1. Beschreiben Sie das Model-View-Controller Muster: a. Beschreiben Sie das Problem, welches das Muster adressiert. b. Beschreiben Sie die Aufgaben der Komponenten, die im Muster verwendet werden. 2. Modellieren Sie das System unter Anwendung des Musters: a. Entwerfen Sie ein UML Klassendiagramm. b. Implementieren Sie eine setup-Methode, die das Objektmodell erstellt. Fortsetzung nächste Seite! Herbst 2014 Einzelprüfungsnummer 66116 Seite 13 Aufgabe 3: Im Folgenden ist ein Algorithmus angegeben, der für eine positive Zahl until die Summe aller Zahlen bildet, die kleiner als until und Vielfache von vier oder sechs sind. Für nicht positive Zahlen soll 0 zurückgegeben werden. Der Algorithmus soll also folgender Spezifikation genügen: until > 0 => specialSums(until) = > {y|0 specialSums(until) = 0 wobei % den Modulo-Operator bezeichnet. public static long specialSums (int until) 1. long sum = 6; 2. if (until > 8) {_ 3 for (int i = 1; i <= until; i++) { 4 if (i%4=s+@ || i%6==6) { 5. sum += i; 6 } 7. } 8. } 9. return sum; Abbildung 2: Algorithmus specialsums Beachten Sie, dass der Algorithmus nicht der Spezifikation genügt. Der Fehler liegt in der Bedingung der for-Schleife (Zeile 3). Der Fehler kann jedoch einfach korrigiert werden indem die Bedingung i