Saturday, May 23, 2009

25. सीखिए सी : continue, break और exit निर्देश

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

लेकिन अनेक बार इन लूपों के तार्किक व्यंजक का मान 0 होने से पहले ही लूप से छूटना जरूरी होता है, क्योंकि तब तक प्रोग्राम का उद्देश्य सिद्ध हो चुका होता है, या उपयोगकर्ता प्रोग्राम से बाहर आना चाहता है। सी भाषा में इन स्थितियों से निपटने के लिए तीन निर्देश हैं, continue, break और exit।

इस तिकड़ी का सबसे नरम मिजाज वाला निर्देश continue निर्देश है। यदि किसी while वलय में प्रोग्राम नियंत्रण का सामना इस निर्देश से हो जाए, तो नियंत्रण तुरंत लूप के वर्तमान आवर्तन को त्यागकर लूप के तार्किक व्यंजक का पुनः परीक्षण करने चला जाता है, और यदि उसका मान 1 रहा तो वलय का एक नया आवर्तन आरंभ कर देता है।

break निर्देश continue से कुछ अधिक तेज-तर्रार है। किसी लूप वलय के भीतर इस निर्देश का सामना होने पर प्रोग्राम लूप तोड़ देता है, तथा लूप के बाद के निर्देशों का निष्पादन करने लगता है, भले ही लूप के तार्किक व्यंजक का मान अब भी 1 क्यों न हो।

तीसरा निर्देश exit है, जो सबसे अधिक उग्र स्वभाव का है, क्योंकि वह न केवल लूप को तोड़ देता है, बल्कि समस्त प्रोग्राम को ही खारिज कर देता है और आप वापस प्रचालन तंत्र में आ जाते हैं।

आइए इन लूप-भंजक तिकड़ियों का परिचय कुछ सरल प्रोग्रामों के माध्यम से प्राप्त करें।

प्रथम प्रोग्राम में 8 के 5 गुणजों का पता लगाया जाता है और जब पांच गुणज मिल जाते हैं, तब break निर्देश की सहायता से while लूप को तोड़ा जाता है।

प्रोग्राम – 21
---------------------------------
/*break nirdesh ka udaharan */

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


void main()
{
clrscr();

int ganak=0;
int soochak=1;
while(1)
{
printf("%d ", 8*soochak);
soochak++;
ganak++;
if (ganak >= 5)
break;
}
getch();
}
---------------------------------

आउटपुट
---------------------------------
8 16 24 32 40
---------------------------------
इस प्रोग्राम में दो पूर्णांक राशियां घोषित की गई हैं, ganak और soochak। ganak को 0 और soochak को 1 का मान दिया गया है। while वलय के गोल कोष्ठकों में आप इस बार 1 संख्या देखकर कुछ हैरान हुए होंगे। यह 1 वहां इसलिए है क्योंकि हम वलय से निकलने के लिए while वलय के तार्किक व्यंजक के मान के 0 होने पर नहीं, बल्कि उसके धनु कोष्ठकों के भीतर छिपे break निर्देश पर निर्भर हैं। हम चाहते हैं कि while वलय तब तक चलता रहे जब तक यह break निर्देश उसे तोड़ न दे। इसके लिए हर स्थिति में while के कोष्ठकों का मान 1 होना जरूरी है। इसीलिए while के गोल कोष्ठकों में 1 रखा गया है।

while के भीतर पहली उक्ति printf() वाली है, जो 8 और soochak के वर्तमान मान के गुणनफल को स्क्रीन पर छापती है। ध्यान दें कि printf() के दुहरे उद्धरण चिह्नों के बाद %d के बाद एक रिक्त स्थान भी है, ताकि अगला अंक पहले अंक से बिलकुल सटकर न छपे और दोनों के बीच दूरी रहे। चूंकि प्रथम आवृत्ति पर soochak का मान 1 है, इसलिए स्क्रीन पर 8 और एक खाली जगह छपेगा।

इसके बाद दो इंक्रिमेंट निर्देश हैं जो क्रमशः soochak के मान को 2 और ganak के मान को 1 बना देते हैं। यह ganak ही वह राशि है, जो छपे हुए गुणजों की गिनती रखता है। इसके बाद if वाली उक्ति है, जो ganak के मान को 5 से तुलना करके देखता है, और उसके नीचे के break निर्देश का निष्पादन तभी होता है जब ganak का मान 5 से अधिक हो जाए।

अभी, चूंकि ganak का मान 1 है, जो 5 से कम है, if के निर्देशों का निष्पादन नहीं होता, और प्रोग्राम का नियंत्रण वापिस while उक्ति को लौट जाता है। यहां चूंकि कोष्ठकों में 1 है, नियंत्रण while की उक्तियों का निष्पादन करने लगता है और स्क्रीन पर 8 का अगला गुणज छपता है।

इस प्रकार पांच आवृत्तियां होती हैं, और तब if का तार्किक व्यंजक का मान 1 हो जाता है, क्योंकि अब ganak का मान 5 हो गया है। इसलिए ganak >= 5 व्यंजन का मान 1 हो जाता है और if की break वाली उक्ति का निष्पादन होता है। यह वलय को तोड़ देता है और नियंत्रण प्रोग्राम की अलगी उक्ति की ओर बढ़ता है, जो है return (0); वाली उक्ति। इसलिए प्रोग्राम का समापन हो जाता है।

इस उदाहरण में मामूली सा परिवर्तन करने पर वह exit निर्देश का एक अच्छा उदाहरण हो सकता है। इन परिवर्तनों के साथ उपर्युक्त प्रोग्राम नीचे दिया गया है। यहां break के स्थान पर exit (0) आया है।

प्रोग्राम – 22
---------------------------------
/*exit nirdesh ka udaharan */

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

void main()
{
clrscr();

int ganak=0;
int soochak=1;
while(1)
{
printf("%d ", 8*soochak);
soochak++;
ganak++;
if (ganak >= 5)
exit(0);
}

getch();
}
---------------------------------

आउटपुट
---------------------------------
8 16 24 32 49
---------------------------------

अब आइए इस परिवर्तित प्रोग्राम को दखें। जब ganak का मान 5 हो जाता है और if निर्देश के अंतर्गत आया exit (0) निर्देश के निष्पादन की नौबत आती है, तो वह तुरंत ही प्रोग्राम के नियंत्रण को प्रचालन तंत्र को, यानी डॉस को, लौटा देता है। exit (0); निर्देश के बाद कोई भी निर्देश रखना व्यर्थ है, क्योंकि इन निर्देशों का कभी निष्पादन नहीं होता। इस प्रोग्राम के अंत में जो getch() वाला निर्देश है, उसका इसी कारण निष्पादन नहीं होता। exit (0) के कारणउस तक पहुंचने से पहले ही प्रोग्राम का अंत हो जाता है।

एक और बात ध्यान देने लायक है। exit (0) stdlib का फंक्शन इसलिए उसका उपयोग करने के लिए हमें stdlib के हेडर फाइल को अपने प्रोग्राम में include करना होगा। इसीलिए इस प्रोग्राम के शुरू में यह पंक्ति है –

#include <stdlib.h>

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

इस प्रोग्राम में while की उक्तियों में एक साधारण-सी printf() उक्ति है, पर उसके स्थान पर कोई लंबा-चौड़ा कोड या उप-प्रोग्राम भी हो सकता है। यहां हमारा उद्देश्य continue, आदि निर्देशों के कार्य करने की रीति को दर्शाना मात्र है। यदि उपयोगकर्ता 1 या 0 से अलग कोई कुंजी दबाता है, तो प्रोग्राम continue निर्देश की सहायता से उसे उसकी गलती की सूचना देता है, और दुबारा कोशिश करने को कहता है।

प्रोग्राम – 23
---------------------------------
/*continue, break aur exit nirdesh ka udaharan */

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

void main()
{
clrscr();

int vikalp;

printf("Kya aap aage badna chahte hai? 'Han' ke liye 1 aur 'na' ke liye 0 enter kijie: \n");
scanf("%d", &vikalp);
flushall();

while(1) {

if (vikalp != 1 && vikalp != 0)
{
printf("Aapne galat kunji dabai. Kripaya 1 ya 0 me se koi kunji dabaiye: \n");
scanf("%d", &vikalp);
continue;
}

if (vikalp == 1)
{
printf("Program me aapka swagat hai.\n");
break;
}

else if (vikalp == 0)
exit (0);
}
getch();
}
---------------------------------

आउटपुट
---------------------------------
Kya aap aage badna chahte hai? 'Han' ke liye 1 aur 'na' ke liye 0 enter kijie: 9
Aapne galat kunji dabai. Kripaya 1 ya 0 me se koi kunji dabaiye: 1
Program me aapka swagat hai.

Aapne galat kunji dabai. Kripaya 1 ya 0 me se koi kunji dabaiye: 0
(प्रोग्राम से आप बाहर आ जाते हैं।)

Aapne galat kunji dabai. Kripaya 1 ya 0 me se koi kunji dabaiye: 1
Program me aapka swagat hai.

Aapne galat kunji dabai. Kripaya 1 ya 0 me se koi kunji dabaiye:6
Aapne galat kunji dabai. Kripaya 1 ya 0 me se koi kunji dabaiye:
---------------------------------

इस प्रोग्राम में हमने प्रथम scanf() निर्देश के बाद flushall() का उपयोग किया है। यह इसलिए क्योंकि प्रोग्राम में आगे एक और scanf() कथन आता है, और यदि हम इनपुट स्ट्रीम को साफ न करें, उसमें रह गए ऐंटर कुंजी को दूसरा scanf() कथन पकड़ लेगा और उसे vikalp में रख देगा, जिससे हमारा प्रोग्राम ठीक से काम नहीं करेगा।

प्रथम if निर्देश के तार्किक व्यंजन पर भी ध्यान दें। वह है –

if (vikalp != 1 && vikalp != 0)

यहां दो तार्किक व्यंजक && (ऐंड अर्थात और) प्रचालक से जुड़े हुए हैं –

vikalp != 1
vikalp != 0

इसलिए इस तार्किक व्यंजक का मान तभी 1 बनेगा जब ये दोनों का मान 1 होगा। अन्य शब्दों में कहें, तो जब इनपुट 1 और 0 के अलावा कुछ होगा। जब ऐसा होता है, तो प्रोग्राम यह वाक्य प्रदर्शित करता है,

Aapne galat kunji dabai. Kripaya 1 ya 0 me se koi kunji dabaiye:

और इनपुट के लिए प्रतीक्षा करता है।

2 comments:

  1. Hey keep posting such good and meaningful articles.

    ReplyDelete
  2. Very interesting blog. A lot of blogs I see these days don't really provide anything that attract others, but I'm most definitely interested in this one. Just thought that I would post and let you know.

    ReplyDelete