# तकनीकी मंच > कंप्यूटर (संगणक) > प्रोग्रामिंग लेंग्वेज >  "सी" प्रोग्रामण भाषा

## anoopverma

क्या आप सब "सी" प्रोग्रामण भाषा सिखना चाहेंगे?

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

*आप "सी++" और "जावा" भी चुन सकते हैं, पर अगर आप नये हैं तो मेरी सलाह "सी" सीखने की है।*

----------


## anoopverma

C भाषा को १९७२ के आस-पास डेनिस रिची, जो AT&T (American Telephone and Telegraph) की बेल लैब में काम करते थे, ने विकसित किया और एक बार जब यह प्रोग्रामरों के हाथ लगा तो जैसे कंप्युटिंग की दुनिया हीं बदल गई। तब से ले कर आज तक C भाषा या इसके परिवार के हीं किसी प्रोग्रामिंग भाषा ने कंप्युटिंग की दुनिया पर राज किया है। C परिवार की अन्य भाषाओं में हम निम्न भाषाओं का नाम ले सकते हैं - C++, Java, C# (सी शार्प).।

----------


## anoopverma

C भाषा का विकास, युनिक्स औपरेटिंग सिस्टम के साथ जुड़ा हुआ है और इनके विकास की कहानी भी कम रोचक नहीं है। साठ के दशक में जब बड़े कम्प्युटरों (मेन फ़्रेम और मिनी) का बोलबाला था तब हर कम्प्युटर के साथ उसके लिए विशेष तौर से विकसित औपरेटिंग सिस्टम और अन्य प्रोग्राम बनाए जाते थे। यानि तब की बात आज की तरह नहीं थी, कि कंप्युटर कोई भी हो औपरेटिंग सिस्टम विंडो ही होगा (७५%+)। तब हर कंप्युटर के साथ अलग औपरेटिंग सिस्टम और अलग प्रोग्रामों की श्रृंखला... यानि कंप्युटिंग पर महारत हासिल करना आसान न था और बहुत कुछ सिखना होता था।

----------


## anoopverma

तब एक विचार आया कि क्यों न एक ऐसा औपरेटिंग सिस्टम बनाया जाए जो कई तरह के मशीनों पर चले, और इसी विचार ने 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) में बनाए जाते थे।

----------


## anoopverma

उपर्युक्त प्रोग्रामिंग भाषा की कमी ने केन थौमसन (बेल लैब के इंजीनीयर, जो मल्टिक्स प्रोजेक्ट का हिस्सा थे) को एक नई किस्म की प्रोग्रामिंग भाषा को विकसित करने की प्रेरणा दी (यह भाषा 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 नाम की भी एक प्रोग्रामिंग भाषा है)

----------


## anoopverma

रिची के इस C जो एक ३G प्रोग्रामिंग भाषा है, में जब ओपरेटिंग सिस्टम लिखा गया तो इसका नाम हुआ UNIX, इसके बाद Unix और C की जुगलबंदी ने कंप्युटिंग की दुनिया हीं बदल दी और आज कंप्युटर कई रुपों में हमारे चारो तरफ़ मौजुद है। कहते हैं कि जिस रफ़्तार से कंप्युटिंग का विकास हुआ, अगर यही रफ़तार औटोमोबाईल की दुनिया में होता तो आज रोल्स-रायस आकार और कीमत में माचिस की डिब्बी की तरह होता...........

----------


## anoopverma

यह था "सी" का एक संक्षिप्त परिचय। सन २००० में "केन थौम्सन" को "सदी का टेक्नोक्रैट" (Technocrat of the Millenium) घोषित किया गया क्योंकि इनकी खोज ने ग्यान-विग्यान के कई धाराओं पर अपनी छाप छोड़ी (क्या आज आप कोई ऐसा क्षेत्र बता सकते हैं जिस पर कंप्युटिन्ग ने अपना असर नहीं दिखाया?)

----------


## anoopverma

अब आपके प्रतिक्रिया का इंतजार है....:salut:
आगे के चित्र में रिची (दाहिने) और थौम्सन (बाँए) दिख रहे हैं

अगली तस्वीर में दोंनो फ़िर साथ हैं, राष्ट्रपति क्लिन्टन से १९९९ में नेशनल मेडल लेते हुए

----------


## jaysingh

आप जारी रखें,

----------


## Prince of India

बहुत अच्छी जानकारी है.... जारी रखें...

----------


## Dark Rider

जी दिल और दिमाग दोनों को अच्छा लगा समझाने का  करने का तरीका भी लाजवाब है आशा करता हू यह सूत्र महान उपलब्धिया  हासिल करे

----------


## preetbhatt.007

मैं इस सूत्र का इंतजार कर रहा था

----------


## sushilnkt

Dil tham ka batho अभी एक इमर्जेन्सी आ गई है

----------


## anoopverma

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

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

----------


## anoopverma

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

----------


## anoopverma

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

----------


## anoopverma

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

----------


## anoopverma

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

यहाँ यह बता दूँ, इन उच्च स्तर की भाषा (हाई-लेवेल लैंग्वेज) में सबसे पहले विकसित "फ़ोर्ट्रान" है...

----------


## anoopverma

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

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

----------


## anoopverma

इसी संदर्भ में पास्कल, सी आदि अधिक पूर्ण एवं शक्तिशाली उच्च-स्तरीय भाषाओं का विकास हुआ। इनमें प्रोग्राम के बहाव को नियंत्रित करने के लिए अनेक उपाय हैं। सी इन सभी भाषाओं में से सर्वाधिक उन्नत है, क्योंकि वह प्रोग्राम-लेखक को कंप्यूटर को यंत्र-स्तर पर नियंत्रित करने की क्षमता भी देती है और इस स्तर पर यह पुरानी पीढ़ी की भाषा ऐसेंब्ली के ज्यादा करीब है। इसी विशेषता के कारण पिछले कुछ दशकों में सी भाषा सर्वाधिक उपयोग में लाई जाने वाली भाषा बन गई थी। (आज भी यह अपने बदले हुए रूप में, जावा के रूप में विश्व की अग्रणी प्रोग्रामिंग की भाषा बनी हुई है)
यहाँ यह बता दूँ, इन उच्च स्तर की भाषा (हाई-लेवेल लैंग्वेज) में सबसे पहले विकसित "पास्कल" है, जिसे निकोलस विर्थ ने बनाया था, जो सौफ़टवेयर की दुनिया में ऐलगोरिथ्म (Algorithm) के विकास के लिए सब्से सम्माननीय दो नामों में से एक हैं। (दुसरे हैं डोनाल्ड नूथ, Donald Knuth जिनकी साठ के दशक में लिखी गई पुस्तकें आज भी दुनिया के विश्वविद्यालयों में एक संदर्भ ग्रंथ का दर्जा पाई हुई हैं)

----------


## anoopverma

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

----------


## anoopverma

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

----------


## nitin

*अभीतक की मिली जानकारी कभी ज्ञान वर्धक है , आगे भी इसी तरह सूत्र बढ़ाये, आपके सूत्र को रोज हमारी भेट रहेगी*

----------


## sanjeetspice

kosis jari rekhe dost kafi accha likha h or batie c ke bare me

----------


## levaly heros

दोस्त जल्दी करे  मुझे भी इंतजार है,

----------


## anoopverma

"प्रविष्टि संपादित करें" को क्लीक करने पर मुझे अगले विन्डो में HTML tags के साथ मेरा पोस्ट दिखता है और मैं space नहीं डाल पा रहा। क्या आप में से कोई मदद कर सकता है?

----------


## anoopverma

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

----------


## anoopverma

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

----------


## anoopverma

क्या आपको मेरी पिछली पोस्ट या यह पोस्ट सही दिख रही है?

----------


## anoopverma

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

----------


## anoopverma

मैं आगे भेज रहा हूँ।

----------


## anoopverma

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

----------


## anoopverma

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

----------


## anoopverma

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

----------


## anoopverma

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

----------


## anoopverma

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

----------


## anoopverma

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

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

----------


## anoopverma

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

----------


## anoopverma

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

----------


## anoopverma

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

----------


## anoopverma

लिनक्स की दुनिया में जब आप सी के प्रोग्राम को संकलित करेंगे तो एक फ़ाईल बनेगी a.out नाम से। आपको इस फ़ाईल को चलाना होगा अपने प्रोग्राम की आउटपुट को देखने के लिए।

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

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

----------


## anoopverma

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

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

----------


## anoopverma

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

/*Namaskar shabd ko screen par chapnewala program*/

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

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

Namaskar.

अंकित करेगा।

----------


## anoopverma

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

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

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

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

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

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

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

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

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

----------


## anoopverma

*आगे के पोस्टों में हम बारी-बारी से इन्हीं विशेषताओं के बारे में समझेंगे, अभी मुझे अब विदा लेने दें और बताएँ कि आपको यह सब कैसा लगा*?

----------


## anoopverma

> *अभीतक की मिली जानकारी कभी ज्ञान वर्धक है , आगे भी इसी तरह सूत्र बढ़ाये, आपके सूत्र को रोज हमारी भेट रहेगी*





> kosis jari rekhe dost kafi accha likha h or batie c ke bare me





> दोस्त जल्दी करे  मुझे भी इंतजार है,


दोस्तों आप सब मुझे बताएँ कि क्या अब मेरे पोस्ट ठीक हैं? और नीतिन जी, आशा है कि आप मुझसे आगे भी मिलतए रहेंगे

----------


## srtjoon

बहुत हीं बढ़िया सुत्र है...हिन्दी में समझाने के लिए शुक्रिया। आपके आगे के पोस्ट का इंतजार है। अब सब सही दिख रहा है। आशा है आपको भी अब कोई परेशानी नहीं है।

----------


## Prince of India

सचमुच कमाल का सुत्र है मित्र, दिल से निकली रेपुटेशन कबूल करें....

----------


## anoopverma

*आप सबका धन्यवाद।*

----------


## anoopverma

*अब आगे चलते हैं।*

----------


## anoopverma

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

----------


## anoopverma

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

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

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

----------


## anoopverma

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

----------


## anoopverma

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

----------


## anoopverma

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

----------


## anoopverma

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

----------


## anoopverma

सी प्रोग्राम की विशेषता - २, ३
---------------------------------
# include < stdio.h >

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

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

----------


## anoopverma

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

----------


## anoopverma

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

----------


## anoopverma

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

----------


## anoopverma

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

----------


## anoopverma

लाईब्रेरी रखने की यह सोच हीं सी भाषा को इतना स्मृद्ध बनाती है। मूल भाषा में शब्द तो कम हैं पर सी की लाईब्रेरी बहुत बड़ी है, और हमें जब जैसा काम करना होता है, हम वैसी हीं लाईब्रेरी को #include के द्वारा अपने प्रोग्राम का हिस्सा बना लेते हैं। जैसे, अगर हमें गणित संबंधी काम करना हो, तो math.h का प्रयोग करते हैं, अगर ग्राफिक्स का काम करना हो, तो graphics.h का। सी की लाईब्रेरी विशाल है और इस विशाल लाईब्रेरी का प्रयोग करके हम भी नई लाईब्रेरी बना सकते हैं (जब हमें सी में कुछ हद तक महारत हासिल हो जाए तब)। इस प्रकार सी का जानकार, लगातार सी भाषा को नई लाईब्रेरी के साथ और ज्यादा समृद्ध बनाता रहता है। सी का संकलक बनाने वाली कंपनियाँ भी यही करती रहती हैं। इससे मूल सी भाषा में बदलाव नहीं होता और भाषा ज्यादा उपयोगी और समृद्ध बन जाती है

----------


## anoopverma

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

#include "stdio.h"

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

#include "jaihindi.h"

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

----------


## anoopverma

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

----------


## anoopverma

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

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

abcddx #include ......

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

#include "stdio.h";

----------


## anoopverma

*　*
*दोस्तों, अब तक मैंने जितना संभव हुआ लिखा। अब आप किसी सी कंपाईलर/संकलक को कौसे प्रयोग करते हैं किसी जानकार से सीख लें।* 

*मैं आज शनिवार (१२/२/२०११) से ले कर बुधवार (१६/०२/२०११) तक एक जरूरी काम से शहर से बाहर जा रहा हूँ। इसलिए अब अगला पोस्ट मैं बुधवार की रात या गुरूवार को दुँगा। आशा है, आप मुझे क्षमा करेंगे, और इस छुट्टी पर जाने की अनुमति भी देंगे।*

*शुभ रात्रि...शुभ विदा।*

----------


## yesh_cool

आप बहुत ही उपयोगी सूत्र बनाया हे में सच में ऐसे सूत्र का इंतज़ार कर रहा था आप का बहुत बहुत धन्यवाद

----------


## srtjoon

*अति उत्तम सुत्र है। बहुपयोगी...आपके अपडेट का इंतजार है।*

----------


## anoopverma

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

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

*conio.h*
यह भी stdio.h  के समान है और इसमें भी इनपुट-आउटपुट को बेहतर रूप देने से संबंधित फंक्शनों के प्रोटोटाइप रहते हैं। इस हेडर के फंक्शनों का उपयोग मूल रूप से सजावटी है,  और यह ANSI/ISO Standard में शामिल नहीं है। टर्बो सी की दुनिया में बहुत उपयोग की जाती है।

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

आगे जब जरुरत होगी नए-नए हेडर फ़ाईलों की चर्चा जरुर करुँगा...

----------


## anoopverma

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

----------


## anoopverma

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

----------


## anoopverma

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

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

----------


## yesh_cool

बहुत अच्छा दोस्त जरी रखो थैंक्स

----------


## srtjoon

बहुत अच्छी तरह से समझाया है आपने। आगे भी ऐसे हीं समझा कर बताएँ। धन्यवाद।

----------


## anoopverma

दोस्तों मेरे नेट कनेक्शन में कुछ प्रोबलम था सो थोड़ा देर हो गया

----------


## anoopverma

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

int calculate (char);

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

----------


## anoopverma

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

----------


## anoopverma

सी प्रोग्राम की विशेषता - ४
-------------------------------
void main ()

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

----------


## anoopverma

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

----------


## anoopverma

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

Functions are actually sub-programs, with their own variables and executable statements.
The data which is required to perform the tast is given within braces i.e. ( ) and the the type of data which it will return, is written as the first word during function declaration or function proto-typing.

----------


## anoopverma

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


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

----------


## anoopverma

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

----------


## anoopverma

उपर के उदाहरण से अगर तुलना करें तो आप main(  ) फ़ंकशन हैं, बढ़ई, मिस्त्री, नलसाज आदि सी प्रोग्राम के विभिन्न फ़ंकशन हैं और आप यानि main (  ) सब फ़ंकशन में खास है। घर बनाना ही वो टास्क है जिसके लिए प्रोग्राम लिखा गया है बल्कि अगर कहें तो, सी का प्रोग्राम हीं main(  ) फ़ंकशन के साथ शुरु होता है और इस फ़ंकशन के खत्म होने के बाद खत्म।


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

----------


## anoopverma

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

----------


## anoopverma

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

----------


## anoopverma

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

----------


## anoopverma

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

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

----------


## anoopverma

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

----------


## anoopverma

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

----------


## anoopverma

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

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

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

----------


## anoopverma

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

----------


## anoopverma

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

----------


## anoopverma

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

यह जानकारी जरूरी है क्योंकि,  जैसा कि हम आगे सीखेंगे,  सी में राशियां कई प्रकार की हो सकती हैं।

----------


## anoopverma

दोस्तों अब आगे अगले दिन....तब तक के लिए शुभ विदा।

----------


## yesh_cool

अनुपजी बहुत बढ़िया समजाते हे आप महेरबानी करके आप हमें कुछ बुक्स के नाम भी दे जो हम साथमे रिफर कर सके आपका धन्यावाद

----------


## anoopverma

> अनुपजी बहुत बढ़िया समजाते हे आप महेरबानी करके आप हमें कुछ बुक्स के नाम भी दे जो हम साथमे रिफर कर सके आपका धन्यावाद


पुस्तकें कई हैं, पर हिन्दी में कोई है...मुझे नहीं पता। हाँ, अगर आप अंग्रेजी में कोई किताब साथ में रखना चाहें तो सबसे आसानी से आपको "Let us C" मिल जाएगी, यशवन्त कनितकर की लिखी हुई। वैसे सी को बेहतर ढ़ग से सीखने के लिए आप "Schaum series - "Programming with C by Gottfried" या "The C Programming Language by Kernighan & Ritchie" देख सकते हैं। अंतिम पुस्तक सी के जन्मदाता की लिखी हुई है, तो आप समझ सकते हैं कि उसका स्तर क्या होगा। वैसे तीनों किताबों का नाम मैंने बिल्कुल कठिनाई के स्तर के हिसाब से क्रम में ले रहा हूँ।

----------


## anoopverma

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

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

----------


## anoopverma

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

----------


## anoopverma

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

----------


## anoopverma

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

----------


## anoopverma

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

----------


## anoopverma

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

तरीका-1.

/*Namaskar shabd ko screen par chapnewala program*/


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

तरीका-2.
#include <stdio.h>

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

तरीका-3.
#include <stdio.h>


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


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

----------


## anoopverma

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

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

----------


## anoopverma

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

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

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

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

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

}

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

----------


## anoopverma

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

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

----------


## anoopverma

*इसके आगे अब अगली बार...आशा है आपको अभी तक का लेखन पसन्द आया है। आपको अगर "सी" से संबंधित कोई बात समझने में अगर कठिनाई है तो बेझिझक पूछें*।

----------


## anoopverma

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

----------


## anoopverma

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

printf("Namaskar.");

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

----------


## anoopverma

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

----------


## anoopverma

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

----------


## anoopverma

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

----------


## anoopverma

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

----------


## anoopverma

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

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

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

----------


## anoopverma

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

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

x = 10;

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

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

----------


## anoopverma

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


*In C, "=" means assignment, not equality.*

----------


## anoopverma

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

#define adhiktamman 100

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

----------


## anoopverma

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

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

#define adhiktamman = 100

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

----------


## anoopverma

एक और बात, चर राशियों को परिभाषित करते समय उसके डॆटा टाईप को भी लिखा जाता है, पर अचर राशि को जब हम ऊपर बताए गए तरीके से लिखते हैं तब हम उसके डॆटा टाईप को नहीं लिख रहे। यह बात अच्छे सी के प्रोग्रामर को कचोटती है, और इसीलिए जब सी का अंतराष्ट्रीय मानक बनाया गया तो इस कमी को दूर किया गया एक नए की-वर्ड (const) के जरिए। इस const जो कि constant का ही संक्षिप्त रूप है का प्रयोग करके अगर हम उपरोक्त define वाला काम करना चाहें तब हम इसे ऐसे लिखेंगे:
const int adhiktam = 100;

ध्यान रहे कि इस बार अर्ध-विराम ( ; ) का प्रयोग हुआ है। और याद रहें कि जब आप const के साथ चर राशि को परिभाषित कर रहे हैं तो उसी समय उसमें अपने जरुरत के हिसाब से एक सही मान उस राशि को देना आवश्यक है वर्ना फ़िर बाद में आप उसे कोई मान आरोपित नहीं कर पाएँगे।

----------


## anoopverma

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

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

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

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

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

----------


## anoopverma

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

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

----------


## anoopverma

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

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

----------


## anoopverma

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 ये अमान्य नाम हैं, क्योंकि ये सब सी के आरक्षित शब्द हैं।

----------


## marwariladka

C प्रोग्रम्मिंग के सम्बन्ध में कोई प्रश्न हो तो में भी इस सूत्र में अपना योगदान दे सकता हूँ.....

याद रखें C  प्रोग्रम्मिंग में किसी भी variable का नाम किसी नंबर से सुरु नहीं हो सकता
उदहारण :123variable  एक अमान्य variable  होगा..जब की xyz zabc आदि मान्य variable  हैं

----------


## anoopverma

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

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

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

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

----------


## marwariladka

अति उत्तम सूत्र है मित्र...reputation  स्वीकार करें..

----------


## anoopverma

> C प्रोग्रम्मिंग के सम्बन्ध में कोई प्रश्न हो तो में भी इस सूत्र में अपना योगदान दे सकता हूँ.....
> 
> याद रखें C  प्रोग्रम्मिंग में किसी भी variable का नाम किसी नंबर से सुरु नहीं हो सकता
> उदहारण :123variable  एक अमान्य variable  होगा..जब की xyz zabc आदि मान्य variable  हैं


धन्यवाद दोस्त....आपका इस सुत्र में स्वागत है। आप ने जो पोस्ट किया संयोग से वो मेरा अगला पोस्ट बनने वाला था। आशा है आप इस सुत्र पर नजर रखेंगे और अगर कोई प्रश्न हो तो आप उसका जवाब देंगे। हाँ अगर मेरे से कुछ छुट जाए तो आप जरुर अपनी जानकारी हम सब से बाँटेंगे।

----------


## marwariladka

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


 जरुर मित्र.....किसी भी प्रश्न का उत्तर देने के लिए यथा संभव कोशिश करूँगा...

----------


## anoopverma

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

*प्रकार           * *सूचकशब्द           * *विस्तार           * *उदाहरण                                                                        * 

वर्ण                  char                     8 bits               a, b, A, 1, &, %, 9, >, ?

पूर्णांक               int                      16 bits               4, 9, 80, 789

दीर्घपूर्णांक          long                    32 bits               1000000, 786589, 870987

दशमलव            float                    32 bits               8.5, 89.098, 12.000000

----------


## srtjoon

अपडेट देखे काफ़ी समय हो गया।

----------


## anoopverma

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

उदाहरण:

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  बिट की स्मृति आरक्षित कर देगा।

----------


## anoopverma

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

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

----------


## anoopverma

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

----------


## anoopverma

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

----------


## anoopverma

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

----------


## anoopverma

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

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

उदाहरण:
10 + 3 = 13
10 - 3 = 7
10 * 3 = 30
10 / 3 = 3
10 % 3 = 1
10 को 3 से विभाजित करने पर 1 शेष रहता है। अतः, माड्युलस प्रचालक 1 का मान देता है।

----------


## anoopverma

पर १०.० / ३ या १० / ३.० आपको ३.३३३.... का मान देगा क्योंकि १० एक पूर्ण संख्या है जबकि १०.० एक दशमलब संख्या। इस बात को जरा एक बार और पढ़ कर समझ लें।

----------


## anoopverma

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

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

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

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

----------


## anoopverma

*&& प्रचालक AND Operator*

संकार्य 1	संकार्य 2	संकार्य 1 && संकार्य 2	
      0	       0	          0	   
      0	       1	          0	   
      1	       0	          0	   
      1	       1	          1

----------


## anoopverma

|| प्रचालक OR Operator

संकार्य 1	संकार्य 2	संकार्य 1 || संकार्य 2	   
0	1	1	   
1	0	1	   
0	0	0	   
1	1	1

----------


## anoopverma

! प्रचालक NOT Operator

संकार्य 1	! संकार्य 1	   
1	0	   
0	1	 

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

----------


## anoopverma

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


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

----------


## anoopverma

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

उदाहरण:

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

----------


## anoopverma

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

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

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

----------


## anoopverma

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

----------


## hip hopper

*गजब वर्मा जी ये बहुत ही अच्छा सूत्र है कृपया इसे बीच मे मत छोड़ना बहुत ही मजा आ रहा है c को सीखने में, आपका बहुत बहुत धन्यबाद*

----------


## chatur . ramlingam

*bahut bahut धन्यवाद कृपया इसे पूरा जरुर करना आप और हो सके तो इसके बाद सी प्लस प्लस इ जानकारी  भी इसी सूत्र में डालियेगा*

----------


## Keshav Singh

मित्र आपका ये सूत्र तो बहुत ही ज्ञानवर्धक है ... मित्र कृपया आप सूत्र की निरंतरता को बनाये रखियेगा ... जिससे की हम जैसो का जिन्हें C भाषा का ज्ञान नहीं है ज्ञान प्राप्त हो जायेगा ... वो भी इतनी सरल भाषा में ....

----------


## Keshav Singh

अध्यापक महोदय कहा है आप ? 

विद्यार्थी गण आपकी राह देख रहे है .......

----------


## anoopverma

माफ़ी चाहता हूँ दोस्तों, कुछ काम से व्यस्त हो गया था और इस सुत्र को बढ़ा न सका। पिछले दिनों एक प्रोजेक्ट हीं ऐसा आ गया था। आशा है कि अब इस सुत्र को मैं गति देने में कामयाब हो जाऊँगा।

----------


## anoopverma

इस बार श्री गणेश का नाम ले कर शुरु करता हूँ।
॥श्री गणेशाय नमः॥

----------


## anoopverma

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

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

----------


## anoopverma

*6. ++ और -- प्रचालक (Increment and Decrement operator)*
इन्हें क्रमश: इंक्रिमेंट प्रचालक और डिक्रिमेंट प्रचालक कहा जाता है। इंक्रिमेंट प्रचालक किसी चर राशि के मान को 1 से बढ़ा देता है और डिक्रिमेंट प्रचालक किसी चर राशि के मान को 1 से कम कर देता है।

उदाहरण:

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


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

----------


## anoopverma

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

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

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

----------


## anoopverma

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

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

----------


## anoopverma

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

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

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

----------


## anoopverma

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

(10 + 5) * 2
अगर कोष्टक न हो तो कंप्यूटर पहले गुणा करेगा फ़िर जोड़, यानि उत्तर २० होगा

----------


## anoopverma

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

----------


## marwariladka

भाई एक सुझाव है..कृपया जरा आसान भाषा का प्रयोग करें ताकि अधिक से अधिक लोग इस सूत्र पर आ कर अपना ज्ञान बाधा पायें..
मसलन अगर आप कोष्टक लिखोगे तो कोई नहीं समझेगा..यहाँ पर आपको brackets लिख देना चाहिए...
आगे आपकी इच्छा मित्र..


> मान लीजिए कि उपर्युक्त उदाहरण में आप 10 और 5 को पहले जोड़ना चाहते हैं और तत्पश्चात उनके योग को 2 से गुणन करना चाहते हैं। इसके लिए आप व्यंजक को इस प्रकार से लिखेंगे:
> 
> (10 + 5) * 2
> अगर कोष्टक न हो तो कंप्यूटर पहले गुणा करेगा फ़िर जोड़, यानि उत्तर २० होगा

----------


## anoopverma

> भाई एक सुझाव है..कृपया जरा आसान भाषा का प्रयोग करें ताकि अधिक से अधिक लोग इस सूत्र पर आ कर अपना ज्ञान बाधा पायें..
> मसलन अगर आप कोष्टक लिखोगे तो कोई नहीं समझेगा..यहाँ पर आपको brackets लिख देना चाहिए...
> आगे आपकी इच्छा मित्र..


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

----------


## marwariladka

धन्यवाद् मित्र...आशा करता हूँ आप जल्द ही अपना ज्ञान सभी सदस्यों में बाँटेंगे...


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

----------


## anoopverma

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

10 + 4 - 21 * 6 / 7

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

14 - 21 * 6 / 7

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

14 - 126 / 7 

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

14 - 18

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

-4

----------


## anoopverma

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

*सी++ में तो कई सारे और भी मिल जाएँगे ;-)*

----------


## anoopverma

*आज के लिए बस इतना हीं....इतने दिनों बाद पुनः इसे शुरु कर रहा हूँ, उम्मीद है आपको जो तकलीफ़ परेशानी हुई उसके लिए आप मुझे माफ़ करेंगे।*

----------


## Black Pearl

> *आज के लिए बस इतना हीं....इतने दिनों बाद पुनः इसे शुरु कर रहा हूँ, उम्मीद है आपको जो तकलीफ़ परेशानी हुई उसके लिए आप मुझे माफ़ करेंगे।*


अरे यार कम से कम सुरू तो कर रहे हो वही बहुत है, मैंने आज से ही इसे सीखनेका प्रोग्राम बनाया था और आपका सूत्र नजर आ गया। ++

----------


## sanjchou

*सुत्र पुनः शुरु करने के लिए बधाई, हम ओ समझ रहे थे कि इस सुत्र का भी वही हुआ जो अन्य कई बेहतरीन सुत्रों का होता आया है। अब जल्दी-जल्दी और नियमित रूप से इसे आगे बढ़ाएँ, धन्यवाद।*

----------


## anoopverma

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

----------


## anoopverma

प्रोग्राम-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.

----------


## anoopverma

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

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

----------


## anoopverma

*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() को उसके कोष्ठक में दुहरे उद्धरण चिह्नों के आगे लिखे गए चर राशि के नाम से पता चलता है।

----------


## anoopverma

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

----------


## anoopverma

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

----------


## anoopverma

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

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



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



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

----------


## anoopverma

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.

----------


## anoopverma

इस बार प्रोग्राम में दो राशियां घोषित की गई हैं: 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.

----------


## anoopverma

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

--------------------------
प्रोग्राम 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 लिखा है), कंप्यूटर ने इन स्थानों को शून्य से भर दिया है।

----------


## anoopverma

मुझे उम्मीद है कि इन उदाहरणों से printf( ) से आपकी कुछ दोस्ती हो गई होगी। आप एक बार और इन उदाहरणों को देख कर समझ लें। अब इसके बाद मैं printf( ) के भाई scanf( ) से आपका पतिचय कराऊँगा। पहला output लेने के लिए सबसे उपयोगी फ़ंकशन है तो दूसरा input देने के लिए सबसे उपयोगी फ़ंकशन। बिना इन दोनों का पूर्ण परिचय हुए आप कोई ढ़ंग का काम नहीं कर पाएँगे प्रोग्रामिंग की दुनिया में, क्योंकि input/output तो प्रोग्रामिंग की दुनिया का सबसे आधारभूत कार्य है।

आगे अब अगले दिन पोस्ट करुँगा।:clap:

----------


## srtjoon

बहुत बढ़िया सुत्र है, आगे बढ़ाएँ:clap::clap::clap:

----------


## anoopverma

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

----------


## anoopverma

प्रोग्राम 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.
---------------------

----------


## anoopverma

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

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

----------


## anoopverma

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

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

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

----------


## anoopverma

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

----------


## anoopverma

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

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

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

----------


## anoopverma

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.

----------


## anoopverma

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

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

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

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

----------


## anoopverma

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

----------


## anoopverma

*आज के बस इतना हीं, आशा है आपको अब तक का पोस्ट पसन्द आया है, कोई समस्या हो तो बताएँ।*

----------


## devvrat

*c , c +, c ++, java, html , javastrip  इत्यादि सभी प्रोग्रामिग भाषाए कंप्यूटर के युग की जरुरी भाषाए है| अगर आप इस सूत्र के माध्यम से अपने सूत्र मित्रो को यह सब सिखाने का प्रयास करेंगे तो आपके मित्रो पर यह बहुत बड़ा उपकार होगा| 
हम सब आपका सादर इंतज़ार कर रहे है|* :Globe:  :bloom:

----------


## anoopverma

> *c , c +, c ++, java, html , javastrip  इत्यादि सभी प्रोग्रामिग भाषाए कंप्यूटर के युग की जरुरी भाषाए है| अगर आप इस सूत्र के माध्यम से अपने सूत्र मित्रो को यह सब सिखाने का प्रयास करेंगे तो आपके मित्रो पर यह बहुत बड़ा उपकार होगा| 
> हम सब आपका सादर इंतज़ार कर रहे है|*


मित्र C+ नाम की कोई भाषा मेरी जानकारी में नहीं है। हाँ मुझे C, C++, जावा को कुछ हद तक समझता हूँ और मेरी कोशिश होगी कि मैं उसको सरल भाषा में आप सब को भी कुछ हद तक समझा दूँ। आप सुत्र पर आते रहिए और अगर मेरे पोस्ट में कुछ बात न समझ में आए तो बेफ़िक्र उसके बारे में मुझसे चर्चा कीजिए।

----------


## anoopverma

*अब आगे...............*

----------


## anoopverma

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

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

----------


## anoopverma

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

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

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

----------


## anoopverma

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

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

----------


## anoopverma

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

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

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

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

Kripaya apna naam batayiye: Anoop
Abhinandan, Anoop ji.

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

----------


## anoopverma

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

----------


## mantu007

*बहुत अच्छा मित्र !  आगे भी पोस्ट करते रहो ..........
अभी तुम बेसिक बतावो..अडवांस क में मैं तुम्हारी मदद करूँगा 
एक छोटे से प्रोग्राम से लेकर एक प्रोजेक्ट बनाना ..........*

----------


## anoopverma

> *बहुत अच्छा मित्र !  आगे भी पोस्ट करते रहो ..........
> अभी तुम बेसिक बतावो..अडवांस क में मैं तुम्हारी मदद करूँगा 
> एक छोटे से प्रोग्राम से लेकर एक प्रोजेक्ट बनाना ..........*


आप जैसे सुधी पाठक की तरफ़ से मिलने वाला प्रोत्साहन खुशी प्रदान करता है। आशा है कि आपने अभी तक के मेरे पोस्टों को एक नजर पढ़ा होगा। आपसे सकारात्मक सहयओग की हमेशा अपेक्षा रहेगी।

----------


## anoopverma

*क्या आप में से किसी ने इस प्रश्न का उत्तर लिखने का प्रयास नहीं किया। खैर मैं आगे की बात बता रहा हूँ, उम्मीद है कि अगली बार जब मैं यहाँ आऊँगा तब शायद मुझे किसी का ईमानदार प्रयास यहाँ दिखेगा।
चलिए अब आगे बढ़ते हैं*

----------


## anoopverma

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

प्रोग्राम -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: Anoop
Abhinandan Anoop ji.
----------------------

----------


## anoopverma

इस प्रोग्राम के शुरू में पूर्वसंकलक के लिए दो उक्तियां हैं:-

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

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

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

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

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

----------


## anoopverma

सच तो यह है कि इन दोनों फ़ंकशन की आपको टर्बो सी++ के कंपाईलर में अक्सर जरुरत पड़ेगी, नहीं तो आपको आउटपुट देखने के लिए बार-बार Alt+F5 दबाना होगा ताकि वो स्क्रीन जिस पर आप प्रोग्राम लिख रहे थे (IDE, Integrated Development Environment का Editor) हटे ताकि आप अपना आऊटपुट देख सकें। अगर आप Linux पर प्रोग्राम लिख रहे होगें तब आपको कुछ दूसरा तरीका अपनाना होगा (मैं मान कर चल रहा हूँ कि आप Turbo C++ का प्रयोग कर रहे हैं, क्योकि यह सर्व-सुलभ है हमारे देश में)

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

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

----------


## anoopverma

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

char naam[20];

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

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

Abhinandan A ji.

----------


## anoopverma

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

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

----------


## Black Pearl

मित्र आज ही इसकी बुक भी download की है,आपकी शिकायत दूर करूंगा और कल से ही आपको प्रोग्राम बना के दिखाता हूँ। 

conio.h और clscr से मैं परिचित नहीं था।

----------


## anoopverma

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

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

----------


## The Master

> मित्र आज ही इसकी बुक भी download की है,आपकी शिकायत दूर करूंगा और कल से ही आपको प्रोग्राम बना के दिखाता हूँ। 
> 
> conio.h और clscr से मैं परिचित नहीं था।



तो चलो जी stdio और conio का मतलब(फ़ुल form) बताओ ?



:banana::banana::banana::banana:

----------


## The Master

मित्र अनुप जी आपका पुराने फ़ोरम पर का सुत्र भी अच्छा था और ये भी है ।

आपका बहोत बहोत आभार ।


:mango::banana::cherries::mango:

----------


## Black Pearl

> तो चलो जी stdio और conio का मतलब(फ़ुल form) बताओ ?
> 
> 
> 
> :banana::banana::banana::banana:


वैसे तो नहीं आता था, खोजबीन कर के पता लगाया है कि: 
conio.h = Consol Input/outpot और .h इसलिए लगाते हैं क्योंकि ये एक header फ़ाइल है। 

इसी तरह से 
stdio = standerd input/output

----------


## marwariladka

जब conio और stdio पे बात चल ही रही है तो यह भी बता दू के यह होते क्या है?
दर असल ये दोनों  header  files हैं...और इन header files में आप जो function इस्तेमाल करते हो (printf और scanf जैसे) उन सभी के codes लिखे होते हैं..इन header फिल्स को include किये बिना कोई भी c प्रोग्राम नहीं चल सकता...
कमसे कम आपको stdio तो include करनी ही पड़ती है ताकि standard I /O function जैसे के printf और scanf चल सके...
conio.h आपको clrscr और getch जैसे functions इस्तेमाल करने की आजादी देता है..
वैसे ही एक और HEADER फाइल है math.h ...इसके इस्तेमाल से आप mathematical functions जैसे के sum (),count () आदि इस्तेमाल कर पाएंगे...अनूप जी शायद जल्द ही इन सब के बारे में जानकारी देंगे...अगर आपके कोई सवाल हो तो मुझसे पूछ लीजिये में कोशिस करूँगा आपके सवालों के जवाब देने के लिए...


> वैसे तो नहीं आता था, खोजबीन कर के पता लगाया है कि: 
> conio.h = Consol Input/outpot और .h इसलिए लगाते हैं क्योंकि ये एक header फ़ाइल है। 
> 
> इसी तरह से 
> stdio = standerd input/output

----------


## KHIL@DI_720

*हिंदी फोरम पर C language -- बड़ा सराहनीय प्रयास है |*

----------


## The Master

> वैसे तो नहीं आता था, खोजबीन कर के पता लगाया है कि: 
> conio.h = Consol Input/outpot और .h इसलिए लगाते हैं क्योंकि ये एक header फ़ाइल है। 
> 
> इसी तरह से 
> stdio = standerd input/output





> जब conio और stdio पे बात चल ही रही है तो यह भी बता दू के यह होते क्या है?
> दर असल ये दोनों  header  files हैं...और इन header files में आप जो function इस्तेमाल करते हो (printf और scanf जैसे) उन सभी के codes लिखे होते हैं..इन header फिल्स को include किये बिना कोई भी c प्रोग्राम नहीं चल सकता...
> कमसे कम आपको stdio तो include करनी ही पड़ती है ताकि standard I /O function जैसे के printf और scanf चल सके...
> conio.h आपको clrscr और getch जैसे functions इस्तेमाल करने की आजादी देता है..
> वैसे ही एक और HEADER फाइल है math.h ...इसके इस्तेमाल से आप mathematical functions जैसे के sum (),count () आदि इस्तेमाल कर पाएंगे...अनूप जी शायद जल्द ही इन सब के बारे में जानकारी देंगे...अगर आपके कोई सवाल हो तो मुझसे पूछ लीजिये में कोशिस करूँगा आपके सवालों के जवाब देने के लिए...



मेरे सवाल पुछ्ने का मक्सद हि यही था , मैने देखा है कि लोग पुर्ण सी भाषा को सीख लेते है लेकिन ऎसी बाते नही पता होती है ।

आप दोनो का और अनुपजी का धन्यवाद ।

----------


## Black Pearl

> मेरे सवाल पुछ्ने का मक्सद हि यही था , मैने देखा है कि लोग पुर्ण सी भाषा को सीख लेते है लेकिन ऎसी बाते नही पता होती है ।
> 
> आप दोनो का और अनुपजी का धन्यवाद ।


बिलकुल सही मेरा एक मित्र bca कर रहा है और ये बात उसे पता नहीं थी।

----------


## imboss

*मै क्या कहू समज नहीं आता कब से सीखना चाहता था लेकिन अंग्रेजी की वजह से सीख नहीं पाता था लेकिन लगता है की आपकी वजह से मै भी सीख सकता हू | आपका जितना आभार व्यक्त करू उतना कम होगा 
धन्यवाद*

----------


## marwariladka

जरुर मित्र आप ही क्या सब कोई सिख सकते हैं..क्यों के मित्र भाषा कभी प्रतिबंधक नहीं बन सकती ज्ञान आरोहन करने के लिए...बस जरुरत है लगन की..



> *मै क्या कहू समज नहीं आता कब से सीखना चाहता था लेकिन अंग्रेजी की वजह से सीख नहीं पाता था लेकिन लगता है की आपकी वजह से मै भी सीख सकता हू | आपका जितना आभार व्यक्त करू उतना कम होगा 
> धन्यवाद*

----------


## anoopverma

> तो चलो जी stdio और conio का मतलब(फ़ुल form) बताओ ?
> 
> 
> 
> :banana::banana::banana::banana:


stdio का मतलब है standard input output और conio का मतलब है console input output. मेरे हिसाब से अभी इतना हीं जानना काफ़ी है। एक बार जब सी भाषा के ढ़ाचा का पूरा खाका जब दिमाग में खींच जाएगा तब फ़िर से एक एक बात का हम विश्लेषन कर कर कर सीखेंगें। तब ज्यादा मजा आएगा।

----------


## anoopverma

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

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

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

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

----------


## anoopverma

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

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

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

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

----------


## anoopverma

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

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

----------


## anoopverma

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

----------


## anoopverma

आइए एक छोटे प्रोग्राम के जरिए इसे समझते हैं। इस प्रोग्राम में आपसे पूछा जाता है कि रात है या दिन, और प्राप्त उत्तर के अनुसार 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("%c", &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.
-------------------------------

----------


## anoopverma

इस प्रोग्राम में खास रूप से 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.

----------


## anoopverma

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

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

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

----------


## anoopverma

आइए प्रोग्राम 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.
-------------------------------

----------


## anoopverma

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

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

----------


## anoopverma

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

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

प्रोग्राम – 10
--------------------------------
#include <stdio.h>
#include <conio.h>

void main()
{
clrscr();
int praptank;

printf("Batayiye, pariksha me kitne ank aaye: ");
scanf("%f", &praptank);

if(praptank >= 60)
{
printf("\nFirst Division.");
}

else if (praptank >=50)
{
printf("\nSecond Division.");
}
else if(praptank >=40)
{
printf("\nThird Division.");
}
else
{
printf("\nFail.");
}
getch();
}
-------------------------------


आउटपुट
-------------------------------
Batayiye, pariksha me kitne ank aaye: 65
First Division.
Batayiye, pariksha me kitne ank aaye: 54
Second Division.
Batayiye, pariksha me kitne ank aaye: 45
Third Division
Batayiye, pariksha me kitne ank aaye: 35
Fail.
-------------------------------

----------


## anoopverma

अब आपने सीख लिया है कि सी प्राग्रामों में if ... else संरचना की मदद से किस तरह विशाखन (conditional branching) को अंजाम दिया जाता है।

सी में विशाखन लाने के कुछ अन्य तरीके भी हैं, यथा ? प्रचालक और switch संरचना। इनमें से ? प्रचालक, जिसे सशर्त कथन (conditional statement) कहा जाता है, अधिक सरल है, और उसका विवेचन हम इस लेख में करेंगे। switch संरचना को ठीक से समझने के लिए continue, break और exit कथनों की थोड़ी जानकारी प्राप्त करना आवश्यक है। इन कथनों की जानकारी हम आवर्तन (Iteration) के बारे में सीखने के बाद प्राप्त करेंगे, और उसके बाद switch को भी समझेंगे।

----------


## anoopverma

? प्रचालक (Conditional operator) का रूप इस तरह होता है।

तार्किक कथन ? व्यंजक 1 : व्यंजक 2 ;
(condition) ? statement to execute when condition is true : statement to execute when condition is false ;

यानी, इसके तीन भाग होते हैं, जिन्हें ? और : द्वारा अलगाया हुआ होता है।

पहला भाग एक तार्किक व्यंजक होता है, जिसका मूल्यांकन पहले होता है और इसके परिणाम स्वरूप सही (1) या गलत (0) का मान प्राप्त होता है। तार्किक कथन के मूल्यांकन से यदि सही का मान आए, तो व्यंजक 1 में विद्यमान मान प्राप्त होता है, और यदि गलत का मान आए, तो व्यंजक 2 का मान होता है।

स्पष्ट ही सशर्त कथनों के प्रयोग से केवल दो विकल्पों को संभाला जा सकता है। दो से अधिक विकल्प होने पर if... else अथवा switch कथनों का सहारा लेना अनिवार्य हो जाता है।

----------


## srtjoon

बहुत अच्छा लिख रहे हैं अनुप जी आप। आशा है कि आप ऐसे हीं इस सुत्र को रोज थोड़ा-थोड़ा आगे बढ़ाएँगे।

----------


## marwariladka

मित्रो आप सभी से गुजारिश है के कोई भी सवाल हो तो निसंकोच हो कर पूछे...में भी अनूप जी का साथ दूंगा आपके सवालों का हल करने के लिए...

----------


## imboss

*आपने तो हमारे प्राचीन भारत के गुरुकुल की याद दिला दी जहा पर गुरूजी बिना किसी लोभ या लालच के शिष्यों को शिक्षा देते थे 

आपका प्रयास सराहनीय है गुरूजी*

----------


## sanjchou

> *आपने तो हमारे प्राचीन भारत के गुरुकुल की याद दिला दी जहा पर गुरूजी बिना किसी लोभ या लालच के शिष्यों को शिक्षा देते थे 
> 
> आपका प्रयास सराहनीय है गुरूजी*


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

----------


## anoopverma

> मित्रो आप सभी से गुजारिश है के कोई भी सवाल हो तो निसंकोच हो कर पूछे...में भी अनूप जी का साथ दूंगा आपके सवालों का हल करने के लिए...


सहयोग के लिए धन्यवाद दोस्त।

----------


## anoopverma

> *आपने तो हमारे प्राचीन भारत के गुरुकुल की याद दिला दी जहा पर गुरूजी बिना किसी लोभ या लालच के शिष्यों को शिक्षा देते थे 
> 
> आपका प्रयास सराहनीय है गुरूजी*


आप यहाँ आते रहिए, आपको मैं निराश नहीं करुँगा, जितना जानता हूँ सब बताऊँगा।

----------


## anoopverma

यार ये शनिवार और रविवार को पता नहीं बी.एस.एन.एल. का नेटवर्क क्यों खराब हो जाता है। बार-बार कनेक्शन ट्रीप कर रहा है। मैं परेशान हो गया हूँ, आगे सोमवार को भेजुँगा और इन दो दिनों की कस्र भी निकाल दुँगा।

----------


## anoopverma

आइए, सशर्त कथनों को एक प्रोग्राम के जरिए समझते हैं।

प्रोग्राम -11
-------------------------------
/* ? prachalak (conditonal statement) ka udaharan */

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

void main()
{
clrscr();

int praptank;
char parinaam;

printf("\nPariksha me kitne ank aaye: ");
scanf("%d", &praptank);

result = (praptank>=40) ? 'P' : 'F';

printf("\nParinaam: %c", result);

getch();
}
-------------------------------

आउटपुट
-------------------------------
Pariksha me kitne ank aaye: 56
Parinaam: P
Pariksha me kitne ank aaye: 34
Parinaam: F
-------------------------------

----------


## anoopverma

चलो यह तो पोस्ट हो गया, आगे देखते हैं

----------


## anoopverma

इस प्रोग्राम में दो राशियां घोषित की गई हैं, praptank जो int  प्रकार की राशि है, और parinaam जो char प्रकार की राशि है। scanf के जरिए praptank में प्राप्तांक का मान जमा किया जाता है।

इसके बाद की पंक्ति को ध्यान पूर्वक देखिए। आपकी सुविधा के लिए उसे यहां दुबारा दिया जा रहा है – 

result = (praptank>=40) ? 'P' : 'F';

इसमें ? प्रचालक का उपयोग किया गया है। क्या आप इस प्रचालक में विद्यमान तीन व्यंजकों को पहचान पाएं? वे हैं – 
1. (praptank>=40)
2. 'P'
3. 'F'

----------


## anoopverma

प्रोग्राम की यह पंक्ति इस तरह से काम करती है –

सबसे पहले praptank >= 40 का मूल्यांकन किया जाता है। यदि praptank 40 या उससे बड़ा हुआ, तो इस व्यंजनक को 1 का मान मिलता है, यानी यह व्यंजन सही ठहरता है। यदि praptank 40 से कम हुआ, तो इस व्यंजक को 0 का मान मिलता है, यानी यह व्यंजक गलत ठहरता है। यदि praptank >= 40 का मान 1 हो, तो result में P मान रख दिया जाता है। यदि praptank >= 40 का मान 0 हो, तो result में F मान रख दिया जाता है।

----------


## anoopverma

सशर्त कथन, यानी ? प्रचालक हमेशा कोई एक मान लौटाता है। यदि उसकी प्रथम उक्ति का मान 1 या TRUE है, तो वह ? के बाद वाला मान लौटाता है, और यदि प्रथम उक्ति का मान 0 या FALSE है, तो : के बाद वाला मान। इस मान को किसी राशि में पकड़ा जा सकता है। उपर्युक्त उदाहरण में इस मान को result राशि में पकड़ा गया है। इसके लिए = प्रचालक का प्रयोग किया है। यह अपने दाहिनी ओर के मान को (इस उदाहरण में सशर्त कथन द्वारा लौटाए गए मान को) अपने बाईं ओर की राशि में जमा करता है, जो यहां result है।

----------


## anoopverma

सशर्त कथन के बाद वाला prinft उक्ति result के मान को दर्शाता है।

सशर्त कथन सी की उन विरल उक्तियों में से एक है जिन्हें त्रिपक्षीय प्रचालक (ternary operator) कहा जाता है, यानी ये तीन राशियों पर काम करते हैं। =, &&, / आदि अधिकांश अन्य प्रचालकों में केवल दो पक्ष ही होते हैं, बायां पक्ष (lvalue) और दायां पक्ष (rvalue)। लेकिन सशर्त कथन में ? और : अलगाए हुए तीन पक्ष होते हैं।

----------


## imboss

धन्यवाद गुरूजी

----------


## anoopverma

प्रचालकों (Operators) की अगर बात करें तो -, &, ++, --  जैसे प्रचालक Unary operator; +, -, *, /, ==, आदि कई Binary operator ल्कहलाते हैं, जबकि ? : Ternary operator कहलाता है। असल में कोई प्रचालक किस किस्म का है यह इस बात पर निर्भर करता है कि उसको काम करने के लिए कितने व्यंजकों (Expression) की जरुरत पड़ती है।

----------


## anoopverma

कंप्यूटर की एक खासियत यह है कि वह निर्देशों के किसी खंड का निष्पादन अनेक बार कर सकता है। इसे संभव बनानेवाली संरचनाओं को लूपिंग संरचनाएं (looping construct or Iterative Statements) कहते हैं। सी में इस प्रकार की तीन संरचनाएं हैं - while, do... while, और for। इस लेख में हम केवल while लूप पर विचार करेंगे।

----------


## anoopverma

while लूप
while लूप का रूप इस प्रकार होता है:

while (तार्किक व्यंजक)
{
उक्तियां;
}

while शब्द के आगे के गोल कोष्ठकों में एक या अधिक तार्किक व्यंजक रहते हैं। इनका सम्मिलित मान प्रारंभ में 1 होता है। इसके बाद धनु कोष्ठकों के भीतर एक या अधिक उक्तियां होती हैं। उनमें से कोई एक उक्ति गोल कोष्ठक में मौजूद किसी राशि को परिवर्तित करनेवाली उक्ति होती है। कंप्यूटर इन उक्तियों का निष्पादन तब तक करता रहता है, जब तक कि while के गोल कोष्ठक के भीतर मौजूद तार्किक व्यंजक का मान 0 नहीं हो जाता। ध्यान रहे कि तार्किक व्यंजकों के केवल दो मान हो सकते हैं, 0 या 1।

----------


## anoopverma

नीचे के प्रोग्राम में while वलय का उपयोग करते हुए 10 पंक्तियां मुद्रित की जाती हैं। प्रत्येक पंक्ति में उस पंक्ति की क्रम-संख्या भी छपती है।

प्रोग्राम-12
---------------------------------
/*while loop ka udaharan */

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

void main()
{
clrscr();

int kram_sankhya=1;

while(kram_sankhya < 11)
{
printf("Yah pankti no. %d hai.\n", kram_sankhya);
kram_sankhya++;
}

getch();
}
---------------------------------

आउटपुट:
---------------------------------
Yah pankti no. 1 hai.
Yah pankti no. 2 hai.
Yah pankti no. 3 hai.
Yah pankti no. 4 hai.
Yah pankti no. 5 hai.
Yah pankti no. 6 hai.
Yah pankti no. 7 hai.
Yah pankti no. 8 hai.
Yah pankti no. 9 hai.
Yah pankti no. 10 hai.
---------------------------------

----------


## anoopverma

इस प्रोग्राम में सबसे पहले kram_sankhya नामक पूर्णांक राशि घोषित की गई है और उसे 1 का मान दिया गया है। तत्पश्चात while वलय शुरू होता है। उसके कोष्ठकों में एक तार्किक व्यंजक है, जो इस प्रकार है:

kram_sankya <11

इस तार्किक व्यंजक का मान 1 तब तक रहता है, जब तक kram_sankhya का मान 11 या उससे बड़ा नहीं हो जाता। फिलहाल उसका मान 1 है, क्योंकि हमने उसे प्रोग्राम के शुरू में यही मान दिया है। चूंकि यह मान 11 से कम है, उपर्युक्त तार्किक व्यंजन का मान भी 1 है।

इसके बाद धनु कोष्ठकों में वे उक्तियां हैं, जिन्हें बार-बार दुहराना है। हमारे इस छोटे से प्रोग्राम में ऐसी केवल दो उक्तियां ही हैं। पहली उक्ति में printf() का आह्वान है। यह एक संदेश के भीतर एक पूर्णांक राशि को छापता है। यह पूर्णांक राशि kram_sankhya है। शुरू में इसका मान 1 है, इसलिए printf() यह वाक्य छापता है:

Yah pankti no. 1 hai.

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

प्रोग्राम की अगली उक्ति में kram_sankhya राशि पर इंक्रिमेंट प्रचालक ++ का प्रयोग हुआ है, जो kram_sankhya के मान को 1 से बढ़ा देता है, यानी 2 कर देता है। इसके बाद कोई और उक्ति नहीं है, इसलिए प्रोग्राम का नियंत्रण एक बार फिर while वलय के प्रारंभिक पंक्ति को लौटकर तार्किक व्यंजन का एक बार फिर परीक्षण करता है। चूंकि 2, 11 से छोटा है, इसलिए while के तार्किक व्यंजन का मान अब भी 1 बना हुआ है और प्रोग्राम नियंत्रण while वलय की उक्तियों की ओर बढ़ जाता है।

यह क्रम दस बार चलता है और हर बार इंक्रिमेंट प्रचालक kram_sankhya का मान 1 से बढ़ाता जाता है। दसवीं बर इंक्रिमेंट प्रचालक kram_sankhya का मान 11 कर देता है। इसके बाद जब प्रोग्राम का नियंत्रण while के प्रारंभ में जाकर तार्किक व्यंजन की समीक्षा करता है, तो पाता है कि अब तार्किक व्यंजक का मान 0 हो गया है, क्योंकि 11, 11 से छोटा नहीं है। अतः प्रोग्राम नियंत्रण वलय के भीतर नहीं घुसता और वलय के बाद वाली उक्ति की ओर बढ़ जाता है।

चूंकि वहां और कोई उक्ति नहीं है, इसलिए प्रोग्राम का समापन हो जाता है।

----------


## anoopverma

अब हम while वलय का उपयोग करते समय ध्यान में रखनेवाली दो बातों का उल्लेख करेंगे। ये हैं:

1. while वलय के कोष्ठकों में जिस राशि का परीक्षण होता है, उसे while वलय के पूर्व कोई प्रारंभिक मान देना जरूरी है। इस उदाहरण में यह राशि kram_sankhya है, और उसे 1 का मान दिया गया है।

2. धनु कोष्ठकों में मौजूद कोई एक उक्ति को इस राशि के मान में कोई परिवर्तन लाना चाहिए, तभी while वलय का समापन होगा। इस प्रोग्राम में इंक्रिमेंट प्रचालक kram_sankhya के मान को 1 से बढ़ाता जाता है, जिससे दसवीं आवृत्ति पर वह 11 का मान प्राप्त कर लेता है, जिससे while का तार्किक व्यंजन का मान 0 हो जाता है, और वलय टूट जाता है। यदि आप इस इंक्रिमेंट उक्ति को छोड़ देंगे, तो kram_sankhya का मान 1 पर ही निर्विकार बना रहेगा और while वलय बड़े मजे से अनंत काल तक घूमता रहेगा। इस अनंत वलय से पीछा छुड़ाना आपके लिए मुश्किल हो जाएगा। आपके प्रोग्रामों में इस प्रकार की अप्रिय स्थितियों से बचने के लिए while वलय का उपयोग करते समय ऊपर कही गई दोनों बातों पर गांठ बांध लीजिए।

----------


## anoopverma

आइए एक और उदाहरण देखें:

प्रोग्राम-13
---------------------------------
/*while loop ka ek aur udaharan */

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

void main()
{

clrscr();

int kram_sankhya=10;


printf("\nUlti ginti shuru!!!");

while (kram_sankhya>=0)
{

printf("\n%d", kram_sankhya);
kram_sankhya--;
}

printf("\n\nYan ke rocket dago!\n");
getch();
}
---------------------------------

आउटपुट
---------------------------------
Ulti ginti shuru!!!
10
9
8
7
6
5
4
3
2
1
0
Yaan ke rocket dago!
---------------------------------

----------


## anoopverma

यह प्रोग्राम किसी रोकेट यान के उड़ान भरने के पहले की उल्टी गिनती का निर्दशन करता है।

यहां kram_sankhya को 10 का प्रारंभिक मान दिया गया है। while के तार्किक व्यंजक में इस बात का परीक्षण होता है कि kram_sankhya का मान 0 से बड़ा या उसके बराबर है, या नहीं। while के धनु कोष्ठकों में डिक्रिमेंट प्रचालक kram_sankhya के मान को हर आवृत्ति के दौरान 1 से कम करता जाता है, जिससे दसवीं आवृत्ति के अंत में उसका मान ऋणात्मक हो जाता है, यानी 0 से कम, और इस कारण से तार्किक व्यंजन का मान 0 हो जाता है, और while वलय बिखर जाता है।

----------


## anoopverma

लीजिए एक और उदाहरण। यह गणित के छात्रों के लिए काम का हो सकता है, क्योंकि इसमें किसी संख्या का क्रमगुणित (फैक्टोरियल) ज्ञात किया जाता है। किसी संख्या का क्रमगुणित वह संख्या है जो उस संख्या तथा उसके पहले के सभी धनात्मक पूर्ण संख्याओं को आपस में गुणा करने पर प्राप्त होता है। उदाहरण के लिए 5 का क्रमगुणित होगा 5 x 4 x 3 x 2 x 1 = 120

प्रोग्राम-14
---------------------------------
/*while loop ki madat se kramganit (factorial) ka parikalan*/

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


void main()
{
clrscr();

int sankhya, sankhyadharak;
long kramgunit;

printf("25 se chota koi ek dhanatmak sankhya enter kijiye: \n");
scanf("%d", &sankhya);
sankhyadharak = sankhya;
kramgunit = 1;

while (sankhya > 1)
{
kramgunit = kramgunit * sankhya;
sankhya--;
}

printf ("%d ka kramgunit %ld hai.\n", sankhyadharak, kramgunit);
getch();
}
---------------------------------

आउटपुट
---------------------------------
25 se chota koi ek dhanatmak sankhya enter kijiye: 6
6 ka kramgunit 720 hai.
---------------------------------

----------


## anoopverma

यहां दो पूर्णांक राशियां घोषित की गई हैं, sankhya और sankhyadharak और एक long प्रकार की राशि kramgunit । kramgunit के लिए long प्रकार चुनना इसलिए आवश्यक है क्योंकि क्रमगुणित संख्याएं बहुत बड़ी-बड़ी संख्याएं होती हैं, और वे साधारण int राशियों में नहीं समाएंगी। उदाहरण के लिए यदि आप kramgunit को int प्रकार की राशि घोषित करें, तो आपका प्रोग्राम 7 से अधिक संख्याओं के लिए काम नहीं करेगा। आपको kramgunit के रूप में कोई ऋणात्मक संख्या प्राप्त होगी। यह इसलिए क्योंकि int प्रकार की राशि में 36,000 से अधिक बड़ी संख्याएं नहीं समा सकतीं। यद्यपि long राशि में int राशि से कहीं बड़ी संख्याएं समा सकती हैं, फिर भी उसकी भी एक सीमा है, जिससे बड़ी संख्याएं उसमें नहीं समाएंगी। यदि आप इस प्रोग्राम में sankhya के लिए कोई बड़ी संख्या दें, जैसे, 100, तो यह प्रोग्राम सही परिणाम नहीं देगा। इसलिए प्रोग्राम लिखते समय प्रोग्राम में घोषित राशियों की सीमाओं का खास ध्यान रखना जरूरी होता है। इस प्रोग्राम में हमने सूचित किया है कि जो संख्या दर्ज की जाए, वह 25 से छोटा हो।

----------


## anoopverma

आइए देखें कि यह प्रोग्राम कैसे काम करता है। चूंकि while वलय में डिक्रिमेंट प्रचालक sankhya के मान को बदलता है, इसलिए उसके प्रारंभिक मान को बचाकर रखने की आवश्यकता है, क्योंकि हम अंतिम printf() उक्ति में मूल संख्या को प्रदर्शित करना चाहते हैं। अतः sankhya के प्रारंभिक मान को sankhyadharak में आरोपित किया गया है।

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

while वलय के कोष्ठकों में वलय की हर आवृत्ति के पहले sankhya के मान का परीक्षण होता है और यह देखा जाता है कि वह 1 से बड़ा है या नहीं। वलय के धनु कोष्ठकों की उक्तियों का निष्पादन तभी होता है, जब sankhya का मान 1 से बड़ा होता है। धनु कोष्ठकों की उक्तियों में से डिक्रिमेंट वाला प्रचालक sankhya के मान को वलय की हर आवृत्ति पर 1 से घटाता जाता है, जिससे वलय अनंत वलय होने से बच जाता है।

ध्यान दीजिए कि आउटपुट प्रिंट करने वाले printf कथन में हमें दूसरी संख्या के लिए %ld निरूपण चिह्न का प्रयोग किया है। यह इसलिए क्योंकि हमने इस दूसरी संख्या को, यानी kramgunit को long प्रकार की राशि घोषित किया है, और printf में long प्रकार की राशियों के लिए निरूपण चिह्न %ld ही होता है।

----------


## anoopverma

*आज के लिए बस इतना हीं, आशा है आपको पसन्द आया।*

----------


## marwariladka

अनूप जी मुझे आपसे एक सवाल पूछना है...
पूछूं क्या?...
जैसा के आपने बताया के एक integer २ byte का होता है ....
अगर मुझे उस integer value को १ byte में save करना हो तो यह कैसे संभव है???

----------


## anoopverma

> अनूप जी मुझे आपसे एक सवाल पूछना है...
> पूछूं क्या?...
> जैसा के आपने बताया के एक integer २ byte का होता है ....
> अगर मुझे उस integer value को १ byte में save करना हो तो यह कैसे संभव है???


बिल्कुल ऐसा किया जा सकता है। असल में बात यह है कि सी की दुनिया में डेटा सिर्फ़ दो प्रकार का है - Integer (पूर्णांक) और Floating-point (दशमलव वाले अंक), हैं दोनों हीं अंक (Number) हीं।
Integer भी तीन प्रकार का है - char (1 byte), int (2/4 bytes) और long (4 bytes)
Floating-point भी तीन प्रकार का है - float (4 bytes), double (8 bytes) और long double (10 bytes).

इसका मतलब हुआ कि Alphabetic data  के लिए इस भाषा में कुछ विशेष नहीं है, बल्कि ऐसे डेटा को ASCII की मदद से char नाम के १ बाईट वाले Integer Type में रखने की सुविधा दी गई है। चूंकि ASCII एक ७-बिट वाली कूट-प्रणाली है इसलिए ८-बिट या १ बाईट का char ऐसे डेटा के लिए सही है। की-बोर्ड पर का हरेक की १ बाईट या १ character को represent करता है, तो हम ऐसे किसी भी डेटा को मेमोरी में रखने के लिए char  का प्रयोग कर सकते हैं।
अब सिर्फ़ इतना समझना है कि १ बाईट या ८-बिट में हम कितना रख सकते हैं? चूँकि कोई भी बिट की दो स्थितियाँ हो सकती हैं - ० या १, तो हम जो सबसे बड़ी संख्या ८ बिट में रख सकते हैं वह होगी ११११११११ जो हमारे दशमलव प्रणाली में २५५ के समतुल्य है। अब एक और चक्कर है, बिट्स की दुनिया में सबसे बाँए वाले बिट को sign-bit (मतलब संख्या घनात्मक + है या ऋणात्मक -) के रूप में प्रयोग किया जाता है। अगर यह बिट ० है तो संख्या +ve और अगर १ है तो संख्या -ve मानी जाती है, तो इस हिसाब से अगर हम एक बाईट की सबसे बाँए वाली बिट को sign-bit के रूप में हटा दें तो हमारे पास डेटा रखने के लिए ७ बिट बचेगा और तब १११११११ होगी वह सबसे बड़ी घनात्मक संख्या जो हम १ बाईट में रख पाएँगे। यह संख्या हमारे दशमलव प्रणाली में +१२७ को represent करती है। 

अर्थात हम १ बाईट में ऋणात्मक संख्या ११११११११ (दशमलव में -१२८) से ले कर घनात्मक ०१११११११ (दशमलव में +१२७) तक की संख्या को रख कर गणना करते हुए सही उत्तर पा सकते हैं वर्ना कुछ गड़बड़ हो जाएगा। अब आप कोशिश करके देख लीजिए, char koi_num = 5; लिख कर कोई भी प्रोग्राम लिख कर देख लीजिए। बस एक बात का ध्यान रहे कि उस प्रोग्राम में ऐसा कुछ न हो जो koi_num के मान को -१२८ से +१२८ के सीमा के बाहर कर दे।

----------


## anoopverma

*अभ्यास*
1. while वलय का उपयोग करते हुए "Jai Hindi!" संदेश की आवृत्ति पांच बार करवाइए।

2. while वलय की सहायता से किसी संख्या की गुणन तालिका (पहाड़ा) दर्शाइए। उदाहरण के लिए 3 का पहाड़ा इस प्रकार होगा:

1 x 3 = 3
2 x 3 = 6
3 x 3 = 9
...
...
10 x 3 = 30

3. while वलय की सहायता से 1 से लेकर 100 तक के पूर्णांकों का सम्मिलित योग ज्ञात कीजिए।

4. प्रश्न 3 में इस प्रकार की तब्दीली कीजिए कि 100 के बजाए n संख्याओं का कुल योग ज्ञात हो। इस n का मान scanf() के जरिए प्रोग्राम के निष्पादन के दौरान प्राप्त किया जाए।

----------


## anoopverma

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

----------


## anoopverma

---------------------------------

/*Abhyas -  1 ka hal*/
#include <stdio.h>
#include <conio.h>

void main()
{
clrscr();
int sankhya=0;
while (sankhya < 5)
{
printf("\nJaihindi!");
sankhya++;
}
getch();
}
---------------------------------

----------


## anoopverma

*सोचें इसको sankhya-- का प्रयोग करके कैसे लिखा जाएगा...*

----------


## anoopverma

/*Abhyas -  2 - kisi sankhya ki gunan talika (pahada) */

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

void main()
{
clrscr();

int sankhya=0;
int ganak=1;
printf("\nAap kis sankhya ki gunan talika (pahada) banvana chate hai?");
scanf("%d",&sankhya);

while (ganak <= 10)
{
printf("\n%d x %d = %d", ganak, sankhya, ganak*sankhya);
ganak++;
}
getch();
}
---------------------------------

----------


## anoopverma

इस प्रोग्राम के printf वाली उक्ति पर विशेष ध्यान दीजिए। उसे यहां मैं दुबारा दे रहा हूं –

printf("\n%d x %d = %d", ganak, sankhya, ganak*sankhya);

इसमें तीन %d वाले अंश हैं। प्रथम दो तो ganak और sankhya का प्रतिनिधित्व करते हैं, लेकिन तीसरा %d द्वारा gank और sankhya के गुणनफल को प्रदर्शित किया जाता है। यह गुणनफल printf के गोल कोष्ठकों के भीतर ही निकाला जाता है, इस व्यंजक में – 

ganak*sankhya

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

----------


## anoopverma

/*Abhyas - 3 - 1 se lekar 100 sankhyaon ka yog */

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


void main()
{
clrscr();

int yog=0;
int sankhya=1;
int ganak=1;

while (ganak <= 100)
{
yog=yog+sankhya++;
ganak++;
}
printf("\n1 se lekar 100 tak ki sankhayon ka yog %d hai.", yog);
getch();
}

---------------------------------

----------


## anoopverma

इस प्रोग्राम की केंद्रीय उक्ति यह है –

yog=yog+sankhya++;

yog नामक राशि में 1 से लेकर 100 तक के अंकों का योग जमा किया जाता है। हर बार जब while लूप घूमता है, yog में एक प्राकृतिक संख्या (sankhya) जोड़ी जाती है। yog का प्रारंभिक मान 0 रखा गया है। while लूप के हर आवर्तन में उसके साथ sankhya का मान जोड़ा जाता है। लूप के प्रत्येक आवर्तन में sankhya का मान 1 से बढ़ाया जाता है, इस कथन द्वारा –

sankhya++;

लूप तब टूटता है जब गणक का मान 101 हो जाता है।

----------


## anoopverma

*क्या इसी तरह १ से ले कर १०० तक की संख्या का गुणनफ़ल लिकाला जा सकता है? कोशिश कीजिए....और बताईए कि क्या परेशानी हुई और क्यों? आपने उसको कैसे दूर किया?*

----------


## anoopverma

---------------------------------
/*Abhyas - 4 - 1 se lekar kisi vanchit sankhya tak ki sankhyaon ka yog */

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


void main()
{
clrscr();

int yog=0;
int sankhya=1;
int ganak=1;
int vanchitsankhya=0;
printf("\nAap 1 se lekar kitni tak ki sankhyaon ka yog janna chahte hai? ");
scanf("%d",&vanchitsankhya);

while (ganak <= vanchitsankhya)
{
yog=yog+sankhya++;
ganak++;
}
printf("\n1 se lekar %d tak ki sankhayon ka yog %d hai.", vanchitsankhya, yog);
getch();
}
---------------------------------

----------


## anoopverma

इस प्रोग्राम में पिछले प्रोग्राम के 100 वाली संख्या की जगह vanchitsankhya के मान का प्रयोग किया जाता है। vanchitsankhya का मान प्रोग्राम के निष्पादन के दौरान scanf के जरिए प्राप्त किया जाता है।

----------


## anoopverma

उम्मीद है इन प्रोग्रामों से आपको while  की समझ हो गई होगी। आप भी अब कुछ प्रोग्राम खुद से लिखने की कोशिश कीजिए और मुझे बताएँ कि आपने क्या और कैसे किया।
अब अगले दिन मैं do....while के बारे में बताऊँगा।

----------


## Neelima

> प्रोग्राम-2
> 
> /* printf() ka udaharan */
> 
> #include <stdio.h>
> 
> void main ()
> {
> int namoone_ka_ank = 9;
> ...


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

----------


## manaw

अनुप भाई आपके व्दारा दी जा रही “सी भाशा” की जानकारी सचमुच में अमुल्य हैं । 
आपसे निवेदन हैं कि आप हमें  “सी प्लस प्लस” तक की पुरी जानकारी प्रदान करेगें ।
आप से सहयोग की अपेक्षा के साथ………………………..

----------


## manaw

*अनुप भाई आपके व्दारा दी जा रही “सी भाशा” की जानकारी सचमुच में अमुल्य हैं । 
आपसे निवेदन हैं कि आप हमें  “सी प्लस प्लस” तक की पुरी जानकारी प्रदान करेगें ।
आप से सहयोग की अपेक्षा के साथ………………………..*

----------

