انتقل إلى المحتوى
Topos Uranos

ملخص

يختم هذا الدرس الوحدة الرابعة من الدورة، المخصّصة للتحكم في التدفق. فهو يعيد بناء سلسلة المفاهيم التي تمتد من الشرط إلى الخوارزميات العددية، مرورًا بالقرار وتحليل الحالات، والحلقة وأشكالها الثلاثة، وأنماط الحلقات، واللامتغير والمتغاير؛ ويفصل ما يصحّ من ذلك في أي لغة عمّا يخصّ C++؛ ويجمع السلوك غير المعرَّف في الوحدة، الذي يتركّز في العدّادات والمجمِّعات والشروط التي تفيض، مع برنامج يُظهره ومع تصحيحه؛ ويعيد في تقييم الخروج مهارات تقييم الدخول؛ ويختتم بستة تحدّيات تجمع الوحدة كلها، من خوارزمية إقليدس الموسّعة إلى تقويم شهر.

أهداف التعلم

  1. أن يصمّم قرارات حالاتها منفصلة وشاملة، وأن يختبرها بمُدخل واحد لكل حالة ولكل حدّ.
  2. أن يصمّم حلقات صحيحة تتوقف، مختارًا شكلها وأنماطها انطلاقًا من المواصفات.
  3. أن يعلّل صحة حلقة بلامتغير وتوقفها بمتغاير، وكذلك في الخوارزميات العددية للوحدة.
  4. أن يتعرّف السلوك غير المعرَّف في الوحدة (العدّاد والمجمِّع والشرط التي تفيض، والقسمة التي كان على الشرط أن يمنعها) وأن يعيد كتابة الحلقة من دونه.
  5. أن يفصل، فيما تعلّمه في الوحدة، ما يصحّ في أي لغة عمّا يخصّ C++.

ما حقّقته الوحدة

سعت الوحدة إلى تعليم التحكم في ترتيب التنفيذ بالقرارات والحلقات، والاستدلال على صحتها: أن تُعالَج كل حالة، وأن تفعل كل حلقة ما عليها وأن تتوقف. وقد تحقّق هذا الغرض بالاستناد فقط إلى ما أعلنت المقدمة أنه معلوم: شروط الوحدة 3، وأنواع الوحدة 2، والتتبع والمتغاير من الدرس 1.1. فالبرنامج الذي كان يحسب القاسم المشترك الأكبر بثلاث خطوات ثابتة، والذي كان بحسب البيانات يجيب خطأً أو يقسم على الصفر، حلّت محلّه حلقة من ثلاثة أسطر، وصار ممكنًا الآن أن نبرهن أن هذه الحلقة صحيحة لكل البيانات غير السالبة.

القرارات

علّم الدرس القرارات الجملة if، مع الأقواس المعقوصة دائمًا. وبيّن أنه في سلسلة من else if يُنفَّذ أول فرع يكون شرطه صحيحًا، بحيث تكون الحالة الفعلية لكل فرع هي شرطه مقرونًا بنفي كل الشروط التي قبله؛ ومن هنا أهمية الترتيب، وإمكان أن يبقى فرع غير قابل للوصول دون تحذير. وأرسى معيار صحة كل قرار: يجب أن تكون حالاته منفصلة (وهي كذلك بحكم شكل السلسلة) وشاملة (وهي كذلك إذا انتهت السلسلة بـelse)، وأن تطابق حالات المواصفات، وهو ما يُختبر في داخل كل حالة وعلى جانبي كل حدّ. وقدّم العامل الشرطي، للاختيار بين قيمتين قصيرتين دون قرار كامل. واختتم بـenum class وswitch، الذي ينبّه المترجم إلى الحالة المنسيّة فيه.

الحلقات

قدّم الدرس الحلقات while وdo وfor بوصفها ثلاثة أشكال لآلية واحدة: while يحسب شرطه قبل كل جولة وقد لا يقوم بأي جولة؛ وdo يقوم بجولة واحدة على الأقل؛ وfor يجمع في ترويسته التهيئة والشرط والتقدّم، ومتغير التحكم فيه لا يعيش إلا داخل الحلقة. وعلّم تكافؤاتها، وجدول التتبع، مع k+1k + 1 حسابًا للشرط في kk جولة من while يتوقف بشرطه (وkk حسابًا في do)، وعدّ الجولات من الترويسة، الذي يقي من خطأ الفرق بواحد. وأضاف break وcontinue والحلقات المتداخلة، التي يُنفَّذ جسمها الداخلي عددًا من المرات يساوي مجموعًا: m⋅pm \cdot p بحدود ثابتة، وn(n+1)/2n(n + 1)/2 في حالة المثلث.

تصميم حلقات صحيحة

جعل الدرس تصميم حلقات صحيحة الحلقة موضوعًا للتصميم. فجمع الأنماط (العدّاد، والمجمِّع، والقيمة العظمى والصغرى، والقيمة الحارسة والعَلَم)، وكلٌّ منها معرَّف بما يعنيه متغيره بعد كل جولة. وعرّف اللامتغير، وهو عبارة تصحّ كلما حُسب الشرط، مع التزاماته الثلاثة: التهيئة والحفظ والختام، الذي يعطي مع الشرط الخاطئ الشرط اللاحق؛ وتعرّف فيه استقراءً على عدد الجولات. وعلّم التصميم بالعكس، من الشرط اللاحق إلى اللامتغير ومن اللامتغير إلى الجسم. وعلّل التوقف بالمتغاير، وعرض ثلاث حلقات تُبطله فيها حسابيات C++: الحقيقي الذي يتخطى 1.0، والعدّاد عديم الإشارة الذي يدور دورته، والعدّاد ذو الإشارة الذي يفيض. وقدّم أخيرًا أول تعارف مع مصحّح الأخطاء.

الخوارزميات العددية

طبّق الدرس الخوارزميات العددية ما سبق على أربع خوارزميات كلاسيكية، مكتوبة داخل main ومبرهَنة. اختبار الأولية بالقسمة التجريبية، مع القضية القائلة إنه يكفي الوصول إلى n\sqrt{n}، ومع الشرط d <= n / d، الذي لا يفيض حيث يفيض d * d <= n. وخوارزمية إقليدس، مع اللامتغير gcd⁡(a,b)=gcd⁡(a0,b0)\operatorname{gcd}(a, b) = \operatorname{gcd}(a_0, b_0) والمتغاير bb، وخطريها في C++: النتيجة السالبة والقسمة على الصفر إذا حُسب الشرط بعد الجسم. وتغيير الأساس بالقسمات المتتالية وقاعدة هورنر، التي تحسب قيمة كثيرة حدود بضربة واحدة لكل معامل. وطريقة التنصيف، التي تضمنها مبرهنة القيمة الوسطى ويتحكم فيها عدّاد صحيح يُحسب عدد جولاته مسبقًا.