C++ Teil 5. Sven Groß. 16. Nov Sven Groß (IGPM, RWTH Aachen) C++ Teil Nov / 16

Ähnliche Dokumente
C++ Teil 5. Sven Groß. 8. Mai IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 8. Mai / 16

C++ Teil 5. Sven Groß. 12. Nov IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Nov / 16

C++ Teil 5. Sven Groß. 13. Mai Sven Groß (IGPM, RWTH Aachen) C++ Teil Mai / 18

C++ Teil 6. Sven Groß. 23. Nov Sven Groß (IGPM, RWTH Aachen) C++ Teil Nov / 15

C++ Teil 4. Sven Groß. 30. Apr IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Apr / 16

C++ Teil 7. Sven Groß. 26. Nov IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Nov / 18

C++ Teil 7. Sven Groß. 30. Nov Sven Groß (IGPM, RWTH Aachen) C++ Teil Nov / 13

C++ Teil 6. Sven Groß. 27. Mai Sven Groß (IGPM, RWTH Aachen) C++ Teil Mai / 14

Programmierung mit C Zeiger

C++ - Einführung in die Programmiersprache Zeiger, Referenzen und Strukturen. Leibniz Universität IT Services Anja Aue

RO-Tutorien 3 / 6 / 12

C++ Teil 7. Sven Groß. 3. Juni Sven Groß (IGPM, RWTH Aachen) C++ Teil 7 3. Juni / 16

2. Programmierung in C

Methoden. Gerd Bohlender. Einstieg in die Informatik mit Java, Vorlesung vom

F Zeiger, Felder und Strukturen in C

Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny

Praxis der Programmierung

C++ Teil 8. Sven Groß. 5. Dez IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil 8 5. Dez / 16

Java Referenzdatentypen genauer betrachtet

RO-Tutorien 15 und 16

Probeklausur Name: (c)

C++ Wiederholung. Sven Groß. 24. Juni Sven Groß (IGPM, RWTH Aachen) C++ Wiederholung 24. Juni / 90

Programmierwerkstatt. Arrays, Pointer und Referenzen

Inhalt. 4.5 Arbeit mit Zeigern (engl. Pointer)

RO-Tutorien 17 und 18

C++ Teil 2. Sven Groß. 16. Apr IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Apr / 22

Informatik Vorkurs - Vorlesung 2

Zeiger (engl. Pointer)

8. Referenzen und Zeiger

Teil 5: Zeiger, Felder, Zeichenketten Gliederung

Teil 5: Felder, Zeiger, Zeigerarithmetik Gliederung

INE1 Arrays, Zeiger, Datenstrukturen

4.2 Gleitkommazahlen. Der Speicherbedarf (in Bits) ist üblicherweise. In vielen Anwendungen benötigt man gebrochene Werte. Physikalische Größen

Klassenvariablen, Klassenmethoden

Informatik. Pointer (Dynamisch) Vorlesung. 17. Dezember 2018 SoSe 2018 FB Ing - SB Umwelttechnik und Dienstleistung - Informatik Thomas Hoch 1

Pointer und Arrays. INE1, Montag M. Thaler, Office TG208. ZHAW, M. Thaler, K. Rege, G.

Mapra: C++ Teil 2. Felix Gruber, Sven Groß. 2. Mai 2017 IGPM. Felix Gruber, Sven Groß (IGPM) Mapra: C++ Teil 2 2. Mai / 11

Einführung Datentypen Verzweigung Schleifen. Java Crashkurs. Kim-Manuel Klein May 4, 2015

1. Referenzdatentypen: Felder und Strings. Referenz- vs. einfache Datentypen. Rückblick: Einfache Datentypen (1) 4711 r

1. Referenzdatentypen: Felder und Strings

Einstieg in die Informatik mit Java

Institut für Programmierung und Reaktive Systeme. Java 3. Markus Reschke

Kapitel 4: Zeiger. Inhalt. Zeiger Zeigerarithmetik

Zeiger: Der Adressoperator &

Felder (Arrays) und Zeiger (Pointers) - Teil I

C++ Teil 12. Sven Groß. 18. Jan Sven Groß (IGPM, RWTH Aachen) C++ Teil Jan / 11

Bereits behandelt: Einfache Datentypen / Variablen. Schleifen und Verzweigungen. Funktionen. Heute: Felder, Zeiger, Referenzen. Freispeicherverwaltung

Mapra: C++ Teil 6. Felix Gruber, Sven Groß. IGPM, RWTH Aachen. 13. Juni 2017

C++ Teil 9. Sven Groß. 17. Juni Sven Groß (IGPM, RWTH Aachen) C++ Teil Juni / 17

Informatik. Wiederholung Felder (Arrays), string. Vorlesung

Programmierung und Angewandte Mathematik

Institut für Programmierung und Reaktive Systeme. Java 2. Markus Reschke

Informatik. Strukturen und Aufzählungstypen. Vorlesung

Einstieg in die Informatik mit Java

Vorkurs Informatik WiSe 16/17

Einführung in die Programmierung

C-Programmierkurs Mathematik

Kapitel 4. Programmierkurs. Datentypen. Arten von Datentypen. Wiederholung Kapitel 4. Birgit Engels, Anna Schulze WS 07/08

Kapitel 5: Funktionen. Inhalt

EINFÜHRUNG IN DIE PROGRAMMIERUNG

3.8 Objekttypen und Arrays. Wir werden uns in diesem Kapitel näher mit den Objekttypen in Java beschäftigen.

Einführung in den Einsatz von Objekt-Orientierung mit C++ I

Praxis der Programmierung

einlesen n > 0? Ausgabe Negative Zahl

Abgeleitete Datentypen

Vorkurs Informatik WiSe 16/17

C++ Teil 10. Sven Groß. 17. Dez IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Dez / 14

II. Grundlagen der Programmierung. Beispiel: Merge Sort. Beispiel: Merge Sort (Forts. ) Beispiel: Merge Sort (Forts. )

EINFÜHRUNG IN DIE PROGRAMMIERUNG

6 ZEIGER UND REFERENZEN - ALLGEMEINES

Felder (Arrays) und Zeiger (Pointers) - Teil I

Bereits behandelt: Einfache Datentypen / Variablen. Schleifen und Verzweigungen. Funktionen. Heute: Felder, Zeiger, Referenzen. Freispeicherverwaltung

Zeiger & Co. Verwendung und Zeigerarithme5k. thorsten möller - informa5k.unibas.ch/lehre/fs13/cs109/03- c++- zeiger.pdf. Strukturen. enum.

15. Rekursion. Rekursive Funktionen, Korrektheit, Terminierung, Aufrufstapel, Bau eines Taschenrechners, BNF, Parsen

Die Anwesenheitspflicht beim Seminar gilt für diejenigen Teilnehmer, die einen Schein erwerben wollen. Für die Nachmittagsübungen gilt keine

Vorkurs C++ Programmierung

Arrays. Theorieteil. Inhaltsverzeichnis. Begriffe. Programmieren mit Java Modul 3. 1 Modulübersicht 3

Klassen als Datenstrukturen

Universität München, Hans-Peter Kriegel und Thomas Seidl Informatik II a[0] a[1] a[2] a[3] a[n 1]

Felder (Arrays) und Zeiger (Pointers) - Teil I

Dynamische Datentypen. Destruktor, Copy-Konstruktor, Zuweisungsoperator, Dynamischer Datentyp, Vektoren

Projekt 3 Variablen und Operatoren

Praxis der Programmierung

Informatik I (D-MAVT)

Arrays,Strings&Pointer in C/C++

Zeiger (1) Allgemeines

Einstieg in die Informatik mit Java

Die Klasse string Verfasser: Christian Bartl

Verschlüsseln eines Bildes. Visuelle Kryptographie. Verschlüsseln eines Bildes. Verschlüsseln eines Bildes

Dynamische Datentypen

Java Datentypen und Variablen

Kapitel 2: Grundelemente der Programmierung

Repetitorium Programmieren I + II

5.4 Arrays. Oft müssen viele Werte gleichen Typs gespeichert werden. Idee: Lege sie konsekutiv ab! Greife auf einzelne Werte über ihren Index zu!

Basiswissen in Informatik

Visuelle Kryptographie. Anwendung von Zufallszahlen

Transkript:

C++ Teil 5 Sven Groß 16. Nov 2015 Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 16. Nov 2015 1 / 16

Themen der letzten Vorlesung Namensräume Live Programming zu A2 Gleitkommazahlen Rundungsfehler Auswirkung auf Vergleiche Funktionen Überladung, Signatur Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 16. Nov 2015 2 / 16

Heutige Themen 1 Typumwandlung (Cast) 2 Funktionen Rekursion 3 const-deklaration 4 Referenzen 5 Zeiger 6 Felder Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 16. Nov 2015 3 / 16

Impliziter und expliziter Cast automatische, implizite Typumwandlung (Cast), leider auch bei Informationsverlust, z.b. int double, float double, int bool oft nützlich, aber manchmal auch gefährlich. Typumwandlung kann auch explizit angefordert werden: int a=2, b =5; double c= a / b, // 0, int - Division! d= double (a) / double (b), // 0.4, C- style cast e= static_cast < double >( b ) / a; // 2.5, C ++ - style cast + impliziter Cast Typumwandlung von/nach string funktioniert (leider) anders, dazu später mehr. Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 16. Nov 2015 4 / 16

Rekursive Funktionen Rekursive Funktionen rufen sich selber auf sicherstellen, dass Rekursion abbricht! einfache Rekursion kann auch durch Iteration (Schleife) ersetzt werden int fakultaet_ rekursiv ( int n) { if (n >1) return n* fakultaet_ rekursiv (n -1); else return 1; // Abbruch der Rekursion } int fakultaet_ iterativ ( int n) { int fak = 1; for ( int i =1; i <=n; ++i) fak *= i; return fak ; } Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 16. Nov 2015 5 / 16

Rekursive Funktionen (2) Beispiel: Fibonacci-Zahlen: a 0 := a 1 := 1, a n := a n 2 +a n 1 für n 2 int fib_ rekursiv ( int n) { if (n >= 2) return fib_ rekursiv ( n -2) + fib_ rekursiv ( n -1); else return 1; // Abbruch der Rekursion } Rekursion hier sehr ineffizient! fib_rekursiv( n ) erzeugt O(2 n 1 ) Aufrufe von sich selbst. Bei Berechnung von a n wird z.b. a 2 sehr oft neu berechnet. besser: Rekursion durch Iteration ersetzen Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 16. Nov 2015 6 / 16

Rekursive Funktionen (3) Beispiel: Fibonacci-Zahlen: a 0 := a 1 := 1, a n := a n 2 +a n 1 für n 2 int fib_ iterativ ( int n) { if (n < 2) return 1; } int ak, ak1 = 1, ak2 = 1; // a_k, a_{k -1}, a_{k -2} for ( int k= 2; k <= n; ++ k) { ak = ak2 + ak1 ; // nach Definition ak2 = ak1 ; ak1 = ak; // Variablen shiften } return ak; Iterativer Ansatz ist deutlich effizienter: Aufwand zur Berechnung von a n ist linear in n (nicht exponentiell) a 2 wird genau einmal berechnet (für k=2) Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 16. Nov 2015 7 / 16

const - Deklaration Das Schlüsselwort const vor dem Datentyp erzeugt konstante Variablen. const double Pi = 3.1415; Konstante Variablen dürfen gelesen, aber nicht verändert werden. taucht oft im Zusammenhang mit Funktionsparametern auf: void write_perreference( const RiesigerDatenTyp& v); Referenzparameter vermeidet Kopieren des Arguments (sinnvoll bei großen Datentypen), const-deklaration schützt vor unabsichtlichem Verändern. Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 16. Nov 2015 8 / 16

Referenzen bereits bekannt im Zusammenhang mit Referenzparametern, können aber auch woanders verwendet werden Referenz dient als Alias für bestehende Variable, die dann unter neuem Namen angesprochen werden kann Referenzen müssen mit Variable initialisiert werden, auf die sie verweisen int a= 3; int &r= a; // a hat Wert 3, r verweist auf 3 a+= 4; // a hat Wert 7, r verweist auf 7 r -= 2; // a hat Wert 5, r verweist auf 5 Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 16. Nov 2015 9 / 16

Zeiger (Pointer) Variable, die eine Speicheradresse enthält int i= 5; double d= 47.11; int * iptr ; // Zeiger auf int double * dptr ; // Zeiger auf double Adressoperator & liefert Zeiger auf Variable (nicht zu verwecheln mit Referenz-Deklaration) iptr = &i; dptr = &d; Dereferenzierungsoperator * liefert Wert an Speicheradresse (nicht zu verwecheln mit Zeiger-Deklaration) cout << (* dptr ); // gibt d aus (* iptr )= 42; // i ist jetzt 42 dptr d Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 16. Nov 2015 10 / 16

Zeiger (2) synonym: int *iptr; oder int* iptr; oder int * iptr; int * iptr, j, * kptr ; // zwei int - Zeiger und ein int ( j) double * d_zeiger, // ein double - Zeiger * e_ zeiger ; // noch ein double - Zeiger Speicheradressen werden meist im Hexadezimalsystem (0,...,9,A,...,F) angegeben, cout << iptr; liefert z.b. Ausgabe 0xBF = 11 16 +15 = 191 Nullzeiger zeigt ins Nirgendwo, signalisiert leeren Zeiger: iptr = 0; Initialisierung mit 0 oder NULL (in C++11: nullptr) const-qualifizierung für Zeiger und/oder Datentyp möglich: const int * p1; // Zeiger auf konstanten int int * const p2; // konstanter Zeiger auf int Eselsbrücke: von rechts nach links lesen! Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 16. Nov 2015 11 / 16

Felder (Arrays) Wichtiger Verwendungszweck für Zeiger: Felder Nummerierung der Einträge beginnt bei 0, endet bei n-1 Zugriff auf Einträge mit [ ]-Operator keine Bereichsprüfung (Speicherverletzung!!) double feld [5]; // legt ein Feld von 5 doubles an // ( nicht initialisiert ), // feld ist ein double - Zeiger for ( int i =0; i <5; ++i) feld [ i]= 0.7; // setzt Eintraege 0...4 cout << (* feld ); // gibt ersten Eintrag aus // ( feld [0] und * feld synonym ) feld [0] [1] [2] [3] [4] cout << feld [5]; // ungueltiger Zugriff! // Kein Compilerfehler, evtl. // Laufzeitfehler ( segmentation fault ) Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 16. Nov 2015 12 / 16

Initialisierung von Feldern Felder können bei Erzeugung auch initialisiert werden, in diesem Fall muss die Länge nicht spezifiziert werden. double werte [5]= { 1.1, 2.2, 3.3, 4.4, 5.5}; // legt ein Feld von 5 doubles an // und initialisiert es mit geg. Werten double zahl [5]= { 1.1, 2.2}; // ( Rest mit Null initial.) int lottozahlen []= { 1, 11, 23, 29, 36, 42}; // legt ein Feld von 6 ints an ( ohne Laengenangabe ) // und initialisiert es mit geg. Werten int vertex_of_edge [3][2]= { {1, 2}, {0, 2}, {0, 1} }; // legt ein zweidimensionales int - Feld an // mit 3 x2 gegebenen Werten. Typ : int ** v 0 Quiz: Welchen Typ hat der Ausdruck vertex_of_edge[1]? Wie kann ich den 1. Eckpunkt der 3. Kante abfragen? v 2 e 1 e 2 Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 16. Nov 2015 13 / 16 e0 v 1

Kopieren von Feldern double werte [5]= { 1.1, 2.2, 3.3, 4.4, 5.5}; double * nocheinfeld = werte ; // kopiert nur den Zeiger!!! nocheinfeld [2]= 99; // veraendert werte [2]!!! double auchfalsch [5]; // reserviert neuen Speicher (5 doubles ), // auchfalsch = werte ; // Compilerfehler double richtig [5]; // neuen Speicher reservieren for ( int i =0; i <5; ++i) richtig [ i]= werte [ i]; // Werte kopieren Vorsicht beim Kopieren von Feldern! Zuweisung = verändert nur den Zeiger, nicht aber den Feldinhalt Kopie benötigt eigenen Speicher Eintrag für Eintrag kopieren Alternative für Felder: Vektoren bequem mit = kopieren (dazu später mehr) Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 16. Nov 2015 14 / 16

Spezielle char-felder: C-Strings Relikt aus C-Zeiten: C-Strings char-felder hören mit Terminationszeichen \0 auf Initialisierung mit "..." char cstring []= " Hallo "; // Zeichenkette mit 5 Zeichen, aber Feld mit 6 chars // { H, a, l, l, o, \0 } char message []= " Hier spricht Edgar Wallace \n"; // noch ein C- String string botschaft = message ; // C ++ - String, der mit C- String initialisiert wird const char * text = botschaft. c_str (); //... und wieder als C- String Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 16. Nov 2015 15 / 16

Zeigerarithmetik Zeiger + int liefert Zeiger: double wert [5]= { 1.1, 2.2, 3.3, 4.4, 5.5}; cout << (* wert ); // gibt ersten Eintrag aus // ( wert [0] und * wert synonym ) double * zeig = wert + 3; cout << (* zeig ); // gibt vierten Eintrag aus // ( wert [3] und *( wert +3) synonym ) double * ptr = &( wert [2]); ptr ++; bool same = ( zeig == ptr ); // true Zeiger Zeiger liefert int (Abstand): int differenz = zeig - ptr, index = zeig - wert ; wert zeig [0] [1] [2] [3] [4] Quiz: Werte von differenz und index? Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 16. Nov 2015 16 / 16