28-01-15, 12:40 PM
الدرس الرابع
* حلقات التكرار :
عرفنا في الدرس السابق ان هناك نوعين من عبارات التحكم في البرامج الأولى هي الشرط و الثانية و هي التكرار و التي سوف نتعلمها اليوم بإذن الله .
- معنى التكرار : يقصد بالتكرار هو إمكانية تنفيذ كود لعدة مرات بغرض توفير الوقت .
مثلا لو طلب منك حصر درجات 1000 طالب ، المنطقي هو ان تمر على كل طالب و تأخذ درجته ، لكن الف طالب لا تستعجب في الماضي حتى لو كانوا 100000 كانوا يفعلوها ، لكن اليوم نحن لدينا الحاسوب الذي يستطيع تكرير الكود و استخراج درجات جميع الطلاب حتى لو كانوا 100000000 ، اذا التكرار له فوائد لا حصر لها و تظهر تلك الفوائد في المصفوفات كما سنرى في الدرس القادم .
- مكونات أي تكرار : أي تكرار في أي لغة برمجة حتى لو كانت 0 و 1 يتكون من ثلاث أمور
1 - بداية التكرار : أي نقطة الانطلاق التي سيبدأ منها العد و هي غالبا 0 أو 1 (لا يشترط فقد تبدأ من 2775 مثلا )
2 - نهاية التكرار : و هي تلك النقطة التي يتوقف عندها التكرار و هي في الغالب تكون عبارة شرط كما سنرى .
3 - العداد : و هو مقدار الزيادة او النقص .
- التكرار قد يكون من 0 الى 10 و العداد موجب ، لكن لو اردنا العد من 10 الى 0 فتاكد من ان العداد بالسالب
--------------------------------------------------
عبارات التكرار
1 - دالة for : و هي تعتبر الأكثر شمولية و شيوعا و بساطة
كود :
for(start ; stop ; counter){
//some code
}
- في البداية نعرف متغير يفضل ان يكون int .
- لا تنسى ان تفصل بين كل عبارة و الأخرى بالفاصلة المنقوطة ";" .
- العداد - counter غالبا يكون على صيغة ++ او - - (راجع الدرس الثاني ) .
- النهاية - stop ستراها على هيئة >10 , =<5
- البداية - start دائما = n .
ناخذ مثال لطباعة الأرقام من 1 الى 10 :
كود :
int main(){
int I;
for(I = 1 ; I <= 10 ; I++){
cout<<I<<endl;
}
return 0;
}
كل ما قلناه موجود
1- عرفنا متغير i .
2 - البداية من 1 .
3- النهاية عند الشرط فاذا وصلت i الى 11 عندها ستتوقف الحلقة التكرارية .
4- كما تلاحظ ++i معناه زيادة بمقدرا واحد في كل دورة .
- يعني ان كل دورة يتم اختبار الشرط فاذا تحقق ينفذ الكود و يزداد العداد الى ان يصل الى نقطة لا يتحقق فيها الشرط فتتوقف الحلقة .
- بالنسبة لموضوع الزيادة :
كود :
I = I + 1
I += 1
I++
جميع الطرق الموضحة أعلاه صحيحة و جرب كتابة الكود مرة أخرى بهم و سوف يعمل .
------------------------------------------
نأخذ مثال آخر يطبع الاعداد الزوجية من 0 الى 10 .
كود :
int main(){
int I;
for(I = 0 ; I <= 10 ;I += 2){
cout<<I<<endl;
}
return 0;
}
------------------------------------
طباعة الاعداد الفردية من 11 الى 0 :كود :
int main(){
int I;
for(I = 11 ; I >= 0 ; I -= 2){
cout<<I<<endl;
}
return 0;
}
1 - بدأنا من 11 كي نطبع الاعداد الفردية .
2 - لاحظ ان التوقف كان عند ( I >= 0 ) فلو عكستها لن يتوقف البرنامج و سيظل يعد حتى سالب مالانهاية لكنها لا تحدث في الواقع فالبرنامج لن ينفذ .
-------------------------------------------------
هذه امثلة بسيطة و يوجد الكثير من الأفكار مثل إيجاد مجموع الاعداد من 1 الى 100 و .... الخ ، أمور أتمنى ان تجربها بنفسك اما المثال التالي فهو من اشهر الأمثلة عن التكرار و هو " برنامج المضروب " ، يقوم هذا البرنامج بحساب المضروب لرقم ما يدخله المستخدم .كود :
int main(){
int I, x , z;
cout<<"please enter number :\n";
cin>>x;
z = 1;
for(I = 1 ; I <= x ; I++){
z = z * I;
}
cout<<"the factorial of the number is : \n"<<z;
return 0;
}
لمن لا يعرف المضروب فهو حاصل ضرب الاعداد الأصغر الى 1 يعني مضروب 5 يساوي 5 * 4 * 3 *2 *1 = 120 .
1 - عرفنا ثلاث متغيرات I و هو عداد التكرار ، x و هي القيمة التي نريد لها المضروب ، z و هو المتغير الذي سيحمل المضروب .
2 - طلبنا من المستخدم ان يدخل رقم و نحمل القيمة للمتغير x .
3- وضعنا القيمة المبدئية لل z بواحد لا تنساها و لازم يكون 1 لانه المعامل المحايد الضربي يعني لا يؤثر في الضرب و أيضا لكي لا تواجهك مشاكل التنفيذ .
4 - بدائنا الحلقة من 1 لنفس السبب .
5 - اوقفنا الحلقة عند العدد الذي ادخله المستخدم و لاحظ ان مقدار الزيادة هو 1 في كل مرة .
6 - في كل دورة نجدد قيمة z بضربها في قيمة i الجديدة .
7 - بعد انتهاء الحلقة نطبع قيمة z للمستخدم و شكرا .
-------------------------------------------
2 - دالة while : و هي أيضا مهمة و شائعة .كود :
start;
while(condition){
counter;
}
تماما كما درسنا for لكن الفرق في الشكل فهنا شرط التوقف هو فقط من يكون داخل الاقواس اما البداية فتعرف خارج الدالة و العداد يكون داخل الدالة .
يعني شوف اول مثال اخذناه لكن مع while :
كود :
int main(){
int I;
I = 1;
while( I <= 10 ){
cout<<I<<endl;
I++;
}
return 0;
}
فط اختلاف في الشكل لكن أحيانا تكون while اكثر فائدة من for لكن ليس دائما .
----------------------------------------------------
- مثال المضروب ب while :
كود :
int main(){
int I, x , z;
cout<<"please enter number :\n";
cin>>x;
z = 1;
I = 1 ;
while( I <= x ){
z = z * I;
I++;
}
cout<<"the factorial of the number is : \n"<<z;
return 0;
}
----------------------------------------------------------
3 - دالة do while : الأقل شيوعاكود :
start;
do{
counter;
}
while(condition);
تختلف هذه عن اخواتها في ان السابقين يختبرون الشرط أولا ثم ينفذون الكود ام هنا فالامر مختلف فالتنفيذ أولا ثم اختبار الشرط .
شوف مثالنا البسيط :
كود :
int main(){
int I;
I = 1;
do{
cout<<I<<endl;
I++;
}while( I <= 10 );
return 0;
}
و هذا مثال المضروب :
كود :
int main(){
int I, x , z;
cout<<"please enter number :\n";
cin>>x;
z = 1;
I = 1;
do{
z = z * I;
I++;
}while( I <= x ) ;
cout<<"the factorial of the number is : \n"<<z;
return 0;
}
-------------------------------------------------------
4 -دالة goto : هذه الطريقة غير مضمونة لكنها تعتبر حركة تكتيكية مهارية يستعملها المحترفون و يضيع بها المبتدئون تعتمد عموما على (الملصقات - labels ) و هي شكل مختصر من الدوال لكنها ليست دالة ركز هي مجرد تعبير يتضمن مجموعة من الأوامر كالآتي :
كود :
start;
label:
counter;
//some code
if(condition){
goto label;
}
انظر الى مثالنا الشهير :
كود :
int main(){
int I;
I = 1;
count:
cout<<I<<endl;
I++;
if(I <= 10){
goto count;
}
return 0;
}
كود :
int main(){
int I, x , z;
cout<<"please enter number :\n";
cin>>x;
z = 1;
I = 1;
fact:
z = z * I;
I++;
if(I <= x){
goto fact;
}
cout<<"the factorial of the number is : \n"<<z;
return 0;
}
=====================================
رجاء اكرره في كل مرة ليس شرط ان تجرب كل الطرق
لكني أتمنى ان تجرب اكثر من برنامج من صنعك
يمكن ان تضيف if داخل الحلقات يمكن ان تعقد
العداد و تجعله يزداد بناء على قيم عمليات
جمع و طرح هناك الكثير من الأفكار
المهم هو التجريب و أي مشكلة
أي شيء لم تفهمه
او غير واضح
فلا تتردد
في السؤال
المفروض "في السؤال " تكون اصغر من "فلا تتردد" عشان يكتمل هرم
و الى اللقاء في المحاضرة القادمة