सामग्री पर जाएँ
Topos Uranos

सारांश

अब तक पाठ्यक्रम का हर डेटा अपने चर में, अपने नाम के साथ रहता आया है; पर एक ही प्रकार के बहुत-से डेटा, जैसे एक सप्ताह के तापमान, लूप से ट्रैवर्स नहीं किए जा सकते यदि हर एक का नाम अलग हो। यह पाठ पाठ्यक्रम की पहली डेटा संरचना प्रस्तुत करता है, इंडेक्स वाला अनुक्रम: एक ही प्रकार के अवयव, जो मेमोरी में सटे हुए स्थानों पर रखे जाते हैं और शून्य से क्रमांकित होते हैं। आधुनिक C++ में इसे std::array से लिखा जाता है, जिसका आकार कंपाइल करते समय तय हो जाता है। इसकी घोषणा, इंडेक्स का प्रकार std::size_t और दोनों ट्रैवर्सल, इंडेक्स के साथ और रेंज-आधारित for के साथ, पढ़े जाते हैं। वह नियम स्थापित किया जाता है जो पूरी इकाई को नियंत्रित करता है: इंडेक्स मान्य है यदि वह 0 और आकार घटा एक के बीच हो, और लूप के भीतर हर पहुँच पर यह मान्यता निश्चर से सिद्ध की जाती है। दिखाया जाता है कि नियम का पालन न होने पर क्या होता है, जो अपरिभाषित व्यवहार है, और [] की तुलना जाँची हुई पहुँच .at() से की जाती है। अंत में, दूसरों का कोड पढ़ने के लिए C ऐरे प्रस्तुत किए जाते हैं।

अधिगम उद्देश्य

  1. std::array की घोषणा करना, उसे इनिशियलाइज़ करना और इंडेक्स तथा रेंज-आधारित for से उसे ट्रैवर्स करना।
  2. लूप के निश्चर के माध्यम से सिद्ध करना कि हर पहुँच पर इंडेक्स सीमाओं के भीतर है।
  3. [] से पहुँच, जिसे मानक नहीं जाँचता, और .at() से पहुँच, जो हमेशा जाँची जाती है, में भेद करना, और समझाना कि कब कौन-सी उचित है।
  4. C ऐरे वाला कोड पढ़ना और std::array की तुलना में उनकी कमियाँ समझाना।

इंडेक्स वाला अनुक्रम

बहुत-से डेटा, एक ही नाम

अब तक सिखाई गई चीज़ों से एक सप्ताह के तापमानों का औसत निकालने के लिए सात चरों की ज़रूरत होती, monday, tuesday और इसी तरह sunday तक, और सात पदों के एक योग की। एक वर्ष के तापमानों के लिए 365 चर होते, और कोई भी लूप उन्हें ट्रैवर्स नहीं कर सकता, क्योंकि लूप की बॉडी में किसी चर का नाम हमेशा वही रहता है। कमी है पूरे समूह के लिए एक नाम की और हर अवयव के लिए एक संख्या की, ताकि वह संख्या एक ऐसा चर हो सके जिसे लूप आगे बढ़ाता है।

इंडेक्स वाला अनुक्रम ठीक यही है: एक ही प्रकार के nn अवयवों का एक समूह, जो मेमोरी के सटे हुए सेलों में एक के बाद एक रखे जाते हैं, और अपनी स्थिति से निर्दिष्ट होते हैं, जिसे इंडेक्स कहते हैं। गणित इस वस्तु को जानता है: एक परिमित अनुक्रम (a0,a1,…,an−1)(a_0, a_1, \dots, a_{n-1}), जिसमें aia_i स्थान ii वाले अवयव को दर्शाता है, या एक सदिश, जैसे पाठ्यक्रम “बीजगणित और ज्यामिति I” के सदिश। C++ में a[i] लिखा जाता है, और इंडेक्स कोई भी पूर्णांक व्यंजक हो सकता है: 2, i, i + 1।

शून्य से क्यों

C++ में, वर्तमान की अधिकांश भाषाओं की तरह, पहले अवयव का इंडेक्स 0 है, और अंतिम का इंडेक्स n−1n - 1। इसका कारण कोई मनमानी परिपाटी नहीं, बल्कि वह तरीका है जिससे कोई अवयव ढूँढा जाता है: यदि अनुक्रम मेमोरी के किसी पते से शुरू होता है और हर अवयव ss बाइट घेरता है, तो इंडेक्स ii वाला अवयव उस पते पर होता है जो प्रारंभिक पते में i⋅si \cdot s जोड़ने से मिलता है। इसलिए इंडेक्स एक ऑफ़सेट है: पहले अवयव से शुरू करके लाँघे जाने वाले अवयवों की संख्या। पहला अवयव स्वयं से शून्य छलाँग की दूरी पर है।

इससे वह परिभाषा निकलती है जो इस पूरी इकाई को नियंत्रित करती है: nn अवयवों के अनुक्रम में, इंडेक्स ii मान्य है यदि और केवल यदि 0≤i<n0 \leq i < n। दाईं असमिका सख़्त है, और यही अनुक्रमों के साथ सबसे आम त्रुटि का स्रोत है, एक के अंतर की त्रुटि: i≤ni \leq n लिख देना, जबकि i<ni < n लिखना चाहिए था, या 1 से शुरू करना, जबकि 0 से शुरू करना चाहिए था। nn के बराबर इंडेक्स अंतिम अवयव को नहीं, बल्कि उस सेल को दर्शाता है जो अनुक्रम के ठीक बाद आता है और उसका हिस्सा नहीं है।