Lösung - Hochschule Esslingen

Werbung
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'
Herunterladen