Übungsaufgaben zum Thema Felder

Kopieren Sie jeweils den unten angegebenen Code in Ihren Editor und vervollständigen Sie diesen wie in den Aufgaben vorgegeben. Kompilieren und starten Sie danach das jeweilige Programm.



Aufgabe 1: Feldelementsumme

Betrachten Sie das folgende Codesegment:

int[] val = {0, 1, 2, 3};
int sum = 0; println("Summe aller Zahlen = " + sum);

Vervollständigen Sie den Code, sodass die Summe der Zahlen im Array mit Hilfe einer Schleife berechnet wird.

Ausgabe des Programms:

Summe aller Zahlen = 6


Aufgabe 2: Zwei Felder

Gegeben sei ein Feld val mit vier Integerzahlen:

int val[] = {13, -4, 82, 17};

Programmausgabe:

Ursprüngliches Feld: 13 -4 82 17
Neues Feld: 26 -8 164 34


Aufgabe 3: Drei Felder

Gegeben seien drei Felder:

int valA[] = {13, -22,  82,  17};
int valB[] = {-12,  24, -79, -13};
int sum[]  = {  0,   0,   0,   0};

Programmausgabe:

Summe: 1 2 3 4

Aufgabe 4: Dieselbe Summe

Gegeben sei das folgende Feld:

int valA[] = {13, -22,  82,  17};

Definieren Sie ein neues Feld valB und beschreiben Sie dessen Feldelemente in einer Schleife mit Werten, so dass die Summe der korrespondierenden Feldelemente von valA und valB 25 ergibt.

Programmausgabe:

valA:   [13] [-22] [82] [17]
valB:   [12] [47] [-57] [8]
Sum:    [25] [25] [25] [25]

Aufgabe 5: Mittelwert und unterschiedliche Summen der Feldelemente

Gegeben sei das folgende Feld:

int data[] = {3, 2, 5, 7, 9, 12, 97, 24, 54};

Schreiben Sie Programmcode, in dem mit Hilfe einer einzelnen Schleife folgendes berechnet wird:

Hinweis: Eine gerade Zahl lässt sich ohne Rest ganzzahlig durch zwei teilen.

Programmausgabe:

Mittelwert: 23, Summe gerader: 92, Summe ungerader: 121

Aufgabe 6: Die zwei größten Elemente

Gegeben sei das folgende Feld:

int data[] = {3, 1, 5, 7, 4, 12, -3, 8, -2};

Schreiben Sie ein Programm, dass mit Hilfe einer einzelnen Schleife, d. h. einer einzelnen Maximumsuche, die zwei größten Elemente des Felds findet und ausgibt.

Programmausgabe:

Größtes Element:        12
Zweitgrößtes Element:   8

Prüfen Sie Ihr Programm mit unterschiedlichen Feldern, wie z. B.:

Bei dieser Aufgabe steckt die größte Schwierigkeit in einer geeigneten Initialisierung der Variablen.

Aufgabe 7: Tonfilter

Ein Tonsignal wird manchmal als Liste von int-Werten gespeichert. Die Werte repräsentieren die Intensität des Signals in aufeinander folgenden Zeitintervallen.

int signal[] = {1, 5, 4, 5, 7, 6, 8, 6, 5, 4, 5, 4};

Oft ist in dem Signal ein kleiner Anteil von Störgeräuschen enthalten. Störgeräusche sind üblicherweise kleine, momentane Änderungen der Tonhöhe. Ein Beispiel hierfür ist das Rauschen, das zusätzlich zum Ton eines AM Radios zu hören ist.

Das Glätten des Tons unterdrückt das Störgeräusch und verbessert die Tonqualität.

In dieser Aufgabe werden Sie die Werte eines Integerarrays glätten. Angenommen, dass die ursprünglichen Werte in dem Array ein "Signal" repräsentieren. Berechnen Sie zu diesem Signal geglättete Feldelemente, indem Sie folgendes tun: Definieren Sie ein neues Feld smooth, mit der gleichen Anzahl an Feldelementen wie signal. Mit Ausnahme des ersten und letzten Feldelements in smooth, ist jeder Wert smooth[N] der Durchschnitt von drei Werten: signal[N-1], signal[N] und signal[N+1].

Berechnen Sie für das erste Element von smooth den Durchschnitt der ersten zwei Elemente von signal. Berechnen Sie für das letzte Element von smooth den Durchschnitt der letzten zwei Elemente von signal.

Verwenden Sie dafür Integerarithmetik, so dass die Werte in smooth Integer sind.

Beziehen Sie sich in Ihrem Code auf die Länge des Felds signal. Verwenden Sie keine festen Zahlenwerte für die Feldlänge, damit der Code unabhängig von der Länge des real bearbeiteten Felds ist.

Programmausgabe für das Feld oben:

Original signal: 1 5 4 5 7 6 8 6 5 4 5 4 
Smoothed signal: 3 3 4 5 6 7 6 6 5 4 4 4 

Denken Sie daran, dass bei der Integerdivision der Rest verworfen und kein gerundeter Wert berechnet wird.

Aufgabe 8: Datenoptimierung

Angenommen, Sie möchten den durchschnittlichen Säuregehalt von Kaffee bestimmen, der in den Cafés Ihrer Heimatstadt serviert wird. Zu diesem Zweck besuchen Sie eine Reihe von Cafés und tauchen Ihr PH-Messgerät in Kaffeeproben.

Leider liefert Ihr PH-Messgerät manchmal falsche Ergebnisse. Sie schließen daher den am weitesten vom Durchschnitt entfernten Messwert als Fehlmessung von der Durchschnittsberechnung aus.

Berechnen Sie den Durchschnitt aller Daten im unten angegebenen Feld samples. Durchsuchen Sie danach das Feld, um den Wert zu finden, der am weitesten (in jeder Richtung) vom Durchschnitt entfernt ist. Korrigieren Sie danach den Durchschnittswert, indem Sie diese Fehlmessung aus der Summenberechnung für den Durchschnittswert ausschließen. Berechnen Sie danach den korrigierten Durchschnittswert und geben Sie ihn aus.

double samples[] = {5.6, 6.2, 6.0, 5.5, 5.7,
                    6.1, 7.4, 5.5, 5.5, 6.3,
                    6.4, 4.0, 6.9};

Programmausgabe:

Durchschnitt:           5.930769
Entferntester Wert:     4.0
Neuer Durchschnitt:     6.091667

Definieren Sie für die Anzahl der Feldelemente wieder eine Konstante, damit Ihr Code unabhängig von der Länge des real bearbeiteten Felds ist.

Aufgabe 9: Histogramm

Als Histogramm wird die grafische Darstellung der Häufigkeitsverteilung einer Menge von Werten bezeichnet. Dies kann z. B. die Häufigkeit sein, mit der Bitfehler der Größe 0 Bit, 1 Bit, 2 Bit usw. bei einem bestimmten Übertragungskanal vorkommen oder die Anzahl von Pixel bzw. Bildelementen mit einem bestimmten Grauwert in einem Bild oder die Anzahl von Studierenden eines bestimmten Alters in einem Vorlesungsraum.

Gegeben sei das folgende Array,

int samples[] = {1, 1, 1, 3, 3, 6, 8, 14, 20, 
                 19, 15, 9, 6, 3, 3, 1, 1};

welches für die gezählte Häufigkeit bestimmter Abweichungen von einem erwarteten Wert steht. Der erwartete Wert sei hier 0. Der Wertebereich der Werte in samples reicht dabei von -8 bis 8, d. h.:

1 1 1 3 3 6 8 14 20 19 15 9 6 3 3 1 1
-8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8

Der Wert 0 kommt dabei z. B. mit 20 Zählungen am häufigsten vor. Der Wert 1 mit 19 Zählungen fast genauso oft. Es könnte sich bei diesen Werten z. B. um die Häufigkeit von Mehrbitfehlern auf einem bestimmten Übertragungskanal handeln, wobei Wechsel von 1 nach 0 z. B. negative Vorzeichen besitzen und Wechsel von 0 nach 1 positive Vorzeichen. Die Güte dieses Übertragungskanals wäre dann nicht besonders hoch, da Mehrbitfehler recht häufig auftreten. 0 würde einer fehlerfreien Übertragung entsprechen. ±1 einem einzelnen Bitfehler.

Schreiben Sie ein Programm, welches mit Hilfe einer geschachtelten for-Schleife das oben gegebene Feld in der folgenden Weise grafisch im Ausgabefenster darstellt:

20                          #
19                          #  #
18                          #  #
17                          #  #
16                          #  #
15                          #  #  #
14                       #  #  #  #
13                       #  #  #  #
12                       #  #  #  #
11                       #  #  #  #
10                       #  #  #  #
 9                       #  #  #  #  #
 8                    #  #  #  #  #  #
 7                    #  #  #  #  #  #
 6                 #  #  #  #  #  #  #  #
 5                 #  #  #  #  #  #  #  #
 4                 #  #  #  #  #  #  #  #
 3           #  #  #  #  #  #  #  #  #  #  #  #
 2           #  #  #  #  #  #  #  #  #  #  #  #
 1  #  #  #  #  #  #  #  #  #  #  #  #  #  #  #  #  #
   -8 -7 -6 -5 -4 -3 -2 -1  0  1  2  3  4  5  6  7  8

Bestimmen Sie die Anzahl der erforderlichen Zeilen mit Hilfe einer Maximumsuche. Geben Sie die Beschriftung [-8;8] auf der x-Achse mit Hilfe einer weiteren for-Schleife aus.