أساسيات البرمجة بلغة السي شارب · الفصل 4 — أوامر الشرط (بُنى التحكم)פקודות תנאי (מבני בקרה) · יסודות התכנות בשפת C#‎⌂📚🏠
الفصل 4

أوامر الشرط (بُنى التحكم)

פקודות תנאי (מבני בקרה)

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

أوامر الشرط (بُنى التحكم): هي أوامر تستطيع تحديد أي مقاطع من البرنامج سيتم تنفيذها وتشغيلها إذا تحقق شرط معين أو القفز عنها وعدم تنفيذها (تجاهلها) إذا لم يتحقق الشرط.

مثال:

اكتب برنامج يستقبل سرعة السيارات التي تمر أمام كاميرا مراقبة السرعة على الشارع. على البرنامج أن يُبين السيارات المُخالفة، التي سرعتها تزيد عن 100 ويطبع الرسالة التالية: "تحذير! لقد تجاوزت السرعة المسموحة".

البدايةاستقبل سرعة السيارةوخزنها في v1هل؟v > 1002نعملااطبع على الشاشةAlert! You Pass Thelegal speed3النهاية4

حسب هذا المثال، فإن البرنامج يمكن أن ينفذ الأمر 3 ويمكن أن لا ينفذه، وذلك حسب القيمة التي نستقبلها خلال البرنامج ونُخزنها في المُتغير v والتي تعبر عن السرعة حيث انه حسب أمر التحكم (الشرط) 2 إذا كانت نتيجة الإجابة عن السؤال نعم (يتحقق الشرط) فإننا سننفذ أمر 3 بينما لو كانت نتيجة أمر التحكم (الشرط) لا (لا يتحقق الشرط) فإننا لن ننفذ الأمر 3 وسنتجاهله.

مثال 4.1
اكتب برنامج يستقبل من طالب علامته في موضوع مُعين. إذا كانت علامة الطالب أقل من 55 على البرنامج أن يطبع له كلمة Failed أما إذا كانت علامته أكبر أو تساوي 55 فالبرنامج يطبع Pass
البدايةاستقبل علامة طالبوخزنها في mark1هل؟mark<552نعملااطبع على الشاشةFailed3اطبع على الشاشةPass4النهاية5

يُمكن أن نُنفذ الأمر (3) ويُمكن أن لا نُنفذه وذلك حسب القيمة التي نستقبلها خلال عمل البرنامج والتي نأخذها من المُستخدم ونُخزنها داخل المُتغير mark.

كذلك الأمر (4) يمكن أن نُنفذه ومن المُمكن أن لا نُنفذه وذلك حسب القيمة التي نستقبلها من المُستخدم.

انتبه: هنا في هذا النوع من بُنى التحكم البرنامج يُنفذ أحد الأمرين (3) أو (4) ويستحيل أن يُنفذ البرنامج الأمرين معاً.

4.1 صيغ (حالات) بُنى التحكم – צורות מבני הבקרה

(1) الحالة الأولى (الصيغة الأولى): شرط if الأساسي (البسيط):

if (الشرط)
{
    أمر (أو أوامر) تُنفذ فقط إذا تحقق الشرط
}
تكملة البرنامج
شرط*falseلاtrueنعمأمر (أو أوامر) تُنفذفقطإذا تحقق الشرط1تكملة البرنامج2

شرح:

مثال 4.2
اكتب برنامج يستقبل عددا عشرياً ويطبع على الشاشة القيمة المُطلقة لهذا العدد.
static void Main(string[] args)
{
    double num;
    Console.Write("Insert a number: ");
    num = double.Parse(Console.ReadLine());
    if(num<0)
    {
        num = -1 * num;
    }
    Console.WriteLine("|num| = {0}",num);
}
البدايةاستقبل رقم numهل؟num<0falseلاtrueنعمnum= -1 * numاطبع numالنهاية

بعض النتائج لتشغيل البرنامج:

Microsoft Visual Studio Debug Console
Insert a number: 5
|num| = 5
Microsoft Visual Studio Debug Console
Insert a number: -9.2
|num| = 9.2

(2) الحالة الثانية (الصيغة الثانية): شرط if .. else (الشرط ونقيضه):

if ( شرط )
{
    أمر (أو أوامر) تُنفذ اذا تحقق الشرط
}
else
{
    أمر (أو أوامر) تُنفذ إذا لم يتحقق الشرط
}
تكملة البرنامج
شرط*falseلاtrueنعمأمر أو مجموعة أوامرتُنفذ اذا تحقق الشرط1أمر أو مجموعة أوامر تُنفذإذا لم يتحقق الشرط2تكملة البرنامج3

اذا تحقق الشرط * فإن البرنامج يُنفذ مجموعة الأوامر 1، ولكنه يقفز عن الأوامر 2 الموجودة داخل else (لا يُنفذها).

أما إذا لم يتحقق الشرط * فإن البرنامج يقفز عن مجموعة الأوامر رقم 1 (لا يُنفذها) ولكنه يُنفذ الأوامر 2 الموجودة داخل else.

يستحيل تنفيذ الأوامر 1 و 2 معاً، فإما أن يُنفذ البرنامج الأوامر رقم 1 أو الأوامر رقم 2.

الأوامر 3 تُنفذ دائما بغض النظر عن نتيجة الشرط وهي أوامر تكملة البرمجة.

مثال 4.3
استقبل رقم ليس صفراً من المُستخدم واطبع على الشاشة إذا كان هذا الرقم موجباً أم سالباً.
static void Main(string[] args)
{
  double n;
  Console.Write("Insert a non zero number: ");
  n = double.Parse(Console.ReadLine());
  if (n > 0)
  {
      Console.WriteLine("Positive");
  }
  else
  {
      Console.WriteLine("Negative");
  }
}
البدايةادخل رقم ← nهل؟n>0falseلاtrueنعماطبعموجباطبعسالبالنهاية

بعض النتائج لتشغيل البرنامج:

Microsoft Visual Studio Debug Console
Insert a non zero number: -8
Negative
Microsoft Visual Studio Debug Console
Insert a non zero number: 13.8
Positive

أهمية استعمال else:

تعلمنا سابقا أننا نستطيع كتابة أمر شرط بواسطة الصيغة الأولى البسيطة if .

نستطيع استعمال هذه الصيغة فقط، دون الحاجة الى else ولكن هناك أهمية لاستعمال else سنتعلمها بالاعتماد على المثال السابق (مثال 4.3).

في المثال السابق (مثال 4.3) استعملنا else بينما كنا نستطيع حله على النحو التالي:

(باستعمال if فقط، دون الحاجة لاستعمال else)

static void Main(string[] args)
{
 double n;
 Console.WriteLine("insert a non zero number:");
 n = double.Parse(Console.ReadLine());
 if(n>0)
     Console.WriteLine("Positive");
 if(n<0)
     Console.WriteLine("Negative");
}

وذلك سيكون بالمبنى التالي:

البدايةادخل رقم ← nهل؟n>0falseلاtrueنعماطبعموجبهل؟n<0falseلاtrueنعماطبعسالبالنهاية

في هذا البرنامج استعملنا فحصان وهما if(n>0) و if(n<0) حيث أن الحاسوب يفحص مرتان حتى لو لم يكن هناك حاجة فمثلا، إذا كان الرقم الذي استقبلناه موجباً أي يتحقق الشرط الأول ( n>0 ) وطبعنا Positive على الشاشة فانه ليس هناك حاجة أن نفحص اذا كان n<0 . ولكن بسبب وجود الأمر if(n<0) فان البرنامج سيفحص مرة ثانية إذا كان الرقم سالباً.

بينما لو وضعنا بدلا من if(n<0) الأمر else فانه اذا تحقق الشرط الأول فسيقفز مباشرة عن ما بداخل ال else دون حاجة للفحص مرة ثانية.

تلخيص لأهم الملاحظات:

1. اذا كانت الأوامر المشروطة للتنفيذ أمراً واحداً فقط داخل if عندها يمكننا الاستغناء عن الأقواس المُتعرجة { } وكذلك بالنسبة ل else .

مثال 4.4
if(n>0)
    Console.WriteLine("+");
else
    Console.WriteLine("-");
Console.WriteLine("The End");

الأمر رقم 2 هو أمر مشروط يتبع للشرط if ويتم تنفيذه فقط اذا كان n>0 .

الأمر رقم 4 هو أمر مشروط أيضا يتبع ل else ويتم تنفيذه اذا لم يتحقق الشرط n>0 .

الأمر رقم 5 هو أمر غير مشروط (تكملة البرمجة) ويتم تنفيذه بكل الأحوال.

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

3. نتذكر دائما أنه لا يجدر بنا وضع ; خلف الشرط مباشرة بدون أن يكون هناك أوامر مشروطه، أي لا يجدر بنا أن نكتب:

if ( شرط ) ;

(3) الحالة الثالثة (الصيغة الثالثة): شروط متداخلة ومتكررة (if מקוננת):

if(   ){if(   ){}else{if(   ){}}}else{if(){}}
سؤال 4.1: اكتب برنامج يستقبل رقماً عشريا ويطبع على الشاشة:
  • + إذا كان الرقم موجباً.
  • - إذا كان الرقم سالباً.
  • 0 إذا كان الرقم صفراً.

الحل:

static void Main(string[] args)
{
    double num;
    Console.Write("Insert a number: ");
    num = double.Parse(Console.ReadLine());
    if(num>0)
        Console.WriteLine("+");
    else if (num<0)
        Console.WriteLine("-");
    else
        Console.WriteLine("0");
}
بدايةاستقبل رقمnumهلnum>0falseلاtrueنعماطبع +هلnum<0falseلاtrueنعماطبع -اطبع 0نهاية

4.2 الشروط المُركبة – תנאים מורכבים

داخل أقواس بُنى التحكم if يظهر لدينا الشرط. هذا الشرط يتكون من مقارنة من الحالات التالية:

الشرط (مقارنة)شرحمثال وملاحظات
>إذا أكبرif (a>b) اذا كان a أكبر من b
<إذا أصغرif (a<b) اذا كان a أصغر من b
==إذا يساويif (a==b) اذا كان a يساوي b
!=إذا لا يساويif (a!=b) اذا كان a لا يساوي b
>=إذا أكبر أو يساويif (a>=b) اذا كان a أكبر أو يساوي b
<=إذا أصغر أو يساويif (a<=b) اذا كان a أصغر أو يساوي b

انتبه ان الإشارة == معناها إذا يساوي (هل يساوي؟) بينما الإشارة = معناها تعويض.

لكي نستطيع فهم موضوع الشروط المركبة علينا أن نتعلم عن نوع بيانات مهم في الشروط وهو bool

نوع البيانات bool:

مثلما تعلمنا سابقا عن أنواع البيانات int, double, char هناك نوع بيانات مهم لأوامر الشرط وهو bool الذي يستطيع أن يحتوي قيمتين فقط وهما: true (صدق) وfalse (خطأ).

متغير من نوع bool يتم الإعلان عنه بالطريقة التالية:

bool اسم_متغير ;

مثلا نريد تعريف متغير اسمه flag من النوع bool:

bool flag;

يمكن إعطاء المتغير قيمة بدائية (احدى القيم الممكنة وهي اما true او false) على النحو التالي:

bool flag=true;
bool a=false;

استقبال مُعطى من المستخدم لداخل متغير من نوع bool يتم بواسطة الأمر التالي:

اسم المتغير = bool.Parse(Console.ReadLine());

على المعطى الذي نستقبله أن يكون كلمة true أو كلمة false.

طباعة قيمة متغير اسمه a من نوع bool تتم بواسطة Console.Write كما هو مُتبع. مثلا:

Console.WriteLine("the value of a is: {0}",a);

أو بواسطة عملية دمج النصوص +:

Console.WriteLine("the value of a is: "+a);

نوع (טיפוס) الشرط هو bool وقيمته إما true (إذا تحقق الشرط) أو false (إذا لم يتحقق الشرط).

نستطيع كتابة if(true) حيث أنه بهذه الحالة دائما يتحقق الشرط.

نستطيع كتابة if(false) حيث أنه دائما لا يتحقق الشرط.

مثال 4.5
int a = 4, b = 5;
bool x;
x = a > b;
if(x)
    Console.WriteLine("A");

هنا تكون قيمة x هي false ، لذلك لن يتم طباعة شيء على الشاشة.

مثال 4.6
int a = 8, b = 5;
bool x;
x = a > b;
if(x)
    Console.WriteLine("A");

هنا ستكون قيمة x هي true ، لذلك سيتم طباعة حرف A على الشاشة.

يمكن دمج عمليات المقارنة والمنطق بواسطة العمليات المنطقية التالية:

العمليةشرح
&&وأيضا (and)
||أو (or)
!عكس منطقي (نفي) (Not)
مثال 4.7
x <= 100 && x >= 0

هذه من الممكن أن تكون علامة طالب. أي:

0 ≤ x ≤ 100
مثال 4.8
ما هي قيم a,b,c في نهاية المقطع التالي؟
bool a, b, c ;
bool x = true;
a = !x;
b = x && a;
c = b || a;
الحل:
a = false;
b = false;
c = false;

جداول العمليات البوليانية المنطقية:

نرمز للقيمة false بالحرف f بينما نرمز للقيمة true بالحرف t .

جدول && (And)
f && f = f
f && t = f
t && f = f
t && t = t
جدول || (Or)
f || f = f
f || t = t
t || f = t
t || t = t
جدول ! (Not)
!f = t
!t = f
سؤال 4.2: اكتب برنامج يستقبل رقماً صحيحاً من المُستخدم يمثل علامة الطالب وينفذ ما يلي:
  • إذا كان الرقم لا يلائم علامة الطالب (مثلاً أكبر من 100 أو سالب)، على البرنامج أن يطبع على الشاشة It`s not a mark!
  • إذا كانت علامة الطالب أكبر أو يساوي 90 يطبع Excellent.
  • إذا كانت علامة الطالب ما بين 55 و 89 يشمل الأطراف يطبع Pass.
  • إذا كانت علامة الطالب أقل من 55 يطبع Failed.

الحل:

static void Main(string[] args)
{
    int mark;
    Console.Write("Insert a mark: ");
    mark = int.Parse(Console.ReadLine());
    if(mark>100 || mark<0)
        Console.WriteLine("It`s not a mark!");
    else
    {
        if (mark >= 90)
            Console.WriteLine("Excellent.");
        else
        {
            if (mark >= 55 && mark <= 89)
                Console.WriteLine("Pass.");
            else
                Console.WriteLine("Failed.");
        }
    }
}

بعض نتائج تشغيل البرنامج لمُدخلات مُختلفة:

Microsoft Visual Studio Debug Console
Insert a mark: 55
Pass.
Microsoft Visual Studio Debug Console
Insert a mark: 90
Excellent.
Microsoft Visual Studio Debug Console
Insert a mark: 48
Failed.
Microsoft Visual Studio Debug Console
Insert a mark: -4
It`s not a mark!

4.3 جدول متابعة مع أوامر الشرط – טבלת מעקב עם פקודות תנאי

جدول المتابعة يكون مركباً من أسطر وأعمدة بالضبط كما تعلمنا سابقا، ولكننا يجب أن نضيف عموداً للشرط مع أعمدة الجدول ونملأه بقيمة تعبير الشرط (إما true او false) حينما نصل أمر الشرط وننفذه، وطبعاً نتيجة تعبير الشرط سوف تؤثر على جدول المتابعة حيث سَيَتَقَرَّر حسب قيمة تعبير الشرط أي أوامر على البرنامج ان يُنفذ وأي أوامر سيقفز عنها (لن يُنفذها).

سؤال 4.3: اكتب برنامج يستقبل عددا صحيحاً ويطبع على الشاشة إذا كان هذا العدد زوجياً أم فردياً. ثم اكتب جدول متابعة للمُدخل 207.
ترقيم أوامر البرنامج في جدول المتابعة: الأمر 1 هو int num; والأمر 13 هو القوس الأخير.
static void Main(string[] args)
{
    int num;
    Console.Write("Insert a number: ");
    num = int.Parse(Console.ReadLine());
    if(num==0)
        Console.WriteLine("Even.");
    else
    {
        if (num%2 == 0)
            Console.WriteLine("Even.");
        else
            Console.WriteLine("Odd.");
    }
}
رقم الأمرnumnum == 0num%2 ==0الشاشة
1
2Insert a number: 207
3207
4207false
6207
7207
8207false
10207
11207Odd.
12207
13207
سؤال 4.4: اكتب برنامج يستقبل 3 أرقام من المُستخدم وعلى البرنامج أن يطبع ما يلي:
  • They are equal – إذا كانت الأرقام الثلاثة متساوية.
  • Two of them are equal – إذا كان فقط رقمين منهما متساويين.
  • They are different – إذا كانت الثلاثة أرقام مُختلفة.

الحل:

static void Main(string[] args)
{
    int num1, num2, num3;
    Console.Write("Insert the first number: ");
    num1 = int.Parse(Console.ReadLine());
    Console.Write("Insert the second number: ");
    num2 = int.Parse(Console.ReadLine());
    Console.Write("Insert the third number: ");
    num3 = int.Parse(Console.ReadLine());

    if(num1==num2 && num2==num3)
        Console.WriteLine("They are equal");
    else
    {
        if (num1 == num2 || num2 == num3 || num1 == num3)
            Console.WriteLine("Two of them are equal.");
        else
            Console.WriteLine("They are different numbers");
    }
}

ننتبه هنا اننا لا نستطيع الغاء else بسهولة لان الشروط ستكون مركبة أكثر.

أيضا انظر عند أول if أننا اكتفينا بشرط مركب من حدين فقط بينهما علاقة وأيضا And وليس بثلاثة حدود أي لا حاجة لأن نكتب: num1==num2 && num2==num3 && num1==num3

بعض من نتائج تشغيل البرنامج:

Microsoft Visual Studio Debug Console
Insert the first number: 91
Insert the second number: 91
Insert the third number: 91
They are equal
Microsoft Visual Studio Debug Console
Insert the first number: -4
Insert the second number: 16
Insert the third number: 0
They are different numbers
Microsoft Visual Studio Debug Console
Insert the first number: -8
Insert the second number: 7
Insert the third number: -8
Two of them are equal.
همام عبد اللطيف وتد — جميع حقوق هذا الكتاب محفوظة للمؤلف. النسخة الإلكترونية منشورة في fahed-lab.com بإذنه، مع تصحيحات وافق عليها. للتواصل مع المؤلف: hammam4112@gmail.com