Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule...

57
Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 http://www.rz.hs-fulda.de/et Peter Klingebiel, HS Fulda, DVZ

Transcript of Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule...

Page 1: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Informatik IIGrundlagen der Programmierung

Programmieren in C

Module und Bibliotheken 3

Hochschule Fulda – FB ET

Sommersemester 2010

http://www.rz.hs-fulda.de/et

Peter Klingebiel, HS Fulda, DVZ

Page 2: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 2

Sortieren 1

• Sortieren von Zahlen, Strings, allgemein von Daten, ist oft auftretende Aufgabenstellung

• Meist: Daten sind in Feldern vorhanden Sortieren von Feldelementen• Intuitiver Algorithmus:

– Feld von oben nach unten (oder von links nach rechts) durchlaufen und elementweise sortieren

– Feld solange immer wieder durchlaufen, bis Feld sortiert ist

Bubblesort-Algorithmus• http://de.wikipedia.org/wiki/Bubblesort

Page 3: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 3

Sortieren 2

• 1. Durchlauf bei Bubblesort

Page 4: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 4

Sortieren 3

Page 5: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 5

Sortieren 4

die größten Elemente wandern nach und nach an das Ende des Feldes

steigen wie Blasen auf Bubblesort• Algorithmus für int-Feld mit n Elementen:

void bsort(int v[], int n)

int i, j;

for(i = 0; i < n; i++) for(j = 0; j < n-i-1; j++) if(v[j] > v[j+1])

swap(v, j, j+1);

Page 6: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 6

Sortieren 5

• Bubblesort für Feld von Strings

Page 7: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 7

Sortieren 6

• Sortierprogramm für Strings

Page 8: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 8

Sortieren 7

• Diskussion– Stabilität?– Geschwindigkeit?

Page 9: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 9

Sortieren 8

• Schnellerer Algorithmus Quicksort• rekursiver Algorithmus für int-Feld

void qsort(int v[], int left, int right)

int i, last;

if(left >= right) return; swap(v, left, (left + right) / 2); last = left; for(i = left + 1; i <= right; i++) if(v[i] < v[left]) swap(v, ++last, i); swap(v, left, last); qsort(v, left, last - 1); qsort(v, last + 1, right);

Page 10: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 10

Sortieren 9

• Prinzip: teile und herrsche

• http://de.wikipedia.org/wiki/Quicksort

Page 11: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 11

Sortieren 10

• Quicksort für Feld von Strings

Page 12: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 12

Sortieren 11

• Sortierprogramm für Strings

Page 13: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 13

Sortieren 12

• Diskussion– Stabilität?– Geschwindigkeit?

Page 14: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 14

Sortieren 13

• bisher: nur Sortieren von Strings• Es gibt aber oft andere Typen zu sortieren,

z.B. Integer-, Double-, Struct-Typen usw. Generischer Sortieralgorithmus für Felder• Sortieralgorithmen identisch bis auf

– Vergleichsfunktion comp()– Austauschfunktion swap()

Generische Funktionsparameter Funktionen als Parameter

Page 15: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 15

Sortieren 14

• Generische Funktionsparameter Nutzung des Typs void• Beispiel: swap-Funktion void swapv(void *s[], int i, int j){ void *t;

t = s[i]; s[i] = s[j]; s[j] = t;}

Page 16: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 16

Sortieren 15

• Funktionen als Parameter• C erlaubt, Funktionen als Parameter an

Funktionen zu übergeben und aufzurufen• Übergabe der Funktion comp()void bsortv(void *v[], int n, int (*comp)(void *, void *)){ ...

• Aufruf der Funktion comp() ... if((* comp)(v[j], v[j+1]) > 0) ...

Page 17: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 17

Sortieren 16

• Bubblesort generisch

Page 18: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 18

Sortieren 17

• Quicksort generisch

Page 19: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 19

Sortieren 18

• sortlib – snumcmp()

Page 20: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 20

Sortieren 19

• sortlib – sswapv()

Page 21: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 21

Sortieren 20

• bsort5

Page 22: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 22

Sortieren 21

• qsort5

Page 23: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 23

Sortieren 22

• Mit generischen Funktionen und Funktionen als Parametern auch Sortieren von komplexeren Datenstrukturen möglich

• Beispiel: Personaldatentypedef struct _person { /* Personaleintrag: */ int no; /* Personalnummer */ char *nn; /* Nachname */ char *vn; /* Vorname */ int gj; /* Geburtsjahr */ int gm; /* Geburtsmonat */ int gt; /* Geburtstag */} person_t, *person_p;

Page 24: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 24

Sortieren 23

• Personalliste nach verschiedenen Kriterien (Name, P-Nr., Geburtsdatum) sortierbar

Implementierung einer Vergleichsfunktion• Beispiel: Nachnamen vergleichen

int compnn(person_p p1, person_p p2){ int n; if(n = strcmp(p1->nn, p2->nn)) return(n); else return(strcmp(p1->vn, p2->vn));}

Page 25: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 25

Sortieren 24

• personal.c

Page 26: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 26

Suchen 1

• Häufige Aufgabe: in größeren Datenmengen nach Einzelelementen suchen

• Oft: Daten in Feldern gespeichert• Intuitives Verfahren: Feld mit Daten von

Anfang bis Ende durchlaufen und nach gesuchtem Element fahnden– ist bei großen Datenmengen sehr langsam– notwendig bei unsortierten Daten / Feldern

in sortierten Feldern mit binärer Suche arbeiten

Page 27: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 27

Suchen 2

• Beispiel: Suche in Integer-Feld

Page 28: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 28

Suchen 3

• Binäre Suche: teile und finde

Page 29: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 29

Suchen 4

• 1 Schritt: teilen und vergleichen

Page 30: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 30

Suchen 5

• 2. Schritt: weiter teilen und vergleichen

Page 31: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 31

Suchen 6

• 3. Schritt: weiter teilen und vergleichen

Page 32: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 32

Suchen 7

• 4. Schritt: teilen und finden

Page 33: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 33

Suchen 8

• Binärsuche: teilen und finden

Page 34: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 34

Suchen 9

int binsearchi(int v[], int n, int x, int *ind)int m, l, r; /* Mitte, links, rechts */l = 0; /* links: 1. Element */r = n - 1; /* rechts: letztes El. */while(1) { if(r < l) return(0); /* kein Treffer */ m = l + ((r - l) / 2); /* Bereich halbieren */ if (v[m] == x) { /* Elem. x gefunden */ *ind = m; return(1); } if (v[m] > x) r = m - 1; /* Rechts weiter */ else l = m + 1; /* Links weiters */}

Page 35: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 35

Suchen 10

• binsearchi.c - Binärsuche in int-Feld

Page 36: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 36

Suchen 11

• binsearchs.c - Binärsuche in String-Feld

Page 37: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 37

Dynamische Listen 1

• Häufig ist die Anzahl der zu speichernden und zu bearbeitenden Daten erst zur Laufzeit des Programms bekannt

• Felder ungeeignet, da diese zur Compilezeit dimensioniert werden müssen

dynamische Datenstrukturen– einfach verkettete Listen– doppelt verkettete Listen – Bäume– usw.

Page 38: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 38

Dynamische Listen 2

• Beispiel: einfach verkettete Liste/* Datentyp f. einfach verkettete Liste */ typedef struct _slist { int value; /* Daten */ struct slist *next; /* Nachfolger */} slist;

• Beispiel: doppelt verkette Liste/* Datentyp f. doppelt verkettete Liste */typedef struct _dlist { int value; /* Daten */ struct dlist *prev; /* Vorgaenger */ struct dlist *next; /* Nachfolger */} dlist;

Page 39: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 39

Dynamische Listen 3

• Objekte der Listentypen werden zur Laufzeit – alloziertslist *insert(slist *llp, int value){ slist *nlp; nlp = (slist *) malloc(sizeof(slist));

– besetzt bzw. initialisiert nlp-> value = value; nlp->next = NULL;

– und in die Liste eingehängt if(llp) llp->next = nlp; return(nlp);}

Page 40: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 40

Dynamische Listen 4

• Einfache Liste: Erzeugung 1. Element

Page 41: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 41

Dynamische Listen 5

• Einfache Liste: 2. Element und Verkettung

Page 42: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 42

Dynamische Listen 6

• Einfache Liste: 3. Element und Verkettung

Page 43: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 43

Dynamische Listen 7

• Einfache Liste: 4. Element und Verkettung

Page 44: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 44

Dynamische Listen 8

• Einfache Liste: 5. Element und Verkettung

Page 45: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 45

Dynamische Listen 9

• Einfache Liste: Verkettung zum Ringpuffer

Page 46: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 46

Dynamische Listen 10

• Erstes Element wird oft Wurzel, Anker oder Kopf der Liste genannt

• Durchlaufen der Liste i.d.R. von der Wurzel der Liste ausslist *root, *slp;for(slp = root; slp; slp = slp->next) printf("%d\n", slp->value);

• Wird das letzte Listenobjekt mit der Wurzel verlinkt Ringpuffer

• Sortieren bei Erzeugen der Liste möglich

Page 47: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 47

Dynamische Listen 11

• slist.c - einfach verkettete Liste

Page 48: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 48

Dynamische Listen 12

• sortlist.c - einfach verkettete sortierte Liste

Page 49: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 49

Dynamische Listen 13

• Doppelte Liste: Erzeugung 1. Element

Page 50: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 50

Dynamische Listen 14

• Doppelte Liste: 2. Element und Verkettung

Page 51: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 51

Dynamische Listen 15

• Doppelte Liste: 3. Element und Verkettung

Page 52: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 52

Dynamische Listen 16

• Doppelte Liste: 4. Element und Verkettung

Page 53: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 53

Dynamische Listen 17

• Doppelte Liste: Verkettung zum Ringpuffer

Page 54: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 54

Dynamische Listen 18

• dlist1.c - doppelt verkettete Liste

Page 55: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 55

Dynamische Listen 19

• dlist2.c - doppelt verk. Liste als Ringpuffer

Page 56: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 56

Dynamische Listen 20

• Binäre Bäume

Page 57: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3 Hochschule Fulda – FB ET Sommersemester 2010 .

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 57

Dynamische Listen 21

• wordcount.c - sortierter binärer Baum