النتائج 1 إلى 9 من 9

الموضوع: خوارزمية يوم الحساب(المستخدمه في برمجة التقويم)

  1. #1
    Banned
    تاريخ التسجيل
    Aug 2007
    المشاركات
    371

    خوارزمية يوم الحساب(المستخدمه في برمجة التقويم)



    السلام عليكم
    قد يبدو اسم هذه الخوارزمية غريبا ولكن هكذا سماها مبتكرها: "The Doomsday Algorithm" وواضع هذه الخوارزمية هو أحد أساتذة الرياضيات واسمه John Horton Conway. ولا أدري حقيقة فيما إذا قام أحدهم بوضع تعريب مناسب لهذا الاصطلاح، لكن دعونا نستخدم هذا الاسم "خوارزمية يوم الحساب" .
    الهدف من هذه الخوارزمية هو حساب يوم الأسبوع لأي تاريخ معطى ودون الرجوع إلى المفكرة المعلقة في البيت أو روزنامة جهاز الكمبيوتر. مثال اليوم 4/3/2004 هو يوم الخميس، كيف يمكن أن أحدد أنه يوم الخميس دون الرجوع إلى المفكرات ؟
    المستفيدون من معرفة هذه الخوارزمية هم في الغالب المبرمجون ومصممو برامج التقاويم أو البرامج التي تعتمد على التقاويم، مثل برنامج الروزنامة (Calendar) في الويندوز. ويستفيد من هذه الطريقة أيضا كل مهتم بمواضيع التأريخ والتقاويم.
    وحتى تكون الصورة واضحة بشكل جيد لكل قارئ للموضوع سأسأل هذا السؤال:
    ماذا كان اليوم في 16/5/1975 ؟ هل هو سبت أو احد أو إثنين أو ... الخ ؟
    خوارزمية يوم الحساب ستعلمنا كيف نجيب على مثل هذا السؤال.
    تقول هذه الخوارزمية إن لكل سنة يوما مركزيا يسمى يوم الحساب، وهذا اليوم هو ما ننطلق منه لتحديد يوم الأسبوع لأي تاريخ في تلك السنة. ويوم الحساب بكل اختصار هو آخر يوم من أيام الشهر الميلادي الثاني (شباط/فبراير). أي أننا سنجعل هذا اليوم مركز السنة كلها.
    ولماذا هذا اليوم بالتحديد ؟ لأن شهر 2 هو الشهر الوحيد الذي يتغير فيه عدد الأيام متأثرا بنوع السنة. ففي السنة الكبيسة عدد أيام الشهر 29 يوما، وفي السنة الاعتيادية يكون عدد الأيام 28 يوما.
    للتوضيح، فإن السنة الحالية 2004 هي سنة كبيسة، وعليه فإن يوم الحساب لهذه السنة هو يوم 29/2 ويصادف يوم الأحد. وهنا النقطة الرئيسية، فلا نقصد بمعرفة يوم الحساب معرفة ما إذا كان يوم 28 أو 29، ولكن معرفة يوم الأسبوع الذي يصادفه في تلك السنة، وسنفهم لماذا.
    مثال آخر: السنة الماضية 2003 ما هو يوم الحساب لها ؟
    كان يوم الجمعة. وتستطيع أن تتأكد بنفسك، وذلك بالرجوع إلى تاريخ 28/2/2003.
    وإذا سألت ما هو المفيد في معرفة يوم الحساب ؟ أقول لك إن يوم الحساب هو أحد أيام الأسبوع السبعة (سبت، أحد، إثنين، ثلاثاء، أربعاء، خميس، جمعة)، وهذا اليوم موجود في كل شهر من أشهر السنة، فنقوم بتحديد يوم الحساب للسنة، ثم من خلال علاقة معينة نستطيع أن نعرف كل يوم من أيام الشهر ماذا يصادف.
    التوضيح، مثال تاريخ 1/5/2004
    يوم الحساب لسنة 2004 هو يوم الأحد
    متى يحصل يوم الحساب في شهر 5، أي متى يأتي يوم الأحد في شهر 5، إذا استطعنا أن نعرف أن يوم الأحد سيكون في 9/5 (التاسع من أيار)، إذن 2/5 (قبل سبعة أيام) كان يوم
    أحد، إذن يوم 1/5 كان يوم السبت.
    أرجو ان تكون الفكرة قد اتضحت، وهي بعد ان نعرف يوم الحساب للسنة ككل. نريد أن نعرف يوما واحدا فقط في كل شهر يكون مصادفا ليوم الحساب. وهذه هي الخطوة الثانية.
    الخطوة الثانية: نقوم بتصنيف أيام السنة إلى ثلاث مجموعات:
    1. شهر 2 (فبراير)
    2. الأشهر الزوجية وهي 4، 6، 8، 10، 12
    3. الأشهر الفردية وهي 1، 3، 5، 7، 9، 11
    الهدف من هذا التصنيف هو معرفة يوم الحساب لكل شهر، شهر 2 نخرجه في مجموعة منفصلة لأنه هو نقطة البداية وقد استطعنا معرفة يوم الأسبوع في آخر يوم من أيامه.
    في الأشهر الزوجية، تقول الخوارزمية أن رقم اليوم المماثل لرقم الشهر هو يوم الحساب ! يعني، أن 4/4 هو يوم الحساب في شهر 4، 6/6 هو يوم الحساب في شهر 6، 8/8، 10/10، و12/12
    مثال: ما هو يوم الأسبوع في تاريخ 3/12/2004
    يوم الحساب لسنة 2004 هو الأحد.
    يوم 12/12 سيكون يوم الأحد (حسب القاعدة للأشهر الزوجية)
    إذن قبل أسبوع أي 5/12 كان يوم أحد، وبالتالي 3/12 هو يوم جمعة.
    في الأشهر الفردية، نحتاج إلى قليل من التفصيل اليسير كالتالي
    شهر 1: القاعدة تقول إذا كانت السنة كبيسة فإن يوم 4 من شهر واحد هوة يوم الحساب، وإلا يكون يم 3 هو يوم الحساب.
    مثال في سنة 2004، يوم الحساب (الأحد) لشهر 1 هو يوم 4/1. وانطلاقا منه نستطيع معرفة يوم الأسبوع لأي يوم خلال هذا الشهر.
    شهر 3: هذا سهل، لأنه ياتي مباشرة بعد شهر 2 الذي حددنا منه يوم الحساب، لذلك أول يوم من شهر 3 هو مباشرة اليوم الذي يأتي بعد يوم الحساب.
    مثال: في سنة 2004، 1/3 يصادف يوم الإثنين، لأن يوم الحساب لهذه السنة هو أحد.
    الأشهر الأربعة الفردية المتبقية تتبع هذه العلاقة التبادلية:
    5-9
    7-11
    توضيح: في شهر 5 يكون اليوم 9 (التاسع) هو يوم الحساب، وفي شهر 9 يكون اليوم 5 (الخامس) هو يوم الحساب.
    في شهر 7 يكون اليوم 11 (الحادي عشر) هو يوم الحساب، وفي شهر 11 يكون اليوم 7 (السابع) هو يوم الحساب.
    لا أظن أن حفظ هذه العلاقات صعب، أليس كذلك ؟
    مثال على الأشهر الفردية:
    ماذا يكون يوم 16/5/2004 ؟
    يوم الحساب هو أحد في السنة 2004
    يوم 9/5 يكون يوم الأحد (حسب العلاقة اعلاه)
    بعد أسبوع أي 16/5 تماما يكون يوم الأحد. تأكد بنفسك من روزنامة كمبيوترك الشخصي هل 16/5/2004 هو يوم أحد ؟
    تلخيصا لما سبق، عرفنا أن باستخدام خوارزمية يوم الحساب نستطيع الحصول على يوم الأسبوع لأي يوم من أيام أي سنة، وذلك بمعرفة اليوم الذي يصادف أن يكون يوم الحساب في أي شهر من أشهر السنة.
    لكن كما لاحظنا، توجب علينا أن نعرف يوم الحساب للسنة التي أحسب لها الروزنامة، وإذا أردت أن أطور برنامج روزنامة ل100 سنة مثلا، فإنه يجب علي تزويد البرنامج ب100 يوم حساب، فهل يمكن الحصول على يوم الحساب لأي سنة بجهد أقل ؟
    الجواب: نعم !

    بدلا من حفظ يوم الحساب لكل سنة على حدة، يمكننا أن نحفظ يوم الحساب للقرن الكامل. ومن خلاله ننستطيع تحديد يوم الحساب لأي سنة تنتمي إلى ذلك القرن.
    يعني إذا كان المطلوب من برنامجك إنشاء روزنامة للسنوات من 1920 - 2020، فيتوجب عليك حفظ يومي حساب فقط، وليس 100 يوم حساب، وذلك بمعرفة يوم الحساب للقرن 1900 (القرن 20)، ويوم الحساب للقرن 2000 (القرن 21). ومن ثم نستطيع استخراج يوم الحساب لأي سنة في هذين القرنين.
    الطريقة تتلخص فيما يلي:
    1. تحديد يومي الحساب للقرنين
    يوم الحساب للقرن 1900 هو يوم الأربعاء
    يوم الحساب للقرن 2000 هو يوم الثلاثاء
    2. نعتبر في حساباتنا أول رقمين من السنة ونهمل الرقمين الآخرين، مثال سنة 1975، نأخذ الرقم 75 فقط ونتجاهل رقمي القرن.
    3. للسنة المراد معرفة يوم حسابها، واعتمادا على الرقم الذي أخذناه، نحسب كم مرة تكرر العدد 12 فيه (كم 12 يوجد في ذلك الرقم)، يعني ببساطة نقسم على 12 ونأخذ العدد الصحيح.
    مثال لسنة 75: نقسم 75/12 = 6 (نهمل الرقم الكسري)
    4. نأخذ باقي القسمة السابقة
    مثال: عندما قسمنا 75/12 كان الناتج 6 أما الباقي فهو 3 وهذا ما نريده في هذا الخطوة
    5. في الباقي الذي حصلنا عليه، نحسب كم 4 يوجد فيه. أي تقسم الباقي على 4 ونأخذ العدد الصحيح.
    مثال: في الخطو السابقة الباقي هو 3. نقسم على 4 فيكون الجواب 0 (صفر)
    6. نجمع الأرقام النهائية التي حصلنا عليها في الخطوات الثلاث الأخيرة.
    مثال: من الخطوات السابقة حصلنا على النتائج التالية: 6 و 3 و صفر، المجموع = 9
    7. المجموع النهائي يمثل عدد الأيام التي يجب أن نضيفها على يوم الحساب للقرن لنحصل على يوم الحساب للسنة المطلوبة.
    مثال: يوم الحساب للقرن 1900 هو الأربعاء، بعد 9 أيام سيكون هو يوم الجمعة.
    لتسهيل هذا الجمع لاحظ انه يمكننا إزالة مضاعفات الرقم 7 من المجموع النهائي قبل إضافته إلى يوم الحساب، وذلك لأن اليوم يتكرر كل 7 أيام. في مثالنا هذا 9 - 7 = 2، نضيف 2 إلى يوم الأربعاء فيكون هو يوم الجمعة.
    بإمكانك ان تتأكد، ارجع إلى تاريخ 28/2/1975 ستجد أنه يوم جمعة.
    لنقم بعمل مثال أخير شامل لكل هذه الخطوات:
    مثال: ماذا كان يوم 25/9/1999 ؟
    الجواب:
    يوم الحساب للقرن 1900 هو الأربعاء.
    1. نقوم بحساب يوم الحساب لسنة 1999
    99/12 = 8 والباقي 3
    3/4 = 0
    إذن: 8 + 3 + 0 = 11
    يوم الحساب لسنة 1999 هو الأربعاء + 11 يوما. وللتسهيل نطرح مضاعفات 7 الموجودة في الرقم 11 ، 11 - 7 = 4
    فيكون يوم الحساب = الأربعاء + 4 أيام = الأحد.
    2. يوم الحساب بشهر 9 هو يوم 5. أي 5/9/1999 كان يوم الأحد.
    بعد ثلاثة أسابيع أي يوم (5 + 21) 26/9 هو يوم الأحد.
    إذن يوم 25/9/1999 هو يوم السبت.
    هذه هي خوارزمية يوم الحساب (The Doomsday Algorithm) بكل تبسيط.
    ربما يبقى سؤال واحد، وهو يمكن الحصول على يوم حساب القرن بجهد أقل دون أن أحفظ يوم الحساب لكل قرن.
    الجواب: نعم ! كما كان الحال مع السنوات يمكن حساب يوم الحساب لأي قرن وذلك انطلاقا من قرن واحد







  2. #2
    Banned
    تاريخ التسجيل
    Aug 2007
    المشاركات
    371

    طريقة اخرى



    هون بحط طريقه تانيه للحساب

    1-إحسب عدد الأيام من تاريخ 01/01/0001 (و الذي كان يوم الأحد) حتى التاريخ المطلوب وليكن 10/06/2004 و لأحسب هذا العدد


    a- خود رقم السنة و إطرح منه 1 و إقسم الناتج على 4 الرقم الصحيح الناتج يمثل عدد السنوات الكبيسة عدد أيامها 366 يوماً.

    كود HTML:
    ( 2004 -1) div 4 = 500
    b - عدد السنوات غير الكبيسة يساوي 3 أضعاف العدد السابق عدد أيام كل سنة 365 يوماً.

    كود HTML:
    3* 500
    c - باقي القسمة السابقة هو إما 0 أو 1 أو 2 أو 3 و هذا الرقم يمثل عدد السنوات غير الكبيسة بين السنة الحالية و السنة الكبيسة التي تسبقها

    كود HTML:
    (2004 -1) mod 4 = 3
    هكذا فان عدد الأيام بالنسبة للسنوات هي

    كود HTML:
    500*366 + 3*500*365 + 3*365 = 500*(366 + 3*365) + 3*365 = 731595
    2- نحسب عدد الأيام من أول السنة الى الشهر السابق للشهر الحالي و هنا نميز ثلاث حالات :
    -إما أن يكون رقم الشهر هو 1,3,5,7,8,10,12 و عدد أيامه 31 يوماً
    -أو أن يكون رقم الشهر هو 4,6,9,11 و عدد أيامه 30 يوماً
    -أو أن يكون رقم الشهر هو 2 : إذا كانت السنة كبيسة فعدد أيامه 29 و اذا لم تكن كذلك فعدد أيامه
    28

    كود HTML:
    731595 + 31 + 29 + 31 + 30 + 31 = 731747
    3- نضيف رقم اليوم الحالي الى العدد السابق

    كود HTML:
    731747 + 10 = 731757
    4- لاتمام الحساب نطرح من الناتج واحد ثم نقسم على سبعة فيكون باقي القسمة رقما بين 0 و 6 يمثل رقم اليوم المطلوب.
    0 = الأحد , 1 = الاثنين , ... , 6 = السبت

    كود HTML:
    731757 - 1 = 731756 
    731756 mod 7 = 4 ==> Thursday
    وهذا التابع بلغة الباسكال بيعطي رقم اليوم المطلوب :

    كود:
    const daysname:array[0..6] of string=('Sunday','Monday','Tuseday',                                'Wednesday','Thursday','Friday','Saturday');Function CalcDay(day,month:Byte;year:Integer):Byte;Var Days:Longint;    i:Integer;Begin Days:=(year-1) div 4; Days:=Days*(366+3*365); Days:=Days+((year-1)  mod 4)*365; for i:=1 to month-1 do  case i of   1,3,5,7,8,10,12:Days:=Days+31;   4,6,9,11       :Days:=Days+30;   2              :if (year mod 4)=0 then                    Days:=Days+29                   else                    Days:=Days+28;  end; (* end Case *) Days:=Days+Day; CalcDay:=(Days-1) mod 7;End;







  3. #3
    عضو نشيط
    تاريخ التسجيل
    Aug 2007
    المشاركات
    120


    ... خوارزمية رهيبة ...

    وردك الثاني مرتب و لا عليه غبار و سهل تتبعه . أما الأول يحتاج لي شوية مراجعه ع الخفيف لاستوعبه أكثر .

    بارك الله فيك و في علمك .






  4. #4
    Banned
    تاريخ التسجيل
    Aug 2007
    المشاركات
    371


    ... خوارزمية رهيبة ...

    وردك الثاني مرتب و لا عليه غبار و سهل تتبعه . أما الأول يحتاج لي شوية مراجعه ع الخفيف لاستوعبه أكثر .

    بارك الله فيك و في علمك .
    اللهه يسلمك اخي
    الصراحه انا من جديد اتجه لعالم الخوارزميات وهو عالم جميل جدااااااا






  5. #5
    خبير JavaScript
    تاريخ التسجيل
    Jul 2002
    المشاركات
    2,920


    خوارزمية يوم الحساب، يا أخي يوم الحساب ظننته القيامة
    لم أقرأ بعد الموضوع سأعود له بعد جولة قصيرة على المنتدى






  6. #6
    Banned
    تاريخ التسجيل
    Aug 2007
    المشاركات
    371


    خوارزمية يوم الحساب، يا أخي يوم الحساب ظننته القيامة
    لم أقرأ بعد الموضوع سأعود له بعد جولة قصيرة على المنتدى
    انا كمان والله ما عجبني عنوان الخوارزميه ولكن العالم الي كتبها سماها هيك

    بس المقصود حساب الايام






  7. #7
    عضو سوبر نشيط
    تاريخ التسجيل
    Mar 2000
    المشاركات
    762


    أعجبتني الطريقه ولي عوده وتعقيب عل الطريقه





    __________________
    Eng.Fedail
    Computer and Electronics Engineer

  8. #8
    عضو سوبر نشيط
    تاريخ التسجيل
    Mar 2000
    المشاركات
    762


    أعجبتني الطريقه ولي عوده وتعقيب عل الطريقه





    __________________
    Eng.Fedail
    Computer and Electronics Engineer

  9. #9
    Banned
    تاريخ التسجيل
    Aug 2007
    المشاركات
    371


    أعجبتني الطريقه ولي عوده وتعقيب عل الطريقه

    اهلا وسهلا........... وبإنتظار تعقيبك










ضوابط المشاركة

  • لا تستطيع إضافة مواضيع جديدة
  • لا تستطيع الرد على المواضيع
  • لا تستطيع إرفاق ملفات
  • لا تستطيع تعديل مشاركاتك
  •  

أضف موقعك هنا| اخبار السيارات | حراج | شقق للايجار في الكويت | بيوت للبيع في الكويت | دليل الكويت العقاري | مقروء | شركة كشف تسربات المياه | شركة عزل اسطح بالرياض | عزل فوم بالرياض| عزل اسطح بالرياض | كشف تسربات المياة بالرياض | شركة عزل اسطح بالرياض