860 likes | 1.27k Views
Programmieren ... in C++. Ziele dieser Vorlesung. Auffrischen / Kennenlernen nicht objektorientierter Eigenschaften der Sprache C++
E N D
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 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 Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren I
Algorithmus 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. 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. 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 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 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 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 Variablenint 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. Trigraph Zeichen ??= # ??( [ ??/ \ ??) ] ??' ^ ??< { ??! | ??> } ??- ~ 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 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 StuttgartProgrammeiren I
Aufbau von main • Prototypdefinition:int main(int argc, char* argv[ ]);beziehungsweiseint 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;} Aufruf mit: if (CommandLineOptionExists(argc, argv, "-debug")){ ... 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);} 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) • Pseudocode • Struktogramm IF bedingung THEN anweisungsfolge END IF Ausdruck wahr falsch Anweisung1 • 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) • Pseudocode • Struktogramm IF bedingung THEN anweisungsfolge ELSE anweisungsfolge END IF Ausdruck wahr falsch Anweisung1 Anweisung2 • 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) • Pseudocode • Struktogramm IF bedingung_1 THEN anweisungsfolge_1 ELSIF bedingung_2 THEN anweisungsfolge_2 ... ELSE anweisungsfolge_n END IF Prof. Dr.-Ing. Franz-Josef Behr, HfT StuttgartProgrammeiren I