TECHNISCHE UNIVERSITÄT UNIVERSITÄT SOFIA TECHNISCHE SOFIA Fakultät für deutsche Ingenieur- und Betriebswirtschaftsausbildung Fakultät für deutsche Ingenieur- und Betriebswirtschaftsausbildung Doz. Dr.- Ing. St. Maleshkov Doz. Dr. - Ing. D. Jetchev Informatik II WS03/04 Klausur Februar Klausurblatt 06.02.2004 Dauer 60 Minuten, Punkte: max 60 (davon 55 von dem Klausulblatt und 5 Bonuspunkte von der Hausarbeit) Aufgabe 1 Wissensfragen (7 Punkte) richtig falsch Behauptung X Die Komplexität eines Problems ist bestimmt durch den Algorithmus, der das Problem mit dem geringsten Aufwand löst X Bei schwach typisierten Programmsprachen werden Typfehler zur Laufzeit des Programms nicht erkannt X Mit dem Modifikator protected versehene Java-Methoden sind nur in der Klasse verwendbar, in der sie definiert wurden X Eine Klasse kann mehrere Methoden mit gleichem Namen und verschiedenen Parametern haben X Eine Klasse kann Konstruktoren mit unterschiedlichen Namen haben X Der Konstruktor einer Klasse darf nicht den Konstruktor einer anderen Klasse aufrufen X Nach einer implements-Klausel folgt der Name einer Schnittstelle X Abstrakte Klassen können nicht instantiert werden X Ein Objekt kann als Objekt einer abstrakten Klasse deklariert werden X Die Höhe eines Knotens entspricht der minimalen Anzahl der Kanten des Pfades zu einem von diesem Knoten aus erreichbaren Blatt X Threads können den Adressraum mit anderen Threads nicht teilen. X Threads werden in Java durch Objekte der Klasse java.lang.Thread realisiert. X Die Grundformen vom Datenaustausch bei Interaktion zwischen Prozessen sind: Kommunikation und Kanal. X Die Grundformen der Kommunikation bei Interaktion zwischen Prozessen sind: Kanal und Tor. Aufgabe 2 Algorithmus, Programm (8 Punkte) In den Übungen wurde ein Paket für geometrische Figuren vorbereitet. Zu der abstrakten Klasse GeometrischesObjekt wurden die Subklassen Dreieck, Viereck, Rechteck, Ellipse, Neck geschrieben. Um die Objekte zu zeichnen, wurde ein Inteface ZeichnenGO implementiert, wo nur die Methode paint(Graphics g) definiert wurde. Bei der konkreten Klasse ZeichnenNeck extends Neck implements ZeichnenGO wurde die Methode paint(Graphics g) geschrieben, wo auf Basis der Information für die Koordinaten der Punkte in eckpunkteZ[] zwei neue Reihungen int mx[] und my[] definiert wurden und das Zeichnen mit der Methode g.drawPolygon(mx, my, anzahl) ausgeführt wurde. Schreiben Sie eine Methode paint(Graphics g) der neuen Klasse ZeichnenNstern extends Nstern implements ZeichnenGO, um einen Stern mit n-Eckpunkten zeichnen zu können. Regel: Jeder Eckpunkt wird nicht mit dem nächsten Eckpunkt verbunden (wie bei den n-Ecken), sondern immer mit dem übernächsten. Es ist ein Unterschied beim Zeichen, wenn die Anzahl der Eckpunkte eine gerade oder eine ungerade Zahl ist. Musterlösung: public void paint(Graphics g) int mx[], my[], i, j; mx = new int[anzahl]; my = new int[anzahl]; if(anzahl % 2 == 1) { j=-2; for (i=0; i<anzahl; i++) { j=j+2; if(j>anzahl) j=1; mx[i] = eckpunkteZ[j].x; my[i] = eckpunkteZ[j].y; } g.drawPolygon(mx, my, anzahl); }else { j=-2; int anz=anzahl/2; for (i=0; i<anz; i++) { j=j+2; mx[i] = eckpunkteZ[j].x; my[i] = eckpunkteZ[j].y; } g.drawPolygon(mx, my, anz); j=-1; for (i=0; i<anz; i++) { j=j+2; mx[i] = eckpunkteZ[j].x; my[i] = eckpunkteZ[j].y; } g.drawPolygon(mx, my, anz); } } { Aufgabe 3 Verifikation ( 6 Punkte) Gegeben ist der Programmabschnitt: if(a<b) { c=a; a=b; b=c; } System.out.println("Der Wert “+a+“ist > als "+b) ; Definieren Sie den logischen Ausdruck für die Nachbedingung. Machen Sie den wp-Kalkül und definieren Sie die Vorbedingung für den Programmabschnitt. Musterlösung: Nachbedingung: a>b wp(if a<b then {c=a; a=b; b=c}, a>b) = (a<b ⇒wp({c=a; a=b; b=c},a>b)) ∧ (a≥b ⇒ a>b) = (a<b ⇒wp({c=a; a=b},wp(b=c, a>b))) ∧ a>b = (a<b ⇒wp({c=a; a=b},a>c)) ∧ a>b = (a<b ⇒ wp({c=a},wp(a=b,a>c))) ∧ a>b = (a<b ⇒ wp(c=a,b>c)) ∧ a>b = (a<b ⇒ b>a) ∧ a>b = a<b ∧ a>b = a≠b 2 Oder: Nachbedingung: a>b wp(if a<b then {c=a; a=b; b=c}, a>b) = [a<b ∧wp({c=a; a=b; b=c},a>b)] ∨ [a≥b ∧ a>b] = [a<b ∧wp({c=a; a=b},wp(b=c, a>b))] ∨ [a>b] = [a<b ∧wp({c=a; a=b},a>c)] ∨ [a>b] = [a<b ∧ wp({c=a},wp(a=b,a>c))] ∨ [a>b] = [a<b ∧ wp(c=a,b>c)] ∨ [a>b] = [a<b ∧ b>a] ∨ [a>b] = (a<b ∧ a>b) = a≠b Aufgabe 4 Aufwandschätzung (6 Punkte) a) Matrix c ist Produkt von den Matricies a und b. Im Allgemeinfall ist Matrix a[n,k], Matrix b[k,m], Matrix c[n,m]. Jedes Element der Matrix c bekommt man als Summe: k ci , j ai ,l .bl , j l 1 Bestimmen Sie die Anzahl der Schritte T(p) für die Berechnung der ganzen Matrix c. Wie wird p definiert? Geben Sie eine möglichst niedrige obere Schranke im O-Kalkül für die Funktion. b) Ein Programm besteht aus 5 logisch nacheinderfolgenden Teilen, dessen Aufwand mit den Funktionen ausgedrückt wird: g1(n)=n+log2n g2(n)=n2+n g3(n)=2n g4(n)= n.log2n g5(n)=3n2. Sortieren Sie die Teile dem Aufwand nach. Geben Sie eine möglichst niedrige obere Schranke für das ganze Programm. Musterlösung : a) Die Berechnung hängt von den 3 Parametern n, m, k ab. Der Parameter p wird gleich dem maximalen von den drei definiert. Die Berechnung von einem Element ist: T(p)= 2.p Die Berechnung der ganzen Matrix erfordert T(p)= 2.p3 Dann in O-Notation: 2.p3 = O(p3) b) Sortierung: g1(n) ≤ g4(n) ≤ g2(n) ≤ g5(n) ≤ g3(n) Für das ganze Programm gilt: g1(n) + g2(n) + g3(n) + g4(n) + g5(n) Es ist zulässig, O-Notation auf die einzelne Programmteile zu definieren: g1(n)=n+log2n = O(2n) g2(n)=n2+n = O(n2) g3(n)=2n = O(2n) g4(n)= n.log2n = O(n1.5) g5(n)=3n2 = O(n2) Dann: O(2n + n2 + 2n + n1.5 + n2) = O(2n) Aufgabe 5 Graphen (6 Punkte) Es ist ein Graph mit Kantengewichten gegeben. V 13 5 A B 8 2 1 3 D C 4 3 Berechnen Sie für den Knoten V die kürzesten Pfade zu allen anderen Knoten nach dem Algorithmus von Dijkstra. Bei jedem Schritt werden der besuchte Knoten und die bis zu diesem Moment bekannten Längen bestimmt. Füllen Sie die nachfolgende Tabelle. Musterlösung: Schritt Ausgewählter Bereits besuchte Pfadlänge zum Knoten im aktuellen Schritt Knoten Knoten V A B C D 1 V 0 5 13 ∞ ∞ 2 A {V} 0 5 13 8 13 3 C {V, A} 0 5 10 8 12 4 B {V, A, C} 0 5 10 8 11 5 D {V, A, C, B} 0 5 10 8 11 Aufgabe 6 Datenstrukturen, Implementierung (12 Punkte) Für Bearbeitung von Warteschlangen wird verketttete Liste benützt. Die Implementierung wird einfacher als die in den Vorlesungen und Übungen erläuterte LinkedList gemacht, da die notwendigen Grundoperationen sind: - Erstellen einer neuen Schlange - Einfügen eines neuen Elements nur am Anfang der Schlange - Entfernen eines Elements nur am Ende der Schlange - Überprüfen, ob die Schlange leer ist. Schreiben Sie die Java-Programme für : a. Die Klasse Entry mit Klassenvariablen element und next und mit einem Konstruktor mit Parametern element und next b. Die Klasse Schlange , Deklaration nur von header c. ----- Der Konstruktor : leer d. ----- Die Methode addAnfang(Object o), die ein Objekt o am Anfang einfügt e. ----- Die Methode get(), die Endelement von der Schlange entfernt und zurückgibt. f. ----- Die Methode isEmpty(), die die Überprüfung macht, ob die Schlange leer ist. Musterlösung: import java.util.*; public class Schlange { // Aufgabe 6a private static class Entry { Object element; Entry next; Entry (Object element, Entry next) { this.element = element; this.next = next ; } } // Aufgabe 6b, c private Entry header = new Entry(null, null); public Schlange() { } // Aufgabe 6d public boolean addAnfang(Object o) { Entry newEntry=new Entry(o, header.next); header.next=newEntry; return true; } 4 //Aufgabe 6e public Object get () { Entry p1, p2; Object o=null; if (!isEmpty()) { p1=header; p2=p1.next; if(p2.next==null) { o=p2.element; header.next=p2.next; }else { for (; p2.next != null; ) { p1=p1.next; p2=p2.next; } o=p2.element; p1.next=p2.next; } } return o; } // oder mit einem Entry public Object get1 () { Entry p; Object o=null; if (!isEmpty()) { p=header; if(p.next.next==null) { o=p.next.element; header.next=p.next.next; }else { for (; p.next.next != null; ) { p=p.next; } o=p.next.element; p.next=p.next.next; } } return o; } //Aufgabe 6f public boolean isEmpty() { return header.next==null; } } 5 Aufgabe 7 Objektorientierte Programmierung - UML Auftrag Empfangsdatum istVorausbezahlt anzahl: String preis: Geld * (10 Punkte ) Kunde 1 name adresse Kreditwürdigkeit():String ausführen() abschließen() 1 Firmenkunde Privatkunde kreditkartennr unternehmensname kreditwürdigkeit kreditlimit erinnern() forderungenImMonat(Integer) Positionen * Verkäufer Antragsteller Auftragsposition menge: Integer preis: Geld istGeliefert: Boolean IMF Uni Karlsruhe * 0..1 * 1 Quelle:[FowSco-98] Produkt RPK Uni Karlsruhe Auf dem Bild oben ist ein UML Diagram dargestellt. Beantworten Sie die Fragen: a. Nennen Sie die Art dieses UML Diagramms. b. Was wird mit diesem Diagramm beschrieben? c. Was stellt „Kunde“dar? d. Nennen Sie die Attribute des “Auftrag“. e. In welcher Beziehung stehen „Firmenkunde“ und „Privatkunde“ zu „Kunde“? f. Womit ist die Assoziation zwischen Auftrag und Kunde beschrieben. Erläutern Sie den Sinn dieser Beschreibung. Musterlösung: a. Das ist ein Klassendiagramm. b. Das Digramm beschreibt die Assoziationen zwischen Produkt – Auftragpositionen – Auftrag einerseits und Verkäufer – Firmenkunde – Privatkunde – Kunde andererseits. Oben ist die Assotion Auftrag – Kunde. Das Diagramm beschreibt die Auftragsbearbeitung. c. “Kunde” ist ein Klassenname. d. Die Attribute des “Auftrags” sind: Empfangsdatum, istVorausbezahlt, anzahl (String?), preis (Geld). e. “Privatkunde” und “Firmenkunde” vererben “Kunde”. f. Die Assotion Auftrag – Kunde ist mit der Kardinalität *:n beschrieben. Bedeutung: * - von einem Kunden können viele Aufträge ausgehen; 1 – ein Auftrag stammt genau von einem Kunden. 6 Quelle:[FowSco -98] : Auftragserfassungsfenster 1: bereiteVor () : Auftrag 5: erfordertNachbestellung := nachbestellungErforderlich () 2: [für jede Auftragsposition]: bereiteVor () 3: imLagerVorhanden := check() 4: [imLagerVorhanden ]:entferne() SchraubePosition : Auftragsposition 7: [imLagerVorhanden ]: new : Lieferartikel IMF Uni Karlsruhe SchraubeImLager : Lagerartikel 6: [erfordert Nachbestellung]: new : Nachbestellartikel RPK Uni Karlsruhe Auf dem Bild oben ist ein weiteres UML Diagram dargestellt. Beantworten Sie die Fragen: a. Nennen Sie die Art dieses UML Diagramms. b. Was wird mit diesem Diagramm beschrieben? c. Wie wird der zeitliche Verlauf der Verarbeitung der einzelnen Objekte dargestellt? d. Unter welchen Bedingungen und was für Nachrichten werden dem Objekt „SchraubeImLager“ gesendet? Musterlösung: a. Das ist ein Kollabarationsdiagramm. b. Das Diagramm beschreibt die Verarbeitung eines Auftrags: Das Auftragserfassungsfenster sendet eine Nachricht “bereiteVor” an einen Auftrag. Der Auftrag sendet dann “bereiteVor” an jede Auftragsposition des Auftrags. Jede Auftragsposition prüft den angegebenen Lagerartikel. c. Der zeitliche Verlauf wird mit dem Pfeil beschrieben. d. Beim Prüfen der Auftragposition ”Schraube” ist festgestellt, dass die Menge der Lagerartikel unter die Bestellgrenze gafallen ist. Dann wird die Nachricht gesendet: “Nachbestellung erforderlich”. 7