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

सारांश

पाठ समस्या से एल्गोरिदम तक ने चरणों को जोड़ने के तीन तरीके पहचाने थे: अनुक्रम, निर्णय और पुनरावृत्ति। पहले दो का C++ में लिखने का ढंग पहले से है; यह पाठ तीसरे को उसका ढंग देता है। यह लूप के तीन रूपों का अध्ययन करता है: while, जो हर चक्कर से पहले अपनी शर्त की गणना करता है और हो सकता है कि अपनी बॉडी को कभी न चलाए; do, जो शर्त की गणना बाद में करता है और बॉडी को कम से कम एक बार चलाता है; और for, जो पुनरावृत्ति को नियंत्रित करने वाले चर का इनिशियलाइज़ेशन, शर्त और वृद्धि एक ही पंक्ति में इकट्ठा करता है। यह दिखाता है कि तीनों एक ही तंत्र को व्यक्त करते हैं, इसलिए हर रूप दूसरे रूपों में बदला जा सकता है, और सबसे स्पष्ट रूप चुनना सिखाता है; break और continue का परिचय देता है, जो किसी चक्कर की दिशा बदलते हैं; और नेस्टेड लूप के साथ समाप्त होता है, जिनकी भीतरी बॉडी जितनी बार चलती है, वह संख्या एक योग से निकलती है। पूरे पाठ में साथ रहने वाला उपकरण ट्रेस तालिका है: किसी लूप को हाथ से चलाना, चक्कर-दर-चक्कर, यह पहले से बताने का तरीका है कि उसकी बॉडी कितनी बार चलेगी और बाहर निकलते समय वह क्या छोड़ जाएगा।

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

  1. किसी दी गई पुनरावृत्ति के लिए सबसे स्पष्ट रूप चुनकर while, do या for लूप लिखना।
  2. किसी लूप को उसकी ट्रेस तालिका के साथ हाथ से चलाना और पहले से बताना कि बॉडी कितनी बार चलेगी।
  3. किसी लूप को उसका अर्थ बनाए रखते हुए एक रूप से दूसरे रूप में बदलना।
  4. नेस्टेड लूप लिखना और गिनना कि भीतरी बॉडी कितनी बार चलती है।

while

while का रूप

while इस तरह लिखा जाता है:

C++ कोड
while (शर्त) {    बॉडी}

इसका अर्थ तीन चरणों में कहा जाता है: शर्त की गणना होती है; यदि वह असत्य है, तो लूप समाप्त हो जाता है और निष्पादन उसे बंद करने वाले कोष्ठक-धनु के बाद जारी रहता है; यदि वह सत्य है, तो बॉडी चलती है और निष्पादन पहले चरण पर लौट आता है। बॉडी के हर निष्पादन को चक्कर (या इटरेशन) कहते हैं। शर्त पाठ संबंध और तर्क के व्यंजकों जैसा एक बूलियन व्यंजक है, और बॉडी एक ब्लॉक है; पाठ निर्णय ने कोष्ठक-धनु का जो नियम तय किया था, वह यहाँ भी लागू होता है: लूप की बॉडी हमेशा कोष्ठक-धनु में रहती है, भले ही उसमें एक ही स्टेटमेंट हो।

परिभाषा से दो परिणाम निकलते हैं। पहला: शर्त की गणना हर चक्कर से पहले होती है, इसलिए यदि वह शुरू से ही असत्य हो, तो बॉडी एक बार भी नहीं चलती। दूसरा: लूप समाप्त हो, इसके लिए बॉडी को उन चीज़ों में से कुछ बदलना चाहिए जिन्हें शर्त पढ़ती है; यदि कुछ नहीं बदलता, तो जो शर्त एक बार सत्य थी, वह हमेशा सत्य रहेगी। फिर भी, बदलना पर्याप्त नहीं है: पाठ समस्या से एल्गोरिदम तक ने दिखाया था कि एक ऐसी प्राकृत राशि चाहिए जो हर चक्कर में घटे, यानी वैरिएंट, और पाठ सही लूप की रचना उसे एक विधि बनाएगा।

क्रमिक घटाव द्वारा विभाजन

पाठ्यक्रम का पहला पुनरावृत्ति वाला एल्गोरिदम क्रमिक घटाव द्वारा विभाजन था: जब तक शेषफल भाजक से कम न हो, उसमें से भाजक घटाया जाता है और भागफल में एक जोड़ा जाता है। C++ में लिखने पर यह एल्गोरिदम लगभग शब्दशः उतर आता है।

उदाहरणघटाव द्वारा भागफल और शेषफल
C++ प्रोग्राम
#include <iostream>#include <print>​int main(){    int a{};    int b{};    std::cin >> a >> b;    int q{0};    int r{a};    while (r >= b) {        r -= b;        ++q;    }    std::println("{} = {} · {} + {}", a, b, q, r);}
प्रोग्राम का इनपुट
23 7
आउटपुट
23 = 7 · 3 + 2

पंक्तियाँ 9 और 10 चरों को उनका प्रारंभिक मान देती हैं: अभी कुछ भी घटाया नहीं गया है, इसलिए भागफल 0 है और शेषफल पूरा भाज्य है। पंक्ति 11 एल्गोरिदम के चरण 2 की शर्त है; पंक्तियाँ 12 और 13 बॉडी हैं। प्रोग्राम, एल्गोरिदम की तरह, यह मानता है कि a≥0a \geq 0 और b>0b > 0: b=0b = 0 होने पर पंक्ति 12 r को नहीं बदलेगी और लूप समाप्त नहीं होगा।

ट्रेस तालिका

लूप को हाथ से चलाने का अर्थ है एक तालिका भरना: हर चक्कर के लिए एक पंक्ति, हर चर के लिए एक स्तंभ और एक स्तंभ शर्त के लिए, जिसकी गणना चक्कर की शुरुआत में होती है। पंक्ति 0 पहली गणना से पहले की अवस्था दर्ज करती है; अंतिम पंक्ति वह गणना दर्ज करती है जो असत्य निकलती है और लूप को समाप्त करती है।

उदाहरण23 को 7 से भाग देने का ट्रेस

प्रमाण

  1. लूप से पहले पंक्तियाँ 9 और 10 चलती हैं: q=0q = 0 और r=23r = 23। यह पंक्ति 0 है; शर्त की गणना अभी नहीं हुई है।

  2. पहला चक्कर। शर्त 23≥723 \geq 7 सत्य है, इसलिए बॉडी चलती है: rr का मान 16 और qq का मान 1 हो जाता है। उसके बाद निष्पादन पंक्ति 11 पर लौटता है।

  3. दूसरा चक्कर। 16≥716 \geq 7 सत्य है: rr का मान 9 और qq का मान 2 हो जाता है।

  4. तीसरा चक्कर। 9≥79 \geq 7 सत्य है: rr का मान 2 और qq का मान 3 हो जाता है।

  5. चौथी गणना, 2≥72 \geq 7, असत्य है: बॉडी नहीं चलती, लूप समाप्त हो जाता है और पंक्ति 15 23=7⋅3+223 = 7 \cdot 3 + 2 लिखती है।

ट्रेस गिनना सिखाता है। बॉडी तीन बार चली, उतनी ही बार जितना भागफल है, और शर्त की गणना चार बार हुई: हर चक्कर के लिए एक बार और एक बार और, वह जो विफल होती है। यह संबंध हर उस while के लिए सही है जो अपनी शर्त से समाप्त होता है: यदि बॉडी kk बार चलती है, तो शर्त की गणना k+1k + 1 बार होती है। और चरम स्थिति इसकी पुष्टि करती है: इनपुट 5 7 के साथ पहली गणना, 5≥75 \geq 7, पहले से ही असत्य है, बॉडी शून्य बार चलती है, और प्रोग्राम 5=7⋅0+55 = 7 \cdot 0 + 5 लिखता है, जो सही है। अच्छी तरह लिखा गया while बिना अतिरिक्त कोड के उस स्थिति को सँभाल लेता है जिसमें दोहराने को कुछ नहीं होता।