




























































































Besser lernen dank der zahlreichen Ressourcen auf Docsity
Heimse Punkte ein, indem du anderen Studierenden hilfst oder erwirb Punkte mit einem Premium-Abo
Prüfungen vorbereiten
Besser lernen dank der zahlreichen Ressourcen auf Docsity
Download-Punkte bekommen.
Heimse Punkte ein, indem du anderen Studierenden hilfst oder erwirb Punkte mit einem Premium-Abo
Community
Finde heraus, welche laut den Docsity-Nutzern die besten Unis deines Landes sind
Kostenlose Leitfäden
Lade unsere Leitfäden mit Lernmethoden, Hilfen zur Angstbewältigung und von Docsity-Tutoren erstellte Tipps zum Verfassen von Haus- und Abschlussarbeiten kostenlos herunter
Art: Skripte
Hochgeladen am 09.04.2020
4.5
(23)1 / 140
Diese Seite wird in der Vorschau nicht angezeigt
Lass dir nichts Wichtiges entgehen!
Graz, SS 2019, 29. Mai 2019
vi INHALTSVERZEICHNIS
Bemerkungen:
Warnung : Das Programm auf dem Computer wird genau das ausf¨uhren, was im Pro- grammcode beschrieben ist!
Typischer Anf¨angerkommentar: Aber das habe ich doch ganz anders gemeint.
Merke : Computer sind strohdumm! Erst die (korrekte und zuverl¨assige) Software nutzt die M¨oglichkeiten der Hardware.
Warum denn C++, es gibt doch die viel bessere Programmiersprache XYZ! Der Streit uber die beste, oder die bessere Programmiersprache ist so alt wie es Programmiersprachen gibt.¨ Folgende Gr¨unde sprechen gegenw¨artig f¨ur C++:
1.2 Das “Hello World” - Programm in C++
Wir beginnen mit dem einfachen “Hello World”-Programm, welches nur den String “Hello World” in einem Terminalfenster ausgeben wird. Damit l¨aßt sich schon ¨uberpr¨ufen, ob der Compiler und die IDE korrekt arbeiten (und Sie diese bedienen k¨onnen).
Listing 1.1: Quelltext von Hello World 1 #include // d e k l a r i e r t cout , e n d l using namespace s t d ; // e r l a u b t Nutzung d e s Namensraumes s t d 3 // n u t z e c o u t s t a t t s t d : : c o u t i n t main ( ) // Beginn Hauptprogramm 5 { // Beginn Scope s t d : : c o u t << ” H e l l o World ” << s t d : : e n d l ; 7 return 0 ; // Beende das Programm } // Ende Scope , Ende Hauptprogramm HelloWorld.cpp Der simple Code im Listing 1.1 enth¨alt schon einige grundlegende Notwendigkeiten eines C++- Programmes:
Quelltext eingeben und compilieren, Programm ausf¨uhren:
Tip zum Programmieren: Es gibt (fast) immer mehr als eine M¨oglichkeit, eine Idee im Computerprogramm zu realisieren. =⇒ Finden Sie Ihren eigenen Programmierstil und verbessern Sie ihn laufend.
1.5 Integrierte Entwicklungsumgebungen
Obwohl nicht unbedingt daf¨ur n¨otig, werden in der Programmierung h¨aufig IDEs (Integrated Deve- lopment Environments) benutzt, welche Editor, Compiler, Linker und Debugger - oft auch weitere Tools enthalten. In der LV benutzen wir freie Compiler^11 und -entwicklungstools^12 , insbesondere die Compiler basieren auf dem GNU-Projekt und funktionieren unabh¨angig von Betriebssystem und Prozessortyp. Damit ist der von Ihnen geschriebene Code portabel und l¨auft auch auf einem Supercomputer (allerdings nutzt er diesen nicht wirklich aus, dazu sind weitere LVs n¨otig). Grund- lage des Kurses sind die g++-Compiler ab Version 4.7.1, da diese auch den neuen C++11-Standard unterst¨utzen. Gegebenenfalls muß der Code mit der zus¨atzlichen Option -std=c++11 ¨ubersetzt werden.
Wir werden unter Windows die IDE Code::Blocks^13 Version 16.01 [Stand: Feb. 2016] benut- zen welche auf den GNU-Compileren und -Werkzeugen basiert. Dies erlaubt die Programmierung unter Windows ohne die Portabilit¨at zu verlieren, da diese IDE auch unter LINUX verf¨ugbar ist. Sie k¨onnen diese Software auch einfach privat installieren, siehe Download^14 (nehmen Sie codeblocks-16.01mingw-setup.exe) und das Manual^15. Installieren Sie in jedem Fall vorher das Softwaredokumentationstool doxygen^16 (und cppcheck^17 ), da es nur dann automatisch in die IDE eingebunden wird.
Da die Entwicklungsumgebung alles vereinfachen soll, ist vor dem ersten Hello-World-Programm etwas mehr Arbeit zu investieren.
(a) Im sich ¨offnenden Fenster das Icon Console Application anklicken und dann auf Go klicken. (b) Bei der Auswahl der Programmiersprache C++ anklicken und dann Next. (c) Den Projektitel angeben - hier bitte das Namensschema bsp nr mit nr als Nummer der abzugebenden ¨Ubungsaufgabe einhalten. Den Folder (das Verzeichnis) ausw¨ahlen in welchem das Projekt gespeichert werden soll. Darin wird dann automatisch ein Unterverzeichnis mit dem Projektnamen angelegt. Next klicken. (d) Die Debug und die Release configuration aktivieren. Auf Finish klicken. (e) Im Workspace erscheint das neue Projekt bsp 1 welches in seinen Sources das File main.cpp enth¨alt. Auf dieses File klicken. (f) Im Editor sehen Sie nun folgenden Programmtext: #include
(^11) http://gcc.gnu.org/ (^12) http://www.gnu.org/ (^13) http://www.codeblocks.org/ (^14) http://www.codeblocks.org/downloads/26#windows (^15) http://www.codeblocks.org/user-manual (^16) http://www.doxygen.org (^17) http://cppcheck.sourceforge.net/
1.6 Erste Schritte mit Variablen
Wir beginnen mit dem einfachen “Hello World”-Programm, welches nur den String “Hello World” in einem Terminalfenster ausgibt. Damit l¨aßt sich schon ¨uberpr¨ufen, ob der Compiler und die IDE korrekt arbeiten (und Sie dies bedienen k¨onnen). Anschließend arbeiten wir mit ein paar einfachen Variablen.
Listing 1.2: Erweitertes “Hello World” #include // d e k l a r i e r t cout , e n d l 2 #include // d e k l a r i e r t K l a s s e s t r i n g using namespace s t d ; // e r l a u b t Nutzung d e s Namensraumes s t d 4 // n u t z e s t r i n g s t a t t s t d : : s t r i n g i n t main ( ) // Beginn Hauptprogramm 6 { // Beginn Scope c o u t << ” H e l l o World ” << e n d l ; 8 i n t i ; // D e k l a r a t i o n Ganzzahl−V a r i a b l e i c o u t << ” i = ” ; 10 c i n >> i ; // E i n l e s e n e i n e s Wertes f u e r i // Ausgeben d e s Wertes von i 12 c o u t << e n d l << ” i i s t g l e i c h ” << i << ” e i n e g a n z e Z a h l ” << e n d l ; // 14 f l o a t a , b ; // D e k l a r a t i o n Gleikomma−V a r i a b l e n c o u t << ” a b : ” ; 16 c i n >> a >> b ; c o u t << ” : : ” << a << ” ” << b << e n d l ; // ‘ e n d l ’ − new l i n e 18 // f l o a t c = a+b ; // D e k l a r a t i o n und D e f i n i t i o n von c 20 const s t r i n g s s ( ” c : : ” ) ; // D e k l a r a t i o n und D e f i n i t i o n von s s c o u t << s s << c << e n d l ; 22 return 0 ; // Beende das Programm } // Ende Scope , Ende Hauptprogramm HelloWorld_2.cpp
Obiger Code enth¨alt bekannte Teile aus dem Listing 1.1, wir werden kurz die neuen Zeilen erl¨autern:
[2] Die Deklarationen f¨ur den Datentyp (die Klasse) std::string werden inkludiert. In Zeile 3 wird der Namensraum f¨ur std freigegeben.
[8] Ein ganzzahlige Variable^18 i wird deklariert und darf damit in den nachfolgenden Zeilen des G¨ultigkeitsbereichs zwischen { und } verwendet werden, also bis zur Zeile 22. Die Variable i kann ganzzahlige Werte aus [− 2 −^31 , 2 −^31 − 1] annehmen.
[10] Die Variable i wird ¨uber den Terminal (Tastatureingabe) eingelesen. cin und >> sind Eingabestrom und -operator analog zur Ausgabe mit cout und <<.
[12] Die Variable i wird gemeinsam mit einem beschreibenden String (Zeichenkette) ausgegeben.
[14] Deklaration der Gleikommazahlen einfacher Genauigkeit (engl.: single precision^19 ) a und b.
[16] Einlesen von Werten f¨ur a und b. Ausgabe der Variablenwerte in Zeile 17.
[19] Deklaration der Gleikommavariablen c und gleichzeitige Definition (Zuweisen eines Wertes) aus den Variablen a und b. Hierbei ist = der Zuweisungsoperator und + der Additions- operator f¨ur Gleitkommazahlen.
[20] Deklaration und gleichzeitige Definition eines konstanten (const) Strings ss. Das Schl¨usselwort legt fest, daß der ss zugewiesene Wert nicht mehr ver¨andert werden kann.
[21] Gemeinsame Ausgabe des konstanten Strings und der Gleikommavariablen.
Damit haben wir eine Grundlage, um uns in die Programmierung mit C++ schrittweise einzuar- beiten.
(^18) http://de.wikipedia.org/wiki/Integer_(Datentyp)#Maximaler_Wertebereich_von_Integer (^19) http://de.wikipedia.org/wiki/IEEE_754#Zahlenformate_und_andere_Festlegungen_des_ IEEE-754-Standards
Typ Speicherbedarf Inhalt m¨ogliche Werte in Byte char 1 ASCII-Zeichen ’H’, ’e’, ’\n’ bool 1 Booleanvariable false, true [erst ab C90] signed char 1 [− 128 , 127] ; -117, 67 unsigned char 1 [0, 255] ; 139, 67 short [int] 2 [− 215 , 215 − 1] ; - unsigned short [int] 2 [0, 216 − 1] ; 40000 int 4 Ganze Zahlen [− 231 , 231 − 1] unsigned [int] 4 (integer) [0, 232 − 1] long [int] 4 wie int unsigned long [int] 4 wie unsigned int long long [int] 8 [− 263 , 263 − 1] unsigned long long [int] 8 [0, 264 − 1] size t implementierungsabh¨angig unsigned long long int float 4 Gleitkommazahlen 1.1, -1.56e- double 8 (floating point numbers) 1.1, -1.56e-132, 5.68e+
Tabelle 2.1: Speicherbedarf grundlegender Datentypen [Stand 03/2019]
Listing 2.1: Abfrage der Speichergr¨oße von Datentypen 1 #include using namespace s t d ; 3 i n t main ( ) { 5 i n t i i ; c o u t << ” S i z e o f i n t : ” << s i z e o f ( i i ) << e n d l ; 7 c o u t << ” S i z e o f u n s i g n e d i n t : ” << s i z e o f ( unsigned i n t ) << e n d l ; return 0 ; 9 } DataTypes.cpp
Die Variablenbezeichner m¨ussen gewissen Regeln folgen (wiki^5 ):
(^3) https://de.wikipedia.org/wiki/IEEE_ (^4) https://de.wikipedia.org/wiki/Gleitkommazahl#Hidden_bit (^5) http://de.wikipedia.org/wiki/C_(Programmiersprache)#Deklarationen
G¨ultig Ung¨ultig Grund i j ijl i3 3i 3 ist kein Buchstabe 3a 3*a * ist Operatorzeichen Drei mal a b-a - ist Operatorzeichen auto1 auto auto ist Schl¨usselwort
Tabelle 2.2: Einge erlaubte und nicht erlaubte Variablenbezeichner
Die Bezeichner von Variablen, Konstanten etc. sind im Regelfall lokal, d.h., ein Bezeichner ist nur innerhalb seines, von { } begrenzten Blockes von Codezeilen g¨ultig, in welchem dieser Bezeichner deklariert wurde. Daher nennt man diesen Block den G¨ultigkeitsbereich (scope) dieser Variablen. Siehe dazu Listing 1.1 und §4.2.
Wird eine Variablenvereinbarung zus¨atzlich mit dem Schl¨usselwort const gekennzeichnet, so kann diese Variable nur im Vereinbarungsteil initialisiert werden und danach nie wieder, d.h., sie wirkt als eine Konstante.
Listing 2.2: Definition und Deklaration von Konstanten und Variablen #include 2 using namespace s t d ; i n t main ( ) 4 { const i n t N = 5 ; // F i r s t and o n l y i n i t i a l i z a t i o n o f c o n s t a n t N 6 i n t i , j = 5 ; // F i r s t i n i t i a l i z a t i o n o f v a r i a b l e j // u n i t i a l i z e d v a r i a b l e i 8 c o u t << ” H e l l o World\n” ; i = j+ N; 10 c o u t << e n d l << i << ” ” << j << ” ” << N << e n d l ; return 0 ; 12 } Ex226.cpp Nach der Deklaration in Zeile 6 ist die Variable i noch nicht mit einem Wert belegt, d.h., sie hat einen undefinierten Status. In Zeile 7 w¨urde der Wert von i zuf¨allig sein, je nachdem was gerade in den reservierten 4 Byte als Bitmuster im Computerspeicher steht. Damit w¨are das Ergebnis einer Berechung mit i nicht vorhersagbar (nicht deterministisch) und damit wertlos. Also sollte i gleich bei der Deklaration auch definiert (initialisiert) werden. In C++ kann man ausnutzen, daß Deklarationsteil und Implementierungsteil gemischt werden k¨onnen. Dies wird im Listing 2.3 ausgenutzt, sodaß die Variable i erst in Zeile 4 deklariert wird, wo dieser auch gleich ein sinnvoller Wert zugewiesen werden kann.
Listing 2.3: Variablen erst bei Gebrauch deklarieren const i n t N = 5 ; // F i r s t and o n l y i n i t i a l i z a t i o n o f c o n s t a n t N 2 i n t j = 5 ; // F i r s t i n i t i a l i z a t i o n o f v a r i a b l e j c o u t << ” H e l l o World\n” ; 4 i n t i = j+ N; // B e t t e r : i n i t i a l i z e v a r i a b l e a t d e c l a r a t i o n Ex226_b.cpp
2.2 Literale Konstanten
Die meisten Programme, auch HelloWorld.cpp, verwenden im Programmverlauf unver¨anderliche Werte, sogenannte Literale und Konstanten. Literale Konstanten sind Werte ohne Variablenbe- zug welche in Ausdr¨ucken explizit angegeben werden und zus¨atzliche Typinformationen enthalten k¨onnen.
2.3 Einige h¨ohere Datentypen in C++
Die Standardbibliothek und die Standard Template Library (STL) stellen eine große Auswahl an komfortablen h¨oheren Datenkonstrukten (genauer: Klassen und Container ) zur Verf¨ugung, welche das Programmieren vereinfachen. Die intensive Anwendung der Container f¨ur eigene Datenstruk- turen (und Klassen) erfordert Kenntnisse in Klassenprogrammierung, Vererbung und Templates, welche wir erst sp¨ater behandeln werden. Um aber schon mit diesen h¨oheren Datentypen arbeiten zu k¨onnen, erfolgt hier ein kurze Einf¨uhrung in string, complex, vector und valarray. Vertiefend und weiterf¨uhrend seien dazu u.a. [KPP02, KS02, SB95] empfohlen.
Diese Standardklasse string [KPP02, § 18] erlaubt eine komfortable Zeichenkettenverarbeitung
Listing 2.5: Erste Schritte mit^ string 1 #include #include 3 using namespace s t d ; i n t main ( ) 5 { s t r i n g aa { ”Das i s t d e r e r s t e S t r i n g ” } ; 7 s t r i n g bb { } ; i f ( bb. empty ( ) ) // Test a u f l e e r e n S t r i n g 9 { c o u t << ” S t r i n g bb i s t noch l e e r ” <<e n d l ; 11 } bb = ” z w e i t e r S t r i n g ” ; 13 // c i n >> bb ; // d i r e k t e Eingabe e i n e s S t r i n g s s t r i n g c c=aa + ” und ” + bb ; // S t r i n g s aneinanderhaengen 15 c o u t << c c << e n d l ; // Laenge d e s S t r i n g s ausgeben 17 c o u t << ” i s t ” << c c. s i z e ( ) << ” Z e i c h e n l a n g. ” << e n d l ; s t r i n g dd ( c c ) ; // S t r i n g dd h a t g l e i c h e Laenge wie aa 19 // und g l e i c h e Daten f o r ( unsigned i n t i =0; i <dd. s i z e ( ) ; ++i ) 21 { c o u t << dd [ i ] << ” ” ; // Ausgabe i −t e s Zeichen von dd 23 } return 0 ; 25 } demoString.cpp Die Konvertierung von Zahlen in Strings und umgekehrt wird hier^6 erl¨autert.
Die Standardklasse complex
Listing 2.6: Erste Schritte mit^ complex #include 2 #include
(^6) http://www.cplusplus.com/articles/D9j2Nwbp/
} demoComplex.cpp
demoVector.cpp Die Containerklasse vector
Statischer Vektor
Nachfolgender Code demonstriert den Einsatz eines statischen Vektors, d.h., die Anzahl der Vek- torelemente is a priori bekannt. Mit resize(laenge ) kann diese Anzahl der Elemente auf einen neuen Wert ge¨andert werden (dies ist eigentlich schon dynamisch). Die neuen Elemente m¨ussen danach noch mit Werten initialisiert werden.
Listing 2.7: Erste Schritte mit^ vector^ als statischem Vektor 1 #include #include
Dynamischer Vektor
Obiger Code behandelt Vektoren konstanter L¨ange. Wenn die Anzahl der Vektorelemente a priori unbekannt ist, dann kann ein vorhandener Vektor durch Benutzung der Methode push back(value ) um ein weiteres Element mit dem Wert value verl¨angert werden.
Listing 2.8: Erste Schritte mit vector als dynamischem Vektor 1 #include #include