Zum Inhalt springen
Topos Uranos

Zusammenfassung

Diese Lektion eröffnet die sechste Einheit des Kurses, die den zusammengesetzten Daten gewidmet ist. Sie erklärt, wozu die Einheit dient: zu lehren, wie man Sammlungen von Daten darstellt (Folgen fester und variabler Größe, Tabellen und Datensätze) und wie man sie mit den grundlegenden Algorithmen verarbeitet, von Hand geschrieben und der Bibliothek entnommen, und dabei abschätzt, was sie kosten; sie stellt ihre sechs Lektionen vor und den Faden, der sie verbindet; sie erinnert daran, was die Einheit voraussetzt, vor allem die Schleifen mit Invariante und die Übergabe per konstanter Referenz; sie formuliert das Problem, das die Einheit löst, das eines Programms, das Daten speichern muss, deren Anzahl es nicht kennt, und das, mit einzelnen Variablen geschrieben, die überzähligen stillschweigend übergeht; sie nimmt die Kosten als zweites Maß eines Algorithmus neben seiner Korrektheit vorweg; 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 Schleifen, ihre Invarianten und die Parameterübergabe (per Wert, per Referenz und per konstanter Referenz) in Erinnerung rufen und sie bei Bedarf wiederholen.
  3. An einem Beispiel die Kosten eines Algorithmus als zweites Maß seiner Qualität neben seiner Korrektheit vorwegnehmen.
  4. Erkennen, was man am Ende der Einheit können soll, und es von dem unterscheiden, was man in den folgenden Einheiten lernen 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 vier Fragen prüfen, was die Einheit voraussetzt: die Invariante der Schleife, die ein Maximum sucht, die Art der Übergabe eines großen Parameters, die Anzahl der Durchläufe zweier verschachtelter Schleifen und die vorzeichenlose Arithmetik. Die sechs folgenden behandeln in der Reihenfolge der Lektionen die zentralen Ideen der Einheit: die gültigen Indizes einer Folge, das Erzeugen eines Vektors, wie oft sich eine Größe halbieren lässt, die Suche in sortierten Daten, den doppelten Index einer Tabelle und die Gefahr, die Daten ein und derselben Entität in getrennten Sammlungen zu speichern. 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 EinheitenDas Fragment int largest{0}; int t{}; while (std::cin >> t) { if (t > largest) { largest = t; } } soll in largest die höchste der eingelesenen Temperaturen hinterlassen. Bei welcher Eingabe versagt es?

  2. Frage 2Aus früheren EinheitenEine Funktion berechnet, wie viele Vokale ein Text von einer Million Zeichen enthält, der in einem std::string gespeichert ist, und verändert ihn nicht. Wie deklariert man ihren Parameter am besten?

  3. Frage 3Aus früheren EinheitenWie oft wird ++count in for (int i{0}; i < 6; ++i) { for (int j{0}; j < i; ++j) { ++count; } } ausgeführt?

  4. Frage 4Aus früheren EinheitenWas schreibt std::println("{}", 0u - 1); auf einem System, in dem unsigned int 32 Bit hat?

  5. Frage 5In einer Folge von nn Elementen, die wie in C++ nummeriert sind: Welche Indizes ii bezeichnen ein Element?

  6. Frage 6Was enthält v nach std::vector<int> v(3, 7);?

  7. Frage 7Wie viele Durchläufe macht for (int m{1024}; m > 1; m /= 2) { ... }?

  8. Frage 8Ein Telefonbuch enthält eine Million Namen in alphabetischer Reihenfolge. Um einen zu finden, schlägt man es in der Mitte auf, verwirft die Hälfte, in der der Name nicht stehen kann, und wiederholt das mit der anderen. Wie oft muss man es höchstens aufschlagen?

  9. Frage 9Bei std::vector<std::vector<int>> t{{1, 2, 3}, {4, 5, 6}};: Welche Werte haben t[1][0] und t.size()?

  10. Frage 10Ein Programm speichert die Namen einer Gruppe in einem Vektor und ihre Noten in einem anderen, sodass die Note grades[i] die von names[i] ist. Was geschieht, wenn es nur den Vektor der Noten sortiert?