Sunday, May 17, 2009

सीखए सी - 23 : आवर्तन की संरचनाएं - do... while लूप

do... while लूप while लूप का ही एक रूप है। इसमें और while लूप में फर्क यह है कि जहां while लूप में लूप तोड़ने वाली शर्त शूरू में रहता है, do... while लूप में यह शर्त अंत में आता है, इस तरह:-

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

do... while लूप में धनु कोष्ठकों के बीच कई उक्तियां हो सकती हैं। उनमें से एक उक्ति ऐसी भी होनी चाहिए जो लूप तोड़नेवाली शर्त को बदलती हो, वरना लूप अनंत समय तक चलता रहेगा।

while और do... while लूप की संरचना में एक अन्य अंतर यह है कि while लूप में गोल कोष्ठकों के बाद अर्ध विराम चिह्न (;) नहीं है, जबकि do... while लूप में गोल कोष्टकों के बाद अर्ध विराम चिह्न (;) होता है। यह एक महत्वपूर्ण अंतर है। यदि do... while लूप के अंत में अर्ध विराम चिह्न (;) न रखा जाए तो संकलक को पता नहीं चल पाएगा कि while (शर्त) do... while लूप का भाग है अथवा एक स्वतंत्र while लूप।

आइए एक उदाहरण से do... while लूप को समझते हैं।

प्रोग्राम – 19
---------------------------------
/*do... while ka udaharan */

#include <stdio.h>
#include <conio.h>

void main()
{
clrscr();

int vetan=0;
char santusht = 'n';

printf("\nKya aapko maloom hai ki computer jagt me vetan badana bahut saral hota hai? \n\nAapko keval apna vetan batana hai, baki sab computer sambhal lega. \n\nTo batayiye, aap ka vetan kya hai: ");
scanf("%d", &vetan);
flushall();

do
{
printf("\Ab aapka vetan hai %d. Kya aap is vetan se santusht hai? Han ke liye y aur na ke like n darj karen: ", vetan+500);
scanf ("%c", &santusht);
flushall();
vetan = vetan + 500;
}
while (santusht == 'n');

printf ("\nDhanyavad. Aasha hai ab aap achcha kaam karenge.");
getch();
}
---------------------------------

आउटपुट
---------------------------------
Kya aapko maloom hai ki computer jagt me vetan badana bahut saral hota hai?
Aapko keval apna vetan batana hai, baki sab computer sambhal lega.
To batayiye, aap ka vetan kya hai: 10000
Ab aapka vetan hai 10500. Kya aap is vetan se santusht hai? Han ke liye y aur na ke like n darj karen: n
Ab aapka vetan hai 11000. Kya aap is vetan se santusht hai? Han ke liye y aur na ke like n darj karen: y
Dhanyavad. Aasha hai ab aap achcha kaam karenge.
---------------------------------

इस प्रोग्राम में दो राशियां घोषित की गई हैं – vetan और santusht। पहली int प्रकार की राशि है, जिसे 0 का मान दिया गया है। दूसरी char प्रकार की राशि है, जिसे n का मान दिया गया है।

scanf के जरिए प्रयोक्ता के वेतना का पता लगाया जाता है और उसे vetan में संचित किया जाता है।

इसके बाद वाला कथन आपके लिए नया है, इसलिए इसके बारे में कुछ विस्तार से समझाते हैं। यह कथन है –

flushall();

यह stdio लाइब्रेरी का एक फंश्नन है। scanf एक जटिल फंक्शन है, जो कभी-कभी अवांछित परिणाम देता है। उसके द्वारा इनपुट किए गए राशि को ठीक से पकड़वाने के लिए कुछ तिकड़क करने पड़ते हैं। इस प्रोग्राम के उस printf कथन पर विचार कीजिए जिसमें प्रोग्राम चलानेवाले व्यक्ति से अपने वेतन का खुलासा करने को कहा गया है। इस कथन के बाद कंप्यूटर प्रयोक्ता द्वारा अपना वेतन इनपुट करने के लिए रुका रहता है। प्रयोक्ता कोई मान इनपुट करता है, जैसे 10000। उसके बाद यह सूचित करने के लिए कि उसने इनपुट कर दिया है, ऐंटर कुंजी को दबा देता है। अब कंप्यूटर के इनपुट स्ट्रीम में दो वर्ण जमा हो गए हैं, 10000 और ऐंटर कुंजी का वर्ण। इनमें से हमें केवल पहला इनपुट चाहिए। यदि दूसरा इनपुट, यानी ऐंटर, इनपुट स्ट्रीम में रह जाए, तो यह प्रोग्राम में आगे गड़बड़ी फैला सकता है क्योंकि अगली बार जब आप scanf का उपयोग करेंगे, तो वह इस ऐंटर वर्ण को पकड़ेगा क्योंकि यही इनपुट स्ट्रीम में सबसे आगे रहेगा। इस अवांछित स्थिति से बचने के लिए हर बार scanf का उपयोग करने के बाद इनपुट स्ट्रीम को खाली करना जरूरी है। flushall() वाला फंक्शन यही करता है, ताकि जब भी आप scanf का उपयोग करें, आपको प्रयोक्ता द्वारा किया गया इनपुट ही मिले न कि इनपुट स्ट्रीम में रह गया कोई फालतू का वर्ण।

तो इसे ध्यान में रखिए। scanf का उपयोग करने के बाद हमेशा flushall() का उपयोग करें। यदि किसी प्रोग्राम में scanf के कारण गलत परिणाम मिल रहे हों, तो scanf के बाद flushall(); कथन रखकर देखें। इससे आपका प्रोग्राम ठीक से चलने लगेगा।

ठीक है, अब हम प्रोग्राम – 19 की ओर लौटते हैं। इस flushall (); उक्ति के बाद do... while लूप का do वाला भाग आता है। इसके धनु कोष्ठकों में ये उक्तियां हैं –

{
printf("\Ab aapka vetan hai %d. Kya aap is vetan se santusht hai? Han ke liye y aur na ke like n darj karen: ", vetan+500);
scanf ("%c", &santusht);
flushall();
vetan = vetan + 500;
}

printf कथन आपके वेतन में 500 का इजाफा कर देता है। इसी कथन में आपसे यह भी पूछा जाता है कि क्या आप इस वेतन से संतुष्ट हैं?

इसके बाद, scanf आपके उत्तर को (n या y) santusht में सहेज लेता है। इसके बाद वही flushall() कथन है।

अंतिम पंक्ति में vetan को 500 से बढ़ा दिया जाता है।

इसके बाद do... while लूप का while वाला भाग आता है, जो यह है -

while (santusht == 'n');

यह साधारण while लूप के समान ही है, केवल एक अंतर है। इसके अंत में अर्ध विराम (;) है। यह महत्वपूर्ण है। यदि इसे छोड़ दिया जाए, तो do... while लूप ठीक से काम नहीं करेगा।

इस उक्ति पर पहुंचकर कंप्यूटर देखता है कि क्या santusht का मान n है? यदि n है, तो do की उक्तियों का आवर्तन करता है। यदि नहीं है, तो do... while लूप टूट जाता है, और प्रोग्राम में उसके बाद की उक्तियों का निष्पादन होता है। इस प्रोग्राम में do... while के बाद एक printf कथन है, जो प्रयोक्ता को धन्यवाद देता है। कंप्यूटर इसका निष्पादन कर देता है।

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

1 comment: