/*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;
}

