Fachhochschule Esslingen Hochschule für Technik Sommersemester 2010 Zahl der Blätter: 13 Blatt Nummer: 1 Studiengang: Wirtschaftsinformatik Fachnummer:1 WF 2061/-62/-63 Prüfungsfach: Softwareentwicklung Vertiefung Semester: 2 Hilfsmittel: Notizen, Skript mit Übungen, ein Buch nach Wahl Zeit: Name: Vorname: 90 Minuten Matr.Nr.: Teil 1: Grundlegende Eigenschaften der Sprache Java [25P] Aufgabe 1.1 Datentypen [10P] Beantworten Sie die folgenden Fragen und geben Sie ggf. ein geeignetes Codebeispiel an. In Java gibt es zwei verschiedene Arten von Datentypen. Nennen Sie diese und erläutern Sie deren Unterschiede bei Zuweisungen anhand der Ausgaben des folgenden Codebeispiels. int x1 = 7; int x2 = x1; x2 = 42; System.out.println( x1); // Ausgabe = 7 (0,5P) List l1 = new ArrayList(); List l2 = l1; l1.add( "foo"); l2.add( "bar"); System.out.println( l1); // Ausgabe = [foo, bar] (0,5P) In Java gibt es primitive Datentypen (Werte) und Referenztypen (Objekte). Bei der Zuweisung von primitiven Datentypen wird eine Kopie des Werts erzeugt - dannach gibt es also zwei Werte. Daher bleibt der Originalwert bei Änderungen der Kopie erhalten. Bei der Zuweisung von Referenztypen wird eine Kopie der Referenz erzeugt - es gibt weiterhin nur ein Objekt. Daher wirken sich auch alle Änderungen über eine der Variablen stets auf das gemeinsame Objekt aus. Was passiert bei einem typecast (je nach Art des Datentyps) und wann ist ein solcher notwendig? Bei primitiven Datentypen findet durch den cast eine Umwandlung des Werts statt. Diese ist immer dann explizit notwendig, wenn dabei Genauigkeit (Wertebereich, Kommastellen) verlorengeht. Bei Referenztypen findet durch den cast eine Reinterpretation des Objekts statt. Diese ist immer dann explizit notwendig, wenn der Zieldatentyp weiter unten in der Vererbungshierarchie steht. Kennzeichnen Sie im folgenden Code diejenigen Stellen, bei denen ein typecast erforderlich ist. public class WorldChampionship extends Tournament { // ... Klassendefinition, je 0,5P für richtige Einstufung bzw. Begründung public static void main( String[] args) // (1) typecast erforderlich [ ] ja / String sport = "" + 's' + 'o' + 'c' + // (2) typecast erforderlich [X] ja / int year = 2006 + 4.0; // (3) typecast erforderlich [ ] ja / Tournament t = new WorldChampionship( // (4) typecast erforderlich [ ] ja / Object o = t; // (5) typecast erforderlich [X] ja / WorldChampionship w = o; } } { [X] nein; Grund = String-Addition 'c' + 'e' + 'r'; [ ] nein; Grund = loss of precision [X] nein; Grund = upcast "Soccer", year); [X] nein; Grund = upcast [ ] nein; Grund = downcast Fachhochschule Esslingen Hochschule für Technik Sommersemester 2010 Zahl der Blätter: 13 Blatt Nummer: 2 Studiengang: Wirtschaftsinformatik Fachnummer:1 WF 2061/-62/-63 Prüfungsfach: Softwareentwicklung Vertiefung Semester: 2 Hilfsmittel: Notizen, Skript mit Übungen, ein Buch nach Wahl Zeit: Name: Vorname: 90 Minuten Matr.Nr.: Aufgabe 1.2 Kontrollstrukturen [9+3P] Vereinfachen Sie folgende Beispiele durch Umstellung oder Ersatz der Kontrollstruktur. Zusatzfrage: Geben Sie die Bedeutung/Funktion des jeweiligen Codestücks an (1 Satz). 01: 02: 03: 04: 05: 06: 07: 08: 01: 02: 03: 04: 05: public boolean isValueOdd( int value) { if ( value%2==0) { return false; } else { return true; } public boolean isValueOdd( int value) { return value%2!=0; // oder: !(value%2==0) bzw. (value%2==1) } Bedeutung/Funktion: [2+1] Prüft, ob der übergebene Wert eine ungerade Zahl ist. 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: public String expandResultCode( char code) { if ( code=='w') { return "win"; } else if ( code=="l") { return "loss"; } else if ( code=="d") { return "draw"; } else { return "unknown"; } } public String expandResultCode( char code) { switch ( code) { case 'w': return "win"; case 'l': return "loss"; case 'd': return "draw"; default: return "unknown"; } } Bedeutung/Funktion: [3+1] Übersetzt ein Code-Zeichen in ein verständliches Wort Fachhochschule Esslingen Hochschule für Technik Sommersemester 2010 Zahl der Blätter: 13 Blatt Nummer: 3 Studiengang: Wirtschaftsinformatik Fachnummer:1 WF 2061/-62/-63 Prüfungsfach: Softwareentwicklung Vertiefung Semester: 2 Hilfsmittel: Notizen, Skript mit Übungen, ein Buch nach Wahl Zeit: Name: 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 01: 02: 03: 04: 05: 06: 07: 08: 09: Vorname: 90 Minuten Matr.Nr.: public int countOccurrences( int[] values, int targetValue) { int j=0; int count=0; while ( j<values.length) { if (values[j]==targetValue) count++; j++; } return count; } public int countOccurrences( int[] values, int targetValue) { int count = 0; for ( int value : values) { if ( value==targetValue) count++; } return count; } Bedeutung/Funktion: [4+1] Zählt, wie oft der Zielwert in dem Array von Werten vorkommt. Aufgabe 1.3 Collections und Generics [6P] Beantworten Sie die folgenden Fragen zum Thema Generics Welche Vor- und Nachteile haben Collections gegenüber Arrays bzgl. Größe und Typsicherheit? Arrays sind typsicher, haben aber eine feste Größe. Collections sind variabel aber nicht typsicher. In welcher Hinsicht stellen Generics eine Verbesserung gegenüber klassischen Collections dar? Generics stellen Typsicherheit her indem der Typ der Elemente einer Collection festgelegt wird. Geben Sie ein Coding zur Verwendung von Generics an, welches den schreibenden und lesenden Zugriff auf eine Map darstellt, bei der sowohl die Schlüssel als auch die Werte von Typ String sind. import java.util.*; public class Generics { public static void main( String[] args) { Map<String,String> map = new HashMap<String,String>(); // 1P map.put( "key", "value"); // 1P String value = map.get( "key"); // 1P } } Fachhochschule Esslingen Hochschule für Technik Sommersemester 2010 Zahl der Blätter: 13 Blatt Nummer: 4 Studiengang: Wirtschaftsinformatik Fachnummer:1 WF 2061/-62/-63 Prüfungsfach: Softwareentwicklung Vertiefung Semester: 2 Hilfsmittel: Notizen, Skript mit Übungen, ein Buch nach Wahl Zeit: Name: Vorname: 90 Minuten Matr.Nr.: Teil 2: Elementare Bibliothekskomponenten [10P] Aufgabe 2.1 [2P] Die Klasse Math bietet für vielfältige Berechnungen statische Methoden. Geben Sie ein Beispiel mit passendem Methodenaufruf an. Wieviele Instanzen der Klasse Math gibt es? // Math.sqrt() liefert die Wurzel eines double-Werts zurück (hier: 2.0) double d1 = 4.0; double d2 = Math.sqrt( d); Die Klasse Math bietet ausschließlich statische Methoden und kann nicht instantiiert werden. Aufgabe 2.2 [2P] In Java existieren für alle primitiven Datentypen sog. Wrapper Klassen. Wofür braucht man diese im Zusammenhang mit Collections? Welche Rolle spielt dabei das sog. Autoboxing? Die Wrapperklassen dienen dazu, primitive Werte als Objekt zu verpacken. Dies ist z.B. für Collections notwendig, da diese nur Objekte speichern können. Durch Autoboxing wird dem Programmierer das explizite ein- und auspacken mit "new" und "getXYValue()" erspart. Aufgabe 2.3 [2P] Welches Interface muss implementiert werden, damit Objekte in einem Stream gespeichert werden können? Welche Stream Klasse verwendet man dafür? Um Objekte in einem Stream speichern zu können muss das leere Marker Interface Serializable implementiert werden. Dieses zeigt lediglich an, dass die Speicherung gewollt bzw. erlaubt ist. Die eigentliche Umsetzung übernimmt die Klasse ObjectOutputStream auf generische Art und Weise. Aufgabe 2.4 [4P] Geben Sie ein Coding (inkl. Exception Handling!) für eine Methode mit zwei Parametern an, die das übergebene Objekt in eine Datei mit dem ebenfalls angegebenen Namen schreibt. public void saveObject( Object obj, String filename) throws IOException { FileOutputStream fos = new FileOutputStream( filename); ObjectOutputStream oos = null; try { oos = new ObjectOutputStream( fos); oos.writeObject( obj); } finally { // Lösung aus dem Lehrbuch: try { // 1. Aufrufer informieren if ( null!=oos) { // 2. Ressourcen aufräumen oos.close(); // 3. Fehler in finally ignorieren } else { fos.close(); } } catch ( IOException ex) { // ignore } } } Fachhochschule Esslingen Hochschule für Technik Sommersemester 2010 Zahl der Blätter: 13 Blatt Nummer: 5 Studiengang: Wirtschaftsinformatik Fachnummer:1 WF 2061/-62/-63 Prüfungsfach: Softwareentwicklung Vertiefung Semester: 2 Hilfsmittel: Notizen, Skript mit Übungen, ein Buch nach Wahl Zeit: Name: Teil 3: Vorname: 90 Minuten Matr.Nr.: Entwicklung einfacher Java-Programme [5P] Aufgabe 3.1 Auswertung der Gruppenspiele bei der Fußball WM [5P] Implementieren Sie die Methode, welche den Gruppensieger ermittelt. Vereinfachte FIFA Regeln zur Ermittlung des Gruppensiegers: 1. Zuerst zählen natürlich die erzielten Punkte. 2. Bei Punktgleichheit entscheidet dann die Tordifferenz. Datei: Mannschaft.java public class Mannschaft { String name; int punkte, tore, gegentore; public Mannschaft( String name) { this.name = name; } // get-Methoden() für alle Basiseigenschaften und die Tordifferenz } Datei: Gruppe.java public class Gruppe { String name; Mannschaft[] mannschaften = new Mannschaft[4]; // Methoden zum anlegen und verwalten (hier ohne Belang) // Annahme: alle Mannschaften definiert, alle Spiele gelaufen public Mannschaft gruppensiegerErmitteln() { Mannschaft sieger = mannschaften[0]; for ( int i=1; i<mannschaften.length; ++i) { Mannschaft kandidat = mannschaften[i]; if ( kandidat.getPunkte() > sieger.getPunkte()) { sieger = kandidat; } else if ( kandidat.getPunkte() == sieger.getPunkte()) { if ( kandidat.getTordifferenz() > sieger.getTordifferenz()) { sieger = kandidat; } } } return sieger; } } Fachhochschule Esslingen Hochschule für Technik Sommersemester 2010 Zahl der Blätter: 13 Blatt Nummer: 6 Studiengang: Wirtschaftsinformatik Fachnummer:1 WF 2061/-62/-63 Prüfungsfach: Softwareentwicklung Vertiefung Semester: 2 Hilfsmittel: Notizen, Skript mit Übungen, ein Buch nach Wahl Zeit: Name: Vorname: 90 Minuten Matr.Nr.: Teil 4: GUI Layout und Verständnis einfacher Komponenten [15P] Aufgabe 4.1 [3P] Ordnen Sie die folgenden Klassen/Interfaces den richtigen Paketen zu (1) JPanel (a) java.awt (2) MouseListener (b) java.awt.event (3) FlowLayout (c) javax.swing Lösung: 1c, 2b, 3a Aufgabe 4.2 Verhalten von Layout Managern [7P] Analysieren Sie das folgende Programm und skizzieren sie Lage und Größe der Inhalte des im folgenden Code implementierten Fensters vor und nach der angedeuteten Vergrößerung. 01: 02: import java.awt.*; 03: import java.awt.event.*; 04: import javax.swing.*; 05: 06: public class Palette extends JFrame implements ActionListener { 07: 08: Color[] colors = new Color[] { 09: Color.BLACK, Color.WHITE, Color.RED, Color.BLUE, 10: Color.ORANGE, Color.GREEN, Color.YELLOW, Color.CYAN 11: }; 12: 13: public Palette() { 14: super( "Palette"); 15: setDefaultCloseOperation( DISPOSE_ON_CLOSE); 16: setLayout( new GridLayout(4,2,5,5)); 17: for ( Color color : colors) { 18: JButton button = new JButton( color.toString()); 19: button.setBackground( color); 20: button.addActionListener( this); 21: add( button); 22: } 23: pack(); 24: } 25: 26: public void actionPerformed( ActionEvent e) { 27: // use selected color 28: } 29: 30: } 31: Fachhochschule Esslingen Hochschule für Technik Sommersemester 2010 Zahl der Blätter: 13 Blatt Nummer: 7 Studiengang: Wirtschaftsinformatik Fachnummer:1 WF 2061/-62/-63 Prüfungsfach: Softwareentwicklung Vertiefung Semester: 2 Hilfsmittel: Notizen, Skript mit Übungen, ein Buch nach Wahl Zeit: Name: Vorname: 90 Minuten Matr.Nr.: Fenster in Normalgröße: Alle Buttons gleich groß, korrekte 4x2 Anordnung, Farben, Gaps Fenster nach Vergrößerung: Buttons gleichmäßig vergrößert, Gleiche Anordnung, Gaps gleich Fachhochschule Esslingen Hochschule für Technik Sommersemester 2010 Zahl der Blätter: 13 Blatt Nummer: 8 Studiengang: Wirtschaftsinformatik Fachnummer:1 WF 2061/-62/-63 Prüfungsfach: Softwareentwicklung Vertiefung Semester: 2 Hilfsmittel: Notizen, Skript mit Übungen, ein Buch nach Wahl Zeit: Name: Vorname: 90 Minuten Matr.Nr.: Aufgabe 4.3 Event Handling und Java2D [5P] Analysieren Sie den folgenden Quellcode und beantworten Sie die zugehörigen Fragen. 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: import java.awt.*; import java.awt.event.*; import javax.swing.*; public class TargetPractice extends JFrame { java.util.List<Point> points = new java.util.ArrayList<Point>(); 41: } 42: public TargetPractice() { super( "Target Practice"); setDefaultCloseOperation( EXIT_ON_CLOSE); getContentPane().addMouseListener( new MouseAdapter() { public void mouseClicked( MouseEvent e) { Point point = e.getPoint(); points.add( point); repaint( point.x-25, 20+point.y-25, 50, 50); } }); setSize( 400, 400); } public void paint( Graphics g) { Dimension d = getContentPane().getSize(); for ( int i=0; i<5; ++i) { // 5 Mal durchlaufen int dx = d.width/2 * (i+1)/6; // Teilung der halben Breite int dy = d.height/2 * (i+1)/6; // Teilung der halben Höhe g.setColor( i%2==0 ? Color.BLACK : Color.RED); // Farbwechsel g.fillOval( dx, 20+dy, d.width-2*dx, d.height-2*dy); // mittig } g.setColor( Color.WHITE); for ( Point point : points) { g.fillOval( point.x, 20+point.y, 10, 10); } } public static void main( String[] args) { new TargetPractice().setVisible( true); } Fachhochschule Esslingen Hochschule für Technik Sommersemester 2010 Zahl der Blätter: 13 Blatt Nummer: 9 Studiengang: Wirtschaftsinformatik Fachnummer:1 WF 2061/-62/-63 Prüfungsfach: Softwareentwicklung Vertiefung Semester: 2 Hilfsmittel: Notizen, Skript mit Übungen, ein Buch nach Wahl Zeit: Name: Vorname: 90 Minuten Matr.Nr.: Wieviele class-Dateien werden beim Kompilieren dieses Programms erzeugt? (1P) Es werden 2 class-Dateien erzeugt: TargetPractice.class TargetPractice$1.class (für den Listener). Skizzieren Sie die Darstellung des Fensters anhand der Methode paint() ? (2P) 5 Kreise rot/schwarz konzentrisch versetzt Welches Interface und welche Aufgabe hat der verwendete Listener? (1P) Der Listener ist ein MouseListener. Dieses Interface wird von der Klasse MouseAdapter implementiert. Dadurch muss man nur die nötigen Methoden selbst implementieren. Der Listener speichert die Position des Mausklicks als Punkt und löst eine Aktualisierung des Fensters in diesem Bereich aus. Die dadurch aufgerufene Methode paint() stellt die Punkte im Fenster dar. Ergänzen Sie die obige Skizze um die Wirkung des Listeners zu illustrieren (1P) Einige weisse Kreise zum Bild oben hinzufügen Fachhochschule Esslingen Hochschule für Technik Sommersemester 2010 Zahl der Blätter: 13 Blatt Nummer: 10 Studiengang: Wirtschaftsinformatik Fachnummer:1 WF 2061/-62/-63 Prüfungsfach: Softwareentwicklung Vertiefung Semester: 2 Hilfsmittel: Notizen, Skript mit Übungen, ein Buch nach Wahl Zeit: Name: Vorname: 90 Minuten Matr.Nr.: Teil 5: Verständnis komplexer GUI Komponenten [10P] Aufgabe 5.1 Model-View-Controller [10P] Vervollständigen Sie das auf der nächsten Seite angegebene TableModel, so dass es zur Erzeugung des unten dargestellten Fensters verwendet werden kann. Hinweise: • Der Name der Mannschaft soll aus dem verknüpften Mannschaftsobjekt kommen • keine der Spalten soll editierbar sein Datei: Mannschaft.java public class Mannschaft { String name; int punkte, tore, gegentore; // Konstruktor sowie get-Methoden() für alle Eigenschaften } Datei: Spieler.java public class Spieler { Mannschaft mannschaft; String vorname, name; boolean kapitän; // Konstruktor sowie get-Methoden für alle Eigenschaften } Fachhochschule Esslingen Hochschule für Technik Sommersemester 2010 Zahl der Blätter: 13 Blatt Nummer: 11 Studiengang: Wirtschaftsinformatik Fachnummer:1 WF 2061/-62/-63 Prüfungsfach: Softwareentwicklung Vertiefung Semester: 2 Hilfsmittel: Notizen, Skript mit Übungen, ein Buch nach Wahl Zeit: Name: Vorname: 90 Minuten Matr.Nr.: Datei: SpielerTableModel.java 01: 02: 03: import javax.swing.table.*; 04: 05: public class SpielerTableModel extends AbstractTableModel { 06: 07: String[] spalten = { "Vorname", "Name", "Mannschaft", "Kapitän"}; 08: Spieler[] spieler; 09: 10: public SpielerTableModel( Spieler[] spieler) { 11: this.spieler = spieler; 12: } 13: 14: public String getColumnName( int col) { 15: return spalten[col]; 16: } 17: 18: public int getColumnCount() { 19: return spalten.length; 20: } 21: 22: public int getRowCount() { 23: return spieler.length; 24: } 25: 26: public Class getColumnClass( int col) { 27: return ( col!=3 ? String.class : Boolean.class); 28: } 29: 30: public boolean isCellEditable( int row, int col) { 31: return false; 32: } 33: 34: public Object getValueAt( int row, int col) { 35: Spieler s = spieler[row]; 36: switch ( col) { 37: case 0: return s.getVorname(); 38: case 1: return s.getName(); 39: case 2: return s.getMannschaft().getName(); 40: case 3: return s.isKapitän(); 41: } 42: return null; 43: } 44: 45: } 46: Fachhochschule Esslingen Hochschule für Technik Sommersemester 2010 Zahl der Blätter: 13 Blatt Nummer: 12 Studiengang: Wirtschaftsinformatik Fachnummer:1 WF 2061/-62/-63 Prüfungsfach: Softwareentwicklung Vertiefung Semester: 2 Hilfsmittel: Notizen, Skript mit Übungen, ein Buch nach Wahl Zeit: Name: Vorname: 90 Minuten Matr.Nr.: Teil 6: Verständnis von Datenbanken [15P] Aufgabe 6.1 Datenmodellierung [10P] Beschreiben Sie grafisch oder textuell ein Datenbankschema (Tabellen und deren Spalten mit Typ) für den folgenden Sachverhalt und implementieren Sie die zugehörige Fachklasse (nur Klassenrumpf mit Attributen). Bedenken Sie dabei, dass aus techn. Gründen weitere (Schlüssel)eigenschaften notwendig sein können! Die Fragen in einem Quizspiel werden durch folgende Angaben beschrieben: 1. 2. 3. 4. Fragetext Texte für die Antwortmöglichkeiten 1-4 Nummer der richtigen Antwort Verweis auf die Kategorie Eine Kategorie wird durch folgende Angaben beschrieben: 1. Name 2. Schwierigkeitsgrad 1-3 Tabelle Frage: id INT AUTO_INCREMENT PRIMARY KEY fragetext VARCHAR antwort1 VARCHAR antwort2 VARCHAR antwort3 VARCHAR antwortnr INT kategorie_id INT REFERENCES Kategorie public class Frage { int id; String fragetext, antwort1, antwort2, antwort3; int antwortnr; Kategorie kategorie; } Tabelle Kategorie id INT AUTO_INCREMENT PRIMARY KEY name VARCHAR schwierigkeitsgrad INT public class Kategorie { int id; String name; int schwierigkeitsgrad; } je 0,5P pro Attribut in Schema und Coding Fachhochschule Esslingen Hochschule für Technik Sommersemester 2010 Zahl der Blätter: 13 Blatt Nummer: 13 Studiengang: Wirtschaftsinformatik Fachnummer:1 WF 2061/-62/-63 Prüfungsfach: Softwareentwicklung Vertiefung Semester: 2 Hilfsmittel: Notizen, Skript mit Übungen, ein Buch nach Wahl Zeit: Name: Vorname: 90 Minuten Matr.Nr.: Aufgabe 6.2 Datenbankabfragen [5P] Geben Sie geeignete SQL-Anweisungen für die angegebenen Teilaufgaben an Tabelle Mitarbeiter personalnr INT AUTO_INCREMENT PRIMARY KEY name VARCHAR dienstjahre INT gehalt DOUBLE Selektion aller Mitarbeiter, geordnet nach dienstjahren SELECT * FROM Mitarbeiter ORDER BY dienstjahre Selektion aller Mitarbeiter mit mehr als 10 Dienstjahren und Gehalt < 1000€ SELECT * FROM Mitarbeiter WHERE dienstjahre > 10 AND gehalt < 1000 Einfügen eines neuen Mitarbeiters "Mustermann" mit Gehalt 2500€ INSERT INTO Mitarbeiter (name, dienstjahre, gehalt) VALUES ( Mustermann', 0, 2500) Ein Jahr vergeht... Änderung der Dienstjahre von "Mustermann" von 0 auf 1 UPDATE Mitarbeiter SET dienstjahre=1 WHERE name = 'Mustermann' Änderung des Gehalts von "Mustermann" auf 2600€ UPDATE Mitarbeiter SET gehalt=2600 WHERE name = 'Mustermann'