Übungsblatt zu zweidimensionalen Feldern


Aufgabe 1: Summe der Feldelemente: gleiche Zeilenlängen

Schreiben Sie ein Programm, das mit Hilfe von zwei verschachtelten Zählschleifen die Summe der Feldelemente eines quadratischen zweidimensionalen Felds data berechnet, welches die folgenden Feldelemente besitzt:

{
  {3, 2, 5, -7},
  {1, 4, 4, 8},
  {9, -1, 0, 2},
  {0, 2, -6, 3}
}

Programmausgabe:

Summe: 29

Aufgabe 2: Zeilensummen

Gegeben sei das Feld data aus Aufgabe 1. Schreiben Sie ein Programm, das mit Hilfe von zwei verschachtelten Zählschleifen die Summe der Feldelemente jeder Zeile des Felds data berechnet und die einzelnen Zeilensummen in den Feldelementen eines eindimensionalen Felds mit dem Namen sum speichert. Geben Sie die im Feld sum gespeicherten Werte aus.

Programmausgabe:

Zeilensummen: [3] [17] [10] [-1]

Aufgabe 3: Spaltensummen

Gegeben sei das Feld data aus Aufgabe 1. Schreiben Sie ein Programm, das mit Hilfe von zwei verschachtelten Zählschleifen die Summe der Feldelemente jeder Spalte des Felds data berechnet und die einzelnen Spaltensummen in den Feldelementen eines eindimensionalen Felds mit dem Namen sum speichert. Geben Sie dann die im Feld sum gespeicherten Werte aus.

Programmausgabe:

Spaltensummen: [13] [7] [3] [6]

Aufgabe 4: Computerspiel 1

Ein Computerspiel basiere auf der folgenden Karte, bestehend aus 7 Zeilen zu je 16 Feldern, in der begehbare Felder durch - und gesperrte Felder durch # markiert sind.

----------------
---#####--------
-----------#----
-----------#----
-----------#----
-------###------
----------------

Schreiben Sie ein Programm, in dem das oben angegebene Spielfeld durch ein zweidimensionales Integerfeld codiert wird. Mit Hilfe von verschachtelten Zählschleifen wird dann die Anzahl der gesperrten Felder gezählt und in das Ausgabefenster ausgegeben.

Programmausgabe:

11 Felder dürfen nicht betreten werden.

Aufgabe 5: Computerspiel 2

Ein Computerspiel basiere auf der folgenden Karte, bestehend aus 7 Zeilen zu je 16 Feldern, in der Lavabecken ("lava") durch 'l' markiert sind. Dann gibt es noch durch 'h' markierte Lebenselixierampullen ("health") und durch 'p' markierte Giftampullen ("poison").

-------l--p-----
---l----h--l----
----------------
--h--l----h-----
----------------
--p----l-----h--
---------l------

Schreiben Sie ein Programm, in dem das oben angegebene Spielfeld durch ein zweidimensionales Characterfeld codiert wird. Mit Hilfe von verschachtelten Zählschleifen wird dann die Anzahl der Lavabecken, der Lebenselixier- und Giftampullen gezählt und in das Ausgabefenster ausgegeben. Nutzen Sie für die Auswertung die switch-Anweisung.

Programmausgabe:

Lava: 6, Health: 4, Poison: 2

Aufgabe 6: Bild glätten

Gegeben sei folgendes zweidimensionales int-Feld mit dem Namen image, welches für ein Grauwertbild stehen kann:

{{5,0,0,0,0,5},
 {0,5,0,0,0,0},
 {0,0,9,9,5,5},
 {0,0,9,9,5,0},
 {0,0,5,5,5,0},
 {5,0,0,5,0,5}};

Der Wert eines jeden Feldelements steht dann für einen Grauwert eines Bildelements bzw. Pixels (engl. für "Picture Element"). Die Grauwerte liegen typischerweise im Bereich 0..255.

Eine der einfachsten Bildverarbeitungsoperationen ist das Glätten des Bilds mit Hilfe eines Mittelwertfilters. Dieses Filter kann man sich vorstellen als ein Fenster, welches über das Bild läuft, wobei das aktuell verarbeitete Pixel im Zentrum dieses Fensters liegt. Ziel der Operation ist das Berechnen eines neuen Werts für dieses zentrale Pixel. Bei einem Mittelwertfilter entspricht dieser neue Wert einfach dem arithmetischen Mittel aller im Fenster liegenden Pixel. Dieser Mittelwert wird aber nicht in das Originalbild geschrieben, sondern an die entsprechende Position in einem neuen leeren Bild bzw. Feld.

Bezüglich der Fensterform existieren unterschiedliche Ansätze. Häufig wird ein quadratisches Fenster der Größe (3x3)-Pixel benutzt. Bei der Berechnung des neuen Pixelwerts an der Position (r,c) des Bilds image ergibt sich dann folgendes Fenster:

image[r-1][c-1], image[r-1][c  ], image[r-1][c+1],
image[r  ][c-1], image[r  ][c  ], image[r  ][c+1],
image[r+1][c-1], image[r+1][c  ], image[r+1][c+1].

Dabei steht r für die Zeile (row) und c für die Spalte (column).

Liegt die Position (r,c) auf dem Bildrand entsteht bei der Berechnung das Problem, dass nicht für alle oben angegebenen Positionen ein Pixelwert existiert, da das Fenster über die Bildgrenzen hinausragt. Eine Lösung dieses Problems, die hier umzusetzen ist, besteht darin, alle außerhalb der Bildgrenzen liegenden Pixel von der Mittelwertbildung auszuklammern.

Implementieren Sie das beschriebene Verfahren für das oben gegebene Feld image.

Programmausgabe:

Originalbild:
[5] [0] [0] [0] [0] [5]
[0] [5] [0] [0] [0] [0]
[0] [0] [9] [9] [5] [5]
[0] [0] [9] [9] [5] [0]
[0] [0] [5] [5] [5] [0]
[5] [0] [0] [5] [0] [5]


Geglättetes Bild:
[3] [2] [1] [0] [1] [1]
[2] [2] [3] [3] [3] [3]
[1] [3] [5] [5] [4] [3]
[0] [3] [5] [7] [5] [3]
[1] [2] [4] [5] [4] [3]
[1] [2] [3] [3] [3] [3]

Schneiden Sie bei der Mittelwertbildung Nachkommastellen nicht ab, sondern benutzen Sie Gleitkommaarithmetik und die Rundungsfunktion Math.round() sowie eine Typumwandlung (type cast) auf Integer: (int) Math.round(/*...*/). Hierdurch wird der long-Wert, den Math.round() liefert, in einen Integer umgewandelt.

Aufgabe 7: Verschiedene Zeilenlängen

Schreiben Sie ein Programm, das mit Hilfe einer verschachtelten Zählschleife für ein zweidimensionales Feld data folgendes bestimmt:

Das Feld data besitzt die Feldelemente:

{
  {3, 2, 5},
  {1, 4, 4, 8, 13},
  {9, 1, 0, 2},
  {0, 2, 6, 3, -1, -8}
}

Programmausgabe:

Zeile 0 -> Größtes Feldelement: 5
Zeile 1 -> Größtes Feldelement: 13
Zeile 2 -> Größtes Feldelement: 9
Zeile 3 -> Größtes Feldelement: 6
Größtes Feldelement des Felds: 13
Kleinstes Feldelement des Felds: -8

Aufgabe 8: Umkehrung der Feldelemente

Schreiben Sie ein Programm, das mit Hilfe einer verschachtelten Zählschleife die Anordnung der Elemente in jeder Zeile des Felds data aus Aufgabe 7 umkehrt und dann das Feld mit Hilfe einer weiteren verschachtelten Zählschleife ausgibt.

Programmausgabe:

5 2 3 
13 8 4 4 1 
2 0 1 9 
-8 -1 3 6 2 0

Hinweis: Das Umkehren erfolgt, ohne dass die Zahlen einer Zeile in einem Hilfsfeld zwischengespeichert werden.

Aufgabe 9: Spaltensummen: verschiedene Zeilenlängen

Schreiben Sie ein Programm, das für das Feld data aus Aufgabe 7 jeweils für jede Spalte die Summe der Zahlenwerte in der Spalte berechnet.

  1. Lösen Sie das Problem durch Speicherung der Spaltensummen in einem Hilfsfeld.
  2. Lösen Sie das Problem ohne Speicherung der Spaltensummen in einem Hilfsfeld, d. h. durch direktes Ausgeben der Spaltensummen während der Berechnung.

Programmausgabe:

Summe Spalte 0: 13
Summe Spalte 1: 9
Summe Spalte 2: 15
Summe Spalte 3: 13
Summe Spalte 4: 12
Summe Spalte 5: -8

Aufgabe 10: Pascalsches Dreieck

Schreiben Sie ein Programm, mit dem sich n+1 Zeilen des Pascalschen Dreiecks berechnen lassen. Die Zeilen des Pascalschen Dreiecks beschreiben die Binomialkoeffizienten der binomischen Formeln (a+b)n.

Das Pascalsche Dreieck besitzt folgenden Aufbau:

n=0: 1
n=1: 1   1
n=2: 1   2   1
n=3: 1   3   3   1
n=4: 1   4   6   4   1
n=5: 1   5  10   10  5   1
n=6: 1   6  15   20  15  6   1
...usw.

Das erste und das letzte Element einer Zeile sind immer 1. Die Elemente dazwischen ergeben sich ab n=2 als Summe zweier darüber befindlicher Elemente. Es sind dies das linke sowie das direkt oberhalb des zu berechnenden Wertes befindliche Element.

Das Programm soll zu Anfang den Wert n mit Hilfe der IOLib einlesen und daraufhin n+1 Zeilen des Pascalschen Dreiecks generieren. Die berechneten Koeffizienten sollen in einem passend erzeugten zweidimensionalen Feld abgelegt werden. Da die Anzahl der Feldelemente dieses Felds erst zur Laufzeit des Programms ermittelt werden, spricht man in diesem Zusammenhang auch von einem dynamisch erzeugten Feld. Geben Sie am Ende die Elemente des Felds auf die Konsole aus.