Code prüfen ohne Rechner
Gemeinsamer Kern
Folgestunde · Stunde 6 · 45 Minuten · ohne Rechner
Unser Kopf übernimmt den Programmlauf
Gestern haben wir gebaut und programmiert. Heute prüfen wir fremden Code, bevor wir ihn wieder ans Board lassen. Eine Person führt nur die erreichten Zeilen aus; die andere protokolliert. Danach tauscht ihr.
Heute reicht: Programm A/B begründet vergleichen, beim Zeitfall einen verlorenen Tastendruck erklären und im Rückblick selbst einen Test begründen. Zähler und Forschungsaufträge sind Vertiefung.
Du brauchst Papier, Stift und die mitgegebenen Codekarten. Dein eigener Code aus der vorigen Stunde ist willkommen, aber keine Voraussetzung. Ein Gerät, ein Download oder Internetzugang ist für die Bearbeitung nicht nötig.
Gemeinsamer Kern
Vereinbarungen für unsere Papierprüfung
Die Codekarten zeigen Lesecode mit deutschen MicroBlocks-Blocknamen. Einrückung zeigt, welche Blöcke zu falls, sonst oder einer Schleife gehören. Eckige Klammern umschließen Bedingungen; sie sind kein zusätzlicher Block. Das ist keine Python-Datei.
| Regel | Für unseren Ablauf |
|---|---|
| Vorbereitung | Für A/B/C ist der Summer vorab an Pin 25 gebunden. Kein anderes Skript läuft. T1=18, T2=19, beide mit pull up. |
| Pin lesen | Losgelassen liefert wahr, gedrückt falsch. nicht dreht es um. |
| falls / sonst | Bedingung beim Erreichen lesen. Genau einen erreichten Zweig ausführen; sonst überspringen, wenn falls wahr war. |
| fortlaufend | Am Ende wieder zum ersten eingerückten Block zurück. |
| Ton / warte | spiele Ton … für … ms hält dieses Skript bis zum Ende des Tons auf. warte hält es ebenfalls auf. Dazwischen werden keine anderen Zeilen dieses Skripts abgefragt. |
| Zeitmodell | Nur Ton- und Warteblöcke verbrauchen hier Zeit. Andere Zeilen dauern 0 ms. Das ist ein vereinfachtes Papiermodell, keine gemessene ESP32-Laufzeit. |
| Zeitgrenze | Ein Druck von 80 bis 140 ms gilt bei 80 schon und bei 140 nicht mehr. Kein Kontaktprellen. |
| Protokoll | Zeile → gelesener Zustand → gewählter Zweig → Ausgabe → nächste Zeile. Offene Frage markieren statt ausprobieren. |
Gemeinsames Mini-Beispiel: Bei losgelassenem T1 ist der Rohwert wahr. „nicht wahr“ ist falsch: Der Ton im zugehörigen falls-Zweig wird übersprungen. Prüft dann gemeinsam, was bei gedrücktem T1 anders ist.
Gemeinsamer Kern
1 · Welcher Code erfüllt den Vorrang?
Gewünscht ist wie zuvor: nur T1 → hoch, nur T2 → tief, keine Taste → still, beide → nur tief. Verfolgt A und B für jede Zeile der Eingabekarte genau eine vollständige Runde. Notiert die erreichten Zeilennummern und die Reihenfolge der Töne. Die jeweilige Eingabe bleibt für diese ganze Runde unverändert; diese Runden werden hier einzeln betrachtet.
Wählt danach den kleinsten Test, der A und B unterscheidet. Begründet eure Entscheidung am Kontrollfluss. Verbessert A möglichst gezielt, ohne drei schon richtige Fälle zu verändern.
fortlaufendfalls [nicht (lies digitalen Pin 18 pull up)]spiele Ton 880 Hz für 120 msfalls [nicht (lies digitalen Pin 19 pull up)]spiele Ton 440 Hz für 120 mswarte 20 Millisekunden
fortlaufendfalls [nicht (lies digitalen Pin 19 pull up)]spiele Ton 440 Hz für 120 mssonstfalls [nicht (lies digitalen Pin 18 pull up)]spiele Ton 880 Hz für 120 mswarte 20 Millisekunden
| Karte | T1 | T2 | A: Tonfolge / Zeilen | B: Tonfolge / Zeilen |
|---|---|---|---|---|
| 1 | los | los | ________ | ________ |
| 2 | gedrückt | los | ________ | ________ |
| 3 | gedrückt | gedrückt | ________ | ________ |
| 4 | los | gedrückt | ________ | ________ |
Vier Ablaufspuren; unterscheidender Test; gezielte Korrektur mit Begründung:
Starthilfe · Ein Durchlauf mit dem Finger
Beginne mit Karte 1. Zeige auf jede falls-Zeile. Setze nur an erreichten Tonzeilen ein Zeichen. Beginne danach Karte 2 wieder oben. Vergleiche bei Karte 3 besonders, ob der zweite falls-Block unabhängig oder im sonst-Zweig liegt. Schließe dann die Hilfe und bearbeite Karte 4 allein.
Gemeinsamer Kern
2 · Warum bleibt die zweite Taste ungehört?
Programm C enthält beide Tasterabfragen. Trotzdem kann es eine Betätigung verpassen. Beginnt die erste Runde bei 0 ms. T1 ist von 0 bis 60 ms gedrückt, T2 von 80 bis 140 ms. Davor und danach sind die Tasten losgelassen.
Verfolgt die ersten zwei Runden mit Uhrzeiten. Wann werden Pin 18 und Pin 19 tatsächlich gelesen? Welcher Ton läuft? Erklärt dann den Unterschied, wenn T2 stattdessen von 80 bis 260 ms gehalten wird. Eine Gruppe schlägt vor, nur warte 20 auf warte 5 zu ändern: Behebt das den ursprünglichen Verlust? Belegt eure Antwort mit Zeiten.
fortlaufendfalls [nicht (lies digitalen Pin 18 pull up)]spiele Ton 880 Hz für 200 msfalls [nicht (lies digitalen Pin 19 pull up)]spiele Ton 440 Hz für 100 mswarte 20 Millisekunden
| Ereignis / Zeile | Zeitpunkt oder Zeitraum | Gelesener Wert / Ausgabe |
|---|---|---|
| Erste Prüfung Pin 18 | ________ | ________ |
| Erster Ton | ________ | ________ |
| Erste Prüfung Pin 19 | ________ | ________ |
| Beginn der zweiten Runde | ________ | ________ |
Zeitspuren für kurzen/längeren T2-Druck; Urteil zur 5-ms-Änderung; eine bessere Idee:
Starthilfe · Zeit statt Raten
Zeichne 0,60,80,140,200 und 220 ms auf eine Linie. Markiere die gedrückten Zeiträume. Bleibe mit dem Programmfinger während der 200 ms auf der Tonzeile. Erst danach gehst du zur nächsten Abfrage. Schließe die Hilfe und verfolge den längeren T2-Druck allein.
Wahlweise vertiefen
3 · Ein Druck ist mehr als ein Zustand
Der Code D zählt neue T1-Drücke und gibt den Zähler mit sage aus. T2 setzt auf 0 zurück und hat Vorrang. Jede Tabellenzeile beschreibt die beiden gelesenen Tastenwerte einer Runde; während dieser Runde bleiben sie gleich. Führt die Zeilen nacheinander aus, ohne die Variablen zurückzusetzen.
Notiert vorher1 vor der Runde, ob die Erhöhung in Codezeile 11 ausgeführt wird, zaehler am Ende und vorher1 am Ende. Erklärt besonders den Übergang von Runde 4 zu 5 der Eingabekarte. Jemand rückt Codezeile 12 in den sonst-Zweig: Konstruiert mit der Karte den entstehenden Fehler. Warum muss eine verworfene Eingabe trotzdem im Gedächtnis ankommen?
wenn gestartetsetze zaehler auf 0setze vorher1 auf falschfortlaufendsetze jetzt1 auf [nicht (lies digitalen Pin 18 pull up)]setze jetzt2 auf [nicht (lies digitalen Pin 19 pull up)]falls [jetzt2]setze zaehler auf 0sonstfalls [jetzt1 und nicht vorher1]ändere zaehler um 1setze vorher1 auf jetzt1sage zaehlerwarte 20 Millisekunden
| Runde | T1 | T2 | vorher1 vor / nach | zaehler am Ende |
|---|---|---|---|---|
| 1 | los | los | ____ / ____ | ____ |
| 2 | gedrückt | los | ____ / ____ | ____ |
| 3 | los | los | ____ / ____ | ____ |
| 4 | gedrückt | gedrückt | ____ / ____ | ____ |
| 5 | weiter gedrückt | los | ____ / ____ | ____ |
| 6 | los | los | ____ / ____ | ____ |
| 7 | gedrückt | los | ____ / ____ | ____ |
Zustandsprotokoll; Fehlerfall der eingerückten Zeile 12; Bedeutung von vorher1:
Starthilfe · Erinnerung mit Karten
Lege zwei Zettel mit den Variablennamen aus. Bei setze wird der alte Wert ersetzt. Übernimm den Endwert einer Runde als Startwert der nächsten. Zeile 12 läuft im Original auch dann, wenn T2 zurückgesetzt hat.
Wahlweise vertiefen
Forschung 1 · Eine unmögliche Zusage?
Ein Programm liest eine Taste nur bei 0,10,20 und 30 ms. Eine Person behauptet: „Mit genügend gutem Code geht zwischen den Abfragen kein noch so kurzer Druck verloren.“ Entwirf zwei verschiedene physische Eingabeverläufe, die an allen vier Abfragezeitpunkten denselben Wert liefern. Beweise damit, ob die Zusage haltbar ist.
Formuliere anschließend eine erfüllbare Zusage mit einer Annahme über die kürzeste Druckdauer und den längsten Abstand zwischen Abfragen. Erkläre, was ein nachgeschalteter Zähler daran ändern kann und was nicht. Eine Tabelle mit vier Messwerten allein ist noch kein Beweis: Verbinde Beobachtung, gespeicherten Zustand und Ausgabe.
Zwei Verläufe, gleiche Beobachtungen, begründetes Urteil und eingeschränkte Zusage:
Wahlweise vertiefen
Forschung 2 · Welche Zusagen passen zusammen?
Ein Auftrag benötigt drei Töne zu 100 ms und drei Pausen zu 100 ms, insgesamt 600 ms. Bei 0 ms startet A. Weitere neue Bestellungen kommen bei 100(B),200(C),300(D),400(E) ms. Eine läuft, höchstens drei warten. Volle Warteschlange: neuen Auftrag ablehnen. Neue Bestellungen liegen im Modell bereits als Ereignisse vor, nicht als ungeklärte Pinimpulse.
Entwirf auf Papier die Zustände und verfolge bis 1200 ms: Wer wartet, läuft, endet oder wird abgelehnt? Vergleiche mit einem zweiten Verlauf: Bei 600 ms kommt ein Stop genau beim fälligen Ende von A; Stop hat vor dem Ende Vorrang und löscht alles. Bei 700 ms kommt F. Gib die Ereignisreihenfolge ausdrücklich an.
Begründe „höchstens drei warten“ für jede deiner Übergangsregeln. Kann ein endlicher Speicher beliebig viele Bestellungen verlustfrei aufnehmen? Welche Garantie gilt nur, wenn kein Stop kommt? Übertrage deine Regeln als eingerückten Lesecode oder Zustandsdiagramm.
Zustandsregeln, beide Zeitspuren, Speicherinvariante und begrenzte Garantie:
Gemeinsamer Kern
Allein · Dein Beleg zählt
Eine Person sagt über Programm C: „Der zweite falls-Block steht in der Schleife. Also wird jeder Druck auf T2 erkannt.“ Widerlege oder bestätige die Aussage mit einer konkreten Eingabe, zwei Abfragezeitpunkten und einer erklärten Codezeile. Unterscheide dabei Papiermodell und eine Behauptung über echte Hardware.
Eingabe → erreichte Codezeile / Zeitpunkt → Ausgabe → begründetes Urteil:
Mitnehmen: Eine Abfrage erkennt nur den gelesenen Zustand. Schleifen wiederholen Prüfungen, beseitigen aber keine blockierende Tonphase. Eine belastbare Erklärung nennt den tatsächlich erreichten Weg.
Abgabe und nächster Test
Name: ____________________ · Codeversion: __________
Gebt eure begründeten Ablaufspuren ab. Markiert einen offenen Test für die nächste Arbeit am Rechner. Die Vorhersage ist noch kein Hardwaretest.