Mehrdimensionale Arrays
Informatik · Gymnasium · Klassen 10–13 · PRIMM-Methode
🎯 Worum geht's? Klasse 10–13 · 2 Unterrichtsstunden
Nach dieser Seite kannst du …
- ein 2D-Array anlegen und seine Zeilen- und Spaltenzahl bestimmen
- mit
m[zeile][spalte]auf einzelne Felder zugreifen - vorhersagen, in welcher Reihenfolge verschachtelte Schleifen die Felder besuchen
- Summen, Maximum, Diagonalen und das Transponieren selbst programmieren
- typische Indexfehler finden und beheben
Vorwissen: eindimensionale Arrays und for-Schleifen
📝 Aufgaben
Jede Aufgabe hat fünf Schritte: Predict › Run › Investigate › Modify › Make. Wähle eine Aufgabe aus – oder nutze oben die Leiste „Aufgaben: 1, 2, 3 …“.
📐 Das Wichtigste in Kürze
Ein zweidimensionales Array ist ein Array aus Arrays – wie eine Tabelle aus
Zeilen und Spalten. Beide Indizes beginnen bei 0.
| Spalte 0 | Spalte 1 | Spalte 2 | |
|---|---|---|---|
| Zeile 0 | 1 | 2 | 3 |
| Zeile 1 | 4 | 5 | 6 |
int[][] m = new int[2][3];– 2 Zeilen, 3 Spalten, alle Felder0int[][] m = { {1, 2, 3}, {4, 5, 6} };– direkt mit Wertenm[1][2]– Zeile 1, Spalte 2 (hier:6)m.length– Anzahl der Zeilen,m[z].length– Länge der Zeilez- Alle Felder besuchen: zwei verschachtelte
for-Schleifen, außen über die Zeilen, innen über die Spalten
🏅 Zuletzt verdiente Badges
Lies die Deklarationen und sage die Ausgaben voraus.
Was gibt Zeile 2 aus (A)?
Was gibt Zeile 3 aus (B)?
Was gibt Zeile 5 aus (C)?
m.length ist die Anzahl der Zeilen, m[0].length die Länge der ersten Zeile – also die Anzahl der Spalten.Trage für jede Deklaration die Zahl der Zeilen, der Spalten und aller Felder ein.
| Deklaration | Zeilen | Spalten | Felder insgesamt |
|---|---|---|---|
new int[2][5] | |||
new double[4][4] | |||
{ {7, 8, 9} } | |||
{ {1}, {2}, {3}, {4} } |
new int[z][s] steht zuerst die Zeilenzahl, dann die Spaltenzahl. Bei { … } zählt jede innere Klammer als eine Zeile.Was liefert m.length bei einem 2D-Array?
Warum bestimmt man die Spaltenzahl mit m[0].length?
Ein Stundenplan soll 5 Tage (Zeilen) mit je 6 Stunden (Spalten) haben. Korrigiere die Deklaration.
new int[z][s] steht zuerst die Zahl der Zeilen, dann die der Spalten.Schreibe die Methode anzahlFelder: Sie gibt zurück, wie viele Felder das Array insgesamt hat (alle Zeilen sind gleich lang).
Ein Array wird mit new angelegt und danach teilweise belegt.
Was wird bei A ausgegeben?
Was wird bei B ausgegeben?
Was wird bei C ausgegeben?
int-Arrays haben nach new den Wert 0. t[1][0] bekommt den Wert von t[0][1] plus 1.Trage ein, welcher Wert nach Zeile 4 in jedem Feld von t steht.
| Spalte 0 | Spalte 1 | Spalte 2 | |
|---|---|---|---|
| Zeile 0 | |||
| Zeile 1 |
0.Welches Feld ist t[1][2]?
Welchen Wert hat ein Feld von new double[2][2] vor der ersten Zuweisung?
Die letzte Zeile soll das Feld unten rechts auf 9 setzen – sie führt aber zu einem Fehler. Korrigiere sie.
Schreibe die Methode setzeEcken: Sie setzt alle vier Eckfelder auf wert – für Arrays jeder Größe.
m.length - 1, letzte Spalte: m[0].length - 1. Welche vier Kombinationen ergeben die Ecken?Zwei ineinander geschachtelte Schleifen geben das Array aus.
Wie oft wird Zeile 5 (print) ausgeführt?
Was steht in der ersten Ausgabezeile?
println() eine neue Ausgabezeile.Trage für jeden Durchlauf der inneren Schleife z, s und den ausgegebenen Wert ein.
| Durchlauf | z | s | m[z][s] |
|---|---|---|---|
| 1 | 0 | 0 | 1 |
| 2 | |||
| 3 | |||
| 4 | |||
| 5 | |||
| 6 |
s = 0, 1, 2), bevor z um 1 steigt.Welche Laufvariable ändert sich häufiger?
Wozu dient System.out.println() in Zeile 7?
Gib das Array spaltenweise aus: erst 1 4, dann 2 5, dann 3 6. Tausche dazu die Schleifen.
Schreibe die Methode zaehleGroesser: Sie zählt, wie viele Werte im Array größer als grenze sind.
grenze.Die Schleife addiert die Werte einer Zeile.
Wie oft läuft die Schleife?
Was wird ausgegeben?
p[1][s] durchläuft die Zeile mit dem Index 1: 1, 5, 9.Berechne für dasselbe Array p alle Zeilensummen, alle Spaltensummen und die Gesamtsumme.
| Spalte 0 | Spalte 1 | Spalte 2 | Zeilensumme | |
|---|---|---|---|---|
| Zeile 0 | 3 | 1 | 4 | |
| Zeile 1 | 1 | 5 | 9 | |
| Zeile 2 | 2 | 6 | 5 | |
| Spaltensumme |
Welcher Index bleibt in p[z][s] gleich, wenn man eine Spaltensumme bildet?
Jede Zeilensumme soll einzeln ausgegeben werden. Wo muss summe = 0; stehen?
Ändere den Code so, dass er die Summe der Spalte 2 berechnet (Ergebnis: 18).
Schreibe die Methode zeilensummen: Sie gibt ein Array zurück, das für jede Zeile von m deren Summe enthält.
z in dieses Feld.Der Code sucht den größten Wert und merkt sich, wo er steht.
Welchen Wert hat max am Ende?
Welche Position wird gespeichert?
> ersetzt nur ein größerer Wert das bisherige Maximum – ein gleich großer nicht.Derselbe Code läuft jetzt mit int[][] w = { {5, 3}, {6, 6}, {2, 8} };. Trage nach jedem Durchlauf max, zeile und spalte ein.
z | s | w[z][s] | max | zeile | spalte |
|---|---|---|---|---|---|
| 0 | 0 | 5 | 5 | 0 | 0 |
| 0 | 1 | 3 | |||
| 1 | 0 | 6 | |||
| 1 | 1 | 6 | |||
| 2 | 0 | 2 | |||
| 2 | 1 | 8 |
w[z][s] > max gilt, ändern sich alle drei Werte. Sonst bleiben sie wie in der Zeile darüber.Warum startet max mit w[0][0] und nicht mit 0?
Was ändert sich im Predict-Beispiel, wenn man > durch >= ersetzt?
Ändere den Code so, dass er das Minimum und seine Position findet.
max am besten in min um.Schreibe die Methode enthaelt: Sie gibt true zurück, wenn x irgendwo im Array vorkommt, sonst false.
x findest, kannst du sofort true zurückgeben. Wann weißt du sicher, dass x nicht vorkommt?Bei einem quadratischen Array liegen die Felder q[0][0], q[1][1], … auf der Hauptdiagonale.
Welche Felder werden addiert?
Was wird ausgegeben?
q[0][0], q[1][1] und q[2][2]?Jetzt wird für dasselbe Array q die Nebendiagonale (von rechts oben nach links unten) addiert. Trage die Werte je Durchlauf ein.
i | q.length - 1 - i | q[i][q.length - 1 - i] | n danach |
|---|---|---|---|
| 0 | |||
| 1 | |||
| 2 |
q.length ist 3. Der Spaltenindex läuft also 2, 1, 0, während i 0, 1, 2 läuft.Warum reicht für die Hauptdiagonale eine Schleife?
Bei welchem Array führt q[i][i] mit i < q.length zu einem Fehler?
Ändere den Code so, dass er alle Werte oberhalb der Hauptdiagonale addiert: 2 + 3 + 6 = 11.
Schreibe die Methode istEinheitsmatrix: Sie gibt true zurück, wenn auf der Hauptdiagonale nur 1 und sonst überall 0 steht.
z == s) muss 1 stehen, sonst 0. Schon eine Abweichung genügt für false.Beim Transponieren werden Zeilen zu Spalten.
Wie viele Zeilen hat t?
Welchen Wert hat t[0][1]?
Welchen Wert hat t[2][1]?
t[s][z] = a[z][s]: Der Wert aus Zeile z, Spalte s landet in Zeile s, Spalte z. Also ist t[2][1] = a[1][2].Trage ein, welche Werte nach dem Durchlauf in t stehen.
| Spalte 0 | Spalte 1 | |
|---|---|---|
| Zeile 0 | ||
| Zeile 1 | ||
| Zeile 2 |
a (1, 2, 3) wird zur ersten Spalte von t.Warum wird t mit new int[a[0].length][a.length] angelegt?
Was passiert bei int[][] b = a; b[0][0] = 99;?
Ändere den Code so, dass t eine gespiegelte Kopie von a wird: jede Zeile rückwärts, also {3, 2, 1} und {6, 5, 4}.
t hat jetzt dieselbe Größe wie a. In welche Spalte von t gehört a[z][s], wenn jede Zeile rückwärts stehen soll?Schreibe die Methode kopiere: Sie gibt eine echte Kopie von m zurück – ein neues Array mit denselben Werten.
new ein neues Array gleicher Größe an und kopiere jeden Wert einzeln. Warum reicht return m; nicht?In Java dürfen die Zeilen eines 2D-Arrays verschieden lang sein.
Was wird bei A ausgegeben?
Was wird bei B ausgegeben?
Was passiert bei C?
Trage für das Array r den Wert ein – oder Fehler, wenn der Zugriff das Programm abbricht.
| Ausdruck | Wert oder „Fehler“ |
|---|---|
r.length | |
r[1][2] | |
r[2].length | |
r[0][1] + r[1][0] | |
r[3][0] | |
r[2][1] |
r hat 3 Zeilen (Index 0 bis 2) mit 2, 3 und 1 Werten.Warum schreibt man in der inneren Schleife s < r[z].length statt s < r[0].length?
Was ist an for (int z = 0; z <= m.length; z++) falsch?
Der Code soll alle Werte von m addieren (Ergebnis 21), enthält aber drei Fehler. Korrigiere sie.
Schreibe die Methode laengsteZeile: Sie gibt den Index der längsten Zeile zurück (die Zeilen können verschieden lang sein).
m[z].length.🏅 Deine Badges
Verdiente Badges leuchten auf.
📊 Statistik
↺ Zurücksetzen
Alle gespeicherten Daten werden gelöscht.
📄 Arbeitsblatt erstellen
Wähle aus, welche Bereiche auf das Arbeitsblatt kommen. Es enthält dann alle … Aufgaben dieser Seite aus diesen Bereichen – mit Kästchen zum Ankreuzen, leeren Tabellen und Platz zum Schreiben, ohne Lösungen und Tipps.