arrays:start
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
arrays:start [2022/12/06 10:33] – angelegt Martin Pabst | arrays:start [2025/03/23 19:22] (aktuell) – [Aufgabe 7] Martin Pabst | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ====== Arrays ====== | + | ====== Arrays |
- | Die Materialien zum Thema Arrays | + | {{ youtube> |
+ | \\ | ||
+ | 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: | ||
+ | <code myJava> | ||
+ | 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, ...): | ||
+ | <code myJava> | ||
+ | println(p1 + ", " + p2 + ", " + p3 + ", " + p4 + ", " + ... + p1000); | ||
+ | </ | ||
+ | **Kein Mensch möchte das tippen müssen. Das muss doch besser gehen!** | ||
+ | <WRAP center round info 80%> | ||
+ | Ein **Array** (deutsch: **" | ||
+ | **Beispiel: | ||
+ | Lege ein Feld an, in dem 10 '' | ||
+ | <code myJava> | ||
+ | int[] test = new int[10]; | ||
+ | </ | ||
+ | Dabei ist '' | ||
+ | Die zehn Werte nennt man **Feldelemente**. Sie werden **mit den Indizes 0 bis 9** durchnummeriert. Du kannst Dir das Feld so vorstellen: \\ | ||
+ | {{ : | ||
+ | **Zugriff auf die Feldelemente: | ||
+ | * '' | ||
+ | {{ : | ||
+ | * '' | ||
+ | </ | ||
+ | |||
+ | ===== Beispiel 0: Größte Zahl finden ===== | ||
+ | Schreibe ein Programm, das ein Int-Array mit 100 einträgen deklariert reserviert, dann die 100 Einträge mit Zufallszahlen von 1 bis 1000 füllt, anschließend die größte dieser 1000 Zahlen ermittelt und diese ausgibt. | ||
+ | |||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | int[] zahlen = new int[100]; | ||
+ | |||
+ | for (int i = 0; i < 100; i++) { | ||
+ | | ||
+ | | ||
+ | } | ||
+ | |||
+ | int groesste = zahlen[0]; | ||
+ | |||
+ | for (int i = 0; i < 100; i++) { | ||
+ | | ||
+ | groesste = zahlen[i]; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | println(" | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Beispiel 1: Rätsel ===== | ||
+ | Was gibt das folgende Programm aus? **Denke zuerst nach, bevor Du es ausführst!** | ||
+ | |||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | int[] zahlen = new int[4]; | ||
+ | |||
+ | zahlen[1] = 12; | ||
+ | zahlen[2] = 8; | ||
+ | zahlen[0] = zahlen[2] * 3; | ||
+ | zahlen[3] = zahlen[1] + zahlen[0]; | ||
+ | |||
+ | for(int i = 0; i < 4; i++) { | ||
+ | | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | {{ : | ||
+ | Öffne vor dem Ausführen den Reiter " | ||
+ | |||
+ | |||
+ | ===== 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 | ||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | String[] namen = new String[5]; | ||
+ | |||
+ | for(int i = 0; i < 5; i++) { | ||
+ | | ||
+ | } | ||
+ | |||
+ | while(true) { | ||
+ | int index = Input.readInt(" | ||
+ | | ||
+ | } | ||
+ | </script> | ||
+ | |||
+ | </div> | ||
+ | |||
+ | </ | ||
+ | |||
+ | ===== Beispiel 3: Größter Wert (Fingerübung) ===== | ||
+ | * a) Deklariere ein Feld mit dem Bezeichner '' | ||
+ | * b) Ergänze Dein Programm so, dass es anschließend den größten der 10 Werte findet und ausgibt! | ||
+ | |||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | double[] werte = new double[10]; | ||
+ | |||
+ | for(int i = 0; i < 10; i++) { | ||
+ | | ||
+ | | ||
+ | } | ||
+ | |||
+ | double maximum = werte[0]; | ||
+ | for(int i = 1; i < 10; i++) { | ||
+ | | ||
+ | maximum = werte[i]; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | println(" | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Beispiel 4: Absolute und relative Häufigkeiten beim Würfeln ===== | ||
+ | Der Benutzer nennt eine Anzahl '' | ||
+ | <WRAP center round tip 60%> | ||
+ | **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" | ||
+ | </ | ||
+ | |||
+ | **Strategie: | ||
+ | Wir speichern die Anzahl der Einsen, Zweien, Dreien, ... Sechsen in einem int-Feld mit 6 Werten | ||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | int n = Input.readInt(" | ||
+ | int[] zähler = new int[6]; | ||
+ | |||
+ | for(int i = 0; i < n; i++) { | ||
+ | int zahl = Math.floor(Math.random() * 6 + 1); // zufällige Zahl aus {1; 2; ...; 6} | ||
+ | | ||
+ | | ||
+ | } | ||
+ | |||
+ | println(" | ||
+ | for(int i = 0; i < 6; i++) { | ||
+ | | ||
+ | | ||
+ | } | ||
+ | |||
+ | println(" | ||
+ | for(int i = 0; i < 6; i++) { | ||
+ | | ||
+ | | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Beispiel 5: Selection Sort ===== | ||
+ | <WRAP center round todo 80%> | ||
+ | **Selection sort** | ||
+ | Eine gute Beschreibung dieses Algorithmus [[https:// | ||
+ | * 1. Eine Variable '' | ||
+ | * 2. Vergleiche jeden Wert rechts von '' | ||
+ | * 3. Erhöhe '' | ||
+ | |||
+ | Die ersten Schritte des Algorithmus siehst Du hier an einem Beispiel: | ||
+ | {{ :arrays: | ||
+ | {{ : | ||
+ | {{ : | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | int[] zahlen = new int[8]; | ||
+ | |||
+ | // Mit Zufallszahlen belegen | ||
+ | for (int i = 0; i < 8; i++) { | ||
+ | | ||
+ | } | ||
+ | |||
+ | // Unsortiert ausgeben | ||
+ | for (int i = 0; i < 8; i++) { | ||
+ | | ||
+ | } | ||
+ | |||
+ | // sortieren | ||
+ | // Hier bist Du dran! | ||
+ | |||
+ | for (int start = 0; start <= 6; start++) { | ||
+ | for (int i = start + 1; i <= 7; i++) { | ||
+ | if(zahlen[i] < zahlen[start]) { | ||
+ | int z = zahlen[i]; | ||
+ | | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // Sortiert ausgeben | ||
+ | println(); | ||
+ | println(" | ||
+ | |||
+ | for (int i = 0; i < 8; i++) { | ||
+ | | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | ===== 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, [[.zweierpotenzen:start|findest Du hier ein Programm, das die Zweierpotenzen auf dem Bildschirm ausgibt.]]// \\ \\ | ||
+ | |||
+ | [[.zweierpotenz: | ||
+ | |||
+ | |||
+ | ===== Aufgabe 2: Listenumkehrer ===== | ||
+ | Schreibe ein Programm, das es dem Benutzer ermöglicht, | ||
+ | [[.listenumkehrer: | ||
+ | |||
+ | ===== Aufgabe 3 (Sternchenaufgabe): | ||
+ | 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> | ||
+ | Schreibe ein Programm, das die Primzahlen bis 100 000 mit Hilfe des Sies des Eratosthenes ermittelt und ausgibt! \\ \\ | ||
+ | **Strategie: | ||
+ | * Deklariere ein Feld '' | ||
+ | * Setze '' | ||
+ | * 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: '' | ||
+ | [[.eratosthenes: | ||
+ | |||
+ | ===== 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. | ||
+ | |||
+ | <WRAP center round info 60%> | ||
+ | Zwei Primzahlen, die den Abstand 2 haben, nennt man ein **Primzahlzwilling**, | ||
+ | Man vermutet, dass es unendlich viele Primzahlzwillinge gibt, dies ist aber bis heute nicht bewiesen. | ||
+ | </ | ||
+ | [[.eratosthenes: | ||
+ | |||
+ | |||
+ | ===== 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> | ||
+ | |||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | int[] zahlen = new int[10]; | ||
+ | |||
+ | // Mit Zufallszahlen belegen | ||
+ | for(int i = 0; i < zahlen.length; | ||
+ | | ||
+ | } | ||
+ | |||
+ | for(int i = 0; i < zahlen.length; | ||
+ | | ||
+ | } | ||
+ | println(); | ||
+ | |||
+ | boolean fertig = false; | ||
+ | |||
+ | while(!fertig) { | ||
+ | | ||
+ | // Sortieren! | ||
+ | // i zeigt auf die linke zu überprüfende Zahl | ||
+ | | ||
+ | if(zahlen[i] > zahlen[i + 1]) { | ||
+ | | ||
+ | int z = zahlen[i]; | ||
+ | | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | println(); | ||
+ | for(int i = 0; i < zahlen.length; | ||
+ | | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | ===== 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, | ||
+ | * 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. | ||
+ | |||
+ | [[.aufgabe6loesungen: | ||
+ | |||
+ | |||
+ | |||
+ | ===== Aufgabe 7 ===== | ||
+ | Erweitere das Programm zum Sieb des Eratosthenes (Aufgabe 3, siehe oben) so, dass es am Ende nach Primzahlzwillingen sucht und die gefundenen Zwillinge ausgibt. | ||
+ | <WRAP center round tip 60%> | ||
+ | Sind zwei Primzahlen nur 2 voneinander entfernt, so spricht man von einem Primzahlzwilling. z.B. | ||
+ | * 3 und 5 | ||
+ | * 5 und 7 | ||
+ | * 11 und 13 | ||
+ | * 17 und 19 | ||
+ | * 29 und 31 | ||
+ | usw. | ||
+ | </ | ||
+ | |||
+ | [[.aufgabe7Loesung: | ||
+ | |||
+ | ===== Übungen vor der Kurzarbeit am 28.03.2025 ===== | ||
+ | [[.uebungenKurzarbeit: |
arrays/start.1670322789.txt.gz · Zuletzt geändert: 2022/12/06 10:33 von Martin Pabst