PDA

View Full Version : برنامه نویسی VB



یاسی صبوری
جمعه 24 آذر 1385, 20:47 عصر
سلام شب شما بخیر من سئوالم این است که چطور می شود با VB برنهمه ای نوشت که تاریخ شمسی را به میلادی تبدیل کند. متشکرم

Hamid Heidarnia
شنبه 25 آذر 1385, 15:27 عصر
الگوریتم تبدیل تاریخ شمسی به تاریخ میلادی


شبه کد الگوریتم:

0.آرایه زیر را برای نگهداری ماههای میلادی تعریف می کنیم:

miladiMonth[12] ={30,31,30,31,31,30,31,30,31,31,28,31}
miladiMonthLeap[12]= {30,31,30,31,31,30,31,30,31,31,29,31};

1. ورودی ها---------ShamsiYear,ShamsiMonth,ShamsiDay
2.miladiYear = ShamsiYear + 621
3. اگر ((miladiYear % 100)!= 0&&(miladiYear % 4) == 0 یا
((miladiYear % 100)== 0 && (miladiYear % 400) == 0))آنگاه

اول فروردین = 20 /3(سال کبیسه است.)
marchdaydiff = 12 //اختلاف روز با ماه مارس
در غیر اینصورت
اول فروردین = 21/3(سال کبیسه نیست.)
marchdaydiff = 11 //اختلاف روز با مارس

4.اگرShamsiMonth بین 1 تا 6 باشدآنگاه
dayCount = ((ShamsiMonth-1) * 31) + ShamsiDay
در غیر اینصورت
dayCount =(6 * 31) + ((ShamsiMonth - 7) * 30) + ShamsiDay

5.اگر(dayCount<marchdaydiff) آنگاه

miladiDay = dayCount + (31 - marchDayDiff);
miladiMonth = 3;
miladiYear = miladiYear;

درغیر اینصورت

remainDay = dayCount - marchDayDiff;

.6متغیری مانند "i"را به عنوان یک شمارنده تعریف می کنیم و مقدار اولیه آن را برابر با "0"قرار می دهیم
7.اگر سال بعد(میلادی) کبیسه نیست:

while ((remainDay > miladiMonth[i]))
{
remainDay = remainDay - miladiMonth[i];
i++
};

در غیر اینصورت(اگر سال بعد کبیسه است)

while ((remainDay > miladiMonthleap[i]))
{
remainDay = remainDay - miladiMonthLeap[i];
i++
};

miladiDay = remainDay;.8.

9. اگر(i>8) (دقت کنید که از آوریل شروع کردیم)آنگاه

miladiMonth = i - 8;
miladiYear = miladiYear + 1;

در غیر اینصورت

miladiMonth = i + 4;
miladiYear= miladiYear

10.چاپ کن :miladiYear,miladiMonth,miladiDay








پیاده سازی الگوریتم به زبان c :

typedef struct _MILADIDATE
{
int iYear;
int iMonth;
int iDay;
}MILADIDATE;

MILADIDATE ShamsiToMiladi(int ShamsiMonth,int ShamsiDay,int ShamsiYear)
{

MILADIDATE miladiDate, farvardin1st;
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)
farvardin1st.iMonth = 3;
farvardin1st.iDay = 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)
farvardin1st.iMonth = 3;
farvardin1st.iDay =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;
}


موفق باشید دوستان