Präsentation herunterladen
Die Präsentation wird geladen. Bitte warten
Veröffentlicht von:Klara Schlie Geändert vor über 11 Jahren
1
Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 3
Hochschule Fulda – FB ET Sommersemester 2010 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 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
3
Sortieren 2 1. Durchlauf bei Bubblesort
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
4
Sortieren 3 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); Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
6
Sortieren 5 Bubblesort für Feld von Strings
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
7
Sortieren 6 Sortierprogramm für Strings
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
8
Sortieren 7 Diskussion Stabilität? Geschwindigkeit?
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); Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
10
Sortieren 9 Prinzip: teile und herrsche
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
11
Sortieren 10 Quicksort für Feld von Strings
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
12
Sortieren 11 Sortierprogramm für Strings
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
13
Sortieren 12 Diskussion Stabilität? Geschwindigkeit?
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 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; } 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) ... Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
17
Sortieren 16 Bubblesort generisch
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
18
Sortieren 17 Quicksort generisch
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
19
Sortieren 18 sortlib – snumcmp()
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
20
Sortieren 19 sortlib – sswapv()
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
21
Sortieren 20 bsort5 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
22
Sortieren 21 qsort5 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: Personaldaten typedef 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; 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)); } Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
25
Sortieren 24 personal.c 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 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
27
Suchen 2 Beispiel: Suche in Integer-Feld
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
28
Suchen 3 Binäre Suche: teile und finde
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
29
Suchen 4 1 Schritt: teilen und vergleichen
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
30
Suchen 5 2. Schritt: weiter teilen und vergleichen
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
31
Suchen 6 3. Schritt: weiter teilen und vergleichen
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
32
Suchen 7 4. Schritt: teilen und finden
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
33
Suchen 8 Binärsuche: teilen und finden
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 */ } Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
35
Suchen 10 binsearchi.c - Binärsuche in int-Feld
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
36
Suchen 11 binsearchs.c - Binärsuche in String-Feld
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. 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; Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
39
Dynamische Listen 3 Objekte der Listentypen werden zur Laufzeit
alloziert slist *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); } Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
40
Dynamische Listen 4 Einfache Liste: Erzeugung 1. Element
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
41
Dynamische Listen 5 Einfache Liste: 2. Element und Verkettung
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
42
Dynamische Listen 6 Einfache Liste: 3. Element und Verkettung
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
43
Dynamische Listen 7 Einfache Liste: 4. Element und Verkettung
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
44
Dynamische Listen 8 Einfache Liste: 5. Element und Verkettung
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
45
Dynamische Listen 9 Einfache Liste: Verkettung zum Ringpuffer
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 aus slist *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 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
47
Dynamische Listen 11 slist.c - einfach verkettete Liste
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
48
Dynamische Listen 12 sortlist.c - einfach verkettete sortierte Liste
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
49
Dynamische Listen 13 Doppelte Liste: Erzeugung 1. Element
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
50
Dynamische Listen 14 Doppelte Liste: 2. Element und Verkettung
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
51
Dynamische Listen 15 Doppelte Liste: 3. Element und Verkettung
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
52
Dynamische Listen 16 Doppelte Liste: 4. Element und Verkettung
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
53
Dynamische Listen 17 Doppelte Liste: Verkettung zum Ringpuffer
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
54
Dynamische Listen 18 dlist1.c - doppelt verkettete Liste
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
55
Dynamische Listen 19 dlist2.c - doppelt verk. Liste als Ringpuffer
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
56
Dynamische Listen 20 Binäre Bäume
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
57
Dynamische Listen 21 wordcount.c - sortierter binärer Baum
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Ähnliche Präsentationen
© 2024 SlidePlayer.org Inc.
All rights reserved.