MKoD - D Programming Language

Functions that gather important dates during Easter - code-name getEasterDates.d

Very Kool! Gather very important Easter dates example:

/+ 
 ' Functions that gather important dates during Easter. 
 ' 1) getAshWednesday()
 ' 2) getPalmSunday()
 ' 3) getMaundyThursday()
 ' 4) getGoodFriday()
 ' 5) getEasterSunday()
 ' 6) getAscensionThursday()
 ' 7) getPentecost()
 '
 ' License: Public Domain
 '
 ' To Compile: C:\dmd\MKoD_ex>dmd getEasterDates.d
 '
 ' 02.Oct.04 Compiled and Tested with dmd v0.102
 ' 04.Jun.06 Compiled and Tested with dmd v0.160
 ' 10.Jan.07 Compiled and Tested with dmd v1.0
 '
 +/
private import std.stdio;

/+
 ' Determine the date of "Easter Sunday" for any year  
 ' in the Gregorian Calendar from 1583 to 4099. 
 '
 +/
void getEasterSunday
(
    in  int iyear, 
    out int imonth, 
    out int iday
)
{
    iday = getEasterDays( iyear );
       
    if ( iday > 31 )
    {
        iday   = iday - 31;
        imonth = 4;
    }
    else 
        imonth = 3;
        
} // end void getEasterSunday( in int, out int, out int )

/+
 ' Determine the date of "Palm Sunday" for any year  
 ' in the Gregorian Calendar from 1583 to 4099. 
 '
 +/
void getPalmSunday
(
    in  int iyear, 
    out int imonth, 
    out int iday
)
{
    iday = getEasterDays( iyear ) - 7;
    
    if ( iday > 31 )
    {
        iday   = iday - 31;
        imonth = 4;
    }
    else 
        imonth = 3;
    
} // end void getPalmSunday( in int, out int, out int )

/+
 ' Determine the date of "Good Friday" for any year  
 ' in the Gregorian Calendar from 1583 to 4099. 
 '
 +/
void getGoodFriday
(
    in  int iyear, 
    out int imonth, 
    out int iday
)
{
    iday = getEasterDays( iyear ) - 2;    
    
    if ( iday > 31 )
    {
        iday   = iday - 31;
        imonth = 4;
    }
    else 
        imonth = 3;    
        
} // end void getGoodFriday( in int, out int, out int )

/+
 ' Determine the date of "Maundy Thursday" for any year  
 ' in the Gregorian Calendar from 1583 to 4099. 
 '
 +/
void getMaundyThursday
(
    in  int iyear, 
    out int imonth, 
    out int iday
)
{
    iday = getEasterDays( iyear ) - 3;    
    
    if ( iday > 31 )
    {
        iday   = iday - 31;
        imonth = 4;
    }
    else 
        imonth = 3;    
        
} // end void getMaundyThursday( in int, out int, out int )

/+
 ' Determine the date of "Ash Wednesday" for any year  
 ' in the Gregorian Calendar from 1583 to 4099. 
 '
 +/
void getAshWednesday
(
    in  int iyear, 
    out int imonth, 
    out int iday
)
{
    iday = getEasterDays( iyear ) - 46;    
     
    if ( iday > 0 )
    {
        imonth = 3;
    }
    else
    { 
        iday   = 28 + iday + leapYearDay( iyear );
        imonth = 2;    
    }
        
} // end void getAshWednesday( in int, out int, out int )

/+
 ' Determine the date of "Ascension Thursday" for any year  
 ' in the Gregorian Calendar from 1583 to 4099. 
 '
 +/
void getAscensionThursday
(
    in  int iyear, 
    out int imonth, 
    out int iday
)
{
    iday = getEasterDays( iyear ) + 40;
       
    if ( iday > 93 )
    {
        iday   = iday - 93;
        imonth = 6;
    }
    else if (iday > 62 )
    {
        iday = iday - 62;
        imonth = 5;
    }    
    else 
        imonth = 4;
          
} // end void getAscensionThursday( in int, out int, out int )

/+
 ' Determine the date of "Pentecost" for any year  
 ' in the Gregorian Calendar from 1583 to 4099. 
 '
 +/
void getPentecost
(
    in  int iyear, 
    out int imonth, 
    out int iday
)
{
    iday = getEasterDays( iyear ) + 50;
       
    if ( iday > 93 )
    {
        iday   = iday - 93;
        imonth = 6;
    }
    else if (iday > 62 )
    {
        iday = iday - 62;
        imonth = 5;
    }    
    else if ( iday > 31 )
    {
        iday = iday - 31;
        imonth = 4;
    }    
    else
        imonth = 3;        
    
} // end void getPentecost( in int, out int, out int )

private int getEasterDays
(
    in  int iyear 
)
{
    int ia; 
    int ib; 
    int ic;
    int itA;
    int itB; 
    int itC; 
    int itD; 
    int itE;
    int iday = 0;

    ia = iyear / 100;
    ib = iyear % 19;

    ic = ( ( ia - 15 ) >> 1 ) + 202 - 11 * ib;
    
    if ( ia > 26 ) ic--;
    if ( ia > 38 ) ic--;
    if ( ia == 21 || ia == 24 || ia == 25 || 
         ia == 33 || ia == 36 || ia==37 ) 
        ic--;
        
    ic  = ic % 30;
    itA = ic + 21;
    
    if ( ic == 29 ) itA--;
    if ( ic == 28 && ib > 10) itA--;
    
    itB = ( itA - 19 ) % 7;
    ic  = ( 40 - ia ) & 3;
    itC = ic;
    
    if ( ic > 1) itC++;
    if ( ic == 3) itC++;
    
    ic  = iyear % 100;
    itD = ( ic + ( ic >> 2 ) ) % 7;
    itE = ( ( 20 - itB - itC - itD ) % 7 ) + 1;
    iday = itA + itE;
    
    return iday;
    
} // end int getEasterDays( in int )

private int leapYearDay
(
    in int iyear
)
{
    return ( ( iyear & 3 ) == 0 && ( iyear % 100 || ( iyear % 400 ) == 0 ) );
    
} // end int leapYearDay( in int )

int main()
{
    char[][ 6 ] sMonths;
    sMonths[][ 0 ] = "January";
    sMonths[][ 1 ] = "February";
    sMonths[][ 2 ] = "March"; 
    sMonths[][ 3 ] = "April"; 
    sMonths[][ 4 ] = "May";
    sMonths[][ 5 ] = "June";
    
    int iAshWedMonth       = 0;
    int iAshWedDay         = 0;
    int iPalmSunMonth      = 0;
    int iPalmSunDay        = 0;
    int iMaundyThrMonth    = 0;
    int iMaundyThrDay      = 0;
    int iGoodFriMonth      = 0;
    int iGoodFriDay        = 0;
    int iEasterSunMonth    = 0;
    int iEasterSunDay      = 0;
    int iAscensionThrMonth = 0;
    int iAscensionThrDay   = 0;
    int iPentecostMonth    = 0;
    int iPentecostDay      = 0;
    
    for ( int iyear = 1996; iyear <= 2008; iyear++ )
    { 
        getAshWednesday( iyear, iAshWedMonth, iAshWedDay );
        getPalmSunday( iyear, iPalmSunMonth, iPalmSunDay );
        getMaundyThursday(  iyear, iMaundyThrMonth, iMaundyThrDay );
        getGoodFriday( iyear, iGoodFriMonth, iGoodFriDay );
        getEasterSunday( iyear, iEasterSunMonth, iEasterSunDay );
        getAscensionThursday( iyear, iAscensionThrMonth, iAscensionThrDay );
        getPentecost( iyear, iPentecostMonth, iPentecostDay );
        
        writefln( "For %d AshWednesday       is on %s %d\n"
                  "         Palm Sunday        is on %s %d\n"
                  "         Maundy Thursday    is on %s %d\n"
                  "         Good Friday        is on %s %d\n"
                  "         Easter Sunday      is on %s %d\n"
                  "         Ascension Thursday is on %s %d\n"
                  "         Pentecost          is on %s %d", 
                  iyear,
                  sMonths[ iAshWedMonth - 1  ], iAshWedDay, 
                  sMonths[ iPalmSunMonth - 1 ], iPalmSunDay, 
                  sMonths[ iMaundyThrMonth - 1  ], iMaundyThrDay, 
                  sMonths[ iGoodFriMonth - 1 ], iGoodFriDay, 
                  sMonths[ iEasterSunMonth - 1 ], iEasterSunDay,
                  sMonths[ iAscensionThrMonth - 1 ], iAscensionThrDay,
                  sMonths[ iPentecostMonth - 1 ], iPentecostDay ); 
              
        writefln();
    }    
 
    return 0;
    
} // end int main()
C:\dmd\MKoD_ex>..\bin\dmd getEasterDates.d
C:\dmd\bin\..\..\dm\bin\link.exe getEasterDates,,,user32+kernel32/noi;

C:\dmd>geteasterdates
For 1996 AshWednesday       is on February 21
         Palm Sunday        is on March 31
         Maundy Thursday    is on April 4
         Good Friday        is on April 5
         Easter Sunday      is on April 7
         Ascension Thursday is on May 16
         Pentecost          is on May 26

For 1997 AshWednesday       is on February 12
         Palm Sunday        is on March 23
         Maundy Thursday    is on March 27
         Good Friday        is on March 28
         Easter Sunday      is on March 30
         Ascension Thursday is on May 8
         Pentecost          is on May 18

For 1998 AshWednesday       is on February 25
         Palm Sunday        is on April 5
         Maundy Thursday    is on April 9
         Good Friday        is on April 10
         Easter Sunday      is on April 12
         Ascension Thursday is on May 21
         Pentecost          is on May 31

For 1999 AshWednesday       is on February 17
         Palm Sunday        is on March 28
         Maundy Thursday    is on April 1
         Good Friday        is on April 2
         Easter Sunday      is on April 4
         Ascension Thursday is on May 13
         Pentecost          is on May 23

For 2000 AshWednesday       is on March 8
         Palm Sunday        is on April 16
         Maundy Thursday    is on April 20
         Good Friday        is on April 21
         Easter Sunday      is on April 23
         Ascension Thursday is on June 1
         Pentecost          is on June 11

For 2001 AshWednesday       is on February 28
         Palm Sunday        is on April 8
         Maundy Thursday    is on April 12
         Good Friday        is on April 13
         Easter Sunday      is on April 15
         Ascension Thursday is on May 24
         Pentecost          is on June 3

For 2002 AshWednesday       is on February 13
         Palm Sunday        is on March 24
         Maundy Thursday    is on March 28
         Good Friday        is on March 29
         Easter Sunday      is on March 31
         Ascension Thursday is on May 9
         Pentecost          is on May 19

For 2003 AshWednesday       is on March 5
         Palm Sunday        is on April 13
         Maundy Thursday    is on April 17
         Good Friday        is on April 18
         Easter Sunday      is on April 20
         Ascension Thursday is on May 29
         Pentecost          is on June 8

For 2004 AshWednesday       is on February 25
         Palm Sunday        is on April 4
         Maundy Thursday    is on April 8
         Good Friday        is on April 9
         Easter Sunday      is on April 11
         Ascension Thursday is on May 20
         Pentecost          is on May 30

For 2005 AshWednesday       is on February 9
         Palm Sunday        is on March 20
         Maundy Thursday    is on March 24
         Good Friday        is on March 25
         Easter Sunday      is on March 27
         Ascension Thursday is on May 5
         Pentecost          is on May 15

For 2006 AshWednesday       is on March 1
         Palm Sunday        is on April 9
         Maundy Thursday    is on April 13
         Good Friday        is on April 14
         Easter Sunday      is on April 16
         Ascension Thursday is on May 25
         Pentecost          is on June 4

For 2007 AshWednesday       is on February 21
         Palm Sunday        is on April 1
         Maundy Thursday    is on April 5
         Good Friday        is on April 6
         Easter Sunday      is on April 8
         Ascension Thursday is on May 17
         Pentecost          is on May 27

For 2008 AshWednesday       is on February 6
         Palm Sunday        is on March 16
         Maundy Thursday    is on March 20
         Good Friday        is on March 21
         Easter Sunday      is on March 23
         Ascension Thursday is on May 1
         Pentecost          is on May 11

C:\dmd\MKoD_ex>
Mars: fourth Rock from the Sun.