الفصل الثالث
التحكم في الخطوات :
كما سبق وان تكلمنا , نحن نعرف الان جيدا ان الحاسب يقوم بتنفيذ البرامج علي كأنها سلسله من الخطوات المتتابعه , ولكن ماذا اذا اردنا ان نقوم بتحديد الخطوه علي حسب الحاله ؟
اي اذا اردنا ان نقوم بتنفيذ خطوه معينه اذا وجد شرط معين ؟
دعني اعطيك مثال من الحقيقه , تريد ان تشرب كوب من القهوه , ولكنك لا تعرف هل هناك قهوه ام لا
فسوف تقوم بعمل شرط منطقي , اذا كان هناك قهوه فسوف اعد البعض
او تصريح من التصريحات الشرطيه في لغة السي هو if
وصيغتها كالاتي
if(condition is true)
execute this statement;
مامعني condition is true ? يعني انه اذا تحقق الشرط قم بتنفيذ التصريحات المراد تنفيذها اذا لم يوجد فاتبع مسار البرنامج العادي
مثال برمجي
#include <stdio.h>
int main(void)
{
int coffe = 1;
if(coffe)
printf("I am making some coffee\n");
return 0;
}
قمنا هنا بالتحقق من قيمة المتغير , فاذا كانت اي قيمه سوي الصفر تعتبر قيمه حقيقه , لان الصفر يعد قيمه غير حقيقه
ولكن الامر ليس دائما بهذه البساطه , ففي بعض الاحيان تريد وضع شيئ اخر تنفذه اذا لم يكن هناك قهوه , مثل ان تقوم بمشاهدة فلم ما
الحل هو else ونقوم بدمجها مع if لكي تعطينا if-else
مثال برمجي
#include <stdio.h>
int main(void)
{
int coffe = 0;
if(coffe)
printf("I am making some coffee\n");
else
printf("I am watching a movie\n");
return 0;
}
هل لاحظ الفرق ؟ اذا لم بوجد قهوه وهو ما قمنا بتعديله في هذا المثال فقم بفعل شيئ اخر
حسنا ماذا ااذا اردتا اختبار اكتر من شرط ؟
اذا لم يوجد قهوه فهل يوجد شاي ؟ اذا لم يوجده قهوه او شاي فهل يوجد بتنجان ؟
الحل هو في else if ويتم دمجها لتصبح if-else if-else
مثال برمجي
#include <stdio.h>
int main(void)
{
int coffe = 0;
int tee = 1;
if(coffe)
printf("I am making some coffee\n");
else if(tee)
printf("I am drinking tee\n");
else
printf("I am watching a movie\n");
return 0;
}
ولكن ماذا اذا اردنا تتفيذ اكتر من تصريح في حالة واحده ؟ فهذا وراد بشده
الحل هو دمج هذا التصريحات في block واحد وانت تعرف ماهو ال block
{} كل مابينهما
مثال برمجي
#include <stdio.h>
int main(void)
{
int coffe = 0;
int tee = 1;
if(coffe)
{
printf("I am making some coffee\n");
printf("I love coffee\n");
}
else if(tee)
{
printf("I am drinking tee\n");
printf("I hate tee\n");
}
else
{
printf("I am watching a movie\n");
printf("The dark knight\n");
}
return 0;
}
حسنا انت الان علي قد جيد وكافي من المعلومات لكي تقوم بكتابة برنامج صغير لنفسك يقوم بادخال متغير واحد فقط ويعطيك هل النتيجه اكبر من 100 , ام تساوي 50
#include <stdio.h>
int main(void)
{
int value = 0;
printf("Please enter a value: ");
scanf("%d",&value);
if(value > 100)
{
printf("Yeas it is\n");
printf("We are done\n");
}else if(value == 50)
{
printf("Yes it is equal to 50\n");
printf("Happy now?\n");
}else
{
printf("it is not bigger than 100 nor equal to 50\n");
}
return 0;
الي بيحصل بالظبت كالاتي لو الشرط الاول متحققش ,حيتحقق من الشرط التاني , لو متحققش هينفذ اخر حاجه الي هي else لاحظ انك ممكن اساسا متكتبش else
اذا لم تتعرف علي دالة scanf او الرمز & هاهو تزكير لك
في الدله printf تقوم بطبع المتغيرات علي حسب المدخلات في السلسه format الاولي التي تقوم بادخالها للداله
printf("%d%s");
والي اخره
وفي الدله scanf تقوم بالعكس
فعلي حسب السلسه النصيه format التي تقوم بادخالها تطلب الداله عناوين المتغيرات "سوف نرجع الي هذا لاحقا" لكي تقوم بتخزين القيمه المدخله
ولكي تحصل علي عنوان متغير ما تقوم بسبقه بالمعامل & والذي يسمي ب address of operator
سوف نتطرق الي هذا لاحقا في درس منفصل اخر
تمرين , قم بكتابة برنامج بسيط قم بكتابة برنامج يقوم بادخال متغيرين وجمعهم وطبع رساله اذا كان مجموعهم اكبر من 10 وطبع رساله اخري اذا كان مجموعهم يساوي 5 وطبع رساله اخري اذا كان مجموعهم غير ذلك
ملاحظة : هذه العمليات تدعم فقط العمليات الرياضيه , اي انها لاتدعم مثلا التحقق من سلسلتين نصيتين مع بعص
فمثلا
if("St0rM" == "St0rM") لن يتم عمل compile للبرنامج اساسا
وملاحظة اخري: == تعني مساواه اما = تعني اسناد قيمه لشيئ ما
ودلوقتي بعد معرفت انك ممكن تنفذ اكتر من اختبار في نفس الوقت بصيغة if-else if-else , ما اخد بالك انها متعبه شوية خاصة لو في اكتر من شرط ؟
بالتأكيد هتكون متعبه جدا
الحل هو الاتي switch statement
#include <stdio.h>
int main(void)
{
int x = 1;
switch(x)
{
case 1:
printf("1\n");
break;
case 2:
printf("2\n");
break;
default:
printf("Nothing\n");
}
return 0;
}
للتفاصيل لاان , تقوم switch بعمل اختبار مساوه لاي قيمه عدديه مشتقه من ال int , وتقوم بالتحقق من مساوتها مع الشروط الموجوده في ال cases
تقوم بكتابة ال case
ووضع التصريحات المراد تنفيذها ثم تقوم بوضع كلمة break حتي يميز المترجم اين تنتهي سلسلة التصريحات الخاصة بهذا الشرط
وفي النهايه يمكنك ان تقوم بادراج حالة default كانها else
تمرين , قم باستبدال البرنامج الخاص ب if-else if-else باخر يستخدم switch
والان وقد تعرفنا علي كيفية التحقق من الخطوات لقم بالتعرف علي كيفة تكرار الخطوات بناء علي شرط
وهذا مفهوم يسمي بمفهوم التكرارات loops اي انك تقوم بتنفيذ عدد معين من العمليات بناء علي شرط مثلا وكما تعرضنا في الفصل السابق ل for loop
فصيغة for loop تقكون كالاتي بشكل عام
for(initialization ; condition ; increment)
execute this statement;
فالذي يحدث هو الاتي يتم تنفيذ اول قسم مره واحده فقط عن بداية الدواره , وهذا القسم غالبا مايتم وضع اسناد قيمة لمتغير يتم استخدامه في الدواره فيه
اما القسم الثاني فهو غالبا مايكون قسم شرطي , اي انه يتم تنفيذ هذه الدواره الي ان ﻻ يتحقق هذا الشرط , اما القسم الاخير فغالبا مايكون اذاده قيمه او انقاص قيمه للمتغير الذب تم اسناده او مره
دعنا نرا مثال
#include <stdio.h>
int main(void)
{
int x;
for(x = 0 ; x < 100 ; x++)
printf("%d\n",x);
return 0;
}
قم بتنفيذ البرنامج وتعرف علي نتيجته , , وكما الحال في السابق اذا اردت ان تقوم بتنفيذ اكثر من تصريح قم بوضعهم في {}
#include <stdio.h>
int main(void)
{
int x;
for(x = 0 ; x < 100 ; x++)
{
printf("%d",x);
printf("\n");
}
return 0;
}
حسنا ولكن هذه ليست الطريقه الوحيده لكي تقوم بعمل تكرار لعبارات تريد التحقق منها
هناك ايضا
while(condition)
#include <stdio.h>
int main(void)
{
int x = 0;
while(x < 100)
{
printf("%d\n",x);
x = x + 1;
}
return 0;
}
ماحدث هو ان while تقوم بالتحقق من الشرط ثم بناء علي النتيجه تقوم بتنفيذ العباره او العبارات الموجوده بداخل {}
والذي حدث هو اننا قمنا بطباعة قيمه x ثم اذدنا قيمتها بواحد
x = x + 1;
ولكن هناك طريقه افضل من تلك
x++;
بهذه الطريقه تقوم باذادة قيمه x وتسمي بال postfix increment سوف اشرح لك الفارق بينها وبين شيئ اخر لاحقا
ولكن ماذا اذا اردنا انقاص قيمة x ?
سوف نقوم بطبيقها ب while
#include <stdio.h>
int main(void)
{
int x = 100;
while(x > 0)
{
printf("%d\n",x);
x = x - 1;
}
return 0;
}
تدريب
قم باستبدال x = x - 1 ب x-- وهي تعني postfix decrement
وقم بعمل نفس البرنامج ولكن باستخدام for
hint:
for(x = 100 ; ........)
هناك شيئ اخر نريد ان نقوم بالاطلاع عليه
وهو اخر شيئ في التكرارات
do-while
الفارق بينها وبين اي تكرار اخر انها تضمن ان يتم تنفيذ التصريحات الخاصه بك علي الاقل مره واحده ثم يتم التحقق بعد التنفيذ من الشرط اذا كان الشرط صحيح , فسوف يتم اعادة تنفيذ الدوره وهكذا
#include <stdio.h>
int main(void)
{
int x = 0;
do
{
printf("Please enter a number: ");
scanf("%d",&x);
}while(x == 1);
return 0;
}
لاحظ شيئ مهم , انه بعد while في هذه الدوره وضعنا ; السبب لهذا لاتحتاج الي معرفته فقط تذكر دائما ان تضع ; بعد while في هذه الدواره
الان وبعد ان قمت بالتعرف علي الطرق للتحكم في الخطوات , والطرق لتكرار الخطوات , سوف اعطيك مثال بسيط
#include <stdio.h>
int main(void)
{
int number = 0;
int exit = 1;
int x;
do
{
printf("enter a number: ");
scanf("%d",&number);
if(number == 5)
printf("your number equals to 5\n");
printf("i am going to count now\n");
for(x = 0 ; x < number ; x++)
printf("%d ,",x);
printf("\n");
printf("if you want to exit type 0: ");
scanf("%d",&exit);
}while(exit == 1);
return 0;
}
التدريب : قم بشرح هذا البرنامج لنفسك علي ورقه وقلم بالتفصيل ثم قم بادراج هذا الشرح هنا وتفضل بالاساله
تابع معي للفصل الثاني