أهداف الدرس
سنقوم الآن باستخدام الحلقات 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 يتم تجاهل أي رقم بعد الفاصلة.