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

C / الأساسي: قراءة البرامج وبناؤها / الدرس 4

المعاملات وتدفق التحكم

اجعل الحساب والقرارات صريحة، واستخدم ثوابت الحلقات لتبرير كل تكرار وحد.

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

أهداف الدرس

  • تتبع أولوية العمليات والتقييم المختصر والفروع.
  • صياغة ثابت للحلقة وحجة لانتهائها.
  • فصل الآثار الجانبية المستقلة إلى تعليمات واضحة.

القيم والتغييرات مختلفان

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

مثلا يجمع total = price * quantity + fee الضرب أولا. وتبقى مسؤولية المبرمج إثبات أن حاصل الضرب والمجموع الوسيطين يلائمان نوعيهما. فضل الأسماء والمتغيرات الوسيطة التي تكشف حساب المجال بدلا من حشر الإدخال والزيادات والحساب والإخراج في تعبير واحد.

الشروط تصوغ سياسة القرار

الصفر خطأ والقيمة القياسية غير الصفرية صحيحة في تعبير التحكم. تنتج معاملات المقارنة int بقيمة صفر أو واحد. تختصر && و

المنطقيتان التقييم: لا يُقيّم المعامل الأيمن إلا عند الحاجة. يتيح ذلك حارسا مثل divisor != 0 && numerator / divisor > 2، مع بقاء حاجة القسمة لفحوص مدى أخرى في الحالة العامة ذات الإشارة.

تعبر سلسلة else-if عن تصنيف مرتب. ضع القاعدة المنطبقة الأكثر تخصيصا قبل الأوسع عند التداخل. في switch تكون تسميات case تعابير ثابتة صحيحة، ويمكن أن يستمر التنفيذ إلى الفرع التالي إن لم يغادره التحكم. استخدم break صريحة أو وثق الانتقال المقصود بوضوح.

تحليل تصنيف خطوة بخطوة

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

اختبر النقاط الواقعة مباشرة تحت كل عتبة وعندها وفوقها. عند الحد الأول تميز 84 و85 و86 قاعدة >= من قاعدة >. وقد يخفي اختيار القيم الوسطية المعتادة وحدها خطأ الحدود. يجعل جدول الفروع الذي يحدد المجال والتسمية المتوقعة مراجعة السلوك المقصود أسهل غالبا.

c عتبات درجات مرتبة
#include <stdio.h>

int main(void)
{
    int score = 74;
    if (score >= 85) puts("high");
    else if (score >= 60) puts("pass");
    else puts("retry");
    return 0;
}
الناتج المتوقع
pass

74 أقل من 85 ولا تقل عن 60، لذلك ينفذ الفرع الأوسط.

تفسير الحلقة قبل تشغيلها

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

يبدأ المثال دون أية قيم مجمعة. قبل التكرار i يساوي total مجموع الواحد حتى i ناقص واحد؛ وتحافظ إضافة i على الادعاء للتكرار التالي. يثبت الحد المنتهي خمسة وزيادة i انتهاء الحلقة. تلائم جميع النتائج الوسيطة int، فلا يحتاج التفسير إلى التفاف أو عرض أعداد خاص بآلة.

c تجميع محدود
#include <stdio.h>

int main(void)
{
    int total = 0;
    for (int i = 1; i <= 5; ++i) {
        total += i;
    }
    printf("total=%d\n", total);
    return 0;
}
الناتج المتوقع
total=15

تضيف التحديثات الخمسة 1 و2 و3 و4 و5، فتنتج 15.

مراجعة المخارج والحالات الفارغة

قد لا تنفذ while أية مرة؛ وتنفذ do-while جسمها مرة على الأقل. تخرج break من أقرب حلقة أو switch، بينما تتخطى continue إلى خطوة التكرار التالية؛ وتشمل هذه خطوة التحديث في for. افحص هذه المسارات عندما تحافظ الحلقة على عدادات أو تملك موارد أو تستهلك إدخالا.

تتبع الإدخال الفارغ والعنصر الواحد والحد الأعلى الدقيق والفشل المبكر. تجنب شروط العد التنازلي غير الموقعة مثل i >= 0 التي تبقى صحيحة لكل قيمة دون إشارة. يجعل مجال أمامي نصف مفتوح يبدأ بصفر وينتهي قبل count حلقات المصفوفات وحالتها الفارغة أسهل للتحليل عادة.

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

يدخل حد المجال الفرع الخطأ.

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

لا ينتهي عد تنازلي دون إشارة.

لماذا يحدث؟
الشرط i >= 0 صحيح دائما لـi غير الموقع.
كيف تصلحه؟
استخدم مجالا أماميا أو حلقة عكسية بحارس دقيق.
كيف تتجنب تكراره؟
أثبت الانتهاء باستخدام نوع العداد الفعلي.

لا تثبت الأقواس تحديثا معقدا.

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

اختبر فهمك

1. غير الجمع ليشمل الواحد حتى الستة ثم برر النتيجة والانتهاء.

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

استخدم i <= 6. قبل كل تكرار يساوي total مجموع الأعداد الصحيحة الموجبة السابقة؛ وتضيف الخطوة الأخيرة ستة إلى خمسة عشر فتنتج واحدا وعشرين. يصبح i بعدها سبعة ويفشل الشرط وتنتهي الحلقة. أعد فحص المدى الحسابي إذا أصبح الحد مدخلا خارجيا بدل الثابت الصغير ستة.

2. صنف الدرجات 59 و60 و84 و85 واقترح قاعدة تحقق إضافية.

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

التسميات هي retry وpass وpass وhigh. تنتمي العتبتان الدقيقتان إلى الفئة الأعلى لأن الفحص يستخدم >=. قبل التصنيف ارفض الدرجات الأقل من صفر أو الأكبر من مئة إن كانت حدود التطبيق كذلك. يمنع فصل الرفض اعتبار 900 نتيجة ممتازة صالحة.

أهم ما تعلمته

  • تجمع الأولوية العمليات؛ ويضبط الترتيب توقيت تنفيذها.
  • استخدم مجالات صريحة واختبارات حدود للقرارات.
  • يفسر الثابت وتناقص العمل المتبقي الحلقة.

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