مفهوم الحلقات المتداخلة
الحلقات المتداخلة تسمى Nested Loops بالإنجليزية, و تعني تعريف حلقة بداخل حلقة أخرى.
في هذا الدرس ستتعرف على طرق أكثر تعقيداً للتعامل مع الحلقات, حيث أنك ستقوم بوضع الحلقات بداخل بعضهم البعض.
تعريف الحلقات بداخل بعضها البعض هو أصعب مرحلة ستمر بها خلال دراستك للخوارزميات لأنها الأكثر تعقيداً.
فهمك للحلقات المتداخلة سينمي قدراتك كثيراً على التحليل.
ستحتاج معرفة طرق التحليل التي ستتعلمها في هذا الدرس بشدة في المستقبل و خاصةً عندما تدرس المصفوفات.
ستلاحظ أن جميع التمارين الموضوعة في هذا الدرس مطلوب فيها رسم أشكال هندسية كالمربع, المستطيل و المثلث بواسطة رمز النجمة *
و رمز الطرح -
.
إذاً مهمتك في هذا الدرس ستكون إبتكار خوارزميات من شأنها رسم تلك الأشكال بأقل كود ممكن مهما كان حجم الأشكال الهندسية.
المعلومات التي يمكن استغلالها لحل تمارين الحلقات المتداخلة المعقدة
بشكل عام, أي شكل هندسي تنوي رسمه بواسطة الرموز يحتاج لحلقتين على الأقل:
حلقة للإنتقال من سطر لآخر, يقال لها الحلقة
i
.حلقة للإنتقال من عامود لآخر, يقال لها الحلقة
j
.
لرسم الشكل التالي
يجب حساب و تدوين عدد الأسطر و الأعمدة الموجودة في كل سطر كالتالي لأنك ستحتاجهم.
إذاً هنا لاحظنا أنه عندنا 3 أسطر و كل سطر يحتوي على 5 أعمدة.
نستنتج أن كل نجمة ظاهرة في الرسمة يجب أن تكون موجودة على سطر و عامود محددين.
من أهم الأشياء التي يجب أن تلاحظها عندما تنظر إلى أي شكل هندسي و تدونها هي عدد جميع الأسطر و الأعمدة الموجودة فيها.
السبب في ذلك أنه لرسم أي شكل هندسي, يجب أن تكتشف العلاقة بين عدد الأسطر و عدد الأعمدة في كل سطر.
أحياناً يكون عدد الأسطر يساوي عدد الأعمدة الموجودة في الرسمة. ( هنا يكون الشكل يشبه المربع ).
و أحياناً يكون عدد الأسطر يساوي نصف عدد الأعمدة الموجودة في الرسمة. ( هنا يكون الشكل يشبه المستطيل ).
و يمكن أن يكون عدد الأعمدة يساوي ضعف عدد الأسطر الموجودة في الرسمة. ( هنا يكون الشكل يشبه المستطيل ).
و يمكن أن يكون عدد الأعمدة يساوي نصف عدد الأسطر الموجودة في الرسمة زائد 1 أو ناقص 3 إلى آخره.
لا تقلق إذا لم تفهم أي شيء الآن, لأنك ستفهم ما كنا نقصد لاحقاً من التمارين.
قد لا يكون هناك أي علاقة بين عدد الأعمدة و عدد الأسطر الموجودة في الرسمة.
في هذه الحالة لا يمكنك الإعتماد على الحلقات لرسمها بشكل تلقائي.
الأشياء الثابتة التي يمكنك كتابتها مباشرةً عند ملاحظتها
إذا كان الشكل يتألف من 5 أسطر, قم مباشرةً بتعريف الحلقة
i
كالتالي.
for (int i=1; i <=5; i++)
أحياناً تلاحظ أن جميع النجوم تبدأ من العامود رقم 1, في هذه الحالة قم مباشرةً بتعريف الحلقة j
كالتالي.
for (int j=1; ; j++)
أحياناً تلاحظ أن جميع النجوم تنتهي عند العامود رقم 5, في هذه الحالة قم مباشرةً بتعريف الحلقة j
كالتالي.
for ( ; j <=5; j++)
إختلاف عدد الأعمدة بشكل متناسق
عندما يكون عدد الأعمدة مختلفاً في كل سطر و لكن بشكل متناسق فهذا يعني مباشرةً أنك يجب أن تعتمد على العداد i
في المعادلة التي تحاول إكتشافها, و التي ستوصلك للشكل المطلوب.
تمارين شاملة حول الحلقات المتداخلة
الحلقات المتداخلة في الخوارزميات - التمرين الأول
إستخدم الحلقات لطباعة الشكل التالي
بما أن عدد النجوم ثابت في كل سطر, يمكننا تحليل طريقة إستخدام الحلقات لرسم الشكل بكل سهولة كالتالي.
الأسلوب التالي في التحليل يتيح لنا رسم أي شكل هندسي مهما كان معقداً.
هنا نقوم بحساب عدد النجوم في كل سطر لمعرفة كيف سنكتب الحلقتين i
و j
لرسم الشكل المطلوب منك.
public class Stars { public static void main (String[] args) { for (int i=1; i <=3; i++) { for (int j=1; j <=5; j++) { System.out.print("* "); } System.out.print("\n"); } } }
في البداية الهدف من هذا البرنامج طباعة النجوم فقط.
for (int j=1; j <=5; j++) { System.out.print("* "); }
الحلقة الداخلية, أي الحلقة j
تنفذ الكود الموجود بداخلها 5 مرات.
في كل دورة تطبع نجمة واحدة و بعدها مسافة صغيرة و تبقى على نفس السطر.
for (int i=1; i <=3; i++) { for (int j=1; j <=5; j++) { System.out.print("* "); } System.out.print("\n"); }
الحلقة الخارجية, أي الحلقة i
تنفذ الكود الموجود بداخلها 3 مرات.
في كل دورة ستنفذ الحلقة j
, أي ستطبع 5 نجوم فقط و بين كل نجمتين يوجد مسافة صغيرة.
بعد طباعة كل 5 نجوم تنزل على السطر لأننا وضعنا \n
بعد إنتهاء الحلقة j
.
الحلقات المتداخلة في الخوارزميات - التمرين الثاني
إستخدم الحلقات لطباعة الشكل التالي
بما أن عدد الأرقام ثابت في كل سطر, يمكننا تحليل طريقة إستخدام الحلقات لرسم الشكل بكل سهولة كالتالي.
الأسلوب التالي في التحليل يتيح لنا رسم أي شكل هندسي مهما كان معقداً.
هنا نقوم بحساب عدد الأرقام في كل سطر لمعرفة كيف سنكتب الحلقتين i
و j
لرسم الشكل المطلوب منك.
public class ColumnsNumbers { public static void main (String[] args) { for (int i=1; i <=3; i++) { for (int j=1; j <=5; j++) { System.out.print( j + " "); } System.out.print("\n"); } } }
الهدف من البرنامج طباعة أرقام الأعمدة, أي عرض كل قيم العداد
j
في كل دورة من دورات الـi
.
for (int j=1; j <=5; j++) { System.out.print( j + " "); }
الحلقة الداخلية, أي الحلقة j
تطبع الأرقام 1 2 3 4 5
.
في كل دورة تطبع قيمة العداد j
بعدها مسافة صغيرة و تبقى على نفس السطر.
for (int i=1; i <=3; i++) { for (int j=1; j <=5; j++) { System.out.print( j + " "); } System.out.print("\n"); }
الحلقة الخارجية, أي الحلقة i
تنفذ الكود الموجود بداخلها 3 مرات.
في كل دورة ستنفذ الحلقة j
, أي ستطبع الأرقام 1 2 3 4 5
و يوجد مسافة صغيرة بينهم.
بعد طباعة 1 2 3 4 5
تنزل على السطر لأننا وضعنا \n
بعد إنتهاء الحلقة j
.
الحلقات المتداخلة في الخوارزميات - التمرين الثالث
إستخدم الحلقات لطباعة الشكل التالي
بما أن عدد الأرقام غير ثابت في كل سطر, لا يمكننا تحليل طريقة إستخدام الحلقات لرسم الشكل كالتالي.
الأسلوب التالي في التحليل يتيح لنا رسم أي شكل هندسي مهما كان معقداً.
هنا نقوم بحساب عدد الأرقام في كل سطر لمعرفة كيف سنكتب الحلقتين i
و j
لرسم الشكل المطلوب منك.
public class ColumnsNumbers { public static void main (String[] args) { for (int i=1; i <=5; i++) { for (int j=1; j <=i; j++) { System.out.print( j +" "); } System.out.print("\n"); } } }
for (int i=1; i <=5; i++)
الحلقة i
تعني أنه عندنا 5 أسطر.
for (int j=1; j <=i; j++) { System.out.print( j +" "); }
الحلقة j
مرتبطة بالعداد i
.
    فهنا كلما زادت قيمة العداد i
كلما زاد عدد دورات الحلقة j
.
    في كل دورة من دورات الحلقة i
تستمر الحلقة j
تتنفذ حتى يتحقق الشرط j <=i
, أي حتى تتساوى قيم المتغيرات i
و j
.
هكذا سيتم تنفيذ الكود:
    في الدورة الأولى من الحلقة i
سيصل عدد دورات الحلقة j
إلى 1, أي ستطبع 1
.
    في الدورة الثانية من الحلقة i
سيصل عدد دورات الحلقة j
إلى 2, أي ستطبع 1 2
.
    في الدورة الثالثة من الحلقة i
سيصل عدد دورات الحلقة j
إلى 3, أي ستطبع 1 2 3
.
    في الدورة الرابعة من الحلقة i
سيصل عدد دورات الحلقة j
إلى 4, أي ستطبع 1 2 3 4
.
    في الدورة الخامسة من الحلقة i
سيصل عدد دورات الحلقة j
إلى 5, أي ستطبع 1 2 3 4 5
الحلقات المتداخلة في الخوارزميات - التمرين الرابع
إستخدم الحلقات لطباعة الشكل التالي
بما أن عدد الأرقام غير ثابت في كل سطر, لا يمكننا تحليل طريقة إستخدام الحلقات لرسم الشكل كالتالي.
الأسلوب التالي في التحليل يتيح لنا رسم أي شكل هندسي مهما كان معقداً.
هنا نقوم بحساب عدد الأرقام في كل سطر لمعرفة كيف سنكتب الحلقتين i
و j
لرسم الشكل المطلوب منك.
public class Rows_And_Columns { public static void main (String[] args) { for (int i=1; i <=5; i++) { for (int j=1; j <=5-i+1; j++) { System.out.print( j +" "); } System.out.print("\n"); } } }
for (int i=1; i <=5; i++)
الحلقة i
تعني أنه عندنا 5 أسطر.
for (int j=1; j <=5-i+1; j++) { System.out.print( j +" "); }
عدد دورات الحلقة j
مرتبط بعدد الأسطر الإجمالي و بقيمة العداد i
في كل سطر.
فعلياً, في كل سطر عدد دورات الحلقة j
يساوي عدد جميع الأسطر, ناقص رقم السطر الحالي, زائد واحد.
و هكذا سيبدو أنه كلما زادت قيمة العداد i
واحداً, سيقل عدد دورات الحلقة j
واحداً أيضاُ.
أي كلما إنتقلنا إلى سطر كلما نقص عدد الأعمدة واحد.
الحلقات المتداخلة في الخوارزميات - التمرين الخامس
إستخدم الحلقات لطباعة الشكل التالي
بما أن هذا الشكل يشبه تماماً الشكل السابق, يمكننا إعتماد نفس مبدأ التحليل و إستخدام نفس المعادلة السابقة التي وضعناها للحلقة j
.
و في التمرين التالي أيضاً سنثبت لك أنه بإمكانك أن تكتب كود آخر و تحصل على نفس هذا الشكل أيضاً.
بما أن عدد النجوم غير ثابت في كل سطر, لا يمكننا تحليل طريقة إستخدام الحلقات لرسم الشكل كالتالي.
الأسلوب التالي في التحليل يتيح لنا رسم أي شكل هندسي مهما كان معقداً.
هنا نقوم بحساب عدد النجوم في كل سطر لمعرفة كيف سنكتب الحلقتين i
و j
لرسم الشكل المطلوب منك.
public class Stars { public static void main (String[] args) { for (int i=1; i <=5; i++) { for (int j=1; j <=5-i+1; j++) { System.out.print("* "); } System.out.print("\n"); } } }
هذا التمرين هو نفسه التمرين السابق من حيث الشكل, الفرق الوحيد أننا هنا قمنا بعرض نجوم و ليس قيم العداد
j
.
for (int i=1; i <=5; i++)
الحلقة i
تعني أنه عندنا 5 أسطر.
for (int j=1; j <=5-i+1; j++) { System.out.print("* "); }
عدد دورات الحلقة j
مرتبط بعدد الأسطر الإجمالي و بقيمة العداد i
في كل سطر.
فعلياً, في كل سطر عدد دورات الحلقة j
يساوي عدد جميع الأسطر, ناقص رقم السطر الحالي, زائد واحد.
و هكذا سيبدو أنه كلما زادت قيمة العداد i
واحداً, سيقل عدد دورات الحلقة j
واحداً أيضاُ.
أي كلما إنتقلنا إلى سطر كلما نقص عدد الأعمدة واحد.
الحلقات المتداخلة في الخوارزميات - التمرين السادس
أكتب نفس البرنامج السابق بطريقة ثانية, الشكل المطلوب رسمه هو التالي
public class Stars { public static void main (String[] args) { for (int i=5; i>=1; i--) { for (int j=1; j <=i; j++) { System.out.print("* "); } System.out.print("\n"); } } }
for (int i=5; i>=1; i--)
الحلقة i
تعني أنه عندنا 5 أسطر.
كما تلاحظ أن هذه المرة الأولى التي نجعل فيها قيمة العداد i
تقل في كل دورة بدل أن تزيد.
for (int j=1; j <=i; j++) { System.out.print("* "); }
هنا الحلقة j
مرتبطة فقط بالعداد i
, و كما تلاحظ فإن معادلة الـ j
غير معقدة كما كتبناها في التمرين السابق.
هنا قلنا أنه في كل سطر سيكون عدد أعمدة الحلقة j
يساوي قيمة العداد i
.
بما أن العداد i
يبدأ من 5 وصولاً إلى 1 كانت النتيجة كالتالي:
في دورة الحلقة
i
الأولى, كانت قيمة العدادi
تساوي 5 فكان عدد دورات الحلقةj
يساوي 5. لذلك تم طباعة* * * * *
.في دورة الحلقة
i
الثانية, كانت قيمة العدادi
تساوي 4 فكان عدد دورات الحلقةj
يساوي 4. لذلك تم طباعة* * * *  
.في دورة الحلقة
i
الثالثة, كانت قيمة العدادi
تساوي 3 فكان عدد دورات الحلقةj
يساوي 3. لذلك تم طباعة* * *    
.في دورة الحلقة
i
الرابعة, كانت قيمة العدادi
تساوي 2 فكان عدد دورات الحلقةj
يساوي 2. لذلك تم طباعة* *      
.في دورة الحلقة
i
الخامسة, كانت قيمة العدادi
تساوي 1 فكان عدد دورات الحلقةj
يساوي 1. لذلك تم طباعة*        
.
الحلقات المتداخلة في الخوارزميات - التمرين السابع
إستخدم الحلقات لطباعة الشكل التالي
public class Symbols { public static void main (String[] args) { for (int i=1; i <=5; i++) { for (int k=1; k <=5-i; k++) { System.out.print("- "); } for (int j=1; j <=i; j++) { System.out.print("* "); } System.out.print("\n"); } } }
الهدف من هذا السؤال جعلك ترى أنك تستطيع أن تضع عدة حلقات بداخل بعض و ليس حلقتين فقط.
بشكل عام, في كل دورة من دورات الحلقة
i
سيحدث التالي:تنفيذ الحلقة
k
لطباعة الرموز-
.تنفيذ الحلقة
j
لطباعة الرموز*
.تنفيذ أمر الطباعة الموضوع بعد الحلقة
j
للنزول على سطر جديد بعد طباعة جميع الرموز الموجودة في كل سطر.
for (int i=1; i <=5; i++)
الحلقة i
تعني أنه يوجد 5 أسطر.
for (int k=1; k <=5-i; k++) { System.out.print("- "); }
الحلقة k
مرتبطة بعدد الأسطر و بالعداد i
.
هنا كلما زادت قيمة العداد i
كلما نقص عدد دورات الحلقة k
واحداً.
أي كلما إنتقلنا إلى سطر كلما نقص عدد الرموز -
واحداً. لذلك كانت النتيجة كالتالي:
في دورة الحلقة
i
الأولى, كانت قيمة العدادi
تساوي 1 فكان عدد دورات الحلقةk
يساوي 4. لذلك تم طباعة- - - -  
.في دورة الحلقة
i
الثانية, كانت قيمة العدادi
تساوي 2 فكان عدد دورات الحلقةk
يساوي 3. لذلك تم طباعة- - -    
.في دورة الحلقة
i
الثالثة, كانت قيمة العدادi
تساوي 3 فكان عدد دورات الحلقةk
يساوي 2. لذلك تم طباعة- -      
.في دورة الحلقة
i
الرابعة, كانت قيمة العدادi
تساوي 4 فكان عدد دورات الحلقةk
يساوي 1. لذلك تم طباعة-        
.
for (int j=1; j <=i; j++) { System.out.print("* "); }
الحلقة j
مرتبطة بالعداد i
.
هنا كلما زادت قيمة العداد i
واحداً كلما ازداد عدد دورات الحلقة j
واحداً أيضاً.
أي كلما إنتقلنا إلى سطر كلما ازداد عدد الرموز *
واحداً. لذلك كانت النتيجة كالتالي:
في دورة الحلقة
i
الأولى, كانت قيمة العدادi
تساوي 1 فكان عدد دورات الحلقةj
يساوي 1. لذلك تم طباعة        *
.في دورة الحلقة
i
الثانية, كانت قيمة العدادi
تساوي 2 فكان عدد دورات الحلقةj
يساوي 2. لذلك تم طباعة      * *
.في دورة الحلقة
i
الثالثة, كانت قيمة العدادi
تساوي 3 فكان عدد دورات الحلقةj
يساوي 3. لذلك تم طباعة    * * *
.في دورة الحلقة
i
الرابعة, كانت قيمة العدادi
تساوي 4 فكان عدد دورات الحلقةj
يساوي 4. لذلك تم طباعة  * * * *
.في دورة الحلقة
i
الخامسة, كانت قيمة العدادi
تساوي 5 فكان عدد دورات الحلقةj
يساوي 5. لذلك تم طباعة* * * * *
.
الحلقات المتداخلة في الخوارزميات - التمرين الثامن
أكتب نفس البرنامج السابق بطريقة ثانية, الشكل المطلوب رسمه هو التالي
public class Symbols { public static void main (String[] args) { for (int i=5; i>=1; i--) { for (int k=1; k <=i-1; k++) { System.out.print("- "); } for (int j=1; j <=5-i+1; j++) { System.out.print("* "); } System.out.print("\n"); } } }
بشكل عام, في كل دورة من دورات الحلقة
i
سيحدث التالي:تنفيذ الحلقة
k
لطباعة الرموز-
.تنفيذ الحلقة
j
لطباعة الرموز*
.تنفيذ أمر الطباعة الموضوع بعد الحلقة
j
للنزول على سطر جديد بعد طباعة جميع الرموز الموجودة في كل سطر.
for (int i=5; i>=1; i--)
الحلقة i
تعني أنه عندنا 5 أسطر.
لاحظ أننا جعلنا قيمة العداد i
تقل في كل دورة هذه المرة.
for (int k=1; k <=i-1; k++) { System.out.print("- "); }
الحلقة k
مرتبطة بالعداد i
.
هنا كلما نقصت قيمة العداد i
كلما نقص معها عدد دورات الحلقة k
.
أي كلما إنتقلنا إلى سطر كلما نقص عدد الرموز -
واحداً. لذلك كانت النتيجة كالتالي:
في دورة الحلقة
i
الأولى, كانت قيمة العدادi
تساوي 5 فكان عدد دورات الحلقةk
يساوي 4. لذلك تم طباعة- - - -  
.في دورة الحلقة
i
الثانية, كانت قيمة العدادi
تساوي 4 فكان عدد دورات الحلقةk
يساوي 3. لذلك تم طباعة- - -    
.في دورة الحلقة
i
الثالثة, كانت قيمة العدادi
تساوي 3 فكان عدد دورات الحلقةk
يساوي 2. لذلك تم طباعة- -      
.في دورة الحلقة
i
الرابعة, كانت قيمة العدادi
تساوي 2 فكان عدد دورات الحلقةk
يساوي 1. لذلك تم طباعة-        
.
for (int j=1; j <=5-i+1; j++) { System.out.print("* "); }
الحلقة j
مرتبطة بالعداد i
و عدد الأسطر.
هنا كلما نقصت قيمة العداد i
كلما ازداد عدد دورات الحلقة j
.
أي كلما إنتقلنا إلى سطر كلما ازداد عدد الرموز *
واحداً. لذلك كانت النتيجة كالتالي:
في دورة الحلقة
i
الأولى, كانت قيمة العدادi
تساوي 5 فكان عدد دورات الحلقةj
يساوي 1. لذلك تم طباعة        *
.في دورة الحلقة
i
الثانية, كانت قيمة العدادi
تساوي 4 فكان عدد دورات الحلقةj
يساوي 2. لذلك تم طباعة      * *
.في دورة الحلقة
i
الثالثة, كانت قيمة العدادi
تساوي 3 فكان عدد دورات الحلقةj
يساوي 3. لذلك تم طباعة    * * *
.في دورة الحلقة
i
الرابعة, كانت قيمة العدادi
تساوي 2 فكان عدد دورات الحلقةj
يساوي 4. لذلك تم طباعة  * * * *
.في دورة الحلقة
i
الخامسة, كانت قيمة العدادi
تساوي 1 فكان عدد دورات الحلقةj
يساوي 5. لذلك تم طباعة* * * * *
.
الحلقات المتداخلة في الخوارزميات - التمرين التاسع
إستخدم الحلقات لطباعة الشكل التالي
public class Symbols { public static void main (String[] args) { for (int i=1; i <=5; i++) { for (int k=1; k <=i-1; k++) { System.out.print("- "); } for (int j=1; j <=5-i+1; j++) { System.out.print("* "); } System.out.print("\n"); } } }
هذا البرنامج يعطيك نفس نتيجة البرنامج السابق و لكن بالمقلوب.
لاحظ أننا وضعنا نفس المعادلات للحلقتين
k
وj
و لكننا بدأنا الحلقةi
بالعكس ( أي من 1 إلى 5 ).هذا الذي جعلنا نحصل على نفس النتيجة و لكن مقلوبة, لأنه كأننا قلبنا الأسطر فقط.
for (int i=1; i <=5; i++)
الحلقة i
تعني أنه عندنا 5 أسطر.
لاحظ أننا جعلنا قيمة العداد i
تزيد في كل دورة هذه المرة.
for (int k=1; k <=i-1; k++) { System.out.print("- "); }
الحلقة k
مرتبطة بالعداد i
.
هنا كلما إزدادت قيمة العداد i
كلما إزداد معها عدد دورات الحلقة k
.
أي كلما إنتقلنا إلى سطر كلما إزداد عدد الرموز -
واحداً. لذلك كانت النتيجة كالتالي:
في دورة الحلقة
i
الثانية, كانت قيمة العدادi
تساوي 2 فكان عدد دورات الحلقةk
يساوي 1. لذلك تم طباعة-        
.في دورة الحلقة
i
الثالثة, كانت قيمة العدادi
تساوي 3 فكان عدد دورات الحلقةk
يساوي 2. لذلك تم طباعة- -      
.في دورة الحلقة
i
الرابعة, كانت قيمة العدادi
تساوي 4 فكان عدد دورات الحلقةk
يساوي 3. لذلك تم طباعة- - -    
.في دورة الحلقة
i
الخامسة, كانت قيمة العدادi
تساوي 5 فكان عدد دورات الحلقةk
يساوي 4. لذلك تم طباعة- - - -  
.
for (int j=1; j <=5-i+1; j++) { System.out.print("* "); }
الحلقة j
مرتبطة بالعداد i
و عدد الأسطر.
هنا كلما إزدادت قيمة العداد i
كلما نقص معها عدد دورات الحلقة j
.
أي كلما إنتقلنا إلى سطر كلما نقص عدد الرموز *
واحداً. لذلك كانت النتيجة كالتالي:
في دورة الحلقة
i
الأولى, كانت قيمة العدادi
تساوي 1 فكان عدد دورات الحلقةj
يساوي 5. لذلك تم طباعة* * * * *
.في دورة الحلقة
i
الثانية, كانت قيمة العدادi
تساوي 2 فكان عدد دورات الحلقةj
يساوي 4. لذلك تم طباعة  * * * *
.في دورة الحلقة
i
الثالثة, كانت قيمة العدادi
تساوي 3 فكان عدد دورات الحلقةj
يساوي 3. لذلك تم طباعة    * * *
.في دورة الحلقة
i
الرابعة, كانت قيمة العدادi
تساوي 4 فكان عدد دورات الحلقةj
يساوي 2. لذلك تم طباعة      * *
.في دورة الحلقة
i
الخامسة, كانت قيمة العدادi
تساوي 5 فكان عدد دورات الحلقةj
يساوي 1. لذلك تم طباعة        *
.
الحلقات المتداخلة في الخوارزميات - التمرين العاشر
إستخدم الحلقات لطباعة الشكل التالي
public class Symbols { public static void main (String[] args) { System.out.print("* \n"); for (int i=2; i <=7; i++) { System.out.print("* "); for (int k=1; k <=i-2; k++) { System.out.print("- "); } System.out.print("* \n"); } for (int j=1; j <=8; j++) { System.out.print("* "); } System.out.print("\n"); } }
الشكل الذي ننوي رسمه, قمنا بتقسيمه إلى ثلاث أجزاء:
جزء لم نستخدم فيه أي حلقة لرسمه.
جزء إستخدمنا حلقة واحدة لرسمه.
جزء إستخدمنا حلقة واحدة لرسمه.
ملاحظة: كان بإمككنا عدم تجزيء الشكل و التعامل معه كله دفعة واحدة لكننا كنا سنضطر لوضع شرط أو أكثر لنرسم السطر الأول و السطر الأخير.
System.out.print("* \n");
في السطر الأول من الشكل الذي ننوي رسمه لا داعي لوجود أي حلقة لذلك طبعنا الرمز *
مباشرةً.
for (int i=2; i <=7; i++) { System.out.print("* "); for (int k=1; k <=i-2; k++) { System.out.print("- "); } System.out.print("* \n"); }
من السطر الثاني و حتى السطر السابع من الشكل الذي ننوي رسمه. لاحظنا أنه يوجد معادلة ثابتة لرسمه و هي أن عدد الرموز -
في كل سطر يساوي قيمة العداد i
ناقص 2.
لذلك وجدنا أنه للحصول على هذا الشكل يجب أن نفعل التالي:
نقوم بطباعة الرمز
*
في بداية كل سطر.نستخدم الحلقة
k
لتحديد كل رمز-
سيتم طباعته.نقوم بطباعة الرمز
*
في نهاءة كل سطر.
for (int j=1; j <=8; j++) { System.out.print("* "); }
السطر الأخير في الشكل الذي ننوي رسمه, إستخدمنا فيه حلقة واحدة إسمها j
لطباعة الرمز *
ثمانية مرات.
إياك أن تحفظ طريقة حل هذه التمارين أو غيرها حفظا غيباً لأنك يجب أن تفهمهم فهماً جيداً و ليس حفظاً.
و كما رأيت في الدروس السابقة, يمكنك أن تكتب الكود بطرق عديدة و تحصل على نفس النتيجة.
لذلك إياك أن تجبر نفسك على حفظ كود معين و حرمان نفسك من تنمية قدراتك على التحليل لأنك إذا صبرت على نفسك فإنك ستجد الجواب في النهاية.
خلاصة: تستطيع دائماً التفكير بطريقتك الخّاصة و إذا حاولت كثيراً و لم تتوصل إلى الحل بنفسك, عندها حاول إيجاد حلول عن طريق البحث في جوجل أو إسأل أي شخص تشعر أن عنده خبرة عالية في البرمجة و التحليل و إطلب منه أن يعلمك طريقة الحل لا أن يعطيك الجواب مباشرةً.