Vorkurs C++ Programmierung

Ähnliche Dokumente
Programmiertechnik. Teil 4. C++ Funktionen: Prototypen Overloading Parameter. C++ Funktionen: Eigenschaften

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

Typ : void* aktuelle Parameter Pointer von beliebigem Typ

Programmierung und Angewandte Mathematik

7 Funktionen. 7.1 Definition. Prototyp-Syntax: {Speicherklasse} {Typ} Name ({formale Parameter});

Kurze Einführung in die Programmiersprache C++ und in Root

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

Arrays (Felder/Vektoren)

2. Programmierung in C

Variablen. int Flugzeug. float. I write code Hund. String. long. Borchers: Programmierung für Alle (Java), WS 06/07 Kapitel

Vorkurs Informatik: Erste Schritte der Programmierung mit C++

Vorlesungsprüfung Programmiersprache 1

Deklarationen in C. Prof. Dr. Margarita Esponda

Einführung in C. EDV1-04C-Einführung 1

Zeiger. C-Kurs 2012, 2. Vorlesung. Tino Kutschbach 10.

Methoden und Wrapperklassen

8. Referenzen und Zeiger

Martin Unold INFORMATIK. Geoinformatik und Vermessung

Arrays. Einleitung. Deklarieren einer Array Variablen

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

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

JavaScript. Dies ist normales HTML. Hallo Welt! Dies ist JavaScript. Wieder normales HTML.

F Zeiger, Felder und Strukturen in C

Elementare Datentypen in C++

C-Grundlagen. zur Programmierung des MicroControllersystems MiCoWi

Verwendung Vereinbarung Wert einer Funktion Aufruf einer Funktion Parameter Rekursion. Programmieren in C

Grundlagen der OO- Programmierung in C#

Modul Entscheidungsunterstützung in der Logistik. Einführung in die Programmierung mit C++ Übung 4

Übung zur Vorlesung Wissenschaftliches Rechnen Sommersemester 2012 Auffrischung zur Programmierung in C++, 1. Teil

Funktionen Häufig müssen bestimmte Operationen in einem Programm mehrmals ausgeführt werden. Schlechte Lösung: Gute Lösung:

Pass by Value Pass by Reference Defaults, Overloading, variable Parameteranzahl

4.2 Programmiersprache C

2. Unterprogramme und Methoden

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

10 Die Programmiersprache C99: Zusammenfassung

6. Funktionen, Parameterübergabe

Java 8. Elmar Fuchs Grundlagen Programmierung. 1. Ausgabe, Oktober 2014 JAV8

Die Programmiersprache C99: Zusammenfassung

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

zu große Programme (Bildschirmseite!) zerlegen in (weitgehend) unabhängige Einheiten: Unterprogramme

6 ZEIGER UND REFERENZEN - ALLGEMEINES

Grundlagen der Programmierung Prof. H. Mössenböck. 6. Methoden

PIC16 Programmierung in HITECH-C

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!

Einführung Programmierpraktikum C Michael Zwick

Felder, Zeiger und Adreßrechnung

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

Variablen. Deklaration: «Datentyp» «Variablenname» Datentyp bestimmt Größe in Bytes: sizeof Beispiel: long int v; Größe: 4 Bytes

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

Inhalt. 4.7 Funktionen

Unterlagen. CPP-Uebungen-08/

JAVA BASICS. 2. Primitive Datentypen. 1. Warum Java? a) Boolean (logische Werte wahr & falsch)

Teil 5: Zeiger, Felder, Zeichenketten Gliederung

2. Programmierung in C

Felder (1) Felder (Arrays) speichern viele Datenelemente des gleichen Typs. Auf einzelne Elemente kann über einen Index zugegriffen werden

Grundlagen der Programmierung

1. Referenzdatentypen: Felder und Strings

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

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

Ausgabe:

3.2 Datentypen und Methoden

Grundlagen der Programmierung

Tag 4 Repetitorium Informatik (Java)

Tag 8 Repetitorium Informatik (Java)

Programmiervorkurs Einführung in Java Tag 1

Inhaltsverzeichnis. Grundbegriffe der C-Programmierung Für den HI-TECH C-Compiler

Funktionen in Matlab. Nutzerdefinierte Funktionen können in.m-datei gespeichert werden

Inhalt. 4.5 Arbeit mit Zeigern (engl. Pointer)

RO-Tutorien 3 / 6 / 12

Einstieg in die Informatik mit Java

Schachtelung der 2. Variante (Bedingungs-Kaskade): if (B1) A1 else if (B2) A2 else if (B3) A3 else if (B4) A4 else A

Algorithmen und Datenstrukturen II

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

Wiederholung Wozu Methoden? Methoden Schreiben Methoden Benutzen Rekursion?! Methoden. Javakurs 2012, 3. Vorlesung

Programmierung mit C Zeiger

Java Einführung Methoden. Kapitel 6

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

Programmiersprachen Einführung in C

zu große Programme (Bildschirmseite!) zerlegen in (weitgehend) unabhängige Einheiten: Unterprogramme

C-Pointer (Zeiger, Adressen) vs. C++ Referenzen

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

Programmieren in C. Funktionen mit Zeigern und Adressen. Prof. Dr. Nikolaus Wulff

Ein kleiner Blick auf die generische Programmierung

C/C++-Programmierung

Martin Unold INFORMATIK. Geoinformatik und Vermessung

Programmieren in C / C++ Grundlagen C 4

C- Kurs 08 Zeiger. Dipl.- Inf. Jörn Hoffmann leipzig.de. Universität Leipzig Ins?tut für Informa?k Technische Informa?

Transkript:

Vorkurs C++ Programmierung Funktionen Rückblick Operatoren logische Verknüpfungen Zusammengesetzte Operatoren ( Zuweisungsoperatoren ) Kontrollstrukturen Bedingte Anweisungen (if-abfrage, switch-konstrukt) Schleifen: while, do...while, for-schleife Blöcke, Geltungsbereiche, Programmierstil 2 Heute als Zusammenfassung von Daten gleichen Typs Funktionen als Zusammenfassung wiederkehrender Anweisungen Ziel: Zusammenfassung von Daten gleichen Typs Eine Reihe von Temperatur-Messwerten für ein Jahr: float messwerte [] = 5.0, 4.8, 6.4, 12.8, 14.4, 17.2, 16.7, 16.3, 12.6, 8.9, 4.3, 2.1; (...Durchschnittstemperaturen in Siegen 2007 Quelle: http://www.uni-siegen.de/fb10/fwu/ww/wetterstation/) Deklaration mit Initialwerten: type name [] = val_1, val_2,..., val_n; int zahlen [] = 1, 4, 6, 3, 2, 7, 8, 2; 3 4

Keine Initialwerte nötig! Werte bei Initialisierung meist noch nicht bekannt Dann: Größe angeben ( Speicher) Deklaration: float messwerte [12]; Initialwerte sind in diesem Fall nicht definiert Verwendung Zugriff auf Elemente: []-Operator (lesend oder schreibend) Indexzählweise: Von 0 (erstes Element) bis Länge-1 (letztes Element)! Beispiel (mit 7 Initialwerten): Deklaration ohne Initialwerte reserviert Speicherplatz für 12 Variablen vom Typ float, die unter dem Namen messwerte erreichbar sind 12 * 32 bit = 48 Byte int exp [] = 1, 2, 4, 8, 16, 32, 64; std::cout << Die ersten 2er-Exponenten: ; for (int i = 0; i < 7; i++) //Indizes von 0 bis 6 std::cout << exp[i] << ; 5 6 Verwendung Zugriff auf Elemente: []-Operator (lesend oder schreibend) Indexzählweise: Von 0 (erstes Element) bis Länge-1 (letztes Element)! Beispiel ohne Initialwerte, Werte werden erst in der Schleife geschrieben (Pseudocode): 7 float messwerte [12]; for (int i = 0; i < 12; i++) //Indizes von 0 bis 11 //Berechne z.b. durchschnittliche Temperaturen für //jeden Monat... messwerte[i] = Monatsdurchschnitt im Monat i //Jetzt steht in jedem Arrayelement ein Wert 8 int quadrate [10]; std::cout << Quadratzahlen von 1 bis 10: ; for (int i = 0; i < 10; i++) //Indizes von 0 bis 9 quadrate[i] = (i+1) * (i+1); std::cout << quadrate[i] << ; Alternative? for (int i = 1; i <= 10; i++) //Indizes von 1 bis 10 quadrate[i] = i * i; std::cout << quadrate[i] << ; Fehler bei i == 10! quadrate[10] existiert nicht.

liegen im Speicher in einem Block vor. Beispiel int-array int expof2[] = 1, 2, 4, 8, 16, 32, 64; Indexgrenzen [0] und [count-1] müssen unbedingt eingehalten werden, sonst findet ein Speicherzugriffsfehler statt. expof2[7] ist nicht zulässig. Der Fehler wird aber nicht vom Compiler abgefangen, sondern führt zu einem Laufzeitfehler! Einschub... Fehlerarten expof2[7] ist nicht zulässig. Der Fehler wird aber nicht vom Compiler abgefangen, sondern führt zu einem Laufzeitfehler! 2 Arten von Fehlern können auftreten: Syntaktische Fehler (Syntax betrifft die Sprache ) - Diese Fehler meldet der Compiler ( Compilerfehler ) - Ziemlich einfach zu korrigieren Semantische Fehler (Semantik betrifft die Bedeutung ) - Diese Fehler treten erst bei der Programmausführung auf ( Laufzeitfehler, Ausnahme, Exception ) - Können schwer zu finden sein Ein Programm kann syntaktisch fehlerfrei sein und dennoch Laufzeitfehler produzieren z.b. Division durch 0 9 10 Mehrdimensionale Anordnung von Daten gleichen Typs in mehreren Dimensionen Deklaration: Wie beim eindimensionalen Array, aber pro Dimension ein []-Paar Elementanzahl in der ersten Dimension kann weggelassen werden Deklaration mit Initialwert funktioniert auch hier int table[5][2] = 1,3,5,7,9,0,2,4,6,8; for (int i = 0; i < 5; i++) for (int j = 0; j < 2; j++) std::cout << table[ << i << ][ << j << ] = << table[i][j] << std::endl; Mehrdimensionale Anordnung von Daten gleichen Typs in mehreren Dimensionen, Beispiel: Matrizen Eine 3x4 Matrix A: A = 1 4 3 8 33 42 1 17 4 40 21 23 allg. a 11 a 12 a 13 a 14 a 21 a 22 a 23 a 24 a 31 a 32 a 33 a 34 int matrix[3][4] = 1,4,3,8,33,42,1,17,4,40,21,23; Hilfreich: Schreibweise anpassen int matrix[3][4] = 1, 4, 3, 8, 33, 42, 1, 17, 4, 40, 21, 23 ; 11 12

aus Zeichen Darstellung von Zeichenketten (Strings) Deklaration: char name[size]; Mit Initialwert: char name[] = Meine Welt ; Zeichenketten werden intern als von Zeichen dargestellt Bsp.: Interne Speicherung des Strings Meine Welt Werden mit Anführungszeichen definiert Der Null-Character ( \0 ) wird automatisch angehängt, um das Ende des Strings zu markieren. size = Anzahl der Zeichen + 1 Funktionen Bisher haben wir unsere Anweisungen immer in die main- Funktion geschrieben... Jetzt: Eigene Definition von Funktionen Zusammenfassung von Anweisungen unter einem Namen Abstraktion und Wiederverwendung von Programmteilen Beispiel Sommerschlussverkauf: Die Preise sollen in der ersten Woche um 20 Prozent gesenkt werden, in der zweiten Woche noch einmal um 30 Prozent, danach vielleicht noch ein weiteres mal... 13 14 Funktionen Beispiel: Preise ändern um x Prozent //Eine Funktionsdefinition: float aenderepreis(float alterpreis, float prozent) float erhoehung = prozent / 100.0f; float neuerpreis = alterpreis + erhoehung * alterpreis; return neuerpreis; Eingegeben wird ein Preis und der prozentuale Anteil, um den der Preis geändert werden soll. Ausgegeben wird der neue Preis. 15 Funktionen Syntax: Rückgabetyp Funktionsname (Typ1 param1,..., TypN paramn) Funktionsrumpf: Anweisungen Beispiel: int berechnequadrat( int einezahl ) return (einezahl * einezahl); Übergabe unterschiedlicher Parameter mit jedem Aufruf Typ1 bis TypN sind die Typen der entsprechenden Parameter Rückgabetyp ist der Rückgabe-Typ der Funktion, also der Typ des Ergebnisses, das an der Aufrufstelle verwendet werden kann. 16

Wohin mit den Funktionen? Bisher so... Wohin mit den Funktionen? Jetzt so... int main ( int argc, char* argv ) int result; result = 1; int n = 10; for (int i = n; i >= 1; i-- ) result = result * i; std::cout << Fakultaet von << n << : << result; int faculty(int number) int result = 1; for (int i = number; i > 1; i--) result *= i; return result; int main ( int argc, char* argv ) int ergebnis = faculty(10); std::cout << ergebnis; Funktionsdefinition Aufruf mit Zuweisung 17 18 Mehr Beispiele Funktionen... float add ( float a, float b) return a + b; Funktionsaufruf durch: float fergebnis = add(3.24, 123.53); int maximum ( int a, int b) if (a > b) return a; else return b; Funktionsaufruf durch: int nbiggernumber = maximum(3,4); 19 Parameterübergabe Parameterübergabe Funktionen müssen genau wie Variablen deklariert werden bevor sie benutzt werden können Eine Funktion ist eindeutig durch ihre Signatur, die aus ihrem Namen, den Typen ihrer Argumente und deren Reihenfolge besteht, beschrieben. Doppelte Signaturen dürfen nicht vorkommen! int berechneetwas ( int zahl1, float zahl2 )... float berechneetwas ( int x, float y)... Return-Type gehört nicht zur Signatur Mit der return-anweisung wird das Ergebnis der Funktion zurückgegeben 20 Konflikt: Gleicher Name, gleiche Argumenttypen, gleiche Reihenfolge

Funktionen... Funktionen müssen genau wie Variablen deklariert werden bevor sie benutzt werden können Eine Funktion ist eindeutig durch ihre Signatur, die aus ihrem Namen, den Typen ihrer Argumente und deren Reihenfolge besteht, beschrieben. Doppelte Signaturen dürfen nicht vorkommen! int berechneetwas ( int zahl1, float zahl2 )... float berechneetwas ( int x, float y)... 21 int berechneetwas ( float zahl1, int zahl2 )... Return-Type gehört nicht zur Signatur Mit der return-anweisung wird das Ergebnis der Funktion zurückgegeben OK! Rückgabewert Rückgabewert macht nur bei einer Zuweisung an der Aufrufstelle Sinn: int berechnequadrat( int einezahl ) return (einezahl * einezahl); 22 Aufruf: int ergebnis = berechnequadrat(5); ergebnis bekommt den Wert 5 zugewiesen Braucht eine Funktion keinen Rückgabewert, so wird ihr Rückgabewert als void deklariert: void einefunktion (bool bvar) Anweisungen. Z.B. eine reine Textausgabe in Abh. von bvar //hier entweder keine Rückgabe mittels return oder: return; //leeres return Funktionsaufrufe Es gibt zwei verschiedene Arten der Parameterübergabe: Call by Value Call by Reference Bisher: Nur Call by Value intern wird der Variablenwert beim Aufruf in eine typgleiche Variable kopiert bei umfangreichen Datentypen entsteht großer Kopieraufwand eine Veränderung innerhalb der Funktion hat keine Auswirkung nach außen, d.h. der Wert der Variablen im Aufruf bleibt unverändert! Beispiel für Call-By-Value Problematik void quadrat (int i) i = i * i; int main (int argc, char* argv[]) int s = 2; quadrat(s); std::cout << s << std::endl; Ausgabe: 2 Begründung: Es wird nicht wirklich s, sondern eine Kopie des Wertes an die Funktion übergeben! Die Kopie wird geändert, s bleibt aber wie vorher! 23 24

Beispiel für Call-By-Value Problematik int quadrat (int i) i = i * i; return i; int main (int argc, char* argv[]) int s = 2; s = quadrat(s); std::cout << s << std::endl; Ausgabe: 4 Mögliche Lösung: Funktion mit Rückgabewert, dann eine Zuweisung an der Aufrufstelle. Richtig gut ist diese Lösung noch immer nicht, denn nach wie vor wird eine Kopie erzeugt. Ergebnis wird wieder zurück kopiert. Beispiel für Call-By-Value Problematik Datei komprimieredatei (Datei d) //Komprimiere Datei d, //liefere komprimiertedatei //zurück return komprimiertedatei; int main (int argc, char* argv[]) //... Datei d = einegrossedatei; Datei kleinedatei = komprimieredatei(d); Sehr schlecht! Eine Datei z.b. wird viel größer sein als eine einfache int-variable (32 bit). Diese Daten müssen alle kopiert werden. Kostet Zeit und Speicher!...und was passiert erst, wenn wir 50 Dateien nacheinander komprimieren wollen? 25 26 Funktionen: Parameter-Übergabe Die Lösung: Eine andere Art der Parameterübergabe, bei welcher kein Kopiervorgang mehr stattfindet! Call by Reference : Parameter ist Referenz- oder Zeigertyp! Eine Veränderung des referenzierten Wertes innerhalb der Funktion hat eine Auswirkung nach außen Der Wert der referenzierten Variablen wird geändert! Zeiger (Pointer) sind ein sehr wichtiges Konzept in der Sprache C/C++. Um Funktionen sinnvoll nutzen zu können, müssen wir noch zwei wichtige Konzepte verstehen: Zeiger und Referenzen Zusammenfassung als Zusammenfassung von Daten gleichen Typs Deklaration, Initialisierung, Zugriff per []-Operator, Indexgrenzen, Mehrdimensionale Funktionen als Zusammenfassung von Anweisungen, die man wiederholt braucht Struktur: Rückgabetyp Funktionsname (Parameterliste) //Funktionsrumpf Signatur muss eindeutig sein Parameterliste kann leer sein (trotzdem ein Klammernpaar!) Rückgabetyp kann void sein...deshalb gibt es dafür eine eigene Theorie-Einheit! 27 28

Zusammenfassung Parameterübergabe: Call-by-Value-Problematik (Kopieraufwand, keine Auswirkung nach außen) Call-by-Reference als Lösung Nächste Stunde! 29