Abgabe: (vor 12 Uhr)

Ähnliche Dokumente
Abgabe: (vor 12 Uhr)

TECHNISCHE UNIVERSITÄT MÜNCHEN FAKULTÄT FÜR INFORMATIK

Institut fu r Informatik

DHBW Karlsruhe, Angewandte Informatik Programmieren in JAVA W. Geiger, T. Schlachter, C. Schmitt, W.

Abgabe: (vor 12 Uhr) Aufgabe 3.1 (P) Kontrollflussgraph. Zeichnen Sie für das folgende MiniJava-Programm den Kontrollflussgraphen.

Einführung in die Java- Programmierung

Programmierkurs Java

Numerisches Programmieren, Übungen

Abgabe: (vor der Vorlesung) Aufgabe 2.1 (P) O-Notation Beweisen Sie die folgenden Aussagen für positive Funktionen f und g:

Programmieren in JavaScript

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

Mathematik I. Vorlesung 7. Folgen in einem angeordneten Körper

Praktikum zu Einführung in die Informatik für LogWiIngs und WiMas Wintersemester 2015/16. Vorbereitende Aufgaben

Ausdrücke und primitive Typen

TECHNISCHE UNIVERSITÄT MÜNCHEN FAKULTÄT FÜR INFORMATIK

Programmiervorkurs WS 2012/2013. Schleifen und Methoden

Allgemeine Hinweise: TECHNISCHE UNIVERSITÄT MÜNCHEN. Name Vorname Studiengang Matrikelnummer. Hörsaal Reihe Sitzplatz Unterschrift

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

Übungskomplex Reelle Zahlen. Rechnen mit Gleitkommazahlen

Radizieren mit dem Heron-Verfahren

Algorithmen für Kettenbrüche Ac

Einführung in die C++ Programmierung für Ingenieure

Nichtlineare Gleichungen

Kasparov versus Deep Blue. Till Tantau. Institut für Theoretische Informatik Universität zu Lübeck

Student: Alexander Carls Matrikelnummer: Aufgabe: Beschreibung des euklidischen Algorithmus Datum:

Rekursion. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Kontrollstrukturen und Funktionen in C

Numerisches Lösen von Gleichungen

Lösungsvorschläge. zu den Aufgaben im Kapitel 4

Programmieren I. Kontrollstrukturen. Heusch 8 Ratz Institut für Angewandte Informatik

Übersicht. Datenstrukturen und Algorithmen Vorlesung 5: Rekursionsgleichungen (K4) Übersicht. Binäre Suche. Joost-Pieter Katoen. 20.

Prof. Dr. Heinrich Müller; Dr. Frank Weichert 7. September 2015

Übungen Programmieren 1 Felix Rohrer. Übungen

Theorie und Praxis geometrischer Algorithmen

public class SternchenRechteckGefuellt {

Programmentwicklung I für Hörer anderer Fachrichtungen -Wintersemester 2003/04- Abschlussklausur

Praktikum zu Einführung in die Informatik für LogWiIngs und WiMas Wintersemester 2015/16. Vorbereitende Aufgaben

Verzweigungen und Wiederholungen

Zahlenmengenerweiterung Von den rationalen Zahlen zu den irrationalen Zahlen

Java 8. Elmar Fuchs Grundlagen Programmierung. 1. Ausgabe, Oktober 2014 JAV8

Es ist für die Lösung der Programmieraufgabe nicht nötig, den mathematischen Hintergrund zu verstehen, es kann aber beim Verständnis helfen.

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

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

Rekursion. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

5. Elementare Befehle und Struktogramme

PVL 3 - Roulette. (5 Punkte) Abgabe bis

Vorlesung Datenstrukturen

Primitive Datentypen

Informatik 1 Programmieren in MATLAB Georg Richter

Dr. Monika Meiler. Inhalt

Algorithmen & Datenstrukturen 1. Klausur

Studentische Lösung zum Übungsblatt Nr. 7

Einführung der Quadratwurzel

Übung Programmierung WS 2007/08 - Blatt 5

Informatik B von Adrian Neumann

13 Java 4 - Entwurfsmuster am Beispiel des Rucksackproblems

Hochschule Augsburg, Fakultät für Informatik Name:... Prüfung "Programmieren 1", IN1bac, WS 10/11 Seite 1 von 6

Angewandte Mathematik und Programmierung

Programmierkurs Java

Kurs 1575, Musterlösung zur Winter Klausur 2003/04

3. rekursive Definition einer Folge

Übersicht. Schleifen. Schleifeninvarianten. Referenztypen, Wrapperklassen und API. 9. November 2009 CoMa I WS 08/09 1/15

Monte-Carlo Simulation

Regula Falsi Die folgende Abbildung beschreibt das Näherungsverfahren regula falsi zur Berechnung von Nullstellen:

Klausur zur Einführung in die objektorientierte Programmierung mit Java

3.2 Binäre Suche. Usr/local/www/ifi/fk/menschen/schmid/folien/infovk.ppt 1

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

JAVA für Nichtinformatiker - Probeklausur -

GI Vektoren

JAVA - Rekursion

Einführung in die Programmierung für Wirtschaftsinformatik

JAVA - Methoden

Das Verfahren von Heron

Nachname: Vorname: Matr.-Nr.: Punkte: 1. Aufgabe: ( / 25 Pkt.) Gegeben ist das folgende Struktogramm zur Berechnung von sin(x) mit Hilfe einer Reihe.

Übersicht. Berechnung der Potenz für zwei ganze Zahlen Klausuraufgabe SS 2010! Berechnung der Cosinus-Funktion Klausuraufgabe WS 2010/2011!

Brainfuck. 1 Brainfuck. 1.1 Brainfuck Geschichte und Umfeld. 1.2 Esoterische Programmiersprachen

Access 2010 Programmierung Schleifen

Einführung in die Informatik 2

FB Informatik. Fehler. Testplan

FH München, FB 03 FA WS 06/07. Ingenieurinformatik. Name Vorname Matrikelnummer Sem.Gr.: Hörsaal Platz

6 Speicherorganisation

Mathematische Grundlagen der Ökonomie Übungsblatt 8

Probeklausur: Programmierung WS04/05

Bitte beachten Sie: Es gibt mehr als einen Lösungsweg. Ihre Lösung kann auch richtig sein, wenn sie nicht mit der hier gezeigten Lösung übereinstimmt.

Programmierkurs Java

Einführung in die Informatik I Kapitel II.3: Sortieren

Vorab : Von dem indischen Mathematiker D. R. Kaprekar stammt folgender Zusammenhang :

Diskrete Strukturen. Arbeitsblatt 1: Zahlen (zu Übungsblatt 1)

Java-Programmierung mit NetBeans

Tutoren Jan Ebbe Tatjana Frank Cedric Geissmann Sascha Scherrer Alexander Stiemer

Algorithmen und Datenstrukturen

1. Musterlösung. Problem 1: Average-case-Laufzeit vs. Worst-case-Laufzeit

Java Einführung ABLAUFSTEUERUNG Kapitel 3 und 4

Praktische Informatik I Der Imperative Kern Rekursive Funktionen

Übungen zur Vorlesung EidP (WS 2015/16) Blatt 6

6. Iteration (Schleifenanweisungen)

Tutoraufgabe 1 (2 3 4 Bäume):

M. Graefenhan Übungen zu C. Blatt 3. Musterlösung

Prof. H. Herbstreith Fachbereich Informatik. Leistungsnachweis. Informatik 1 WS 2001/2002

Transkript:

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 2 Prof. Dr. Helmut Seidl, M. Schwarz, A. Herz, Dr. M. Petter 27.10.11 Abgabe: 06.11.11 (vor 12 Uhr) Aufgabe 2.1 (P) Kaninchen Auf einer einsamen Insel wird ein Paar geschlechtsreifer Kaninchen ausgesetzt, um herauszufinden, wie viele Kaninchen innerhalb eines Jahres geboren werden. Hierbei wird angenommen, dass jedes geschlechtsreife Paar jeden Monat ein neues Kaninchenpaar zur Welt bringt. Jedes Kaninchenpaar ist bereits im ersten Monat seiner Lebenszeit geschlechtsreif und jedes Kaninchen hat eine Lebenszeit von 3 Monaten. a) Schreiben Sie ein MiniJava-Programm, welches die Zahl n einliest, die den n-ten Monat bezeichnet. Ihr Programm soll die Anzahl der Kaninchenpaare, die im n-ten Monat geschlechtsreif sind, ausgeben. Als Beispiel der Kaninchenpopulation dient folgende Tabelle: Monat 1. Generation 2. Generation 3. Generation 1 1 2 1 1 3 2 1 1 4 4 2 1 5 7 4 2 b) Gehen Sie nun davon aus, dass die Kaninchenpaare, die sich im zweiten Monat ihrer Geschlechtsreife befinden, 3 Kaninchenpaare zu Welt bringen. Schreiben Sie ein MiniJava-Programm, welches wiederum die Zahl n einliest, die den n-ten Monat bezeichnet. Ihr Programm soll die Anzahl der Kaninchenpaare ausgeben, die im n-ten Monat die 1., 2. und 3. Generation darstellen. Lösungsvorschlag 2.1 public c l a s s Kaninchen extends MiniJava { int k = 1 ; int tmp, time ; int adult = 0, teen = 0, young = 1 ; // young s p e z i f i z i e r t Karnickel der 1. Generation, usw ; time = read ( ) ; while ( k!= time ) { k++; tmp = young ; // Aufgabe a : young = adult+teen+young ; // Aufgabe b : // young = a d u l t +(3 teen )+young ; adult = teen ; teen = tmp ;

2 // Anzahl Karnickel der 1. Generation w r i t e ( young ) ; // Anzahl Karnickel der 2. Generation w r i t e ( teen ) ; // Anzahl Karnickel der 3. Generation w r i t e ( adult ) ; // Gesamtzahl g e b a e r f a e h i g e r Karnickel : w r i t e ( young+adult+teen ) ; Aufgabe 2.2 (P) Multiplikationstabelle Implementieren Sie ein MiniJava-Programm namens Multtable.java, das die Multiplikationstabelle für alle Zahlen von 1 bis x ausgibt (für positive x). Dabei soll x vom Benutzer eingegeben werden. Für x = 10 ist die Ausgabe folgende: 1 2 3 4 5 6 7 8 9 10 2 4 6 8 10 12 14 16 18 20 3 6 9 12 15 18 21 24 27 30 4 8 12 16 20 24 28 32 36 40 5 10 15 20 25 30 35 40 45 50 6 12 18 24 30 36 42 48 54 60 7 14 21 28 35 42 49 56 63 70 8 16 24 32 40 48 56 64 72 80 9 18 27 36 45 54 63 72 81 90 10 20 30 40 50 60 70 80 90 100 Hinweis: Verwenden Sie zur Ausgabe der Tabellen die Funktionen System.out.print() und System.out.println(). System.out.print( \t ); erzeugt einen Tabulator, System.out.print(i); gibt die Zahl i am Bildschirm aus und System.out.println(); erzeugt einen Zeilenvorschub. Lösungsvorschlag 2.2 public class Multtable extends MiniJava { int i, j, x ; x = read ( M u l t i p l i k a t i o n s t a b e l l e von 1 b i s..? ) ; while ( x < 1) { x = read ( B i t t e geben S i e e i n e p o s i t i v e Zahl g r o e s s e r a l s 0 e i n. ) ; i =1; j =1; while ( i <= x ) { j =1; while ( j <= x ) {

3 System. out. p r i n t ( i j ) ; System. out. p r i n t ( \ t ) ; j=j +1; System. out. p r i n t l n ( ) ; i=i +1; Aufgabe 2.3 (P) Suche nach der Wurzel In dieser Aufgabe wollen wir die Quadratwurzel zu einer Zahl a 1 näherungsweise bestimmen. In diesem Bereich gilt 1 a a. Da die reelle Wurzelfunktion monoton wächst können wir eine binäre Suche anwenden. Dabei wird der Suchbereich immer wieder halbiert und in der Hälfte weiter gesucht, in der sich die Lösung befinden muss, bis die Lösung gefunden, oder bis auf einen vorgegebenen Fehler ɛ angenähert ist. Sucht man im Intervall [b 1, b 2 ] nach dem Wert x, so dass x = a, bestimmt man die (zur Wurzel inverse) Funktion f(x) = x 2 an der Mitte des Intervalls m = b 1+b 2. Ist der Wert (f(m) a) < ɛ endet die 2 Berechnung. Ist f(m) > a ergibt sich, dass b 1 < x < m sein muss. In diesem Fall wiederholt man die Suche im Intervall [b 1, m]. Analog sucht man falls f(m) < a im Intervall [m, b 2 ] weiter. a) Schreiben Sie ein MiniJava-Programm Wurzel.java, welches für eine einzulesende Zahl a die Quadratwurzel a nach obigem Algorithmus näherungsweise bestimmt, in dem die Iteration nach einer vom Benutzer festgelegten Anzahl von Durchläufen abgebrochen wird. b) Ermöglichen sie dem Benutzer die Fehlertoleranz ɛ festzulegen. Ihr Programm soll nun so lange suchen, bis es diese Fehlertoleranz erreicht. Lösungsvorschlag 2.3 public c l a s s Wurzel extends MiniJava { double a, eps, l, r,m, d ; a = readdouble ( Zahl ) ; i f ( a>=1.0) { eps = readdouble ( Fehler ) ; l =1.0; // s q r t ( a ) in [ 1, a ] r=a ; m=( l+r ) / 2. 0 ; // f i n d middle o f i n t e r v a l d=m m a ; // i n i t i a l e r r o r while ( d d > eps eps ) {// i s e r r o r small enough? i f (m m<a ) // l e f t or r i g h t i n t e r v a l? l=m; else //m m=a not p o s s i b l e r=m; m=( l+r ) / 2. 0 ; // f i n d middle o f cur i n t e r v a l d=m m a ; // c a l c e r r o r

4 w r i t e ( Die Wurzel von +a+ i s t +m+, mit Ungenauigkeit +d + g e f o r d e r t + eps ) ; else w r i t e ( Fehler, Zahl muss g r o e s s e r g l e i c h 1. 0 s e i n ) ; Aufgabe 2.4 [4 Punkte] (H) Suche nach der Wurzel Teil II Das Heron-Verfahren (auch Babylonisches Wurzelziehen genannt) ist ein weiterer iterativer Algorithmus zur Bestimmung einer rationalen Näherung der Quadratwurzel a einer reellen Zahl a 0. Die Iterationsvorschrift lautet: x n+1 = 1 2 (x n + a x n ) Hierbei steht a für die Zahl, deren Quadratwurzel bestimmt werden soll. Der Startwert x 0 der Iteration kann, solange er grösser Null ist, beliebig festgesetzt werden. a) Schreiben Sie ein MiniJava-Programm Heron.java, welches für eine einzulesende Zahl a und den Startwert x 0 = a die Quadratwurzel a näherungsweise, bis auf einen vom Benutzer abgefragten maximalen Fehler ɛ berechnet und ausgibt. b) In diesem Teil wollen wir die beiden Wurzelverfahren vergleichen. Modifizieren Sie Heron.java und Wurzel.java aus Tutoraufgabe 2.2 jeweils so, dass beide Methoden Ergebnisse mit gleichem Fehler ɛ = 0.0000001 produzieren. Fügen Sie zusätzlichen Code ein, um die Anzahl der benötigten Schleifendurchläufe zu zählen und um zu testen, welches der Verfahren, angewendet auf die Zahlen von 2 bis 10 als a und jeweils x 0 = a, weniger Schleifendurchläufe braucht? Lösungsvorschlag 2.4 public c l a s s Heron extends MiniJava { double x, a, eps ; a = readdouble ( B i t t e p o s i t i v e Zahl zum Wurzel zi ehen eingeben ) ; while ( a<0){ a=readdouble ( B i t t e p o s i t i v e Zahl zum Wurzel ziehen eingeben ) ; // eps =0.0000001; eps = readdouble ( B i t t e t o l e r i e r b a r e n maximalen Fehler angeben ) ; x = a ; while ( ( x x a ) > eps ( x x a ) < eps ) { x=(x+a/x ) / 2. 0 ; w r i t e ( Die Wurzel von +a+ i s t +x+, mit Ungenauigkeit +( Math. s q r t ( a ) Math. abs ( x ) ) ) ;

5 public class V e r g l e i c h s t e s t extends MiniJava { double heronx ; double binaerx ; double x, a, eps, l, r,m, d ; int heron, b i naer ; eps =0.0000001; a=2; while ( a<11) { // Heron heron =0; x = a ; while ( ( x x a ) > eps ( x x a ) < eps ) { x=(x+a/x ) / 2. 0 ; heron=heron +1; heronx=x ; // Binaere Suche b inaer =0; l =1.0; // s q r t ( a ) in [ 1, a ] r=a ; m=( l+r ) / 2. 0 ; // f i n d middle o f i n t e r v a l d=m m a ; // i n i t i a l e r r o r while ( d d > eps eps ) {// i s e r r o r small enough? i f (m m<a ) // l e f t or r i g h t i n t e r v a l? l=m; else //m m=a not p o s s i b l e r=m; m=( l+r ) / 2. 0 ; // f i n d middle o f cur i n t e r v a l d=m m a ; // c a l c e r r o r b inaer=b i naer +1; binaerx = m; // V e r g l e i c h : System. out. p r i n t l n ( a+ : Heron : +(heronx heronx )+ /# +heron + Bin. Suche : +( binaerx binaerx )+ /# +b inaer ) ; a=a +1; Aufgabe 2.5 [6 Punkte] (H) Kartenlotto Kartenlotto ist ein einfaches Glücksspiel, bei dem ein Spieler gegen die Bank spielt. Nachdem der Spieler gesetzt hat, werden zunächst zwei Karten gezogen. Folgen die Kartenwerte direkt aufeinander (z.b: 7, 8, oder 8,7) oder ist es ein Paar (gleicher Kartenwert) hat der Spieler verloren und sein Einsatz geht an die Bank. Andernfalls wird eine weitere Karte gezogen. Liegt ihr Wert strikt zwischen den Werten der bereits gezogenen Karten gewinnt der Spieler und erhält den doppelten Einsatz zurück. Zusätzlich hat der Spieler vor dem Ziehen der dritten Karte die Möglichkeit seinen Einsatz

6 zu verdoppeln, falls er genügend Guthaben hat. Teilen Sie dazu dem Spieler nachdem Ziehen der zweiten Karte den Abstand der beiden Kartenwerte mit und fragen Sie, ob der Spieler verdoppeln möchte. Erstellen sie ein MiniJavaprogramm namens KartenLotto.java, welches das Spiel realisiert. Der Spieler startet mit einem Guthaben von 100 und einem Einsatz von 10. Zum Karten ziehen steht Ihnen die Methode int drawcard() (wie read() verwenden) der Klasse MiniJava zur Verfügung, die direkt den Kartenwert liefert. Fragen sie nach jeder Runde, ob der Spieler erneut spielen möchte und falls nicht geben sie den insgesamt erzielten Gewinn/Verlust aus. Sollte der Spieler nicht mehr über genug Guthaben verfügen endet das Spiel ebenfalls. 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 Testen sie, ob die gezogenen Karten gewinnen. b) Legen Sie einen Kontostand für den Spieler an und verrechnen Sie den Gewinn/Verlust mit dem Kontostand. Verhindern Sie eine Überschreitung des Kontos. c) Lassen Sie wiederholt neue Spiele mit dem aktualisierten Kontostand zu. Lösungsvorschlag 2.5 public c l a s s KartenLotto extends MiniJava { // I n i t i a l i s i e r u n g int pgeld, p e i n s a t z ; int karte1, karte2, mitte, eingabe ; pgeld = 100; // Abfrage f r e r s t e s S p i e l. eingabe = read ( 0 = Abbruch, 1=Neue Runde ) ; while ( eingabe < 0 && eingabe > 1) { // Eingabe k o r r e k t? eingabe = read ( 0 = Abbruch, 1=Neue Runde ) ; while ( eingabe == 1 && pgeld >= 10) { //Neue Runde/ genug Geld? // Einsatz f e s t l e g e n. p e i n s a t z = 1 0 ; // Karten z i e h e n. karte1 = drawcard ( ) ; karte2 = drawcard ( ) ; i f ( karte2 < karte1 ) { // S o r t i e r u n g der Karten ( ohne H i l f s v a r i a b l e ) f r e i n f a c h e r e s Vergleichen karte2 = karte1 + karte2 ; karte1 = karte2 karte1 ; karte2 = karte2 karte1 ; w r i t e ( Karte1 : + karte1 +. Karte2 : + karte2 ) ; i f ( karte2 karte1 < 2) { // Test auf s o f o r t i g e n V e r l u s t. pgeld = pgeld p e i n s a t z ; w r i t e ( Leider v e r l o r e n. Guthaben : + pgeld ) ;

7 else { // Verdoppeln? w r i t e ( Abstand : + ( karte2 karte1 1) ) ; eingabe = read ( 0 = Weiter, 1 = Verdoppeln ) ; while ( eingabe < 0 && eingabe > 1 && pgeld >= 20) { // Eingabe k o r r e k t / genug Geld? eingabe = read ( 0 = Weiter, 1 = Verdoppeln ) ; i f ( eingabe == 1) { // Einsatz e r h h e n. p e i n s a t z = p e i n s a t z 2 ; w r i t e ( Neuer Einsatz : + p e i n s a t z ) ; // D r i t t e Karte z i e h e n und Gewinn t e s t e n. mitte = drawcard ( ) ; w r i t e ( Karte : + mitte ) ; i f ( karte1 < mitte && mitte < karte2 ) { pgeld = pgeld + p e i n s a t z ; // Gewinn auszahlen. w r i t e ( Gewonnen! Guthaben : + pgeld ) ; else { pgeld = pgeld p e i n s a t z ; // Einsatz abziehen. w r i t e ( Leider v e r l o r e n. Guthaben : + pgeld ) ; i f ( pgeld >= 10) { // Neue Runde m g l i c h? eingabe = read ( 0 = Abbruch, 1=Neue Runde ) ; // Neue Runde? while ( eingabe < 0 && eingabe > 1) { // Eingabe k o r r e k t? eingabe = read ( 0 = Abbruch, 1=Neue Runde ) ; else { w r i t e ( Zu wenig Geld! ) ; w r i t e ( S p i e l e n d e! Gewinn : + ( pgeld 100) ) ;