Zwischenergebnisse mit einer Schleifeninvariante erklären
Verständlich erklärt
Ein vollständiger Durchlauf verarbeitet jedes Element genau einmal. Für eine Summe startet der Akkumulator bei 0; nach jedem Schritt enthält er die Summe der bereits verarbeiteten Elemente. Diese Aussage ist eine Schleifeninvariante: Sie bleibt an der festgelegten Stelle jedes Schleifendurchlaufs wahr. Ein Zähler beginnt ebenfalls bei 0 und wird nur erhöht, wenn eine Bedingung zutrifft.
Für das Minimum einer nichtleeren Folge eignet sich das erste Element als Startwert; eine künstliche 0 scheitert zum Beispiel bei ausschließlich positiven Werten. Beim Maximum scheitert ein Startwert 0 bei ausschließlich negativen Werten. Für eine leere Liste verlangen unsere Extremwert- und Mittelwertaufgaben None: Es gibt dort keinen solchen Zahlenwert. Der Mittelwert ist Summe geteilt durch Anzahl, also nur bei positiver Anzahl definiert.
Ein Filter legt eine neue Ergebnisliste an und übernimmt passende Werte mit append in ursprünglicher Reihenfolge, einschließlich Wiederholungen. x % 2 == 0 erkennt gerade ganze Zahlen, auch 0 und negative gerade Zahlen. return beendet die gesamte Funktion, nicht nur einen Schleifendurchlauf; gib das Endergebnis erst nach dem vollständigen Durchlauf zurück.
Durchlauf
Akkumulator
Zähler
Extremwert
Filter
Schleifeninvariante
Beispiel
daten = [5, -2, 5]
summe = 0
for wert in daten:
summe += wert
# Akkumulator nach den Schritten: 5, 3, 8
# Mittelwert: 8 / 3
positiv = []
for wert in daten:
if wert > 0:
positiv.append(wert)
# positiv: [5, 5]; daten bleibt unverändert
Typische Fehler
Extremwerte pauschal mit 0 initialisieren
Bei leerer Folge durch 0 teilen
return innerhalb der Schleife zu früh ausführen
Beim Filtern Duplikate oder die ursprüngliche Reihenfolge verlieren
Kurz zusammengefasst
Startwert, Aktualisierung und Rückgabe gehören zusammen. Eine klare Invariante erklärt, warum das Ergebnis auch für Randfälle stimmt.
Abi-Bezug
Führe eine Wertetabelle für Akkumulator und Index. Begründe die Initialisierung und benenne die vereinbarte Behandlung leerer Eingaben.
Jetzt selbst ausprobieren
Prüfe deine Lösung automatisch. Bei Bedarf helfen dir ein Tipp und anschließend die Musterlösung.
BPE 7J21 Punkteleicht
Eine Summe protokollieren
Noch nicht begonnen
Aufgabenstellung
Ein Akkumulator startet bei s = 0. Die Werte [3, -2, 5] werden von links nach rechts jeweils mit s += wert addiert. Welche Zahl enthält s am Ende? Antworte nur mit der Zahl.
Ausgabe bzw. Vorschau
Noch nicht ausgeführt.
2 Tipps anzeigen
Starte mit 0 und addiere wirklich jedes Element einmal.
Nach 3 und −2 steht der Akkumulator bei 1; danach kommt noch 5.
Lösung anzeigen
Die Zwischenstände sind 3, 1 und 6. Das negative Element verringert die Summe, wird aber nicht übersprungen.
BPE 7J21 Punkteleicht
Maximum ohne künstliche Null
Noch nicht begonnen
Aufgabenstellung
Für a = [-4, -1, -7] startet maximum = a[0]. Für jeden weiteren Wert wird nur bei wert > maximum ersetzt. Welches Maximum wird zurückgegeben? Antworte nur mit der Zahl.
Ausgabe bzw. Vorschau
Noch nicht ausgeführt.
2 Tipps anzeigen
Bei negativen Zahlen ist die näher an 0 liegende Zahl größer.
0 kommt in dieser Liste nicht vor und darf nicht als angeblich gefundenes Maximum gelten.
Lösung anzeigen
Der Startwert ist −4. −1 ist größer und ersetzt ihn; −7 ist kleiner und ändert nichts. Ergebnis: −1.
BPE 7J22 Punktemittel
Eine Summe mit Akkumulator bilden
Noch nicht begonnen
Aufgabenstellung
Implementiere summe(a) für eine Liste ganzer Zahlen mit einem Durchlauf und Akkumulator. Für [] gilt Ergebnis 0. Die Eingabe bleibt unverändert.
Ausgabe bzw. Vorschau
Noch nicht ausgeführt.
2 Tipps anzeigen
0 ist der passende Startwert, weil die Addition damit noch keinen Wert beiträgt.
return gehört hinter die Schleife; sonst werden spätere Elemente nicht mehr addiert.
Lösung anzeigen
def summe(a):
gesamt = 0
for wert in a:
gesamt += wert
return gesamt
BPE 7J22 Punktemittel
Werte oberhalb einer Grenze zählen
Noch nicht begonnen
Aufgabenstellung
anzahl_groesser(a, grenze) zählt die Werte, die streng größer als grenze sind. Gleiche Werte zählen nicht. Jede passende Position zählt, auch bei Wiederholungen. Eingabe unverändert lassen.
Ausgabe bzw. Vorschau
Noch nicht ausgeführt.
2 Tipps anzeigen
Der Zähler steigt um 1, nicht um den Wert selbst.
Die Grenze ist ausgeschlossen: Verwende >, nicht >=.
Lösung anzeigen
def anzahl_groesser(a, grenze):
anzahl = 0
for wert in a:
if wert > grenze:
anzahl += 1
return anzahl
BPE 7J22 Punktemittel
Ein Minimum mit definiertem Leerfall
Noch nicht begonnen
Aufgabenstellung
minimum(a) liefert den kleinsten Zahlenwert, bei leerer Liste None. Initialisiere bei nichtleerer Eingabe mit einem vorhandenen Wert und durchlaufe die Liste. Eingabe nicht verändern.
Ausgabe bzw. Vorschau
Noch nicht ausgeführt.
2 Tipps anzeigen
Prüfe den Leerfall, bevor du a[0] liest.
Ein Startwert 0 wäre bei [8, 3, 6] falsch, weil 0 gar nicht vorkommt.
Lösung anzeigen
def minimum(a):
if len(a) == 0:
return None
kleinster = a[0]
for wert in a:
if wert < kleinster:
kleinster = wert
return kleinster
BPE 7J22 Punktemittel
Einen Mittelwert berechnen
Noch nicht begonnen
Aufgabenstellung
mittelwert(a) liefert die Summe der Zahlen geteilt durch ihre Anzahl. Bei [] liefere None. Verwende normale Division /, keine Ganzzahldivision. Die Eingabe bleibt unverändert.
Ausgabe bzw. Vorschau
Noch nicht ausgeführt.
2 Tipps anzeigen
Für eine leere Liste ist die Anzahl 0; beende diesen Fall vor der Division.
Berechne erst die vollständige Summe und teile dann durch len(a).
Lösung anzeigen
def mittelwert(a):
if len(a) == 0:
return None
gesamt = 0
for wert in a:
gesamt += wert
return gesamt / len(a)
BPE 7J23 Punkteanspruchsvoll
Gerade Werte in Reihenfolge übernehmen
Noch nicht begonnen
Aufgabenstellung
filter_gerade(a) liefert eine neue Liste aller geraden ganzen Zahlen aus a. Behalte Reihenfolge und Wiederholungen. Auch 0 und negative gerade Zahlen gehören dazu. Eingabe nicht verändern.
Ausgabe bzw. Vorschau
Noch nicht ausgeführt.
2 Tipps anzeigen
Die Bedingung wert % 2 == 0 erkennt auch 0 und negative gerade Zahlen.
Hänge Treffer beim Durchlauf direkt an; Sortieren oder eine Menge würden die geforderte Folge verändern.
Lösung anzeigen
def filter_gerade(a):
ergebnis = []
for wert in a:
if wert % 2 == 0:
ergebnis.append(wert)
return ergebnis
BPE 7J23 Punkteanspruchsvoll
Was eine Summeninvariante aussagt
Noch nicht begonnen
Aufgabenstellung
Eine Schleife hat die ersten k Elemente einer Zahlenliste addiert; der Akkumulator begann bei 0. Welche Aussagen gelten direkt nach diesen k Schritten? Wähle alle richtigen Antworten.
Ausgabe bzw. Vorschau
Noch nicht ausgeführt.
2 Tipps anzeigen
Eine Invariante beschreibt den erreichten Zwischenstand, nicht vorzeitig das fertige Ergebnis.
Teste die Behauptung „immer größer“ mit einem negativen nächsten Element.
Lösung anzeigen
Der Akkumulator beschreibt genau den verarbeiteten Präfix. Für k = 0 ist dieser leer; bei negativen Elementen kann die Summe sinken.