• 0
أحمد أبو عبد البر

الدرس الثالث في لغة Object pascal :الشروط

سؤال

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

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

 

الدرس الثالث الشروط

 

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

 

معظم السيارات والمصانع والغسالات الآلية وماشابهها من اﻷجهزة تعمل بمعالج صغير أو مايسمى micro controller وهي دائرة مدمجة(IC) يمكن برمجتها بواسطة الأسمبلي أو لغة سي. كذلك فإن بعض أنواع هذه المعالجات التي تعمل في مثل هذه اﻷنظمة المدمجة embedded systems مثل المعالج آرم ARM يمكن برمجتها بواسطة فري باسكال، وهي توجد في الموبايلات وبعض أجهزة كمبيوترات الإنترنت أو الألعاب وبعض الأجهزة الأخرى.

 

 

عبارة الشرط If condition

 

عبارة if الشرطية في لغة باسكال هي عبارة سهلة وواضحة

والكتابة العامة لها هي كالتالي

if <condition> then    begin       toDo;       toDO;      end    else    begin       toDo;       toDo;     end;

ويمكن أن نستغني عن begin و end إذا كان جواب الشرط جملة واحدة هكذا

if <condition> then	toDOelse	toDo;

ومعنى هذا : إن كان هذا الشرط متحققا فافعل كذا وإلا فافعل كذا

 

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

 

يا أخي ما هذا ألم تضع الفاصلة المنقوطة بعد toDo الأولى والثانية والثالثة والرابعة في العبارة الأولى ؟

 

في العبارة الأولى كان جواب الشرط هو

begin       toDo;       toDO;  end

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

 

إذا لم تفهم هذا فتجاوزه وستدركه مع مر الايام

 

 

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

 

برنامج مكيف الهواء:

 

var  Temp: Single;begin  Write('Please enter Temperature of this room :');  Readln(Temp);  if Temp > 28 then    Writeln('Please turn on air-condition')  else    Writeln('Please turn off air-condition');    Write('Press enter key to close');  Readln;end.

 

نجد أن العبارات الجديدة هي: if then else وهي تعني: إذا كانت درجة الحرارة أكبر من 28 قم بكتابة السطر الأول (Please turn on air-condition) وإذا لم يتحقق الشرط (رقم أصغر أو يساوي 28) في هذه الحالة قم بكتابة السطر الثاني (Please turn off air-condition).

 

 

يمكن كتابة شروط متتالية كما في المثال التالي:

 

 

var  Temp: Single;begin  Write('Please enter Temperature of this room :');  Readln(Temp);  if Temp > 28 then    Writeln('Please turn on air-condition')  else  if Temp < 25 then    Writeln('Please turn off air-condition')  else    Writeln('Do nothing');

 

 

قم بتنفيذ البرنامج أعلاه عدة مرات مُدخِلاً قيم تتراوح بين 20 و 30 وشاهد النتائج.

 

يمكن تعقيد البرنامج السابق ليصبح أكثر واقعية كما في المثال أدناه:

 

var  Temp: Single;  ACIsOn: Byte;begin  Write('Please enter Temperature of this room : ');  Readln(Temp);  Write('Is air condition on? if it is (On) write 1, if it is (Off) write 0 : ');  Readln(ACIsOn);  if (ACIsOn = 1) and (Temp > 28) then    Writeln('Do no thing, we still need cooling')  else  if (ACIsOn = 1) and (Temp < 25) then    Writeln('Please turn off air-condition')  else  if (ACIsOn = 0) and (Temp < 25) then    Writeln('Do nothing, it is still cold')  else  if (ACIsOn = 0) and (Temp > 28) then    Writeln('Please turn on air-condition')  else    Writeln('Please enter valid values');    Write('Press enter key to close');  Readln;end.  

 

 

نجد في المثال السابق وجود عبارة and وهي تعني إذا تحقق الشرطين الأول والثاني قم بتفيذ العبارة التالية.

 

وهذا هو تفسير البرنامج السابق:

 

  • إذا كان المكيف يعمل ودرجة الحرارة أكبر من 28 قم بكتابة: Do no thing, we still need cooling، أما إذا لم ينطبق هذا الشرط (else) فقم بالذهاب إلى الإجراء التالي:

  • إذا كان المكيف يعمل ودرجة الحرارة أقل من 25 قم بكتابة: Please turn off air-condition. أما إذا لم ينطبق الشرط فقم بالإجراء التالي:

  • إذا كان المكيف مغلق ودرجة الحرارة أقل من 25 قم بكتابة: Do nothing, it is still cold. أما إذا لم ينطبق الشرط فقم بالإجراء التالي:

  • إذا كان المكيف مغلق ودرجة الحرارة أكبر من 28 قم بكتابة: Please turn on air-condition.

    - أما إذا لم ينطبق هذا الشرط فهوي يعني أن المستخدم قام بإدخال قيمة غير الـ 0 أو 1 في المتغير ACIsOn، وفي هذه الحالة نقوم بتنبيهه بإدخال قيم صحيحة: Please enter valid values.

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

 

 

برنامج الأوزان

 

في المثال التالي يقوم المستخدم بإدخال طوله بالأمتار ووزنه بالكيلوجرام. يقوم البرنامج بحساب الوزن المثالي بناءً على طول المستخدم. ويقارن الوزن المثالي بالوزن الحالي للمستخدم، ويطبع النتائج حسباً لفرق الوزن:

 

program Weight;{$mode objfpc}{$H+}uses  {$IFDEF UNIX}{$IFDEF UseCThreads}  cthreads,  {$ENDIF}{$ENDIF}  Classes, SysUtils  { you can add units after this };var  Height: Double;  Weight: Double;  IdealWeight: Double;begin  Write('What is your height in meters (e.g. 1.8 meter) : ');  Readln(Height);  Write('What is your weight in kilos : ');  Readln(Weight);  if Height >= 1.4 then    IdealWeight:= (Height - 1) * 100  else    IdealWeight:= Height * 20;  if (Height < 0.4) or (Height > 2.5) or (Weight < 3) or   (Weight > 200) then  begin    Writeln('Invalid values');    Writeln('Please enter proper values');  end  else  if IdealWeight = Weight then    Writeln('Your wight is suitable')  else  if IdealWeight > Weight then    Writeln('You are under weight, you need more ',     Format('%.2f', [IdealWeight - Weight]), ' Kilos')  else    Writeln('You are over weight, you need to lose ',     Format('%.2f', [Weight - IdealWeight]), ' Kilos');  Write('Press enter key to close');    Readln;end.

 

 

في المثال السابق نجد عدة أشياء جديدة:

 

النوع Double: وهو مشابه للنوع Single فكلاهما عدد حقيقي، أو مايسمى بالرقم ذو الفاصلة العائمة (floating point number). والنوع Double هو رقم حقيقي ذو دقة مضاعفة، وهو يحتل مساحة ضعف النوع single حيث أن الأخير يحتل مساحة 4 بايت من الذاكرة أما الـ Double فهو يحتاج إلى 8 بايت من الذاكرة لتخزينه.

 

الشي الثاني هو إستخدامنا للكلمة Or، وهي بخلاف And ومن معناها تفيد تحقيق أحد الشروط. مثلاً إذا تحقق الشرط الأول (Height < 0.4) فإن البرنامج يقوم بتنفيذ إجراء الشرط، ولو لم يتحقق سوف يتم إختبار الشرط الثاني، فإذ تحقق تم تنفيذ إجراء الشرط، وإذا لم يتحقق الشرط الثاني تم إختبار الشرط الثالث وهكذا..

 

الشيء الثالث هو إستخدامنا لعبارتي begin و end بعد عبارة if وذلك لأن إجراء الشرط لابد أن يكون عبارة واحدة، وفي هذه الحالة إحتجنا لأن نقوم بتنفيذ عبارتين وهما:

    Writeln('Invalid values');    Writeln('Please enter proper values'); 

 

لذلك إستخدمنا begin end لتحويل العبارتين إلى كتلة واحدة أو عبارة واحدة تصلح لأن تكون إجراء الشرط:

 

  if (Height < 0.4) or (Height > 2.5) or (Weight < 3) or     (Weight > 200) then    begin      Writeln('Invalid values');      Writeln('Please enter proper values');    end

 

 

الشيء الرابع هو إستخدام الدالة Format. ولا يمكن إستخدام هذه الدالة إلا بعد إضافة الوحدة SysUtils

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

 

What is your height in meters (e.g. 1.8 meter) : 1.8

What is your weight in kilos : 60.2

You are under weight, you need more 19.80 Kilos

 

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

 

 

عبارة الشرط Case .. of

 

والعبارة العامة هي

Case <variable> of         <valeur1> : {code..}         <valeur2> : {code..}    ...End;  //End Case 

ينبغي أن يكون variable معرفا في قسم الإعلان عن المتغيرات

وينبغي أن يكون إما integer او char ولا يقبل أي قيمة أخرى

وينبغي أن يكون valeur1...من نفس نوع variable

وبالمثال يتضح المقال

مثلاً نريد إستقبال طلب للزبون في مطعم، والوجبات مرقمة في قائمة رئيسية، ونريد من الزبون إختيار رقم الطلب كما في المثال التالي:

 

 

برنامج المطعم

 

var  Meal: Byte;begin  Writeln('Welcome to Pascal Restaurant. Please select your order');  Writeln('1 - Chicken      (10 Geneh)');  Writeln('2 - Fish         (7 Geneh)');  Writeln('3 - Meat         (8 Geneh)');  Writeln('4 – Salad        (2 Geneh)');  Writeln('5 - Orange Juice (1 Geneh)');  Writeln('6 - Milk         (1 Geneh)');  Writeln;  Write('Please enter your selection: ');  Readln(Meal);  case Meal of    1: Writeln('You have ordered Chicken, ',         'this will take 15 minutes');    2: Writeln('You have ordered Fish, this will take 12 minutes');    3: Writeln('You have ordered meat, this will take 18 minutes');    4: Writeln('You have ordered Salad, this will take 5 minutes');    5: Writeln('You have ordered Orange juice, ',         'this will take 2 minutes');    6: Writeln('You have ordered Milk, this will take 1 minute');  else    Writeln('Wrong entry');  end;  Write('Press enter key to close');  Readln;end. 

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

فبالكتابة تظهر أخطاؤك ومن أخطائك تتعلم

 

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

 

 

 

برنامج المطعم بإستخدام عبارة if

 

var  Meal: Byte;begin  Writeln('Welcome to Pascal restaurant, please select your meal');  Writeln('1 - Chicken      (10 Geneh)');  Writeln('2 - Fish         (7 Geneh)');  Writeln('3 - Meat         (8 Geneh)');  Writeln('4 - Salad        (2 Geneh)');  Writeln('5 - Orange Juice (1 Geneh)');  Writeln('6 - Milk         (1 Geneh)');  Writeln;  Write('Please enter your selection: ');  Readln(Meal);  if Meal = 1 then    Writeln('You have ordered Chicken, this will take 15 minutes')  else  if Meal = 2 then    Writeln('You have ordered Fish, this will take 12 minutes')  else  if Meal = 3 then     Writeln('You have ordered meat, this will take 18 minutes')  else  if Meal = 4 then    Writeln('You have ordered Salad, this will take 5 minutes')  else  if Meal = 5 then    Writeln('You have ordered Orange juice, ',    'this will take 2 minutes')  else  if Meal = 6 then    Writeln('You have ordered Milk, this will take 1 minute')  else    Writeln('Wrong entry');  Write('Press enter key to close');  Readln;end.

 

 

 

يمكن كذلك إستخدام مدى للأرقام بعبارة case. في المثال التالي يقوم البرنامج بتقييم درجة الطالب:

 

 

 

 

 

 

 

برنامج درجة الطالب

 

var  Mark: Integer;begin  Write('Please enter student mark: ');  Readln(Mark);  Writeln;  case Mark of    0 .. 39 : Writeln('Student grade is: F');    40 .. 49: Writeln('Student grade is: E');    50 .. 59: Writeln('Student grade is: D');    60 .. 69: Writeln('Student grade is: C');    70 .. 84: Writeln('Student grade is: B');    85 .. 100: Writeln('Student grade is: A');  else    Writeln('Wrong mark');  end;  Write('Press enter key to close');  Readln;end.

 

 

نلاحظ في البرنامج السابق أننا إستخدما مدى مثل 85 .. 100 أي أن الشرط هو أن تكون الدرجة بين هاتين القيمتين.

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

 

 

برنامج لوحة المفاتيح

 

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

 

var  Key: Char;begin  Write('Please enter any English letter: ');  Readln(Key);  Writeln;  case Key of    'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p':      Writeln('This is in the second row in keyboard');    'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l':      Writeln('This is in the third row in keyboard');    'z', 'x', 'c', 'v', 'b', 'n', 'm':      Writeln('This is in the fourth row in keyboard');  else    Writeln('Unknown character');  end;  Write('Press enter key to close');  Readln;end. 

 

 

نلاحظ في المثال السابق أنا لم نستخدم المدى لكن إستخدمنا تعدد الخيارات، مثلاً إذا إخترنا العبارة الأخيرة:

 

    'z', 'x', 'c', 'v', 'b', 'n', 'm':

 

فهي تعني إذا كانت قيمة key هي z أو x أو c أو v أو b أو n أو m قم بتنفيذ إجراء الشرط.

 

يمكن كذلك المزج بين صيغة المدى وتعدد الخيارات مثل:

 

    'a' .. 'd', 'x', 'y', 'z':

 

وهي تعني إختبار الحرف إذا كان في المدى من الحرف a إلى الحرف d أو كان هو الحرف x أو y إو z قم بتنفيذ الشرط.

 

 

=================================================

الدورة منقولة من كتاب الأستاذ الفاضل معتز عبد العظيم وما تراه باللون الأخضر فمن زياداتي

تم تعديل بواسطه أحمد أبو عبد البر
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

0 إجابة على هذا السؤال .

لاتوجد إجابات على هذا السؤال حتى الآن .


  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .