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

ملخص

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

أهداف التعلم

  1. التصريح بالمتغيرات وتهيئتها بالأقواس المعقوصة، والتمييز بين التهيئة والإسناد في برنامج معطى.
  2. تتبّع حالة برنامج من الإسنادات المتتالية يدويًا بجدول تتبّع، والتنبؤ بذلك بمخرجاته.
  3. اختيار أسماء بالإنجليزية تقول ما يحفظه كل متغير، وفق قواعد اللغة ودليل الدورة.
  4. شرح لماذا كانت قراءة متغير غير مهيَّأ سلوكًا غير معرَّف، والتعرّف عليها في برنامج، والوقاية منها بالتهيئة دائمًا.

المتغير خانةً

في الدرس من المسألة إلى الخوارزمية كُتبت الخوارزميات بحروف مثل qq وrr، كانت تأخذ قيمة ثم أخرى: «rr يأخذ القيمة r−br - b». في الرياضيات يدلّ الحرف على قيمة ثابتة وإن كانت مجهولة؛ أما في الخوارزمية فيدلّ على موضع يتغيّر محتواه. وبرنامج C++ يحتاج إلى الشيء نفسه، ويحصل عليه من ذاكرة الحاسوب.

الذاكرة الرئيسية سلسلة طويلة من البايتات، لكل منها رقمه الترتيبي، أي عنوانه. والمتغير قطعة من هذه الذاكرة يعطيها البرنامج اسمًا ونوعًا. فله إذن أربع سمات:

  1. اسم، يدلّ به البرنامج عليه (count، price)؛
  2. نوع، يحدّد القيم التي يمكن أن يحفظها، وعدد البايتات التي يشغلها، والعمليات التي يقبلها: int يحفظ أعدادًا صحيحة، وdouble أعدادًا ذات منازل عشرية؛
  3. قيمة، هي التي يحفظها في لحظة معيّنة، ويمكن أن تتغيّر في أثناء تنفيذ البرنامج؛
  4. موضع في الذاكرة، يختاره المترجم والنظام، ولا يحتاج البرنامج إلى معرفته في أغلب الأحوال.

الصورة التي يحسن الاحتفاظ بها هي صورة الخانة: الاسم مكتوب فوقها والقيمة داخلها. والنوع هو حجم الخانة وشكلها؛ فخانة int لا تقبل 2.5، كما لا تقبل خانة الرسائل في صندوق البريد طردًا. وترسم أشكال هذا الدرس حالة البرنامج على هذا النحو، وتعيد رسمها بعد كل تعليمة.

ويمكن رؤية أن النوع يحدّد الحجم: فالعامل sizeof يعطي عدد البايتات التي يشغلها متغير أو نوع.

برنامج بلغة C++
#include <print>​int main(){    const int count{12};    const double price{4.5};    std::println("count يشغل {} بايت", sizeof(count));    std::println("price يشغل {} بايت", sizeof(price));}
المخرجات
count يشغل 4 بايتprice يشغل 8 بايت

يشغل int هنا 4 بايت، وdouble يشغل 8. وليست هذه الأرقام واحدة في كل الأنظمة، وعليها يتوقّف عدد القيم المختلفة التي تتّسع لها كل نوع؛ وسيدرس ذلك الدرسان الأعداد الصحيحة وتمثيلها وأعداد الفاصلة العائمة. ويكفي هنا الجوهري: نوع المتغير يُحدَّد عند التصريح به ولا يتغيّر أبدًا؛ أما الذي يتغيّر فقيمته.