FH Darmstadt 
FB Informatik 
Prof.Dr. H.P.Weber
Programmieren I 
Praktikum
4

Ziel: Sie sollen die Verwendung von Arrays, Funktionen und Rekursion üben sowie grundlegende Sortierverfahren kennen. 

1    Analyse von Craps

  • Schreiben Sie ein Programm, das 1000000-mal das Würfelspiel Craps simuliert. Ihr Programm soll folgende Fragen beantworten:
    • Wieviele Spiele werden gewonnen beim ersten Wurf, beim zweiten Wurf, ...(usw)..., beim 20. Wurf und nach dem 20.Wurf?
    • Wieviele Spiele werden verloren beim ersten Wurf, beim zweiten Wurf, ...(usw)..., beim 20. Wurf und nach dem 20.Wurf?
    • Wie groß sind die Chancen Craps zu gewinnen? (Sie sollten herausfinden, dass Craps eines der fairsten in Spielkasinos gespielten Spiele ist. Was bedeutet diese Aussage?)
    • Wie lang dauert ein Craps-Spiel im Durchschnitt?
    • Erhöhen sich die Gewinnchancen mit der Dauer eines Craps-Spieles?

2    Sortierverfahren 'Direkte Auswahl (Selection Sort)' und 'Direktes Einfügen (Insertion Sort)' 

  • Das Sortierverfahren 'Direkte Auswahl' durchsucht ein unsortiertes Array nach dem kleinsten Element in dem Array. Danach wird das kleinste Element mit dem ersten Element des Arrays ausgetauscht. Dieser Prozess wird für das unsortierte Teilarray, das mit dem zweiten Element des Arrays beginnt, wiederholt. Jeder derartige Durchlauf durch das Array bewirkt, dass ein weiteres Element an die Stelle kommt, an die es gehört. Sobald das unsortierte Teilarray nur noch ein Element enthält, ist das Array sortiert.
  • Schreiben Sie eine iterative Funktion selectionSort für diesen Algorithmus.
  • Das Sortierverfahren 'Direktes Einfügen' fasst das erste Element eines unsortierten Arrays als bereits sortiertes Teilarray auf, in das sukzessive die weiteren Elemente eingefügt werden. Bei diesem Einfügeprozess muss das immer größer werdende Teilarray zu jedem Zeitpunkt sortiert bleiben. Jedes weitere Element muss also an die richtige Stelle eingefügt werden. Damit dies möglich ist, müssen alle Elemente, die größer sind als das Einfügeelement, jeweils um einen Platz verschoben werden. Sobald das sortierte Teilarray alle Elemente enthält, ist das Array sortiert.
  • Schreiben Sie eine iterative Funktion insertionSort für diesen Algorithmus.

3    Verteilung der Augenzahlen bei Würfen mit vielen Würfeln 

  • Entwickeln Sie ein Programm, das es dem Benutzer ermöglicht, Würfe mit mehreren Würfeln zu simulieren. Das Simulationsergebnis ist dann eine Gesamt-Augenzahl, die sich als Summe der Augenzahlen der einzelnen Würfel ergibt. Werden viele dieser Würfe mit mehreren Würfeln durchgeführt, ergibt sich eine Häufigkeitsverteilung für die Gesamt-Augenzahlen. Diese Häufigkeitsverteilung soll im Konsolenfenster in Form einer Tabelle und als einfache Übersichtsgraphik ausgegeben werden.
  • Zu Beginn sollen vom Benutzer folgende Eingaben abgefragt werden:
    • Die Zahl der Würfel, die er bei einem Wurf werfen möchte.
    • Die Zahl der Würfe, die er mit der gewählten Anzahl von Würfeln durchführen möchte.
  • Die Häufigkeitsverteilung für die erzielten Gesamt-Augenzahlen soll auf zwei verschiedene Arten dargestellt werden:
    • Tabellarische Darstellung als Gegenüberstellung von erzielter Augenzahl und zugehöriger Häufigkeit. Dabei sollen sowohl die Absolutwerte der Häufigkeit als auch normierte Werte, die sich bei Division der Absolutwerte durch die Gesamtzahl der Würfe ergeben, ausgegeben werden.
    • Graphische Darstellung als ein einfaches (um 90 Grad gekipptes) Säulendiagramm (z.B. entsprechende Anzahl von *).
  • Strukturieren Sie Ihr Programm mit Hilfe von geeignet gewählten Funktionen für einzelne Teilaufgaben. 

4    Galton-Brett (fakultativ)

Entwickeln Sie ein Programm, das ein "Galton-Brett" und dessen Benutzung simuliert. Das Simulationsergebnis soll im Konsolenfenster in Form von Zahlenkolonnen und als einfache Übersichtsgraphik ausgegeben werden.

Funktionsprinzip des Galton-Bretts

Mit Hilfe eines Galton-Bretts (nach Sir Francis Galton, 1822-1911) lassen sich wichtige Verteilungen aus der Statistik experimentell erzeugen. Dabei laufen auf einem geneigt aufgestellten Nagelbrett Kugeln durch die Nagelreihen. In Sammelbehältern am Fuß des Nagelbretts werden die Kugeln aufgefangen. Sind die Nägel im Brett so angeordnet, daß der Abstand zweier nebeneinander liegender Nägel durch den darüberliegenden Nagel genau halbiert wird, so ist als Verteilung der Kugeln in den Sammelbehältern die Normalverteilung (Gaußsche Glockenkurve) zu erwarten.

Darstellung des Simulationsergebnisses

Das Ergebnis der Simulation soll durch Angabe der Anzahl von Kugeln, die in 25 Sammelbehältern jeweils aufgefangen werden, ausgegeben werden (Funktion textOutput). Dabei sollen sowohl die Absolutwerte als auch normierte Werte, die sich bei Division der Absolutwerte durch die Gesamtanzahl der Kugeln ergeben, ausgegeben werden. Zusätzlich soll durch eine Funktion graphicalOutput ein einfaches (um 90 Grad gekipptes) Säulendiagramm (z.B. entsprechende Anzahl von *) im Konsolenfenster ausgegeben werden können.

Die Bedienung des Programms erfolgt im Konsolenfenster durch Angabe der gewünschten Anzahl von Kugeln und der gewünschten Darstellungsart des Ergebnisses. Wenn Sie wollen, können Sie natürlich auch die Anzahl der Sammelbehälter nicht auf genau 25 beschränken, sondern vom Benutzer des Programms vorgeben lassen.

Implementierungshinweis

Es ist Zufall, ob eine Kugel an einem Nagel nach links oder rechts rollt. Deshalb sollen Zufallszahlen, die die Funktion rand liefert, verwendet werden. Bedenken Sie, dass an jedem Nagel (d.h. auf jeder Ebene) nur eine Entscheidung (links oder rechts) zu treffen ist. Mit jeder Ebene, die die Kugel passiert, wird dadurch die Menge der noch erreichbaren Sammelbehälter sukzessive eingeschränkt. Dieses Verhalten soll in eine rekursive Funktion abgebildet werden.