Tutoraufgabe 1 (Code-Analyse):

Ähnliche Dokumente
Tutoraufgabe 1 (Seiteneekte):

Tutoraufgabe 1 (Seiteneekte):

Tutoraufgabe 1 (Verifikation):

Tutoraufgabe 1 (Programmanalyse):

Tutoraufgabe 1 (Casting): Programmierung WS17/18 Übungsblatt 2 (Abgabe ) Allgemeine Hinweise:

Tutoraufgabe 1 (Hoare-Kalkül):

Übung Programmierung WS 2007/08 - Blatt 6

Tutoraufgabe 1 (Überladen von Methoden):

Tutoraufgabe 1 (Listen):

Tutoraufgabe 1 (Programmanalyse):

Tutoraufgabe 1 (Programmanalyse): Programmierung WS17/18 Übungsblatt 5 (Abgabe ) Allgemeine Hinweise:

Tutoraufgabe 1 (Seiteneffekte):

Tutoraufgabe 1 (2 3 4 Bäume):

Tutoraufgabe 1 (Fibonacci-Zahlen):

hue12 January 24, 2017

Tutoraufgabe 1 (Programmanalyse):

Tutoraufgabe 1 (Auswertungsstrategie):

Institut für Programmierung und Reaktive Systeme 20. November Programmieren I. 4. Übungsblatt

Tutoraufgabe 1 (SCC):

Tutoraufgabe 1 (Zweierkomplement): Lösung: Programmierung WS16/17 Lösung - Übung 2

Übung Informatik I - Programmierung - Blatt 6

Vorbereitende Aufgaben

Tutoraufgabe 1 (Pilze):

Institut für Programmierung und Reaktive Systeme 5. Dezember Programmieren I. 5. Übungsblatt

Übungsblatt 1. Java Vorkurs (WS 2017)

Tutoraufgabe 1 (Starke Zusammenhangskomponenten):

Vorbereitende Aufgaben

Tutoraufgabe 1 (Klassenhierarchie):

Tutoraufgabe 1 (Vollständige Induktion): Tutoraufgabe 2 (Rotationen): Datenstrukturen und Algorithmen SS15 Übungsblatt 5 (Abgabe 3.6.

Probeklausur Java Einführung in die Informatik. Wintersemester 2016/2017

Erste Java-Programme (Scopes und Rekursion)

Programmierung WS12/13 Lösung - Übung 1 M. Brockschmidt, F. Emmes, C. Otto, T. Ströder

Übung Informatik I - Programmierung - Blatt 8

Einfache Arrays. Dr. Philipp Wendler. Zentralübung zur Vorlesung Einführung in die Informatik: Programmierung und Softwareentwicklung

Programmieren, Wintersemester 13/14 Übungsleiter: Sebastian Ebers Aufgabenblatt 3

Probeklausur Java Einführung in die Informatik. Wintersemester 2017/2018

Einführung in die Programmierung WS 2009/10. Übungsblatt 7: Imperative Programmierung, Parameterübergabe

TU Kaiserslautern. Übungsblatt 2: Software-Entwicklung 1 (WS 2017/18) Hinweise zu Einreichaufgaben. Hinweise zu den Übungen

Übungsblatt 13. Abgabe / Besprechung in Absprache mit dem Tutor

Programmierung WS12/13 Lösung - Präsenzübung M. Brockschmidt, F. Emmes, C. Otto, T. Ströder

Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)

Probeklausur Java Einführung in die Informatik. Wintersemester 2014/2015

Einstieg in die Informatik mit Java

1. Teilklausur Gruppe A. Bitte in Druckschrift leserlich ausfüllen!

Einstieg in die Informatik mit Java

2 Eine einfache Programmiersprache

Tutoraufgabe 1 (Das Herz):

Tutoraufgabe 1 (Verikation mit Arrays):

Institut für Informatik und Angewandte Kognitionswissenschaften

Übungen zum Bioinformatik-Tutorium. Blatt 3

Tutoraufgabe 1 (Seiteneffekte):

Basispruefung Herbst 2016/ Einführung in die Programmierung

Martin Unold INFORMATIK. Geoinformatik und Vermessung

2 Eine einfache Programmiersprache. Variablen. Operationen Zuweisung. Variablen

2 Eine einfache Programmiersprache

2 Eine einfache Programmiersprache

Tutoraufgabe 1 (Überladen von Methoden):

Implementieren von Klassen

Ausgabe:

Probeklausur zur Vorlesung

Technische Universität Braunschweig Institut für Programmierung und Reaktive Systeme

Wie entwerfe ich ein Programm?

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung

Dies ist eine Probeklausur, die keine formalen Schlüsse auf die Form, die Struktur oder den Inhalt der endgültigen Klausur zulässt.

Programmierpraktikum

Übungsblatt 13. Abgabe / Besprechung in Absprache mit dem Tutor

Programmieren I + II Regeln der Code-Formatierung

Intensivübung zu Algorithmen und Datenstrukturen

Martin Unold INFORMATIK. Geoinformatik und Vermessung

Präsenzübung Programmierung WS 2017/2018

2 Eine einfache Programmiersprache

Probeklausur Java Einführung in die Informatik. Wintersemester 2014/2015. Musterlösung

Vorbereitende Aufgaben

Tutoraufgabe 1 (Überladen und Überschreiben):

Programmieren I + II Regeln der Code-Formatierung

Programmierung

Vorlesung Programmierung

Variablen. int Flugzeug. float. I write code Hund. String. long. Borchers: Programmierung für Alle (Java), WS 06/07 Kapitel

Programmierpraktikum

Java: Eine kurze Einführung an Beispielen

Transkript:

Prof. aa Dr. J. Giesl M. Brockschmidt, F. Emmes, C. Fuhs, C. Otto, T. Ströder Allgemeine Die Hausaufgaben sollen in Gruppen von je 2 Studierenden aus der gleichen Kleingruppenübung bearbeitet werden. Namen und Matrikelnummern der Studierenden sind auf jedes Blatt der Abgabe zu schreiben. Heften bzw. tackern Sie die Blätter! Die Nummer der Übungsgruppe muss links oben auf das erste Blatt der Abgabe geschrieben werden. Die Lösungen müssen bis Donnerstag, den 24.11.2011 um 17:30 Uhr in den entsprechenden Übungskasten eingeworfen werden. Sie finden die Kästen am Eingang Halifaxstr. des Informatikzentrums (Ahornstr. ). Alternativ können Sie die Lösungen direkt im Tutorium abgeben. Beachten Sie die auf der Webseite veröffentlichten Code-Konventionen in Ihren Programmen. Grobe Verstöße werden mit Punktabzügen von bis zu 0% geahndet. In einigen Aufgaben müssen Sie in Java programmieren und.java-dateien anlegen. Drucken Sie diese aus und schicken Sie sie per E-Mail vor Donnerstag, den 24.11.2011 um 17:30 Uhr an Ihre Tutorin/Ihren Tutor. Stellen Sie sicher, dass Ihr Programm von javac akzeptiert wird, ansonsten werden keine Punkte vergeben. Tutoraufgabe 1 (Code-Analyse): Versuchen Sie diese Aufgabe ohne Einsatz eines Rechners zu lösen. Bedenken Sie, dass Sie in einer Prüfung ebenfalls keinen Rechner zur Verfügung haben. a) Finden und erklären Sie alle syntaktischen Fehler in der folgenden Java-Klasse. 1 public class FehlerT { 2 private int a; 3 private static int b; 4 private int c; 6 public int method1 ( double a) { 7 b = a - 2; 8 for ( int c = 0, i = 0; c < a; c ++) { 9 a -= 1; 10 i ++; 11 12 a += ( float )c; 13 a += i; 14 return ( int )a + b; 1 16 17 public static void method2 ( int a) { 18 int a = 1; 19 b = a; 20 21 22 public static void method3 ( int a) { 23 c = b; 24 2 26 1

b) Betrachten Sie folgende Java-Klasse. 1 public class SichtbarT { 2 private int a; 3 private int b; 4 private int c; 6 public int method ( int a) { 7 for ( int c = 0, i = 0; c < a; c ++) { 8 a - -; 9 i ++; 10 b += i; 11 12 return a + c; 13 14 1 Sei o ein Objekt vom Typ SichtbarT mit o.a = 1, o.b = 2 und o.c = 3. Welches Ergebnis liefert der Ausdruck o.method(4) und welche Werte haben o.a, o.b und o.c nach dessen Auswertung? Aufgabe 2 (Code-Analyse): (2 + 2 = 4 Punkte) Versuchen Sie diese Aufgabe ohne Einsatz eines Rechners zu lösen. Bedenken Sie, dass Sie in einer Prüfung ebenfalls keinen Rechner zur Verfügung haben. a) Finden und erklären Sie alle syntaktischen Fehler in der folgenden Java-Klasse. 1 public class FehlerH { 2 private int a; 3 private static int b; 4 private static int c; 6 public int method1 ( double b) { 7 a ++; 8 while (b >= c) { 9 int c = a; 10 a = ( int )b; 11 b = c; 12 b -= 1; 13 14 double c = 1; 1 return a + c; 16 17 18 public static int method2 ( int d) { 19 while (d > 0) { 20 int e = b; 21 d - -; 22 e += a; 23 24 return e; 2 26 2

27 public static void method3 ( int a) { 28 b += a; 29 c += b; 30 for ( int i = 0; i < a; i ++) { 31 int i = c; 32 c = b; 33 b = i; 34 3 36 37 b) Betrachten Sie folgende Java-Klasse. 1 public class SichtbarH { 2 private int a; 3 private int b; 4 private int c; 6 public int method ( int b) { 7 if (b > 0) { 8 int c = 0; 9 while (c < b) { 10 c ++; 11 a += c; 12 13 b = -b; 14 1 return b + c; 16 17 18 Sei o ein Objekt vom Typ SichtbarH mit o.a = 2, o.b = 3 und o.c =. Welches Ergebnis liefert der Ausdruck o.method(4) und welche Werte haben o.a, o.b und o.c nach dessen Auswertung? Tutoraufgabe 3 (Seiteneffekte): Betrachten Sie das folgende Programm: public class TSeiteneffekte { public static void main ( String [] args ) { Wrapper [] ws = new Wrapper [ 2]; ws [0] = new Wrapper (); ws [1] = new Wrapper (); ws [0]. seti (2); ws [1]. seti (1); f(ws [1], ws [1], ws [0]); f(ws [1], ws ); // Speicherzustand hier zeichnen 3

public static void f( Wrapper w1, Wrapper... ws) { int sum = 0; // Speicherzustand hier zeichnen for ( int i = 0; i < ws. length ; i ++) { Wrapper w = ws[i]; sum += w. geti (); w. seti (i +1); ws [0] = w1; w1 = ws [1]; w1. seti (- sum ); public class Wrapper { private int i; public void seti ( int x) { i = x; public int geti () { return i; Es wird nun die Methode main ausgeführt. Stellen Sie den Speicher (d.h. alle (implizit) im Programm vorkommenden Arrays und Objekte) bei jedem Aufruf der Methode f nach der Deklaration von sum und vor Ende des Programms graphisch dar. Aufgabe 4 (Seiteneffekte): Betrachten Sie das folgende Programm: public class HSeiteneffekte { public static void main ( String [] args ) { Wrapper w1 = new Wrapper (); Wrapper w2 = w1; (2 + 2 + 2 = 6 Punkte) w1. seti (1); w2. seti (2); int x = 3; int [] a = { 1, 2 ; f(w1, x, 4, ); f(w2, x, a); // Speicherzustand hier zeichnen public static void f( Wrapper w, int x, int... a) { // Speicherzustand hier zeichnen x = a [0]; a [0] = w. geti (); 4

w. seti (x); public class Wrapper { private int i; public void seti ( int x) { i = x; public int geti () { return i; Es wird nun die Methode main ausgeführt. Stellen Sie den Speicher (d.h. alle (implizit) im Programm vorkommenden Arrays und Objekte) bei jedem Aufruf der Methode f und vor Ende des Programms graphisch dar. Tutoraufgabe (Klausurzulassung): In dieser Aufgabe sollen Sie ein Programm erstellen, welches durch einen Dialog mit dem Benutzer herausfindet, ob dieser in diesem Semester die Klausurzulassung für die Vorlesung Programmierung erworben hat. Laden Sie hierfür die Klasse Klausurzulassung.java von der Homepage, die sie in dieser Aufgabe ergänzen sollen. Ein Lauf des Programms könnte dann wie folgt aussehen: Bitte waehlen Sie einen Studiengang 0 Bachelor_Informatik 1 Bachelor_Mathematik 2 Lehramt_Informatik 3 Erasmus 4 Promotion > 0 Sind Sie im ersten Fachsemester? (j/n) > j Haben Sie das Mentorenprogramm erfolgreich abgeschlossen? (j/n) > j Wieviel Prozent der erzielbaren Punkte haben Sie in den bis Weihnachten ausgegebenen Uebungsblaettern erreicht? (bitte Prozentzahl ohne %-Zeichen eingeben) > Wieviel Prozent der erzielbaren Punkte haben Sie in den restlichen Uebungsblaettern erreicht? (bitte Prozentzahl ohne %-Zeichen eingeben) > 7 Wieviel Prozent der erzielbaren Punkte haben Sie in der Praesenzuebung (am 10. Januar 2012) erreicht? (bitte Prozentzahl ohne %-Zeichen eingeben) > 90 Sie haben die Klausurzulassung. Herzlichen Glueckwunsch! a) Erstellen Sie den Aufzählungstypen Studiengang in einer Datei Studiengang.java. Dieser Aufzählungstyp soll die Studiengänge der Zuhörer repräsentieren: Bachelor_Informatik, Bachelor_Mathematik, Lehramt_Informatik, Erasmus und Promotion.

b) Ergänzen Sie in der Klasse Klausurzulassung die Methode studiengangwaehlen. Diese Methode soll die in der Aufzählungsklasse Studiengang erwähnten Studiengänge (wie oben skizziert) ausgeben und vom Benutzer die Nummer eines Studienganges erfragen. Falls die Nummer einen gültigen Studiengang repräsentiert, soll dieser als Ergebnis der Methode zurückgegeben werden und anderenfalls soll die Frage wiederholt werden. Verwenden Sie die statische Methode values() des Aufzählungstypen Studiengaenge, welche ein Array aller Studiengänge zurück gibt. Den Namen eines Studienganges erhalten Sie durch die Methode tostring(). c) Programmieren Sie die Methode janeinfrage, welche eine Frage als String übergeben bekommt. Diese Frage wird angezeigt und der Benutzer aufgefordert, mit j oder n zu antworten. Bei der Eingabe j soll die Methode den Wert true, bei n den Wert false zurückgeben. Bei anderen Eingaben soll die Frage wiederholt werden. Verwenden Sie zum Unterscheiden, ob eine akzeptierte Antwort eingegeben wurde, eine switch- Anweisung mit einem String-Argument. d) Programmieren Sie die Methode mentorenprogrammok. Diese Methode fragt den Benutzer, ob er im ersten Fachsemester studiert und falls ja, ob er das Mentorenprogramm erfolgreich abgeschlossen hat. Falls er im ersten Fachsemester studiert und das Programm nicht erfolgreich beendet hat, soll false zurückgegeben werden, sonst true. Verwenden Sie die Methode janeinfrage aus der Teilaufgabe c). e) Erstellen Sie die Methode hatklausurzulassung. Diese soll im Dialog mit dem Benutzer herausfinden, ob dieser die Klausurzulassung für Programmierung in diesem Semester erworben hat. Fragen Sie hierzu erst den Studiengang mit Hilfe der Methode studiengangwaehlen ab. Verwenden Sie nun eine switch-anweisung, um die Bedingungen für die verschiedenen Studiengänge zu überprüfen. Promotionsstudenten haben direkt eine Klausurzulassung. Für andere Studiengänge müssen die folgenden vier Kritierien erfüllt werden, um zur Klausur zugelassen zu werden: Bescheinigung über die Teilnahme am Mentorenprogramm (für Studierende im 1. Fachsemester Informatik Bachelor) x% der erzielbaren Punkte in den bis Weihnachten ausgegebenen Übungsblättern mit x 0. y% der erzielbaren Punkte in den restlichen Übungsblättern mit y 0. z% der erzielbaren Punkte in der Präsenzübung (am 10. Januar 2012) mit z 0 oder z 33 und z + y 100 Verwenden Sie die Methoden mentorenprogrammok und prozenteinlesen. f) Dokumentieren Sie die Klassen Klausurzulassung und Studiengang mit Hilfe von Javadoc-Kommentaren. Rufen Sie hierfür das Programm Javadoc wie folgt auf: $ javadoc Klausurzulassung.java Studiengang.java 6

Aufgabe 6 (Labyrinth): (1 + 1 + 2 + 1 + 3 + 2 + 1 = 11 Punkte) Ziel dieser Aufgabe ist es, ein Labyrinth-Spiel zu programmieren. Sie benötigen die Datei labyrinth.zip, die Sie von der Homepage herunterladen können. Diese enthält die folgenden Dateien: Labyrinth.java In den einzelnen Aufgabenteilen soll diese Datei ergänzt werden. LabyrinthFeld.java Enthält eine enum-deklaration für die Arten von Feldern in einem Labyrinth. LabyrinthGenerator.class Eine kompilierte Java Klasse zum Generieren von Labyrinthen. Lesen Sie die mitgelieferte Dokumentation, um diese verwenden zu können. doc/ Das Verzeichnis enthält die von Javadoc generierte Dokumentation für die Klassen LabyrinthFeld und LabyrinthGenerator. Schauen Sie sich diese Dokumentation in Ihrem Webbrowser an, bevor Sie versuchen, die Aufgabe zu lösen. Beim Ausführen der main-methode der Klasse Labyrinth wird der Spieler zuerst aufgefordert, die Breite und Höhe des Labyrinths sowie die Anzahl der zu platzierenden Schätze anzugeben. Die Spielfigur (repräsentiert durch <>) startet in der linken oberen Ecke. Durch Drücken der Tasten w=oben, a=links, s=unten oder d=rechts und Bestätigung mit der Enter-Taste bewegt sich die Spielfigur in die entsprechende Richtung. Wird q eingegeben, beendet sich das Spiel. Hat der Spieler alle Schätze (GG) gefunden, gewinnt er das Spiel. Beispiel: Breite des Labyrinths: 37 Hoehe des Labyrinths: 13 Zahl der Schaetze: ##<>###################################################################### ## GG## ## ## ## ## ## ## ## ## ## ## ###### ## ## ## ###### ## ###### ## ###### ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ########## ################## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ###### ## ## ## ## ############## ## ###### ## ## ########## ## ## ## ## ## ##GG## ## GG## ## ## ## ## ##GG ## ## ## ## ## ## ## ## ###### ## ## ## ## ## ###### ## ## ## ## ## ## ## ## ## ## ## GG## ## ## ## ## ## ## ## ## ## ###### ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ########################################################################## Buchstaben und danach Enter drücken. w/a/s/d = Norden/Westen/Sueden/Osten, q = Beenden > a) Schreiben Sie Selektoren für die Attribute breite, hoehe und anzahlschaetze in der Klasse Labyrinth. Geben Sie den Selektoren die Namen setbreite, getbreite, sethoehe, gethoehe, setanzahlschaetze und getanzahlschaetze. Testen Sie hiernach, ob die Klasse Labyrinth ohne Fehler kompiliert werden kann. b) Implementieren Sie die Methode labyrintherstellen in der Klasse Labyrinth, welche das Attribut spielfeld mit einem Labyrinth initialisieren soll. Dabei ist zu beachten, dass das Labyrinth die richtige Höhe, Breite und gewünschte Zahl an Schätzen hat. Verwenden Sie hierfür die Klasse LabyrinthGenerator. Wie Sie diese Klasse verwenden können, ist in der mitgelieferten Javadoc Dokumentation im Verzeichnis doc zu entnehmen. c) Implementieren Sie die Funktion tostring in der Klasse Labyrinth. Diese Funktion gibt einen mehrzeiligen String zurück, der den aktuellen Zustand des Labyrinths repräsentiert. Hierbei sollen Wände durch ##, freie Stellen durch (zwei Leerzeichen), Schätze durch GG und der Spieler durch <> repräsentiert 7

werden. Die Position des Spielers ist durch die (als private markierten) Attribute spielerzeile und spielerspalte bestimmt. Ein String-Literal kann sich in Java nicht über mehrere Zeilen erstrecken. Verwenden Sie daher das Zeichen \n für einen Zeilenumbruch. Verwenden Sie zum Unterscheiden der einzelnen LabyrinthFelder eine switch-anweisung. d) Implementieren Sie einen Aufzählungstypen für die Himmelsrichtungen Norden, Osten, Sueden und Westen indem Sie ein enum Richtung in einer Datei Richtung.java erstellen. Orientieren Sie sich hierbei an dem Aufzählungstypen LabyrinthFeld. e) Implementieren Sie die Methode gehenach in der Klasse Labyrinth. Diese Methode soll ein Aufzählungsobjekt vom Typ Richtung als Argument übergeben bekommen und die Spielfigur in die entsprechende Richtung bewegen, falls dies möglich ist. Hierbei ist darauf zu achten, dass sich die Spielfigur nur auf Feldern der Art Frei und Schatz bewegen darf. Es ist weiterhin sicherzustellen, dass die Figur nicht über den Rand des Spielfeldes hinaus bewegt werden darf. Trifft die Figur auf ein Feld auf dem ein Schatz liegt, so soll dieser Schatz entfernt werden, indem das Schatz-Feld durch ein freies Feld ersetzt wird. Hierbei ist die Zahl der verbleibenden Schätze (das Attribut anzahlschaetze des Labyrinth-Objektes) um eins zu reduzieren. Verwenden Sie zum Unterscheiden der einzelnen Richtungen eine switch-anweisung. Berechnen Sie zuerst die Koordinaten des Feldes auf das die Spielfigur ziehen soll und entscheiden Sie dann, ob dies ein gültiger Zug ist. Verwenden Sie auch eine switch-anweisung, um die je nach Art des Zielfeldes verschiedenen Verhaltensweisen zu unterscheiden. f) Erstellen Sie die Methode spielen in der Klasse Labyrinth. Hierbei wird solange es noch Schätze zu finden gibt nacheinander Folgendes ausgeführt. 1) Der aktuelle Zustand des Labyrinths wird ausgegeben. 2) Der Spieler wird aufgefordert, eine Bewegungsrichtung anzugeben oder das Spiel zu beenden. 3) Die Spielfigur wird (falls möglich) in die entsprechende Richtung bewegt bzw. wird das Spiel beendet. Wurden alle Schätze gefunden, so soll dem Spieler zu seinem Sieg gratuliert werden. Verwenden Sie die in den vorhergehenden Aufgabenteilen implementierten Methoden tostring und gehenach. Lesen Sie die Eingabe mit Hilfe des Ausdrucks System.console().readLine() ein und unterscheiden Sie die einzelnen Möglichkeiten durch eine geeignete switch-anweisung. g) Dokumentieren Sie die Klassen Labyrinth und Richtung mit Hilfe von Javadoc-Kommentaren. Reichen Sie die von dem Javadoc-Programm generierte Dokumentation per E-Mail an Ihren Tutor ein. Drucken Sie die Dokumentation nicht aus! Rufen Sie hierfür das Programm Javadoc wie folgt auf: $ javadoc Labyrinth.java Richtung.java 8