Monday, May 18, 2009

सीखिए सी - 24 : आवर्तन की संरचनाएं : for लूप

while और do... while लूपों में लूप के कोड़ खंड का कितनी बार आवर्तन होता है, यह निश्चित नहीं होता है। जब तक इनकी while उक्ति के गोल कोष्ठक में विद्यमान तार्किक व्यंजन का मान 1 होता है, कोड खंड का आवर्तन होता रहता है।

कई बार हमें इसकी आवश्यकता रहती है कि कोड खंड का आवर्तन पूर्वनिश्चित बार ही हो। इस तरह की आवश्यकताओं की पूर्ति हेतु सी में for लूप की व्यवस्था है, जो निश्चित बार आवर्तन करता है। यद्यपि for लूप निश्चित बार आवर्तन के लिए बना है, लेकिन वह अत्यंत लचीला है और उसे प्रोग्रामर while लूप के समान भी काम करा सकता है। लेकिन शुरुआत के लिए हम उसके मूल रूप से परिचय बढ़ाएं। for लूप का हुलिया इस प्रकार होता है:-

for (प्रारंभिक मान; शर्त; प्रारंभिक मान में वृद्धि)
{
उक्तियां;
}

ध्यान दें कि for लूप के गोल कोष्ठकों के बीच तीन उक्तियां हैं, जिन्हें दो अर्ध विरामें से अलग किया गया है। ये हैं:

  • प्रारंभिक मान
  • शर्त
  • प्रारंभिक मान में वृद्धि

for लूप को चलाने के लिए सबसे पहले एक लूप गणक निश्चित किया जाता है, जो int (पूर्णांक) प्रकार की कोई राशि होती है। इसे कोई प्रारंभिक मान दिया जाता है, जो सामान्यतः 0 अथवा 1 होता है, पर कोई भी पूर्ण संख्या हो सकता है।

इसके बाद for लूप के आवर्तन के लिए आवश्यक कोई शर्त रखी जाती है। सामान्यतः यह लूप गणक का किसी उच्चतम मान से छोटा होना या बड़ा होना होता है, पर कोई भी अन्य शर्त भी हो सकती है। इतना ही नहीं, यहां एक से अधिक शर्त भी हो सकते हैं, जिन्हें एंड (&&) या ओर (||) प्रचालकों से जोड़ा जा सकता है। संकलक इन सभी शर्तों का एक साथ मूल्यांकन करेगा और उनका सम्मिलित तार्किक मान निर्धारित करेगा। यदि यह मान 1 निकले, तो लूप की उक्तियों का निष्पादन होगा, यदि 0 निकले, तो लूप टूट जाएगा और संकलक प्रोग्राम में लूप के बाद आनेवाली उक्तियों का निष्पादन करने लगेगा।

तीसरी उक्ति लूप गणक के मान में वृद्धि करनेवाली उक्ति होती है। हमने while loop के संबंध में बताया था कि while लूप के कोड खंड में ऐसी कोई उक्ति होनी चाहिए जो लूप के शर्त को बदले, अन्यथा while loop अनंत काल तक चलता रहेगा। for लूप में इस उक्ति को उसके कोड खंड में न रखकर स्वयं for लूप के गोल कोष्ठकों के अंदर अंत में रखा जाता है। ऊपर के पैरा में बताया गया था कि for लूप में अक्सर तार्किक व्यंजक के रूप में लूप गणक को किसी पूर्वनिश्चित मान से तुलना कराया जाता है और यदि लूप गणक इस मान से छोटा या बढ़ा हुआ, तो लूप टूट जाता है। इसके लिए यह आवश्यक है कि लूप के हर आवर्तन के बाद लूप गणक का मान घटे या बढ़े। इससे संबंधित उक्ति for लूप के गोल कोष्ठकों में विद्यमान अंतिम उक्ति में रहता है। यही वह उक्ति है जो for लूप के तार्किक व्यंजन (लूप तोड़नेवाली शर्त) के मान में परिवर्तन लाता रहता है, और एक निश्चित बार for लूप के आवर्त के बाद उस तार्किक व्यंजन के मान को 0 कर देता है, जिससे लूप टूट जाता है।

आइए एक वास्तविक उदाहरण से for लूप के कार्य करने को समझें। इस छोटे प्रोग्राम में एक for लूप की मदद से 1 से 5 तक की संख्याओं को मुद्रित किया जाता है।

प्रोग्राम – 20
---------------------------------
/*for loop ka udaharan */

#incldue <stdio.h>
#incldue <conio.h>


void main()
{
clrscr();

int ganak;
for (gank=1; x<=5;ganak++)
{
printf(“%d\n”, ganak);
}
getch();
}
---------------------------------

आउटपुट:
---------------------------------
1
2
3
4
5
---------------------------------

आइए इस प्रोग्राम को समझते हैं। इसमें सबसे पहले एक int प्रकार की राशि घोषित की गई है, जिसका नाम ganak रखा गया है।

इस ganak राशि को for लूप के गोल कोष्ठक की प्रथम उक्ति में 1 का मान दिया गया है। for लूप की तार्किक व्यंयन के रूप में यह शर्त रखी गई है कि ganak का मान 5 से कम या उसके बराबर होना चाहिए। इस सी उक्ति को देखिए, जिसमें यह बात कही गई है:-

ganak<=5;

for लूप की तीसरी उक्ति में ganak पर इंक्रिमेंट प्रचालक का प्रयोग किया गया है:-

ganak++

for लूप के कोड खंड में केवल एक उक्ति है, जो ganak के मान को printf () की मदद से अलग पंक्ति में स्क्रीन पर मुद्रित करता है।

for लूप के हर आवर्तन में ganak का मान 1 से बढ़ जाता है (ganak++ के कारण) और जब उसका मान 6 हो जाता है, तो लूप टूट जाता है।

for लूप के गोल कोष्ठकों में दो अर्धविरामों से अलगाए गए तीन कोड क्षेत्रों में से प्रत्येक में एक से अधिक उक्तियां भी हो सकती हैं, यथा,

for (int ganak1=0, int ganak2 =100; शर्त 1 && शर्त 2 || शर्त 3; ganak1++, ganak2--)

उपर्युक्त for लूप में दो गणक हैं ganak1 और ganak2 और तीन शर्ते हैं जो && और || से जुड़े हुए हैं। लूप के हर आवर्तन में ganak1 का मान 1 से बढ़ता जाता है, और ganak2 का मान 1 से घटता जाता है।

इस तरह से for लूप को अनेक वास्तविक परिस्थितियों में प्रयोग किया जा सकता है, और उसे while लूप की तरह भी काम कराया जा सकता है, इस तरह:-

for (;शर्त;)
{
उक्तियां;
}

इसमें for लूप के गोल कोष्ठकों में केवल एक क्षेत्र में कोड है, यानी शर्त वाले क्षेत्र में, बाकी दो में कोई उक्ति नहीं है। अर्ध विरामों का प्रयोग फिर भी हुआ है क्योंकि ये for लूप के वाक्य-विन्यास का आवश्यक अंग हैं। यह for लूप while loop के समान कार्य करेगा और जब तक शर्त का मान 1 हो, लूप चलता रहेगा। हां, उसके कोड खंड में ऐसी कोई उक्ति होनी चाहिए जो कभी न कभी शर्त को गलत बनाए, अन्यथा यह लूप निरंतर चलता जाएगा।

आप पूछ सकते हैं कि यदि for लूप से while लूप का काम भी लिया जा सकता है तो while लूप है ही क्यों, उसका आवश्यकता ही क्या है?

इसका जवाब यह है कि प्रोग्रामों का एक आवश्यक गुण यह होता है कि वे कम से कम समय में निष्पादित हों। इसलिए प्रोग्रामर हमेशा ऐसे कोड लिखने का प्रयत्न करते हैं जिसका निष्पादन ज्यादा तेजी से हो। जब आप सी को कुछ बेहतर रूप से समझने लगेंगे, आपको विदित होगा कि एक ही काम को करने के लिए सी में कोड कई तरह से लिखे जा सकते हैं। पर उनमें से कुछ प्रकार अधिक तेजी से निष्पादित होंगे, कुछ कम तेजी से, और साधारण प्रोग्रामर और गुरु प्रोग्रामर में यही अंतर होता है कि गुरु प्रोग्रामर हमेशा ऐसा कोड लिखेगा जो अधिक तेजी से निष्पादित हो।

तो while लूप की संरचना for लूप की तुलना में अधिक सरल है और कंप्यूटर while लूप को for लूप से अधिक तेजी से निष्पादित करता है। आपने देखा है कि for लूप के गोल कोष्ठकों में तीन कोड क्षेत्र और प्रत्येक में कई उक्तियां हो सकती है। इसलिए जब कंप्यूटर for लूप का निष्पादन करता है, तो लूप के हर आवर्तन में उसे इन सभी उक्तियों का मूल्यांकन करना पड़ता है। सी के कुछ बड़े और जटिल प्रोग्रामों में लूप वाले खंडों का आवर्तन सैकड़ों बार हो सकता है। इसलिए for लूप का निष्पदान while लूप की तुलना में उल्लेखनीय रूप से धीमा होता है।

तो ध्यान रखनेवाली बात यह है कि जब आवर्तन कितनी बार होगा यह ठीक से पता न हो, तो while लूप का प्रयोग करें, और जब यह पता हो कि ठीक कितनी बार लूप का आवर्तन होगा, तो for लूप का प्रयोग करें।

और यदि लूप को कोड खंड का निष्पादन प्रथम बार हर स्थिति में (लूप की शर्त गलत होने की स्थिति में भी) कराना आवश्यक हो, तो do... while लूप का प्रयोग करें।

2 comments: