مقدمة لدرس التعبيرات الشرطية if statements في لغة برمجة Dart:
تُعتبر التعبيرات الشرطية من أهم المفاهيم في علم البرمجة، حيث تسمح للمطورين بتنفيذ سيطرة منطقية على تدفق البرنامج بناءً على قيم محددة. تُستخدم تعبيرات الشرطية لاتخاذ قرارات داخل البرنامج بناءً على حالات محددة تواجهها البرنامج أثناء التشغيل.
في هذا الدرس سنتناول مفهوم التعبير الشرطي if وكيفية استخدامه لتنفيذ قرارات مختلفة بناءً على قيم محددة. سنقوم أيضًا بمناقشة الاستخدامات الشائعة لتعبيرات الشرطية والتقنيات المتقدمة المتعلقة بها.
سيتم تغطية المواضيع التالية في هذا الدرس:
مفهوم التعبير الشرطي if وكيفية استخدامه في تحديد تدفق البرنامج.
استخدام التعبير الشرطي if مع else لتنفيذ قرارات بديلة.
تعبيرات الشرطية المتعددة باستخدام else if.
استخدام التعبير الشرطي المشروط else if للتحقق من عدة شروط متزامنة.
التعامل مع حالات الشرط المعقدة باستخدام المشغل الثلاثي و Cascade notation.
سيتيح لك هذا الدرس فهمًا أعمق لتعبيرات الشرطية في Dart واستخداماتها المختلفة في تطوير البرمجيات.
التعبيرات الشرطية في لغة Dart تستخدم لتنفيذ قطع معينة من الكود بناءً على تقييم شرط معين. وأحد أكثر الطرق شيوعًا لتحقيق ذلك هو استخدام التعبير “if”.
في جافا سكريبت، تتمثل هذه الهيكلة في استخدام “if” بالتالي:
if (condition) { // الكود الذي يتم تنفيذه إذا كانت الشرط صحيحة } else { // الكود الذي يتم تنفيذه إذا كان الشرط غير صحيح }
أيضا يمكنك استخدام else if إذا كان لديك شروط إضافية تريد فحصها بعد الشرط الأول.
if (condition1) { // الكود الذي يتم تنفيذه إذا كانت الشرط الأول صحيحة } else if (condition2) { // الكود الذي يتم تنفيذه إذا كان الشرط الثاني صحيح } else { // الكود الذي يتم تنفيذه إذا كانت كل الشروط غير صحيحة }
يمكن أيضًا استخدام التعبير الشرطي داخل تعبير آخر، مثل:
var result = (condition) ? value1 : value2;
هنا، إذا كانت الشرط صحيحة، سيتم استخدام value1، وإلا سيتم استخدام value2.
سنقوم بكتابة برنامج بسيط باستخدام تعبيرات if في لغة Dart.
سنقوم بكتابة برنامج يقوم بتحديد ما إذا كان العمر الذي يدخله المستخدم يجعله مؤهلاً للتصويت أم لا.
هذا سيكون برنامجًا تفاعليًا يطلب من المستخدم إدخال عمره، ثم يعيد ما إذا كان يمكن للشخص التصويت أم لا.
ها هو الكود:
import 'dart:io'; void main() { // طلب من المستخدم إدخال العمر print('ما هو عمرك؟'); int age = int.parse(stdin.readLineSync()!); // فحص الشرط إذا كان العمر أكبر من أو يساوي 18 if (age >= 18) { print('لديك $age سنة، يمكنك التصويت!'); } else { print('لديك $age سنة، آسف، لا يمكنك التصويت!'); } }
:Dart with else if to handle multiple conditions
في لغة Dart، يمكن استخدام التعبير “else if” لمعالجة عدة شروط متعددة بشكل تسلسلي. هذا يسمح بتحديد التصرف المناسب بناءً على الشرط الذي يتم تحقيقه.
هناك بنية عامة لاستخدام “else if” تشبه الهيكل التالي:
if (condition1) { // الكود الذي يتم تنفيذه إذا كانت الشرط 1 صحيحة } else if (condition2) { // الكود الذي يتم تنفيذه إذا كانت الشرط 2 صحيحة } else if (condition3) { // الكود الذي يتم تنفيذه إذا كانت الشرط 3 صحيحة } else { // الكود الذي يتم تنفيذه إذا لم تتحقق أي شروط سابقة }
توجد قائمة من الشروط، حيث يتم فحص كل شرط بعد الآخر. إذا تم تحقيق أي شرط، يتم تنفيذ الكود المرتبط بهذا الشرط، ويتم تجاهل الشروط الباقية. إذا لم يتم تحقيق أي شرط، يتم تنفيذ الكود في الجزء النهائي (الذي يتبع “else”).
هذا يسمح بتنظيم التفاعلات المعقدة ومعالجة سيناريوهات متعددة بطريقة منظمة ومفهومة. تستخدم هذه الهيكلة عادة في البرمجة عندما يكون هناك العديد من السيناريوهات المحتملة التي يجب معالجتها وفقًا لشروط مختلفة.
لنقم بكتابة برنامج بسيط في Dart يستخدم التعبير “else if” للتعامل مع عدة شروط مختلفة. سنقوم بكتابة برنامج يطلب من المستخدم إدخال درجته ويطبع النص المناسب حسب الدرجة المدخلة.
ها هو البرنامج:
import 'dart:io'; void main() { print('الرجاء إدخال درجتك: '); int grade = int.parse(stdin.readLineSync()!); if (grade >= 90) { print('تم تقديرك بدرجة "أ"'); } else if (grade >= 80) { print('تم تقديرك بدرجة "جيد جدًا"'); } else if (grade >= 70) { print('تم تقديرك بدرجة "جيد"'); } else if (grade >= 60) { print('تم تقديرك بدرجة "مقبول"'); } else { print('للأسف، لم تتجاوز الامتحان.'); } }
(condition) ? expression1 : expression2
هنا، يتم تقييم الشرط أولاً. إذا كان الشرط صحيحًا، يتم تقييم expression1 ويتم استخدام قيمتها. إذا كان الشرط غير صحيح، يتم تقييم expression2 ويتم استخدام قيمتها بدلاً من ذلك.
int x = 10; int y = 20; int max = (x > y) ? x : y; print('العدد الأكبر هو: $max');
في هذا المثال، يتم تعيين قيمة المتغير max باستخدام المشغل الثلاثي. إذا كانت قيمة x أكبر من قيمة y، سيتم استخدام قيمة x، وإلا سيتم استخدام قيمة y. في النهاية، سيتم طباعة العدد الأكبر.
سنقوم بكتابة تطبيق بسيط في Dart يستخدم المشغل الثلاثي لتحديد ما إذا كان العدد الذي يقوم المستخدم بإدخاله يعتبر فرديًا أم زوجيًا.
import 'dart:io'; void main() { print('الرجاء إدخال عدد صحيح: '); int number = int.parse(stdin.readLineSync()!); // استخدام المشغل الثلاثي لتحديد ما إذا كان العدد فرديًا أم زوجيًا String result = (number % 2 == 0) ? 'زوجي' : 'فردي'; print('العدد $number هو $result.'); }
Types of if statements in dart
في لغة برمجة Dart، هناك عدة أنواع من التعبيرات الشرطية (if statements) التي يمكن استخدامها لتحقيق الشروط المختلفة. فيما يلي أهم أنواع التعبيرات الشرطية في Dart:
هذا هو التعبير الأساسي والأكثر استخدامًا. يتحقق الشرط وإذا كان صحيحًا، يتم تنفيذ الكود المحدد.
if (condition) { // الكود المنفذ إذا كان الشرط صحيحًا }
يتحقق الشرط وإذا كان صحيحًا، يتم تنفيذ كود معين، وإلا فإن الكود الآخر يتم تنفيذه.
if (condition) { // الكود المنفذ إذا كان الشرط صحيحًا } else { // الكود المنفذ إذا كان الشرط غير صحيح }
يتحقق الشرط الأول وإذا كان صحيحًا، يتم تنفيذ كود معين، وإلا فإنه يتحقق من شروط أخرى بالتسلسل، وإذا تم تحقيق شرط ما، يتم تنفيذ الكود المرتبط به، وإذا لم يتم تحقيق أي شرط، يتم تنفيذ الكود الأخير.
if (condition1) { // الكود المنفذ إذا كان الشرط الأول صحيحًا } else if (condition2) { // الكود المنفذ إذا كان الشرط الثاني صحيحًا } else { // الكود المنفذ إذا لم يتم تحقيق أي شرط سابق }
هذه هي أهم أنواع التعبيرات الشرطية في Dart، وتستخدم لتحقيق شروط مختلفة وتنفيذ السيطرة على تدفق البرنامج وفقًا للظروف المختلفة.
طبقًا لذلك، سنقوم بكتابة تطبيق بسيط في Dart يستخدم كل نوع من أنواع التعبيرات الشرطية، وهذا يتيح لنا فهم كيفية استخدام كل نوع بشكل ملائم. سنقوم بتطبيق يسأل المستخدم عن عمره، ثم يقوم بتقديم تقدير حول ما إذا كان يمكنه القيادة أو لا.
هذا البرنامج سيستخدم التعبير if البسيط، والتعبير if-else، والتعبير if-else if-else.
import 'dart:io'; void main() { // التعبير if البسيط print('ما هو عمرك؟'); int age = int.parse(stdin.readLineSync()!); if (age >= 18) { print('لديك $age سنة، يمكنك القيادة.'); } // التعبير if-else print('ما هو عمرك؟'); int age2 = int.parse(stdin.readLineSync()!); if (age2 >= 18) { print('لديك $age2 سنة، يمكنك القيادة.'); } else { print('لديك $age2 سنة، لا يمكنك القيادة.'); } // التعبير if-else if-else print('ما هو عمرك؟'); int age3 = int.parse(stdin.readLineSync()!); if (age3 >= 18) { print('لديك $age3 سنة، يمكنك القيادة.'); } else if (age3 >= 16) { print('لديك $age3 سنة، يمكنك الحصول على رخصة قيادة للسيارة.'); } else { print('لديك $age3 سنة، يجب عليك الانتظار قليلاً قبل القيادة.'); } }
نستخدم التعبير if البسيط لتحقق من عمر المستخدم وإذا كان 18 سنة أو أكثر، نقول له أنه يمكنه القيادة.
نستخدم التعبير if-else لتقديم رسالة تبين ما إذا كان المستخدم يمكنه القيادة أو لا استنادًا إلى عمره.
نستخدم التعبير if-else if-else لتوفير مزيد من التفصيل. يمكن للمستخدم الحصول على رخصة القيادة إذا كان عمره 16 سنة أو أكثر، وإذا كان 18 سنة أو أكثر، يمكنه القيادة، وإلا فسيجب عليه الانتظار.
بعد كتابة البرنامج، يمكنك تشغيله لاختبار كل نوع من أنواع التعبيرات الشرطية ورؤية كيف يؤدي كل منها في حالات مختلفة.
المشغل الثلاثي (Ternary Operator) في لغة البرمجة هو نوع من العوامل التي تسمح للمبرمج بكتابة تعبيرات شرطية بشكل مختصر. وهو يعتبر مكونًا هامًا في البرمجة لأنه يسمح بكتابة تعبيرات if-else بطريقة أقصر وأكثر إيجازًا.
(condition) ? expression1 : expression2
يكون هذا الجزء هو الشرط الذي يتم فحصه. إذا كان الشرط صحيحًا (true)، سيتم تقييم expression1.
هذا هو التعبير الذي يتم تقييمه واستخدامه إذا كان الشرط صحيحًا.
هذا هو التعبير الذي يتم تقييمه واستخدامه إذا كان الشرط غير صحيح.
عند استخدام المشغل الثلاثي، يتم تقييم الشرط أولاً. إذا كان الشرط صحيحًا، يتم استخدام التعبير الأول، وإلا يتم استخدام التعبير الثاني.
int result = (x > y) ? x : y;
في هذا المثال، إذا كانت قيمة x أكبر من قيمة y، سيتم تعيين قيمة result بقيمة x، وإلا ستتم تعيينها بقيمة y.
استخدام المشغل الثلاثي يعزز قراءة الكود ويجعله أقصر، ولكن يجب استخدامه بحذر للحفاظ على قابلية الفهم للكود.
لنقم بكتابة تطبيق بسيط في Dart يستخدم المشغل الثلاثي لتحديد ما إذا كان العدد الذي يقوم المستخدم بإدخاله يعتبر فرديًا أم زوجيًا.
import 'dart:io'; void main() { print('الرجاء إدخال عدد صحيح: '); int number = int.parse(stdin.readLineSync()!); // استخدام المشغل الثلاثي لتحديد ما إذا كان العدد فرديًا أم زوجيًا String result = (number % 2 == 0) ? 'زوجي' : 'فردي'; print('العدد $number هو $result.'); }
conditional expressions using ??:
التعبيرات الشرطية باستخدام المشغل الشرطي المزدوج ?? تُستخدم في لغة Dart لتوفير قيم افتراضية في حالة عدم وجود قيمة لمتغير معين. يُعرف هذا المشغل باسم “null-aware operator” أو “null coalescing operator”.
expression1 ?? expression2
هنا expression1 هي القيمة التي ستتم استخدامها إذا كانت غير null،
وexpression2 هي القيمة التي ستُستخدم إذا كانت expression1 تقدم قيمة null.
مثال:
String name; String displayName = name ?? 'Guest'; print(displayName); // إذا كانت name تقدم قيمة null، سيتم طباعة 'Guest'
في هذا المثال، إذا كانت قيمة name تعيد null، فسيتم استخدام القيمة ‘Guest’ بدلاً من ذلك.
يساعد هذا المشغل في توفير قيم افتراضية أو تفادي الأخطاء عند العمل مع القيم التي قد تكون null.
سنقوم بكتابة تطبيق بسيط في Dart يستخدم التعبيرات الشرطية باستخدام المشغل الشرطي المزدوج ?? لتحديد قيمة افتراضية لمتغير إذا كانت قيمته null.
فلنفترض أن لدينا تطبيقًا يطلب من المستخدم إدخال اسمه ومن ثم يقوم بطباعة اسم المستخدم. إذا لم يقم المستخدم بإدخال أي اسم، سنقوم باستخدام اسم افتراضي “Guest”.
import 'dart:io'; void main() { // طلب اسم المستخدم stdout.write('الرجاء إدخال اسمك: '); String Name = stdin.readLineSync(); // استخدام التعبير الشرطي لتحديد قيمة افتراضية String displayName = Name ?? 'Guest'; // طباعة اسم المستخدم print('مرحبًا، $displayName!'); }
نستخدم stdout.write() لطلب اسم المستخدم من خلال إظهار رسالة بدون إضافة سطر جديد.
نستخدم stdin.readLineSync() لقراءة الاسم الذي أدخله المستخدم.
بعد ذلك، نستخدم التعبير الشرطي ?? لتحديد قيمة افتراضية لاسم المستخدم. إذا كان الاسم المدخل غير null، سيتم استخدامه، وإلا سيتم استخدام القيمة الافتراضية “Guest”.
أخيرًا، نقوم بطباعة رسالة ترحيبية تحتوي على اسم المستخدم.
بعد كتابة البرنامج، يمكنك تشغيله واختباره عن طريق إدخال اسم المستخدم، وسيقوم البرنامج بطباعة رسالة ترحيبية مع اسم المستخدم. إذا لم يتم إدخال أي اسم، سيتم استخدام القيمة الافتراضية “Guest”.
تعتبر Cascade notation وهي تقنية تستخدم في لغة برمجة Dart (وأيضًا في بعض اللغات الأخرى) لتسهيل تحديث عدة خصائص لكائن واحد بشكل متتالي. يتم ذلك باستخدام علامة النقطة (.) والتي تمكن المبرمج من تطبيق سلسلة من العمليات على الكائن الأصلي دون الحاجة إلى إعادة الإشارة إليه مرارًا وتكرارًا.
إذا تم استخدام Cascade notation مع تعبير if، فإنه يمكن أن يتيح لنا تحديث خصائص الكائن بناءً على شرط محدد.
فلنفترض أن لدينا كائنًا يمثل شخصًا، ونريد تحديث بعض السمات الخاصة به استنادًا إلى شرط معين.
class Person { String name; int age; Person(this.name, this.age); void updateAge(int newAge) { age = newAge; } } void main() { var person = Person('John', 30); // Cascade notation مع if statement if (person.age > 25) { person ..updateAge(40) ..name = 'John Doe'; } print('Name: ${person.name}, Age: ${person.age}'); }
في هذا المثال، نقوم بإنشاء كائن Person وتعيين اسم وعمر افتراضيين. ثم نستخدم التعبير if لفحص إذا كان العمر أكبر من 25 عامًا. إذا كان الشرط ينطبق، نستخدم Cascade notation لتحديث خصائص الكائن بحيث يتم تحديث العمر وتحديث الاسم.
باستخدام هذا النهج، يمكننا تحديث عدة خصائص لكائن واحد بناءً على شرط واحد، مما يجعل الكود أكثر قراءة وصيانة.
سنقوم بكتابة تطبيق بسيط في Dart يستخدم Cascade notation مع تعبير if لتحديث خصائص كائن بناءً على شرط معين. سنستخدم هذا التطبيق لتحديث معلومات حساب مستخدم.
class Profile { String name; String email; bool verified; Profile(this.name, this.email, this.verified); void verifyAccount() { verified = true; } void updateEmail(String newEmail) { email = newEmail; } void printInfo() { print('name: $name'); print('Email: $email'); print('Verified: $verified'); } } void main() { var = Profile('john_doe', 'john@example.com', false); // Cascade notation مع if statement if (!.verified) { ..verifyAccount() ..updateEmail('john.doe@example.com'); } // طباعة معلومات الحساب بعد التحديث .printInfo(); }
نقوم بتعريف فئة Profile التي تحتوي على السمات الأساسية لحساب المستخدم مثل اسم المستخدم، البريد الإلكتروني، وحالة التحقق.
تعريف دوال لتحديث الحالة والبريد الإلكتروني وطباعة معلومات الحساب.
في الدالة main()، نقوم بإنشاء مستخدم جديد وتعيين بعض القيم الافتراضية.
نستخدم التعبير if للتحقق مما إذا كان الحساب غير محقق بعد. إذا كان الشرط ينطبق، نستخدم Cascade notation لتحديث حالة التحقق وتحديث البريد الإلكتروني.
نطبع معلومات الحساب بعد التحديث.
باستخدام Cascade notation مع تعبير if، نستطيع بسهولة تحديث خصائص كائن بناءً على شرط معين دون الحاجة إلى كتابة الكائن مرة أخرى.
طبقًا لذلك، سنقوم بكتابة تطبيق بسيط في Dart يستخدم التعبيرات الشرطية if لتحديد سلوك البرنامج استنادًا إلى شروط محددة.
فلنفترض أن لدينا تطبيقًا يطلب من المستخدم إدخال درجاته في مادة معينة، ثم يقوم بإظهار رسالة تفيد إذا كان المستخدم ناجحًا في المادة أو راسبًا.
import 'dart:io'; void main() { // طلب درجة المستخدم stdout.write('الرجاء إدخال درجتك في المادة: '); double grade = double.parse(stdin.readLineSync()!); // التحقق من الدرجة وطباعة الرسالة المناسبة if (grade >= 60) { print('تهانينا! أنت ناجح في المادة.'); } else { print('آسف، أنت راسب في المادة. حاول مرة أخرى.'); } }
نستخدم stdout.write() لطلب درجة المستخدم دون إضافة سطر جديد.
نستخدم stdin.readLineSync() لقراءة الدرجة التي يدخلها المستخدم.
نستخدم التعبير الشرطي if للتحقق مما إذا كانت الدرجة التي أدخلها المستخدم أكبر من أو تساوي 60. إذا كانت، سيتم طباعة رسالة تهنئة بالنجاح، وإلا سيتم طباعة رسالة بالرسوب.
يتم إغلاق التطبيق بعد ذلك.
بهذا البرنامج، سيتمكن المستخدم من معرفة ما إذا كان ناجحًا أم راسبًا في المادة بناءً على الدرجة التي أدخلها.
a) لحساب القيم الناتجة من التعابير الرياضية.
b) لإنشاء حلقات تكرارية.
c) لتنفيذ كتلة من الكود إذا تم تحقق شرط معين.
d) لتحديد قيم افتراضية للمتغيرات.
a) يتم تنفيذ الكود داخل التعبير الشرطي if.
b) يتم تنفيذ الكود بعد التعبير الشرطي if.
c) يتم تنفيذ الكود داخل التعبير الشرطي else.
d) لا يتم تنفيذ أي كود.
a) هو نوع من التعبيرات الشرطية يستخدم للتحقق من الشرط ثلاثيًا.
b) هو مشغل يستخدم لدمج عدة عمليات رياضية في تعبير واحد.
c) هو مشغل يستخدم لتحديد قيمة افتراضية إذا كانت القيمة الأولى مساوية لـ null.
d) هو مشغل يسمح بكتابة تعبيرات if-else بشكل مختصر.
a) else if
b) else
c) switch
d) then
الشرح:
التعبير الشرطي if يستخدم في Dart لتنفيذ كتلة من الكود إذا تم تحقق شرط محدد. على سبيل المثال:
if (condition) {
// تنفيذ الكود إذا تحقق الشرط
}
في هذا المثال، إذا كانت الشرطية condition صحيحة، سيتم تنفيذ الكود داخل القوسين.
عندما يكون الشرط في التعبير الشرطي if غير صحيح، فإن أي كود داخل التعبير الشرطي لن يتم تنفيذه، وسيتم تجاهله.
المشغل الثلاثي ?? في Dart يستخدم لتحديد قيمة افتراضية إذا كانت القيمة الأولى مساوية لـ null. على سبيل المثال:
var result = value ?? defaultValue;
في هذا المثال، إذا كانت value مساوية لـ null، سيتم استخدام defaultValue كقيمة لـ result.
else هو الشرط الذي يحتوي على الكود الذي يتم تنفيذه إذا لم يتم تحقق أي شرط من التعبيرات الشرطية السابقة.
a) لا فرق بينهما، يمكن استخدام أي منهما بشكل متبادل.
b) يمكن استخدام if لتحقق من شرط أولي، واستخدام else if لتحقق من شروط إضافية في حال عدم تحقق الشروط السابقة.
c) else if يستخدم لتحديد القيم الافتراضية للمتغيرات في حال عدم وجود قيمة.
d) if يستخدم فقط لتحديد القيم الافتراضية.
a) يتم تنفيذ الكود داخل التعبير الشرطي if.
b) يتم تنفيذ الكود داخل التعبير الشرطي else.
c) يتم تنفيذ الكود داخل كل من التعابير الشرطية if و else.
d) لا يتم تنفيذ أي كود.
a) == يستخدم للتحقق من المساواة بين قيمتين، بينما = يستخدم لتعيين قيمة لمتغير.
b) == يستخدم لتعيين قيمة لمتغير، بينما = يستخدم للتحقق من المساواة بين قيمتين.
c) كلاهما يستخدم للتحقق من المساواة بين قيمتين.
d) كلاهما يستخدم لتعيين قيمة لمتغير.
a) Cascade notation يستخدم فقط مع if statements.
b) Cascade notation يستخدم لتجميع الكائنات الفرعية مع الكائنات الرئيسية.
c) Cascade notation يستخدم لتحديث الخصائص المتعددة لكائن واحد.
d) Cascade notation يستخدم للتحقق من المساواة بين قيمتين.
a) لتحديد القيم الافتراضية للمتغيرات في حال عدم وجود قيمة.
b) لتنفيذ كتلة من الكود إذا تم تحقق شرط محدد، وإلا فإنه يتحقق من شرط آخر.
c) للتحقق من المساواة بين قيمتين.
d) لتحديد القيم الافتراضية للمتغيرات في حال عدم وجود قيمة.