ملخص
لا يُحسب التعبير الحسابي من اليسار إلى اليمين كما يُقرأ، بل وفق بنية خفية، هي شجرته، تحدّدها أسبقية العوامل وتجميعيتها والأقواس؛ وفي كل عقدة من هذه الشجرة يقرّر نوع المعامَلات أيّ عملية تُجرى، بحيث يساوي 7 / 2 العدد 3 ويساوي 7 / 2.0 العدد 3.5. يدرس هذا الدرس العوامل الحسابية الخمسة في C++ مع الأعداد الصحيحة والحقيقية؛ والقسمة الصحيحة والباقي، اللذين يبتران نحو الصفر منذ C++11، ومن ذلك يلزم أن الباقي يأخذ إشارة المقسوم ويختلف عن باقي القسمة الإقليدية حين يكون المقسوم سالبًا؛ وطريقة الحصول على الباقي الإقليدي؛ وشجرة التعبير؛ ونوع النتيجة حين تكون المعامَلات من أنواع مختلفة، والطريقتين اللتين يفقد بهما تعبير حسابي صحيح معناه: القسمة على الصفر والفيضان في حساب وسيط.
أهداف التعلم
- حساب خارج القسمة والباقي في القسمة الصحيحة في C++، ومع المعامَلات السالبة أيضًا، وربطهما بخارج القسمة والباقي في القسمة الإقليدية.
- رسم شجرة التعبير الحسابي وفق الأسبقية والتجميعية، وحساب قيمته.
- التنبّؤ بنوع نتيجة عملية بين معامَلات من أنواع مختلفة.
- استعمال القسمة الصحيحة والباقي لتفكيك الكميات: أرقام عدد، ومدة بالساعات والدقائق، ويوم من أيام الأسبوع.
العوامل الحسابية
في C++ خمسة عوامل حسابية ثنائية: الجمع +، والطرح -، والضرب *، والقسمة /، والباقي %؛ وفيها فوق ذلك عامل السالب الأحادي، الذي يغيّر إشارة معامَله الوحيد، كما في -x، وعامل موجب أحادي، +x، يتركه على حاله. تنطبق الأربعة الأولى على الأعداد الصحيحة والحقيقية؛ والباقي على الصحيحة وحدها. غير أن الكتابة نفسها لا تدلّ على العملية نفسها في جميع الحالات: إذا كان معامَلا / صحيحين، كانت القسمة صحيحة ونتيجتها عدد صحيح، هو خارج القسمة دون الجزء الكسري؛ وإذا كان أحدهما حقيقيًا، كانت القسمة حقيقية. وقد بيّن الدرس المحارف والقيم المنطقية والتحويلات والثوابت أوضح نتائج هذه القاعدة، وهي أن double r{7 / 2}; يخزّن 3: فالقسمة جرت بين عددين صحيحين قبل أن تُحوَّل النتيجة إلى عدد حقيقي.
يطبّق البرنامج العوامل الخمسة على 17 و5، ويعيد القسمة بمقسوم حقيقي.
#include <print>int main(){ const int a{17}; const int b{5}; std::println("{} + {} = {}", a, b, a + b); std::println("{} - {} = {}", a, b, a - b); std::println("{} * {} = {}", a, b, a * b); std::println("{} / {} = {}", a, b, a / b); std::println("{} % {} = {}", a, b, a % b); const double x{17.0}; std::println("{} / {} = {}", x, b, x / b);}17 + 5 = 2217 - 5 = 1217 * 5 = 8517 / 5 = 317 % 5 = 217 / 5 = 3.4قسمة 17 على 5 تعطي 3 ويبقى 2: وهما خارج القسمة والباقي عند توزيع 17 شيئًا في مجموعات من 5. ويقسم السطر الأخير عددًا حقيقيًا على عدد صحيح فيحصل على 3.4. وينبغي التنبيه إلى أن std::println تكتب العدد الحقيقي 17.0 على الصورة «17»: فالعنصر النائب الفارغ يكتب أقصر تمثيل للقيمة، بحيث لا يكشف المكتوب عن النوع؛ ولرؤيته تُطلب منازل عشرية بـ {:.1f}.
لا يقبل العامل % الأعداد الحقيقية. فكتابة 7.5 % 2 ليست خطأً منطقيًا يكتشفه البرنامج عند تنفيذه، بل خطأ في الترجمة: يقول المترجم إن المعامَلين من النوعين double وint غير صالحين للعامل.
#include <print>int main(){ std::println("{}", 7.5 % 2);}main.cpp: In function ‘int main()’:main.cpp:5:28: error: invalid operands of types ‘double’ and ‘int’ to binary ‘operator%’ 5 | std::println("{}", 7.5 % 2); | ~~~ ^ ~باقي القسمة الحقيقية موجود، وتحسبه الدالة std::fmod من ملف الترويسة <cmath>، التي ستُدرس في الدرس البتات والمكتبة الرياضية، مع القوة: فليس في C++ عامل للقوة، و2 ^ 3 لا يساوي 8، بل شيئًا آخر سيُشرح هناك.
جارٍ تحميل المحتوى…