Fachhochschule Esslingen Hochschule für Technik Zahl der Blätter: 9 Sommersemester 2011 Blatt Nummer: 1 Studiengang: Wirtschaftsinformatik Fachnummer:1 WF 2061/-62/-63 Prüfungsfach: Softwareentwicklung Vertiefung Semester: 2 Hilfsmittel: Notizen, Skript / Laborbuch, ein Buch nach Wahl Zeit: Name: Matr.Nr.: Vorname: 90 Minuten Teil 1: Grundlegende Eigenschaften der Sprache Java [25P] Aufgabe 1.1 Datentypen [5P] Beantworten Sie die folgenden Fragen und geben Sie ggf. ein geeignetes Codebeispiel an. In Java gibt es primitive Datentypen und Referenztypen. Wie verhalten bzw. unterscheiden sich diese (bei einer lokalen Variablen) bzgl. der folgenden Eigenschaften (Tabelle ausfüllen) Speicherort für Werte Verhalten bei Zuweisung Bedeutung von typecasts Methodenaufruf Vererbung Primitive Datentypen Wert in der Variable / Stack Kopie des Werts Echte Umwandlung des Werts Geht nicht Geht nicht Referenztypen Referenz zu Objekt auf dem Heap Kopie der Referenz Uminterpretation des Datentyps Geht, mit Objekt und Punktoperator Geht, aber nur Einfachvererbung Aufgabe 1.2 Wrapperklassen [5P] Um die Brücke zwischen primitiven Datentypen und Referenztypen zu schlagen existieren in Java die sog. Wrapperklassen. Geben Sie anhand der Wrapperklasse Integer an, wie ein primitiver Wert in ein Objekt bzw. in einen String umgewandelt werden kann (Coding!). Umwandlung Wert => Objekt Umwandlung Objekt => Wert Umwandlung Wert => String Umwandlung String => Wert Object o = new Integer( 42); int i = ((Integer)o).intValue(); String s = Integer.toString( 42); int i = Integer.parseInt( "42"); Bei welcher Umwandlung kann eine Exception auftreten? Welche? ParseException, bei der Interpretation eines ungültigen Strings Aufgabe 1.3 Autoboxing [5P] Autoboxing wurde eingeführt um die Verwendung von Wrapperklassen zu vereinfachen. Beschreiben Sie, welche der Umwandlungen in der vorherigen Aufgabe nun vereinfacht werden und kommentieren Sie die Zeilen 4-6 des folgenden Codings. Die Umwandlungen " Wert => Objekt" und "Objekt => Wert" werden automatisch vorgenommen. 01: public class Autoboxing { 02: 03: public static void main( String[] args) { 04: Integer i = 17; // Autoboxing 17 => new Integer(17) 05: int j = i + 4; // Auto-Unboxing Integer i => int & Berechnung 06: String result = ((Object)j).toString(); // Autoboxing+toString() 07: System.out.println( "17+4=" + result); 08: } 09: } Fachhochschule Esslingen Hochschule für Technik Sommersemester 2011 Zahl der Blätter: 9 Blatt Nummer: 2 Studiengang: Wirtschaftsinformatik Fachnummer:1 WF 2061/-62/-63 Prüfungsfach: Softwareentwicklung Vertiefung Semester: 2 Hilfsmittel: Notizen, Skript / Laborbuch, ein Buch nach Wahl Zeit: Name: Matr.Nr.: Vorname: 90 Minuten Aufgabe 1.4 Kontrollstrukturen [10P] Das folgende Beispielprogramm zur Ermittlung von mehreren verschiedenen Zufallszahlen enthält verschiedene Kontrollstrukturen. Analysieren Sie das Programm und beantworten Sie die zugehörigen Fragen. 01: public class RandomSelection { 02: 03: public static void main( String[] args) { 04: int[] numbers = new int[5]; 05: for ( int i=0; i<numbers.length; ++i) { 06: while (true) { 07: boolean re = false; 08: int number = (int)(Math.random()*10+10); 09: for ( int j=0; j<i; ++j) { 10: if ( number==numbers[j]) re = true; 11: } 12: if ( !re) { 13: numbers[i] = number; 14: break; 15: } 16: } 17: } 18: for ( int number : numbers) { 19: System.out.println( number); 20: } 21: } 22: } 1. Wieviele verschiedene Kontrollstrukturen werden hier verwendet? 4 (for, while, if, for-each) 2. Wieviele Zufallszahlen werden erzeugt? 5, entsprechend der Größe des Arrays "numbers" 3. Welchen Wertebereich haben die Zufallszahlen? Untergrenze 10, Obergrenze 19 (9.99…+10) 4. Welche Aufgabe hat die Schleife in Zeile 6? Wiederholung bis eindeutige Zahl gefunden 5. Welche Aufgabe hat die Variable "re"? Zeigt an, ob eine Wiederholung nötig ist 6. Wie deuten Sie die Bedingung "j<i" in Zeile 9? Nur die bisherigen Zahlen vergleichen 7. Welchen Zweck hat die if-Anweisung in Zeile 10? Prüfung auf identische Zahl 8. Welche Laufzeitverbesserung wäre hier noch möglich? break-Anweisung wenn identisch 9. Was bewirkt die break-Anweisung in Zeile 14? Verlassen der Endlos-Schleife 10. Wie nennt man die Kontrollstuktur in Zeile 18? Neue for-Schleife bzw. for-each-Schleife Fachhochschule Esslingen Hochschule für Technik Sommersemester 2011 Zahl der Blätter: 9 Blatt Nummer: 3 Studiengang: Wirtschaftsinformatik Fachnummer:1 WF 2061/-62/-63 Prüfungsfach: Softwareentwicklung Vertiefung Semester: 2 Hilfsmittel: Notizen, Skript / Laborbuch, ein Buch nach Wahl Zeit: Name: Matr.Nr.: Vorname: 90 Minuten Teil 2: Elementare Bibliothekskomponenten [15P] Aufgabe 2.1 Collections und Generics [10P] Beantworten Sie die folgenden Fragen zum Thema Nennen Sie die drei Arten von Collections und geben Sie jeweils eine konkrete Beispielklasse an. List => ArrayList, Set => HashSet, Map => HashMap Mit Hilfe von Generics kann die Typsicherheit von Collections erhöht werden. Verbessern Sie das folgende nicht-generische Programm indem Sie Generics verwenden und die Fragen beantworten. 01: public class WithoutGenerics { 02: public static void main( String[] args) { 03: List l = new ArrayList(); 04: l.add( new Person( "Jonny", "Java")); 05: l.add( new Person( "Paula", "Perl")); 06: l.add( new Object()); 07: Iterator iter = l.iterator(); 08: while (iter.hasNext()) { 09: Person p = (Person)iter.next(); 10: System.out.println( p); 11: } 12: } 13: } 01: public class WithGenerics { 01: public static void main( String[] args) { 02: List<Person> l = new ArrayList<Person>(); // 2P 03: l.add( new Person( "Jonny", "Java")); 04: l.add( new Person( "Paula", "Perl")); 05: l.add( new Object()); 06: Iterator<Person> iter = l.iterator(); // 1P 07: while (iter.hasNext()) { 08: Person p = iter.next(); // 1P 09: System.out.println( p); 10: } 11: } 12: } In welcher Zeile des Programms wird mit der Liste ein Fehler gemacht? In Zeile 6 (hinzufügen eines Objekts zu einer Liste von Personen) In welcher Zeile des alten Programms äußert sich dieser Fehler und wie? In Zeile 9 (ClassCastException zur Laufzeit, Objekt kann nicht in Person umgewandelt werden) In welcher Zeile des neuen Programms äußert sich dieser Fehler und wie? In Zeile 6 (Compile-Fehler, kann kein Objekt zu einer Liste von Personen hinzufügen) Fachhochschule Esslingen Hochschule für Technik Sommersemester 2011 Zahl der Blätter: 9 Blatt Nummer: 4 Studiengang: Wirtschaftsinformatik Fachnummer:1 WF 2061/-62/-63 Prüfungsfach: Softwareentwicklung Vertiefung Semester: 2 Hilfsmittel: Notizen, Skript / Laborbuch, ein Buch nach Wahl Zeit: Name: Matr.Nr.: Vorname: 90 Minuten Aufgabe 2.2 Streams und Serialisierung[5P] Beantworten Sie die folgenden Fragen zum Thema. Was versteht man unter Serialisierung? Die Umwandlung eines Objekts in einen Datenstrom, z.B. zur Speicherung Was versteht man unter einem Stream bzw. einem Filter? Ein Stream ist eine Datenquelle oder –Senke, ein Filter wandelt / interpretiert einen Datenstrom um Welche Klassen sind notwendig, um Objekte in eine Datei zu schreiben? Die Stream-Klasse FileOutputStream und die Filter-Klasse ObjectOutputStream Geben Sie eine Instanzmethode (Deklaration und Implementierung) an, die nach Übergabe eines Dateinamens und eines serialisierbaren Objekts versucht, dieses in der Datei zu speichern, und im Fehlerfall die Exception an den Aufrufer zurückliefert (kein try-catch!). public void saveObject( String fn, Serializable obj) throws IOException { FileOutputStream fos = new FileOutputStream( fn); ObjectOutputStream oos = new ObjectOutputStream( fos); oos.writeObject( obj); } Fachhochschule Esslingen Hochschule für Technik Sommersemester 2011 Zahl der Blätter: 9 Blatt Nummer: 5 Studiengang: Wirtschaftsinformatik Fachnummer:1 WF 2061/-62/-63 Prüfungsfach: Softwareentwicklung Vertiefung Semester: 2 Hilfsmittel: Notizen, Skript / Laborbuch, ein Buch nach Wahl Zeit: Name: Matr.Nr.: Vorname: 90 Minuten Teil 3: Entwicklung einfacher Java-Programme [5P] Aufgabe 3.1 Ermittlung der Altersklasse beim Sport [5P] Implementieren Sie die Methode, welche die Altersklasse eines Sportlers ermittelt. Hinweis: Sie können bei allen Klassen sämtliche get-/set-Methoden voraussetzen. Datei: AgeBracket.java public class AgeBracket { String name; int minAge, maxAge; public AgeBracket( String name, int minAge, int maxAge) { // Initialisierung wie üblich } } Datei: Athlete.java public class Athlete { String name; int age; public Athlete( String name, int age) { // Initialisierung wie üblich } public AgeBracket findAgeBracket( AgeBracket[] allAgeBrackets) { for ( AgeBracket ageBracket : allAgeBrackets) { if ( ageBracket.getMinAge()<=age && age<=ageBracket.getMaxAge()) { return ageBracket; } } return null; } } Datei: SportsTest.java public class SportsTest { public static void main( String[] args) { AgeBracket[] allAgeBrackets = { new AgeBracket("kid", 0, 12), new AgeBracket("junior", 13, 20), new AgeBracket("adult", 21, 30), new AgeBracket("senior", 31, 99) }; Athlete athlete = new Athlete( "Superman", 36); System.out.println( athlete.findAgeBracket( allAgeBrackets)); } } Fachhochschule Esslingen Hochschule für Technik Sommersemester 2011 Zahl der Blätter: 9 Blatt Nummer: 6 Studiengang: Wirtschaftsinformatik Fachnummer:1 WF 2061/-62/-63 Prüfungsfach: Softwareentwicklung Vertiefung Semester: 2 Hilfsmittel: Notizen, Skript / Laborbuch, ein Buch nach Wahl Zeit: Name: Matr.Nr.: Vorname: 90 Minuten Teil 4: GUI Layout und Verständnis einfacher Komponenten [20P] Aufgabe 4.1 Verhalten von Layout Managern [10P] Analysieren Sie das folgende Layout und beschreiben Sie einen möglichen Lösungsansatz. Hinweis: Kennzeichnen Sie zuerst die verschiedenen Bereiche und deren Layouts im Bild. Normale Darstellung Vertikale Vergrößerung Horizonale Vergrößerung Platz für Lösungsansatz (kein Coding!): Fachhochschule Esslingen Hochschule für Technik Sommersemester 2011 Zahl der Blätter: 9 Blatt Nummer: 7 Studiengang: Wirtschaftsinformatik Fachnummer:1 WF 2061/-62/-63 Prüfungsfach: Softwareentwicklung Vertiefung Semester: 2 Hilfsmittel: Notizen, Skript / Laborbuch, ein Buch nach Wahl Zeit: Name: Matr.Nr.: Vorname: 90 Minuten Aufgabe 4.2 Event-Handling [10P] Implementieren Sie den ActionListener sowie die Methode um die Lichter weiterzuschalten. Initiale Darstellung Anzeigereihenfolge: 0,1,2,…,7,8,9,0,1,2,3,… public class MovingLights extends JFrame { JLabel[] lights = new JLabel[10]; int activeLight = 0; public MovingLights() { super("MovingLights"); setDefaultCloseOperation( EXIT_ON_CLOSE); JPanel lightPanel = new JPanel(); for ( int i=0; i<lights.length; ++i) { JLabel light = new JLabel( Integer.toString(i)); light.setPreferredSize( new Dimension(25,25)); light.setHorizontalAlignment( JLabel.CENTER); light.setOpaque( true); lightPanel.add( light); lights[i] = light; } add( lightPanel, BorderLayout.CENTER); JButton cycleButton = new JButton( "next"); cycleButton.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent e) { moveLights(); } }); add( cycleButton, BorderLayout.SOUTH); moveLights(); pack(); } public void moveLights() { for ( int i=0; i<lights.length; ++i) { if ( i==activeLight) { lights[i].setBackground( Color.RED); } else { lights[i].setBackground( Color.GRAY); } } activeLight = (activeLight+1)%lights.length; } } Fachhochschule Esslingen Hochschule für Technik Sommersemester 2011 Zahl der Blätter: 9 Blatt Nummer: 8 Studiengang: Wirtschaftsinformatik Fachnummer:1 WF 2061/-62/-63 Prüfungsfach: Softwareentwicklung Vertiefung Semester: 2 Hilfsmittel: Notizen, Skript / Laborbuch, ein Buch nach Wahl Zeit: Name: Matr.Nr.: Vorname: 90 Minuten Teil 5: Verständnis komplexer GUI Komponenten [5P] Aufgabe 5.1 Model-View-Controller [5P] Vervollständigen Sie das folgende TableModel und skizzieren Sie eine mögliche Darstellung Datei: MovieTableModel.java 01: import javax.swing.table.*; 02: 03: public class MovieTableModel extends AbstractTableModel { 04: 05: String[] headers = { "Title", "Genre", "Price", "In Stock"}; 06: List<Movie> movies; 07: 08: public MovieTableModel( List<Movie> movies) { 09: this.movies = movies; 10: } 11: 12: public String getColumnName( int col) { 13: return headers[col]; 14: } 15: 16: public int getColumnCount() { 17: return headers.length; 18: } 19: 20: public int getRowCount() { 21: return movies.size(); 22: } 23: 24: public Class getColumnClass( int col) { 25: return ( col!=3 ? String.class : Boolean.class); 26: } 27: 28: public Object getValueAt( int row, int col) { 29: Movie movie = movies.get(row); 30: switch (col) { 31: case 0: return movie.getTitle(); 32: case 1: return movie.getGenre(); 33: case 2: return movie.getPrice(); 34: case 3: return movie.isInStock(); 35: } 36: return null; 37: } 38: } Skizze (Tabelle mit Beispieleintrag): Fachhochschule Esslingen Hochschule für Technik Sommersemester 2011 Zahl der Blätter: 9 Blatt Nummer: 9 Studiengang: Wirtschaftsinformatik Fachnummer:1 WF 2061/-62/-63 Prüfungsfach: Softwareentwicklung Vertiefung Semester: 2 Hilfsmittel: Notizen, Skript / Laborbuch, ein Buch nach Wahl Zeit: Name: Matr.Nr.: Vorname: 90 Minuten Teil 6: Verständnis von Datenbanken [5P] Aufgabe 6.1 Datenbankabfragen [5P] Geben Sie geeignete SQL-Anweisungen für die angegebenen Teilaufgaben an Tabelle Spieler id INT AUTO_INCREMENT PRIMARY KEY name VARCHAR not null rolle VARCHAR not null spiele INT tore INT Hinweis: In der Spalte "rolle" sollen Werte wie "Sturm", "Mittelfeld" oder "Abwehr" stehen. Einfügen eines neuen Stürmers "Supermann" mit 0 Spielen und 0 Toren INSERT INTO Spieler (name, rolle, spiele, tore) VALUES ('Supermann', 'Sturm', 0, 0) Selektion (nur) der Namen aller Spieler mit mindestens 10 Toren SELECT name FROM Spieler WHERE tore >= 10 Selektion aller Spieler (mit allen Eigenschaften) geordnet nach Anzahl der Spiele SELECT * FROM Spieler ORDER BY spiele Saisonende… Löschung aller Stürmer mit weniger als 3 Toren (werden gekündigt!) DELETE FROM Spieler WHERE rolle='Sturm' AND tore<3 Rücksetzung der Spiele und der Tore aller Spieler auf 0 UPDATE Spieler SET spiele=0, tore=0