FH D FB 4 Klausur Informatik 2 Sommersemester 2012 Dr. Frank Eckgold Aufgabe Max. Punkte A1 6 A2 4 A3 12 A4 15 Name: ________________________________________________ Matrikelnummer: ________________________________________ Es sind alle schriftlichen Unterlagen, aber keine elektronischen Hilfsmittel zugelassen. Lösungen mit Bleistift oder mit roter Farbe werden nicht gewertet. Für teilweise gelöste Aufgaben werden anteilig Punkte vergeben, sofern eine eigenständige Lösung erkennbar ist Das Lösen der Klammerung wird als Betrugsversuch gewertet! Aufgabe A5 ist optional. Die Summe aller Punkte beträgt max. 48 • • • • • 1 Punkte A5 ist optional A6 11 Σ 48 A5 7 Aufgabe 1 Beantworten Sie bitte folgende Fragen mit einer kurzen Begründung; Antworten ohne Begründung werden nicht gewertet. 1.1 Ist folgender Code syntaktisch korrekt ? Falls ja : Was wird ausgegeben? max Punkte : 3 byte a = 254>>2; System.out.println(a); Ja, korrekt weil und Ausgabe :254 = 11111110, 254 >> 2 = 111111 = 63 Nein, falsch weil : 1.2 Ist dieser Code syntaktisch korrekt? 1 int i = 1747; 2 { max Punkte : 3 3 int j = 0; 4 for(i=0; i<3; i++){ j += i; 5 6 } 7 System.out.println(j); 8 } 9 System.out.println(i); Ja, folgendes wird ausgegeben : (hier keine Begründung erforderlich) Nein, falsch weil : 3 3 FH D FB 4 Klausur Informatik 2 Sommersemester 2012 Dr. Frank Eckgold Aufgabe 2 2 max Punkte : 4 In der Datei mit dem Namen Versuch.java stehen folgende Zeilen: 1 abstract class Versuch{ private int anz; 2 3 public Versuch(){ 4 this.anz = (int) 4711.0; 5 } 6 public int mult(){ 7 return 17*this.anz;//this.Anz; 8 } 9 abstract public double div(); } 10 Korrigieren Sie falls nötig durch Streichen, Ersetzen oder Ergänzen ggf. vorhandene Fehler. Dabei sind die grau unterlegten Zeilen tabu; hier darf nichts geändert werden! Hier ankreuzen, wenn kein Fehler vorhanden ist Aufgabe 3 max Punkte : 12 Folgender Code ist in main.java gegeben: 1 public class main { 2 public static void main(String[] args) { 3 Verein vcb = new Verein("FC Grün Weiss"); 4 boolean ok = vcb.buchung(200000); 5 Fussballclub fc1 = new Fussballclub("Tus Blau"); 6 fc1.buchung(+150000); 7 if(fc1.spielerhinzufuegen("Bodo Ballermann", 20000)){ 8 System.err.println("Der Spieler wurde hinzugefügt!"); 9 }else{ 10 System.err.println("Fehler : Spielerliste ist voll"); 11 } 12 Fussballclub fc2 = fc1.kopie(); 13 fc1.lies_spieler_aus_datei("aktivenliste.txt"); 14 }} FH D FB 4 Klausur Informatik 2 Sommersemester 2012 Dr. Frank Eckgold 3 Programmieren Sie eine Klasse Verein 1. mit folgenden Attributen : a) Vereinsname name, der in der Klasse selbst und in abgeleiteten Klassen sichtbar sein soll b) aktueller Kontostand kontostand, der nur in der Klasse selbst sichtbar sein soll 2. Programmieren Sie einen Konstruktor, dem der Vereinsname als Parameter übergeben wird (siehe Zeile 3 in main.java) und falls nötig weitere Konstruktoren 3. Programmieren Sie folgende 2 Methoden, die in der Klasse selbst und in abgeleiteten Klassen sichtbar sein sollen : a) getkontostand() soll den Wert von Klassenattribut kontostand zurückgeben b) setkontostand(double k) soll das Klassenattribut kontostand mit dem Wert k aus der Parameterliste versehen. 4. Programmieren Sie eine in der Klasse selbst und in abgeleiteten Klassen sichtbare Methode buchung (siehe Zeile 4 in main.java), a) der ein Geldbetrag als Parameter übergeben wird, b) die diesen Betrag zum Kontostand kontostand addiert und c) false zurückgibt, falls das Konto überzogen ist, true sonst In der Datei Verein.java soll den Aufgaben gemäß Programmcode ergänzt werden. Es sind mehr als notwendig freie (weisse) Zeilen vorgegeben . Sollten Ihnen noch leere Zeilen fehlen, schreiben Sie diese bitte auf die Rückseite. 1 class Verein { //3.1 2 3 protected String name; private double kontostand; 4 5 //3.2 6 7 8 9 10 11 12 13 14 public Verein(){ this.name = ""; this.kontostand = 0; } public Verein(String name){ this.name = name; this.kontostand = 0; } FH D FB 4 Klausur Informatik 2 Sommersemester 2012 Dr. Frank Eckgold 4 15 16 //3.3 17 protected double getkontostand(){ return this.kontostand; } 18 protected void setkontostand(double k){ this.kontostand = k; } //3.4 28 protected double buchung(double summe){ this.kontostand += summe; if(this.kontostand < 0) return false; return true; } 29 38 } Aufgabe 4 max Punkte : 15 Programmieren Sie eine Klasse Fussballclub, die von der Klasse Verein abgeleitet wird wie folgt: 1. Die Klasse soll folgende Attribute haben, die alle nur in der Klasse selbst sichtbar sind: a) die maximale Anzahl der Spieler maxanzahlspieler, wobei dieses Attribut eine nicht mehr änderbare Konstante mit dem Wert 25 sein muß b) Ein Feld spielerliste mit der Größe maxanzahlspieler, wobei die Feldelemente jeweils einen Spielernamen aufnehmen können sollen c) die aktuelle Anzahl der Spieler anzahlspieler Tip: das ist dann die aktuelle Anzahl der Einträge in spielerliste 2. Programmieren Sie alle notwendigen Konstruktoren für diese Klasse; beachten Sie dabei die Zeile 5 in main.java. Tip: Hier wird der Vereinsname (Attribut der Superklasse Verein) übergeben. Nutzen Sie einen geeigneten Konstruktor der Superklasse 3. Programmieren Sie eine Methode spielerhinzufuegen, die gemäss Zeile 7 in main.java verwendet werden soll. Diese Methode soll (ab Zeile 22 in Fussballclub.java) den Spielernamen name aus der Parameterliste dem Feld spielerliste hinzufügen, falls noch genug Platz in diesem Feld ist a) nur in diesem Fall die kosten (aus der Parameterliste) für den neuen Spieler vom kontostand (Attribut der Superklasse) abziehen Siehe Tip : Nutzen Sie die Methode buchung der Superklasse. b) die Anzahl der Spieler anzahlspieler aktualisieren Tip : was gibt die Methode gemäß Zeile 7 - 11 in main.java zurück, wenn die spielerliste bereits voll ist; was wenn nicht ? 4. Programmieren Sie eine Methode kopie, die eine Kopie einer Klasseninstanz von Fussballclub zurückgibt gemäß Zeile 12 in main.java. Hier muß eine Kopie von FH D FB 4 Klausur Informatik 2 Sommersemester 2012 Dr. Frank Eckgold 5 allen Attributen der Klasse und der Superklasse erzeugt werden! Tip: verwenden Sie hier die set und get Methoden aus der Klasse Verein. Beachten Sie auch, daß nicht Speicheradressen, sondern Variableninhalte kopiert werden müssen! Im folgenden ist die Datei Fussballclub.java teilweise gegeben und zu ergänzen. Es sind mehr als notwendig freie (weisse) Zeilen vorgegeben . Sollten Ihnen noch leere Zeilen fehlen, schreiben Sie diese bitte auf die Rückseite. 1 import java.io.BufferedReader; 2 import java.io.FileNotFoundException; 3 import java.io.FileReader; 4 import java.io.IOException; 5 6 7 class Fussballclub extends Verein { 8 //4.1 9 private final int maxanzahlspieler = 25; private int anzahlspieler; private String[] spielerliste = new String[maxanzahlspieler]; 12 //4.2 public Fussballclub(){ super();//geht auch automatisch ohne.. this.anzahlspieler = 0; } 13 public Fussballclub(String name){ super(name); this.anzahlspieler = 0; } 22 public boolean spielerhinzufuegen(String name, double kosten){//4.3 if(this.anzahlspieler < this.maxanzahlspieler){ this.spielerliste[this.anzahlspieler] = name; super.buchung(-kosten); this.anzahlspieler++; return true; }else{ return false; } 23 35 } //4.4 36 37 public Fussballclub kopie(){ Fussballclub temp = new Fussballclub(); temp.anzahlspieler = this.anzahlspieler; //for(int i=0;i<this.spielerliste.length; i++){//geht auch FH D FB 4 Klausur Informatik 2 Sommersemester 2012 Dr. Frank Eckgold 6 for(int i=0;i<this.anzahlspieler; i++){ temp.spielerliste[i] = this.spielerliste[i]; } //temp.spielerliste = this.spielerliste;//das ist FALSCH! temp.name = this.name; temp.setkontostand(this.getkontostand()); return temp; } 50 // Die Datei Fussballclub.java wird mit der nächsten Aufgabe fortgesetzt max Punkte : 7 Zusatzaufgabe 5 kann für Ausgleichspunkte optional gelöst werden. Die Gesamtpunktzahl der Klausur bleibt auf 48 Punkte begrenzt. In einer externen Datei mit Namen aktivenliste.txt stehen zeilenweise (unbekannt viele !) Spielernamen. Diese Datei könnte also ausschnittweise so aussehen : Franz Gans Oma Duck Daniel Düsentrieb Daisy Duck Programmieren Sie eine Methode lies_spieler_aus_datei gemäß Zeile 13 in main.java , die 1. alle Zeilen aus einer Datei liest und die eingelesenen Namen dem Feld spielerliste hinzufügt. Dabei sind FileNotFoundException und IOException in einem try - catch Konstrukt abzufangen. Hinweis : die catch-Blöcke dürfen hier aus Zeitgründen leer bleiben 2. dabei darauf achtet, dass die maximale Feldgröße maxanzahlspieler nicht überschritten wird (und ggf. weitere Zeilen der Datei ignoriert) 3. das Attribut anzahlspieler aktuell hält und zurückgibt Tip : achten Sie auf den Parameter der Methode; er enthält den Namen der Datei ! Es sind mehr als notwendig freie Zeilen (weiss) vorgegeben . Sollten Ihnen noch leere Zeilen fehlen, schreiben Sie diese bitte auf die Rückseite. 1 2 // Fussballclub.java wird hier fortgesetzt public int lies_spieler_aus_datei (String dateiname) String line; try{ BufferedReader br = new BufferedReader(new FileReader(dateiname)); while( (line = br.readLine()) != null ){ if(this.anzahlspieler < this.maxanzahlspieler){ this.spielerliste[this.anzahlspieler] = line; this.anzahlspieler++; } } br.close(); } catch(FileNotFoundException e){ } catch(IOException e){ } return this.anzahlspieler; 3 } 24 { } FH D 25 FB 4 Klausur Informatik 2 Sommersemester 2012 Dr. Frank Eckgold 7 }//Ende Fusbballclub.java Aufgabe 6 max Punkte : 11 Gegeben ist im folgenden die Klasse FakultaetGUI in der Datei FakultaetGUI.java. Eine Instanz dieser Klasse soll ein Frame wie nebenstehend mit folgenden Eigenschaften darstellen. Gibt der Nutzer in das obere TextField tf1 eine natürliche Zahl n ein und drückt hier ENTER, wird im unteren TextField tf2 m=n! (sprich n Fakultät) ausgegeben. Bei fehlerhafter Nutzereingabe in tf1 erscheint hier der Text "Eingabefehler". Hinweis : n! = 1*2*3*....*n ; also beispielsweise 3! = 1*2*3 = 6 oder 5!=1*2*3*4*5 = 120 oder (siehe Abb.) 6! = 720 Programmieren Sie in der Datei FakultaetGUI.java folgenden Code: 1. Im Frame werden die zwei Label labIn und labOut aus Zeile 8 verwendet, um den dargestellten Text "n eingeben" und "n! ist :" anzuzeigen. Ergänzen Sie die notwendige Instanzierung beider Label ab Zeile 23. 2. Wie wird ab Zeile 28 das Layout von Frame mit Hilfe der Panel erzeugt? Dabei muß labIn fest links von tf1 und labOut entsprechend neben tf2 stehen. 3. Ab Zeile 48 wird die Nutzereingabe aus TextField tf1 in die Variable eingabe vom Typ int geschrieben. Ergänzen Sie diese Zeile. Tip: die Wrapperklasse für den Basistyp int ist Integer. Oracle liefert darüberhinaus noch folgenden Text: int parseInt(String s) Parses the string argument as a signed decimal integer. 4. In Zeile 59 wird die Methode berechnefakultaet(eingabe) aufgerufen. Diese Methode soll die Fakultät von Parameter eingabe ausrechnen und zurückgeben. Ergänzen Sie den Code für diese Methode ab Zeile 63. Es sind mehr als notwendig freie Zeilen (weiss) vorgegeben. Sollten Ihnen noch leere Zeilen fehlen, schreiben Sie diese bitte auf die Rückseite. 1 import java.awt.*; 2 import java.awt.event.*; 3 class Fakultaet{ 4 //Klassenvariablen 5 private Frame f;//Das Hauptfenster 6 private Panel p1, p2; //2 Container fürs Layout 7 private TextField tf1, tf2;//Textein/ausgabe 8 private Label labIn, labOut; 9 10 public Fakultaet(){ 11 //das frame 12 f = new Frame("Fakultät"); FH D FB 4 Klausur Informatik 2 Sommersemester 2012 Dr. Frank Eckgold 13 f.setSize(600, 400);//Hier : feste Größe einstellen 14 f.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5)); 15 f.setFont(new Font("Arial", Font.PLAIN,18)); 16 //Die Panel 17 p1 = new Panel(); 18 p2 = new Panel(); 19 //Die TextField 's 20 tf1 = new TextField(20); 21 tf2 = new TextField(20); 22 //Die Label 23 24 27 //6.1 labIn = new Label("n eingeben : "); labOut = new Label("n! ist dann : "); //das Layout zusammensetzen 28 29 36 //6.2 p1.add(labIn); p1.add(tf1); p2.add(labOut); p2.add(tf2); f.add(p1); f.add(p2); f.setVisible(true);//Das zeigt das fertige Fenster an 37 38 //Fuers Schliessen des Fensters 39 f.addWindowListener(new WindowAdapter() { 40 public void windowClosing(WindowEvent e) { 41 42 System.exit(0); } 43 }); 44 //Return/Enter-Taste in tf1 45 tf1.addActionListener(new ActionListener() { 46 47 48 49 public void actionPerformed(ActionEvent ae) { try { int eingabe = Integer.parseInt(tf1.getText()); 50 51 52 53 8 ausgabefakultaet(eingabe); } catch (NumberFormatException e) { tf1.setText("Eingabefehler"); FH D FB 4 Klausur Informatik 2 54 Sommersemester 2012 Dr. Frank Eckgold } 55 } 56 }); 57 } 58 private void ausgabefakultaet(int eingabe){ 59 this.tf2.setText(Integer.toString(berechnefakultaet(eingabe))); 60 } 61 //Die Methode berechnet eingabe! als return-Wert 62 private int berechnefakultaet(int eingabe){ 63 //6.4 int fak = 1; if(eingabe > 0){ for(int i=1; i<=eingabe; i++){ fak*=i; } return fak; }else{ return 0; } 64 77 9 } } Es sind mehr als notwendig freie Zeilen (weiss) vorgegeben. Sollten Ihnen noch leere Zeilen fehlen, schreiben Sie diese bitte auf die Rückseite.