27 - سلسلة تبسيط البرمجة – برنامج الحلقة غير المحدودة While

السلام عليكم ورحمة الله وبركاته

بسم الله الرحمن الرحيم

لعل بعضكم تسائل منذ بداية البرامج هل يعقل أن أقوم بتنفيذ البرنامج في كل مرة ليحقق المطلوب

والجواب طبعا لا ولكن لكون الحل يكمن في الحلقات فأجلت الموضوع إلى حين شرح الحلقات غير المحدودة

في برنامجنا اليوم ستضاف ميزة للبرنامج أنه سيسأل المستخدم في حال رغبته بتكرار التنفيذ أو الخروج من البرنامج

على مبدأ Play Again

لنضع الكود أولا ثم نشرحه

Module Module1

    Sub Main()

        Dim Birthday As Date
        Dim Choice As String = "y"

        Do While Choice <> "n"
            Console.Clear()
            Console.WriteLine("Enter a birthday = ? | Note : format is dd/MM/yyyy , Example : 17/06/1982")
            Birthday = Console.ReadLine()

            Dim Age, Years, Monthes, Days As Double
            Age = DateDiff("yyyy", Birthday, Date.Now)
            Years = DateDiff("yyyy", Birthday, Date.Now)
            Monthes = DateDiff("m", Birthday, Date.Now)
            Days = DateDiff("d", Birthday, Date.Now)

            Console.WriteLine("The age is :" & Age & " Years")
            Console.WriteLine("The age in years is : " & Years)
            Console.WriteLine("The age in monthes is : " & Monthes)
            Console.WriteLine("The age in days is : " & Days)

            Console.WriteLine()

            Console.WriteLine("Tray again ? y = Yes or n = No")

            Choice = Console.ReadLine(0)

        Loop


    End Sub

End Module

نلاحظ في هذا البرنامج عدة أشياء جديدة

أولها تعريف متحول من نوع جديد وهو النوع تاريخ Date وهذا النوع من المعطيات صمم ليتم التعامل مع قيم الوقت والتاريخ بصيغها المختلفة وذلك من أجل ضبط التعامل مع قيمه وفق قواعد التاريخ والوقت من مثل انحصار الأيام بين 1 و 31 بحسب الشهر وإن كانت السنة كبيسة

أو انحصار الشهور بين 1 و 12 وهكذا

كما عرفنا المتغير Choice لنحفظ فيه اختيار المستخدم في حال الرغبة بتكرار التنفيذ أو الخروج

يأتي بعد ذلك تعريف بلوك جديد وهو بلوك حلقة تكرارية غير محددة بحيث يعتمد تكرارها على تحقق شرط يتم فحصه في بداية الحلقة

وهذا الشرط هو مقارنة قيمة المتغير Choice مع الحرف n لكي نقرر هل سندخل في الحلقة مرة أخرى أم سنخرج خارجها ونخرج من البرنامج

في البداية ولكوننا نريد الدخول لأول مرة هيئنا قيمة المتحول بالخيار y لكي يتحقق الشرط ويدخل إلى جسم الحلقة

في داخل كتلة الحلقة قمنا بسؤال المستخدم أن يدخل تاريخ ميلاد ما وفق الصيغة التي حددناه له لضمان الحصول على نتائج صحيحة

ووضعنا مثال وهو إدخال الأيام بخانتين ثم شرطة مائلة ثم الأشهر كرقمين ثم شرطة مائلة ثم السنة كأربع أرقام

بعد أن يدخل المستخدم التاريخ يتم حفظه في المتغير Birthday

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

بعد أن تحفظ قيمة التاريخ نقوم باستدعاء دالة معرفة مسبقا وهي Datediff بحيث تأخذ عدة بارمترات وتعيد لنا الفرق وفق الوحدة التي حددناها له

حيث مررنا بالبارمتر الأول الوحدة yyyy ونعني أننا نريد أن يعيد لنا الفرق بالسنين

ثم أدخلنا التاريخ الأقدم وهو التاريخ الذي أدخلناه ثم بالبارمتر الثالث أدخلنا تاريخ اليوم والذي يؤمنه خاصية تابعة للصنف Date وهي الخاصية Now حيث تحوي دائما تاريخ اللحظة الحالية

ثم نحفظ القيمة العائدة من دالة الفرق ونضعها في المتغير Age أي العمر

كما استدعينا نفس دالة الفرق ولكن مع تغيير الوحدة فمرة سنوات ومرة أشهر ومرة أيام

وحفظناها في متحولات ثم عرضنا الجميع على الشاشة

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

فإن أدخل الحرف n أي أنه لا يرغب بالإعادة فإنه سينتقل التنفيذ إلى الأعلى كتلة الحلقة ويتم التحقق من الشرط ولكونه غير محقق فسيقفز إلى ما بعد Loop خارجا من كتلة الحلقة ومن ثم الخروج من البرنامج

أما في حال إدخال الرمز y أو أي رمز آخر فسيكون شرط الحلقة متحقق ويدخل مرة أخرى لجسم الحلقة ويمسح الشاشة وينفذ من جديد

وهكذا

الواجب :

البرنامج يخرج في حال تم إدخال الحرف n وما عداه سيبقى يعيد التنفيذ

نريد أن نعكس الأمر أي نجعله يعيد فقط في حال إدخال الرمز y وما عداه يخرج في حال إدخال أي رمز آخر

دمتم سالمين