ملخص
يفتتح هذا الدرس الوحدة الثانية من الدورة، المخصّصة للبيانات وأنواعها. ويشرح الغاية من الوحدة: أن تعلّم أن كل معطى في البرنامج يقيم في الذاكرة بنوع يحدّد القيم التي يمكن أن يأخذها، والحيّز الذي يشغله، والعمليات التي يقبلها، وأن لهذه الحدود عواقب يمكن ملاحظتها؛ ويعرض دروسها الأربعة والخيط الذي يجمعها، من المتغير بوصفه خانة لها اسم وقيمة إلى التحويلات بين الأنواع والثوابت؛ ويذكّر بما تفترض الوحدة أنه معلوم من الأولى، وهو كتابة برنامج يقرأ ويكتب وترجمته وتنفيذه؛ ويصوغ المسألة التي تحلّها الوحدة، وهي مسألة برنامج يبدو صحيحًا ولا تتطابق حساباته مع حسابات الرياضيات، بدءًا بالمجموع ، الذي لا يساوي في الحاسوب تمامًا؛ ويبيّن إلى أين تقود، في الوحدات اللاحقة وفي دورة البرمجة بلغة C++ II.
أهداف التعلم
- وصف تسلسل محتويات الوحدة، وشرح ما يقدّمه كل درس للدرس الذي يليه.
- تذكّر ما يلزم من الوحدة 1 (دورة الترجمة والتنفيذ، والإخراج المنسَّق، والقراءة بـ
std::cin، وقراءة رسائل المترجم)، ومراجعته عند الحاجة. - الشرح، بمثال، لماذا لا يكون عدد في البرنامج عددًا من أعداد الرياضيات، واستباق سبب كون لا يساوي تمامًا في الحاسوب.
- التعرّف على ما يُنتظر إتقانه في نهاية الوحدة، وتمييزه ممّا سيُتعلَّم في الوحدات اللاحقة.
تقييم الدخول
قبل اجتياز الوحدة يحسن قياس نقطة البداية. وهذا التقييم تقييم ذاتي: لا تُمنح عليه درجة، وغايته الوحيدة توجيه الدراسة. وتتناول الأسئلة الأربعة الأولى ما تفترض الوحدة أنه معلوم من الأولى: تتبّع إجراء خطوة خطوة، وكتابة عدد بمنزلتين عشريتين، والتقريب، وقراءة رسالة خطأ. وتتناول الأسئلة الستة التي تليها، بترتيب الدروس، الأفكار المحورية في الوحدة. ولا أحد ملزم بالإصابة فيها بعدُ، وفي واحد منها يكون «لا أعرف بعدُ» جوابًا صادقًا: فكل جواب، صائبًا كان أو خاطئًا، يشرح المسألة ويسمّي الدرس الذي يعالجها. وتُقاس المهارات نفسها مرة أخرى في النهاية، في درس الخلاصة.
قبل أن تبدأ الوحدة، قِس نقطة انطلاقك. إنه تقييم ذاتي قصير: لا يُمنح عليه درجة، وتُحفظ نتيجته في متصفحك فقط.
السؤال 1من وحدات سابقةيقول إجراء: «1. يأخذ القيمة 17. 2. يأخذ القيمة . 3. يأخذ القيمة ». كم تساوي قيمة في النهاية؟
يفترض أن كل خطوة تنطلق من القيمة الابتدائية؛ والثانية تنطلق من القيمة التي تركتها الأولى.يقرأ «يأخذ القيمة» على أنها مساواة رياضية؛ وهي أمر يستبدل قيمة .يخلط بين المتغير والثابت: قيمة المتغير تتغير كلما أُسندت إليه قيمة أخرى.كل خطوة تنطلق من القيمة التي يحملها في تلك اللحظة، لا من القيمة الابتدائية. واتّباع الإجراء باليد، مع قيمة كل متغير بعد كل خطوة، هو جدول التتبع في الوحدة 1، والدرس 2.1 يجعله الأداة التي نستدلّ بها على حالة البرنامج.راجِع: من المسألة إلى الخوارزمية
السؤال 2من وحدات سابقةماذا تكتب التعليمة
std::println("{:.2f}", 2.0 / 3);؟يظن أن مواصفة التنسيق تبتر؛ وهي تقرّب إلى أقرب منزلة عشرية.يتجاهل مواصفة التنسيق: هذه هي الكتابة دون.2f.يظن أن القسمة صحيحة؛ ومع2.0، الذي فيه منازل عشرية، تكون القسمة حقيقية.مواصفة التنسيق.2fتكتب العدد بمنزلتين عشريتين مع التقريب: فـ يُكتب0.67. والقيمة المخزَّنة لا تتغير؛ تتغير كتابتها فقط.راجِع: المدخلات والمخرجات والأخطاء
السؤال 3من وحدات سابقةيُراد كتابة بمنزلتين عشريتين مع التقريب. ما الذي نحصل عليه؟
يبتر بدلًا من أن يقرّب: يُسقط المنزلة الثالثة دون أن ينظر إليها.يقرّب إلى منزلة عشرية واحدة، لا إلى اثنتين.يزيد المنزلة العشرية الثانية أكثر ممّا ينبغي: يقع بين و، والتقريب يختار أحد هذين العددين.التقريب إلى منزلتين عشريتين هو اختيار أقرب عدد بمنزلتين عشريتين: أقرب إلى منه إلى . وسيبيّن الدرس 2.3 أن الحاسوب يقرّب بالطريقة نفسها، لكن في الأساس 2، وأنه لذلك لا يكاد يُخزَّن أي عدد ذي منازل عشرية تخزينًا تامًّا.راجِع: المدخلات والمخرجات والأخطاء
السؤال 4من وحدات سابقةفي السطر 5 من برنامج
const int pages{12}، وفي السطر 6std::println("{}", pages);. ويكتب المترجم6:5: error: expected ',' or ';' before 'std'. أين العيب؟السطر 6 سليم؛ يشير إليه المترجم لأنه هناك انتبه إلى النقص.stdمعروف؛ والرسالة تقول إنه كان ينتظر فاصلة منقوطة قبله.الرسالة تقولerror، لاwarning: لا يوجد ملف تنفيذي.يكتشف المترجم النقص حين يصادف شيئًا لا يمكن أن يلي التصريح، في بداية السطر 6، فيشير إلى ذلك الموضع. وإذا كان السطر المشار إليه سليمًا، فالعيب في الغالب في نهاية السطر الذي قبله.راجِع: تشريح البرنامج
السؤال 5يصرّح برنامج بـ
int a{2};وint b{7};، ثم ينفّذa = b;وb = 10;. كم تساويaفي النهاية؟يظن أن الإسناد يربط المتغيرين، كأنaاسم آخر لـb؛ وهو إنما ينسخ القيمة.يقرأa = bمعكوسًا، كأنه ينسخaفيb؛ والقيمة تنتقل من اليمين إلى اليسار.يجمع القيمتين؛ والإسناد يستبدل ولا يراكم.الإسنادa = bينسخ فيaالقيمة التي تحملهاbفي تلك اللحظة؛ وبعد ذلك تكونaوbخانتين مستقلتين، وتغييرbلا يغيّرa.راجِع: المتغيرات والذاكرة
السؤال 6كيف يُكتب العدد 13 في الأساس 2؟
هذا جواب صادق: الدرس 2.2 يعلّم كتابة عدد في الأساس 2 وقراءته، وتقييم الخروج سيسأل عنه مرة أخرى.يقرأ بواقي القسمة المتتالية بالترتيب الذي تظهر به؛ وهي تُقرأ من الأخير إلى الأول.يخطئ في جمع الأوزان: .في الأساس 2 تزن كل منزلة ضعف المنزلة التي على يمينها، والأرقام 0 و1 فقط. ويعلّم ذلك الدرس 2.2، لأن كل عدد صحيح في البرنامج يُخزَّن هكذا.راجِع: الأعداد الصحيحة وتمثيلها
السؤال 7متغير
intمن 4 بايت يخزّن ، قيمته العظمى، ويضيف إليه البرنامج 1. ما الذي يمكن تأكيده؟يتجاهل حدّ التمثيل: هذا العدد لا يتّسع لهintمن 4 بايت.هكذا تسلك الأعداد الصحيحة عديمة الإشارة، التي حسابها حساب بترديد؛ أما الأعداد الصحيحة ذات الإشارة فالمعيار لا يضمن ذلك.المترجم لا يعرف القيم التي سيحملها البرنامج عند التنفيذ، إلا إذا كانت ثوابت؛ وهو في الغالب يترجم دون أن يقول شيئًا.للعدد الصحيح في البرنامج عدد ثابت من البتات، ومعه مدى قيم محدود. والخروج من مدى عدد صحيح ذي إشارة يخالف الشرط المسبق للجمع؛ والكاشف (sanitizer) المستخدم في الدورة يوقف البرنامج، ودونه قد يكتب البرنامج أي شيء. ويدرس ذلك الدرس 2.2.راجِع: الأعداد الصحيحة وتمثيلها
السؤال 8هل لـ تمثيل عشري منتهٍ؟
تقريب: ، لا 1.مهما كُتب منها، يبقى دائمًا باقٍ؛ فالتمثيل دوري لا منتهٍ.إنها خاصية للعدد وللأساس، لا للأداة؛ والآلة الحاسبة لا تعرض إلا تقريبًا.للكسر غير القابل للاختزال تمثيل عشري منتهٍ إذا وفقط إذا لم يكن لمقامه عوامل أولية غير 2 و5، وهما عاملا الأساس 10. وفي الأساس 2 الشرط أشدّ: يجب أن يكون المقام قوة للعدد 2، ولهذا ليس لـ تمثيل ثنائي منتهٍ. ويستخلص الدرس 2.3 من ذلك نتائجه.راجِع: أعداد الفاصلة العائمة
السؤال 9ماذا تكتب
std::println("{}", 0.1 + 0.2);؟يفترض أن الحاسوب يجمع كسورًا عشرية تامة؛ وهو يجمع تقريبات ثنائية.يخلط بين الكتابة الافتراضية ومواصفة التنسيق{:.2f}، التي تقرّب إلى منزلتين عشريتين.جمع قيمتين من نوعdoubleمشروع؛ والمدهش هو نتيجته لا كتابته.لا ولا يُخزَّنان بالضبط في النظام الثنائي، ومجموع تقريبيهما ليس تقريب . والدالةstd::printlnتكتب أقصر تمثيل عشري يحدّد القيمة المخزَّنة، وهذا التمثيل يكشف الفرق. ويشرح الدرس 2.3 رقمًا رقمًا من أين يأتي.راجِع: أعداد الفاصلة العائمة
السؤال 10يصرّح برنامج بـ
const double ratio{7 / 2};ويكتبratio. ماذا يظهر؟يظن أن نوع المتغير هو الذي يقرّر كيف تجري القسمة؛ والذي يقرّر ذلك هو نوع المعامَلات.يظن أن القسمة الصحيحة تقرّب؛ وهي تُسقط الجزء العشري.القيمة 3 ثابتة وتُمثَّل بالضبط فيdouble: لا ضياع فيها، والأقواس المعقوصة تقبلها.القسمة7 / 2قسمة بين عددين صحيحين، وتعطي خارج القسمة الصحيح، 3؛ ولا يُحوَّل هذا الـ 3 إلىdoubleإلا بعد ذلك. فأيّ قسمة تُجرى يتقرّر داخل العملية، بحسب نوع المعامَلات، لا عند تخزين النتيجة. ويعلّم الدرس 2.4 أين يوضع التحويل للحصول على 3.5.
جارٍ تحميل المحتوى…