Zweidimensionale Arrays
Manche Daten bilden eine Tabelle mit Zeilen und Spalten: die Sitze in einem Kino, ein Schachbrett, ein Stundenplan. Für solche Daten hat C zweidimensionale Arrays, Arrays mit zwei Größen:
int sitze[3][4] = {
{1, 1, 0, 0},
{0, 1, 1, 1},
{0, 0, 0, 1}
};Dieses Array ist ein kleines Kino mit 3 Reihen zu je 4 Sitzen: 1 bedeutet, dass der Sitz besetzt ist, 0, dass er frei ist. Die erste Zahl in eckigen Klammern ist die Anzahl der Reihen, die zweite die Anzahl der Spalten. In den geschweiften Klammern hat jede Reihe ihr eigenes Klammerpaar, und ein Komma trennt sie von der nächsten Reihe. Du musst nicht jede Reihe in eine eigene Zeile schreiben, aber so erkennst du die Tabelle leichter.
Ein Element hat zwei Indizes: zuerst die Reihe, dann die Spalte, beide ab 0 gezählt. sitze[1][2] ist das Element in der zweiten Reihe (Index 1) und der dritten Spalte (Index 2). Du liest und änderst es wie jedes andere Element:
printf("%d\n", sitze[1][2]);
sitze[2][0] = 1;
printf("%d\n", sitze[2][0]);Das gibt Folgendes aus:
1
1Um die ganze Tabelle zu durchlaufen, brauchst du zwei verschachtelte Schleifen. Die äußere geht durch die Reihen, und für jede Reihe geht die innere durch ihre Spalten. Das kennst du aus der Lektion über Schleifen, wo verschachtelte Schleifen Zeilen und Spalten ausgegeben haben:
const int REIHEN = 3;
const int SPALTEN = 4;
for (int reihe = 0; reihe < REIHEN; reihe++) {
for (int spalte = 0; spalte < SPALTEN; spalte++) {
printf("%d ", sitze[reihe][spalte]);
}
printf("\n");
}Nach der Änderung oben gibt das Folgendes aus:
1 1 0 0
0 1 1 1
1 0 0 1 Für jede Reihe gibt die innere Schleife ihre vier Sitze in einer Zeile aus, und das printf("\n") nach der inneren Schleife beendet die Zeile. Dann geht die äußere Schleife zur nächsten Reihe. Die Namen reihe und spalte machen klar, welcher Index welcher ist. Mit i und j verwechselt man sie leicht.
Ein Index hinter dem Ende ist auch hier ein Fehler: sitze[3][0] lässt sich nicht kompilieren (error: array index 3 is past the end of the array (that has type 'int[3][4]')), und eine Schleife mit reihe <= REIHEN bricht mit RuntimeError: unreachable ab.
So schreibst du es:
Anweisungen
- 1
Ein Kunde hat den zweiten Sitz in der dritten Reihe gekauft. Schreibe unter der Ausgabezeile eine Anweisung, die dieses Element von
sitzeauf1ändert. - 2
Gib das ganze Kino mit zwei verschachtelten Schleifen aus, eine Reihe pro Zeile, die Sitze durch Leerzeichen getrennt:
1 1 0 0 0 1 1 1 0 1 0 1 - 3
Zähle die freien Sitze: Erstelle eine Variable
freie_sitzemit dem Wert0, gehe das Kino wieder mit zwei verschachtelten Schleifen durch und erhöhefreie_sitzebei jeder0. Gib das Ergebnis nach den Schleifen alsFreie Sitze: 5aus.