Hochschule der Medien Stuttgart Prof. Uwe Schulz Klausur Informatik 2, EDV-Nr. 40303/42022 Name: Teil 1: Keine Hilfsmittel Bearbeitungszeit: 20 Minuten 31. Januar 2006 von 2 Seite 1 Matr. Nr.: Punkte Note 1 (4P) Teil 1 2 (4P) Teil 2 3 (5P) Summe 4 (4P) Bitte verwenden Sie nur den vorhandenen Platz für Ihre Lösung! 1. Schreiben Sie die Klasse Echo4Mal, die EchoGeber erweitert und EchoListener implementiert. Ein Echo4Mal Objekt soll beim Auftreten eines Echo-Ereignisses die Zeichenkette schall viermal auf der Standardausgabe ausgeben. Frage Punkte 5 (3P) interface EchoListener{ public void echoGehoert(String schall); } abstract class EchoGeber{ private int anzahl; public EchoGeber(int anzahl){ this.anzahl = anzahl; } protected void echoGeben(String schall){ for(int i=0;i<anzahl;i++) System.out.println(schall); } } class Echo4Mal extends EchoGeber implements EchoListener{ Echo4Mal(){ super(4); } public void echoGehoert(String schall){ echoGeben(schall); } } 2. Was versteht man unter dem Begriff Zuweisungskompatibilität. 1. Variablen vom Typ einer Basisklasse können auf Objekte von Klassen zeigen, welche von der Basisklasse abgeleitet sind. 2. Variablen vom Typ eines Interface können auch auf Objekte von Klassen zeigen, welche das Interface implementieren. Hochschule der Medien Stuttgart Prof. Uwe Schulz Klausur Informatik 2, EDV-Nr. 40303/42022 31. Januar 2006 von 2 Seite 2 3. Nicht raten: jede richtige Antwort gibt 1/2 Punkt, jede falsche Antwort ¼ Punkt Abzug! Die Fragen zum Programmieren beziehen sich auf die Sprache Java: Wenn die Basisklasse keinen Standardkonstruktor hat, muss in einer abgeleiteten Klasse ein Konstruktor programmiert werden. Eine statische Methode kann gerufen werden, ohne dass ein Objekt der Klasse existiert. Von einer abstrakten Klasse können keine Klassen abgeleitet werden. Die Suche in einer sortierten Liste lässt sich durch einen Algorithmus der Ordnung O(log N) durchführen. In einem AVL Baum gilt für jeden Knoten: die Tiefen seiner Teilbäume unterscheiden sich höchstens um 1. Je höher die Ordnung eine Algorithmus ist, desto größer ist die Wahrscheinlichkeit, dass er in endlicher Zeit fertig wird. Eine Referenz vom Typ eines Interfaces kann auf ein Objekt verweisen, wenn die Klasse, zu der das Objekt gehört, das Interface implementiert. In einem binären Suchbaum enthält die Wurzel das kleinste Element. Die Komplexität der Zugriffsmethoden zu einem Stack [ void push(Object O) und Object pop() ] hat die Ordnung O(1). Eine doppelt verkettete Liste enthält doppelt so viele Einträge wie eine gleich lange einfach verkette Liste. 4. Die nebenstehende Methode implementiert die DCT für einen quadratischen Ausschnitt eines Bildes mit n*n Pixeln. Welche Ordnung hat dieser Algorithmus bezogen auf n (Anzahl Pixel pro Zeile bzw. Spalte)? richtig falsch public static void dctTransformation(double[][] a,double[][] b){ int n=a.length; for(int u=0; u<n; u++) for(int v=0; v<n; v++) b[u][v] = dctWert(a,u,v); } private static double dctWert(double[][] a, int u, int v){ int n=a.length; double f=0.0; for(int i=0; i<n; i++) for(int j=0; j<n; j++) f+=a[i][j]*Math.cos(0.5*Math.PI*(double)(u*(2*i+1))/(double)n) *Math.cos(0.5*Math.PI*(double)(v*(2*j+1))/(double)n); return f; } O(N4) 5. Schreiben Sie eine von JButton abgeleitete Klasse, die einen Knopf mit der Aufschrift „Nicht Klicken“ implementiert, der beim Klick den Text „Du sollst doch nicht Klicken“ auf der Standardausgabe ausgibt. public class F5 extends JButton implements ActionListener{ public F5(){ super("Nicht Klicken"); addActionListener(this); } public void actionPerformed(ActionEvent e){ JOptionPane.showMessageDialog(null, "Du sollst doch nicht Klicken!"); } } Fachhochschule Stuttgart Hochschule der Medien Prof. Uwe Schulz Klausur Informatik 2, EDV-Nr. 40303/ 42022 Name: 31. Januar 2006 Seite 1 von 4 Matr. Nr.: Teil 2: Aufgaben Hilfsmittel: Bearbeitungszeit: Aufgabe alle außer tragbare Computer und Nachbar 40 Minuten Stichwort Punkte 1 Java Programm: Charts 15 2 grafische Anwendung 25 Summe (ein Punkt = 1 Minute) 40 Hinweis: Bitte benutzen Sie den vorgesehenen Raum einschließlich der Rückseiten für Ihre Lösungen. Sollte der Platz nicht ausreichen, nehmen Sie freie Blätter hinzu aber versehen Sie jedes Blatt mit Ihrem Namen, Matrikel Nr. und der Nummer der beantworteten Aufgabe. Aufgabe Punkte 1 2 Summe Benutzen Sie für Ihre Lösung auch die Rückseite des vorherigen Blattes! . Fachhochschule Stuttgart Hochschule der Medien Prof. Uwe Schulz Klausur Informatik 2, EDV-Nr. 40303/ 42022 Datei charts.dat Aufgabe 1 (15 Punkte): Die Datei charts.dat enthält die Interpreten und Titel der aktuellen Charts sowie die Anzahl Stimmen, die jeder Titel bei einer Web-Abstimmung erhalten hat. Eine Zeile enthält jeweils einen Titel, die Bestandteile sind durch senkrechte Striche getrennt. 31. Januar 2006 Seite 2 von 4 Madonna | Lee Ryan| Rasmus | Mattafix| Schreiben Sie eine Java-Anwendung, welche die Titel in der Reihenfolge abnehmender Stimmen ausgibt. Für die nebenstehende Datei charts.dat soll das Programm die nebenstehende Ausgabe erzeugen. Sorry Turn your car around Sail away Big city life | | | | 1543 2834 2230 1844 Die aktuellen Top-Titel: 1. Lee Ryan: Turn your car around 2. Rasmus: Sail away 3. Mattafix: Big city life 4. Madonna: Sorry Die Methode Integer.parseInt(String) wandelt eine Zeichenkette in eine Zahl. Hinweis: - Sie können alle Klassen aus den Übungen verwenden, ohne sie Ihrer Lösung beizulegen. - Es ist hilfreich, eine Klasse Song zu schreiben, die Comparable implementiert. - Eine Kurzreferenz der wichtigsten Klassen liegt der klausur bei. public class Aufgabe1 { public static void main(String[] a){ Vector<Song> songs = new Vector(); try{ LineNumberReader r = new LineNumberReader(new FileReader("charts.dat")); String zeile; while((zeile=r.readLine())!=null){ songs.add(new Song(zeile)); } Collections.sort(songs); System.out.println("Die aktuellen Top-Titel:\n"); int n=1; for(Song s:songs) System.out.println((n++)+": "+s); }catch(Exception e){ e.printStackTrace(); } } } class Song implements Comparable{ private int stimmen; private String interpret, titel; public Song(String zeile){ StringTokenizer st = new StringTokenizer(zeile,"|"); interpret = st.nextToken().trim(); titel = st.nextToken().trim(); stimmen = Integer.parseInt(st.nextToken().trim()); } public int compareTo(Object x){ Song s =(Song) x; if(this.stimmen>s.stimmen) return -1; else if(this.stimmen==s.stimmen) return 0; else return 1; } public String toString(){ return interpret+": "+titel; } } Benutzen Sie für Ihre Lösung auch die Rückseite des vorherigen Blattes! . Fachhochschule Stuttgart Hochschule der Medien Prof. Uwe Schulz Klausur Informatik 2, EDV-Nr. 40303/ 42022 Aufgabe 2 (25 Punkte): Schreiben Sie eine grafische Anwendung, die einen Button und zwei Textfelder enthält. Zunächst trägt der Button die Aufschrift „Start“ und das untere Textfeld zeigt den nebenstehenden Text. Beide Textfelder sind in diesem Zustand nicht editierbar. Wird der Start-Knopf gedrückt, wechselt seine Aufschrift zu „Fertig“, das obere Textfeld wird editierbar und ein Timer startet, der die Sekunden zählt. Ein weiterer Klick auf den Knopf stoppt den Timer und gibt im unteren Textfeld die Anzahl der geschriebenen Worte sowie die dazu benötigte Zeit aus. Worte werden durch Leerzeichen, Komma, Semikolon sowie Zeilenumbruch getrennt. Eine Kurzbeschreibung der notwendigen Klassen und Interfaces sind der Klausur beigefügt. Das Layout der Anwendung spielt keine Rolle, Sie können alle Elemente auf einem Panel unterbringen! Benutzen Sie für Ihre Lösung auch die Rückseite des vorherigen Blattes! . 31. Januar 2006 Seite 3 von 4 Fachhochschule Stuttgart Hochschule der Medien Prof. Uwe Schulz Klausur Informatik 2, EDV-Nr. 40303/ 42022 31. Januar 2006 Seite 4 von 4 public class Aufgabe2 extends JFrame{ public static void main(String[] a){ new Aufgabe2(); } Aufgabe2(){ setSize(400,600); getContentPane().add(new GedichtAufZeitPanel()); setDefaultCloseOperation(EXIT_ON_CLOSE); setVisible(true); } } class GedichtAufZeitPanel extends Box implements ActionListener{ private JTextArea eingabe = new JTextArea(), ausgabe=new JTextArea(); private JButton knopf = new JButton("Start"); private Timer timer; private int zeit=0; GedichtAufZeitPanel(){ super(BoxLayout.Y_AXIS); add(knopf); ausgabe.setText("Druecke den Start-Knopf und schreibe ein Gedicht. "); ausgabe.append("\nSobald Du fertig bist, druecke den Knopf wieder."); ausgabe.append("\nDu erhaelst die Zeit sowie die zahl der Worte."); ausgabe.setEditable(false); eingabe.setEditable(false); add(new JScrollPane(eingabe)); add(new JScrollPane(ausgabe)); knopf.addActionListener(this); timer = new Timer(1000, new Tick()); } public void actionPerformed(ActionEvent e){ if("Start".equals(knopf.getText())){ zeit=0; knopf.setText("Fertig"); timer.start(); eingabe.setEditable(true); eingabe.setText(""); }else{ knopf.setText("Start"); timer.stop(); eingabe.setEnabled(false); StringTokenizer st = new StringTokenizer(eingabe.getText()," ,;.\n"); ausgabe.setText("Das waren "+st.countTokens()+" Worte in "+zeit+"Sekunden"); } } class Tick implements ActionListener{ public void actionPerformed(ActionEvent e){ zeit++; } } } Benutzen Sie für Ihre Lösung auch die Rückseite des vorherigen Blattes! . Kurzreferenz der wichtigsten Klassen und Methoden Klassen JButton (java.lang.Object / java.awt.Component / java.awt.Container / javax.swing.JComponent / javax.swing.AbstractButton) JButton(String t) Void addActionListener(ActionListener a)* Erzeugt JButton mit der Aufschrift t Registriert den ActionListener a JFrame (java.lang.Object / java.awt.Component / java.awt.Container / java.awt.Window / java.awt.Frame) Frame() Erzeugt standard-Frame Frame(String t) Erzeugt Frame mit dem Titel t void setSize(int b, int h) Breite und Höhe festlegen void setDefaultCloseOperation(int o) Legt fest, was beim Schließen des Fensters passiert (z.B. EXIT_ON_CLOSE) Container getContentPane() Gibt die Content-Pane des Frames zurück. JMenuBar getJMenuBar() Gibt die Menüleiste des Frames zurück. void setVisible(boolean v)* Legt fest, ob der Frame gezeigt wird. JLabel (java.lang.Object / java.awt.Component / java.awt.Container / javax.swing.JComponent) JLabel(String t) String getText() void setText(String t) void setHorizontalAlignment(int a) Erzeugt JLabel mit der Aufschrift t Gibt den Inhalt des JLabels zurück Schreibt den Text t Legt die horizontale Ausrichtung fest (z.b. JLabel.RIGHT) JPanel (java.lang.Object / java.awt.Component / java.awt.Container / javax.swing.JComponent) JPanel() void add(Container c) void addMouseListener(MouseListener m) void addMouseMotionListener(MouseMotionListener m) Erzeugt ein standard Panel Legt den Container c auf das Panel Registriert den MouseListener m Registriert den MouseMotionListener m JTextArea (java.lang.Object / java.awt.Component / java.awt.Container / javax.swing.JComponent / javax.swing.JTextComponent) JTextArea(int z, int s) JTextArea(String t, int z, int s) void append(String t) String getText()* void setText(String t)* void setEditable(boolean etb) Erzeugt JTextArea mit z Zeilen und s Spalten Erzeugt JTextArea mit z Zeilen und s Spalten und dem Anfangstext t Erweitert den Text in der Textrea um t Gibt den Inhalt der TextArea zurück Schreibt den Text t in die TextArea Legt fest, ob Inhalt editierbar ist JTextField (java.lang.Object / java.awt.Component / java.awt.Container / javax.swing.JComponent / javax.swing.JTextComponent) JTextField(int n) JTextField(String t) JTextField(String t, int n) String getText()* void setText(String t)* void setHorizontalAlignment(int a) Erzeugt JTextField der Breite n Erzeugt JTextField mit dem Anfangstext t Erzeugt JTextField mit dem Anfangstext t der Breite n Gibt den Inhalt des Textfeldes zurück Schreibt den Text t in das Textfeld Legt die horizontale Ausrichtung fest (z.b. JTextField.RIGHT) javax.swing.JTextArea JTextArea(int rows, int cols) void setText(String s) void append(String s) Erzeugt eine TextArea mit rows Zeilen und cols Spalten Setzt s als Text Hängt s an den Text an Javax.swing.JScrollPane JScrollPane(Component view) Erzeugt eine ScrollPane mit view als Viewport Javax.swing.Timer Timer(int m, ActionListener a) void addActionListener(ActionListener a) boolean isRunning() void start() void stop() Erzeugt einen Timer mit einem Intervall von m Millisekunden und registriert a als ActionListener. a darf null sein. Registriert den ActionListener a Gibt true zurück, wenn der Timer gestartet ist Startet den Timer Stoppt den Timer java.util.StringTokenizer StringTokenizer (String text) StringTokenizer (String text, String trenner) int countTokens() String nextToken() boolean hasMoreTokens() Erzeugt StringTokenizer, der text zerlegt, Trennzeichen " \t\n\r\f" Erzeugt StringTokenizer, der text zerlegt, Trennzeichen aus trenner Liefert Anzahl Tokens Liefert nächstes Token Liefert true, wenn noch weitere Tokens da sind java.io.LineNumberReader LineNumberReader( Reader e) String readLine() Erzeugt einen LineNumberReader Liefert nächste Zeile oder null am Ende der Eingabe java.io.FileReader FileReader(File f) FileReader(String name) Erzeugt einen FileReader, der aus Datei f liest Erzeugt einen FileReader, der aus Datei mit Namen name liest Interfaces java.awt.event.ActionListener public void actionPerformed ActionEvent e) Reagiert auf das registrierte Ereignis java.lang.Comparable public int compareTo(Object x) Liefert -1 wenn this<x, 0 wenn this==x und 1 wenn this>x