Ü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 größte und kleinste Feldelement in
data. - Das größte Feldelement in jeder Zeile von
data.
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.
- Lösen Sie das Problem durch Speicherung der Spaltensummen in
einem Hilfsfeld.
- 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.