أهداف الدرس
سنقوم الآن باستخدام الحلقات for
, while
, do while
في كل تمرين حتى تفهمهم بشكل جيد.
ستلاحظ أيضاً أننا قمنا بتعريف العداد الذي سنستخدمه في الحلقة for
قبل تعريفها, لكننا قمنا بتحديد من أي رقم تبدأ و عند أي رقم تنتهي بداخلها.
الهدف فقط من هذا الأسلوب الجديد جعلك ترى أنه يمكنك كتابة الكود بأساليب كثيرة جداً و الحصول على نفس النتيجة.
أعد كتابة كل تمرين مرتين على الأقل, و حاول دائماً أن تحلل و تكتب الكود قبل أن تنظر إلى الحل الجاهز.
إذا قضيت يوماً كاملاً و أنت تحاول أن تحلل التمارين, أفضل بكثير من أن تنظر إلى الحل مباشرةً.
الفرق بين الحلقات for
, while
, do while
في حال أردت إنشاء حلقة تتألف من 5 دورات, سيكون شكل الحلقة كالتالي.
توضيح الفروقات بين الحلقات الثلاثة
في الحلقة
for
تستطيع تعريف المتغير الذي ستستخدمه كعداد و وضع الشرط الذي يحدد أين تتوقف الحلقة و إضافة قيمة العداد على نفس السطر.في الحلقتين
while
وdo while
أنت مجبر على أن تعرف المتغير الذي ستستخدمه كعداد مع تحديد قيمته قبل كتابة الحلقة.في الحلقتين
while
وdo while
أنت مجبر على أن تزيد قيمة العداد في نهاية كل دورة.في الحلقتين
for
وwhile
يقوم الكمبيوتر بالتشييك على قيمة العداد قبل أن يبدأ في تنفيذ الكود, و على أساسها يحدد إذا كان سيبدأ بدورة جديدة أم لا.في الحلقة
do while
يقوم الكمبيوتر بالتشييك على قيمة العداد بعد إنتهاء الكود من أجل الدورة التالية.في الحلقة
do while
أنت مجبر أن تضع فاصلة منقوطة بعد الـwhile
و إلا سيسبب لك مشكلة في الكود لأنه سيظن أنك تريد تعريف حلقةwhile
جديدة و ليس إغلاق الحلقةdo while
.
المبادئ الأساسية لعمليات الجمع و الضرب في الحلقات
في عمليات الجمع نحتاج متغير لنضع فيه ناتج الجمع في كل دورة, لذلك نعطيه صفر كقيمة أولية لأن الصفر لا يؤثر في عمليات الجمع.
int S = 0;
في عمليات الضرب نحتاج متغير لنضع فيه ناتج الضرب في كل دورة, لذلك نعطيه واحد كقيمة أولية لأن الواحد لا يؤثر في عمليات الضرب.
int M = 1;
لا تقلق ستفهم فكرة القيم الأولية 0 و 1 لاحقاً من التمارين.
تمارين شاملة حول الحلقات for
, while
, do while
الحلقتين While و Do While في الخوارزميات - التمرين الأول
أكتب برنامج يقوم بجمع جميع الأرقام من 1 إلى 100 و يعرض فقط المجموع النهائي بثلاث طرق.
أكتب كل طريقة في برنامج.
المتغير S
سنستخدمه لتخزين المجموع النهائي.
المتغير i
هو العداد الذي سنستخدمه في كل حلقة و الذي سنجعل قيمته تزيد 1 في كل دورة.
إذاً قيمة المتغير S
تساوي مجموع جميع القيم التي ستعطى للعداد i
في أي حلقة نستخدمها.
الصورة التالية توضح كيف ستزيد قيمة العداد i
و المتغير S
في كل حلقة إستخدمناها.
الطريقة الأولى لحل التمرين باستخدام الحلقة for
public class Sum { public static void main (String[] args) { int i; int S = 0; for ( i=1; i <=100; i=i+1) { S = S + i; } System.out.print("The sum is: " + S + "\n"); } }
البرنامج
Sum
يحتوي على أربع أوامر و حلقة.هذه المرة قمنا بتعريف المتغير
int i;
الذي سنستخدمه كعداد في الحلقة قبل تعريف الحلقةfor
و ليس بداخلها, و هذا لا يؤثر أبداً في الكود.في الحلقة
for
إستخدمنا العدادi
( لم نقم بتعريفه من جديد ) و جعلناها تبدأ من 1 إلى 100, و جعلنا العدادi
يزيد 1 فقط في كل دورة.قمنا بتعريف المتغير
int S = 0;
لأننا سنستخدمه لتخزين ناتج جميع عمليات الجمع التي سيتم إجراءها في الحلقة.
    وضعنا القيمة 0 كقيمة أولية للمتغيرS
لأننا مجبرين على إعطائه أي قيمة قبل إستخدامه في عملية الجمع. و القيمة 0 بطبيعة الحال لن تؤثر على عملية الجمع.الكود
S = S + i;
الذي وضعناه في الحلقة يعني أنه في كل دورة سيتم إضافة قيمة العدادi
الحالية على قيمة المتغيرS
ثم وضع ناتج الجمع من جديد في المتغيرS
.في الأخير قمنا بعرض قيمة المتغير
S
التي تمثل ناتج جمع جميع القيم التي أعطيت للعدادi
في الحلقة, و جعلنا وقت تنفيذ البرنامج يظهر على سطر جديد من خلال الـ\n
.
الطريقة الثانية لحل التمرين باستخدام الحلقة while
هنا سيكون عليك تعريف العداد i
قبل تعريف الحلقة.
ثم تضع الشرط الذي سيجعل الحلقة تتوقف.
و في نهاية الحلقة عليك زيادة قيمة العداد.
public class Sum { public static void main (String[] args) { int i = 1; int S = 0; while ( i <=100 ) { S = S + i; i = i + 1; } System.out.print("The sum is: " + S + "\n"); } }
البرنامج
Sum
يحتوي على خمس أوامر و حلقة.هنا أنت مجبر على تعريف العداد الذي ستستخدمه في الحلقة و إعطائه قيمة أولية قبل تعريف الحلقة أيضاً.
    لذلك قمنا بتعريف المتغيرint i = 1;
الذي سنستخدمه كعداد في الحلقة قبل تعريفها.قمنا بتعريف المتغير
int S = 0;
لأننا سنستخدمه لتخزين ناتج جميع عمليات الجمع التي سيتم إجراءها في الحلقة.
    وضعنا القيمة 0 كقيمة أولية للمتغيرS
لأننا مجبرين على إعطائه أي قيمة قبل إستخدامه في عملية الجمع. و القيمة 0 بطبيعة الحال لن تؤثر على عملية الجمع.الحلقة
while
ستستمر في تنفيذ الكود الموجود فيها طالما أن قيمة العدادi
ليست أصغر أو تساوي 100. و هكذا نكون جعلناها تبدأ من 1 إلى 100.الكود
S = S + i;
الذي وضعناه في الحلقة يعني أنه في كل دورة سيتم إضافة قيمة العدادi
الحالية على قيمة المتغيرS
ثم وضع ناتج الجمع من جديد في المتغيرS
.الكود
i = i + 1;
الذي وضعناه في الحلقة يعني أنه في نهاية كل دورة سيتم إضافة 1 على قيمة العدادi
.في الأخير قمنا بعرض قيمة المتغير
S
التي تمثل ناتج جمع جميع القيم التي أعطيت للعدادi
في الحلقة, و جعلنا وقت تنفيذ البرنامج يظهر على سطر جديد من خلال الـ\n
.
الطريقة الثالثة لحل التمرين باستخدام الحلقة do while
هنا سيكون عليك تعريف العداد i
قبل تعريف الحلقة.
ثم تضع الكود كله بداخل حدود الـ do
مع زيادة قيمة العداد فيها أيضاً.
في الأخير, عليك وضع الشرط الذي سيجعل الحلقة تتوقف بداخل الـ while
و تحت الـ do
مباشرةً.
public class Sum { public static void main (String[] args) { int i = 1; int S = 0; do { S = S + i; i = i + 1; } while ( i <=100 ); System.out.print("The sum is: " + S + "\n"); } }
نفس الشرح السابق تماماً, و لكن الفرق الوحيد هنا أنه في الحلقة
do while
يقوم البرنامج بتنفيذ الكود الموضوع في الحلقة قبل أن ينظر إلى الشرط الذي سيجعل الحلقة تتكرر من جديد أو تتوقف.إذاً في الحلقة
do while
الكود يتنفذ مرة واحدة على الأقل حتى لو كان الشرط يقضي بتوقيف الحلقة, لأنه ينظر إلى الشرط قبل بداية الدورة الجديدة و ليس قبل بداية أي دورة كما في الحلقتينwhile
وfor
, لأن الشرط هنا يوضع في آخر الحلقة و ليس في الأول.ملاحظة: في حال نسيت وضع فاصلة منقوطة
;
بعد الـwhile
سيظهر لك خطأ.
الحلقتين While و Do While في الخوارزميات - التمرين الثاني
أكتب برنامج يقوم بضرب جميع الأرقام من 1 إلى 10 و يعرض فقط المجموع النهائي بثلاث طرق.
الـ M
هو المتغير الذي سيحتوي على كل الأرقام المضروبة.
الـ i
هو المتغير ( العداد ) الذي يزيد واحد في كل دورة.
الـ M
تساوي ضرب كل قيم الـ i
.
public class MultipleLoops { public static void main (String[] args) { // هنا قمنا بتعريف المتغيرات في أول البرنامج لأننا سنستخدمهم نفسهم في جميع الحلقات int i = 1; int M = 1; // " for " الطريقة الأولى باستخدام الحلقة System.out.print("1- using for loop:\n"); for ( ; i <=10; i=i+1 ) { M = M * i; } System.out.print("The multiple is: " + M + "\n"); System.out.print("-----------------------------------\n"); // " while " الطريقة الثانية باستخدام الحلقة System.out.print("2- using while loop:\n"); i = 1; M = 1; while ( i <=10 ) { M = M * i; i = i + 1; } System.out.print("The multiple is: " + M + "\n"); System.out.print("-----------------------------------\n"); // " do while " الطريقة الثالثة باستخدام الحلقة System.out.print("3- using do while loop:\n"); i = 1; M = 1; do { M = M * i; i = i + 1; } while ( i <=10 ); System.out.print("The multiple is: " + M + "\n"); System.out.print("-----------------------------------\n"); } }
ملاحظة: الشروحات الموضوعة بالعربية فوق كل كود لا تؤثر أبداً عليه لأنها موضوعة كتعليقات كما قلنا سابقاً.
البرنامج
MultipleLoops
يحتوي على ثلاث حلقات تعمل بنفس الطريقة.
int i = 1; int M = 1;
في بداية البرنامج قمنا بتعريف المتغيرين i
و M
لأننا نريد استخدامهم في كل حلقة سننشأها.
إذاً تستطيع إنشاء المتغير الذي ستستخدمه كعداد في بداية البرنامج و تستخدمه من جديد كلما أردت ذلك.
i = 1; M = 1;
قبل أن نستخدم المتغيرين i
و M
في أي حلقة كنا نعيد قيمهم إلى كما كانت عليه في البداية.
System.out.print("The multiple is: " + M + "\n");
بعد كل حلقة قمنا بتعريفها في البرنامج, قمنا باستخدام أمر الطباعة هذا لعرض قيمة المتغير M
بعد أن تم وضع ناتج ضرب جميع الأرقام من 1 إلى 10 فيه.
for ( ; i <=10; i=i+1 )
هنا قمنا بتعريف عداد الحلقة for
قبل تعريف الحلقة و ليس بداخلها.
ملاحظة
    يمكن تعريف الحلقة for
بطرق مختلفة في لغات البرمجة لكن بشكل عام يجب أن يكون هناك إثنين ; ;
بين أقواسها و إلا سيؤدي ذلك إلى ظهور خطأ في الكود.
    إضافةً إلى ذلك يجب المحافظة على مكان وضع العداد, الشرط, و طريقة زيادة العداد فيها.
    فمثلاً, إذا قمت بوضع الشرط في المكان المخصص لتعريف العداد كالتالي   for ( i <=10; ; i=i+1 )
سيظهر لك خطأ.
الحلقتين While و Do While في الخوارزميات - التمرين الثالث
أكتب برنامج يظهر القيمة النهائية لـ S
.
سنخزن كل الناتج في المتغير S
.
الـ i
هو المتغير ( العداد ) الذي يزيد واحد في كل دورة.
public class FirstFraction { public static void main (String[] args) { double S=0; for ( double i=1; i <=100; i=i+1 ) { S = S + ( 1/i ); } System.out.print("The Sum is: " + S + "\n"); } }
قمنا بتسمية البرنامج
FirstFraction
و وضعنا فيه ثلاث أوامر و حلقة.
double S=0;
هنا قمنا بتعريف المتغير S
لتخزين المجموع لذلك أعطيناه القيمة 0 كقيمة أولية.
for ( double i=1; i <=100; i=i+1 ) { S = S + ( 1/i ); }
هنا أنشأنا حلقة تبدأ من 1 إلى 100 و في نهاية كل دورة تزيد 1.
في كل دورة سيتم إضافة 1 مقسوم على قيمة العداد i
على قيمة المتغير S
.
System.out.print("The Sum is: " + S + "\n");
هنا قمنا بعرض ناتج الجمع الموجود في المتغير S
.
لو لم نقم بتعريف المتغير S
و المتغير i
كـ double
لكانت النتيجة خاطئة لأنه في النوع int
يتم تجاهل أي رقم بعد الفاصلة.