#include <stdio.h>
#include <time.h>

/*Prototypen*/
void zeller(long , long , long);
long julian(int , int, int);
void jul2greg(long );


char *wochentag[] = {
                      "Samstag", "Sonntag", "Montag", "Dienstag",
                      "Mittwoch", "Donnerstag" , "Freitag"
                    };

/*Berechnung mit dem Julianischem Datum*/

long julian(int tag, int monat, int jahr)
{
  long k,l,jd;
  k=(monat-14)/12;
  l=jahr+k+4800;
  jd=(long)(tag-32075+1461*l/4 + 367* ((monat-2-12*k)/12)-3*((l+100)/100)/4);

  return jd;
}

/*Julianisches Datum Umkehren zu Gregorianischem Datum*/

void jul2greg(long jultage)
{
  long greg=2299161,a,alpha,b,c,d,e,t,tc,m,mc,j;
  jultage=jultage+1;
  if(jultage<greg)
      a=jultage;
  else
    {
      alpha=(jultage-1867216.25)/36524.25;
      a=jultage+1+alpha-(alpha/4);
    }
  b=a+1524;
  c=(b-122.1)/365.25;
  d=1461*c/4;
  e=(b-d)/30.6001;
  t=(b-d) - (long)(30.6001*e)-1;

  if(t==0)
      tc=31;
  else
       tc=t;

  if(e<13.5)
      m=e-1;
  else
      m=e-13;

  if(m>2.5)
      j=c-2814;
  else
      j=c-2813;

  if(tc==31)
      mc=m-1;
  else
      mc=m;

  printf("Das von Ihnen gewuenschte Datum ist %2ld.%2ld.%4ld an einem ",tc,mc,j);
  zeller(t,m,j);
}



void zeller(long tag, long monat, long jahr)
{
  long c,y,wt;
  tag-=1;

  if(monat<3)
    {
      monat+=12;
      jahr-=1;
    }
  y=jahr % 100;
  c=jahr / 100;
  wt=(tag+(monat+1)*13/5+y+y/4+c/4-2*c) % 7;

  if(wt<0)
      wt+=7;


  printf("%s\n",wochentag[wt]);
}


int main()
{
  long tage,diff;
  time_t sekunden;
  struct tm *heute;

  time(&sekunden);
  heute=localtime(&sekunden);


  printf("Wieviele Tage benoetigen sie fuer den Auftrag : ");
  scanf("%ld",&tage);

  diff=julian(heute->tm_mday,heute->tm_mon,heute->tm_year)+tage;
  jul2greg(diff);

 return 0;
}
