Cpp-Skript SS18.Pdf
Total Page:16
File Type:pdf, Size:1020Kb
Programmierung mit C++ für Computerlinguisten CIS, LMU München Max Hadersbeck Mitarbeiter Daniel Bruder, Ekaterina Peters, Jekaterina Siilivask, Kiran Wallner, Stefan Schweter, Susanne Peters, Nicola Greth — Version Sommersemester 2018 — Inhaltsverzeichnis 1 Einleitung1 1.1 Prozedurale und objektorientierte Programmiersprachen . .1 1.2 Encapsulation, Polymorphismus, Inheritance . .1 1.3 Statische und dynamische Bindung . .2 1.4 Die Geschichte von C++ . .2 1.5 Literaturhinweise . .3 2 Traditionelle und objektorientierte Programmierung4 2.1 Strukturiertes Programmieren . .4 2.2 Objektorientiertes Programmieren . .5 3 Grundlagen7 3.1 Installation von Eclipse und Übungsskript . .7 3.2 Starten eines C++ Programms . .7 3.3 Allgemeine Programmstruktur . .8 3.4 Kommentare in Programmen . 10 3.5 Variablen . 11 3.5.1 Was sind Variablen? . 11 3.5.2 Regeln für Variablen . 12 3.5.3 Grundtypen von Variablen . 12 3.5.4 Deklaration und Initialisierung von Variablen . 13 3.5.5 Lebensdauer von Variablen . 14 3.5.6 Gültigkeit von Variablen . 15 3.6 Namespace . 16 3.6.1 Defaultnamespace . 16 3.7 Zuweisen von Werten an eine Variable . 17 3.8 Einlesen und Ausgeben von Variablenwerten . 19 3.8.1 Einlesen von Daten . 19 3.8.2 Zeichenweises Lesen und Ausgeben von Daten . 21 3.8.3 Ausgeben von Daten . 22 3.8.4 Arbeit mit Dateien . 23 3.8.4.1 Textdateien unter Unix ................... 23 3.8.4.2 Textdateien unter Windows ................ 24 3.8.4.3 Lesen aus einer Datei . 25 3.8.4.4 Lesen aus einer WINDOWS Textdatei . 26 i ii Inhaltsverzeichnis 3.8.4.5 Schreiben in eine Datei . 26 3.9 Operatoren . 29 3.9.1 Arithmetische Operatoren . 30 3.9.2 Relationale und Logische Operatoren . 30 3.9.3 Die Wahrheitstabelle bei logischen Ausdrücken . 31 3.9.4 String Operatoren . 31 3.9.4.1 Zuweisungsoperator: = .................... 31 3.9.4.2 Verknüpfungsoperator: + .................. 31 3.9.4.3 Lexikographischer Vergleich bei Strings: . 32 4 Konstanten 33 5 Strukturierung von Programmen 37 5.1 Kontrollstrukturen . 37 5.1.1 Statements und Blöcke . 37 5.2 compound statement . 37 5.3 Selection-Statements . 38 5.3.1 Selection-Statement: if , if - else ................. 38 5.3.2 Selection-Statement: switch ..................... 39 5.4 Iteration-Statements . 40 5.4.1 Iteration-Statement: while ...................... 40 5.4.2 Iteration-Statement: do ........................ 41 5.4.3 Iteration-Statement: for ........................ 42 5.4.4 Iteration-Statement: range-for .................... 43 5.5 Das Wichtigste in Kürze . 44 6 Einsatz von Strings 46 6.1 Einf�hrung . 46 6.1.1 Bitbreite der Buchstaben von Strings . 46 6.1.2 Deklaration und Initialisierung von Stringvariablen mit 8-Bit Buch- stabencode . 47 6.2 Methoden f�r Stringobjekte . 47 6.3 Konstruktion eines Strings . 49 6.4 Destruktion eines Strings . 49 6.5 Zugriff auf die Buchstaben eines Strings . 49 6.6 Alphabetischer Vergleich von Strings . 50 6.7 Suchen innerhalb eines Strings . 53 6.8 Modifizieren eines Strings . 53 6.9 C++ Strings und C Strings . 57 6.10 Das Wichtigste in K�rze . 57 Inhaltsverzeichnis iii 7 Funktionen 59 7.1 Motivation . 59 7.2 Funktionstyp . 61 7.3 Funktionsname . 62 7.4 Funktionsargumente . 62 7.5 Defaultwerte für Funktionsargumente . 62 7.6 Funktionsrumpf . 63 7.7 Die Argumentübergaben . 63 7.7.1 Übergabe des Werts eines Arguments . 64 7.7.2 Übergabe einer Referenz auf ein Argument . 64 7.7.3 Beispiele Value vs. Referenz . 64 7.7.4 Seiteneffekte . 65 7.8 Überladen von Funktionen . 67 7.9 Mehrdeutigkeiten durch Überladen der Funktionen . 68 8 Internationalisierung unter C++ 70 8.1 Einführung in Kodierungen . 70 8.2 Unicode Transformation Format: UTF-8 . 70 8.3 Datentypen für Unicode-Zeichen . 72 8.4 Locales und Imbuing . 73 8.4.1 Localeabhängiges Arbeiten bei UCS Codierung . 74 8.5 UCS Zeichen und Datei-Streams . 76 8.5.1 Konvertierung von utf8 nach ISO-Latin . 76 8.5.2 Ausgabe einer UTF8- kodierten Datei . 77 8.6 Das Wichtigste in Kürze . 78 9 Programmieren von Klassen 80 9.1 Einführung . 80 9.2 Deklaration von Klassen . 80 9.3 Deklaration von Klassenobjekten . 81 9.4 Beispiel mit Klassen . 82 9.5 Initialisierung der Daten eines Objekts . 85 9.6 Löschen der Daten eines Objekts . 87 9.7 Kopieren der Daten eines Objekts . 87 9.8 Das Überladen von Operatoren . 88 9.9 Überladen von relationalen und logischen Operatoren . 89 9.10 Überladen von unären Operatoren . 89 9.11 Überladen des Output-Operators . 90 10 Vererbung 92 10.1 Einleitung . 92 10.2 Vererbung von Zugriffsrechten . 93 iv Inhaltsverzeichnis 10.3 Spezielle Methoden werden nicht vererbt . 94 10.4 Zuweisung von Objekten einer Unterklasse an Objekte der Oberklasse . 97 10.5 Überschreiben von Methoden/Funktionen in der abgeleiteten Klasse . 97 10.6 Polymorphismus . 98 11 Templates 101 11.1 Generische Funktionen . 101 11.2 Generische Klassen . 103 11.3 Erweiterung des Beispiels memory . 106 12 Standard Template Library (STL) 111 12.1 Iteratoren der STL . 111 12.2 Klassen der STL für die Computerlinguistik . 115 12.2.1 wchar_t . 115 12.2.2 wstring ................................. 115 12.3 Utilities der STL für die Computerlinguistik . 116 12.3.1 pair <type1, type2> ......................... 116 12.3.1.1 make_pair()- Hilfsfunktion . 116 12.4 Container der STL für die Computerlinguistik . 119 12.4.1 Überblick . 119 12.4.2 Einsatz der Container . 119 12.4.3 vector <type> ............................. 120 12.4.4 list<type> ............................... 124 12.4.5 deque<type> . 127 12.4.6 set <type> . 127 12.4.6.1 Beispiel mit dem Container set .............. 128 12.4.7 map <type1,type2> . 129 12.4.7.1 Beispiel zur Berechnung einer Frequenzliste mit map ... 130 12.4.8 unordered_set<type>, unordered_map<type1,type2> . 132 12.4.8.1 Implementation der Hash-Templates der STL mit dem gcc 132 12.5 STL-Algorithmen . 136 12.5.1 Vorbemerkung: Laufzeiten . 136 12.5.1.1 Der Headerfile algorithm für Algorithmen . 137 12.5.1.2 find():............................ 138 12.5.1.3 find_first_of():...................... 139 12.5.1.4 find_last_of():...................... 139 12.5.1.5 find_first_not_of():................... 141 12.5.1.6 find_last_not_of():.................... 142 12.5.1.7 find_if():.......................... 142 12.5.1.8 find_end():......................... 143 12.5.1.9 adjacent_find():...................... 144 12.5.1.10 search():.......................... 145 Inhaltsverzeichnis v 12.5.1.11 search_n():......................... 146 12.5.1.12 count():........................... 147 12.5.1.13 count_if():......................... 148 12.5.1.14 equal():........................... 149 12.5.1.15 mismatch():......................... 150 12.5.1.16 replace():.......................... 151 12.5.1.17 replace_copy():...................... 151 12.5.1.18 replace_copy_if():.................... 151 12.5.1.19 replace_if():........................ 152 12.5.1.20 unique():.......................... 152 12.5.1.21 unique_copy():....................... 152 12.5.1.22 sort():............................ 153 12.5.1.23 transform():........................ 154 12.5.1.24 for_each():......................... 155 13 Erweiterung um reguläre Ausdücke, die Bibliothek Boost::Regex 156 13.1 Integration des Pakets Boost . 156 13.1.1 Installation des Pakets Boost . 156 13.1.2 Kompilieren unter Verwendung der Bibliothek Boost::Regex ... 157 13.1.3 Einbinden von Boost::Regex in Eclipse . 157 13.1.4 Verwendung von Boost::Regex .................... 158 13.2 Verwendung von Regex mit C++11 . 158 13.3 Suchen nach einem regulären Ausdruck: regex_match ........... 158 13.4 Suchen nach einem regulären Ausdruck: regex_search() ......... 160 13.5 Ersetzen in einem String mit einem regulären Ausdruck: regex_replace() 162 13.6 UNICODE und Lokalisierung mit boost . ..