Beispiellösung der Klausur zu Objektorientierte Programmierung mit Java 09. Juli 2004 (SS 2004)



Ähnliche Dokumente
Java: Vererbung. Teil 3: super()

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Java Kurs für Anfänger Einheit 5 Methoden

Einführung in die Java- Programmierung

Einführung in die Programmierung

Programmierkurs Java

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

Programmieren in Java

Klausur zur Einführung in die objektorientierte Programmierung mit Java

Klausur zur Einführung in die objektorientierte Programmierung mit Java

Objektorientierte Programmierung. Kapitel 12: Interfaces

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 6

2A Basistechniken: Weitere Aufgaben

Es sollte die MS-DOS Eingabeaufforderung starten. Geben Sie nun den Befehl javac ein.

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Professionelle Seminare im Bereich MS-Office

Jetzt sollt ihr von der Vorlage der Grundversion 1.0 ein eigenes Textadventure erstellen.

Objektorientierte Programmierung

5. Abstrakte Klassen. Beispiel (3) Abstrakte Klasse. Beispiel (2) Angenommen, wir wollen die folgende Klassenhierarchie implementieren:

Zählen von Objekten einer bestimmten Klasse

Software Engineering Klassendiagramme Assoziationen

SEP 114. Design by Contract

Klausur WS 2006/07 Programmiersprache Java Objektorientierte Programmierung II 15. März 2007

5. Abstrakte Klassen

Klausurteilnehmer. Wichtige Hinweise. Note: Klausur Informatik Programmierung, Seite 1 von 8 HS OWL, FB 7, Malte Wattenberg.

Was meinen die Leute eigentlich mit: Grexit?

Praktikum zu Einführung in die Informatik für LogWiIngs und WiMas Wintersemester 2015/16. Vorbereitende Aufgaben

Übungsblatt 3: Algorithmen in Java & Grammatiken

Prof. Dr. Uwe Schmidt. 21. August Aufgaben zur Klausur Objektorientierte Programmierung im SS 2007 (IA 252)

Software Engineering Klassendiagramme Einführung

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster

Mit der Maus im Menü links auf den Menüpunkt 'Seiten' gehen und auf 'Erstellen klicken.

Studentische Lösung zum Übungsblatt Nr. 7

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Kapitel 6. Vererbung

Kapitel 6. Vererbung

1. Man schreibe die folgenden Aussagen jeweils in einen normalen Satz um. Zum Beispiel kann man die Aussage:

5. Tutorium zu Programmieren

Übungen zur Vorlesung Einführung in die Informatik Wintersemester 2010/11

Drei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 16: 3-Schichten-Architektur 1 Fachkonzept - GUI

13. Tutorium zu Programmieren

Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden.

Programmieren I. Strategie zum Entwurf von Klassen. Beispiele. Design von Klassen. Dr. Klaus Höppner. Beispiel: Bibliothek

Institut für Programmierung und Reaktive Systeme 25. August Programmier-Labor Übungsblatt. int binarysearch(int[] a, int x),

Universität Augsburg, Institut für Informatik Sommersemester 2005 Prof. Dr. Werner Kießling 16. Juli 2005 Dr. Alfons Huhn, Timotheus Preisinger

Einführung in die Java- Programmierung

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Probeklausur: Programmierung WS04/05

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = Euro ergeben.

Übersicht. Informatik 2 Teil 3 Anwendungsbeispiel für objektorientierte Programmierung

Zeichen bei Zahlen entschlüsseln

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:

Institut für Programmierung und Reaktive Systeme 26. April Programmieren II. 10. Übungsblatt

DHBW Karlsruhe, Vorlesung Programmieren, Klassen (2)

Kapitel 6. Vererbung

Prinzipien Objektorientierter Programmierung

50. Mathematik-Olympiade 2. Stufe (Regionalrunde) Klasse Lösung 10 Punkte

Objektorientierte Programmierung für Anfänger am Beispiel PHP

Whitepaper. Produkt: combit Relationship Manager 7. combit Relationship Manager -rückläufer Script. combit GmbH Untere Laube Konstanz

Seite 1 von 14. Cookie-Einstellungen verschiedener Browser

Excel Pivot-Tabellen 2010 effektiv

Vorkurs C++ Programmierung

Testklausur 1 zur Vorlesung. Modellierung und Programmierung I. Dr. Monika Meiler Zeit: 60 Minuten

Java Projekt: Tic Tac Toe + GUI

Steganos Secure Schritt für Schritt-Anleitung für den Gastzugang SCHRITT 1: AKTIVIERUNG IHRES GASTZUGANGS

Fachdidaktik der Informatik Jörg Depner, Kathrin Gaißer

Diplomvorprüfung in Datenverarbeitung EBS Sommersemester 2002

Bauteilattribute als Sachdaten anzeigen

4. BEZIEHUNGEN ZWISCHEN TABELLEN

Dokumentation für das Spiel Pong

Folge 19 - Bäume Binärbäume - Allgemeines. Grundlagen: Ulrich Helmich: Informatik 2 mit BlueJ - Ein Kurs für die Stufe 12

Probeklausur Softwareengineering SS 15

Aufgabenblatt Nr. 5 Generizität und TicTacToe

Übungen Programmieren 1 Felix Rohrer. Übungen

Stapelverarbeitung Teil 1

Dokumentation des Projektes Tic Tac Toe

Erstellen eines Screenshot

Lehrer: Einschreibemethoden

Große Übung Praktische Informatik 1

Folge 18 - Vererbung

Programmiervorkurs SS 2011 Technische Universität Darmstadt Jan Hendrik Burdinski, Felix Kerger

Internet Explorer Version 6

Zimmertypen. Zimmertypen anlegen

So gehts Schritt-für-Schritt-Anleitung

Informatik 2 Labor 2 Programmieren in MATLAB Georg Richter

3 Objektorientierte Konzepte in Java

ACDSee 10. ACDSee 10: Fotos gruppieren und schneller durchsuchen. Was ist Gruppieren? Fotos gruppieren. Das Inhaltsverzeichnis zum Gruppieren nutzen

Übung Grundlagen der Programmierung. Übung 03: Schleifen. Testplan Testergebnisse

Gliederung Grundlagen Schlüsselworte try-catch Fehlerobjekte Fehlerklassen Schlüsselwort finally Schlüsselwort throws selbst erstellte Exceptions

DAUERHAFTE ÄNDERUNG VON SCHRIFTART, SCHRIFTGRÖßE

Second Steps in eport 2.0 So ordern Sie Credits und Berichte

Objektorientierte Programmierung

Erstellen einer Collage. Zuerst ein leeres Dokument erzeugen, auf dem alle anderen Bilder zusammengefügt werden sollen (über [Datei] > [Neu])

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 22

Innere Klassen in Java

Ordner Berechtigung vergeben Zugriffsrechte unter Windows einrichten

Access und die andern (Office) Programme. Armin Hess

Import des persönlichen Zertifikats in Outlook 2003

Objektorientierte Software-Entwicklung

Einstellungen im Internet-Explorer (IE) (Stand 11/2013) für die Arbeit mit IOS2000 und DIALOG

Transkript:

Beispiellösung der Klausur zu Objektorientierte Programmierung mit Java 09. Juli 2004 (SS 2004) A Bearbeitungszeit: 120 Minuten NICHT MIT BLEISTIFT SCHREIBEN! Name: Vorname: Matrikelnummer: Nr Max Bewertung 1 8 xxxxx (a) 6 xxxxx (b) 2 xxxxx 2 9 xxxxx (a) 3 xxxxx (b) 3 xxxxx (c) 2 xxxxx (d) 1 xxxxx 3 9 xxxxx Nr Max Bewertung 4 14 xxxxx (a) 5 xxxxx (b) 4 xxxxx (c) 1 xxxxx (d) 4 xxxxx 5 12 xxxxx 6 18 xxxxx 7 10 xxxxx (a) 2 xxxxx (b) 8 xxxxx Summe 80 Bitte benutzen Sie für die Lösungen den freigelassenen Platz nach der jeweiligen Angabe oder die Rückseite unter Angabe der Aufgabe. Nennen Sie möglichst alle Annahmen, die Sie für die Lösung einer Aufgabe treffen! Bei den vorgegebenen Programmen wurden die include-zeilen der Übersicht halber weggelassen. Viel Erfolg!

1 Aufgabe 1 (8 Punkte) Der Einstiegspunkt in ein Java-Programm ist üblicherweise die folgende Methode: public static void main( String[] args ) Diese Methode befindet sich in einer Klasse, die dem Java-Interpreter als Argument übergeben wird. (a) 6 Punkte Erklären Sie kurz die Bestandteile public, static und void des Methodenkopfes. public zeigt an, daß die Methode nach außen hin bekannt ist. static zeigt an, daß es sich um eine Klassenmethode und nicht um eine Instanzmethode handelt; ihre Verwendung ist also nicht an ein Objekt der Klasse gebunden. void zeigt an, daß die Methode keinen Rückgabewert besitzt.

2 (b) 2 Punkte Das Array args enthält die Kommandozeilenparameter (falls welche vorliegen). Angenommen, wir schreiben ein Java-Programm, das ausschließlich ohne Argumente aufgerufen werden wird. Ist dann anstatt des oben angegebenen Methodenkopfes auch der folgende zulässig? Begründen Sie Ihre Antwort! public static void main() Zulässig ist er insoweit zwar schon, als daß der Compiler keine Fehlermeldung produzieren wird. Ein Problem bekommen wir jedoch zur Laufzeit: Da in Java zur Signatur einer Methode neben dem Methodennamen und dem Rückgabewert auch die Parameterliste gehört, sind die obigen Methoden (mit bzw. ohne Parameterliste) aus Sicht des Java-Interpreters unterschiedlich. Er benötigt zur Ausführung eines Programms aber unbedingt eine Methode mit der Signatur public static void main( String[] args ) Kann er diese nicht finden, so gibt er eine entsprechende Fehlermeldung aus. Also: Auch wenn die Kommandozeilenparamter nicht gebraucht werden, müssen sie dennoch in der Signatur aufgeführt werden!

3 Aufgabe 2 (9 Punkte) Gegeben sei die Java-Klasse Obscure.java (siehe Programmtext 2.1 auf Seite 4): (a) 3 Punkte Beschreiben Sie kurz, welche Ausgabe sich der Programmierer dieser Klasse wohl gewünscht hat (entweder mit eigenen Worten oder als Bildschirmausgabe)! zero entspricht 0 one entspricht 1 two entspricht 2 three entspricht 3

4 Programm 2.1 Obscure.java import java.util.*; public class Obscure { public static HashMap hm = new HashMap(); public static String[] NumString = new String[4]; public static void fillhashmap() { for ( int i = 0; i < 4; i++ ) { hm.put( NumString[i], i ); public static void printhashmap() { for ( int i = 0; i < 4; i++ ) { String temp = NumString[i]; System.out.println( temp + "\tentspricht\t" + hm.get( temp ) ); public static void main ( String[] args ) { NumString[0] = "zero"; NumString[1] = "one"; NumString[2] = "two"; NumString[3] = "three"; fillhashmap(); printhashmap();

5 (b) 3 Punkte Der Dokumentation der Klasse HashMap entnehmen Sie, dass diese Klasse u. A. folgende Methoden besitzt: public Object remove(object key) public boolean containskey(object key) public Object put(object key, Object value) public Object get(object key) Beim Compilieren stellen Sie fest, daß der Compiler folgende Fehlermeldung produziert: theseus$ javac Obscure.java Obscure.java:10: cannot resolve symbol symbol : method put (java.lang.string,int) location: class java.util.hashmap hm.put( NumString[i], i ); ˆ 1 error Diese hat ihre Ursache in der Methode fillhashmap(). Was führt in dieser Methode zur einer Fehlermeldung? Lösung: Dieses Programm ist nicht lauffähig, weil die Methode put() der Klasse HashMap die folgende Signatur besitzt: public Object put(object key, Object value) Das heißt insbesondere, daß als Wert Objekte übergeben werden müssen, im obigen Programm wird aber ein primitiver Datentyp übergeben. Der Compiler findet also keine passende Methode und bricht den Übersetzungsvorgang mit der zitierten Fehlermeldung ab.

6 (c) 2 Punkte Geben Sie nun an, welche Änderung vorgenommen werden muß, damit das Programm lauffähig wird! In der Methode fillhashmap() muß die HashMap unter Verwendung einer sogenannten Wrapperklasse gefüllt werden. Wrapperklassen transformieren primitive Datentypen in Objekte. Eine HashMap erwartet sowohl für den Schlüssel als auch für den Wert Objekte, in der Impementierung aus der Aufgabenstellung wird aber versucht, als Wert eine Integer-Variable (und damit also kein Objekt) zuzuweisen. Zur Lösung dieses Problems muß die relevante Zeile der Methode in abgeändert werden. hm.put( NumString[i], new Integer(i) ); (d) 1 Punkte Wie ist der Fachbegriff in Java, auf den es bei dieser Änderung ankommt? Wrapperklasse

7 Aufgabe 3 Gegeben seien die Klasse A, (9 Punkte) package a; public class A { private int x; protected int y; public int z; public void print() { System.out.println(x); // (1) System.out.println(y); // (2) System.out.println(z); // (3) die Klasse B package b; import a.a; public class B extends A { public void print() { System.out.println(x); // (4) System.out.println(y); // (5) System.out.println(z); // (6) und die Klasse C. package c; import b.b; public class C { public static void main(string[] args) { B b = new B(); System.out.println(b.x); // (7) System.out.println(b.y); // (8) System.out.println(b.z); // (9) Kreuzen Sie in der folgenden Tabelle an, ob der Compiler die Anweisung mit der jeweiligen Nummer akzeptiert oder eine Fehlermeldung wegen dieser Anweisung ausgibt.

8 Anweisung akzeptiert meldet Fehler (1) X (2) X (3) X (4) X (5) X (6) X (7) X (8) X (9) X Richtige Kreuze bringen einen Punkt, falsche Kreuze führen zu Punktabzug!

9 Aufgabe 4 Gegeben sei die folgende Klasse Quadrat: (14 Punkte) Programm 4.2 Quadrat.java public class Quadrat { protected int len; // Seitenlaenge Quadrat( int len ) { this.len = len; public int getarea() { return len * len; (a) 5 Punkte Erweitern Sie diese Klasse so, daß eine neue Klasse Rechteck entsteht (die neben der Seitenlänge auch eine Seitenhöhe besitzt). Schreiben Sie den dazu notwendigen Konstruktor und überschreiben Sie die Methode getarea(). public class Rechteck extends Quadrat { protected int height; /* Seitenhoehe, die Seitenlaenge haben wir bereits in der Oberklasse */ Rechteck ( int len, int height ) { super(len); this.height = height; public int getarea() { return len * height;

10 (b) 4 Punkte Gegeben sei die folgende main()-methode: Programm 4.3 Eine main()-methode public static void main ( String[] args ) { Rechteck q1 = new Rechteck(2,4); System.out.println(q1.getArea()); Quadrat q2 = q1; System.out.println(q2.getArea()); Geben Sie an, welche Methoden-Implementierungen bei q1.getarea() und bei q2.getarea() aufgerufen werden und wie die Ausgabe aussieht. Begründen Sie Ihre Antwort. (Sie können selbstverständlich davon ausgehen, daß die main()-methode in eine öffentlich zugängliche Klasse geschrieben wurde und die Klassen Quadrat und Rechteck zur korrekten Verwendung vorliegen.) 8 8 (c) 1 Punkte Wie heißt der objektorientierte Mechanismus, der bei q2.getarea() zum Tragen kommt? Polymorphie

11 (d) 4 Punkte Um die Gleichheit zweier Quadrat-Instanzen zu überprüfen verwendet man die Methode equals() (der Klasse Quadrat). Diese bekommt als Parameter ein Objekt der Klasse Object übergeben, das mit Hilfe des Operators instanceof dahingehend überprüft wird, zu welcher Klasse es gehört. Implementieren Sie in der nachfolgenden Methode equals den Teil, der zum Vergleich zweier Objekte der Klasse Quadrat relevant ist: Programm 4.4 Die equals()-methode public boolean equals ( Object obj ) { if ( obj instanceof Quadrat ) { /* Das hier ist nun Ihr Teil!!! */ else { return super.equals(obj); public boolean equals ( Object obj ) { if ( obj instanceof Quadrat ) { Quadrat q = (Quadrat) obj; return (len == q.len); else { return super.equals(obj);

12 Aufgabe 5 (12 Punkte) Gegeben sei die folgende Klasse UseComplex.java (siehe Programm 5.5 auf Seite 12. Programm 5.5 UseComplex.java public class UseComplex { public static void main ( String[] args ) { // Zwei Objekte der komplexen Zahlen anlegen Complex z1 = new Complex(5, 7); Complex z2 = new Complex(7, 2); /* Komplexe Zahl ausgeben */ System.out.println( "Ausgabe von z1: "+z1 ); System.out.println( "Ausgabe von z2: "+z2 ); /* Eine komplexe Zahl mit einem Skalar (Integer) multiplizieren und das Ergebnis ausgeben */ Complex z3 = z1.multiplyby( 5 ); System.out.println( "5 * z1 ergibt: "+z3 ); /* Zwei komplexe Zahlen multiplizieren und das Ergebnis ausgeben */ Complex z4 = z1.multiplyby( z2 ); System.out.println( "z1 * z2 ergibt: "+z4 ); Dieses Programm verwendet die Klasse Complex, welche die komplexen Zahlen darstelle. Es produziert die folgende Ausgabe: theseus$ java UseComplex Ausgabe von z1: 5 + i*7 Ausgabe von z2: 7 + i*2 5 * z1 ergibt: 25 + i*35 z1 * z2 ergibt: 21 + i*59

13 Schreiben Sie die Klasse Complex.java mit allen notwendigen Variablen und Methoden, die dazu nötig sind, um das gegebene Programm 5.5 lauffähig zu machen. Erläuterungen zu komplexen Zahlen: Eine komplexe Zahl (x, y) besteht stets aus einem Realteil x und einem Imaginärteil y, die beide jeweils R sind. Eine gebräuchliche Darstellung einer komplexen Zahl z ist: z = x + i y Die Addition zweier komplexer Zahlen ist komponentenweise definiert, das heißt: (a, b) + (c, d) = (a + c, b + d) Die Multiplikation einer komplexen Zahl (x, y) mit einem Skalar λ R ist ebenfalls komponentenweise definiert: λ (x, y) = (λ x, λ y) Die Multiplikation zweier komplexer Zahlen (a 1, b 1 ), (a 2, b 2 ) ist wie folgt definiert: (a 1, b 1 ) (a 2, b 2 ) = (a 1 a 2 b 1 b 2 + i (a 1 b 2 + b 1 a 2 )) Zur Vereinfachung können Sie für diese Aufgabe annehmen, daß für eine komplexe Zahl (x, y) gilt: x, y N!

14 Programm 5.6 Complex.java public class Complex { private int real, im; public Complex(int a, int b) { real = a; im = b; public Complex add( Complex b ) { return new Complex( this.real+b.real, this.im+b.im ); public Complex multiplyby( int b ) { return new Complex( this.real*b, this.im*b ); public Complex multiplyby( Complex b ) { return new Complex( this.real*b.real - this.im*b.im, this.real*b.im + this.im*b.real ); public String tostring() { return new String ( "" + this.real + " + i*" + this.im );

15 Aufgabe 6 (18 Punkte) Implementieren Sie unter Verwendung von javax.swing die folgende grafische Applikation XTrans (mit einem Fenster, das die folgenden beiden Gestalten haben kann):

16

17 = Erklärung: Die Anwendung soll aus zwei grafischen Widgets (einem Kombinationsfeld und einer Schaltfläche) bestehen. Das Kombinationsfeld enthält eine Auflistung von Strings (hier: Hund, Katze, Maus bzw. Dog, Cat, Mouse ) Bei jedem Anklicken der Schaltfläche soll die Sprache für 1. den Inhalt des Kombinationsfeldes sowie 2. die Aufschrift der Schaltfläche von Deutsch nach Englisch bzw. umgekehrt geändert werden. Desweiteren soll Ihre Anwendung beim Anklicken des entsprechenden Symbols in der Titelzeile des Fensters geschlossen werden. Eventuell könnte Ihnen die folgende Methode für JComboBox-Objekte hilfreich sein: public void setmodel(comboboxmodel amodel) Sets the data model that the JComboBox uses to obtain the list of items. Parameters: amodel - the ComboBoxModel that provides the displayed list of items aus: Java-Dokumentation, http://java.sun.com

18 Lösung: import java.awt.*; import java.awt.event.*; import javax.swing.*; public class XTrans { public static void main ( String[] args ) { /* Zwei Stringarrays vorbereiten (fuer deutschen bzw. englischen Inhalt) */ final String[] animalsenglish = { "Dog", "Cat", "Mouse" ; final String[] animalsgerman = { "Hund", "Katze", "Maus" ; final DefaultComboBoxModel animalsmodelgerman = new DefaultComboBoxModel( animalsgerman ); final DefaultComboBoxModel animalsmodelenglish = new DefaultComboBoxModel( animalsenglish ); // Das Fenster (besser: den Frame) vorbereiten JFrame frame = new JFrame(); frame.setdefaultcloseoperation( JFrame.EXIT_ON_CLOSE ); frame.getcontentpane().setlayout( new GridLayout( 0,1 ) ); /* Die beiden grafischen Widgets erzeugen und dem Frame hinzufuegen /* final JComboBox cmbbox = new JComboBox( animalsmodelgerman ); final JButton button = new JButton( "Switch to English" ); frame.getcontentpane().add( cmbbox ); frame.getcontentpane().add( button ); // Aktion fuer Anklicken der Schaltflaeche waehlen ActionListener al = new ActionListener() { public void actionperformed ( ActionEvent e ) { if (e.getactioncommand().indexof( "English" )!= -1) { button.settext( "In Deutsch umschalten" ); cmbbox.setmodel( animalsmodelenglish ); if (e.getactioncommand().indexof( "Deutsch" )!= -1) { button.settext( "Switch to English" ); cmbbox.setmodel( animalsmodelgerman );

19 ; button.addactionlistener( al ); // Das Uebliche zum Anzeigen frame.pack(); frame.show();

20 Aufgabe 7 (10 Punkte) Gegeben ist die Schnittstelle der folgenden Java-Klasse: public class StringOps { public static String concat(string s1, String s2); Die Methode concat() hängt einfach die beiden Strings aneinander und gibt das Ergebnis zurück. (a) 2 Punkte Geben Sie zwei verschiedenartige Testfälle für die Methode concat() an (und noch kein Java-Programm!). Lösungsvorschlag: s1 s2 erwartete Ausgabe a a (b) 8 Punkte Implementieren Sie diese zwei Testfälle als JUnit-Tests in der eigenen Klasse StringOpsTest. Geben Sie die vollständige Implementierung (inkl. import- Anweisung) an. Gestalten Sie die Implementierung so, dass ggf. auch (ohne Änderung der Klasse) nur einer der beiden Testfälle ausgeführt werden könnte. import junit.framework.*; public class StringOpsTest { public StringOpsTest(String s) { super(s); public void testzerozero() { String result = StringOps.concat("", ""); String expected = ""; assertequals(expected, result); public void testzeroone() { String result = StringOps.concat("", "a"); String expected = "a"; assertequals(expected, result);