Informatik I (C++) Sammlung von Gábor Zogg Sammlung Informatik I Gábor Zogg 1. Prioritäten Beschreibung Negation Vorzeichen increment/decrement Multiplikation/Division Modulo (Divisionsrest) Addition/Subtraktion Relationszeichen Gleich/Ungleich logisches AND logisches OR Zeichen ! +,++,-*,/ % +,<,>,<=,>= ==,!= && || Priorität 15 15 15 13 13 12 10 9 5 4 2 Assoziativität rechts rechts rechts links links links links links links links Sammlung Informatik I Gábor Zogg 2. Strukturen 2.1 Grundaufbau eines Programms // Programm: prog.C // Beschreibung des Programms // Autor: Name #include <Bibliothek> int funktionsname(parameter, parameter, [...]){ // Funktion [...] return value; // Rückgabewert der Funktion } int funktionsname2(parameter, parameter, [...]) int main(){ // Initialisierung einer späteren Funktion // Hauptprogramm [...] return 0; } int funktionsname2(parameter, parameter, [...]){ // Die bereits initialisierte Funktion [...] return value; } 2.2 Strukturen 2.2.1 Variablen initialisieren Datentyp bool integer unsigned int float double string char Initialisierung bool x; int x; unsigned int x; float x; double x; std::string x; std::char x; Beschreibung true/false ganzzahlig, positiv oder negativ ganzzahlig, positiv Fliesskommazahl, 32bit Fliesskommazahl, 64bit Text Zeichen 3 Sammlung Informatik I Gábor Zogg 2.2.2 if-Strukturen if (Bedingung) { [...] } // einfach if (Bedingung) { [...] } else { [...] } // mit else 2.2.3 do-while-Strukturen do { // mit do (wird mindestens ein maldurchgeführt!) [...] } while (Bedingung); while (Bedingung) { [...] } // ohne do 2.2.4 for-Schleife for (Variabeln; Abbruchbedingung; Variablenänderung){ [...] } for (int x = 0; x > 12; x++, y--){ [...] } // Beispiel 2.3 Datentypen 2.3.1 Aufbau, Schreibweise Typ bool int unsigned int float Beispiele true, false 145, 548, -3458 123u, 34u, 599943u 1.234f, -5.67f double 5.342, -7.894536654 std::string std::char std::vector "Hallo du da!", "gruen" 'b', '8', '-' Elemente 4 Aufbau 1 bit (7) bits + 1 Vorzeichen-bit (8) bits 23 bit Mantisse 8 bit Exponent 1 bit Vorzeichen 53 bit Mantisse 12 bit Exponent 1 bit Vorzeichen 8 bit pro Zeichen 8 bit je nach Inhalt Sammlung Informatik I Gábor Zogg 2.3.2 Typkonversionen speziell int - unsigned int - float - double allgemein exact: float > double char > string (unsigned int > int) approximative: double > float andere 2.3.3 Iteratoren Verweisen auf ein Zeichen oder einen Wert dereferenzieren: *iterator // liefert den Wert, auf den der Iterator weist 2.4 Funktionen 2.4.1 Funktionsaufrufe call-by-value: funktion(variable); // Eine Kopie der Variablen wird erstellt call-by-reference: funktion(&variable); // Es gibt keine Kopie der Variablen 2.4.2 Bibliotheken Einbinden einer Bibliothek: #include "bib.h" // sofern im selben Verzeichnis Aufbau einer Bibliothek: // Programm.h // Beschreibung // Autor funktion ([...]) { [...] return value; } Auch hier können namespaces verwendet werden. Es können auch weitere Bibliotheken eingebunden werden. 2.4.3 Object-Files Object-files sind prekompilierte .C Dateien, die keine main-Funktion enthalten. Sie können anschliessend beim kompilieren angefügt werden und unterscheiden sich dann nicht mehr von Funktionen, wie sie im Programm selbst geschrieben stehen. 5 Sammlung Informatik I Gábor Zogg 3. Formale Sprachen, Grammatik 3.1 Formale Sprachen Alphabet Σ als endliche Menge an Symbolen Sprache L ⊆ Σ wird konstruiert durch Grammatik (siehe 3.3) 3.2 Reguläre Ausdrücke Zeichen [a|b] ab a{x} a{x,y} * + ? ε (c) Bedeutung a oder b a gefolgt von b x mal das a hintereinader zwischen x und y mal das a hintereinander beliebig oft beliebig oft, mindestens einmal einmal oder keinmal nichts Klammerung (für *,+ oder?) entspricht a{5}=aaaaa a{5,7}=a{5}|a{6}|a{7} a+=aa* a?=a| ε Beispiel: Alle Wörter, worin alle Teilwörter der Länge vier mindestens eine 1 enthalten aus dem Alphabet Σ = {0,1}: ['1']*(['0']?['0']?['0']?['1'])*['0']?['0']?['0']? 3.3 Grammatik G=<N,T,P,S> Grammatik N Nicht-Terminalsymbole (Zeichen, die am Schluss nicht im Wort vorkommen) T Terminalsymbole P Produktionsregeln S Startsymbol Beispiel (für die selbe Aufgabe wie bei 3.2): T={0,1} N={A,B,C,D} S=A P: AÆ1A AÆ0B AÆ ε BÆ1A BÆ0C BÆ ε CÆ1A CÆ0D CÆ ε DÆ1A DÆ ε 6 Sammlung Informatik I Gábor Zogg 4. Sortieralgorithmen 4.1 Min-Sort Beginnt vorne und sucht von den verbleibenden jeweils das kleinste, danach vertauscht es das erste verbleibende Element mit dem kleinsten. Beispiel: 5 3 2 6 4 1 3 7 1 3 2 6 4 5 3 7 1 2 3 6 4 5 3 7 1 2 3 6 4 5 3 7 1 2 3 3 4 5 6 7 1 2 3 3 4 5 6 7 1 2 3 3 4 5 6 7 1 2 3 3 4 5 6 7 1 2 3 3 4 5 6 7 4.2 Bubble-Sort Immer zwei aufeinanderfolgende Elemente werden verglichen, und falls das erste das grössere ist, dann wird getauscht. Das letzte Element bleibt dann stehen und wird nicht mehr geprüft. Wenn ein Durchgang ohne Veränderung bleibt wird abgebrochen. Die Methode ist nur schneller, falls per Zufall der Sortiervorgang früher vollendet ist. Beispiel: 5 3 3 3 3 3 3 3 2 2 3 5 2 2 2 2 2 2 3 3 2 2 5 5 5 5 5 5 5 5 6 6 6 6 4 4 4 4 4 4 4 4 4 4 6 1 1 1 1 1 1 1 1 1 1 6 3 3 3 3 3 3 3 3 3 3 6 6 6 6 7 7 7 7 7 7 7 7 7 7 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 1 1 1 1 5 1 1 1 1 1 4 3 3 3 1 5 3 3 3 3 3 4 4 4 3 3 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 2 2 2 1 1 1 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 4.3 Quick-Sort Unterteilt die Folge in zwei Teilstücke. Es wird dabei so getrennt, dass links vom Trennelement alles kleiner ist und rechts alles grösser. Danach ruft die Funktion sich selber rekursiv auf. Als Trennelement dient das erste Element der Folge, es wird dann die Folge so durchgearbeitet, dass alle grösseren Elemente als das Trennelement mit dem nachfolgenden vertauscht werden. Am Ende wird das Trennelement noch an die richtige Stelle vertauscht. Siehe Beispiel. Die Variante ist schneller, falls die Elemente stark vermischt sind. Sie ist aber langsam, wenn die Folge schon gut vorsortiert ist. Dann wäre Bubble-Sort schneller. Beispiel: 5 3 2 6 4 1 3 7 5 3 2 4 6 1 3 7 b b i,j i j 5 3 2 6 4 1 3 7 5 3 2 4 1 6 3 7 b b i,j i j 5 3 2 6 4 1 3 7 5 3 2 4 1 3 6 7 b b i,j 5 3 2 6 4 1 3 7 b i i j 3 3 2 4 1 5 6 7 j b 7 Sammlung Informatik I Gábor Zogg 5. Klassen, Abstrakte Datentypen 6. Speicherverwaltung 8 Sammlung Informatik I Gábor Zogg 7. Kompilieren normal: g++ -Wall –o outputname filename.C in Objectfile kompilieren: g++ -Wall –c –o outputname.o filename.C Objectfiles einbinden: g++ -Wall –o outputname objectfile.o objectfile2.o filename.C aggressive Optimierung: g++ -Wall –O2 –o outputname filename 9 Sammlung Informatik I Gábor Zogg 8. Referenz // Zeilenkommentar /* ... */ langer Kommentar // PRE pre-condition // POST post-condition #include "file.h" #include <Standardbibliothek> #include <algorithm> std::swap(iterator a, iterator b) vertauscht den Inhalt, auf den der Iterator zeigt std::iter_swap(iterator a, iterator b) vertauscht die Iteratoren #include <cassert> assert ( bool-expr ); bricht Programm ab, wenn false #include <iostream> std::cin >> var; einlesen der Eigabe in der Shell in die Variable var std::cout << "Text" << Variable << std::endl(); Ausgabe auf die Shell std::getline(std::cin, var); Einlesen einer einzelnen Zeile der Eingabe #include <limits> std::numeric_limits<any>::epsilon() Maschinen-Epsilon (Abweichung vom Wert) std::numeric_limits<any>::max() grösster Inhalt ohne overflow std::numeric_limits<any>::min() kleinster Inhalt ohne underflow #include <string> std::string Datentyp string std::string::iterator Iterator auf ein Zeichen im string std::string::const_iterator konstanter Iterator auf ein Zeichen im string string.begin() das erste Zeichen im string string.end() zeigt hinter das letzte Zeichen im string string.length() Länge des strings string[i] das i-te Zeichen im string (als char) #include <vector> std::vector<any> Datentyp vector std::vector<any> (unsigned int, element of any) Definition eines vectors (Anzahl, Wet) std::vector<any>::iterator Iterator auf ein Element des vectors std::vector<any>::const_iterator konstanter Iterator auf ein Element des vectors std::vector<any>::reverse_iterator Iterator von hinten (umgekehrt) std::vector<any>::const_reverse_iterator vector.begin() zeigt auf das erste Element des vecors vector.end() zeigt hinter das letzte Element des vectors vector.rbegin() zeigt von hinten auf das erste Element des vectors (auf das letzte) vector.rend() zeigt von hinten hinter das letzte Element des vectors (vor das erste) vector.push_back(var) hängt dem vector vorne ein Element an vector.push_forth(var) hängt dem vector hinten ein Element an do { ... } while ( bool-expr ) for ( init ; exit bool-expr; change ) { ... } if ( bool-expr ) { ... } else { ... } return any; while ( bool-expr ) { ... } 10