انتقل إلى المحتوى الرئيسي

حلقة تكرار

مقدمة

توفر لغة Wave حلقات تكرار لمعالجة الحالات التي تحتاج إلى تنفيذ الشفرة نفسها عدة مرات. تستخدم حلقة التكرار لتشغيل الشفرة طوال تلبية شرط معين، أو لتكرار التشغيل لعدد محدد من المرات.

بهذا، يمكن تمثيل العمليات المتكررة بشفرة واضحة وبسيطة دون الحاجة إلى كتابة المنطق نفسه مرارًا وتكرارًا. تدعم Wave تكرار يعتمد على الشروط وتكرار يستند إلى عدد المرات، وتوفر أيضًا كلمات رئيسية للتحكم في تدفق التنفيذ أثناء التكرار.

في هذا القسم، يتم شرح كيفية استخدام عبارات while وfor، وأيضًا كيفية استخدام الكلمات المفتاحية break وcontinue للتحكم في تدفق التكرار.


حلقة while

تقوم عبارة while بتكرار تشغيل كتلة الشفرة طالما يتم تقييم العبارة الشرطية المعطاة على أنها صحيحة (true). عندما تصبح العبارة الشرطية خطأ (false)، يتوقف التكرار فورًا.

هذه الطريقة مناسبة للحالات التي لا يكون فيها عدد التكرار واضحًا، وتحتاج إلى التكرار حتى يتم استيفاء شرط معين.

الهيكل الأساسي

الهيكل الأساسي لعبارة while في Wave هو كما يلي.

while (condition) {
// رمز للتكرار
}

يجب تقييم العبارة الشرطية كنوع {}، ويمكنك كتابة أمر واحد أو أكثر داخل كتلة الشفرة المحاطة بالأقواس {}.

مثال: طباعة من 0 إلى 4

var i :i32 = 0;

while (i < 5) {
println("أنا {}.", i);
i = i + 1;
}

في هذا المثال، يتم تنفيذ التكرار طالما أن المتغير i أقل من 5. في كل تكرار، يتم طباعة القيمة الحالية وزيادة قيمة i بمقدار واحد لجعل الشرط يصبح في النهاية خاطئًا.


حلقة for

تعد حلقة for مناسبة لاستخدامها في الحالات التي يكون فيها عدد التكرار معروفًا نسبيًا. يمكنك تحديد القيمة الأولية والعبارة الشرطية وعبارة الزيادة في وقت واحد لتمثيل تدفق التكرار بوضوح.

نظرًا لجمع العناصر اللازمة للتحكم في التكرار في مكان واحد، يكون من السهل فهم هيكل التكرار في لمحة واحدة.

الهيكل الأساسي

for (init; condition; step) {
// رمز للتكرار
}

يدعم التهيئة الأولية في جملة for في Wave عدة أشكال.

  • تهيئة نوع var ضمنية
  • تهيئة إعلان var / let mut / const
  • تهيئة تعبير عامة (إعادة استخدام المتغير القائم)

المثال 1: تهيئة نوع ضمنية

for (i :i32 = 1; i <= 5; i += 1) {
println("i = {}", i);
}

المثال 2: تهيئة var / let mut

for (var i: i32 = 0; i < 3; i += 1) {
println("var i = {}", i);
}

for (let mut j: i32 = 0; j < 3; j += 1) {
println("let mut j = {}", j);
}

المثال 3: تهيئة قائمة على التعبير (إعادة استخدام المتغير القائم)

var i: i32 = 99;

for (i = 3; i <= 5; i += 1) {
println("i = {}", i);
}

println("after loop: {}", i); // 6

تعمل التهيئة الإعلانية (var، let mut، i :i32 = ...) كمتغير في سياق الحلقة، بينما تقوم التهيئة المعتمدة على التعبير (i = ...) بتحديث المتغير الخارجي نفسه.


حلقة تكرار متداخلة

يمكن كتابة حلقة تكرار داخل حلقة أخرى، ويُطلق على ذلك اسم حلقة التكرار المتداخلة. تكون الحلقة المتداخلة فعالة عند استعراض هياكل البيانات ثنائية الأبعاد أو معالجة تركيبات متعددة من الشروط.

مثال: حلقة while المزدوجة

var i :i32 = 0;

while (i < 3) {
var j :i32 = 0;

while (j < 2) {
println("i={}, j={}", i, j);
j = j + 1;
}

i = i + 1;
}

في هذا المثال، عند تنفيذ الجملة while الخارجية مرة واحدة، يتم تنفيذ جميع الجمل while الداخلية. يمكن معالجة التراكيب من النوع (i, j) بالتتابع من خلال ذلك.


عبارة break

تنهي جملة break الحلقة فوراً وتنقل مسار التنفيذ إلى خارج الحلقة المعنية. تُستخدم عندما لا يكون من الضروري الاستمرار في التكرار أثناء التنفيذ.

مثال: إنهاء التكرار في قيمة محددة

var i :i32 = 0;

while (true) {
if (i == 5) {
break;
}

println(i);
i = i + 1;
}

في هذا المثال، عندما يصبح i مساوياً لـ 5 داخل حلقة لانهائية، تُنفذ جملة break وتُنهي التكرار. جملة break تكون مفيدة لتحكم في التكرار بصرف النظر عن شرط التكرار ذاته.


عبارة continue

تتخطى جملة continue الكود المتبقي في التكرار الحالي وتبدأ التكرار التالي مباشرةً. تُستخدم عندما تريد تخطي جزء فقط من المنطق في حالة شرط محدد.

مثال: طباعة الأعداد الزوجية فقط

for (var i: i32 = 0; i <= 10; i = i + 1) {
if (i % 2 == 1) {
continue;
}

println(i);
}

في هذا الكود، عندما يكون i عدداً فردياً، تُنفذ جملة continue وتتخطى جزء الطباعة. والنتيجة هي أنه تُطبَع القيم الزوجية فقط.


ملخص

تم تصميم حلقة التكرار في Wave للتعبير بشكل طبيعي عن التكرار المستند إلى الشرط والتكرار المستند إلى العدد. تعتبر جملة while مناسبة للتكرار المستند إلى الشرط، بينما تكون جملة for مفيدة عند وضوح عدد التكرار وتدفقه.

عند استخدام break وcontinue معاً، يمكنك التحكم بدقة في تدفق التنفيذ أثناء التكرار، مما يساعد على بناء منطق تكرار أكثر دقة ومرونة.