PDA

نسخه کامل مشاهده نسخه کامل : چجوری می تونم یک تقویم شمسی بسازم ؟



aliexo
06-01-2010, 09:50
من یه پروژه دارم که این شکلیه :
برنامه ای بنویسید که یک سال شمسی را گرفته و تقویم آنرا چاپ کند

حالا من دنباله الگوریتمشم . یعنی کلا چجوری می تونم بفهم که مثلا یک روز مثله 22 بهمن چند شنبه هستش؟
کلا چیزایی که لازمه چیه؟

_H2_
10-01-2010, 13:08
سلام
حتماً میدانید که تقویم ایرانی موسوم به جلالی است.
(((
متاسفانه من در کتابها برای جلالی یک الگوریتم و در اینترنت یک الگوریتم دیگر دیده ام ولی هر دو الگوریتم خیلی کامل هستند و تا سال 140X جواب یکسانی میدهند.
بحرحال من روی الگوریتم ساده تر را که در اینترنت خواهید یافت و تقویم شمسی داخلی Microsoft .Net Framework هم بر همان اسا کار میکند، را توضیح کوتاهی خواهم داد
)))

متاسفانه اگر در اینترنت جستجو کنید کدهای زیادی برای تقویم شمسی خواهید یافت که معمولاً سرشار از If و Select یا Switch هستند و مدام اعداد 20 و 21 و 22 در انها تکرار شده !!!!
کل این الگوریتم و روش ها از اول و تا اخر اشتباه محضو هستند! و فقط در یک بازه 4 یا حداکثر 5 ساله صحیح کار خواهند کرد.
این کدها و الگوریتم ها مطلقاً فاقد ارزش علمی و کاری عملی هستند.

در محاسبات تقویم در نظر گرفتن سالهای کبیسه خیلی خیلی مهم است.
ما هر 4 سال یک کبیسه داریم که سال 366 روز میشود و هر 33 سال یک کبیسه 5 ساله داریم که یعنی سال 32 دوم باید کبیسه باشد ولی سال 33 کبیسه میشود و تا کبیسه قبلی 5 سال فاصله می افتد.

شما برای محاسبه و تاریخ و تبدیل و... در برنامه نویسی ... روش صحیح ان است که هر تاریخی به تعداد روز خالص گذشته از اول هجرت یا اول میلاد حضرت مسیح (ص) تبدیل کنید.

یعنی یک کد کوچک که روز سال را به تعداد روز سال تبدیل میکند
و
یک کد دیگر که سر سال را به تعداد روز تبدیل میکند.
(سال * 365 + تعداد کل کبیسه های رخ داده)

در نهایت بعد از جمع و تبدیل تاریخ به تعداد روز گذشته از اول هجرت با یک دستور باقیمانده میتوانید روز هفته (چند شنبه) را محاسبه کنید و با تبدیل تعداد روز به تاریخ میلادی میتوانید تبدیل به میلادی را هم انجام دهید.

aliexo
10-01-2010, 23:14
خیلی ممنون , خب مشکل من اینه که 0/0/0 رو شنبه بگیرم یا نه ؟
حالا یه چیز دیگه , خوده شما این برنامه رو داری به زبان c یا c++ ؟
اگه داری به من میل کن چون بدجور لازم دارم و باید روش کار کنم و با 5 تا پروژه دیگه تحویل استاد بدم تا 1 هفته دیگه
اینم email :

exotic.register@yahoo.com

_H2_
12-01-2010, 15:42
سلام
تاریخ 0/0/0 برای مبنای محاسبه بودن کمی ایهام دارد و شاید آدم را منحرف کند.
بهتر است 1/1/1 را تاریخ مبنای محاسبه قرار دهید.
این تاریخ ایهام کمتری دارد! ضمن اینکه مهم یک تاریخ ثابت برای مبنا است و مقدارش مهم نیست!

==============

اگر تاریخ 1/1/1 مبنا باشد این تاریخ پنجشنبه بوده.
اولین کبیسه 5 ساله (پایان یک دوره 33 ساله) در سال 22 هجری بوده و اخرین کبیسه 5 ساله تا حالا در تاریخ 1375 بوده.
(((
یعنی سال 1370 کبیسه عادی بوده و چون در پایان دوره 33 ساله بودیم بجای 1374 سال 1375 کبیسه شده.
همینطور سال 17 شمسی کبیسه عادی بوده و به جای سال 21 سال 22 اولین کبیسه 5 ساله بعد از هجرت روی داده.
)))

یعنی با خود سال 22 شش بار کبیسه رخ داده (1,5,9,13,17,22)
از سال 22 تا خود سال 1375 جمعاً 328 کبیسه رخ داده!

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

از سال 1375 تا سال 1388 هم باز سه کبیسه رخ داده (1379,1383,1387)

پس در اول روز عید 1388 چند روز از تاریخ مبنا گذشته؟

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
یعنی 506592 روز گذشته!
عدد 1 همان سال مبنا است و عدد 3و6و328هم کبیسه های رخ داده هستند که هر کدام یک روز به سال و زمان اضافه کرده بودند!
حل است؟

==============

مثلاً امروز 22 دیماه 1388 ...
298 امین روز سال جاری است.
(((
امین! یعنی خودش هم حساب است
در واقع 297 روز اول اول عید گذشته با خود روزی که در ان هستیم میشود 298 امین روز سال
)))

و اول فروردین 1388 برابر 506592 روز از تاریخ مبنا سپری شده گذشته.
(((
در واقع آخرین روز اسفند 1387 برابر 506592 امین روز هجرت بوده.
و خود روز عید 506593 امین روز هجرت بوده.
)))

در نهایت تاریخ 22 دیماه 1388 در کل 506592+298 امین روز برابر 506890 امین روز هجرت است.

==============
حالا امروز چند شنبه و چندمین روز هفته است؟

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
days برابر تاریخ گذشته از روز مبنا با خود روز مبنا و خود روزی که در آن هستیم میباشد.
(((
عدد 5 به خاطر روزهفته در تاریخ مبنا است و عدد 1 به خاطر ان است که خود روزمبنا را هم در شمارش لحاظ کرده بودیم.
)))


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

موفق باشید.

aliexo
12-01-2010, 22:34
خیلی عالی بود , کارت بیسته :10: :5: :31: :11:

_H2_
13-01-2010, 14:10
سلام
دو مطلب دیگر ...
1)
حتما دقت کنید که کبیسه بودن سالی که در ان هستیم مهم نیست و نباید محاسبه شود.
یعنی اگر به فرض سال 1388 کبیسه هم میبود باز جواب فوق فرقی نمیکرد.
چون قرار است آخر سال کبیسه یک روز اضافه شود و طبیعتاً تاثیری در محاسبه تاریخ های داخل همان سال ندارد.
پس حتماً تعداد کبیسه ها از سال 1 تا یکسال قبل سالی که میخواهید محاسبه کنید.

2)
یک نمونه برنامه که بر اساس همین الگوریتم کار میکند را میتوانید در زیر دانلود کنید.
exe پروزه در مسیر دایرکتوری bin قرار دارد و در Vista و Win7 چیزخاصی برای اجرا نمیخواهد ولی در سیستم عامل قدیمی تر XP باید Framework2.0 روی سیستم نصب باشد تا exe کار کند.

میتوانید از این برنامه کوچک و ساده برای تست کارتان و صحت کدی که نوشته اید استفاده کنید.
support.h02.ir/fwlink/?LinkId=1002125877

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

hasti_tv
05-05-2010, 01:17
سلام
من دنبال الگوریتم تقویم شمسی میگردم ،میخوام واسسه هر روز داشته باشم که چند شنبس،و تاریخ اون به میلادی و قمری چی میشه!!! کسی میتونه به من کمک کنه !خواهش میکنم باید برنامشو این هفته تحویل بدم:41::11:

_H2_
09-05-2010, 01:21
سلام

من دنبال الگوریتم تقویم شمسی میگردم ،میخوام واسسه هر روز داشته باشم که چند شنبس،و تاریخ اون به میلادی و قمری چی میشه!!! کسی میتونه به من کمک کنه !خواهش میکنم باید برنامشو این هفته تحویل بدم
گمانم برای روز هفته توضیحات قبلی کامل و کافی ب.ده ....
نمیدانم چه باید به آن اضافه کنم

برای تبدیل به/از میلادی هم فرق خاصی ندارد ...
مهم محاسبه تعداد روز گذشته از اول سال مبنا است، همان عدد 506890 در توضیحات قبلی ...

این عدد که محاسبه شد منهای اختلاف تعداد روز در سال مبنا بین تاریخ میلادی و شمسی میشود و تعداد روز گذشته از اول مبنای میلادی (میلاد حضرت مسیح) به دست می آید.
بعد هم کافی است تعداد روز گذشته از میلاد را تبدیل به تاریخ کنید که خیلی مشابه روند شمسی است و فقط در کبیسه هایشان تفاوت دارد که روند کبیسه های میلادی هم اینچنین است که هر 4 سال یک کبیسه دارند و هر 100 سال یک کبیسه 4 ساله را نمیگیرند (یعنی کبیسه شان 8 ساله میشود) و هر 400 سال مجدد کبیسه را دارند.

=====

اگر توضیح خواستید باز در خدمت هستم ولی اگر منظورتان از کمک، گذاشتن کد باشد شرمنده تان میشوم ...
موفق باشید.

elephant
02-05-2013, 13:19
سلام من الان ی سوال برام \یش اومد.
الان اینجا اگه ی روزی در سالهای قبلی ۱۳۷۵ را بخواهیم چطوری محاسبه میشود؟
ممنون میشم چواب بدین

_H2_
02-05-2013, 21:14
سلام
فرقی ندارد، توضیحات کلی بود
مشکل شما فقط فرمول خط اول است؟!
بفرمائید این هم فرمول جایگزین بدون دانستن سال 1375 !

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

elephant
03-05-2013, 06:17
ببخشید بازم ... این بهترین الگوریتمی بود که \یدا کردم الان من ایم ک رو زدم اشتباه جواب میده ... میشه ببینی مشکل از کدوم فرموله ...
ممنون میشم یجا mounthdays داخلش تعداد روزهای هر ماه است

ا


int sum =0 ;






int kabise =(year-22 -1)/33 ;






( 8 * int basedays = (year-1)*365 + 6 + (kabise ;





sum =day + basedays;






for(int i = 1 ; i < mounth ; i++ )


sum+=mounthdays[i];





int dayofweek = ( sum + 5) % 7;












return dayofweek;

elephant
03-05-2013, 06:33
مثلا ۳ مهر ۱۳۷۳ یکشنبه است اما با این فرمول جواب سه شنبه نشان می دهد

_H2_
03-05-2013, 23:17
سلام
اول اجازه دهید یکبار فرمول پست 4 را برای 3 مهر 1373 محاسبه کنیم:
(نیاز به دانستن عدد آخرین کبیسه 5 ساله یک دوره 33 ساله از فرمول قبلی حذف شد)

با خود سال 22 شش بار کبیسه رخ داده (1,5,9,13,17,22)
از سال 22 تا آخرین کبیسه 33 ساله(1342) جمعاً 320 کبیسه رخ داده

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

از سال 1373 تا آخرین کبیسه 33 ساله(1342) هم باز 7 کبیسه رخ داده

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
(این عدد در محاسبه شما لحاظ نشده)

پس در اول روز عید 1373 کلاً 501113 روز از تاریخ مبنا گذشته.

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

و 3 مهر هم 189 امین روز سال است.
در نهایت تاریخ 3 مهر 1373 در کل 501113+189 امین روز برابر 501302 امین روز هجرت است.


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
(عدد 1 هم در فرمول شما لحاظ نشده)

دو اشتباه تان را در پرانتزهایی در بالا ذکر کردم و مورد سوم هم باید در خصوص محدوده ابعاد آرایه ای که تعداد روزهای ماه را در آن قرارداده اید دقت کنید، این لزوماً اشتباه نیست فقط یک هشدار است.
(فقط دقت کنید که اعداد ماه ها از یک شروع میشود و شاخص آرایه ها از صفر)

موفق باشید.

elephant
04-05-2013, 18:36
واقعا ممنون خیلی لطف کردین :n01:
خیلی بهم کمک کردین
:n01:

ry_mohammad
11-03-2016, 05:23
سلام
دوستان برای یه دستگاهی باید شمسی رو تبدیل به میلادی کنم
هر چی کد میزنم نمی تونم این کبیسه ها رو با هم جور در بیارم
میشه در مورد کبیسه ها بیشتر توضیح بدین
من هر کاری می کنم تو ماه 12 شمسی به بعد یه عدد کم میاد
واقعیتش الگوریتمشو درست متوجه نشدم مطالبی که تو سایت ها گفتند بیشترشون صحیح نیست و هر کدوم یه مدل جواب میدن

hadiseh999
09-03-2017, 20:43
سلام
عدد یک و پنج تو این خط برای چیه؟اگه میشه ی توضیح بدید
(days+5-1)
:n28::n28::n28::n28:خواهشا کمک کنید دوشنبه باید پروژه رو تحویل بدم ب استاد

_H2_
09-03-2017, 22:17
سلام

عدد یک و پنج تو این خط برای چیه؟
سالها گذشته است، حضور ذهن کافی ندارم ولی چون دو عدد 5 و 1 را جدا نوشته ام، احتمالا عدد 5 مربوط به روزهفته در آغاز هجرت میشود (یا 1-1-1 یااحتمال بیشتر تاریخ خیالی 0-1-1 که صفرروز گذشته بوده و هنوز هجرت آغاز نشده بوده، یعنی احتمالا روز قبل هجرت پنجشنبه بوده) ...
احتمالا عدد 1 هم مربوط به این میشود که روزی که در آن هستیم یا باید محاسبه بشود یا باید محاسبه نشود!!!
دروافع تلفیق این دو عدد نوعی کالیبره کردن معادله را تشکیل میدهد.


ولی اگر دقیق ترش را بخواهید...
مجدد تاکید میکنم که الآن حضور ذهن کافی ندارم ولی با نگاه اجمالی که به نوشته خودم داشتم(!) بنظرم رسید که:
==============
محاسبه در کل درست است ولی...
به گمانم این منهای یک باید در روزهای گذشته در هجرت لحاظ میشده...
یعنی وقتی در نوروز 501113 از هجرت گذشته است...
و اول فروردین هم 1 امین روز سال است...
نمی توانیم بگویم اول فروردین 501113+1 روز هجرت است...
پس یک منفی یک میخواهد...
یعنی اول فروردین 1-1+501113 روز هجرت است.

یعنی وقتی 3 مهر 189 امین روز سال است
پس 501113+189-1 روز از هجرت گذشته که میشود 501301
اینطوری دیگر در فرمول روزهفته منفی یک نمیخواهد...
الآن در حد پنج دقیقه ای که نگاه کردم بنظرم میرسد آن منفی یک در روزها اعمال شود "گفته صحیح تری" است.

باز خودتان بررسی کنید.
موفق باشید.