الدرس الرابع يتحدث عن بعض الجمل الهامة جداً في لغة الـ C ونستطيع تسميتها بجمل الاختيار والتبديل , وهيا شائعة الاستخدام في الكثير من البرامج , ومتشابهة من حيث الفكرة في كل لغات البرمجة , لما لها من أهمية في هذه اللغات .
سنقوم في بادئ الأمر بعرض هذه الجمل , ثم نتحدث عن كل جملة مع التوضيح بمثال إن شاء الله .
والآن نقوم بشرح أول جملة .
الشكل العام لهذه الجملة :
كود:
statement;
next statement;
نشرح الآن الشكل العام :
يتكون الشكل العام لهذه الجملة من الصيغة الرئيسية المتمثلة في if , والذي يعني إذا , وبعد ذلك كلمة نقوم بفتح قوس وإغلاق قوس , ومحتوى القوسين يكون شرط التنفيذ Condition , وهذا الشرط هوا الذي تتوقف عليه تنفيذ الجملة Statement إذا ما كان الشرط صحيح , أو ينتقل إلى الجملة Next statement إذا ما كان الشرط غير صحيح .
وحتى تضح لكم الرؤية , نقوم بتنفيذ برنامج بسيط يحتوي على هذه الجملة الجديدة , وظيفة هذا البرنامج هوا قراءة أي عدد تدخله أنت إليه , ثم يقوم باختبار هذه العدد ما إذا كان أكبر من الصفر أو أقل منه عن طريق جملة if , ثم يطبع رسالة في حالة أن العدد موجب تقول أن هذا العدد موجب , وتجاهل طبع هذه الرسالة في حالة كون العدد سالب أو يساوي صفر .
[l]The Program : [/l]
كود:
#include <stdio.h>
#include <conio.h>
main()
{
int number;
clrscr();
printf(“\n Enter the number : “);
scanf(“%d”,&number);
if ( number > 0 )
printf(“The %d is positive number “,number);
getch();
return 0;
والآن نقوم بشرح البرنامج :
بعد أن قمنا بتعريف مكتبتين في السطر الأول والثاني نقوم بتعريف المتغير number في السطر الخامس , ثم نقوم بمسح شاشة الإخراج لمسح أي مخرجات قديمة عن طريق clrscr() في السطر السادس , ثم يقوم البرنامج بطبع رسالة معنى مضمونها هوا أدخل الرقم Enter the number , وبعد ذلك يقوم البرنامج باستقبال الرقم من لوحة المفاتيح وتخزينه في ذاكرة البرنامج , وبعد ذلك يقوم البرنامج باختبار هذا الرقم عن طريق جملة if , وذلك كما رأينا في البرنامج بمقارنة هذا الرقم مع الصفر مقارنة منطقية , فإذا كان الرقم أكبر من صفر يقوم البرنامج بطباعة رسالة إخراج معناها أن الرقم موجب , وإذا كان الرقم صفر أو أقل من الصفر يتجاهل طبع هذه الرسالة وينتقل إلى الجملة التالية والتي هيا جملة إيقاف الشاشة حتى ترى النتائج getch() , وبعد ذلك يصل إلى نهاية البرنامج .
[color=red ملاحظة : [/color] أرجو أن تقوموا بإدخال عدد موجب , وعدد سالب , وصفر حتى تتأكدوا بأنفسكم من صحة البرنامج وطريقة عمله , وتستوعبون فكرته .
قد يقوم البرنامج بتنفيذ أكثر من جملة في حالة صحة الشرط , وتتمل هذه العملية بوضع هذه الجمل بين قوسين { , وقوس } , وهوا ما يعرف في لغات البرمجة بالـ Block , أو الحصر .
الشكل العام في هذه الحالة :
كود:
{
statement 1;
statement 2;
:
:
statement n;
}
ويمكن رؤية ذلك بعد تعديل البرنامج السابق بعض الشيء :
[l]The Program : [/l]
كود:
#include <stdio.h>
#include <conio.h>
main()
{
int number;
clrscr();
printf(“\n Enter the number : “);
scanf(“%d”,&number);
if ( number > 0 )
{
printf(“The number is bigger than zero ( %d > 0 )”,number);
printf(“The %d is positive number”,number);
}
getch();
return 0;
والآن ننتقل إلى جملة جديدة .
الشكل العام :
كود:
statement 1;
else
statement 2;
هذه الجملة لا تختلف كثيرا عن السابقة , لذا لن نكرر ما شرحنا عن الجزء الأول من هذه الجملة عن معنى if .
وسنشرح الجزء المختص بـ else , والذي هوا جديد علينا , ولكنه بسيط .
المقصود بكلمة else في هذه الجملة هوا حالة عكس الشرط , فمثلا يقوم البرنامج باختبار شرط معين , وفي حالة صحة هذا الشرط يقوم بتنفيذ جملة التالية للشرط مباشرة , وفي حالة خطأ الشرط يقوم بتنفيذ الجملة التالية لكلمة else .
برنامج توضيحي لعمل هذه الجملة :
[l]The Program : [/l]
كود:
#include<stdio.h>
#include<conio.h>
main()
{
int n;
clrscr();
printf("Enter the number :");
scanf("%d",&n);
if ( n>0 )
printf("The %d is positive number",n);
else
printf("The %d is negative number",n);
getch();
return 0;
}
البرنامج السابق يقوم بنفس خطوات البرنامج الأول , ولكن عند وصوله في الجملة الشرطية يقوم بالتأكد من صحة الشرط , فإذا ما كان الشرط صحيح يقوم بطبع الرسالة أن العدد موجب Positive number , وإذا كان الشرط خطأ يتجاهل جملة الطباعة ويوجه إلى كلمة else , ويقوم بتنفيذ جملتها , والتي هيا في هذا البرنامج طباعة رسالة negative number .
3 ) جملة إذا المتداخلة Nested if statement :
الشكل العام :
كود:
{
statement 1;
statement 2;
}
else
if ( condition 2 )
{
statement 3;
statement 4;
}
كما رأينا من الشكل العام لهذه الجملة أنه لا فرق بينها وبين جملة if – else statement , ولكنها تحتوي على الكثير من الشروط , ونستعمل هذه الجملة في حالة وجود عدد من الشروط التي تحتاج للكثير من جمل if وتكون مرتبطة ببعض .
وكمثال على ذلك نقوم بتنفيذ نفس البرنامج السابق ولكن بإضافة طباعة رسالة تفيد أن العدد يساوي صفر في حالة كون مساوي للصفر .
[l]The Program : [/l]
كود:
#include <stdio.h>
#include <conio.h>
main()
{
int number;
clrscr();
printf(“\n Enter the number : “);
scanf(“%d”,&number);
if ( number > 0 )
printf(“The %d is positive number “,number);
else
if ( number <0 )
printf("The %d is negative number",n);
else
printf(“The %d is Zero”,n);
getch();
return 0;
وهذا البرنامج لا يختلف في شرحه عن البرامج السابقة إلا في أشياء بسيطة من الناحية الشرطية .
إذ أن البرنامج يقوم بالتحقق واختبار ما إذا كان العدد أكبر من صفر , في حالة صحة هذا الشرط يطبع رسالة تفيد بأن العدد هوا عدد موجب positive number , ويخرج من الجملة الشرطية دون المرور على باقي جمل else , وذلك لكونه صواباً من الأول .
وفي حالة كون الشرط الأول خطأ يتوجه إلى جملة else , ويقوم بالتحقق من الشرط الثاني , فإذا كان العدد أصغر من الصفر يقوم بطبع رسالة negative number , ويخرج من الجملة الشرطية دون المرور على else وذلك لكون الشرط صحيح .
أما إذا كانت كل الشروط السابقة خطأ يمر على الشرط الأخير والذي يفيد بأن العد هوا صفر Zero ويقوم بطاعة رسالة تفيد بأن العديد هوا صفر Zero , وذلك لعدم تحقق الشرطين الأولين .
والآن ننتقل إلى جملة التبديل , والتي هيا آخر مواضيعنا لهذا الدرس إن شاء الله .
الشكل العام :
كود:
{
case constant 1 : statement ;
break ;
case constant 2 : statement ;
break ;
default : statement ;
break;
}
تحل هذه الجملة بدل جملة if في الحالات التي تكثر وتتنوع فيها قيم المتغير , قد نقوم بعملية حسابية لمتغير من نوع صحيح , ويكون ناتج هذه العملية هوا قيمة جديدة للمتغير يتوقف عليها عدد من العمليات , لذا بدل استعمال جملة if في كل قيمة للمتغير , نستعمل جملة switch , وتقوم هذه الجملة بتبديل التعبير المعطى expression بالقيمة لهذا التعبير أو هذا المتغير والمتمثلة في الثوابت الجديدة constant , حيث أنه من الممكن أن يكون هنالك أكثر من ثابت , لذا قمنا بترقيمها , وعند تماثل قيمة المتغير مع قيمة الثابت يقوم بتنفيذ الجملة المقابلة لجملة الثابتة , والتي تتوقف عليها طريقة التعامل مع المتغير .
ووظيفة جملة break; هيا تنبيه المعالج إلى انتهاء معالجة هذا الجزء من المتغير , والانتقال إلى باقي البرنامج .
ووظيفة جملة default هيا أنها في حالة عدم تطابق التعبير ( المتغير ) مع أي من الثوابت المعطية في البرنامج constants , يقوم بالدخول على جملة default , ومعالجة المتغير في هذه الجملة .
والآن حتى تضح طريقة عمل هذه الجملة سنعمل على تطبيقها في برنامج يقوم بقراءة متغير x من النوع الصحيح , وإيجاد قيم المعادلات الآتية عندما تكون قيمة x كالتالي :
[l]
x= -6 >>>-------> y = ( x*x ) – x .
x= 1 or 5 >>>-------> y = ( x*10 ) / 2 .
x=2 >>>-------> y = x + x .
x=4 or -4 >>>-------> y = x*x .
x= أي قيمة أخرى غير السابق >>>-------> y = x + 11 .
[/l]
[l]The Program : [/l]
كود:
#include <stdio.h>
#include <conio.h>
void main()
{
int x,y;
clrscr();
printf("\n Enter Value Of X = ");
scanf("%d",&x);
switch (x)
{
case -6: y=(x*x)-x ;
printf("X=%d and (x*x)-x=%d",x,y);
break;
case 1: case 5:y=(x*10)/2 ;
printf("X=%d and (X*10)/2=%d",x,y);
break;
case 2: y=x+x;
printf("X=%d and X+X=%d",x,y);
break;
case -4:
case 4: y=x*x;
printf("X=%d and X*X=%d",x,y);
break;
default: y=x+11;
printf("X=%d and X+11=%d",x,y);
break;
}
getch();
}
شرح البرنامج :
يقوم البرنامج في بادئ الأمر بقراءة قيمة x التي يتم إدخالها من قبل المبرمج , وبعد ذلك يقوم بتخزينها , ثم معالجتها في جملة switch , حيث يقارن قيمة x المدخلة بالقيمة الثابتة , وفي حالة تساوي قيمة x المدخلة مع أحد الثوابت , يقوم بتنفيذ الجملة المقابلة لهذا الثابت , وحساب العملية الحسابية , وطباعة رسالة بناتج هذه العملية .
في حالة عدم تساوي قيمة x مع أي من هذه الثوابت , يقوم بتنفيذ الجملة المقابلة لـ default , وحساب المعادلة الرياضية وطباعة الرسالة المعطاة .
ولكن قد يسألك أحدكم سؤال مهم , وهوا : ماذا يحدث إذا لم نكتب جملة break; في أحد جمل البرنامج ؟
كما سبق وشرحنا جملة break تحدد نهاية جملة case المخصصة لها , وفي حالة عدم كتابتها سيستمر البرنامج في تنفيذ كل الجملة حتى تقابله جملة break أخرى , أو يتفذ كل جمل البرنامج في حالة عدم وجود break نهايئاً . 3 ) جملة إذا المتداخلة Nested if statement . 1 ) جملة إذا if statement : if ( Condition ) if ( condition ) 2 ) جملة if – else statement ( لا تختلف كثيراً عن الجملة السابقة ) : if ( condition 1 ) switch ( expression ) 1 ) جملة إذا if statement . if ( condition ) 4 ) جملة التبديل Switch statement : 2 ) جملة if – else statement ( لا تختلف كثيراً عن الجملة السابقة ) . 4 ) جملة التبديل Switch statement .
نستعرض ثلاث أنواع من جمل التكرار , وهيا كالتالي .
1 ) جملة ( while statement ) .
2 ) جملة ( do … while statement ) .
3 ) جملة ( for statement ) .
نبدأ باسم الله في عرض أول الجمل وطريقة استعمالها :
جملة ( while statement ) :
الشكل العام للجملة :
كود:
while ( condition )
{
statement 1;
statement 2;
:
:
statement n;
}
والآن نشرح معنى هذا الكلام :
نلاحظ من بداية الشكل العام أن الجملة تبدأ بتنفيذ التعبير while , والذي يعني : عندما .
وتقول بالتحقق من الشرط Condition , فإذا وجد المعالج أن الشرط صحيح يقوم بتنفيذ باقي الجمل statements , وإذا وجد أن الشرط خطأ لا يقوم بتنفيذ باقي الجمل , ولا يمر على الجمل أصلاً في حالة الشرط الخطأ .
وحتى نعرف كيفية استخدام هذا الشرط وطريقة قيام المعالج بتنفيذه نقوم ببرمجة هذا البرنامج البسيط والذي يقوم بطباعة الأعداد من 1 ..... إلى 10 .
[l]The Program : [/l]
كود:
#include <stdio.h>
#include <conio.h>
void main()
{
clrscr();
int n=1;
while ( n<=10 )
{
printf(“n = %d \n “,n);
++n;
}
getch() ;
}
والآن نشرح هذا البرنامج وطريقة قيام معالج اللغة بمعالجته :
يقوم المعالج في بادئ الأمر بتعريف المتغير الصحيح n , ويحجز له مساحة في الذاكرة , ويساوي قيمته بالعدد 1 .
ثم يقوم المعالج بالمرور على الجملة التالية , وهيا جملة while , ويقوم بالتحقق من الشرط , ولكن كيف ؟
يتم ذلك بأن يستعرض قيمة المتغير n , ويتحقق إذا كانت تساوي أو أقل من القيمة المعطاة في الشرط ( 10 ) وعندما يجد أن 1 أقل من عشرة يقوم بتنفيذ جمل الشرط , ويطبع قيمة n على الشاشة , ثم يقوم بتغيير قيمة n في الذاكرة , ويضع بدلها القيمة الجديدة الناتجة من الجملة ++n , والتي تعني زيادة العدد n مقداراً واحداً .
ويكرر البرنامج جملة التكرار while مرة أخرى , ويتحقق من الشرط , ويجد أن العدد 2 أقل من 10 , فيقوم بطباعة القيمة الجديدة لـ n على الشاشة , وزيادة القيمة الأولى عدداً صحيحاً واحداً .
وهكذا حتى يصل للعدد 10 , وهنا سيجد أن العدد n يساوي العدد 10 , ويقوم بطباعته كما سبق وذكرنا , ولكن عندما يزيد العدد n مقداراً واحداً , ستصبح قيمته 11 , وعند مقارنة هذه القيمة بالشرط سيجد أنها أكبر من الشرط ولا تساويه , لذا سيخرج المعالج من جملة التكرار , وسيتجه للجملة التالية لهذه الجملة , والتي هيا جملة getch() , والتي سبق وذكرنا فائدتها , ثم يتوجه إلى نهاية البرنامج .
هذه إخواني الأعزاء , أخواتي العزيزات جملة while باختصار وإيضاح .
2 ) جملة ( do … while statement ) :
الشكل العام :
كود:
do
{
statement 1;
statement 2;
:
:
statement n;
} while ( condition ) ;
من المؤكد أنكم قد لاحظتم تشابه هذه الجملة مع جملة while السابقة , وهيا فعلا تتشابه معها تشابهاً جذرياً من حيث الأداء والشرط , ولكن تختلف عنها بعض الشيء , وهذا الاختلاف هوا كالتالي :
قد لا يمر المعالج على جملة while أبداً , وذلك في حالة عدم صحة الشرط من الأول .
بينما يمر المعالج على جملة do … while على الأقل مرة واحدة , حتى إذا كان الشرط غير صحيح .
كما أن جملة do … while تبدأ بتنفيذ جملة واحدة , أو عدة جمل , ويتم التحقق من هذه الجمل عند نهاية هذه الجملة , عن طريق الشرط .
وحتى تتضح الرؤية سنقوم بحل البرنامج السابق هذه المرة بجملة do while , حتى نستوعب الفرق الذي سيتضح في الشرط :
[l]The Program :[/l]
كود:
#include <stdio.h>
#include <conio.h>
void main()
{
clrscr();
int n=1;
do
{
printf(“n = %d \n “,n);
++n;
} while ( n <= 10 ) ;
getch() ;
}
شرح البرنامج :
يقوم البرنامج بنفس الخطوات السابقة في البرنامج السابق حتى يصل إلى do , وهنا يقوم مباشرة بتنفيذ الجملة التالية لـ do دون التقيد بالشرط , لأن الشرط موجود في نهاية الجملة , وعند وصوله لنهاية الجملة يقوم بالتحقق من الشرط , فإذا وجد أن الشرط محقق , يكرر الجمل مرة أخرى , وإذا بطل الشرط , يخرج من جملة do … while نهايئاً , ويتجه إلى الجملة التالية .
أرجو أن أكون قد أوضحت الفكرة العامة للجملتين السابقتين , وإذا لم تتضح سأوضحها بإذن الله في أمثلة قادمة إن شاء الله .
3 ) جملة ( for statement ) :
وتعتبر من أهم جمل التحكم , وتستعمل لتكرار مجموعة من الجملة , وهذا التكرار يكون معلوم مقداره , بمعنى أن يتم تكرار الجمل مرة واحدة , أو مرتين , أو أكثر على حسب رغبة المبرمج , لذا تعتبر جملة تكرار , وفي نفس الوقت جملة تحكم , لقدرة المبرمج على التحكم في مقدار التكرار .
الشكل العام :
كود:
for ( expression 1; expression 2; expression 3 )
{
statement 1;
statement 2;
:
:
statement n;
}
والآن نشرح هذه الجملة البسيطة المهمة :
يقوم المعالج عند معالجة جملة for بالتعرف على التعبير الأول expression 1 , ثم يقوم بمقارنته بالشرط في التعبير الثاني expression 2 , ثم يقوم عملية حسابية في التعبير الثالث expression 3 , ونلاحظ أنه يمكن الاستغناء عن التعبير الثالث , وكتابته كجملة ملحقة بجملة for , أي تحت جملة for , وسنشرح هذا في المثال التالي :
نقوم ببرمجة برنامج لطباعة الأعداد من 1 إلى 10 ( نفس البرنامج السابق ) ولكن بجملة for :
[l]The Program :[/l]
كود:
#include <stdio.h>
#include <conio.h>
void main()
{
clrscr();
int n;
for (n=1;n<=10;n++)
{
printf(“n = %d \n “,n);
}
getch() ;
}
والآن نشرح البرنامج السابق :
يقوم هذا البرنامج بنفس وظيفة البرامج السابقة في هذا الدرس , أي طباعة الأعداد من 1 إلى 10 .
ولكن كيف يقوم المعالج بمعالجة جملة for ؟
يقوم المعالج بذلك كالتالي : عندما يصل جملة for , يقوم في بادئ الأمر بالتأكد من expression 1 , والتأكد من وجود تعريف للمتغير ووجود قيمة له , وبعد ذلك يقوم باختباره بالشرط في expression 2 , وإذا ما كان الشرط صحيح ينفذ باقي الجمل , وعند نهاية الحلقة يقوم بتنفيذ expression 3 , ثم يعيد التكرار مرة أخرى .
سؤال هل يمكن تجاهل كتابة قيمة المتغير expression 1 في جملة for ؟
نعم يمكن تجاهل ذلك في البرنامج , ولكن بشرط أن يكون المتغير معرف بقيمة معطاة في أول البرنامج , ونستطيع التأكد من ذلك بتكرار البرنامج السابق ولكن بعد إجراء التعديل السابق .
[l]The Program :[/l]
كود:
#include <stdio.h>
#include <conio.h>
void main()
{
clrscr();
int n=1;
for (;n<=10;n++)
{
printf(“n = %d \n “,n);
}
getch() ;
}
نلاحظ في البرنامج السابق عدم كتابتنا للتعبير expression 1 , والذي كان فيما قبل n=1 , وقد استعضنا عن ذلك بوضع قيمة n في بداية البرنامج عند تعريفها int n=1 , ولكن نلاحظ أننا قد وضعنا الرمز ; الذي يدل على نهاية التعبير expression 1 , حتى وان لم يوجد هذا التعبير .
الدرس الخامس