بانر

الدرس الرابع لتعليم لغة السى بلس بلس c++

الدرس الرابع يتحدث عن بعض الجمل الهامة جداً في لغة الـ 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 , حتى وان لم يوجد هذا التعبير .

الدرس الخامس