Upload
faramond-gettel
View
118
Download
1
Embed Size (px)
Citation preview
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren I
Programmieren ... in C++
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren 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!
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren I
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 3-528-15481-0, 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 StuttgartProgrammeiren I
Der Softwareentwicklungszyklus
EditierenHauptspeicher
Laden*.cpp Sichern
*.cpp
*.O BJ
*.EXE
Linken
Sicherungskopie
*.BAK
(M em ory)
Übersetzen
Ausführen
B ib lio theken
Datenträger(Festplatte,Diskette)
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren 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).
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren 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.
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren I
Projektphasen
Analyse
Algorithmus
Editieren
Compilieren
Linken
Testen
Projektphasen
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren I
Algorithmus
Eingangsgrößen
! Gegenstände
! E igenschaften
! Beziehungen
Ergebnisgrößen
! Gegenstände
! E igenschaften
! Beziehungen
Program m interneGrößen
! Datentypen
! Variablen
! Konstante
A lgorithm us
A bstrak tion In te rp re ta tion
A usgabe
Lösung des P rob lem s:
! Verarbe itungsrege ln! Transfo rm ation
??? !!!
Eingangsgrößen
! Gegenstände
! E igenschaften
! Beziehungen
Ergebnisgrößen
! Gegenstände
! E igenschaften
! Beziehungen
Program m interneGrößen
! Datentypen
! Variablen
! Konstante
A lgorithm us
A bstrak tion In te rp re ta tion
A usgabe
Lösung des P rob lem s:
! Verarbe itungsrege ln! Transfo rm ation
??? !!!
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren I
Prinzip “Teile und Herrsche”
Ein komplexeres Problem wird in Teilaufgaben zerlegt. Für jede Teilaufgabe wird ein entsprechender Lösungsalgortihmus
entwickelt.
P roblem
Teilproblem 1
Teilproblem 2
Teilproblem n
...
...
Te ila lgorithm us 1
...
...Te ila lgorithm us 2
Teila lgorithm us n
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren I
“Teile und Herrsche” II
Die Teilalgorithmen werden in Funktionen abgebildet. Funktionen kommunizieren untereinander. Die Gesamtheit der Funktionen bilden das Programm.
Im p lem en-tie rung
P roblem
Teilproblem 1
Teilproblem 2
Teilproblem n
...
...
P rogram m
Funktion 1
Funktion 2
Funktion n
...
...
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren I
Dokumentieren eines Algorithmus’
Drei wesentliche Verfahren:
– Umgangssprachliche Beschreibung
– Programmablaufplan
– Struktogramm (Nassi-Shneiderman-Diagramm)
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren I
Programmablaufplan
Fummel bloß nicht dran rum!
Du armesSchwein!
Hat es jemandgemerkt?
Alles klar!
Du Rindvieh!
Beginn
Kannst Du jemandem die Schuld zuschieben?
Kümmer' Dichnicht drum!
Hast Du daranherumgespeilt?
Wird man Dichverantwortlich
machen?
Funktioniertdie Anlage?
nein
ja
nein
nein
nein
nein
ja
ja
jaja
Pfeife unauffällig "La Paloma" und verschwinde!
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren 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 <iostream.h> // "Hauptprogramm"int main(int argc, char* argv[]){
using namespace std; cout << "Hello world!" << "\n" << "\n"; return 0;}
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren 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. 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 StuttgartProgrammeiren 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.
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren I
Wortsymbole
Wortsymbole der Sprache Cauto double int structbreak else long switchcase enum register typedefchar extern return unionconst float short unsignedcontinue for signed voiddefault goto sizeof volatiledo if static while
zusätzliche Wortsymbole der Sprache C++
asm friend private this class inlineprotected throw catch new public try
delete operator tempplate virtual
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren 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.
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren 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.
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren 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.
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren 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
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren 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 ...
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren I
Zahlen
ganzzahlig (0, 1, -1, 2, -2, ...) oder reell (0.0, 0.0001, -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 StuttgartProgrammeiren I
Zahlen II
Beispiele für korrekte Zahlen sind: 1 +2 -9 3.14 5E-9 47.11e10 0x12 0123.
Beispiele für unzulässige Zahlen sind: .1 +2. -9E 3,14 MDCXXI 5E-neun 4711*E10 .
Daneben gibt es noch einige Erweiterungen, die über die uns vertraute Art der Zahlendarstellung hinausgehen.
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren I
Spezialsymbole
[ ( ->* .* ] ( . -> ++ -- & * + - ~ ! / % << >> < > <= >= == != ^ | && || ?: = *= /= %= += -= <<= >>= &= ^= |= , # ## ::
[ ( ->* .* ] ( . -> ++ -- & * + - ~ ! / % << >> < > <= >= == != ^ | && || ?: = *= /= %= += -= <<= >>= &= ^= |= , # ## ::
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren 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??= #??( [??/ \??) ]??' ^??< {??! |??> }??- ~
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren 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""." ;
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren 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.
\n Zeilenvorschub (Zeilentrenner, neue Zeile, newline).\t Tabulator
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren 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.
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren I
Programmrahmen
// short description of your program// include section#include <iostream>using namespace std;// global constants sectionconst 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 codereturn 0;
}
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren 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.
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren 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.
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren I
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 StuttgartProgrammeiren I
Argumente anzeigen: Ergebnis
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren 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:
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren 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;}
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren 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,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 StuttgartProgrammeiren I
Lesbarkeit II
#include <stdlib.h>
#include <stdio.h>
main(l
,a,n,d)char**a;{
for(d=atoi(a[1])/10*80-
atoi(a[2])/5-596;n="@NKA\
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 <stdlib.h>
#include <stdio.h>
main(l
,a,n,d)char**a;{
for(d=atoi(a[1])/10*80-
atoi(a[2])/5-596;n="@NKA\
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 50 50 (Quelle: Rolf Isernhagen)
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren 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.
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren 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!
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren I
Kontrollstrukturen
Verzweigung do-Schleife (annehmende Schleife) while-Schleife (abweisende Schleife) for-Schleife
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren I
Verzweigung
Arten– unvollständige Alternative
– vollständige Alternative
– Mehrfachverzweigung
– Fallauswahl
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren I
Unvollständige Alternative (if)
Struktogramm
Ausdruckwahr falsch
Anweisung1
Pseudocode
IF bedingung THEN anweisungsfolgeEND IF
Syntaxdiagramm
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren I
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 StuttgartProgrammeiren 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, http://www.informatik.uni-halle.de/~boehme/
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren 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
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren 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 ) { ... }
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren I
Vollständige Alternative (if ... else)
Struktogramm
Ausdruckwahr falsch
Anweisung1 Anweisung2
Pseudocode
IF bedingung THEN anweisungsfolgeELSE anweisungsfolgeEND IF
Beispiel
if (a >= b) // Maximum zweier Zahlen ermitteln max = a;else max = b;
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren 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
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren 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
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren I
Mehrfache Alternativen (else if)
Ausdruck_1wahr falsch
wahr
Ausdruck_2
falsch
wahr
Ausdruck_3
falschAnweisung_1
Anweisung_2 Anweisung_3 Anweisung_else
Struktogramm Pseudocode
IF bedingung_1 THEN anweisungsfolge_1ELSIF bedingung_2 THEN anweisungsfolge_2 ...ELSE anweisungsfolge_nEND IF
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren 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();
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren I
Fallauswahl (case)
Ausdruck
case1 case2 ..... caseN default
Struktogramm PseudocodeSELECT ausdruck CASE fall_1: anweisungsfolge_1 ... CASE fall_n: anweisungsfolge_n ELSE anweisungsfolge_0END SELECT
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren 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
Qu
ell
e:
Gle
nn
La
ng
em
eie
r,U
ni
Hil
de
sh
eim
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren 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";}
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren 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.
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren I
Annehmende Schleife (do ... while)
Struktogramm Pseudocode
do AnweisungWhile (Ausdruck);
solange Ausdruck
Anweisung
doStatement
while ExpressionStatement ( )do ;
Syntaxdiagramm
Qu
ell
e:
Gle
nn
La
ng
em
eie
r,U
ni
Hil
de
sh
eim
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren I
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;
// größter gemeinsamer Teiler nach Eukliddo { rest = a % b; a = b; b = rest;} while ( rest > 0 );
Beispiel 2
Beispiel 1
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren I
Abweisende Schleife (while ... do)
Struktogramm Pseudocode
Syntaxdiagramm
while (Ausdruck) Anweisung;
solange Ausdruck
Anweisung
whileStatement
while Expression Statement( )
Qu
ell
e:
Gle
nn
La
ng
em
eie
r,U
ni
Hil
de
sh
eim
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren I
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 StuttgartProgrammeiren 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!
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren I
for-Schleife
Struktogramm Pseudocode
Beispiel
for (Ausdruck1; Ausdruck2; Ausdruck3)
Anweisung;
Ausdruck_1;
Ausdruck_2
Anweisung
Ausdruck_3;
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 StuttgartProgrammeiren 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:
Qu
ell
e:
Gle
nn
La
ng
em
eie
r,U
ni
Hil
de
sh
eim
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren 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<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 StuttgartProgrammeiren I
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 StuttgartProgrammeiren 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).
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren 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];}
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren 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
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren I
Verschachtelte Schleifen: Beispiel
#include <iostream.h>#define SPALTEN 10#define ZEILEN 5int 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;}
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren 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ültigcout << "i= " << i << " / j= " << j << endl;
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren 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!
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren 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!!!
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren 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;
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren 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, ...).
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren I
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 StuttgartProgrammeiren 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 < oder >= 0.
• Ergebnisausgabe.
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren 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
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren 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
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren 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
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren 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
Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren 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