Einführung in das Programmieren für Technische Mathematiker Einführung in C++ C++ Marcus Page, MSc. Prof. Dr. Dirk Praetorius I Was ist C++ I Programmierparadigmen I C++ im Vergleich mit C Fr. :15-11:5, Freihaus HS 8 Institut für Analysis und Scientific Computing 1 Programmierparadigmen I fundamentaler Programmierstil I Sprachen unterscheiden sich im Aufbau Klassifizierung von Programmiersprachen I Es geht nicht um das was sondern um das wie I bestimmen Entwurf und Design von PS I Imperativ, Deklarativ, Objektorientiert Imperative Programmierparadigmen I (Assemblersprachen) I Strukturierte Programmierung I Prozedurale Programmierung I Modulare Programmierung 2 3
Assemblersprachen I sehr maschinennahe Programmierung I abhängig von der aktuellen Architektur I keine Schleifen / Strukturen wie etwa in C I Kenntnis des Prozessors wichtig I manueller Zugriff auf einzelne Register I Beispiel "Hello World" 1.data 2 out:.asciiz "Hallo Welt" 3 # die Zeichenkette zum Ausgeben (als Label) 5.text 6 main: li $v0, 7 # Befehl ( print_string ) in Register schreiben 8 9 la $a0, out # Argument für den Systemaufruf in das 11 # Argumentregister schreiben 12 13 syscall 1 # Ausführung der Systemfunktion (Ausgabe) 15 16 li $v0, 17 # Befehl ( exit ) in Register schreiben 18 19 syscall 20 # Ausführung der Systemfunktion (Programmende) Strukturierte Programmierung I Im Laufe der Zeit wurden Programme größer I mehr Leute mussten programmieren I manuelle Registerzuweisung zu aufwändig I leicht verständliche Sprachen nötig Programmierer konzentriert sich auf Problem nicht auf technischen Hintergrund I Strukturen wurden wichtig Programme müssen lesbarer werden einfache Schleifen / Verzweigungen I Beispiel: BASIC 5 Strukturierte Programmierung I Beispiel in BASIC 1 INPUT "What is your name: ", U$ 2 20 PRINT "Hello "; U$ 3 30 INPUT "How many stars do you want: ", N 0 S$ = "" 5 50 FOR I = 1 TO N 6 60 S$ = S$ + "*" 7 70 NEXT I 8 80 PRINT S$ 9 90 INPUT "Do you want more stars? ", A$ 0 IF LEN(A$) = 0 THEN GOTO 90 11 1 A$ = LEFT$(A$, 1) 12 120 IF A$ = "Y" OR A$ = "y" THEN GOTO 30 13 130 PRINT "Goodbye "; U$ 1 END I Ausgabe: What is your name: Mike Hello Mike How many stars do you want: 7 ******* Do you want more stars? yes How many stars do you want: 3 *** Do you want more stars? no Goodbye Mike Prozedurale Programmierung I Probleme werden komplexer Programme werden länger I Ideen: Wartebarkeit, Wiederverwendbarkeit einzelne Komponenten auslagern einzeln testen später zusammenfügen verwende Blöcke I Beispiele: Fortran, COBOL, C, Pascal 6 7
Prozuderale Programmierung I Beispiel in PASCAL 1 program stars; 2 3 procedure plotstars(amount : integer); var 5 i : integer; 6 begin 7 for i := 1 to amount do write( * ); 8 writeln( ); 9 end; 11 var 12 amount : integer; 13 answer : char; 1 begin 15 repeat 16 writeln( how many stars do you want? ); 17 readln(amount); 18 plotstars(amount); 19 writeln( do you want more stars? (y/n) ); 20 readln(answer); 21 until answer <> y ; 22 end. I Ausgabe: how many stars do you want? 12 ************ do you want more stars? (n) n Modulare Programmierung I verbinde kleinere Programmteile zu Modulen Daten werden gebündelt weitere Erhöhung der Übersichtlichkeit I Erhöhung der Wiederverwendbarkeit benutze alles wieder soweit es geht verringert Fehlerquellen spart Arbeit I Beispiele: Modula-2, Oberon, Ada, (C) I Beispiel: Struktur Shape 1 #include <stdio.h> 2 3 typedef struct _Shape_ { 5 // type 1 = line, type 2 = square 6 int type; 7 int size; 8 } Shape; 8 9 Modulare Programmierung 1 void plotshape(shape s) 2 { 3 int i, j; if (s.type == 1) 5 { 6 for (i = 1; i <= s.size; i++) 7 {printf("*");} 8 printf("\n"); 9 } else 11 { 12 for (i = 1; i <= s.size; i++) 13 { 1 for (j = 1; j <= s.size; j++) 15 {printf("*");} 16 printf("\n"); 17 }}} 18 19 int main (int argc, const char * argv[]) 20 { 21 Shape myshape, myshape2; 22 myshape.type = 1; 23 myshape.size = 3; 2 myshape2.type = 2; 25 myshape2.size = ; 26 27 plotshape(myshape); 28 plotshape(myshape2); 29 } Objektorientierte Programmierung I Problem: einfache Module zu unflexibel lässt sich nicht auf beliebige Formen anwenden was passiert bei Rechtecken (zwei Größen)? I Daten lassen sich schlecht mit Funktionen kapseln Software schlecht zu warten I Idee: Gemeinsamkeiten nur einmal programmieren nur Unterschiede abwandeln I Vererbung I Klassenhierarchie I Kapsle Daten mit Funktionen I Beispiele: C++, Java I Ausgabe: *** **** **** **** **** 11
Objektorientierte Programmierung Generische Programmierung I stellen eine Weiterentwicklung der OO dar I Algorithmen für allgemeine Datentypen parametrische Polymorphie I Code möglichst allgemein generieren I im Anwendungsfall konkretisieren I z.b.: Sortieralgorithmen nicht nur für Zahlen, Strings I Beispiele: C++, Java I alle Typen können auf plot zugreifen Rechteck sind nur mehrere Linien... 12 13 Deklarative Programmierung Klassifikation von Programmiersprachen I Beschreibung des Problems steht im Vordergrund I Lösungsweg wir automatisch ermittelt I es geht darum was gelöst werden soll I das wie ist nicht so relevant I verwendet hauptsächlich Rekursion funktionale Sprachen I keine Anweisungen, nur Ausdrücke I Beispiele: LISP, ProLog, SQL, Haskell quicksort [] = [] quicksort (x:xs) = quicksort [n n<-xs, n<x] ++ [x] ++ quicksort [n n<-xs, n>=x] 1 15
sonstige Unterschiede zwischen Programmiersprachen I Compiler / Interpreter wann wird Code übersetzt / ausgeführt auch Mischung möglich I Plattformunabhängigkeit Internetanwendungen I Verbreitung der Sprache gibt es Bibliotheken / support / Foren I Ziele der Sprache warum wurde die Sprache entwickelt? (universell / speziell / Lernzwecke) I jede Sprache hat Vor- und Nachteile I es gibt für jede Sprache sinnvolle Probleme I beliebige Programme immer möglich aber: Starcraft II, Photoshop in Assembler? Treiber in Java? Hello World in Brainfuck I Ziel: Turing-vollständige PS mit kleinem Compiler I kompletter Befehlssatz enthält 8 Befehle I 9 Compiler mit 98 Bytes (MS-DOS) 1 ++++++++++ 2 [ Vorbereitende Schleife 3 >+++++++>++++++++++>+++>+<<<<- ] 5 >++. Ausgabe von H 6 >+. Ausgabe von e 7 +++++++. l 8. l 9 +++. o >++. Leerzeichen 11 <<+++++++++++++++. W 12 >. o 13 +++. r 1 ------. l 15 --------. d 16 >+.! 17 >. Zeilenvorschub 18 +++. Wagenrücklauf 16 17 Good to know Was ist C++ I Eine Weiterentwicklung von C I Verwendung neuer Programmierparadigmen I Erlaubt völlig neue Lösungswege I Erlaubt problemnahe Programmierung I Ziele beim Entwickeln der Sprache Kompatibilität ) keine Änderung der Syntax Vielseitige Einsetzbarkeit (Eigene Datentypen können entworfen werden) Verwaltungsaufwand minimieren Strukturierung erleichtern Strenge Typisierung (erleichtert Fehlerfindung) Stärkere Zugriffskontrolle I C++ ist eine höhere Programmiersprache I Entwicklung ab 1979 bei AT&T Entwickler: Bjarne Stroustrup I Erweiterung von C Einführung eines Klassenkonzeptes (C with classes) bessere Wiederverwendbarkeit bessere Wartbarkeit Abwärtskompatibel (zu C) ) keine Syntaxkorrektur I Heute: voll objektorientiert ISO genormt I Inspiration für andere Sprachen C#, Java I Compiler: g++, gpp frei verfügbar Microsoft Visual C++ Compiler Borland C++ Compiler 18 19
Was kann mir helfen? I Endlose Anzahl an Büchern Die C++ Programmiersprache Jetzt lerne ich C++ C++ in 21 Tagen C++ für C Programmierer I Online Tutorien einfach googlen I C++ API C++ Befehlsreferenz http://en.cppreference.com/w/cpp I Entwicklungsumgebungen I engl. Integrated Development Environment (IDE) Erleichtern das Programmieren selbst farbliches Hervorheben automatisches Einrücken automatische Codeergänzung code folding debugger Einige C++ IDEs I Netbeans (frei verfügbar) http://www.netbeans.org/ I Eclipse (frei verfügbar) http://www.eclipse.org I Microsoft Visual Studio (sauteuer) I Microsoft Visual Studio Express (frei) http://www.microsoft.com/germany/express/ I Xcode (frei für Mac OS) App Store ;) I können mehr als nur C++ I werden in der Übung angeschaut 20 21 Hello World 1 # include <iostream> 2 3 int main() { 5 std::cout << "Hello World!\n"; 6 return 0; 7 } Standardbibliothek I Ausgaben I Eingaben I Strings I Container I Speichern unter helloworld.cpp I Standardbibliothek für Ein- und Ausgabe in C++ heißt iostream I cout ist der Standard-Ausgabestream kann unterschiedliche Datentypen übernehmen I Notation :: deklariert den Namensbereich I Operator «übergibt sein zweites Argument an den Ausgabestream I main hat Rückgabewert int 1 # include <iostream> 2 using namespace std; 3 int main() 5 { 6 cout << "Hello World!\n"; 7 } I Ausgabe: Hello World! I mehr zu namespaces später 22 23
Datentyp string 1/2 3 using namespace std; 5 int main() { 6 string str1 = "Hallo"; 7 string str2 = "Welt"; 8 string str3 = str1 + " " + str2; 9 cout << str3 + "!\n"; 11 str3.replace(6,, "Peter"); 12 cout << str3 + "!\n"; 13 } I Ausgabe: Hallo Welt! Hallo Peter! I Strings sind mächtiger als char* I liefert eine Reihe nützlicher Operationen + zur Konkatenation replace zum ersetzen von Teilstrings substr zum auslesen von Teilstrings length zum auslesen der Länge u.v.m. I Datentypen können Methoden haben Prinzip der Datenkapselung Sie enthalten mehr als nur die Zeichen (Unterschied zu C) Datentyp string 2/2 3 #include <stdio.h> using namespace std; 5 6 int main() { 7 string str1 = "Hallo"; 8 string str2 = "Welt"; 9 string str3 = str1 + " " + str2; 11 printf("%s\n", str3.c_str()); 12 cout << str3 + "\n"; 13 } I Ausgabe: Hallo Welt Hallo Welt I Inhalt mittels c str() erreichbar Das sind die bekannten char-arrays aus C Zugriff über name.c str() können mittels printf ausgegeben werden I Wichtig: string 6= char-array 2 25 Eingaben Datentyp bool I in C gibt es keinen logischen Datentyp I Abhilfe schafft Interpretation 0 = false 1 = true I das könnte so aussehen: #define false 0 #define true 1 typedef int bool; I könnte aber auch mit Abfragen gelöst werden I C++ enthält logischen Datentyp bool Werte true und false I implizite Konversion arithmetischer Typen 0 entspricht false alles andere entspricht true 3 using namespace std; 5 int main() 6 { 7 string str; 8 cout << "Geben Sie Ihren Namen ein\n"; 9 cin >> str; cout << "Hallo " << str << "!\n"; 11 } I Eingabe: Praetorius Ausgabe: Hallo Praetorius! I Eingabe: Dirk Praetorius Ausgabe: Hallo Dirk! I Verwende getline für ganze Zeile 3 using namespace std; 5 int main() 6 { 7 string str; 8 cout << "Geben Sie Ihren Namen ein\n"; 9 getline(cin, str); cout << "Hallo, " << str << "!\n"; 11 } I Eingabe: Dirk Praetorius Ausgabe: Hallo, Dirk Praetorius! 26 27
Vektoren 1/3 Vektoren I Verwendung als dynamische Arrays I ohne alloc, malloc I sind Container für beliebige Datentypen (mehr dazu später) 3 using namespace std; 5 struct Eintrag { 6 string name; 7 int nummer; 8 }; 9 int main() 11 { 12 Eintrag telbuch[3]; 13 telbuch[0].name = "Peter Pan"; 1 telbuch[1].name = "Wolverine"; 15 telbuch[2].name = "Angela Merkel"; 16 cout << telbuch[2].name + "\n"; 17 } I Ausgabe: Angela Merkel I Verwendung sinnvoll falls Größe bekannt I Problem: Speicher nicht dynamisch erweiterbar Lösung in C: Pointer, malloc, realloc sehr mühsam und unübersichtlich I Lösung in C++: Vektoren 28 29 Vektoren 2/3 3 #include <vector> using namespace std; 5 6 struct Eintrag { 7 string name; 8 int nummer; 9 }; 11 int main() 12 { 13 vector<eintrag> telbuch(3); 1 telbuch[0].name = "Peter Pan"; 15 telbuch[1].name = "Wolverine"; 16 telbuch[2].name = "Angela Merkel"; 17 cout << telbuch[2].name + "\n"; 18 } I Ausgabe: Angela Merkel I Vektoren sind C++ Standardcontainer können beliebige Datentypen übernehmen dienen zum Verwalten von Datenmengen I Verwendung: vector<type> name(size); Achtung, nicht verwechseln: vector<eintrag> buch(00); 00 Elemente vector<eintrag> buecher[00]; 00 Vektoren Vektoren 3/3 3 #include <vector> using namespace std; 5 6 struct Eintrag { 7 string name; 8 int nummer; 9 }; 11 int main() 12 { 13 vector<eintrag> telbuch(3); 1 telbuch[0].name = "Peter Pan"; 15 cout << "size: " << telbuch.size() << endl; 16 telbuch.resize(telbuch.size()+); 17 cout << "size: " << telbuch.size() << endl; 18 } I Ausgabe: size: 3 size: 7 I Speicher dynamisch veränderbar mittels resize I Viele hilfreiche Funktionen: size push back, pop back insert front, back uvm. I endl bewerkstelligt Zeilenumbruch 30 31
weitere Standardcontainer I list I queue I stack I deque I set I priority queue I set I multiset I map Ratschläge und Unterschiede zu C I Bibliotheken verwenden API verwenden I Standardbibliothek eher als andere I string anstelle von char* I vector<t> anstelle von T[] I cout anstelle von printf I Std. Bibliothek verwendet den Namensbereich std I multimap 32 33