Grundstrukturen eines C++ Programms anhand eines Beispiels.1 Einige Grundbegriffe Mit Hilfe eines Programmes wird dem Computer mitgeteilt, wie er eine bestimmte Aufgabe bearbeiten soll. Es besteht im wesentlichen aus Objekten und Funktionen (bzw. Methoden). Unter Objekten kann man sich Datenstrukturen wie z.b. ganzzahlige Zahlen oder Zeichenketten vorstellen. In Funktionen werden die Objekte durch die Anwendung von Operatoren (z.b. Addition zweier ganzen Zahlen) manipuliert. Die Reihenfolge, in der Operationen durchgeführt werden sollen, wird mit Hilfe von Kontrollstrukturen definiert. C++ stellt eine Reihe von Objekten und Funktionen zur Verfügung. Sie können aber auch selbst definiert werden. Die aufgezählten Sprachelemente sollen zunächst anhand eines Beispiels eingeführt werden und in den folgenden Stunden vertieft werden. Beispiel 1: Umrechnung eines gegebenen Temperaturwertes T [ F ] in T [ C]: T [ C] = 5 (T [ F ] 2)/9 Formaler Ablauf: 1. Einlesen eines Temperaturwertes T [ F ] in ein Objekt vom Typ Zahl (z.b. über die Tastatur). 2. Berechnung der Temperatur T [ C].. Ausgabe der berechneten Temperatur (z.b. auf dem Bildschirm). Die formalen Regeln, mit denen Objekte und Funktionen codiert werden, bezeichnet man als Syntax. WS 2001/02 Programmierkurs C++ Seite 2 WS 2001/02 Programmierkurs C++ Seite 24.2 Das Hauptprogramm (die Funktion main) Einschub: Reservierte C++ Schlüsselwörter Jedes C++ Programm muß genau ein Hauptprogramm besitzen. Nach dem Programmstart wird zunächst der Code im Hauptprogramm ausgeführt. Das Programm stoppt, wenn dieses vollständig abgearbeitet ist. Formal gesehen ist auch das Hauptprogramm eine Funktion, d.h. ein in sich geschlossener Programmteil, der einen Namen trägt und von anderen Programmteilen aufgerufen werden kann. Eine Funktion besitzt einen Rückgabetyp. Das Hauptprogramm hat den Namen main und als Rückgabetyp eine ganze Zahl (int = integer). int ist ein reserviertes C++ Schlüsselwort. Das Schlüsselwort für die Wertrückgabe ist return. 1 / / FUNKTIONSKOPF 2 / / Rueckgabetyp Name ( P a r a m e t e r ) i n t main ( ) 4 { 5 / / Der e i g e n t l i c h e Code s t e h t i n g e s c h w e i f t e n 6 / / Klammern ( BLOCK) 7 8 return 0 ; / / J e d e r B e f e h l wird mit ; a b g e s c h l o s s e n 9 } 11 / / KOMMENTARE e r l e i c h t e r n d i e V e r s t a e n d l i c h k e i t!!! and continue if register typedef and_eq try default inline const public typeid asm delete int template typename auto do long short union bitand double mutable signed unsigned bitor for true namespace sizeof using while else new static virtual break enum not void goto static_cast case explicit not_eq protected struct volatile catch extern operator switch wchar_t char return or false bool class float or_eq friend this xor_compl const_cast dynamic_cast private throw xor_eq reinterpret_cast reservierte Zeichen:!"%&/()=?<>;:+ *# {}[]\,. @~ WS 2001/02 Programmierkurs C++ Seite 25 WS 2001/02 Programmierkurs C++ Seite 26
1. Einlesen eines Temperaturwertes T [ F ]: 6 i n t f a h r e n h e i t ; 7 8 / / l i e s d i e Zahl f a h r e n h e i t e i n 9 c i n > > f a h r e n h e i t ; 11 return 0 ; 12 } #include<iostream> Dieser Befehl bewirkt, daß dem Compiler Befehle zur Ein- und Ausgabe von Tastatur und auf dem Bildschirm bekannt gemacht werden. Dies geschieht durch Einfügen von Programmcode aus einer Datei iostream an der Stelle der Include Anweisung. int fahrenheit; Deklaration und Definition eines Objekts. Dem Compiler wird mitgeteilt, daß er Speicherplatz bereitstellen soll und den Namen fahrenheit innerhalb des Blockes {} kennt. int bezeichnet eine ganze Zahl. ; schließt die Anweisung ab. cin» fahrenheit; Eingabe (character in). Der Doppelpfeil zeigt hier an, daß das Objekt fahrenheit Daten von der Tastatur (Standardeingabe) aufnehmen soll. Einschub: selbstdefinierte Namen Selbstdefinierte Namen dürfen ausschließlich die Zeichen a-z, A-Z, 0-9 und _ enthalten. müssen mit einem Buchstaben oder _ beginnen. Letzteres sollte vermieden werden. dürfen nicht mit Schlüsselwörtern übereinstimmen. sind längenmäßig unbeschränkt. Zu lange oder zu kurze Namen sollten vermieden werden. sollten selbsterkärend sein. dürfen keine Leerzeichen enthalten. Groß- und Kleinschreibung C++ ist case-sensitive, d.h. Groß- und Kleinbuchstaben sind verschieden Zeichen fahrenheit ist nicht dasselbe wie FAHRENHEIT! WS 2001/02 Programmierkurs C++ Seite 27 WS 2001/02 Programmierkurs C++ Seite 28 2. Umrechnung von T [ F ]: 6 i n t f a h r e n h e i t, c e l s i u s ; 7 c i n > > f a h r e n h e i t ; 8 9 / / Umrechnung d e r Temperatur c e l s i u s = 5 ( f a h r e n h e i t 2 ) / 9 ; 11 12 return 0 ; 1 } Zu Zeile 9: Die Zahlen 5, 9, 2 werden als Objekte vom Typ int vom Compiler interpretiert. Von fahrenheit wird 2 subtrahiert (Operator -), das Ergebnis mit 5 multipliziert (Operator *) und dieses durch 9 dividiert (Operator /). Das Ergebnis jeder dieser Operationen ist ein neues Objekt vom Typ int. = stellt eine Zuweisung dar. Das Objekt auf der linken Seite (celsius) erhält das Ergebnis des Ausdruckes auf der rechten Seite. Vor der Zuweisung besitzt celsius einen willkürlichen Wert.. Ausgabe des Temperaturwertes T [ C]: 6 i n t f a h r e n h e i t, c e l s i u s ; 7 c i n > > f a h r e n h e i t ; 8 c e l s i u s = 5 ( f a h r e n h e i t 2 ) / 9 ; 9 / / Ausgabe d e r Zahl c e l s i u s 11 c o u t < < c e l s i u s < < e n d l ; 12 1 return 0 ; 14 } cout «celsius «endl; Ausgabe (character out). cout ist die Bildschirmausgabe (Standardausgabe). Alles rechts von «wird zur Ausgabe gesendet. Durch mehrfache Angabe von «können mehrere Ausgabeteile verkettet werden. Durch endl wird ein Zeilenumbruch ausgegeben. (Konstante) Zeichenketten werden duch "..." eingeschlossen Bsp.: cout «" Ergebnis: " «celsius «endl; WS 2001/02 Programmierkurs C++ Seite 29 WS 2001/02 Programmierkurs C++ Seite 0
. Hinzunahme einer weiteren Funktion Oft ist es sinnvoll, eine Folge von Anweisungen als separate Funktion zu definieren, die dann von anderen Programmteilen aufgerufen werden kann. Dadurch werden Programme übersichtlicher, die Fehlerbehandlung wird einfacher und einzelne Programmteile lassen sich wiederverwerten. Beispiel 2 (Abwandlung von Beispiel 1): Ändere Schritt 2: Berechnung der Temperatur T [ C] in einer Funktion ausserhalb des Hauptprogramms, die als Eingangsparameter T [ F ] erhält. Diese Funktion erhält als Objekt eine ganze Zahl (T [ F ]) und gibt eine ganze Zahl (T [ C]) zurück. 1 i n t f a h r e n h e i t 2 c e l s i u s ( i n t f ) 2 { i n t c e l s i u s ; 4 c e l s i u s = 5 ( f 2 ) / 9 ; 5 return c e l s i u s ; 6 } Neu: Die Funktion fahrenheit2celsius erhält einen Parameter f mit dem die Berechnung in Zeile 4 durchgeführt wird. Woher kennt das Hauptprogramm die neue Funktion? Wie mache ich sie ihm bekannt? Einschub: Deklaration und Definition Die Objekte, die in einem Programm manipuliert werden, müssen den Programmteilen, die dies tun, bekannt gemacht werden. Dazu gehören zwei Schritte: Objekte müssen deklariert werden, d.h. es wird ihnen ein symbolischer Name gegeben und ihnen ein Typ zugewiesen, der ihre Eigenschaften beschreibt. Der Compiler erlaubt nur deklarierte Variablen und nur Operationen, die mit dem Typ verträglich sind. Die Deklaration hat die Form Objektyp <Liste von Objektnamen mit, getrennt>; Zur Speicherung des variablen Inhalts der Objekte wird vom Compiler Speicher reserviert. Dies bezeichnet man auch als Definition. Gleiches gilt für Funktionen. Bisher geschah die Deklaration und Definition in unseren Beispielen immer gleichzeitig (z.b. int celsius;) Dies muß nicht so sein (vgl. folgendes Beispiel), so daß zwischen beidem unterschieden werden muß. WS 2001/02 Programmierkurs C++ Seite 1 WS 2001/02 Programmierkurs C++ Seite 2 4 / / D e k l a r a t i o n d e r F u n k t i o n 5 / / S i e e n t h a e l t den Rueckgabetyp und e i n e L i s t e d e r 6 / / P a r a m e t e r t y p e n, d i e uebergeben werden. 7 i n t f a h r e n h e i t 2 c e l s i u s ( i n t ) ; 8 9 i n t main ( ) { 11 / / D e k l a r a t i o n und D e f i n i t i o n d e r O b j e k t e 12 / / f a h r e n h e i t und c e l s i u s ( Typ i n t ) 1 i n t f a h r e n h e i t, c e l s i u s ; 14 15 cout < < " Geben Sie e i n e Temperatur " 16 << " i n F a h r e n h e i t e i n : " ; 17 c i n > > f a h r e n h e i t ; 18 19 / / Aufruf der Funktion u n t e r Uebergabe des Objekts 20 / / f a h r e n h e i t und Zuweisung des E r g e b n i s an c e l s i u s 21 c e l s i u s = f a h r e n h e i t 2 c e l s i u s ( f a h r e n h e i t ) ; 22 2 c o u t < < f a h r e n h e i t < < " Grad F a h r e n h e i t = " 24 << c e l s i u s < < " Grad C e l s i u s. " << e n d l ; 25 return 0 ; 26 } 27 28 / / D e f i n i t i o n d e r F u n k t i o n 29 i n t f a h r e n h e i t 2 c e l s i u s ( i n t f ) 0 { 1 / / D e k l a r a t i o n und D e f i n i t i o n des O b j e k t s c e l s i u s 2 i n t c e l s i u s ; 4 c e l s i u s = 5 ( f 2 ) / 9 ; 5 return c e l s i u s ; 6 } Einschub: Übersichtliche Programmgestaltung C++ Programme werden durch die Zeilenstruktur und Extra Leerzeichen nicht beeinflußt, aber durch Einfügen von Leerzeilen und Einrückungen kann die Lesbarkeit stark gesteigert werden, Kommentare steigern die Verständlichkeit des Programms! Vorschläge: Durch Leerzeilen sinnvoll gliedern. Nur ein Befehl je Zeile. Nach Eröffnung eines Blockes ({...}) um 2 Zeichen einrücken. Geht ein Befehl über mehrere Zeilen, die folgenden Zeilen einrücken. Nicht zu lange Zeilen schreiben. Aussreichend Kommentare einfügen. Sinngebende Namen verwenden. WS 2001/02 Programmierkurs C++ Seite WS 2001/02 Programmierkurs C++ Seite 4
.4 Hinzunahme einer Kontrollstruktur Kontrollstrukturen bieten die Möglichkeit, Programmteile nur bedingt oder mehrfach auszuführen. Beispiel : Ausgabe einer Umrechnungstabelle zwischen T [ F ] und T [ C]. Hierzu muß unsere Funktion fahrenheit2celsius mehrfach für unterschiedliche Temperaturen ausgewertet werden. Für unser Beispiel soll mit der while Schleife gearbeitet werden. Weitere Kontrollstrukturen später: Notation: while( Bedingung ) { Folge von Anweisungen } Ablauf der Schleife: Die Bedingung wird ausgewertet, und wenn sie wahr ist, wird die Folge von Anweisungen innerhalb des Blockes {...} abgearbeitet. Dieser Vorgang wird solange wiederholt, bis die Bedingung falsch wird. Bemerkungen zu while : Die Bedingung kann leer bleiben. Damit ist sie immer erfüllt. while(){...} ist daher eine Endlosschleife. Die Bedingung wird vor dem Schleifendurchlauf geprüft. while Schleifen können geschachtelt werden: 1 while ( Bedingung1 ) { 2... while ( Bedingung 2 ) { 4... 5 } 6 } Bemerkung zu Bedingung: Eine Bedingung kann erfüllt (true) oder nicht erfüllt (false) sein. Beispiele: 1 > 2 ist false (2+4) == 6 ist true (s. auch Vergleichs /Äquivalenzoperatoren) WS 2001/02 Programmierkurs C++ Seite 5 WS 2001/02 Programmierkurs C++ Seite 6 4 i n t f a h r e n h e i t 2 c e l s i u s ( i n t ) ; 5 6 i n t main ( ) 7 { 8 i n t f a h r e n h e i t, c e l s i u s ; 9 i n t lower, upper, s t e p ; 11 lower = 0 ; / / u n t e r e Grenze T a b e l l e 12 upper = 0 0 ; / / o b e r e Grenze T a b e l l e 1 s t e p = 2 0 ; / / S c h r i t t w e i t e 14 15 f a h r e n h e i t = lower ; / / I n i t i a l i s i e r u n g von f a h r e n h e i t 16 17 while ( f a h r e n h e i t < = upper ) { 18 c e l s i u s = f a h r e n h e i t 2 c e l s i u s ( f a h r e n h e i t ) ; 19 c o u t < < f a h r e n h e i t < < " Grad F a h r e n h e i t = " 20 << c e l s i u s < < " Grad C e l s i u s. " << e n d l ; 21 22 / / Erhoehung von f a h r e n h e i t um s t e p 2 f a h r e n h e i t + = s t e p ; 24 } 25 return 0 ; 26 } 27 28 i n t f a h r e n h e i t 2 c e l s i u s ( i n t f ) 29 { 0 i n t c e l s i u s ; 1 c e l s i u s = 5 ( f 2 ) / 9 ; 2 return c e l s i u s ; } Bemerkungen: Nach der Vereinbarung von fahrenheit (Z.8) besitzt das Objekt einen willkürlichen Wert. Erst nach der Initialisierung (Z. 15) besitzt es einen definierten Anfangswert (lower). Die while Schleife wird wiederholt, solange fahrenheit kleiner oder gleich upper ist (Operator <=). In Z. 2 wird fahrenheit um step erhöht. Die Operation fahrenheit += step; ist gleichbedeutend mit fahrenheit = fahrenheit + step;. Ohne dies wäre die Bedingung der while Schleife immer true, und das Programm würde die Schleife nicht mehr verlassen. WS 2001/02 Programmierkurs C++ Seite 7 WS 2001/02 Programmierkurs C++ Seite 8
4 Einfache Datentypen C++ stellt eine Reihe von Datentypen zur Verfügung. Ein einfacher Datentyp (int) wurde bereits verwendet, weitere werden jetzt eingeführt. 4.1 Ganzzahlige Datentypen Darstellung ganzer oder natürlicher Zahlen. Mit n Bits können entweder 2 n natürliche Zahlen von 0 bis 2 n 1 oder 2 n ganze Zahlen von 2 n 1 bis 2 n 1 1 dargestellt werden. Dabei ist n = 8, 16, 2, 64... Zum Typ int gibt es verschiedene Varianten: Mit short und long stehen neben int verschieden lange ganzzahlige Werte zur Verfügung. Über signed und unsigned kann gekennzeichnet werden, ob nur positive (incl. Null) Werte oder auch negative Werte angenommen werden können. Ohne Angabe wird eine Deklaration int vom Compiler als signed int interpretiert. Mindestgrößen der ganzzahligen Datentypen: Typ Bits Wertebereich char 8 128... 127 unsigned char 8 0... 255 short 16 2768... 2767 unsigned short 16 0... 6555 long 2 214748648... 214748647 unsigned long 2 0... 4294967295 Die Anzahl der Bits und Wertebereiche sind abhängig von der Maschienenarchitektur. Nach dem C++ Standard muß aber gelten: Bits(char) Bits(short) Bits(int) Bits(long) Der Typ int bzw. unsigned int stimmt je nach System mit den entsprechenden Typen short oder long überein. Bemerkung: 8 Bits = 1 Byte WS 2001/02 Programmierkurs C++ Seite 9 WS 2001/02 Programmierkurs C++ Seite 40 Einige Operatoren für ganze Zahlen Operator Beispiel Bedeutung * x * y Multiplikation / x / y Division + x + y Addition - x - y Subtraktion < x < y kleiner > x > y größer <= x <= y kleiner gleich >= x >= y größer gleich == x == y gleich!= x!= y ungleich = x = y Zuweisung += x += y x = x + y -= x -= y x = x - y Rangfolge: Arithmetische Operatoren (*/ vor +-) vor Vergleichsoperatoren vor Äquilvalenzoperatoren vor Zuweisungen. WS 2001/02 Programmierkurs C++ Seite 41