====== Felder/Arrays (Jgst. 10) ======
====== Arrays (Felder) ======
{{ youtube>dqDPcF9tGtc?large }}
\\
Oft möchte man viele gleichartige Daten (d.h. Daten mit demselben Datentyp) speichern, z.B. die ersten 1000 Primzahlen. Stell Dir vor, Du müsstest für jede dieser Zahlen einen eigenen Variablennamen vergeben:
int p1 = 2;
int p2 = 3;
int p3 = 5;
...
int p1000 = ?!?
Oder stell Dir vor, Du möchtest dann diese 1000 gespeicherten Zahlen kommasepariert ausgeben (2, 3, 5, 7, ...):
println(p1 + ", " + p2 + ", " + p3 + ", " + p4 + ", " + ... + p1000);
**Kein Mensch möchte das tippen müssen. Das muss doch besser gehen!**
Ein **Array** (deutsch: **"Feld"**) ist ein Datentyp, der es gestattet, viele gleichartige Daten (d.h. **Daten mit demselben Datentyp**) zu speichern und durch Angabe eines **Indizes** (d.h. ihrer Position innerhalb des Feldes) schnell auf sie zuzugreifen. \\ \\
**Beispiel:** \\
Lege ein Feld an, in dem 10 ''int''-Werte gespeichert werden können und nenne dieses Feld ''test''.
int[] test = new int[10];
Dabei ist ''int[]'' der Datentyp "Feld von ''int''-Werten". Der Term ''new int[10]'' reserviert einen Speicherbereich, in dem 10 ''int''-Werte Platz haben, füllt ihn mit zehn 0-Werten und liefert eine Referenz darauf zurück. Nach der Zuweisung (''='') zeigt die Variable ''test'' auf diesen Speicherbereich. \\ \\
Die zehn Werte nennt man **Feldelemente**. Sie werden **mit den Indizes 0 bis 9** durchnummeriert. Du kannst Dir das Feld so vorstellen: \\
{{ :types:arrays:pasted:20210110-144140.png }} \\
**Zugriff auf die Feldelemente:**
* ''test[3] = 12;'' weist dem vierten(!) Feldelement den Wert 12 zu. Das Feld sieht danach so aus:
{{ :types:arrays:pasted:20210110-144322.png }}
* ''int a = test[0];'' kopiert den Wert des ersten Feldelements in die Variable ''a''.
===== Beispiel 1: Rätsel =====
Was gibt das folgende Programm aus? **Denke zuerst nach, bevor Du es ausführst!**
{{ :types:arrays:array_debugging.gif?direct&200|Ansicht eines Arrays beim Debuggen}}
Öffne vor dem Ausführen den Reiter "Variablen" und führe dann das Programm schrittweise aus ("Step over": {{:klassen1:anwenden:step_over.png?nolink|}}). Du kannst so Schritt für Schritt sehen, wie sich die Werte des Feldes verändern und das Programm so ganz leicht verstehen. \\ \\ Klicke rechts auf auf die kleine Grafik, dann wird Dir das Vorgehen als animated gif gezeigt!
===== Beispiel 2: Namenspeicher =====
Wir schreiben ein kleines Programm, das den Benutzer nach 5 Namen fragt und diese in einem Array speichert. Anschließend kann der Benutzer Indizes von 0 - 4 eingeben und bekommt den zugehörigen Namen vom Computer genannt. \\ \\
Natürlich ist dieses Programm noch nicht wirklich praktisch verwendbar, aber Du bekommst ein Gefühl dafür, wozu Arrays gut sind.
===== Beispiel 3: Größter Wert (Fingerübung) =====
* a) Deklariere ein Feld mit dem Bezeichner ''werte'', das 10 double-Werte enthält und fülle es mit den Werten sin(0), sin(1), …, sin(9). Verwende dazu eine while- oder for-Wiederholung.
* b) Ergänze Dein Programm so, dass es anschließend den größten der 10 Werte findet und ausgibt!
===== Beispiel 4: Absolute und relative Häufigkeiten beim Würfeln =====
Der Benutzer nennt eine Anzahl ''n''. Der Computer soll n-mal würfeln und dabei mitzählen, wie oft jede der Zahlen 1 bis 6 vorgekommen ist. Am Ende soll er die absoluten und relativen Häufigkeiten der sechs Zahlen ausgeben. \\ \\
**Was sind absolute und relative Häufigkeiten?**\\ \\
Stell' Dir vor, Du würfelst 50-mal. Dabei erhältst Du 7-mal die Augenzahl 6. Dann nennt man 7 die **absolute Häufigkeit** des Ereignisses "6 gewürfelt" und $7/50$ (also 14%) die **relative Häufigkeit** dieses Ereignisses.
**Strategie:** \\
Wir speichern die Anzahl der Einsen, Zweien, Dreien, ... Sechsen in einem int-Feld mit 6 Werten
===== Aufgabe 1: Zweierpotenzen (Fingerübung) =====
* a) Deklariere ein Feld test mit 10 int-Werten und fülle es mit den Zweiterpotenzen 1, 2, 4, 8, 16, … 512. Verwende dazu eine while- oder for-Wiederholung!
* b) Erweitere das Programm so, dass es anschließend alle Werte ausgibt.
* c) Erweitere das Programm so, dass es - wiederum anschließend - die Summe aller Feldwerte berechnet und ausgibt.
//**Tipp:** Falls Du Dich mit der Berechnung der Zweierpotenzen schwer tust, [[:einstieg:schleifen#beispiel_3zweierpotenzen|findest Du hier ein Programm, das die Zweierpotenzen auf dem Bildschirm ausgibt.]]// \\ \\
[[:types:arrays:zweierpotenz:loesung:start|Hier geht's zur Lösung!]]
===== Aufgabe 2: Listenumkehrer =====
Schreibe ein Programm, das es dem Benutzer ermöglicht, 5 Namen einzugeben, und diese 5 Namen am Ende **in umgekehrter Reihenfolge** ausgibt. \\ \\
[[:types:arrays:listenumkehrer:loesung:start|Hier geht's zur Lösung!]]
===== Aufgabe 3 (Sternchenaufgabe): Das Sieb des Eratosthenes =====
Das Sieb des Eratosthenes ist ein sehr schneller Algorithmus zum Finden von Primzahlen, den Du aus dem Mathematikunterricht der Jahrgangsstufe 5 kennst. Falls Du Dich nicht mehr genau erinnerst, hier ein kurzes Erklärvideo dazu:
{{ youtube>HDrJoLxPU40?large }}
Schreibe ein Programm, das die Primzahlen bis 100 000 mit Hilfe des Sies des Eratosthenes ermittelt und ausgibt! \\ \\
**Strategie:**
* Deklariere ein Feld ''gestrichen'' von 100 001 Werten des Datentyps ''boolean''. ''gestrichen[i]'' soll angeben, ob das Zahlenfeld mit der Zahl ''i'' "gestrichen" ist.
* Setze ''gestrichen[0] = true'' und ''gestrichen[1] = true'', denn 0 und 1 sind keine Primzahlen
* Jetzt bis Du dran! Hier noch ein paar kleine Tipps:
* Du wirst zwei ineinandergeschachtelte Wiederholungen brauchen.
* Die Wurzel von 100 000 erhältst Du so: ''Math.sqrt(100000)''
[[:types:arrays:eratosthenes:loesung|Hier geht's zur Lösung!]]
===== Aufgabe 4 Erweiterung des Sieb des Eratosthenes =====
Erweitere das Programm von Aufgabe 3 so,
* a) dass der Benutzer zu Beginn eingeben kann, bis zu welcher Obergrenze die Primzahlen gesucht werden sollen.
* b) dass es nach der Ermittlung der Primzahlen alle Primzahlzwillinge im Feld sucht und ausgibt.
Zwei Primzahlen, die den Abstand 2 haben, nennt man ein **Primzahlzwilling**, z.B. [3 und 5], [5 und 7], [11 und 13], [17 und 19] usw. \\
Man vermutet, dass es unendlich viele Primzahlzwillinge gibt, dies ist aber bis heute nicht bewiesen.
[[:types:arrays:eratosthenes:loesung2|Hier geht's zur Lösung!]]
===== Aufgabe 5: Bubble Sort =====
Ein Feld mit 10 ganzen Zahlen soll mit Zufallszahlen (von 1 bis 100) belegt und ausgegeben werden. Anschließend soll der Rechner es der Größe nach aufsteigend sortieren und erneut ausgeben. Zum Sortieren verwenden wir den Bubble Sort-Algorithmus. Hier eine kurze Erklärung:
{{ youtube>Jdtq5uKz-w4?large }}
===== Aufgabe 6 =====
Schreibe ein Programm, das ein Feld mit 10 zufälligen ganzen Zahlen von 1 bis 100 füllt und ausgibt. Danach soll folgendes gemacht werden:
* a) Das Programm soll die größte der 10 Zahlen ausgeben.
* b) Das Programm soll die Summe der 10 Zahlen ausgeben.
* c) Das Programm soll untersuchen, ob das Feld mindestens zwei gleiche Zahlen enthält und dann ausgeben "Zwei gleiche Zahlen gefunden!" oder "Das Feld enthält lauter unterschiedliche Zahlen.".
* d) Das Programm soll die Reihenfolge der Zahlen im Feld umkehren, aus dem Feld [12, 3, 44, 8, 10, 1, 90, 50, 40, 30] soll also das Feld [30, 40, 50, 90, 1, 10, 8, 44, 3, 12] werden.
[[:types:arrays:aufgabe6loesungen:start|Hier geht's zu den Lösungen!]]