آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
مشکل عدم دسترسی خریداران پیشین به برخی آموزش ها برطرف شد
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

کبیسه گیری دقیق شمسی (آموزش)

FSR  8 سال پیش  8 سال پیش
+8 0

سلام

تویه انجمن ios یه آموزشی دیدم در خصوص کبیسه گیری شمسی ( لینک) چون تویه انجمن ios عضو ویژه نیستم نتونستم اشتباهشون رو بهشون بگم و چون تویه همین انجمن هم سوالات زیادی در این مورد پرسیده شده بود گفتم بد نیست بیام اینجا این آموزش رو بزارم . خوب بریم سر اصل مطلب

تویه بیشتر کدهای که من دیدم برای کبیسه گیری شمسی اومدن گفتن سال کبیسه در تاریخ جلالی ( شمسی ) هر 4 سال یکبار اتقاق می افتد با این تفاوت که بعد از گذراندن هر 8 دوره ی 4 ساله ( 32 سال ) به جای 4 سال ، 5 سال محاسبه می شود. این تنها بخشی از قضیه هستش ! اصل مطلب از ویکی پدیا :

تقویم رسمی کنونی ایران معمولاً هر چهار سال یکبار کبیسه می‌شود و برای جبران کسر سال حقیقی، در آغاز هر دورهٔ ۲۹، ۳۳ یا ۳۷ساله، یک کبیسه پنج ساله وجود دارد. در یک فراز پنج‌هزارساله، مابه‌ازای هر دورهٔ ۳۷ساله، نزدیک به پنج دورهٔ ۲۹ساله و تقریباً ۲۰ دورهٔ ۳۳ساله وجود دارد. ویکی پدیا

یه راه ساده برای این که بفهمیم کد های که در مورد کبیسه گیری نوشته شدن درست هستن یا نه ، این هست که ما بیایم این سال های رو که در پایین گفتم داخل کد امتحان کنیم اگه کبیسه بودن کد درسته ، اگه نبودن کد غلطه . 1304 و 1308 و 1341 و..

برای فهمیدن کبیسه های شمسی بر خلاف کبیسه های میلادی هیچ فرمول خاصی برای دستیابی به کبیسه های کل تاریخ نیست ! اگه هم باشه یه معادلات خیلی خیلی پیچیده هستش ! از اونجایی که ما کبیسه کل تاریخ رو نمیخوایم پس از سال 1 شمسی تا 1502 شمسی برامون کفایت میکنه .

اینم از کدش :

 final int[] kabise   = new int[]{ 4, 37, 66, 99, 132, 165, 198, 231, 264, 297, 326
                         , 359, 392, 425, 458, 491, 524, 553, 586, 619, 656, 685, 718, 751, 784, 817
                         , 850, 883, 916, 949, 978, 1011, 1044, 1077, 1110, 1143, 1176, 1209, 1238
                         , 1275, 1308, 1343, 1370, 1401, 1436, 1473, 1502 };

public boolean kabiseShamsi(int sal) { int k = 0; for (int i = 0; i <= sal; i += 4) { if (i > kabise[k]) { i++; k++; } if (sal == i) { return true; } } return false; }
 
 
 
 
 

اگه جای از کد رو متوجه نشدید یا اگه کد غلطه و کد بهتری دارید ممنون میشم اطلاع بدید.

با تشکر از همتون که وقت گذاشتید این مطلب رو خوندید.

+2 0
بیزحمت توی کد ماژول تاریخ شمسی استاد اینو بگنجانید و قرار بدید (8 سال پیش)
+2 0
کد ماژول تاریخ شمسی رو نوشته ولی یه خورده مشکل داره به محض این که حل شد کدش رو قرار میدم. (8 سال پیش)
+1 0
عالی بود (8 سال پیش)
+1 0
اعداد داخل آرایه را مجدد بررسی کردم ، فکر می کنم یک اشتباه تایپی رخ داده و باید عدد 1343 را به 1341 تغییر دهید ، چون دو عدد 1308 و 1275 در دو دوره ی 33 ساله قرار می گیرند ، از طرفی عدد 1370 حاصل جمع دو عدد 1341 با 29 می باشد . فکر می کنم اون باگی که اشاره کردم حاصل این اشتباه تایپی باشد . موفق باشید (8 سال پیش)
0 0
در قسمت پایین لوگ ها رو چاپ کردم باگی نداشت . دقیقا کدوم سال مد نظرتونه ؟ (8 سال پیش)
+1 0
سلام بسیار عالی ممنون (8 سال پیش)
 برای این سوال 3 پاسخ وجود دارد.
پاسخ به سوال 
سهرابیان  8 سال پیش
+4 0

سلام FSR . کد شما رو امتحان کردم خیلی عالی بود  . اگر اشتباه نکنم یک باگ خیلی کوچکی هم داشت و در زمانی این باگ ظاهر میشد که به آخرین بازه تعیین شده در آرایه می رسیدیم ، دقیقاً یادم نیست ولی در کل الگوریتم خوبی بود .  

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

 public static void LeapYearSolar (int year) {

        BigDecimal constantNumber = new BigDecimal("0.24219858156");

        double leapYearSolar = (year + 2346) * (0.24219859156);
        String strLeapYearSolar = Double.toString(leapYearSolar);

        BigDecimal bd = new BigDecimal(strLeapYearSolar);
        Integer intPart = bd.intValue();
        BigDecimal bdInt = new BigDecimal(intPart);
        BigDecimal bdDec = bd.subtract(bdInt);

        //Compare ConstantNumber with bdDec
        int res = constantNumber.compareTo(bdDec);

        if ( res == 1 )
            Log.i("Test" , " is Leap year solar " );
        else if ( res == -1 )
            Log.i("Test" , " is not Leap year solar ");

    }
 

فراخوانی Mehod نوشته شده : 

LeapYearSolar(1395);
 

در ضمن با اجازه شما الگوریتمی که نوشته اید را در انجمن IOS قرار خواهم داد ، در صورت تمایل پیام خصوصی داده تا در انجمن IOS الگوریتم شما را قرار دهم .   

+1 0
خیلی ممنون که این تاپیک رو مطالعه و کد ها رو تست کردید . در رابطه با الگوریتم هم خیلی خوشحال میشم بچه های انجمن ios از کد استفاده کنن. (8 سال پیش)
+1 0
در مورد الگوریتم شما : این الگوریتم یه خوبی داره چندتا بدی . خوبیش اینه که میشه به صورت فرمول ریاضی سال کبیسه رو تشخیص داد ، ولی بدیش اینکه اگه اشتباه نکنم برای سال های ۲۳۴۶ به بعد درست کار میکنه و بعدشم طبق مطلبی که در بالا گفتم برای سال های 1308 و 1341 کد درست کار نمیکنه و به صورت کلی هر 50 یا 100 سال یکبار سال کبیسه جابجا میشه . اگه ما بیایم بر این اساس ماژول تاریخ شمسی بنویسیم تویه برخی از تاریخ ها (مثل 1308 یا 1341) محاسباتمون دچار مشکل میشه . ما باید بر اساس کبیسه‌گیری گاه‌شماری رسمی ایران پیش بریم نه گاه‌شماری هجری خورشیدی حسابی . الان به نظر شما یا دوستان از چه راهی بریم بهتره ؟ (8 سال پیش)
+1 0
سلام ، باید بیشتر تحقیق کرد . اگر از موسسه ژئوفیزیک - دانشگاه تهران کمک بگیرید و تحقیقات خودتون رو از این موسسه شروع کنید زودتر و بهتر به نتیجه خواهید رسید ، البته اگر جواب بدهند . (8 سال پیش)
+1 0
البته از " مرکز تقویم ژئوفیزیک دانشگاه تهران " باید کمک گرفت . پیشنهاد می کنم از دوستانی کمک بگیرید که به صورت حضوری به این موسسه دسترسی دارند . (8 سال پیش)
0 0
ممنون . جالب اینجاست یه مطلب درست و حسابی در این مورد تویه اینترنت پیدا نمیشه ! (8 سال پیش)
+1 0
در رابطه با الگوریتم بالا این نکته رو هم بگم که سال های کبیسه ای که نسبت به تقویم حسابی بدست می آیند یکسال نسبت به سال های کبیسه ی شمسی به تاخیر می افتند و این در حالی است که سال های کبیسه ی تقویم شمسی یکسال جلوتر از کبیسه حسابی می باشند . (8 سال پیش)
پاسخ به سوال 
FSR  8 سال پیش
+1 0

دقیقا تویه کدوم سال باگ داره ؟

من از سال 1280 تا 1500 امتحان کردم باگی نداشت .

+1 0
در کد شما آرایه ای از اعداد وجود دارد ، حالا در همون آرایه عدد 1343 را به 1341 تبدیل کنید و دوباره با استفاده از حلقه for یک اجرا دیگر بگیرید . (8 سال پیش)
+1 0
برای اینکه از الگوریتم شما اطمینان بیشتری پیدا کنم ، با استفاده از لینک ویکی پدیایی که قرار دادید دوباره نشستم و اعداد را از اول محاسبه کردم و متوجه شدم که باید در آرایه فقط عدد 1343 تبدیل به 1341 شود که دلیل آن را در بالا کامنت کردم . دوباره کامنت من را مطالعه کنید . الان هم عدد 1343 را به 1341 تغییر دادم و از الگوریتم شما تست گرفتم عین جواب شما بود . (8 سال پیش)
+1 0
الگوریتم شما سال 1474 را سال کبیسه شناسایی نمی کند و در عوض سال 1473 را به عنوان سال کبیسه در نظر می گیرید که این اشتباه است و فعلا می توانید این سال را به عنوان استثناء با استفاده از شرط if کنترل کنید . (8 سال پیش)
پاسخ به سوال 
hamidd  8 سال پیش
+1 0

سلام دوستان این تابع هم همین کارو انجام میده . ببینین باگ داره یا نه، اگه به دردتون خورد استفاده کنید. البته این تابع هم مثل بقیه توابع در بازه ی خاصی کار می کنه و درست تشخیص میده.

 

 public static boolean isLeapYear (int year){
        double a = 0.025;
        int b = 266;
        double leapDays0;
        double leapDays1;
        if (year > 0) {
            leapDays0 = ((year + 38) % 2820) * 0.24219 + a;
            leapDays1 = ((year + 39) % 2820) * 0.24219 + a;
        }else if ((year < 0)){
            leapDays0 = ((year + 39) % 2820) * 0.24219 + a;
            leapDays1 = ((year + 40) % 2820) * 0.24219 + a;
        }else {
            return false;
        }

        long frac0 = (int)((leapDays0 - (int)(leapDays0))*1000);
        long frac1 = (int)((leapDays1 - (int)(leapDays1))*1000);
        if (frac0 <= b && frac1 > b) {
            return true;
        }else{
            return false;
        }
    }
 

 

0 0
سلام بر اساس گاه‌شمار رسمی حساب کردی یا گاه‌شمار حسابی ؟ (8 سال پیش)
+1 0
بر اساس هجری خورشیدی حسابی . منبع لینک (8 سال پیش)
0 0
کد آقای patriot@ هم از نوع حسابی هستش . برای محاسبه دقیق باید از گاه‌شمار رسمی استفاده کنیم. (8 سال پیش)
+2 0
دوستان صادقانه بگم ، مطالعه ی resource های خارجی و حتی فعالیت کردن در سایت های مثل : stackoverflow براتون خیلی مفید و مناسب تر خواهد بود . یک برنامه نویس موفق بیشتر وقت خودش را باید صرف مطالعه پروژه های opensource بکنه و باید بیشتر وقت خودش را صرف تحقیق کند تا صرفاً کد نویسی به صورت آزمون و خطا . باید مقاله های خارجی را مطالعه کنید . بنابراین پیش نیاز تمام این موارد یادگیری زبان انگلیسی می باشد . اگر قصد این رو دارید که رشد شما در برنامه نویسی بیش از حد باشه باید سراغ یادگیرید زبان انگلیسی برید ، یعنی : اینکار بایدی هست . من از این منبع برای یادگیری زبان استفاده می کنم و خواهم کرد : لینک و همچنین برای اینکه از نحوه فعالیت این آموزشگاه باخبر بشید به این لینک مراجعه کنید . البته همه چیز به خودمون بستگی داره . (8 سال پیش)
0 0
این سایت رو قبلا دیده بودم . من یه آموزشی میخوام صرفا برای خوندن متن های انگلیسی نه برای صحبت کردن ! اگه آموزش خوبی رو سراغ دارید ممنون میشم معرفی کنید. (8 سال پیش)
+1 0
آموزش خاصی سراغ ندارم ولی آموزش های این آموزشگاه به صورت حضوری و غیر حضوری هست . اگه اشتباه نکنم با گذروندن دوره ی Advanced ــــش شما میتونید به مهارت Reading برسید . البته تا اونجایی که من میدونم اگر بیشتر تمرکزتون رو روی خواندن منابع لاتین قرار بدید به این توانایی می رسید ، شاید اولش ترسناک باشه و فکر کنید که وقت زیادی رو از دست میدید ولی اگر ناامید نشید به این مهارت می رسید . من پیشنهاد اینکه به این آموزشگاه زنگ بزنید .البته درو های غیر حضوری همراه با پیشتیبان هست . (8 سال پیش)
+1 0
@FSR برای گاه شمار رسمی روشی تصویب نشده و همین باعث سردرگمیه منجمان در ایران شده و در محاسبات براشون مشکل ایجاد کرده، چون مبنای محاسبه ی سال کبیسه، "نقطه ی اعتدال بهاری" هست. به خاطر همین از گاه شماری حسابی استفاده میشه و برای یک سری بازه ها منجمان و ریاضیدانان الگوریتم هایی ارایه کردن که ازشون استفاده میشه. کدی که شما نوشتید هم گاه شماری حسابی هست. (8 سال پیش)
+1 0
کدی که من نوشتم بر اساس گاه‌شمار رسمی ایران هستش خودتون میتونید امتحان کنید! طبق عکسی که گذاشتم سال های کبیسه با این لینک مطابقت میکنه در صورتی که با کد شما در برخی از سالها کبیسه اشتباه تشخیص داده میشه . (8 سال پیش)
+1 0
@FSR اون کد مال من نیست. تو کامنت اولی منبعش رو براتون گذاشتمhttps://fa.wikipedia.org/wiki/سال_کبیسه. منبع اش ویکیپدیاست . در کدوم سال اشتباه تشخیص داد؟ (8 سال پیش)
+1 0
لینک (8 سال پیش)
+1 0
کد رو از ویکیپدیا برداشتم و گذاشتم براتون. (8 سال پیش)
0 0
فعلا 1341 ولی بیشتر از ایناست فقط برای سال های 1300 تا 1395 رو امتحان کردم (8 سال پیش)

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .