• Keine Ergebnisse gefunden

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.

N/A
N/A
Protected

Academic year: 2022

Aktie "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."

Copied!
13
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

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 / [X] nein; Grund = String-Addition String sport = "" + 's' + 'o' + 'c' + 'c' + 'e' + 'r';

// (2) typecast erforderlich [X] ja / [ ] nein; Grund = loss of precision int year = 2006 + 4.0;

// (3) typecast erforderlich [ ] ja / [X] nein; Grund = upcast Tournament t = new WorldChampionship( "Soccer", year);

// (4) typecast erforderlich [ ] ja / [X] nein; Grund = upcast Object o = t;

// (5) typecast erforderlich [X] ja / [ ] nein; Grund = downcast WorldChampionship w = o;

} }

(2)

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: public boolean isValueOdd( int value) { 03: if ( value%2==0) {

04: return false;

05: } else {

06: return true;

07: } 08:

01:

02: public boolean isValueOdd( int value) {

03: return value%2!=0; // oder: !(value%2==0) bzw. (value%2==1) 04: }

05:

Bedeutung/Funktion: [2+1] Prüft, ob der übergebene Wert eine ungerade Zahl ist.

01:

02: public String expandResultCode( char code) { 03: if ( code=='w') {

04: return "win";

05: } else if ( code=="l") { 06: return "loss";

07: } else if ( code=="d") { 08: return "draw";

09: } else {

10: return "unknown";

11: } 12: } 13:

01:

02: public String expandResultCode( char code) { 03: switch ( code) {

04: case 'w':

05: return "win";

06: case 'l':

07: return "loss";

08: case 'd':

09: return "draw";

10: default:

11: return "unknown";

12: } 13: } 14:

Bedeutung/Funktion: [3+1] Übersetzt ein Code-Zeichen in ein verständliches Wort

(3)

01:

02: public int countOccurrences( int[] values, int targetValue) { 03: int j=0;

04: int count=0;

05: while ( j<values.length) {

06: if (values[j]==targetValue) count++;

07: j++;

08: }

09: return count;

10: } 11:

01:

02: public int countOccurrences( int[] values, int targetValue) { 03: int count = 0;

04: for ( int value : values) {

05: if ( value==targetValue) count++;

06: }

07: return count;

08: } 09:

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 }

}

(4)

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 }

} }

(5)

Teil 3: 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;

} }

(6)

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:

(7)

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

(8)

Aufgabe 4.3 Event Handling und Java2D [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 TargetPractice extends JFrame 07: {

08: java.util.List<Point> points = new java.util.ArrayList<Point>();

09:

10: public TargetPractice() { 11: super( "Target Practice");

12: setDefaultCloseOperation( EXIT_ON_CLOSE);

13: getContentPane().addMouseListener( new MouseAdapter() { 14: public void mouseClicked( MouseEvent e) {

15: Point point = e.getPoint();

16: points.add( point);

17: repaint( point.x-25, 20+point.y-25, 50, 50);

18: } 19: });

20: setSize( 400, 400);

21: } 22:

23: public void paint( Graphics g) {

24: Dimension d = getContentPane().getSize();

25:

26: for ( int i=0; i<5; ++i) { // 5 Mal durchlaufen

27: int dx = d.width/2 * (i+1)/6; // Teilung der halben Breite 28: int dy = d.height/2 * (i+1)/6; // Teilung der halben Höhe 29: g.setColor( i%2==0 ? Color.BLACK : Color.RED); // Farbwechsel 30: g.fillOval( dx, 20+dy, d.width-2*dx, d.height-2*dy); // mittig 31: }

32: g.setColor( Color.WHITE);

33: for ( Point point : points) {

34: g.fillOval( point.x, 20+point.y, 10, 10);

35: } 36: } 37:

38: public static void main( String[] args) { 39: new TargetPractice().setVisible( true);

40: } 41: } 42:

(9)

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)

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

5 Kreise rot/schwarz konzentrisch versetzt

(10)

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 }

(11)

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:

(12)

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

2. Texte für die Antwortmöglichkeiten 1-4 3. Nummer der richtigen Antwort

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

(13)

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'

Referenzen

ÄHNLICHE DOKUMENTE

Nennen Sie jeweils die Elemente der Klasse Duck welche für die Klasse Mouse im gleichen Paket sowie die Klasse Panzerknacker im Paket entenhausen.gauner

Aufgabe 1.1 - Programmieren Lernen [5P] 0,5P pro richtigem Feld Klassifizieren Sie die folgenden Aussagen als richtig oder falsch?. Beim Programmieren lernen… Richtig

Aufgabe 1.1 - Programmieren Lernen [5P] 0,5P pro richtigem Feld Klassifizieren Sie die folgenden Aussagen als richtig oder falsch.. Richtig Falsch Wer die Syntax beherrscht,

Aufgabe 1.1 - Programmieren Lernen [5P] 0,5P pro richtigem Feld Klassifizieren Sie die folgenden Aussagen als richtig oder falsch.. Richtig Falsch Wer die Syntax beherrscht,

Eine Variable, die es pro Klasse (d.h. egal wieviele Objekte erzeugt werden) nur einmal gibt ist eine Klassenvariable; NICHT: Konstante (die kann es auch für Instanzen geben).

Eine Variable, die es pro Klasse (d.h. egal wieviele Objekte erzeugt werden) nur einmal gibt ist eine Klassenvariable; NICHT: Konstante (die kann es auch für Instanzen geben).

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

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