Oder, wie hält man heterogene
Daten zusammen?
26.11.2002 Prof. Zavodnik 2
Eine Struktur (Datentyp struct ) ist eine statische Datenstruktur, die es ermöglicht, Daten
verschiedenen Typs zusammenzufassen
Jedes Datum wird in einem Feld
innerhalb der Struktur gehalten
struct
Punkte auf dem Bildschirm
Spielkarten können so definiert werden
struct Point{
int a;
int b;
}
typedef enum {Herz, Pik, Karo, Kreuz} t_Farbe;
typedef enum {Zwei, ... , Zehn, Bube, ...,As}
t_Auge;
struct Karte{
t_Farbe Farbe;
26.11.2002 Prof. Zavodnik 4
typedef struct{
char *Nachname;
char *Vorname;
int Semester;
float Notendurchschnitt;
char vorbestraft;} student;
student stud1, stud2, stud3;
Bezeichner "Karte" heißt Etikett Bezeichner "Farbe" und Auge heißen Komponenten
typedef 's erleichtern Definition von Strukturen:
typedef struct{
t_Farbe Farbe;
t_Auge Auge;} t_Karte;
26.11.2002 Prof. Zavodnik 6
struct
1. struct Karte Karte1, Karte2;
2. t_Karte Karte1, Karte2;
Zuweisung: Bitweises Kopieren
Zugriff über die Struktur selbst: ist
str_var
eine Struktur-Variable und
Feld
eine Komponente, so ist
str_var.Feld
ein Bezeichner für diese Komponente
Ist
str_zeigerein Zeiger von obiger
Struktur, so ist
str_Zeiger->Feldauch
ein Bezeichner der Komponente
26.11.2002 Prof. Zavodnik 8
t_Karte Karte1, Karte2, *ZKarte1;
Karte1.Farbe = Pik;
Karte1.Auge = Fuenf;
Karte2 = Karte1;
ZKarte1 = &Karte1;
ZKarte1->Auge = Bube;
(*ZKarte1).Farbe
ist mit
ZKarte1->Farbeäquivalent
Strukturen können verschachtelt
werden
26.11.2002 Prof. Zavodnik 10
struct Kreis{
struct Punkt Mittelpunkt;
int Radius;
};
...
struct Kreis myKreis;
myKreis.Mittelpunkt.x = 100;
...
!
++(post)
Reihenfolge
l nach r
!=
==
l nach r
>=
>
<=
<
l nach r
>>
<<
l nach r -(binär)
+(binär)
l nach r
% /
*
l nach r
*
&
-(unär) +(unär)
l nach r sizeof()
~
! --(pre)
++(pre)
l nach r --(post)
->
. []
()
Operatoren
26.11.2002 Prof. Zavodnik 12
!!
l nach r ,
r nach l
|=
r nach l
^=
&=
<<=
>>=
%=
r nach l /=
*=
-=
+=
=
r nach l
?:
l nach r
||
l nach r
&&
l nach r
|
l nach r
^
"
Nicht automatisch Zeigerübergabe Nicht automatisch Zeigerrückgabe Wo möglich, als Zeiger übergeben oder zurückgeben
Fazit: Nicht immer möglich
26.11.2002 Prof. Zavodnik 14
# $
typedef struct{
double x,y; } Komplex;
Komplex Addieren(Komplex *a, Komplex *b) {
Komplex z;
z.x = a->x + b->x;
z.y = a->y + b->y;
return z;
}
Parameter durch Zeiger übergeben Rückgabewert muss kopiert
werden
Anweisung
return &zmit
deklariertem Rückgabetyp
Komplex *führt zu Laufzeitfehler
Siehe Folie
26.11.2002 Prof. Zavodnik 16
#
Ziel: Reihung von gemischten int- Werten in aufsteigende
Reihenfolge sortieren
Methode: Bubble Sort: Reihung von links nach rechts verarbeiten.
An aktuelle Stelle wird das kleinste Element rechts davon geschrieben Anzahl der Schritte
) 2 (
) 1 1 (
2
1 n n O n
2n
n + − + + + = − ≈
"
Siehe Folie Algorithmus
1. Mit dem vorletzten Element beginnend, vergleiche letzten beiden Elemente, notfalls tauschen
2. Mit dem vor vorletzten usw, bis kleinstes Element an erster Stelle
3. Wiederhole 1-2 bis zum zweiten Element
4. Wiederhole 3 bis Reihung sortiert wird
26.11.2002 Prof. Zavodnik 18
#define AnzStud ...
#define MAXLEN 2000
char stringtab[MAXLEN];
typedef struct student{
char * name;
int matnr;
float notendurchschnitt;} t_student;
char *q = stringtab;
t_student *studentenliste[AnzStud];
Teil 1: Datendeklaration
%& '
Sortierungsprogramm:
void bubble(){
int i,j,k;
float tmp;
char *temp;
for (i = 0; i < AnzStud; i++)
for (j = AnzStud - 1; j > i; j--)
if (strcmp(studentenliste[j-1]->name, studentenliste[j]->name) > 0){
temp = studentenliste[j-1]->name;
studentenliste[j-1]->name = studentenliste[j]->name;
studentenliste[j]->name = temp;
k = studentenliste[j-1]->matnr;
26.11.2002 Prof. Zavodnik 20
%& '
Das Hauptprogramm
int main(void){
int i, len;
for (i = 0; i < AnzStud; i++){
studentenliste[i] = (t_student)malloc(sizeof(t_student));
printf("\nStudent Nachname bitte eingeben:");
scanf("%s", studentenliste[i]->name = q);
q = q + strlen(q) + 1;
printf("\nUnd nun die Matrikelnummer:");
scanf("%d", &(studentenliste[i]->matnr));}
bubble();
for (i = 0; i < AnzStud; i++){
printf("%s", studentenliste[i]->name);
printf(" %d", studentenliste[i]->matnr);}
return 0;
}
Zeichenketten für Namen werden hintereinander in einer
Stringtabelle abgelegt. Man beachte die Rolle von
qZeiger, nicht Zeichenketten,
werden nach Bedarf ausgetauscht
26.11.2002 Prof. Zavodnik 22
( # ) %* + , + - + . '
Wird rekursiv aufgebaut
Man teile die zu sortierende
Reihung in 2 Hälften. Alle Elemente in der ersten Hälfte sind kleiner als alle Elemente in der zweiten Hälfte Annahme: Reihung Tab von
Grundtyp int ist zwischen
Indexwerten erstes und letztes
zu sortieren
, / 0 % 1 '
1. pivot = Tab[(erstes + letztes)/2];
2. l = erstes; r = letztes;
3. do
1. l = Index nächsten Elements mit Tab[l]
≥pivot
2. r = Index nächsten Elements mit Tab[r]
≤pivot
3. if (l ≤ r) tausch(Tab[l], Tab[r]);
4. until (l > r)
5. if (erstes < r) q_sort(erstes, r);
6. if (l < letztes) q_sort(l, letztes);
26.11.2002 Prof. Zavodnik 24