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) एक जटिल विषय है जिस पर हम आगे के लेखों में अधिक विस्तार से चर्चा करेंगे।

5 comments:

  1. सुब्रमन्यम जी नमस्कार
    जैसे ही आपने ब्लॉग बनाया था मैंने आपको ज्वाइन कर लिया था मैं जनता था की कुछ दिन आपकी क्लास में नहीं आ पाउगा मगर ये निश्चय जरूर कर लिया था की जैसे ही समय मिलेगा नियमित क्लास लूँगा
    आप जो मेहनत कर रहे है उससे बहुत लोगों का भला हो रहा है मगर देख कर दुःख हुआ की लोग आपको केवल पढ़ रहे हैं टिप्पडी नहीं कर रहे
    आज मैंने शुभारम्भ करना चाहा मगर कहना पद रहा है की असफल रहा क्योकि आपने कहाँ है की सी भाषा सीखने के लिए दो चीज चाहिए कम्पूटर और टर्बो सी एक चीज तो मेरे पास है
    एच सी एल लैपटॉप ५१२ रैम १२० जी बी हार्ड डिस्क
    मगर दूसरी चीज टर्बो सी नहीं था सो उसे नेट से लोड किया मगर दिक्कत ये है की ये मुझसे इंस्टाल नहीं हो प् रहा है
    १ एम् बी की जिप फाइल लोड किया तो उसमे तीन फोल्डर मिले पहले फोल्डर में इंस्टालर है
    इंस्टाल करने के लिए पहले ड्राइव मांगता है मैंने सी डाला फिर कुछ बार इंटर दबा फिर लिख कर आया
    please insert the INSTALL/HELP/BGI disk into drive c:
    और यही मामला अटक जा रहा है इसके बाद मुझे क्या करना है मैं नहीं जनता
    या कोई और विधी है इंस्टाल करने की
    बताने की महती कृपा करैं
    आज मैंने आपकी पहली से चौथी पोस्ट को पढा जो ठीक से समझ आ गई है मैं इस विषय में बिलकुल अनाडी हूँ अगर आपका सहयोग रहा तो सीख लूँगा

    आपका वीनस केसरी

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

    टर्बो सी के अलावा भी कई अन्य सी कंपाइलर नेट पर उपलब्ध हैं। कृपया free c compiler के लिए सर्च करें। कोई न कोई कंपाइलर आपको मिल ही जाएगा।

    मैं आगे के किसी लेख में टर्बो सी को स्थापित करने के संबंध में एक लेख लिख दूंगा, जिससे आपको थोड़ी मदद मिल सकेगी।

    इन लेखों के साथ बने रहने के लिए आभार।

    ReplyDelete
  3. सर आप जो जानकारी दे रहेँ हैँ बहुत अच्छी हैँ,मैँ BCA Ist year का student हुँ जब मेँने सी भाषा का अध्ययन करने लगा तो देखा की सी भाषा मेँ programming करने मे बहुत परेशानी आ रही हैँ इस कारण मेँ परेशान रहता हुँक्योकि मैने बहुत कोशिश की है लेकीन programming नहीँ सीख पा रहा हुँ, मुझे अच्छी programming सीखने के लिये क्या करना होगा "Please help me"

    ReplyDelete
  4. Hey keep posting such good and meaningful articles.

    ReplyDelete