Hands-on Computer Science
Mein Lernen EN

Lektion30 Min.

Probleme lösen mit Computern

Welche Form ein Stück eines Problems haben muss, damit ein Computer es lösen kann: Eingabe, Verarbeitung und Ausgabe, mit klaren Grenzen, die einen Test gleich mitbringen, und das an der Lichtstrecke vom Sender bis zum Empfänger und auf jeder Ebene vom System bis zum Logikgatter.

Themen:Probleme lösenInformation verarbeiten

Was du lernst

Hier lernst du an einer Bestellung im Schnellrestaurant und an der Lichtstrecke des LiFi-Projekts, welche Form jedes Stück hat, das ein Computer lösen kann, und kannst danach:

  • ein lösbares Stück als Kasten mit Eingabe, Verarbeitung und Ausgabe beschreiben und erklären, warum eine bekannte Eingabe mit erwarteter Ausgabe schon einen Test ergibt
  • erklären, warum ein Empfänger keine Farbe, sondern vier Messwerte bekommt und erst eine Regel in der Verarbeitung festlegt, was diese Zahlen bedeuten
  • die Lichtstrecke als Kette von Kästen lesen, an jeder Grenze die nötige Absprache benennen und einen Fehler finden, indem du den Daten von Grenze zu Grenze folgst
  • einen Kasten öffnen und auf der Ebene beschreiben, auf der deine Frage eine klare Eingabe und eine erwartete Ausgabe hat, und dabei Datenfluss von hierarchischer Zerlegung unterscheiden
  • zu jedem Kasten die beiden Grundfragen nach Verarbeitung und Darstellung stellen und den Code eines KI-Agenten mit einem erwarteten Ergebnis prüfen, statt ihm zu vertrauen
In neuem Fenster Als PDF Die Folien sind auf Englisch.

Denk an das Bestellterminal in einem Schnellrestaurant. Du tippst ein paar Bilder an und bezahlst, und wenig später steht ein Tablett bereit, während die Küche dazwischen unsichtbar bleibt. Du musst sie nicht sehen, denn du weißt, was du hineingibst und was herauskommen soll, und liegt das falsche Essen auf dem Tablett, weißt du auch, dass zwischen diesen beiden Rändern etwas schiefgegangen ist. Die Grundideen des Programmierens haben diese Form am Pfandautomaten als Eingabe, Verarbeitung und Ausgabe vorgestellt. Diese Lektion setzt sie ein, denn klare Ränder erlauben dir, ein Stück eines Problems zu prüfen, Stücke miteinander zu verbinden und das Stück zu finden, das versagt.

Ein Kasten, den du prüfen kannst

Angenommen, ein kleines Stück Code namens add() soll 2 und 3 addieren. Die beiden Zahlen sind die Eingabe, die Arbeit in add() ist die Verarbeitung, und das Ergebnis ist die Ausgabe; zusammen heißt diese Form das EVA-Modell, nach den englischen Wörtern input, processing und output auch IPO. Noch bevor der Code läuft, kannst du sagen, was herauskommen soll, nämlich 5, und damit ist ein Test geschrieben: Eingabe hineingeben, Verarbeitung laufen lassen und die tatsächliche Ausgabe mit der erwarteten vergleichen.

Links die Eingabe 2, 3, in der Mitte der Kasten add(), rechts die Ausgabe 5. Über der Ausgabe steht erwartet 5, daneben ein Haken mit dem Wort passt. Darunter: Eingabe, Verarbeitung, tatsächliche Ausgabe.
Eine bekannte Eingabe und eine erwartete Ausgabe ergeben einen Test, für den du nicht in den Kasten sehen musst.

Im Code ist ein solcher Test ein einziger Vergleich:

def add(a, b):
    return a + b

print(add(2, 3) == 5)

Stünde in add() versehentlich a * b, käme 6 heraus und der Test fiele durch. Um das zu entscheiden, musst du keine einzige Zeile in add() lesen, denn die Ränder des Kastens genügen. Deshalb müssen die Stücke, in die du ein Problem zerlegst, prüfbar sein: Ein Kasten mit unscharfen Rändern ist schwer zu lösen und unmöglich zu prüfen, während ein Kasten mit einer konkreten Eingabe und einer erwarteten Ausgabe genau sagt, was fertig heißt.

Die Erwartung muss vor dem Ergebnis feststehen. Wer add(2, 3) aufruft und nur ansieht, was herauskommt, nickt fast alles ab, und wer nur prüft, dass keine Fehlermeldung erscheint, erfährt, dass der Computer den Code ausführen konnte, aber nicht, dass er richtig gerechnet hat. In der Übung hier lässt du diesen Test selbst laufen und bringst ihn zum Scheitern.

Was der Kasten wirklich bekommt

Halt eine rote Lampe vor einen Farbsensor. Deine Augen sehen Rot, der Computer nicht. Ein gängiger Farbsensor hat vier Messkanäle, einen, der vor allem auf rotes Licht anspricht, einen für Grün, einen für Blau und einen für die Gesamthelligkeit, und für eine einzelne Messung liefert er vielleicht 203, 41, 57 und 310. Diese vier Zahlen sind alles, was das Programm bekommt.

Links die vier Messwerte r = 203, g = 41, b = 57 und c = 310, in der Mitte der Kasten classify(), rechts die Ausgabe "red". Darunter: vier Messwerte, eine Entscheidungsregel.
Der Empfänger bekommt nicht das Wort Rot, sondern vier Zahlen, und eine Regel im Programm macht daraus eine Entscheidung.

Die Eingabe des Kastens sind also vier Zahlen und keine Farbe, während das Wort red seine Ausgabe ist. Dazwischen liegt eine Regel, die entscheidet, zum Beispiel: Ist das Licht zu schwach, gilt die Lampe als aus, und sonst gewinnt der stärkste der drei Farbkanäle. Mit dem Rot, das du siehst, kann ein Computer nicht arbeiten, weil er eine Darstellung braucht, die er verarbeiten kann, und auch die Zahlen tragen die Entscheidung nicht von selbst, denn die Regel kommt aus dem Programm. In Python sieht diese Regel so aus:

def classify(r, g, b, c):
    if c < 100:
        return "off"
    strongest = max(r, g, b)
    if strongest == r:
        return "red"
    if strongest == g:
        return "green"
    return "blue"

Eine Regel kann zu vielen Messungen passen und an einer einzigen scheitern. Steht die rote Lampe weiter vom Sensor entfernt, misst er vielleicht 60, 14, 19 und 95; die Helligkeit liegt dann unter der Schwelle von 100, und die Regel erklärt die Lampe für aus. Keine Zeile ist kaputt, aber Regel und Wirklichkeit passen nicht zusammen, und erst ein Test mit dieser Messung und der erwarteten Ausgabe red deckt das auf. Senkst du die Schwelle, besteht der Test, obwohl sich kein Messwert geändert hat, denn Eingabe und Regel entscheiden gemeinsam, was herauskommt.

Kästen in einer Reihe

Die meisten Systeme sind Ketten solcher Kästen, in denen die Ausgabe des einen zur Eingabe des nächsten wird. Eine Strecke, die Text mit Licht überträgt, wie im Projekt Das LiFi-Projekt, ist eine solche Kette: Der Sender macht mit encode() aus dem Text "hi" eine Folge von Farben, das Licht trägt die Farben hinüber, und der Empfänger macht mit decode() wieder "hi" daraus.

Eine Kette von links nach rechts: der Text "hi", der Kasten encode() mit der Beschriftung Sender, fünf farbige Punkte mit der Beschriftung Licht, der Kasten decode() mit der Beschriftung Empfänger und wieder der Text "hi". Die vier Pfeile zwischen den Gliedern sind gelb hervorgehoben.
Die Ausgabe des einen Kastens ist die Eingabe des nächsten, und an jeder markierten Grenze brauchen beide Seiten dieselbe Vereinbarung.

Kästen passen nur zusammen, wenn ihre Ränder übereinstimmen. Verwendet der Sender Blau für den Buchstaben a, liest der Empfänger Blau aber als b, können beide Kästen genau so arbeiten, wie sie geschrieben sind, und das ganze System versagt trotzdem; jede Grenze braucht deshalb eine Vereinbarung über Form und Bedeutung der Daten.

Die Kette sagt dir auch, wie du suchst, wenn etwas schiefgeht. Kommt am Ende nicht "hi" an, hilft es wenig, auf das ganze System zu starren, und es ist besser, den Daten zu folgen und eine Grenze nach der anderen zu prüfen: ob encode() die richtigen Farben erzeugt hat, ob die Lampe sie gezeigt hat, ob der Sensor plausible Zahlen geliefert hat und ob decode() aus diesen Zahlen den richtigen Text gemacht hat. Die erste Grenze, an der die Daten falsch sind, sagt dir, welchen Kasten du öffnen musst.

Kästen in Kästen

Von außen kann der ganze Sender ein einziger Kasten sein: Eine Nachricht geht hinein, Licht kommt heraus, und send() ist der Name für die gesamte Verarbeitung darin. Hat dieser Kasten die richtige Größe für deine Frage, hörst du dort auf. Schlägt ein Test fehl und du musst wissen, warum, öffnest du den Kasten und findest eine Kette kleinerer: einen, der den Text kodiert, einen, der die nächste Farbe wählt, und einen, der die Lampe schaltet, jeder mit eigener Eingabe, Verarbeitung, Ausgabe und eigenem Test, und jeden davon kannst du wieder öffnen.

Drei Zeilen untereinander, jede mit Eingabe, Kasten und Ausgabe. System: Nachricht, Sender, Licht. Funktion: Text, encode(), Symbole. Gatter: 1, 1, AND, 1.
Dieselbe Form auf drei Ebenen: ein System, eine Funktion und ein einzelnes Logikgatter.

Die Form übersteht jede Ebene. Ein ganzes System, eine einzelne Funktion und ein einzelnes Logikgatter, das zwei Bits nimmt und eines zurückgibt, haben alle eine Eingabe, eine feste Verarbeitung und eine Ausgabe; ihre Größe ändert sich, ihre Form bleibt dieselbe.

Zwei Arten von Beziehung zwischen Kästen solltest du auseinanderhalten. Kästen in einer Reihe zeigen, wohin die Daten als Nächstes gehen, was man Datenfluss nennt, während Kästen in einem Kasten zeigen, welche kleinere Arbeit darin geschieht, was eine Hierarchie ergibt, die Zerlegung eines Kastens in seine Teile.

Links zwei Kästen a und b nebeneinander, verbunden durch einen Pfeil, darüber Kästen in einer Reihe und die Frage, wohin die Daten als Nächstes gehen, darunter Datenfluss. Rechts dieselben zwei Kästen in einem größeren Kasten, darüber Kästen in Kästen und die Frage, welche kleinere Arbeit darin steckt, darunter Hierarchie.
Zwei Beziehungen zwischen Kästen, die zu verschiedenen Fragen gehören: Datenfluss und Hierarchie.

Keine Ebene passt für jede Frage. Die richtige ist die, auf der deine aktuelle Frage eine klare Eingabe und eine erwartete Ausgabe hat, und kannst du für einen Kasten keinen Test schreiben, sind seine Ränder noch unscharf oder der Kasten ist noch zu groß.

Zwei Fragen in jedem Kasten

Sind die Ränder klar, hinterlässt jeder Kasten zwei Fragen. Die erste fragt, wie der Kasten seine Arbeit verrichtet, und ihre Antwort ist ein Programm, ein Algorithmus, der so aufgeschrieben ist, dass ein Computer ihn ausführen kann; dieser Frage folgt Algorithmen und Programme. Die zweite fragt, wie das, was die Ränder überquert, aufgeschrieben ist, damit eine Maschine damit arbeiten kann. Der Sensor hat sichtbares Licht in vier Zahlen verwandelt, und andere Antworten machen aus Zahlen, Buchstaben, Bildern und Dateien Bits, wie Stellenwertsysteme zeigt.

Der Kasten Verarbeitung zwischen Eingabe und Ausgabe. Ein Pfeil nach oben führt zur Frage, wie der Kasten arbeitet, mit der Antwort ein Programm. Pfeile nach unten führen von Eingabe und Ausgabe zur Frage, wie aufgeschrieben ist, womit eine Maschine arbeiten kann, mit der Antwort Darstellung.
Jeder Kasten stellt zwei Fragen: die nach seiner Verarbeitung, die ein Programm beantwortet, und die nach der Darstellung dessen, was hinein- und herausgeht.

Auch ein schwarzer Kasten braucht einen Test

Ein KI-Agent passt in dasselbe Bild, denn du gibst ihm eine Aufgabe und bekommst Code. Was darin geschieht, ist viel schwerer einzusehen als bei add(), und umso wichtiger sind klare Ränder: Gib ihm ein konkretes Beispiel als Eingabe, schreib das Ergebnis auf, das du erwartest, und lass dann den Code laufen, den du bekommen hast, und vergleiche.

Deine Aufgabe geht in einen gestrichelten Kasten KI-Agent, heraus kommt Code. Darunter ein klares Beispiel unter der Aufgabe, ein erwartetes Ergebnis unter dem Code und in der Mitte ein Haken mit ausführen und vergleichen.
Auch einem Kasten, in den du nicht hineinsehen kannst, musst du nicht vertrauen, wenn du ein Beispiel und ein erwartetes Ergebnis mitbringst.

Mit einem Test musst du einem Kasten, in den du nicht hineinsehen kannst, nicht vertrauen. Im Restaurant ist es genauso, denn du musstest die Küche nicht sehen, um dein Tablett zu prüfen, aber sobald das Tablett falsch ist, reicht der große Kasten nicht mehr, und du verfolgst die Bestellung von Station zu Station.

Zum Mitnehmen

  • Jedes Stück eines Problems, das ein Computer lösen kann, hat eine Eingabe, eine Verarbeitung und eine Ausgabe.
  • Eine bekannte Eingabe mit einer erwarteten Ausgabe ist ein Test, der ohne Blick in den Kasten auskommt; die Erwartung steht vor dem Ergebnis.
  • Ein Computer bekommt nie, was du siehst, sondern eine Darstellung, etwa vier Messwerte, und das Programm liefert die Regel, die daraus eine Entscheidung macht.
  • Kästen in einer Reihe zeigen den Datenfluss und brauchen an jeder Grenze eine Vereinbarung; Kästen in einem Kasten zeigen die Hierarchie, und die richtige Ebene ist die, die du prüfen kannst.
  • Jeder Kasten stellt zwei Fragen: wie er arbeitet, was ein Programm beantwortet, und wie seine Eingaben und Ausgaben dargestellt sind.

Quiz: Eingabe, Verarbeitung, Ausgabe

Aus welchen drei Teilen besteht nach dem IPO-Modell jedes Teilproblem, das ein Computer lösen kann?

  • Planung, Umsetzung, Dokumentation
  • Hardware, Software, Daten
  • Eingabe, Verarbeitung, Ausgabe
  • Sender, Kanal, Empfänger

Warum bringt ein Kasten mit klarer Eingabe und klarer erwarteter Ausgabe seinen Test gleich mit?

  • Weil der Computer bei jedem Aufruf selbst meldet, ob die gelieferte Ausgabe zur Eingabe passt.
  • Weil du eine bekannte Eingabe hineingeben und das Ergebnis mit der erwarteten Ausgabe vergleichen kannst.
  • Weil man in einem klar geschnittenen Kasten beim Lesen des Codes sofort sieht, welche Zeile welchen Teil der Ausgabe erzeugt.
  • Weil die Verarbeitung im Kasten dann so überschaubar ist, dass sie kaum noch falsch sein kann.

Vor einem Farbsensor mit vier Messkanälen leuchtet eine rote Lampe. Was ist die tatsächliche Eingabe, mit der ein Empfängerprogramm arbeitet?

  • Die Farbe Rot, so wie sie auch ein Mensch sieht, der neben dem Sensor steht.
  • Das Wort "red", das der Sensor als erkannte Farbe an das Programm meldet.
  • Vier Zahlen: die Anteile von Rot, Grün und Blau und die Gesamthelligkeit.
  • Ein kleines Bild der Lampe, aus dem das Programm die Farbe an der hellsten Stelle abliest.

Eine Strecke überträgt Text mit Licht als Kette von Kästen. Welche Aussagen treffen zu? (Mehrere richtige Antworten möglich.)

"hi" → encode() → Farben → Licht → Sensor → decode() → "hi"
  • Die Ausgabe von encode() ist die Eingabe des nächsten Kastens.
  • Sender und Empfänger müssen vorher vereinbaren, welche Farbe für welchen Buchstaben steht.
  • decode() kann unabhängig davon arbeiten, was encode() macht.
  • Die Kette zeigt, in welcher Reihenfolge die Daten durch das System fließen.
  • Die Kästen lassen sich in beliebiger Reihenfolge anordnen, solange jeder vorkommt.

Betrachte diese Funktion als IPO-Kasten. Was sind ihre Eingabe und ihre Ausgabe?

def encode(text):
    colours = []
    for letter in text:
        colours.append(colour_for(letter))
    return colours
  • Die Eingabe ist ein Text, die Ausgabe eine Liste von Farben.
  • Die Eingabe ist eine Liste von Farben, die Ausgabe ein Text.
  • Die Eingabe ist Licht, die Ausgabe sind vier Sensorwerte.
  • Die Eingabe ist ein einzelner Buchstabe, die Ausgabe eine einzelne Farbe.

Du willst einen Kasten classify() prüfen, der aus vier Sensorwerten eine Farbe entscheidet. Welcher Test passt zum IPO-Modell?

  • classify() eine Stunde lang mit laufenden Messwerten arbeiten lassen und schauen, ob es ohne Absturz durchhält.
  • classify() mit zufälligen Zahlen aufrufen und prüfen, dass keine Fehlermeldung kommt.
  • Gespeicherte Messwerte, die sicher bei roter Lampe entstanden sind, hineingeben und prüfen, ob "red" herauskommt.
  • Den Quelltext von classify() Zeile für Zeile lesen und jede Bedingung im Kopf mit Beispielwerten nachvollziehen.

Aus dem IPO-Kasten ergeben sich zwei Fragen: Wie arbeitet der Kasten, und wie werden Eingabe und Ausgabe für die Maschine dargestellt? Welche davon beantwortet ein Programm?

  • Beide: Ein Programm legt auch fest, wie Farben und Zeichen dargestellt werden.
  • Die Frage der Verarbeitung: Ein Programm beschreibt, wie der Kasten arbeitet.
  • Die Frage der Darstellung: Ein Programm legt fest, wie Daten aussehen.
  • Keine von beiden: Programme sind ein eigenes, drittes Thema.

Dasselbe IPO-Modell erscheint auf mehreren Ebenen. Welche Aussagen treffen zu? (Mehrere richtige Antworten möglich.)

System:      Nachricht → Sender   → Licht
Funktion:    Text      → encode() → Farben
Logikgatter: 1, 1      → AND      → 1
  • Von außen betrachtet ist der ganze Sender ein einziger Kasten: Nachricht hinein, Licht heraus.
  • Öffnest du den Kasten, wird seine Verarbeitung zu einer Kette kleinerer Kästen mit eigenen Eingaben und Ausgaben.
  • Ein einzelnes Logikgatter ist zu klein für das IPO-Modell, weil es nichts verarbeitet, sondern nur Strom durchlässt oder sperrt.
  • Welche Ebene die richtige ist, hängt von der Frage ab, die du gerade untersuchst.

Eine Textübertragung über eine Lichtstrecke liefert am Ende falschen Text. Was ist nach dem Kastenmodell der sinnvollste nächste Schritt?

  • Die ganze Übertragung so oft wiederholen, bis der Text stimmt.
  • Den großen Kasten öffnen und einen inneren Kasten, etwa encode(), für sich mit bekannter Eingabe prüfen.
  • Den Quelltext von Sender und Empfänger nebeneinanderlegen und die Stelle suchen, an der die Vereinbarung nicht zusammenpasst.
  • Den Abstand zwischen Sender und Empfänger verändern und erneut senden.

Warum „sieht“ der Computer keine Farbe, sondern nur Zahlen?

  • Weil der Farbsensor zu billig ist; ein besserer würde Farben direkt liefern.
  • Weil eine Maschine nur mit Dingen arbeiten kann, die in einer verarbeitbaren Darstellung vorliegen, meistens als Zahlen.
  • Weil der Umweg über Zahlen eine Eigenheit der Programmiersprache ist; eine Sprache mit eingebautem Farbtyp würde die Farbe direkt sehen.
  • Weil die Lampe nie reines Rot ausstrahlt.
  • Weil er die Farbe sehr wohl erkennt, sie intern aber als Zahlen ablegt und deshalb nur so weitergeben kann.

Auch ein KI-Assistent ist ein IPO-Kasten: Deine Worte gehen hinein, Code kommt heraus, und hineinsehen kannst du nicht. Was folgt daraus?

  • Der Kasten ist fertig und muss nicht mehr geprüft werden.
  • Die Eingabe spielt kaum eine Rolle: Der Assistent liefert zu jeder Frage ähnlich guten Code, egal wie du sie stellst.
  • Du kennst die Eingabe und prüfst die Ausgabe, weil dir die Verarbeitung verschlossen ist.
  • Der Kasten arbeitet am schnellsten, also sollte möglichst viel Arbeit dorthin.

Welcher der folgenden Aufrufe ist ein Test mit eingebauter Erwartung?

def to_signal(brightness):
    if brightness > 100:
        return "on"
    return "off"
  • to_signal(150) aufrufen und prüfen, dass "on" herauskommt.
  • to_signal(150) aufrufen und sich das Ergebnis ansehen.
  • to_signal() mit vielen verschiedenen Werten aufrufen, um die Funktion gut auszulasten.
  • Prüfen, dass der Aufruf keine Fehlermeldung erzeugt.

Was gehört zur Eingabe des Kastens classify(), der aus den Messwerten eines Sensors eine Farbe entscheidet?

  • Die erkannte Farbe, zum Beispiel "red".
  • Die vier Messwerte des Sensors.
  • Der Quelltext von classify().
  • Die Farbe, wie ein Mensch sie sieht.

Mit Lösungen herunterladen: CSV Anki

Zurück

Darauf baut auf

Mehr dazu
Details
Niveau
Einstieg
Module
Digitalisierung und Programmierung
Code
2542
Stand
4. November 2026
Status
veröffentlicht

    Ein vierstelliger Code führt direkt zum Inhalt.