11.7 Programmbeispiel zu den Arrays
Das folgende, etwas umfangreichere Beispiel zeigt, welche Möglichkeiten die Verwendung von Arrays bietet. Das Beispielprogramm wertet eine Statistik für zwei Fußballmannschaften aus, und zwar das Tore- und Punkteverhältnis der letzten fünf Spiele, die beide Mannschaften gegeneinander gespielt haben:
/* array13.c */ #include <stdio.h> #include <stdlib.h> /* Bilanz aus 5 Spielen */ #define SPIELE 5 #define WIN 3 #define LOSE 0 #define REMIS 1 /* Alle Elemente mit 0 initialisieren */ int Bayern[SPIELE] = { 0 }; int Borussia[SPIELE]= { 0 }; /* Funktion zum Zählen der Punkte */ void punkte(int bm[], int bd[], int count) { if(bm[count] > bd[count]) { bm[count] = WIN; /* 3 Punkte für Bayern */ bd[count] = LOSE; } else if(bm[count] < bd[count]) { bm[count] = LOSE; bd[count] = WIN; /* 3 Punkte für Borussia */ } else if(bm[count] == bd[count]) { bm[count] = REMIS; /* 1 Punkt für jeden - unentschieden */ bd[count] = REMIS; } } int main(void) { unsigned int tor1, tor2; unsigned int tmptor1 = 0, tmptor2 = 0; unsigned int punkte_bay = 0, punkte_bor = 0; unsigned int count=0; /* Indexzaehler */ /* Eingabe des Anwenders */ printf("Eingabe der letzten %d Spiele\n", SPIELE); while(count != SPIELE) { printf("%d. Spiel : Bayern - Borrusia\n", count+1); printf("Tor(e) Bayern : "); scanf("%2u", &tor1); Bayern[count] = tor1; printf("Tor(e) Borussia : "); scanf("%2u", &tor2); Borussia[count] = tor2; tmptor1 += tor1; /*Tore zaehlen Bayern*/ tmptor2 += tor2; /*Tore zaehlen Borussia*/ /* Werte an Funktion punkte() uebergeben */ punkte(Bayern, Borussia, count); /* Punkte zaehlen */ punkte_bay += Bayern[count]; punkte_bor += Borussia[count]; /* Nächstes Spiel */ count++; } /* Ausgabe der Statistik */ printf("\n\nStatistik der letzten %d Spiele\n\n", SPIELE); printf("Bayern - Borussia\n"); printf("Punkte : %2d : %2d\n", punkte_bay, punkte_bor); printf("Tore : %2d : %2d\n", tmptor1, tmptor2); return EXIT_SUCCESS; }
Die Bildschirmausgabe des Programms könnte (abhängig von den Eingabewerten) z. B. so aussehen wie in Abbildung 11.5.
Abbildung 11.5 Ausgabe des Programmbeispiels
Das Programm soll nun Schritt für Schritt erläutert werden.
int Bayern[SPIELE] = { 0 }; int Borussia[SPIELE]= { 0 };
Hier wird jeweils ein Array mit dem Wert 0 initialisiert. Sehr wichtig im Programm ist folgende Variable:
unsigned int count = 0;
Mit ihr wird die Anzahl der gespielten Spiele gezählt.
In der while-Schleife der Hauptfunktion werden Sie aufgefordert, das Endergebnis jedes einzelnen Spiels einzugeben. Der Wert wird an die Arrays mittels
Bayern[count] = tor1; ... Borussia[count] = tor2;
übergeben. War das erste Ergebnis beispielsweise 2:1 für Bayern, dann bekommen die Elemente mit dem Index 0 folgende Werte:
Bayern[0] = 2; ... Borussia[0] = 1;
Diese beiden Werte werden danach mit der Anzahl absolvierter Spiele an die Funktion void punkte(...) übergeben:
punkte(Bayern, Borussia, count);
Tatsächlich werden hier die Anfangsadressen der Arrays an die Funktion punkte() übergeben. Dort wird mit if else-Anweisungen überprüft, welcher der beiden Werte höher ist. Dabei ist das aktuelle Ergebnis von Interesse, das mit dem Index [count] angegeben ist. Im konkreten Beispiel (2:1) wäre folgende Bedingung wahr:
if(bm[count] > bd[count]) { bm[count] = WIN; /* 3 Punkte für Bayern */ bd[count] = LOSE; }
Somit werden den Elementen der Arrays folgende Werte zugewiesen:
bm[0] = 3 /* Punkte für Bayern */ bd[0] = 0 /* Punkte für Borussia */
Wenn Borussia siegen sollte, überprüft die Funktion punkte() die nächste Bedingung. Die letzte else-if-Anweisung steht für ein Unentschieden beider Mannschaften, und jeder bekommt einen Punkt. Danach fährt das Programm mit der while-Schleife der Hauptfunktion fort. Dort wird mit
count++;
der Indexzähler um 1 erhöht, und es kommt die nächste Abfrage der Werte für:
Bayern[1]=... und Borussia[1]=...
Es werden so lange Werte eingegeben, bis
while(count != SPIELE)
unwahrheitsgemäß abbricht. Das ist der Fall, sobald count == SPIELE wird, also 5 Spiele gespielt wurden. Anschließend wird die Gesamtpunktzahl von jedem Team auf dem Bildschirm ausgegeben. Zur Vergabe von Punkten wurden hier symbolische Konstanten verwendet, falls sich im Reglement wieder einmal etwas in der Punktevergabe ändert.
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.