Thursday, June 18, 2009

26. सीखिए सी : switch संरचना

पिछले एक लेख में हमने बताया था कि सी भाषा में विशाखन की मुख्य संरचना if...else वाली संरचना है। लेकिन जब बहुत सारे विकल्प हों, तो if...else संरचना अव्यवस्थित हो जाती है और उसे ठीक तरह से लिखना कठिन हो जाता है। आप अब तक समझ गए होंगे, कि जितने विकल्प होंगे, उतने ही else कथन भी होंगे, और इनमें से प्रत्येक में काफी मात्रा में कोड की पंक्तियां भी धनु कोष्ठकों में रह सकती हैं। इसलिए प्रोग्राम में if...else के कई कोड खंडों की भीड़-भाड़ हो जाती है और यह पता लगाना कठिन हो जाता है कि किसी कोड खंड का संबंध किस else उक्ति से है।

इसलिए सी में अधिक जटिल विशाखन को अंजाम देने के लिए एक अन्य संरचना भी है, जिसे switch संरचना कहते हैं। इसका रूप इस तरह होता है –

switch (sanket)
{
case 'saket का मान 1’ :
उक्तियां;
break;
case ‘sanket का मान 2’ :
उक्तियां;
break;
case ‘sanket का मान 3’ :
उक्तियां;
break;
.
.
.
.
case ‘sanket का मान n’ :
उक्तियां;
break;
default :
उक्तियां;
}

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

switch संरचना की शुरुआत इस पंक्ति से होती है।
switch (sanket)

यहां sanket सामान्यतः int या char प्रकार की कोई राशि होती है। इसे switch कथन से पहले घोषित किया जाता है और प्रोग्राम के दौरान यह कोई मान प्राप्त करता है, जिसे sanket का मान 1, sanket का मान 2, sanket का मान 3,.... sanket का मान n के रूप में ऊपर के उदाहरण में दर्शाया गया है।

इसके बाद switch कथन का कोड खंड आता है, जो धनु कोष्ठकों में घिरा रहता है। इन धनु कोष्ठकों के अंदर case शब्द के जरिए सभी विकल्पों और उनसे संबंधित कोड खंडों को रखा जाता है। जितने विकल्प होंगे, उतने case कथन तथा उसके कोड़ खंड भी होंगे। प्रत्येक कोड खंड की अंतिम उक्ति break उक्ति होगी। case कथन और उसके कोड खंड को लिखने की विधि यह है –

case ‘sanket का मान 1’ :
कोड खंड
break;

सबसे पहले case शब्द को लिखा जाता है। उसके बाद एकल उद्धरण चिह्नों में sanket राशि द्वारा प्राप्त किया जानेवाला कोई मान रखा जाता है।

उसके बाद कोलन (: ) होता है।

कोलन के बाद उस case से संबंधित कोड खंड रहता है। इस कोड खंड की अंतिम उक्ति break उक्ति होती है, ताकि वांछित विकल्प के कोड के निष्पादन के बाद प्रोग्राम switch संरचना से बाहर आ जाए।

switch में कई case खंड होते हैं, पर इन case खेडों में से प्रोग्राम के दौरान केवल एक case खंड का ही निष्पादन होता है।

मान लीजिए कि किसी प्रोग्राम में sanket के ये चार मान हो सकते हैं - a, b, c, d। तो switch संरचना इस तरह बनेगी –

switch (sanket)
{
case ‘a’ :
उक्तियां;
break;

case ‘b’ :
उक्तियां;
break;

case ‘c’ :
उक्तियां;
break;

case ‘d’ :
उक्तियां;
break;
}

और इस switch संरचना का निष्पादन इस तरह होगा –

मान लीजिए प्रोग्राम में sanket का मान c आता है। तब switch संरचना के case ‘a’ और case ‘b’ से संबंधित कोड खंडों का निष्पादन नहीं होगा। प्रोग्राम सीधे case ‘c’ के कोड खंड का निष्पादन करेगा। चूंकि case 'c' की अंतिम उक्ति break कथन है, इसलिए उसके निष्पादन से switch संरचना टूट जाएगी और case 'd' के कोड खंड का निष्पादन नहीं होगा। इसके बजाए प्रोग्राम switch संरचना के बाद वाली पंक्तियों का निषपादन करने लगेगा।

है न यह विशाखन को अंजाम देने के लिए if...else से बढ़िया तरीका?

आइए, एक उदाहरण के जरिए switch संरचना को समझते हैं। इस उदाहरण में हम एक कैलक्युलेटर का प्रोग्राम लिखेंगे। यह कैलक्युलेटर योग, व्यवकलन, गुणन और विभाजन, ये चार संक्रियाएं कर सकेगा। इस तरह हमारे प्रोग्राम की switch संरचना में चार विकल्प होंगे, यानी चार case खंड होंगे। प्रयोक्ता से पूछा जाएगा कि उसे कौन सी गणितीय संक्रिया करनी है। उसे + (योग के लिए), - (व्यवकलन के लिए), * (गुणन के लिए), और / (विभाजन के लिए) में से कोई एक चिह्न चुनकर अपनी पसंद जाहिर करनी होगी। उसके बाद उसे दो संख्याएं भी चुननी होंगी, जिन पर प्रयोक्ता द्वारा चुनी गई गणितीय संक्रिया लागू की जाएगी। तत्पशचात प्रोग्राम प्रयोक्ता से पूछेगा कि वह और भी कोई गणितीय संक्रिया करना चाहता है या नहीं? इसका उत्तर प्रयोक्ता को y (हां के लिए) या n (नहीं के लिए) दर्ज करना होगा। प्रोग्राम में एक do...while लूप भी है। दरअसल switch संरचना को इसी do...while लूप के भीतर रखा गया है। यह do...while लूप प्रयोक्ता द्वारा व्यक्त किए गए y या n के अनुसार या तो switch कथन को तोड़ देता है (प्रयोक्ता देवारा n चुने जान पर) या उसे दुहराता है (प्रयोक्ता द्वरा y चुने जाने पर।

प्रोग्राम – 24
---------------------------------
/*switch sanrachana ka udaharan - calculator program*/

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

void main()
{
float a,b,c;
char sanket, pasand;
clrscr();

do
{
printf("Ank ganitiya prachalak chuniye\n");
printf("+ yog ke liye\n");
printf("- vyavakalan ke liye\n");
printf("* gunan ke liye\n");
printf("/ vibhajan ke liye\n");
scanf("%c",&sanket);
flushall();
printf("\nDo sankhyaen darj kijiye\n");
scanf("%f %f",&a,&b);
flushall();

switch(sanket)
{
case '+': c=a+b;
printf("Inka yog hai, %f\n",c);
break;

case '-': c=a-b;
printf("Inka antar hai, %f\n",c);
break;

case '*': c=a*b;
printf("Inka gunanphal hai, %f\n",c);
break;

case '/': c=a/b;
printf("Inka vibhajanphal hai, %f\n",c);
break;
}

printf("\nKya aap aur ganit karna chahtehai?(y ya n)\n");
scanf("%c",&pasand);
flushall();
}while(pasand!='n');

}
---------------------------------

आउटपुट
---------------------------------
Ank ganitiya prachalak chuniye
+ yog ke liye
- vyavakalan ke liye
* gunan ke liye
/ vibhajan ke liye +
Do sankhyaen darj kijiye 4 5
Inka yog hai, 9.00000
Kya aap aur ganit karna chahtehai? y
Ank ganitiya prachalak chuniye
+ yog ke liye
- vyavakalan ke liye
* gunan ke liye
/ vibhajan ke liye *
Do sankhyaen darj kijiye 3 8
Inka yog hai, 24.00000
Kya aap aur ganit karna chahtehai?n
---------------------------------

इस प्रोग्राम में ध्यान देनेवाली बातें निम्नलिखित हैं –
1. a, b, c को float प्रकार की राशियों के रूप में घोषित किया गया है।
2. दूसरे scanf उक्ति के जरिए एक साथ दो राशियों का मान पकड़ा गया है, यानी प्रयोक्ता द्वारा दर्ज की गई दोनों संख्याओं को। आपने ऐसा पहले printf के साथ किया है, अब आपको मालूम हुआ यह कमाल scanf भी कर सकता है। ध्यान देने की बात यही है, कि scanf के कोष्ठकों में दुहरे उद्धरण चिह्नों के अंदर और अल्प विराम के बाद &चिह्न के साथ ये रेशियां सही क्रम में आएं तथा उद्धरण चिह्नों में उनके लिए सही सूचक प्रतीक लगाए जाएं, अर्थात, यदि राशि int प्रकार की हो, तो %d, यदि वह char प्रकार की हो तो %c, इत्यादि।
3. जैसा कि पहले समझाया गया है, प्रत्येक scanf के बाद flushall() का प्रयोग किया गया है ताकि वह प्रोयक्ता द्वारा दबाई गई ऐंटर कुंजी को इनपुट न मान ले।
4. switch कथन को do...while के भीतर रखा गया है।
5. do...while लूप तब तक चलता रहता है जब तक प्रयोक्ता pasand के लिए n नहीं दर्ज करता।

अब switch संरचना का उपयोग करते हुए कोई प्रोग्राम लिखिए। इससे आपको विशाखन की इस महत्वपूर्ण संरचना के कार्य करने की रीति और भी स्पष्ट हो जाएगी।

4 comments:

  1. कोशिश करेगे, आप का धन्यवाद

    ReplyDelete
  2. तकनीक में हम पैदल हैं ! आपकी पोस्ट पहली बार में तो सर के ऊपर से गुज़र गई ! दोबारा कोशिश करती हूं !

    ReplyDelete
  3. . आपका प्रयास अदभुत है पर इस ब्लाग में सी++ में आपके पूरे नोटस नही दिखई दे रहे है B Tiwari

    ReplyDelete
  4. What you're saying is completely true. I know that everybody must say the same thing, but I just think that you put it in a way that everyone can understand. I'm sure you'll reach so many people with what you've got to say.

    ReplyDelete