PDA

View Full Version : درخواست سورس تقویم شمسی



soltany
شنبه 18 خرداد 1387, 23:08 عصر
سلام
کسی از دوستان الگوریتمی برای نوشتن تقویم شمسی تحت c یا c++ داره ؟
یا سورسی داره که کمک کنه بهم ؟
می خوام سال کبیسه هم حساب کنه.

emad_67
شنبه 18 خرداد 1387, 23:48 عصر
بیشتر توضیح میدی که میخوای چه جوری باشه؟
مثلا از کاربر بگیره روز و ماه و سال رو یا از سیستم بخونه؟

soltany
شنبه 18 خرداد 1387, 23:50 عصر
می خوام از سیستم بخونه و تاریخ میلادی سیستم را به شمسی برگردونه به این صورت که هر 4 سال 1 سال کبیسه هست و هر 30 سال هم دوباره 1 سال کبیسه است.

emad_67
یک شنبه 19 خرداد 1387, 09:04 صبح
من نحوه خوندن از سیستم رو توضیح میدم. الگوریتم تبدیل با خودت دیگه.
در هدر فایل time.h یه استراکچری به نام tm به این شکل تعریف شده:


struct tm {
int tm_sec; /* seconds after the minute - [0,59] */
int tm_min; /* minutes after the hour - [0,59] */
int tm_hour; /* hours since midnight - [0,23] */
int tm_mday; /* day of the month - [1,31] */
int tm_mon; /* months since January - [0,11] */
int tm_year; /* years since 1900 */
int tm_wday; /* days since Sunday - [0,6] */
int tm_yday; /* days since January 1 - [0,365] */
int tm_isdst; /* daylight savings time flag */
};
که در واقع زمان سیستم رو که خوندیم، ثانیه و دقیقه و ساعت و ... رو در متغیری از این استراکچر قرار میدیم.
برای خوندن زمان سیستم اینجوری باید بنویسی:


#include <time.h>
#include<iostream.h>
void main ()
{
time_t CurrentTime;
tm * TimeInfo;

CurrentTime = time (0);
TimeInfo = localtime ( &CurrentTime );
cout<<asctime(TimeInfo);
}
توی این تابع ابتدا یه متغیر به نام CurrentTime از نوع time_t و همین طور اشاره گری به ساختار tm تعریف کردیم. توی این خط:


CurrentTime = time (0);
در این خط time(0) زمان فعلی سیستم رو بر حسب ثانیه و بر اساس یک زمان پایه بر میگیردونه و در CurrentTime ذخیره میشه. (دقیقا نمیدونم این زمان پایه از کی هست، اگه کسی میدونه بگه) حالا باید این زمانی رو که بر حسب ثانیه هست تبدیل کنیم به زمان محلی سیستم. برای اینکار از تابع localtime استفاده میکنیم. این تابع اشاره گری به نوع داده time_t دریافت میکنه و اونو تبدیل میکنه به زمان محلی سیستم و اشاره گری به ساختار tm بر میگردونه :


TimeInfo = localtime ( &CurrentTime );
در انتها هم زمان به دست اومده که در TimeInfo قرار داره توسط تابع asctime تبدیل میشه به رشته و چاپ میشه:


cout<<asctime(TimeInfo);
برای دسترسی به تک تک عناصر میتونی به این شکل بنویسی:


cout<<"Current Time : "<<TimeInfo->tm_hour<<":"<<TimeInfo->tm_min<<":"<<TimeInfo->tm_sec<<endl;
cout<<"Current Date : "<<TimeInfo->tm_year+1900<<"/"<<TimeInfo->tm_mon+1<<"/"<<TimeInfo->tm_mday<<endl;
فقط دقت کن که tm_year سال رو نسبت به سال 1900 بر میگردونه،مثلا برای سال 2008 عدد 108 رو نشون میده که باید عدد اونو با 1900 جمع کنی تا بشه سال فعلی.
متغییر tm_mon هم ماه ها رو از 0 تا 11 به حساب میاره. مثلا برای الان که ماه 6 ام هست، عدد 5 رو بر میگردونه که باید با 1 جمع کنی تا ماه ها بشه از 1 تا 12.
در انتها یه نکته هم اضافه کنم که برای محسبه زمان نسبت به gmt از تابع gmtime باید استفاده کرد:


TimeInfo = gmtime ( &CurrentTime );

که اگه الان محاسبه کنین ساعت ایران 4.5+ هست.