Array-Schreibtischtest
Informatik · Gymnasium · Klassen 10–13 · PRIMM-Methode
🎯 Worum geht's? Klasse 10–13 · 1 Unterrichtsstunde
Nach dieser Seite kannst du …
- Schleifen über Arrays Schritt für Schritt verfolgen
- Inhalte und Indizes eines Arrays nach jedem Schritt angeben
- typische Fehler wie einen falschen Index erkennen
Vorwissen: Variablen, Schleifen
📝 Aufgaben
Jede Aufgabe hat fünf Schritte: Predict › Run › Investigate › Modify › Make. Wähle eine Aufgabe aus – oder nutze oben die Leiste „Aufgaben: 1, 2, 3 …“.
📖 Die PRIMM-Methode
Jede Aufgabe durchläuft fünf Phasen:
P – Predict
Vorhersage: Was macht der Code?
R – Run
Trace-Tabellen & Arrays befüllen.
I – Investigate
Gezielte Verständnisfragen.
M – Modify
Code für neues Ziel anpassen.
M – Make
Eigene Methode implementieren.
🏅 Zuletzt verdiente Badges
Analysiere die folgende Methode, ohne sie auszuführen.
Aufruf: berechne(new int[]{4, 7, 2, 9})
Verfolge jeden Schleifendurchlauf. Eingabe: {4, 7, 2, 9}
| Schritt | i | a[i] | x (danach) |
|---|---|---|---|
| Start | – | – | |
| i = 0 | 0 | 4 | |
| i = 1 | 1 | 7 | |
| i = 2 | 2 | 2 | |
| i = 3 | 3 | 9 | |
| Rückgabewert | |||
x ein: alter Wert plus a[i].Was passiert
bei einem leeren Array new int[]{}?
Wie viele Iterationen führt die Schleife für ein Array der Länge n aus?
Ändere die Methode so, dass sie das Produkt aller Elemente berechnet. Für
{4, 7, 2, 9} soll 504 zurückkommen.
Schreibe eine Methode verarbeite, die
das Maximum eines Arrays zurückgibt. Für
{4, 7, 2, 9, 1} soll 9 zurückkommen.
Aufruf: transformiere(new int[]{1, 2, 3, 4, 5})
Eingabe a[]:
Ergebnis b[]:
Welcher Index von b wird bei i = 2 beschrieben?
a.length - 1 - i: Wohin wandert a[0], wohin a[1]?Verändert
transformiere das ursprüngliche Array a?
Was berechnet a.length − 1 − i für a.length=5, i=4?
Passe die Methode so an, dass sie nur Elemente an
geraden Indizes (0, 2, 4, …) zurückgibt. Für
{10, 20, 30, 40, 50} → {10, 30, 50}
b.Implementiere kombiniere: Verbindet
zwei Arrays zu einem. {1,2,3} + {4,5} → {1,2,3,4,5}
a.length + b.length. Zwei Schleifen: erst a kopieren, dann b – ab welchem Index beginnt b?Aufruf: auswerten(new int[]{3, 1, 2, 3, 1, 3, 2})
z[3]?Eingabe: {3, 1, 2, 3, 1, 3, 2} — trage
z[] nach der Schleife ein:
Was passiert,
wenn ein Wert > 5 im Array ist, z. B. werte = {6}?
Warum hat z die Größe 6 statt 5?
Ergänze findeHaeufigsten: Gibt den
häufigsten Wert zurück. Für {3,1,2,3,1,3,2} → 3
i, zu dem er gehört.Implementiere zaehleVorkommen: Wie oft
kommt x in a vor?
x.Aufruf: durchlauf(new int[]{5, 3, 8, 1, 4})
| i | Vergleich | Tausch? | [0] | [1] | [2] | [3] | [4] |
|---|---|---|---|---|---|---|---|
| Start | – | – | 5 | 3 | 8 | 1 | 4 |
| 0 | 5>3? | Ja | |||||
| 1 | 5>8? | Nein | |||||
| 2 | 8>1? | Ja | |||||
| 3 | 8>4? | Ja |
a[i] und a[i+1] und tausche, wenn der linke größer ist. Arbeite mit dem schon veränderten Array weiter.Warum endet die
Schleife bei i < a.length − 1?
Was garantiert ein einzelner Durchlauf?
Ändere die Bedingung so, dass
durchlauf absteigend sortiert.
Implementiere den vollständigen Bubble Sort.
a.length−1 Mal; innere Schleife wie
in durchlauf.Aufruf: markiere(20)
Trage true/false ein
(oder t/f):
Warum beginnt
die äußere Schleife bei p = 2?
Warum startet die innere Schleife bei k = p * p?
Ergänze sammlePrimzahlen: Alle
Primzahlen bis n in einem Array zurückgeben.
m: Beim ersten Mal zählen, beim zweiten Mal jede Zahl i mit m[i] == true ins Ergebnis schreiben – mit eigenem Zähler für die Position.Implementiere pruefeZahl:
Probedivision, kein Sieb.
Aufruf: bearbeite(new int[]{1, 2, 3, 4, 5, 6})
l, r: Werte nach l++/r--
| Tausch | l | r | [0] | [1] | [2] | [3] | [4] | [5] |
|---|---|---|---|---|---|---|---|---|
| Start | 0 | 5 | 1 | 2 | 3 | 4 | 5 | 6 |
| 1. | ||||||||
| 2. | ||||||||
| 3. |
l eins nach rechts, r eins nach links. Die Schleife endet, wenn sie sich treffen.Warum
while (l < r) und nicht while (l <= r)?
Wie viele Tauschoperationen für ein Array der Länge n?
Ergänze eine Bedingung: nur tauschen, wenn a[l] < 4.
Implementiere pruefeSymmetrie:
{1,2,3,2,1}→true, {1,2,3}→false
false.Aufruf: gleite(new int[]{1, 3, 5, 2, 4}, 3)
erg[0]?| i | Fenster | erg[i] |
|---|---|---|
| 0 | 1+3+5 | |
| 1 | 3+5+2 | |
| 2 | 5+2+4 |
Welche Länge
hat erg für Länge 5 und k=3?
Wie nennt man diese Technik?
Passe gleite an: statt Summe das
Maximum jedes Fensters.
s nicht mit 0, sondern mit dem ersten Wert des Fensters – und ersetze die Addition durch einen Vergleich.Implementiere findePosition: Index des
Maximums (kleinster Index bei Gleichstand). {3,7,7,2}→1
> (statt >=) bleibt bei Gleichstand der kleinere Index.Aufruf: suche(new int[]{1, 4, 6, 8, 11}, 10)
| Schritt | l | r | a[l] | a[r] | s | Aktion |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | ||||||
| 3 | ||||||
| 4 |
Aktion: l++,
r-- oder true
l++), ist sie zu groß, kleiner (r--). Das klappt, weil das Array sortiert ist.Warum funktioniert der Algorithmus nur bei sortierten Arrays?
Wie viele Vergleiche im schlechtesten Fall?
Ändere suche: gibt den Index des linken Partners zurück (oder −1).
true/false soll eine Zahl zurückkommen. Was ändert sich am Rückgabetyp und an den beiden return-Zeilen?Implementiere binaerSuche: Index von
ziel im sortierten Array, oder −1.
l und r fest und schau in die Mitte. Ist der Wert dort zu klein, suchst du rechts weiter, sonst links. Wann ist nichts mehr übrig?
Aufruf: insertionSort(new int[]{5, 2, 8, 1, 3})
Trage den Zustand des Arrays nach jedem Außenschleifendurchlauf ein. Eingabe: {5, 2, 8, 1, 3}
| i | a[0] | a[1] | a[2] | a[3] | a[4] |
|---|---|---|---|---|---|
| Start | 5 | 2 | 8 | 1 | 3 |
| 1 | |||||
| 2 | |||||
| 3 | |||||
| 4 |
a[i] als key gemerkt; größere Elemente links davon rücken eine Stelle nach rechts, dann kommt key in die Lücke.Wie viele Vergleiche führt Insertion Sort im besten Fall (bereits sortiertes Array) durch?
Was ist der wesentliche Unterschied zwischen Insertion Sort und Bubble Sort?
Ändere Insertion Sort so, dass er absteigend sortiert (größtes Element zuerst).
Schreibe eine Methode selectionSort, die ein Array durch Selection Sort aufsteigend sortiert: finde in jedem Durchlauf das Minimum des unsortierten Rests und tausche es an die richtige Stelle.
i, die gefüllt wird. Innere Schleife: den Index des kleinsten Elements im Rest suchen. Danach a[i] mit diesem Element tauschen.
Aufruf: merge(new int[]{1,3,5}, new int[]{2,4,6})
Verfolge jeden Schritt der while-Schleife. Eingabe: a={1,3,5}, b={2,4,6}
| Schritt | i | j | Verglichen | Kleineres → c |
|---|---|---|---|---|
| 1 | a[0]=1 vs b[0]=2 | |||
| 2 | a[1]=3 vs b[0]=2 | |||
| 3 | a[1]=3 vs b[1]=4 | |||
| 4 | a[2]=5 vs b[1]=4 | |||
| 5 | a[2]=5 vs b[2]=6 | |||
| 6 | 3 | b[2]=6 (Rest) |
a[i] mit b[j]; das kleinere kommt nach c, und nur sein Zeiger rückt weiter. Ist ein Array aufgebraucht, wird der Rest des anderen übernommen.Welche Voraussetzung müssen a und b erfüllen, damit merge korrekt funktioniert?
Welche Zeitkomplexität hat merge für zwei Arrays der Länge m und n?
Ändere merge so, dass Duplikate aus dem Ergebnis-Array entfernt werden: tritt ein Wert in a und b auf, soll er nur einmal ins Ergebnis.
a[i] == b[j] getrennt: Wert einmal übernehmen und beide Zeiger weiterrücken. Am Ende ist c zu lang – Arrays.copyOf(c, k) kürzt es.
Implementiere mergeSort: teile das Array rekursiv in zwei Hälften, sortiere sie einzeln und führe sie mit merge zusammen. Für {5, 2, 8, 1, 3} soll {1, 2, 3, 5, 8} zurückkommen.
Arrays.copyOfRange), beide Hälften rekursiv sortieren und mit merge zusammenführen.🏅 Deine Badges
Verdiente Badges leuchten auf – noch nicht erreichte zeigen dir, was als nächstes wartet.
📊 Statistik
↺ Fortschritt zurücksetzen
Achtung: Alle gespeicherten Ergebnisse werden unwiderruflich gelöscht.
📄 Arbeitsblatt erstellen
Wähle aus, welche Bereiche auf das Arbeitsblatt kommen. Es enthält dann alle … Aufgaben dieser Seite aus diesen Bereichen – mit Kästchen zum Ankreuzen, leeren Tabellen und Platz zum Schreiben, ohne Lösungen und Tipps.