**الحلقات في لغة الجافا** هي عباره عن طريقة تستخدم لتكرار ما بداخلها لعدد المرات المحددة من قبل المبرمج.

حلقة for
--------

حلقة for تعتبر من اعم الهياكل البنائية للحلقات في جافا والتي تدعم التكرار الذي يتحكم به عداد أو قيمه متغيره باستمرار بعد كل دوره من التكرار. الصورة التاليه توضح ان الشفرة البرمجيه ستقوم بطباعة الأرقام بشكل تصاعدي من 1 وحتى 10 باستخدام هذه الشفرة.

مثال على حلقة FOR
(++for(int i = 0; i<=10;i

(System.out.println(i
تعتبر الخلية الأولى خليه خاصه بالإنشاء حيث يتم إنشاء المتغيرات فيها واعطاء قيم مبدأيه لتلك المتغيرات اما الخلية الثانية فهي تبين الشرط الذي يجب اختباره قبل ان تنفذ الشفرة البرمجيه داخل الحلقة والخلية الثالثة هي التي يتم فيها تحديث القيم للمتغير.

في الحقيقة لغة جافا مشابهه للغة ++C من ناحية انها تقبل ان يتم وضع عمليات حسابيه في الخلايا الثلاث ولكنه قانون غير مكتوب لكونه يفتقد للإحساس السليم والذي ينص على أن الخلايا الثلاث يجب أن تحمل الإنشاء، الشرط والتحديث عوضا عن أي عمليات حسابيه أخرى. بشكل عام جافا لاتضع قيود كثيره على المبرمج فباستطاعته ان يكون التحديث تنازليا عوضا عن كونه تصاعدي في الصورة السابقة.

**تنبيه:**
احذر عندما تستخدم شرط المساواة مع العداد العشريه في الحلقات كالمثال التالي:
(++for (int I = 0; i!= 10; i شفره برمجيه كهذه قد تكون مستحيلة التوقف بسبب ان الاعداد التي تكون بعد الفاصلة قد لا تصل نهائيا للرقم المطلوب، فمثلا قد تصل الحلقة عن الرقم 9.999998 ثم وبعد تحديث القيمة تصبح 10.099998 وذلك لانه لا توجد قيمه برمجيه ثنائية Binary معينه لترمز للعدد 0.1 .

```
نطاق هذا المتغير يمتد حتى نهاية الجسم حلقة for:
```

(++for (int i = 1; i <= 10; i
{
.. .
}
// لم يعد يعرف هنا.

```
على وجه الخصوص، إذا قمت بتعريف متغير داخل بيان for لا يمكنك استخدام قيمة هذا المتغير خارج الحلقة لذلك، إذا كنت ترغب في استخدام القيمة النهائية للحلقة خارجها، تأكد أن يعلن أنه خارج رأس الحلقة.
```

int i
(++for (i = 1; i <= 10; i
{
.. .
}
// لا يزال يعرف هنا i

من ناحية أخرى، يمكنك تحديد المتغيرات بنفس الاسم في منفصلة عن الحلقات:

(++for (i = 1; i <= 10; i

{
.. .
}
.. .
(++for (int i = 11; i <= 20; i
//لا بأس بتعريف متغير آخر اسمهi
{
.. .
}

حلقة for هو مجرد اختصار مريح للحلقة while مثلا:
(--for (int i = 10; i > 0; i

(System.out.println("Counting down. .. "+ i
ويمكن إعادة كتابتها كما هنا،

int i = 10
(while (i > 0
{

(System.out.println("Counting down. .. "+ i
--i
}

على سبيل المثال برنامج يحسب فرص الفوز في اليانصيب، يجب عليك اختيار 6 أرقام من الأرقام من 1 إلى 50 حتى تفوز، ثم هناك (50 × 49 × 48 × 47 × 46 × 45)/(1 × 2 × 3 × 4 × 5 × 6) النتائج المحتملة، لذلك فرصتك هي 1 في 15890700. حظا سعيدا!
بشكل عام، إذا اخترت k أرقام من اصل n، فهناك

نتائج ممكنه، وفيما يلي حلقه for التاليه تحسب هذه القيمة.

int lotteryOdds = 1
(++for (int i = 1; i <= k; i

lotteryOdds = lotteryOdds \* (n - i + 1) / i

حلقة while
----------

حلقة while (في حين) ينفذ البيان «واللتي قد تكون مجموعة من البيانات» في حين (while) ان الجملة الشرطيه المذكورة بين قوسي الحلقة صحيحه الشكل العام لها هو:

```
     (الجملة الشرطيه)while
      البيان
```

حلقة while لن تنفذ ابدا إذا كان الشرط غير صحيح في البداية.كما هو موضح في الصورة المرفقة.

صوره توضيحيه لمراحل حلقة while
البرنامج الموجود في الأسفل يحدد كم من الوقت سيستغرق حفظ مبلغ معين من المال لجهود التقاعد اللتي استحقها المستخدم بجداره على افتراض انه يقوم بإيداع نفس المبلغ سنويا وان المال يكسب سعر الفائدة المحددة.

*. import java.util

```
/**
```

```
* This program demonstrates a while loop.
```

```
* @version 1.20 2004-02-10
```

```
* @author Cay Horstmann
```

```
*/
```

 public class Retirement

 }

 (public static void main(String[] args)

 }

 // read inputs

 ;(Scanner in = new Scanner(System.in)

 ;("?System.out.print("How much money do you need to retire

 ;()double goal = in.nextDouble

 ;("?System.out.print("How much money will you contribute every year

 ;()double payment = in.nextDouble

 ;(":%System.out.print("Interest rate in

 ;()double interestRate = in.nextDouble

 ;double balance = 0

 ;int years = 0

 // update account balance while goal isn't reached

 (while (balance < goal

 }

 // add this year's payment and interest

 ;balance += payment

 ;double interest = balance \* interestRate / 100

 ;balance += interest

 ;++years

 {

 ;(".System.out.println("You can retire in "+ years + "years

 {

 {

في المثال، نحن نقوم بزايدة العداد وتحديث المبلغ المتراكم حاليا وذلك يتم في جسم الحلقة ونستمر على هذا المنوال حتى يتجاوز إجمالي المبلغ المستهدف.

}(while (balance < goal

balance += payment
double interest = balance \* interestRate / 100
balance += interest
++years
(". System.out.println(years + "years
{

(لا تعتمد على هذا البرنامج لتخطيط مستحقات التقاعد الخاص بك، لقد تركنا القليل من الجماليات مثل التضخم ومتوسط العمر الخاص بك.)
حلقة while تختبر الجملة الشرطيه عند البداية «قبل جسم الحلقة». لذلك، قد لا يتم تنفيذ العمليات البرمجية لهذه الحلقة بتاتا.
إذا كنت ترير تأكيد ان الكتلة البرمجيه ستعمل على الأقل مره واحده، سوف تحتاج إلى نقل الجملة الشرطيه للأسفل.

حلقه do..while
--------------

هذا النوع من الحلقات ينقذ الجملة (والذي عادة ما بكون مجموعة من الجُمَل) وبعد ذلك فقط يتم اختبار الشرط. بعد ذلك يكرر الجملة ويختبر الشرط ثانيةً، وهلم جراً. الشفرة البرمجية التالية 4-3 تحسب الرصيد الجديد في حساب التقاعد الخاص بك ثم يسال إذا كنت على استعداد للتقاعد:

do

}

balance += payment
double interest = balance \* interestRate / 100
balance += interest
++year
// طباعة الرصيد الحالي
.. .

// يسأل إذا كان مستعدا لأخذ واسترجاع المدخل
.. .

{

(("while (input.equals("N
سوف يتم تكرار الحلقة طالما اجابة المستخدم"N"، (انظر الشكل).

مثال على حلقة do-while
هذا البرنامج هو مثال جيد للحلقة المُراد تكرارها مرة واحدة على الأقل، لأن المستخدم يريد أن يعلم الرصيد قبل ان يقرر إذا كان كافي للتقاعد.

import java.util.\*;

Public class Retirement2 {

public static void main(String[] args)
{
Scanner in = new Scanner (System.in);

System.out.print("Hou much money will you contribute every year?");

double payment = in.nextDouble();

System.out.print("Interest rate in % : ");

double interestRate = in.nextDouble();

double balance = 0;

int year = 0;

String input;

// سيتم تحديث الرصيد طالما المستخدم غير مستعد لاسترجاعه

do
{

//add this year's payment and interest

balance += payment;

double interest = balance \* interestRate / 100;

balance += interest;

year++;

//طباعة الرصيد الحالي

System.out.printf("After year %d, your balance is %,.2f%n", year, balance);

// يسال المستخدم هل إذا كان مستعدا لأخد واسترجاع المدخل

System.out.print("Ready to retire? (Y/N)");

input = in.next();

}
while(input.equals('N')));

}

}

مصادر
-----

* Horstmann, Cay S. 1959- Core Java Volume 1 Fundamentals 8th edition - chapter 3

* أيقونة بوابةبوابة برمجة الحاسوب