مقدمة
كانت برامجنا الأولى عبارة عن سلسلة من التعليمات التي تم تنفيذها واحدة تلو الأخرى. لا الشوك. هذا هو HelloWorld، الذي يقوم بإخراج عبارة ترحيب وحسابات حسابية إلى وحدة التحكم. بعد البرامج الأولى، تعلمنا التفرع، أي أن البرنامج يقوم بإجراءات معينة حسب الظروف. إليك كيفية ترميز مكيف الهواء لتشغيله للتدفئة والتبريد:if (tempRoom>tempComfort)
airConditionerOn();
if (tempRoom<tempComfort
heaterOn();
لنأخذ الخطوة التالية. في الحياة اليومية، غالبًا ما نقوم بإجراءات رتيبة ومتكررة، على سبيل المثال، تقشير التفاح للحصول على فطيرة. ويمكن وصف هذه العملية الرائعة على النحو التالي:
-
إذا كان هناك تفاح في الحوض، فاتبع الخطوات من 1.1 إلى 1.4:
- 1.1. خذ تفاحة
- 1.2. تنظيفها وقطعها إلى شرائح
- 1.3. ضعيها على قاعدة فطيرة المعجنات في مقلاة
- 1.4. دعنا نعود إلى الخطوة 1.
- دعونا نلزم أنفسنا بعدد التفاح، ولكن إذا كان لدينا عدد قليل منها، فسيتم تنفيذ بعض الأوامر عبثًا دون "حمولة" (وربما نجرح أنفسنا أثناء تقشير تفاحة غير موجودة).
- إذا كان عدد التفاح أكبر من عدد فرق المعالجة لدينا، فلن تتم معالجة بعض المنتجات.
- يصعب قراءة مثل هذا "الكود" ويحتوي على الكثير من التكرار ويصعب تعديله.
الحلقات هي عوامل تنفيذ الإجراءات عدة مرات.
تعمل حلقة Java while (الحلقة الدنيئة) بشكل جيد في حالتنا. ينظم هذا التصميم إجراءات متعددة في بنية موجزة ومفهومة. قد تبدو خوارزمية تقطيع التفاح لعمل فطيرة في Java كما يلي:while(числоЯблокВТазике>0) {
яблоко = тазик.взятьОчередноеЯблоко();
положитьВПирог(яблоко.чистить().нарезать());
числоЯблокВТазике--;//-- this is a decrement, reduces the number of apples by one
}
System.out.println('Apples for the pie are processed.');
بناء جملة الأمر
الطريقة الأولى لوصف بيان while هي كما يلي:while(Логическое выражение) {
// Loop body - periodically executed statement(s)
}
ويتم ذلك على النحو التالي (خطوة بخطوة):
- نقوم بتقييم الشرط المنطقي الذي يتبع الوقت بين قوسين.
- إذا كان الشرط المنطقي صحيحًا، فسيتم تنفيذ العوامل في نص الحلقة، بعد تنفيذ العامل الأخير في نص الحلقة، انتقل إلى الخطوة 1
- إذا كان الشرط المنطقي خاطئًا، فانتقل إلى العبارة الأولى خارج الحلقة while.
حلقة مع شرط مسبق
نظرًا لأنه قبل تنفيذ جسم الحلقة، فإننا دائمًا نحسب مسبقًا تعبيرًا منطقيًا (شرط الدخول إلى الحلقة)، وغالبًا ما يُطلق على هذا النوع من الوقت حلقة ذات شرط مسبق. دعونا نبني جدولًا للأعداد الصحيحة العشرة الأولى، والقوى الإيجابية لعدد ما:public static void main(String[] args) {
int number = 3; // Number to be raised to a power
int result = 1; // Result of exponentiation
int power = 1; // Initial exponent
while(power <= 10) { // loop entry condition
result = result * number;
System.out.println(number + "to the extent" + power + " = " + result);
power++;
}
}
نتيجة إخراج وحدة التحكم:
3 в степени 1 = 3
3 в степени 2 = 9
3 в степени 3 = 27
3 в степени 4 = 81
3 в степени 5 = 243
3 в степени 6 = 729
3 в степени 7 = 2187
3 в степени 8 = 6561
3 в степени 9 = 19683
3 в степени 10 = 59049
Process finished with exit code 0
حلقة مع الشرط اللاحق
النوع الثاني من الدورة:do {
// Loop body - periodically executed statement(s)
}while (Логическое выражение);
يتم تنفيذه على النحو التالي (الخطوات):
- يتم تنفيذ نص الحلقة (مباشرة بعد الكلمة الأساسية do).
- نقوم بتقييم الشرط المنطقي الذي يتبع الوقت بين قوسين.
- إذا كان الشرط المنطقي صحيحا، فانتقل إلى الخطوة 1
- إذا كان الشرط المنطقي خاطئًا، فانتقل إلى العبارة الأولى خارج الحلقة while.
public static void main(String[] args) {
int number = 3;// Number to be raised to a power
int result = number;// Result of exponentiation
int power = 1;// Initial exponent
do {
System.out.println(number + "to the extent" + power + " = " + result);
power++;
result = result * number;
}while (result < 10000); // loop exit condition
نتيجة إخراج وحدة التحكم:
3 в степени 1 = 3
3 в степени 2 = 9
3 в степени 3 = 27
3 в степени 4 = 81
3 в степени 5 = 243
3 в степени 6 = 729
3 в степени 7 = 2187
3 в степени 8 = 6561
Process finished with exit code 0
انتبه إلى التغييرات في الكود، ومقارنتها بإصدار الحلقة بشرط مسبق.
حقائق مثيرة للاهتمام حول العمل مع الحلقات
أوامر التحكم في نص الحلقة
هناك أمران يؤثران على تقدم الحلقة: Break، والذي سنعرض ميزاته في الفصل التالي، و- متابعة - يوقف تنفيذ نص الحلقة الحالية وينتقل إلى التعبير المنطقي لعامل التشغيل while. إذا كان التعبير المحسوب صحيحًا، فسيستمر تنفيذ الحلقة.
- فاصل - يوقف تنفيذ الحلقة الحالية فورًا وينتقل إلى الأمر الأول خارجها. وبالتالي، يتم مقاطعة تنفيذ الحلقة الحالية. وسوف ننظر في ذلك بمزيد من التفصيل في الموضوع التالي.
continue
:
while(числоЯблокВТазике>0) {
яблоко = тазик.взятьОчередноеЯблоко();
числоЯблокВТазике--;//-- this is a decrement, reduces the number of apples by one
if (яблоко.плохое()) { // method will return true for rotten, etc. apples
яблоко.выкинутьВМусор();
continue; // continue the loop, go to the condition number ofApplesIn the Basin>0
}
положитьВПирог(яблоко.чистить().нарезать());
}
غالبًا ما يتم استخدام البناء
continue
عندما يكون من الضروري في جسم الحلقة تنفيذ الأوامر عند حدوث حالة معينة، على سبيل المثال، لتنفيذ إجراءات عند تشغيل جهاز استشعار في الجهاز (وإلا فما عليك سوى مواصلة دورة قراءة مؤشراته) أو لحساب تعبير فقط في خطوات معينة من الدورة. مثال على الحالة الأخيرة هو الحساب في حلقة زمنية لمجموع مكعبات الأعداد الطبيعية التي يكون مربعها أقل من عددها:
public static void main(String[] args) {
int sum = 0; // total amount
int i = 0; // starting number of the row
int count = 20; // amount of numbers
while(i<=count) {
i++; // take the next number, i++ is equivalent to i=i+1
if (i*i<=count) // if the square of the number is less
continue; // number of numbers - do not count the sum
// move on to the next number in the loop
sum += i*i*i; // otherwise, we calculate the sum of cubes of numbers
} // sum += i*i*i - notation similar to sum = sum + i*i*i
System.out.println(sum);// print result
}
دورة لا نهاية لها
غالبًا ما يتم استخدام أوامر التحكم هذه في حلقة لا نهائية. ويسمى هذا لأن شرط الخروج المنطقي لم يتم استيفاءه أبدًا. في الكود يبدو شيء مثل:while(true) {
// Loop body
}
في هذه الحالة، سيكون من المفيد استخدام أمر
break
لتنظيم الخروج منه . يحدث هذا النوع من الحلقات عند انتظار الظروف الخارجية التي تتشكل خارج منطق جسم الحلقة. على سبيل المثال، في الألعاب التي تحاكي العالم الافتراضي حول البطل (الخروج من الحلقة = الخروج من اللعبة)، أنظمة التشغيل. أو عند استخدام الخوارزميات، ربما تحسين النتيجة مع كل استدعاء لاحق في الحلقة، ولكن مع تقييدها بالوقت أو حدوث حدث خارجي (لعبة الداما أو الشطرنج أو التنبؤ بالطقس). يجب أن نتذكر أنه في ظل الظروف العادية، تعد الحلقات التي لا نهاية لها إحدى مشاكل عدم استقرار البرنامج. للتوضيح، دعونا نعود إلى قوى الأعداد:
public static void main(String[] args) {
int number = 3; // Number to be raised to a power
int result = 1; // Result of exponentiation
int power = 1; // Initial exponent
while(true) {
result = result * number;
System.out.println(number + "to the extent" + power + " = " + result);
power++;
if (power>10)
break; // exit from the loop
}
}
نتيجة إخراج وحدة التحكم:
3 в степени 1 = 3
3 в степени 2 = 9
3 в степени 3 = 27
3 в степени 4 = 81
3 в степени 5 = 243
3 в степени 6 = 729
3 в степени 7 = 2187
3 в степени 8 = 6561
3 в степени 9 = 19683
3 в степени 10 = 59049
Process finished with exit code 0
حلقات متداخلة
هنا نأتي إلى الموضوع الأخير حول دوراتنا. دعونا نفكر في فطيرة التفاح (نأمل ألا تكون جائعًا في الوقت الحالي) و"الحلقة" الخاصة بنا:-
إذا كان هناك تفاح في الحوض، اتبع الخطوات من 1.1 إلى 1.4:
- 1.1. خذ تفاحة
- 1.2. تنظيفها وقطعها إلى شرائح
- 1.3. ضعيها على قاعدة فطيرة المعجنات في مقلاة
- 1.4. دعنا نعود إلى الخطوة 1.
- عدد الشرائح = 0
-
بينما يكون عدد الشرائح < 12، اتبع الخطوات من 2.1 إلى 2.3
- 2.1. قطع شريحة أخرى من التفاح
- 2.2. عدد الشرائح ++
- 2.3. العودة إلى الخطوة 2
-
إذا كان هناك تفاح في الحوض، فاتبع الخطوات من 1.1 إلى 1.6:
- 1.1. خذ تفاحة
- 1.2. قشر تشغيله
- 1.3. عدد الشرائح = 0
- 1.4. Пока число долек < 12, выполнить шаги с 1.4.1 по 1.4.3
- 1.4.1. Отрезать очередную дольку от яблока
- 1.4.2. Кол-во долек ++ 1.4.3. Возвращаемся на шаг 1.4
- 1.5. Помещаем дольки на тестовое основание пирога из теста на сковороде
- 1.6. Возвращаемся на шаг 1.
public static void main(String[] args) {
// Display the values of the second multiplier in the line
System.out.println(" 2 3 4 5 6 7 8 9");
int i = 2; // first multiplier, assign starting value
while(i<10) { // First loop, execute while the first multiplier is less than 10
System.out.print(i + " | ");// Display the first multiplier at the beginning of the string
int j = 2; // second multiplier, starting value
while (j<10) { // Second loop, execute while the second multiplier is less than 10
int mul=i*j; // Calculate the product of factors
if (mul<10) // If it contains one digit, print two spaces after it
System.out.print(mul + " ");
else // otherwise output the product and after it - one space
System.out.print(mul + " ");
j++; // Increase the second multiplier by one,
} // Go to the beginning of the second loop (while (j<10 ).... )
System.out.println(); // Move to the next line of output
i++; // Increase the first multiplier by one,
} // Go to the beginning of the first loop (while ( i<10 ) ....
}
Результат вывода на консоль:
2 3 4 5 6 7 8 9
2 | 4 6 8 10 12 14 16 18
3 | 6 9 12 15 18 21 24 27
4 | 8 12 16 20 24 28 32 36
5 | 10 15 20 25 30 35 40 45
6 | 12 18 24 30 36 42 48 54
7 | 14 21 28 35 42 49 56 63
8 | 16 24 32 40 48 56 64 72
9 | 18 27 36 45 54 63 72 81
Process finished with exit code 0
Циклы (в частности, оператор while) – один из фундаментальных кирпичиков построения программ. Решая задачи на JavaRush, вы изучите все их разнообразие, разберёте тонкости функционирования и получите практические навыки их применения.
GO TO FULL VERSION