Zum Inhalt springen
Topos Uranos

Zusammenfassung

Diese Lektion eröffnet die fünfte Einheit des Kurses, die den Funktionen gewidmet ist. Sie erklärt, wozu die Einheit dient: zu lehren, wie man ein Problem in benannte Teile zerlegt, jeden mit einer Schnittstelle und einem Vertrag, und wie man bestimmte Probleme löst, indem man sie auf eine kleinere Instanz ihrer selbst zurückführt, durch Rekursion; sie stellt ihre vier Lektionen vor und den Faden, der sie verbindet; sie erinnert daran, was die Einheit voraussetzt, vor allem die Schleifen der Einheit 4 und ihre Invarianten; sie formuliert das Problem, das die Einheit löst, das eines Programms, das dieselbe kopierte Berechnung wiederholt und wegen eines Versehens beim Kopieren falsch antwortet, ohne dass der Compiler etwas sagt; sie nimmt den Vertrag (die Vorbedingung und die Nachbedingung) als die Form vorweg, in der die Einheit jeden Teil spezifizieren wird; und sie zeigt, wohin sie führt, in den folgenden Einheiten und im Kurs Programmieren in C++ II.

Lernziele

  1. Die Abfolge der Inhalte der Einheit beschreiben und erklären, was jede Lektion zur nächsten beiträgt.
  2. Die Algorithmen der Einheit 4 (die Ablaufverfolgung einer Schleife, ihre Invariante und ihre Variante) in Erinnerung rufen und sie bei Bedarf wiederholen.
  3. An einem Beispiel die Idee des Vertrags vorwegnehmen: was ein Teil des Programms von dem verlangt, der ihn benutzt, und was er ihm im Gegenzug garantiert.
  4. Erkennen, was man am Ende der Einheit können soll, und es von dem unterscheiden, was in den folgenden Einheiten gelernt wird.

Eingangstest

Bevor man die Einheit durcharbeitet, lohnt es sich, den Ausgangspunkt zu bestimmen. Dieser Test ist eine Selbstüberprüfung: Er wird nicht benotet, und sein einziger Zweck ist es, das Lernen zu leiten. Die ersten fünf Fragen prüfen, was die Einheit voraussetzt: die Ablaufverfolgung einer Schleife, ihre Invariante, die Vorbedingung einer Spezifikation, das Kopieren eines Wertes bei der Initialisierung und die Suche nach einer Berechnung mit eigenen Eingaben und Ausgaben innerhalb eines Programms der Einheit 4. Die fünf folgenden behandeln in der Reihenfolge der Lektionen die zentralen Ideen der Einheit: den Aufrufstapel, die Übergabe eines Arguments, die Trennung von Berechnung und Darstellung, die rekursive Definition der Fakultät und die Ausführung einer Funktion, die sich selbst aufruft. Niemand muss sie schon richtig beantworten, und bei einigen von ihnen ist „Das weiß ich noch nicht“ eine ehrliche Antwort: Jede Antwort, ob richtig oder nicht, erklärt den Punkt und nennt die Lektion, die ihn behandelt. Dieselben Fertigkeiten werden am Ende erneut gemessen, in der Synthese-Lektion.

Eingangstest

Miss vor Beginn der Einheit deinen Ausgangspunkt. Es ist eine kurze Selbsteinschätzung: Sie wird nicht benotet, und das Ergebnis wird nur in deinem Browser gespeichert.

  1. Frage 1Aus früheren EinheitenWas schreibt int n{305}; int c{1}; while (n >= 10) { n = n / 10; ++c; } std::println("{}", c);?

  2. Frage 2Aus früheren EinheitenIn der Schleife int total{0}; int k{1}; while (k <= n) { total += k; ++k; } mit n≥0n \geq 0: Welche Beziehung gilt jedes Mal, wenn die Bedingung ausgewertet wird?

  3. Frage 3Aus früheren EinheitenDie Spezifikation der Division lautet: „Gegeben ganze Zahlen a≥0a \geq 0 und b>0b > 0, bestimme qq und rr mit a=b⋅q+ra = b \cdot q + r und 0≤r<b0 \leq r < b.“ Was ist ihre Vorbedingung?

  4. Frage 4Aus früheren EinheitenWelchen Wert hat nach int a{3}; int b{a}; b = 7; die Variable a?

  5. Frage 5Aus früheren EinheitenDas Programm der Lektion 4.4, das die Primzahlen unter 100 schreibt, hat eine Schleife, die die Kandidaten durchläuft, und darin eine weitere, die ihre Teiler durchprobiert. Welcher Teil ist eine Berechnung mit eigenen Eingaben und Ausgaben, die man benennen sollte?

  6. Frage 6Ein Programm beginnt in main; main ruft eine Funktion g auf, und g ruft eine andere Funktion h auf. Welche Aufrufe laufen, während h ausgeführt wird?

  7. Frage 7Bei der Funktion int f(int x) { x = x + 1; return x; }: Was schreibt int a{3}; int b{f(a)}; std::println("{} {}", a, b);?

  8. Frage 8Ein Programm liest ein Datum und soll seinen Wochentag schreiben. Welche Zerlegung trennt die Berechnung von der Darstellung?

  9. Frage 9Welche der folgenden Definitionen definiert n!n! für jede natürliche Zahl nn?

  10. Frage 10Bei int f(int n) { if (n == 0) { return 0; } return n + f(n - 1); }: Was schreibt std::println("{}", f(3));?