#separator:tab
#html:true
#tags:algorithms-and-programs-quiz
#columns:Vorderseite Rückseite
Jemand hält farbige Karten hoch, und du befolgst vier Schritte: auf die Karte schauen, entscheiden, welche Farbe sie hat, ihr Zeichen notieren, auf die nächste Karte warten. Was macht diese Anleitung zu einem Algorithmus?
- Dass sie sich auf einen Computer übertragen ließe, denn nur was ein Rechner ausführen könnte, zählt als Algorithmus.
- Dass die Schritte so genau beschrieben sind, dass man sie ausführen kann, ohne zu verstehen, wozu sie dienen.
- Dass sie aus wenigen, überschaubaren Schritten besteht, die man sich ohne Aufschreiben merken kann.
- Dass sie in einer Programmiersprache aufgeschrieben ist, denn erst eine feste Syntax macht aus einer Anleitung einen Algorithmus.
- Dass die Schritte so genau beschrieben sind, dass man sie ausführen kann, ohne zu verstehen, wozu sie dienen.
Genau die Definition: eine eindeutige Schrittfolge, bei der keine Frage offen bleibt. Wer ihr folgt, ist die Maschine.
Was einen Algorithmus ausmacht, ist die Genauigkeit seiner Schritte, nicht die Maschine und nicht die Sprache.
Worin liegt der Unterschied zwischen einem Algorithmus und einem Programm?
- Ein Programm ist die fortgeschrittene Stufe eines Algorithmus, die erst nötig wird, wenn ein Problem für die Bearbeitung von Hand zu groß ist.
- Ein Algorithmus beschreibt, wie gerechnet wird; ein Programm legt fest, wie die Daten dafür gespeichert und verwaltet werden.
- Ein Programm ist derselbe Ablauf, aber so vollständig aufgeschrieben, dass eine Maschine ihn ausführen kann.
- Es gibt keinen wesentlichen: Beide sind eindeutige Schrittfolgen, und welches Wort man benutzt, hängt vom Fachgebiet ab.
- Ein Programm ist derselbe Ablauf, aber so vollständig aufgeschrieben, dass eine Maschine ihn ausführen kann.
Genau: Ein Mensch ergänzt beim Lesen, was offensichtlich gemeint war, eine Maschine nicht, und deshalb muss ein Programm vollständig sein.
Ein Programm ist eine Liste von Anweisungen, die ein Computer genau und der Reihe nach befolgt; es darf sich also nicht darauf verlassen, dass jemand Gemeintes ergänzt.
Was siehst du an der Lampe, wenn dieses Programm läuft?
lamp.set_color(255, 0, 0)
time.sleep(1)
lamp.set_color(0, 0, 255)
- Eine Sekunde Rot, danach Blau.
- Rot und Blau gleichzeitig, also Violett.
- Nur Blau, weil die erste Zeile übersprungen wird.
- Nur Rot: Die Lampe behält die erste Farbe, die sie bekommt, bis das Programm endet.
- Eine Sekunde Rot, danach Blau.
Richtig: Zeile für Zeile, von oben nach unten. Rot, eine Sekunde warten, Blau.
Der Computer führt die Zeilen in der Reihenfolge aus, in der sie stehen, und jede ändert den Zustand, den die nächste vorfindet.
Jemand wundert sich: „Die Lampe wird nie rot, dabei steht es doch da!“ Was ist los?
lamp.set_color(255, 0, 0)
lamp.set_color(0, 0, 255)
- Die erste Zeile enthält einen Fehler, den die Maschine stillschweigend überspringt; sonst müsste Rot zu sehen sein.
- Die zweite Zeile ersetzt die erste, bevor diese läuft: Bei zwei gleichartigen Befehlen gilt nur der letzte.
- Rot leuchtet, aber nur für einen winzigen Bruchteil einer Sekunde; ohne Pause ist das für das Auge unsichtbar.
- Die Lampe reagiert träge: Bei zwei so schnell folgenden Befehlen kommt nur der letzte an, der erste geht in der Hardware verloren.
- Rot leuchtet, aber nur für einen winzigen Bruchteil einer Sekunde; ohne Pause ist das für das Auge unsichtbar.
Genau: Das Programm ist richtig und nur zu schnell. Deine Augen sind langsam, die Maschine ist es nicht, und Anweisungen kosten nur dort sichtbare Zeit, wo eine Pause es sagt.
Ein Computer wartet nur dort, wo das Programm es ihm sagt.
Welche Rolle spielt der Teil (255, 0, 0) in dieser Zeile?
lamp.set_color(255, 0, 0)
- Er sagt, welche Lampe angesprochen wird: Die drei Zahlen kennzeichnen, welche von mehreren Lampen gemeint ist.
- Er sagt, mit welchen Werten die Anweisung ausgeführt wird: voller Rotanteil, kein Grün, kein Blau.
- Er ist eine Notiz für Lesende, die den gewünschten Rotanteil erklärt; ausgeführt wird nur der Teil vor der Klammer.
- Er sagt, wie lange die Anweisung läuft: 255 Millisekunden lang, danach ist die Lampe wieder aus.
- Er sagt, mit welchen Werten die Anweisung ausgeführt wird: voller Rotanteil, kein Grün, kein Blau.
Richtig: lamp sagt, welches Ding, set_color sagt, was damit geschehen soll, und die Klammer sagt, mit welchen Werten. Andere Werte ergeben ein anderes Ergebnis.
Eine Anweisung nennt ein Ding, was damit geschehen soll und mit welchen Werten; andere Werte ändern das Ergebnis, während die Anweisung dieselbe bleibt.
Welchen Vorteil bringt die erste Zeile, bright = 255?
bright = 255
lamp.set_color(bright, 0, 0)
time.sleep(1)
lamp.set_color(bright, bright, 0)
- Das Programm läuft schneller, weil die Maschine den Wert nur einmal lesen muss statt bei jedem Aufruf neu.
- Ohne sie bliebe die Lampe dunkel, denn erst diese Zeile schaltet die Helligkeit auf den Höchstwert.
- Die Helligkeit lässt sich an genau einer Stelle ändern statt an jeder Verwendung.
- Namen sind Pflicht: Eine Anweisung wie
set_color nimmt nur benannte Werte an, keine nackten Zahlen in der Klammer.
- Die Helligkeit lässt sich an genau einer Stelle ändern statt an jeder Verwendung.
Genau: ein Wert mit einem Namen. Willst du die Lampe dimmen, änderst du eine Zeile, und beide Aufrufe von set_color ziehen mit.
Ein Wert mit einem Namen gibt dir eine Stelle zum Ändern statt vieler.
Wie lange läuft dieses Programm ungefähr, und was zeigt die Lampe?
colors = [(255, 0, 0), (0, 255, 0),
(0, 0, 255), (255, 255, 0)]
for r, g, b in colors:
lamp.set_color(r, g, b)
time.sleep(1)
- Eine Sekunde: Die Schleife zeigt alle vier Farben gleichzeitig.
- Etwa vier Sekunden: vier Durchläufe, in denen je eine Farbe eine Sekunde lang leuchtet.
- Unendlich: Eine
for-Schleife läuft, bis man sie abbricht. - Vier Sekunden, aber nur die letzte Farbe, Gelb, ist je zu sehen.
- Etwa vier Sekunden: vier Durchläufe, in denen je eine Farbe eine Sekunde lang leuchtet.
Genau: Dieselben zwei Zeilen laufen viermal, jedes Mal mit dem nächsten Wert aus der Liste, und auch Wiederholung kostet Zeit.
Eine Schleife ist eine Schreibweise: Dieselben Zeilen laufen einmal je Wert, ein Durchlauf nach dem anderen.
Wie lange läuft dieses Programm insgesamt, ungefähr?
colors = [(255, 0, 0), (255, 255, 0), (0, 0, 255)]
for r, g, b in colors:
lamp.set_color(r, g, b)
if (r, g, b) == (255, 255, 0):
time.sleep(3)
else:
time.sleep(1)
- 3 Sekunden
- 9 Sekunden
- 5 Sekunden
- 4 Sekunden
- 5 Sekunden
Genau: Rot 1, Gelb 3, Blau 1. Die Bedingung entscheidet in jedem Durchlauf, welcher Zweig mit time.sleep läuft.
Eine Bedingung wird in jedem Durchlauf neu geprüft, deshalb hängt der Ablauf vom jeweiligen Wert ab.
Aus welchen Bausteinen ist jedes Programm gebaut? Kreuz alle an, die dazugehören. (Mehrere richtige Antworten möglich.)
- Anweisungen, die nacheinander laufen.
- Werte, die einen Namen bekommen.
- Wiederholung.
- Bedingungen: Etwas geschieht nur, wenn etwas zutrifft.
- Anweisungen, die nacheinander laufen.
Richtig: die Grundlage, Zeile für Zeile von oben nach unten. - Werte, die einen Namen bekommen.
Richtig: eine Stelle zum Ändern statt vieler. - Wiederholung.
Richtig: Dieselben Zeilen laufen mehrmals, jedes Mal mit dem nächsten Wert. - Bedingungen: Etwas geschieht nur, wenn etwas zutrifft.
Richtig: Damit reagiert ein Programm, statt immer dieselben Schritte abzuspulen.
Alle vier zusammen sind das ganze Baumaterial: Abfolge, benannte Werte, Wiederholung und Bedingung.
"Dein Programm bricht mit dieser Meldung ab. Was fängst du damit an?
Traceback (most recent call last):
File ""blink.py"", line 7, in <module>
lamp.set_colour(255, 0, 0)
AttributeError: 'Lamp' object has no attribute 'set_colour'. Did you mean: 'set_color'?
- Der Rechner ist abgestürzt; nach einem Neustart läuft das Programm meist wieder, denn solche Meldungen kommen und gehen.
- Die Meldung nennt Datei, Zeile und Ursache: In Zeile 7 steht
set_colour, das es nicht gibt; gemeint war set_color. - Das Programm überfordert den Rechner; die Meldung zeigt, dass er beim Ausführen von Zeile 7 nicht mehr mitgekommen ist.
- Die Meldung ist eine Warnung, die du überlesen kannst: Das Programm läuft nach Zeile 7 weiter, und die Lampe leuchtet trotzdem.
" - Die Meldung nennt Datei, Zeile und Ursache: In Zeile 7 steht
set_colour, das es nicht gibt; gemeint war set_color.
Genau: Eine Fehlermeldung ist eine Auskunft, kein Urteil. Lies sie laut vor; meist sagt sie wörtlich, was falsch ist.
Der Computer hat ausgeführt, was dastand, und meldet genau, wo er hängen geblieben ist; die letzte Zeile der Meldung nennt die Ursache.
Wann endet dieses Programm?
while True:
lamp.set_color(255, 0, 0)
time.sleep(1)
lamp.set_color(0, 0, 255)
time.sleep(1)
- Wenn beide Farben einmal gezeigt wurden, denn dann ist der Körper der Schleife vollständig abgearbeitet.
- Nach einer Weile von selbst, wenn die Maschine merkt, dass nichts Neues passiert.
- Nie: Die Bedingung ist immer wahr, und der Körper der Schleife hat keinen Ausweg.
- Nach einer festen Zahl von Wiederholungen, denn jede Schleife hat eine eingebaute Obergrenze, damit die Maschine nicht hängen bleibt.
- Nie: Die Bedingung ist immer wahr, und der Körper der Schleife hat keinen Ausweg.
Genau: Ein Ablauf endet nur, wenn sein Ende erreichbar ist. Diese Schleife blinkt, bis jemand von außen abbricht, was bei einer Lampe, die dauernd blinken soll, sogar gewollt ist; ein Programm, das fertig werden soll, braucht eine Abbruchbedingung.
Eine Schleife endet nur, wenn ihr Ende erreichbar ist; while True ohne Ausweg läuft für immer.
Beim Zahlenraten zwischen 1 und 100 führen zwei Verfahren sicher zum Ziel: alle Zahlen einzeln abfragen (bis zu 99 Fragen) oder den Bereich halbieren (höchstens 7 Fragen). Was folgt daraus?
- Nur das Halbieren verdient den Namen Algorithmus; das einzelne Abfragen ist bloßes Ausprobieren ohne Verfahren.
- Eine Lösung kann richtig und trotzdem unbrauchbar sein; Verfahren vergleicht man nach ihrem Aufwand.
- Bei modernen Computern spielt der Unterschied keine Rolle mehr, weil beide Verfahren ohnehin in Sekundenbruchteilen fertig sind.
- Das langsame Verfahren ist sicherer, weil es jede Zahl ausdrücklich prüft, und deshalb vorzuziehen.
- Eine Lösung kann richtig und trotzdem unbrauchbar sein; Verfahren vergleicht man nach ihrem Aufwand.
Genau: Richtig zu sein ist das Mindeste, danach zählt der Aufwand, hier die Zahl der Fragen.
Entscheidend ist, wie der Aufwand mit der Größe des Problems wächst.
Sechs Personen sortieren sich nach diesen Regeln der Größe nach: auf den rechten Nachbarn schauen, tauschen, wenn man größer ist, am Ende der Reihe wieder links anfangen. Woran erkennt dieser Ablauf, dass er fertig ist?
- Nach genau einem Durchgang durch die Reihe, denn dann hat jede Person ihren Nachbarn einmal geprüft.
- Wenn die Personen sehen, dass die Reihe sortiert aussieht.
- An einem vollständigen Durchgang, in dem niemand mehr getauscht hat.
- Gar nicht von selbst: Wie bei jeder Wiederholung von vorn muss jemand von außen abbrechen, sobald die Reihe stimmt.
- An einem vollständigen Durchgang, in dem niemand mehr getauscht hat.
Genau: Das ist die eingebaute Abbruchbedingung. Keine Vertauschung im ganzen Durchgang heißt, dass nichts mehr zu sortieren ist, und ohne eine solche Bedingung liefe der Ablauf ewig weiter.
Bubblesort endet nach seiner eigenen Regel: einem Durchgang ohne Vertauschung.
Was zeigt die Lampe, wenn dieses Programm läuft?
lamp.set_color(255, 0, 0)
lamp.set_color(0, 0, 255)
time.sleep(1)
- Eine Sekunde Rot, dann Blau: Das
time.sleep(1) gehört erkennbar zur roten Phase. - Eine Sekunde Blau, dann Rot: Die Pause hält die zuletzt gesetzte Farbe fest, und die erste Zeile wird danach nachgeholt.
- Rot nur für einen Sekundenbruchteil, dann eine Sekunde Blau.
- Das Programm ist fehlerhaft und startet nicht, weil
time.sleep(1) als letzte Zeile nicht erlaubt ist.
- Rot nur für einen Sekundenbruchteil, dann eine Sekunde Blau.
Genau: Blau ersetzt Rot sofort, und erst danach wartet die Maschine, mit blauer Lampe. Dieselben drei Zeilen mit der Pause in der Mitte wären ein anderes Programm, denn die Reihenfolge gehört zum Programm.
Es fehlt keine Zeile, und trotzdem macht die Reihenfolge ein anderes Programm daraus.