ein Kapitel zurück                                           ein Kapitel weiter

Neben der Kombination von Arrays und Strukturen können wir auch Strukturen innerhalb von Strukturen verwenden. Ein einfaches Beispiel stellt da die Uhrzeit und das Datum da....

struct uhrzeit {
                 unsigned char stunde;
                 unsigned char minute;
                 unsigned char sekunde;
               };

struct datum {
               unsigned char tag;
               unsigned char monat;
               int jahr;
             };

struct termin {
                struct datum d;
                struct uhrzeit z;
              }t;

Das ganze nochmals schnell bildlich...

Strukturen in Strukturen


Anhand diese Bildes können deutlich erkennen, was Strukturen in Strukturen bedeutet. Man spricht dabei auch von "Nested Structurs".

Nun der Zugriff auf die einzelnen Strukturen gestaltet sich vielleicht etwas aufwendiger, aber wir können wenn wir wollen mit 't' auf alles zugreifen. Hier das Programm wie sie auf die einzelnen und Gesamte Struktur zugreifen können....

/*Download:struct3.c*/
#include <stdio.h> struct uhrzeit { unsigned char stunde; unsigned char minute; unsigned char sekunde; }; struct datum { unsigned char tag; unsigned char monat; int jahr; }; struct termin { struct datum d; struct uhrzeit z; }t; int main() { struct termin t = {{19,8,2000},{20,15,0}}; printf("Termin am "); printf("%u.%u.%d um ",t.d.tag,t.d.monat,t.d.jahr); printf("%u.%u.%u0 Uhr \n\n",t.z.stunde,t.z.minute,t.z.sekunde); printf("Neuen Termin eingeben !!\n\n"); printf("Tag.............: "); scanf("%u",&t.d.tag); printf("Monat...........: "); scanf("%u",&t.d.monat); printf("Jahr............: "); scanf("%d",&t.d.jahr); printf("\n"); printf("Stunde..........: "); scanf("%u",&t.z.stunde); printf("Minuten.........: "); scanf("%u",&t.z.minute); printf("Sekunden........: "); scanf("%u",&t.z.sekunde); printf("\n"); printf("Neuer Termin am "); printf("%u.%u.%d um ",t.d.tag,t.d.monat,t.d.jahr); printf("%u.%u.%u0 Uhr \n",t.z.stunde,t.z.minute,t.z.sekunde); return 0; }

Sie sehen das dieser Mehraufwand eigentlicher eher eine Erleichterung ist. Denn Wert können wir direkt übergeben wie wir es mit...

struct termin t = {{19,8,2000},{20,15,0}};
................................................
struct termin t = {{struct datum}{struct uhrzeit}}

..gemacht haben. Oder wir übergeben die einzelnen Termindaten direkt mit z.B. für Minuten...

scanf("%u",&t.z.minute);

Ich schätze mal das Thema dürfte sie nicht überfordern. Nun wollen wir mal unser Adressprogramm von einem Kapitel zuvor mit dem Terminprogramm verknüpfen....

struct uhrzeit {
                     unsigned char stunde;
                     unsigned char minute;
                     unsigned char sekunde;
                    };

struct datum {
                     unsigned char tag;
                     unsigned char monat;
                     int jahr;
                    };

struct adressen {
                        char vname[20];
                        char nname[20];
                        long PLZ;
                        char ort[20];
                        int geburtsjahr;
                       };

struct termin {
                     struct datum d;
                     struct uhrzeit z;
                     struct adressen a;
                   }t[20];

Auch hierzu wollen wir uns ein Bild machen....

Strukturen in Strukturen


Hiermit können wir insgesamt 20 Termine mit Datum, Uhrzeit und mit wem sie eine Termin haben verwalten. Nun wollen wir das natürlich wieder in die Tat umsetzen....

/*Download:struct4.c*/
/*2struc2.c*/ #include <stdio.h> #include <string.h> #include <stdlib.h> int suche(char *); static int dates=0; static int nr=0; struct uhrzeit { unsigned char stunde; unsigned char minute; unsigned char sekunde; }; struct datum { unsigned char tag; unsigned char monat; int jahr; }; struct adressen { char vname[20]; char nname[20]; long PLZ; char ort[20]; int geburtsjahr; }xyz[100]; struct termin { struct datum d; struct uhrzeit z; struct adressen a; }t[20]; void newdate(struct termin t[]) { int auswahl,ret; char name[30]; printf("Tag.......: "); scanf("%u",&t[dates].d.tag); printf("Monat.....: "); scanf("%u",&t[dates].d.monat); printf("Jahr......: "); scanf("%d",&t[dates].d.jahr); printf("---------------------\n"); printf("Stunde....: "); scanf("%u",&t[dates].z.stunde); printf("Minute(n).: "); scanf("%u",&t[dates].z.minute); printf("---------------------\n"); printf("\nTermin mit : -1- Neuer Adresse\n"); printf(" -2- Vorhandener Adresse\n"); printf("Ihre Auswahl : "); scanf("%d",&auswahl); fflush(stdin); if(auswahl==1) { printf("Vorname.....: "); gets(t[dates].a.vname); printf("Nachname....: "); gets(t[dates].a.nname); printf("Postleitzahl: "); scanf("%ld",&t[dates].a.PLZ); fflush(stdin); printf("ORT.........: "); gets(t[dates].a.ort); printf("Geburtsjhr..: "); scanf("%d",&t[dates].a.geburtsjahr); fflush(stdin); } else { printf("Bitte geben sie den Nachnamen ein : "); gets(name); ret=suche(name); strcpy(t[dates].a.vname,xyz[ret].vname); strcpy(t[dates].a.nname,xyz[ret].nname); t[dates].a.PLZ=xyz[ret].PLZ; strcpy(t[dates].a.ort,xyz[ret].ort); t[dates].a.geburtsjahr=xyz[ret].geburtsjahr; } dates++; } int suche(char suchname[]) { int n,found=0; for(n=0; n<=nr; n++) { if(strcmp(xyz[n].nname,suchname)==0) { found=1; break; } } if(found==1) return n; else { printf("Keinen Eintrage Namens: %s gefunden\n",suchname); return 0; } } void listdate(struct termin list[],int dates) { int i; for(i=0;i<dates;i++) { printf("Termin am %u.%u.%d ",list[i].d.tag,list[i].d.monat,list[i].d.jahr); printf("um %u.%u Uhr\n",list[i].z.stunde,list[i].z.minute); printf("mit %s %s \n\n",list[i].a.vname,list[i].a.nname); } } void replacedate(struct termin aendern[],int nt) { printf("Bitte neue Terminzeit eingeben!!\n"); printf("Tag..........: "); scanf("%u",&aendern[nt].d.tag); printf("Monat........: "); scanf("%u",&aendern[nt].d.monat); printf("Jahr.........: "); scanf("%d",&aendern[nt].d.jahr); printf("------------------------\n"); printf("Stunden......: "); scanf("%u",&aendern[nt].z.stunde); printf("Minuten......: "); scanf("%u",&aendern[nt].z.minute); } void sortdate(struct termin sort[],int dates) { struct termin *temp; temp=(struct termin *)malloc(sizeof(struct termin *)); int i,j; for(i=0; i<dates; i++) { for(j=i+1;j<dates;j++) { if(sort[i].d.jahr>sort[j].d.jahr) { *temp=sort[j]; sort[j]=sort[i]; sort[i]=*temp; } } } printf(".....Sortiert!!\n"); } void Eingabe(struct adressen neu[]) { printf("Vorname : "); gets(neu[nr].vname); fflush(stdin); printf("Nachname : "); gets(neu[nr].nname); printf("Postleitzahl: "); scanf("%ld",&neu[nr].PLZ); fflush(stdin); printf("Wohnort : "); gets(neu[nr].ort); printf("Geburtsjahr : "); scanf("%d",&neu[nr].geburtsjahr); nr++; } void Ausgabe(struct adressen all[]) { int i; for(i=0; i<nr; i++) { printf("Vorname.........:%s\n",all[i].vname); printf("Nachname........:%s\n",all[i].nname); printf("Postleitzahl....:%ld\n",all[i].PLZ); printf("Ort.............:%s\n",all[i].ort); printf("Geburtsjahr.....:%d\n\n",all[i].geburtsjahr); if((!(i%2))&& i!=0) { fflush(stdin); printf("\n\tWeiter mit <Enter>\n\n"); getchar(); } } } void Sortadress(struct adressen sort[]) { struct adressen *temp; temp=(struct adressen *)malloc(sizeof(struct adressen *)); int i,j; for(i=0; i<nr; i++) { for(j=i+1;j<nr;j++) { if(strcmp(sort[i].nname, sort[j].nname)>0) { *temp=sort[j]; sort[j]=sort[i]; sort[i]=*temp; } } } printf(".....Sortiert!!\n"); } int main() { int eingabe,aendern; do { printf("\tTerminverwaltung\n"); printf("\t----------------\n\n"); printf("\t-1- Neuer Termin\n"); printf("\t-2- Termine auflisten\n"); printf("\t-3- Termin ändern\n"); printf("\t-4- Termine sortieren\n"); printf("\t-5- Neue Adresse eingeben\n"); printf("\t-6- Adressen ausgeben\n"); printf("\t-7- Adressen sortieren\n"); printf("\t-8- Programm beenden\n"); printf("\n\tIhre Auswahl : "); scanf("%d",&eingabe); fflush(stdin); switch(eingabe) { case 1 : newdate(t); break; case 2 : listdate(t,dates); break; case 3 : listdate(t,dates); printf("Welchen Termin änderen(Nr.?) : "); scanf("%d",&aendern); replacedate(t,--aendern); break; case 4 : sortdate(t,dates); break; case 5 : Eingabe(xyz); break; case 6 : Ausgabe(xyz); break; case 7 : Sortadress(xyz); break; default : break; } }while(eingabe<8); printf("Bye\n"); return 0; }

Hierzu nur eine kurze Erklärung, da sich die das meiste eigentlich von selbst erklärt. Bei unseren 1. Funktion newdate() geben wir zuerst unseren neuen Termin ein. Anschließend werden sie gefragt ob sie eine neuen Adresseintrag machen wollen mit wem sie den Termin machen oder einen bereits von Ihnen zuvor eingegebenen Adresseintrag nutzen wollen. Hier könnten sie z.B. zur Verbesserung das Programm so umschreiben das falls sie einen neuen Eintrag machen dieser ebenfalls als nächste Adresse anhängt wird und somit ebenfalls im Adresseintrag vorhanden ist. Die nächste Funktion listdate() kennen wir bereits. Mit der Funktion replacedate() können wir unseren Termin verschieben. Die nächste Funktion sortdate() dürfte Ihnen auch wieder bekannt sein. Ich habe hier nur nach Jahresdatum sortiert. Wenn sie Lust haben können sie das ganze noch genauer bis auf die Minute machen. Den Rest kennen sie dann wieder vom Kapitel zuvor unserer Adressverwaltung. Ein bisschen geändert habe ich die Suchfunktion (suche()) die jetzt nach einem ganzen Namen nicht mehr nach dem Anfangsbuchstaben sucht. Wenn sie jetzt noch Lust haben das Programm zu perfektionieren, können sie ja mal loslegen und mir den Quellcode schicken wenn sie möchten und ich werde Ihn natürlich veröffentlichen. Wenn sie dabei Hilfe brauchen scheuen sie sich nicht mir zu mailen.

ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf