كتب @ahmedeldeep:
بسم الله الرحمن الرحيم
الحمد لله رب العالمين والصلاة والسلام على أشرف المرسلين، بفضل الله وتوفيقه نقدم لكم الدرس الثالث بدورةأساسيات البرمجة بلغة السي بلس بلس ++C
بعنوان
كيفية التحكم في مسار تنفيذ البرنامج
لحل أي مشكلة هندسية او لعمل اي برنامج يجب ان علينا النظر للعديد من الحلول او المسارات وتحليل كل منهما على حد لمعرفة ان كان أي منهما سيصلنا الي النتيجة المطلوبة ولهذا كانت الحاجة لبعض العبارات والاوامر في لغة السي++ للتحكم في مسار البرنامج.
ويمكن ان نقسم عبارات أو طرق التحكم من حيث الوظيفة الي نوعين
١- عبارات الاختيار Selection Statements
تعرفنا في الدرس السابق على احدى عبارات الاختيار وهي if حيث يمكننا بناء على شرط معين تنفيذ جزء معين من البرنامج وعدم تنفيذ الجزء الاخر وهناك ايضا switch والتي تمكننا من تنفيذ مجموعة من الاوامر بناء على القيمة العددية لمتغير.
٢- عبارات التكرار Repetition Statements
وهي التي تقوم بتكرار جزء معين من البرنامج بناء على شرط معين مثل while او do…while او for وسنتعرض لهم بمزيد من الشرح والتفصيل.
تعرفنا في الدرس السابق على أمر if ويكون في الصورة الاتية
if ( iGrade >= 50 ) cout << "Passed";
إذا كانت الدرجة التي حصل عليها الطالب iGrade أكبر من او تساوي ٥٠ فسيظهر على الشاشة كلمة Passed وإذا كانت الدرجة اقل من ٥٠ لن يظهر شيء.
والان سنستخدم الامر else لإظهار Failed في حالة كانت الدرجة اقل من ٥٠ كما يلي
if ( iGrade >= 50 ) cout << "Passed"; else cout << "Failed";
او إذا أردنا استخدام الاقواس
if ( iGrade >= 50 ) { cout << "Passed"; } else { cout << "Failed"; }
هناك ايضا العلامة (
:?
) يمكن استخدامها في لغة السي++ للوصول لنفس النتيجة كما يليcout << ( iGrade >= 50 ? "Passed" : "Failed" );
فاذا كان الشرط صحيحا فستكون "Passed" هي ناتج تنفيذ هذا الامر وبناء عليه سيكون ضمن cout وستظهر على الشاشة واذا كان الشرط غير صحيح فستظهر كلمة Failed.
ويمكن ايضا الوصول لنفس الطريقة باستخدام الاتي
iGrade >= 50 ? cout << "Passed" : cout << "Failed";
عبارات if...else يمكن ان تتداخل فمثلا
if ( iGrade >= 90 ) cout << "Excellent"; else if ( iGrade >= 80 ) cout << "Very Good"; else if ( iGrade >= 70 ) cout << "Good"; else if ( iGrade >= 60 ) cout << "Passed"; else cout << "Failed";
إذا كانت الدرجة اكبر من او تساوي ٩٠ فسيظهر Excellent اما اذا كانت اقل من ٩٠ واكبر من او تساوي ٨٠ فسيظهر Very Good وهكذا
ويمكن كتابة المثال السابق على الصورة الاتية باستخدام الاقواس وسنحصل على نفس النتيجة
if ( iGrade >= 90 ) { cout << "Excellent"; } else { if ( iGrade >= 80 ) { cout << "Very Good"; } else { if ( iGrade >= 70 ) { cout << "Good"; } else { if ( iGrade >= 60 ) { cout << "Passed"; } else { cout << "Failed"; } } } }
وللتبسيط فيمكننا استخدام الامر else if وسنحصل على نفس النتيجة السابقة ولكن سيكون البرنامج أسهل في القراءة والفهم كما يلي
if ( iGrade >= 90 ) { cout << "Excellent"; } else if ( iGrade >= 80 ) { cout << "Very Good"; } else if ( iGrade >= 70 ) { cout << "Good"; } else if ( iGrade >= 60 ) { cout << "Passed"; } else { cout << "Failed"; }
ويرجى دائما الانتباه في حالة عدم استخدام الاقواس فان المجمع يضع الامر else مع الامر if السابق له مباشرة
مثلا
if ( x > 5 ) if ( y > 5 ) cout << "x and y are > 5"; else cout << "x is <= 5";
سيتم تنفيذه كما في الصورة الاتية
if ( x > 5 ) if ( y > 5 ) cout << "x and y are > 5"; else cout << "x is <= 5";
وسنحصل على "
x is <= 5
" ولكن هي في الحقيقة اكبر من 5 ولذلك ستكون النتيجة ليست كما توقعناولتصحيح هذا الخطأ يجب علينا هنا استخدام الاقواس كما يلي
if ( x > 5 ) { if ( y > 5 ) cout << "x and y are > 5"; } else cout << "x is <= 5";
يستخدم لتكرار جزء معين من البرنامج بناء على شرط محدد، طالما كان هذا الشرط صحيح فان البرنامج سيقوم بتنفيذ ما بداخل while والا فسيخرج منها.
مثلا
int iCounter = 0; while ( iCounter <= 100) iCounter = iCounter + 1;
سيقوم البرنامج بتنفيذ ما بداخل الامر while وهو الامر الاتي
iCounter = iCounter + 1;
حتى تصبح قيمة iCounter اقل من او تساوي 100
ويرجى هنا الانتباه دائما ان نقوم بتنفيذ بعض الاوامر داخل while لتقوم بالأخلال بالشرط وايقاف تنفيذ while والا ستكون بلا نهاية وقد تؤدي الي تعليق جهاز الكمبيوتر
يمكن ايضا تنفيذ الامر السابق بالصورة الاتية
iCounter += 1;
حيث سيتم اضافة 1 او اي قيمة نحددها لقيمة iCounter في كل مرة يتم تنفيذ هذا الامر، كذلك يمكن استخدامه مع الطرح والضرب والقسمة
الامر السابق يمكن استخدامه ايضا إذا اردنا الزيادة بمقدار مختلف عن الواحد مثلا
iCounter += 10;
سيتم زيادة قيمة iCounter بمقدار 10 كل مرة يتم فيها هذا الامر
وللتبسيط وفى حالة الرغبة بالزيادة او النقصان بمقدار واحد فقط يمكننا استخدام العلامات الاتية
++ --
فكما رأينا ان الامر الاتي
iCounter = iCounter + 1
سيعطي نفس النتيجة ايضا الامر الاتي
iCounter += 1
وايضا
iCounter++;
ونلاحظ اننا هنا استخدمنا العلامة الاتية ++ بعد المتغير ويمكن استخدامها ايضا قبل المتغير كما يلي
++iCounter;
والفرق بينهما انه في الحالة
++iCounter;
والتي تسمي preincrement يتم زيادة المتغير اولا بمقدار واحد ومن ثم استخدامه في الامر الجانبي، اما في الحالة postincrement
iCounter++;
فسيتم استخدام المتغير اولا في الامر الجانبي ومن ثم يتم زيادته بقدار واحد، كذلك الحال ايضا للمتغير - -
في المثال السابق لم يكن هناك امر جانبي لتنفيذه ولذلك لن يكون هناك فرق بينهم ولكن في المثال الاتي سنرى الفرق
#include <iostream> using namespace std; int main() { int iCounter = 0; // postincrement iCounter = 5; cout << iCounter << endl; // print 5 cout << iCounter++ << endl; // print 5 then postincrement cout << iCounter << endl; // print 6 cout << endl; // skip a line // preincrement iCounter = 5; // assign 5 to c cout << iCounter << endl; // print 5 cout << ++iCounter << endl; // preincrement then print 6 cout << iCounter << endl; // print 6 return 0; }
وستكون نتيجة التنفيذ كما يلي
5 5 6 5 6 6
تمرين ١
قم بعمل برنامج لحساب مضروب أي رقم يقوم المستخدم بإدخاله مباشرة، يمكن للمستخدم ادخال اكثر من رقم وفى حالة ادخال 1- سيتم انهاء البرنامج
المضروب هو حاصل ضرب العدد الحالي في نفس العدد مطروح منه واحد وهكذا حتى نصل للواحد مثلا مضروب الرقم 5
5! = 5 * 4 * 3 * 2 * 1 = 120
ومضروب الصفر او الواحد هو 1
وسيكون شكل تنفيذ البرنامج كما يلي
******************************************** * Welcome to factorial calculation program * * Enter -1 to terminate the program * ******************************************** Please enter a positive number : 6 The factorial of 6 is 720 Please enter a positive number : 5 The factorial of 5 is 120 Please enter a positive number : 1 The factorial of 1 is 1 Please enter a positive number : 0 The factorial of 0 is 1 Please enter a positive number : -5 Please enter only positive number or -1 to terminate Please enter a positive number : -1 Good Bye
تعرفنا على كيفية استخدام الامر while وهو معتمد اساسا على شرط معين في حالة كان هذا الشرط صحيح سيستمر تنفيذ ما بداخل while وسيتوقف التنفيذ عندما يصبح الشرط غير صحيح.
الامر for
سنتعرف الان على الامر for حيث يعتمد على عداد معين نعرف القيمة الاولية له ويستمر هذا العداد فى الزيادة او النقصان حتى يصل للقيمة النهائية وعندها يتوقف تنفيذ ما بداخل الامر for
مثال
#include <iostream> using namespace std; int main() { for ( int counter = 1; counter <= 10; counter++ ) { cout << counter << endl; } return 0; }
هذا البرنامج يقوم بطباعة قيمة العداد counter كل مرة يتم تنفيذ فيها ما بداخل الامر for وستكون نتيجة التنفيذ كما يلي
1 2 3 4 5 6 7 8 9 10
عند بداية تنفيذ for سيتم تعريف المتغير
counter وسيأخذ القيمة ١بعدها ستتم عملية مقارنة لتحدد ما اذا كانت القيمة الحالية للمتغير counter اقل من او تساوي ١٠
إذا كانت المقارنة صحيحة سيتم تنفيذ ما بداخل الامر for وهو الامر الاتي
cout << counter << endl;
وبعدها سيتم زيادة العداد بمقدار ١ كما في الامر الاتي
counter++
نلاحظ هنا ان مكان العلامة ++ بعد المتغير
وسيتسمر تنفيذ الامر for حتى تصبح قيمة المتغير counter أكبر من ١٠
مثال
البرنامج الاتي يقوم بجمع الارقام الزوجية من ٢ الي ٢٠
#include <iostream> using namespace std; int main() { int total = 0; for ( int number = 2; number <= 20; number += 2 ) total += number; cout << "Sum is " << total << endl; return 0; }
وتكون نتيجة التنفيذ كما يلي
Sum is 110
في هذا المثال تم تعريف المتغير number المستخدم داخل for ويحتوي هذا المتغير على القيمة الاولية وهي ٢ وكل مرة يتم تنفيذ فيها for سيتم زيادة المتغير number بمقدار ٢ حتى تصل قيمته الي ٢٠ وفى كل مرة يتم جمع القيمة الحالية للمتغير number على مجموع القيم السابقة المحفوظة في المتغير total
الامر do...while
والان سنتعرف على امر اخر من اوامر التكرر وهو do...while هذا الامر مشابه جدا للأمر while ولكن الفرق الوحيد هو مكان المقارنة
مثلا البرنامج الاتي يقوم بطباعة الارقام من ١ الي ١٠
int counter1 = 0; do { cout << counter1 << endl; counter1++; } while ( counter1 <= 10 );
كذلك ايضا البرنامج الاتي
int counter2 = 0; while (counter2 <= 10) { cout << counter2 << endl; counter2++; }
وستكون نتيجة التنفيذ لكلا البرنامجين
0 1 2 3 4 5 6 7 8 9 10
والفرق هنا ان الامر do...while يتم التحقق من الشرط بعد تنفيذ اول مرة اما في حالة while يتم التحقق من الشرط قبل التنفيذ
والان إذا قمنا بتغير قيمة المتغير
int counter1 = 11;
سنجد ان النتيجة هي 11
أي ان امر واحد هو ما تم تنفيذه وهو
do...whileوالان مع الامر switch
وهو من الاوامر الشائعة الاستخدام في معظم لغات البرمجة فمن خلاله يمكننا تحويل مسار البرنامج بناء على القيمة العددية لمتغير
مثال
#include <iostream> using namespace std; int main () { char grade; cout << "Enter your Grade A, B, C, D or F" << endl; cin >> grade; switch(grade) { case 'A' : cout << "Excellent!" << endl; case 'B' : case 'C' : cout << "Well done" << endl; break; case 'D' : cout << "You passed" << endl; break; case 'F' : cout << "Better try again" << endl; break; default : cout << "Invalid grade" << endl; } return 0; }
في هذا المثال يدخل الطالب التقدير الذي حصل عليه وبناء عليه سيظهر له رسالة محدد.
وفكرة عمل الامر switch تقوم على مقارنة قيمة المتغير ببعض القيم المعرفة سابقا في case فمثلا اذا ادخل المستخدم الحرف A فسيتم تنفيذ السطر الاتي
cout << "Excellent!" << endl;
ولان ليس هناك امر break سيتم ايضا تنفيذ الامر الاتي
cout << "Well done" << endl;
وستكون نتيجة التنفيذ كما يلي
Enter your Grade A, B, C, D or F A Excellent! Well done
اما إذا ادخل المستخدم الحرف B او C فسيتم تنفيذ الامر الاتي فقط
cout << "Well done" << endl;
ولان هناك امر break فسينتهي تنفيذ switch عند هذه النقطة ويستكمل باقي البرنامج
اما اذا لم يدخل المستخدم احد من الحروف المحددة سابقا A, B, C, D or F فسيتم الانتقال الي default :
وتنفيذ الامر الاتي
cout << "Invalid grade" << endl;
كيفية استخدام break و continue
كما رأينا في المثال السابق اننا استخدمنا break في نهاية حالات الامر switch وذلك حتى يتم ايقاف تنفيذ switch عند هذه النقطة
والامر break يمكن ايضا استخدامه داخل while او for او do...while حتى يتم انهاء التكرر والخروج من الحلقة والهدف من ذلك هو اننا وصلنا للنتيجة المطلوبة ولا داعي للانتظار حتى انتهاء الحلقة بالصورة الطبيعة ولذلك نستخدم break حتى نقوم بالإنهاء سريعا
مثال
#include <iostream> using namespace std; int main () { int count; for ( count = 1; count <= 10; count++ ) // loop 10 times { if ( count == 5 ) break; cout << count << " "; } cout << "\nBroke out of loop at count = " << count << endl; return 0; }
في هذا البرنامج يتم ايقاف تنفيذ حلقة for عند وصول قيمة المتغير count الي 5
وستكون نتيجة التنفيذ
1 2 3 4 Broke out of loop at count = 5
الامر continue
يستخدم الامر continue لإنهاء الدورة الحالية من حلقة التكرر عند السطر الموجود فيه continue وسيتم استكمال التكرار مرة اخرى من جديد
فمثلا إذا أردنا طباعة الارقام من ١ الي ١٠ ما عدا الرقم ٧ سنقوم بعمل الاتي
#include <iostream> using namespace std; int main () { int count; for ( count = 1; count <= 10; count++ ) // loop 10 times { if ( count == 7 ) continue; cout << count << " "; } return 0; }
وستكون نتيجة التنفيذ كما يلي ونلاحظ عدم طباعة الرقم ٧
1 2 3 4 5 6 8 9 10
العمليات المنطقية
من خلال الامثلة السابقة دائما ما كانت المقارنة المنطقة بين شرط واحد فقط وإذا أردنا المقارنة بين اكثر من شرط فيجب علينا استخدام العمليات المنطقية وهي
&& logical AND || logical OR ! logical NOT
فمثلا إذا أردنا اختيار الطلاب من الصف الثالث ودرجاتهم اعلي من ٨٠ سنقوم بعمل الاتي
if ( studentclass == 3 && studentgrade >= 80 ) studentSelected++;
فيجب ان يتحقق الشرطان معنا حتى يتم اختيار الطلاب
اما إذا أردنا الاكتفاء بشرط واحد فقط فيمكننا استخدام OR كما يلي
if ( studentclass == 3 || studentgrade >= 80 ) studentSelected++;
اما إذا أردنا اختيار اي طالب من أي فصل ما عدا الفصل الثالث فسنقوم باستخدام NOT
if ( !(studentclass == 3) ) studentSelected++;
يمكن ايضا استبدال الرموز بكلمات بحروف صغيرة
&& and || or ! not
يمكن ايضا تعريف متغيرات منطقية bool وستكون قيمتها true او false فقط
مثلا
#include <iostream> using namespace std; int main () { bool isDone = false; int currentLevel = 0; const int maxLevel = 10; while (not isDone) { cout << "Enter your current level 1:10 " << endl; cin >> currentLevel; if (currentLevel >= maxLevel) isDone = true; } return 0; }
لقد قمنا بتعريف المتغير isDone كمتغير منطقي bool وقيمته false
اما المتغير maxLevel فتم تعريفة كثابت اي لا يمكن تغيره وإذا حاولنا تغيير قيمة هذا الثابت داخل البرنامج ستظهر لنا الرسالة الاتية
ولدينا ايضا حلقة while سيتم تنفيذها طالما المتغير isDone يساوي false فاذا كانت قيمته true سيتوقف تنفيذ حلقة while
تعرفنا في هذا الدرس كيفية استخدام العديد من عبارات التحكم لتغيير مسار تنفيذ البرنامج بناء على نتيجة تنفيذ مقارنة منطقية او عداد، سنتعرف فى الدرس القادم على الدوال functions
وإلي اللقاء في الدرس القادم
المشاركات: 2
المشاركون: 1