Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Programmieren ... in C++ Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I.

Ähnliche Präsentationen


Präsentation zum Thema: "Programmieren ... in C++ Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I."—  Präsentation transkript:

1 Programmieren ... in C++ Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

2 Ziele dieser Vorlesung
Auffrischen / Kennenlernen nicht objektorientierter Eigenschaften der Sprache C++ Kennenlernen und Einüben des Objektansatzes (Objekte und Klassen) ... siehe gesondertes Skript; dazu zählen Begriffe wie Konstruktoren, Destruktoren, Überladen von Funktionen und Operatoren Realisieren eines Projekts „Einlesen von Punktdaten und Ausgabe in XML“ Meine Vorstellung: mindestens 1 Mal pro Woche zusätzliches (Programmier-) Üben! Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

3 Literatur P.Prinz, U.Kirch-Prinz: C ++, Lernen und professionell anwenden, MITP-Verlag, 1999 Martin Auppele: Die Kunst der Programmierung mit C++. Exakte Grundlagen für die professionelle Softwareentwicklung. Vieweg, ISBN , 1042 S. Stroustrup, Bjarne: Die C++-Programmiersprache; Addison-Wesley, 2000, 1048 S. Nootz, Petra / Morick, Franz: C / C++ Referenz; Franzis' Louis, Dirk: C/C++ Kompendium, Markt & Technik, 2000, 1259 S. Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

4 Der Softwareentwicklungszyklus
Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

5 Programmsource C++-Programm: Textdatei, die den Programmcode (Source) enthält, Datennamenserweiterung: .cpp oder cc wird mit Editor bzw. in einer Entwicklungsumgebung erstellt ... und korrigiert muss vom Compiler übersetzt werden ==> Ergebnis: sogenanntes Object File. enthält die für den Computer ,,übersetzten`` Informationen der Programmdatei. In der Regel: Name eines Object Files = Namen des Source Files mit der Endung .obj (MSDOS, Windows oder OS/2) beziehungsweise .o (Unix). Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

6 Linken Object Files nicht direkt ausführbar
benötigen spezielle Codeteile für die Ausführung, die nicht selbst programmiert werden müssen. vordefinierten Funktionen und Objekten, deren Definitionen nicht im Source File enthalten sind (zum Beispiel die Ein-/Ausgaben). in bereits fertig übersetzten Teilen, den sogenannten "Bibliotheken" (Libraries) abgelegt. Um aus einem Object File ein ausführbares Programm (.exe) zu machen, ist es daher nötig, dieses mit den benötigten Bibliotheken zu linken (Deutsch: binden). Erst durch diesen Schritt wird ein ausführbares Programm erzeugt. Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

7 Projektphasen Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

8 Algorithmus Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

9 Prinzip “Teile und Herrsche”
Ein komplexeres Problem wird in Teilaufgaben zerlegt. Für jede Teilaufgabe wird ein entsprechender Lösungsalgortihmus entwickelt. Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

10 “Teile und Herrsche” II
Die Teilalgorithmen werden in Funktionen abgebildet. Funktionen kommunizieren untereinander. Die Gesamtheit der Funktionen bilden das Programm. Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

11 Dokumentieren eines Algorithmus’
Drei wesentliche Verfahren: Umgangssprachliche Beschreibung Programmablaufplan Struktogramm (Nassi-Shneiderman-Diagramm) Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

12 Programmablaufplan Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

13 Das übliche “Hello World”
//File: hello.cpp // Schnittstelle von iostream inkludieren // iostream ist ein vordefiniertes Modul, daher wird // der Name mit den Zeichen <> begrenzt #include <iostream.h> // "Hauptprogramm" int main(int argc, char* argv[]) { using namespace std; cout << "Hello world!" << "\n" << "\n"; return 0; } Die Ein-/Ausgabe ist in C++ in einer eigenen ,,Bibliothek`` (einer Sammlung von bereits vorgefertigten Programmteilen) vereinbart. Um Daten einlesen beziehungsweise ausgeben zu können, muß dem Compiler mitgeteilt werden, daß diese Bibliothek verwendet wird. Dies erfolgt durch die Anweisung #include <iostream>. main ist die Hauptfunktion jedes C/C++-Programms und wird vom C++-Laufzeitsystem beim Programmstart automatisch aktiviert. Hello World! benutzt das in allen C++-Entwicklungssystemen vorhandene Modul iostream, um den Text auszugeben. iostream realisiert eine einfache textuelle Ein-/Ausgabe. Grundsätzlich erfolgen alle Eingaben im Programm über Anweisungen der folgenden Art: cin >> Argument; Dabei wird der Wert des Arguments unter Verwendung des Operators >> (,,lesen von``, get from) vom Standard-Eingabestrom cin, also von der Tastatur, eingelesen. Die Ausgabe erfolgt mit Anweisungen der Art cout << Argument; Der Wert des Arguments wird mit Hilfe des Ausgabeoperators << (,,schreiben nach``, put to) auf den Standard-Ausgabestrom cout (und damit auf den Bildschirm) geschrieben. Sowohl Eingabeoperator >> wie auch Ausgabeoperator << können ,,kaskadiert`` werden: cin >> "Hello" >> " " >> "world!"; Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

14 Symbole, die Bausteine des Programms
Programmtexte bestehen aus einer Folge von Symbolen (engl. token). Symbol: nicht Signet oder Pictogramm, sondern Wortsymbol, Bezeichner, Zahlen, Spezialsymbole oder Zeichenketten, Zeichenkonstanten. Symbole durch Trennzeichen voneinander getrennt. Symbole dürfen - auch wenn sie aus mehreren Zeichen bestehen - nie auf zwei oder mehrere Zeilen verteilt werden. Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

15 Trennzeichen Trennzeichen (white spaces) trennen Symbole voneinander.
Trennzeichen sind z.B. das Zeilenendezeichen (carriage return), das Leerzeichen, der Tabulator (innerhalb der IDE), ein Kommentar. Zwischen aufeinanderfolgenden Bezeichnern, Wortsymbolen oder Zahlen muss mindestens ein Trennzeichen eingefügt werden. Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

16 Wortsymbole Wortsymbole der Sprache C
auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned continue for signed void default goto sizeof volatile do if static while zusätzliche Wortsymbole der Sprache C++ asm friend private this class inline protected throw catch new public try delete operator tempplate virtual Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

17 Bezeichner Bezeichner werden vom Programmierer selbst festgelegt und mit einer Bedeutung versehen. Für Bezeichner gilt: Ein Bezeichner muss mit einem Buchstaben beginnen, auf den eine beliebige Kombination von Buchstaben und Ziffern und Unterstrichen "" folgen kann. Ein Bezeichner kann beliebig lang sein. Bis zu 31 Zeichen sind signifikant. Bezeichner dürfen keine Spezialsymbole enthalten. Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

18 Bezeichner II Im Gegenteil zu vielen anderen Sprachen verstehen C und C++ Klein- und Großbuchstaben als völlig unterschiedliche Zeichen. Sie können beispielsweise drei unterschiedliche Variablen int var1 Var1 VAR1; deklarieren, auch wenn dies normalerweise wenig sinnvoll ist und fehleranfällig ist. Deutsche Sonderzeichen ä, ö, ü, ß, Ä, Ö und Ü nicht für Bezeichner zulässig. Deutsche Sonderzeichen: jedoch in Zeichenketten und Kommentaren innerhalb eines Programms zulässig, sofern die oberen 128 Zeichen des erweiterten ASCII-Zeichensatzes unterstützt werden. Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

19 Bezeichner III Beispiele für korrekte Bezeichner sind:
Donaudampfschiffahrtsgesellschaft a a1 Pi richtiger_Bezeichner. Beispiele für unzulässige Bezeichner sind Donaudampfschiffahrts-Gesellschaft a? 1a falscher Bezeichner. Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

20 Konventionen I Traditionell: Namen von normalen Variablen und Funktionen werden immer ausschließlich mit Kleinbuchstaben, Unterstrichen und Ziffern geschrieben. Großbuchstaben werden vermieden. Um Konflikte mit Systemvariablen zu vermeiden: Eigene Variablen nur dann mit einem Unterstrich beginnen lassen, wenn Sie einen Konflikt mit Systemvariablen Ihres Compiler ausschließen können. Symbolische Konstanten werden normalerweise ausschließlich mit Großbuchstaben, Ziffern und Unterstrichen geschrieben. Kleinbuchstaben werden vermieden. Beispiele sind: #define MWST #define TRUE 1 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

21 Konventionen II Index (integer): i float: ft double float: dft
Aufbauend auf Notation von Charles Simonyi (ungar, Herkunft, Fa. Microsoft): Ungarische Notation, basierend auf Basistyp und Typableitung Index (integer): i float: ft double float: dft long int: l C-Zeichenkette: sz Zeichen (char): ch ... unsigned: u long: l Zeiger (pointer): p ... Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

22 Zahlen ganzzahlig (0, 1, -1, 2, -2, ...) oder reell (0.0, , -0.5, ...) häufig dezimale Schreibweise, auch Angaben im Oktal- und Hexadezimalsystem (Sedezimalsystem) möglich. Jeder Zahl kann ein negatives Vorzeichen (-) vorangestellt sein. Das Komma wird durch den Dezimalpunkt dargestellt. Reelle Werte werden mit Dezimalpunkt, in Exponentialdarstellung oder in einer Kombination aus beiden geschrieben. Bei der Exponentialschreibweise bedeutet der dem Exponenten vorangestellte Buchstabe E (oder e) "mal 10 hoch". Bei reellen Zahlen ist zu beachten, dass vor und nach dem Dezimalpunkt jeweils zumindest eine Ziffer stehen muss. Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

23 Zahlen II Beispiele für korrekte Zahlen sind: E e10 0x Beispiele für unzulässige Zahlen sind: E 3,14 MDCXXI 5E-neun *E10 . Daneben gibt es noch einige Erweiterungen, die über die uns vertraute Art der Zahlendarstellung hinausgehen. Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

24 Spezialsymbole [ ( ->* .* ] ( . -> ++ -- & * + - ~ !
[ ( >* * ] ( > & * ~ ! / % << >> < > <= >= == != ^ | && || ?: = *= /= %= += = <<= >>= &= ^= |= , # ## :: Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

25 Trigraph-Zeichen Trigraphs sind Folgen von drei Zeichen, die in der Sprache C bestimmte (Sonder-)Zeichen ersetzen, die auf manchen Tastaturen (z. B. wie früher in Host-Umgebungen) nicht vorhanden sind. Trigraph Zeichen ??= # ??( [ ??/ \ ??) ] ??' ^ ??< { ??! | ??> } ??- ~ Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

26 Zeichenketten Als Zeichenketten werden Folgen von Zeichen (Buchstaben, Ziffern, Sonderzeichen) bezeichnet, die in doppelte Hochkommata ("') eingeschlossen sind, wie z.B. "Hallo FJB" "a" "Zeichenkette" "3.14" "Diese Zeichenkette hat 33 Zeichen". Soll ein Hochkomma in eine Zeichenkette eingeschlossen werden, muss es doppelt erscheinen: cout << "Dies zeigt uns Goethes ""Faust""." ; Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

27 Zeichenkonstanten Zeichen aus dem Zeichensatz und müssen in einzelne Hochkommata eingeschlossen werden, wie z.B. 'A' 'a' '?' '\'' Ein Zeichen kann über seine dreistellige oktale Ordnungszahl spezifiziert werden: '\211' oder durch eine hexadezimale Darstellung: '\x11' Gewisse Zeichen können in Zeichenkonstanten und in konstanten Zeichenketten mit Hilfe von Ersatzdarstellungen angegeben werden, die zwar wie zwei Zeichen aussehen, jedoch nur ein Zeichen repräsentieren. Meist handelt es sich dabei um Steuerzeichen, wie z.B. \n Zeilenvorschub (Zeilentrenner, neue Zeile, newline). \t Tabulator Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

28 Die Funktion main In jedem [Konsolen-] C-/C++-Programm kommt die Funktion main genau ein Mal vor. main ist die Hauptfunktion jedes C/C++-Programms und wird vom C++-Laufzeitsystem beim Programmstart automatisch aktiviert. An main können von der Kommandozeile aus Parameter übergeben werden. Standardmäßig hat dazu main zwei Parameter: argc und argv. Optional kann zusätzlich der Parameter envp verwendet werden. Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

29 Programmrahmen // short description of your program // include section
#include <iostream> using namespace std; // global constants section const char* PROGNAME = "bgrund"; const char* VERSION = "0.0.5"; const char* HELPTEXT = "Only shows prog frame"; int main(int argc, char *argv[], char *env[]) { cout << PROGNAME << endl << VERSION << HELPTEXT << endl; // here comes your code return 0; } Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

30 Aufbau von main Prototypdefinition: int main(int argc, char* argv[ ]); beziehungsweise int main(int argc, char* argv[ ], char* envp[ ]); argc: Anzahl der Argumente, immer >= 1 , da Name des Programms automatisch als Argument übergeben wird. argv: Feld, das die Argumente (Zeichenketten) enthält. envp: aufgebaut wie argv, enthält aber Zeiger auf die Umgebungs-variablen. envp muß nicht verwendet werden. Wird es verwendet, so müssen auch die beiden anderen Parameter deklariert werden. Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

31 Inhalt des Argumentvektors
Der Argumentvektor argv enthält im Detail folgende Einträge: argv[0] enthält den Programmnamen, argv[1] enthält das erste Argument, ... argv[argc] enthält den Wert 0. Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

32 Argumente anzeigen //File: mainargs.cpp // shows command arguments
#include <iostream> using namespace std; int main(int argc, char *argv[], char *env[]) { int i; cout << "Der Wert von argc ist " << argc << endl; cout << "Dies sind die Kommandozeilen-Parameter, uebergeben an main:" << endl << endl; for (i = 0; i < argc; i++) cout << "argv[" << i << "] = " << argv[i] << "\n"; cout << "\nDie Umgebungsvariable(n) sind:" << endl << endl; for (i = 0; env[i] != NULL; i++) cout << "envv[" << i << "] = " << env[i] << "\n"; return 0; } Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

33 Argumente anzeigen: Ergebnis
Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

34 Abfrage von Optionen bei Programmaufruf
bool CommandLineOptionExists(const int argc, char *argv[], const char* szPattern) { for (int i=0; argv[i]!=0; ++i) { if (strcmp(argv[i],szPattern) == 0) { return true; } } return false; } Aufruf mit: if (CommandLineOptionExists(argc, argv, "-debug")) { ... Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

35 Einen Umgebungsparameter abfragen
char * GetEnvironmentParameter(char* envp[],char* szTest, char* szDefault) { for (int i = 0; envp[i] != NULL; i++) { if (envp[i] != NULL) { if (strstr(envp[i],szTest)) // test, ob 2. Zeichenkette in 1. Enthalten { char* szTestString = envp[i]; char* pszLastToken; char* szSeparator = "="; char* pszPosition = szTestString; pszPosition = strtok(szTestString,szSeparator); while (pszPosition) { if ((pszPosition = strtok(0,szSeparator)) != 0) { pszLastToken = pszPosition; } } return pszLastToken; } } return pszDefault; } Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

36 Lesbarkeit! // Acht-Damen-problem // 1990 als Sieger beim jährlichen Obfuscated C Code Contest // hervorgegangen - Kategorie Best Small Program. v,i,j,k,l,s,a[99]; main() { for(scanf("%d",&s);*a-s;v=a[j*=v]-a[i],k=i<s,j+=(v=j< s&&(!k&&!!printf(2+"\n\n%c"-(!l<<!j)," #Q"[l^v?(l^j) &1:2])&&++l||a[i]<s&&v&&v-i+j&&v+i-j))&&!(l%=s),v|| (i==j?a[i+=k]=0:++a[i])>=s*k&&++a[--i]); } Quelle: C++ Programmieren mit Stil, Thomas Strasser dpunkt Verlag 1997 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

37 Lesbarkeit II Aufruf mit weltkart 50 50 (Quelle: Rolf Isernhagen)
#include <stdlib.h> #include <stdio.h> main(l ,a,n,d)char**a;{ for(d=atoi(a[1])/10*80- CLCCGZAAQBEAADAFaISADJABBA^\ SNLGAQABDAXIMBAACTBATAHDBAN\ ZcEMMCCCCAAhEIJFAEAAABAfHJE\ TBdFLDAANEfDNBPHdBcBBBEA_AL\ H E L L O, W O R L D! " [l++-3];)for(;n-->64;) putchar(!d+++33^ l&1);} Aufruf mit weltkart (Quelle: Rolf Isernhagen) Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

38 Kommentare Zwei Formen:
// Kommentar: Dieser Kommentar erstreckt sich bis zum Zeilenende (nur C++). /* Kommentar: Dieser Kommentar kann über mehrere Zeilen gehen. Alles was zwischen /* und */ ist ein Kommentar */ Innerhalb des Zeilenkommentars haben die Zeichen /* */ keine besondere Bedeutung, ebensowenig die Zeichen // innerhalb des /* */-Kommentars. Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

39 Sie erzeugen gut lesbare...
überschaubare und pflegbare Programme, wenn Sie den Quelltext durch Leerzeilen sinnvoll gliedern, mit Kommentaren versehen, pro Zeile nur eine Anweisung schreiben, den Programmsource je Blockebene um mindestens zwei Zeichen einrücken! Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

40 Kontrollstrukturen Verzweigung do-Schleife (annehmende Schleife)
while-Schleife (abweisende Schleife) for-Schleife Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

41 Verzweigung Arten unvollständige Alternative vollständige Alternative
Mehrfachverzweigung Fallauswahl Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

42 Unvollständige Alternative (if)
Struktogramm Pseudocode IF bedingung THEN anweisungsfolge END IF Ausdruck wahr falsch Anweisung1 Syntaxdiagramm Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

43 If-Anweisung Ausdruck nach if wird ausgewertet und mit true (!=0) verglichen: Ausdruck !=0  nachfolgende Anweisungen werden ausgeführt. Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

44 Beispiel float konto, temperatur; int hunger, durst;
if ( konto > 10 ) essen_bestellen(); if ( konto ) /* entspricht if ( konto != 0 ) */ if ( (konto > 20) && (temperatur >= 25) ) { essen_bestellen(); trinken_bestellen(); } if ( (konto > 20) || hunger || durst ) Quelle: P. Böhme, Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

45 Fallen bei if-Konstrukten
Wertzuweisung statt Vergleich if (temperatur = 25) { ... } /* statt von temperatur == 25 */ temperatur = 25 realisiert eine Wertzuweisung anstelle eines Vergleichs und ist immer "wahr". Es treten zwei unbeabsichtigte Effekte auf: der Wert von temperatur wird verändert die an die if-Anweisung geknüpfte Aktion wird immer ausgeführt Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

46 C-Spezialität Der im Rahmen des if-Konstrukts ausgewertete Ausdruck kann mit einer Wertzuweisung an eine Variable kombiniert werden: Besser: FILE *f; if ( ( f = fopen(filename, "r") ) == NULL ) { perror(filename); /* Fehlermeldung*/ exit(1); /* Programmabbruch, Rueckkehrcode 1 */ } f = fopen(filename, "r"); if ( f == NULL ) { ... } Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

47 Vollständige Alternative (if ... else)
Struktogramm Pseudocode Ausdruck IF bedingung THEN anweisungsfolge ELSE END IF wahr falsch Anweisung1 Anweisung2 Beispiel if (a >= b) // Maximum zweier Zahlen ermitteln max = a; else max = b; Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

48 Ausdruck nach if wird ausgewertet und mit true (!=0) verglichen:
Ausdruck !=0  nachfolgende Anweisungen werden ausgeführt. Ausdruck ==0  optionaler else-Zweig wird abgearbeitet Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

49 Hinweise Bei fehlender Klammerung wird ein else-Zweig immer dem letzten if zugeordnet, welches noch nicht mit einem else versehen ist. Bei der Verschachtelung von if - else - Konstrukten sollte durch { } die Zuordnung deutlich sichtbar gemacht werden der Anweisungstext mehrzeilig mit Einrückungen entsprechend der Strukturtiefe notiert werden ( günstig sind Einrückungen um zwei bis vier Spalten Grundsätzlich: keine zu tiefen Verschachtelungen Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

50 Mehrfache Alternativen (else if)
Struktogramm Pseudocode IF bedingung_1 THEN anweisungsfolge_1 ELSIF bedingung_2 THEN anweisungsfolge_2 ... ELSE anweisungsfolge_n END IF Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

51 Mehrfache Alternativen: Beispiel
enum wtag {montag, dienstag, mittwoch, donnerstag, freitag, samstag, sonntag} wochentag; float : konto, minimum; if ( (wochentag == samstag) && (konto > minimum)) feiern(); else if ( (wochentag == sonntag) && (konto > minimum)) ausruhen(); else arbeiten(); Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

52 Struktogramm Pseudocode Fallauswahl (case) SELECT ausdruck
..... caseN default SELECT ausdruck CASE fall_1: anweisungsfolge_1 ... CASE fall_n: anweisungsfolge_n ELSE anweisungsfolge_0 END SELECT Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

53 Fallauswahl (case) II Quelle: Glenn Langemeier, Uni Hildesheim Ausdruck (... ganzzahlige Variable) wird ausgewertet (Schalter) Konstante Ausdrücke nach case entsprechen Sprungmarken Ausführung der zugehörigen Anweisungen bei Übereinstimmung Sprung an Ende mit break, sonst weitere Anweisungen ausführen Keine Übereinstimmung  default-Anweisung ausführen Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

54 Fallauswahl: Beispiel
char choice; choice = GetChoice(); switch (choice) { case 'A': case 'a': ProcessChoiceA(); break; case 'B': case 'b': ProcessChoiceB(); // other cases for other choice possibilities default: cout << "Invalid choice \n"; } Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

55 Wiederholungsanweisungen
In vielen Fällen ist es nötig, Teile eines Programmes wiederholt abzuarbeiten; dabei spricht man auch von Schleifen innerhalb des Programms. C++ sieht hierfür drei verschiedene Kontrollstrukturen vor: die do-Schleife, die while-Schleife, die for-Schleife. Der Schleifenrumpf enthält zu wiederholende Anweisungsfolge Grundsätzlich lassen sich Schleifenkonstruktionen auch über Sprunganweisungen und Sprungmarken realisieren; dies ist jedoch aus Gründen einer korrekten Programmstruktur zu vermeiden. Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

56 Annehmende Schleife (do ... while)
Struktogramm Pseudocode do Anweisung While (Ausdruck); Syntaxdiagramm doStatement while Expression Statement ( ) do ; Quelle: Glenn Langemeier, Uni Hildesheim Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

57 Do-Schleife: Beispiele
int zahl1, zahl2; do { cout << "Bitte 2 mal dieselbe Zahl eingeben:"; cin >> zahl1 >> zahl2; } while( zahl1 != zahl2 ); cout << "Na also, es geht doch ;-)" << endl; Beispiel 2 // größter gemeinsamer Teiler nach Euklid do { rest = a % b; a = b; b = rest; } while ( rest > 0 ); Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

58 Abweisende Schleife (while ... do)
Struktogramm Pseudocode while (Ausdruck) Anweisung ; Syntaxdiagramm whileStatement while Expression Statement ( ) Quelle: Glenn Langemeier, Uni Hildesheim Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

59 Abweisende Schleife: Beispiel
// calculate square and triple values #include <iostream.h> #include <iomanip.h> main() { int st = 1, end = 10, step = 1, num, sq, cube; num = st; while (num <= end) sq = num * num; cube = num * sq; cout << setw(8) << num << setw(8) << sq << setw(8) << cube << endl; num = num + step; } Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

60 while-Schleife: Haken und Ösen
Nach der schließenden Klammer der while-Schleife darf kein Semikolon folgen – der Schleifenrumpf würde als leere Anweisung interpretiert werden. Abbruchbedingungen nicht unnötig kompliziert formulieren. Schleifenvariablen nur an wenigen Stellen modifizieren. Schleifenvariablen nach Möglichkeit nicht in evt. aufgerufenen Funktionen modifizieren. Bei Nutzung der continue-Anweisung endlose Iterationen vermeiden! Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

61 Struktogramm Pseudocode Beispiel for-Schleife
for (Ausdruck1; Ausdruck2; Ausdruck3) Anweisung ; Beispiel boolean CopyString(char *dest, char *s, int from, int to) { int i; char *dptr, *sptr; for (i=from, dptr=dest, sptr=s+from; i<=to; i++,*dptr++ = *sptr++); *dptr = '\0'; return(TRUE); } Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

62 for-Schleife II Syntaxdiagramm:
Quelle: Glenn Langemeier, Uni Hildesheim Steuert den Kontrollfluß des Programms wie folgt: Anfangs werden Variablen (ggf. definiert und) initialisiert (Init) Solange die Schleifenbedingung (Expr) !=0 ergibt, wird der Schleifenrumpf (Statement) wiederholt Anschließend werden die (Zähl-)Variablen aktualisiert (Update) und der Ausdruck erneut überprüft Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

63 Einsatzmöglichkeiten
Bearbeitung von Feldern Analyse und Bearbeitung von Zeichenketten // Umdrehen einer Zeichenkette s ("abcd"->"dcba" for(i=0, j=strlen(s)-1; i<j; i++, j--) { c = s[i]; s[i] = s[j]; s[j] = c; } Quelle: Thomas Strasser: C++ Programmieren mit Stil Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

64 C-Spezialitäten der for-Schleife I
Einzelne Ausdrücke können “leer” bleiben: unsigned var = 0; for (; var < max; ++var ) { ... } Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

65 C-Spezialitäten der for-Schleife II
Der Update-Teil wird nicht mit Strichpunkt abgeschlossen. Im Init-, Expr- und Update-Teil können mehrere Anweisungen stehen, die durch den Kommaoperator getrennt sind (siehe nachfolgendes Beispiel). Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

66 C-Spezialitäten der for-Schleife II
For-Schleife mit zwei Laufvariablen Beispiel: Kopieren eines Feldes in ein anderes, jedoch in umgekehrter Reihenfolge: for (int i = 0, int j = 999; i < 1000; i++, j++) { b[j] = a[j]; } Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

67 Verschachtelte Schleifen
Im Gegensatz zur while- und do-Schleife werden for-Schleifen öfters verschachtelt eingesetzt. Einsatzmöglichkeiten: Matrizenrechnung, z.B. Produkt zweier Matrizen allgemein Verarbeitung mehrdimensionaler Felder Achsenbeschriftung bei Erzeugung von Rahmenkarten Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

68 Verschachtelte Schleifen: Beispiel
#include <iostream.h> #define SPALTEN 10 #define ZEILEN 5 int main() // MUL_ARR.CPP mehrdimensionale Arrays nach D. Louis { char x[ZEILEN][SPALTEN]; int i, j; for (i = 0; i < ZEILEN; i++) for (j = 0; j < SPALTEN; j++) x[i][j] = 'a' + i; } cout << x[i][j]; cout << endl; return 0; Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

69 Initialisierung der for-Schleife I
Initialisierungsausdruck mit Liste von Anweisungsausdrücken Definition der Zählvariablen i und j vor der Schleife Zählvariablen i und j sind auch nach der Schleife noch gültig int i, j; for( i=0 , j=10 ; i < j ; i++ , j-- ) { cout << "i= " << i << " / j= " << j << endl; } // i und j bleiben gültig Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

70 Initialisierung der for-Schleife II
Definition von schleifen-lokalen Variablen Definition der Zählvariablen i und j im Schleifenheader  Zählvariablen i und j sind nach der Schleife ungültig for( int i=0 , j=10 ; i < j ; i++ , j-- ) { cout << "i= " << i << " / j= " << j << endl; } // ungültig: // cout << "i= " << i << " / j= " << j << endl; Hinweis: Bei älteren Compilern sind die in der Schleife deklarierten Variablen auch nach der Schleife noch gültig! Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

71 Überprüfen der Schleifenbedingung
Bei false ( ==0 ) erfolgt ein Sprung hinter das Schleifenende. Fehlende Bedingung wird wie true ( !=0 ) behandelt! Schleifenrumpf kann jederzeit mit break verlassen werden  Sprung hinter das Schleifenende In C++: false entspricht 0 , alles andere !=0 ist true!!! Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

72 for-Schleife: Haken und Ösen
Von den drei Teilen der for-Schleife (Initialisierung, Bedingung, ) werden nur die ersten beiden durch Strichpunkt abgeschlossen. Hinter der schließenden, runden Klammer der for-Schleife darf kein Semikolon stehen, da sonst als Inhalt der for-Schleife immer nur eine leere Anweisung durchlaufen wird! Die Abbruchbedingung muss tatsächlich erreicht werden ... also beispielsweise sicherstellen, dass eine Laufvariable inkrementiert wird! Vermeiden Sie, eine Laufvariable im Schleifenrumpf zu modifizieren: for (i = 0; i != 10; i++) cout << i++ << endl; Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

73 Schleifen: Performanceaspekte
Entfernen Sie alle unnötigen Anweisungen aus Schleifen. Prüfen Sie alle Anweisungen, in denen keine Schleifenvariable auftaucht, ob Sie diese Anweisungen nicht im Sinnen einer Initialisierung vor der Schleife oder hinter der Schleife einfügen können. Vermeiden Sie, soweit es geht, zeitraubende Operationen (Ein- und Ausgabeoperationen, Kontrollausgaben, Funktionsaufrufe, ...). Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

74 Welche Schleifenkonstuktion?
for while Anzahl der Iterationen feststehend + - Anzahl der Iterationen berechenbar Schleifenvariable im Schleifenrumpf ändern Schleifen ohne Schleifenvariable Ereignisse als Abbruchbedingung Abbruchbedingung in Anweisungsteil sequentielle Dateiverarbeitung gewollte Endlosschleife nach: Dirk Louis: C/C++ Kompendium, Markt & Technik, 2000:531 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

75 Die for-Schleife in einem ersten Beispiel
Schreiben Sie ein C++-Programm (loop1.cpp) Aufgabe des Programms: Einlesen von 10 Gleitkommazahlen (über Tastatur), Berechnung Summe und Mittelwert, Prüfung, ob Ergebnis < oder >= 0. Ergebnisausgabe. Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

76 + Geringere Schachtelungstiefe von Kontrollstrukturen
Die break-Anweisung beendet die Ausführung einer Schleife durch Sprung unmittelbar hinter den Schleifenrumpf; bei geschachtelten Schleifen wird nur die Schleife beendet, in der die break-Anweisung aufgerufen wird. + Geringere Schachtelungstiefe von Kontrollstrukturen - Schlechtere Lesbarkeit von Programmen Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

77 Auswirkungen der break-Anweisung
while while( true ) { ... if( i > j ) break; } // hierhin Sprung mit break do do { ... if( i > j ) break; } while( true ); // hierhin Sprung mit break for( int i=0 , j=10 ; ; i++ ) { ... if( i > j ) break; } // hierhin Sprung mit break for Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

78 Vorzeitiges Beenden eines Schleifenduchgangs - die continue-Anweisung
Beendet die aktuelle Iteration des Schleifenrumpfs. Die Schleife wird mit der nächsten Iteration fortgesetzt. + Geringere Schachtelungstiefe von Kontrollstrukturen - Schlechtere Lesbarkeit von Programmen Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

79 Auswirkungen der continue-Anweisung
while( i < 100 ) { ... if( i == j ) continue; } while do { ... if( i == j ) continue; } while( i < 100 ); do for( int i=0 ; i < 100 ; i++ ) { ... if( i == j ) continue; } for Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I

80 goto-Anweisung Programmablauf wird an selbst definierter Sprungmarke fortgesetzt. Syntax: goto Label1; ... Label1: ... Sprünge nur innerhalb der gleichen Funktion möglich Führt leicht zu unübersichtlichem Programmcode Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I


Herunterladen ppt "Programmieren ... in C++ Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I."

Ähnliche Präsentationen


Google-Anzeigen