محتويات الدورة

C++ / الأساسي / الدرس 3

تدفق التحكم والإدخال المفحوص

حوّل المتطلبات إلى تفرعات وحلقات بحدود صريحة، وامنع الإدخال غير الصالح من الوصول إلى الحساب.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • كتابة تقسيم كامل للحالات وحلقات تنتهي.
  • استخدام التقييم المختصر دون آثار جانبية خفية.
  • فحص استخراج التدفق وشروط التطبيق كلًا على حدة.

تحديد موضع لكل حد

تختار if عبارة وفق شرط يُحوّل إلى bool. تفحص سلسلة else if البدائل بالترتيب وتتوقف عند أول شرط صحيح. قبل كتابة الشيفرة قسّم المجال المقبول إلى مناطق لا تتداخل. يمكن أن تكون الكمية سالبة أو صفرًا أو موجبة؛ ويجب إلحاق المساواة بأحد جانبي حد الدرجة فقط. استخدم الأقواس حتى للتفرع القصير حتى لا يخرج تعديل لاحق من نطاقه بالخطأ. وافصل الحالات غير الصالحة عن التصنيفات العادية بدل معاملتها ضمنيًا كأدنى فئة.

ترتيب الفحوص وفق الاعتماد

تقيّم && المضمنة معاملها الأيمن فقط إذا كان الأيسر صحيحًا، وتتجاوز || المضمنة الأيمن إذا كان الأيسر صحيحًا. يتيح ذلك حراسة مثل denominator != 0 && numerator / denominator > 2، بشرط صلاحية بقية الحساب. تجنب تعديل قيمة داخل شرط معقّد، وافصل الفحص عن الفعل. يفحص المثال الأول درجة محصورة ثم يطبّق حدها. يطبع تصنيفًا واحدًا لأن if وelse تصفان نتيجتين متنافيتين.

cpp المساواة ضمن فرع النجاح
#include <iostream>
int main() {
    const int score{70};
    if (score < 0 || score > 100) {
        std::cout << "invalid\n";
    } else if (score >= 70) {
        std::cout << "pass\n";
    } else {
        std::cout << "retry\n";
    }
}
الناتج المتوقع
pass

السبعون ضمن المجال المقبول وتحقق حد النجاح الشامل للمساواة، فتُتجاوز الفروع الأخرى.

شرح ما تحافظ عليه الحلقة

تحتاج الحلقة إلى تهيئة وشرط استمرار وخطوة تقدم وسبب يضمن الانتهاء. تصف خاصية ثابتة مفيدة الحالة قبل كل تكرار. في مثال الجمع تساوي total مجموع الأعداد الموجبة الأصغر من next. تحافظ إضافة next ثم زيادته على هذه الخاصية. عندما يصل next إلى خمسة تنتهي الحلقة بمجموع الأعداد حتى أربعة. يكشف هذا التفكير أخطاء الحد بمقدار واحد أبكر من التخمين. وللعدّ المتحكم به من المستخدم افحص حدًا عمليًا أعلى ومجال المجمّع قبل التكرار.

cpp حلقة بخاصية ثابتة قابلة للتتبّع
#include <iostream>
int main() {
    int total{};
    for (int next{1}; next <= 4; ++next) {
        total += next;
    }
    std::cout << total << "\n";
}
الناتج المتوقع
10

الأعداد المضافة هي 1 ثم 2 ثم 3 ثم 4. المجموع النهائي عشرة، ونطاق next محلي للحلقة.

التحليل لا يغني عن فحص المجال

يحاول الاستخراج المنسّق std::cin >> count تحويل البيانات ويسجل حالة التدفق. افحص نتيجة التدفق قبل استخدام count، ثم افحص سماح التطبيق بالعدد المحوّل. يبقى استخراج سالب ثلاثة بنجاح غير صالح لعدّ مخزون غير سالب. وإذا وجب أن يحتوي السطر عددًا صحيحًا واحدًا فقط، فقد يقبل الاستخراج بادئة رقمية تتبعها محارف إضافية؛ حلّل السطر وارفض الباقي صراحة. قرر هل ينهي السطر المشوّه العملية أو تُمسح حالة الخطأ ويُهمل السطر قبل المحاولة مجددًا.

وضوح المخارج والحالات

استخدم break لخروج مبكر مقصود وcontinue لتجاوز بقية التكرار الحالي. قد تخفي المخارج الكثيرة الخاصية الثابتة، فسمّ شروط النجاح والفشل أولًا. تناسب while تكرارًا غير معلوم العدد، وتجمع for خطوات العد في مكان واحد. تنفّذ do-while مرة قبل الفحص، وهو مهم إذا كان الإدخال غير صالح أصلًا. يمكن أن توثّق enum class مع switch بدائل مجموعة محدودة من الحالات المسماة، مع سياسة صريحة للتمثيلات الرقمية الخارجية غير الصالحة.

الأخطاء الشائعة وإصلاحها

حلقة لا تصل إلى شرط خروجها.

لماذا يحدث؟
خطوة التقدم مفقودة أو تبتعد عن الحد.
كيف تصلحه؟
تتبّع التهيئة والشرط والتحديث لثلاث دورات.
كيف تتجنب تكراره؟
حدّد مسافة متناقصة إلى الانتهاء قبل البرمجة.

تصنيف قيمة الحد خطأ.

لماذا يحدث؟
استُخدمت مقارنة صارمة حيث يجب قبول المساواة.
كيف تصلحه؟
ألحق المساواة بالفرع المقصود واختبر القيم المجاورة.
كيف تتجنب تكراره؟
اختبر قبل كل حد وعنده وبعده.

إدخال غير صالح يسبب فشلًا متكررًا.

لماذا يحدث؟
بقيت حالة فشل التدفق والمحارف المسببة لها.
كيف تصلحه؟
أنه العملية أو امسح الحالة وتخلّص من السطر الفاسد.
كيف تتجنب تكراره؟
حدّد سياسة إعادة محاولة كاملة بدل التكرار الأعمى.

اختبر فهمك

1. صنّف الدرجات 69 و70 و100 و101 بالبرنامج الأول، واشرح سبب سبق فحص المجال لحد النجاح.

اعرض الحل المشروح

السطور بالترتيب هي retry ثم pass ثم pass ثم invalid. إذا فُحص score >= 70 أولًا فستنجح 101 خطأ. يستبعد فحص المجال القيم خارج الصفر إلى المئة قبل التصنيف العادي. أضف سالب واحد وصفرًا إلى الاختبارات لتغطية الحد الأدنى أيضًا.

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

اعرض الحل المشروح

ابدأ next بصفر وأبقِ total صفرًا واستمر ما دام next <= 5. قبل كل دورة تساوي total مجموع الأعداد من صفر إلى ما قبل next. عند next == 0 يكون المجموع فارغًا وقيمته صفر. تنتهي الحلقة عند ستة وتساوي total خمسة عشر.

أهم ما تعلمته

  • قسّم الحدود قبل كتابة التفرعات.
  • تفسّر الخاصية الثابتة التقدم والنتيجة النهائية.
  • افحص التحليل وشروط المجال وسلوك إعادة المحاولة منفصلة.

المراجع الرسمية