Tuesday, April 28, 2009

सीखिए सी -19 : विशाखन - if... else निर्देश

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

कंप्यूटर प्रोग्रामों में अनेक बार ऐसी स्थितियां आती हैं जिनमें कंप्यूटर को दो या अधिक विकल्पों में से किसी एक को चुनकर आगे बढ़ना पड़ता है। इसी को विशाखन कहते हैं। विशाखन के कारण ही कंप्यूटर प्रोग्राम अनेक जटिल कार्य कर पाते हैं।

इसे एक उदाहरण से समझते हैं। मान लीजिए कि हमें एक ऐसा प्रोग्राम लिखना है जो स्कूली बच्चों के प्राप्तांक स्वीकार करेगा और यदि प्राप्तांक 60% से ज्यादा हो, तो प्रदर्शित करेगा - Pratham Darja. यदि प्राप्तांक 50% और 60% के बीच हो तो प्रदर्शित करेगा - Dvitiya Darja. और यदि प्राप्तांक 40% और 50% के बीच हो तो प्रदर्शित करेगा – Tritiya Darja. और यदि प्राप्तांक 40% से कम हो, तो प्रदर्शित करेगा – Fail.

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

इस तरह के प्रोग्राम लिखने में हमें सी की जो संरचना मदद करती है, वह है if... else वाली संरचना। इसके कई रूप होते हैं, सबसे सरल रूप यह है:

if (शर्तें)
{
सी की उक्तियां
}
else
{
सी की उक्तियां
}

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

आइए एक छोटे प्रोग्राम के जरिए इसे समझते हैं। इस प्रोग्राम में आपसे पूछा जाता है कि रात है या दिन, और प्राप्त उत्तर के अनुसार Raat ko taare chamakte hain. या Din ko suraj chamakta hai. में से कोई एक वाक्य प्रदर्शित किया जाता है।

प्रोग्राम 8
--------------------------------
/*if... else ka udaharan */

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

void main()
{
clrscr();

char raat_din;

printf("Batayiye ki raat hain ya din. Raat ke liye R aur din ke liye D type kijiye: ");
scanf("%s", &raat_din);
if(raat_din=='D')
{
printf("\nDin mein suraj chamakta hai.");
}
else
{
printf("\nRaat ko tare chamakte hai.");
}
getch();
}
-------------------------------

आउटपुट
-------------------------------
यदि प्रयोक्ता R दर्ज करे
Raat ko tare chamakte hai.

यदि प्रयोक्ता D दर्ज करे
Din mein suraj chamakta hai.
-------------------------------

इस प्रोग्राम में खास रूप से if के गोल कोष्ठकों में जो व्यंजक है उसकी ओर ध्यान दीजिए। वह है

raat_din=='D'

यहां D अक्षर को एकल उद्धरण चिह्न ( ‘ और ‘) से घेरा गया है। यह महत्वपूर्ण है। सी में char प्रकार की राशियों को एकल उद्धरण चिह्नों से घेरा जाता है, और string प्रकार की राशियों को दुहरे उद्धरण चिह्नों से (“ और ”)। उदाहरण के लिए prinf() के गोल कोष्ठकों में जो वाक्य है, वह string प्रकार की राशि है, जिसे दुहरे उद्धरण चिह्नों से घेरा गया है।

जब प्रोग्राम if वाली उक्ति पर पहुंचता है, तो वह उसके गोल कोष्ठक के तार्किक व्यंजक का मूल्यांकन करता है और scanf() के जरिए raat_din राशि में जमा कराए गए वर्ण की तुलना D से करता है। यदि दोनों D ही हुए तो वह इस व्यंजक का मान 1 कर देता है, यानी सही, और प्रोग्राम if के धनु कोष्टकों के भीतर जो उक्ती है, उसका निष्पादन कर देता है, जिससे स्क्रीन पर

Din me suraj chamakta hai.

वाला वाक्य दिखाई देता है।

इसकी जगह यदि scanf() ने raat_din में R वर्ण को जमा कराया हो, तो if उक्ति के गोल कोष्ठक के भीतर के व्यंजक का मान 0 हो जाता है, यानी गलत, और प्रोग्राम if के धनु कोष्ठकों की उक्ति को छोड़कर else के धनु कोष्ठक की उक्ति का निष्पादन करता है, जिससे स्क्रीन पर यह वाक्य नजर आता है

Raat ko tare chamakte hai.

इस उदाहरण में दो ही विकल्प थे, पर if... else संरचना का उपयोग करके दो से अधिक विकल्पों को भी संभाला जा सकता है। इस तरह:-

if (शर्तें)
{
सी की उक्तियां
}
else if (शर्तें)
{
सी की उक्तियां
}
else
{
सी की उक्तियां
}

इसमें दो if... else कथनों को एक के बाद एक पिरोया गया है, जिससे तीन विकल्प प्राप्त होते हैं।

आइए प्रोग्राम 8 को ही थोड़ा और विस्तृत करके इस तीन विकल्प वाले if...else को समझते हैं। इसके लिए हम प्रोग्राम 8 को इस तरह बदलेंगे। यदि प्रयोक्ता R या D के सिवा कोई अन्य कुंजी को दबाए, तो प्रोग्राम यह संदेश प्रदर्शित करेगा:-

Aap ko D athava R me se koi kunji hi dabani thi.

प्रोग्राम 9
-------------------------------
/*Teen vikalp wale if... else ka udaharan */

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

void main()
{
clrscr();

char raat_din;

printf("Batayiye ki raat hain ya din. Raat ke liye R aur din ke liye D type kijiye: ");
scanf("%s", &raat_din);
if(raat_din=='D')
{
printf("\nDin mein suraj chamakta hai.");
}
else if (raat_din=='R')
{
printf("\nRaat ko tare chamakte hai.");
}
else
printf("\nAap ko D athava R me se koi kunji hi dabani thi.");
getch();
}
-------------------------------

आउटपुट
-------------------------------
यदि प्रयोक्ता R दर्ज करे
Raat ko tare chamakte hai.

यदि प्रयोक्ता D दर्ज करे
Din mein suraj chamakta hai.

यदि प्रयोक्ता D या R के सिवा कोई अन्य कुंजी दबाए
Aap ko D athava R me si koi kujni hi dabani thi.
-------------------------------

इस प्रोग्राम में संकलक if उक्ति पर पहुंचकर उसके गोल कोष्ठक के भीतर के व्यंजक को scanf() द्वारा raat_din में जमा किए वर्ण के आधार पर सही या गलत का मान देता है। वह सही होने पर if के धनु कोष्ठकों की उक्ति का निष्पादन होता है और आगे के else if.. else के धनु कोष्ठकों की उक्तियों को संकलक लांघ जाता है। वह गलत होने पर if के धनु कोष्ठों की उक्ति को छोड़कर प्रोग्राम else if वाली उक्ति पर आ जाता है और उसके गोल कोष्ठकों के व्यंजक का मूल्यांकन करता है और उसे सही या गलत का मान देता है। यदि यह व्यंजक सही है, तो else if के धनु कोष्ठकों की उक्ति का निष्पादन होता है। यदि यह व्यंजक गलत है, तो प्रोग्राम else if के धनुकोष्ठकों की उक्ति को छोड़ देता है, और अंतिम else के धनु कोष्ठकों की उक्ति का निष्पादन करता है।

इस अंतिम else के आगे आप और if ... else जोड़कर तीन से अधिक विकल्पों वाले अधिक जटिल प्रोग्राम भी लिख सकते हैं।

क्यों न इस तरह का एक प्रोग्राम लिखने की कोशिश आप करें? इससे if ... else संरचना के काम करने की रीति आपको अच्छी तरह समझ में आ जाएगी। तो लिजिए, यह रहा

अभ्यास – 2

आपको इस लेख के प्रारंभ में जो उदाहरण दिया गया है उसके लिए if ... esle संरचना का उपोयग करते हुए एक प्रोग्राम लिखना है।

आपको एक ऐसा प्रोग्राम लिखना है जो स्कूली बच्चों के प्राप्तांक स्वीकार करेगा और यदि प्राप्तांक 60% से ज्यादा हो, तो प्रदर्शित करेगा - Pratham Darja. यदि प्राप्तांक 50% और 60% के बीच हो तो वह प्रदर्शित करेगा - Dvitiya Darja. और यदि प्राप्तांक 40% और 50% के बीच हो तो वह प्रदर्शित करेगा – Tritiya Darja. और यदि प्राप्तांक 40% से कम हो, तो वह प्रदर्शित करेगा – Fail.

यह प्रोग्राम लिखने की कोशिश कीजिए। अगले लेख में मैं इसका हल दूंगा, पर मैं चाहता हूं कि इससे पहले आप स्वयं ही इसे लिख डालें।

Monday, April 27, 2009

सीखिए सी - 18 : अभ्यास 1 का हल

पिछले लेख में मैंने आपसे एक सी प्रोग्राम लिखने को कहा था। क्या आप लिख पाए? यदि लिख पाए, और उसने वांछित परिणाम दिया तो आपको बधाई। यह साबित करता है कि आपने सी भाषा पर काफी अधिकार पा लिया है। इससे सी से संबंधित अधिक कठिन विषयों को सीखने में आपको सहूलियत रहेगी।

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

प्रोग्राम -7
--------------------
/*Abhyas -1 */

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

void main()
{
clrscr();

char naam[20];

printf("Kripaya apna naam batayen: ");
scanf("%s", &naam);
printf("\nAbhinandan %s ji.", naam);
getch();
}
----------------------
आउटपुट
Kripaya apna naam batayen: Balasubramaniam
Abhinandan Balasubramaniam ji.
----------------------
इस प्रोग्राम के शुरू में पूर्वसंकलक के लिए दो उक्तियां हैं:-

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

इनमें से पहली उक्ति से आप परिचित हैं। यह पहले के प्रोग्रामों में भी आया है। यह सी के stdio वाली लाइब्रेरी का हेडर फाइल है।

दूसरी उक्ति सी के conio लाइब्रेरी का हेडर फाइल है। इसका उपयोग हमने इसलिए किया है क्योंकि हमने इस प्रोग्राम में इस लाइब्रेरी के एक फंक्शन का उपयोग किया है। यह फंक्शन है, clrscr()।

आइए अब आपको बताते हैं कि यह फंक्शन क्या करता है। कंप्यूटर कई प्रकार के आउटपुट स्क्रीन पर दिखाता रहता है। इन्हें वह एक के बाद एक के क्रम में स्क्रीन पर दर्शाता जाता है। इससे थोड़ी ही देर में कंप्यूटर स्क्रीन पर आउटपुट की बहुत सारी पंक्तियां जमा हो जाती हैं, जिससे नए आउटपुट की पंक्तियां ठीक से नजर नहीं आतीं। clrscr() फंक्शन स्क्रीन पर जितना भी पुराना आउटपुट हो, उसे सब मिटा देता है, जिससे नए आउटपुट की पंक्तियां स्क्रीन के ऊपरी भाग में साफ दिखाई देती हैं।

इस प्रोग्राम के अंत में एक और नया फंक्शन आप देखेंगे, यह है getch()। यह भी एक काम का फंक्शन है। यह फंक्शन कुंजीपटल से कोई एक कुंजी के दबाने तक प्रोग्राम को आउटपुट विधा में रोके रखता है। इससे आप प्रोग्राम द्वारा दर्शाए गए अंतिम आउटपुट को देख पाते हैं। अन्यथा कंप्यूटर बिजली की तेजी से अंतिम आउटपुट, अर्थात "Abhinandan Balasubramaniam ji." वाली पंक्ति को प्रदर्शित करके अपने आप बंद हो जाएगा। यह इतनी तेजी से होगा कि आप देख भी नहीं पाएंगे कि कंप्यूटर ने क्या दर्शाया।

getchar() के कारण प्रोग्राम कोई कुंजीपटल इनपुट के लिए रुका रहेगा, यानी जब तक आप कुंजीपटल की किसी कुंजी को न दबाएं, स्क्रीन दिखाई देता रहेगा, और आप प्रोग्राम के अंतिम आउटपुट को भली-भांति देख पाएंगे।

getch() फंक्शन भी stdio.h सी लाइब्रेरी का एक फंक्शन है।

इस प्रोग्राम की अंतिम विशेषता काफी महत्वपूर्ण है, इसलिए इसे ध्यानपूर्वक समझिए। हमने प्रोग्राम के शुरू में एक char राशि घोषित की है, जिसका नाम हमने naam रखा है, पर इस पंक्ति में आप एक नई बात देखेंगे। naam को इस तरह घोषित किया गया है:-

char naam[20];

यानी naam के आगे वर्ग कोष्ठकों मे 20 लिखा हुआ है। क्या आप बता सकते हैं, कि हमने ऐसा क्यों किया?

इसका उत्तर सरल है। आपने पहले सीखा था कि char राशि के लिए कंप्यूटर मात्र 8 बिट का स्थान आरक्षित करता है। इन आठ बिटों में अंग्रेजी वर्णमाला का कोई एक वर्ण समा सकता है। लेकिन किसी व्यक्ति के नाम में तो अनेक वर्ण होते हैं। उदाहरण के लिए, मेरा ही नाम लीजिए, Balasubramaniam. इसमें 15 वर्ण हैं। इसलिए यदि हम naam को मात्र char naam; के रूप में घोषित करें, तो उसमें केवल एक वर्ण समा पाएगा, यानी B वर्ण, और आपके प्रोग्राम के आउटपुट में भी केवल यही एक वर्ण दिखाई देगा, इस तरह:-

Abhinandan B ji.

क्यों न आप प्रोग्राम में यह परिवर्तन करके देखें। char naam[20]; की जगह केवल char naam; रखकर प्रोग्राम को चलाकर देखिए। साथ में scanf() और दूसरे printf() उक्ति में भी %s की जगह %c करना न भूलें। क्या आपको ऊपर्युक्त आउटपुट मिला?

इसलिए, नाम में विद्यमान अन्य वर्णों को पकड़ने के लिए हमें अधिक लंबी राशि की आवश्यकता है। char naam[20]; में हमने 20 char राशियों के बराबर की स्मृति naam के लिए आरक्षित कराई है। इतनी स्मृति में Balasubramaniam जैसे लंबे नाम पूरे आ जाएंगे, और हमारे प्रोग्राम के आउटपुट में नाम पूरा दिखाई देगा।

इस तरह की एक से अधिक char से बनी राशि को string राशि कहा जाता है। उसका चिह्न %s होता है। क्या आपने ध्यान दिया कि इस प्रोग्राम की scanf() उक्ति में तथा दूसरी prinf() उक्ति में हमने $s चिह्न का प्रयोग किया है? उसके स्थान पर यदि हम %c का प्रयोग करते, तो प्रोग्राम सही आउटपुट नहीं देता।

char naam[20] वाली उक्ति के बारे में कुछ अन्य आवश्यक बातों का जिक्र करके हम इस लेख को समाप्त करते हैं।

यह राशि वास्तव में प्रयोक्ता द्वारा निर्दिष्ट राशि का एक उदाहरण है। इस तरह की राशि को array कहा जाता है, जिसके लिए हिंदी में सरणी शब्द चलता है।

सी में दो तरह की राशियां होती हैं, एक, सी की अपनी राशियां, जैसे char, int, float, इत्यादि, और दो, प्रयोक्ता-निर्दिष्ट राशियां। इनका विस्तार संकलक द्वारा निर्दिष्टि नहीं किया जाता है, बल्कि प्रयोक्ता अपनी आवश्यकतानुसार इनका विस्तार बताते हैं। उदाहरण के लिए char naam[20] में हमने निर्दिष्टि किया है कि naam का विस्तार 20 char राशियों के बराबर होगा। इससे कंप्यूटर अपनी स्मृति में 20 सलग्न char कोषों को naam के साथ जोड़ देता है (अर्थात 160 बिट की जगह को)। स्मृति के इस खंड तक आप naam शब्द का उपयोग करके पहुंच सकते हैं, और वहां जो भी मान आप चाहे रखवा सकते हैं, अथवा वहां मौजूद मान को आउटपुट के रूप में ला सकते हैं।

सरणि (array) एक जटिल विषय है जिस पर हम आगे के लेखों में अधिक विस्तार से चर्चा करेंगे।

Saturday, April 25, 2009

सीखिए सी - 17 : अभ्यास-1

आइए, अब हम परखें कि आपने अब तक के लेखों को कितनी अच्छी तरह से समझा है। इसका बेहतरीन तरीका होगा अब तक अर्जित ज्ञान का उपयोग करते हुए एक सी प्रोग्राम लिखना।

तो तैयार हो जाइए, सी का एक प्रोग्राम लिखने के लिए।

एक ऐसा प्रोग्राम लिखिए जिसमें प्रयोक्ता से उसका नाम पूछा जाएगा (इसके लिए आप printf() का उपयोग करेंगे)। और प्रयोक्ता द्वारा बताए गए नाम को एक राशि में जमा करके आप उसे एक अभिनंदन वाक्य में पिरोकर स्क्रीन पर दर्शाएंगे। इसके लिए आपको एक char प्रकार की राशि घोषित करनी होगी और प्रयोक्ता के इनपुट को पकड़ने के लिए scanf() का उपयोग करना होगा।

इस प्रोग्राम का आउटपुट कुछ-कुछ इस प्रकार का होना चाहिए:-

Kripaya apna naam batayiye: Balasubramaniam
Abhinandan, Balasubramaniam ji.

तो चलिए, जल्दी से इस तरह का एक प्रोग्राम लिख डालिए।

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

सीखिए सी - 16 : समाहार -1

आपमें से जिन लोगों ने अब तक प्रिंटेफ-स्कैनेफ के इन लेखों का साथ दिया है, उन्होंने सी भाषा की काफी बातें सीख ली हैं। इतनी कि अब आप कोई छोटा-मोटा सी प्रोग्राम स्वयं लिख सकते हैं। सी ही नहीं कोई भी कंप्यूटर भाषा सीखने का एक मात्र तरीका यह है कि उस भाषा में ढेर सारे प्रोग्राम लिखे जाएं। प्रोग्राम लिखने पर आपसे गलतियां भी होंगी, पर ये गलतियां आपको बताएंगी कि प्रोग्राम लिखने का सही तरीका क्या है। इसलिए अपनी गलतियों से घबराइए नहीं, न ही उनसे निरुत्साहित हों, बल्कि गलतियों को सीखने की प्रक्रिया का एक अनिवार्य अंग मानकर उनसे लाभ उठाइए।

अब तक के लेखों में हमने कुछ 6 सरल सी प्रोग्रामों के उदाहरण दिए हैं। क्या आपने इन प्रोग्रामों के कोड को अपने कंप्यूटर पर उतारकर, इन प्रोग्रामों को संकलित करके देखा था? क्या आपको इन प्रोग्रामों के वैसे ही परिणाम मिले थे, जैसे इन लेखों में बताया गया है? यदि नहीं मिले तो सोचिए आपसे कहां गलती हो गई। इन लेखों को दुबारा पढ़ें और पता लगाएं कि आपके प्रोग्राम की गलती को कैसे सुधारा जा सकता है। इस तरह सी की वाक्य-विन्यास शैली आपके मन में ठीक प्रकार से बैठ जाएगी, और आपसे आगे गलतियां नहीं होंगी।

यहां मैं नौसिखिए सी प्रोग्रामरों द्वारा आमतौर पर की जानेवाली कुछ गलतियों की सूची दे रहा हूं। यह आपको इन गलतियों से बचनने में मदद करेगी।

1. सी वाक्यों के अंत में ; न देना।

2. धनु कोष्ठक के दुहरे चिह्नों ({ और }) में से एक का छूट जाना।

3 गोल कोष्ठकों के दुहरे चिह्नों (( और ) ) में से एक का छूट जाना।

4. पूर्वसंकलक की उक्तियों से पहले # चिह्न न लगाना (जैसे #include <stdio.h> की जगह include <stdio.h> लिखना।

5. पूर्वसंकलक की उक्तियों के आगे ; चिह्न लगाना (जैसे #include<stdio.h>; लिखना।

6. printf() फलनक के कोष्ठकों में विद्यमान उक्ति को दुहरे उद्धरण चिह्नों (“ और “) से न घेरना।

7. printf() फलनक के कोष्ठकों की उक्ति के अंत में समापन उद्धरण चिह्न छूट जाना।

8. scanf() फलनक में राशि के नाम के पहले पता सूचक चिह्न & न लगाना।

9. किसी राशि को घोषित करते समय उसका प्रकार (int, char, long, इत्यादि) सूचक शब्द छोड़ देना।

10. राशि का नामकरण करते समय नामकरण के नियमों का उल्लंघन करना – जैसे, नाम के अक्षरों के बीच रिक्त स्थान होना, नाम के रूप में सी के आरक्षित शब्दों का उपयोग करना, नाम को किसी अंक से शुरू करना, नाम में अमान्य वर्ण (!, @, #,%,& आदि) रखना, इत्यादि।

इन गलतियों से यदि आप बचते चलें, तो आप सी के प्रोग्राम सफलतापूर्वक लिखते चले जाएंगे।

Friday, April 24, 2009

सीखिए सी -15 : scanf()

पिछले अध्याय में हमने देखा कि printf() की सहायता से हम किस प्रकार कंप्यूटर की स्मृति में से आंकड़े लाकर स्क्रीन पर प्रदर्शित कर सकते हैं। कई बार इसका उल्टा भी आवश्यक होता है, यानी कुंजीपटल पर अंकित सूचनाओं को कंप्यूटर की स्म़ृति में डालना। इस काम में printf() का भाई scanf() नामक फलनक हमारी मदद करता है। scanf() भी stdio.h संग्रह का फलनक है। आइए, उससे परिचय बढ़ाते हैं। निम्नलिखित प्रोग्राम को देखिए।

---------------------
प्रोग्राम 5

/* scanf() ka udaharan */

#include <stdio.h>

void main()
{
char aapki_pasand;
printf("Aapki pasand ka koi akshar enter kijiye:\n");
scanf("%c", &aapki_pasand);
printf("Aapne %c akshar enter kiya.\n", aapki_pasand);
}
---------------------
आउटपुट
Aapki pasand ka koi akshar enter kijiye: a
Aapne a akhsar enter kiya.
---------------------

इस प्रोग्राम में aapki_pasand नामक वर्ण राशि (char) घोषित की गई है, लेकिन उसे कोई मान नहीं दिया गया है। इसके बाद वाली उक्ति आपके लिए परिचित है, वह स्क्रीन पर Aapki pasand ka koi akshar enter kijiye: संदेश प्रदर्शित करता है। इस संदेश को प्रदर्शित करने के बाद नियंत्रण प्रचालन तंत्र, यानी डोस, को नहीं लौट जाता, जैसा कि अब तक के प्रोग्रामों में होता आया है, पर कर्सर विसर्ग चिह्न (:) के आगे रुक जाता है। यह इसलिए क्योंकि अगली उक्ति scanf() है, जो कुंजीपटल पर अंकित संकेतों को स्वीकारता है।

अब आप कुंजीपटल पर a वाली कुंजी दबाइए और उसके बाद ऐंटर कुंजी को। तुरंत ही आपको स्क्रीन पर यह वाक्य दिखाई देगा: Aapne a akshar enter kiya.

क्या यह जादू जैसा नहीं लगता? आपके प्रोग्राम को कैसे पता चला कि आपने कौन-सा अक्षर ऐंटर किया था? दरअसल यह सब scanf() का कमाल है।

scanf() का हुलिया printf() से बहुत मिलता-जुलता है, पर कुछ-कुछ भिन्न भी है। printf() के ही समान इसमें भी गोल कोष्ठकों के बीच एक उक्ति है, जो दुहरे उद्धरण चिह्नों से घिरी है।

इस उक्ति में वही प्रतिशत-चिह्न वाला संयुक्त वर्ण %c है जो आंकड़े का प्रकार दर्शाता है (इस उदाहरण में char)। उद्धरण चिह्नों के बाद printf() के ही समान यहां भी अल्प विराम चिह्न (,) है। उसके बाद चर राशि का नाम है, पर चर राशि के नाम के पहले और अल्प विराम के बाद आप यहां एक नया चिह्न देख रहे हैं, जो है &। इसे ऐंपरसैंड कहते हैं। आइए, इसके बारे में जानें।

कंप्यूटर ने apni_pasand नामक वर्ण राशि के लिए 8 बिट का स्थान आरक्षित करके उस स्थान के पते को apni_pasand नाम के साथ जोड़ दिया है। पर चूंकि हमने इस आरक्षित स्थान पर कोई मान नहीं रखा है, इसलिए वह जगह उपयोगी आंकड़े से भरी नहीं है। उस जगह पर a अक्षर को रखने के लिए हम scanf() का आह्वान करते हैं और उसे %c चिह्न द्वारा सूचित करते हैं कि हम कंप्यूटर की स्मृति में एक वर्ण को रखना चाहते हैं। अब scanf() के लिए यह जानना जरूरी है कि इस वर्ण राशि को कहां रखे। हम a को apni_pasand नामक चर राशि के लिए आरक्षित स्मृति-कोषों में रखना चाहते हैं। scanf() को इन कोषों का पता बताने के लिए इन कोषों से संबंधित राशि के नाम के पहले & चिह्न जोड़ा जाता है। किसी चर राशि के नाम के पहले & चिह्न जोड़ने से उस चर राशि के लिए आरक्षित स्मृति कोषों का पता प्राप्त होता है।

इसीलिए & को एड्रेस प्रचालक, यानी पता बतानेवाला प्रचालक, कहा जाता है।

हमारे प्रोग्राम में scanf() को &apni_pasand से apni_pasand के स्मृति-कोषों का पता मिल जाता है और वह a अक्षर को इन कोषों में रख देता है।

प्रोग्राम की अगली उक्ति का परिणाम यह सिद्ध कर देता है कि scanf() ने सचमुच ऐसा किया है क्योंकि आउटपुट में हमें %c के स्थान पर a अक्षर दिखाई देता है।

printf() के ही समान scanf() भी एक से अधिक चर राशियों को स्वीकार कर सकता है। देखिए कैसे:

-------------------------
प्रोग्राम-6

/* scanf() ek sath do rashiyon ko bhi pad sakta hai. */

#include <stdio.h>

void main()
{
char pahala_akshar;
char doosara_akshar;
printf("Apni pasand ke do akshar enter kijiye. Dono aksharon ke beech rikta sthan rakhiye: \n");
scanf("%c%c", &pahala_akshar, &doosara_akshar);
printf("Aapki pahli pasand hai %c aur doosari %c.\n", pahala_akshar,
doosara_akshar);
}
------------------------

आउटपुट:
Apni pasand ke do akshar enter kijiye. Donon aksharon ke beech rikta
sthan rakhiye: a b

Aapki pahli pasand hai a aur doosari b.

-------------------------
यहां दो वर्ण राशियां घोषित की गई हैं pahala_akshar और doosara_akshar, और scanf() से इनका मान प्राप्त किया जाता है। कुंजी-पटल द्वारा इन दोनों राशियों का मान (a और b) अंकित कीजिए। दोनों अक्षरों के बीच रिक्त स्थान होना जरूरी है, इसलिए a की कुंजी दबाने के बाद रिक्त-दंड (स्पेस-बार) को दबाइए और उसके बाद b की कुंजी को। इस रिक्त स्थान को देखकर scanf() समझ जाता है कि पहली राशि का मान पूरा हो गया है और कुंजी-पटल अब अगली राशि का मान प्रेषित करेगा। रिक्त-दंड के स्थान पर आप टैब अथवा ऐंटर कुंजी भी दबा सकते हैं। इन तीनों को श्वेत-स्थान देनेवाले वर्ण (वाइट स्पेस कैरक्टर) कहा जाता है, क्योंकि ये स्क्रीन पर या कागज पर दिखाई नहीं देते। अंत में ऐंटर कुंजी दबाइए, जिससे कंप्यूटर को मालूम पड़े कि आपने दोनों अक्षरों को ऐंटर कर दिया है।

scanf() के कोष्ठकों में इस बार दो %c चिह्न हैं और तदनुसार अल्प-विराम (,) के बाद दो राशियों के नाम भी हैं। दोनों राशियों के पहले & चिह्न भी लगा हुआ है।

प्रोग्राम के आउटपुट से हमें पता चलता है कि scanf() ने दोनों राशियों को ठीक प्रकार से स्मृति में पहुंचा दिया है।

इस अध्याय के प्रोग्रामों में हमने scanf() की सहायता से वर्ण राशियों को ही पढ़ा है, लेकिन scanf() अन्य प्रकार की राशियों को भी इतनी ही कुशलता से पढ़ सकता है। केवल उसके कोष्ठकों में दुहरे उद्धरण चिह्नों के बीच %c के स्थान पर अन्य राशियों के सूचक-चिह्न, यानी %d, %l या %f रखने की आवश्यकता है।

अंत में हम scanf() का उपयोग करते समय ध्यान में रखने की एक जरूरी बात फिर से दुहरा देते हैं। scanf() के लिए यह जानना आवश्यक होता है कि वह कुंजीपटल से प्राप्त सूचनाओं को कंप्यूटर की स्मृति में कहां रखे। यह जानकारी उसे उसके कोष्ठकों में मौजूद चर राशि के नाम के पहले & चिह्न जोड़कर दी जाती है। अपने प्रोग्रामों में scanf() का उपयोग करते समय इस & चिह्न की ओर विशेष ध्यान दीजिए, अन्यथा आपको scanf() से वांचित परिणाम नहीं प्राप्त होंगे।

Wednesday, April 22, 2009

सीखिए सी 14 : printf()

आप प्रोग्राम 1 में printf() फलनक (फंक्शन) से मिल चुके हैं। यह सी भाषा का एक अत्यंत उपयोगी फलनक है। यह फलनक stdio.h संग्रह में रहता है। इस लेख में हम इसके बारे में विस्तृत जानकारी प्राप्त करेंगे।

इसका पूरा नाम है प्रिंट फोर्मैट। इसका मुख्य काम है कंप्यूटर की स्मृति में संचित आंकड़ों को कंप्यूटर के स्क्रीन पर लाना। हमने पहले स्पष्ट किया था कि कंप्यूटर के स्मृति-कोषों में आंकड़े 0 और 1 के क्रम में रहते हैं और राशियों के नामकरण के दौरान char, int, float आदि सूचक शब्द जोड़कर प्रोग्राम कंप्यूटर को यह निर्देश देता है कि इन नामों से जुड़े स्मृति-कोषों में रखे आंकड़े किस प्रकार के हैं। printf() फलनक स्मृति में से आंकड़े लाकर प्रोग्राम में उन्हें जिस रूप में प्रदर्शित करने की आवश्यकता होती है, उस रूप में स्क्रीन पर प्रदर्शित करता है। इसके लिए वह अपने कोष्ठकों में दी गई सूचनाओं का उपयोग करता है। आइए एक उदाहरण से इन सब बातों को समझते हैं।

------------------------
प्रोग्राम-2

/* printf() ka udaharan */

#include <stdio.h>

void main ()
{
int namoone_ka_ank = 9;
printf("Namoone ka ank %d hai.\n", namoone_ka_ank);
}
------------------------------------

प्रोग्राम को संकलित करके चलाने पर स्क्रीन पर यह दिखता है:

आउटपुट:
Namoone ka ank 9 hai.

इस प्रोग्राम में namoone_ka_ank एक पूर्णांक राशि का नाम है। इस नाम के पूर्व लिखा गया int शब्द हमें यह सूचना देता है। इस पूर्णांक राशि को = चिह्न की सहायता से 9 का मान दिया गया है।

printf() के कोष्ठकों में आपको तीन-चार नई बातें दिखेंगी। अब हम उन्हें स्पष्ट करते हैं।

1. %d चिह्न
जैसा कि हमने देखा, आंकड़े char, int, long या float प्रकार के हो सकते हैं। किसी राशि को printf() द्वारा ठीक से प्रदर्शित कराने से पहले हमें printf() को यह बताना होता है कि वह जिस राशि को प्रदर्शित कर रहा है, वह किस प्रकार का है। यह सूचना उसे उसके कोष्ठकों में दुहरे उद्धरण चिह्नों के बीच %c, %d, %l, %s या %f चिह्न रखकर दी जाती है। ये चिह्न क्रमशः char, int, long, string और float को सूचित करते हैं।

प्रकारसूचक शब्दफोर्मैटिंग चिह्न
वर्णchar%c
पूर्णांकint%d
दीर्घ पूर्णांकlong%l
दशमलव अंकfloat%f
वाक्यांशstring%s


उपर्यूक्त प्रोग्राम में %d को देखकर printf() समझ जाता है कि उसे एक पूर्णांक राशि को %d के स्थान पर प्रदर्शित करना है। यह कौन-सी राशि है, इसकी सूचना printf() को उसके कोष्ठक में दुहरे उद्धरण चिह्नों के आगे लिखे गए चर राशि के नाम से पता चलता है।

2. , चिह्न
दुहरे उद्धरण चिह्नों के आगे जो अल्प विराम (,) है, उसकी ओर विशेष ध्यान दीजिए। यह अल्प विराम महत्व रखता है। यदि आप उसे छोड़ देंगे तो संकलक प्रोग्राम का संकलन उस स्थान पर आकर रोक देगा। सी भाषा में अल्प विराम (,) किसी उक्ति के दो हिस्सों को अलगाने के लिए उपयोग किया जाता है। इस उक्ति में अल्प विराम के बाद उस राशि का नाम है, जिसे printf() को प्रदर्शित करना है।

3. चर राशि का नाम namoone_ka_ank
हमारे प्रोग्राम में printf() वाली उक्ति में अल्प विराम के बाद namoone_ka_ank लिखा है। इसे देखकर printf() समझ जाता है कि उसे पूर्णांक के रूप में namoone_ka_ank नामक राशि को प्रदर्शित करना है। वह तुरंत कंप्यूटर की स्मृति में से उन आंकड़ों को ले आता है जो namoone_ka_ank नाम से जुड़े स्मृति कोषों में रखे हैं और इन आंकड़ों को पूर्णांक में बदलकर प्रदर्शित करता है। इसलिए हम आउटपुट वाक्य में %d के स्थान पर 9 देखते हैं, जो इस राशि का मान है।

4. \n चिह्न
printf() के कोष्ठकों में दुहरे उद्धरण चिह्नों के अंदर जो संदेश रखा गया है, उसके अंत में \n चिह्न है। इसे न्यू-लाइन वर्ण, यानी नई पंक्ति की सूचना देनेवाला वर्ण कहते हैं। कुंजी पटल के ऐंटर या रिटर्न नामक कुंजी को दबाने पर कर्सर एक नई पंक्ति की शुरुआत करता है। \n वर्ण इस ऐंटर या रिटर्न कुंजी का प्रतीक है। यद्यपि यह दो वर्णों से बना है (\ और n), लेकिन कंप्यूटर इसे एक वर्ण के रूप में पढ़ता है। वास्तव में \, जिसे बैकश्लैश कहा जाता है, कुछ वर्णों के साथ जुड़कर कुछ विशेष वर्ण पैदा करता है। ये विशेष वर्ण कुंजी पटल की उन कुंजियों को दर्शाते हैं जो स्क्रीन पर दिखाई नहीं देते, जैसे टैब, ऐंटर या रिटर्न, बैकस्पेस आदि।

इन विशेष वर्णों की सूची नीचे दी गई है।

विशेष वर्ण अर्थ
/n नई पंक्ति
/t टैब स्पेस



हमारे प्रोग्राम में \n को देखकर printf() संदेश के अंत में एक नई पंक्ति शुरू करता है, यानी कर्सर वाक्य पूरा होने के बाद अगली पंक्ति के शुरुआती स्थान पर चला जाता है।

printf() एक साथ अनेक राशियों को प्रदर्शित कर सकता है। आइए देखें कैसे।

-----------------------
प्रोग्राम-3

/* printf() dwara ek se adhik rashiyon ka pradarshan */

#include <stdio.h>

void main()
{
char namoone_ka_varna='a';
int namoone_ka_ank=9;
printf("Namoone ka varna %c hai aur namoone ka ank %d hai.\n",
namoone_ka_varna, namoone_ka_ank);
}
---------------------

आउटपुट:
Namoone ka varna a hai aur namoone ka ank 9 hai.

इस बार प्रोग्राम में दो राशियां घोषित की गई हैं: namoone_ka_varna और namoone_ka_ank. पहली char (वर्ण) प्रकार की राशि है और दूसरी int (पूर्णांक) प्रकार की।

namoone_ka_varna में a का मान आरोपित किया गया है। इसके लिए राशि के नाम के आगे आरोपण चिह्न = के बाद a को इकहरे उद्धरण चिह्नों से घेरकर रखा गया है, ऐसे - 'a'।

char प्रकार की राशियों में मान रखने की यही विधि है, यानी मान को इकहरे उद्धरण चिह्नों में दर्शाना।

nammone_ka_ank में 9 का मान आरोपित किया गया है।

इस बार printf() के कोष्ठकों में प्रतिशत चिह्न (%) वाले दो विशेष वर्ण हैं, %c और %d क्योंकि हम दो राशियों को प्रदर्शित करना चाहते हैं। तदनुसार दुहरे उद्धरण चिह्नों के बाद अल्प विराम के आगे भी दो राशियों के नाम हैं। ध्यान दें कि ये दोनों नाम उसी क्रम में हैं जिस क्रम में प्रतिशत चिह्न वाले वर्ण हैं, यानी namoone_ka_varna पहले और उसके बाद namoone_ka_ank। प्रतिशत-चिह्न-युक्त चिह्नों का क्रम और चर राशियों का क्रम समान होना बिलकुल आवश्यक है।
प्रोग्राम को संकलित करके चलाने पर आपको वांचित आउटपुट प्राप्त होता है:

Namoone ka varna a hai aur namoone ka ank 9 hai.

एक और उदाहरण लीजिए।

--------------------------
प्रोग्राम 4

/* printf() ka ek aur udaharan */

#include <stdio.h>

void main ()
{
float namoone_ka_ank = 9;
printf("Namoone ka ank %f hai.\n", namoone_ka_ank);
}
-----------------------------
आउटपुट:
Namoone ka ank 9.000000 hai.

क्या आप इस आउटपुट को देखकर चौंके? बात सीधी-सी है। ध्यान दीजिए कि हमने namoone_ka_ank को दशमलव अंक (float) घोषित किया है। सी भाषा में दशमलव अंकों में सामान्यतः दशमलव के बाद छह स्थान होते हैं। चूंकि हमने ये स्थान स्पष्ट नहीं किए हैं (हमने केवल 9 लिखा है), कंप्यूटर ने इन स्थानों को शून्य से भर दिया है।

Sunday, April 19, 2009

सीखिए सी 13 : प्रचालकों का वरीयता-क्रम

जब एक ही व्यंजक में अनेक प्रचालक हों, तब कभी-कभी यह निश्चित करना कठिन हो जाता है कि उनमें से किस प्रचालक का निष्पादन पहले होता है। उदाहरण के लिए इस अंकगणितीय व्यंजक को देखिए: 10 + 5 * 2। इसका मान 30 है, या 20?

यदि हम + प्रचालक के निष्पादन को पहले माने, तो 30 है और यदि * प्रचालक का निष्पादन पहले माने, तो 20 है। किंतु कंप्यूटर को इस प्रकार की द्विधात्मक स्थितियां पसंद नहीं हैं। इसलिए प्रचालकों की एक वरीयता क्रम मानी गई है और कंप्यूटर इसी क्रम के अनुसार अनेक प्रचालकों वाले व्यंजकों का मूल्यांकन करता है। वह ऊंची वरीयता वाले प्रचालक का निष्पादन नीची वरीयता वाले प्रचालकों के निष्पादन के पहले करता है।

प्रचालकों की वरीयता निम्नानुसार है:

() सबसे अधिक वरीयता
! ++ --
* / %
+ -
< <= > >=
&&
|| सबसे कम वरीयता

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

मान लीजिए कि उपर्युक्त उदाहरण में आप 10 और 5 को पहले जोड़ना चाहते हैं और तत्पश्चात उनके योग को 2 से गुणन करना चाहते हैं। इसके लिए आप व्यंजक को इस प्रकार से लिखेंगे:

(10 + 5) * 2

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

उदाहरण:
आइए, देखें कि कंप्यूटर निम्नलिखित व्यंजक का निष्पादन किस क्रम में करेगा:

10 + 4 - 21 * 6 / 7

कंप्यूटर इस व्यंजक का मूल्यांकन बाईं ओर से शुरू करेगा और पहले दो प्राचलकों, यानी + और - की वरीयता की तुलना करेगा। दोनों की वरीयता समान है, इसलिए वह + का निष्पादन करेगा क्योंकि वह व्यंजक में पहले आया है। इसका परिणाम होगा:

14 - 21 * 6 / 7

तत्पश्चात वह - और * की वरीयता की तुलना करेगा। * की वरीयता अधिक है। लेकिन इसका निष्पादन करने से पहले कंप्यूटर इसकी वरीयता को इसके अगले प्रचालक, यानी /, की वरीयता से करके देखेगा। इन दोनों की वरीयता समान है। इसलिए * का निष्पादन होगा:

14 - 126 / 7

अब बचते हैं - और / प्रचालक। इनमें से / प्रचालक की वरीयता अधिक है। अतः उसका निष्पादन होगा:

14 - 18

अब केवल एक प्रचालक - बचा है। इसके निष्पादन के बाद अंतिम परिणाम प्राप्त होगा, जो है:

-4।

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

Saturday, April 11, 2009

सीखिए सी - 12 : सी के प्रचालक

प्रचालक उन प्रतीकों को कहते हैं जो आंकड़ों और चर राशियों में विशिष्ट प्रकार की तब्दीलियां लाते हैं। सी के प्रचालक निम्नानुसार हैं:

1. अंकगणितीय प्रचालक
ये पांच हैं, +, -, *, / और %। इनमें से प्रथम चार जोड़ने, घटाने, गुणन करने और विभाजित करने के प्रचालक हैं। अंतिम को माड्युलस प्रचालक कहा जाता है। यह किन्हीं दो अंकों को विभाजित करने पर बची राशि को व्यक्त करता है।

उदाहरण:
8 % 3 = 5

8 को 3 से विभाजित करने पर 5 शेष रहता है। अतः, माड्युलस प्रचालक 5 का मान देता है।

2. तार्किक प्रचालक
तार्किक प्रचालक तीन हैं &&, || और !।

तार्किक प्रचालकों के केवल दो मान हो सकते हैं, सही या गलत, जिन्हें 1 या 0 से निर्दिष्ट किया जाता है। इन प्रचालकों में से प्रथम && को ऐंड (और) प्रचालक कहते हैं। यह 1 का मान तब देता है जब सब संकार्यों (ओपरेन्ड्स) का मान 1 हो। यदि किसी एक संकार्य का भी मान 0 हो, तो यह प्रचालक 0 नतीजा देता है।

दूसरा प्रचालक || है, जिसे ओर (या) प्रचालक कहते है। यह 1 का मान तब देता है जब किसी भी एक या उससे अधिक संकार्यों का मान 1 हो। यह 0 मान तभी देता है जब सभी संकार्यों का मान 0 हो।

अंतिम तार्किक प्रचालक ! नोट (नहीं) प्रचालक है। यह किसी तार्किक व्यंजक (एक्सप्रेशन) पर असर करता है और उसके मान को उलट देता है। ध्यान रहे कि तार्किक व्यंजकों के केवल दो ही मान हो सकते हैं, 1 या 0। अत:, यदि किसी तार्किक व्यंजक का प्रारंभिक मान 1 हो, तो उस पर नोट प्रचालक लगाने पर व्यंजक का नया मान 0 हो जाएगा।
इन प्रचालकों के प्रभाव को नीचे की तालिका में स्पष्ट किया गया है।

&& प्रचालक

संकार्य 1संकार्य 2संकार्य 1 && संकार्य 2
010
100
000
111

|| प्रचालक
संकार्य 1संकार्य 2संकार्य 1 || संकार्य 2
011
101
000
111

! प्रचालक
संकार्य 1! संकार्य 1
10
01

इन प्रचालकों का उपयोग if...else और while वाली उक्तियों में बहुत होता है, जिनके बारे में हम आगे के लेखों में सीखेंगे।

3. संबंधपरक प्रचालक
ये निम्नलिखित हैं:

प्रचालकअर्थ
= =के बराबर है
!=के बराबर नहीं है
<=से छोटा है या बराबर है
<से छोटा है
>=से बड़ा है या बराबर है
>से बड़ा है


इन प्रचालकों के भी केवल दो मान हो सकते हैं, 1 या 0।

उदाहरण:
व्यंजनमानटिप्पणी
4 == 80  यह व्यंजक गलत है, 4 8 के बराबर नहीं है
4 !== 81यह सही है, 4 8 के बराबर नहीं है
4 <= 81यह सही है, 4 8 से छोटा है
4 < 81यह सही है, 4 8 से छोटा है
4 >= 80यह गलत है, 4 8 से बड़ा नहीं है
4 > 80यह गलत है, 4 8 से बड़ा नहीं है


4. = प्रचालक
यह आरोपण प्रचालक है और आप इससे मिल चुके हैं। यह इसके बाईं ओर की चर राशि में इसके दाहिनी ओर की राशि का मान आरोपित करता है।

उदाहरण:
x =10;
x= y+z;
x=y=z=8;

अंतिम उदाहरण में आरोपण की प्रक्रिया दाहिनी ओर से बाईं ओर क्रमवार संपन्न होती है, यानी पहले z में 8 का मान आता है, फिर y में z का मान (जो अब 8 है), और अंत में x में y का मान। इस प्रकार तीनों का मान 8 हो जाता है।

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

5. & प्रचालक
इससे भी आप scanf() के प्रसंग में मिल चुके हैं। यह ऐड्रेस प्रचालक है, यानी पता बतानेवाला प्राचालक। इसे लगाकर हम किसी चर राशि से जुड़े स्मृति कोषों का पता जान सकते हैं।

ध्यान में रखें, तार्किक ऐंड प्रचालक (&&) और राशियों का पता बतानेवाला प्रचालक (&) पूर्णतः भिन्न हैं।

6. ++ और -- प्रचालक
इन्हें क्रमश: इंक्रिमेंट प्रचालक और डिक्रिमेंट प्रचालक कहा जाता है। इंक्रिमेंट प्रचालक किसी चर राशि के मान को 1 से बढ़ा देता है और डिक्रिमेंट प्रचालक किसी चर राशि के मान को 1 से कम कर देता है।

उदाहरण:
सी की उक्तिटिप्पणी
x = 10; x का प्रारंभिक मान 10 है।
x++; अब x का मान एक से बढ़कर 11 हो गया है।
x--; अब x का मान एक से कम होकर दुबारा 10 हो गया है।


ये दोनों प्रचालक राशि के बाईं ओर या दाहिनी ओर लग सकते हैं। दोनों स्थितियों में इनका प्रभाव अलग-अलग होता है। जब ये राशि के दाहिनी ओर लगते हैं, तो इंक्रिमेंट या डिक्रिमेंट का काम बाद में होता है। यदि ये प्रचलाक राशि के बाईं ओर लगे, तो इंक्रिमेंट या डिक्रिमेंट का काम पहले होता है। ऐरे की चर्चा करते समय हम इस बारीकी पर अधिक प्रकाश डालेंगे।

7. , (अल्प-विराम) प्रचालक
यह अनेक व्यंजकों को जोड़कर एक उक्ति बनाने में काम आता है।

उदाहरण:
int x,y,z;

यह एक उक्ति निम्नलिखित तीन उक्तियों के बराबर है:
int x;
int y;
int z;

सीखिए सी - 11 : आंकड़ों के प्रकार

कंप्यूटर सभी आंकड़ों को शून्य (0) और एक (1) के क्रम में अपनी स्मृति में संचित करता है, पर हम इन 0 और 1 की कड़ियों को विभिन्न रूपों में समझते हैं, जैसे वर्ण के रूप में, अंक के रूप में, चित्र के रूप में आदि। इसलिए किसी प्रोग्राम में किसी राशि का नामकरण करते समय कंप्यूटर को यह बताना जरूरी होता है कि उस नाम से जानी जानेवाली राशि किस प्रकार की है। सी में आंकड़े मुख्यतः निम्नलिखित प्रकार के होते हैं:-


प्रकारसूचक शब्दविस्तारउदाहरण
वर्णchar8 bitsa,b,A,1,&,%,9,>,?
पूर्णांकint16 bits4,9,80,789
दीर्घ पूर्णांकlong32 bits1000000,786589, 870987
दशमलवfloat32 bits8.5,89.098, 12.000000


अतः किसी राशि के पूर्ण नामकरण के लिए उसके प्रकार और उसके नाम, इन दो चीजों की आवश्यकता रहती है।

उदाहरण:

char naam;
int roll_number;
float kul_ank;

यहां naam किसी राशि का नाम है, जिसका प्रकार है char (यानी वर्ण), roll_number पूर्णांक (int) प्रकार की राशि है और kul_ank दशमलव अंक (float) वाली राशि है। char, int और float सूचक शब्दों को देखकर कंप्यूटर समझ जाता है कि इन राशियों के लिए उसे अपनी स्मृति में कितनी जगह आरक्षित करनी है। वह naam के लिए 8 बिट, roll_number के लिए 16 बिट और kul_ank के लिए 32 बिट की स्मृति आरक्षित कर देगा।

इस तरह, किसी राशि को नाम देते समय उसके प्रकार को भी स्पष्ट करना आवश्यक होता है। तभी कंप्यूटर अपनी स्मृति में उस राशि के पूर्ण रूपांकन के लिए आवश्यक स्थान आवंटित कर सकेगा। इसके बाद कंप्यूटर उस स्थान के पते को राशि के नाम के साथ जोड़ देगा। यह हो जाने पर प्रोग्राम का संकलन होते समय जहां-जहां उस राशि का नाम आएगा, वहां उस नाम के साथ जुड़े पते पर कंप्यूटर की स्मृति में जो भी आंकड़े हों वह आ जाएगा।

राशियों के लिए आंकड़ों का प्रकार चुनते समय सही प्रकार चुनने की ओर विशेष ध्यान देना चाहिए। ऐसा आंकड़ा प्रकार चुनना चाहिए जो उस राशि के तहत आनेवाले आंकड़ों के लिए पर्याप्त हो।

उदाहरण के लिए int डेटा प्रकार में 32,000 से अधिक बड़ी संख्याएं नहीं समा सकती हैं। यदि किसी राशि का मान 32,000 से अधिक होने की संभावना हो, उसे int न घोषित करके long घोषित करना चाहिए जिसमें 32,000 से कहीं अधिक बड़ी संख्याएं समा सकती हैं।

इसकी विपरीत स्थिति भी ध्यान देने योग्य है। यदि किसी राशि में 32,000 से कहीं कम वाले मान ही होनेवाले हों, तो इस राशि को long घोषित करने से कोई अतिरिक्त प्रयोजन नहीं सिद्ध होगा। इसके बजाए उसे int ही घोषित करना चाहिए। उदाहरण के लिए roll_number राशि को लें जिसमें आप किसी कक्षा के छात्रों के रोल नंबर को संचित करना चाहते हैं। अब कक्षा में छात्रों की संख्या 40, 50 या अधक से अधिक 100 तक जा सकती है। इसलिए इस राशि के लिए int प्रकार पर्याप्त है। इसे long घोषित करने की कोई आवश्यकता नहीं है। long घोषित करने से भी आपका प्रोग्राम ठीक तरह से चलेगा, लेकिन वह अधिक स्मृति खपाएगा। हमने ऊपर देखा कि int के लिए कंप्यूटर में 16 बिट का स्थान उपयोग किया जाता है, जबकि long के लिए उससे दुगना, यानी 32 बिट। इसलिए यदि आप roll_number को int के बजाए long घोषित करें, तो आपके प्रोग्राम में इस राशि के लिए दुगनी स्मृति की आवश्यकता पड़ेगी। अच्छे प्रोग्राम वे माने जाते हैं जो कम से कम संसाधनों का उपयोग करके, कम से कम समय में चलें और वांछित परिणाम दें।

इसी प्रकार वेतन, औसत अंक, आदि के लिए int या long प्रकार की राशियां ठीक नहीं रहेंगी, क्योंकि ये दशमलव प्रकार की संख्याएं होंगी। इनके लिए float प्रकार की आवश्यकता है। इन्हें int या long प्रकार घोषित करने पर इनका केवल पूर्णांक वाला अंश ही संचित होगा और दशमलव वाला अंश खो जाएगा। इससे आपका प्रोग्राम सही नतीजा नहीं दे पाएगा।

Friday, April 10, 2009

सीखिए सी - 10 : राशियों के नामकरण के नियम

सी की राशियों के नामकरण के कुछ नियम हैं, जो इस प्रकार हैं:-

1. राशियों के नाम केवल एक शब्द के बने हो सकते हैं, वे दो या अधिक शब्दों के नहीं हो सकते, या यों कह लीजिए कि नामों के वर्णों (अक्षरों) के बीच रिक्त स्थान नहीं हो सकता।

उदाहरण:
x, moolya, naam, pata, taapman आदि सब मान्य नाम हैं।

adhiktam tapman, pahla naam, ausat taapman, ये सब अमान्य हैं क्योंकि ये एक से अधिक शब्दों से बने हैं।

ध्यान रहे कि सी केस-संवेदनशील भाषा है, यानी कि वह अंग्रेजी के अपर-केस (A,B,C,...) और लोअर-केस (a,b,c,...) वर्णों में फर्क करता है। इसलिए NAAM, Naam और naam, ये तीन अलग-अलग राशियां मानी जाएंगी, एक नहीं।

2. नाम के वर्णों में मात्र 0,1,...,9, a,b,c,...z, A,B,C,...Z या रेखांकन चिह्न (_) का ही उपयोग हो सकता है।

उदाहरण:
adhiktam_taapman, con2bin, ABCefg, ये सब मान्य नाम है। ध्यान दें कि पहले नाम (adhiktam_tapman) में दो शब्दों को रेखांकन चिह्न (_) द्वारा जोड़ा गया है।

3. राशियों के नामों में सी के कुछ आरक्षित चिह्न और विशेष वर्ण नहीं रखे जा सकते। इनमें शामिल हैं: +, -, *, /, %, #, !, (, ), :, ;, <, >, {, }, |, आदि, क्योंकि इन्हें सी भाषा में अन्य कार्यों के लिए उपयोग किया जाता है। उदाहरण के लिए प्रथम चार चिह्न अंकगणित की संक्रियाओं को सूचित करनेवाले चिह्न हैं।

उदाहरण:
adhiktam-tapman अमान्य नाम है, क्योंकि उसमें - चिह्न (घटाने का चिह्न) का उपयोग हुआ है। इस चिह्न के कारण कंप्यूटर इस नाम को दो अलग-अलग नाम मानेगा, यानी adhiktam और tapman, और tapman को adhiktam से घटाने की कोशिश करेगा।

4. सी के आरक्षित शब्द, जैसे int, char, float, struct, return आदि को राशियों के नामों के रूप में इस्तेमाल नहीं किया जा सकता। इन आरक्षित पदों की संपूर्ण सूची यह है:-

auto break case chart const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while

उदाहरण:
while, switch, case ये अमान्य नाम हैं, क्योंकि ये सब सी के आरक्षित शब्द हैं।

5. सी राशियों के नामों का पहला वर्ण कोई अंक नहीं हो सकता।

उदाहरण:
2inone, 3rdyear, 0value, ये सब अमान्य नाम हैं, क्योंकि इन सबका प्रथम वर्ण कोई अंक है।

राशियों का नाम देते समय उपर्युक्त बातों का ध्यान रखना अनिवार्य है। राशियों के नाम यदि उन वस्तुओं की सूचना दें जिनका वे प्रतिनिधित्व कर रहे हों, तो प्रोग्राम क्लिष्ट होने से बच सकता है।

उदाहरण के लिए, यदि कोई राशि मासिक आय को व्यक्त करती हो, तो उसे x या y नाम देने के बजाए maasicaay या maasic_aay जैसा कोई नाम देना अधिक उपयुक्त होगा क्योंकि ऐसे नामों को देखकर तुरंत स्पष्ट हो जाता है कि राशि किस चीज को व्यक्त कर रही है।

सीखिए सी – 9 : चर और अचर राशियां

कंप्यूटर विभिन्न प्रकार के आंकड़ों को संचित करता है और उन्हें विभिन्न प्रकार से संसाधित करता है। यह सब करने के लिए कंप्यूटर इन आंकड़ों को अपनी स्मृति (मेमरी) में रखता है। यह स्मृति अनेक कोषों से बनी होती है। प्रत्येक कोष का अपना एक विशिष्ट पता होता है।

आंकड़ों को स्मृति में रखने और वहां से उसे पुनः प्राप्त करने की प्रक्रिया को सुगम बनाने के लिए सभी कंप्यूटर भाषाओं में इन आंकड़ों को नाम द्वारा निर्दिष्ट करने की सुविधा प्रदान की जाती है।

नाम द्वारा निर्दिष्ट ये आंकड़े दो प्रकार के होते हैं, चर राशियां (वेरिएबल्स) और अचर राशियां (कॉन्सटेन्ट्स)।

चर राशियां
चर राशियां उन राशियों को कहते हैं जिनका मान प्रोग्राम के निष्पादन के दौरान बदलता रहता है।

प्रोग्राम में चर राशियों में कोई मान आरोपित करने के लिए = चिह्न का इस्तेमाल होता है। सी की इस उक्ति को देखिए:

x = 10;

इसमें x एक चर राशि है, जिसमें = चिह्न 10 का मान आरोपित करता है।

इस उक्ति के बाद प्रोग्राम में जहां-जहां x आएगा, वहां-वहां कंप्यूटर उसका मान 10 मानकर चलेगा, बशर्ते कि प्रोग्राम की कोई अन्य उक्ति इसे बदल नहीं देती।

सी की यह आरोपण संबंधी उक्ति बीजगणित के x = 20 निर्देश से कुछ भिन्न होती है। बीजगणित में इस निर्देश का मतलब होता है "x 20 के बराबर है"। लेकिन सी की x=20; वाली उक्ति का मतलब होता है "x को 20 मानकर चलो"। इस अंतर को समझना जरूरी है, क्योंकि प्रोग्राम में चर राशियों का मान बदलता रहता है। उदाहरण के लिए x=15; उक्ति देकर आप कभी भी x का मान 10 से 15 कर सकते हैं।

अचर राशियां
सी में एक अन्य प्रकार की राशियां भी होती हैं, जिन्हें अचर राशियां कहा जाता है। इनका मान प्रोग्राम के शुरू में ही निश्चित कर दिया जाता है और वह बाद में बदल नहीं सकता। अचर राशियों को घोषित करने के लिए define पारिभाषिक शब्द का इस्तेमाल होता है। यह शब्द पूर्वसंकलक से जुड़ा है, न कि संकलक से। इसलिए इसके पहले # चिह्न लगाना भी आवश्यक है। यदि आप adhiktamman नामक एक अचर राशि घोषित करके उसे 100 का मान देना चाहें, तो आप निम्नानुसार निर्देश देंगे:

#define adhiktamman 100

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

एक-दो बातें यहां ध्यान देने की हैं।

1. पूर्वसंकलक के निर्देशों के अंत में अर्ध-विराम चिह्न (;) नहीं लगता, जैसा कि सी की उक्तियों में लगता है।
2. अचर राशियों में मान आरोपित करते समय आरोपण चिह्न = का इस्तेमाल नहीं होता। इसलिए

#define adhiktamman = 100

ऐसा लिखना गलत है।

Thursday, April 9, 2009

सीखिए सी – 8 : सी प्रोग्राम की विशेषताएं – 6 और 7

सी की उक्तियां
सी एक व्यवस्थित प्रोग्रामन भाषा है (स्ट्रक्चर्ड प्रोग्रामन भाषा) और यह बात उसके हर पहलू में नजर आती है। पिछले लेख में हमने समझाया था कि हर सी प्रोग्राम अनेक सुव्यवस्थित प्रोग्राम खंडों से बना होता है, जिसमें प्रत्येक कोड खंड को धनु कोष्ठकों से घेरा गया होता है।

प्रत्येक कोड खंड भी अनेक अधिक छोटी इकाइयों से बना होता है। इन्हें स्टेटमेंट (इस ट्यूटोरियल में मैं स्टेटमेंट शब्द के लिए उक्ति या कथन शब्द का प्रयोग करूंगा) कहा जाता है। हमारे प्रोग्राम 1 में केवल एक उक्ति है, यानी यह:-

printf("Namaskar.");

इसे ध्यान से देखिए, क्या आपको इसके अंत में जो अर्ध विराम चिह्न है (;) वह नजर आया? यह अर्ध विराम बहुत महत्वपूर्ण है। वह संकलक को सूचित करता है कि उक्ति कहां खत्म हो रही है।

हमने पिछले लेख में कहा था कि सी का संकलक वाइट स्पेसों (स्पेसबार, टैब, ऐंटर) की ओर कोई ध्यान नहीं देता है। सामान्य लेखन में हम इन वाइट स्पेसों का उपयोग करके ही शब्दों, वाक्यों, पैराओं को एक-दूसरे से अलग करते हैं। लेकिन संकलक इन वाइट स्पेसों को देख नहीं सकता। वह यह पता करने के लिए कि कोई उक्ति कहां खत्म हो रही है, अर्ध विराम (;) को देखता है। जैसे ही उसे एक अर्ध विराम चिह्न मिल जाए, वह समझ जाता है कि उक्ति खत्म हो गई है। इसलिए हर सी उक्ति के अंत में अर्ध विराम लगाना जरूरी है।

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

ध्यान रखें, पूर्वसंकलक के लिए लिखी गई उक्तियों में अर्ध विराम नहीं लगता है। पूर्व संकलक की उक्तियों को सूचित करने के लिए उनके शुरू में # यह चिह्न रहता है। इसलिए उनके आगे अर्ध विराम लगाने की आवश्यकता नहीं है। यदि लगाएं, तो संकलक आपत्ति कर सकता है।

इस लेख के साथ सी प्रोग्राम की हमारी चीरफाड़ पूरी हुई। आगे बढ़ने से पहले आप एक बार फिर सी प्रोग्रामों की आठ विशेषताओं को समझ लें ताकि सी के प्रोग्राम लिखते समय आपसे कोई गलती न हो।

सीखिए सी – 7 : सी प्रोग्राम की विशेषताएं – 5 और 8

सी में धनु कोष्ठकों ({ }) का महत्व

यदि आप प्रोग्राम 1 को देखें, तो आपको उसमें धनु कोष्ठकों ( { }) का प्रयोग हुआ मेलेगा। बायां धनु कोष्ठक चिह्न ( { ) तीसरी पंक्ति में आया है, और दायां धनु कोष्ठक चिह्न ( } ) प्रोग्राम की अंतिम पंक्ति में आया है।

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

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

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

सी में वाइट स्पेस (वाइट स्पेस उन कुंजियों को कहते हैं, जो दो वर्णों के बीच रिक्त स्थान पैदा करते हैं, जैसे स्पेसबार कुंजी, टैब कुंजी या ऐंटर कुंजी) का कोई महत्व नहीं होता है। इसलिए प्रोग्राम 1 को आप इनमें से किसी भी तरह से लिख सकते हैं:-

1.

/*Namaskar shabd ko screen par chapnewala program*/


#include <'studio.h>
void main (){
printf("Namaskar.");
}

2.
#include <'studio.h>

void main (){printf("Namaskar.");
}

3.
#include <'studio.h>

void main (){printf("Namaskar.");}

सी संकलक की दृष्टि से ये सब वाजिब सी प्रोग्राम हैं, और वह इन सबको बिना शिकायत किए संकलित कर देगा।

पर हमारी सुविधा के लिए प्रोग्राम को अधिक व्यवस्थिति ढंग से लिखना बेहतर रहेगा। नहीं तो बड़े सी प्रोग्रामों में जिनमें बीसियों पंक्तियां और दर्जनों धनुकोष्ठक हो सकते हैं, आप चक्कर में पड़ जाएंगे कि कौन सा कोड खंड कहां खत्म हो रहा है।
इसलिए सी प्रोग्रामन सिखानेवाले अधिकांश पुस्तकों में नौसिखियों को सबसे पहली सलाह यही दी जाती है कि कोड व्यवस्थित ढंग से लिखें। अधिकांश पुस्तकों में बाएं धनु कोष्ठक चिह्न को अलग पंक्ति में अथवा फंक्शन नाम के ठीक आगे, और दाएं धनु कोष्ठक चिह्न को कोड खंड के अंत में अलग पंक्ति में लिखने की सलाह दी जाती है।

यहां इसे प्रोग्राम 1 का उदाहरण लेकर समझाया गया है।

प्रोग्राम लिखने की रीति 1
#include <'studio.h>

void main (){
printf("Namaskar.");
}

प्रोग्राम लिखने की रीति 2
#include <'studio.h>

void main ()
{
printf("Namaskar.");

}

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

अपने कोड लेखन में इन दो रीतियों में से किसी एक का सदा पालन करें।

इस ट्यूटोरियल में दूसरी रीति का पालन किया गया है।

एचटीएमएल ट्यूटोरियल

प्रिंटेफ-स्कैनेफ के जरिए मैं कुछ कंप्यूटर प्रोग्रामन भाषाओं का ट्यूटोरियल प्रस्तुत करूंगा। शुरुआत सी भाषा से की है, जिसके पांच-सात लेख अब तक प्रकाशित हो चुके हैं।

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

इसलिए, एचटीएमल, जावस्क्रिप्ट, आदि के ट्यूटोरियल की बारी आने में काफी समय लग सकता है।

अभी मुझे हाल में लवली कुमारी का लिखा हुआ एचटीएमएल का यह अच्छा हिंदी ट्यूटोरियल मिला है। प्रिंटेफ-स्कैनेफ के जिन पाठकों को एचटीएमल सीखने में रुचि हो, वे मेरे ट्यूटोरियल के आने तक इस ट्यूटोरियल से लाभ उठाएं।

सीखिए सी - 6: सी प्रोग्राम की विशेषताएं - 4

void main ()

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

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

इन छोटे प्रोग्रामों को सी में फंक्शन कहा जाता है। प्रत्येक फंक्शन की कुछ विशेषताएं होती हैं, जो ये हैं –
1. प्रत्येक फंक्शन का एक अद्वितीय नाम होता है।
2. प्रत्येक फंक्शन उसे बुलानेवाले फंक्शन को कोई न कोई डेटा प्रकार लौटाता है।
3. प्रत्येक फंक्शन कोई न कोई डेटा प्रकार स्वीकारता है।

फंक्शनों के संबंध में एक और बात जानने की है। वह यह कि प्रत्येक फंक्शन को दूसरा कोई फंक्शन आह्वान करता है।

इसे इस तरह से समझिए। मान लीजिए आप मकान बनवा रहे हैं। उसके लिए आपको बढ़ई, मिस्त्री, लुहार, इलेक्ट्रीशियन, नलसाज, आदि की जरूरत है। ये सब फंक्शन हुए। आप भी एक फंक्शन हैं, जिसका कार्य है मकान बनवाना। पर आपकी हैसियत कुछ खास है। यदि आप न हों, तो मकान बनवाने काम होगा ही नहीं, क्योंकि आप ही बढ़ई, मिस्त्री, नलसाज आदि को इकट्ठा करके उन्हें काम सौंपते हैं।

इसी तरह हर सी प्रोग्राम में भी एक खास फंक्शन होता है, जिसे main () कहा जाता है। हर प्रोग्राम में इस main () फंक्शन का होना अनिवार्य है। संकलक किसी प्रोग्राम का संकलन शुरू करने से पहले यही देखता है कि main () कहां है? यदि प्रोग्राम में main () फंक्शन न हो, तो संकलक इसे एक गंभीर त्रुटि मानकर संकलन कार्य को रोक देता है।

तो यों समझिए कि हर प्रोग्राम में main () फंक्शन का होना अनिवार्य है। हमारे प्रोग्राम 1 में भी यह फंक्शन है। चूंकि यह एक छोटा सा प्रोग्राम है, इसमें केवल main () फंक्शन ही है, लेकिन वास्तविक सी प्रोग्रामों में main () के अलावा भी बीसियों फंक्शन होंगे।

अब देखते हैं main () के पहले जो void शब्द है, वह किस लिए है। हमने पहले कहा था कि प्रत्येक फंक्शन उसे बुलानेवाले फंक्शन को कुछ न कुछ लौटाता है। कई बार यह रिक्त राशि भी हो सकती है, यानी आप यों समझ लें कि वह कुछ नहीं लौटाता। लेकिन सी की दृष्टि से यह कुछ नहीं भी, कुछ होता है! है न गूढ़ बात! खैर, इस रिक्त राशि को NULL कहते हैं, और main () के पहले जो void शब्द है (जिसका शाब्दिक अर्थ है, खाली) यही सूचित करता है, कि main () फंक्शन कुछ भी नहीं लौटाता है। बात भी सही है, main () ठहरा प्रोग्राम का मालिकाना फंक्शन वह क्या किसी को लौटाएगा, उसका काम है, सबसे कुछ न कुछ लेना।

तो void का मतलब है कि यह फंक्शन कुछ लौटाता नहीं है। और यदि आप प्रोग्राम 1 को ध्यान से देखें, तो आपको विदित हो जाएगा कि वह कुछ भी नहीं लौटा रहा है किसी को। वह केवल Namaskar. को कंप्यूटर स्क्रीन पर छाप देता है।

आगे आप ऐसे फंक्शन लिखेंगे जो अनेक प्रकार के डेटा टाइपों में से कोई न कोई एक डेटा टाइप दूसरे फंक्शनों को लौटाएंगे। इन फंक्शनों के आगे इस डेटा टाइप का संकेत शब्द रहेगा।

अब void main () की एक तीसरी विशेषता पर आते हैं। वह है गोल कोष्ठक ()। आपके मन में यह सवाल जरूर उठ रहा होगा, कि यह किस लिए है और कोष्ठक के अंदर कुछ क्यों नहीं है। आपका सवाल वाजिब है, और उसका उत्तर नीचे दिया गया है।

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

main () में, अथवा किसी भी अन्य फंक्शन में, जो गोल कोष्ठक है, वह चक्की के कीपनुमा पात्र के जैसा ही है। इसमें हम वह डेटा टाइप रखते हैं, जिस पर वह फंक्शन कोई कार्य करता है। मान लीजिए आपने ऐसा कोई फंक्शन लिखा हो, जो दो पूर्णांक संख्याओं का योग पता करता है। तो हम इस फंक्शन को ये दो संख्याएं देंगे, और वह इनका योग निकालकर हमें देगा।

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

int add (int x, inty) {
return (x+y);
}

यह छोटा सा फंक्शन है जो उसे दी गई दो पूर्णांक संख्याओं x और y का योग निकालकर देता है।

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

प्राचर शून्य से लेकर जितने भी हो सकते हैं, लेकिन हर फंक्शन केवल एक राशि को लौटा सकता है, और उस राशि के डेटा टाइप को सूचित करनेवाला शब्द उस फंक्शन के नाम के पहले लिखा जाता है। यहां दो पूर्णांकों को जोड़ने पर हमें एक पूर्णांक प्राप्त होगा, जिसके लिए int डेटा टाइप पर्याप्त है। int मने integer (पूर्णांक)।

तो संक्षेप में यह कि हर सी प्रोग्राम में एक main() फंक्शन होता है। फंक्शन के पहले उसके द्वारा लौटाई गई राशि का डेटा टाइप लिखा जाता है। फंक्शन को दी जानेवाली राशियों को उसके गोल कोष्टकों में रखा जाता है। इन राशियों के साथ उनके डेटा टाइप का उल्लेख करना भी जरूरी है। इसीलिए हमारे add फंक्शन के गोल कोष्ठकों में int x और int y लिखा गया है। इससे add फंक्शन को पता चलता है कि उसे जो दो राशियां x और y दी गई हैं, वे पूर्णांक किस्म की राशियां हैं। यह जानकारी जरूरी है क्योंकि, जैसा कि हम आगे सीखेंगे, सी में राशियां कई प्रकार की हो सकती हैं।

Wednesday, April 8, 2009

सीखिए सी - 5: सी प्रोग्राम की विशेषताएं - 2 और 3

# include < stdio.h >

यह सी प्रोग्राम की दूसरी विशेषता है।

यह उक्ति पूर्वसंकलक (प्रीकंपाइलर) के लिए है। किसी भी सी प्रोग्राम को संकलित करने से पहले एक पूर्वसंकलक उस प्रोग्राम को जांचता है, और उसमें कुछ कोड पंक्तियां जोड़ता है।

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

stdio एक संक्षेपण है और उसका पूरा रूप है standard input and output. इस हेडर फाइल में ऐसे प्रकार्यों (फंक्शनों) के प्रोटोटाइप हैं, जो इनपुट और आटपुट को सुगम बनाते हैं। प्रोग्राम 1 में जो printf() फंक्शन का प्रयोग किया गया है, वह इसी हेडर का एक फंक्शन है। इस फंक्शन का पूरा संकलित कोड पूर्वसंकलक में पहले से मौजूद है। इसलिए हमें इनपुट या आटपुट के कोड स्वयं लिखने की आवश्यकता नहीं है। हमें केवल उस फंक्शन का नाम भर अपने प्रोग्राम में लेना है और उससे संबंधित सी लाइब्रेरी के हेडर फाइल का उल्लेख # include उक्ति में कर देना है। बाकी काम पूर्वसंकलक कर देता है।

आप ध्यान दें कि stdio के आगे .h है। यह बताता है कि यह एक हेडर फाइल है। हेडर फाइल में सी में पहले से ही मौजूद फंकश्नों के नामों की सूची रहती है। यदि आप stdio.h फाइल को खोलकर देखें, तो उसमें आपको बीसियों फंक्शनों के नाम दिखाई देंगे, इनमें आपको printf() भी मिलेगा।

stdio.h में आपको printf() का कोड नहीं मिलेगा, वह संकलित रूप में अलग-अलग सी लाइब्रेरियों में रहता है। हेडर फाइलों में केवल फंक्शन के प्रोटोटाइप (अर्थात एक विशेष शैली में लिखा हुआ फंक्शन का नाम, घबराइए नहीं, फंक्शन प्रोटोटाइप क्या बला होते हैं, इसकी चर्चा नीचे दी गई है) होते हैं। इन फंक्शन प्रोटोटाइपों को देखकर पूर्वसंकलक आपके प्रोग्राम के संकलन के पहले उस फंक्शन से संबंधति कोड को आपके प्रोग्राम में ठीक स्थान पर लगा देता है, और उसके बाद आपके प्रोग्राम का संकलन होता है और .obj और .exe फाइलें बनती हैं।

एक चीज और ध्यान देने की है, वह है stdio.h को घेरे हुए कोणीय कोष्ठक (अर्थात < और >)। ये महत्वपूर्ण हैं। इनसे पूर्वसंकलक को पता चलता है कि stdio.h फाइल के लिए उसे वहां खोजना है, जहां संकलक ने सभी सी लाइब्रेरियों और उनके हेडर फाइलों को संचित किया है। आप stdio.h को दुहरे उद्धरण चिह्नों से भी घेर सकते हैं, ऐसे #include “stdio.h”। ऐसा करने से पूर्वसंकलक stdio.h फाइल के लिए पहले उस निर्देशिका (डाइरेक्ट्ररी) में ढूंढ़ता है जिसमें आपका प्रोग्राम संचित है। यदि उसे वह वहां न मिले, तो पूर्वसंकलक stdio.h फाइल के लिए अन्य निर्देशिकाओं में खोज करता है। कई बार प्रोग्रामरों को अपने लिखे हुए कुछ फलनों (फंक्शनों) का बारबार भिन्न-भिन्न प्रोग्रामों में उपयोग करना पड़ता है। सुविधा के लिए वे इन सब फलनों को एक हेडर फाइल में संचित करके उसे कोई नाम दे देते हैं, जैसे jaihindi.h। अब वे अपने प्रोग्रामों में

#include “jaihindi.h”

वाला पूर्वसंकलक निर्देश जोड़कर इन फंक्शनों को सीधे आह्वान कर सकते हैं, और उनका कोड उन्हें दुबारा लिखना नहीं पड़ता।
इस तरह के हेडर फाइलों को प्रयोक्ता-परिभाषित हेडर फाइल कहा जाता है, और ये पूर्वसंकलक में पहले से ही विद्यमान हेडर फाइलों से भिन्न होते हैं। हेडर फाइलों को उद्धरण चिह्नों (“ और ”) अथवा कोणीय कोष्ठकों (< और >) से घेरकर हम पूर्वसंकलक को बताते हैं कि यह प्रयोक्ता द्वारा लिखा गया हेडर फाइल हैं या सी का अपना कोई हेडर फाइल, और उसे पूर्वसंकलक को कहां ढूंढ़ना है, उस निर्देशिका में जिसमें वह प्रोग्राम संचित है जिसमें यह निर्देश आया है, अथवा उस निर्देशिका में जिसमें सी की सभी हेडर फाइलें संचित हैं।

#include वाले पूर्वसंकलक उक्ति के बारे में कुछ और महत्वपूर्ण बातें।

1. इसे अलग पंक्ति में लिखना जरूरी है और # वाला चिह्न पंक्ति के प्रथम स्थान पर आना चाहिए।
अर्थात, इसे यों लिखना गलता होगा:-

abcddx #include ......

2. सी की उक्तियों के अंत में ; (अर्ध विराम चिह्न) रहता है, लेकिन पूर्वसंकलक से संबंधित उक्तियों के अंत में अर्ध विराम चिह्न ; नहीं रहता है। इसलिए यों लिखना गलत है:-

#include “stdio.h”;

और अब सी की कुछ प्रमुख हेडर फाइलों की चर्चा हो जाए, जिनका आप बारबार उपयोग करेंगे।

math.h
इसमें वर्ग मूल निकालने, किसी संख्या का घात निकालने, किसी कोण का साइन, कोसाइन, टेंजेंट, कोटेंजेंट आदि निकालने, इत्यादि के फंक्शनों के प्रोटोटाइप रहते हैं।

conio.h
यह भी stdio.h के समान है और इसमें भी इनपुट-आउटपुट से संबंधित फंक्शनों के प्रोटोटाइप रहते हैं। इस हेडर के फंक्शनों का उपयोग सी++ में अधिक होता है, न कि सी में।

string.h
इसमें स्मृति और स्ट्रिंग से संबंधित फंक्शनों के प्रोटाटाइप रहते हैं, उदाहरण के लिए, किसी दिए गए स्ट्रिंग में से कुछ वर्णों को छांटकर उपस्ट्रिंग बनाने के फंक्शन, किसी स्ट्रिंग को तोड़कर दो स्ट्रिंगों में बांटने के फंक्शन, किसी स्ट्रिंग के वर्णों को उलटने के फंक्शन (यानी jaihindi को idnihiaj बना देना), इत्यादि फंक्शनों के प्रोटोटाइप रहते हैं।

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

फंक्शन, डेटा टाइप आदि पर आगे चर्चा होगी, और इन्हें पूरी तरह समझे बिना आप ठीक से समझ भी नहीं पाएंगे कि प्रोटोटाइप क्या हैं। मैंने सिर्फ आपकी जिज्ञासा शांत करने के लिए यहां थोड़ा सा संकेत भर कर दिया है।

सी के फंक्शन क्या होते हैं, इसे आम जीवन के एक उदाहरण से स्पष्ट करने की कोशिश करता हूं।

मान लीजिए आप गेहूं लेकर चक्की में पिसाने जाते हैं, और पिसा हुआ आटा लेकर घर लौट आते हैं। इस उदाहरण में चक्की फंक्शन है, गेहूं, उसे दिया गया डेटा टाइप है, आटा उस फंक्शन, यानी चक्की, द्वारा लौटाया गया डेटा टाइप है, और आप चक्की फंक्शन का आह्वान करनेवाला फंक्शन है (जी हां, फंक्शनों को दूसरे फंक्शन ही आह्वान करते हैं। सी में तो आवर्ती (रिकरिंग) फंक्शन भी हैं, जो स्वयं का आह्वान करते हैं, पर ये सब आगे सीखेंगे।)। यानी चक्की फंक्शन गेहूं डेटा टाइप पर कुछ क्रियाएं करके उसे आटा डेटा टाइप में बदलकर आपको दे देता है।

अब आपको एक फंक्शन प्रोटोटाइप का हुलिया भी दिखा दूं। वह ऐसा दिखेगा:-

int calculate (char);

यह calculate नामक किसी फंक्शन का प्रोटोटाइप है। इसमें जो पहले int आया है, वह ऊपर के उदाहरण के आटे के बराबर है, गोल कोष्ठकों में जो char आया है, वह गेहूं के बराबर है। और ध्यान दीजिए, उसके अंत में ; (अर्ध विराम है) जो सी की हर उक्ति के अंत में होता है।

लेख बहुत लंबा हो गया है, इसलिए यहीं समाप्त करता हूं। यदि इसकी बहुत सी बातें समझ में न आए तो घबराइए मत। आगा-आगे सब साफ हो जाएगा, बस अंत तक साथ बने रहिए।

Tuesday, April 7, 2009

सीखेए सी - 4 : सी प्रोग्राम की विशेषता 1

पिछले लेख में हमने सी प्रोग्रामों की आठ विशेषताओं का जिक्र किया था। आइए इन्हें अधिक विस्तार से समझें। सुविधा के लिए हर विशेषता की व्याख्या अलग पोस्ट में देता हूं।

पहली विशेषता यह थी:-

1) /* और */ चिह्न

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

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

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

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

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

सीखिए सी - 3 : एक सी प्रोग्राम की चीर-फाड़

पिछले पोस्ट में सी भाषा सीखने के लिए जिन चीजों की आवश्यकता होगी, उनका जिक्र था। आशा है कि आपने उनकी व्यवस्था कर ली होगी।

आइए, अब देखें कि सी का एक प्रोग्राम कैसा दिखता है। नीचे की पंक्तियों में सी भाषा में लिखा एक सरल प्रोग्राम दिया गया है। उसे ध्यानपूर्वक देखिए।

-------------------------------------------------
प्रोग्राम 1

/*Namaskar shabd ko screen par chapnewala program*/

#include <'studio.h>
void main ()
{
printf("Namaskar.");
}
-------------------------------------------------

यदि आप इस प्रोग्राम को अक्षरशः कंप्यूटर में टंकित करके संकलित करें और उसे चलाएं, तो वह कंप्यूटर स्क्रीन पर

Namaskar.

अंकित करेगा।

इस प्रोग्राम को ध्यानपूर्वक देखिए। उसकी निम्नलिखित आठ विशेषताएं हैं:-

1) प्रथम पंक्ति में /* और */ इन दो चिह्नों के बीच प्रोग्राम के बारे में एक वाक्य लिखा गया है।

2) दूसरी पंक्ति का आरंभ # चिह्न से हुआ है। इस चिह्न के आगे include शब्द है।

3) include शब्द के आगे कोणीय कोष्ठकों (< और >) के भीतर stdio.h लिखा हुआ है।

4) तीसरी पंक्ति में void और main शब्द है और main के आगे गोल कोष्ठक ( () ) है। कोष्ठक खाली है।

5) अगली पंक्ति में धनु कोष्ठक ({ }) का बांयां अर्धांग ({) अंकित है।

6) अगली पंक्ति में printf शब्द है और उसके आगे गोल कोष्ठकों के अंदर Namaskar. पद दुहरे उद्धरण चिह्नों (" और ") के भीतर दिया गया है।

7) Namaskar वाली पंक्ति के अंत में अर्ध-विराम चिह्न (;) है।

8) अंतिम पंक्ति में धनु कोष्ठक का दाहिना अर्धांग (}) है।

ऊपर जो आठ विशेषताएं बताई गई हैं, वे सी के सब प्रोग्रामों के अत्यंत महत्वपूर्ण अंशों को दर्शाती हैं, इसलिए थोड़ा समय देकर उन्हें अच्छी तरह देख-परख लें। अगले लेख में हम इनमें से प्रत्येक अंश को विस्तार से समझाएंगे।

सीखिए सी - 2 : सी सीखने के लिए क्या-क्या आवश्यक होगा?

कोई भी प्रोग्रमन भाषा को ठीक से सीखने के लिए आपको स्वयं उसमें प्रोग्राम लिखकर उसे कंप्यूटर पर आजमाकर देखना होगा।

इसलिए पहली जरूरत यह होगी कि आपके पास कंप्यूटर हो। लेकिन सी सीखने के लिए कोई हाई-फाई कंप्यूटर नहीं चाहिए। कोई भी पुराना कंप्यूटर, यहां तक कि डोस पर चलनेवाले डायनोसर के जमाने के कंप्यूटर भी चल जाएंगे। ये कुछ सौ रुपयों में सेकंड हैंड मिल जाते हैं।

कंप्यूटर का इंतजाम हो जाने पर उसमें कुछ जरूरी सोफ्टवेयर स्थापित करना होगा। इस ड्यूटोरियल की प्रथम किश्त में बताया गया था कि सी एक संकलित (कंपाइल्ड) भाषा है। इसका मतलब यह है कि सी में लिखे गए प्रोग्राम कंप्यूटर पर तभी चलेंगे जब उन्हें संकलित किया जाए। संकलन के दौरान सी प्रोग्राम को यंत्र भाषा में बदला जाता है (1 और 0 में) ताकि कंप्यूटर उसे समझ सके।

इसलिए आपको अपने कंप्यूटर में कोई अच्छा सी संकलक (सी कंपाइलर) स्थापित करना होगा। जो लोग डोस या विंडोस प्रचालन तंत्र वाले कंप्यूटरों पर हों, उनके लिए टर्बो सी एक अच्छा संकलक है। यह एक छोटा डोस प्रोग्राम है जिसे आसानी से स्थापित किया जा सकता है। टर्बो सी आपको अपने स्कूल के कंप्यूटर लैब से अथवा कंप्यूटर प्रोग्राम बेचनेवालों से मिल सकता है। इंटरनेट पर भी तपास करें। यदि टर्बो सी न मिले, उसी के जैसा कोई अन्य संकलक भी चलेगा। कुछ सी संकलक नेट पर से मुफ्त में भी उतारे जा सकते हैं।

यदि आप लिनक्स वाले कंप्यूटर पर हों, तो उसमें पहले से ही सी संकलक होगा। यदि आप उसे ढूंढ़ न पाएं, तो किसी कंप्यूटर विशेषज्ञ से सलाह लें।

बस ये ही दो चीजें आपको चाहिए, सी सीखने के लिए।

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

सी प्रोग्राम किसी भी टेक्स्ट एडिटर (जैसे नोटपैड) में लिखे जा सकते हैं। टर्बो सी में उसका अपना टेक्स्ट एडिटर है, जिसमें प्रोग्राम लिखे जा सकते हैं। डोस एडिटर में भी सी के प्रोग्राम लिखे जा सकते हैं। लेकिन एमएस वर्ड आदि का इसके लिए प्रयोग न करें।

प्रोग्राम लिखने के बाद जब आप उसे संकलित करेंगे, तो दो फाइलें बनेंगी, एक .obj फाइल और एक .exe फाइल। प्रोग्राम को चलाने के लिए आपको .exe फाइल को रन करना होगा।

उदाहरण के लिए यदि आपने hello.txt फाइल में एक प्रोग्राम लिखा हो, और उसे संकलित किया हो, तो hello.obj और hello.exe फाइलें बनेंगी। आपको hello.exe को चलाकर देखना है।

संकलक को स्थापित करना और उसे ठीक से सेट करना टेढ़ा काम है और यदि आपको कंप्यूटर का ज्यादा अनुभव न हो, तो इसमें आपको किसी की मदद लेनी चाहिए, अन्यथा आप इसी में उलझकर रह जाएंगे, और सी सीखने का उत्साह ठंडा पड़ जाएगा।

सीखिए सी - 1 : सी भाषा का उद्भव कैसे हुआ

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

जैसा कि आप जानते हैं, कंप्यूटर दो ही स्थितियों को नैसर्गिक रूप से पहचान सकता है--अपने परिपथों में बिजली के बहाव के होने और न होने की। इन दोनों दशाओं को 1 और 0 के माध्यम से दर्शाया जाता है। अन्य शब्दों में कहें, तो कंप्यूटर की भाषा में केवल दो ही शब्द होते हैं, 1 और 0, और हमें कंप्यूटरों से बातचीत करते समय हर बात इन्हीं दो शब्दों में कहनी होती है।

कंप्यूटरों के शुरुआती दौर में कंप्यूटर प्रोग्राम सचमुच इस मूलभूत भाषा में लिखे जाते थे। इस भाषा को यंत्र भाषा (मशीन लैंग्वेज) कहा जाता है। लेकिन यंत्र भाषा में प्रोग्राम लिखने का काम अत्यंत उबाऊ और श्रमसाध्य है। जैसे-जैसे कंप्यूटर अधिक जटिल कार्यों में लगाए जाने लगे, यंत्र भाषा अपर्याप्त सिद्ध होने लगी। तब प्रोग्राम-लेखकों ने उससे उन्नत भाषा का विकास किया, जिसमें यंत्र भाषा के बार-बार प्रयोग में आनेवाले अंक-क्रमों के लिए सूचक शब्द रखे गए। मान लीजिए कि दो संख्याओं को जोड़ने के लिए यंत्र भाषा में यह क्रम चलता हो--1100101010001101। तो इस अंक-विन्यास के लिए ADD (जोड़ो) सूचक शब्द रख देने पर, प्रोग्राम में जहां-जहां यह अंक-विन्यास आता हो, वहां इस सूचक शब्द का प्रयोग काफी होगा। इसी प्रकार से कंप्यूटर द्वारा किए जानेवाले अन्य कार्यों को सूचित करनेवाले अंक-विन्यासों के लिए भी शब्द रखे गए। इन शब्द-प्रतीकों की भाषा को ऐसेंब्ली भाषा कहा जाता है। ऐसेंब्ली भाषा में लिखे गए प्रोग्रामों को यंत्र भाषा में बदलने के लिए विशेष प्रोग्राम लिखे गए, जिन्हें ऐसेंब्लर कहा जाता है। प्रोग्रामर तो अपना प्रोग्राम ऐसेंब्ली भाषा में लिखेगा, लेकिन ऐसेंब्लर उस प्रोग्राम को यंत्र भाषा में परिवर्तित करेगा, ताकि कंप्यूटर प्रोग्राम को समझ सके।

लेकिन बहुत जल्द ऐसेंब्ली भाषा भी अनुपयुक्त सिद्ध होने लगी। यह तब हुआ जब निजी कंप्यूटरों का दौर आरंभ हुआ। ऐसेंब्ली भाषा यंत्र-निर्भर भाषा है, यानी ऐसेंब्ली भाषा में लिखे गए प्रोग्राम हर प्रकार के कंप्यूटरों पर नहीं चल सकते, वरन उन्हीं कंप्यूटरों पर चल सकते हैं, जिनके लिए वे लिखे गए हैं। जब शुरू-शुरू में थोड़े ही प्रकार के कंप्यूटर होते थे, तो यह स्थिति संतोषजनक थी, लेकिन जैसे-जैसे विभिन्न प्रकार के कंप्यूटर बनने लगे, तो ऐसी स्थिति हो गई कि एक कंप्यूटर के लिए लिखे गए प्रोग्राम अन्य कंप्यूटरों के लिए काले अक्षर भैंस बराबर हो गए।

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

कुछ समय तक तो ये भाषाएं पर्याप्त रहीं, लेकिन जैसे-जैसे कंप्यूटरों की शक्ति बढ़ने लगी और उनके लिए लिखे गए प्रोग्रामों की जटिलता आसमान छूने लगी, तो ये भाषाएं भी जवाब दे गईं।

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

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

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

आजकल सी दसवीं, बारहवीं से लेकर बीसीए, एमसीए आदि के पाठ्यक्रमों में निर्धारित की गई है। इसलिए कंप्यूटरशास्त्र के छात्रों के लिए सी का अध्ययन आवश्यक हो गया है। सभी प्रोग्रामरों के लिए सी सीखना इसलिए भी आवश्यक है क्योंकि अनेक अन्य भाषाएं, जैसे जावा, फ्लैश एक्शनस्क्रिप्ट, सी++, सीशार्प आदि में भी सी जैसा वाक्य-विन्यास होता है। यदि प्रोग्रामर को सी अच्छी तरह से आती हो, तो इन सब भाषाओं को सीखना उसके लिए अधिक सरल हो जाता है। सी सीखने का एक अन्य लाभ यह है कि उसमें किसी आधुनिक प्रोग्रामन भाषा के सभी आधारभूत तत्व जैसे प्रमुख डेटा टाइप (int, char, float, array, struct, आदि), लूपिंग स्ट्रक्चर (for, while, do... while, case आदि), ब्रांचिंग कथन (if... else वाले कथन) आदि मौजूद हैं। इसलिए सी सीख लेने पर प्रोग्रामन भाषाओं की मुख्य-मुख्य विशेषताएं आसानी से समझ में आ जाती हैं। चूंकि सी एक सुगठित और छोटी भाषा है उसे अन्य प्रोग्रामन भाषाओं की तुलना में जल्दी सीखा जा सकता है।

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

जहां तक हो सके, ब्लोग को त्रुटि-रहित रखने का प्रयास किया गया है, लेकिन यदि कोई त्रुटि रह गई हो, तो जानकार पाठकों से अनुरोध है कि वे मुझे इन त्रुटियों से अवगत कराएं।

इस ब्लोग में ऐन्सी सी का अनुसरण किया गया है। सभी प्रोग्राम टर्बो सी++ संकलक (वर्शन 5) पर संकलित करके देखे गए हैं।

Monday, April 6, 2009

मेरे इस नए ब्लोग के बारे में

यह ब्लोग प्रोग्रामन भाषाओं के बारे में सामग्री प्रस्तुत करेगा। जिन भाषाओं के बारे में मैं यहां लिखने का विचार रखता हूं, वे हैं, सी, सी++, एचटीएमएल, जावास्क्रिप्ट, एसक्यूएल, एक्सएमएल, डीएचटीएमएल, आदि, आदि।

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

दूसरी बात यह है कि सी++, जावा, सीशार्प, फ्लैश एक्शनस्क्रिपट आदि अनेकानेक भाषाओं का वाक्य-विन्यास सी जैसा ही होता है। यदि सी अच्छी तरह आ जाए, तो इन भाषाओं को सीखना बहुत आसान हो जाता है।

अंग्रेजी में सी भाषा सिखानेवाली अनेक पुस्तकें हैं, पर हिंदी में ऐसी पुस्तकों की कमी है। इस कमी को दूर करने के इरादे से ही यह ब्लोग शुरू किया गया है।

सभी भाषाओं के लिए मैं दो टैग रखूंगा -- सीखिए [वह भाषा़] जो उस भाषा का ट्यूटोरियल होगा, और [उस भाषा] के सैंपल प्रोग्राम।

उदाहरण के लिए, सी के लिए ये दो टैग होंगे -- सीखिए सी, और, सी के सैंपल प्रोग्राम।

इन सैंपल प्रोग्रामों में स्कूलों-कालेजों में अक्सर पूछे जानेवाले प्रोग्रामों के कोड रहेंगे।

आशा है कि हिंदी भाषी छात्रों को इस ब्लोग से सी आदि भाषाएं सीखने में मदद मिलेगी।

यदि आपके बच्चे स्कूल या कालेज में सी सीख रहे हों, तो इस ब्लोग की जानकारी उन्हें दें, और उन्हें कंप्यूटर का उपयोग करने भी दें, ताकि वे इस ब्लाग का लाभ उठा सकें :-)

अन्यथा आप इसके लेखों को मुद्रित करके उन्हें दें।

लेखों को त्रुटि रहित रखने की पूरी कोशिश मैं करूंगा, फिर भी यदि कोई त्रुटि नजर आए, तो जानकार पाठक मुझे इसकी जानकारी देने की कृपा करें।