• Keine Ergebnisse gefunden

Teil 1: Grundlegende Eigenschaften der Sprache Java [20P]

N/A
N/A
Protected

Academic year: 2022

Aktie "Teil 1: Grundlegende Eigenschaften der Sprache Java [20P]"

Copied!
19
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Teil 1: Grundlegende Eigenschaften der Sprache Java [20P]

Aufgabe 1.1 Datentypen [5P]

Geben Sie die Ausgabe des folgenden Programms an (mit Begründung) 01:

02: public class Datatypes { 03:

04: public static void main( String[] args) { 05: double[] d1 = new double[] { 3.0};

06: double[] d2 = d1;

07: double d3 = 3.0;

08: double d4 = d3;

09:

10: d2[0] = 1.0;

11: d4 = 5.0;

12:

13: System.out.println( d1[0]);

14: System.out.println( d3);

15: } 16:

17: } 18:

Die Ausgabe lautet:

1.0 3.0

Ein double-Array ist ein Referenztyp (1P), daher wirkt sich die Änderung auf das erste Element von d2 auch auf d1 aus (1P). Der Typ double ist ein primitiver Datentyp (1P). Deshalb kann man d4 verändern ohne dass d3 beeinflußt wird (1P).

Wie ändert sich die Ausgabe nach folgender Änderung?

07: double d3 = d1[0];

Die Ausgabe ändert sich nicht, da der Wert kopiert wird (1P).

(2)

Aufgabe 1.2 Kontrollstrukturen [5P]

Ersetzen Sie die Schleife in folgendem Programm durch eine neue for-Schleife() 08:

09: public class Statistics { 10:

11: public double computeAverage( double[] values) { 12: double total = 0.0;

13: for ( int i=0; i<values.length; ++i) { 14: total += values[i];

15: }

16: return total/values.length;

17: } 18:

19: public static void main( String[] args) { 20: Statistics s = new Statistics();

21: System.out.println( s.computeAverage( new double[] { 1}));

22: System.out.println( s.computeAverage( new double[] { 1, 1}));

23: System.out.println( s.computeAverage( new double[] { 1, 2}));

24: } 25:

26: } 27:

01:

02: public class StatisticsL { 03:

04: public double computeAverage( double[] values) { 05: double total = 0.0;

06: for ( double value : values) { 07: total += value;

08: }

09: return total/values.length;

10: } 11:

12: public static void main( String[] args) { 13: StatisticsL s = new StatisticsL();

14: System.out.println( s.computeAverage( new double[] { 1}));

15: System.out.println( s.computeAverage( new double[] { 1, 1}));

16: System.out.println( s.computeAverage( new double[] { 1, 2}));

17: } 18:

19: } 20:

2P für korrekte Schleifenstruktur, 2P für korrekten Datentyp in der Schleife, 1P für Schleifenrumpf

(3)

Aufgabe 1.3 Enums [5P]

Markieren Sie den Fehler in folgendem Programm und verbessern Sie es anschließend mit Hilfe von Enums.

01:

02: public class Enuminator { 03:

04: public static final int EXAM_PASS = 1;

05: public static final int EXAM_FAIL = 2;

06:

07: public String decodeResult( int result) { 08: switch ( result) {

09: case EXAM_PASS:

10: return "Congratulations!";

11: case EXAM_FAIL:

12: return "Better luck next time";

13: default:

14: return "SYSTEM ERROR!";

15: } 16: } 17:

18: public static void main( String[] args) { 19: Enuminator e = new Enuminator();

20: System.out.println( e.decodeResult( 1));

21: System.out.println( e.decodeResult( EXAM_FAIL));

22: System.out.println( e.decodeResult( 3));

23: } 24:

25: } 26:

(4)

Platz für die Lösung

01:

02: public class EnuminatorL { 03:

04: public static enum Result { EXAM_PASS, EXAM_FAIL};

05:

06: public String decodeResult( Result result) { 07: switch ( result) {

08: case EXAM_PASS:

09: return "Congratulations!";

10: case EXAM_FAIL:

11: return "Better luck next time";

12: default:

13: return "SYSTEM ERROR!";

14: } 15: } 16:

17: public static void main( String[] args) { 18: EnuminatorL e = new EnuminatorL();

19: System.out.println( e.decodeResult( Result.EXAM_PASS));

20: System.out.println( e.decodeResult( Result.EXAM_FAIL));

21: //

22: // Nicht mehr möglich

23: // System.out.println( e.decodeResult( 3));

24: //

25: // Führt zu NullPointerException!

26: System.out.println( e.decodeResult( null));

27: } 28: } 29:

2P für korrekte Definition des enum-Typs 2P für korrekte Anpassung der Aufrufe

1P für korrekte Entfernung des ungültigen Aufrufs

Ist das Programm jetzt wirklich "wasserdicht"? (1ZP) 1 ZP für Benennung der Nullpointer-Exception

(5)

Aufgabe 1.4 Generics [5P]

Analysieren Sie den Gebrauch der Collections in folgendem Programm und verbessern Sie es anschließend durch Verwendung von Generics.

01:

02: import java.util.*;

03:

04: public class Generics { 05:

06: public static void main( String[] args) { 07: List liste = new ArrayList();

08: liste.add( "1");

09: liste.add( Integer.toString( 2));

10: liste.add( Character.toString( '3'));

11: for ( Object o : liste) { 12: System.out.println( o);

13: } 14: } 15:

16: } 17:

01:

02: import java.util.*;

03:

04: public class GenericsL { 05:

06: public static void main( String[] args) {

07: List<String> liste = new ArrayList<String>();

08: liste.add( "1");

09: liste.add( Integer.toString( 2));

10: liste.add( Character.toString( '3'));

11: for ( String s : liste) { 12: System.out.println( s);

13: } 14: } 15:

16: } 17:

je 1P für Deklaration, Initialisierung, Füllung mit int und char sowie Anpassung der Schleife Welche Gefahr besteht bei dem ursprünglichen Programm? (1ZP)

Typunsicherheit bei der Entnahme von Objekten

(6)

Teil 2: Elementare Bibliothekskomponenten [10P]

Aufgabe 2.1 [2P]

Die Klasse Math ist Bestandteil der Sprachdefinition von Java. Wie ruft man die Methoden der Klasse auf? Wieviele Instanzen der Klasse existieren in einem Java Programm?

Die Klasse Math enthält nur Klassenmethoden. Der Aufruf der Methoden von Math erfolgt also über die Klasse selbst (1P), z.B. Math.sqrt( 4). Es gibt also keine Objekte der Klasse Math (1P).

Dies wäre auch nicht sinnvoll, da die Mathematik "an sich" keinen Zustand hat.

Aufgabe 2.2 [2P]

In Java existieren sog. Wrapper Klassen für die primitiven Datentypen. Wozu wurden diese ursprünglich benötigt und durch welches Sprachfeature wurden Sie ab Java 1.5 nahezu

"unsichtbar"?

Die Wrapper Klassen waren ursprünglich notwendig, um aus primitiven Datentypen Objekte zu machen und sie so z.B. in Collections speichern zu können. Durch das Sprachfeature

"Autoboxing" entfällt das explizite ein- und auspacken.

Aufgabe 2.3 [2P]

Welche Methoden enthält das Interface Serializable und welche Bedeutung hat es im Zusammenhang mit Streams?

Das Interface Serializable ist ein sogenanntes Marker-Interface, d.h. es muss nur angegeben werden und enthält keine Methoden. Damit wird angezeigt, dass eine Klasse und ihre Attriute

"serialisierbar" sind, d.h. mit Hilfe eines Streams übertragen bzw. gespeichert werden können.

Technisch geht das immer – aber manchmal will man es nicht, daher die explizite Markierung..

Aufgabe 2.4 [2P]

Welche Vor- und Nachteile bieten Collections gegenüber Arrays?

Vorteile: Dynamische Größe, Unterstützung verschiedener Typen Nachteile: Mehr Speicherbedarf, geringerere Geschwindigkeit Aufgabe 2.5 [2P]

Nennen Sie den Interface-Typ und eine konkrete Implementierung derjenigen Art von Collections, deren Eigenschaften Arrays am nächsten kommt.

Interface-Typ List, Implementierung ArrayList

(7)

Teil 3: Entwicklung einfacher Java-Programme [5P]

Aufgabe 3.1 [5P]

Schreiben Sie eine Methode, welches den Maximalwert in einer Menge von Zahlen findet, und rufen Sie diese in der main()-Methode auf.

public class Maximus {

public int findMax( int[] values) { int max = Integer.MIN_VALUE;

for ( int value : values) { if ( value > max) max = value;

}

return max;

}

public static void main( String[] args) { Maximus m = new Maximus(); // Objekt anlegen int[] values1 = new int[] { 5, 2, 9, 4, 7};

int max1 = m.findMax( values1);

System.out.println( max1);

int[] values2 = new int[5];

for ( int i=0; i<values2.length; ++i) { values2[i] = (int)(Math.random()*10);

}

int max2 = m.findMax( values2);

System.out.println( max2);

} }

1P Schnittstelle der Methode 1P Initialisierung der max-Variablen 1P for-Schleife

1P if-Statement 1P Aufruf(e)

(8)

Teil 4: GUI Layout und Verständnis einfacher Komponenten [20P]

Aufgabe 4.1 [3P]

Ordnen Sie die folgenden Klassen den richtigen Paketen zu

(1) ActionEvent (a) javax.swing

(2) Dimension (b) java.awt.event

(3) JLabel (c) java.awt

Lösung: 1b, 2c, 3a Aufgabe 4.2 [3P]

Skizzieren Sie das Layout des folgenden Dialogs nach der Vergrößerung

1P Labels, 1P Textfields, 1P Button (gleiche Position, wenn unklar -0,5P!) wenn Layout erkennbar völlig missverstanden, z.B. als FlowLayout, dann 0P

01:

02: import java.awt.*;

03: import java.awt.event.*;

04: import javax.swing.*;

05:

(9)

06: public class LoginDialog extends JDialog implements ActionListener { 07:

08: JTextField loginField;

09: JPasswordField passwordField;

10:

11: public LoginDialog( JFrame owner) { 12: super( owner, "Login", true);

13:

14: JPanel content = new JPanel();

15: content.setLayout( null);

16:

17: JLabel label1 = new JLabel( "Login");

18: label1.setBounds( 10, 10, 80, 20);

19: content.add( label1);

20: JLabel label2 = new JLabel( "Password");

21: label2.setBounds( 10, 40, 80, 20);

22: content.add( label2);

23: loginField = new JTextField( 20);

24: loginField.setBounds( 90, 10, 100, 20);

25: content.add( loginField);

26: passwordField = new JPasswordField( 20);

27: passwordField.setBounds( 90, 40, 100, 20);

28: content.add( passwordField);

29:

30: JButton okButton = new JButton( "OK");

31: okButton.setBounds( 50, 70, 100, 20);

32: okButton.addActionListener( this);

33: content.add( okButton);

34: add( content);

35: this.setSize( 210, 140);

36: } 37:

38: public void actionPerformed( ActionEvent e) { 39: dispose();

40: } 41:

42: public String getLogin() { 43: return loginField.getText();

44: } 45:

46: public String getPassword() { 47: return passwordField.getText();

48: } 49:

50: public static void main( String[] args) { 51: new LoginDialog( null).setVisible( true);

52: } 53:

54: } 55:

(10)

Aufgabe 4.3 Layout Manager [9P]

Benennen Sie den/die jeweiligen LayoutManager (verwenden Sie verschiedene Farben/Linienstile um Gitterzellen oder verschachtelte Layouts zu kennzeichnen).

Label (Image)

Label-Aplication Label-Version

Label-Author Label-Copyright

Strut Button

Button Button Button Button

Button Label

Label

Label

Label Textfield Textfield Textfield Textfield

Frame (1P):

BorderLayout (West, Center, South) Panel West (2P):

BoxLayout (Y-Axis)

Frame (2P):

GridBagLayout

Button in Zelle mit gridWidth = 2 (1P)

Frame (2P):

BoxLayout (X-Axis) Rechtes Panel (1P) BoxLayout (Y-Axis)

(11)

Aufgabe 4.4 Event Handling [5P]

Analysieren Sie den folgenden Quellcode und beantworten Sie die zugehörigen Fragen.

01:

02: import java.awt.*;

03: import java.awt.event.*;

04: import javax.swing.*;

05:

06: public class Eventuality extends JFrame { 07:

08: JTextField textField = new JTextField( "<enter text here>");

09:

10: public Eventuality() { 11: super( "Eventuality");

12: setDefaultCloseOperation( EXIT_ON_CLOSE);

13:

14: setLayout( new FlowLayout());

15: add( new JLabel( "Text"));

16: add( textField);

17: JButton resetButton = new JButton( "Reset");

18: ActionListener resetListener = new ActionListener() { 19: public void actionPerformed( ActionEvent e) {

20: resetText();

21: } 22: };

23: resetButton.addActionListener( resetListener);

24: add( resetButton);

25: pack();

26: } 27:

28: public void resetText() { 29: textField.setText( "");

30: } 31:

32: public static void main( String[] args) { 33: new Eventuality().setVisible( true);

34: } 35:

36: } 37:

(12)

Wieviele class-Dateien werden beim Kompilieren dieses Programms erzeugt? (1P) Es werden 2 class-Dateien erzeugt, Eventuality.class und Eventuality$1.class (für den Listener).

Welche Sequenz von Objekten und Methoden ruft ein Klick auf den Button auf? (1P)

JButton➠resetListener.actionPerformed() [0,5P]➠this.resetText() [0,5P]➠textField.setText() [0,5 ZP]

Zu welcher (Art von) Klasse gehört das Objekt in der Variablen "resetListener"? (1P) Das Objekt ist Instanz einer anonymen Inner Class mit Interface-Typ, erbt also von Object.

Warum kann die Variable "textField" keine lokale Variable sein? (1P) Damit die Methode resetText() darauf zugreifen kann.

Welchen Vorteil bietet die Realisierung der separaten Methode "resetText()"? (1P) Man kann die zugehörige Aktion auch unabhängig vom Button auslösen. Falls der Code für die Ausführung der Aktion länger ist verbessert sich außerdem die Übersichtlichkeit.

(13)

Teil 5: Verständnis komplexer GUI Komponenten [15P]

Aufgabe 5.1 [15P]

Analysieren Sie das nachfolgende Programm und beantworten Sie die zugehörigen Fragen.

Screenshot des Hauptfensters Datei BeerFrame.java

01:

02: import java.util.*;

03: import javax.swing.*;

04:

05: public class BeerFrame extends JFrame { 06:

07: JTable beerTable;

08:

09: public BeerFrame( List<Beer> beers) { 10: super( "BeerFrame");

11: setDefaultCloseOperation( EXIT_ON_CLOSE);

12: beerTable = new JTable( new BeerTableModel( beers));

13: BeerTableRenderer renderer = new BeerTableRenderer();

14: beerTable.setDefaultRenderer( Object.class, renderer);

15: add( new JScrollPane( beerTable));

16: pack();

17: } 18:

19: public static void main( String[] args) { 20: List<Beer> beers = new ArrayList<Beer>();

21: beers.add( new Beer( "Schöfferhofer Grapefruit", "Schöfferhofer", 2.5));

22: beers.add( new Beer( "Jever Lime", "Jever", 2.5));

23: new BeerFrame( beers).setVisible( true);

24: } 25: } 26:

Wie würde sich das Hauptfenster ohne die JScrollPane verändern? [2P]

Ohne die JScrollPane würden die Spaltenköpfe nicht automatisch angezeigt werden sondern müssten manuell ins Layout eingefügt werden (1P). Außerdem wäre kein Scrolling möglich (1P).

(14)

Datei BeerTableModel 01:

02: import java.util.*;

03: import javax.swing.table.*;

04:

05: public class BeerTableModel extends AbstractTableModel { 06:

07: static final String[] columnNames = { "Name", "Brauerei", "%Alc"};

08:

09: List<Beer> beers;

10:

11: public BeerTableModel( List<Beer> beers) { 12: this.beers = beers;

13: } 14:

15: public String getColumnName( int col) { 16: return columnNames[col];

17: } 18:

19: public int getColumnCount() { 20: return columnNames.length;

21: } 22:

23: public int getRowCount() { 24: return beers.size();

25: } 26:

27: public boolean isCellEditable( int row, int col) { 28: return false;

29: } 30:

31: public Object getValueAt( int row, int col) {

32: Beer beer = beers.get( row); // fix me

33: switch ( col) { // fix me

34: case 0:

35: return beer.getName(); // fix me 36: case 1:

37: return beer.getBrewery(); // fix me 38: case 2:

39: return Double.toString( beer.getAlcohol()) + "%"; // fix me 40: default:

41: return null;

42: } 43: } 44:

45: public void setValueAt( Object value, int row, int col) { 46: // not needed

47: } 48:

49: }

(15)

Welche Aufgaben hat das BeerTableModel? Ergänzen Sie die fehlenden Teile. [6P]

Ein TableModel agiert als "Adapter" zwischen GUI und Daten indem es der JTable eine definierte Schnittstelle zum Zugriff bietet und zwischen Tabellenkoordinaten und Objekten und deren Eigenschaften übersetzt; siehe Methode getValueAt(). Je 1P für richtige Ergänzung

Wieviele Spalten hat die Tabelle? Welche sind editierbar? [1P]

Die Tabelle hat 3 Spalten; siehe Screenshot bzw. getColumnCount().

Keine der Spalten ist editierbar; siehe isCellEditable() bzw. Hinweis in setValueAt().

Datei Beer.java

01: 02: public class Beer { 03: 04: final String name;

05: final String brewery;

06: final double alcohol;

07:

08: public Beer( String name, String brewery, double alcohol) { 09: this.name = name;

10: this.brewery = brewery;

11: this.alcohol = alcohol;

12: } 13:

14: public String getName() { 15: return name;

16: } 17:

18: public String getBrewery() { 19: return brewery;

20: } 21:

22: public double getAlcohol() { 23: return alcohol;

24: } 25:

26: } 27:

Welche Bedeutung hat die Klasse Beer? [1P]

Eine Instanz der Klasse Beer repräsentiert bzw. modelliert eine (real existierende) Biersorte.

Warum sind die Instanzvariablen alle final? [1P]

Die Eigenschaften einer Biersorte werden einmal festgelegt ändern sich anschließend nicht mehr.

Welche genaue Bedeutung/Kodierung hat die Instanzvariable "alcohol"? [1P]

Die Instanzvariable "alcohol" speichert den Alkoholgehalt in %; siehe Konstruktoraufruf.

(16)

Datei BeerTableRenderer.java 50:

51: import java.awt.*;

52: import javax.swing.*;

53: import javax.swing.table.*;

54:

55: public class BeerTableRenderer extends DefaultTableCellRenderer { 56:

57: public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) {

58: Component c = super.getTableCellRendererComponent( table, value, isSelected, hasFocus,

row, col);

59: switch ( col) { 60: case 0:

61: case 1:

62: ((JLabel)c).setHorizontalAlignment( LEFT);

63: break;

64: case 2:

65: case 3:

66: ((JLabel)c).setHorizontalAlignment( RIGHT);

67: break;

68: }

69: return c;

70: } 71:

72: }

Wie würde die Tabelle ohne die Klasse BeerTableRenderer aussehen? [2P]

Der BeerTableRenderer richtet die Spalten 0+1 linksbündig und die Spalten 2+3 rechtsbündig aus.

Warum wirkt sich der Renderer auf alle Spalten aus (siehe Hauptprogramm)? [1P]

Der Renderer ist zuständig für Spalten vom Typ Objekt. Dies trifft per Default auf alle Spalten zu.

(17)

Teil 6: Threads [10P]

Aufgabe 6.1 Zustände von Threads [10P]

Das nachfolgende Diagramm zeigt die möglichen Zustände eines Threads. Kennzeichnen Sie im nachfolgenden Program die Stellen, an denen ein Zustandswechsel des Threads t stattfindet und nennen Sie den Zustand vor und nach dem Übergang.

01:

02: public class ThreadStates { 03:

04: public static void main( String[] args) throws InterruptedException { 05: Thread t = new Thread( new Runnable() {

06: public void run() { 07: int i = 10;

08: do {

09: System.out.println( i--); // Running -> Blocked (I/O) 10: Thread.yield(); // Running -> Ready-to-Run 11: } while ( i>0);

12: System.out.println( "Ignition!");

13: } // Running -> Dead (Fertig) 14: });

15: t.start(); // Unknown -> Ready-to-Run 16: t.join();

17: } 18:

19: }

Durch Einsatz welcher Methode könnte der Countdown verzögert werden? (2P) Durch die Methode Thread.sleep() statt der Methode Thread.yield()

(18)

Teil 7: Verständnis von Datenbanken [10P]

Aufgabe 7.1 Datenmodellierung [5P]

Beschreiben Sie grafisch oder textuell ein Datenbankschema (Tabellen, Spalten, Datentypen, Querverweise) für den folgenden Sachverhalt:

Ein Rundreise hat einen Namen und einen Zeitpunkt. Zu einer Rundreise gehören mehrere Stationen. Die Stationen haben einen Namen und eine festgelegte Reihenfolge.

Hinweise:

Führen Sie für Verweise ggf. zusätzliche technische Schlüssel ein.

Tabelle Rundreise:

id INT AUTO_INCREMENT PRIMARY KEY name VARCHAR

zeitpunkt DATE Tabelle Station

id INT AUTO_INCREMENT PRIMARY KEY rundreise_id INT REFERENCES Rundreise name VARCHAR

nr INT

je 2P für Tabellen inkl. Spalten, 1P für Fremdschlüssel, -0,5P pro Fehler

(19)

Aufgabe 7.2 Datenbankabfragen [5P]

Geben Sie geeignete SQL-Anweisungen für die angegebenen Teilaufgaben an Tabelle Aktie

wkn VARCHAR name VARCHAR kurs DOUBLE anzahl INT

Einfügen von 10 "Fantasia"-Aktien mit der wkn 123456 zum Kurs von 39.00

INSERT INTO Aktie ( wkn, name, kurs, anzahl) VALUES ( '123456', 'Fantasia', 39.0, 10)

Selektion von Anzahl und Kurs der "Autobauer"-Aktie

SELECT anzahl, kurs FROM Aktie WHERE name = 'Autobauer'

Selektion aller Aktien mit Kurs < 1.00

SELECT * FROM Aktie WHERE kurs < 1.00

Änderung des Namens der "TelefonFirma"-Aktie in "PhoneCompany"-Aktie.

UPDATE Aktie SET name='PhoneCompany' WHERE name = 'Telefon'

Löschung aller Aktien mit Anzahl = 0

DELETE FROM Aktie WHERE anzahl = 0

Referenzen

ÄHNLICHE DOKUMENTE

Dabei d ¨urfen Sie die Reihenfoge von Integralen beliebig vertauschen – Sie brauchen also die Konver- genz nicht erst zu beweisen.. (a) Zeigen Sie, dass F, F −1 in der Tat

Beschreiben Sie, welche der Umwandlungen in der vorherigen Aufgabe nun vereinfacht werden und kommentieren Sie die Zeilen 4-6 des folgenden Codings... Aufgabe 1.4 Kontrollstrukturen

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. Die

Welcher Modifier und welche Schreibweise wird in Java für Konstanten verwendet.. Konstanten werden mit dem Modifier final gekennzeichnet und in

Beschreiben Sie grafisch oder textuell ein Datenbankschema (Tabellen, Spalten, Datentypen, Querverweise) für den folgenden Sachverhalt:. Ein Rundreise hat einen Namen und

Kann (quasi) kostenlos reproduziert und verteilt werden [X] [ ] Aufgabe 1.4 [4P] 1P für Voraussetzung +0,5P pro richtigem Feld.. Nennen Sie die wesentliche Voraussetzung für

Wenn die Klasse Student Methoden der Klasse Person überschreibt, können sich manche “Personen” zudem anders verhalten (2P) – nämlich dann, wenn sie in Wirklichkeit

Wenn die Klasse Student Methoden der Klasse Person überschreibt, können sich manche “Personen” zudem anders verhalten (2P) – nämlich dann, wenn sie in Wirklichkeit