Programmieren in C/C++ und MATLAB Sven Willert, Sabine Schmidt 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, 1-1 Vorlesung Vorlesung drei-stündig, mit Übungen Vorlesung Di, 10:30-12:45 (mit 15 Minuten Pause) 1/3 Vorlesung, 2/3 Übung Vorlesungsunterlagen C++ über Homepage Sebastian Bauer: http://www.geohydromodelling.uni-kiel.de/ Zwei Hauptteile: - C++ - MatLab - Grundlagen Theorie Sprachelemente Praktische Übungen Ziel: - Erstellen von kleineren Hilfsprogrammen - Datenkonvertierung Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU, 1-2 Inhalt C++ - Programmiersprachen, Einführung C/C++ Aufbau eines C++ Programms Datentypen, Variablen, Konstanten, Typumwandlungen Deklaration, Definition Ein- und Ausgabe: Bildschirm, File-IO, Zahlen und Zeichen Operatoren Kontrollstrukturen: for(), while(), if() then() else(), switch() Felder, ein- bis mehr-dimensional Funktionen Objektorientierte Programmierung (Übergang MATLAB) Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU, 1-3 Was ist Unix Entwickelt im Gegensatz zu Multics, 1969; erster Name: Unics Im Gegensatz zum Standard- Desktop-PC mit Microsoft Windows Betriebssystem sind Unix Betriebssysteme für sog. Workstations konzipiert, die höhere und verteilte Rechenleistungen erlauben. Es gibt eine Reihe von Unix-Systemen: Solaris (Sun Microsystems), AIX (IBM), HP-UX (Hewlett-Packard), Irix (Silicon Graphics), FreeBSD und NetBSD (Freeware) Eigenschaften: - Multitasking: gleichzeitiges Ausführen von Prozessen - Multiuser: Mehrere Benutzer können gleichzeitig auf dem Computer arbeiten und auf die Computer-Ressourcen zugreifen Daraus folgen drei wesentliche Konsequenzen: - Dateien gehören einem Benutzer (Dateirechte) - Prozesse gehören einem Benutzer (Feste Zuordnung ausführbarer Programme zu einem User) - benutzerspezifische Konfigurationen Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU, 1-4 Was ist Linux Linux bezeichnet im Ursprung nur den Betriebssystemkern, den der Finne Linus Torvalds 1991 entwickelt hat – als Lehrbetriebssystem (!) Durch internationalen Austausch in einer Open-Source Gemeinde und dauerhafter Weiterentwicklung durch viele Enthusiasten weltweit wurde daraus das vollständige, sehr leistungsstarke Betriebssystem, wie es heute bekannt ist. Linux ist kein offiziell akkreditiertes Unix. Linux ist preisgünstig (kostenlos) und begnügt sich mit preisgünstiger Hardware, im Gegensatz zu Unix. Alle auf Linux entwickelten Programme lassen sich „leicht“ auf andere Unix-Systeme portieren. So ist auch C/C++ ein standartisierte und portable Programmiersprache. Mit Linux einher geht eine Vielzahl an Zusatzprogrammen, die zumeist dem GNU Open Source Projekt entstammen, das für freie, im Quellcode verfügbare Software einsteht (Emacs, gcc, gdb, make, ..) Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU, 1-5 Grundbegriffe Compiler: Bei Programmiersprachen wie C/C++, Fortran, Pascal etc handelt es sich um Hochsprachen, die durch ein spezielles Programm in Maschinencode übersetzt werden müssen, aus dem dann die ausführbare Datei entsteht. So ein Programm nennt man Compiler. Der Compiler prüft beim Übersetzen (=Kompilieren) auch, ob der Code (=Programmtext) im Einklang mit den Regeln der Programmiersprache ist (= Syntax) steht. Compiler geben auch Warnungen aus, die auf mögliche Inkonsistenzen oder Mehrdeutigkeiten hinweisen. Zum erfolgreichen Compilieren muss der Compiler fehlerfrei übersetzen. Zusätzlich sollte der Programmtext auch warnungsfrei übersetzt werden können Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU, 1-6 Grundbegriffe Dateiarten: Die Datei, die den Programmtext (= Quelltext, Code, Source code) enthält, wird mit einer Endung versehen, die die Programmiersprache kennzeichnet. Hier: *.cpp (auch *.cc, *.cxx) Bei C/C++ werden die Schnittstellen zu Unterprogrammen und Datenstrukturen in eigenen Dateien vom übrigen Code getrennt. Diese Dateien nennt man header-Dateien (*.h) Aus den vorhandenen Source code und header Dateien erzeugt der Compiler entweder gleich das ausführbare Programm (*.exe in Windos, beliebige Endung bzw. Namen unter Linux) oder eine Zwischenstufe, den sog. Objektcode (*.obj, *.o) Aus dem fertigen Objektcode erstellt dann der Linker das fertige Programm Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU, 1-7 Grundbegriffe Dateiarten: Ein Sammlung von Unterprogrammen in übersetzter Form heiss Bibliothek (library). Diese können zu einem Programm hinzugelinkt und damit die Unterprogramme verwendet werden. -> Statische Bibliotheken werden zum ausführbaren Code dazugelinkt -> dynamische Bibliotheken (*.dll) werden erst zur Laufzeit des Programms hinzugezogen Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU, 1-8 C und C++ C wurde 1972 von D. Ritchie an den Bell Laboratories von AT&T (American Telefon and Telegraph Company) entwickelt. C ist Nachfolger von B, und stellte eine Hardware-unabhängige Sprache dar. Diese war besonders für Unix geeignet und entwickelt (Unix ist im Wesentlichen in C implementiert). C ist eine imperative, strukturierte Programmiersprache und hat universelle Verbreitung gefunden. C- Programme können auf fast allen Rechnern compiliert werden. C++ ist eine auf C basierende Weiterentwicklung (++ ist der Inkrementoperator in C), die in den 1980er Jahren von Bjarne Stroustrup ebenfalls bei AT&T. C++ unterstützt prozedurale und objektorientierte Programmierung. Hauptunterschied ist die Einführung von Klassen, d.h. selbst zu definierenden Konstrukten aus Daten und Funktionen. Die objektorientierte Programmierung ist insbesondere für große Programme und Benutzeroberflächen geeignet. Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU, 1-9 Ein 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 Normalerweise gibt das erste Programm „Hallo Welt“ auf den Bildschirm aus. Beispiel aus Wieland, 2004 Programmieren in C/C++ und MATLAB CAU, 1-10 Ein erstes C++ Programm Kommentar Ein Kommentar ist eine Anmerkung, ein Text, der vom Compiler ignoriert wird. Diese Kommentare dienen dazu, den Programmtext besser lesbar und verständlicher zu machen. Bei etwas größeren Programmen (wo Sie vielleicht nur einmal pro Jahr in eine bestimmte Funktion hineinschauen) kann eine ausführliche und aussagekräftige Kommentierung sehr wichtig sein. Auch wenn Sie ein Programm von einer anderen Person übernehmen und weiterführen sollen, sind Kommentare sehr wichtig. Faustregel: Im Schnitt eine Kommentarzeile pro Codezeile Kommentare können auf zwei Arten gekennzeichnet werden: - Durch „//“, dann sind alle folgenden Zeichen bis zum Zeilenende Kommentar (Zeilen 9, 13) - Anmerkung eingeschlossen durch „/* Kommentar */. Dies kann auch über Zeilenenden hinweg gehen (Zeile 1-3) Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU, 1-11 Ein erstes C++ Programm Variablen In (fast) jedem Programm muss mit irgendwelchen Daten umgegangen werden. Dafür müssen Speicherstellen im Computer geschaffen werden, in denen diese Daten abgelegt (gespeichert, RAM) werden können. Eine solche Speicherstelle heißt Variable, weil sich ihr Wert (Inhalt) im Verlauf des Programms ändern kann. Variablen werden nach ihrem Typ unterschieden, d.h. ob sie Zahlen (und welchen Typ) oder Buchstaben oder ... aufnehmen können. Deklaration Jede Variable hat einen Namen. Im Beispiel gibt es zwei Variablen, zahl und i. Bevor eine Variable verwendet werden kann, muss sie deklariert werden. Im Beispiel: int zahl; (Zeile 10) Mit dieser Zeile wird angegeben, dass eine Variable vom Typ int (=Integer = Ganzzahl) mit Namen zahl verwendet werden soll. Das Programm reserviert dann den benötigten Speicherplatz und ordnet ihn der Variable zu. Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU, 1-12 Ein erstes C++ Programm Initialisierung Variablen haben nach der Deklaration keinen definierten Wert, sondern können alle möglichen Werte aufweisen. Grund ist, das noch kein Wert auf dem zugeordneten Speicherplatz eingetragen wurde, sonder gelesen wird, was da zufällig steht. Eine Initialisierung ist dann besonders wichtig, wenn mit dieser Variable weitergearbeitet wird, also z.B. eine weitere Zahl addiert wird. Dann ist auch das Ergebnis der Addition undefiniert. Daher sollte jede Variable mit einem sinnvollen Wert initialisiert werden. Im Beispiel wird in Zeile 11 die Variable zahl mit dem Wert 0 initialisiert: zahl = 0; Namensgebung Der Name einer Variable muss mit einem Buchstaben oder dem Unterstrich „_“ anfangen, darf nicht länger als 256 Zeichen lang sein. C++ unterscheidet zwischen Groß- und Kleinschreibung. Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU, 1-13 Ein erstes C++ Programm Operator Eine Zuweisung an eine Variable geschieht über den Operator „=“. (Zeile 11). Einer Variablen kann ein fester Wert (wie in Zeile 11), der Wert einer anderen Variablen oder ein Rechenergebnis zugewiesen werden (Zeile 16): zahl = zahl + i Diese Zuweisung und Rechnung kann statt über zwei Operatoren „+“ und „=“ auch nur über den Operator „+=“ gemacht werden: zahl += i Ausgabe und Eingabe Ein besonderer Operator wird für die Ein- und Ausgabe verwendet. Der „<<“ Operator bedeutet dass alles was rechts von ihm steht nach links weitergereicht wird. Im Beispiel wird also „Summe bis “ weitergereicht an „cout“, das die Ausgabe auf dem Bildschirm durchführt. Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU, 1-14 Ein erstes C++ Programm Strukturierung Jede Anweisung in C/C++ endet mit einem Semikolon „;“ Ausnahmen bilden Kontrollstrukturen, die durch geschweifte Klammern gekennzeichnet sind. Diese Klammern kennzeichnen einen Block – jede Funktion ist ein solcher Block. Solche Blöcke können geschachtelt werden. Übersichtlichkeit C++-Code kann sehr verschachtelt und kurz geschrieben werden. Das sollten Sie nicht tun. Faustregel: - nur eine Anweisung pro Zeile - Einrücken von Anweisungen innerhalb eines Blocks (Im Beispiel: Zeile 15 – 19. - Leer- und Kommentarzeilen einfügen. Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU, 1-15 Ein erstes C++ Programm Präprozessor-Anweisung Vor der eigentlichen Compilierung wird eine Vorverarbeitung gemacht, bei der header Dateien eingefügt oder Makros expandiert werden. Jede Anweisung in C/C++ endet mit einem Semikolon „;“ Anweisungen für den Präprozessor sind durch „#“ gekennzeichnet. Im Beispielprogramm wird durch Zeile 5: #include <iostream> Die header Datei „iostream.h“ eingebunden und Funktionen aus ihr zur Verfügung gestellt. Dabei wird die header-Datei nur in den Standard-Verzeichnissen des Betriebssystems für Header-Dateien gesucht. Für lokale header: 5: #include “iostream.h“ . Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU, 1-16 Ein erstes C++ Programm Hauptfunktion (=Hauptprogramm) Die Hauptfunktion kennzeichnet Anfang und Ende des Programms. In C++ wird beides durch die Funktion main() festgelegt. Egal wo im Source-Code diese Funktion steht, die Programmausführung beginnt in der main- Funktion, und diese muss immer vorhanden sein. Im Beispiel Zeile 7-19. Eine Funktion ist typischerweise ein Stück Code, das eine übersichtliche Aufgabe ausführt, der zu Zwecken der besseren Übersichtlichkeit und Wiederverwertbarkeit gekapselt wurde und einen eigenen Namen bekommen hat. An eine Funktion können Variablen mit ihren Werten übergeben werden, und die Funktion kann einen Wert zurück liefern: int main(void){...} Im Beispiel heißt die Funktion „main“, Ihr werden keine Variablen übergeben und sie liefert einen int-Wert zurück. double name(int x, double y) {double z; z=...; return z;} Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU, 1-17 Ein erstes C++ Programm Schleifen Im Beispiel in Zeile 14-15 wird die sog. for- Schleife verwendet. Diese kann genutzt werden, um wiederkehrende Rechnungen durchzuführen. 14: for (int i = 1; i <= 10; i++) 15: { 16‐18: Do_something(i); 19: } Zeile 14 gibt an, wie oft etwas getan werden soll, Zeile 16-18 geben an, was getan werden soll. i ist die Zählvariable, die intern (=innerhalb der for- Schleife) deklariert und initialisiert wird. Die Bedeutung ist: Setze i=1, führe die Anweisungen Do_something(i) aus, erhöhe i um eins (i++) , führe Do_something(i) aus, erhöhe i um eins (i++) , solange, wie i kleiner als 10 ist. Es gibt noch andere Schleifen... Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU, 1-18 Ein erstes C++ Programm Ausgabe Im Beispiel wird in Zeile 17-18 jeweils das aktuelle Ergebnis der Addition ausgegeben. cout ist dabei die Standard-Bildschirmausgabe, „<<“der Übergabeoperator. Übergeben an die Bildschirmausgabe wird zum einen Text. Dieser ist gekennzeichnet durch “Summe bis “ , d.h. durch obenstehende Anführungszeichen begonnen und abgeschlossen. Es kann auch eine Variable ausgegeben werden. Im Beispiel wird jeweils der aktuelle Wert der Variablen i und zahl ausgegeben. “\n“ ist das Zeilenendzeichen, damit wird in der Bildschirmausgabe ein Zeilenumbruch erzeugt. Äquivalent kann auch cout << endl; verwendet worden (endl = end of line) Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU, 1-19 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, 1-20 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, 1-21 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, 1-22