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