Programmiersprache C. Grundlegende Konstrukte 5/1



Ähnliche Dokumente
4.2 Programmiersprache C

Herzlich willkommen!

RO-Tutorien 3 / 6 / 12

C-Propädeutikum Anweisungen

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

Advanced Programming in C

Funktionale Programmierung mit Haskell

Einführung in C. Alexander Batoulis. 5. Mai Fakutltät IV Technische Universität Berlin

RO-Tutorien 17 und 18

Java: Eine kurze Einführung an Beispielen

RO-Tutorien 15 und 16

Inhalt. 1 Einstieg in die Welt von C Erste Schritte in C 31. Vorwort... 15

Zusammenfassung des Handzettels für Programmieren in C

2. Programmierung in C

Kontrollfragen Mikrocontroller Programmiersprache C H1203 Felix Rohrer

Elementare Konzepte von

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

C- Kurs 04 Anweisungen

Wenn... dann... if (condition) statement. if (kontostand < 0) System.out.println("Oops..."); false. condition. true. statement

einlesen n > 0? Ausgabe Negative Zahl

Die Programmiersprache C Eine Einführung

Probeklausur Name: (c)

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

Funktionale Programmierung ALP I. Die Natur rekursiver Funktionen SS Prof. Dr. Margarita Esponda. Prof. Dr.

Algorithmen und Datenstrukturen

Informatik 1 ( ) D-MAVT F2010. Pointer, Structs, Sortieren. Yves Brise Übungsstunde 6

Operatoren (1) Operatoren (2)

Praxis der Programmierung

Programmieren in C. Rekursive Strukturen. Prof. Dr. Nikolaus Wulff

Übergang von funktionaler zu OOP. Algorithmen und Datenstrukturen II 1

Übersetzung von Datenstrukturen

Praxis der Programmierung

Funktionale Programmierung

Schleifen Datenfelder (Arrays) Verzweigungen

Einführung Sprachfeatures Hinweise, Tipps und Styleguide Informationen. Einführung in C. Patrick Schulz

ALP I. Funktionale Programmierung

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

Technische Universität Braunschweig Institut für Programmierung und Reaktive Systeme

Einführung Pointer. C-Kurs 2013, 2. Vorlesung. Nico Andy

Sprachkonstrukte Verzweigungen und Array-Strukturen

7. Organisation von Informationen

Vorlesung Programmieren

C/C++-Programmierung

In C und Java müssen Variablen und Methodenergebnisse durch Typangaben erläutert werden. Welche der folgenden Aussagen sind korrekt und welche nicht:

Gedächtnis. Während der Abarbeitung eines Algorithmus müssen sich Dinge gemerkt werden bzw. auf Dingen wird gerechnet. Zugriff.

Kapitel 12: Induktive

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

Programmieren I. Kapitel 5. Kontrollfluss

Labor Software-Entwicklung 1

Einführung in die Informatik 2

PROCESSING EINE ZUSAMMENFASSUNG. Created by Michael Kirsch & Beat Rossmy

Übersicht Programmablaufsteuerung

Übung zu Algorithmen und Datenstrukturen (für ET/IT)

PK-Einstufungstest. 1. Allgemeine Multiple-Choice-Aufgaben. Alle Aufgaben beziehen sich auf Java.

Operatoren in C. Gastvorlesung Andreas Textor

Gliederung. n Teil I: Einleitung und Grundbegriffe. n Teil II: Imperative und objektorientierte Programmierung

Programmieren in C. Speicher anfordern, Unions und Bitfelder. Prof. Dr. Nikolaus Wulff

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

C- Kurs 09 Dynamische Datenstrukturen

Übung zu Algorithmen und Datenstrukturen (für ET/IT)

Einleitung Entwicklung in C Hello-World! Konstrukte in C Zusammenfassung Literatur. Grundlagen von C. Jonas Gresens

UE Algorithmen und Datenstrukturen 1 UE Praktische Informatik 1. Übung 7. Entrekursivierung

Grundlagen der Programmierung Teil1 Einheit III Okt. 2010

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

Tutorium Rechnerorganisation

Einführung Datentypen Verzweigung Schleifen Funktionen Dynamische Datenstrukturen. Java Crashkurs. Kim-Manuel Klein

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

3.2 Datentypen und Methoden

11. Übung Informatik II - Operatorfunktionen

C.3 Funktionen und Prozeduren

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

S. d. I.: Programieren in C Folie 4-1. im Gegensatz zu Pascal gibt es in C kein Schlüsselwort "then"

CEN1112 Labor Software-Entwicklung

Fakultät IV Elektrotechnik/Informatik

INE1 Arrays, Zeiger, Datenstrukturen

PK-Einstufungstest. 1. Allgemeine Multiple-Choice-Aufgaben

2. Programmierung in C

Workshop Einführung in die Sprache Haskell

Aufbau eines "B-Baums" der Ordnung 3, Teil 1

10 Die Programmiersprache C99: Zusammenfassung

Einführung in die C-Programmierung

Praktische Informatik 3

C allgemein. C wurde unter und für Unix entwickelt. Vorläufer sind BCPL und B.

Zuweisungsfolgen: Initialisierung (1/2) Zuweisungsfolgen. Zuweisungsfolgen: Kombinationen. Zuweisungsfolgen: Initialisierung (2/2)

Programmieren in C / C++ Grundlagen C 4

Programmieren in C. C Syntax Datentypen, Operatoren und Kontrollstrukturen. Prof. Dr. Nikolaus Wulff

III.1 Prinzipien der funktionalen Programmierung - 1 -

Anweisungen in Fortran - Wertzuweisung

11. Rekursion. 1, falls n 1. n (n 1)!, andernfalls. Mathematische Rekursion. Rekursion in Java: Genauso! Unendliche Rekursion. n!

Intensivübung zu Algorithmen und Datenstrukturen

Informatik I (D-ITET)

HS Ravensburg-Weingarten Schriftlich Prüfung Programmieren

Probeklausur Programmieren in C Sommersemester 2007 Dipl. Biol. Franz Schenk 12. April 2007, Uhr Bearbeitungszeit: 105 Minuten

Modellierung und Programmierung 1

Angewandte Mathematik und Programmierung

Grundlagen der Programmierung

12. Rekursion. 1, falls n 1. n (n 1)!, andernfalls. Lernziele. Mathematische Rekursion. Rekursion in Java: Genauso! n! =

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

Steuerung von Programmabläufen. Vorlesung Computergestützte Mathematik zur Linearen Algebra. Lehrstuhl für Angewandte Mathematik Sommersemester 2009

Transkript:

Programmiersprache C Grundlegende Konstrukte 5/1

Variablen Haskell Benannter Ausdruck eines Zwischenergebnisses Unveränderbar nach Vollzug der Bindung C Benannter Speicherplatz für Zwischenergebnisse Allokation und Initialisierung getrennt Überschreiben per Zuweisung möglich 5/2

Beispiele von Variablen z :: Int z = 2 z = 3 -- geht nicht int z; /* Deklaration */ z = 3; /* Zuweisung */ z = z - 1; /* z -= 1; z-- */ f :: Int -> Int -> Int f = \x -> \y -> 2*x + y f x = \y -> 2*x + y f x y = 2*x + y int f(int x, int y) { return 2*x + y; Funktion!= Variable 5/3

Funktionen Alle Arbeit wird in Funktionen erledigt Hauptfunktion ist immer nur ein Seiteneffekt, keine Berechnung: Die Programmfunktionalität Haskell C pur: Gleiche Parameter = Gleiches Ergebnis Variablen höheren Typs Seiteneffekte: Verschiedene Ergebnisse möglich 5/4

Funktionsbeispiele doppel :: Int -> Int doppel x = x + x int doppel(int x) { return x + x; f :: Int -> Int -> Int f x y = doppel x + y int f(int x, int y) { return doppel(x) + y; 5/5

Funktionen mit Variablen f :: Int -> Int -> Int f x y = res' where res = doppel x res' = res + y int f(int x, int y) { int res = doppel(x); res += y; return res; Immer neue Variablen, da nur Ausdrücke Variable = Speicherplatz wird verändert 5/6

Rekursion und Schleifen Rekursion: siehe Endrekursion, siehe Rekursion Endrekursion: siehe Endrekursion Rekursion ist der Aufruf einer Funktion aus sich selbst heraus => Ausbildung von Schleifen Endrekursion ist der Aufruf der ursprünglichen Funktion mit unverändertem Durchreichen des Ergebnisses => Sprung an den Anfang C: End-/Rekursion ist immer/besser zu entfernen 5/7

Endrekursion ggt :: Int -> Int -> Int ggt x y x < y = ggt y x y == 0 = x otherwise = ggt y (x 'mod' y) int ggt(int x, int y) { if(x < y) { return ggt(y,x); else if(y == 0) { return x; else { return ggt(y, x%y); 5/8

Endrekursion => while-schleife int ggt(int x, int y) { if(x < y) { int t; t=x; x=y; y=t; if(y == 0) { return x; else { return ggt(y, x%y); int ggt(int x, int y) { if(x < y) { int t=x; x=y; y=t; while(y!= 0) { int t=x; x=y; y=t%y; return x; 5/9

Rekursion fac :: Int -> Int fac 0 = 1 fac x = x * fac (x-1) int fac(int x) { if(x == 0) { return 1; else { return x * fac(x-1); Wie wird berechnet? 5/10

Häufiges Konstrukt for-schleife int fac(int x) { int fac(int x) { int res = 1; while(x > 0) { res *= x; x--; /* x = x 1 */ return res; int res; for(res = 1; x > 0; x--) { res *= x; return res; 5/11

Mehrfache Rekursion fib :: Int -> Int fib 0 = 1 fib 1 = 1 fib x = fib (x-1) + fib (x-2) Lange Rechenzeit, da mehrfache Aufrufe fib :: Int -> Int fib x = fibs!! x fibs = 1 : 1 : [ fib (x-1) + fib (x-2) x <- [2..] ] Array zum Speichern aller Zwischenergebnisse 5/12

Array für Zwischenresultate int fib(int x) { int fs[50]; /* 0.. 49 */ int i; if(x < 0 x > 49) { return -1; /* zu klein */ /* Initialisierung */ fs[0] = fs[1] = 1; for(i=2; i<=x; i++) { fs[i] = fs[i-1] + fs[i-2]; /* Ergebnis ausgeben */ return fs[x]; 5/13

Funktionen und Blöcke in C /* Kommentar */ typ funktion(typ name, typ name,...) block Das Folgende ist ein Block: { deklarationen; befehle; 5/14

Datenflußsteuerung in C while(test) block do block while(test) if(test) block else block switch(ausdruck) { case wert: befehle; break; default: befehle; for(befehl; test; befehl) block label: befehle; goto label; continue next loop break exit loop test? ausdruck : ausdruck if-then-else als Ausdruck 5/15

Operationen in C Numerisch: + - * /(durch) %(modulo) Vergleiche: < <= ==!= >= > Bitweise: &(und) (oder) ^(xor) ~(invert) Logisch (0 == falsch): &&(und) (oder) Strukturen:.(Elementzugriff) Zeiger: &(Adresse) *(Wert) ->(Strukturelement) Typkonvertierung: (typ)(ausdruck) 5/16

Datenstrukturen Zusammenfassung einfacher Elemente zu komplexeren Typen Ziel: Erhaltung von Zusammenhängen Grundbausteine: Struktur und Union Struktur: Menge mehrerer Elemente Union: Auswahl eines von mehreren Elementen Enum: Aufzählung ohne interne Daten => Spezialfall von Union, real eine Zahl 5/17

Datenstrukturen data Point = Punkt { x, y :: Int c :: Color struct Point { ; int x, y; enum Color c; data Color = Red Green Blue enum Color { ; Red, Green, Blue 5/18

Datenstrukturen data Ausdruck struct Ausdruck { = Var { c :: Char i :: Int Val { i :: Int ; enum {Var, Val typ; union { struct { char c; /* u.var.c */ int i; /* u.var.i */ var; int val; /* u.val */ u; 5/19

Morphismen Arbeiten mit Datenstrukturen Morphismus: An der Gestalt/Form orientiert Anamorphismus: Erzeugung Griechisch: ανα = aufwärts (vgl. Anabolika) Katamorphismus: Zerstörung Griechisch: κατα = abwärts (vgl. Katastrophe) Hylomorphismus: Strukturen als Zwischenschritt Griechisch: υλοσ = Staub/Materie Erzeugen und zerstören: hylo f g = kata f. ana g 5/20

Felder Arrays Indizierte Menge von Werten gleichen Typs Haskell: feld :: [a] polymorph, unbegrenzt C: int feld[100]; feste Größe, fester Typ Schneller Zugriff auf Werte zum Lesen und Überschreiben => O(1) für alle Operationen In C Übergabe an Funktionen mittels Zeiger und Länge: void sort(int * daten, int anzahl); In C sind Felder und Zeigerarithmetik gleich 5/21

Katamorphismus Fold foldl f y [] = y foldl f y (x:xs) = foldl f (f y x) xs r = y; for(i = 0; i < len; i++) { r = f(r, feld[i]); foldr f y [] = y foldr f y (x:xs) = f x (foldr f y xs) r = y; for(i = len; i-- > 0;) { r = f(feld[i], r); 5/22

Rekursive Datenstrukturen Rekursive Datenstrukturen enthalten sich selbst als Elemente Direkter Speicherbedarf wäre unendlich Haskell: Speicher erst bei Bedarf angefordert C: Zeiger auf die Datenwiederholung Zeiger können leer sein => null (Haskell: Maybe) Zeigeralgebra: plus/minus (in Datenstrukturen) Speicher händisch verwalten (malloc, free) 5/23

Rekursive Datenstrukturen data Baum struct Baum { = Blatt { x :: Int Knoten { x :: Int l, r :: Baum ; enum {Blatt, Knoten t; union { int blatt; struct { int x; struct Baum *l, *r; knoten; u; 5/24

Rekursive Datenstrukturen data Baum = Baum { x :: Int l, r :: Maybe Baum struct Baum { ; int x; struct Baum *l, *r; null zeigt an, daß kein Knoten vorliegt Viel einfachere Struktur aber Disziplin nötig: l und r existieren nur zusammen oder gar nicht 5/25

Katamorphismus Traversierung pre (Blatt i) = [i] pre (Knoten i l r) = [i] ++ pre f l ++ pre f r post (Blatt i) = [i] post (Knoten i l r) = post f l ++ post f r ++ [i] in (Blatt i) = [i] in (Knoten i l r) = in f l ++ [i] ++ in f r void pre(struct Baum * p) { printf ( %i, p->x); if(p->l) { pre(p->l); if(p->r) { pre(p->r); void in(struct Baum * p) { if(p->l) { in(p->l); printf ( %i, p->x); if(p->r) { in(p->r); 5/26

Katamorphismus Beispiel d b e a c f Beispiele für verschiedene Traversierungen: Preorder dbacef Postorder acbfed Inorder abcdef Levelorder dbeacf 5/27