Technische Universit at M unchen Institut f ur Informatik · 2014. 10. 27. · Technische Universit...

4
Technische Universit¨ at M¨ unchen Institut f¨ ur Informatik Lehrstuhl f¨ ur Bioinformatik WS 2014/15 Einf¨ uhrung in die Programmierung f¨ ur Bioinformatiker Aufgabenblatt 1 Prof. B. Rost, L. Richter 27.10.2014 Netbeans, Java 1.1 ( ¨ U) Netbeans In dieser Aufgabe machen Sie sich mit der integrierten Entwicklungsumgebung Netbeans vertraut. Starten Sie Netbeans Welche Komponenten hat das Startfenster? Legen Sie nun ihre erstes eigenes Projekt mit dem Namen blatt03 an. Importieren Sie die Datei Callstack.java und Vollziehen Sie die Aufgabe aus der Vorbespre- chung nach. Machen Sie sich mit den Debug-Funktionen vertraut. Tutorials im Netz finden Sie z. B. unter http://cobweb.cs.uga.edu/ ~ shoulami/sp2009/cs1301/tutorial/NetBeansDebuggerTutorial/ NetBeansDebuggerTutorial.htm 1.2 ( ¨ U) Callstack In dieser Aufgabe sollen statische Methodenaufrufe (ohne Parameter und R¨ uckgabewerte) bespro- chen werden. Um Methodenaufrufe zu verstehen, wird eine Stack (LIFO) ben¨ otigt. (a) Veranschaulichen Sie sich die Funktionalit¨ at der push und pop Operationen eines Stacks durch Skizzierung einer Abfolge von push und pop Operationen an der Tafel. Der Programm-Code name() beschreibt einen Methodenaufruf der Methode name. Ein Me- thodenaufruf soll die Befehle innerhalb der Methode ausf¨ uhren bevor die Ausf¨ uhrung hinter dem Methodenaufruf weiter geht. Die Semantik eines Methodenaufrufs ist durch folgende Schritte gegeben: ucksprungadresse (Position des Befehls, der auf den Methodenaufruf folgt) wird auf dem Stack mit push abgelegt Ausf¨ uhrung wird am ersten Befehl der Methode fortgesetzt Bei Erreichen des Endes einer Methode wird die R¨ ucksprungadresse mit pop vom Stack geholt und die Ausf¨ uhrung wird an dieser Position fortgesetzt (b) Erarbeiten Sie warum die R¨ ucksprungadresse auf einem Stack gespeichert werden muss und 1

Transcript of Technische Universit at M unchen Institut f ur Informatik · 2014. 10. 27. · Technische Universit...

Page 1: Technische Universit at M unchen Institut f ur Informatik · 2014. 10. 27. · Technische Universit at M unchen Institut f ur Informatik Lehrstuhl f ur Bioinformatik WS 2014/15 Einfuhrung

Technische Universitat Munchen

Institut fur Informatik

Lehrstuhl fur Bioinformatik WS 2014/15

Einfuhrung in die Programmierung fur Bioinformatiker Aufgabenblatt 1

Prof. B. Rost, L. Richter 27.10.2014

Netbeans, Java

1.1 (U) Netbeans

In dieser Aufgabe machen Sie sich mit der integrierten Entwicklungsumgebung Netbeans vertraut.

• Starten Sie Netbeans

• Welche Komponenten hat das Startfenster?

• Legen Sie nun ihre erstes eigenes Projekt mit dem Namen blatt03 an.

• Importieren Sie die Datei Callstack.java und Vollziehen Sie die Aufgabe aus der Vorbespre-chung nach.

• Machen Sie sich mit den Debug-Funktionen vertraut. Tutorials im Netz finden Sie z. B. unterhttp://cobweb.cs.uga.edu/~shoulami/sp2009/cs1301/tutorial/NetBeansDebuggerTutorial/

NetBeansDebuggerTutorial.htm

1.2 (U) Callstack

In dieser Aufgabe sollen statische Methodenaufrufe (ohne Parameter und Ruckgabewerte) bespro-chen werden.

Um Methodenaufrufe zu verstehen, wird eine Stack (LIFO) benotigt.

(a) Veranschaulichen Sie sich die Funktionalitat der push und pop Operationen eines Stacksdurch Skizzierung einer Abfolge von push und pop Operationen an der Tafel.

Der Programm-Code name() beschreibt einen Methodenaufruf der Methode name. Ein Me-thodenaufruf soll die Befehle innerhalb der Methode ausfuhren bevor die Ausfuhrung hinterdem Methodenaufruf weiter geht. Die Semantik eines Methodenaufrufs ist durch folgendeSchritte gegeben:

• Rucksprungadresse (Position des Befehls, der auf den Methodenaufruf folgt) wird aufdem Stack mit push abgelegt

• Ausfuhrung wird am ersten Befehl der Methode fortgesetzt

• Bei Erreichen des Endes einer Methode wird die Rucksprungadresse mit pop vom Stackgeholt und die Ausfuhrung wird an dieser Position fortgesetzt

(b) Erarbeiten Sie warum die Rucksprungadresse auf einem Stack gespeichert werden muss und

1

Page 2: Technische Universit at M unchen Institut f ur Informatik · 2014. 10. 27. · Technische Universit at M unchen Institut f ur Informatik Lehrstuhl f ur Bioinformatik WS 2014/15 Einfuhrung

nicht einfach in einer globalen Variable gespeichert werden kann. Veranschaulichen Sie dazuden Aufruf von f1 im Programm Simple.java von der Praktikumsseite durch Skizzen desCallstacks an der Tafel und verwenden Sie die Zeilennummern als Sprungadressen.

(c) Fuhren Sie das Programm Simple.java Schritt fur Schritt aus und vergleichen Sie den Call-stack mit dem Tafelbild.

(d) Trauern Sie, dass es in Java keine zeilennummernbasierten Sprunge wie in Basic mehrgibt.

(e) Debuggen Sie das Programm Callstack.java von der Praktikumsseite Schritt fur Schritt.Inspizieren Sie Variablen, Werte und den Callstack, um sich die Methodenaufrufe und derenAuswirkung zu veranschaulichen.

(f) Diskutieren Sie die Funktionalitat von setSeed, nextFloat zur Generierung von Pseudozu-fallszahlen sowie den Ausdruck ( new java.util.Scanner ( System.in ) ).nextLine () zumEinlesen eines Strings von der Konsole (in die Netbeans-Konsole tippen).

(g) Die Hilfs-Methoden enter und exit sammeln Informationen uber den Callstack in globa-len Variablen und printName gibt einen String auf der Konsole aus, welcher den aktuellenCallstack-Zustand reprasentiert. Zusatzlich wird die globale Variable function verwendet umden aktuellen Methodennamen zu speichern und die lokale Variable oldFunction um alteMethodennamen zu verwalten.

Diskutieren Sie den Unterschied zwischen lokalen und globalen Variablen, globale Variablenwerden im Stackframe von main abgelegt und lokale im Stackframe der aktuellen Metho-de. Was passiert mit lokalen Variablen beim Verlassen einer Methode bzw. beim rekursivenAufruf?

(h) Debuggen Sie das Programm Callstack.java ein weiteres Mal und inspizieren Sie im Spezi-ellen die verschiedenen Werte von oldFunction im Callstack von verschiedenen Stackframesvon random.

(i) Warum kann oldFunction nicht in einer globalen Variable gespeichert werden?

Fur die nachste Aufgabe muss eine Zahl von der Kommandazeile eingelesen werden. Bisher ist derBefehl new java.util.Scanner(System.in)).nextLine() zum einlesen eines Strings bekannt.Dieser String soll nun in einen Integer umgewandelt werden. Dazu wird der eingegebenen Stringvon rechts nach links Zeichen fur Zeichen durchlaufen, um aus den einzelnen Ziffern die kompletteZahl zu berechnen.

a) Schreiben Sie eine Methode static int digit(char s), die den Charakter s in einen Integerumwandelt und zuruckgibt, wenn es sich um eine Ziffer (0-9) handelt. Falls der Eingabecharacterkeine Ziffer ist, soll standardmaßig 0 zuruckgegeben werden. Testen Sie Ihre Methode anhanddes Strings "0123456789abc".

b) Schreiben Sie eine Methode static int pow10(int n), die bei Eingabe eines Integers n, 10n

zuruckgibt. Machen Sie sich sich mithilfe Ihres Tutors klar, dass in einem 32-Bit Integer neunZiffern vollstandig gespeichert werden konnen, d.h. eine neunstellige Zahl, wobei die einzelnenPositionen der Zahl beliebige Ziffern haben konnen. Geben Sie im Fall eines drohenden IntegerOverflows eine Warnung aus! Diskutieren Sie mit Ihrem Tutor, wie mit diesem Fall umgegangenwerden kann. Testen Sie Ihre Methode mit n = 0, n = 3 und n = 8.

c) Schreiben Sie eine Methode static int getDigit(int data, int pos), die die Ziffer anPosition pos (von rechts nach links mit 0 beginnend gezahlt) im Integer data zuruckgibt. Kleiner

2

Page 3: Technische Universit at M unchen Institut f ur Informatik · 2014. 10. 27. · Technische Universit at M unchen Institut f ur Informatik Lehrstuhl f ur Bioinformatik WS 2014/15 Einfuhrung

Hinweis anhand eines Beispiels:8572 : 1 = 8572 8572 mod 10 = 28572 : 10 = 857.2 857.2 mod 10 = 78572 : 100 = 85.72 85.72 mod 10 = 58572 : 1000 = 8.572 8.572 mod 10 = 8

Testen Sie die Methode; lassen Sie sich fur den Integer 123456789 die Positionen 0 bis 8zuruckgeben.

d) Schreiben Sie eine Methode static int resetDigit(int data, int pos), die die Zifferan der Stelle pos (von rechts nach links mit 0 beginnend gezahlt) im Integer data auf Nullsetzt und den daraus resultierenden Integer zuruckgibt. Testen Sie Ihre Methode; setzen Sie imInteger 123456789 die erste und letzte Position auf Null.

e) Schreiben Sie eine Methode static int putDigit(int data, int digit, int pos), diedie Ziffer an der Stelle pos (von rechts nach links mit 0 beginnend gezahlt) im Integer data

auf den Wert digit setzt. Setzen Sie dazu die Ziffer an der Position pos auf Null und addierenanschließend digit ∗ 10pos zum ursprunglichen Wert data. Stellen Sie dabei sicher, dass digiteine Ziffer ist. Testen Sie Ihre Methode; setzen Sie im Integer 123456789 die zweite und vorletztePosition auf 3.

f) Erstellen Sie schließlich die Methode static int stringToNumber(String s), die mithilfeder zuvor erstellten Methoden den Eingabe-String s Zeichen fur Zeichen in einen Integer um-wandelt. Beachten Sie dabei, dass das erste Zeichen ein Minuszeichen sein kann. Testen Sie IhreMethode mit "0123456789" und "-23456789".

Jetzt programmieren wir das Spiel Mastermind. Dabei spielt der Benutzer gegen den Computerund hat mehrere Versuche um einen Zahlencode zu erraten. Nach jedem Rateversuch erhalt derNutzer Hinweise, wie viele Ziffern des letzten Rateversuchs an der richtige Position im Code stehenund wieviele Ziffern des letzten Rateversuchs zwar im Code vorkommen, aber nicht an der richtigenStelle stehen. Dabei kann jede Ziffer im Code fur maximal eine Ubereinstimmung mit Ziffernim Rateversuch verwendet werden und Positionsubereinstimmungen haben hohere Prazedenz alsZiffernubereinstimmungen.

Dazu gehen wir wie folgt vor:

(a) Legen Sie Variablen an, welche die Anzahl der zu spielenden Runden, die Lange des zuerratenden Codes und die Menge der im Code verwendeten Ziffern festlegen.

(b) Begrussen Sie den Nutzer und teilen Sie ihm die zuvor festgelegten Werte mit.(c) Berechnen Sie Zufallsziffern fur den Code im festgelegten Bereich und speichern Sie alle

Ziffern des Codes mittels putDigit in einem Integer.(d) Schreiben Sie eine for-Schleife, welche die gegebene Anzahl von Runden ablauft und nur

dann etwas tut, wenn der Nutzer den Code noch nicht erraten hat.(e) Geben Sie hinter der for-Schleife den Code aus, falls der Nutzer ihn nicht erraten hat.(f) Jetzt fullen wir die for-Schleife mit Inhalt:

a) Lesen Sie den Rateversuch des Nutzers als String von der Konsole.b) Wandeln Sie den String in einen Integer um.c) Uberprufen Sie mittels String und Integer, ob der Rateversuch innerhalb der geforderten

Parameter (Codelange, verwendete Ziffern, etc.) liegt und geben Sie eine Warnung ausfalls nicht.

d) Schreiben Sie eine Funktion static boolean getResult(int codeLength,int code,int

guess):i. Die Funktion gibt zuruck, ob der ubergebene Rateversuch guess mit dem code

3

Page 4: Technische Universit at M unchen Institut f ur Informatik · 2014. 10. 27. · Technische Universit at M unchen Institut f ur Informatik Lehrstuhl f ur Bioinformatik WS 2014/15 Einfuhrung

ubereinstimmt.ii. Zusatzlich gibt die Funktion auf der Konsole aus, wieviele Ziffern aus guess an

der richtigen Stelle sind und wie viele Ziffern aus guess in code vorkommen, abernicht an der richtigen Stelle sind.

iii. Achten Sie dabei darauf, dass Ziffern aus dem Code die einmal fur eine Ubereinstimmung(in Position oder Ziffer) verwendet wurden, keine weiter Ubereinstimmung liefernund Positionsubereinstimmung hohere Prazedenz als Ziffernubereinstummng haben.Beispiel: guess=1001, code=2221 ergibt eine richtige Position (die rechtestete 1)und keine richtige Ziffer, da die rechteste 1 aus code schon fur die Position verwen-det wurde und nicht mehr fur die Ziffernubereinstimmung mit der linkesten 1 imguess verwendet werden kann. Sie mussen sich also merken, welche Positionen ausdem code und aus dem guess schon verwendet wurden. guess=3002, code=2221ergibt keine richtige Position und eine richtige Ziffer.

e) Verwenden Sie getResult um den Rateversuch zu bewerten und zu ermitteln ob derSpieler gewonnen hat.

4