Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

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

Ähnliche Präsentationen


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

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

2 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I 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!

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

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

5 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I 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).

6 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I 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.

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

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

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

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

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

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

13 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I 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 // "Hauptprogramm" int main(int argc, char* argv[]) { using namespace std; cout << "Hello world!" << "\n" << "\n"; return 0; }

14 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I 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.Trennzeichen Symbole dürfen - auch wenn sie aus mehreren Zeichen bestehen - nie auf zwei oder mehrere Zeilen verteilt werden.mehreren Zeichen

15 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I 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.BezeichnernWortsymbolen

16 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I 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++ asmfriendprivatethisclassinlineprotected throwcatchnewpublictry deleteoperatortempplatevirtual

17 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I 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.

18 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I 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.

19 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I 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.

20 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I 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 0.16 #define TRUE 1

21 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I Konventionen II 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...

22 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I 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.

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

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

25 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I 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. TrigraphZeichen ??=# ??([ ??/\ ??)] ??'^ ??<{ ??!| ??>} ??-~ TrigraphZeichen ??=# ??([ ??/\ ??)] ??'^ ??<{ ??!| ??>} ??-~

26 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I 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""." ;

27 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I 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. \nZeilenvorschub (Zeilentrenner, neue Zeile, newline). \tTabulator

28 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I 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.

29 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I Programmrahmen // short description of your program // include section #include 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; }

30 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I 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.

31 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I 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.

32 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I Argumente anzeigen //File: mainargs.cpp // shows command arguments #include 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; }

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

34 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I 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; } if (CommandLineOptionExists(argc, argv, "-debug")) {... Aufruf mit:

35 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I 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; }

36 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I 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*k&&++a[--i]); } Quelle: C++ Programmieren mit Stil, Thomas Strasser dpunkt Verlag 1997

37 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I Lesbarkeit II #include 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);} #include 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)

38 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I 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.

39 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I 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!

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

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

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

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

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

45 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I 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

46 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I 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 ) {... }

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

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

49 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I 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

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

51 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I Mehrfache Alternativen: Beispiel 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();

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

53 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I Fallauswahl (case) II 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 Quelle: Glenn Langemeier, Uni Hildesheim

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

55 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I 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.

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

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

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

59 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I Abweisende Schleife: Beispiel // calculate square and triple values #include 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; }

60 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I 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!continue-Anweisung

61 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I for-Schleife Struktogramm Pseudocode Beispiel for (Ausdruck1; Ausdruck2; Ausdruck3) Anweisung ; 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); }

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

63 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I Einsatzmöglichkeiten Bearbeitung von Feldern Analyse und Bearbeitung von Zeichenketten // Umdrehen einer Zeichenkette s ("abcd"->"dcba" for(i=0, j=strlen(s)-1; i

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

65 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I 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).

66 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I 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]; }

67 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I 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

68 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I Verschachtelte Schleifen: Beispiel #include #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; } for (i = 0; i < ZEILEN; i++) { for (j = 0; j < SPALTEN; j++) cout << x[i][j]; cout << endl; } return 0; }

69 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I 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 cout << "i= " << i << " / j= " << j << endl;

70 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I 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!

71 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I Ü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 !!!

72 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I 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;

73 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I 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,...).

74 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I Welche Schleifenkonstuktion? forwhile 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

75 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I 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 = 0. Ergebnisausgabe.

76 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I 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

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

78 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I 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

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

80 Prof. Dr.-Ing. Franz-Josef Behr, HfT Stuttgart Programmeiren I 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


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

Ähnliche Präsentationen


Google-Anzeigen