Advanced  Services C#-Praktikum Back Next Up Home
Kalenderberechnungen (Lösung)
/* ----------------------------------------------------------- *\

   KalenderBerechnungen

\* ----------------------------------------------------------- */

public class KalenderBerechnungen
{
   static void Main(string[] args)
   {
      int tag, monat, jahr=2002, wtag;
      string eingabe;

      for(; jahr!=0 ;)
      {
         Console.Write("Tag eingeben : ");
         eingabe = Console.ReadLine();
         tag = Convert.ToInt32();

         Console.Write("Monat eingeben : ");
         eingabe = Console.ReadLine();
         monat = Convert.ToInt32();

         Console.Write("Jahr eingeben : ");
         eingabe = Console.ReadLine();
         jahr = Convert.ToInt32();

         Console.Writeln("Das Datum ist im Bereich des gregorianischen Kalenders und ok : "
                              + IsDate(tag,monat,jahr));

         Console.Writeln("Schaltjahr : " + IsLeapYear(jahr));
         Console.Writeln("Wochentag : " + GetDayOfTheWeek2(tag, monat, jahr) );
         int ostern[] = GetEaster(jahr) ;
         if (ostern[0]!=0)
            Console.Writeln("Ostern ist am : " + ostern[0]+"."+ostern[1]+"."+ostern[2] );
         else
            Console.Writeln("Ostern : Jahreszahl ausserhalb des gregorianischen Kalenders");
      }

   } // end main


   public static bool IsLeapYear(int year)
   {
      if ( year>1581 && (year%4==0 && year%100!=0 || year%400==0) )  // gregorian
         return true;
      if ( (4<year && year<1582) && year%4==0 )  // julian
         return true;
      if ( (-46<year && year<-8) && year%3==0 )  // julian false
         return true;

      return false;
   }

   public static bool IsDate(int tag, int mon, int year)
   {
      if ( year<1582 || mon<1 || mon>12 || tag<1)
         return false;
      // ab hier stimmt das jahr, der monat und der tag ist mindestens 1
      if (  (mon==4 || mon==6 || mon==9 || mon==11) && tag>30 )
         return false;
      if ( (mon==1 || mon==3 || mon==5 || mon==7 || mon==8 || mon==10 || mon==12) && tag>31 )
         return false;
      if ( mon==2 && tag>29)  // immer falsch
         return false;
      if ( mon==2 && !isLeapYear(year) && tag>28)
         return false;

      return true;
   }

   public static int GetDayOfTheWeek( int tag, int monat, int year )
   {
      int h = monat , k = year ;

      if ( monat <=2 )
      {
         h = monat + 12 ;
         k = year - 1 ;
      }

      return (tag + 2*h + (3*h+3)/5 + k + k/4 - k/100 + k/400+1)%7;
   }

   public static String GetDayOfTheWeek2( int tag, int monat, int year )
   {
      if (year>1581)
      {
         int h = monat , k = year ;

         if ( monat <=2 )
         {
            h = monat + 12 ;
            k = year - 1 ;
         }

         int wtag = (tag + 2*h + (3*h+3)/5 + k + k/4 - k/100 + k/400+1)%7;

         String tage[] =
         { "Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag" } ;

         return tage[wtag] ;
      }

      return "Jahreszahl ausserhalb des gregorianischen Kalenders" ;
   }

   public static int[] GetEaster(int year)
   {
      if (year>1581)
      {
         int a, b, c, d, e, p, q, r, x, y, tag, monat ;
         //Es geht um die Berechnung der Größen d und e
         //Dazu braucht man die 9 Hilfsgrößen a, b, c, p, n, q, r, x, y !!
         p = year/100 ;
         q = p/3 ;      r = p/4 ;
         x = (15+p-q-r)%30 ;     y = (4+p-r)%7 ;
         a = year%19 ;  b = year%4 ;   c = year%7 ;
         d = (19*a+x)%30 ;
         e = (2*b+4*c+6*d+y)%7 ;

         if (d==29 && e==6)
         {
            //=> Ostern am 19.April
            tag=19; monat=4;
         }
         else if (d==28 && e==6)
         {
            //=> Ostern am 18.April
            tag=18; monat=4;
         }
         else if (22+d+e < 32) //ansonsten gilt
         {
            //=>  Ostern am (22+d+e).März
            tag=22+d+e; monat=3;
         }
         else
         {
            // =>  Ostern am (d+e-9).April
            tag=d+e-9; monat=4;
         }

         return new int[] { tag, monat, year } ;
      }
      return new int[] { 0, 0, year } ;

   } // end Main

} // // end class
Valid XHTML 1.0 Strict top Back Next Up Home