الحلقتين -while-and-do-while-loops

أهداف الدرس

سنقوم الآن باستخدام الحلقات for, while, do while في كل تمرين حتى تفهمهم بشكل جيد.

ستلاحظ أيضاً أننا قمنا بتعريف العداد الذي سنستخدمه في الحلقة for قبل تعريفها, لكننا قمنا بتحديد من أي رقم تبدأ و عند أي رقم تنتهي بداخلها.
الهدف فقط من هذا الأسلوب الجديد جعلك ترى أنه يمكنك كتابة الكود بأساليب كثيرة جداً و الحصول على نفس النتيجة.


نصيحة

أعد كتابة كل تمرين مرتين على الأقل, و حاول دائماً أن تحلل و تكتب الكود قبل أن تنظر إلى الحل الجاهز.
إذا قضيت يوماً كاملاً و أنت تحاول أن تحلل التمارين, أفضل بكثير من أن تنظر إلى الحل مباشرةً.

الفرق بين الحلقات for, while, do while

في حال أردت إنشاء حلقة تتألف من 5 دورات, سيكون شكل الحلقة كالتالي.

Note


توضيح الفروقات بين الحلقات الثلاثة

  • في الحلقة 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; لأننا سنستخدمه لتخزين ناتج جميع عمليات الجمع التي سيتم إجراءها في الحلقة.
    &nbsp &nbsp وضعنا القيمة 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 يحتوي على خمس أوامر و حلقة.

  • هنا أنت مجبر على تعريف العداد الذي ستستخدمه في الحلقة و إعطائه قيمة أولية قبل تعريف الحلقة أيضاً.
    &nbsp &nbsp لذلك قمنا بتعريف المتغير int i = 1; الذي سنستخدمه كعداد في الحلقة قبل تعريفها.

  • قمنا بتعريف المتغير int S = 0; لأننا سنستخدمه لتخزين ناتج جميع عمليات الجمع التي سيتم إجراءها في الحلقة.
    &nbsp &nbsp وضعنا القيمة 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 قبل تعريف الحلقة و ليس بداخلها.

  • ملاحظة
    &nbsp &nbsp يمكن تعريف الحلقة for بطرق مختلفة في لغات البرمجة لكن بشكل عام يجب أن يكون هناك إثنين ; ; بين أقواسها و إلا سيؤدي ذلك إلى ظهور خطأ في الكود.
    &nbsp &nbsp إضافةً إلى ذلك يجب المحافظة على مكان وضع العداد, الشرط, و طريقة زيادة العداد فيها.
    &nbsp &nbsp فمثلاً, إذا قمت بوضع الشرط في المكان المخصص لتعريف العداد كالتالي &nbsp 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 يتم تجاهل أي رقم بعد الفاصلة.