Klausur Pr12 im WS'07/'08

Aufgabe 1 (ca. 12 Programmzeilen): Steuern Sie einen Eimer mit einem Knopf in einer Mehrzweckklasse. Beim Drücken des Knopfes soll der Eimer (je nach Zustand) gefüllt oder entleert werden. Verwenden Sie dabei keine if-Anweisung. Sie brauchen hierfür folgende Klassen:

class Frame { void add(Button knopf); … }
class Button { void addActionListener(ActionListener lauscher); … }
interface ActionListener { void actionPerformed(ActionEvent e); … }
class Eimer { void fuellen() throws VollAusnahme; void entleeren() throws LeerAusnahme; }

Aufgabe 2 (ca. 11 Strukturelemente): Zeichnen Sie die Objektstruktur (alle Variablen, Objekte, Werte) in der Aufgabe 1. Wenn Sie sie nicht gelöst haben (0 Punkte), können Sie eine Ersatzaufgabe bekommen.


Aufgabe 3 (7-10 Pro­gramm­zeilen): Die Funktion integral berechnet den bestimmten Integral einer beliebigen double-Funktion mit einem double-Parameter, wie z.B. java.lang.Math.sqrt (für die Berechnung von Quadratwurzeln) oder Math.sin (für die Berechnung von Sinus-Werten). Ihre Signatur ist:

static double integral(Funktion funktion, double von, double bis); // im Intervall von - bis

Funktion ist dabei eine Schnittstelle, deren Implementierung die zu integrierende Funktion enthält:

interface Funktion { double funktion(double x); };

Implementieren Sie nun diese Schnittstelle zweimal (für die beiden Funktionen Math.sqrt und Math.sin) und testen Sie beide Implementierungen in einer main-Methode, indem sie darin die Methode integral für das Intervall 0 bis 1 zweimal aufrufen und das Ergebnis auf die Konsole ausgeben.

Bemerkung: Die Aufgabe erfordert keinerlei Mathematik-Kenntnisse. Sie müssen nicht wissen, wie ein Integral berechnet wird. Sie müssen nur wissen, wie eine Schnittstelle implementiert und eine Funktion aufgerufen wird.


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

(     )     Richtig            Die Größe des Reihungsobjekts in einem Vector-Objekt wird bei Bedarf verändert.
(     )     Falsch

Grund:                                                                                                                                                                                                        

(     )     Richtig            Durch die Anweisung for(print(1); print(2); print(3)) print(4)
(     )     Falsch             werden die Zahlen in der Reihenfolge 1 2 4 3 durch print() ausgegeben.

Grund:                                                                                                                                                                                                        

(     )     Richtig            Der Operator + ist nicht für alle primitive Typen definiert.
(     )     Falsch            

Grund:                                                                                                                                                                                                        

(     )     Richtig            Wenn im catch-Block keine throw-Anweisung steht,
(     )     Falsch             erfährt der Benutzer nichts von der Ausnahmesituation.

Grund:                                                                                                                                                                                                        

(     )     Richtig            Die Veränderung an einer Parametervariable bleibt lokal.
(     )     Falsch            

Grund:                                                                                                                                                                                                        

(     )     Richtig            In einer static-Methode kann kein this verwendet werden.
(     )     Falsch            

Grund:                                                                                                                                                                                                        

(     )     Richtig            for (i = 1; i <= 10; i++) meldung("nächste Zahl = " + i);
(     )     Falsch             ist keine Zählschleife (ist nicht garantiert endlich)

Grund:                                                                                                                                                                                                        

(     )     Richtig            Parametervariablen können unter Umständen auf der Halde gespeichert werden.
(     )     Falsch            

Grund:                                                                                                                                                                                                        


Aufgabe 5 (ca. 6 Programmzeilen): Schreiben Sie eine void-Methode ziffern, die die Ziffern einer zweistelligen natürlichen Zahl errechnet. Sie soll überprüfen, ob sie als Eingabedaten (vom Typ int) eine korrekte Zahl erhalten hat. Als Ausgabedaten (vom Typ char[]) soll sie die beiden Ziffern (Zehner und Einser, z.B. '5' und '2' für die Eingabe 52) produzieren. Für die Berechnung verwenden Sie nur Ganzzahl-Operatoren wie +, / und %. (Tipp: '5' kann als (char)('0'+wert) berechnet werden, wenn  int wert == 5).

Positionieren Sie Ihre Methode in der folgenden Tabelle für Datenfluss:

Eingabe

Ausgabe         

Parameter

call by value

Parameter

call by reference

globale Variable

Funktionswert

 

 

 

Parameter

 

 

 

globale Variable