Friday, June 19, 2009

27.. सीखिए सी : फंक्शन - सामान्य परिचय

हमने पहले बताया था कि सी एक स्ट्रक्चर्ड प्रोग्रामन भाषा है। इसका मतलब यह है कि सी का कोड अत्यंत व्यवस्थित और छोटे-छोटे खंडों में लिखा जाता है। प्रोग्राम लिखना शुरू करने से पहले समस्या का विश्लेषण करके उसे सरल घटकों में बांट दिया जाता है। उसके बाद प्रत्येक सरल घटक के लिए कोड लिखा जाता है। इस तरह कठिन से कठिन समस्या का कोड भी अत्यंत सरल हो जाता है।

एक उदाहरण लेते हैं, रोटी बनाने का उदाहरण। नरम-गरम, सुस्वादु रोटी बनाना एक अत्यंत मुश्किल काम है। पर यदि हम उसके बनने की प्रक्रिया को छोटे-छोटे चरणों में बांटकर देखें तो वह बहुत ही सरल प्रतीत होगी – रोटी बनाने के चरण ये होते हैं, –

1. बाजार से गेहूं लाना।
2. गेंहूं से कंकड़-कचरा बीनना।
3. गेंहूं को चक्की में ले जाकर पिसवाना।
4. आटे को गूंथना।
5. रोटी बेलना।
6. बेली हुई रोटी को तवे पर सेंकना।
7. तवे पर सिंकी रोटी को आंच पर फुलाना।
8. तैयार रोटी पर घी मलना।

यद्यपि शुरू में रोटी बनाने का काम अत्यंत जटिल प्रतीत होता है, लेकिन ऊपर इसके जो आठ चरण बताए गए हैं, उनमें से प्रत्येक इतना सरल है कि कोई भी उसे आसानी से बिना घबराहट के कर सकता है। और इन सब घटकों को व्यस्थिति रीति से सही क्रम में करने का नतीजा होता है, तैयार रोटी।

यही अभिगम सी प्रोग्रामिंग में भी अपनाया जाता है। किसी भी समस्या को अधिक सरल छोटी समस्याओं में तोड़ा जाता है, और फिर प्रत्येक छोटी समस्या के लिए कोड लिखा जाता है। फिर इन कोडों को समायोजित किया जाता है, जिससे मूल समस्या का हल प्राप्त हो जाता है।

इस प्रक्रिया को अंजाम देने में हमें सी की फंक्शन नामक संरचना मदद करती है। फंक्शन वास्तव में एक छोटा सी प्रोग्राम ही होता है। प्रत्येक फंक्शन मूल समस्या के किसी एक छोटे पहलू का ही समाधान कर सकता है। पर कई फंक्शन मिलकर पूरी समस्या का हल कर डालते हैं।

हर सी प्रोग्राम में एक मूल फंक्शन होता है जो अन्य सभी फंक्शनों को समायोजित करता है और उन्हें यथा समय और यथा स्थान बुलाता है और उनसे आवश्यक काम करा लेता है। इस मूल फंक्शन को main फंक्शन कहा जाता है। आप इस फंक्शन से परिचित हैं, क्योंकि अब तक हमने जितने भी प्रोग्राम लिखे हैं उन सबमें वह विद्यामान रहा है। सच तो यह है कि सी के सभी प्रोग्राम में वह अनिवार्य रूप से रहता है।

आइए, इन सब बातों को हम वास्तविक कोड का उदाहरण लेकर समझते हैं। हम ऐसा एक प्रोग्राम लिखेंगे, जो दो संख्याओं को जोड़कर उनका योगफल हमें बताएगा।

पहले हम फंक्शनों का प्रयोग बिना किए यह प्रोग्राम लिखेंगे।

प्रोग्राम – 25
---------------------------------
/*function ka udaharan - 1*/

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

void main()
{
int a, b, c;
clrscr();
printf("\nDo sankhyaein darj kijiye: ");
scanf("%d%d", &a, &b);
printf("\n%d aur %d", a,b);
flushall();
c=a+b;
printf("\nAapne jo sandhyaein darj kien, unka yogphal hai, %d", c);

getchar();
}
---------------------------------

आउटपुट
---------------------------------
Do sankhyaein darj kijiye: 4 5
Aapne jo sandhyaein darj kien, unka yogphal hai, 9
---------------------------------

यह सीधा सा प्रोग्राम है जो दो संख्याओं का योगफल देता है। इसमें हमने फंक्शन का प्रयोग नहीं किया है। आइए देखें इस प्रोग्राम में हम फंक्शन का प्रयोग कैसे कर सकते हैं।

इस प्रोग्राम में एक ही मुख्य समस्या है, दो संख्याओं का योगफल प्राप्त करना। इसलिए हम इसी के लिए फंक्शन लिखेंगे। जो इस प्रकार होगा –

int yogphal (int a, int b)
{
int c;
c=a+b;
return c;
}

उपर्युक्त कोड खंड एक सरल फंक्शन है। वह केवल एक काम करता है, यानी दो संख्याओं का योगफल निकालकर उसे return करता है, यानी वापस भेजता है। आइए अब इस फंक्शन की चीर-फाड़ करते हैं।

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

हर फंक्शन का एक टाइप (प्रकार) होता है, अर्थात वह किसी एक प्रकार की राशि को return करता है, यानी वापस भेजता है। यह टाइप सी की राशियों के विभिन्न टाइपों में से कोई हो सकता है, मसलन, int, char, float, long, इत्यादि। इनके अलावा यह टाइप अधिक जटिल प्रोयक्ता-परिभाषित टाइप भी हो सकता है, जैसे सरणी (array),struct, union, आदि। इनके बारे में हमने अभी सीखा नहीं है, आगे सीखेंगे।

फंक्शन के टाइप यानी प्रकार को दर्शाने के लिए उसके नाम से पहले उस टाइप के लिए जो कुंजी शब्द हो, उसे लिख दिया जाता है। हमारा उपर्युक्त फंक्शन दो int राशियों को जोड़ता है, जिससे योगफल के रूप में एक int राशि ही प्राप्त होती है, जिसे ही यह फंक्शन लौटा है। इसलिए हमारे उपर्युक्त फंक्शन का टाइप int है। इसलिए हम लिखेंगे –

int yogphal

फंक्शन किन्हीं राशियों पर कुछ कार्य करता है। ये राशियां उसे बुलानेवाला दूसरा फंक्शन उसे देता है। फंक्शन को कोई राशि देने की रीति होती है उन्हें फंक्शन के गोल कोष्ठकों में रखना। फंक्शन के गोल कोष्टकों में राशियों को रखते समय उनका प्रकार स्पष्ट करना आवश्यक है। हमारे उदाहरण में, yogphal फंक्शन दो int प्रकार की संख्याओं को जोड़ता है। इसलिए उसे दो int प्रकार की राशियां दी जाएंगी। इसलिए उसे ये राशियां देने की विधि यह होगी –

int yogphal (int a, int b)

इस पंक्ति में आया प्रथम शब्द int फंक्शन के प्रकार को सूचित करता है। yogphal फंक्शन का नाम है। और उसके गोल कोष्ठक में जो दो int प्रकार की राशियां, वे उसे बुलाने वाले फंक्शन ने उसे दी है।

इसके बाद आते हैं धनु कोष्ठक, जिनके अंदर फंक्शन के कोड की उक्तियां रहती हैं। हमारे फंक्शन में ये उक्तियां हैं –

int c;
c=a+b;
return c;

अब पूरे फंक्शन का हुलिया एक बार फिर देख लीजिए –

int yogphal (int a, int b)
{
int c;
c=a+b;
return c;
}

आप सोच रहे होंगे, कि यह फंक्शन काम कैसे करता होगा। हर फंक्शन तभी काम करेगा जब कोई अन्य फंक्शन, जिसमें main भी शामिल है, उसे बुलाए, और उसे आवश्यक राशियां प्रदान करे। फंक्शन के हमारे इस उदाहरण में यह काम main करेगा, इस तरह –

void main()
{
int a, b, c;
clrscr();
printf("\nDo sankhyaein darj kijiye: ");
scanf("%d%d", &a, &b);
flushall();
c=yogphal (a,b);
printf("\nAapne jo sandhyaein darj kien, unka yogphal hai, %d", c);

getchar();
}

यह पहले वाला ही प्रोग्राम है, केवल एक अंतर है। इसमें दोनों संख्याओं को जोड़ने वाला व्यंजक नहीं है, उसके स्थान पर यह पंक्ति है –

c=yogphal(a, b);

इसी पंक्ति में yogphal फंक्शन का आह्वान किया गया है। आह्वान करने की रीति यह है – फंक्शन का नाम लिखकर उसके गोल गोष्ठकों में उन राशियों को रखना जिन्हें हम उस फंक्शन को उपलब्ध कराना चाहते हैं। इस बार इन राशियों का प्रकार सूचक शब्द (int, char, आदि) लिखने की जरूरत नहीं है, क्यों इन राशियों को घोषित करते समय हमने उनका प्रकार भी प्रोग्राम को बता दिया है, जिसे कंप्यूटर याद रखता है।

आपने ध्यान दिया होगा कि फंक्शन का आह्वान करते समय, उसे एक अन्य राशि c के साथ = चिह्न द्वारा जोड़ा गया है, यानी यह फंक्शन एक तरह से c में कोई मान आरोपित कर रहा है, उसी तरह जैसे इस व्यंजक में –

c=5;

फंक्शन कोई न कोई मान वापस लौटाता है। हमारा yogphal फंक्शन भी एक मान लौटाता है। यदि आप yogphal फंक्शन को जांचें, तो आपको उसकी अंतिम पंक्ति के रूप में यह उक्ति नजर आएगी –

return c;

return सी भाषा का एक कुंजी शब्द है, जिसे हर उस फंक्शन के अंतिम पंक्ति के रूप में रहना चाहिए जो कोई मान लौटाता है। इस कुंजी शब्द के आगे वह राशि रखी जाती है, जिसे वह फंक्शन उसे बुलानेवाले फंक्शन को लौटाता है। हमारे उदाहरण में यह राशि c है, जिसमें a और b संख्याओं का योगफल है।

main प्रोग्राम की c राशि yogphal फंक्शन द्वारा लौटाई गई इस राशि को प्राप्त करती है।

इस पंक्ति के बाद main प्रोग्राम में c का मान वही होगा जो yogphal फंक्शन ने उसे दिया है।

इसका प्रमाण है, main फंक्शन की यह पंक्ति जो c के मान को कंप्यूटर स्क्रीन पर छापती है –

printf("\nAapne jo sandhyaein darj kien, unka yogphal hai, %d", c);

कंप्यूटर स्क्रीन में c की जगह a और b का योगफल छपता है।

यह रहा पूरे प्रोग्राम का कोड।

प्रोग्राम – 26
---------------------------------
/*function ka udaharan - 2*/

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

int yogphal (int a, int b)
{
int c;
c=a+b;
return c;
}

void main()
{
int a, b, c;
clrscr();
printf("\nDo sankhyaein darj kijiye: ");
scanf("%d%d", &a, &b);
flushall();
c=yogphal (a,b);
printf("\nAapne jo sandhyaein darj kien, unka yogphal hai, %d", c);

getchar();
}
---------------------------------

आउटपुट
---------------------------------
Do sankhyaein darj kijiye: 4 5
Aapne jo sandhyaein darj kien, unka yogphal hai, 9
---------------------------------

यह प्रोग्राम भी वही आउटपुट देता है, जो प्रोग्राम – 25 ने दिया था, पर इसके कोड में काफी अंतर है। इसमें संख्याओं को जोड़ने का काम main में नहीं किया गया है, बल्कि yogphal फंक्शन में किया गया है।

ध्यान दीजिए कि हमने फंक्शन yogphal के कोड को main के कोड से पहले रखा है। यह बहुत जरूरी है। अन्यथा कंप्यूटर को पता नहीं चल पाएगा कि yogphal फंक्शन जैसे किसी फंक्शन का अस्तिव है तथा उसमें घोषित राशियों के लिए (इस उदाहरण में int c) उसे कितनी स्मृति आरक्षित करनी है।

फंक्शन की अवधारणा प्रोग्रामन भाषाओं की एक अत्यंत महत्वपूर्ण अवधारणा है। इसलिए हम उसे विस्तार से अनेक लेखों में समझेंगे। इस लेख को हम यहीं समाप्त करते हैं।

यदि आप चाहें, तो इस लेख में दिए गए प्रोग्राम - 26 को इस तरह परिवर्तित करके देख सकते हैं कि वह योगफल की जगह दो संख्याओं का गुणनफल निकाल कर दे। इससे आपको फंक्शन लिखने का अभ्यास भी हो जाएगा।