Programmieren in C/C++ und MATLAB - Christian

Werbung
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
Herunterladen