PDA - Klausur mit Lösungen PDF

Title PDA - Klausur mit Lösungen
Author Beqa Mskhvilidze
Course Algorithmen und Programmierung
Institution Carl von Ossietzky Universität Oldenburg
Pages 19
File Size 301.4 KB
File Type PDF
Total Downloads 7
Total Views 146

Summary

Alte Klausur mit Lösungen...


Description

Nachklausur zur Lehrveranstaltung „Programmierkurs Java“ WS 2010/2011

Department für Informatik Dr.-Ing. Dietrich Boles

Nachklausur Gruppe A (Aufgaben) Termin: Mittwoch, den 30.03.2011, 10.45 – 13.45 Uhr

Die Klausur besteht aus 5 Aufgaben. Verschaffen Sie sich zunächst einen kurzen Überblick über die Aufgaben und beginnen Sie mit der Aufgabe, die Ihnen am einfachsten zu sein scheint.     

Schreiben Sie bitte auf die beigefügten zusammengehefteten Lösungsblätter. Sie dürfen keine anderen Blätter als die zusammengehefteten Lösungsblättern beschreiben. Schreiben Sie Ihren Namen und Ihre Matrikelnummer auf das vorderste Lösungsblatt. Sie dürfen die zusammengehefteten Lösungsblätter nicht trennen! Geben Sie am Ende der Klausur nur die zusammengehefteten Lösungsblätter ab.

 

Legen Sie Ihren Personalausweis neben sich! Bei Verständnisfragen heben Sie bitte den Arm; das „Aufsichtspersonal“ bemüht sich dann um eine Klärung. Bei Täuschungsversuchen wird Ihre Klausur sofort eingezogen und mit 0 Punkten gewertet! Schreiben Sie leserlich! Nicht lesbare oder unklare Teile werden mit 0 Punkten bewertet. Ansonsten gelten die im StudIP bekanntgegebenen „Hinweise zur Klausur“.

  

Viel Erfolg !

Nachklausur „PK Java“ WS 2010/2011

2

Aufgabe 1 (Programmentwicklung)

max. 20 Punkte

„Glückspiel“ ist ein Spiel für zwei Spieler. Es wird über mehrere Spielrunden gespielt bis ein Spieler 5 Punkte erreicht hat. Dieser Spieler hat dann gewonnen. Eine Spielrunde läuft wie folgt ab:  Der Computer generiert eine geheime Zufallszahl zwischen 0 und 9.  Die Spieler geben nacheinander eine Zahl ein. Dabei darf der zweite Spieler nicht dieselbe Zahl eingeben wie der erste Spieler.  Für jeden Spieler wird die Differenz zwischen seiner Zahl und der generierten Zufallszahl berechnet. Der Spieler mit der niedrigeren Differenz erhält einen Punkt. Ist die Differenz bei beiden Spielern gleich, erhält keiner der Spieler einen Punkt. Damit es fair zugeht, wechselt in jeder Spielrunde der Spieler, der als erster seine Zahl eingibt. In der ersten Spielrunde beginnt Spieler 1, in der zweiten Spieler 2, usw. Implementieren Sie (auf imperative Art und Weise) das Spiel „Glückspiel“ derart, dass es zwei menschliche Spieler gegeneinander spielen können. Behandeln Sie fehlerhafte Benutzereingaben adäquat. Orientieren Sie sich an dem folgenden beispielhaften Programmablauf (Eingaben stehen in ): Ich habe eine Zufallszahl zwischen 0 und 9 generiert! Spieler 1, deine Zahl: Spieler 2, deine Zahl: Zufallszahl war die 2 Spieler 2 gewinnt die Runde Spielstand: Spieler 1 hat 0 Punkte; Spieler 2 hat 1 Punkte. Ich habe eine Zufallszahl zwischen 0 und 9 generiert! Spieler 2, deine Zahl: Spieler 1, deine Zahl: Zufallszahl war die 7 Spieler 1 gewinnt die Runde Spielstand: Spieler 1 hat 1 Punkte; Spieler 2 hat 1 Punkte. Ich habe eine Zufallszahl zwischen 0 und 9 generiert! Spieler 1, deine Zahl: Spieler 2, deine Zahl: Zufallszahl war die 5 Spieler 1 gewinnt die Runde Spielstand: Spieler 1 hat 2 Punkte; Spieler 2 hat 1 Punkte. ... Ich habe eine Zufallszahl zwischen 0 und 9 generiert! Spieler 1, deine Zahl: Spieler 2, deine Zahl: Zufallszahl war die 7 Spieler 2 gewinnt die Runde Spielstand: Spieler 1 hat 2 Punkte; Spieler 2 hat 5 Punkte. Spieler 2 hat gewonnen

2

Nachklausur „PK Java“ WS 2010/2011

3

Aufgabe 2 (Umgang mit Objekten)

max. 20 Punkte

Gegeben seien folgende Klassen: class FachNote { private String fach; // das Fach (Deutsch, Mathe, ...) private int note; // die Note in dem Fach (1 .. 6) public FachNote(String fach, int note) { this.fach = fach; this.note = note; } public String getFach() { return this.fach; } public int getNote() { return this.note; } } class Schueler { private String name; // Name des Schuelers private FachNote[] noten; // Noten in den einzelnen Faechern public Schueler(String name, FachNote[] noten) { this.name = name; this.noten = noten; } public String getName() { return this.name; } public FachNote[] getNoten() { return this.noten; } } class NichtBelegtesFachException extends Exception { private String fach; // Name des nicht belegten Faches public NichtBelegtesFachException(String fach) { this.fach = fach; } public String getFach() { return this.fach; } } 3

Nachklausur „PK Java“ WS 2010/2011

4

Implementieren Sie auf der Grundlage dieser Klassen die folgende Funktion: /** * Berechnet die Durchschnittsnote der uebergebenen Schueler in dem * uebergebenen Fach. * Hinweis: nicht alle Schueler muessen dieselben Faecher * belegen. * * @param schueler Menge an Schuelern (!= null) * @param fach Name des Faches (!= null) * @return die Durchschnittsnote der uebergebenen Schueler in dem * uebergebenen Fach * @throws NichtBelegtesFachException * wird geworfen, wenn kein Schueler das uebergebene Fach belegt */ static double durchschnittsnote(Schueler[] schueler, String fach) throws NichtBelegtesFachException

4

Nachklausur „PK Java“ WS 2010/2011

5

Aufgabe 3 (Klassendefinition)

max. 20 Punkte

Beim Online-Banking muss sich der Bankkunde zunächst mit seiner Kontonummer und einer persönlichen Identifikationsnummer (PIN) am Bankrechner authentifizieren. Für das Auslösen sicherungspflichtiger Aufträge (z. B. einer Überweisung) muss außerdem eine Transaktionsnummer (TAN) übermittelt werden. Diese wird aus einer Liste von 100 TANs entnommen, die dem Kunden vorher zugeschickt und durch ihn freigegeben wurde. An die Transaktionsnummern werden folgende Bedingungen gestellt:  Eine TAN ist eine zufällige 6-ziffrige Zahl zwischen 100000 und 999999.  Jede TAN kommt nur einmal vor.  Jede TAN darf nur einmal verwendet werden. Folgendes ist eine gültige TAN-Liste: 963002 255549 821065 914790 138872 626526 100456 378822 219681 297252

701837 921595 172984 647546 724491 370290 958189 368426 835335 120304

543423 447899 527924 166143 488188 910463 774141 238388 844747 248315

239150 626258 801503 805788 712325 951473 589685 835745 808295 410165

526763 781718 820360 514630 415943 554520 361569 121001 524834 332899

924103 527762 993706 531489 665750 500185 620076 578457 683175 947068

396054 802132 631421 548688 728851 608195 901807 852160 212941 713189

411076 157715 520026 699481 511410 761195 299068 497733 301816 278126

977108 797227 454031 397882 248348 107366 598361 155579 292159 422161

857169 781895 869184 154254 253840 297942 838014 560223 620207 983132

Aufgabe: Implementieren Sie eine Klasse TANListe zur Verwaltung entsprechender Transaktionsnummern. Überlegen Sie sich zunächst eine Datenstruktur zur Speicherung von 100 TANs. Dabei sollen sowohl der Wert jeder TAN als auch ihr Zustand (verbraucht/nicht verbraucht) erfasst werden. Implementieren Sie dann die folgenden Methoden: 1. Einen Konstruktor, in dem die 100 nicht-verbrauchten TANs der TAN-Liste erzeugt und gespeichert werden. 2. Eine boolesche Methode verbrauchen mit einem int-Wert als Parameter. Die Methode soll prüfen, ob (im Parameter) eine gültige, nicht verbrauchte TAN der TAN-Liste übermittelt wurde. In diesem Fall soll die TAN in der Liste als verbraucht markiert sowie der Rückgabewert true geliefert werden. In allen anderen Fällen soll false zurückgegeben werden. 3. Eine Methode print, durch die die noch nicht verbrauchten TANs der TAN-Liste auf den Bildschirm ausgegeben werden.

5

Nachklausur „PK Java“ WS 2010/2011

Aufgabe 4 (Exceptions)

6

max. 20 Punkte

Ein Programmierer A hat anderen Programmierern folgende Klasse Util mit nützlichen Funktionen zur Verfügung gestellt: public class Util { // liefert die kleinste Zahl des uebergebenen Arrays public static int minimum(int[] werte) { int min = werte[0]; for (int i = 1; i < werte.length; i++) { if (werte[i] < min) min = werte[i]; } return min; } // konvertiert den uebergebenen String in einen int-Wert public static int toInt(String str) { int erg = 0, faktor = 1; char ch = str.charAt(0); switch (ch) { case '-': faktor = -1; break; case '+': faktor = 1; break; default: erg = ch - '0'; } for (int i = 1; i < str.length(); i++) { ch = str.charAt(i); int ziffer = ch - '0'; erg = erg * 10 + ziffer; } return faktor * erg; } // liefert die Potenz von zahl mit exp, also zahl "hoch" exp public static long hoch(long zahl, int exp) { if (exp == 0) return 1L; return zahl * hoch(zahl, exp - 1); } // Testprogramm public static void main(String[] args) { String eingabe = IO.readString("Zahl: "); int zahl = toInt(eingabe); System.out.println(zahl + " hoch " + zahl + " = " + hoch(zahl, zahl)); } } Er vertraut dabei darauf, dass beim Aufruf der Funktionen semantisch gültige Parameterwerte übergeben werden. 6

Nachklausur „PK Java“ WS 2010/2011

7

Sie finden die Klasse Util prinzipiell gut, haben jedoch kein solches Vertrauen in Programmierer, die die Klasse nutzen wollen. Sie möchten sicherstellen, dass andere Programmierer über ungültige Parameterwerte informiert werden. Aufgaben:  Überlegen Sie bei den einzelnen Funktionen, welche ungültigen Parameterwerte übergeben werden können.  Definieren Sie hierfür adäquate Exception-Klassen.  Schreiben Sie die Klasse Util so um, dass in den einzelnen Funktionen die übergebenen Parameterwerte überprüft und gegebenenfalls entsprechende Exceptions geworfen werden. Versehen Sie die Signatur der Funktionen mit den entsprechenden Exceptions. Es muss sichergestellt sein, dass bei der Ausführung der Funktionen keine anderen als die in der Signatur deklarierten Exceptions geworfen werden.  Passen Sie das Testprogramm entsprechend an. Exceptions sollen abgefangen und adäquate Fehlermeldungen ausgegeben werden.

7

Nachklausur „PK Java“ WS 2010/2011

8

Aufgabe 5 (Multiple-Choice-Fragen)

max. 20 Punkte

Beantworten Sie die 10 Fragen auf den Lösungsblättern. Zu jeder Frage stehen jeweils 5 Antworten zur Auswahl. Genau eine der Antworten ist dabei korrekt. Kreuzen Sie die Ihrer Meinung nach korrekte Antwort jeweils an. Bei korrekter Beantwortung einer Frage gibt es 2 Punkte. Eine nicht beantwortete Frage gibt 0 Punkte. Bei nicht korrekter Beantwortung einer Frage werden 2 Punkte abgezogen. Bezogen auf die Gesamtaufgabe ist es jedoch nicht möglich, weniger als 0 Punkte zu bekommen.

8

public class Glueckspiel { public static void main(String[] args) { int punkte1 = 0; int punkte2 = 0; int beginner = 1; final int endzahl = 5; while (punkte1 < endzahl && punkte2 < endzahl) { // Zufallszahl generieren int zufall = zahlGenerieren(0, 9); System.out .println("Ich habe eine Zufallszahl zwischen 0 und 9 generiert!"); // Zahlen eingeben int zahl1 = eingabe(beginner); int zahl2 = eingabe(beginner % 2 + 1, zahl1); // Gewinner der Runde berechnen int diff1 = betrag(zahl1 - zufall); int diff2 = betrag(zahl2 - zufall); System.out.println("Zufallszahl war die " + zufall); if (diff1 < diff2) { // Spieler beginner gewinnt System.out .println("Spieler " + beginner + " gewinnt die Runde"); if (beginner == 1) { punkte1 = punkte1 + 1; } else { punkte2 = punkte2 + 1; } } else if (diff2 < diff1) { // Nicht-beginner gewinnt System.out.println("Spieler " + (beginner % 2 + 1) + " gewinnt die Runde"); if (beginner == 1) { punkte2 = punkte2 + 1; } else { punkte1 = punkte1 + 1; } } else { System.out.println("Unentschieden"); } System.out.println("Spielstand: Spieler 1 hat " + punkte1 + " Punkte; Spieler 2 hat " + punkte2 + " Punkte."); System.out.println();

beginner = beginner % 2 + 1; // Beginnerwechsel } // Sieger bekannt geben if (punkte1 >= endzahl) { System.out.println("Spieler 1 hat gewonnen"); } else { System.out.println("Spieler 2 hat gewonnen"); } } static int betrag(int zahl) { if (zahl >= 0) { return zahl; } else { return -zahl; } } static int zahlGenerieren(int von, int bis) { return (int) (Math.random() * (bis - von + 1)) + von; } static int eingabe(int spieler) { int eingabe = IO.readInt("Spieler " + spieler + ", deine Zahl: "); return eingabe; } static int eingabe(int spieler, int ausser) { int eingabe = IO.readInt("Spieler " + spieler + ", deine Zahl: "); while (eingabe == ausser) { eingabe = IO.readInt("Fehlerhafte Eingabe! Spieler " + spieler + ", deine Zahl: "); } return eingabe; } } Frage 1 (Interfaces): Korrekt ist Antwort 4

Frage 2 (Exceptions): Korrekt ist Antwort 4

Frage 3 (Arrays): Korrekt ist Antwort 2

Frage 4 (Objekte) Korrekt ist Antwort 2

Frage 5 (Polymorphie): Korrekt ist Antwort 4

Frage 6 (Arithmetik): Korrekt ist Antwort 4

Frage 7 (Vererbung): Korrekt ist Antwort 5

Frage 8 (Parameter) Korrekt ist Antwort 2

Frage 9 (Polymorphie): Korrekt ist Antwort 2

Frage 10 (Dynamisches Binden): Korrekt ist Antwort 4

Frage 1 (Arrays):

Korrekt ist Antwort 2

Frage 2 (Parameter) Korrekt ist Antwort 2

Frage 3 (Polymorphie): Korrekt ist Antwort 2

Frage 4 (Objekte) Korrekt ist Antwort 2

Frage 5 (Polymorphie): Korrekt ist Antwort 4

Frage 6 (Interfaces): Korrekt ist Antwort 4

Frage 7 (Arithmetik): Korrekt ist Antwort 4

Frage 8 (Exceptions): Korrekt ist Antwort 4

Frage 9 (Dynamisches Binden): Korrekt ist Antwort 4

Frage 10 (Vererbung): Korrekt ist Antwort 5

class FachNote { private String fach; // das Fach (Deutsch, Mathe, ...) private int note; // die Note in dem Fach (1 .. 6) public FachNote(String fach, int note) { this.fach = fach; this.note = note; } public String getFach() { return this.fach; } public int getNote() { return this.note; } } class Schueler { private String name; // Name des Schuelers private FachNote[] noten; // Noten in den einzelnen Faechern public Schueler(String name, FachNote[] noten) { this.name = name; this.noten = noten; } public String getName() { return this.name; } public FachNote[] getNoten() { return this.noten; } } class NichtBelegtesFachException extends Exception { private String fach; // Name des nicht belegten Faches public NichtBelegtesFachException(String fach) { this.fach = fach; } public String getFach() { return this.fach; } }

public class Noten { /** * Berechnet die Durchschnittsnote der uebergebenen Schueler in dem * uebergebenen Fach. Hinweis: nicht alle Schueler muessen dieselben Faecher * belegen * * @param schueler * Menge an Schuelern (!= null); * @param fach * Name des Faches (!= null) * @return die Durchschnittsnote der uebergebenen Schueler in dem * uebergebenen Fach * @throws NichtBelegtesFachException * wird geworfen, wenn kein Schueler das uebergebene Fach belegt */ static double durchschnittsnote(Schueler[] schueler, String fach) throws NichtBelegtesFachException { int summe = 0; int anzahl = 0; for (Schueler s : schueler) { FachNote[] noten = s.getNoten(); for (FachNote n : noten) { if (n.getFach().equals(fach)) { summe += n.getNote(); anzahl++; } } } if (anzahl == 0) { throw new NichtBelegtesFachException(fach); } else { return (double) summe / anzahl; } } // Testprogramm public static void main(String[] args) { try { Schueler[] schueler = new Schueler[3]; FachNote[] noten = new FachNote[3]; noten[0] = new FachNote("Mathe", 1); noten[1] = new FachNote("Deutsch", 1); noten[2] = new FachNote("Englisch", 2); schueler[0] = new Schueler("dibo", noten); noten = new FachNote[3]; noten[0] = new FachNote("Mathe", 2);

noten[1] = new FachNote("Deutsch", 2); noten[2] = new FachNote("Englisch", 4); schueler[1] = new Schueler("karl", noten); noten = new FachNote[3]; noten[0] = new FachNote("Mathe", 3); noten[1] = new FachNote("Deutsch", 5); noten[2] = new FachNote("Englisch", 5); schueler[2] = new Schueler("ute", noten); System.out.println(Noten.durchschnittsnote(schueler, "Mathe")); } catch (NichtBelegtesFachException exc) { System.out.println("Das Fach " + exc.getFach() + " ist unbelegt"); } } } public class TANListe { private final int ANZAHL_TANS = 10; private int[] tans; private boolean[] verbraucht; public TANListe() { this.tans = new int[this.ANZAHL_TANS]; this.verbraucht = new boolean[this.ANZAHL_TANS]; this.tansGenerieren(); } public void print() { for (int i = 0; i < this.ANZAHL_TANS; i++) { if (!this.verbraucht[i]) { System.out.print(this.tans[i] + " "); } } System.out.println(); } public boolean verbrauchen(int tan) { for (int i = 0; i < this.ANZAHL_TANS; i++) { if (!this.verbraucht[i] && this.tans[i] == tan) { this.verbraucht[i] = true; return true; } } return false; } private void tansGenerieren() {

for (int i = 0; i < this.ANZAHL_TANS; i++) { this.verbraucht[i] = false; this.tans[i] = TANListe.tanGenerien(); while (this.existiert(this.tans[i], i)) { this.tans[i] = TANListe.tanGenerien(); } } } private boolean existiert(int tan, int bis) { for (int i = 0; i < bis; i++) { if (this.tans[i] == tan) { return true; } } return false; } // generiert 6-stellige TAN private static int tanGenerien() { return (int) (Math.random() * 900000) + 100000; } // kleines Testprogramm public static void main(String[] args) { TANListe liste = new TANListe(); liste.print(); while (true) { int nummer = IO.readInt("TAN eingeben: "); if (!liste.verbrauchen(nummer)) { break; } liste.print(); } } } public class Util { // liefert die kleinste Zahl des uebergebenen Arrays public static int minimum(int[] werte) { int min = werte[0]; for (int i = 1; i < werte.length; i++) { if (werte[i] < min) min = werte[i]; } return min; } // konvertiert den uebergebenen String in einen int-Wert public static int toInt(String str) { int erg = 0, faktor = 1; char ch = str.charAt(0);

switch (ch) { case '-': faktor = -1; break; case '+': faktor = 1; break; default: erg = ch - '0'; } for (int i = 1; i < str.length(); i++) { ch = str.charAt(i); int ziffer = ch - '0'; erg = erg * 10 + ziffer; } return faktor * erg; } // liefert die Potenz von zahl mit exp, also zahl "hoch" exp public static long hoch(long zahl, int exp) { if (exp == 0) return 1L; return zahl * hoch(zahl, exp - 1); } // Testprogramm public static void main(String[] args) { String eingabe = IO.readString("Zahl: "); int zahl = toInt(eingabe); System.out.println(zahl + " hoch " + zahl + " = " + hoch(zahl, zahl)); } } class NullException extends Exception { } class LeeresArrayException extends Exception { } class KeineZahlException extends Exception { } class NegativerExponentException extends Exception { } public class UtilLoesung { // liefert die kleinste Zahl des uebergebenen Arrays public static int minimum(int[] werte) throws NullException, LeeresArrayException { if (werte == null) { throw new NullException(); } if (werte.length == 0) { throw new LeeresArrayException(); } int min = werte[0];

for (int i = 1; i < werte.length; i++) { if (werte[i] < min) { min = werte[i]; } } return min; } // konvertiert den uebergebenen String in einen int-Wert public static int toInt(String str) throws NullException, KeineZahlException { if (str == null) { throw new NullException(); } if (str.length() == 0) { throw new KeineZahlException(); } int erg = 0, faktor = 1; char ch = str.charAt(0); switch (ch) { case '-': faktor = -1; if (str.length() == 1) { throw new KeineZahlException(); } break; case '+': faktor = 1; if (str.length() == 1) { throw new KeineZahlException(); } break; default: erg = ch - '0'; if (erg < 0 || erg > 9) { throw new KeineZahlException(); } } for (int i = 1; i < str.length(); i++) { ch = str.charAt(i); int ziffer = ch - '0'; if (ziffer < 0 || ziffer > 9) { throw new KeineZahlException(); } erg = erg * 10 + ziffer; } return faktor * erg; } // liefert die Potenz von zahl mit exp, also zahl "hoch" exp public static long hoch(long zahl, int exp) throws NegativerExponentException { if (exp < 0) {

throw new NegativerExponentException(); } if (exp == 0) { return 1L; } else { return zahl * hoch(zahl, exp - 1); } } // Testprogramm public static void main(String[] args) { try { String eingabe = IO.readS...


Similar Free PDFs