Lösungen Klausur 19. Juli 2012

Werbung
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.
Herunterladen