Programmieren in C/C++ und MATLAB Sven Willert Sebastian Bauer Institut für Geowissenschaften Christian-Albrechts-Universität zu Kiel Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 2-1 Datentypen und Formate Mit der Festlegung des Datentyps wird die Art bestimmt, mit der der Computer die Informationen interpretiert und wie sie gespeichert werden. Ebenso wird damit die Art der Operationen festgelegt, die mit diesen Datentypen erlaubt sind. C++ bietet einige fest eingebaute Datentypen, es können aber auch selber welche geschaffen werden (Klassen). Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 2-2 Elementare Datentypen Logische (boolsche) Wert: Diese können die Werte „true“ oder „false“ annehmen. bool ist_richtig; Zeichen (character): Damit können Zeichen dargestellt werden sowie die Ziffern 0-9 char a = ‘B‘; Integer: Damit können ganze Zahlen dargestellt werden int i = ‐9; Die Ganzzahlen gibt es in mehreren Größen: short int 2 Byte -32768 ... 32767 int 4 Byte -2147483648 ... 2147483648 long int 4 oder 8 Byte -9.2 1018 ... 9.2 1018 oder wie int Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 2-3 Elementare Datentypen Gleitkommazahlen: (Zahlen mit Nachkommastellen). Diese gibt es in einfacher und doppelter Genauigkeit: float x; double y; float 4 Byte -1.2 10-38 ... 1.2 1038 double 8 Byte -1.8 10-308 ... 1.8 10308 Auch wenn die Zahlen Gleitkommazahlen heißen, werden Sie mit einem Dezimalpunkt angegeben! void: Damit ist ein nicht existierender Wert gemeint. Wird auch verwendet um anzuzeigen, dass ein Unterprogramm keine Übergabeparameter braucht oder Werte zurück liefert. Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 2-4 Implizite Typumwandlung Meist kann man Variablen oder Konstanten verschiedener Datentypen einander zuweisen. C++ macht die entsprechenden Umwandlungen automatisch. Dabei ist jedoch Vorsicht geboten, da unerwünschte Nebeneffekte auftreten können. Problemlos: Umwandlung von einem kleineren zu einem größeren Wertebereich: short ‐> integer float ‐> double Vorsicht im Umgekehrten Fall, da Wertebereich eventuell nicht ausreichend. Zuweisung von ganzen und Dezimalzahlen: Bei der Zuweisung von Dezimalzahlen zu Ganzzahlen werden die Nachkommastellen weggelassen: int i = 10.0/8.0; // Wert i: 1 Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 2-5 Explizite Typumwandlung Um Klarheit zu schaffen (auch was das gewünschte Ergebnis ist) ist immer die explizite Typumwandlung zu empfehlen. Das geschieht in C vermittels eines „cast“ (gießen, werfen). Dabei wird der Zieltyp explizit angegeben und in Klammern vor die Umzuwandelnde Variable gestellt (So auch in C möglich). double d=1.5; int i = (int)d; Ebenso kann die Variable in Klammern gesetzt werden: double d=1.5; int i = int(d); Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 2-6 Operatoren Variablen alleine nützen nicht viel, man möchte mit Ihnen auch etwas machen. C++ stellt sehr viele Operatoren bereit, die fast alle Sonderzeichen der Tastatur verwenden. Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 2-7 Operatoren (continued) Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 2-8 Operatoren Wichtig ist auch, in welcher Reihenfolge die Operatoren ausgewertet werden. Analog zur Mathematik („Punkt vor Strich“) ist eine Rangfolge oder Priorität den Operatoren zugeordnet. Diese entspricht der obigen Tabelle: 1) primäre Operatoren 2) unäre Operatoren 3) binäre Operatoren 4) Zuweisungsoperatoren Auch innerhalb der Gruppen existiert eine Reihenfolge, die ebenfalls der Tabelle entspricht (z.B. Multiplikation vor Addition). Beispiel: a+b*c == a+(b*c) != (a+b)*c Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 2-9 Funktionen Funktionen sind ein sehr wichtiges Sprachelement von C/C++. Eine Funktion ist ein in sich geschlossener Programmteil, der eine bestimmte Aufgabe erfüllt. Sie werden eingesetzt, um immer Wiederkehrende komplexe Operationen zugänglich zu machen und im die Komplexität des Programms zu verringern und so den Code übersichtlicher zu machen. int addition(int x, int y) { int z; z = x + y; return z; } Funktionen haben einen Rückgabewert („int“), einen Namen („addition“), eine Argumentliste („(int x, int y)“), den Funktionskörper (innerhalb der geschweiften Klammern („{„ und „}“) und die return-Anweisung für den Rückgabewert („return z;“) Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 2-10 Funktionen Rückgabewert: Jede Funktion in C++ muss einen Rückgabewert haben. Falls kein Rückgabewert sinnvoll ist, kann der Rückgabewert void verwendet werden – dann gibt die Funktion auch nichts zurück. Der Rückgabewert einer Funktion ist oft das Ergebnis der Operationen innerhalb der Funktion oder dienen der Statusabfrage, d.h. ob die Funktion fehlerfrei ausgeführt wurde. Die Funktion „addition()“ kann z.B. so verwendet werden: int main(void) { int a=5, b=2, c; c = addition(a,b); return 0; } Auch das Hauptprogramm hat einen Rückgabewert. Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 2-11 Funktionen Namen: Übliche Namenskonvention, keine Doppelbelegungen mit C++ Schlüsselwörtern (z.B. return) Argumentliste Eine Funktion arbeitet auf den Daten, die ihr lokal (d.h. innerhalb der Funktion vorliegen). Außer global (außerhalb der Funktion definierten) Variablen sind das die Parameter, die in der Argumentliste übergeben werden. Man kann keinen, einen oder mehrere Parameter (durch „,“ getrennt) angeben. Kein Parameter ist ein Argument vom Typ void; dieses kann auch weggelassen werden, allerdings müssen immer die beiden runden Klammern „()“ vorhanden sein. Für jeden Parameter müssen Datentyp und Namen angegeben werden. („addition(„int a, int b)“) Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 2-12 Funktionen Funktionskörper: Hier stehen die Anweisungen, die beim Aufruf der Funktion ausgeführt werden. Diese werden durch geschweifte Klammern umfasst. Die Funktionsparameter können wie normale Variablen verwendet werden. Aus einer Funktion heraus können andere Funktionen (einschließlich der Funktion selber -> Rekursion) aufgerufen werden. return - Anweisung Die Anweisungen in der Funktion werden abgearbeitet, bis das Programm ans Ende der Funktion oder zur return – Anweisung kommt. Diese legt fest, welcher Wert ans Hauptprogramm zurückgegeben wird (Variable, Konstante). Bei void Funktionen gibt man nur das Keyword „return;“ oder gar nichts an. Außerdem beendet die return – Anweisung die Funktion und kehrt ins Hauptprogramm zurück – dies muss nicht erst am Ende der Funktion sein. Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 2-13 Funktionen Funktions-Prototyp: Bevor eine Funktion verwendet werden kann, muss dem Compiler mitgeteilt werden, dass es sie gibt, welchen Namen und welche Parameter (mit Typ) und welchen Rückgabewert - Typ sie hat. Dies geschieht durch einen sog. Funktions-Prototyp. Dieser sieht aus wie die Funktion selber, nur ohne den Funktionskörper, der durch ein Semikolon „;“ ersetzt wird. Statt Typ und Namen der Argumente reicht die Angabe der Typen der Argumente (Komma-getrennt). Der Funktions-Prototyp ist die Deklaration der Funktion, die Funktion mit Funktionskörper ist die Definition. int addition(int x, int y); Die Funktions-Prototypen müssen vor dem Hauptprogramm (und der ersten Verwendung) angegeben werden, bei mehreren QuelltextDateien in der header-Datei (*.h). Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 2-14 Funktionen Überladen von Funktionen Im Gegensatz zu anderen Programmiersprachen wird in C++ eine Funktion anhand ihres Namens und der Argumentliste identifiziert, der sog. Signatur einer Funktion. Damit können Funktionen gleichen Namens aber mit unterschiedlicher Argumentliste verwendet werden. Dies wird Überladen (Overloading) genannt. int addition(int x, int y); double addition(double , double); //Prototyp ... double addition(double x, double y){ //Definition return x+y;} Bei Funktionsaufruf wird dann anhand der vorliegenden Funktionsparameter entschieden, welche Funktion aufgerufen werden soll. int a=3, b=5, c; double d=3.2, e=5.5, f; c = addition(a,b); // int‐addition() verwendet f = addition(d,e); // double addition() verwendet Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 2-15 Funktionen Überladen von main Eine besondere Funktion in C++ ist main(). Diese gibt es immer in mindestens zwei überladenen Varianten: int main(void); int main(int argc, char* argv[]); Bei der zweiten Version werden in das Hauptprogramm die Parameter übergeben, die beim Aufruf der Datei in der Kommandozeile nach dem Programmnamen mit angegeben werden. argc ist die Anzahl der Argumente. argc >= 1, da der Programmname das erste Argument ist. In argv stehen die Argumente (zweidimensionales Feld vom Typ char). Der Zugriff erfolgt über die eckigen Klammern: argv[2] liefert das dritte Argument (Achtung: C++ fängt bei Null an zu zählen. argv[0] ist der Programmname. So können Programme direkt beim Start durch die angegebenen Argumente (Optionen) gesteuert werden. Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 2-16 Standardeingabe und Standardausgabe Ein C++ Programm kann Daten von der sog. Standardeingabe lesen. Das ist im Normalfall die Tastatur. Im Batch-Modus kann auch die entsprechende Eingabe aus einer Textdatei gelesen werden. In C++ wird diese Eingabe von der Tastatur als stream (Strom) bezeichnet. Ein stream ist ein Objekt, das eine Folge von Bytes liefert bzw. aufnehmen kann. cin ist der stream für die Standardeingabe. Mit dem Operator „>>„ wird aus dem stream in eine Variable gelesen, wobei der Typ der Variablen entscheidet, wie die Bytefolge interpretiert wird. „>>„ zeigt in die Richtung, in der die Bytes geschickt werden. Die Eingabe wird durch die Eingabetaste beendet. double d; cin >> d; Damit liest man einen double-Wert aus der Standardeingabe aus. Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 2-17 Standardeingabe und Standardausgabe Für die Standardausgabe gibt es den Operator „<<„ und den stream cout. Auch hier werden die Bytes auf die Ausgabe gelenkt (in Pfeilrichtung). Für cout können mehrere Ausgaben verkettet werden, und es kann die Ausgabe formatiert werden. Mit dem Manipulator endl erreicht man einen Zeilenumbruch. double d=5.3, c=2.2; cout << “Wert von d: “ << d << “, Wert von c: “ << c << endl; // Ausgabe: Wert von d: 5.3, Wert von c: 2.2 cerr ist der Standardfehlerkanal (nur aktiv bei Umlenken der Ausgabe mit cout in eine Datei, dann erscheint cerr dennoch auf dem Bildschirm. Für diese Art der Aus- und Eingabe (cin, cout, cerr) muß die Header-Datei iostream im Programm eingebunden werden (#include iostream) Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 2-18 Ihr erstes C++ Programm 1: /* Das erste Programm: 2: Summe der Zahlen von 1 bis 10 3: */ 4: 5: #include <iostream> 6: 7: int main(void) 8: { 9: // Variable deklarieren und initialisieren 10: int zahl; 11: zahl = 0; 12: 13: // Schleife durchlaufen 14: for (int i = 1; i <= 10; i++) 15: { 16: zahl += i; 17: cout << "Summe bis " << i << ": "; 18: cout << zahl << "\n"; 19: } 20: } 21: Sebastian Bauer Institut für Geowissenschaften 1) Geben Sie das nebenstehende C++ Programm ein und führen Sie es aus. 2) Ändern Sie das Programm so ab, dass unterer und oberer Schleifenwert eingegeben werden können. 3) Ändern Sie die Ausgabe so ab, dass nur das Endergebnis ausgegeben wird. Programmieren in C/C++ und MATLAB CAU 2-19 Starten des C++ Compilers als Entwicklungstool So starten Sie den Compiler: Start -> Programme -> Bloodshed Dev-C++ -> Dev-C++ Tip des Tages schließen. Dann: Datei -> Neu -> Projekt dann wählen Sie „Console Application“ mit der Maus aus und unter „Projekt Optionen“ geben Sie einen Namen für das Programm ein: „ex1“ -> OK Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 2-20 Starten des C++ Compilers als Entwicklungstool Im Optionsfenster „Create New Projekt“ gehen Sie auf ihr Home Verzeichnis (samba...) und legen dort ein neues Verzeichnis an („ex1“). Gehen Sie in das neu angelegte Verzeichnis und speichern Sie das Projekt. Sie sehen nun die Benutzeroberfläche des Compilers und eine Datei main.cpp, mit dem Anfang eines Hauptprogramms. Diese heißt „[*] main.cpp“, d.h. sie ist noch nicht gespeichert. Wählen Sie dazu Datei -> Alles Speichern -> OK um die Datei main.cpp zu speichern (das [*] müsste weg sein) Drücken sie nun die Taste F9 zum kompilieren und starten. Es erscheint ein schwarzes Fenster mit dem Text „Drücken Sie eine beliebige Taste...“, das verschwindet, wenn Sie eine Taste drücken. Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 2-21 Verwenden des C++ Compilers Unter: Ausführen -> Kompilieren können Sie das Programm kompilieren. Mit Ausführen -> Ausführen starten Sie das Programm. Dies ist gleichbedeutend mit dem Start des Programms von der Dos-Shell aus. Geben Sie nun das vorstehende Programm (ohne Zeilennummern) vor der Zeile system(“PAUSE“); ein. Geben Sie nur den Funktionskörper ein, die Include-Dateien und die Kopfzeile der main- Funktion lassen sie unverändert. Kompilieren Sie das Programm und führen Sie es aus. Verstehen Sie die Ausgabe? Verstehen Sie die einzelnen Programmzeilen? Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 2-22 Der C++ Compiler als Entwicklungstool int main(void){ ... ... } Compiler L ¦ ÀˆEï Eðÿ " Eèÿ Linker prog1.cpp Quelltext prog1.o Objekt-Code int add(int a, int b); ÇEÄÿÿÿÿè8„ À ™‹•tÿÿÿ 0100010101 1100111010 prog1.h Header-Dateien prog1.exe *.dll Ausführbares Programm Bibliotheken Der Compiler erzeugt aus den Quelldatein (*.cpp) und den headerDateien (*.h) als Zwischenschritt den Objekt-Code (*.o), der Linker erzeugt aus dem Objekt-Code und den eingebundenen Bibliotheken (*.dll) das ausführbare Programm (*.exe) Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 2-23 Das Programm Bloodshed Dev-C++ Das Programm Bloodhsed Dev-C++ (und viele weitere sog. Entwicklungsumgebungen) bündelt die Abläufe beim erstellen eines Programms. - Editor: Zunächst stellt es einen Editor bereit, mit dem Quell- und Header-Dateien geschrieben werden können. Dabei wird die Synatx farbig dargestellt, um die Programmierung zu erleichtern. - Über das sog. Projekt (das Sie auch immer erst anlegen müssen) werden alle benötigten Dateien verwaltet und Voreinstellungen für den Compiler vorgenommen (z.B. Console-Applikation) - Bei Drücken von „F9“ passieren drei Schritte: Zunächst wird der Compiler aufgerufen, der *.cpp und *.h Dateien auf ihre Syntax prüft und *.o Dateien erzeugt. Anschließend erzeugt der Linker das ausführbare Programm. Als drittes wird dieses Programm gestartet. Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 2-24 Das Programm Bloodshed Dev-C++ Hinweis: Legen Sie für jedes Programm ein neues Verzeichnis und ein neues Projekt an. Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 2-25 Ein zweites C++ Programm /* Das zweite Programm: Implizite Typumwandlungen */ #include <iostream> Geben Sie wiederum das Programm ein und führen Sie es aus. Überlegen Sie vorher, welche Ausgabe Sie erwarten ! int main(void) { int a=4; double b = 8; int c= b; double d; Können Sie sich das Ergebnis erklären? cout << a*b/c << endl; cout << a/c*b << endl; cout << a/b*c << endl; Erweitern Sie das Programm um die folgenden Zeilen. Welche Ausgabe erwarten Sie? b=5.6; cout << b/a << endl; d=b/a; cout << d << endl; c=b/a; cout << c << endl; i=9; c = i / 4; cout << c << endl; c = i % 4; cout << c << endl; } Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 2-26