TECHNISCHE UNIVERSITÄT MÜNCHEN FAKULTÄT FÜR INFORMATIK Lehrstuhl für Sprachen und Beschreibungsstrukturen WS 11/12 Einführung in die Informatik I Übungsblatt 1 Prof. Dr. Helmut Seidl, M. Schwarz, A. Herz, Dr. M. Petter 20.10.11 Abgabe: 30.10.11 (vor 12 Uhr) 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. 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. 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! ) ; return ; 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 ) ;