عدد الأيام بالأشهر. كيف تحسب عدد الأيام فيه باستخدام صيغة رياضية واحدة بناءً على رقم الشهر؟ الوحدة النمطية: mod و ⌊⌋

لحل بعض المشاكل عند إنشاء جدول، تحتاج إلى الإشارة إلى عدد الأيام في الشهر في خلية منفصلة أو داخل صيغة حتى يتمكن البرنامج من إجراء الحسابات اللازمة. يحتوي Excel على أدوات مصممة لتنفيذ هذه العملية. دعونا نلقي نظرة على طرق مختلفة لاستخدام هذه الميزة.

يمكنك حساب عدد أيام الشهر في Excel باستخدام عوامل تشغيل الفئات الخاصة "التاريخ و الوقت". لمعرفة الخيار الأفضل للاستخدام، عليك أولاً تحديد أهداف العملية. بناءً على ذلك، يمكن عرض نتيجة الحساب في عنصر منفصل على الورقة، أو يمكن استخدامها داخل صيغة أخرى.

الطريقة الأولى: الجمع بين عوامل التشغيل DAY وMONTH

إن أبسط طريقة لحل هذه المشكلة هي الجمع بين العوامل يومو EON-MONTH.

وظيفة يومينتمي إلى مجموعة المشغلين "التاريخ و الوقت". يشير إلى رقم محدد من 1 قبل 31 . في حالتنا، ستكون مهمة هذا العامل هي الإشارة إلى اليوم الأخير من الشهر باستخدام الوظيفة المضمنة كوسيطة EON-MONTH.

بناء جملة المشغل يومالتالي:

DAY(date_in_numeric_format)

وهذا يعني أن الوسيطة الوحيدة لهذه الوظيفة هي "التاريخ بالتنسيق الرقمي". سيتم ضبطه من قبل المشغل EON-MONTH. ويجب القول أن التاريخ بالتنسيق الرقمي يختلف عن التنسيق المعتاد. على سبيل المثال، التاريخ 04.05.2017 في شكل رقمي سوف تبدو 42859 . ولذلك، يستخدم Excel هذا التنسيق فقط للعمليات الداخلية. ونادرا ما يستخدم للعرض في الخلايا

المشغل أو العامل EON-MONTHوالمقصود منه هو الإشارة إلى الرقم التسلسلي لليوم الأخير من الشهر، وهو عدد محدد من الأشهر للأمام أو للخلف من التاريخ المحدد. بناء جملة الدالة هو:

EON-MONTH(start_date;number_of_months)

المشغل أو العامل "تاريخ البدء"يحتوي على التاريخ الذي تم حسابه منه، أو رابط للخلية التي يقع فيها.

المشغل أو العامل "عدد الأشهر"يشير إلى عدد الأشهر التي يتم حسابها من تاريخ معين.

الآن دعونا نرى كيف يعمل هذا مع مثال محدد. للقيام بذلك، خذ ورقة Excel، في إحدى الخلايا التي تم إدخال تاريخ تقويم معين فيها. من الضروري، باستخدام مجموعة العوامل المذكورة أعلاه، تحديد عدد الأيام الموجودة في الفترة الشهرية التي يشير إليها هذا الرقم.


أخذت صيغتنا العامة الشكل التالي:

يوم(شهر(ب3,0))

في هذه الصيغة، القيمة المتغيرة الوحيدة هي عنوان الخلية ( ب3). وبالتالي، إذا كنت لا ترغب في تنفيذ الإجراء عبر معالجات الوظائف، يمكنك إدراج هذه الصيغة في أي عنصر من عناصر الورقة بمجرد استبدال عنوان الخلية التي تحتوي على الرقم بالعنوان المناسب لحالتك الخاصة. وستكون النتيجة مماثلة.

الطريقة الثانية: اكتشاف عدد الأيام تلقائيًا

الآن دعونا ننظر إلى مشكلة أخرى. من الضروري ألا يتم عرض عدد الأيام وفقًا لتاريخ تقويمي معين، بل وفقًا للتاريخ الحالي. بالإضافة إلى ذلك، سيتم تغيير الفترات تلقائيًا دون تدخل المستخدم. ورغم أن الأمر يبدو غريبا، إلا أن هذه المهمة أسهل من المهمة السابقة. لحلها، حتى مفتوحة معالج الوظائفليست ضرورية لأن الصيغة التي تنفذ هذه العملية لا تحتوي على قيم متغيرة أو مراجع خلايا. يمكنك ببساطة إدخال الصيغة التالية دون إجراء تغييرات في خلية الورقة حيث تريد عرض النتيجة:

يوم(شهر(اليوم(),0))

تعرض وظيفة TODAY المضمنة التي استخدمناها في هذه الحالة تاريخ اليوم ولا تحتوي على أي وسائط. وبالتالي، ستعرض خليتك باستمرار عدد الأيام في الشهر الحالي.

الطريقة الثالثة: حساب عدد الأيام المراد استخدامها في الصيغ المعقدة

في الأمثلة أعلاه، أظهرنا كيفية حساب عدد الأيام في الشهر بناءً على تاريخ تقويمي محدد أو تلقائيًا بناءً على الشهر الحالي، مع عرض النتيجة في خلية منفصلة. ولكن قد تكون هناك حاجة أيضًا إلى إيجاد هذه القيمة لحساب مؤشرات أخرى. في هذه الحالة، سيتم حساب عدد الأيام داخل صيغة معقدة ولن يتم عرضها في خلية منفصلة. دعونا نرى كيفية القيام بذلك مع مثال.

نحتاج إلى التأكد من أن الخلية تعرض عدد الأيام المتبقية حتى نهاية الشهر الحالي. كما في الطريقة السابقة، لا يتطلب هذا الخيار فتحه معالجات الوظائف. يمكنك ببساطة إدخال التعبير التالي في الخلية:

DAY(MONTH(TODAY(),0))-DAY(TODAY())

بعد ذلك سيتم عرض عدد الأيام حتى نهاية الشهر في الخلية المحددة. كل يوم سيتم تحديث النتيجة تلقائيا، ومن بداية الفترة الجديدة سيبدأ العد التنازلي من جديد. اتضح أنه نوع من مؤقت العد التنازلي.

كما ترون، تتكون هذه الصيغة من جزأين. الأول هو تعبير مألوف بالفعل لحساب عدد الأيام في الشهر:

يوم(شهر(اليوم(),0))

لكن في الجزء الثاني يتم طرح رقم اليوم من هذا المؤشر:

يوما بعد يوم أو من يوم إلى آخر())

وبالتالي، عند إجراء هذا الحساب، تكون صيغة حساب عدد الأيام جزءًا من صيغة أكثر تعقيدًا.

الطريقة الرابعة: الصيغة البديلة

ولكن، لسوء الحظ، إصدارات البرنامج الأقدم من Excel 2007 لا تحتوي على المشغل EON-MONTH. ماذا عن هؤلاء المستخدمين الذين يستخدمون الإصدارات الأقدم من التطبيق؟ بالنسبة لهم، هذا الاحتمال موجود من خلال صيغة أخرى، وهي أكبر من تلك المذكورة أعلاه. دعونا نرى كيفية حساب عدد أيام الشهر بناءً على تاريخ تقويم معين باستخدام هذا الخيار.

  1. حدد الخلية لعرض النتيجة وانتقل إلى نافذة وسيطات المشغل يومبطريقة مألوفة لنا بالفعل. ضع المؤشر في الحقل الوحيد لهذه النافذة وانقر على المثلث المقلوب الموجود على يسار شريط الصيغة. اذهب إلى القسم "وظائف أخرى...".
  2. فى الشباك معالجات الوظائففي مجموعة "التاريخ و الوقت"تسليط الضوء على الاسم "تاريخ"واضغط على الزر "نعم".
  3. تفتح نافذة المشغل تاريخ. تقوم هذه الوظيفة بتحويل التاريخ من التنسيق المعتاد إلى قيمة رقمية، والتي يجب على عامل التشغيل معالجتها بعد ذلك يوم.

    تحتوي النافذة التي تفتح على ثلاثة حقول. في الميدان "يوم"يمكنك إدخال الرقم على الفور "1". سيكون هذا هو نفس الإجراء في أي موقف. لكن المجالين الآخرين سيتعين التعامل معهما بدقة.

    ضع المؤشر في الحقل "سنة". بعد ذلك، ننتقل إلى اختيار العوامل من خلال المثلث المألوف.

  4. الكل في نفس الفئة معالجات الوظائفتسليط الضوء على الاسم "سنة"وانقر على الزر "نعم".
  5. يتم فتح نافذة وسيطات عامل التشغيل سنة. ويحدد السنة بناء على الرقم المحدد. في حقل النافذة الواحدة "التاريخ بالتنسيق الرقمي"نشير إلى رابط للخلية التي تحتوي على التاريخ الأصلي الذي تحتاج إلى تحديد عدد الأيام له. وبعد ذلك، لا تتسرع في النقر على الزر "نعم"، وانقر على الاسم "تاريخ"في شريط الصيغة.
  6. ثم نعود إلى نافذة الحجج مرة أخرى تاريخ. ضع المؤشر في الحقل "شهر"وانتقل إلى اختيار الوظائف.
  7. في معالج الوظائفانقر على الاسم "شهر"واضغط على الزر "نعم".
  8. يتم فتح نافذة وسيطات الوظيفة شهر. مهامه مشابهة للمشغل السابق، فقط يعرض قيمة رقم الشهر. في الحقل الوحيد لهذه النافذة قمنا بتعيين نفس الرابط للرقم الأصلي. ثم في شريط الصيغة، انقر فوق الاسم "يوم".
  9. العودة إلى نافذة الحجج يوم. هنا يتعين علينا القيام بلمسة واحدة صغيرة فقط. في الحقل الوحيد للنافذة الذي يحتوي بالفعل على بيانات، قم بإضافة التعبير إلى نهاية الصيغة "-1"بدون علامات الاقتباس، وقم أيضًا بوضع "+1" بعد عامل التشغيل شهر. بعد هذا اضغط على الزر "نعم".
  10. كما ترون، تعرض الخلية المحددة مسبقًا عدد أيام الشهر الذي ينتمي إليه التاريخ المحدد. تبدو الصيغة العامة كما يلي:

    اليوم(التاريخ(السنة(D3)،الشهر(D3)+1,1)-1)

سر هذه الصيغة بسيط. نستخدمها لتحديد تاريخ اليوم الأول من الدورة التالية، ثم نطرح منه يوم واحد، فنحصل على عدد أيام الشهر المحدد. المتغير في هذه الصيغة هو مرجع الخلية د3في مكانين. إذا قمت باستبداله بعنوان الخلية التي يوجد بها التاريخ في حالتك الخاصة، فيمكنك ببساطة إدخال هذا التعبير في أي عنصر من عناصر الورقة دون أي مساعدة معالجات الوظائف.

كما ترون، هناك عدة خيارات لمعرفة عدد الأيام في الشهر في إكسيل. يعتمد اختيار البرنامج الذي يجب استخدامه على الهدف النهائي للمستخدم، وكذلك على إصدار البرنامج الذي يستخدمه.

تم تصميم حاسبة التاريخ لحساب عدد الأيام بين التواريخ، وكذلك للعثور على تاريخ عن طريق إضافة أو طرح عدد معين من الأيام إلى تاريخ معروف.

إضافة أيام حتى الآن

لمعرفة التاريخ الذي سيكون بعد عدد معين من الأيام، استخدم هذا الخيار. أدخل تاريخ البدء وعدد الأيام المراد إضافتها إليه. للطرح، استخدم قيمة ناقص. تحتوي الآلة الحاسبة أيضًا على خيار لإضافة أيام العمل فقط.

حساب عدد الأيام بين التواريخ

ستجيب طريقة الحساب هذه على السؤال "كم عدد الأيام التي مرت منذ التاريخ". أدخل تاريخ البدء وتاريخ الانتهاء وانقر على زر "احسب". سوف تظهر الآلة الحاسبة عدد الأيام بين التواريخ التي تم إدخالها. بشكل منفصل، سوف تظهر الآلة الحاسبة عدد أيام العمل.

باستخدام هذا الخيار، يمكنك حساب عدد الأيام المتبقية حتى حدث معين، على سبيل المثال، عيد ميلاد أو عطلة. للقيام بذلك، أدخل تاريخ اليوم في حقل تاريخ البدء، وتاريخ الحدث في حقل تاريخ الانتهاء.

العطل

يمكن للآلة الحاسبة حساب وإضافة وطرح أيام التقويم وأيام العمل. العطلات الرسمية غير الرسمية هي:

  • 1،2،3،4،5،6،8 يناير - عطلة رأس السنة
  • 7 يناير - عيد الميلاد الأرثوذكسي
  • 23 فبراير - يوم المدافع عن الوطن
  • 8 مارس - يوم المرأة العالمي
  • 1 مايو - عيد الربيع وعيد العمال
  • 9 مايو - يوم النصر
  • 12 يونيو - يوم روسيا
  • 4 نوفمبر - يوم الوحدة الوطنية

إذا وقعت العطلة يوم السبت أو الأحد، يتم نقلها إلى يوم العمل التالي. لكن في بعض الأحيان يتم نقل عطلة نهاية الأسبوع إلى مكان مختلف تمامًا في التقويم. على سبيل المثال، قد يتم نقل يومي السبت والأحد اللذين يقعان في عطلات رأس السنة الجديدة إلى شهر مايو من أجل تمديد عطلات شهر مايو.

عند حساب الأيام، تأخذ الآلة الحاسبة في الاعتبار تواريخ العطلات الرسمية وجميع التحويلات.

ملحوظة: هذه التدوينة هي ترجمة للمقال cmcenroe.me/2014/12/05/days-in-month-formula.html ( الجزء الأول)، وكذلك إضافة المؤلف إليه ( الجزء الثاني). ولا ينبغي أن تؤخذ هذه المادة على محمل الجد، بل باعتبارها تمرينًا عقليًا لا يتطلب أكثر من مجرد معرفة بالحساب على مستوى المدرسة وليس له تطبيق عملي. قراءة سعيدة للجميع!

الجزء الأول

مقدمة

مؤخرًا، وبعد ليلة أخرى من الأرق، كنت أفكر في طرق لتذكر عدد الأيام في كل شهر من شهور السنة. هناك قافية عد لهذا، بالإضافة إلى طريقة الاعتماد على مفاصل أصابعك، لكن لا أحد ولا الآخر يناسبني. تساءلت عما إذا كان من الممكن أن يكون هناك نوع من الصيغة الرياضية لحل مثل هذه المشكلة، ولم أجد واحدة خلال دراسة سريعة، تحديت نفسي لإنشائها.

إضفاء الطابع الرسمي بمعنى آخر، من الضروري العثور على الوظيفة F، بحيث تكون القيمة و (خ)لكل شهر س، ويمثلها رقم من 1 إلى 12، يساوي عدد الأيام في ذلك الشهر. جدول الوسيطات وقيم الوظائف:

س 1 2 3 4 5 6 7 8 9 10 11 12
و (خ) 31 28 31 30 31 30 31 31 30 31 30 31

إذا كنت تميل إلى تجربة ذلك بنفسك قبل قراءة الحل الخاص بي، فهذا هو الوقت المناسب. إذا كنت تفضل رؤية الإجابة الجاهزة على الفور، فابحث أسفل المفسد.

إجابة


فيما يلي خطواتي لإيجاد حل.

الأجهزة الرياضية

أولاً، دعونا ننعش ذاكرتنا بإيجاز بشأن عاملين مهمين في حل هذه المشكلة: قسمة عدد صحيح وباقي عملية القسمة.

تقسيم صحيحهذا عامل يستخدم في العديد من لغات البرمجة لتقسيم عددين صحيحين وإزالة الجزء الكسري من حاصل القسمة. سوف أصورها على أنها. على سبيل المثال:

باقي القسمةهذا هو العامل الذي يجد باقي القسمة. العديد من لغات البرمجة تستخدم الرمز % ، سأستخدم إنشاءات مثل، على سبيل المثال:

لاحظ أن باقي القسمة لها أولوية متساوية مع القسمة.

الأساسيات

لذلك، دعونا نستخدم أجهزتنا الرياضية للحصول على الصيغة الأساسية. يحتوي الشهر العادي على 30 أو 31 يومًا، لذلك يمكننا التبديل بين 1 و0 ثم إضافة ثابت إلى هذا الرقم:

نحصل على جدول بالقيم الصحيحة المميزة بالخط العريض:
س 1 2 3 4 5 6 7 8 9 10 11 12
و (خ) 31 30 31 30 31 30 31 30 31 30 31 30

ليست بداية سيئة! توجد بالفعل قيم صحيحة لشهر يناير وللأشهر من مارس إلى يوليو ضمناً. فبراير حالة خاصة وسنتعامل معها بعد قليل. بعد شهر يوليو، بالنسبة للأشهر المتبقية، يجب عكس ترتيب الاستلام 0 و1.
للقيام بذلك، يمكننا إضافة 1 إلى المقسوم:

س 1 2 3 4 5 6 7 8 9 10 11 12
و (خ) 30 31 30 31 30 31 30 31 30 31 30 31

القيم الخاصة بالأشهر من أغسطس إلى ديسمبر أصبحت الآن صحيحة، ولكن كما هو متوقع فإن قيم الأشهر الأخرى غير صحيحة. دعونا نرى كيف يمكننا الجمع بين هذه الصيغ.

تراكب القناع

يتطلب هذا دالة متعددة التعريف، ولكن - بما أن هذا بدا مملاً بالنسبة لي - فكرت في حل آخر، باستخدام جزء واحد من الدالة في فترة زمنية واحدة، والآخر في فترة أخرى.
أعتقد أن أسهل طريقة هي العثور على تعبير يساوي 1 في منطقة تطبيق واحدة و0 في الباقي. الطريقة التي من خلالها، عن طريق ضرب وسيطة بتعبير، نستبعدها من الصيغة خارج نطاقها، أسميتها "فرض القناع"، لأن هذا السلوك يشبه نوعًا من قناع البت.
لاستخدام هذه الطريقة، نحتاج في الجزء الأخير من وظيفتنا إلى العثور على تعبير يساوي 1 عندما، و- نظرًا لأن قيم الوسيطة دائمًا أقل من 16 - فإن قسمة الأعداد الصحيحة على 8 تعمل بشكل جيد لهذا الغرض.
س 1 2 3 4 5 6 7 8 9 10 11 12
س ⁄ 8 ⌋ 0 0 0 0 0 0 0 1 1 1 1 1

الآن، باستخدام هذا القناع، باستخدام تعبير بدلاً من 1 في المقسوم، يمكننا عكس ترتيب الحصول على 0 و1 في الصيغة:

س 1 2 3 4 5 6 7 8 9 10 11 12
و (خ) 31 30 31 30 31 30 31 31 30 31 30 31

يوريكا! كل شيء على ما يرام، باستثناء فبراير. يا للمفاجئة.

شهر فبراير

يتكون أي شهر من 30 أو 31 يومًا، باستثناء شهر فبراير الذي يحتوي على 28 يومًا (السنوات الكبيسة تقع خارج نطاق هذه المهمة). حاليًا، وفقًا لصيغتنا، يبلغ عدد الأيام 30 يومًا، لذا سيكون من الجيد طرح التعبير الذي يساوي 2 عند .
أفضل ما يمكنني التوصل إليه هو هذا، الذي يطبق القناع على جميع الأشهر بعد فبراير:
س 1 2 3 4 5 6 7 8 9 10 11 12
2 وزارة الدفاع س 0 0 2 2 2 2 2 2 2 2 2 2

وبتغيير الثابت الأساسي إلى 28 وإضافة 2 إلى الأشهر المتبقية، نحصل على الصيغة:

س 1 2 3 4 5 6 7 8 9 10 11 12
و (خ) 29 28 31 30 31 30 31 31 30 31 30 31

لسوء الحظ، شهر يناير الآن أقصر بيومين. لكن لحسن الحظ، من السهل جدًا الحصول على عبارة تنطبق فقط على الشهر الأول: وهو معكوس الرقم المقرب للأسفل. بضربه في 2 نحصل على الصيغة النهائية:

س 1 2 3 4 5 6 7 8 9 10 11 12
و (خ) 31 28 31 30 31 30 31 31 30 31 30 31

خاتمة

ها هي - صيغة للحصول على عدد الأيام في أي شهر من السنة باستخدام عملية حسابية بسيطة. في المرة القادمة التي تتساءل فيها عن عدد أيام شهر سبتمبر، ما عليك سوى استخدام وظيفة JavaScript المكونة من سطر واحد:

الدالة f(x) ( العودة 28 + (x + Math.floor(x/8)) % 2 + 2 % x + 2 * Math.floor(1/x); )

الجزء الثاني

مقدمة

في الجزء الأول، تم الحصول على صيغة قصيرة وحتى أنيقة بعض الشيء، والمزايا الرئيسية منها هي بساطة الجهاز الرياضي، وغياب الفروع والتعبيرات الشرطية، والإيجاز. وتشمل العيوب - إلى جانب حقيقة أنك لن تستخدمها في مشروعك - عدم التحقق من السنوات الكبيسة وغير الكبيسة.
لذلك حددت لنفسي مهمة إنشاء وظيفة F، بحيث تكون القيمة و (س، ص)لكل شهر سويمثلها رقم من 1 إلى 12 والسنة ذ، أكبر من 0، يساوي عدد أيام الشهر سكل سنة ذ.
لمن نفد صبره، هناك إجابة جاهزة تحت المفسد، أما بالنسبة للباقي، أطلب منكم متابعتي.

إجابة

باقي القسمة : عصريو ⌊⌋

من أجل الوضوح البصري، دعونا نتفق على أنه في بعض الصيغ يتم استبدال عامل القسمة مع الباقي بأقواس سفلية، حيث بدا ذلك ضروريًا بالنسبة لي:

سنة كبيسة

خلال السنة الكبيسة، يتم تقديم يوم تقويمي إضافي: 29 فبراير. كما تعلمون السنة الكبيسة هي سنة تقبل القسمة على 4 وليست قابلة للقسمة على 100 أو القسمة على 400. فلنكتب التعبير المطابق لهذه العبارة:

لتحويل هذا التعبير إلى تعبير جبري، من الضروري تطبيق حقنة من النموذج على نتيجة التعبير:

والذي سيسمح لك بالحصول على 1 عند القسمة بدون باق و0 عند القسمة بباقي، وذلك لاستخدامه في صيغة تحديد عدد أيام الشهر.

كوظيفة ز"يمكنك استخدام 1 ناقص باقي القسمة من أجل:

س 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
ز"(خ) ما لا نهاية 1 0 0 0 0 0 0 0 0 0 0 0 0 0

من السهل أن نرى أنه من خلال زيادة المقسوم والمقسوم على 1 نحصل على الصيغة الصحيحة لـ:
س 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
ز"(خ) 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0

وهكذا نكتب التعبير بالشكل:


ودعونا نكتب التعبير على النحو التالي:

باستخدام هذا النهج نحصل على الوظيفة التالية ز (ص)، والتي ستكون قيمتها 1 إذا كانت السنة سنة كبيسة، أو 0 بخلاف ذلك:

ذ 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000
ز (ص) 0 0 1 0 0 0 1 0 0 0 1
ذ 2000 2100 2200 2300 2400 2500 2600 2700 2800 2900 3000
ز (ص) 1 0 0 0 1 0 0 0 1 0 0

تظهر السنوات الكبيسة بالخط العريض.

اسمحوا لي أن أذكركم أنه، في إطار الاتفاقية المقبولة، يمكن تصوير عامل الحصول على ما تبقى من القسمة على أنه عصري، و ⌊⌋.

تراكب القناع

في الصيغة، الجزء عبارة عن تعديل يضيف يومين إلى شهر يناير. إذا قمنا بإزالة العامل 2 واستبدلنا 1 بـ 2 في البسط، فستضيف هذه الصيغة يومين إلى يناير ويومًا واحدًا إلى فبراير، مما يمنحنا المفتاح لإضافة يوم في السنة الكبيسة. من أجل الوضوح، نستخدم قيمة متوسطة في الصيغة ز (ص)و كما ذنستخدم 2000 (كبيسة) و 2001 (غير كبيسة):

س 1 2 3 4 5 6 7 8 9 10 11 12
و(خ، 2000) 31 29 31 30 31 30 31 31 30 31 30 31
و(خ، 2001) 30 28 31 30 31 30 31 31 30 31 30 30

القيم لجميع الأشهر باستثناء شهر يناير للسنوات غير الكبيسة صحيحة.

لتصحيح سوء الفهم المزعج هذا، دعونا نضيف يومًا واحدًا إلى شهر يناير باستخدام الصيغة المعروفة لدينا بالفعل:


أو:

س 1 2 3 4 5 6 7 8 9 10 11 12
و(خ، 2000) 31 29 31 30 31 30 31 31 30 31 30 31
و(خ، 2001) 31 28 31 30 31 30 31 31 30 31 30 30

خاتمة

ونتيجة لذلك، تم الحصول على صيغة أكثر تعقيدًا ولكنها أكثر عالمية، والتي يمكن استخدامها أيضًا للحصول على عدد الأيام في شهر من سنة معينة:

الدالة f(x, y) ( العودة 28 + ((x + Math.floor(x / 8)) % 2) + 2 % x + Math.floor((1 + (1 - (y % 4 + 2) %) (ص % 4 + 1)) * ((ص % 100 + 2) % (ص % 100 + 1)) + (1 - (ص % 400 + 2) % (ص % 400 + 1))) / س) + Math.floor(1/x) - Math.floor(((1 - (y % 4 + 2) % (y % 4 + 1)) * ((y % 100 + 2) % (y % 100 + 1) )) + (1 - (ص % 400 + 2) % (ص % 400 + 1)))/x )
مثال في C# ideone.com/fANutz.

1 . لا أعرف كيفية استخدام أساليب الإستذكار هذه، لذلك نظرت إلى اللافتة الموجودة على الإنترنت.
2 . "الأساسيات" أو "القاعدة مع العديد من الاستثناءات"، مثل معظم القواعد.
3 . في الأصل، في التقويم الروماني، كان شهر فبراير هو الشهر الأخير من العام، لذلك فمن المنطقي أنه أقصر من جميع الأشهر الأخرى. وهناك أيضًا منطق في إضافة أو إزالة يوم في نهاية العام، فيكون طوله متغيرًا.

تحديث. 1:
الترجمة البديلة للجزء الأول في

ستساعدك الآلة الحاسبة المجانية عبر الإنترنت Kontur.Accounting وتخبرك بعدد الأيام التي مرت بين تاريخين محددين. بالإضافة إلى ذلك، إذا كانت لديك حاجة، يمكنك حساب عدد التقويمات أو عطلات نهاية الأسبوع أو أيام العمل (ساعات) التي تحتوي على فترة محددة من سنة أو عدة سنوات.

كم يوما بين التواريخ؟ تعليمات

ما عليك سوى تعيين يوم بداية ونهاية محددين والحصول على عرض أسعار في جزء من الثانية. تقوم الآلة الحاسبة عبر الإنترنت بحساب جميع البيانات بشكل مستقل. إذا قمت بتغيير أيام الأسبوع الأصلية، فسيتم إعادة حساب النتيجة تلقائيًا لتأخذ في الاعتبار السنوات الكبيسة.

هام: لا يمكنك أخذ أيام/ساعات العمل الشهرية من حسابات العام الماضي وتقديمها كحسابات - ستختلف البيانات. ولذلك فمن الأفضل استخدام الآلة الحاسبة.

إذن الإجراء هو:

  1. في حقلي "تاريخ البدء" و"تاريخ الانتهاء"، حدد يوم بدء العد التنازلي وانتهاءه، على التوالي، بدءًا من عام 2013 وينتهي في المستقبل في عام 2018.
  2. قم بتعيين عدد ساعات العمل يوميًا في الحقل التالي. افتراضيًا، يتم تعيين هذا الحقل بالفعل على 8 ساعات (40 ساعة عمل في الأسبوع)، ولكن يمكنك تغيير هذا الرقم.
  3. على الجانب الأيمن من الشاشة في اللافتة سترى النتيجة: أيام العمل وأيام التقويم وساعات العمل بين التواريخ المحددة. يجب نسخ النتائج وحفظها في المستند الخاص بك.

ماذا يمكنك استخدام الآلة الحاسبة؟

  1. احتساب الغرامات والتأخيرات بموجب العقود
  2. كيفية فهم كفاءة استخدام المورد والمواعيد النهائية للاستخدام
  3. كيفية تجنب جدولة المهام عن طريق الخطأ في عطلة نهاية الأسبوع
  4. كم من الوقت المتبقي حتى الموعد النهائي

مثال:

أنت محاسب. لقد طلب منك المدير خلال الدقائق القليلة القادمة تقديم بيانات حول عدد ساعات العمل التي يجب أن يعملها جميع موظفي الشركة في شهر فبراير. يمكنك بسهولة تحديد عدد الموظفين - فالأرقام أمام عينيك. ولكن يجب حساب عدد الساعات.... كم عدد أيام شهر فبراير؟ هل هي سنة كبيسة؟ ما هي الأيام التي كانت عطلات نهاية الأسبوع؟ كيفية تحديد عدد أيام العطلات؟

الحل: مجرد استخدام القطعة لدينا. ستتلقى جميع المعلومات تلقائيًا، ولن تحتاج إلى تقويمات سطح المكتب أو الآلات الحاسبة.

هل أعجبتك هذه الآلة الحاسبة؟ ثم جرب خياراتنا الأخرى

هل تريد القيام بالمحاسبة وإرسال التقارير وإجراء الحسابات في خدمة ويب مريحة وبسيطة؟ جرب Kontur.Accounting مجانًا لمدة 14 يومًا! سنعلمك بسرعة كيفية استخدام الخدمة والإجابة على جميع أسئلتك!

ملحوظة: هذه التدوينة هي ترجمة للمقال cmcenroe.me/2014/12/05/days-in-month-formula.html ( الجزء الأول)، وكذلك إضافة المؤلف إليه ( الجزء الثاني). ولا ينبغي أن تؤخذ هذه المادة على محمل الجد، بل باعتبارها تمرينًا عقليًا لا يتطلب أكثر من مجرد معرفة بالحساب على مستوى المدرسة وليس له تطبيق عملي. قراءة سعيدة للجميع!

الجزء الأول

مقدمة

مؤخرًا، وبعد ليلة أخرى من الأرق، كنت أفكر في طرق لتذكر عدد الأيام في كل شهر من شهور السنة. هناك قافية عد لهذا، بالإضافة إلى طريقة الاعتماد على مفاصل أصابعك، لكن لا أحد ولا الآخر يناسبني. تساءلت عما إذا كان من الممكن أن يكون هناك نوع من الصيغة الرياضية لحل مثل هذه المشكلة، ولم أجد واحدة خلال دراسة سريعة، تحديت نفسي لإنشائها.

إضفاء الطابع الرسمي بمعنى آخر، من الضروري العثور على الوظيفة F، بحيث تكون القيمة و (خ)لكل شهر س، ويمثلها رقم من 1 إلى 12، يساوي عدد الأيام في ذلك الشهر. جدول الوسيطات وقيم الوظائف:

س 1 2 3 4 5 6 7 8 9 10 11 12
و (خ) 31 28 31 30 31 30 31 31 30 31 30 31

إذا كنت تميل إلى تجربة ذلك بنفسك قبل قراءة الحل الخاص بي، فهذا هو الوقت المناسب. إذا كنت تفضل رؤية الإجابة الجاهزة على الفور، فابحث أسفل المفسد.

إجابة


فيما يلي خطواتي لإيجاد حل.

الأجهزة الرياضية

أولاً، دعونا ننعش ذاكرتنا بإيجاز بشأن عاملين مهمين في حل هذه المشكلة: قسمة عدد صحيح وباقي عملية القسمة.

تقسيم صحيحهذا عامل يستخدم في العديد من لغات البرمجة لتقسيم عددين صحيحين وإزالة الجزء الكسري من حاصل القسمة. سوف أصورها على أنها. على سبيل المثال:

باقي القسمةهذا هو العامل الذي يجد باقي القسمة. العديد من لغات البرمجة تستخدم الرمز % ، سأستخدم إنشاءات مثل، على سبيل المثال:

لاحظ أن باقي القسمة لها أولوية متساوية مع القسمة.

الأساسيات

لذلك، دعونا نستخدم أجهزتنا الرياضية للحصول على الصيغة الأساسية. يحتوي الشهر العادي على 30 أو 31 يومًا، لذلك يمكننا التبديل بين 1 و0 ثم إضافة ثابت إلى هذا الرقم:

نحصل على جدول بالقيم الصحيحة المميزة بالخط العريض:
س 1 2 3 4 5 6 7 8 9 10 11 12
و (خ) 31 30 31 30 31 30 31 30 31 30 31 30

ليست بداية سيئة! توجد بالفعل قيم صحيحة لشهر يناير وللأشهر من مارس إلى يوليو ضمناً. فبراير حالة خاصة وسنتعامل معها بعد قليل. بعد شهر يوليو، بالنسبة للأشهر المتبقية، يجب عكس ترتيب الاستلام 0 و1.
للقيام بذلك، يمكننا إضافة 1 إلى المقسوم:

س 1 2 3 4 5 6 7 8 9 10 11 12
و (خ) 30 31 30 31 30 31 30 31 30 31 30 31

القيم الخاصة بالأشهر من أغسطس إلى ديسمبر أصبحت الآن صحيحة، ولكن كما هو متوقع فإن قيم الأشهر الأخرى غير صحيحة. دعونا نرى كيف يمكننا الجمع بين هذه الصيغ.

تراكب القناع

يتطلب هذا دالة متعددة التعريف، ولكن - بما أن هذا بدا مملاً بالنسبة لي - فكرت في حل آخر، باستخدام جزء واحد من الدالة في فترة زمنية واحدة، والآخر في فترة أخرى.
أعتقد أن أسهل طريقة هي العثور على تعبير يساوي 1 في منطقة تطبيق واحدة و0 في الباقي. الطريقة التي من خلالها، عن طريق ضرب وسيطة بتعبير، نستبعدها من الصيغة خارج نطاقها، أسميتها "فرض القناع"، لأن هذا السلوك يشبه نوعًا من قناع البت.
لاستخدام هذه الطريقة، نحتاج في الجزء الأخير من وظيفتنا إلى العثور على تعبير يساوي 1 عندما، و- نظرًا لأن قيم الوسيطة دائمًا أقل من 16 - فإن قسمة الأعداد الصحيحة على 8 تعمل بشكل جيد لهذا الغرض.
س 1 2 3 4 5 6 7 8 9 10 11 12
س ⁄ 8 ⌋ 0 0 0 0 0 0 0 1 1 1 1 1

الآن، باستخدام هذا القناع، باستخدام تعبير بدلاً من 1 في المقسوم، يمكننا عكس ترتيب الحصول على 0 و1 في الصيغة:

س 1 2 3 4 5 6 7 8 9 10 11 12
و (خ) 31 30 31 30 31 30 31 31 30 31 30 31

يوريكا! كل شيء على ما يرام، باستثناء فبراير. يا للمفاجئة.

شهر فبراير

يتكون أي شهر من 30 أو 31 يومًا، باستثناء شهر فبراير الذي يحتوي على 28 يومًا (السنوات الكبيسة تقع خارج نطاق هذه المهمة). حاليًا، وفقًا لصيغتنا، يبلغ عدد الأيام 30 يومًا، لذا سيكون من الجيد طرح التعبير الذي يساوي 2 عند .
أفضل ما يمكنني التوصل إليه هو هذا، الذي يطبق القناع على جميع الأشهر بعد فبراير:
س 1 2 3 4 5 6 7 8 9 10 11 12
2 وزارة الدفاع س 0 0 2 2 2 2 2 2 2 2 2 2

وبتغيير الثابت الأساسي إلى 28 وإضافة 2 إلى الأشهر المتبقية، نحصل على الصيغة:

س 1 2 3 4 5 6 7 8 9 10 11 12
و (خ) 29 28 31 30 31 30 31 31 30 31 30 31

لسوء الحظ، شهر يناير الآن أقصر بيومين. لكن لحسن الحظ، من السهل جدًا الحصول على عبارة تنطبق فقط على الشهر الأول: وهو معكوس الرقم المقرب للأسفل. بضربه في 2 نحصل على الصيغة النهائية:

س 1 2 3 4 5 6 7 8 9 10 11 12
و (خ) 31 28 31 30 31 30 31 31 30 31 30 31

خاتمة

ها هي - صيغة للحصول على عدد الأيام في أي شهر من السنة باستخدام عملية حسابية بسيطة. في المرة القادمة التي تتساءل فيها عن عدد أيام شهر سبتمبر، ما عليك سوى استخدام وظيفة JavaScript المكونة من سطر واحد:

الدالة f(x) ( العودة 28 + (x + Math.floor(x/8)) % 2 + 2 % x + 2 * Math.floor(1/x); )

الجزء الثاني

مقدمة

في الجزء الأول، تم الحصول على صيغة قصيرة وحتى أنيقة بعض الشيء، والمزايا الرئيسية منها هي بساطة الجهاز الرياضي، وغياب الفروع والتعبيرات الشرطية، والإيجاز. وتشمل العيوب - إلى جانب حقيقة أنك لن تستخدمها في مشروعك - عدم التحقق من السنوات الكبيسة وغير الكبيسة.
لذلك حددت لنفسي مهمة إنشاء وظيفة F، بحيث تكون القيمة و (س، ص)لكل شهر سويمثلها رقم من 1 إلى 12 والسنة ذ، أكبر من 0، يساوي عدد أيام الشهر سكل سنة ذ.
لمن نفد صبره، هناك إجابة جاهزة تحت المفسد، أما بالنسبة للباقي، أطلب منكم متابعتي.

إجابة

باقي القسمة : عصريو ⌊⌋

من أجل الوضوح البصري، دعونا نتفق على أنه في بعض الصيغ يتم استبدال عامل القسمة مع الباقي بأقواس سفلية، حيث بدا ذلك ضروريًا بالنسبة لي:

سنة كبيسة

خلال السنة الكبيسة، يتم تقديم يوم تقويمي إضافي: 29 فبراير. كما تعلمون السنة الكبيسة هي سنة تقبل القسمة على 4 وليست قابلة للقسمة على 100 أو القسمة على 400. فلنكتب التعبير المطابق لهذه العبارة:

لتحويل هذا التعبير إلى تعبير جبري، من الضروري تطبيق حقنة من النموذج على نتيجة التعبير:

والذي سيسمح لك بالحصول على 1 عند القسمة بدون باق و0 عند القسمة بباقي، وذلك لاستخدامه في صيغة تحديد عدد أيام الشهر.

كوظيفة ز"يمكنك استخدام 1 ناقص باقي القسمة من أجل:

س 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
ز"(خ) ما لا نهاية 1 0 0 0 0 0 0 0 0 0 0 0 0 0

من السهل أن نرى أنه من خلال زيادة المقسوم والمقسوم على 1 نحصل على الصيغة الصحيحة لـ:
س 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
ز"(خ) 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0

وهكذا نكتب التعبير بالشكل:


ودعونا نكتب التعبير على النحو التالي:

باستخدام هذا النهج نحصل على الوظيفة التالية ز (ص)، والتي ستكون قيمتها 1 إذا كانت السنة سنة كبيسة، أو 0 بخلاف ذلك:

ذ 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000
ز (ص) 0 0 1 0 0 0 1 0 0 0 1
ذ 2000 2100 2200 2300 2400 2500 2600 2700 2800 2900 3000
ز (ص) 1 0 0 0 1 0 0 0 1 0 0

تظهر السنوات الكبيسة بالخط العريض.

اسمحوا لي أن أذكركم أنه، في إطار الاتفاقية المقبولة، يمكن تصوير عامل الحصول على ما تبقى من القسمة على أنه عصري، و ⌊⌋.

تراكب القناع

في الصيغة، الجزء عبارة عن تعديل يضيف يومين إلى شهر يناير. إذا قمنا بإزالة العامل 2 واستبدلنا 1 بـ 2 في البسط، فستضيف هذه الصيغة يومين إلى يناير ويومًا واحدًا إلى فبراير، مما يمنحنا المفتاح لإضافة يوم في السنة الكبيسة. من أجل الوضوح، نستخدم قيمة متوسطة في الصيغة ز (ص)و كما ذنستخدم 2000 (كبيسة) و 2001 (غير كبيسة):

س 1 2 3 4 5 6 7 8 9 10 11 12
و(خ، 2000) 31 29 31 30 31 30 31 31 30 31 30 31
و(خ، 2001) 30 28 31 30 31 30 31 31 30 31 30 30

القيم لجميع الأشهر باستثناء شهر يناير للسنوات غير الكبيسة صحيحة.

لتصحيح سوء الفهم المزعج هذا، دعونا نضيف يومًا واحدًا إلى شهر يناير باستخدام الصيغة المعروفة لدينا بالفعل:


أو:

س 1 2 3 4 5 6 7 8 9 10 11 12
و(خ، 2000) 31 29 31 30 31 30 31 31 30 31 30 31
و(خ، 2001) 31 28 31 30 31 30 31 31 30 31 30 30

خاتمة

ونتيجة لذلك، تم الحصول على صيغة أكثر تعقيدًا ولكنها أكثر عالمية، والتي يمكن استخدامها أيضًا للحصول على عدد الأيام في شهر من سنة معينة:

الدالة f(x, y) ( العودة 28 + ((x + Math.floor(x / 8)) % 2) + 2 % x + Math.floor((1 + (1 - (y % 4 + 2) %) (ص % 4 + 1)) * ((ص % 100 + 2) % (ص % 100 + 1)) + (1 - (ص % 400 + 2) % (ص % 400 + 1))) / س) + Math.floor(1/x) - Math.floor(((1 - (y % 4 + 2) % (y % 4 + 1)) * ((y % 100 + 2) % (y % 100 + 1) )) + (1 - (ص % 400 + 2) % (ص % 400 + 1)))/x )
مثال في C# ideone.com/fANutz.

1 . لا أعرف كيفية استخدام أساليب الإستذكار هذه، لذلك نظرت إلى اللافتة الموجودة على الإنترنت.
2 . "الأساسيات" أو "القاعدة مع العديد من الاستثناءات"، مثل معظم القواعد.
3 . في الأصل، في التقويم الروماني، كان شهر فبراير هو الشهر الأخير من العام، لذلك فمن المنطقي أنه أقصر من جميع الأشهر الأخرى. وهناك أيضًا منطق في إضافة أو إزالة يوم في نهاية العام، فيكون طوله متغيرًا.

تحديث. 1:
الترجمة البديلة للجزء الأول في