Einführung in die Programmierung Wintersemester 2008/09

Ähnliche Dokumente
Einführung in die Programmierung

Einführung in die Programmierung

Einführung in die Programmierung

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 29

Einführung in die Programmierung Wintersemester 2016/17

Einführung in die Programmierung

Themen. Formatierte und unformatierte Eingabe Bedingungsoperator Namespaces Kommandozeilenargumente

Einführung in die Programmierung

Einführung in die Programmierung Wintersemester 2010/11

Einführung in die Programmierung Wintersemester 2011/12

Grundlagen der Programmierung in C++ Arrays und Strings, Teil 1

Einführung in die Programmierung Wintersemester 2017/18

Einführung in die Programmierung

Vorlesungsprüfung Programmiersprache 1

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung)

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

Übersicht über die C/C++ Bibliotheksfunktionen

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung)

DAP2 Praktikum Blatt 1

Klausur: Grundlagen der Informatik I, am 06. Februar 2009 Gruppe: A Dirk Seeber, h_da, Fb Informatik. Nachname: Vorname: Matr.-Nr.

Angewandte Mathematik und Programmierung

DAP2-Programmierpraktikum Einführung in C++ (Teil 1)

Informatik I (D-MAVT)

Klausur: Informatik I am 06. Februar 2009 Gruppe: D Dirk Seeber, h_da, Fb Informatik. Nachname: Vorname: Matr.-Nr.: Punkte:

Lexikalische Programmanalyse der Scanner

Programmierung und Angewandte Mathematik

Klausur: Informatik, am 11. Juli 2013 Gruppe: B Dirk Seeber, h_da, Fb Informatik. Nachname: Vorname: Matr.-Nr.: Punkte:

Grundlagen der Informatik 2. Typen

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

Kapitel 2/3: Darstellung von Information / Kontrollstrukturen. Inhalt. Zusammengesetzte Datentypen Wiederholungen (in Programmen)

Algorithmen und Datenstrukturen

Objektorientierte Programmierung mit C++ SS 2007

Übungspaket 29 Dynamische Speicherverwaltung: malloc() und free()

Elementare Datentypen in C++

Polymorphismus 179. Function.h. #include <string>

Pseudo-Programmiersprache

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

Informatik I - Übung 2 Programmieren in Eclipse

Grundlagen der Informatik 5. Kontrollstrukturen II

Variablen in C++ Einfache Variablen Strukturen Arrays und Zeichenketten Zeiger und Referenzen Parameter Dynamische Speicherverwaltung

C Spickzettel: Was haben wir bisher von C verwendet?

Einführung in die Programmierung

Programmieren - C++ Templates

Funktionen und Parameter

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung)

C++ Notnagel. Ziel, Inhalt. Programmieren in C++

Variablen, Konstanten und Datentypen

Übungspaket 12 Der Datentyp char

Ein- und Ausgabe (I/O)

virtual Wertpapier& operator=(const Wertpapier&); // VIRTUELLE ZUWEISUNG protected: static enum {wortfeldlaenge = 20}; char* name_z; double kurs; };

C++ - Einführung in die Programmiersprache Header-Dateien und Funktionen. Leibniz Universität IT Services Anja Aue

Kap 7. Funktionen und Arrays

Klausur: Grundlagen der Informatik I, am 05. Februar 2008 Dirk Seeber, h_da, Fb Informatik. Nachname: Vorname: Matr.-Nr.: Punkte:

Die C++ Standard Template Library Andreas Obrist

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung)

Ein kleiner Blick auf die generische Programmierung

Praktikum zur Vorlesung Einführung in die Programmierung WS 14/15 Blatt 3

1 UNIX und die Kommandozeile. 2 C++ Tipps. 1.1 wichtige Befehle und Programme. 1.2 Umleiten der Standardein- und Ausgabe. 2.

Kapitel 6. Funktionen

Einführung in die Programmierung Wintersemester 2008/09

Programmierkurs C++ Datenstrukturen Seite 1

Klausur: Grundlagen der Informatik I, am 06. Februar 2009 Gruppe: B Dirk Seeber, h_da, Fb Informatik. Nachname: Vorname: Matr.-Nr.

Einführung in die Programmierung

Übungen zur Vorlesung EidP (WS 2015/16) Blatt 6

Grundlagen der Informatik 11. Zeiger

Fakultät Angewandte Informatik Lehrprofessur für Informatik

Programmierkurs C++ Lösungen zum Übungsblatt 3. Nils Eissfeldt und Jürgen Gräfe. 2. November Aufgabe 5

Programmieren in C++ Templates

Einführung in die Programmierung Wintersemester 2008/09

Klausur in Programmieren

Informatik I. Übung 2 : Programmieren in Eclipse. 5. März Daniel Hentzen

einlesen n > 0? Ausgabe Negative Zahl

Unterlagen. CPP-Uebungen-08/

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

Tag 4 Repetitorium Informatik (Java)

Hochschule Darmstadt Informatik-Praktikum (INF 1) WS 2014/2015 Wirtschaftsingenieur Bachelor 4. Aufgabe Datenstruktur, Dateieingabe und -ausgabe

Zeichendarstellung. Zeichen sind Zahlen (in C) Zeichen und switch

Die einfachsten Anweisungen

Algorithmen zur Datenanalyse in C++

8. Referenzen und Zeiger

7. Einführung in C++ Programmieren / Algorithmen und Datenstrukturen 1 Prof. Dr. Bernhard Humm FB Informatik, Hochschule Darmstadt

3D Programmierpraktikum: Einführung in C++ - Teil 1

Grundlagen der Informatik 6. Arrays I

Arrays (Felder/Vektoren)

Programmierkurs C++ Kapitel 6 Module Seite 1

Konzepte der Programmiersprachen

Übungspaket 19 Programmieren eigener Funktionen

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

Funktionales C++ zum Ersten

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 16

Objektorientiertes Programmieren für Ingenieure

Entwickeln Sie ein C/C++-Programm für die Verwaltung einer Artikeldatei gemäß folgender Vorgaben!

Grundlagen der Informatik 4. Kontrollstrukturen I

Informatik für Mathematiker und Physiker Woche 6. David Sommer

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

Klausur Informatik WS 2012/13

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

Programmieren in C. Eine Einführung in die Programmiersprache C. Prof. Dr. Nikolaus Wulff

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

Grundlagen C und C++ Einheit 03: Grundlagen in C++ Lorenz Schauer Lehrstuhl für Mobile und Verteilte Systeme

Transkript:

Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund

: Funktionen Inhalt Funktionen - mit / ohne Parameter - mit / ohne Rückgabewerte Übergabemechanismen - Übergabe eines Wertes - Übergabe einer Referenz - Übergabe eines Zeigers Programmieren mit Funktionen + Exkurs: Endliche Automaten + static / inline / MAKROS heute 2

Variation der Aufgabe: Finde Index des 1. Minimums in einem Array von Typ double Falls Array leer, gebe -1 zurück. Entwurf mit Implementierung: int imin(unsigned int const n, double a[]) { // leeres Array? if (n == 0) return -1; // Array hat also mindestens 1 Element! int i, imin = 0; for(i = 1; i < n; i++) if (a[i] < a[imin]) imin = i; return imin; 3

Neue Aufgabe: Sortiere Elemente in einem Array vom Typ double. Verändere dabei die Werte im Array. Bsp: 8 44 14 81 12 8 44 14 81 12 min{ 8, 44, 14, 81 = 8 < 12? 12 44 14 81 8 ja tausche 8 und 12 12 44 14 81 8 min{ 12, 44, 14 = 12 < 81? 81 44 14 12 8 ja tausche 12 und 81 81 44 14 12 8 min{ 81, 44 = 44 < 14? 81 44 14 12 8 nein keine Vertauschung 81 44 14 12 8 min{ 81 = 81 < 44? 81 44 14 12 8 nein keine Vertauschung 81 44 14 12 8 fertig! 4

Neue Aufgabe: Sortiere Elemente in einem Array vom Typ double. Verändere dabei die Werte im Array. Mögliche Lösung: void sortiere(const unsigned int n, double a[]) { int i, k; for (k = n 1; k > 1; k--) { i = imin(k - 1, a); if (a[i] < a[k]) swap_dbl(a[i], a[k]); void swap_dbl(double &a, double &b) { double h = a; a = b; b = h; 5

Wir halten fest: Arrays sind statische Datenbehälter: ihre Größe ist nicht veränderbar! Die Bereichsgrenzen von Arrays sollten an Funktionen übergeben werden, wenn sie nicht zur Übersetzungszeit bekannt sind. Die Programmierung mit Arrays ist unhandlich! Ist ein Relikt aus C. In C++ gibt es handlichere Datenstrukturen! (Kommt bald Geduld!) Die Aufteilung von komplexen Aufgaben in kleine Teilaufgaben, die dann in parametrisierten Funktionen abgearbeitet werden, erleichtert die Lösung des Gesamtproblems. Beispiel: Sortieren! Funktionen für spezielle kleine Aufgaben sind wieder verwertbar und bei anderen Problemstellungen einsetzbar. Deshalb gibt es viele Funktionsbibliotheken, die die Programmierung erleichtern! 6

#include <math.h> exp() ldexp() log() log10() pow() sqrt() ceil() floor() fabs() modf() fmod() Exponentialfunktion e x Exponent zur Basis 2, also 2 x natürlicher Logarithmus log e x Logarithmus zur Basis 10, also log 10 x Potenz x y Quadratwurzel nächst größere oder gleiche Ganzzahl nächst kleinere oder gleiche Ganzzahl Betrag einer Fließkommazahl zerlegt Fließkommazahl in Ganzzahlteil und Bruchteil Modulo-Division für Fließkommazahlen und zahlreiche trigonometrische Funktionen wie sin, cosh, atan 7

#include <stdlib.h> atof() atoi() atol() strtod() strtol() rand() srand() Zeichenkette in Fließkommazahl wandeln Zeichenkette in Ganzzahl wandeln (ASCII to integer) Zeichenkette in lange Ganzzahl wandeln Zeichenkette in double wandeln Zeichenkette in long wandeln Liefert eine Zufallszahl Initialisiert den Zufallszahlengenerator und viele andere Wofür braucht man diese Funktionen? 8

Funktion main wir kennen: int main() { //... return 0; ( Hauptprogramm) allgemeiner: int main(int argc, char *argv[]) { //... return 0; Anzahl der Elemente Array von Zeichenketten Programmaufruf in der Kommandozeile: D:\> mein_programm 3.14 hallo 8 argv[0] argv[1] argv[2] argv[3] Alle Parameter werden textuell als Zeichenkette aus der Kommandozeile übergeben! argc hat Wert 4 9

Funktion main ( Hauptprogramm) Programmaufruf in der Kommandozeile: D:\> mein_programm 3.14 hallo 8 Alle Parameter werden textuell als Zeichenkette aus der Kommandozeile übergeben! #include <stdlib> int main(int argc, char *argv[]) { if (argc!= 4) { cerr << argv[0] << : 3 Argumente erwartet! << endl; return 1; double dwert = atof(argv[1]); int iwert = atoi(argv[3]); //... 10

#include <ctype.h> tolower() toupper() isalpha() isdigit() isxdigit() isalnum() iscntrl() isprint() islower() isupper() isspace() Umwandlung in Kleinbuchstaben Umwandlung in Großbuchstaben Ist das Zeichen ein Buchstabe? Ist das Zeichen eine Ziffer? Ist das Zeichen eine hexadezimale Ziffer? Ist das Zeichen ein Buchstabe oder eine Ziffer? Ist das Zeichen ein Steuerzeichen? Ist das Zeichen druckbar? Ist das Zeichen ein Kleinbuchstabe? Ist das Zeichen ein Großbuchstabe? Ist das Zeichen ein Leerzeichen? 11

Beispiele für nützliche Hilfsfunktionen: Aufgabe: Wandle alle Zeichen einer Zeichenkette in Grossbuchstaben! #include <ctype.h> char *ToUpper(char *s) { char *t = s; while (*s!= 0) *s++ = toupper(*s); return t; Aufgabe: Ersetze alle nicht druckbaren Zeichen durch ein Leerzeichen. #include <ctype.h> char *MakePrintable(char *s) { char *t = s; while (*s!= 0) *s++ = isprint(*s)? *s : ; return t; 12

#include <time.h> time() localtime() asctime() Liefert aktuelle Zeit in Sekunden seit dem 1.1.1970 UTC wandelt UTC- Sekundenzeit in lokale Zeit (struct) wandelt Zeit in struct in lesbare Form als char[] und viele weitere mehr #include <iostream> #include <time.h> int main() { time_t jetzt = time(0); char *uhrzeit = asctime(localtime(&jetzt)); std::cout << uhrzeit << std::endl; return 0; 13

Deterministische endliche Automaten (DEA) Kapitel Exkurs 5 Der DEA ist zentrales Modellierungswerkzeug in der Informatik. engl. FSM: finite state machine Definition Ein deterministischer endlicher Automat ist ein 5-Tupel (S, Σ, δ, F, s 0 ), wobei S eine endliche Menge von Zuständen, Σ das endliche Eingabealphabet, δ: S x Σ S die Übergangsfunktion, F eine Menge von Finalzuständen mit F S und s 0 der Startzustand. Er startet immer im Zustand s 0, verarbeitet Eingaben und wechselt dabei seinen Zustand. Gelangt er in einen Endzustand aus F, dann terminiert er. Beschreibung eines Programms! 14

Deterministische endliche Automaten (DEA) Kapitel Exkurs 5 Grafische Darstellung Zustände als Kreise im Kreis der Bezeichner des Zustands (häufig durchnummeriert) 3 Übergänge von einem Zustand zum anderen ist abhängig von der Eingabe. Mögliche Übergänge sind durch Pfeile zwischen den Zuständen dargestellt. Über / unter dem Pfeil steht das Eingabesymbol, das den Übergang auslöst. x 3 4 Endzustände werden durch Doppelkreise dargestellt. 5 15

Deterministische endliche Automaten (DEA) Kapitel Exkurs 5 Beispiel: Entwerfe DEA, der arithmetische Ausdrücke ohne Klammern für nichtnegative Ganzzahlen auf Korrektheit prüft. D 0 D 1 = 2 op Zustände S = { 0, 1, 2 δ D op = Startzustand s 0 = 0 0 1-1 -1 Endzustände F = { 2 1 1 0 2 Eingabealphabet Σ = { D, op, = 2 - - - -1: Fehlerzustand 16

Deterministische endliche Automaten (DEA) Kapitel Exkurs 5 Beispiel: Erweiterung: Akzeptiere auch white space zwischen Operanden und Operatoren WS D 0 D 1 = 2 op WS op = Zustände S = { 0, 1, 2, 3 Startzustand s 0 = 0 3 δ 0 D 1 op -1 = -1 WS 0 Endzustände F = { 2 Eingabealphabet Σ = { D, op, =, WS WS 1 2 3 1 - -1 0-0 2-2 3-3 17

Deterministische endliche Automaten (DEA) Kapitel Exkurs 5 WS D Eingabe: 3+ 4 5= 0 D 1 = 2 op WS op = 3 WS Zustand 0, lese D Zustand 1, lese op Zustand 0, lese WS Zustand 0, lese D Zustand 1, lese WS Zustand 3, lese op Zustand 0, lese WS Zustand 0, lese D Zustand 1, lese = Zustand 2 (Endzustand) 18

Deterministische endliche Automaten (DEA) Kapitel Exkurs 5 Wenn grafisches Modell aufgestellt, dann Umsetzung in ein Programm: - Zustände durchnummeriert: 0, 1, 2, 3 - Eingabesymbole: z.b. als enum { D, OP, IS, WS (IS für =) - Übergangsfunktion als Tabelle / Array: int GetState[][4] = { { 1, -1, -1, 0, { 1, 0, 2, 3, { 2, 2, 2, 2, { -1, 0, 2, 3 ; Array enthält die gesamte Steuerung des Automaten! - Eingabesymbole erkennen u.a. mit: isdigit(), isspace() bool isbinop(char c) { return c == + c == - c == * c == / ; 19

Deterministische endliche Automaten (DEA) Kapitel Exkurs 5 enum TokenT { D, OP, IS, WS, ERR ; bool Akzeptor(char const* input) { int state = 0; while (*input!= \0 && state!= 2 && state!= -1) { char s = *input++; TokenT token = ERR; if (isdigit(s)) token = D; if (isbinop(s)) token = OP; if (s == = ) token = IS; if (isspace(s) token = WS; state = (token == ERR)? -1 : GetState[state][token]; return (state == 2); 20

Statische Funktionen (in dieser Form: Relikt aus C) sind Funktionen, die nur für Funktionen in derselben Datei sichtbar (aufrufbar) sind! Funktionsdeklaration: static Datentyp Funktionsname(Datentyp Bezeichner); #include <iostream> using namespace std; static void funktion1() { cout << F1 << endl; void funktion2() { funktion1(); cout << F2 << endl; void funktion1(); void funktion2(); int main() { funktion1(); funktion2(); return 0; Fehler! funktion1 nicht sichtbar! wenn entfernt, dann gelingt Compilierung: g++ *.cpp o test Datei Funktionen.cpp Datei Haupt.cpp 21

Inline Funktionen sind Funktionen, deren Anweisungsteile an der Stelle des Aufrufes eingesetzt werden Funktionsdeklaration: inline Datentyp Funktionsname(Datentyp Bezeichner); #include <iostream> using namespace std; inline void funktion() { cout << inline << endl; int main() { cout << main << endl; funktion(); return 0; wird zur Übersetzungszeit ersetzt zu: #include <iostream> using namespace std; int main() { cout << main << endl; cout << inline << endl; return 0; 22

Inline Funktionen Vorteile: 1. Man behält alle positiven Effekte von Funktionen: Bessere Lesbarkeit / Verständnis des Codes. Verwendung von Funktionen sichert einheitliches Verhalten. Änderungen müssen einmal nur im Funktionsrumpf durchgeführt werden. Funktionen können in anderen Anwendungen wieder verwendet werden. 2. Zusätzlich bekommt man schnelleren Code! (keine Sprünge im Programm, keine Kopien bei Parameterübergaben) Nachteil: Das übersetzte Programm wird größer (benötigt mehr Hauptspeicher) Deshalb: vorangestelltes inline ist nur eine Anfrage an den Compiler! Keine Pflicht! 23

Inline-Funktionsartiges mit Makros Da müssen wir etwas ausholen... #include <iostream> int main() { int x = 1; std::cout << x*x; return 0; Prä-Compiler Compiler... ersetzt Makros (beginnen mit #): z.b. lädt Text aus Datei iostream.h #define Makroname Ersetzung Bsp: #define MAX_SIZE 100 #define ASPECT_RATIO 1.653 Makronamen im Programmtext werden vom Prä-Compiler durch ihre Ersetzung ersetzt 24

#define MAX_SIZE 100 void LeseSatz(char *Puffer) { char c = 0; int i = 0; while (i < MAX_SIZE && c!=. ) { cin >> c; *Puffer++ = c; void LeseSatz(char *Puffer) { char c = 0; int i = 0; while (i < 100 && c!=. ) { cin >> c; *Puffer++ = c; Makros... dieser Art sind Relikt aus C! Nach Durchlauf durch den Prä-Compiler Tipp: NICHT VERWENDEN! stattdessen: int const max_size = 100; 25

Inline-Funktionsartiges mit Makros #define SQUARE(x) x*x Vorsicht: SQUARE(x+3) x+3*x+3 ergibt: besser: #define SQUARE(x) (x)*(x) SQUARE(x+3) (x+3)*(x+3) ergibt: noch besser: #define SQUARE(x) ((x)*(x)) SQUARE(x+3) ((x+3)*(x+3)) ergibt: auch mehrere Parameter möglich: #define MAX(x, y) ((x)>(y)?(x):(y)) int a = 5; int z = MAX(a+4, a+a); ergibt: int a = 5; int z =((a+4)>(a+a)?(a+4):(a+a)); Nachteil: ein Ausdruck wird 2x ausgewertet! 26

Inline-Funktionsartiges mit Makros (Relikt aus C) Beliebiger Unsinn möglich... // rufe Funktion fkt() mit maximalem Argument auf #define AUFRUF_MIT_MAX(x,y) fkt(max(x,y)) Makros wie diese haben so viele Nachteile, dass schon das Nachdenken über sie nicht zu ertragen ist. Scott Meyers: Effektiv C++ programmieren, S. 32, 3. Aufl., 2006. int a = 5, b = 0; AUFRUF_MIT_MAX(++a, b); // a wird 2x inkrementiert AUFRUF_MIT_MAX(++a, b+10); // a wird 1x inkrementiert Tipp: statt funktionsartigen Makros besser richtige inline-funktionen verwenden! 27