Probeprüfung Lösung

Werbung
INE2 – Informatik für Ingenieure 2
Semesterendprüfung INE2
Studiengang ET / ST, 19. Juni 2015
Name, Vorname
Aufg1
Klasse
Aufg2
/18
Aufg3
/ 18
Punkte
Aufg4
/ 18
Note
Aufg5
/ 18
/ 18
Wichtige Hinweise
Zeit
90 Minuten
Punktzahl total
90 maximal; alle Aufgaben haben dasselbe Gewicht
Hilfsmittel
– Maximal zwei A4-Blätter Zusammenfassung / Notizen
– Maximal zwei leere Blätter für zusätzliche Lösungen
– Keine elektronischen Hilfsmittel (Handy, Taschenrechner...)
– Keine Schreibblocks und sonst nichts Unnötiges auf dem Tisch
Lösungen
Schreiben Sie die Lösungen soweit möglich auf die Aufgabenblätter.
Sie können auch die Rückseite der Aufgabenblätter benutzen. Wenn nötig
verwenden Sie zusätzliche Blätter.
Schreiben Sie weder mit Bleistift noch mit roter Farbe.
Abgabe
Überprüfen Sie, ob die Prüfungsmappe, die Aufgabenblätter sowie alle
separat abgegebenen Blätter mit Namen und Klasse beschriftet sind.
Legen Sie alle abzugebenden Blätter in die Prüfungsmappe (den Platzzettel
mit Ihrem Namen ganz oben) und lassen Sie diese nach der Prüfung an
ihrem Platz liegen.
adrs, bazz – 19.6.2015
Seite 1 von 16
INE2 – Informatik für Ingenieure 2
Aufgabe 1: Variablen-Salat und Polymorphismus
Welchen Output erzeugt das folgende JAVA-Programm, wenn es ausgeführt wird?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class Aufg12 {
public static void
Ding einDing,
einDing = new
nochEinDing =
main(String[] args) {
nochEinDing, temp;
Ding(3);
new AnderesDing(5,7);
temp=einDing; einDing=nochEinDing; nochEinDing=temp;
einDing.tuwas();
nochEinDing.tuwas();
System.out.println(einDing);
System.out.println(nochEinDing);
}
}
class Ding {
private int a, b;
public Ding (int a) { this.a=a; b=2; }
public void tuwas() { b=2*b; }
public String toString() { return "a="+a+"; b="+b; }
}
class AnderesDing extends Ding {
private int c;
public AnderesDing (int a, int c) { super(a); this.c=c; }
public void tuwas() { c=2*c; }
public String toString() { return super.toString()+"; c="+c; }
}
a=5; b=2; c=14
a=3; b=4;
adrs, bazz – 19.6.2015
Seite 2 von 16
INE2 – Informatik für Ingenieure 2
Aufgabe 2: Arrays
Schreiben Sie eine JAVA-Methode, die eine Matrix, die als Parameter übergeben wird (zweifach
indiziertes Array von Elementen vom Datentyp double), auf System.out ausgibt. Je ein
Teil-Array (= eine Zeile) der Matrix soll in eine Zeile des Outputs geschrieben werden, die
Elemente durch je ein Tabulatorzeichen getrennt. Die Methode soll auch dann richtig
funktionieren, falls die Teil-Arrays (= Zeilen) der Matrix unterschiedlich lang sind.
a)
Schreiben Sie die Signatur (= Aufrufschnittstelle) der Methode mit einem aussagekräftigen
Namen und Parameterliste gemäss Spezifikation.
(3 Punkte)
void printArray(double[][] data);
b) Codieren Sie die Methode vollständig.
(9 Punkte)
void printArray(double[][] data) {
for (int i = 0; i < data.length; i++) {
for (int j = 0; j < data[i].length; j++) {
System.out.print(""+data[i]+"\t");
}
System.out.println();
}
}
c) Schreiben Sie eine passende Deklaration und Initialisierung einer Variablen für die Matrix
a=
(die Zeilen der Matrix sind unterschiedlich lang!) und einen Aufruf
der Methode mit diesem Beispiel als Testfall
(N.B. Teilaufgabe c) ist unabhängig von Teilaufgabe b)
(6 Punkte)
double[][] a = {{1},{1.0/2,1.0/3},{1.0/3,1.0/4, 1.0/5}};
adrs, bazz – 19.6.2015
Seite 3 von 16
INE2 – Informatik für Ingenieure 2
Aufgabe 3: File I/O, String.split
Die Daten eines Mitgliederverwaltungsprogramms sind in der Textdatei Mitglieder.txt
abgelegt. Die Mitglieder sind zeilenweise abgelegt. Das erste Zeichen zeigt den Status des
Mitglieds: „A“ aktiv, „Z“ ausgetreten, „X“ gesperrt. Weiter sind Nachname, Name und Eintritt
gespeichert. Hier ein Beispiel:
A,Meier,Hans,2009
X,Spiri,Ueli,2005
Z,Menzi,Karl,2005
A,Widmer,Franz,1995
…
a) In der Applikation sind die Personendaten in einer Arrayliste mitglieder, welche aus
Instanzen der Klasse Mitglied besteht, gespeichert.
Schreiben Sie eine passende Definition und Initialisierung für die Arrayliste.
List<Mitglied>
(3 Punkte)
new ArrayList<Mitglied> ()
______________________________ mitglieder = ___________________
class Mitglied {
char status;
String vorname;
String name;
int jg;
}
b) Die einzelnen Elemente der eingelesenen Zeilen werden in den Instanzen der Klasse
Mitglied gespeichert. Schreiben Sie einen geeigneten Konstruktor für die Klasse Mitglied.
(3 Punkte)
Mitglied (char status, String vorname, String name, int jg) {
this.status = status;
this.vorname = vorname;
this.name = name;
this.jg = jg;
}
adrs, bazz – 19.6.2015
Seite 4 von 16
INE2 – Informatik für Ingenieure 2
c)
Schreiben Sie eine Methode (nur diese)
public void ladeAktive ();,
welche die einzelnen Zeilen der Datei einliest und die aktiven Mitglieder in die Arrayliste
mitglieder schreibt. Verwenden Sie für die Filterung der Zeilen geeignete Methoden.
Fangen Sie mögliche Exceptions beim Einlesen der Datei ab. Ungültige Zeilen (zuviele oder
zu wenige Elemente) werden ignoriert.
(12 Punkte)
void ladeActive(String fileName) {
String line;
mitglieder.clear();
BufferedReader inFile = new BufferedReader(new FileReader(fileName));
while (((line = inFile.readLine() ) != null)) {
String[] items = line.split("[,]+");
char status = items[0].charAt(0);
if (status == 'A' && items.length == 4) {
Mitglied s = new Mitglied (status,items[1],
items[2],items[3],Integer.parseInt(items[4]));
mitglieder.add(s);
}
}
inFile.close();
}
adrs, bazz – 19.6.2015
Seite 5 von 16
INE2 – Informatik für Ingenieure 2
Aufgabe 4: Exceptions
a)
Schreiben Sie eine JAVA-Methode (nur diese) public static long xHochY
(final int x, final int y), die, wie der Name sagt, die Potenz xy als longWert berechnet und zurückgibt. Falls y<0 ist, soll die Methode eine
IllegalArgumentException mit einer aussagekräftigen Fehlermeldung werfen. Die
Methode muss sich nicht um einen allfälligen Überlauf kümmern, falls das Ergebnis zu gross
wird.
(6 Punkte)
public static long xHochY(final int x, final int y)
throws IllegalArgumentException {
if (y < 0) throw new IllegalArgumentException("<0");
long res = 1;
for (int i = 0; i < y; i++) {
res *= x;
}
return res;
}
b) Schreiben Sie Version 2 der Methode public static long xHochY
(final int x, final int y), die, falls das Ergebnis zu gross wird um als longWert berechnet zu werden, also bei Überlauf, eine LongOverflowException mit einer
aussagekräftigen Fehlermeldung wirft. In JAVA ist der Datentyp long ein 64-Bit signed
Integer; der grösste darstellbare Wert steht als Konstante MAX_VALUE in der WrapperKlasse java.lang.Long.
(6 Punkte)
public static long xHochY(final int x, final int y)
throws IllegalArgumentException,LongOverflowException {
if (y < 0) throw new IllegalArgumentException("<0");
long res = 1;
for (int i = 0; i < y; i++) {
if ((double)res*x > Long.MAXVALUE) throw L.O.E ("to big");
res *= x;
}
return res;
}
c)
Schreiben Sie die Klasse LongOverflowException als Unterklasse von
java.lang.ArithmeticException, so dass sie insbesondere auch in Teilaufgabe b)
verwendet werden kann.
(3 Punkte)
public class LongOverflowException extends ArithmeticException {
public LongOverflowException (String msg) {
super(msg);
}
}
adrs, bazz – 19.6.2015
Seite 6 von 16
INE2 – Informatik für Ingenieure 2
d) Schreiben Sie einen Aufruf der obigen Methode
static long xHochY (final int x, final int y), bei dem eine allfällige
LongOverflowException, nicht aber andere Exceptions, abgefangen und durch Aufruf
der Methode static void logException (Exception e) protokolliert wird.
(Sie können voraussetzen, dass diese Methode vorhanden ist.)
(3 Punkte)
try {
long l = xHochY(4,2);
} catch (LongOverflowException e) {
logException(e.getMessage());
}
adrs, bazz – 19.6.2015
Seite 7 von 16
INE2 – Informatik für Ingenieure 2
Aufgabe 5: Anwendung mit einfachem GUI
Für eine Simulation wird eine Applikation mit einem einfachen GUI (=Graphical User Interface)
geschrieben. Mit der Applikation kann eine Ellipse gezeichnet werden. Die Fläche und der Umfang wird in der Statuszeile ausgewiesen. Die Ellipse kann wahlweise mittels mit der Maus (klikken, fahren & gedrückt halten, loslassen) oder mittels Eingabe der Wertepaare x0/y0, x1/y1 erfolgen. Im zweiten Fall muss „Zeichne“ gedrückt werden.
Die Applikation sieht etwa so aus:
Das zugehörige Klassendiagramm sieht folgendermassen aus:
adrs, bazz – 19.6.2015
Seite 8 von 16
INE2 – Informatik für Ingenieure 2
a) Die GUI enthält Objekte der Klassen JFrame,
JPanel, Canvas, JButton, JTextField, JLabel.
Zeichnen Sie die Hierarchie der der GUI
Elemente als Baum auf. (Beispiel nebenan)
JFrame
(2 Punkte)
BorderLayout JPanel
(contentPane)
GridLayout
JPanel
JLabel (0..3)
JPanel
JTextField (0..3)
FlowLayout
JPanel
JLabel
b) Die GUI wird mittels Layouts
(BorderLayout, FlowLayout, GridLayout,
…). Zeichen Sie in der Hierarchie oben die
Layouts, welche zum Einsatz kommen mit
Rahmen ein. (siehe Beispiel nebenan)
(2 Punkte)
adrs, bazz – 19.6.2015
Seite 9 von 16
INE2 – Informatik für Ingenieure 2
c) Ergänzen Sie den Aufbau der von Ihnen oben beschriebenen GUI (8 Punkte)
// Variable
public static JFrame fenster;
…
JTextField x0,y0,x1,y1;
JButton action;
JLabel status;
public static void main(String[] args) {
new Aufg12_GUI();
fenster.pack();
fenster.setVisible(true);
}
public Aufg12_GUI() {
fensterErzeugen();
}
private void fensterErzeugen() {
//Definition der GUI Elemente
…
// Definition der GUI Listener
…
adrs, bazz – 19.6.2015
Seite 10 von 16
INE2 – Informatik für Ingenieure 2
// Definition des GUI-Layouts
Container contentPane = fenster.getContentPane();
…
JPanel contenPane = (JPanel) this.getContentPane();
contenPane .setBackground(Color.LIGHT_GRAY);
// set layout of content
panel.setLayout(new BorderLayout());
JPanel maskPanel = new JPanel(new GridLayout(0, 5, 10, 10));
maskPanel.add(new JLabel("x="));
maskPanel.add(x0 = new JTextField(30));
...
contentPane.add(BorderLayout.NORTH, maskPanel);
JPanel statusPanel = JPanel(new FlowLayout());
status = new JLabel();
statusPanel.add(status);
contentPane.add(BorderLyout.SOUTH, statusPanel);
action.addActionListener(this);
this.addMouseListener(this)
}
d) Flächen- und Umfangberechnung: Schreiben Sie zwei Methoden, welche Fläche und
Umfang der Ellipse berechnen. a und b sind die Halbachsen der Ellipse.
- Die Fläche F wird wie folgt berechnet F = π * a * b
- Der Umfang C kann mit der Näherungsformel nach Ramanujan berechnet werden:
Schreiben Sie die Methoden public double getFlaeche(); und public double
getUmfang();. (6 Punkte)
public double getFlaeche() {
double a = Math.abs(Double.parseDouble(x1.getText())
…
Double.parseDoubel(x2.getText()));
double f = Math.PI * a * b;
}
public double getUmfang() {
…
double a = Math.abs(Double.parseDouble(x1.getText())
Double.parseDoubel(x2.getText()));
...
}
adrs, bazz – 19.6.2015
Seite 11 von 16
INE2 – Informatik für Ingenieure 2
Anhang: Auszug aus JDK-Help
javax.swing.AbstractButton
public abstract class AbstractButton extends JComponent
...
Method Summary
Modifier and Type
Method and Description
void
addActionListener(ActionListener l)
Adds an ActionListener to the button.
java.awt.event.ActionListener
public interface ActionListener extends EventListener
Method Summary
Modifier and Type
Method and Description
void
actionPerformed(ActionEvent e)
Invoked when an action occurs.
java.lang.ArithmeticException
public class ArithmeticException extends RuntimeException
Constructor Summary
Constructor and Description
ArithmeticException()
Constructs an ArithmeticException with no detail message.
ArithmeticException(String s)
Constructs an ArithmeticException with the specified detail message.
java.awt.BorderLayout
public class BorderLayout extends Object
implements LayoutManager2, Serializable
java.io.BufferedReader
public class BufferedReader extends Reader
Constructor Summary
Constructor and Description
adrs, bazz – 19.6.2015
Seite 12 von 16
INE2 – Informatik für Ingenieure 2
BufferedReader(Reader in)
Creates a buffering character-input stream that uses a default-sized input buffer.
Method Summary
Modifier and Type
Method and Description
void
close()
Closes the stream and releases any system resources
associated with it.
String
readLine()
Reads a line of text. Returns null on EOF
java.io.FileReader
public class FileReader extends InputStreamReader
Constructor Summary
Constructor and Description
FileReader(String fileName)
Creates a new FileReader, given the name of the file to read from.
java.awt.FlowLayout
public class FlowLayout extends Object
implements LayoutManager, Serializable
java.awt.GridLayout
public class GridLayout extends Object
implements LayoutManager, Serializable
java.io.IOException
public class IOException extends Exception
Direct Known Subclasses: …, FileNotFoundException, …
...
Methods inherited from class java.lang.Throwable
..., getMessage, ..., printStackTrace, ..., toString, ...
javax.swing.JButton
public class JButton extends AbstractButton
...
Methods inherited from class javax.swing.AbstractButton
..., addActionListener, ...
adrs, bazz – 19.6.2015
Seite 13 von 16
INE2 – Informatik für Ingenieure 2
java.lang.Math
public final class Math extends Object
Field Summary
Modifier and Type
Field and Description
static double
PI
The double value that is closer than any other to pi, the
ratio of the circumference of a circle to its diameter.
Method Summary
Modifier and Type
Method and Description
static double
sqrt(double a)
Returns the correctly rounded positive square root of a
double value.
java.awt.event.MouseListener
public interface MouseListener extends EventListener
Method Summary
Modifier and Type
Method and Description
void
mouseClicked(MouseEvent e)
Invoked when the mouse button has been clicked (pressed
and released) on a component.
void
mouseEntered(MouseEvent e)
Invoked when the mouse enters a component.
void
mouseExited(MouseEvent e)
Invoked when the mouse exits a component.
void
mousePressed(MouseEvent e)
Invoked when a mouse button has been pressed on a
component.
void
mouseReleased(MouseEvent e)
Invoked when a mouse button has been released on a
component.
adrs, bazz – 19.6.2015
Seite 14 von 16
INE2 – Informatik für Ingenieure 2
java.io.PrintStream
public class PrintStream extends FilterOutputStream
implements Appendable, Closeable
Method Summary
Modifier and Type
Method and Description
void
print(String s)
Prints a string.
void
println()
Terminates the current line by writing the line separator
string.
void
println(String x)
Prints a String and then terminates the line.
java.lang.String
public final class String extends Object implements Serializable,
Comparable<String>, CharSequence
Method Summary
Modifier and Type
Method and Description
int
indexOf(int ch)
Returns the index within this string of the first occurrence of
the specified character.
int
indexOf(int ch, int fromIndex)
Returns the index within this string of the first occurrence of
the specified character, starting the search at the specified
index.
int
indexOf(String str)
Returns the index within this string of the first occurrence of
the specified substring.
int
indexOf(String str, int fromIndex)
Returns the index within this string of the first occurrence of
the specified substring, starting at the specified index.
String[]
split(String regex)
Splits this string around matches of the given regular
expression.
boolean
startsWith(String prefix)
Tests if this string starts with the specified prefix.
String
substring
(int beginIndex, int endIndex)
Returns a new string that is a substring of this string.
java.lang.System
public final class System extends Object
adrs, bazz – 19.6.2015
Seite 15 von 16
INE2 – Informatik für Ingenieure 2
Field Summary
Modifier and Type
Field and Description
static PrintStream
out
The "standard" output stream.
java.lang.Throwable
public class Throwable extends Object implements Serializable
Direct Known Subclasses: Error, Exception
Method Summary
Modifier and Type
Method and Description
String
getMessage()
Returns the detail message string of this throwable.
void
printStackTrace()
Prints this throwable and its backtrace to the standard error
stream.
String
toString()
Returns a short description of this throwable.
adrs, bazz – 19.6.2015
Seite 16 von 16
Herunterladen