Zusammenfassung
Diese Lektion eröffnet die siebte Einheit des Kurses, die dem Text und den Dateien gewidmet ist. Sie erklärt, wozu die Einheit dient: zu lehren, wie man Text als Daten behandelt, mit seiner wirklichen Kodierung, und wie man ein Programm Dateien lesen und schreiben lässt, ohne dass es an einer fehlerhaften Eingabe zerbricht; sie stellt ihre vier Lektionen und den Faden vor, der sie verbindet; sie erinnert an das, was die Einheit voraussetzt, vor allem daran, dass ein Zeichen für die Maschine eine Zahl ist, und an die Vektoren, Datensätze und Funktionen der Einheiten 5 und 6; sie formuliert das Problem, das die Einheit löst, das eines scheinbar korrekten Programms, das ohne Warnung Daten verliert, an der ersten unerwarteten Zeile stehen bleibt und Namen mit Akzenten falsch misst; sie nimmt vorweg, dass ein Buchstabe nicht immer ein Byte belegt; und sie zeigt, wohin sie führt, in Einheit 8 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.
- Die Darstellung der Zeichen als numerische Codes wiederholen (Lektion 2.4) und einen Code binär und hexadezimal schreiben.
- An einem Beispiel vorwegnehmen, dass ein Buchstabe nicht immer ein Byte ist und dass deshalb Bytes zählen nicht Buchstaben zählen heißt.
- Erkennen, was man am Ende der Einheit können soll, und es von dem unterscheiden, was in der nächsten Einheit und in Programmieren in C++ II 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 sechs Fragen prüfen, was die Einheit voraussetzt: den Code eines Zeichens, das Schreiben einer Zahl in binärer und hexadezimaler Form, eine Bitmaske, das Durchlaufen eines Vektors, das seine Elemente filtert, was geschieht, wenn ein Lesevorgang Buchstaben statt einer Zahl erhält, und die Definition eines Datensatzes. Die vier folgenden behandeln in der Reihenfolge der Lektionen die zentralen Ideen der Einheit: was eine Suche liefert, die nichts findet, die Größe eines Wortes mit Akzent, die leere Zeile, die erscheint, wenn man zwei Arten des Lesens mischt, und die Datei, die nicht geöffnet werden konnte. Niemand muss diese vier 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.
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 EinheitenWas schreibt
std::println("{:d} {:d}", 'A', 'a');?Glaubt, die Kleinbuchstaben folgten unmittelbar auf die Großbuchstaben; zwischen beiden liegen 32 Codes, mit einigen Zeichen dazwischen.Übersieht, dass{:d}den Code verlangt; ohne diese Angabe würdestd::printlnden Buchstaben schreiben.Kehrt die Reihenfolge um: In ASCII haben die Großbuchstaben kleinere Codes als die Kleinbuchstaben.Eincharspeichert eine Zahl, den Code des Zeichens, und{:d}verlangt, diese Zahl zu schreiben und nicht den Buchstaben. In ASCII beginnen die Großbuchstaben bei 65 und die Kleinbuchstaben bei 97: Der Abstand ist 32, ein einziges Bit. Die Lektion Text ist nicht ASCII geht davon aus, um zu erklären, was mit den Buchstaben geschieht, die nicht in ASCII liegen.Wiederholen: Zeichen, boolesche Werte, Umwandlungen und Konstanten
Frage 2Aus früheren EinheitenWie schreibt man 233 binär und hexadezimal?
Gruppiert die vier niederwertigen Bits falsch:1001ist 9, nicht 1.Liest die Bits verkehrt herum, vom niedrigstwertigen zum höchstwertigen.Verwechselt die hexadezimale mit der dezimalen Schreibweise.. In Vierergruppen von rechts zusammengefasst, ergeben die Bits1110und1001die Werte 14 und 9, alsoeund9. Es ist der Code des „é“, und die Einheit wird zeigen, dass dieser Code in einer heutigen Textdatei nicht als ein einziges Bytee9gespeichert wird, sondern als zwei.Wiederholen: Ganze Zahlen und ihre Darstellung
Frage 3Aus früheren EinheitenWelchen Wert hat
0xB1 & 0xC0?Verwechselt&mit|: Das bitweise ODER setzt die hohen Bits, statt sie auszuwählen.Glaubt, die Maske ändere nichts; sie löscht die sechs niederwertigen Bits.Verwechselt&mit^, dem exklusiven ODER.0xB1ist10110001und0xC0ist11000000: Das bitweise UND behält nur die zwei höchstwertigen Bits von0xB1, nämlich10. Diese Maske verwendet die Lektion Text ist nicht ASCII, um die Bytes zu erkennen, die einen Buchstaben fortsetzen.Wiederholen: Bits und Mathematikbibliothek
Frage 4Aus früheren EinheitenWas schreibt
std::vector<int> v{4, 7, 10, 3}; std::vector<int> w{}; for (const int x : v) { if (x % 2 == 0) { w.push_back(x); } } std::println("{}", w);?Kehrt die Bedingung um:x % 2 == 0ist für die geraden Zahlen wahr.Glaubt,push_backkopiere den ganzen Vektor, oder der Filter werde aufvangewandt undvausgegeben.Glaubt,push_backfüge am Anfang hinzu; es fügt am Ende hinzu.Die Schleife durchläuftvund kopiert nachwnur die geraden Zahlen, in der Reihenfolge ihres Auftretens;vändert sich nicht. Die Einheit verwendet dasselbe Schema mit Text: die Bytes einer Zeichenkette durchlaufen und einige davon behalten, oder die Zeilen einer Datei durchlaufen und die gültigen behalten.Wiederholen: Vektoren
Frage 5Aus früheren EinheitenNach
int n{-1}; std::cin >> n;wirdabceingegeben. Welchen Wert hatn, und was geschieht mit den folgenden Lesevorgängen?Glaubt, das gescheiterte Lesen hinterlasse keine Spur; es hinterlässt eine in der Variablen und im Zustand des Streams.Nimmt an, C++ warne vor der ungültigen Eingabe; das Programm läuft weiter, als wäre das Lesen gelungen.Verwechselt das Lesen einer ganzen Zahl mit dem eines Zeichens.Das Lesen überspringt die Leerzeichen, findet einen Buchstaben, mit dem keine Zahl beginnen kann, und schlägt fehl: Der Standard legt fest, dass die Variable 0 erhält, dass der Buchstabe im Stream bleibt und dass der Stream in den Fehlerzustand gerät, ohne jede Meldung. Die Lektion Richtig einlesen lehrt, dieses Scheitern vom Ende der Daten zu unterscheiden und sich davon zu erholen.Wiederholen: Eingabe, Ausgabe und Fehler
Frage 6Aus früheren EinheitenWelche der folgenden Definitionen deklariert korrekt einen Datensatz mit einem Titel und einem Jahr?
Vergisst das Semikolon nach der schließenden Klammer, den ersten Fehler aller, die Datensätze schreiben; der Compiler zeigt ihn genau an.Trennt die Felder durch Kommas, wie die Elemente einer Liste; jedes Feld ist eine Deklaration und endet mit einem Semikolon.Verwechselt einen Datensatz, mit benannten Feldern verschiedener Typen, mit einem Vektor, dessen Elemente alle vom selben Typ sind.Jedes Feld wird wie eine Variable deklariert, mit seinem Typ, seinem Namen und seinem Anfangswert in geschweiften Klammern, und die Definition endet mit einem Semikolon nach der schließenden Klammer. Die Lektion Textdateien füllt Vektoren von Datensätzen wie diesem mit den Zeilen einer Datei.Wiederholen: Datensätze
Frage 7Wenn
salsstd::string s{"casa azul"};definiert ist, was lieferts.find("x")?Das ist die Konvention anderer Sprachen;std::size_that kein Vorzeichen, und eine in diesen Typ umgewandelte-1ist geradenpos, aber das Ergebnis mit-1zu vergleichen, funktioniert nur dank dieser Umwandlung und erzeugt eine Warnung des Compilers.Verwechselt „nicht gefunden“ mit der Position 0, der Position eines Vorkommens am Anfang der Zeichenkette.Das ist eine ehrliche Antwort: Lektion 7.1 stelltfindundnposvor.findliefert eine Position vom Typstd::size_t, und wenn es nichts findet, liefert es einen Wert, den keine Position haben kann:npos, das bei 64 Bit beträgt. Die Lektion Zeichenketten lehrt, es immer ausdrücklich zu vergleichen.Wiederholen: Zeichenketten
Frage 8Was schreibt
std::println("{}", std::string{"año"}.size());in einem in UTF-8 gespeicherten Programm wie denen dieses Kurses?Zählt Buchstaben;sizezählt die Bytes, in denen sie geschrieben sind.Glaubt, jeder Buchstabe belege zwei Bytes; die aus ASCII belegen eines.Das ist eine ehrliche Antwort: Lektion 7.2 erklärt es Byte für Byte.sizezählt Bytes, nicht Buchstaben: Im spanischen Wort „año“ (Jahr) belegen das „a“ und das „o“ je eines, und das „ñ“, das nicht in ASCII liegt, belegt in UTF-8 zwei. Die Lektion Text ist nicht ASCII erklärt, warum, und lehrt, die Buchstaben zu zählen.Wiederholen: Text ist nicht ASCII
Frage 9Ein Programm führt
int age{}; std::string name{}; std::cin >> age; std::getline(std::cin, name);aus, und es wird36eingegeben, die Eingabetaste gedrückt,Anaeingegeben und wieder die Eingabetaste gedrückt. Was steht danach inname?Nimmt an,getlinebeginne in der nächsten Zeile; es beginnt dort, wo>>aufgehört hat.Glaubt,getlinelese noch einmal, was>>schon verbraucht hat.Das ist eine ehrliche Antwort: Lektion 7.3 beginnt mit diesem Fehler.>>liest die 36 und lässt den Zeilenumbruch, der ihr folgte, im Stream;std::getlineliest bis zum ersten Zeilenumbruch, und das ist dieser, und liefert, was davor stand: nichts. Die Lektion Richtig einlesen erklärt das und vermeidet es mitstd::ws.Wiederholen: Richtig einlesen
Frage 10Ein Programm führt
std::ifstream in{"data.txt"}; int x{-1}; in >> x;aus, aberdata.txtexistiert nicht in dem Ordner, aus dem es gestartet wird. Was geschieht?Nimmt an, das Öffnen einer nicht vorhandenen Datei sei ein Fehler, den C++ meldet; das Programm läuft ohne Hinweis weiter.Verwechselt das Öffnen zum Lesen mit dem Öffnen zum Schreiben, das die Datei tatsächlich anlegt.Das ist eine ehrliche Antwort: Lektion 7.4 beginnt mit dieser Prüfung.Das Öffnen einer Datei kann fehlschlagen, und der Fehlschlag ist nur zu sehen, wenn man den Stream abfragt: Deshalb schreibt manif (!in)vor dem Lesen. Die Lektion Textdateien macht diese Prüfung zur Regel und erklärt, von welchem Ordner die Suche abhängt.Wiederholen: Textdateien
Inhalt wird geladen…
Abgeschlossen
Melde dich an, um deinen Fortschritt zu speichern