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 وما عداه يخرج في حال إدخال أي رمز آخر
دمتم سالمين
التعليقات