TECHNISCHE UNIVERSITÄT MÜNCHEN FAKULTÄT FÜR INFORMATIK Lehrstuhl für Sprachen und Beschreibungsstrukturen SS 2011 Einführung in die Informatik I Übungsblatt 1 Prof. Dr. Helmut Seidl, A. Lehmann, A. Herz, Dr. M. Petter 05.05.11 Abgabe: 15.05.11 (vor 12 Uhr) Hinweis: Die Klasse MiniJava In der Klasse MiniJava sind einige Details versteckt, damit Sie sich in den ersten Wochen ganz auf das Wesentliche konzentrieren können. Die Klasse bietet folgende Methoden zur vereinfachten Ein- bzw. Ausgabe: read() und readint() zum Einlesen eines ganzzahligen Werts, readstring() zum Einlesen einer textuellen Eingabe, sowie write(...) zur vereinfachten Ausgabe. Um die Klasse benutzen zu können, laden Sie die Klasse MiniJava.java von der Vorlesungsseite: http://www2.in.tum.de/hp/file?fid=645 speichern Sie MiniJava.java im selben Verzeichnis wie Ihre eigenen Java-Dateien und erweitern Sie ihre Klassendefinition(en) um extends MiniJava. Verwenden Sie zur Lösung der Aufgaben nur MiniJava-Sprachkonstrukte! Aufgabe 1.1 (P) Erste Schritte a) Starten Sie die Entwicklungsumgebung NetBeans. Erstellen Sie ein neues Projekt namens Info1 in NetBeans. Öffnen Sie die Datei MiniJava.java in NetBeans und speichern Sie diese in Ihrem Projekt unter Info1/src/info1/MiniJava.java ab. NetBeans weist Sie daraufhin, dass die package declaration geändert werden muss. Fügen Sie dazu die Zeile package info1; am Anfang der Klasse MiniJava ein. b) Erstellen Sie nun die Klasse HelloWorld im Package info1 in NetBeans. Diskutieren Sie mit Ihrem Tutor die automatisch erstellten Elemente des Programms. Ergänzen Sie Ihr Programm folgendermassen: public c l a s s HelloWorld extends MiniJava { w r i t e ( H e l lo World! ) ; Am Ende sollte ihr Netbeans in etwa so aussehen:
2 Machen Sie sich mit den grundlegenden Funktionen, wie dem Erstellen und Ausführen des Programms vertraut. c) Machen Sie den Ordner in ihrem Benutzerverzeichnis ausfindig, an dem Netbeans Ihre Java-Dateien ablegt übertragen Sie den Ordner mit den Java-Quellcode-Dateien als Ihre Lösung auf den Abgabeserver. (Auf diese Weise geben Sie in Zukunft Ihre Hausaufgaben ab, wie auf dem 1. Merkblatt ausführlich beschrieben.) Sie finden diese Dateien unter Unix normalerweise unter /home/username/netbeansprojects/info1/src, bzw. unter Windows im Ordner %HOMEPATH%\Eigene Dokumente\NetBeansProjects\Info1\src Aufgabe 1.2 (P) Ein- und Ausgabe a) Bart muss schon wieder nachsitzen. Als Strafaufgabe muss er ein Programm schreiben, das auf dem Bildschirm 100 Mal den Satz Ich darf während der Vorlesung nicht Computer spielen! ausgibt. Helfen Sie ihm dabei dies möglichst effizient umzusetzen. Hinweis: Erstellen Sie dazu im Package info1 eine neue Klasse namens Bart.java. b) Leider muss Bart des öfteren nachsitzen und verschiedene Sätze verschieden oft als Strafaufgabe ausgeben lassen. Modifizieren Sie das obige Programm so, dass es nach einem Satz und seinen Wiederholungen fragt und diesen dann entsprechend oft am Bildschirm ausgibt. Lösungsvorschlag 1.2 public c l a s s Bart extends MiniJava { int i ; i = 1 ; while ( i <=100){ w r i t e ( Ich d a r f während der Vorlesung + nicht Computer s p i e l e n! ) ; i = i +1;
3 public c l a s s Bart extends MiniJava { w r i t e ( Welcher Satz s o l l ausgegeben werden? ) ; S t r i n g s a t z = r e a d S t r i n g ( ) ; w r i t e ( Wie o f t s o l l der Satz ausgegeben werden? ) ; int anzahl = r e a d I n t ( ) ; int i ; i = 1 ; while ( i <= anzahl ) { w r i t e ( s a t z ) ; i = i +1; Aufgabe 1.3 (P) Summe Schreiben Sie ein Java-Programm namens Sum.java, welches solange Zahlen einliest und summiert bis die Zahl 0 eingegeben wird. Anschließend soll die berechnete Summe ausgegeben werden. Lösungsvorschlag 1.3 public c l a s s Sum extends MiniJava { int sum ; sum = 0 ; int x ; x = read ( ) ; while ( x!= 0) { sum = sum + x ; x = read ( ) ; w r i t e (sum) ; Aufgabe 1.4 (P) 17 und 4 In dieser Aufgabe wollen wir das Kartenspiel 17 und 4 programmieren, das wie folgt funktioniert: Zwei Spieler spielen gegen einander. Ziel des Spiels ist es, mit zwei oder mehr Karten näher an 21 Punkte heranzukommen als der andere Spieler, ohne dabei den Wert von 21 Punkten zu überschreiten. Eine Karte kann einen Wert zwischen 2 und 11 Punkten haben. Jeder Spieler hat am Anfang zwei Spielkarten. Er kann entscheiden, ob er weitere Karten ziehen möchte oder nicht.
4 Glaubt er, nahe genug an 21 Punkte herangekommen zu sein, so lehnt er weitere Karten ab. Wenn er durch einen Zug 22 oder mehr Punkte erreicht, verliert er sofort. Es gewinnt der Spieler, der als erstes am nächsten an 21 Punkte herankommt. Schreiben Sie ein Mini-Java Programm SuV.java, mit dem man 17 und 4 zu zweit spielen kann. Jeder Spieler soll über Dialogboxen gefragt werden, ob er weitere Karten ziehen will: 1 für ja, 0 für nein. Verwenden Sie dazu die statische Methode int drawcard() der Klasse MiniJava, um Karten zu ziehen. Hinweis: Achten Sie darauf, Eingaben auf Ihre Gültigkeit hin zu überprüfen! Lösungsvorschlag 1.4 public c l a s s SuV extends MiniJava { int cont = 1 ; w r i t e ( Player one ) ; // Store p l a y e r 1 s score in an i n t e g e r int playerone = drawcard ( ) ; // e x i t when score exceeded or user r e f u s e s to p l a y while ( ( playerone < 21) && ( cont == 1) ) { // draw cards playerone = playerone + drawcard ( ) ; w r i t e ( Player one : You drew +playerone ) ; i f ( playerone > 21) { // p l a y e r s c o r e > 17+4 : ) w r i t e ( Player one i s dead : Player one l o s t! ) ; cont = read ( Player one continue? (1=yes, 0=no ) ) ; while ( ( cont > 1) ( cont < 0) ) { cont = read ( Player one continue? (1=yes, 0=no ) ) ; w r i t e ( I t s Your turn, Player two! ) ; int playertwo = drawcard ( ) ; cont = 1 ; // computer t r i e s to b e a t p l a y e r u n t i l he l o o s e s while ( ( playertwo < 21) && ( cont == 1) ) { // draw cards playertwo = playertwo + drawcard ( ) ; w r i t e ( Player two : You drew +playertwo ) ; // e x i t when score exceeded or user r e f u s e s to p l a y i f ( playertwo <21){ cont = read ( Player2 continue? (1=yes, 0=no ) ) ; while ( ( cont > 1) ( cont < 0) ) { cont = read ( Player2 continue? (1=yes, 0=no ) ) ; // j u s t f o r information : i f ( playertwo > 21 playertwo < playerone ) {
5 w r i t e ( Player one won! ) ; else { w r i t e ( Player two beat p l a y e r one : Player two won ) ; Aufgabe 1.5 [1 Punkt] (H) Parabel Bart muss als Hausaufgabe Parabeln in ein Koordinatensystem einzeichnen. Seine Parabeln sind immer von folgender Form: f(x) = ax 2 + bx + c wobei der Definitionsbereich für x von 5 bis 5 reicht. Bart benötigt insgesamt 11 (x, y)- Paare durch die er die Parabeln zeichnen kann. Schreiben Sie für Bart ein Programm namens Parabel.java, das für ihn diese 11 Wertepaare berechnet, für beliebige Eingaben für die Parameter a, b und c. Zum Beispiel: Bei der Eingabe von a = 5, b = 2 und c = 1 erhält Bart die Wertepaare: (-5,116), (-4,73), (-3,40), (-2,17), (-1,4), (0,1), (1,8), (2,25), (3,52), (4,89), (5,136) Lösungsvorschlag 1.5 public class Parabel extends MiniJava { // Erfragen und Einlesen der Parameter int a = r e a d I n t ( Welchen Wert hat Parameter a? ) ; int b = r e a d I n t ( Welchen Wert hat Parameter b? ) ; int c = r e a d I n t ( Welchen Wert hat Parameter c? ) ; // Ausgabe der Paare int x = 5; while ( x<=5){ w r i t e ( ( +x+, +(a x x+b x+c )+ ) ) ; x = x+1; Aufgabe 1.6 [4 Punkte] (H) Lustige Sieben In dieser Aufgabe wollen wir das Würfelspiel Lustige Sieben als ein Programm namens LustigeSieben.java schreiben. Es gibt einen Spieler, der gegen die Bank spielt. Der Spieler startet mit einem Guthaben von 100. Der Spieler setzt einen Teil seines Guthabens auf nur eines der Felder des Spielfelds. Die Bank würfelt mit zwei Würfeln. Dazu steht Ihnen die Methode int dice() der Klasse MiniJava zur Verfügung. Anschliessend zahlt die Bank entsprechend folgender Regel an den Spieler dessen Gewinn aus:
6 der dreifache Einsatz wird ausgezahlt, falls die Summe der beiden Würfel 7 ergibt und der Spieler auf die 7 gesetzt hat; der doppelte Einsatz wird ausgezahlt, falls die Summe der beiden Würfel genau der gewählten Zahl des Spielfeldes entspricht; der einfache Einsatz wird zurückgezahlt, falls sich das Würfelergebnis auf derselben Längsseite wie die gewählte Zahl befindet. Zum Beispiel: Wenn insgesamt 4 Augen gewürfelt werden, so erhält der Spieler für die Wahl der 4 den doppelten Einsatz, seinen Einsatz zurück, wenn der Spieler auf die 2, 3, 5 oder 6 gesetzt hat und verliert andernfalls seinen Einsatz an die Bank. Das Spielfeld sieht wie folgt aus: 7 2 8 3 9 4 10 5 11 6 12 Das Programm fragt solange nach der gewählten Zahl und dem Einsatz bis das Guthaben von 100 des Spielers aufgebraucht ist oder der Spieler die 0 zur Beendigung des Glücksspiels eingegeben hat. Nach jeder Runde soll das Würfelergebnis und das Guthaben des Spielers ausgegeben werden. Hinweis: Achten Sie darauf, Eingaben auf Ihre Gültigkeit hin zu überprüfen! Hilfestellung: Implementieren Sie die Aufgabenstellung in kleinen Schritten so weit Sie kommen: a) Lassen Sie den Spieler zuerst nur einmal und ohne Einsatz spielen Vergleichen Sie den Tip mit dem Würfelergebnis! b) Lassen Sie den Spieler einen beliebigen Betrag auf eine Zahl setzen Geben Sie den Gewinn/Verlust aus! c) Legen Sie einen Kontostand für den Spieler an und verrechnen Sie den Gewinn/Verlust mit dem Kontostand. Verhindern Sie eine Überschreitung des Kontos! d) Lassen Sie wiederholt neue Spiele mit dem aktualisierten Kontostand zu! Lösungsvorschlag 1.6 public class L u s t i g e S i e b e n extends MiniJava { // I n i t i a l i s i e r u n g int guthaben =100; w r i t e ( Lass uns s p i e l e n! + Du hast +guthaben+ Chips zur Verfügung. ) ; // S p i e l a b l a u f while ( guthaben >0){ // Einsatz int e i n s a t z=r e a d I nt ( Wieviel Chips w i l l s t Du s e t z e n? ) ; i f ( e i n s a t z ==0){ //Beenden des S p i e l s w r i t e ( Du gewinnst mit +guthaben+ Chips.
7 + H e r z l i c h e n Glückwunsch. ) ; while ( e i n s a t z <0 e i n s a t z >guthaben ) { // Einsatz zu hoch oder zu k l e i n i f ( e i n s a t z >guthaben ) { e i n s a t z=readint ( S o v i e l e Chips hast Du n i c h t mehr. + Dein Guthaben b e t r ä g t +guthaben+. + Was i s t dein Einsatz? ) ; i f ( e i n s a t z <0){ e i n s a t z=readint ( Ungültige Eingabe. + Dein Guthaben b e t r ä g t +guthaben+. + Was i s t dein Einsatz? ) ; i f ( e i n s a t z ==0){ //Beenden des S p i e l s w r i t e ( Du gewinnst mit +guthaben+ Chips. + H e r z l i c h e n Glückwunsch. ) ; // Feld int f e l d=r e a d I n t ( Auf welches Feld w i l l s t Du s e t z e n? ) ; i f ( f e l d ==0){ //Beenden des S p i e l s w r i t e ( Du gewinnst mit +guthaben+ Chips. + H e r z l i c h e n Glückwunsch. ) ; while ( f e l d >12 f e l d <2){ // Feld e x i s t i e r t n i c h t f e l d=r e a d I n t ( Es g i b t nur d i e Felder 2 b i s 1 2. + Auf welches Feld w i l l s t Du s e t z e n? ) ; i f ( f e l d ==0){ // Beenden des S p i e l s w r i t e ( Du gewinnst mit +guthaben+ Chips. + H e r z l i c h e n Glückwunsch. ) ; // Wuerfeln w r i t e ( Rien ne va plus. + Du hast +e i n s a t z+ Chips auf d i e + f e l d + g e s e t z t. ) ; int wurf = d i c e ( )+d i c e ( ) ; w r i t e ( Die Würfel sind g e f a l l e n : +wurf+ gewinnt. ) ; // Gewinnberechnung int gewinn = 0 ; i f ( wurf==f e l d ) { gewinn = e i n s a t z 2 ; // 2. F a l l i f ( wurf == 7) gewinn = gewinn + e i n s a t z ; // 1. F a l l else { i f ( ( wurf<7&&f e l d <7) ( wurf>7&&f e l d >7) ) { gewinn = e i n s a t z ; // 3. F a l l guthaben=guthaben e i n s a t z+gewinn ; w r i t e ( Du bekommst +gewinn+ Chips.
8 + Dein Guthaben b e t r ä g t nun : +guthaben + Chips. ) ; i f ( guthaben==0){ w r i t e ( Du hast l e i d e r a l l e s v e r l o r e n. ) ;