Informatik 1 (251-0832-00) D-MAVT F2010 Einführung C++
Organisatorisches Yves Brise, ybrise@inf.ethz.ch, CAB G19.3 Homepages: http://www.inf.ethz.ch/personal/ybrise/data/teaching/ifmv/f10/ http://www.info1-mavt.inf.ethz.ch Übungsabgabe: Per Email bitte [IFMV10] <Name>, <Übung> ins Betreff Als Ausdruck in der Übungsstunde Keine compilierten Dateien! Nur.cpp,.C, o.ä. Punktevergabe: 1, 0.75, 0.5, 0.25 oder 0 Testat: 9 von 12 Punkten Bei Krankheit oder Militär werden 0.75 Punkte angerechnet
Disclaimer Die Referenz für den Prüfungsstoff sind Prof. Arbenz Folien. Diese Folien sind nur eine Dienstleisung. Zusätzliches Material auf diesen Folien ist nicht Prüfungsstoff. Fragen! Fragen! Fragen! In der Übungsstunde Vor der Übungsstunde (Wünsche für Stoff) Mitarbeit während der Übungsstunde, Schnellübungen Üben! Üben! Üben! Programmierfrust muss selbst erlebt werden.
Real Programmers vs. Quiche Eaters Real Programmer Quiche Eater Nikaus Wirth (*1934) ist intuitiver Programmierer (hat s im Blut und ist Autodidakt) kann in seiner Programmiersprache schon alles und lehnt andere Programmiersprachen deshalb ab kann und braucht keine Theorie Macht sich Gedanken über gutes Programmieren will mit seiner Programmiersprache gar nicht alles können, sondern nur das Richtige ist meist Akademiker
Real Programmers vs. Quiche Eaters Real Programmer Quiche Eater C++ Nikaus Wirth (*1934) Artikel von Ed Post, 1983, wurde zum Informatik-Klassiker Real Programmers don t use Pascal programmiert in C, Fortran oder Assembler Bekanntester CH-Informatiker 1968-1999 Professor an der ETH Entwickler der Programmiersprachen Pascal (1968), Modula-2 (1977) und Oberon (1986)
Syntax und Semantik Syntax Was ist ein C++ Programm? Ist es grammatikalisch korrekt? korrekt Die Tasse liebt ein Gebäude. Semantik Was bedeuted ein C++ Programm? Welchen Algorithmus realisiert es? fragwürdig
Die C++ Bibel 700+ seitiges Dokument Legt Syntax und Semantik von C++ fest Neuauflage schon verspätet (Rev 2003, TR 2006) schwierig zu lesen, kostenpflichtig vor allem für Compiler-Entwickler
Was ist mit Java? Java hat viele Vorteile: Strikt objektorientiert Läuft in einer sicheren Umgebung Ist sehr portabel Bound checking grosse Standardbibliothek Aber: Die echten Programmierer sind nicht zufrieden (Optimierung, Zugriff auf Systemresourcen). Zum Glück sind die Sprachen sehr ähnlich.
Register Machine / von Neumann Rechner Instruktionen sind für gewönlich sehr einfach (z.b. inc, add, mul, mov, jump) Sogenannte Assembly Sprachen sind plattformabhängig. Der Compiler muss für jede Plattform neu geschrieben werden.
Algorithmus vs. Programm أ,& -12 ا 0 -./" +, )*&" ا)'&ارز"! Abū ʿAbdallāh Muḥammad ibn Mūsā al-khwārizmī (ca. 780 - ca. 850), Begründer der Algebra und erster, der lineare Gleichungen systematisch löst. Programm Algorithmus Eine endliche Sequenz von Anweisungen zur Lösung einer bestimmten Aufgabe. Bsp: Quadratische Gleichung, Kochrezept Sollte im Idealfall einen Algorithmus in einer bestimmten Programmiersprache umsetzen, kann aber auch etwas sinnloses tun.
Datenstrukturen Felder Listen Bäume Zeiger (pointer) in C++ zeigen auf ein Objekt Datenstrukturen + Algorithmen = Programme Wirth (1975)
Der Compiler Quelltext:.cpp,.C Dateien Objektdateien:.o Programmdateien:.exe (Windows), keine Endung Quelltext:.cpp,.C Dateien
Ihr erstes C++ Programm #include <iostream> using namespace std; int main() { cout << "Hello World" << endl; return 0; }
Code::Blocks IDE Integrated Development Environment ist ein Programm, welches die Verwaltung der Quelldateien erleichtert, Software Projekte unterhält und das sogenannte Debugging ermöglicht. Eigentlich sind Programme nichts anderes als Textdateien. Code::Blocks fügt nur ein wenig mehr Komfort hinzu (aber auch Komplexität) http://www.codeblocks.org/ Windows: Stellt sicher, dass ihr alles installiert (g++)
Kommandozeile (UNIX) Textbasiertes Fenster zu den Innereien ihres Computers Siehe unix_intro.pdf Manuelles Compilieren von Programmen Aufrufen von Programmen Dateiverwaltung cd, ls, mv, cp, g++ Unter Windows: cmd.exe
C++ Identifier Definition Ein C++ identifier ist eine Sequenz von Zeichen, die aus den 52 Buchstaben a..z und A..Z, den zehn Ziffern 0..9 und den Unterstrich _ bestehen. Das erste Zeichen muss ein Buchstabe sein. Nicht als Variablennamen zugelassen Es gibt reservierte Namen in C++. Die Liste ist ziemlich lang (siehe Internet C++ keywords ). Z.B. if, for, while, do, int, bool, char, enum, new, void, break, naked,...
Schnellübung Welche der folgenden Zeichenketten sind gültige C++ identifier? a) identifier b) int c) x_i d) 4x e) A99_ f) _tmp g) T# h) x12 b Lösung: d) und f) beginnen nicht mit einem Buchstaben. g) enthält das Zeichen #. b) ist ein reserviertes Wort, aber an sich ein gültiger identifier. Alle anderen sind gültige identifier.
Kommentieren und Einrücken #include<iostream> int main() {std::cout<<"is a= positive? ";int a;std::cin>>a;if(a>=0){ std::cout<< Yes\n ;}else {std::cout<< No\n ;}return 0;} Dem Compiler ist es egal! Uns aber nicht! Faustregel: Der Inhalt von {...} wird eingerückt. #include<iostream> int main(){ std::cout << "Is a= positive? "; int a; std::cin >> a; if (a >= 0) { std::cout << Yes\n ; } else { std::cout << No\n ; } return 0; }
Kommentare in C++ #include<iostream> /* Program that reads a integer number a and outputs Yes if it is positive, and No if it is negative.*/ int main(){ std::cout << "Is a= positive? "; int a; // variable declaration std::cin >> a; // read number if (a >= 0) { // check positive std::cout << Yes\n ; // output } else { // a < 0 std::cout << No\n ; // output } return 0; // return statement } Blockkommentare Zeilenkommentare
Kommentare in C++ Jedes gute Programm hat Kommentare Werden vom Compiler ignoriert Dokumentieren, was das Programm macht. Ich wette mit jedem Anfänger-Programmierer, dass er mir in 12 Monaten nicht mehr erklären kann, was sein erstes kompliziertes (aber unkommentiertes) Programm macht.
Variablen in C++ Variablendefinition int a = 1; Typenbezeichnung Ende Befehl Variablenname Literal zur Initialisierung Zuweisungsoperator Literale sind konstante Werte von festen Typ.
Typen in C++ ganze Zahlen int a = 1; bool b = true; char c = a ; unsigned int u = 1u; float f = 1.5f; double d = 2.5; Wahrheitswerte Buchstaben natürliche Zahlen reelle Zahlen reelle Zahlen, immerhin bessere Genauigkeit als float Literale haben unterschiedliche Syntax!
Algebraische Operatoren Primarschule revisited! Die Operatoren sind Plus (+), Minus (-), Mal (*), Durch (/) und Modulo (%) Regel 1: Punkt (/,*,%) vor Strich (+,-) Bsp: 1+2*3 1+(2*3) Regel 3: Unär vor binär Bsp: -3*2 (-3)*2 Regel 2: Auswertung von links nach rechts Bsp: 1+2+3 (1+2)+3
Ausdrücke I Definition Ausdrücke sind zusammengesetzt aus Literalen, Operatoren und Ausdrücken. Bsp: 1+2/3%4 Ausdrücke haben einen Wert, einen Typ und einen Effekt. Kennen Sie schon! Bsp: Zuweisungsoperator (=) Dazu später mehr! a = 2;
Ausdrücke II Bei gemischten Ausdrücken wird automatisch zum allgemeineren Typ konvertiert. bool < int < float < double Bsp: 1+2.0f 1.0f+2.0f int nach float 3.0/0.5f 3.0/0.5 float nach double
Schnellübung Sind folgende Ausdrücke gültig? Falls ja, werten sie sie aus! Welchen Wert und Typ haben die Ausdrücke? Lösung: a) 1+(2*3) b) 7/3 c) 3.5+4 d) 4*3%2 e) (1 f) 1.0f*5/2 g) -2*3+4*5 a) 7 int b) 2 int c) 7.5 double d) 0 int e) ungültig f) 2.5 float g) 14 int
Ihr erstes C++ Programm #include <iostream> using namespace std; int main() { cout << "Hello World" << endl; return 0; } Die using Direktive Streams als Operatoren #include <iostream> int main() { std::cout << "Hello World" << std::endl; return 0; }
Eine Berechnung #include <iostream> int main() { std::cout << Eingabe von a...\n ; int a; std::cin >> a; Berechnet die achte Potenz von a } // computation int b = a * a; // b = a^2 b = b * b; // b = a^4 b = b * b; // b = a^8 std::cout << Resultat: ; std::cout << b << std::endl; return 0; Eingabe einer Zahl Verwendung von Eingabestream
Explizite Typenkonvertierung Sogenannte cast expressions, übliche Schreibweise: type(expr) Bsp: int(9.5+0.6) (double)2+1.5f (double)(7/3) Es wird abgerundet Wie unärer Operator Beide Klammern erlaubt Eigentlich besser: static_cast<int>(9.5+0.6)
Schnellübung Welchen Wert und Typ haben die Ausdrücke? Lösung: a) 1.0+(double)2*3 b) int(13.0/2) c) int(2.3)-float(3) d) 5/(float)2 e) float(5)/2 f) double((int)1.5) a) 7.0 double b) 6 int c) -1.0f float d) 2.5f float e) 2.5f float f) 1.0 double