ملخص
يفتتح هذا الدرس الوحدة الأولى من الدورة، المخصّصة للخطوات الأولى في البرمجة بلغة C++. ويشرح الغاية من الوحدة: أن تنقل من لم يبرمج قطّ من مسألة مصوغة باللغة الجارية إلى برنامج يُترجَم ويُنفَّذ ويقرأ البيانات ويكتب النتائج، مع معرفة ما فعلته كل أداة في الطريق؛ ويعرض دروسها الستة والخيط الذي يجمعها، من الخوارزمية المكتوبة بالعربية إلى تصنيف الأخطاء؛ ويحدّد القليل الذي يُفترض أنه معلوم، وهو الحساب المدرسي، وعادة اتّباع التعليمات المكتوبة، والتعامل مع الملفات والمجلدات؛ ويصوغ المسألة التي تحلّها الوحدة، وهي تحويل حساب نعرف إجراءه باليد إلى إجراء تنفّذه آلة دون أن تخطئ ودون أن تتعب؛ ويبيّن إلى أين تقود، في الوحدات اللاحقة وفي دورة البرمجة بلغة C++ II.
أهداف التعلم
- وصف تسلسل محتويات الوحدة، وشرح ما يقدّمه كل درس للدرس الذي يليه.
- التعرّف على المعارف المسبقة التي تفترضها الدورة (إجراء العمليات على الأعداد الصحيحة والعشرية، وحساب خارج القسمة والباقي، واتّباع التعليمات المكتوبة، وحفظ ملف في مجلد معيّن)، ومراجعتها عند الحاجة.
- شرح الطريق الذي تعلّم الوحدة اجتيازه، بمثال: من نصّ المسألة إلى المواصفات، ومن المواصفات إلى الخوارزمية، ومن الخوارزمية إلى البرنامج الذي يُترجَم ويُنفَّذ.
- التعرّف على ما يُنتظر إتقانه في نهاية الوحدة، وتمييزه ممّا سيُتعلَّم في الوحدات اللاحقة.
تقييم الدخول
قبل اجتياز الوحدة يحسن قياس نقطة البداية. وهذا التقييم تقييم ذاتي: لا تُمنح عليه درجة، وغايته الوحيدة توجيه الدراسة. ولمّا كانت هذه الوحدة الأولى من الدورة، فلا أسئلة عن وحدات سابقة؛ وبدلًا منها تتناول الأسئلة الثلاثة الأولى ما تفترض الدورة أنه معلوم: خارج القسمة والباقي في القسمة الصحيحة، وترتيب خطوات إجراء ما، واسم الملف وامتداده ومجلده. وتتناول الأسئلة السبعة التي تليها، بالترتيب، الأفكار المحورية في دروس الوحدة الستة. ومن لم يبرمج قطّ لا ينبغي أن يتوقّع الإصابة فيها، ولا ضير في ذلك: فكل جواب، صائبًا كان أو خاطئًا، يشرح المسألة ويسمّي الدرس الذي يعالجها. وتُقاس المهارات نفسها مرة أخرى في النهاية، في درس الخلاصة.
قبل أن تبدأ الوحدة، قِس نقطة انطلاقك. إنه تقييم ذاتي قصير: لا يُمنح عليه درجة، وتُحفظ نتيجته في متصفحك فقط.
السؤال 1من وحدات سابقةتُوزَّع 47 ورقة على 6 أشخاص، بحصص صحيحة متساوية، وتُحفظ الأوراق التي لا تكفي لجولة كاملة. كم ورقة ينال كل شخص، وكم ورقة تُحفظ؟
هذه هي القسمة بالكسور العشرية لا القسمة الصحيحة: فالأوراق لا تُقطَّع، والسؤال يطلب عدد ما يفضل.تقريب خارج القسمة إلى الأعلى يتطلّب أوراقًا غير موجودة؛ وباقي القسمة الصحيحة لا يكون سالبًا أبدًا حين يكون المقسوم والمقسوم عليه موجبين.يخلط بين الباقي والجزء العشري من خارج القسمة: فالباقي يُعدّ بالأوراق، لا بأجزاء من الجولة.إنها القسمة الصحيحة: خارج القسمة هو أكبر عدد من الجولات الكاملة، والباقي هو ما يفضل، وهو دائمًا أصغر من المقسوم عليه. وتستعملها الدورة منذ البرنامج الأول، ولها في C++ عوامل خاصة بها.راجِع: من المسألة إلى الخوارزمية
السؤال 2من وحدات سابقةلإرسال ملف مرفق بالبريد الإلكتروني أربع خطوات: A، كتابة عنوان المرسَل إليه؛ B، الضغط على «إرسال»؛ C، فتح رسالة جديدة؛ D، إرفاق الملف. ما الترتيب المناسب؟
ترتيب التعداد ليس ترتيب التنفيذ: فبه تُرسَل الرسالة قبل أن توجد.النتيجة تتوقّف على الترتيب: فما يُرفَق بعد الإرسال لا يصل.يرسل الرسالة بلا مرسَل إليه وبلا مرفق؛ والخطوات اللاحقة لا تغيّرها بعد ذلك.بعض الخطوات يعتمد على غيره (لا يمكن الإرفاق برسالة لم تُفتح، ولا استكمال رسالة أُرسلت)، وبعضها لا يعتمد. والتعرّف على هذه التبعيات هو أول ما تقتضيه كتابة خوارزمية.راجِع: من المسألة إلى الخوارزمية
السؤال 3من وحدات سابقةملف محفوظ في
C:\Users\ana\programas\suma.cpp. ما اسمه، وما امتداده، وفي أي مجلد يوجد؟يخلط بين المجلد الذي يحوي الملف والملف نفسه: فالاسم هو آخر مكوّن في المسار.الامتداد جزء من الاسم؛ وبعض الأنظمة تخفيه افتراضيًا، والدورة تطلب إظهاره، لأنsuma.cppوsuma.exeملفان مختلفان تمامًا.C:هو محرك الأقراص الذي يبدأ منه المسار، لا امتداد.المسار يعدّد المجلدات من الجذر حتى الملف؛ والامتداد، أي ما يلي النقطة الأخيرة في الاسم، يدلّ على نوع المحتوى:.cppشيفرة مصدرية بلغة C++. ولترجمته يجب أن تكون الطرفية في ذلك المجلد أو أن تتلقّى المسار الكامل.راجِع: الترجمة والتنفيذ والإعداد
السؤال 4تقول وصفة: «إذا كانت العجينة جافة، فأضف ملعقة ماء واعجن؛ وكرّر حتى لا تبقى جافة». وتحتاج العجينة بالضبط إلى ثلاث ملاعق لتكفّ عن الجفاف. كم مرة يُسأل هل العجينة جافة؟
لا يعدّ السؤال الذي جوابه «لا»، وهو يُطرح أيضًا: فلولاه لما عرف أحد أن عليه التوقّف عن إضافة الماء.يخلط بين نصّ الإجراء وتنفيذه: الشرط مكتوب مرة واحدة، لكنه يُفحَص في كل جولة.يعدّ الفواصل بين الملاعق، لا الأسئلة.في كل تكرار يسأل قبل أن يعمل، يُفحَص الشرط مرة أكثر ممّا يُنفَّذ الجسم: فالسؤال الأخير هو الذي يسمح بالخروج. واتّباع الإجراء باليد، مع العدّ، يبيّن ذلك دون لبس.راجِع: من المسألة إلى الخوارزمية
السؤال 5أيّ هذه التعليمات يستطيع أيّ شخص، أو آلة، اتّباعها بالطريقة نفسها تمامًا؟
تتوقّف على ذوق من ينفّذها: شخصان سيتّبعانها بطريقتين مختلفتين، والآلة لا ذوق لها.لا تقول كم مرة ولا ما معنى أن يصبح جيدًا: فشرط التوقف غير قابل للتحقّق.لا تحدّد الأعداد: «كبير» ليس كمية، والمقسوم عليه قد يكون صفرًا.تقول أيّ عملية تُجرى، وعلى أيّ معطى، وأين تبقى النتيجة؛ ولا شيء فيها يتوقّف على تقدير من ينفّذها. وهذه الدقة إحدى المتطلبات الثلاثة للخوارزمية.راجِع: من المسألة إلى الخوارزمية
السؤال 6برنامج يُترجَم دون أخطاء ولا تحذيرات، ويعمل جيدًا مع بيانات كثيرة، ومع معطى بعينه يتوقّف بالرسالة «division by zero». في أيّ لحظة وقع الخطأ؟
المترجم يترجم النص ولا ينفّذه، ولا يعرف البيانات التي سيكتبها المستخدم.الرابط يجمع أجزاء البرنامج؛ ولا يجري حسابات ولا يرى بيانات.مع بيانات أخرى يعمل الملف التنفيذي نفسه: فالعيب في ما يفعله البرنامج بذلك المعطى، لا في الأدوات.ما يتوقّف على نصّ البرنامج وحده يُكتشَف عند الترجمة أو الربط؛ وما يتوقّف على البيانات لا يُكتشف إلا عند التنفيذ. ولذلك فإن البرنامج الذي يُترجَم ليس، بمجرّد ذلك، خاليًا من الأخطاء.راجِع: البرامج والمترجمات ولغة C++
السؤال 7ثُبِّت Visual Studio Code مع إضافته الخاصة بلغة C++، وعند طلب
g++ --versionفي الطرفية تجيب بأنها لا تتعرّف علىg++. ما الأرجح؟الإضافة لا تحوي المترجم ولا تتدخّل في ما تعثر عليه الطرفية.الأمرg++ --versionلا يترجم أيّ برنامج: إنما يسأل عن الإصدار، والطرفية لم تجد حتى من تسأله.المحرر لا يهمّ: فالناقص هو المترجم، في أيّ محرر كان.المحرر لا يترجم: بل يستدعي مترجمًا منفصلًا يجب أن يكون مثبَّتًا وأن تعثر عليه الطرفية. والإضافة الخاصة بلغة C++ تساعد على كتابة الشيفرة، لكنها لا تأتي بمترجم.السؤال 8يكتب المترجم رسالة تبدأ بـ
warning:، ومع ذلك ينتج الملف التنفيذي. ماذا يعني ذلك؟ذلك خطأ (error:)، وعندئذ لا يكون هناك ملف تنفيذي.أن يعمل مع البيانات المجرَّبة لا يثبت شيئًا عن غيرها؛ والتحذير المتجاهَل كثيرًا ما يكون خطأ الغد.الملف التنفيذي سليم؛ والمشكوك فيه هو ما يفعله البرنامج في الموضع المشار إليه.الخطأ يمنع الحصول على الملف التنفيذي؛ والتحذير يسمح به، لكنه يشير إلى شيفرة مريبة. وكثير من التحذيرات يكشف عيوبًا حقيقية، ولذلك تشترط الدورة برامج تُترجَم دون أيّ تحذير.راجِع: الترجمة والتنفيذ والإعداد
السؤال 9أين يبدأ تنفيذ برنامج بلغة C++؟
السطر الأول يكون عادة توجيه#include، الذي يُعالَج قبل الترجمة ولا يُنفَّذ.الترتيب في الملف لا يحدّد نقطة الدخول؛ بل يحدّدها الاسمmain.المعيار يحدّد اسم نقطة الدخول؛ ولا يُختار في أمر الترجمة.الدالةmainهي نقطة الدخول: يستدعيها النظام عند تشغيل البرنامج، وينتهي البرنامج حين تنتهي. والبرنامج الذي لاmainفيه يُترجَم، لكنه لا يُربَط.راجِع: تشريح البرنامج
السؤال 10برنامج يصرّح بـ
int age{};، وينفّذstd::cin >> age;ليقرأ عمرًا، فيكتب المستخدمabc. ماذا يحدث؟لا يتوقّف: بل يواصل كأن القراءة نجحت، ولذلك فالعيب خطير.المتغير من النوعintلا يحفظ إلا الأعداد الصحيحة؛ والحروف لا تتحوّل إلى عدد ولا تُحفظ.القراءة لا تعيد المحاولة: تفشل مرة واحدة وتترك المجرى في حالة خطأ.قراءة عدد صحيح تفشل حين تصادف حرفًا؛ والمعيار ينصّ على أن المتغير يأخذ 0 وأن القراءات اللاحقة لن تفعل شيئًا حتى يُعالَج الخطأ. وإن لم يتحقّق البرنامج من القراءة، كتب استنتاجات خاطئة دون أيّ إشارة.راجِع: المدخلات والمخرجات والأخطاء
محتويات الوحدة
للوحدة ستة دروس تجتاز بالترتيب الطريق من مسألة إلى برنامج يعمل. وكل درس يفترض الدرس الذي قبله، والأول لا يفترض شيئًا من اللغة.
- من المسألة إلى الخوارزمية. تبدأ الدورة دون شيفرة، لأن الخوارزمية تسبق البرنامج. ويعلّم الدرس تحديد مواصفات مسألة بمدخلاتها ومخرجاتها والعلاقة بينهما (الشرط المسبق والشرط اللاحق)؛ ووصف خوارزمية بخطوات مرقّمة، دون لبس؛ واتّباعها باليد بجدول التتبع؛ والتعرّف فيها على التسلسل والقرار والتكرار؛ وتسويغ أن التكرار يتوقف، بكمية تتناقص في كل جولة.
- البرامج والمترجمات ولغة C++. الخوارزمية المكتوبة لآلة برنامج، وبرنامج C++ لا يُنفَّذ كما يُكتب: فالمعالج المسبق والمترجم والرابط تحوّله إلى ملف تنفيذي. ويجتاز الدرس هذه المراحل الثلاث، ويميّز ما يُكتشف عند الترجمة ممّا لا يظهر إلا عند التنفيذ، ويقارن نموذج الترجمة بنموذج التفسير، ويضع معايير اللغة في سياقها الزمني، حتى C++23، وهو المعيار الذي تستعمله الدورة، وC++26، الذي لا يزال دعمه في المترجمات جاريًا.
- تثبيت بيئة العمل على Windows و macOS و Linux. ثلاثة أدلّة كاملة، دليل لكل نظام، لتثبيت مترجم يدعم C++23 والمحرر Visual Studio Code مع إضافته الخاصة بلغة C++، والتحقّق من أن كل شيء يعمل ببرنامج التحقق، وحلّ المشكلات الشائعة: المترجم الذي لا تعثر عليه الطرفية، والإصدار القديم، والمعيار الذي لم يُطلَب.
- الترجمة والتنفيذ والإعداد. دورة العمل من تحرير وحفظ وترجمة وتنفيذ وقراءة، من الطرفية ومن المحرر، بأمر الترجمة الخاص بالدورة. ويميّز الدرس الأخطاء، التي تمنع الملف التنفيذي، من التحذيرات، التي تشير إلى شيفرة مريبة؛ ويفعّل الكواشف (sanitizers)، كاشف أخطاء الذاكرة، AddressSanitizer، وكاشف السلوك غير المعرَّف، UndefinedBehaviorSanitizer، التي تراقب البرنامج أثناء تشغيله؛ ويشرح لماذا تُظهر المخرجات رموزًا غريبة بدلًا من الحروف العربية.
- تشريح البرنامج. البرنامج الأدنى، قطعة قطعة: توجيه التضمين وملفات الترويسة، والدالة
mainورمز الخروج، وفضاء الأسماءstd، والتعليمات، والكتل، والتعليقات. ويعلّم الدرس تصحيح أخطاء البنية بقراءة رسائل المترجم بدءًا من الأولى، ويثبّت دليل الأسلوب الخاص بالدورة. - المدخلات والمخرجات والأخطاء. يتواصل البرنامج مع الخارج: يكتب بالدالتين
std::printوstd::println، مع مواصفات التنسيق للعرض والمنازل العشرية، ويقرأ بـstd::cin. ويبيّن الدرس ما يحدث حين لا تكون المدخلات على الشكل المتوقَّع وكيف يُتحقَّق من القراءة، ويختم الوحدة بتصنيف الأخطاء بحسب لحظة ظهورها: أخطاء الترجمة، والربط، والتنفيذ، والأخطاء المنطقية.
والخيط الذي يجمعها هو البرنامج نفسه. فالدرس الأول يتصوّره، والثاني يشرح ما يتحوّل إليه، والثالث يثبّت الأدوات التي تحوّله، والرابع يعلّم استعمالها والإصغاء إلى ما تقوله، والخامس يشرّحه، والسادس يجعله يتحاور مع من يستعمله. وإذا كان الأمر كذلك، فإن الطالب في نهاية الوحدة لا يعرف بعدُ عن C++ إلا القليل جدًا، لكنه يعرف كيف يُعمَل بها، وهذا ما تفترضه بقية الدورة.
ما يُفترض أنه معلوم
لا تفترض الدورة أيّ خبرة سابقة في البرمجة. لكنها تفترض ثلاث مهارات تحسن مراجعتها الآن، إن كشف تقييم الدخول عن شكّ ما.
الأولى هي الحساب المدرسي: إجراء العمليات على الأعداد الصحيحة والعشرية، واحترام ترتيب العمليات (الضرب والقسمة قبل الجمع والطرح، ما لم توجد أقواس)، وقبل كل شيء حساب خارج القسمة والباقي في القسمة الصحيحة. وهذه الأخيرة أهمّ ممّا تبدو. فقسمة 47 ورقة على 6 أشخاص تعطي كل واحد 7 ويفضل 5، وهو ما يُكتب ، والباقي أصغر من المقسوم عليه . ولـC++ عامل لخارج القسمة وآخر للباقي، وجزء كبير من الحسابات على الأعداد الصحيحة (تحويل الثواني إلى ساعات، وفصل أرقام عدد، وتقرير ما إذا كان العدد زوجيًا) يرجع إليهما. ومن أراد دراستها بتأنٍّ يجدها، مع برهانها، في دورة الجبر والهندسة 1: الأعداد والدوال وهندسة المستوى؛ وهنا يكفي أن نعرف كيف نحسبها.
الثانية هي عادة اتّباع التعليمات المكتوبة حرفيًا، والتعرّف على اللحظة التي لا تكفي فيها التعليمة لمعرفة ما ينبغي فعله. وليس الأمر معرفةً، بل موقفًا: أن نقرأ «أضف الملح حسب الذوق» فننتبه إلى أن هذه التعليمة تتوقّف على من ينفّذها. والدرس الأول من الوحدة يحوّل هذا الموقف إلى منهج.
الثالثة هي التعامل الأساسي مع الحاسوب: إنشاء مجلد، وحفظ ملف فيه باسم مختار، والتعرّف على امتداد الاسم (.cpp، .txt، .exe)، ومعرفة المجلد الذي يوجد فيه كل ملف. ويحسن ضبط النظام منذ الآن ليُظهر الامتدادات، التي تخفيها بعض الأنظمة افتراضيًا، مثل Windows: فالشيفرة المصدرية suma.cpp والملف التنفيذي suma.exe ملفان مختلفان تمامًا، والخلط بينهما مصدر لأخطاء عبثية. وتعلّم الوحدة أيضًا استعمال الطرفية، فلا حاجة إلى معرفته مسبقًا؛ ويكفي أن نكون مستعدّين لكتابة الأوامر بدلًا من الضغط على الأزرار. وأخيرًا، يقتضي تثبيت البرامج القدرة على فعل ذلك في الحاسوب الخاص؛ ويشير درس التثبيت إلى بديل عبر الإنترنت لمن لا يستطيع.
ولا تُفترض الإنجليزية. فرسائل المترجم بالإنجليزية، والدورة تعلّم قراءتها حقلًا حقلًا، بحيث يُفهم ما يهمّ منها (الملف، والسطر، ونوع العيب) دون إتقان اللغة. ولا تُفترض كذلك أيّ رياضيات تتجاوز الرياضيات المدرسية: فالأمثلة تستعمل القسمة، والمتوسطات، وجداول الضرب، والتواريخ، والساعات.
المسألة التي تحلّها الوحدة
الحساب الذي نعرف إجراءه باليد ليس بعدُ برنامجًا. والمسافة بينهما هي ما تعلّم الوحدة اجتيازه، ومسألة بسيطة تتيح قياسها.
تسجّل ساعة إيقاف مدة كل نشاط عددًا من الثواني، مثل 7384، ونريد كتابتها بالصيغة المعتادة للساعات والدقائق والثواني، مع الدقائق والثواني دائمًا برقمين: 2:03:04. والحساب باليد سلسلة من القسمات: ، ومنه ساعتان و184 ثانية؛ ، ومنه 3 دقائق و4 ثوانٍ. ولمدة واحدة يُنجَز ذلك في دقيقة. أما لألف مدة في سجلّ، فالحساب باليد طويل وعرضة للأخطاء، والمهمة تصلح لأن تنفّذها آلة.
غير أن الآلة لا تستطيع تلقّي الشرح المتقدّم. فهي تتلقّى نصًّا بلغة برمجة، ولكتابة هذا النص يجب أن نكون قد حسمنا قبلُ ثلاث مسائل تركها الحساب اليدوي ضمنية. الأولى هي المواصفات: ما يدخل (عدد صحيح من الثواني، غير سالب)، وما يخرج (ثلاثة أعداد صحيحة: الساعات والدقائق والثواني)، وما العلاقة التي تربطها: إذا كان هو المجموع، فإن ، مع و. والثانية هي الخوارزمية: الخطوات الدقيقة التي تنتج ذلك المخرج لأيّ مدخل مقبول.
- يأخذ قيمة خارج قسمة على .
- يأخذ قيمة خارج القسمة على لباقي قسمة على .
- يأخذ قيمة باقي قسمة على .
- اكتب ، ثم نقطتين، ثم برقمين، ثم نقطتين، ثم برقمين.
والثالثة هي كتابة الخوارزمية بلغة C++، بالشكل الدقيق الذي تقتضيه اللغة، وترجمتها إلى ملف تنفيذي بالأدوات المناسبة. والبرنامج الآتي يفعل ذلك. وفيه أشياء كثيرة لم تُشرح بعد: المتغيرات (الدرس 2.1)، والعاملان / و%، اللذان يعطيان خارج القسمة والباقي في القسمة الصحيحة (الدرس 3.1)، والقراءة بـstd::cin ومواصفات التنسيق (الدرس 1.6)؛ ومواصفة التنسيق {:02} في هذا البرنامج، التي تكتب عددًا في خانتين وتكمل بالأصفار من اليسار، صيغة من العرض الذي يعلّمه ذلك الدرس والذي سيستعمله الدرس 3.1. ويكفي الآن أن نتعرّف فيه على خطوات الخوارزمية الأربع.
#include <iostream>#include <print>int main(){ int total{}; // سيأتي شرح المتغيرات في الدرس 2.1 std::print("المدة بالثواني: "); std::cin >> total; const int hours{total / 3600}; const int minutes{total % 3600 / 60}; const int seconds{total % 60}; std::println("{} s = {}:{:02}:{:02}", total, hours, minutes, seconds);}7384المدة بالثواني: 7384 s = 2:03:04الأسطر من 9 إلى 11 هي الخطوات من 1 إلى 3، والسطر 12 هو الخطوة 4. وتطابق النتيجة مع ما حُسب باليد ليس مصادفة، بل هو الفحص الذي يستحقه كل برنامج: أن يُجرَّب أولًا بمعطى معروف الجواب.
البرنامج يحلّ المسألة، لكن الوحدة تعلّم أيضًا الارتياب فيه. فإذا كتب المستخدم abc بدلًا من عدد، فشلت القراءة، وبقي total صفرًا، وكتب البرنامج، دون أيّ إشارة إنذار، أن المدة 0:00:00: استنتاج خاطئ في مظهر الصحيح. وإذا كتب مدة سالبة، فالمواصفات لا تقول ما يجب أن يحدث، والنتيجة بلا معنى. وإذا كُتب total / 360 بدلًا من total / 3600، فالبرنامج يُترجَم ويُنفَّذ ويعطي نتيجة خاطئة، ولا تنبّه إلى ذلك أيّ أداة. وكل واحد من هذه العيوب ينتمي إلى نوع مختلف من الأخطاء، يُكتشَف في لحظة مختلفة ويُبحث عنه بطريقة مختلفة؛ والدرس الأخير من الوحدة يصنّفها. ويترتّب على ذلك أن المسألة التي تحلّها الوحدة ليست كتابة هذا البرنامج فحسب، بل معرفة لماذا يعمل، ومع أيّ بيانات يكفّ عن العمل، وأيّ أداة ستنبّه، أو لن تنبّه، إلى كل عيب.
ولذلك، في نهاية الوحدة سيستطيع الطالب أن يكتب برامج من هذا النوع ويترجمها وينفّذها: بضعة مدخلات، وبضع عمليات حسابية متتالية، وبضع نتائج مكتوبة بتنسيق. ولن يستطيع بعدُ اتّخاذ القرارات ولا تكرار التعليمات بلغة C++ (وإن استطاع ذلك في خوارزمية مكتوبة بالعربية)، ولا اختيار نوع كل معطى عن بصيرة؛ فذلك ما تأتي به الوحدات اللاحقة.
إلى أين تقود
الوحدة هي عتبة الدورة. وما يُستعمل فيها دون شرح يُشرح لاحقًا، بهذا الترتيب. فالوحدة 2، «البيانات والأنواع»، تشرح المتغيرات وكيف تُخزَّن في الذاكرة، وحدود الأعداد الصحيحة (ولماذا قد يفيض حساب سليم)، وتقريب الأعداد ذات الكسور العشرية، والتحويلات بين الأنواع. والوحدة 3، «التعابير والعوامل»، تشرح الحساب في C++، مع خارج القسمة والباقي للأعداد السالبة، ومنطق الشروط، وما يتركه المعيار غير معرَّف في تعبير ما. والوحدة 4، «التحكم في التدفق»، تنقل إلى C++ القرارات والتكرارات التي يكتبها الدرس الأول بالعربية، وتعلّم تسويغ أن الحلقة صحيحة وأنها تتوقف. والوحدة 5 تقسّم البرامج إلى دوال؛ والوحدة 6 تقدّم البيانات المركبة (المصفوفات، والمتجهات، والجداول، والسجلات)، مع خوارزميات البحث والترتيب وكلفتها؛ والوحدة 7 تتناول النصوص، والقراءة المحكمة للمدخلات، والملفات؛ والوحدة 8 تتناول البرامج متعددة الملفات، والاختبارات المنهجية، ومصحّح الأخطاء.
وبعد هذه الدورة، تواصل دورة البرمجة بلغة C++ II ما تتركه هذه الدورة عمدًا: المؤشرات والذاكرة الديناميكية، والأصناف ذات الطرائق، والقوالب الخاصة، والدوال المجهولة، والاستثناءات. ولا يلزم أيّ من هذه الموضوعات لحلّ مسائل هذه الدورة، وتأجيلها يتيح التركيز على ما يصحّ في أي لغة: تحديد المواصفات، وتصميم الخوارزمية، وكتابتها بوضوح، والتحقّق من صحّتها. وسيجمع درس الخلاصة في هذه الوحدة هذا التمييز تحديدًا، بين ما هو خاص بلغة C++ وما سيُنقل إلى أيّ لغة أخرى.