Prof. Franz Schweiggert Abteilung Angewandte
Informationsverarbeitung 16. Mai 2006
Christian Ehrhardt Blatt 4
Systemnahe Software (SS 2006)
Abgabetermin 23.Mai 2006
In diesem Blatt soll die Fußball-WM 2006 mit Hilfe von fork(2)
und den verschiedenen Varianten von exec(2) simuliert werden.
Um die Sache gleich von vorne herein etwas zu vereinfachen, werden
wir auf die Verwendung von Mannschaftsnamen verzichten. Die 32
teilnehmenden Teams bekommen die Nummern 0 bis 31 zugeordnet.
Schreibt zunächst ein kleines Programm goals, das auf
der Kommandozeile zwei Mannschaftsnummern übergeben bekommt und
dann (mit Hilfe eines Zufallszahlengenerators) entscheidet, wieviele
Tore die erste Mannschaft gegen die zweite erzielt. Der Exit-Status
des Programms gibt an, wieviele Tore erzielt wurden. Bei einem
fehlerhaften Aufruf sollte das Programm mit einem Segmentation Fault
terminieren (ausnahmsweise).
Wie realistisch die Simulation letzten Endes sein wird, entscheidet
sich daran, wieviel Expertenwissen Ihr in diese Programm steckt,
für das Übungsblatt müssen die Parameter zwar überprüft
aber nicht unbedingt ausgewertet werden.
Hinweis: Die Initialisierung der Zufallszahlengenerators
mit srand(3c) sollte in diesem Fall auch die Prozeß-ID
und nicht nur die aktuelle Uhrzeit berücksichtigen.
Schreibt ein Programm, das in einer Schleife goals
mit verschiedenen Parametern aufruft und eine Statistik ausgibt,
wie oft welche Anzahl von Toren erzielt wurde.
Ein einziges Spiel wird jetzt so simuliert, daß für jede
der beiden beteiligten Mannschaften einmal goals aufgerufen
wird um die von dieser Mannschaft erzielten Tore zu ermitteln.
Daraus ergibt sich das Ergebnis. Sollte der Turniermodus für
dieses Spiel kein Unentschieden erlauben, dann wird im Falle von
gleich vielen erzielten Toren die Prozedur einfach so lange
wiederholt, bis es zu einer Entscheidung kommt.
Hinweis: Es lohnt sich eventuell, eine Funktion zu
schreiben, die zu zwei gegebenen Mannschaftsnummern durch einen
Aufruf von goals ermittelt, wieviele Tore die erste
Mannschaft erzielt.
Die 32 teilnehmenden Mannschaften sind in 8 Gruppen zu je 4
Mannschaften eingeteilt: Mannschaft 0 bis 3 in Gruppe A,
Mannschaft 4 bis 7 in Gruppe B usw. Innerhalb einer Gruppe spielt
zunächst jede Mannschaft einmal gegen jede andere.
Im folgenden betrachten wir eine Gruppe bestehend aus dem vier
Mannschaften mit den Nummern M0, M1, M2 und M3. Dann müssen die
folgenden 6 Gruppenspiele wie oben beschrieben simuliert werden:
- M0 gegen M1
- M0 gegen M2
- M0 gegen M3
- M1 gegen M2
- M1 gegen M3
- M2 gegen M3
Die beiden besten Mannschaften aus der sich daraus ergebenden
Tabelle kommen ins Achtelfinale. Glücklicherweise gibt es bereits
ein Programm tabelle
auf der Homepage der Vorlesung (als C-Programm) herunterzuladen,
das aus den Ergebnissen der Gruppenspiele den Gruppensieger oder
den Gruppenzweiten ermitteln kann. Dieses Programm erwartet 13
Kommandozeilenparameter:
- Den gesuchten Tabellenplatz (von 0 bis 3) und
- Zwölf Zahlen, die die Ergebnisse der 6 Gruppenspiele
genau in der oben angegebenen Reihenfolge angeben.
Der Rückgabewert gibt den Index der Mannschaft in Ihrer Gruppe
an, die den fraglichen Tabellenplatz erreicht hat. Ist also zum
Beispiel Tabellenplatz 0 (der Gruppensieger) gesucht, dann
bedeutet ein Rückgabewert von 2, daß die Mannschaft M2 in dieser
Gruppe gewonnen hat.
Eure Aufgabe ist es also nur noch, für jedes Gruppenspiel das
Ergebnis zu ermitteln und das Programm tabelle passend
aufzurufen, um den Gruppensieger und den Gruppenzweiten zu
ermitteln.
Hinweis: Sollte das Programm Tabelle nicht in der Lage
sein, aus den Ergebnissen eine eindeutige Reihenfolge zu ermitteln
(nicht alle FIFA-Regeln diesbezüglich sind korrekt implementiert),
so beendet es sich mit einem Segmentation Fault. Dieser Fall muß
also beim Aufruf beachtet werden.
Aus den Gruppenspielen ergeben sich 16 Achtelfinalisten, die
den Gewinner im KO-System ermitteln. Dazu werden die Achtelfinalisten
in eine Liste geschrieben und immer zwei benachbarte Mannschaften
spielen gegeneinander ein Spiel. Der Verlierer wird aus der Liste
gestrichen und die nächste Runde beginnt. Das geschieht so lange,
bis nur noch ein Mannschaft (der Turniersieger) in der Liste
verbleibt. Diese Spiele müssen natürlich ebenfalls simuliert
werden.
Beim erstellen der Liste der 16 Achtelfinalisten aus den
Gruppensiegern und den Gruppenzweiten wird darauf geachtet, daß
- Zwei Mannschaften, die bereits in der gleichen Gruppe
gespielt haben erst wieder im Finale aufeinander treffen
können und
- Eine Mannschaft, die Gruppensieger wurde, spielt im
Achtelfinale (Runde der letzten 16) gegen eine Mannschaft,
die Gruppenzweiter in einer anderen Gruppe wurde.
Gewährleistet wird dies zum Beispiel durch folgende anfängliche
Ordnung: A1, B2, C1, D2, E1, F2, G1, H2, A2, B1, C2, D1, E2, F1,
G2, H1. Dabei bedeutet etwa D2, den Zweitplazierten in der Gruppe
D.
Christian Ehrhardt
2006-05-16