PDA

View Full Version : सी की दुनिया


ABHAY
06-01-2011, 01:21 PM
C भाषा को १९७२ के आस-पास डेनिस रिची, जो AT&T (American Telephone and Telegraph) की बेल लैब में काम करते थे, ने विकसित किया और एक बार जब यह प्रोग्रामरों के हाथ लगा तो जैसे कंप्युटिंग की दुनिया हीं बदल गई। तब से ले कर आज तक C भाषा या इसके परिवार के हीं किसी प्रोग्रामिंग भाषा ने कंप्युटिंग की दुनिया पर राज किया है। C परिवार की अन्य भाषाओं में हम निम्न भाषाओं का नाम ले सकते हैं - C++, Java, C# (सी शार्प).।
C भाषा का विकास, युनिक्स औपरेटिंग सिस्टम के साथ जुड़ा हुआ है और इनके विकास की कहानी भी कम रोचक नहीं है। साठ के दशक में जब बड़े कम्प्युटरों (मेन फ़्रेम और मिनी) का बोलबाला था तब हर कम्प्युटर के साथ उसके लिए विशेष तौर से विकसित औपरेटिंग सिस्टम और अन्य प्रोग्राम बनाए जाते थे। यानि तब की बात आज की तरह नहीं थी, कि कंप्युटर कोई भी हो औपरेटिंग सिस्टम विंडो ही होगा (७५%+)। तब हर कंप्युटर के साथ अलग औपरेटिंग सिस्टम और अलग प्रोग्रामों की श्रृंखला... यानि कंप्युटिंग पर महारत हासिल करना आसान न था और बहुत कुछ सिखना होता था।
तब एक विचार आया कि क्यों न एक ऐसा औपरेटिंग सिस्टम बनाया जाए जो कई तरह के मशीनों पर चले, और इसी विचार ने AT&T और MIT औरGEको एक ऐसे हीं सिस्टम को विकसित करने की सोंच दी और तब इस प्रोजेक्ट को कहा गया - "MULTICS (MULTiplex Information and Computing Service)". काम १९६४ में शुरु हुआ, समय बीतता गया पर AT&T जैसा चाहता था वैसा कुछ बन नहीं रहा था। AT&T, जो इस रीसर्च में मुख्य पैसा लगाने वाली कम्पनी थी, ने बाद में अपने को इससे अलग कर लिया। उस प्रोजेक्ट से जुड़े लोगों के लिए यह एक बुरा समय था, उन पर जाने अनजाने एक "Failed Project" का हिस्सा होने का तमगा चिपका था। वे लोग बड़ी मुश्किल से AT&T के मैनेजमेन्ट को यह समझा पाए कि उन्हें एक पुरानी मशीन दी जाए ताकि वे कुछ कर सकें (ऊन्हें तब एक PDP-7 मशीन काम करने के लिए दे दी गई, तब का इस मशीन का सबसे नया मौडेल PDP-11 था) उन्हें इतना तो समझ में आ रहा था कि अगर औपरेटिंग सिस्टम किसी ३G भाषा में हो तो उसका कई तरह के मशीनों पर चलना संभव हो जाएगा, पर तब तक के सारे औपरेटिंग सिस्टम उस कंप्युटर में इस्तेमाल हो रही माईक्रोप्रोसेरर की असेम्बली भाषा या मशीनी भाषा (Language of Bits) में बनाए जाते थे।

ABHAY
06-01-2011, 01:25 PM
उपर्युक्त प्रोग्रामिंग भाषा की कमी ने केन थौमसन (बेल लैब के इंजीनीयर, जो मल्टिक्स प्रोजेक्ट का हिस्सा थे) को एक नई किस्म की प्रोग्रामिंग भाषा को विकसित करने की प्रेरणा दी (यह भाषा B नाम से बनी, अब यह विलुप्ति के कगार पर है)। पर यह B भी, जो नये किस्म के औपरेटिंग सिस्टम का लक्ष्य था, उसे पुरा न कर सकी। डेनिस रिची तब AT&T में अपनी युनिवर्सीटी से एक रीसर्च स्कौलर के रुप में आए थे और उन्हें केन थौम्सन के साथ काम करना था। रिची ने प्रोजेक्ट को समझा और फ़िर केन के B भाषा को भी। फ़िर उन्होंने यह नयी भाषा बनाई - C. इन प्रोग्रामिंग भाषाओं के ऐसे विचित्र नामकरण के पीछे भी कहानी है। असल में केन ने अपनी भाषा B, एक पूर्व विकसित भाषा, मार्टिन रिचर्ड्स की BCPL (Basic Combined Programming Language)पर आधारित रखी थी और इसी भाषा के नाम के पहले अक्षर "B" को अपनी नयी भाषा का नाम बनाया। और जब रिची ने B पर आधारित नई भाषा बनाई तो उन्होंने इसी परम्परा का पालन किया और BCPL के अगले अक्षर "C" को अपने भाषा का नाम दिया। (आगे जब AT&Tके हीं जार्ने स्ट्राउस्ट्रुप ने जब C भाषा पर आधारित एक नई भाषा बनाई (हम आप इस भाषा को आज C++के नाम से जानते हैं), तो कई ने कहा की इसे BCPL के आधार पर P कहा जाए तो कई ने कहा कि B के बाद C तो अब इसको D कहा जाए। (वैसे D नाम की भी एक प्रोग्रामिंग भाषा है)
रिची के इस C जो एक ३G प्रोग्रामिंग भाषा है, में जब ओपरेटिंग सिस्टम लिखा गया तो इसका नाम हुआ UNIX, इसके बाद Unix और C की जुगलबंदी ने कंप्युटिंग की दुनिया हीं बदल दी और आज कंप्युटर कई रुपों में हमारे चारो तरफ़ मौजुद है। कहते हैं कि जिस रफ़्तार से कंप्युटिंग का विकास हुआ, अगर यही रफ़तार औटोमोबाईल की दुनिया में होता तो आज रोल्स-रायस आकार और कीमत में माचिस की डिब्बी की तरह होता...........

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

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

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

ABHAY
06-01-2011, 01:28 PM
लेकिन बहुत जल्द ऐसेंब्ली भाषा भी अनुपयुक्त सिद्ध होने लगी। यह तब हुआ जब निजी कंप्यूटरों (Personal Computers or PC)का दौर आरंभ हुआ। ऐसेंब्ली भाषा यंत्र-निर्भर भाषा है, यानी ऐसेंब्ली भाषा में लिखे गए प्रोग्राम हर प्रकार के कंप्यूटरों पर नहीं चल सकते, वरन उन्हीं कंप्यूटरों पर चल सकते हैं, जिनके लिए वे लिखे गए हैं। जब शुरू-शुरू में थोड़े ही प्रकार के कंप्यूटर होते थे, तो यह स्थिति संतोष जनक थी, लेकिन जैसे-जैसे विभिन्न प्रकार के कंप्यूटर बनने लगे, तो ऐसी स्थिति हो गई कि एक कंप्यूटर के लिए लिखे गए प्रोग्राम अन्य कंप्यूटरों के लिए काले अक्षर भैंस बराबर हो गए। एक और भी कारण था। शुरुआत में तो कंप्युटर का मुख्य काम कंप्युटिंग हीं था पर धीरे-धीरे कंप्युटर का प्रयोग और भी अन्य कामों के लिए होने लगा, और तब प्रोग्रामरों के प्रोग्राम ज्यादा जटिल होने लगे और सूचक आधारित (Nemonics based) ऐसेंब्ली भाषा अब थोड़ा मुश्किल पैदा करने लगी।

ABHAY
06-01-2011, 01:29 PM
इस स्थिति से निपटने के लिए कंप्यूटर विशेषज्ञों ने कुछ उच्च स्तर की भाषाएं विकसित कीं, जो यंत्र-मुक्त थीं, यानी उनमें लिखे गए प्रोग्राम अनेक प्रकार के कंप्यूटरों पर चल सकते थे। (ऐसी पहली भाषा फ़ोर्ट्रान है) इन भाषाओं में एक खुबी और थी, ये सब अंग्रेजी जैसी (ध्यान रहे, अंग्रेजी नहीं अंग्रेजी जैसी) हैं, जिससे इनको सीखना समझना आसान हो गया (पहले की विकसित भाषाओं की तुलना में)। इन भाषाओं में लिखे गए प्रोग्रामों को यंत्र भाषा में बदलने के लिए विशेष प्रकार के दुभाषिए (इंन्टेरप्रेटर) और संकलक (कंपाइलर) प्रोग्राम लिखे गए। बेसिक, कोबोल, पास्कल आदि इस प्रकार की भाषाएं हैं।

ABHAY
06-01-2011, 01:31 PM
कुछ समय तक तो ये भाषाएं पर्याप्त रहीं, लेकिन जैसे-जैसे कंप्यूटरों की शक्ति बढ़ने लगी और उनके लिए लिखे गए प्रोग्रामों की जटिलता आसमान छूने लगी, तो ये भाषाएं भी जवाब दे गईं।
इसका मुख्य कारण यह था कि इन भाषाओं में निर्देश रेखीय क्रम में रहता है (Sequential), यानी निर्देश जिस क्रम में प्रोग्राम में लिखे होते हैं, कंप्यूटर उसी क्रम में उनका निष्पादन करता है। लेकिन जटिल प्रोग्रामों में कंप्यूटर को एक निर्देश के परिणामों के आधार पर अनेक विकल्पों में से एक को चुनकर उसका पहले निष्पादन करने की आवश्यकता रहती है। बेसिक आदि प्रारंभिक उच्च-स्तरीय भाषाओं में इस प्रकार की स्थितियों से निपटने की क्षमता नहीं थी।

ABHAY
06-01-2011, 01:33 PM
इसी संदर्भ में पास्कल, सी आदि अधिक पूर्ण एवं शक्तिशाली उच्च-स्तरीय भाषाओं का विकास हुआ। इनमें प्रोग्राम के बहाव को नियंत्रित करने के लिए अनेक उपाय हैं। सी इन सभी भाषाओं में से सर्वाधिक उन्नत है, क्योंकि वह प्रोग्राम-लेखक को कंप्यूटर को यंत्र-स्तर पर नियंत्रित करने की क्षमता भी देती है और इस स्तर पर यह पुरानी पीढ़ी की भाषा ऐसेंब्ली के ज्यादा करीब है। इसी विशेषता के कारण पिछले कुछ दशकों में सी भाषा सर्वाधिक उपयोग में लाई जाने वाली भाषा बन गई थी। (आज भी यह अपने बदले हुए रूप में, जावा के रूप में विश्व की अग्रणी प्रोग्रामिंग की भाषा बनी हुई है)

ABHAY
06-01-2011, 01:34 PM
सी की लोक-प्रियता के कुछ अन्य कारण भी हैं। युनिक्स प्रचालन तंत्र (ओपरेटिंग सिस्टम/operating system) सी भाषा में ही लिखा गया है और यह बड़े कंप्यूटरों में सर्वाधिक लगाया जाने वाला प्रचालन तंत्र है। अतः इन कंप्यूटरों के लिए प्रोग्राम लिखने के लिए सी भाषा अधिक उपयुक्त है। अभी हाल में सी भाषा के साथ वस्तु-केंद्रित प्रोग्रामिंग (object-oriented programming or OOPs)के तत्व जोड़ कर एक नई भाषा सी++ विकसित की गई है, जो सी से भी अधिक प्रचार-प्रसार पा गई है। चूंकि सी++, सी का ही विकसित रूप है, इसलिए उसमें निपुण होने के लिए सी की अच्छी जानकारी बहुत जरूरी है।

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

ABHAY
06-01-2011, 01:36 PM
पाठक से सी भाषा या किसी भी अन्य कंप्यूटर भाषा या कंप्यूटर के बारे में जानकारी अपेक्षित नहीं है। सी भाषा की प्रारंभिक स्तर से लेकर कुछ अधिक उन्नत संरचनाओं तक का यहाँ मैं उल्लेख करने वाला हूँ। सी एक अत्यंत समृद्ध एवं शक्तिशाली भाषा है और उसके सभी पहलुओं को मैं शायद यहाँ न समेट सकूँ, फ़िर भी इतना तय है कि आपको इस सुत्र से निराशा हाथ नहीं लगेगी। आशा है आप इस सुत्र से सी भाषा की एक मूलभूत जानकारी प्राप्त कर लेंगे और उपयोगी प्रोग्राम लिखने की क्षमता प्राप्त कर लेंगे।

मेरे इन पोस्ट में अगर कहीं त्रुटि दिखे तो आप मुझे इन त्रुटियों से अवगत कराएं।

मैं इन प्रोग्रामों को बोरलैन्ड के सी कंपाईलर की वर्जन ५ के आधार पर लिखुँगा। यह कम्पाईलर नेट पर निःशुल्क उपलब्ध है, अगर आप इसे न खोज पाएँ तो मुझे बताएँ, संभव हुआ तो मैं इसे भेजने का प्रयास करुँगा। इस कंपाईलर की मद से आप सी++ भी सिख पाएँगे। (अगर मुझे मौका मिला और आपकी इच्छा हुई को एक सुत्र मैं सी++ पर भी तैयार करना चाहुँगा)

ABHAY
06-01-2011, 01:37 PM
कोई भी प्रोग्रमन भाषा को ठीक से सीखने के लिए आपको स्वयं उसमें प्रोग्राम लिखकर उसे कंप्यूटर पर आजमा कर देखना होगा। तैरना सीखने के लिए आपको पानी में उतरना हीं होगा।

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

कंप्यूटर का इंतजाम हो जाने पर उसमें कुछ जरूरी सोफ्टवेयर स्थापित करना होगा। मैंने उपर बताया है कि सी एक संकलित (कंपाइल्ड) भाषा है। इसका मतलब यह है कि सी में लिखे गए प्रोग्राम कंप्यूटर पर तभी चलेंगे जब उन्हें संकलित किया जाए। याद रहे, संकलन के दौरान सी प्रोग्राम को यंत्र-भाषा में बदला जाता है (1 और 0 में) ताकि कंप्यूटर उसे समझ सके।
इसलिए आपको अपने कंप्यूटर में कोई अच्छा सी संकलक (सी कंपाइलर) स्थापित करना होगा। जो लोग डोस या विंडोस प्रचालन तंत्र वाले कंप्यूटरों पर हों, उनके लिए टर्बो सी (Turbo C) एक अच्छा संकलक है। यह एक छोटा डोस प्रोग्राम है जिसे आसानी से स्थापित किया जा सकता है। टर्बो सी आपको कंप्यूटर प्रोग्राम बेचने वालों से मिल सकता है। (बोरलैन्ड कंपनी ने टर्बो सी वर्जन १ को अब फ़्री कर दिया है, पर इसका वर्जन ३ जो आसानी से उपलब्ध है और जो मूल रूप से सी++ का कंपाईलर है फ़्री नहीं है, बाकि आपकी मर्जी) यदि टर्बो-सी न मिले, उसी के जैसा कोई अन्य संकलक भी चलेगा। कुछ सी संकलक नेट पर से मुफ्त में भी उतारे जा सकते हैं।
यदि आप लिनक्स वाले कंप्यूटर पर हों, तो उसमें पहले से ही सी संकलक होगा। यदि आप उसे ढूंढ़ न पाएं, तो किसी कंप्यूटर विशेषज्ञ से सलाह लें।

ABHAY
06-01-2011, 01:38 PM
बस ये ही दो चीजें आपको चाहिए, सी सीखने के लिए।
जैसा कि मैंने ऊपर कहा, प्रोग्रामन भाषा सीखने के लिए उसमें खुद प्रोग्राम लिखकर उन्हें कंप्यूटर पर चलाकर देखना बहुत जरूरी है। इसलिए, इस ट्यूटोरियल में जो भी प्रोग्राम के कोड दिए गए हैं, उन्हें अपने कंप्यूटर पर टंकित करके, उन्हें संकलित करें और चलाकर देखें। क्या वे वैसे ही परिणाम आपके कंप्यूटर पर दे रहे हैं, जैसे इस ट्यूटोरियल में कहा गया है? यदि नहीं तोदेखे, समझें कहां आपसे त्रुटि हो गई है? इस तरह से आप कुछ ही दिनों में सी सीख जाएंगे। अगर आपने एक बार सही प्रोग्राम लिख लिया और यह सही चल गया, तो खुद से भी उसमें एक-दो गलती कर दें (सही को चला कर देख-समझ लेने के बाद), और फ़िर उस प्रोग्राम को कंपाईल करके देखें, कि संकलक (कंपाईलर) आपकी गलती कैसे पकड़ता है, क्या संदेश देता है - यह अभ्यास आपको अपना बड़ा प्रोग्राम को त्रुटि-रहित (zero error) करने में मदद करेगा।

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

प्रोग्राम लिखने के बाद, आप उसे जब save (सुरक्षित करें) तब पक्का करें कि आपके प्रोग्राम का एक्शटेंशन ".c" या ".cpp" है। जब आप उसे संकलित करेंगे, तो दो फाइलें बनेंगी, एक .obj फाइल और एक .exe फाइल। प्रोग्राम को चलाने के लिए आपको .exe फाइल को रन करना होगा।
लिनक्स की दुनिया में जब आप सी के प्रोग्राम को संकलित करेंगे तो एक फ़ाईल बनेगी a.out नाम से। आपको इस फ़ाईल को चलाना होगा अपने प्रोग्राम की आउटपुट को देखने के लिए।
उदाहरण के लिए यदि आपने hello.c फाइल में एक प्रोग्राम लिखा हो, और उसे संकलित किया हो, तो hello.obj और hello.exe फाइलें बनेंगी। आपको hello.exe को चला कर देखना है।

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

ABHAY
06-01-2011, 01:40 PM
http://www.codeblocks.org/downloads/5
यह लिन्क है एक ऐसे कंपाईलर का जो प्रोफ़ेशनल लेवल के प्रोग्राम को डेवलप करने के लिए प्रयोग किया जाता है। यह है तो सी++ का , पर याद रखिए कि सी++ का हर कंपाईलर सी का भी कंपाईलर है (आम तौर पर)। हो सकता है कि आप अगर प्रोग्रामिंग की दुनिया में नए हों तो शायद यह थोड़ा परेशान करे, पर अगर आप छात्र हैं तो मेरी सलाह होगी कि आप थोड़ा समय दें और इसको समझें, आपके भविष्य के लिए बेहतर है...धन्यवाद.।
वैसे मैं कोशिश करुँगा कि मैं टर्बो सी का वर्जन २ जो अब फ़्री कर दिया गया है, किसी जगह अपलोड कर दूँ फ़िर लिन्क दुँगा।

ABHAY
06-01-2011, 01:40 PM
पिछले पोस्ट में सी भाषा सीखने के लिए जिन चीजों की आवश्यकता होगी, उनका जिक्र था। आशा है कि आपने उनकी व्यवस्था कर ली होगी।
आइए, अब देखें कि सी का एक प्रोग्राम कैसा दिखता है। नीचे की पंक्तियों में सी भाषा में लिखा एक सरल प्रोग्राम दिया गया है। उसे ध्यान-पूर्वक देखिए।
-------------------------------------------------
प्रोग्राम 1

/*Namaskar shabd ko screen par chapnewala program*/

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

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

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

1) प्रथम पंक्ति में /* और */ इन दो चिह्नों के बीच प्रोग्राम के बारे में एक वाक्य लिखा गया है।
2) दूसरी पंक्ति का आरंभ # चिह्न से हुआ है। इस चिह्न के आगे include शब्द है।
3) include शब्द के आगे कोणीय कोष्ठकों (< और >) के भीतर stdio.h लिखा हुआ है।
4) तीसरी पंक्ति में void और main शब्द है और main के आगे गोल कोष्ठक ( ( ) ) है। कोष्ठक खाली है।
5) अगली पंक्ति में धनु कोष्ठक or braces or middle brackets ({ }) का बांयां अर्धांग ({ ) अंकित है।
6) अगली पंक्ति में printf शब्द है और उसके आगे गोल कोष्ठकों के अंदर Namaskar. पद दुहरे उद्धरण चिह्नों (double quotes, " और ") के भीतर दिया गया है।
7) Namaskar वाली पंक्ति के अंत में अर्ध-विराम चिह्न (semi-colon, "; ") है।
8) अंतिम पंक्ति में धनु कोष्ठक का दाहिना अर्धांग ( } ) है।

ABHAY
06-01-2011, 01:43 PM
ऊपर सी प्रोग्राम की आठ विशेषताओं का जिक्र किया था। आइए इन्हें अधिक विस्तार से समझें। सुविधा के लिए हर विशेषता की व्याख्या अलग पोस्ट में देता हूं।
पहली विशेषता यह थी:-

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

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

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

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

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

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

ABHAY
06-01-2011, 01:45 PM
# include < stdio.h >

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

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

ABHAY
06-01-2011, 01:46 PM
stdio एक संक्षेपण है और उसका पूरा रूप है standard input and output. इस हेडर फाइल में ऐसे प्रकार्यों (फंक्शनों) के प्रोटोटाइप हैं, जो इनपुट और आटपुट को सुगम बनाते हैं। प्रोग्राम 1 में जो printf() फंक्शन का प्रयोग किया गया है, वह इसी हेडर का एक फंक्शन है। इस फंक्शन का पूरा संकलित कोड पूर्वसंकलक में पहले से मौजूद है। इसलिए हमें इनपुट या आटपुट के कोड स्वयं लिखने की आवश्यकता नहीं है। हमें केवल उस फंक्शन का नाम भर अपने प्रोग्राम में लेना है और उससे संबंधित सी लाइब्रेरी के हेडर फाइल का उल्लेख # include उक्ति में कर देना है। बाकी काम पूर्वसंकलक कर देता है।
आप ध्यान दें कि stdio के आगे .h है। यह बताता है कि यह एक हेडर-फाइल है। हेडर-फाइल में सी में पहले से ही मौजूद फंकश्नों के नामों की सूची रहती है। यदि आप stdio.h फाइल को खोल कर देखें, तो उसमें आपको बीसियों फंक्शनों के नाम दिखाई देंगे, इनमें आपको printf( ) भी मिलेगा।
stdio.h में आपको printf() का कोड नहीं मिलेगा, वह संकलित रूप में अलग-अलग सी लाइब्रेरियों में रहता है। हेडर फाइलों में केवल फंक्शन के प्रोटोटाइप (अर्थात एक विशेष शैली में लिखा हुआ फंक्शन का नाम, घबराइए नहीं, फंक्शन प्रोटोटाइप क्या बला होते हैं, इसकी चर्चा नीचे दी गई है) होते हैं। इन फंक्शन प्रोटोटाइपों को देखकर पूर्वसंकलक आपके प्रोग्राम के संकलन के पहले उस फंक्शन से संबंधित कोड को आपके प्रोग्राम में ठीक स्थान पर लगा देता है, और उसके बाद आपके प्रोग्राम का संकलन होता है और .obj और .exe फाइलें बनती हैं।

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

#include "jaihindi.h"

वाला पूर्व-संकलक निर्देश (preprocessor directive)जोड़ कर इन फंक्शनों को सीधे आह्वान कर सकते हैं, और उनका कोड उन्हें दुबारा लिखना नहीं पड़ता।

इस तरह के हेडर फाइलों को प्रयोक्ता-परिभाषित हेडर फाइल (user0defined header file) कहा जाता है

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

आम तौर पर सी की मूल हेडर फ़ाईल अलग निर्देशिका में होती है और उन्हें हम < > से घेरते हैं, जबकि प्रयोक्त्ता-परिभाषित हेडर फ़ाईल वहाँ रखी जाती है जहाँ प्रोग्राम होता है और इसे " " से घेरा जाता है।
#include वाले पूर्वसंकलक उक्ति के बारे में कुछ और महत्वपूर्ण बातें।

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

abcddx #include ......

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

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

math.h
इसमें वर्गमूल निकालने, किसी संख्या का घात (power or exponent) निकालने, किसी कोण का साइन (sin), कोसाइन (cos), टेंजेंट (tan), कोटेंजेंट(cot) आदि निकालने, इत्यादि के फंक्शनों के प्रोटो-टाइप रहते हैं।
conio.h
यह भी stdio.h के समान है और इसमें भी इनपुट-आउटपुट को बेहतर रूप देने से संबंधित फंक्शनों के प्रोटोटाइप रहते हैं। इस हेडर के फंक्शनों का उपयोगमूल रूप से सजावटी है, और यह ANSI/ISO Standard में शामिल नहीं है। टर्बो सी की दुनिया में बहुत उपयोग की जाती है।

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

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

ABHAY
06-01-2011, 01:52 PM
मेरे को जितना आता था पोस्ट कर दिया शुक्रिया