सारांश
यह पाठ पाठ्यक्रम की पाँचवीं इकाई खोलता है, जो फ़ंक्शनों को समर्पित है। यह बताता है कि इकाई किसलिए है: किसी समस्या को नाम वाले हिस्सों में विघटित करना सिखाना, हर हिस्से को एक इंटरफ़ेस और एक अनुबंध के साथ, और कुछ समस्याओं को उन्हीं के एक छोटे उदाहरण तक घटाकर हल करना सिखाना, यानी पुनरावर्तन से; इसके चार पाठों और उन्हें जोड़ने वाले सूत्र को प्रस्तुत करता है; उसे याद दिलाता है जिसे इकाई ज्ञात मानती है, ख़ासकर इकाई 4 के लूप और उनके निश्चर; उस समस्या को सूत्रबद्ध करता है जिसे इकाई हल करती है, यानी एक ऐसे प्रोग्राम की समस्या जो एक ही गणना को कॉपी करके दोहराता है और कॉपी करते समय हुई एक चूक के कारण ग़लत उत्तर देता है, जबकि कंपाइलर कुछ नहीं कहता; अनुबंध (पूर्व-शर्त और पश्च-शर्त) को पहले से उस रूप के तौर पर प्रस्तुत करता है जिससे इकाई हर हिस्से का विनिर्देश लिखेगी; और दिखाता है कि यह इकाई कहाँ ले जाती है, आगे की इकाइयों में और C++ में प्रोग्रामिंग II पाठ्यक्रम में।
अधिगम उद्देश्य
- इकाई की विषय-वस्तु के क्रम का वर्णन करना और समझाना कि हर पाठ अपने बाद वाले पाठ को क्या देता है।
- इकाई 4 के एल्गोरिदमों (लूप का ट्रेस, उसका निश्चर और उसका वैरिएंट) को याद करना और ज़रूरत हो तो उन्हें दोहराना।
- एक उदाहरण के सहारे अनुबंध के विचार का पूर्वाभास पाना: प्रोग्राम का कोई हिस्सा अपने उपयोगकर्ता से क्या माँगता है और बदले में उसे किस बात की गारंटी देता है।
- पहचानना कि इकाई पूरी करने पर क्या कर पाना अपेक्षित है, और उसे उससे अलग करना जो आगे की इकाइयों में सीखा जाएगा।
प्रवेश मूल्यांकन
इकाई शुरू करने से पहले आरंभ-बिंदु को माप लेना उपयोगी है। यह मूल्यांकन एक स्व-मूल्यांकन है: इसमें अंक नहीं दिए जाते, और इसका एकमात्र उद्देश्य अध्ययन को दिशा देना है। पहले पाँच प्रश्न उसे जाँचते हैं जिसे इकाई ज्ञात मानती है: लूप का ट्रेस, उसका निश्चर, किसी विनिर्देश की पूर्व-शर्त, इनिशियलाइज़ेशन में किसी मान की प्रति, और इकाई 4 के किसी प्रोग्राम के भीतर ऐसी गणना की खोज जिसके अपने इनपुट और आउटपुट हों। उसके बाद के पाँच प्रश्न, पाठों के क्रम से, इकाई के केंद्रीय विचारों को छूते हैं: कॉल स्टैक, आर्ग्युमेंट का पास किया जाना, गणना और प्रस्तुति का अलगाव, क्रमगुणित की पुनरावर्ती परिभाषा, और स्वयं को कॉल करने वाले फ़ंक्शन का निष्पादन। अभी इनके सही उत्तर देने के लिए कोई बाध्य नहीं है, और इनमें से कुछ में “मुझे अभी नहीं पता” एक ईमानदार उत्तर है: हर उत्तर, सही हो या ग़लत, बात को समझाता है और उस पाठ का नाम बताता है जिसमें वह बात आती है। यही कौशल अंत में, सारांश वाले पाठ में, फिर से मापे जाते हैं।
इकाई शुरू करने से पहले अपना आरंभ बिंदु मापें। यह एक छोटा स्व-मूल्यांकन है: इस पर अंक नहीं दिए जाते और इसका परिणाम केवल आपके ब्राउज़र में रहता है।
प्रश्न 1पिछली इकाइयों से
int n{305}; int c{1}; while (n >= 10) { n = n / 10; ++c; } std::println("{}", c);क्या लिखता है?चक्कर गिनता है और भूल जाता है किc1 से शुरू होता है।एक चक्कर अधिक लगाता है: होने पर शर्तn >= 10पहले से असत्य है।काउंटर को पहले चक्कर के बादnके मान से उलझा देता है।ट्रेस से और मिलते हैं: बॉडी दो बार चलती है, और होने पर शर्त विफल हो जाती है। यह लूप किसी प्राकृत संख्या के अंक गिनता है; पाठ फ़ंक्शन इसे नाम और अनुबंध वाले एक फ़ंक्शन में बंद करता है, और पाठ पुनरावर्तन इसे बिना लूप के लिखता है।दोहराएँ: लूप
प्रश्न 2पिछली इकाइयों सेलूप
int total{0}; int k{1}; while (k <= n) { total += k; ++k; }में, जहाँ है, हर बार शर्त की जाँच होते समय कौन-सा संबंध सत्य रहता है?यह चक्कर के बीच में सत्य है, जोड़ने के बाद और बढ़ाने से पहले, पर शर्त की जाँच के समय नहीं।यह केवल अंत में सत्य है: यह पश्च-शर्त है, निश्चर नहीं।यह लूप की शर्त है, और ठीक बाहर निकलते समय असत्य होती है; निश्चर तब भी सत्य रहता है।यह आरंभ में सत्य है, जब योग रिक्त है और ; और यदि यह किसी चक्कर से पहले सत्य है तो उसके बाद भी सत्य है, क्योंकि वह चक्कर को जोड़ता है और फिर उसे बढ़ाता है। बाहर निकलते समय , और निश्चर 1 से तक का योग देता है। पाठ पुनरावर्तन अपने फ़ंक्शनों को आगमन पर आधारित इसी तर्कणा से उचित ठहराता है।दोहराएँ: सही लूप की रचना
प्रश्न 3पिछली इकाइयों सेविभाजन का विनिर्देश कहता है: “पूर्णांक और दिए होने पर, और ज्ञात करें जिनके लिए और ”। इसकी पूर्व-शर्त क्या है?
पूर्व-शर्त को पश्च-शर्त से उलझा देता है: यह वह है जिसे परिणाम संतुष्ट करता है, न कि वह जो डेटा से माँगा जाता है।यह आउटपुट पर एक शर्त है, इनपुट पर नहीं।होने पर ऐसा कोई नहीं है जिसके लिए हो: समस्या का कोई हल नहीं है, और पूर्व-शर्त इस स्थिति को बाहर रखती है।पूर्व-शर्त वह है जो समस्या का हल होने के लिए डेटा से माँगी जाती है; पश्च-शर्त वह है जिसे परिणाम संतुष्ट करता है। इकाई इस जोड़ी को हर फ़ंक्शन के अनुबंध में बदल देती है: पूर्व-शर्त कॉल करने वाले को बाँधती है, और पश्च-शर्त फ़ंक्शन को।दोहराएँ: समस्या से एल्गोरिदम तक
प्रश्न 4पिछली इकाइयों से
int a{3}; int b{a}; b = 7;के बादaका मान कितना है?मानता है किbऔरaसदा के लिए जुड़े रहते हैं; इनिशियलाइज़ेशन मान की प्रति बनाता है, सेल की नहीं।प्रति को बिना इनिशियलाइज़ किए चर से उलझा देता है:aको 3 मिला और किसी चीज़ ने उसे नहीं बदला।इनिशियलाइज़ेशनint b{a}bकी मेमोरी सेल में वह मान कॉपी करता है जोaके पास था; उसके बाद दोनों सेल स्वतंत्र हैं। पाठ पैरामीटर और स्कोप दिखाता है कि पैरामीटर भी इसी तरह, आर्ग्युमेंट की एक प्रति से, इनिशियलाइज़ होता है, और दूसरी संभावना सिखाता है: उसी सेल का एक दूसरा नाम।दोहराएँ: चर और मेमोरी
प्रश्न 5पिछली इकाइयों सेपाठ 4.4 के उस प्रोग्राम में, जो 100 से छोटी अभाज्य संख्याएँ लिखता है, एक लूप है जो उम्मीदवारों पर चलता है और, उसके भीतर, एक और लूप जो उनके भाजकों को परखता है। कौन-सा हिस्सा अपने इनपुट और आउटपुट वाली ऐसी गणना है जिसे नाम देना उचित होगा?
पूरे प्रोग्राम के इनपुट और आउटपुट को किसी भीतरी गणना के इनपुट और आउटपुट से उलझा देता है।यह एक स्टेटमेंट है, अपने अर्थ वाली गणना नहीं: इसका कोई ऐसा इनपुट और परिणाम नहीं है जिसका कोई उपयोग करना चाहे।किसी डेटा को किसी काम से उलझा देता है: चर गणना का परिणाम रखता है, पर वह स्वयं गणना नहीं है।भीतरी लूप उम्मीदवार के सिवा किसी और चीज़ पर निर्भर नहीं करता, और उसका परिणाम हाँ या नहीं है। उसे नाम देने से बाहरी लूप उसके विनिर्देश की तरह पढ़ा जाता है: “हर उम्मीदवार के लिए, यदि वह अभाज्य है, तो उसे लिखो”। पाठ फ़ंक्शनों से डिज़ाइन उस प्रोग्राम को इसी तरह फिर से लिखता है।दोहराएँ: संख्यात्मक एल्गोरिदम
प्रश्न 6एक प्रोग्राम
mainमें शुरू होता है;mainएक फ़ंक्शनgको कॉल करता है, औरgएक दूसरे फ़ंक्शनhको कॉल करता है। जब तकhचल रहा है, कौन-सी कॉल जारी हैं?मानता है कि कॉल करने वाला कॉल करते ही ग़ायब हो जाता है; वास्तव में वह प्रतीक्षा करता है, ताकि वहीं से आगे बढ़े जहाँ रुका था।मानता है किgनेhको कॉल करते ही काम पूरा कर लिया; वह तब समाप्त होगा जबhउसे नियंत्रण लौटाएगा।यह एक ईमानदार उत्तर है: पाठ 5.1 इसे स्टैक के एक चित्र से समझाता है।प्रश्न 7फ़ंक्शन
int f(int x) { x = x + 1; return x; }के साथ,int a{3}; int b{f(a)}; std::println("{} {}", a, b);क्या लिखता है?मानता है कि फ़ंक्शन आर्ग्युमेंट को बदल देता है; डिफ़ॉल्ट रूप से उसे एक प्रति मिलती है।मानता है किxका बदलाव रिटर्न मान तक भी नहीं पहुँचता।मानता है कि पैरामीटर को बदला नहीं जा सकता; बदला जा सकता है, जब तक उसेconstघोषित न किया गया हो।पैरामीटरxफ़ंक्शनfका एक चर है जो आर्ग्युमेंट की एक प्रति से इनिशियलाइज़ होता है: फ़ंक्शन प्रति को बदलता है और 4 लौटाता है, औरaअपना 3 बनाए रखता है। यह मान द्वारा पास करना है, C++ का डिफ़ॉल्ट तरीका।दोहराएँ: पैरामीटर और स्कोप
प्रश्न 8एक प्रोग्राम एक तारीख़ पढ़ता है और उसे उस दिन का सप्ताह-दिवस लिखना है। कौन-सा विघटन गणना को प्रस्तुति से अलग करता है?
दो कामों को मिला देता है: जो गणना हुई उसका न पुनःउपयोग हो सकता है, न उसकी तुलना किसी अपेक्षित मान से।काम तो अलग करता है, पर उन्हें एक छिपे प्रभाव से जोड़ता है: कॉल पढ़ने वाला नहीं देख पाता कि डेटा कहाँ से आता है।यह एक ईमानदार उत्तर है: पाठ 5.3 सिखाता है कि कौन-से फ़ंक्शन लिखे जाएँ, यह कैसे तय करें।इस तरह गणना का परीक्षण संख्याओं से, स्क्रीन देखे बिना, किया जा सकता है, और वह किसी ऐसे दूसरे प्रोग्राम के काम आ सकती है जो परिणाम को किसी और ढंग से लिखे। पाठ 5.3 इस कसौटी को “एक फ़ंक्शन, एक काम” कहता है।दोहराएँ: फ़ंक्शनों से डिज़ाइन
प्रश्न 9निम्नलिखित परिभाषाओं में से कौन-सी को परिभाषित करती है, हर प्राकृत संख्या के लिए?
आधार स्थिति के बिना परिभाषा कभी नहीं रुकती: को की ओर भेजा जाता, और यों ही अंतहीन।यह को के लिए ठीक परिभाषित करती है, पर को अपरिभाषित छोड़ देती है, जिसका मान 1 है।यह को स्वयं उसी से परिभाषित करती है: परिभाषा चक्रीय है और समस्या को छोटा नहीं करती।एक आधार स्थिति जो किसी चीज़ पर निर्भर नहीं करती, और एक पुनरावर्ती स्थिति जो को तक घटाती है: की गणना के लिए तक उतरते हैं और लौटते समय गुणा करते हैं। पाठ पुनरावर्तन इस परिभाषा को स्वयं को कॉल करने वाले एक फ़ंक्शन में अनूदित करता है।दोहराएँ: पुनरावर्तन
प्रश्न 10
int f(int n) { if (n == 0) { return 0; } return n + f(n - 1); }के साथ,std::println("{}", f(3));क्या लिखता है?मानता है कि केवल एक कॉल चलती है, या आर्ग्युमेंट को परिणाम से उलझा देता है।मानता है कि आधार स्थिति काreturn 0पूरी शृंखला का परिणाम है; वह केवल अंतिम कॉल का परिणाम है।फ़ंक्शन का नाम उसके हेडर से ही ज्ञात होता है, और उसका उपयोग उसकी अपनी बॉडी में किया जा सकता है।f(3)f(2)की प्रतीक्षा करता है, जोf(1)की प्रतीक्षा करता है, जोf(0)की प्रतीक्षा करता है; यह 0 लौटाता है, और लौटते समय 1, 2 और 3 जुड़ते हैं। फ़ंक्शन की गणना करता है, वही योग जो दूसरे प्रश्न का लूप देता है।दोहराएँ: पुनरावर्तन
सामग्री लोड हो रही है…