پیاده سازی الگوریتم به
زبان c :
typedef struct _MILADIDATE
{
int
iYear;
int
iMonth;
int
iDay;
}MILADIDATE;
MILADIDATE ShamsiToMiladi(int
ShamsiMonth,int ShamsiDay,int
ShamsiYear)
{
MILADIDATE miladiDate;
int
marchDayDiff, remainDay;
int
dayCount, miladiYear, i;
// this buffer has day count of Miladi
month from April to January for a none year.
int miladiMonth[12] =
{30,31,30,31,31,30,31,30,31,31,28,31};
miladiYear = ShamsiYear + 621;
//Detemining the Farvardin the First
if((MiladiIsLeap(miladiYear))
{
//this is a Miladi leap year so Shamsi is leap too so the 1st of Farvardin is
March 20 (3/20)
marchDayDiff = 12;
}
else
{
//this is not a Miladi leap
year so Shamsi is not leap too so the 1st of Farvardin is March 21 (3/21)
marchDayDiff = 11;
}
// If next year is leap we will add one
day to Feb.
if(MiladiIsLeap(miladiYear+1)))
{
miladiMonth[10] = miladiMonth[10] + 1; //Adding
one day to Feb
}
//Calculate the day count for input shamsi
date from 1st Farvadin
if((ShamsiMonth>=1)&&(
ShamsiMonth<=6))
dayCount = ((ShamsiMonth-1) * 31) + ShamsiDay;
else
dayCount =(6 * 31) + ((ShamsiMonth - 7) * 30) + ShamsiDay;
//Finding the correspond miladi month and
day
if (dayCount <= marchDayDiff)
//So we are in 20(for leap year) or 21for none leap year) to 31 march
{
miladiDate.iDay = dayCount + (31 - marchDayDiff);
miladiDate.iMonth = 3;
miladiDate.iYear=miladiYear;
}
else
{
remainDay = dayCount -
marchDayDiff;
i = 0; //starting from April
while ((remainDay > miladiMonth[i]))
{
remainDay = remainDay - miladiMonth[i];
i++;
}
miladiDate.iDay = remainDay;
if (i > 8)
// We are in the next Miladi Year
{
miladiDate.iMonth = i - 8;
miladiDate.iYear = miladiYear + 1;
}
else
{
miladiDate.iMonth = i + 4;
miladiDate.iYear = miladiYear;
}
}
return miladiDate;
}
// the function check a miladiyear is leap
or not.
BOOL MiladiIsLeap(int
miladiYear)
{
if(((miladiYear % 100)!= 0
&& (miladiYear % 4) == 0) || ((miladiYear % 100)== 0 && (miladiYear % 400) ==
0))
return TRUE;
else
return FALSE;
}