Zusammenfassung
Diese Lektion eröffnet die zweite Einheit des Kurses, die den Daten und ihren Typen gewidmet ist. Sie erklärt, wozu die Einheit dient: zu lehren, dass jedes Datum eines Programms im Speicher mit einem Typ lebt, der festlegt, welche Werte es annehmen kann, wie viel Platz es belegt und welche Operationen es zulässt, und dass diese Grenzen beobachtbare Folgen haben; sie stellt ihre vier Lektionen vor und den Faden, der sie verbindet, von der Variablen als Speicherzelle mit Namen und Wert bis zu den Konvertierungen zwischen Typen und den Konstanten; sie erinnert daran, was die Einheit aus der ersten voraussetzt, nämlich ein Programm, das liest und schreibt, zu schreiben, zu kompilieren und auszuführen; sie formuliert das Problem, das die Einheit löst, das eines dem Anschein nach korrekten Programms, dessen Rechnungen nicht mit denen der Mathematik übereinstimmen, angefangen bei der Summe , die auf einem Computer nicht genau ergibt; und sie zeigt, wohin sie führt, in den folgenden Einheiten und im Kurs Programmieren in C++ II.
Lernziele
- Die Abfolge der Inhalte der Einheit beschreiben und erklären, was jede Lektion zur nächsten beiträgt.
- Das Nötige aus Einheit 1 in Erinnerung rufen (den Zyklus aus Kompilieren und Ausführen, die formatierte Ausgabe, das Einlesen mit
std::cinund das Lesen der Compilermeldungen) und es bei Bedarf wiederholen. - An einem Beispiel erklären, warum eine Zahl eines Programms keine Zahl der Mathematik ist, und vorwegnehmen, warum auf einem Computer nicht genau ist.
- 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 aus der ersten voraussetzt: das schrittweise Nachvollziehen eines Verfahrens, das Schreiben einer Zahl mit zwei Nachkommastellen, das Runden und das Lesen einer Fehlermeldung. Die sechs folgenden behandeln in der Reihenfolge der Lektionen die zentralen Ideen der Einheit. Niemand muss sie schon richtig beantworten, und bei einer 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.
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.
Frage 1Aus früheren EinheitenEin Verfahren lautet: „1. erhält den Wert 17. 2. erhält den Wert . 3. erhält den Wert “. Welchen Wert hat am Ende?
Nimmt an, dass jeder Schritt vom Anfangswert ausgeht; der zweite geht von dem Wert aus, den der erste hinterlassen hat.Liest „erhält den Wert“ als mathematische Gleichung; es ist ein Befehl, der den Wert von ersetzt.Verwechselt eine Variable mit einer Konstanten: Der Wert einer Variablen ändert sich jedes Mal, wenn ihr ein anderer zugewiesen wird.Jeder Schritt geht von dem Wert aus, den in diesem Augenblick hat, nicht vom Anfangswert. Das Verfahren von Hand nachzuvollziehen, mit dem Wert jeder Variablen nach jedem Schritt, ist die Ablauftabelle aus Einheit 1, und Lektion 2.1 macht sie zum Werkzeug, um über den Zustand eines Programms zu argumentieren.Wiederholen: Vom Problem zum Algorithmus
Frage 2Aus früheren EinheitenWas schreibt die Anweisung
std::println("{:.2f}", 2.0 / 3);?Glaubt, die Formatangabe schneide ab; sie rundet auf die nächstgelegene Nachkommastelle.Übersieht die Formatangabe: So sieht die Ausgabe ohne.2faus.Glaubt, die Division sei ganzzahlig; mit2.0, das Nachkommastellen hat, ist die Division reell.Die Angabe.2fschreibt die Zahl mit zwei Nachkommastellen und rundet dabei: wird als0.67geschrieben. Der gespeicherte Wert ändert sich nicht, nur seine Schreibweise.Wiederholen: Eingabe, Ausgabe und Fehler
Frage 3Aus früheren EinheitenMan will mit zwei Nachkommastellen schreiben und dabei runden. Was erhält man?
Schneidet ab, statt zu runden: Verwirft die dritte Stelle, ohne sie anzusehen.Rundet auf eine Nachkommastelle, nicht auf zwei.Erhöht die zweite Nachkommastelle stärker als nötig: liegt zwischen und , und das Runden wählt eine dieser beiden Zahlen.Auf zwei Nachkommastellen runden heißt, die nächstgelegene Zahl mit zwei Nachkommastellen zu wählen: liegt näher an als an . Lektion 2.3 wird zeigen, dass der Computer auf dieselbe Weise rundet, aber zur Basis 2, und dass deshalb fast keine Zahl mit Nachkommastellen exakt gespeichert wird.Wiederholen: Eingabe, Ausgabe und Fehler
Frage 4Aus früheren EinheitenEin Programm hat in Zeile 5
const int pages{12}und in Zeile 6std::println("{}", pages);. Der Compiler schreibt6:5: error: expected ',' or ';' before 'std'. Wo liegt der Defekt?Zeile 6 ist korrekt; der Compiler zeigt auf sie, weil er dort das Fehlen bemerkt hat.stdwird erkannt; die Meldung sagt, dass davor ein Semikolon erwartet wurde.Die Meldung sagterror, nichtwarning: Es gibt keine ausführbare Datei.Der Compiler entdeckt das Fehlen, wenn er am Anfang von Zeile 6 auf etwas trifft, das nicht auf die Deklaration folgen kann, und zeigt auf diese Stelle. Ist die angezeigte Zeile in Ordnung, liegt der Defekt meist am Ende der vorigen.Wiederholen: Anatomie eines Programms
Frage 5Ein Programm deklariert
int a{2};undint b{7};und führt danacha = b;undb = 10;aus. Welchen Wert hataam Ende?Glaubt, die Zuweisung verbinde die beiden Variablen, als wäreaein anderer Name fürb; sie kopiert nur den Wert.Liesta = bverkehrt herum, als kopierte sieainb; der Wert geht von rechts nach links.Addiert die beiden Werte; die Zuweisung ersetzt, sie akkumuliert nicht.Die Zuweisunga = bkopiert inaden Wert, denbin diesem Augenblick hat; danach sindaundbunabhängige Speicherzellen, und eine Änderung vonbändertanicht.Wiederholen: Variablen und Speicher
Frage 6Wie schreibt man die Zahl 13 zur Basis 2?
Das ist eine ehrliche Antwort: Lektion 2.2 lehrt, eine Zahl zur Basis 2 zu schreiben und zu lesen, und der Abschlusstest wird erneut danach fragen.Liest die Reste der fortgesetzten Division in der Reihenfolge, in der sie entstehen; man liest sie vom letzten zum ersten.Addiert die Stellenwerte falsch: .Zur Basis 2 hat jede Stelle den doppelten Stellenwert der Stelle zu ihrer Rechten, und die einzigen Ziffern sind 0 und 1. Lektion 2.2 lehrt das, weil jede ganze Zahl eines Programms so gespeichert wird.Wiederholen: Ganze Zahlen und ihre Darstellung
Frage 7Ein
intmit 4 Bytes enthält , seinen größten Wert, und das Programm addiert 1 dazu. Was lässt sich sagen?Übersieht die Grenze der Darstellung: Diese Zahl passt nicht in einintmit 4 Bytes.So verhalten sich die vorzeichenlosen ganzen Zahlen, deren Arithmetik modular ist; für die vorzeichenbehafteten garantiert der Standard das nicht.Der Compiler kennt die Werte nicht, die das Programm bei der Ausführung haben wird, außer es sind Konstanten; fast immer kompiliert er, ohne etwas zu sagen.Eine ganze Zahl eines Programms hat eine feste Anzahl von Bits und damit einen endlichen Wertebereich. Den Wertebereich einer vorzeichenbehafteten ganzen Zahl zu verlassen verletzt die Vorbedingung der Addition; der Sanitizer des Kurses hält das Programm an, und ohne ihn kann das Programm irgendetwas schreiben. Lektion 2.2 untersucht das.Wiederholen: Ganze Zahlen und ihre Darstellung
Frage 8Hat eine endliche Dezimalentwicklung?
ist eine Näherung: , nicht 1.Wie viele man auch schreibt, es bleibt immer ein Rest; die Entwicklung ist periodisch, nicht endlich.Es ist eine Eigenschaft der Zahl und der Basis, nicht des Instruments; der Taschenrechner zeigt nur eine Näherung.Ein gekürzter Bruch hat genau dann eine endliche Dezimalentwicklung, wenn sein Nenner keine anderen Primfaktoren als 2 und 5 hat, die der Basis 10. Zur Basis 2 ist die Bedingung strenger: Der Nenner muss eine Potenz von 2 sein, und deshalb hat keine endliche Binärentwicklung. Lektion 2.3 zieht daraus die Folgerungen.Wiederholen: Gleitkommazahlen
Frage 9Was schreibt
std::println("{}", 0.1 + 0.2);?Nimmt an, der Computer addiere exakte Dezimalzahlen; er addiert binäre Näherungen.Verwechselt die Ausgabe mit leerem Platzhalter mit der Formatangabe{:.2f}, die auf zwei Nachkommastellen rundet.Die Summe zweierdoubleist zulässig; überraschend ist ihr Ergebnis, nicht ihre Schreibweise.Weder noch wird binär exakt gespeichert, und die Summe ihrer Näherungen ist nicht die Näherung von .std::printlnschreibt die kürzeste Dezimaldarstellung, die den gespeicherten Wert identifiziert, und diese Darstellung enthüllt den Unterschied. Lektion 2.3 erklärt Ziffer für Ziffer, woher er kommt.Wiederholen: Gleitkommazahlen
Frage 10Ein Programm deklariert
const double ratio{7 / 2};und schreibtratio. Was erscheint?Glaubt, der Typ der Variablen entscheide, wie dividiert wird; das entscheidet der Typ der Operanden.Glaubt, die ganzzahlige Division runde; sie verwirft den Nachkommaanteil.Der Wert 3 ist konstant und wird in einemdoubleexakt dargestellt: Es gibt keinen Verlust, und die geschweiften Klammern lassen ihn zu.Die Division7 / 2findet zwischen ganzen Zahlen statt und ergibt den ganzzahligen Quotienten, 3; erst danach wird diese 3 indoublekonvertiert. Welche Division ausgeführt wird, entscheidet sich in der Operation selbst, nach dem Typ der Operanden, und nicht beim Speichern des Ergebnisses. Lektion 2.4 lehrt, wo man die Konvertierung anbringt, um 3.5 zu erhalten.Wiederholen: Zeichen, boolesche Werte, Umwandlungen und Konstanten
Inhalt wird geladen…
Abgeschlossen
Melde dich an, um deinen Fortschritt zu speichern