Klausur Pr21 SS 01


Unterlagen und Hilfsmittel sind nicht zugelassen. Kommunikation während der Klausur ist nur mit dem Dozenten erlaubt, der Missverständnisse und Unklarheiten klären kann. Schrei­ben Sie die Lösungen auf leere nummerierte Blätter mit Ihrem Namen; kennzeichnen Sie die Aufgabennummer eindeutig. Geben Sie alle Blätter (auch die Schmier­blät­ter) ab. Für falsche oder nicht einleuchtende Lösungen be­kommen Sie grund­sätzlich kei­ne Punk­te. Wenn aber aus Ihren Notizen oder Be­merkungen er­sicht­lich ist, dass Ihr Gedankengang richtig war, kön­nen Sie Teilpunkte bekommen. Sie ver­lie­ren jedoch diese Möglichkeit, wenn Abschreiben oder Kommu­ni­ka­ti­on wäh­rend der Klau­­sur nachgewiesen werden kann. Der Kern der Fragen wurde kursiv gesetzt. Bei manchen Aufgaben steht als Orientierungder Anzahl der Programmzeilen in der Musterlösung. In den letzten 15 Minuten werden keine Fragen mehr beant­wor­tet..


Aufgabe 1: Erweitern Sie die Klasse GanzWS (ähnlich wie Warteschlange in der Übung, jedoch nicht für Object sondern für int) um eine Methode posit, die dafür sorgt, dass alle Zahlen in der Warteschlange nichtnegativ werden (d.h. das Vorzeichen der negativen Zahlen wird verändert). Die Datenstruktur der Klasse (Implementiert als Ringpuffer) ist:

class GanzWS {
   protected int[] inhalt;
   protected int juengster, aeltester, anzahl;
   ...

Kommentieren Sie in Ihrer Lösung, wie werden folgenden Sonderfälle bearbeitet:
1. Die Warteschlange ist leer
2. Alle Zahlen sind positiv


Aufgabe 2: Betrachten Sie folgende Datenstruktur eines Kreuzgangs (aus alten Klostern):

class Quadrat {
   class Position { int x, y; };
   class Farbe { int[]rgb = new int[3]; }; // rot, gruen, blau 
   Position linksOben, rechtsUnten; // Ecken des Quadrats
   Farbe linie, flaeche; }
class Kreuzgang extends Quadrat {
   static int nummer; // Zähler für erzeugte Objekte
   Quadrat inneresQuadrat; }
class ZweiKreuzgaenge {
   public static void main (String[] args) {
     Kreuzgang links = new Kreuzgang(),
        rechts = new Kreuzgang(); ... } }

Die Algorithmen (Methoden und Anweisungen) lassen wir außer Acht. Zeichnen Sie nun die Datenstruktur (Vari­ablen und Objekte mit Inhalt) des obigen Programms (main). Einfachheitshalber reicht es, die innere Struktur der Objekte jeder Klasse nur einmal zu zeichnen (auch wenn es mehrere Objekte von der Klasse gibt). Schreiben Sie die Namen der Variablen und die Klassen der Objekte zu den dazugehörigen Symbolen. Verwenden Sie in der Zeichnung folgende Symbole: Objekt = Wolke • Referenzvariable = kleines Quadrat • Basistyp-Variable = kleines Rechteck • Referenz = Pfeil.


Aufgabe 3. (40 Punkte, 15 Min): Kreuzen Sie die richtigen Antworten an und geben Sie Ihre Begründung mit Stich­worten dazu. Ohne Begründung gilt Ihre Antwort als falsch.

(     )     Richtig            Die Konvertierung von Referenzen geschieht in Java immer automatisch.
(     )     Falsch

Grund:                                                                                                                                                                                                        

(     )     Richtig            Die Standard-Multibehälter aus dem Paket java.util sind polymorphe Multibehälter
(     )     Falsch             (und keine generische)

Grund:                                                                                                                                                                                                        

(     )     Richtig            In ein ObjectOutputStream müssen alle Objekte einer Datenstruktur (z.B. eines Stapels)
(     )     Falsch             einzeln mit writeObject übertragen werden.

Grund:                                                                                                                                                                                                        

(     )     Richtig            Auf einen Knopfdruck (JButton) können mehrere Lauscher reagieren.
(     )     Falsch            

Grund:                                                                                                                                                                                                        

(     )     Richtig            Um die Länge einer verketteten Liste zu ermitteln,
(     )     Falsch             muss man alle Knoten durchlaufen.

Grund:                                                                                                                                                                                                        

(     )     Richtig            reihung.length kann zu verschiedenen Zeiten verschiedene Werte (mal 10, mal 20) liefern,
(     )     Falsch             obwohl die Länge von Reihungen nicht verändert werden kann.

Grund:                                                                                                                                                                                                        

(     )     Richtig            Es ist möglich, dass r1.equals(r2) true liefert,
(     )     Falsch             r1.deepEquals(r2) (die tiefe Gleichheit) aber false

Grund:                                                                                                                                                                                                        

(     )     Richtig            Die Reihungsimplementierung eines Multibehälters braucht weniger Speicherplatz
 (    )     Falsch             als die Listenimplementierung.

Grund:                                                                                                                                                                                                        


Aufgabe 4: Schreiben Sie eine Methode mit fußgesteuerter Schleife (do-while) und Fallunterscheidung (switch), die dasselbe tut wie die folgende Methode mit for-Schleife (keine Zählschleife!) und Verzweigung (if):

void einszweidrei(char par) {
   boolean steuerung = true;
   for (System.out.println("eins"); steuerung; System.out.println("zwei")) {
     System.out.println("drei"); steuerung = false; }
   if (par == 'a') System.out.println("aaa");
   else if (par == 'e') System.out.println("aaa");
   else if (par == 'p') System.out.println("ppp"); }

Aufgabe 5.: Farbmulti ist die Schnittstelle der Klassen Farbmenge und Farbsack; sie enthält die Methoden eintragen, entfernen, vorhanden (mit jeweils einem Parameter vom Typ Farbe – ähnlich wie in der Übung). Schreiben Sie nun eine boolean-Methode istFarbmenge mit einem Farbmulti-Parameter, die feststellt, ob der Parameter ein Farmenge- oder ein Farbsack-Objekt ist. Ihre Methode soll keine if-Anweisung enthalten.