Funktionales C++ zum Ersten WiMa-Praktikum 1, Teil C++, Tag 1 Christoph Ott, Büro: Helmholtzstr.18, E22 Tel.: 50-23575, Mail: christoph.ott@uni-ulm.de Institut für Angewandte Informationsverarbeitung 26.08.08 Christoph Ott 1
Programmieren unter Solaris/ Linux Wichtige Verzeichnisse:. &.. & ~ & / Wechseln in ein geeigneten Verzeichnis: cd Anlegen eines geeigneten Ordners: mkdir Inhalt eines Verzeichnisses: ls Schreiben von Programmcode: bspw. nedit oder vim Weitere Befehle: mv, cp ls -l rm, rm -r, rmdir 26.08.08 Christoph Ott 2
Unser erstes CPP-Programm main(){ first1.cpp Kompilieren mit: rechnername$ g++ first1.cpp besser mit: rechnername$ g++ -Wall first1.cpp Ausführen mit: rechnerneme$ a.out Was passiert? Nichts! Wichtig: Ihr befindet Euch in unserem Rechner-Pool Programmname endet auf.cpp Bausteine main, () und { Kompilieren und Ausführen (wie javac first.java & java first) 26.08.08 Christoph Ott 3
Ein bisschen schöner //Programm, das nichts tut /* ein weiterer, das Programm beschreibende Kommentar*/ first2.cpp int main(){ return 0; main() ist eine Funktion, signalisiert das Hauptprogramm (Java: ähnlich, main als Methode) Rückgabewert von main() ist int 0 signalisiert Erfolg, andere Zahlen Fehler alternativ kann Programm auch über exit() (an jeder Stelle) verlassen werden Kommentare wie in Java 26.08.08 Christoph Ott 4
Nun auch mit Ausgabe #include <iostream> first3.cpp int main(){ std::cout << Hurra, es funktioniert! ; std::cout << std::endl; return 0; iostream wird zur Ein- und Ausgabe benötigt Einbinden von Bibliotheken z.t ähnlich wie bei Java (import) jedoch: Bei #include wird der Code genau an diese Stelle kopiert cout ist keine Funktion, sondern ein Objekt << ist ein Operator und somit funktions-ähnlich (Pfeilrichtung beachten) Verstehen muss man das an dieser Stelle nicht! 26.08.08 Christoph Ott 5
Namensräume #include <iostream> using namespace std; first4.cpp int main(){ cout << Hurra, es funktioniert! ; cout return 0; Verwendung des Namensraums std zur Vermeidung umständlicher Schreibweise Alternativ: cout << "Hurra, es funktioniert!" cout << "Hurra, es funktioniert!" oder 26.08.08 Christoph Ott 6
Und mit Eingabe #include <iostream> using namespace std; int main(){ bremsweg.cpp Verwendung Namensraum std double kmh, bremsweg; cout << "Wie schnell (in km/h)? "; cin >> kmh; bremsweg=(kmh/10)*(kmh/10); cout << "Dein Bremsweg beträgt: " << bremsweg << Meter return 0; zwei erste Variablen Textausgabe Einlesen 1. Variable Berechnen 2. Variable Kombinierte Ausgabe Newline 26.08.08 Christoph Ott 7
Überblick Datentypen Das alles gab es in Java auch schon: bool 1 Byte = 256 Werte (eigentlich 2) ((un)signed) short (int) ((un)signed) int bei uns 4 Bytes = 2³² Werte ((un)signed) long (int) float double 8 Bytes = 2⁶⁴ Werte long double ((un)signed) char 1 Byte = 256 Werte 26.08.08 Christoph Ott 8
Variablen Variablen haben stets einen (Daten-)typ alle Variablen müssen zuerst angelegt werden bevor ihnen Werte zugewiesen werden (kann in einem Schritt geschehen) es gibt intrinsische und nicht-intrinsische Datentypen intrinsische Datentypen können ohne vorherige Bekanntmachung in einem C++-Programm verwendet werden (bspw. bool, int, double, char). nicht-intrinsische Datentypen müssen vor ihrer Verwendung bekannt gemacht (deklariert) werden (bspw. Strings). #include <iostream> using namespace std;... string s="servus!";... 26.08.08 Christoph Ott 9
Gültigkeit/Veränderbarkeit von Variablen konstant vs. variabel const int x=1; global vs. lokal Lebensdauer bis zum Ende des Gültigkeitsbereichs { statisch Gültigkeit (d.h. Sichtbarkeit) lokale, Lebensdauer bis Programmende (d.h. global), deshalb Merker -Variable (interessant bei Funktionen) static int y; extern Deklaration von externer Variable, Definition sonstwo extern int z; 26.08.08 Christoph Ott 10
Typumwandlung implizit: ohne eigenes Zutun int i1=0.25; i1=0 (Compiler-Warnung) int i2=1/4; i2=0 (Keine Typ-Konvertierung) double d1=1/4; d1=0 double d2=1./4; d2=0.25 double d3=1.0/4; d3=0.25 explizit: mit Cast-Operator double d1=double(1)/double(4); oder aber wie in Java: double d2=(double)1/(double)4; 26.08.08 Christoph Ott 11
Operatoren Zuweisungoperator: int x=3; arithmetische Operatoren: + - * / % logische Operatoren: &&! bitweise Operatoren: nicht relevant Vergleichsoperatoren: ==!= < > <= >= vereinfachende Operatoren: += -= /= *= %= Inkrement/ Dekrement: ++ -- (vor-/nachgestellt) Sequenzoperator:, Bsp: int a, b, c; 26.08.08 Christoph Ott 12
Priorität Bezeichnung Symbole Priorität Bewertung von Klammern () [] 14 links Arithmetische Negation - 13 rechts Logische Negation! 13 rechts Inkrement ++ 13 rechts Dekrement -- 13 rechts Arithmetische Operatoren * / % 12 links + - 11 links Vergleichsoperatoren > >= < <= 9 links ==!= 8 links Logische Operatoren && 4 links 3 links Zuweisungsoperatoren = += -= *= /= %= 2 rechts Sequenzoperator, 1 rechts Auswertungsreihenfolge folgt fest vorgegebenem, nachschlagbarem Schema Umgehungsmöglichkeit: runde Klammern 26.08.08 Christoph Ott 13
Kontrollstrukturen Wie bisher funktionieren: if-anweisung: if (bool. Ausdruck) Anweisung; else Anweisung; nicht notwendig for-schleife: for (Startanweisung; bool. Ausdruck; Sukzessive Anweisung) while-schleife: while (bool. Ausdruck) Anweisung; do-while-schleife: do Anweisung while (bool. Ausdruck) Unterschied? Wann sind geschweifte Klammern notwendig? 26.08.08 Christoph Ott 14
Kontrollstrukturen 2 Wie bisher funktionieren: switch-verzweigung: switch(variable){ case Konstante: Anweisung; break;... default: Anweisung; Verlassen von Kontrollstukturen: return; exit; break; continue; Konditional-Operator: bool. Ausdruck?true-Ausdruck:false-Ausdruck 26.08.08 Christoph Ott 15
Bsp. if-anweisung #include <iostream> using namespace std; if1.cpp int main(){ char geschlecht; cout << "Geschlecht: (m/w)" cin >> geschlecht; if (geschlecht=='m') cout << "Guten Tag, der Herr!" if (geschlecht=='w') cout << "Guten Tag, die Dame!" else cout << "Guten Tag, wer auch immer!" return 0; Fallunterscheidung je nach Wert der Variablen 'geschlecht' Tut dieses Programm was es tun soll? 26.08.08 Christoph Ott 16
Bsp. if-anweisung (Lösung) #include <iostream> using namespace std; if2.cpp int main(){ char geschlecht; cout << "Geschlecht: (m/w)" cin >> geschlecht; if (geschlecht=='m') cout << "Guten Tag, der Herr!" else{ if (geschlecht=='w') cout << "Guten Tag, die Dame!" else cout << "Guten Tag, wer auch immer!" return 0; 26.08.08 Christoph Ott 17
Bsp. for-schleife #include <iostream> using namespace std; for.cpp int main(){ int max; cout << "Maximale Zahl" cin >> max; int sum=0; for (int i=1; i<=max; i+=2) sum+=i; cout << "Summe: " << sum return 0; Alle ungeraden Zahl bis 'max' durchlaufen und aufsummieren Passt die Klammerung? 26.08.08 Christoph Ott 18
while-schleife vs. do-while-schleife #include <iostream> #include <cmath> using namespace std; while.cpp #include <iostream> #include <cmath> using namespace std; dowhile.cpp int main(){ double zahl; cout << "Start-Zahl, bitte" cin >> zahl; while(zahl>=0){ cout << "Zahl: " << zahl << ", Wurzel: " << sqrt(zahl) zahl--; return 0; Unterschied? int main(){ double zahl; cout << "Start-Zahl, bitte" cin >> zahl; do { cout << "Zahl: " << zahl << ", Wurzel: " << sqrt(zahl) zahl--; while(zahl>=0); return 0; 26.08.08 Christoph Ott 19
Bsp. switch-anweisung #include <iostream> using namespace std; switch.cpp int main(){ int zahl; cout << "Geben Sie eine Zahl ein" cin >> zahl; switch(zahl%3){ case 0: cout << "Rest 0" break; case 1: cout << "Rest 1" break; case 2: cout << "Rest 2" break; default: cerr << "unerwuenschter Zustand" exit(1); return 0; Ausgabe auf Standardfehlerausgabe Beenden mit Exit-Status 1 Was passiert ohne 'break'? 26.08.08 Christoph Ott 20