सारांश
यह पाठ पाठ्यक्रम की पहली इकाई का आरंभ करता है, जो C++ में प्रोग्रामिंग के पहले कदमों को समर्पित है। यह बताता है कि इकाई किसलिए है: जिसने कभी प्रोग्राम नहीं लिखा, उसे साधारण भाषा में कही गई एक समस्या से लेकर ऐसे प्रोग्राम तक ले जाना जो कंपाइल होता है, चलता है, डेटा पढ़ता है और परिणाम लिखता है, और साथ ही यह जानना कि रास्ते में हर उपकरण ने क्या किया; यह इकाई के छह पाठों और उन्हें जोड़ने वाले सूत्र को प्रस्तुत करता है, हिंदी में लिखे गए एल्गोरिदम से लेकर त्रुटियों के वर्गीकरण तक; यह स्पष्ट करता है कि कितना थोड़ा पहले से ज्ञात माना गया है, अर्थात् स्कूली अंकगणित, लिखित निर्देशों का पालन करने की आदत और फ़ाइलों तथा फ़ोल्डरों का उपयोग; यह उस समस्या को सामने रखता है जिसे इकाई हल करती है, यानी हाथ से किए जा सकने वाले किसी परिकलन को ऐसी प्रक्रिया में बदलना जिसे एक मशीन बिना ग़लती किए और बिना थके निष्पादित करती है; और यह दिखाता है कि यह इकाई कहाँ ले जाती है, आगे की इकाइयों में और C++ में प्रोग्रामिंग II पाठ्यक्रम में।
अधिगम उद्देश्य
- इकाई की विषय-वस्तु के क्रम का वर्णन करना और यह समझाना कि हर पाठ अपने बाद वाले पाठ को क्या देता है।
- पाठ्यक्रम जिस पूर्व-ज्ञान को मानकर चलता है (पूर्णांकों और दशमलव संख्याओं पर संक्रियाएँ, भागफल और शेषफल की गणना, लिखित निर्देशों का पालन, किसी निर्धारित फ़ोल्डर में फ़ाइल सहेजना), उसे पहचानना और ज़रूरत हो तो दोहराना।
- एक उदाहरण के साथ उस रास्ते को समझाना जिस पर चलना इकाई सिखाती है: समस्या के कथन से विनिर्देश तक, विनिर्देश से एल्गोरिदम तक और एल्गोरिदम से उस प्रोग्राम तक जो कंपाइल होता है और चलता है।
- पहचानना कि इकाई के अंत में क्या करना आना चाहिए, और उसे उससे अलग करना जो आगे की इकाइयों में सीखा जाएगा।
प्रवेश मूल्यांकन
इकाई शुरू करने से पहले आरंभ-बिंदु को माप लेना उपयोगी है। यह मूल्यांकन एक स्व-मूल्यांकन है: इसमें अंक नहीं दिए जाते, और इसका एकमात्र उद्देश्य अध्ययन को दिशा देना है। चूँकि यह पाठ्यक्रम की पहली इकाई है, इसलिए पूर्ववर्ती इकाइयों पर कोई प्रश्न नहीं है; उनकी जगह, पहले तीन प्रश्न उसे जाँचते हैं जिसे पाठ्यक्रम पहले से ज्ञात मानता है: पूर्णांक विभाजन का भागफल और शेषफल, किसी प्रक्रिया के चरणों का क्रम, और किसी फ़ाइल का नाम, एक्सटेंशन और फ़ोल्डर। उसके बाद के सात प्रश्न, क्रम से, इकाई के छह पाठों के केंद्रीय विचारों को छूते हैं। जिसने कभी प्रोग्राम नहीं लिखा, उसे इनके सही उत्तर की अपेक्षा नहीं करनी चाहिए, और इससे कोई फ़र्क़ नहीं पड़ता: हर उत्तर, सही हो या ग़लत, बात को समझाता है और उस पाठ का नाम बताता है जिसमें वह बात आती है। यही कौशल अंत में, सारांश वाले पाठ में, फिर से मापे जाते हैं।
इकाई शुरू करने से पहले अपना आरंभ बिंदु मापें। यह एक छोटा स्व-मूल्यांकन है: इस पर अंक नहीं दिए जाते और इसका परिणाम केवल आपके ब्राउज़र में रहता है।
प्रश्न 1पिछली इकाइयों से47 पन्ने 6 लोगों में बराबर-बराबर पूरे हिस्सों में बाँटे जाते हैं, और जो पन्ने एक पूरे चक्कर के लिए काफ़ी नहीं होते, वे रख लिए जाते हैं। हर व्यक्ति को कितने मिलते हैं और कितने रख लिए जाते हैं?
यह दशमलव वाला विभाजन है, पूर्णांक विभाजन नहीं: पन्ने काटे नहीं जाते, और प्रश्न पूछता है कि कितने बचते हैं।भागफल को ऊपर की ओर पूर्णांकित करने के लिए ऐसे पन्ने चाहिए जो हैं ही नहीं; जब भाज्य और भाजक धनात्मक हों, तो पूर्णांक विभाजन का शेषफल कभी ऋणात्मक नहीं होता।शेषफल को भागफल के दशमलव भाग से उलझा देता है: शेषफल पन्नों में गिना जाता है, चक्कर के अंशों में नहीं।यह पूर्णांक विभाजन है: भागफल पूरे चक्करों की सबसे बड़ी संख्या है, और शेषफल वह है जो बचता है, जो हमेशा भाजक से छोटा होता है। पाठ्यक्रम पहले प्रोग्राम से ही इसका उपयोग करता है, और C++ में इसके अपने संक्रियक हैं।दोहराएँ: समस्या से एल्गोरिदम तक
प्रश्न 2पिछली इकाइयों सेईमेल से कोई फ़ाइल संलग्न करके भेजने के चार चरण हैं: A, प्राप्तकर्ता का पता लिखना; B, “भेजें” दबाना; C, एक नया संदेश खोलना; D, फ़ाइल संलग्न करना। उपयुक्त क्रम कौन-सा है?
गिनाने का क्रम निष्पादन का क्रम नहीं है: उस क्रम में संदेश अपने अस्तित्व में आने से पहले ही भेज दिया जाता।परिणाम क्रम पर निर्भर करता है: भेजने के बाद जो संलग्न किया जाता है, वह नहीं पहुँचता।संदेश बिना प्राप्तकर्ता और बिना संलग्नक के भेज देता है; बाद के चरण उसे अब नहीं बदलते।कुछ चरण दूसरों पर निर्भर होते हैं (जो संदेश खोला ही नहीं गया उसमें कुछ संलग्न नहीं किया जा सकता, और जो भेजा जा चुका उसे पूरा नहीं किया जा सकता), और कुछ नहीं। इन निर्भरताओं को पहचानना ही वह पहली चीज़ है जिसकी माँग एल्गोरिदम लिखना करता है।दोहराएँ: समस्या से एल्गोरिदम तक
प्रश्न 3पिछली इकाइयों सेएक फ़ाइल
C:\Users\ana\programas\suma.cppमें सहेजी गई है। उसका नाम क्या है, उसका एक्सटेंशन क्या है, और वह किस फ़ोल्डर में है?फ़ाइल वाले फ़ोल्डर को स्वयं फ़ाइल समझ लेता है: नाम पथ का अंतिम घटक होता है।एक्सटेंशन नाम का हिस्सा है; कुछ सिस्टम उसे डिफ़ॉल्ट रूप से छिपा देते हैं, और पाठ्यक्रम उसे दिखाने को कहता है, क्योंकिsuma.cppऔरsuma.exeबहुत अलग फ़ाइलें हैं।C:वह ड्राइव है जहाँ से पथ शुरू होता है, कोई एक्सटेंशन नहीं।पथ रूट फ़ोल्डर से लेकर फ़ाइल तक के फ़ोल्डरों को गिनाता है; एक्सटेंशन, यानी नाम के अंतिम बिंदु के बाद आने वाला हिस्सा, बताता है कि उसमें किस तरह की सामग्री है:.cppC++ का स्रोत कोड है। उसे कंपाइल करने के लिए टर्मिनल को उसी फ़ोल्डर में होना चाहिए या उसे पूरा पथ मिलना चाहिए।दोहराएँ: कंपाइल करना, चलाना और कॉन्फ़िगर करना
प्रश्न 4एक नुस्ख़ा कहता है: “यदि आटा सूखा है, तो एक चम्मच पानी डालो और गूँधो; तब तक दोहराओ जब तक वह सूखा न रहे।” आटे को सूखा न रहने के लिए ठीक तीन चम्मच चाहिए। यह कितनी बार पूछा जाता है कि आटा सूखा है या नहीं?
उस प्रश्न को नहीं गिनता जिसका उत्तर “नहीं” है, जो भी पूछा जाता है: उसके बिना किसी को पता न चलता कि पानी डालना बंद करना है।प्रक्रिया के लिखित रूप को उसके निष्पादन से उलझा देता है: शर्त एक बार लिखी है, पर हर चक्कर में जाँची जाती है।चम्मचों के बीच के अंतरालों को गिनता है, प्रश्नों को नहीं।हर उस पुनरावृत्ति में जो काम करने से पहले पूछती है, शर्त की जाँच बॉडी के निष्पादन से एक बार अधिक होती है: अंतिम प्रश्न ही वह है जो बाहर निकलने देता है। प्रक्रिया को हाथ से, गिनते हुए, चलाने पर यह बिना किसी अस्पष्टता के दिख जाता है।दोहराएँ: समस्या से एल्गोरिदम तक
प्रश्न 5इनमें से किस निर्देश का पालन कोई भी व्यक्ति, या कोई मशीन, ठीक एक ही तरह से कर सकता है?
यह निष्पादित करने वाले के स्वाद पर निर्भर है: दो लोग इसका पालन अलग-अलग ढंग से करेंगे, और मशीन का कोई स्वाद नहीं होता।यह नहीं बताता कि कितनी बार, न यह कि ठीक होना क्या है: समाप्ति की शर्त की जाँच नहीं हो सकती।संख्याएँ तय नहीं करता: “बड़ी” कोई मात्रा नहीं है, और भाजक शून्य हो सकता है।यह बताता है कि कौन-सी संक्रिया की जाती है, किस डेटा के साथ, और परिणाम कहाँ रहता है; कुछ भी उसे निष्पादित करने वाले के विवेक पर निर्भर नहीं करता। यही सुनिश्चितता एल्गोरिदम की तीन माँगों में से एक है।दोहराएँ: समस्या से एल्गोरिदम तक
प्रश्न 6एक प्रोग्राम बिना त्रुटियों और बिना चेतावनियों के कंपाइल होता है, बहुत-से डेटा के साथ ठीक चलता है, और एक ख़ास डेटा के साथ “division by zero” संदेश देकर रुक जाता है। त्रुटि किस क्षण उत्पन्न हुई?
कंपाइलर टेक्स्ट का अनुवाद करता है, उसे निष्पादित नहीं करता, और वह डेटा नहीं जानता जो उपयोगकर्ता लिखेगा।लिंकर प्रोग्राम के हिस्सों को जोड़ता है; वह न गणना करता है, न डेटा देखता है।दूसरे डेटा के साथ वही एक्ज़ीक्यूटेबल फ़ाइल ठीक काम करती है: दोष इसमें है कि प्रोग्राम उस डेटा के साथ क्या करता है, उपकरणों में नहीं।जो केवल प्रोग्राम के टेक्स्ट पर निर्भर है, वह कंपाइल करते या लिंक करते समय पकड़ा जाता है; जो डेटा पर निर्भर है, वह केवल निष्पादन के समय। इसीलिए जो प्रोग्राम कंपाइल हो जाता है, वह केवल इसी कारण त्रुटियों से मुक्त नहीं होता।दोहराएँ: प्रोग्राम, कंपाइलर और C++
प्रश्न 7Visual Studio Code को उसके C++ एक्सटेंशन के साथ स्थापित किया गया, और टर्मिनल में
g++ --versionमाँगने पर वह उत्तर देता है कि वहg++को नहीं पहचानता। सबसे संभावित कारण क्या है?एक्सटेंशन में कंपाइलर नहीं होता, और न ही वह इसमें दख़ल देता है कि टर्मिनल को क्या मिलता है।कमांडg++ --versionकोई प्रोग्राम कंपाइल नहीं करती: वह केवल संस्करण पूछती है, और टर्मिनल को तो यह भी नहीं मिला कि किससे पूछे।संपादक से कोई फ़र्क़ नहीं पड़ता: कमी कंपाइलर की है, संपादक कोई भी हो।संपादक कंपाइल नहीं करता: वह एक अलग कंपाइलर को बुलाता है, जिसका स्थापित होना और टर्मिनल को मिलना ज़रूरी है। C++ एक्सटेंशन कोड लिखने में मदद करता है, पर कंपाइलर साथ नहीं लाता।प्रश्न 8कंपाइलर एक संदेश लिखता है जो
warning:से शुरू होता है, और उसके बावजूद एक्ज़ीक्यूटेबल फ़ाइल बना देता है। इसका क्या अर्थ है?वह त्रुटि (error:) होती, और तब कोई एक्ज़ीक्यूटेबल फ़ाइल न बनती।आज़माए गए डेटा के साथ चलना बाक़ी डेटा के बारे में कुछ सिद्ध नहीं करता; अनदेखी की गई चेतावनी अक्सर कल की त्रुटि होती है।एक्ज़ीक्यूटेबल फ़ाइल सामान्य है; संदिग्ध वह है जो प्रोग्राम बताए गए स्थान पर करता है।त्रुटि एक्ज़ीक्यूटेबल फ़ाइल पाने से रोकती है; चेतावनी उसे पाने देती है, पर संदिग्ध कोड की ओर इशारा करती है। बहुत-सी चेतावनियाँ वास्तविक दोषों को उजागर करती हैं, और इसीलिए पाठ्यक्रम ऐसे प्रोग्राम माँगता है जो बिना एक भी चेतावनी के कंपाइल हों।दोहराएँ: कंपाइल करना, चलाना और कॉन्फ़िगर करना
प्रश्न 9C++ के किसी प्रोग्राम का निष्पादन कहाँ से शुरू होता है?
पहली पंक्ति आम तौर पर एक#includeनिर्देश होती है, जिसे कंपाइल करने से पहले संसाधित किया जाता है और जो निष्पादित नहीं होती।फ़ाइल में क्रम प्रवेश बिंदु तय नहीं करता; उसे नामmainतय करता है।प्रवेश बिंदु का नाम मानक तय करता है; उसे कंपाइल करने की कमांड में चुना नहीं जाता।mainप्रवेश बिंदु है: प्रोग्राम को चालू करते समय सिस्टम उसे बुलाता है, और जब वह समाप्त होता है तो प्रोग्राम समाप्त होता है।mainके बिना प्रोग्राम कंपाइल होता है, पर लिंक नहीं होता।दोहराएँ: प्रोग्राम की बनावट
प्रश्न 10एक प्रोग्राम
int age{};घोषित करता है, एक आयु पढ़ने के लिएstd::cin >> age;चलाता है, और उपयोगकर्ताabcलिखता है। क्या होता है?वह रुकता नहीं: ऐसे चलता रहता है मानो पठन ठीक हुआ हो, और इसीलिए यह दोष ख़तरनाक है।intचर केवल पूर्णांक रखता है; अक्षर संख्या में नहीं बदलते और न ही रखे जाते हैं।पठन दोबारा प्रयास नहीं करता: वह एक बार विफल होता है और स्ट्रीम को त्रुटि अवस्था में छोड़ देता है।पूर्णांक का पठन किसी अक्षर से टकराते ही विफल हो जाता है; मानक कहता है कि चर को 0 मिलता है और जब तक त्रुटि को सँभाला न जाए, आगे के पठन कुछ नहीं करेंगे। यदि प्रोग्राम पठन की जाँच नहीं करता, तो वह बिना किसी संकेत के झूठे निष्कर्ष लिखता है।दोहराएँ: इनपुट, आउटपुट और त्रुटियाँ
इकाई की विषय-वस्तु
इकाई में छह पाठ हैं, जो क्रम से किसी समस्या से एक चालू प्रोग्राम तक का रास्ता तय करते हैं। हर पाठ अपने से पहले वाले पाठ को मानकर चलता है, और पहला पाठ भाषा के बारे में कुछ भी नहीं मानता।
- समस्या से एल्गोरिदम तक। पाठ्यक्रम बिना कोड के शुरू होता है, क्योंकि एल्गोरिदम प्रोग्राम से पहले आता है। यह पाठ सिखाता है कि किसी समस्या को उसके इनपुट, उसके आउटपुट और दोनों के बीच के संबंध (पूर्व-शर्त और पश्च-शर्त) से कैसे विनिर्दिष्ट करें; किसी एल्गोरिदम का क्रमांकित चरणों में, बिना अस्पष्टता के, वर्णन कैसे करें; ट्रेस तालिका के साथ उसे हाथ से कैसे चलाएँ; उसमें अनुक्रम, निर्णय और पुनरावृत्ति को कैसे पहचानें; और यह कैसे सिद्ध करें कि कोई पुनरावृत्ति समाप्त होती है, एक ऐसी मात्रा के सहारे जो हर चक्कर में घटती है।
- प्रोग्राम, कंपाइलर और C++। मशीन के लिए लिखा गया एल्गोरिदम एक प्रोग्राम है, और C++ का प्रोग्राम जैसा लिखा जाता है वैसा ही निष्पादित नहीं होता: प्रीप्रोसेसर, कंपाइलर और लिंकर उसे एक्ज़ीक्यूटेबल फ़ाइल में बदलते हैं। यह पाठ इन तीन चरणों से गुज़रता है, जो कंपाइल करते समय पकड़ा जाता है उसे उससे अलग करता है जो केवल निष्पादन के समय प्रकट होता है, कंपाइल्ड मॉडल की इंटरप्रेटेड मॉडल से तुलना करता है, और भाषा के मानकों को समय में स्थित करता है, C++23 तक, जिसका उपयोग पाठ्यक्रम करता है, और C++26 तक, जिसका कंपाइलरों में कार्यान्वयन अभी जारी है।
- Windows, macOS और Linux पर परिवेश स्थापित करना। तीन पूरी मार्गदर्शिकाएँ, हर सिस्टम के लिए एक, C++23 में सक्षम कंपाइलर और Visual Studio Code संपादक को उसके C++ एक्सटेंशन के साथ स्थापित करने, एक जाँच प्रोग्राम से यह देखने कि सब कुछ काम करता है, और आम समस्याएँ सुलझाने के लिए: वह कंपाइलर जिसे टर्मिनल नहीं ढूँढ पाता, पुराना संस्करण, और वह मानक जो माँगा नहीं गया।
- कंपाइल करना, चलाना और कॉन्फ़िगर करना। संपादित करने, सहेजने, कंपाइल करने, चलाने और पढ़ने का कार्य-चक्र, टर्मिनल से और संपादक से, पाठ्यक्रम की कंपाइल कमांड के साथ। यह पाठ त्रुटियों को, जो एक्ज़ीक्यूटेबल फ़ाइल बनने से रोकती हैं, चेतावनियों से अलग करता है, जो संदिग्ध कोड की ओर इशारा करती हैं; डिटेक्टरों (sanitizers) को सक्रिय करता है, यानी मेमोरी त्रुटियों के डिटेक्टर AddressSanitizer को और अपरिभाषित व्यवहार के डिटेक्टर UndefinedBehaviorSanitizer को, जो प्रोग्राम के चलते समय उस पर नज़र रखते हैं; और समझाता है कि आउटपुट में देवनागरी अक्षरों की जगह अजीब चिह्न क्यों दिखते हैं।
- प्रोग्राम की बनावट। न्यूनतम प्रोग्राम, एक-एक हिस्सा करके: इन्क्लूड निर्देश और हेडर, फ़ंक्शन
mainऔर एग्ज़िट कोड, नेमस्पेसstd, स्टेटमेंट, ब्लॉक और टिप्पणियाँ। यह पाठ सिखाता है कि कंपाइलर के संदेशों को पहले संदेश से पढ़ते हुए संरचना की त्रुटियाँ कैसे सुधारें, और पाठ्यक्रम की स्टाइल गाइड तय करता है। - इनपुट, आउटपुट और त्रुटियाँ। प्रोग्राम बाहरी दुनिया से संवाद करता है: वह
std::printऔरstd::printlnसे लिखता है, चौड़ाई और दशमलव स्थानों के लिए फ़ॉर्मैट विनिर्देशों के साथ, औरstd::cinसे पढ़ता है। यह पाठ दिखाता है कि जब इनपुट अपेक्षित रूप में नहीं होता तो क्या होता है और पठन की जाँच कैसे की जाती है, और त्रुटियों को उनके क्षण के अनुसार वर्गीकृत करके इकाई को समाप्त करता है: कंपाइल त्रुटि, लिंक त्रुटि, रनटाइम त्रुटि और तार्किक त्रुटि।
उन्हें जोड़ने वाला सूत्र स्वयं प्रोग्राम है। पहला पाठ उसकी कल्पना करता है, दूसरा बताता है कि वह किसमें बदलता है, तीसरा वे उपकरण स्थापित करता है जो उसे बदलते हैं, चौथा उनका उपयोग करना और वे जो कहते हैं उसे सुनना सिखाता है, पाँचवाँ उसकी चीर-फाड़ करता है, और छठा उसे उसका उपयोग करने वाले से बातचीत कराता है। यदि ऐसा है, तो इकाई के अंत में विद्यार्थी C++ के बारे में अभी बहुत कम जानता है, पर यह जानता है कि उसके साथ काम कैसे किया जाता है, और पाठ्यक्रम का शेष भाग यही मानकर चलता है।
जो पहले से ज्ञात माना गया है
पाठ्यक्रम प्रोग्रामिंग के किसी पूर्व अनुभव को नहीं मानता। इसके बजाय, वह तीन कौशल मानता है, जिन्हें अभी दोहरा लेना उचित है, यदि प्रवेश मूल्यांकन में कोई संदेह दिखा हो।
पहला है स्कूली अंकगणित: पूर्णांकों और दशमलव संख्याओं पर संक्रियाएँ करना, संक्रियाओं के क्रम का पालन करना (कोष्ठक न हों तो गुणा और भाग, जोड़ और घटाव से पहले) और, सबसे बढ़कर, पूर्णांक विभाजन का भागफल और शेषफल निकालना। यह अंतिम बात जितनी दिखती है उससे अधिक महत्त्वपूर्ण है। 47 पन्ने 6 लोगों में बाँटने पर हर एक को 7 मिलते हैं और 5 बचते हैं, जिसे लिखा जाता है, जहाँ शेषफल भाजक से छोटा है। C++ में भागफल के लिए एक संक्रियक है और शेषफल के लिए दूसरा, और पूर्णांकों के साथ होने वाली गणनाओं का एक बड़ा भाग (सेकंडों को घंटों में बदलना, किसी संख्या के अंकों को अलग करना, यह तय करना कि कोई संख्या सम है या नहीं) इन्हीं पर आ टिकता है। जो पूर्णांक विभाजन को विस्तार से पढ़ना चाहे, वह इसे इसकी उपपत्ति सहित बीजगणित और ज्यामिति I: संख्याएँ, फलन और समतल ज्यामिति पाठ्यक्रम में पाएगा; यहाँ इसकी गणना करना आना ही काफ़ी है।
दूसरा है लिखित निर्देशों का अक्षरशः पालन करने की आदत, और यह पहचानना कि कब कोई निर्देश यह जानने के लिए काफ़ी नहीं कि क्या करना है। यह ज्ञान की बात नहीं, बल्कि दृष्टिकोण की बात है: “स्वादानुसार नमक डालो” पढ़कर ध्यान देना कि यह निर्देश उसे निष्पादित करने वाले पर निर्भर है। इकाई का पहला पाठ इस दृष्टिकोण को पद्धति में बदल देता है।
तीसरा है कंप्यूटर का बुनियादी उपयोग: एक फ़ोल्डर बनाना, उसमें चुने हुए नाम से एक फ़ाइल सहेजना, नाम के एक्सटेंशन (.cpp, .txt, .exe) को पहचानना, और यह जानना कि हर फ़ाइल किस फ़ोल्डर में है। अभी से सिस्टम को इस तरह कॉन्फ़िगर कर लेना उचित है कि वह एक्सटेंशन दिखाए, जिन्हें कुछ सिस्टम, जैसे Windows, डिफ़ॉल्ट रूप से छिपा देते हैं: स्रोत कोड suma.cpp और एक्ज़ीक्यूटेबल फ़ाइल suma.exe बहुत अलग फ़ाइलें हैं, और उन्हें आपस में उलझा देना बेतुकी त्रुटियों का स्रोत है। इकाई टर्मिनल का उपयोग भी सिखाती है, इसलिए उसे पहले से जानना ज़रूरी नहीं; बटन दबाने के बजाय कमांड लिखने को तैयार रहना काफ़ी है। अंत में, प्रोग्राम स्थापित करने के लिए अपने कंप्यूटर पर ऐसा कर पाना ज़रूरी है; स्थापना वाला पाठ उनके लिए एक ऑनलाइन विकल्प बताता है जो ऐसा नहीं कर सकते।
अंग्रेज़ी पहले से ज्ञात नहीं मानी जाती। कंपाइलर के संदेश अंग्रेज़ी में होते हैं, और पाठ्यक्रम उन्हें एक-एक फ़ील्ड करके पढ़ना सिखाता है, ताकि उनमें जो मायने रखता है (फ़ाइल, पंक्ति, दोष की श्रेणी) वह भाषा पर अधिकार के बिना भी समझ में आ जाए। स्कूली स्तर से आगे का कोई गणित भी नहीं माना जाता: उदाहरणों में भाग, औसत, पहाड़े, तिथियाँ और समय आते हैं।
वह समस्या जिसे इकाई हल करती है
हाथ से किया जा सकने वाला परिकलन अभी प्रोग्राम नहीं है। दोनों के बीच की दूरी ही वह है जिसे पार करना इकाई सिखाती है, और एक सरल समस्या से उसे मापा जा सकता है।
एक स्टॉपवॉच हर गतिविधि की अवधि को सेकंडों की संख्या के रूप में दर्ज करती है, उदाहरण के लिए 7384, और हम उसे घंटों, मिनटों और सेकंडों के सामान्य रूप में लिखना चाहते हैं, जिसमें मिनट और सेकंड हमेशा दो अंकों में हों: 2:03:04। हाथ से, यह गणना विभाजनों की एक शृंखला है: , जिससे 2 घंटे और 184 सेकंड निकलते हैं; , जिससे 3 मिनट और 4 सेकंड निकलते हैं। एक अवधि के लिए यह एक मिनट में हो जाता है। पर किसी सूची की हज़ार अवधियों के लिए हाथ से गणना लंबी और त्रुटि-प्रवण है, और यह काम इस योग्य है कि इसे कोई मशीन निष्पादित करे।
फिर भी, मशीन ऊपर दी गई व्याख्या ग्रहण नहीं कर सकती। वह किसी प्रोग्रामिंग भाषा में लिखा टेक्स्ट ग्रहण करती है, और वह टेक्स्ट लिखने के लिए पहले तीन प्रश्न हल कर लेने चाहिए जिन्हें हाथ की गणना अनकहा छोड़ देती थी। पहला है विनिर्देश: क्या भीतर आता है (सेकंडों की एक पूर्णांक संख्या, जो ऋणात्मक न हो), क्या बाहर आता है (तीन पूर्णांक, घंटे, मिनट और सेकंड) और कौन-सा संबंध उन्हें जोड़ता है: यदि कुल योग है, तो , जहाँ और । दूसरा है एल्गोरिदम: वे सटीक चरण जो किसी भी स्वीकार्य इनपुट के लिए वह आउटपुट उत्पन्न करते हैं।
- का मान वह भागफल रखें जो को से भाग देने पर मिलता है।
- का मान वह भागफल रखें जो से भाग देने पर मिलता है, जहाँ भाज्य वह शेषफल है जो को से भाग देने पर मिलता है।
- का मान वह शेषफल रखें जो को से भाग देने पर मिलता है।
- , कोलन, दो अंकों में , कोलन और दो अंकों में लिखें।
तीसरा है एल्गोरिदम को C++ में, भाषा जिस सटीक रूप की माँग करती है उसमें, लिखना, और उपयुक्त उपकरणों से उसका एक्ज़ीक्यूटेबल फ़ाइल में अनुवाद करना। नीचे दिया गया प्रोग्राम यही करता है। उसमें बहुत-सी चीज़ें हैं जो अभी समझाई नहीं गई हैं: चर (पाठ 2.1), संक्रियक / और %, जो पूर्णांक विभाजन का भागफल और शेषफल देते हैं (पाठ 3.1), std::cin से पठन और फ़ॉर्मैट विनिर्देश (पाठ 1.6); इस प्रोग्राम का विनिर्देश {:02}, जो किसी संख्या को दो स्थानों में लिखता है और बाईं ओर शून्य भरता है, उस चौड़ाई का एक भिन्न रूप है जिसे वह पाठ सिखाता है और जिसका उपयोग पाठ 3.1 करेगा। अभी इसमें एल्गोरिदम के चार चरण पहचान लेना काफ़ी है।
#include <iostream>#include <print>int main(){ int total{}; // चरों की व्याख्या पाठ 2.1 में होगी std::print("सेकंडों में अवधि: "); std::cin >> total; const int hours{total / 3600}; const int minutes{total % 3600 / 60}; const int seconds{total % 60}; std::println("{} s = {}:{:02}:{:02}", total, hours, minutes, seconds);}7384सेकंडों में अवधि: 7384 s = 2:03:04पंक्तियाँ 9 से 11 चरण 1 से 3 हैं, और पंक्ति 12 चरण 4 है। परिणाम का हाथ से निकाले गए परिणाम से मेल खाना संयोग नहीं, बल्कि वह जाँच है जिसका हर प्रोग्राम हक़दार है: पहले उसे ऐसे डेटा से आज़माना जिसका उत्तर ज्ञात हो।
प्रोग्राम समस्या हल कर देता है, पर इकाई उस पर संदेह करना भी सिखाती है। यदि उपयोगकर्ता संख्या के बजाय abc लिखे, तो पठन विफल होता है, total शून्य पर रहता है, और प्रोग्राम बिना किसी ख़तरे के संकेत के लिख देता है कि अवधि 0:00:00 है: सच जैसा दिखने वाला एक झूठा निष्कर्ष। यदि वह कोई ऋणात्मक अवधि लिखे, तो विनिर्देश यह नहीं बताता कि क्या होना चाहिए, और परिणाम का कोई अर्थ नहीं होता। यदि ग़लती से total / 360 लिखा जाए, जबकि होना चाहिए total / 3600, तो प्रोग्राम कंपाइल होता है, चलता है और ग़लत परिणाम देता है, और कोई उपकरण इसकी चेतावनी नहीं देता। इनमें से हर दोष त्रुटि की एक अलग श्रेणी का है, जो अलग क्षण में पकड़ी जाती है और अलग ढंग से खोजी जाती है; इकाई का अंतिम पाठ उन्हें वर्गीकृत करता है। इससे यह निकलता है कि इकाई जिस समस्या को हल करती है वह केवल यह प्रोग्राम लिखना नहीं, बल्कि यह जानना है कि वह क्यों काम करता है, किस डेटा के साथ काम करना बंद कर देता है, और कौन-सा उपकरण हर दोष की चेतावनी देगा, या नहीं देगा।
अतः इकाई के अंत में विद्यार्थी इस तरह के प्रोग्राम लिख, कंपाइल कर और चला सकेगा: कुछ इनपुट डेटा, क्रम से कुछ गणनाएँ और फ़ॉर्मैट के साथ लिखे कुछ परिणाम। वह अभी C++ में निर्णय नहीं ले सकेगा, न स्टेटमेंट दोहरा सकेगा (हालाँकि हिंदी में लिखे एल्गोरिदम में ऐसा कर सकेगा), न ही हर डेटा का प्रकार सोच-समझकर चुन सकेगा; यह आगे की इकाइयाँ लाती हैं।
यह कहाँ ले जाती है
इकाई पाठ्यक्रम की दहलीज़ है। जो इसमें बिना समझाए इस्तेमाल होता है, वह बाद में, इस क्रम में, समझाया जाता है। इकाई 2, “डेटा और प्रकार”, चरों को और यह कि वे मेमोरी में कैसे रखे जाते हैं, पूर्णांकों की सीमाओं को (और यह कि एक सही गणना भी ओवरफ़्लो क्यों हो सकती है), दशमलव वाली संख्याओं के पूर्णांकन को और प्रकारों के बीच रूपांतरणों को समझाती है। इकाई 3, “व्यंजक और संक्रियक”, C++ के अंकगणित को समझाती है, ऋणात्मक संख्याओं के भागफल और शेषफल के साथ, और शर्तों के तर्क को और उसे भी जो मानक किसी व्यंजक में अपरिभाषित छोड़ देता है। इकाई 4, “नियंत्रण प्रवाह”, उन निर्णयों और पुनरावृत्तियों को C++ में ले आती है जिन्हें पहला पाठ हिंदी में लिखता है, और सिखाती है कि कैसे सिद्ध करें कि कोई लूप सही है और समाप्त होता है। इकाई 5 प्रोग्रामों को फ़ंक्शनों में विघटित करती है; इकाई 6 संयुक्त डेटा (ऐरे, वेक्टर, तालिकाएँ और रिकॉर्ड) को, खोजने और क्रमबद्ध करने के एल्गोरिदमों तथा उनकी लागत के साथ, प्रस्तुत करती है; इकाई 7 टेक्स्ट, इनपुट के मज़बूत पठन और फ़ाइलों से संबंधित है; और इकाई 8 कई फ़ाइलों वाले प्रोग्रामों, व्यवस्थित परीक्षण और डिबगर से संबंधित है।
पाठ्यक्रम के बाद, C++ में प्रोग्रामिंग II वह आगे बढ़ाता है जिसे यह पाठ्यक्रम जानबूझकर बाहर छोड़ता है: पॉइंटर और डायनेमिक मेमोरी, मेथड वाली क्लास, अपने टेम्पलेट, अनाम फ़ंक्शन और एक्सेप्शन। इनमें से कोई भी विषय इस पाठ्यक्रम की समस्याएँ हल करने के लिए आवश्यक नहीं है, और इन्हें टालने से उस पर ध्यान केंद्रित किया जा सकता है जो किसी भी भाषा में लागू होता है: विनिर्दिष्ट करना, एल्गोरिदम की रचना करना, उसे स्पष्टता से लिखना और जाँचना कि वह सही है। इस इकाई का सारांश पाठ ठीक यही भेद समेटेगा, उसके बीच जो C++ की अपनी विशेषता है और उसके बीच जो किसी भी दूसरी भाषा में ले जाया जाएगा।