حلقة While

يسار|تصغير|مخطط تدفق حلقة While
في معظم لغات برمجة الحاسوب، تُعد **حلقة تكرار "while"** إحدى تعبيرات تدفق التحكم ،إذ تُستخدم لتنفيذ الشيفرة بشكل متكرر بناءً على شرط منطقي معين.

ويمكن النظر إلى **حلقة while**على أنها تعبير شرطي **(if)** تتكرر باستمرار طالما ظل الشرط محققًا.

## ملخص
يتكون حلقة *while* من كتلة من التعليمات و شرط أو تعبير منطقي  يتم تقييم هذا الشرط أو التعبير، وإذا كان *صحيحًا* ،  يتم تنفيذ التعليمات الموجودة داخل الكتلة بالكامل. تستمر هذه العملية في التكرار حتى يصبح الشرط أو التعبير باطلاً . نظرًا لأن حلقة while تقوم بفحص الشرط قبل تنفيذ الكتلة، فإن هذه البنية تُعرف غالبًا بـ الحلقة **ذات الاختبار المسبق** (pre-test loop). قارن ذلك مع حلقة do while، التي تختبر الشرط بعد تنفيذ الكتلة البرمجية.

على سبيل المثال، في اللغات C وJava وC# و  Objective-C وC++ (التي تستخدم نفس بناء الجملة في هذه الحالة)، فإن قطعة الكود التالية..
```c
int x = 0;

while (x < 5) {
    printf ("x = %d\n", x);
    x++;
}
```
أولاً، يتم التحقق مما إذا كانت قيمة المتغير **x** أقل من 5، وهو أمر صحيح، لذلك يتم دخول **جسم الحلقة**، حيث يتم تنفيذ دالة **printf** ويُزاد قيمة **x** بمقدار 1. بعد الانتهاء من تنفيذ جميع التعليمات داخل جسم الحلقة، يتم فحص الشرط مرة أخرى، وهو (**x < 5**)، وإذا كان الشرط صحيحًا، تتكرر الحلقة، وتستمر هذه العملية حتى تصبح قيمة المتغير**x** تساوي 5.

في بعض الأحيان يكون الشرط دائمًا صحيحًا، وفي بعض الحالات يكون هذا مرغوبًا، وهذا يؤدي إلى تكرار حلقة لا متناهية .وإذا تم عمل هذا عن قصد، عادةً يكون هناك أمر آخر مثل **break** ليوقف الحلقة ويخرج منها.

على سبيل المثال:


```c
while (true) {
    // do complicated stuff
    if (someCondition)
        break;
    // more stuff
}
```


## عرض حلقات ''while''
ستقوم حلقات *while* هذه بحساب العاملي للرقم 5:

### ActionScript 3

```actionscript
var counter: int = 5;
var factorial: int = 1;

while (counter > 1) {
    factorial *= counter;
    counter--;
}

Printf("Factorial = %d", factorial);
```


### Ada

```ada
with Ada.Integer_Text_IO;

procedure Factorial is
    Counter   : Integer := 5;
    Factorial : Integer := 1;
begin
    while Counter > 0 loop
        Factorial := Factorial * Counter;
        Counter   := Counter - 1;
    end loop;

    Ada.Integer_Text_IO.Put (Factorial);
end Factorial;
```


### APL

```apl
counter ← 5
factorial ← 1

:While counter > 0
    factorial ×← counter
    counter -← 1
:EndWhile

⎕ ← factorial
```
أو ببساطة
```apl
!5
```


### AutoHotkey

```autohotkey
counter := 5
factorial := 1

While counter > 0
    factorial *= counter--

MsgBox % factorial
```


### Small Basic

```vbnet
counter = 5  ' Counter = 5
factorial = 1 ' initial value of variable "factorial"

While counter > 0
  factorial = factorial * counter
  counter = counter - 1
  TextWindow.WriteLine(counter)
EndWhile
```


### فيجوال بيسك

```vbnet
Dim counter As Integer = 5    ' init variable and set value
Dim factorial As Integer = 1  ' initialize factorial variable

Do While counter > 0
    factorial = factorial * counter
    counter = counter - 1
Loop     ' program goes here, until counter = 0

'Debug.Print factorial         ' Console.WriteLine(factorial) in Visual Basic .NET
```


### Bourne (Unix) shell

```bash
counter=5
factorial=1
while [ $counter -gt 0 ]; do
    factorial=$((factorial * counter))
    counter=$((counter - 1))
done

echo $factorial
```


### سي، سي++

```c
int main() {
    int count = 5;
    int factorial = 1;

    while (count > 1)
        factorial *= count--;

    printf("%d", factorial);
}
```


### لغة ترميز ColdFusion (CFML)

#### بناء جملة البرنامج النصي

```cfs
counter = 5;
factorial = 1;

while (counter > 1) {
    factorial *= counter--;
}

writeOutput(factorial);
```


#### بناء جملة العلامة

```cfm
<cfset counter = 5>
<cfset factorial = 1>
<cfloop condition="counter GT 1">
    <cfset factorial *= counter-->
</cfloop>
<cfoutput>#factorial#</cfoutput>
```


### فورتران

```fortran
program FactorialProg
    integer :: counter = 5
    integer :: factorial = 1

    do while (counter > 0)
        factorial = factorial * counter
        counter = counter - 1
    end do

    print *, factorial
end program FactorialProg
```


### Go
لغة Go لا تحتوي على عبارة while، لكنها توفر نفس الوظيفة من خلال استخدام عبارة for عند حذف بعض عناصرها.
```go
counter, factorial := 5, 1

for counter > 1 {
	counter, factorial = counter-1, factorial*counter
}
```


### جافا، سي شارب، دي
الكود الخاص بالحلقة هو نفسه في لـ Java وC# وD:
```csharp
int counter = 5;
int factorial = 1;

while (counter > 1)
    factorial *= counter--;
```


### جافا سكريبت

```javascript
let counter = 5;
let factorial = 1;

while (counter > 1)
    factorial *= counter--;

console.log(factorial);
```


### Lua

```lua
counter = 5
factorial = 1

while counter > 0 do
  factorial = factorial * counter
  counter = counter - 1
end

print(factorial)
```


### MATLAB, Octave

```matlab
counter = 5;
factorial = 1;

while (counter > 0)
  factorial = factorial * counter;   %Multiply
  counter = counter - 1;        %Decrement
end

factorial
```


### Mathematica

```mathematica
Block[{counter=5,factorial=1},  (*localize counter and factorial*)
    While[counter>0,            (*While loop*)
        factorial*=counter;     (*Multiply*)
        counter--;              (*Decrement*)
    ];

    factorial
]
```


### PowerShell

```powershell
$counter = 5
$factorial = 1

while ($counter) {
    $factorial *= $counter--
}

$factorial
```


## انظر أيضا

* حلقة For
* دالة عودية بدائية
* دالة تكرارية عامة
* LOOP (لغة برمجة) - لغة برمجة تتميز بأن الدوال التي يمكنها حسابها هي بالضبط الدوال التكرارية البدائية

تصنيف:مقارنة بين لغات البرمجة
تصنيف:تكرار في برمجة
تصنيف:تدفق السيطرة