Teil 10 - Module und Bibliotheken 3 - Webserver - DVZ

Download Report

Transcript Teil 10 - Module und Bibliotheken 3 - Webserver - DVZ

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
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
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
2
Sortieren 2
• 1. Durchlauf bei Bubblesort
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
3
Sortieren 3
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
4
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
5
Sortieren 5
• Bubblesort für Feld von Strings
/*
*
*
*
*
*
*
*
*
*
*
sbsorts.c
sort-library libsort
klin, 10.05.2010
Prozedur bsorts(char *v[], int n
Sortieren des Stringfeldes v mit
Parameter:
v - Feld mit Strings
l - Anzahl Elemente im Feld v
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
6
Sortieren 6
• Sortierprogramm für Strings
/*
*
*
*
*
*/
bsort1.c
Bubblesort-Algorithmus
Aufruf: bsort1 [infile] [outfile
klin, 10.05.2010
#include <stdio.h>
#include "sort.h"
#define MAXLINS
5000
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
/* Max. Zeilenza
7
Sortieren 7
• Diskussion
– Stabilität?
– Geschwindigkeit?
???
???
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
8
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
9
Sortieren 9
• Prinzip: teile und herrsche
• http://de.wikipedia.org/wiki/Quicksort
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
10
Sortieren 10
• Quicksort für Feld von Strings
/*
*
*
*
*
*
*
*
*
*
*
sqsorts.c
sort-library libsort
klin, 10.05.2010
Prozedur qsorts(char *v[], int l
Sortieren des Stringfeldes v mit
Parameter:
v - Feld mit Strings
l - linkes Feldelement
r - rechtes Feldelement
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
11
Sortieren 11
• Sortierprogramm für Strings
/*
*
*
*
*
*/
qsort1.c
Quicksort-Algorithmus
Aufruf: qsort1 [infile] [outfile
klin, 10.05.2010
#include <stdio.h>
#include "sort.h"
#define MAXLINS
5000
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
/* Max. Zeilenza
12
Sortieren 12
• Diskussion
– Stabilität?
– Geschwindigkeit?
???
???
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
13
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
14
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
15
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
16
Sortieren 16
• Bubblesort generisch
/*
*
*
*
*
*
*
*
*
*
*
sbsortv.c
sort-library libsort
klin, 10.05.2010
Prozedur bsortv(void *v[], int n
Sortieren des Stringfeldes v mit
Parameter:
v - Feld mit Strings
l - Anzahl Elemente im Feld v
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
17
Sortieren 17
• Quicksort generisch
/*
*
*
*
*
*
*
*
*
*
*
sqsortv.c
sort-library libsort
klin, 10.05.2010
Prozedur qsortv(void *v[], int l
Sortieren des Feldes v mit n Ele
Parameter:
v - Feld mit Elementen
l - linkes Feldelement
r - rechtes Feldelement
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
18
Sortieren 18
• sortlib – snumcmp()
/*
*
*
*
*
*
*
*
*
*
*
snumcmp.c
sort-library libsort
klin, 10.05.2010
Funktion int numcomp(char *s1, c
Vergleich der Strings s1 und s2
Parameter
s1 - String 1
s2 - String 2
Return
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
19
Sortieren 19
• sortlib – sswapv()
/*
*
*
*
*
*
*
*
*
*
*
sswapv.c
sort-library libsort
klin, 10.05.2010
Prozedur swapv(void *s[], int i,
Austauschen der Feldelemente i u
Parameter
s - Feld mit Daten
i - Index String 1
j - Index String 2
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
20
Sortieren 20
• bsort5
/*
*
*
*
*
*/
bsort5.c
Bubblesort-Algorithmus, generisc
Aufruf: bsort5 [-ids][-ru] [infi
klin, 10.05.2010
#include <stdio.h>
#include "sort.h"
#define MAXLINS 5000
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
/* Max. Zeilenzah
21
Sortieren 21
• qsort5
/*
*
*
*
*
*/
qsort5.c
Quicksort-Algorithmus, generisch
Aufruf: qsort5 [-ids][-ru] [infi
klin, 10.05.2010
#include <stdio.h>
#include "sort.h"
#define MAXLINS 5000
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
/* Max. Zeilenzah
22
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
23
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
24
Sortieren 24
• personal.c
/*
*
*
*
*/
personal.c
Demo: Struct sortieren
klin, 03.06.2010
#include <stdio.h>
#include <stdlib.h>
#include "sort.h"
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
25
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
26
Suchen 2
• Beispiel: Suche in Integer-Feld
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
27
Suchen 3
• Binäre Suche: teile und finde
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
28
Suchen 4
• 1 Schritt: teilen und vergleichen
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
29
Suchen 5
• 2. Schritt: weiter teilen und vergleichen
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
30
Suchen 6
• 3. Schritt: weiter teilen und vergleichen
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
31
Suchen 7
• 4. Schritt: teilen und finden
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
32
Suchen 8
• Binärsuche: teilen und finden
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
33
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
34
*/
*/
*/
*/
*/
*/
*/
*/
Suchen 10
• binsearchi.c - Binärsuche in int-Feld
/*
*
*
*
*
*
*
*
*
*
*
binsearchi.c
Binaersuche in int-Feldern
int binsearch(int v[], int n, in
Return:
1 - Element gefunden
0 - Element nicht gefunden
Parameter:
int v[] - zu durchsuchendes s
int n
- Anzahl Elemente in
int x
- Gesuchtes Element
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
35
Suchen 11
• binsearchs.c - Binärsuche in String-Feld
/*
*
*
*
*
*
*
*
*
*
*
binsearchs.c
Binaersuche in String-Feldern
int binsearch(char v[], int n, c
Return:
1 - Element gefunden
0 - Element nicht gefunden
Parameter:
char *v[] - zu durchsuchendes
int n
- Anzahl Elemente in
char *x
- Gesuchtes Element
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
36
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
37
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.
typedef struct
int value;
struct dlist
struct dlist
} dlist;
doppelt verkettete Liste
_dlist {
/* Daten
*prev;
/* Vorgaenger
*next;
/* Nachfolger
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
*/
*/
*/
*/
38
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
39
Dynamische Listen 4
• Einfache Liste: Erzeugung 1. Element
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
40
Dynamische Listen 5
• Einfache Liste: 2. Element und Verkettung
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
41
Dynamische Listen 6
• Einfache Liste: 3. Element und Verkettung
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
42
Dynamische Listen 7
• Einfache Liste: 4. Element und Verkettung
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
43
Dynamische Listen 8
• Einfache Liste: 5. Element und Verkettung
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
44
Dynamische Listen 9
• Einfache Liste: Verkettung zum Ringpuffer
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
45
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
46
Dynamische Listen 11
• slist.c - einfach verkettete Liste
/*
*
*
*
*
*/
slist.c
Einfach verkettete dynamische Li
klin, 01.06.2010
Aufruf: slist [file]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
47
Dynamische Listen 12
• sortlist.c - einfach verkettete sortierte Liste
/*
*
*
*
*
*/
sortlist.c
Einfach verkettete sortierte dyn
klin, 01.06.2010
Aufruf: sortlist [file]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
48
Dynamische Listen 13
• Doppelte Liste: Erzeugung 1. Element
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
49
Dynamische Listen 14
• Doppelte Liste: 2. Element und Verkettung
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
50
Dynamische Listen 15
• Doppelte Liste: 3. Element und Verkettung
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
51
Dynamische Listen 16
• Doppelte Liste: 4. Element und Verkettung
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
52
Dynamische Listen 17
• Doppelte Liste: Verkettung zum Ringpuffer
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
53
Dynamische Listen 18
• dlist1.c - doppelt verkettete Liste
/*
*
*
*
*/
dlist1.c
Doppelt verkettete Liste
klin, 03.06.2010
#include <stdio.h>
#include <stdlib.h>
typedef struct _l {
int v;
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
/* Datentyp Liste
/* Value */
54
Dynamische Listen 19
• dlist2.c - doppelt verk. Liste als Ringpuffer
/*
*
*
*
*/
dlist2.c
Doppelt verkettete Liste als Rin
klin, 03.06.2010
#include <stdio.h>
#include <stdlib.h>
typedef struct _l {
int v;
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
/* Datentyp Liste
/* Value */
55
Dynamische Listen 20
• Binäre Bäume
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
56
Dynamische Listen 21
• wordcount.c - sortierter binärer Baum
/*
*
*
*
*
*/
wordcount.c
Demo fuer binaeren Baum: Woerter
nach Kernighan/Ritchie: Programm
klin, 04.06.2010
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
57