Klausurbeispiele- Lösungsvorschlag - DBIS Informatik

Werbung
Universität Innsbruck
Institut für Informatik
Datenbanken und Informationssysteme
Eva Zangerle
2015/06/18
Programmiermethodik
Klausurbeispiele- Lösungsvorschlag
Name:
Matrikelnr:
Prüfungsantritt:
Note:
Aufgabe
mögliche Punkte
1
16
2
18
Total
34
erreichte Punkte
Programmiermethodik – Klausurbeispiele
2
Programmiermethodik – Klausurbeispiele
Aufgabe 1 (Java-Grundlagen)
16 Punkte
a) Gegeben sei die folgende Methodensignatur:
1
public static int computeAverage(List<Integer> inputList)
Implementieren Sie diese Methode basierend auf einer java.util.List, wobei
der Durchschnitt aller in der Liste enthaltenen Werte berechnet werden soll. Achten
Sie dabei auch auf die Möglichkeit leerer Listen und reagieren Sie entsprechend
(IllegalArgumentException). Einen Ausschnitt aus der Dokumentation zum
java.util.List-Interface finden Sie im Anhang in Abbildung ??. (6 Punkte)
Lösung:
1
import java.util.List;
2
3
public int computeAverage(List<Integer> inputList) {
if (inputList.size() == 0) {
4
throw new IllegalArgumentException();
5
6
}
7
return sumList(inputList) / inputList.size();
8
}
9
10
private int sumList(List<Integer> inputList){
11
int sum = 0;
12
for (Integer integer : inputList) {
sum+=integer;
13
14
}
15
return sum;
16
}
b) Betrachten Sie nochmals Ihre Implementierung aus Teilaufgabe 1a. Verfassen Sie
zur computeAverage-Methode einen sinnvollen JUnit-Test im folgenden Template. (3 Punkte)
@Test
3
Programmiermethodik – Klausurbeispiele
public void testListAverage(){
}
Lösung:
1
public class AverageableListTest {
2
3
@Test
4
public void testComputeAverage1() {
5
LinkedList<Integer> test = new LinkedList<Integer>();
6
test.add(3);
7
test.add(6);
8
test.add(9);
9
assertEquals(6, AverageableList.computeAverage(test));
10
}
11
12
@Test
13
public void testComputeAverage2(){
14
LinkedList<Integer> test = new LinkedList<Integer>();
15
test.add(1);
16
assertEquals(1, AverageableList.computeAverage(test));
17
}
18
19
@Test(expected=IllegalArgumentException.class)
20
public void testComputeAverage3(){
21
LinkedList<Integer> test = new LinkedList<Integer>();
22
assertEquals(0, AverageableList.computeAverage(test));
23
}
4
Programmiermethodik – Klausurbeispiele
24
}
c) In welchem Zusammenhang steht die Signatur einer Methode mit dem Prinzip des
Überladens? (4 Punkte)
Lösung:
Signatur = Name der Methode + Liste der Typen der formalen Parameter
Beim Überladen einer Funktion bleibt der Name der Methode erhalten, die
Parameter (Anzahl, Typen) ändern sich hingegen (zur Laufzeit wird dann die
Methode passend zu den übergebenen Parametern aufgerufen)).
d) Wieso ist es in statischen Methoden nicht möglich, das Schlüsselwort this zu
verwenden? (3 Punkte)
Lösung:
In statischen Methoden ist keine this-Referenz vorhanden, da this ein
Zeiger auf das Objekt ist, das bei statischen Methoden nicht vorhanden ist, da
diese an die Klasse gebunden sind.
5
Programmiermethodik – Klausurbeispiele
Aufgabe 2 (Exceptions)
18 Punkte
a) Erklären Sie kurz den Unterschied zwischen System- und Benutzerausnahmen und
geben Sie für jede Art ein Beispiel einer Exception an. (2 Punkte)
Lösung:
Systemausnahmen werden automatische ausgelöst, müssen nicht abgefangen werden (unchecked exceptions; zur Laufzeit). Benutzerausnahmen müssen
hingegen abgefangen werden (checked exceptions).
b) Vervollständigen Sie den Code der Erzeugung einer InvalidInputFormatExceptionKlasse. Dabei soll der Exception ein String message übergeben werden können,
der den aufgetretenen Fehler beschreibt. (3 Punkte)
public class InvalidInputFormatException extends _______________ {
}
Lösung:
1
package Exceptions;
2
3
4
public class InvalidInputFormatException extends Exception {
public InvalidInputFormatException(String message){
super(message);
5
6
}
6
Programmiermethodik – Klausurbeispiele
7
public InvalidInputFormatException() {
8
9
}
10
11
}
c) In welchen Fällen würden Sie try/catch und in welchen Fällen würden Sie
throws verwenden? Führen Sie auch jeweils ein Beispiel an. (3 Punkte)
Lösung:
Beim try/catch werden die Ausnahmen direkt aufgefangen und auch
behandelt. Bei einem throws wird die Ausnahme weitergereicht, bis gecatcht
wird (oder Programm bricht ab). Exceptions sollten dort behandelt (try/catch)
werden, wo die Behandlung sinnvoll ist (meist wo die Exception aufgetreten ist
bzw. dort, wo alle benötigten Informationen zur Behandlung vorhanden sind).
Beispiel siehe Musterlösung 2f.
d) Was passiert, wenn eine Exception nirgends abgefangen wird? (2 Punkte)
Lösung:
Das Programm wird abgebrochen, wenn keine Catch-Klausel gefunden
wird.
e) Betrachten Sie folgenden Code, der eine vorgegebene CSV-Datei einliest und in eine
Map speichert. Der Inhalt dieser CSV-Datei kann wie folgt aussehen und besteht
stets aus dem Namen einer Person und vier Integer-Werten.
1
Max Mustermann,1,3,6,7
2
Marianne Mustermann,3,58,39,0
In diesem Code fehlt zu großen Teilen das Exception-Handling. Fügen Sie das
Handling der Exceptions hinzu und vervollständigen Sie das Programm (entweder
direkt im Code oder Sie geben den einzufügenden Code und die Zeilennummer an,
in der Sie den Code einfügen möchten). Achten Sie dabei auf folgende Punkte:
• Der FileReader kann eine FileNotFoundException werfen.
7
Programmiermethodik – Klausurbeispiele
• Die Methode readline() kann eine IOException werfen.
• Verwenden Sie die InvalidInputFormatException, falls die EingabeDatei nicht der Vorgabe entspricht.
• Eine NumberFormatException kann beim Parsen von String-Werten in
numerische Werte auftreten.
(8 Punkte)
8
Programmiermethodik – Klausurbeispiele
1
public class CustomFileReader {
public static Map<String, List<Integer>> readFile(String filePath,
2
int noOfExpectedFields) {
Map<String, List<Integer>> result = new HashMap<String, List<
3
Integer>>();
File file = new File(filePath);
4
5
6
String currentLine = null;
7
String[] items;
8
try(BufferedReader reader = new BufferedReader(new FileReader(file
));) {
while((currentLine = reader.readLine()) != null){
9
10
items = currentLine.split(",");
11
if(items.length != noOfExpectedFields){
12
13
}
14
List<Integer> values = new LinkedList<Integer>();
15
for(int i = 1; i < items.length; i++){
values.add(Integer.valueOf(items[i]));
16
17
}
18
result.put(items[0], values);
}
19
20
}
21
return result;
}
22
23
public static void main(String[] args) {
24
Map<String, List<Integer>> fileContent = readFile("inputCSV.csv",
25
5);
System.out.println(fileContent);
26
}
27
28
}
9
Programmiermethodik – Klausurbeispiele
Lösung:
1
package Exceptions;
2
3
import java.io.BufferedReader;
4
import java.io.File;
5
import java.io.FileNotFoundException;
6
import java.io.FileReader;
7
import java.io.IOException;
8
import java.io.InputStreamReader;
9
import java.util.HashMap;
10
import java.util.LinkedList;
11
import java.util.List;
12
import java.util.Map;
13
14
15
16
public class CustomFileReader {
public static Map<String, List<Integer>> readFile(String
filePath, int noOfExpectedFields) throws
FileNotFoundException{
17
Map<String, List<Integer>> result = new HashMap<String, List<
Integer>>();
18
File file = new File(filePath);
19
String currentLine = null;
20
String[] items;
21
try(BufferedReader reader = new BufferedReader(new FileReader(
file));) {
22
while((currentLine = reader.readLine()) != null){
23
items = currentLine.split(",");
24
if(items.length != noOfExpectedFields){
25
throw new InvalidInputFormatException("CSV-Format not valid
10
Programmiermethodik – Klausurbeispiele
");
26
}
27
List<Integer> values = new LinkedList<Integer>();
28
for(int i = 1; i < items.length; i++){
values.add(Integer.valueOf(items[i]));
29
30
}
31
result.put(items[0], values);
}
32
} catch (IOException | InvalidInputFormatException e) {
33
34
System.out.println("currentLine: " + currentLine );
35
e.printStackTrace();
}
36
37
38
return result;
39
40
}
41
42
public static void main(String[] args) {
43
try {
44
Map<String, List<Integer>> fileContent = readFile("inputCSV.
45
csv", 5);
System.out.println(fileContent);
46
} catch (FileNotFoundException e) {
47
System.out.println("Could not find file, exiting");
48
}
49
}
50
51
}
11
Programmiermethodik – Klausurbeispiele
12
Herunterladen