सारांश
अंकगणितीय व्यंजक की गणना बाएँ से दाएँ, जैसे वह पढ़ा जाता है, नहीं होती, बल्कि एक छिपी संरचना, उसके वृक्ष, के अनुसार होती है, जिसे संक्रियकों की प्राथमिकता, उनकी साहचर्यता और कोष्ठक तय करते हैं; और उस वृक्ष के हर नोड पर संकार्यों का प्रकार तय करता है कि कौन-सी संक्रिया होगी, जिससे 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.417 को 5 से भाग देने पर 3 आता है और 2 बचते हैं: ये 17 वस्तुओं को 5-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); | ~~~ ^ ~वास्तविक विभाजन का शेषफल होता है, और उसे हेडर <cmath> का फ़ंक्शन std::fmod निकालता है, जिसका अध्ययन पाठ बिट और गणितीय लाइब्रेरी में घात के साथ होगा: C++ में घात का कोई संक्रियक नहीं है, और 2 ^ 3 का मान 8 नहीं, बल्कि कुछ और है, जो वहाँ समझाया जाएगा।
सामग्री लोड हो रही है…