tag:blogger.com,1999:blog-49639747321445752172024-02-23T22:43:34.663-08:00प्रिंटेफ-स्कैनेफइस ब्लोग में मैं सी, सीप्लसप्लस, जावास्क्रिप्ट, एचटीएमएल, पीएचपी आदि प्रोग्रामन भाषाओं के बारे में लिखूंगा, मुख्यरूप से छात्रोपयोगी दृष्टि से। बच्चे 9-10 से ही प्रोग्रामन भाषाएं सीखने लगते हैं, पर अभी हिंदी में सी आदि भाषाओं पर अच्छी पुस्तकें उपलब्ध नहीं हैं। इस ब्लोग के जरिए इसी कमी को दूर करने का प्रयास किया जाएगा।बालसुब्रमण्यम लक्ष्मीनारायणhttp://www.blogger.com/profile/09013592588359905805noreply@blogger.comBlogger29125tag:blogger.com,1999:blog-4963974732144575217.post-19156910418082490622009-06-19T02:32:00.000-07:002009-06-19T02:35:12.171-07:0027.. सीखिए सी : फंक्शन - सामान्य परिचयहमने पहले बताया था कि सी एक स्ट्रक्चर्ड प्रोग्रामन भाषा है। इसका मतलब यह है कि सी का कोड अत्यंत व्यवस्थित और छोटे-छोटे खंडों में लिखा जाता है। प्रोग्राम लिखना शुरू करने से पहले समस्या का विश्लेषण करके उसे सरल घटकों में बांट दिया जाता है। उसके बाद प्रत्येक सरल घटक के लिए कोड लिखा जाता है। इस तरह कठिन से कठिन समस्या का कोड भी अत्यंत सरल हो जाता है। <br /><br />एक उदाहरण लेते हैं, रोटी बनाने का उदाहरण। नरम-गरम, सुस्वादु रोटी बनाना एक अत्यंत मुश्किल काम है। पर यदि हम उसके बनने की प्रक्रिया को छोटे-छोटे चरणों में बांटकर देखें तो वह बहुत ही सरल प्रतीत होगी – रोटी बनाने के चरण ये होते हैं, –<br /><br />1. बाजार से गेहूं लाना।<br />2. गेंहूं से कंकड़-कचरा बीनना।<br />3. गेंहूं को चक्की में ले जाकर पिसवाना।<br />4. आटे को गूंथना।<br />5. रोटी बेलना।<br />6. बेली हुई रोटी को तवे पर सेंकना।<br />7. तवे पर सिंकी रोटी को आंच पर फुलाना।<br />8. तैयार रोटी पर घी मलना।<br /><br />यद्यपि शुरू में रोटी बनाने का काम अत्यंत जटिल प्रतीत होता है, लेकिन ऊपर इसके जो आठ चरण बताए गए हैं, उनमें से प्रत्येक इतना सरल है कि कोई भी उसे आसानी से बिना घबराहट के कर सकता है। और इन सब घटकों को व्यस्थिति रीति से सही क्रम में करने का नतीजा होता है, तैयार रोटी।<br /><br />यही अभिगम सी प्रोग्रामिंग में भी अपनाया जाता है। किसी भी समस्या को अधिक सरल छोटी समस्याओं में तोड़ा जाता है, और फिर प्रत्येक छोटी समस्या के लिए कोड लिखा जाता है। फिर इन कोडों को समायोजित किया जाता है, जिससे मूल समस्या का हल प्राप्त हो जाता है।<br /><br />इस प्रक्रिया को अंजाम देने में हमें सी की फंक्शन नामक संरचना मदद करती है। फंक्शन वास्तव में एक छोटा सी प्रोग्राम ही होता है। प्रत्येक फंक्शन मूल समस्या के किसी एक छोटे पहलू का ही समाधान कर सकता है। पर कई फंक्शन मिलकर पूरी समस्या का हल कर डालते हैं।<br /><br />हर सी प्रोग्राम में एक मूल फंक्शन होता है जो अन्य सभी फंक्शनों को समायोजित करता है और उन्हें यथा समय और यथा स्थान बुलाता है और उनसे आवश्यक काम करा लेता है। इस मूल फंक्शन को main फंक्शन कहा जाता है। आप इस फंक्शन से परिचित हैं, क्योंकि अब तक हमने जितने भी प्रोग्राम लिखे हैं उन सबमें वह विद्यामान रहा है। सच तो यह है कि सी के सभी प्रोग्राम में वह अनिवार्य रूप से रहता है।<br /><br />आइए, इन सब बातों को हम वास्तविक कोड का उदाहरण लेकर समझते हैं। हम ऐसा एक प्रोग्राम लिखेंगे, जो दो संख्याओं को जोड़कर उनका योगफल हमें बताएगा।<br /><br />पहले हम फंक्शनों का प्रयोग बिना किए यह प्रोग्राम लिखेंगे।<br /><br />प्रोग्राम – 25<br />---------------------------------<br />/*function ka udaharan - 1*/<br /><br />#include <stdio.h><br />#include <conio.h><br />#include <stdlib.h><br /><br />void main()<br />{<br />int a, b, c;<br />clrscr();<br />printf("\nDo sankhyaein darj kijiye: ");<br />scanf("%d%d", &a, &b);<br />printf("\n%d aur %d", a,b);<br />flushall();<br />c=a+b;<br />printf("\nAapne jo sandhyaein darj kien, unka yogphal hai, %d", c);<br /><br />getchar();<br />}<br />---------------------------------<br /><br />आउटपुट<br />---------------------------------<br />Do sankhyaein darj kijiye: 4 5<br />Aapne jo sandhyaein darj kien, unka yogphal hai, 9<br />---------------------------------<br /><br />यह सीधा सा प्रोग्राम है जो दो संख्याओं का योगफल देता है। इसमें हमने फंक्शन का प्रयोग नहीं किया है। आइए देखें इस प्रोग्राम में हम फंक्शन का प्रयोग कैसे कर सकते हैं। <br /><br />इस प्रोग्राम में एक ही मुख्य समस्या है, दो संख्याओं का योगफल प्राप्त करना। इसलिए हम इसी के लिए फंक्शन लिखेंगे। जो इस प्रकार होगा – <br /><br />int yogphal (int a, int b)<br />{<br />int c;<br />c=a+b;<br />return c;<br />}<br /><br />उपर्युक्त कोड खंड एक सरल फंक्शन है। वह केवल एक काम करता है, यानी दो संख्याओं का योगफल निकालकर उसे return करता है, यानी वापस भेजता है। आइए अब इस फंक्शन की चीर-फाड़ करते हैं।<br /><br />हर फंक्शन का एक नाम होना आवश्यक है। फंक्शन के नामकरण पर भी वे सभी नियम लागू होते हैं, जो किसी सी राशि के नामकरण पर लागू होते हैं। इन्हें जानने के लिए उस पिछले लेख को देख आएं, जिसमें इस विषय को विस्तार से समझाया गया था। हमने अपने इस फंक्शन का नाम yogphal रखा है। फंक्शनों को नाम देते समय भी ऐसा नाम देना चाहिए, जो उस फंक्शन द्वारा किए जानेवाले कार्य को सूचित करे। इससे जटिल और लंबें प्रोग्रामों में, जिनमें बीसियों फंक्शन हो सकते हैं, यह समझना आसान हो जाएगा कि कोई फंक्शन क्या करता है।<br /><br />हर फंक्शन का एक टाइप (प्रकार) होता है, अर्थात वह किसी एक प्रकार की राशि को return करता है, यानी वापस भेजता है। यह टाइप सी की राशियों के विभिन्न टाइपों में से कोई हो सकता है, मसलन, int, char, float, long, इत्यादि। इनके अलावा यह टाइप अधिक जटिल प्रोयक्ता-परिभाषित टाइप भी हो सकता है, जैसे सरणी (array),struct, union, आदि। इनके बारे में हमने अभी सीखा नहीं है, आगे सीखेंगे।<br /><br />फंक्शन के टाइप यानी प्रकार को दर्शाने के लिए उसके नाम से पहले उस टाइप के लिए जो कुंजी शब्द हो, उसे लिख दिया जाता है। हमारा उपर्युक्त फंक्शन दो int राशियों को जोड़ता है, जिससे योगफल के रूप में एक int राशि ही प्राप्त होती है, जिसे ही यह फंक्शन लौटा है। इसलिए हमारे उपर्युक्त फंक्शन का टाइप int है। इसलिए हम लिखेंगे –<br /><br />int yogphal<br /><br />फंक्शन किन्हीं राशियों पर कुछ कार्य करता है। ये राशियां उसे बुलानेवाला दूसरा फंक्शन उसे देता है। फंक्शन को कोई राशि देने की रीति होती है उन्हें फंक्शन के गोल कोष्ठकों में रखना। फंक्शन के गोल कोष्टकों में राशियों को रखते समय उनका प्रकार स्पष्ट करना आवश्यक है। हमारे उदाहरण में, yogphal फंक्शन दो int प्रकार की संख्याओं को जोड़ता है। इसलिए उसे दो int प्रकार की राशियां दी जाएंगी। इसलिए उसे ये राशियां देने की विधि यह होगी –<br /><br />int yogphal (int a, int b)<br /><br />इस पंक्ति में आया प्रथम शब्द int फंक्शन के प्रकार को सूचित करता है। yogphal फंक्शन का नाम है। और उसके गोल कोष्ठक में जो दो int प्रकार की राशियां, वे उसे बुलाने वाले फंक्शन ने उसे दी है।<br /><br />इसके बाद आते हैं धनु कोष्ठक, जिनके अंदर फंक्शन के कोड की उक्तियां रहती हैं। हमारे फंक्शन में ये उक्तियां हैं –<br /><br />int c;<br />c=a+b;<br />return c;<br /><br />अब पूरे फंक्शन का हुलिया एक बार फिर देख लीजिए –<br /><br />int yogphal (int a, int b)<br />{<br />int c;<br />c=a+b;<br />return c;<br />}<br /><br />आप सोच रहे होंगे, कि यह फंक्शन काम कैसे करता होगा। हर फंक्शन तभी काम करेगा जब कोई अन्य फंक्शन, जिसमें main भी शामिल है, उसे बुलाए, और उसे आवश्यक राशियां प्रदान करे। फंक्शन के हमारे इस उदाहरण में यह काम main करेगा, इस तरह –<br /><br />void main()<br />{<br />int a, b, c;<br />clrscr();<br />printf("\nDo sankhyaein darj kijiye: ");<br />scanf("%d%d", &a, &b);<br />flushall();<br />c=yogphal (a,b);<br />printf("\nAapne jo sandhyaein darj kien, unka yogphal hai, %d", c);<br /><br />getchar();<br />}<br /><br />यह पहले वाला ही प्रोग्राम है, केवल एक अंतर है। इसमें दोनों संख्याओं को जोड़ने वाला व्यंजक नहीं है, उसके स्थान पर यह पंक्ति है –<br /><br />c=yogphal(a, b);<br /><br />इसी पंक्ति में yogphal फंक्शन का आह्वान किया गया है। आह्वान करने की रीति यह है – फंक्शन का नाम लिखकर उसके गोल गोष्ठकों में उन राशियों को रखना जिन्हें हम उस फंक्शन को उपलब्ध कराना चाहते हैं। इस बार इन राशियों का प्रकार सूचक शब्द (int, char, आदि) लिखने की जरूरत नहीं है, क्यों इन राशियों को घोषित करते समय हमने उनका प्रकार भी प्रोग्राम को बता दिया है, जिसे कंप्यूटर याद रखता है।<br /><br />आपने ध्यान दिया होगा कि फंक्शन का आह्वान करते समय, उसे एक अन्य राशि c के साथ = चिह्न द्वारा जोड़ा गया है, यानी यह फंक्शन एक तरह से c में कोई मान आरोपित कर रहा है, उसी तरह जैसे इस व्यंजक में –<br /><br />c=5;<br /><br />फंक्शन कोई न कोई मान वापस लौटाता है। हमारा yogphal फंक्शन भी एक मान लौटाता है। यदि आप yogphal फंक्शन को जांचें, तो आपको उसकी अंतिम पंक्ति के रूप में यह उक्ति नजर आएगी –<br /><br />return c;<br /><br />return सी भाषा का एक कुंजी शब्द है, जिसे हर उस फंक्शन के अंतिम पंक्ति के रूप में रहना चाहिए जो कोई मान लौटाता है। इस कुंजी शब्द के आगे वह राशि रखी जाती है, जिसे वह फंक्शन उसे बुलानेवाले फंक्शन को लौटाता है। हमारे उदाहरण में यह राशि c है, जिसमें a और b संख्याओं का योगफल है।<br /><br />main प्रोग्राम की c राशि yogphal फंक्शन द्वारा लौटाई गई इस राशि को प्राप्त करती है।<br /><br />इस पंक्ति के बाद main प्रोग्राम में c का मान वही होगा जो yogphal फंक्शन ने उसे दिया है।<br /><br />इसका प्रमाण है, main फंक्शन की यह पंक्ति जो c के मान को कंप्यूटर स्क्रीन पर छापती है –<br /><br />printf("\nAapne jo sandhyaein darj kien, unka yogphal hai, %d", c);<br /><br />कंप्यूटर स्क्रीन में c की जगह a और b का योगफल छपता है।<br /><br />यह रहा पूरे प्रोग्राम का कोड।<br /><br />प्रोग्राम – 26<br />---------------------------------<br />/*function ka udaharan - 2*/<br /><br />#include <stdio.h><br />#include <conio.h><br />#include <stdlib.h><br /><br />int yogphal (int a, int b)<br />{<br />int c;<br />c=a+b;<br />return c;<br />}<br /><br />void main()<br />{<br />int a, b, c;<br />clrscr();<br />printf("\nDo sankhyaein darj kijiye: ");<br />scanf("%d%d", &a, &b);<br />flushall();<br />c=yogphal (a,b);<br />printf("\nAapne jo sandhyaein darj kien, unka yogphal hai, %d", c);<br /><br />getchar();<br />}<br />---------------------------------<br /><br />आउटपुट<br />---------------------------------<br />Do sankhyaein darj kijiye: 4 5<br />Aapne jo sandhyaein darj kien, unka yogphal hai, 9<br />---------------------------------<br /><br />यह प्रोग्राम भी वही आउटपुट देता है, जो प्रोग्राम – 25 ने दिया था, पर इसके कोड में काफी अंतर है। इसमें संख्याओं को जोड़ने का काम main में नहीं किया गया है, बल्कि yogphal फंक्शन में किया गया है।<br /><br />ध्यान दीजिए कि हमने फंक्शन yogphal के कोड को main के कोड से पहले रखा है। यह बहुत जरूरी है। अन्यथा कंप्यूटर को पता नहीं चल पाएगा कि yogphal फंक्शन जैसे किसी फंक्शन का अस्तिव है तथा उसमें घोषित राशियों के लिए (इस उदाहरण में int c) उसे कितनी स्मृति आरक्षित करनी है।<br /><br />फंक्शन की अवधारणा प्रोग्रामन भाषाओं की एक अत्यंत महत्वपूर्ण अवधारणा है। इसलिए हम उसे विस्तार से अनेक लेखों में समझेंगे। इस लेख को हम यहीं समाप्त करते हैं।<br /><br />यदि आप चाहें, तो इस लेख में दिए गए प्रोग्राम - 26 को इस तरह परिवर्तित करके देख सकते हैं कि वह योगफल की जगह दो संख्याओं का गुणनफल निकाल कर दे। इससे आपको फंक्शन लिखने का अभ्यास भी हो जाएगा।बालसुब्रमण्यम लक्ष्मीनारायणhttp://www.blogger.com/profile/09013592588359905805noreply@blogger.com16tag:blogger.com,1999:blog-4963974732144575217.post-76643622649017623212009-06-18T01:49:00.000-07:002009-06-18T01:54:14.078-07:0026. सीखिए सी : switch संरचनापिछले एक लेख में हमने बताया था कि सी भाषा में विशाखन की मुख्य संरचना if...else वाली संरचना है। लेकिन जब बहुत सारे विकल्प हों, तो if...else संरचना अव्यवस्थित हो जाती है और उसे ठीक तरह से लिखना कठिन हो जाता है। आप अब तक समझ गए होंगे, कि जितने विकल्प होंगे, उतने ही else कथन भी होंगे, और इनमें से प्रत्येक में काफी मात्रा में कोड की पंक्तियां भी धनु कोष्ठकों में रह सकती हैं। इसलिए प्रोग्राम में if...else के कई कोड खंडों की भीड़-भाड़ हो जाती है और यह पता लगाना कठिन हो जाता है कि किसी कोड खंड का संबंध किस else उक्ति से है।<br /><br />इसलिए सी में अधिक जटिल विशाखन को अंजाम देने के लिए एक अन्य संरचना भी है, जिसे switch संरचना कहते हैं। इसका रूप इस तरह होता है –<br /><br />switch (sanket)<br />{<br />case 'saket का मान 1’ :<br />उक्तियां;<br />break;<br />case ‘sanket का मान 2’ :<br />उक्तियां;<br />break;<br />case ‘sanket का मान 3’ :<br />उक्तियां;<br />break;<br />.<br />.<br />.<br />.<br />case ‘sanket का मान n’ :<br />उक्तियां;<br />break;<br />default :<br />उक्तियां;<br />}<br /><br />आप देख सकते हैं कि switch के धनु कोष्ठकों के भीतर अनेक case खंड है। प्रत्येक case खंड एक विकल्प का प्रतिनिधित्व करता है, यानी जितने विकल्प होंगे, उतने case खंड भी होंगे। इनके अलावा एक अंतिम विकल्प भी हो सकता है, जिसे default प्रतिनिधित्व करता है। जब कोई भी वांछित विकल्प न प्राप्त होने पर यदि कुछ कोड़ पंक्तियों का निष्पादन आवश्यक हो, तो इन्हें default के अंतर्गत रखा जा सकता है। <br /><br />switch संरचना की शुरुआत इस पंक्ति से होती है।<br />switch (sanket)<br /><br />यहां sanket सामान्यतः int या char प्रकार की कोई राशि होती है। इसे switch कथन से पहले घोषित किया जाता है और प्रोग्राम के दौरान यह कोई मान प्राप्त करता है, जिसे sanket का मान 1, sanket का मान 2, sanket का मान 3,.... sanket का मान n के रूप में ऊपर के उदाहरण में दर्शाया गया है।<br /><br />इसके बाद switch कथन का कोड खंड आता है, जो धनु कोष्ठकों में घिरा रहता है। इन धनु कोष्ठकों के अंदर case शब्द के जरिए सभी विकल्पों और उनसे संबंधित कोड खंडों को रखा जाता है। जितने विकल्प होंगे, उतने case कथन तथा उसके कोड़ खंड भी होंगे। प्रत्येक कोड खंड की अंतिम उक्ति break उक्ति होगी। case कथन और उसके कोड खंड को लिखने की विधि यह है –<br /><br />case ‘sanket का मान 1’ :<br />कोड खंड<br />break;<br /><br />सबसे पहले case शब्द को लिखा जाता है। उसके बाद एकल उद्धरण चिह्नों में sanket राशि द्वारा प्राप्त किया जानेवाला कोई मान रखा जाता है। <br /><br />उसके बाद कोलन (: ) होता है।<br /><br />कोलन के बाद उस case से संबंधित कोड खंड रहता है। इस कोड खंड की अंतिम उक्ति break उक्ति होती है, ताकि वांछित विकल्प के कोड के निष्पादन के बाद प्रोग्राम switch संरचना से बाहर आ जाए।<br /><br />switch में कई case खंड होते हैं, पर इन case खेडों में से प्रोग्राम के दौरान केवल एक case खंड का ही निष्पादन होता है।<br /><br />मान लीजिए कि किसी प्रोग्राम में sanket के ये चार मान हो सकते हैं - a, b, c, d। तो switch संरचना इस तरह बनेगी –<br /><br />switch (sanket)<br />{<br />case ‘a’ :<br />उक्तियां;<br />break;<br /><br />case ‘b’ :<br />उक्तियां;<br />break;<br /><br />case ‘c’ :<br />उक्तियां;<br />break;<br /><br />case ‘d’ :<br />उक्तियां;<br />break;<br />}<br /><br />और इस switch संरचना का निष्पादन इस तरह होगा –<br /><br />मान लीजिए प्रोग्राम में sanket का मान c आता है। तब switch संरचना के case ‘a’ और case ‘b’ से संबंधित कोड खंडों का निष्पादन नहीं होगा। प्रोग्राम सीधे case ‘c’ के कोड खंड का निष्पादन करेगा। चूंकि case 'c' की अंतिम उक्ति break कथन है, इसलिए उसके निष्पादन से switch संरचना टूट जाएगी और case 'd' के कोड खंड का निष्पादन नहीं होगा। इसके बजाए प्रोग्राम switch संरचना के बाद वाली पंक्तियों का निषपादन करने लगेगा।<br /><br />है न यह विशाखन को अंजाम देने के लिए if...else से बढ़िया तरीका? <br /><br />आइए, एक उदाहरण के जरिए switch संरचना को समझते हैं। इस उदाहरण में हम एक कैलक्युलेटर का प्रोग्राम लिखेंगे। यह कैलक्युलेटर योग, व्यवकलन, गुणन और विभाजन, ये चार संक्रियाएं कर सकेगा। इस तरह हमारे प्रोग्राम की switch संरचना में चार विकल्प होंगे, यानी चार case खंड होंगे। प्रयोक्ता से पूछा जाएगा कि उसे कौन सी गणितीय संक्रिया करनी है। उसे + (योग के लिए), - (व्यवकलन के लिए), * (गुणन के लिए), और / (विभाजन के लिए) में से कोई एक चिह्न चुनकर अपनी पसंद जाहिर करनी होगी। उसके बाद उसे दो संख्याएं भी चुननी होंगी, जिन पर प्रयोक्ता द्वारा चुनी गई गणितीय संक्रिया लागू की जाएगी। तत्पशचात प्रोग्राम प्रयोक्ता से पूछेगा कि वह और भी कोई गणितीय संक्रिया करना चाहता है या नहीं? इसका उत्तर प्रयोक्ता को y (हां के लिए) या n (नहीं के लिए) दर्ज करना होगा। प्रोग्राम में एक do...while लूप भी है। दरअसल switch संरचना को इसी do...while लूप के भीतर रखा गया है। यह do...while लूप प्रयोक्ता द्वारा व्यक्त किए गए y या n के अनुसार या तो switch कथन को तोड़ देता है (प्रयोक्ता देवारा n चुने जान पर) या उसे दुहराता है (प्रयोक्ता द्वरा y चुने जाने पर।<br /><br />प्रोग्राम – 24<br />---------------------------------<br />/*switch sanrachana ka udaharan - calculator program*/<br /><br />#include <stdio.h><br />#include <conio.h><br />#include <stdlib.h><br /><br />void main()<br />{<br />float a,b,c;<br />char sanket, pasand;<br />clrscr();<br /><br />do<br />{<br />printf("Ank ganitiya prachalak chuniye\n");<br />printf("+ yog ke liye\n");<br />printf("- vyavakalan ke liye\n");<br />printf("* gunan ke liye\n");<br />printf("/ vibhajan ke liye\n");<br />scanf("%c",&sanket);<br />flushall();<br />printf("\nDo sankhyaen darj kijiye\n");<br />scanf("%f %f",&a,&b);<br />flushall();<br /><br />switch(sanket)<br />{<br />case '+': c=a+b;<br />printf("Inka yog hai, %f\n",c);<br />break;<br /><br />case '-': c=a-b;<br />printf("Inka antar hai, %f\n",c);<br />break;<br /><br />case '*': c=a*b;<br />printf("Inka gunanphal hai, %f\n",c);<br />break;<br /><br />case '/': c=a/b;<br />printf("Inka vibhajanphal hai, %f\n",c);<br />break;<br />}<br /><br />printf("\nKya aap aur ganit karna chahtehai?(y ya n)\n");<br />scanf("%c",&pasand);<br />flushall();<br />}while(pasand!='n');<br /><br />}<br />---------------------------------<br /><br />आउटपुट<br />---------------------------------<br />Ank ganitiya prachalak chuniye<br />+ yog ke liye<br />- vyavakalan ke liye<br />* gunan ke liye<br />/ vibhajan ke liye +<br />Do sankhyaen darj kijiye 4 5<br />Inka yog hai, 9.00000<br />Kya aap aur ganit karna chahtehai? y<br />Ank ganitiya prachalak chuniye<br />+ yog ke liye<br />- vyavakalan ke liye<br />* gunan ke liye<br />/ vibhajan ke liye *<br />Do sankhyaen darj kijiye 3 8<br />Inka yog hai, 24.00000<br />Kya aap aur ganit karna chahtehai?n<br />---------------------------------<br /><br />इस प्रोग्राम में ध्यान देनेवाली बातें निम्नलिखित हैं – <br />1. a, b, c को float प्रकार की राशियों के रूप में घोषित किया गया है।<br />2. दूसरे scanf उक्ति के जरिए एक साथ दो राशियों का मान पकड़ा गया है, यानी प्रयोक्ता द्वारा दर्ज की गई दोनों संख्याओं को। आपने ऐसा पहले printf के साथ किया है, अब आपको मालूम हुआ यह कमाल scanf भी कर सकता है। ध्यान देने की बात यही है, कि scanf के कोष्ठकों में दुहरे उद्धरण चिह्नों के अंदर और अल्प विराम के बाद &चिह्न के साथ ये रेशियां सही क्रम में आएं तथा उद्धरण चिह्नों में उनके लिए सही सूचक प्रतीक लगाए जाएं, अर्थात, यदि राशि int प्रकार की हो, तो %d, यदि वह char प्रकार की हो तो %c, इत्यादि।<br />3. जैसा कि पहले समझाया गया है, प्रत्येक scanf के बाद flushall() का प्रयोग किया गया है ताकि वह प्रोयक्ता द्वारा दबाई गई ऐंटर कुंजी को इनपुट न मान ले।<br />4. switch कथन को do...while के भीतर रखा गया है।<br />5. do...while लूप तब तक चलता रहता है जब तक प्रयोक्ता pasand के लिए n नहीं दर्ज करता।<br /><br />अब switch संरचना का उपयोग करते हुए कोई प्रोग्राम लिखिए। इससे आपको विशाखन की इस महत्वपूर्ण संरचना के कार्य करने की रीति और भी स्पष्ट हो जाएगी।बालसुब्रमण्यम लक्ष्मीनारायणhttp://www.blogger.com/profile/09013592588359905805noreply@blogger.com6tag:blogger.com,1999:blog-4963974732144575217.post-51288853491861296672009-05-23T22:50:00.000-07:002009-05-23T22:55:14.399-07:0025. सीखिए सी : continue, break और exit निर्देशपिछले अध्याय में हमने while, do... while और for लूपों की चर्चा की और देखा कि किस प्रकार इन लूप संरचनाओं के उपयोग से हम प्रोग्राम की कुछ उक्तियों का निष्पादन बारबार करा सकते हैं। इन उक्तियों का आवर्तन तब तक चलता रहता है जब तक इनके गोल कोष्ठकों में विद्यमान तार्किक व्यंजक का मान 0 नहीं हो जाता।<br /><br />लेकिन अनेक बार इन लूपों के तार्किक व्यंजक का मान 0 होने से पहले ही लूप से छूटना जरूरी होता है, क्योंकि तब तक प्रोग्राम का उद्देश्य सिद्ध हो चुका होता है, या उपयोगकर्ता प्रोग्राम से बाहर आना चाहता है। सी भाषा में इन स्थितियों से निपटने के लिए तीन निर्देश हैं, continue, break और exit।<br /><br />इस तिकड़ी का सबसे नरम मिजाज वाला निर्देश continue निर्देश है। यदि किसी while वलय में प्रोग्राम नियंत्रण का सामना इस निर्देश से हो जाए, तो नियंत्रण तुरंत लूप के वर्तमान आवर्तन को त्यागकर लूप के तार्किक व्यंजक का पुनः परीक्षण करने चला जाता है, और यदि उसका मान 1 रहा तो वलय का एक नया आवर्तन आरंभ कर देता है।<br /><br />break निर्देश continue से कुछ अधिक तेज-तर्रार है। किसी लूप वलय के भीतर इस निर्देश का सामना होने पर प्रोग्राम लूप तोड़ देता है, तथा लूप के बाद के निर्देशों का निष्पादन करने लगता है, भले ही लूप के तार्किक व्यंजक का मान अब भी 1 क्यों न हो। <br /><br />तीसरा निर्देश exit है, जो सबसे अधिक उग्र स्वभाव का है, क्योंकि वह न केवल लूप को तोड़ देता है, बल्कि समस्त प्रोग्राम को ही खारिज कर देता है और आप वापस प्रचालन तंत्र में आ जाते हैं।<br /><br />आइए इन लूप-भंजक तिकड़ियों का परिचय कुछ सरल प्रोग्रामों के माध्यम से प्राप्त करें।<br /><br />प्रथम प्रोग्राम में 8 के 5 गुणजों का पता लगाया जाता है और जब पांच गुणज मिल जाते हैं, तब break निर्देश की सहायता से while लूप को तोड़ा जाता है।<br /><br /><span style="font-weight:bold;">प्रोग्राम – 21</span><br />---------------------------------<br />/*break nirdesh ka udaharan */<br /><br />#include <stdio.h><br />#include <conio.h><br /><br /><br />void main()<br />{<br />clrscr();<br /><br />int ganak=0;<br />int soochak=1;<br />while(1)<br />{<br />printf("%d ", 8*soochak);<br />soochak++;<br />ganak++;<br />if (ganak >= 5)<br />break;<br />}<br />getch();<br />}<br />---------------------------------<br /><br /><span style="font-weight:bold;">आउटपुट</span><br />---------------------------------<br />8 16 24 32 40<br />---------------------------------<br />इस प्रोग्राम में दो पूर्णांक राशियां घोषित की गई हैं, ganak और soochak। ganak को 0 और soochak को 1 का मान दिया गया है। while वलय के गोल कोष्ठकों में आप इस बार 1 संख्या देखकर कुछ हैरान हुए होंगे। यह 1 वहां इसलिए है क्योंकि हम वलय से निकलने के लिए while वलय के तार्किक व्यंजक के मान के 0 होने पर नहीं, बल्कि उसके धनु कोष्ठकों के भीतर छिपे break निर्देश पर निर्भर हैं। हम चाहते हैं कि while वलय तब तक चलता रहे जब तक यह break निर्देश उसे तोड़ न दे। इसके लिए हर स्थिति में while के कोष्ठकों का मान 1 होना जरूरी है। इसीलिए while के गोल कोष्ठकों में 1 रखा गया है।<br /><br />while के भीतर पहली उक्ति printf() वाली है, जो 8 और soochak के वर्तमान मान के गुणनफल को स्क्रीन पर छापती है। ध्यान दें कि printf() के दुहरे उद्धरण चिह्नों के बाद %d के बाद एक रिक्त स्थान भी है, ताकि अगला अंक पहले अंक से बिलकुल सटकर न छपे और दोनों के बीच दूरी रहे। चूंकि प्रथम आवृत्ति पर soochak का मान 1 है, इसलिए स्क्रीन पर 8 और एक खाली जगह छपेगा।<br /><br />इसके बाद दो इंक्रिमेंट निर्देश हैं जो क्रमशः soochak के मान को 2 और ganak के मान को 1 बना देते हैं। यह ganak ही वह राशि है, जो छपे हुए गुणजों की गिनती रखता है। इसके बाद if वाली उक्ति है, जो ganak के मान को 5 से तुलना करके देखता है, और उसके नीचे के break निर्देश का निष्पादन तभी होता है जब ganak का मान 5 से अधिक हो जाए।<br /><br />अभी, चूंकि ganak का मान 1 है, जो 5 से कम है, if के निर्देशों का निष्पादन नहीं होता, और प्रोग्राम का नियंत्रण वापिस while उक्ति को लौट जाता है। यहां चूंकि कोष्ठकों में 1 है, नियंत्रण while की उक्तियों का निष्पादन करने लगता है और स्क्रीन पर 8 का अगला गुणज छपता है।<br /><br />इस प्रकार पांच आवृत्तियां होती हैं, और तब if का तार्किक व्यंजक का मान 1 हो जाता है, क्योंकि अब ganak का मान 5 हो गया है। इसलिए ganak >= 5 व्यंजन का मान 1 हो जाता है और if की break वाली उक्ति का निष्पादन होता है। यह वलय को तोड़ देता है और नियंत्रण प्रोग्राम की अलगी उक्ति की ओर बढ़ता है, जो है return (0); वाली उक्ति। इसलिए प्रोग्राम का समापन हो जाता है।<br /><br />इस उदाहरण में मामूली सा परिवर्तन करने पर वह exit निर्देश का एक अच्छा उदाहरण हो सकता है। इन परिवर्तनों के साथ उपर्युक्त प्रोग्राम नीचे दिया गया है। यहां break के स्थान पर exit (0) आया है।<br /><br /><span style="font-weight:bold;">प्रोग्राम – 22</span><br />---------------------------------<br />/*exit nirdesh ka udaharan */<br /><br />#include <stdio.h><br />#include <conio.h><br />#include <stdlib.h><br /><br />void main()<br />{<br />clrscr();<br /><br />int ganak=0;<br />int soochak=1;<br />while(1)<br />{<br />printf("%d ", 8*soochak);<br />soochak++;<br />ganak++;<br />if (ganak >= 5)<br />exit(0);<br />}<br /><br />getch();<br />}<br />---------------------------------<br /><br /><span style="font-weight:bold;">आउटपुट</span><br />---------------------------------<br />8 16 24 32 49<br />---------------------------------<br /><br />अब आइए इस परिवर्तित प्रोग्राम को दखें। जब ganak का मान 5 हो जाता है और if निर्देश के अंतर्गत आया exit (0) निर्देश के निष्पादन की नौबत आती है, तो वह तुरंत ही प्रोग्राम के नियंत्रण को प्रचालन तंत्र को, यानी डॉस को, लौटा देता है। exit (0); निर्देश के बाद कोई भी निर्देश रखना व्यर्थ है, क्योंकि इन निर्देशों का कभी निष्पादन नहीं होता। इस प्रोग्राम के अंत में जो getch() वाला निर्देश है, उसका इसी कारण निष्पादन नहीं होता। exit (0) के कारणउस तक पहुंचने से पहले ही प्रोग्राम का अंत हो जाता है।<br /><br />एक और बात ध्यान देने लायक है। exit (0) stdlib का फंक्शन इसलिए उसका उपयोग करने के लिए हमें stdlib के हेडर फाइल को अपने प्रोग्राम में include करना होगा। इसीलिए इस प्रोग्राम के शुरू में यह पंक्ति है – <br /><br />#include <stdlib.h><br /><br />अंतिम उदाहरण एक साथ इन तीनों निर्देशों का उदाहरण है, पर आप विशेष ध्यान continue निर्देश के कार्य पर दीजिए। continue निर्देश प्रोग्राम के उपयोगकर्ताओं को अनुचित सूचनाएं टंकित करने से रोकने में बहुत उपयोगी है। नीचे दिए गए इस अध्याय के अंतिम प्रोग्राम में हम चाहते हैं कि प्रोग्राम में उपयोगकर्ता केवल 1 या 0 में से कोई अंक ही ऐंटर करे। 1 while की उक्तियों के निष्पादन के लिए, और 0 प्रोग्राम से बाहर निकलने के लिए।<br /><br />इस प्रोग्राम में while की उक्तियों में एक साधारण-सी printf() उक्ति है, पर उसके स्थान पर कोई लंबा-चौड़ा कोड या उप-प्रोग्राम भी हो सकता है। यहां हमारा उद्देश्य continue, आदि निर्देशों के कार्य करने की रीति को दर्शाना मात्र है। यदि उपयोगकर्ता 1 या 0 से अलग कोई कुंजी दबाता है, तो प्रोग्राम continue निर्देश की सहायता से उसे उसकी गलती की सूचना देता है, और दुबारा कोशिश करने को कहता है।<br /><br /><span style="font-weight:bold;">प्रोग्राम – 23</span><br />---------------------------------<br />/*continue, break aur exit nirdesh ka udaharan */<br /><br />#include <stdio.h><br />#include <conio.h><br />#include <stdlib.h><br /><br />void main()<br />{<br />clrscr();<br /><br />int vikalp;<br /><br />printf("Kya aap aage badna chahte hai? 'Han' ke liye 1 aur 'na' ke liye 0 enter kijie: \n");<br />scanf("%d", &vikalp);<br />flushall();<br /><br />while(1) {<br /><br />if (vikalp != 1 && vikalp != 0)<br />{<br />printf("Aapne galat kunji dabai. Kripaya 1 ya 0 me se koi kunji dabaiye: \n");<br />scanf("%d", &vikalp);<br />continue;<br />}<br /><br />if (vikalp == 1)<br />{<br />printf("Program me aapka swagat hai.\n");<br />break;<br />}<br /><br />else if (vikalp == 0)<br />exit (0);<br />}<br />getch();<br />}<br />---------------------------------<br /><br /><span style="font-weight:bold;">आउटपुट</span><br />---------------------------------<br />Kya aap aage badna chahte hai? 'Han' ke liye 1 aur 'na' ke liye 0 enter kijie: 9<br />Aapne galat kunji dabai. Kripaya 1 ya 0 me se koi kunji dabaiye: 1<br />Program me aapka swagat hai.<br /><br />Aapne galat kunji dabai. Kripaya 1 ya 0 me se koi kunji dabaiye: 0<br />(प्रोग्राम से आप बाहर आ जाते हैं।)<br /><br />Aapne galat kunji dabai. Kripaya 1 ya 0 me se koi kunji dabaiye: 1<br />Program me aapka swagat hai.<br /><br />Aapne galat kunji dabai. Kripaya 1 ya 0 me se koi kunji dabaiye:6<br />Aapne galat kunji dabai. Kripaya 1 ya 0 me se koi kunji dabaiye:<br />---------------------------------<br /><br />इस प्रोग्राम में हमने प्रथम scanf() निर्देश के बाद flushall() का उपयोग किया है। यह इसलिए क्योंकि प्रोग्राम में आगे एक और scanf() कथन आता है, और यदि हम इनपुट स्ट्रीम को साफ न करें, उसमें रह गए ऐंटर कुंजी को दूसरा scanf() कथन पकड़ लेगा और उसे vikalp में रख देगा, जिससे हमारा प्रोग्राम ठीक से काम नहीं करेगा।<br /><br />प्रथम if निर्देश के तार्किक व्यंजन पर भी ध्यान दें। वह है – <br /><br />if (vikalp != 1 && vikalp != 0)<br /><br />यहां दो तार्किक व्यंजक && (ऐंड अर्थात और) प्रचालक से जुड़े हुए हैं –<br /><br />vikalp != 1 <br />vikalp != 0<br /><br />इसलिए इस तार्किक व्यंजक का मान तभी 1 बनेगा जब ये दोनों का मान 1 होगा। अन्य शब्दों में कहें, तो जब इनपुट 1 और 0 के अलावा कुछ होगा। जब ऐसा होता है, तो प्रोग्राम यह वाक्य प्रदर्शित करता है,<br /><br />Aapne galat kunji dabai. Kripaya 1 ya 0 me se koi kunji dabaiye:<br /><br />और इनपुट के लिए प्रतीक्षा करता है।बालसुब्रमण्यम लक्ष्मीनारायणhttp://www.blogger.com/profile/09013592588359905805noreply@blogger.com2tag:blogger.com,1999:blog-4963974732144575217.post-81587134908389652132009-05-18T23:53:00.000-07:002009-05-18T23:57:25.022-07:00सीखिए सी - 24 : आवर्तन की संरचनाएं : for लूपwhile और do... while लूपों में लूप के कोड़ खंड का कितनी बार आवर्तन होता है, यह निश्चित नहीं होता है। जब तक इनकी while उक्ति के गोल कोष्ठक में विद्यमान तार्किक व्यंजन का मान 1 होता है, कोड खंड का आवर्तन होता रहता है।<br /><br />कई बार हमें इसकी आवश्यकता रहती है कि कोड खंड का आवर्तन पूर्वनिश्चित बार ही हो। इस तरह की आवश्यकताओं की पूर्ति हेतु सी में for लूप की व्यवस्था है, जो निश्चित बार आवर्तन करता है। यद्यपि for लूप निश्चित बार आवर्तन के लिए बना है, लेकिन वह अत्यंत लचीला है और उसे प्रोग्रामर while लूप के समान भी काम करा सकता है। लेकिन शुरुआत के लिए हम उसके मूल रूप से परिचय बढ़ाएं। for लूप का हुलिया इस प्रकार होता है:-<br /><br />for (प्रारंभिक मान; शर्त; प्रारंभिक मान में वृद्धि)<br />{<br />उक्तियां;<br />}<br /><br />ध्यान दें कि for लूप के गोल कोष्ठकों के बीच तीन उक्तियां हैं, जिन्हें दो अर्ध विरामें से अलग किया गया है। ये हैं:<br /><br /><ul><li>प्रारंभिक मान</li><li>शर्त</li><li>प्रारंभिक मान में वृद्धि</li></ul><br />for लूप को चलाने के लिए सबसे पहले एक लूप गणक निश्चित किया जाता है, जो int (पूर्णांक) प्रकार की कोई राशि होती है। इसे कोई प्रारंभिक मान दिया जाता है, जो सामान्यतः 0 अथवा 1 होता है, पर कोई भी पूर्ण संख्या हो सकता है।<br /><br />इसके बाद for लूप के आवर्तन के लिए आवश्यक कोई शर्त रखी जाती है। सामान्यतः यह लूप गणक का किसी उच्चतम मान से छोटा होना या बड़ा होना होता है, पर कोई भी अन्य शर्त भी हो सकती है। इतना ही नहीं, यहां एक से अधिक शर्त भी हो सकते हैं, जिन्हें एंड (&&) या ओर (||) प्रचालकों से जोड़ा जा सकता है। संकलक इन सभी शर्तों का एक साथ मूल्यांकन करेगा और उनका सम्मिलित तार्किक मान निर्धारित करेगा। यदि यह मान 1 निकले, तो लूप की उक्तियों का निष्पादन होगा, यदि 0 निकले, तो लूप टूट जाएगा और संकलक प्रोग्राम में लूप के बाद आनेवाली उक्तियों का निष्पादन करने लगेगा।<br /><br />तीसरी उक्ति लूप गणक के मान में वृद्धि करनेवाली उक्ति होती है। हमने while loop के संबंध में बताया था कि while लूप के कोड खंड में ऐसी कोई उक्ति होनी चाहिए जो लूप के शर्त को बदले, अन्यथा while loop अनंत काल तक चलता रहेगा। for लूप में इस उक्ति को उसके कोड खंड में न रखकर स्वयं for लूप के गोल कोष्ठकों के अंदर अंत में रखा जाता है। ऊपर के पैरा में बताया गया था कि for लूप में अक्सर तार्किक व्यंजक के रूप में लूप गणक को किसी पूर्वनिश्चित मान से तुलना कराया जाता है और यदि लूप गणक इस मान से छोटा या बढ़ा हुआ, तो लूप टूट जाता है। इसके लिए यह आवश्यक है कि लूप के हर आवर्तन के बाद लूप गणक का मान घटे या बढ़े। इससे संबंधित उक्ति for लूप के गोल कोष्ठकों में विद्यमान अंतिम उक्ति में रहता है। यही वह उक्ति है जो for लूप के तार्किक व्यंजन (लूप तोड़नेवाली शर्त) के मान में परिवर्तन लाता रहता है, और एक निश्चित बार for लूप के आवर्त के बाद उस तार्किक व्यंजन के मान को 0 कर देता है, जिससे लूप टूट जाता है।<br /><br />आइए एक वास्तविक उदाहरण से for लूप के कार्य करने को समझें। इस छोटे प्रोग्राम में एक for लूप की मदद से 1 से 5 तक की संख्याओं को मुद्रित किया जाता है।<br /><br /><span style="font-weight:bold;">प्रोग्राम – 20</span><br />---------------------------------<br />/*for loop ka udaharan */<br /><br />#incldue <stdio.h><br />#incldue <conio.h><br /><br /><br />void main()<br />{<br />clrscr();<br /><br />int ganak;<br />for (gank=1; x<=5;ganak++)<br /> {<br /> printf(“%d\n”, ganak);<br /> }<br />getch();<br />}<br />---------------------------------<br /><br /><span style="font-weight:bold;">आउटपुट:</span><br />---------------------------------<br />1<br />2<br />3<br />4<br />5<br />---------------------------------<br /><br />आइए इस प्रोग्राम को समझते हैं। इसमें सबसे पहले एक int प्रकार की राशि घोषित की गई है, जिसका नाम ganak रखा गया है।<br /><br />इस ganak राशि को for लूप के गोल कोष्ठक की प्रथम उक्ति में 1 का मान दिया गया है। for लूप की तार्किक व्यंयन के रूप में यह शर्त रखी गई है कि ganak का मान 5 से कम या उसके बराबर होना चाहिए। इस सी उक्ति को देखिए, जिसमें यह बात कही गई है:-<br /><br />ganak<=5;<br /><br />for लूप की तीसरी उक्ति में ganak पर इंक्रिमेंट प्रचालक का प्रयोग किया गया है:-<br /><br />ganak++<br /><br />for लूप के कोड खंड में केवल एक उक्ति है, जो ganak के मान को printf () की मदद से अलग पंक्ति में स्क्रीन पर मुद्रित करता है।<br /><br />for लूप के हर आवर्तन में ganak का मान 1 से बढ़ जाता है (ganak++ के कारण) और जब उसका मान 6 हो जाता है, तो लूप टूट जाता है।<br /><br />for लूप के गोल कोष्ठकों में दो अर्धविरामों से अलगाए गए तीन कोड क्षेत्रों में से प्रत्येक में एक से अधिक उक्तियां भी हो सकती हैं, यथा,<br /><br />for (int ganak1=0, int ganak2 =100; शर्त 1 && शर्त 2 || शर्त 3; ganak1++, ganak2--)<br /><br />उपर्युक्त for लूप में दो गणक हैं ganak1 और ganak2 और तीन शर्ते हैं जो && और || से जुड़े हुए हैं। लूप के हर आवर्तन में ganak1 का मान 1 से बढ़ता जाता है, और ganak2 का मान 1 से घटता जाता है।<br /><br />इस तरह से for लूप को अनेक वास्तविक परिस्थितियों में प्रयोग किया जा सकता है, और उसे while लूप की तरह भी काम कराया जा सकता है, इस तरह:-<br /><br />for (;शर्त;)<br />{<br />उक्तियां;<br />}<br /><br />इसमें for लूप के गोल कोष्ठकों में केवल एक क्षेत्र में कोड है, यानी शर्त वाले क्षेत्र में, बाकी दो में कोई उक्ति नहीं है। अर्ध विरामों का प्रयोग फिर भी हुआ है क्योंकि ये for लूप के वाक्य-विन्यास का आवश्यक अंग हैं। यह for लूप while loop के समान कार्य करेगा और जब तक शर्त का मान 1 हो, लूप चलता रहेगा। हां, उसके कोड खंड में ऐसी कोई उक्ति होनी चाहिए जो कभी न कभी शर्त को गलत बनाए, अन्यथा यह लूप निरंतर चलता जाएगा।<br /><br />आप पूछ सकते हैं कि यदि for लूप से while लूप का काम भी लिया जा सकता है तो while लूप है ही क्यों, उसका आवश्यकता ही क्या है?<br /><br />इसका जवाब यह है कि प्रोग्रामों का एक आवश्यक गुण यह होता है कि वे कम से कम समय में निष्पादित हों। इसलिए प्रोग्रामर हमेशा ऐसे कोड लिखने का प्रयत्न करते हैं जिसका निष्पादन ज्यादा तेजी से हो। जब आप सी को कुछ बेहतर रूप से समझने लगेंगे, आपको विदित होगा कि एक ही काम को करने के लिए सी में कोड कई तरह से लिखे जा सकते हैं। पर उनमें से कुछ प्रकार अधिक तेजी से निष्पादित होंगे, कुछ कम तेजी से, और साधारण प्रोग्रामर और गुरु प्रोग्रामर में यही अंतर होता है कि गुरु प्रोग्रामर हमेशा ऐसा कोड लिखेगा जो अधिक तेजी से निष्पादित हो।<br /><br />तो while लूप की संरचना for लूप की तुलना में अधिक सरल है और कंप्यूटर while लूप को for लूप से अधिक तेजी से निष्पादित करता है। आपने देखा है कि for लूप के गोल कोष्ठकों में तीन कोड क्षेत्र और प्रत्येक में कई उक्तियां हो सकती है। इसलिए जब कंप्यूटर for लूप का निष्पादन करता है, तो लूप के हर आवर्तन में उसे इन सभी उक्तियों का मूल्यांकन करना पड़ता है। सी के कुछ बड़े और जटिल प्रोग्रामों में लूप वाले खंडों का आवर्तन सैकड़ों बार हो सकता है। इसलिए for लूप का निष्पदान while लूप की तुलना में उल्लेखनीय रूप से धीमा होता है।<br /><br />तो ध्यान रखनेवाली बात यह है कि जब आवर्तन कितनी बार होगा यह ठीक से पता न हो, तो while लूप का प्रयोग करें, और जब यह पता हो कि ठीक कितनी बार लूप का आवर्तन होगा, तो for लूप का प्रयोग करें।<br /><br />और यदि लूप को कोड खंड का निष्पादन प्रथम बार हर स्थिति में (लूप की शर्त गलत होने की स्थिति में भी) कराना आवश्यक हो, तो do... while लूप का प्रयोग करें।बालसुब्रमण्यम लक्ष्मीनारायणhttp://www.blogger.com/profile/09013592588359905805noreply@blogger.com2tag:blogger.com,1999:blog-4963974732144575217.post-46645005675614788212009-05-17T20:29:00.000-07:002009-05-17T20:32:21.988-07:00सीखए सी - 23 : आवर्तन की संरचनाएं - do... while लूपdo... while लूप while लूप का ही एक रूप है। इसमें और while लूप में फर्क यह है कि जहां while लूप में लूप तोड़ने वाली शर्त शूरू में रहता है, do... while लूप में यह शर्त अंत में आता है, इस तरह:-<br /><br />do<br />{<br />उक्तियां;<br />} while (शर्त);<br /><br />do... while लूप में धनु कोष्ठकों के बीच कई उक्तियां हो सकती हैं। उनमें से एक उक्ति ऐसी भी होनी चाहिए जो लूप तोड़नेवाली शर्त को बदलती हो, वरना लूप अनंत समय तक चलता रहेगा।<br /><br />while और do... while लूप की संरचना में एक अन्य अंतर यह है कि while लूप में गोल कोष्ठकों के बाद अर्ध विराम चिह्न (;) नहीं है, जबकि do... while लूप में गोल कोष्टकों के बाद अर्ध विराम चिह्न (;) होता है। यह एक महत्वपूर्ण अंतर है। यदि do... while लूप के अंत में अर्ध विराम चिह्न (;) न रखा जाए तो संकलक को पता नहीं चल पाएगा कि while (शर्त) do... while लूप का भाग है अथवा एक स्वतंत्र while लूप।<br /><br />आइए एक उदाहरण से do... while लूप को समझते हैं।<br /><br /><span style="font-weight:bold;">प्रोग्राम – 19</span><br />---------------------------------<br />/*do... while ka udaharan */<br /><br />#include <stdio.h><br />#include <conio.h><br /><br />void main()<br />{<br />clrscr();<br /><br />int vetan=0;<br />char santusht = 'n';<br /><br />printf("\nKya aapko maloom hai ki computer jagt me vetan badana bahut saral hota hai? \n\nAapko keval apna vetan batana hai, baki sab computer sambhal lega. \n\nTo batayiye, aap ka vetan kya hai: ");<br />scanf("%d", &vetan);<br />flushall();<br /><br />do<br />{<br />printf("\Ab aapka vetan hai %d. Kya aap is vetan se santusht hai? Han ke liye y aur na ke like n darj karen: ", vetan+500);<br />scanf ("%c", &santusht);<br />flushall();<br />vetan = vetan + 500;<br />}<br />while (santusht == 'n');<br /><br />printf ("\nDhanyavad. Aasha hai ab aap achcha kaam karenge.");<br />getch();<br />}<br />---------------------------------<br /><br /><span style="font-weight:bold;">आउटपुट</span><br />---------------------------------<br />Kya aapko maloom hai ki computer jagt me vetan badana bahut saral hota hai?<br />Aapko keval apna vetan batana hai, baki sab computer sambhal lega.<br />To batayiye, aap ka vetan kya hai: 10000<br />Ab aapka vetan hai 10500. Kya aap is vetan se santusht hai? Han ke liye y aur na ke like n darj karen: n<br />Ab aapka vetan hai 11000. Kya aap is vetan se santusht hai? Han ke liye y aur na ke like n darj karen: y<br />Dhanyavad. Aasha hai ab aap achcha kaam karenge.<br />---------------------------------<br /><br />इस प्रोग्राम में दो राशियां घोषित की गई हैं – vetan और santusht। पहली int प्रकार की राशि है, जिसे 0 का मान दिया गया है। दूसरी char प्रकार की राशि है, जिसे n का मान दिया गया है।<br /><br />scanf के जरिए प्रयोक्ता के वेतना का पता लगाया जाता है और उसे vetan में संचित किया जाता है।<br /><br />इसके बाद वाला कथन आपके लिए नया है, इसलिए इसके बारे में कुछ विस्तार से समझाते हैं। यह कथन है – <br /><br />flushall();<br /><br />यह stdio लाइब्रेरी का एक फंश्नन है। scanf एक जटिल फंक्शन है, जो कभी-कभी अवांछित परिणाम देता है। उसके द्वारा इनपुट किए गए राशि को ठीक से पकड़वाने के लिए कुछ तिकड़क करने पड़ते हैं। इस प्रोग्राम के उस printf कथन पर विचार कीजिए जिसमें प्रोग्राम चलानेवाले व्यक्ति से अपने वेतन का खुलासा करने को कहा गया है। इस कथन के बाद कंप्यूटर प्रयोक्ता द्वारा अपना वेतन इनपुट करने के लिए रुका रहता है। प्रयोक्ता कोई मान इनपुट करता है, जैसे 10000। उसके बाद यह सूचित करने के लिए कि उसने इनपुट कर दिया है, ऐंटर कुंजी को दबा देता है। अब कंप्यूटर के इनपुट स्ट्रीम में दो वर्ण जमा हो गए हैं, 10000 और ऐंटर कुंजी का वर्ण। इनमें से हमें केवल पहला इनपुट चाहिए। यदि दूसरा इनपुट, यानी ऐंटर, इनपुट स्ट्रीम में रह जाए, तो यह प्रोग्राम में आगे गड़बड़ी फैला सकता है क्योंकि अगली बार जब आप scanf का उपयोग करेंगे, तो वह इस ऐंटर वर्ण को पकड़ेगा क्योंकि यही इनपुट स्ट्रीम में सबसे आगे रहेगा। इस अवांछित स्थिति से बचने के लिए हर बार scanf का उपयोग करने के बाद इनपुट स्ट्रीम को खाली करना जरूरी है। flushall() वाला फंक्शन यही करता है, ताकि जब भी आप scanf का उपयोग करें, आपको प्रयोक्ता द्वारा किया गया इनपुट ही मिले न कि इनपुट स्ट्रीम में रह गया कोई फालतू का वर्ण।<br /><br />तो इसे ध्यान में रखिए। scanf का उपयोग करने के बाद हमेशा flushall() का उपयोग करें। यदि किसी प्रोग्राम में scanf के कारण गलत परिणाम मिल रहे हों, तो scanf के बाद flushall(); कथन रखकर देखें। इससे आपका प्रोग्राम ठीक से चलने लगेगा।<br /><br />ठीक है, अब हम प्रोग्राम – 19 की ओर लौटते हैं। इस flushall (); उक्ति के बाद do... while लूप का do वाला भाग आता है। इसके धनु कोष्ठकों में ये उक्तियां हैं –<br /><br />{<br />printf("\Ab aapka vetan hai %d. Kya aap is vetan se santusht hai? Han ke liye y aur na ke like n darj karen: ", vetan+500);<br />scanf ("%c", &santusht);<br />flushall();<br />vetan = vetan + 500;<br />}<br /><br />printf कथन आपके वेतन में 500 का इजाफा कर देता है। इसी कथन में आपसे यह भी पूछा जाता है कि क्या आप इस वेतन से संतुष्ट हैं?<br /><br />इसके बाद, scanf आपके उत्तर को (n या y) santusht में सहेज लेता है। इसके बाद वही flushall() कथन है।<br /><br />अंतिम पंक्ति में vetan को 500 से बढ़ा दिया जाता है।<br /><br />इसके बाद do... while लूप का while वाला भाग आता है, जो यह है -<br /><br />while (santusht == 'n');<br /><br />यह साधारण while लूप के समान ही है, केवल एक अंतर है। इसके अंत में अर्ध विराम (;) है। यह महत्वपूर्ण है। यदि इसे छोड़ दिया जाए, तो do... while लूप ठीक से काम नहीं करेगा।<br /><br />इस उक्ति पर पहुंचकर कंप्यूटर देखता है कि क्या santusht का मान n है? यदि n है, तो do की उक्तियों का आवर्तन करता है। यदि नहीं है, तो do... while लूप टूट जाता है, और प्रोग्राम में उसके बाद की उक्तियों का निष्पादन होता है। इस प्रोग्राम में do... while के बाद एक printf कथन है, जो प्रयोक्ता को धन्यवाद देता है। कंप्यूटर इसका निष्पादन कर देता है।<br /><br />इस उदाहरण से आपको while और do... while लूप का अंतर स्पष्ट हो गया होगा। while लूप का प्रयोग सामान्य आवर्तन के लिए होता है। लेकिन यदि ऐसी कोई स्थिति हो जिसमें आवर्तन शुरू करने से पहले कुछ आवश्यक कोड पंक्तियों का निष्पादन जरूरी हो, तो do... while अधिक उपयुक्त है।बालसुब्रमण्यम लक्ष्मीनारायणhttp://www.blogger.com/profile/09013592588359905805noreply@blogger.com1tag:blogger.com,1999:blog-4963974732144575217.post-79243901347364448972009-05-16T18:37:00.000-07:002009-05-17T08:49:02.763-07:00सीखए सी - 22 : अभ्यास 3 का हल<span style="font-weight:bold;">1.<br />प्रोग्राम -15</span><br />---------------------------------<br /><br />/*Abhyas - 3 : 1 ka hal*/<br />#include <stdio.h><br />#include <conio.h><br /><br />void main()<br />{<br />clrscr();<br />int sankhya=0;<br />while (sankhya < 5)<br />{<br />printf("\nJaihindi!");<br />sankhya++;<br />}<br />getch();<br />}<br />---------------------------------<br /><br /><span style="font-weight:bold;">आउटपुट</span><br />---------------------------------<br />Jaihindi!<br />Jaihindi!<br />Jaihindi!<br />Jaihindi!<br />Jaihindi!<br />---------------------------------<br /><br /><span style="font-weight:bold;">2.<br />प्रोग्राम – 16</span><br />---------------------------------<br />/*Abhyas - 3 : 2 - kisi sankhya ki gunan talika (pahada) */<br /><br />#include <stdio.h><br />#include <conio.h><br /><br />void main()<br />{<br />clrscr();<br /><br />int sankhya=0;<br />int ganak=1;<br />printf("\nAap kis sankhya ki gunan talika (pahada) banvana chate hai?");<br />scanf("%d",&sankhya);<br /><br />while (ganak <= 10)<br />{<br />printf("\n%d x %d = %d", ganak, sankhya, ganak*sankhya);<br />ganak++;<br />}<br />getch();<br />}<br />---------------------------------<br /><br /><span style="font-weight:bold;">आउटपुट</span><br />---------------------------------<br />Aap kis sankhya ki gunan talika (pahada) banvana chate hai? 6<br />1 x 6 = 6<br />2 x 6 = 12<br />3 x 6 = 18<br />4 x 6 = 24<br />5 x 6 = 30<br />6 x 6 = 36<br />7 x 6 = 42<br />8 x 6 = 48<br />9 x 6 = 54<br />10 x 6 = 60<br />---------------------------------<br /><br />इस प्रोग्राम के printf वाली उक्ति पर विशेष ध्यान दीजिए। उसे यहां मैं दुबारा दे रहा हूं –<br /><br />printf("\n%d x %d = %d", ganak, sankhya, ganak*sankhya);<br /><br />इसमें तीन %d वाले अंश हैं। प्रथम दो तो ganak और sankhya का प्रतिनिधित्व करते हैं, लेकिन तीसरा %d द्वारा gank और sankhya के गुणनफल को प्रदर्शित किया जाता है। यह गुणनफल printf के गोल कोष्ठकों के भीतर ही निकाला जाता है, इस व्यंजक में – <br /><br />ganak*sankhya<br /><br />printf के बारे में यह एक नई बात आपने सीखी है। इस तरह के अनेक शोटकट सी में संभव हैं। जैसे-जैसे आप सी को बहतर रूप से जानने लगेंगे, इन शोटकटों से आप परिचित होते जाएंगे।<br /><br /><span style="font-weight:bold;">3.<br />प्रोग्राम – 17</span><br />---------------------------------<br />/*Abhyas - 3 : 3 - 1 se lekar 100 sankhyaon ka yog */<br /><br />#include <stdio.h><br />#include <conio.h><br /><br /><br />void main()<br />{<br />clrscr();<br /><br />int yog=0;<br />int sankhya=1;<br />int ganak=1;<br /><br />while (ganak <= 100)<br />{<br />yog=yog+sankhya++;<br />ganak++;<br />}<br />printf("\n1 se lekar 100 tak ki sankhayon ka yog %d hai.", yog);<br />getch();<br />}<br /><br />---------------------------------<br /><br /><span style="font-weight:bold;">आउटपुट</span><br />---------------------------------<br />1 se lekar 100 tak ki sankhyaon ka yog 5050 hai.<br />---------------------------------<br /><br />इस प्रोग्राम की केंद्रीय उक्ति यह है –<br /><br />yog=yog+sankhya++;<br /><br />yog नामक राशि में 1 से लेकर 100 तक के अंकों का योग जमा किया जाता है। हर बार जब while लूप घूमता है, yog में एक प्राकृतिक संख्या (sankhya) जोड़ी जाती है। yog का प्रारंभिक मान 0 रखा गया है। while लूप के हर आवर्तन में उसके साथ sankhya का मान जोड़ा जाता है। लूप के प्रत्येक आवर्तन में sankhya का मान 1 से बढ़ाया जाता है, इस कथन द्वारा –<br /><br />sankhya++;<br /><br />लूप तब टूटता है जब गणक का मान 101 हो जाता है।<br /><br /><span style="font-weight:bold;">4.<br />प्रोग्राम – 18</span><br />---------------------------------<br />/*Abhyas - 3 : 4 - 1 se lekar kisi vanchit sankhya tak ki sankhyaon ka yog */<br /><br />#include <stdio.h><br />#include <conio.h><br /><br /><br />void main()<br />{<br />clrscr();<br /><br />int yog=0;<br />int sankhya=1;<br />int ganak=1;<br />int vanchitsankhya=0;<br />printf("\nAap 1 se lekar kitni tak ki sankhyaon ka yog janna chahte hai? ");<br />scanf("%d",&vanchitsankhya);<br /><br />while (ganak <= vanchitsankhya)<br />{<br />yog=yog+sankhya++;<br />ganak++;<br />}<br />printf("\n1 se lekar %d tak ki sankhayon ka yog %d hai.", vanchitsankhya, yog);<br />getch();<br />}<br />---------------------------------<br /><br /><span style="font-weight:bold;">आउटपुट</span><br />---------------------------------<br />Aap 1 se lekar kitni tak ki sankhyaon ka yog janna chahte hai? 25<br />1 se lekar 25 tak ki sankhayon ka yog 325 hai.<br />---------------------------------<br /><br />इस प्रोग्राम में पिछले प्रोग्राम के 100 वाली संख्या की जगह vanchitsankhya के मान का प्रयोग किया जाता है। vanchitsankhya का मान प्रोग्राम के निष्पादन के दौरान scanf के जरिए प्राप्त किया जाता है।बालसुब्रमण्यम लक्ष्मीनारायणhttp://www.blogger.com/profile/09013592588359905805noreply@blogger.com1tag:blogger.com,1999:blog-4963974732144575217.post-5651335710742674452009-05-11T03:14:00.000-07:002009-05-11T03:21:37.545-07:00सीखए सी - 21 : आवर्तन की संरचनाएं - while लूपकंप्यूटर की एक खासियत यह है कि वह निर्देशों के किसी खंड का निष्पादन अनेक बार कर सकता है। इसे संभव बनानेवाली संरचनाओं को लूपिंग संरचनाएं कहते हैं। सी में इस प्रकार की तीन संरचनाएं हैं - while, do... while, और for। इस लेख में हम केवल while लूप पर विचार करेंगे।<br /><br /><span style="font-weight:bold;">while लूप</span><br />while लूप का रूप इस प्रकार होता है:<br /><br />while (तार्किक व्यंजक)<br />{<br />उक्तियां;<br />}<br /><br />while शब्द के आगे के गोल कोष्ठकों में एक या अधिक तार्किक व्यंजक रहते हैं। इनका सम्मिलित मान प्रारंभ में 1 होता है। इसके बाद धनु कोष्ठकों के भीतर एक या अधिक उक्तियां होती हैं। उनमें से कोई एक उक्ति गोल कोष्ठक में मौजूद किसी राशि को परिवर्तित करनेवाली उक्ति होती है। कंप्यूटर इन उक्तियों का निष्पादन तब तक करता रहता है, जब तक कि while के गोल कोष्ठक के भीतर मौजूद तार्किक व्यंजक का मान 0 नहीं हो जाता। ध्यान रहे कि तार्किक व्यंजकों के केवल दो मान हो सकते हैं, 0 या 1।<br /><br />नीचे के प्रोग्राम में while वलय का उपयोग करते हुए 10 पंक्तियां मुद्रित की जाती हैं। प्रत्येक पंक्ति में उस पंक्ति की क्रम-संख्या भी छपती है।<br /><br /><span style="font-weight:bold;">प्रोग्राम-12</span><br />---------------------------------<br />/*while loop ka udaharan */<br /><br />#include <stdio.h><br />#include <conio.h><br /><br />void main()<br />{<br />clrscr();<br /><br />int kram_sankhya=1;<br /><br />while(kram_sankhya < 11)<br />{<br />printf("Yah pankti no. %d hai.\n", kram_sankhya);<br />kram_sankhya++;<br />}<br /><br />getch();<br />}<br />---------------------------------<br /><br /><span style="font-weight:bold;">आउटपुट:</span><br />---------------------------------<br />Yah pankti no. 1 hai.<br />Yah pankti no. 2 hai.<br />Yah pankti no. 3 hai.<br />Yah pankti no. 4 hai.<br />Yah pankti no. 5 hai.<br />Yah pankti no. 6 hai.<br />Yah pankti no. 7 hai.<br />Yah pankti no. 8 hai.<br />Yah pankti no. 9 hai.<br />Yah pankti no. 10 hai.<br />---------------------------------<br /><br />इस प्रोग्राम में सबसे पहले kram_sankhya नामक पूर्णांक राशि घोषित की गई है और उसे 1 का मान दिया गया है। तत्पश्चात while वलय शुरू होता है। उसके कोष्ठकों में एक तार्किक व्यंजक है, जो इस प्रकार है:<br /><br />kram_sankya <11<br /><br />इस तार्किक व्यंजक का मान 1 तब तक रहता है, जब तक kram_sankhya का मान 11 या उससे बड़ा नहीं हो जाता। फिलहाल उसका मान 1 है, क्योंकि हमने उसे प्रोग्राम के शुरू में यही मान दिया है। चूंकि यह मान 11 से कम है, उपर्युक्त तार्किक व्यंजन का मान भी 1 है।<br /><br />इसके बाद धनु कोष्ठकों में वे उक्तियां हैं, जिन्हें बार-बार दुहराना है। हमारे इस छोटे से प्रोग्राम में ऐसी केवल दो उक्तियां ही हैं। पहली उक्ति में printf() का आह्वान है। यह एक संदेश के भीतर एक पूर्णांक राशि को छापता है। यह पूर्णांक राशि kram_sankhya है। शुरू में इसका मान 1 है, इसलिए printf() यह वाक्य छापता है:<br /><br />Yah pankti no. 1 hai.<br /><br />चूंकि संदेश के अंत में \n है, printf() उपर्युक्त पंक्ति के बाद एक नई पंक्ति शुरू कर देता है, यानी कर्सर अलगी पंक्ति के शुरू में चला जाता है।<br /><br />प्रोग्राम की अगली उक्ति में kram_sankhya राशि पर इंक्रिमेंट प्रचालक ++ का प्रयोग हुआ है, जो kram_sankhya के मान को 1 से बढ़ा देता है, यानी 2 कर देता है। इसके बाद कोई और उक्ति नहीं है, इसलिए प्रोग्राम का नियंत्रण एक बार फिर while वलय के प्रारंभिक पंक्ति को लौटकर तार्किक व्यंजन का एक बार फिर परीक्षण करता है। चूंकि 2, 11 से छोटा है, इसलिए while के तार्किक व्यंजन का मान अब भी 1 बना हुआ है और प्रोग्राम नियंत्रण while वलय की उक्तियों की ओर बढ़ जाता है।<br /><br />यह क्रम दस बार चलता है और हर बार इंक्रिमेंट प्रचालक kram_sankhya का मान 1 से बढ़ाता जाता है। दसवीं बर इंक्रिमेंट प्रचालक kram_sankhya का मान 11 कर देता है। इसके बाद जब प्रोग्राम का नियंत्रण while के प्रारंभ में जाकर तार्किक व्यंजन की समीक्षा करता है, तो पाता है कि अब तार्किक व्यंजक का मान 0 हो गया है, क्योंकि 11, 11 से छोटा नहीं है। अतः प्रोग्राम नियंत्रण वलय के भीतर नहीं घुसता और वलय के बाद वाली उक्ति की ओर बढ़ जाता है।<br /><br />चूंकि वहां और कोई उक्ति नहीं है, इसलिए प्रोग्राम का समापन हो जाता है।<br /> <br />अब हम while वलय का उपयोग करते समय ध्यान में रखनेवाली दो बातों का उल्लेख करेंगे। ये हैं:<br /><br />1. while वलय के कोष्ठकों में जिस राशि का परीक्षण होता है, उसे while वलय के पूर्व कोई प्रारंभिक मान देना जरूरी है। इस उदाहरण में यह राशि kram_sankhya है, और उसे 1 का मान दिया गया है।<br /><br />2. धनु कोष्ठकों में मौजूद कोई एक उक्ति को इस राशि के मान में कोई परिवर्तन लाना चाहिए, तभी while वलय का समापन होगा। इस प्रोग्राम में इंक्रिमेंट प्रचालक kram_sankhya के मान को 1 से बढ़ाता जाता है, जिससे दसवीं आवृत्ति पर वह 11 का मान प्राप्त कर लेता है, जिससे while का तार्किक व्यंजन का मान 0 हो जाता है, और वलय टूट जाता है। यदि आप इस इंक्रिमेंट उक्ति को छोड़ देंगे, तो kram_sankhya का मान 1 पर ही निर्विकार बना रहेगा और while वलय बड़े मजे से अनंत काल तक घूमता रहेगा। इस अनंत वलय से पीछा छुड़ाना आपके लिए मुश्किल हो जाएगा। आपके प्रोग्रामों में इस प्रकार की अप्रिय स्थितियों से बचने के लिए while वलय का उपयोग करते समय ऊपर कही गई दोनों बातों पर गांठ बांध लीजिए।<br /><br />आइए एक और उदाहरण देखें:<br /><br /><span style="font-weight:bold;">प्रोग्राम-13</span><br />---------------------------------<br />/*while loop ka ek aur udaharan */<br /><br />#include <stdio.h><br />#include <conio.h><br /><br />void main()<br />{<br /><br />clrscr();<br /><br />int kram_sankhya=10;<br /><br /><br />printf("\nUlti ginti shuru!!!");<br /><br />while (kram_sankhya>=0)<br />{<br /><br />printf("\n%d", kram_sankhya);<br />kram_sankhya--;<br />}<br /><br />printf("\n\nYan ke rocket dago!\n");<br />getch();<br />}<br />---------------------------------<br /><br /><span style="font-weight:bold;">आउटपुट</span><br />---------------------------------<br />Ulti ginti shuru!!!<br />10<br />9<br />8<br />7<br />6<br />5<br />4<br />3<br />2<br />1<br />0<br />Yaan ke rocket dago!<br />---------------------------------<br /><br />यह प्रोग्राम किसी रोकेट यान के उड़ान भरने के पहले की उल्टी गिनती का निर्दशन करता है।<br /><br />यहां kram_sankhya को 10 का प्रारंभिक मान दिया गया है। while के तार्किक व्यंजक में इस बात का परीक्षण होता है कि kram_sankhya का मान 0 से बड़ा या उसके बराबर है, या नहीं। while के धनु कोष्ठकों में डिक्रिमेंट प्रचालक kram_sankhya के मान को हर आवृत्ति के दौरान 1 से कम करता जाता है, जिससे दसवीं आवृत्ति के अंत में उसका मान ऋणात्मक हो जाता है, यानी 0 से कम, और इस कारण से तार्किक व्यंजन का मान 0 हो जाता है, और while वलय बिखर जाता है।<br /><br />लीजिए एक और उदाहरण। यह गणित के छात्रों के लिए काम का हो सकता है, क्योंकि इसमें किसी संख्या का क्रमगुणित (फैक्टोरियल) ज्ञात किया जाता है। किसी संख्या का क्रमगुणित वह संख्या है जो उस संख्या तथा उसके पहले के सभी धनात्मक पूर्ण संख्याओं को आपस में गुणा करने पर प्राप्त होता है। उदाहरण के लिए 5 का क्रमगुणित होगा 5 x 4 x 3 x 2 x 1 = 120<br /><br /><span style="font-weight:bold;">प्रोग्राम-14</span><br />---------------------------------<br />/*while loop ki madat se kramganit (factorial) ka parikalan*/<br /><br />#include <stdio.h><br />#include <conio.h><br /><br /><br />void main()<br />{<br />clrscr();<br /><br />int sankhya, sankhyadharak;<br />long kramgunit;<br /><br />printf("25 se chota koi ek dhanatmak sankhya enter kijiye: \n");<br />scanf("%d", &sankhya);<br />sankhyadharak = sankhya;<br />kramgunit = 1;<br /><br />while (sankhya > 1)<br />{<br />kramgunit = kramgunit * sankhya;<br />sankhya--;<br />}<br /><br />printf ("%d ka kramgunit %ld hai.\n", sankhyadharak, kramgunit);<br />getch();<br />}<br />---------------------------------<br /><br /><span style="font-weight:bold;">आउटपुट</span><br />---------------------------------<br />25 se chota koi ek dhanatmak sankhya enter kijiye: 6<br />6 ka kramgunit 720 hai.<br />---------------------------------<br /><br />यहां दो पूर्णांक राशियां घोषित की गई हैं, sankhya और sankhyadharak और एक long प्रकार की राशि kramgunit । kramgunit के लिए long प्रकार चुनना इसलिए आवश्यक है क्योंकि क्रमगुणित संख्याएं बहुत बड़ी-बड़ी संख्याएं होती हैं, और वे साधारण int राशियों में नहीं समाएंगी। उदाहरण के लिए यदि आप kramgunit को int प्रकार की राशि घोषित करें, तो आपका प्रोग्राम 7 से अधिक संख्याओं के लिए काम नहीं करेगा। आपको kramgunit के रूप में कोई ऋणात्मक संख्या प्राप्त होगी। यह इसलिए क्योंकि int प्रकार की राशि में 36,000 से अधिक बड़ी संख्याएं नहीं समा सकतीं। यद्यपि long राशि में int राशि से कहीं बड़ी संख्याएं समा सकती हैं, फिर भी उसकी भी एक सीमा है, जिससे बड़ी संख्याएं उसमें नहीं समाएंगी। यदि आप इस प्रोग्राम में sankhya के लिए कोई बड़ी संख्या दें, जैसे, 100, तो यह प्रोग्राम सही परिणाम नहीं देगा। इसलिए प्रोग्राम लिखते समय प्रोग्राम में घोषित राशियों की सीमाओं का खास ध्यान रखना जरूरी होता है। इस प्रोग्राम में हमने सूचित किया है कि जो संख्या दर्ज की जाए, वह 25 से छोटा हो।<br /><br />आइए देखें कि यह प्रोग्राम कैसे काम करता है। चूंकि while वलय में डिक्रिमेंट प्रचालक sankhya के मान को बदलता है, इसलिए उसके प्रारंभिक मान को बचाकर रखने की आवश्यकता है, क्योंकि हम अंतिम printf() उक्ति में मूल संख्या को प्रदर्शित करना चाहते हैं। अतः sankhya के प्रारंभिक मान को sankhyadharak में आरोपित किया गया है।<br /><br />ध्यान दीजिए कि kramgunit को while वलय के पहले 1 का मान दिया गया है। यह इसलिए क्योंकि while वलय में kramgunit की गणना करने के लिए kramgunit को sankhya के वर्तमान मान से गुणन किया जाता है। चूंकि किसी संख्या को 1 से गुणन करने पर उसका मान नहीं बदलता, इसलिए while वलय के प्रथम बार निष्पादित होने पर जब sankhya को kramgunit से गुणन किया जाता है, तो प्रोग्राम का अंतिम परिणाम प्रभावित नहीं होता।<br /><br />while वलय के कोष्ठकों में वलय की हर आवृत्ति के पहले sankhya के मान का परीक्षण होता है और यह देखा जाता है कि वह 1 से बड़ा है या नहीं। वलय के धनु कोष्ठकों की उक्तियों का निष्पादन तभी होता है, जब sankhya का मान 1 से बड़ा होता है। धनु कोष्ठकों की उक्तियों में से डिक्रिमेंट वाला प्रचालक sankhya के मान को वलय की हर आवृत्ति पर 1 से घटाता जाता है, जिससे वलय अनंत वलय होने से बच जाता है।<br /><br />ध्यान दीजिए कि आउटपुट प्रिंट करने वाले printf कथन में हमें दूसरी संख्या के लिए %ld निरूपण चिह्न का प्रयोग किया है। यह इसलिए क्योंकि हमने इस दूसरी संख्या को, यानी kramgunit को long प्रकार की राशि घोषित किया है, और printf में long प्रकार की राशियों के लिए निरूपण चिह्न %ld ही होता है।<br /><br /><span style="font-weight:bold;">अभ्यास -3</span><br />1. while वलय का उपयोग करते हुए "Jai Hindi!" संदेश की आवृत्ति पांच बार करवाइए।<br /><br />2. while वलय की सहायता से किसी संख्या की गुणन तालिका (पहाड़ा) दर्शाइए। उदाहरण के लिए 3 का पहाड़ा इस प्रकार होगा:<br /><br />1 x 3 = 3<br />2 x 3 = 6<br />3 x 3 = 9<br />...<br />...<br />10 x 3 = 30<br /><br />3. while वलय की सहायता से 1 से लेकर 100 तक के पूर्णांकों का सम्मिलित योग ज्ञात कीजिए।<br /><br />4. प्रश्न 3 में इस प्रकार की तब्दीली कीजिए कि 100 के बजाए n संख्याओं का कुल योग ज्ञात हो। इस n का मान scanf() के जरिए प्रोग्राम के निष्पादन के दौरान प्राप्त किया जाए।बालसुब्रमण्यम लक्ष्मीनारायणhttp://www.blogger.com/profile/09013592588359905805noreply@blogger.com0tag:blogger.com,1999:blog-4963974732144575217.post-33178897031067670782009-05-06T20:47:00.000-07:002009-05-06T21:08:57.707-07:00सीखिए सी - 20 : सशर्त कथन ___ ?___ : ___<span style="font-weight:bold;">अभ्यास – 2 का हल</span><br /><br /><span style="font-weight:bold;">प्रोग्राम – 10</span><br />--------------------------------<br />/*Abhyas 2 ka hal */<br /><br /> #include <stdio.h><br /> #include <conio.h><br /><br />void main()<br />{<br /><br />clrscr();<br /><br />float praptank;<br /><br />printf("Batayiye, pariksha me kitne ank aaye: ");<br />scanf("%f", &praptank);<br />if(praptank >= 60)<br />{<br />printf("\nFirst Division.");<br />}<br /><br />else if (praptank >=50)<br />{<br />printf("\nSecond Division.");<br />}<br />else if(praptank >=40)<br />{<br />printf("\nThird Division.");<br />}<br />else<br />{<br />printf("\nFail.");<br />}<br />getch();<br />}<br />-------------------------------<br /><br /> <br /><span style="font-weight:bold;">आउटपुट</span><br />-------------------------------<br />Batayiye, pariksha me kitne ank aaye: 65<br />First Division.<br />Batayiye, pariksha me kitne ank aaye: 54<br />Second Division.<br />Batayiye, pariksha me kitne ank aaye: 45<br />Third Division<br />Batayiye, pariksha me kitne ank aaye: 35<br />Fail.<br />-------------------------------<br /><br />अब आपने सीख लिया है कि सी प्राग्रामों में if ... else संरचना की मदद से किस तरह विशाखन को अंजाम दिया जाता है।<br /><br />सी में विशाखन लाने के कुछ अन्य तरीके भी हैं, यथा ? प्रचालक और switch संरचना। इनमें से ? प्रचालक, जिसे सशर्त कथन (conditional statement) कहा जाता है, अधिक सरल है, और उसका विवेचन हम इस लेख में करेंगे। switch संरचना को ठीक से समझने के लिए continue, break और exit कथनों की थोड़ी जानकारी प्राप्त करना आवश्यक है। इन कथनों की जानकारी हम आवर्तन के बारे में सीखने के बाद प्राप्त करेंगे, और उसके बाद switch को भी समझेंगे।<br /><br />? प्रचालक का रूप इस तरह होता है।<br /><br />तार्किक कथन ? व्यंजक 1 : व्यंजक 2<br /><br />यानी, इसके तीन भाग होते हैं, जिन्हें ? और : द्वारा अलगाया हुआ होता है।<br /><br />पहला भाग एक तार्किक व्यंजक होता है, जिसका मूल्यांकन पहले होता है और इसके परिणाम स्वरूप सही (1) या गलत (0) का मान प्राप्त होता है। तार्किक कथन के मूल्यांकन से यदि सही का मान आए, तो व्यंजक 1 में विद्यमान मान प्राप्त होता है, और यदि गलत का मान आए, तो व्यंजक 2 का मान होता है।<br /><br />स्पष्ट ही सशर्त कथनों के प्रयोग से केवल दो विकल्पों को संभाला जा सकता है। दो से अधिक विकल्प होने पर if... else अथवा switch कथनों का सहारा लेना अनिवार्य हो जाता है।<br /><br />आइए, सशर्त कथनों को एक प्रोग्राम के जरिए समझते हैं।<br /><br /><span style="font-weight:bold;">प्रोग्राम -11</span><br />-------------------------------<br />/* ? prachalak (conditonal statement) ka udaharan */<br /><br />#include <stdio.h><br />#include <conio.h><br /><br />void main()<br />{<br />clrscr();<br /><br />float praptank;<br />char parinaam;<br /><br />printf("\nPariksha me kitne ank aaye: ");<br />scanf("%f", &praptank);<br /><br />result = (praptank>=40) ? 'P' : 'F';<br /><br />printf("\nParinaam: %c", result);<br /><br />getch();<br />}<br />-------------------------------<br /><br /><span style="font-weight:bold;">आउटपुट</span><br />-------------------------------<br />Pariksha me kitne ank aaye: 56<br />Parinaam: P<br />Pariksha me kitne ank aaye: 34<br />Parinaam: F<br />-------------------------------<br /><br />इस प्रोग्राम में दो राशियां घोषित की गई हैं, praptank जो float प्रकार की राशि है, और parinaam जो char प्रकार की राशि है। scanf के जरिए praptank में प्राप्तांक का मान जमा किया जाता है।<br /><br />इसके बाद की पंक्ति को ध्यान पूर्वक देखिए। आपकी सुविधा के लिए उसे यहां दुबारा दिया जा रहा है – <br /><br />result = (praptank>=40) ? 'P' : 'F';<br /><br />इसमें ? प्रचालक का उपयोग किया गया है। क्या आप इस प्रचालक में विद्यमान तीन व्यंजकों को पहचान पाएं? वे हैं – <br />1. (praptank>=40)<br />2. 'P'<br />3. 'F'<br /><br />प्रोग्राम की यह पंक्ति इस तरह से काम करती है –<br /><br />सबसे पहले praptank >= 40 का मूल्यांकन किया जाता है। यदि praptank 40 या उससे बड़ा हुआ, तो इस व्यंजनक को 1 का मान मिलता है, यानी यह व्यंजन सही ठहरता है। यदि praptank 40 से कम हुआ, तो इस व्यंजक को 0 का मान मिलता है, यानी यह व्यंजक गलत ठहरता है। यदि praptank >= 40 का मान 1 हो, तो result में P मान रख दिया जाता है। यदि praptank >= 40 का मान 0 हो, तो result में F मान रख दिया जाता है।<br /><br />सशर्त कथन, यानी ? प्रचालक हमेशा कोई एक मान लौटाता है। यदि उसकी प्रथम उक्ति का मान 1 है, तो वह ? के बाद वाला मान लौटाता है, और यदि प्रथम उक्ति का मान 0 है, तो : के बाद वाला मान। इस मान को किसी राशि में पकड़ा जा सकता है। उपर्युक्त उदाहरण में इस मान को result राशि में पकड़ा गया है। इसके लिए = प्रचालक का प्रयोग किया है। यह अपने दाहिनी ओर के मान को (इस उदाहरण में सशर्त कथन द्वारा लौटाए गए मान को) अपने बाईं ओर की राशि में जमा करता है, जो यहां result है।<br /><br />सशर्त कथन के बाद वाला prinft उक्ति result के मान को दर्शाता है।<br /><br />सशर्त कथन सी की उन विरल उक्तियों में से एक है जिन्हें त्रिपक्षीय (ternary) प्रचालक कहा जाता है, यानी ये तीन राशियों पर काम करते हैं। =, &&, / आदि अधिकांश अन्य प्रचालकों में केवल दो पक्ष ही होते हैं, बायां पक्ष (lvalue) और दायां पक्ष (rvalue)। लेकिन सशर्त कथन में ? और : अलगाए हुए तीन पक्ष होते हैं।बालसुब्रमण्यम लक्ष्मीनारायणhttp://www.blogger.com/profile/09013592588359905805noreply@blogger.com1tag:blogger.com,1999:blog-4963974732144575217.post-26269165015983706412009-04-28T07:11:00.000-07:002009-04-28T07:35:14.483-07:00सीखिए सी -19 : विशाखन - if... else निर्देशइस लेख में हम प्रोग्रामन भाषाओं की एक अत्यंत महत्वपूर्ण विशेषता के बारे में सीखेंगे, जो है विशाखन।<br /><br />कंप्यूटर प्रोग्रामों में अनेक बार ऐसी स्थितियां आती हैं जिनमें कंप्यूटर को दो या अधिक विकल्पों में से किसी एक को चुनकर आगे बढ़ना पड़ता है। इसी को विशाखन कहते हैं। विशाखन के कारण ही कंप्यूटर प्रोग्राम अनेक जटिल कार्य कर पाते हैं। <br /><br />इसे एक उदाहरण से समझते हैं। मान लीजिए कि हमें एक ऐसा प्रोग्राम लिखना है जो स्कूली बच्चों के प्राप्तांक स्वीकार करेगा और यदि प्राप्तांक 60% से ज्यादा हो, तो प्रदर्शित करेगा - Pratham Darja. यदि प्राप्तांक 50% और 60% के बीच हो तो प्रदर्शित करेगा - Dvitiya Darja. और यदि प्राप्तांक 40% और 50% के बीच हो तो प्रदर्शित करेगा – Tritiya Darja. और यदि प्राप्तांक 40% से कम हो, तो प्रदर्शित करेगा – Fail.<br /><br />यहां कंप्यूटर उसे दी गई सूचना के अनुसार चार विकल्पों में से कोई एक विकल्प चुनेगा। इस तरह इस प्रोग्राम को चलाने पर हर बार अलग-अलग परिणाम प्राप्त होगा जो उसे दिए गए प्राप्तांक पर निर्भर करेगा।<br /><br />इस तरह के प्रोग्राम लिखने में हमें सी की जो संरचना मदद करती है, वह है if... else वाली संरचना। इसके कई रूप होते हैं, सबसे सरल रूप यह है:<br /><br />if (शर्तें)<br />{<br />सी की उक्तियां<br />}<br />else<br />{<br />सी की उक्तियां<br />}<br /><br />इसमें if के आगे के गोल कोष्ठकों में सी की कोई तार्किक व्यंजक होता है, जिसका मान प्रोग्राम के चलने के समय सही अथवा गलत में से कोई एक होता है। यदि उसका मान सही हुआ, तो if के बाद के धनु कोष्ठकों के बीच विद्यमान उक्तियों का निष्पादन होता है और प्रोग्राम else के धनु कोष्ठकों में जो उक्तियां हैं, उन्हें छोड़ देता है। इसकी जगह यदि if के गोल कोष्ठकों में जो तार्किक व्यंजक है, उसका मान गलत हो, तो प्रोग्राम if के धनु कोष्ठकों की उक्तियों को छोड़कर else के धनु कोष्ठकों में जो उक्तियां हैं, उनका निष्पादन करता है।<br /><br />आइए एक छोटे प्रोग्राम के जरिए इसे समझते हैं। इस प्रोग्राम में आपसे पूछा जाता है कि रात है या दिन, और प्राप्त उत्तर के अनुसार Raat ko taare chamakte hain. या Din ko suraj chamakta hai. में से कोई एक वाक्य प्रदर्शित किया जाता है।<br /><br /><span style="font-weight:bold;">प्रोग्राम 8</span><br />--------------------------------<br />/*if... else ka udaharan */<br /><br /> #include <stdio.h><br /> #include <conio.h><br /><br /> void main()<br /> {<br /> clrscr();<br /><br /> char raat_din;<br /><br /> printf("Batayiye ki raat hain ya din. Raat ke liye R aur din ke liye D type kijiye: ");<br /> scanf("%s", &raat_din);<br /> if(raat_din=='D')<br /> {<br /> printf("\nDin mein suraj chamakta hai.");<br /> }<br /> else<br /> {<br /> printf("\nRaat ko tare chamakte hai.");<br /> }<br /> getch();<br /> }<br />-------------------------------<br /><br /><span style="font-weight:bold;">आउटपुट</span><br />-------------------------------<br />यदि प्रयोक्ता R दर्ज करे<br />Raat ko tare chamakte hai.<br /><br />यदि प्रयोक्ता D दर्ज करे<br />Din mein suraj chamakta hai.<br />-------------------------------<br /><br />इस प्रोग्राम में खास रूप से if के गोल कोष्ठकों में जो व्यंजक है उसकी ओर ध्यान दीजिए। वह है<br /><br />raat_din=='D'<br /><br />यहां D अक्षर को एकल उद्धरण चिह्न ( ‘ और ‘) से घेरा गया है। यह महत्वपूर्ण है। सी में char प्रकार की राशियों को एकल उद्धरण चिह्नों से घेरा जाता है, और string प्रकार की राशियों को दुहरे उद्धरण चिह्नों से (“ और ”)। उदाहरण के लिए prinf() के गोल कोष्ठकों में जो वाक्य है, वह string प्रकार की राशि है, जिसे दुहरे उद्धरण चिह्नों से घेरा गया है।<br /><br />जब प्रोग्राम if वाली उक्ति पर पहुंचता है, तो वह उसके गोल कोष्ठक के तार्किक व्यंजक का मूल्यांकन करता है और scanf() के जरिए raat_din राशि में जमा कराए गए वर्ण की तुलना D से करता है। यदि दोनों D ही हुए तो वह इस व्यंजक का मान 1 कर देता है, यानी सही, और प्रोग्राम if के धनु कोष्टकों के भीतर जो उक्ती है, उसका निष्पादन कर देता है, जिससे स्क्रीन पर<br /><br />Din me suraj chamakta hai.<br /><br />वाला वाक्य दिखाई देता है।<br /><br />इसकी जगह यदि scanf() ने raat_din में R वर्ण को जमा कराया हो, तो if उक्ति के गोल कोष्ठक के भीतर के व्यंजक का मान 0 हो जाता है, यानी गलत, और प्रोग्राम if के धनु कोष्ठकों की उक्ति को छोड़कर else के धनु कोष्ठक की उक्ति का निष्पादन करता है, जिससे स्क्रीन पर यह वाक्य नजर आता है<br /><br />Raat ko tare chamakte hai.<br /><br />इस उदाहरण में दो ही विकल्प थे, पर if... else संरचना का उपयोग करके दो से अधिक विकल्पों को भी संभाला जा सकता है। इस तरह:-<br /><br />if (शर्तें)<br />{<br />सी की उक्तियां<br />}<br />else if (शर्तें)<br />{<br />सी की उक्तियां<br />}<br />else<br />{<br />सी की उक्तियां<br />}<br /><br />इसमें दो if... else कथनों को एक के बाद एक पिरोया गया है, जिससे तीन विकल्प प्राप्त होते हैं।<br /><br />आइए प्रोग्राम 8 को ही थोड़ा और विस्तृत करके इस तीन विकल्प वाले if...else को समझते हैं। इसके लिए हम प्रोग्राम 8 को इस तरह बदलेंगे। यदि प्रयोक्ता R या D के सिवा कोई अन्य कुंजी को दबाए, तो प्रोग्राम यह संदेश प्रदर्शित करेगा:-<br /><br />Aap ko D athava R me se koi kunji hi dabani thi.<br /><br /><span style="font-weight:bold;">प्रोग्राम 9</span><br />-------------------------------<br />/*Teen vikalp wale if... else ka udaharan */<br /><br /> #include <stdio.h><br /> #include <conio.h><br /><br /> void main()<br /> {<br /> clrscr();<br /><br /> char raat_din;<br /><br /> printf("Batayiye ki raat hain ya din. Raat ke liye R aur din ke liye D type kijiye: ");<br /> scanf("%s", &raat_din);<br /> if(raat_din=='D')<br /> {<br /> printf("\nDin mein suraj chamakta hai.");<br /> }<br /> else if (raat_din=='R')<br /> {<br /> printf("\nRaat ko tare chamakte hai.");<br /> }<br /> else<br /> printf("\nAap ko D athava R me se koi kunji hi dabani thi.");<br /> getch();<br /> }<br />-------------------------------<br /><br /><span style="font-weight:bold;">आउटपुट</span><br />-------------------------------<br />यदि प्रयोक्ता R दर्ज करे<br />Raat ko tare chamakte hai.<br /><br />यदि प्रयोक्ता D दर्ज करे<br />Din mein suraj chamakta hai.<br /><br />यदि प्रयोक्ता D या R के सिवा कोई अन्य कुंजी दबाए<br />Aap ko D athava R me si koi kujni hi dabani thi.<br />-------------------------------<br /><br />इस प्रोग्राम में संकलक if उक्ति पर पहुंचकर उसके गोल कोष्ठक के भीतर के व्यंजक को scanf() द्वारा raat_din में जमा किए वर्ण के आधार पर सही या गलत का मान देता है। वह सही होने पर if के धनु कोष्ठकों की उक्ति का निष्पादन होता है और आगे के else if.. else के धनु कोष्ठकों की उक्तियों को संकलक लांघ जाता है। वह गलत होने पर if के धनु कोष्ठों की उक्ति को छोड़कर प्रोग्राम else if वाली उक्ति पर आ जाता है और उसके गोल कोष्ठकों के व्यंजक का मूल्यांकन करता है और उसे सही या गलत का मान देता है। यदि यह व्यंजक सही है, तो else if के धनु कोष्ठकों की उक्ति का निष्पादन होता है। यदि यह व्यंजक गलत है, तो प्रोग्राम else if के धनुकोष्ठकों की उक्ति को छोड़ देता है, और अंतिम else के धनु कोष्ठकों की उक्ति का निष्पादन करता है।<br /><br />इस अंतिम else के आगे आप और if ... else जोड़कर तीन से अधिक विकल्पों वाले अधिक जटिल प्रोग्राम भी लिख सकते हैं।<br /><br />क्यों न इस तरह का एक प्रोग्राम लिखने की कोशिश आप करें? इससे if ... else संरचना के काम करने की रीति आपको अच्छी तरह समझ में आ जाएगी। तो लिजिए, यह रहा<br /><br /><span style="font-weight:bold;">अभ्यास – 2</span><br /><br />आपको इस लेख के प्रारंभ में जो उदाहरण दिया गया है उसके लिए if ... esle संरचना का उपोयग करते हुए एक प्रोग्राम लिखना है। <br /><br />आपको एक ऐसा प्रोग्राम लिखना है जो स्कूली बच्चों के प्राप्तांक स्वीकार करेगा और यदि प्राप्तांक 60% से ज्यादा हो, तो प्रदर्शित करेगा - Pratham Darja. यदि प्राप्तांक 50% और 60% के बीच हो तो वह प्रदर्शित करेगा - Dvitiya Darja. और यदि प्राप्तांक 40% और 50% के बीच हो तो वह प्रदर्शित करेगा – Tritiya Darja. और यदि प्राप्तांक 40% से कम हो, तो वह प्रदर्शित करेगा – Fail.<br /><br />यह प्रोग्राम लिखने की कोशिश कीजिए। अगले लेख में मैं इसका हल दूंगा, पर मैं चाहता हूं कि इससे पहले आप स्वयं ही इसे लिख डालें।बालसुब्रमण्यम लक्ष्मीनारायणhttp://www.blogger.com/profile/09013592588359905805noreply@blogger.com2tag:blogger.com,1999:blog-4963974732144575217.post-16547143228687373892009-04-27T04:30:00.000-07:002009-04-27T21:46:48.176-07:00सीखिए सी - 18 : अभ्यास 1 का हलपिछले लेख में मैंने आपसे एक सी प्रोग्राम लिखने को कहा था। क्या आप लिख पाए? यदि लिख पाए, और उसने वांछित परिणाम दिया तो आपको बधाई। यह साबित करता है कि आपने सी भाषा पर काफी अधिकार पा लिया है। इससे सी से संबंधित अधिक कठिन विषयों को सीखने में आपको सहूलियत रहेगी।<br /><br />यदि आप प्रोग्राम नहीं लिख पाए, तो कोई बात नहीं। उसका कोड नीचे दिया गया है। उसे ध्यान से देखिए। इस प्रोग्राम में हमने कुछ नई विशेषताओं का समावेश किया है, जिसे हम आगे समझाएंगे।<br /><br /><span style="font-weight:bold;">प्रोग्राम -7</span><br />--------------------<br />/*Abhyas -1 */<br /><br /> #include <stdio.h><br /> #include <conio.h><br /><br /> void main()<br /> {<br /> clrscr();<br /><br /> char naam[20];<br /><br /> printf("Kripaya apna naam batayen: ");<br /> scanf("%s", &naam);<br /> printf("\nAbhinandan %s ji.", naam);<br /> getch();<br /> }<br />----------------------<br /><span style="font-weight:bold;">आउटपुट</span><br />Kripaya apna naam batayen: Balasubramaniam<br />Abhinandan Balasubramaniam ji.<br />----------------------<br />इस प्रोग्राम के शुरू में पूर्वसंकलक के लिए दो उक्तियां हैं:-<br /><br /> #include <stdio.h><br /> #include <conio.h><br /><br />इनमें से पहली उक्ति से आप परिचित हैं। यह पहले के प्रोग्रामों में भी आया है। यह सी के stdio वाली लाइब्रेरी का हेडर फाइल है।<br /><br />दूसरी उक्ति सी के conio लाइब्रेरी का हेडर फाइल है। इसका उपयोग हमने इसलिए किया है क्योंकि हमने इस प्रोग्राम में इस लाइब्रेरी के एक फंक्शन का उपयोग किया है। यह फंक्शन है, clrscr()।<br /><br />आइए अब आपको बताते हैं कि यह फंक्शन क्या करता है। कंप्यूटर कई प्रकार के आउटपुट स्क्रीन पर दिखाता रहता है। इन्हें वह एक के बाद एक के क्रम में स्क्रीन पर दर्शाता जाता है। इससे थोड़ी ही देर में कंप्यूटर स्क्रीन पर आउटपुट की बहुत सारी पंक्तियां जमा हो जाती हैं, जिससे नए आउटपुट की पंक्तियां ठीक से नजर नहीं आतीं। clrscr() फंक्शन स्क्रीन पर जितना भी पुराना आउटपुट हो, उसे सब मिटा देता है, जिससे नए आउटपुट की पंक्तियां स्क्रीन के ऊपरी भाग में साफ दिखाई देती हैं।<br /><br />इस प्रोग्राम के अंत में एक और नया फंक्शन आप देखेंगे, यह है getch()। यह भी एक काम का फंक्शन है। यह फंक्शन कुंजीपटल से कोई एक कुंजी के दबाने तक प्रोग्राम को आउटपुट विधा में रोके रखता है। इससे आप प्रोग्राम द्वारा दर्शाए गए अंतिम आउटपुट को देख पाते हैं। अन्यथा कंप्यूटर बिजली की तेजी से अंतिम आउटपुट, अर्थात "Abhinandan Balasubramaniam ji." वाली पंक्ति को प्रदर्शित करके अपने आप बंद हो जाएगा। यह इतनी तेजी से होगा कि आप देख भी नहीं पाएंगे कि कंप्यूटर ने क्या दर्शाया।<br /><br />getchar() के कारण प्रोग्राम कोई कुंजीपटल इनपुट के लिए रुका रहेगा, यानी जब तक आप कुंजीपटल की किसी कुंजी को न दबाएं, स्क्रीन दिखाई देता रहेगा, और आप प्रोग्राम के अंतिम आउटपुट को भली-भांति देख पाएंगे।<br /><br />getch() फंक्शन भी stdio.h सी लाइब्रेरी का एक फंक्शन है।<br /><br />इस प्रोग्राम की अंतिम विशेषता काफी महत्वपूर्ण है, इसलिए इसे ध्यानपूर्वक समझिए। हमने प्रोग्राम के शुरू में एक char राशि घोषित की है, जिसका नाम हमने naam रखा है, पर इस पंक्ति में आप एक नई बात देखेंगे। naam को इस तरह घोषित किया गया है:-<br /><br />char naam[20];<br /><br />यानी naam के आगे वर्ग कोष्ठकों मे 20 लिखा हुआ है। क्या आप बता सकते हैं, कि हमने ऐसा क्यों किया?<br /><br />इसका उत्तर सरल है। आपने पहले सीखा था कि char राशि के लिए कंप्यूटर मात्र 8 बिट का स्थान आरक्षित करता है। इन आठ बिटों में अंग्रेजी वर्णमाला का कोई एक वर्ण समा सकता है। लेकिन किसी व्यक्ति के नाम में तो अनेक वर्ण होते हैं। उदाहरण के लिए, मेरा ही नाम लीजिए, Balasubramaniam. इसमें 15 वर्ण हैं। इसलिए यदि हम naam को मात्र char naam; के रूप में घोषित करें, तो उसमें केवल एक वर्ण समा पाएगा, यानी B वर्ण, और आपके प्रोग्राम के आउटपुट में भी केवल यही एक वर्ण दिखाई देगा, इस तरह:-<br /><br />Abhinandan B ji.<br /><br />क्यों न आप प्रोग्राम में यह परिवर्तन करके देखें। char naam[20]; की जगह केवल char naam; रखकर प्रोग्राम को चलाकर देखिए। साथ में scanf() और दूसरे printf() उक्ति में भी %s की जगह %c करना न भूलें। क्या आपको ऊपर्युक्त आउटपुट मिला?<br /><br />इसलिए, नाम में विद्यमान अन्य वर्णों को पकड़ने के लिए हमें अधिक लंबी राशि की आवश्यकता है। char naam[20]; में हमने 20 char राशियों के बराबर की स्मृति naam के लिए आरक्षित कराई है। इतनी स्मृति में Balasubramaniam जैसे लंबे नाम पूरे आ जाएंगे, और हमारे प्रोग्राम के आउटपुट में नाम पूरा दिखाई देगा।<br /><br />इस तरह की एक से अधिक char से बनी राशि को string राशि कहा जाता है। उसका चिह्न %s होता है। क्या आपने ध्यान दिया कि इस प्रोग्राम की scanf() उक्ति में तथा दूसरी prinf() उक्ति में हमने $s चिह्न का प्रयोग किया है? उसके स्थान पर यदि हम %c का प्रयोग करते, तो प्रोग्राम सही आउटपुट नहीं देता।<br /><br />char naam[20] वाली उक्ति के बारे में कुछ अन्य आवश्यक बातों का जिक्र करके हम इस लेख को समाप्त करते हैं।<br /><br />यह राशि वास्तव में प्रयोक्ता द्वारा निर्दिष्ट राशि का एक उदाहरण है। इस तरह की राशि को array कहा जाता है, जिसके लिए हिंदी में सरणी शब्द चलता है।<br /><br />सी में दो तरह की राशियां होती हैं, एक, सी की अपनी राशियां, जैसे char, int, float, इत्यादि, और दो, प्रयोक्ता-निर्दिष्ट राशियां। इनका विस्तार संकलक द्वारा निर्दिष्टि नहीं किया जाता है, बल्कि प्रयोक्ता अपनी आवश्यकतानुसार इनका विस्तार बताते हैं। उदाहरण के लिए char naam[20] में हमने निर्दिष्टि किया है कि naam का विस्तार 20 char राशियों के बराबर होगा। इससे कंप्यूटर अपनी स्मृति में 20 सलग्न char कोषों को naam के साथ जोड़ देता है (अर्थात 160 बिट की जगह को)। स्मृति के इस खंड तक आप naam शब्द का उपयोग करके पहुंच सकते हैं, और वहां जो भी मान आप चाहे रखवा सकते हैं, अथवा वहां मौजूद मान को आउटपुट के रूप में ला सकते हैं।<br /><br />सरणि (array) एक जटिल विषय है जिस पर हम आगे के लेखों में अधिक विस्तार से चर्चा करेंगे।बालसुब्रमण्यम लक्ष्मीनारायणhttp://www.blogger.com/profile/09013592588359905805noreply@blogger.com5tag:blogger.com,1999:blog-4963974732144575217.post-8294849085927995662009-04-25T20:41:00.000-07:002009-04-25T20:42:35.051-07:00सीखिए सी - 17 : अभ्यास-1आइए, अब हम परखें कि आपने अब तक के लेखों को कितनी अच्छी तरह से समझा है। इसका बेहतरीन तरीका होगा अब तक अर्जित ज्ञान का उपयोग करते हुए एक सी प्रोग्राम लिखना।<br /><br />तो तैयार हो जाइए, सी का एक प्रोग्राम लिखने के लिए।<br /><br />एक ऐसा प्रोग्राम लिखिए जिसमें प्रयोक्ता से उसका नाम पूछा जाएगा (इसके लिए आप printf() का उपयोग करेंगे)। और प्रयोक्ता द्वारा बताए गए नाम को एक राशि में जमा करके आप उसे एक अभिनंदन वाक्य में पिरोकर स्क्रीन पर दर्शाएंगे। इसके लिए आपको एक char प्रकार की राशि घोषित करनी होगी और प्रयोक्ता के इनपुट को पकड़ने के लिए scanf() का उपयोग करना होगा।<br /><br />इस प्रोग्राम का आउटपुट कुछ-कुछ इस प्रकार का होना चाहिए:-<br /><br />Kripaya apna naam batayiye: Balasubramaniam<br />Abhinandan, Balasubramaniam ji.<br /><br />तो चलिए, जल्दी से इस तरह का एक प्रोग्राम लिख डालिए।<br /><br />अगले पोस्ट में इस अभ्यास का उत्तर दिया जाएगा, लेकिन मैं चाहूंगा कि उससे पहले आप खुद ही यह प्रोग्राम लिखकर तैयार रहें।बालसुब्रमण्यम लक्ष्मीनारायणhttp://www.blogger.com/profile/09013592588359905805noreply@blogger.com2tag:blogger.com,1999:blog-4963974732144575217.post-25200750844047598752009-04-25T20:34:00.000-07:002009-04-26T04:24:47.506-07:00सीखिए सी - 16 : समाहार -1आपमें से जिन लोगों ने अब तक प्रिंटेफ-स्कैनेफ के इन लेखों का साथ दिया है, उन्होंने सी भाषा की काफी बातें सीख ली हैं। इतनी कि अब आप कोई छोटा-मोटा सी प्रोग्राम स्वयं लिख सकते हैं। सी ही नहीं कोई भी कंप्यूटर भाषा सीखने का एक मात्र तरीका यह है कि उस भाषा में ढेर सारे प्रोग्राम लिखे जाएं। प्रोग्राम लिखने पर आपसे गलतियां भी होंगी, पर ये गलतियां आपको बताएंगी कि प्रोग्राम लिखने का सही तरीका क्या है। इसलिए अपनी गलतियों से घबराइए नहीं, न ही उनसे निरुत्साहित हों, बल्कि गलतियों को सीखने की प्रक्रिया का एक अनिवार्य अंग मानकर उनसे लाभ उठाइए।<br /><br />अब तक के लेखों में हमने कुछ 6 सरल सी प्रोग्रामों के उदाहरण दिए हैं। क्या आपने इन प्रोग्रामों के कोड को अपने कंप्यूटर पर उतारकर, इन प्रोग्रामों को संकलित करके देखा था? क्या आपको इन प्रोग्रामों के वैसे ही परिणाम मिले थे, जैसे इन लेखों में बताया गया है? यदि नहीं मिले तो सोचिए आपसे कहां गलती हो गई। इन लेखों को दुबारा पढ़ें और पता लगाएं कि आपके प्रोग्राम की गलती को कैसे सुधारा जा सकता है। इस तरह सी की वाक्य-विन्यास शैली आपके मन में ठीक प्रकार से बैठ जाएगी, और आपसे आगे गलतियां नहीं होंगी।<br /><br />यहां मैं नौसिखिए सी प्रोग्रामरों द्वारा आमतौर पर की जानेवाली कुछ गलतियों की सूची दे रहा हूं। यह आपको इन गलतियों से बचनने में मदद करेगी।<br /><br />1. सी वाक्यों के अंत में ; न देना।<br /><br />2. धनु कोष्ठक के दुहरे चिह्नों ({ और }) में से एक का छूट जाना।<br /><br />3 गोल कोष्ठकों के दुहरे चिह्नों (( और ) ) में से एक का छूट जाना।<br /><br />4. पूर्वसंकलक की उक्तियों से पहले # चिह्न न लगाना (जैसे #include <stdio.h> की जगह include <stdio.h> लिखना।<br /><br />5. पूर्वसंकलक की उक्तियों के आगे ; चिह्न लगाना (जैसे #include<stdio.h>; लिखना।<br /><br />6. printf() फलनक के कोष्ठकों में विद्यमान उक्ति को दुहरे उद्धरण चिह्नों (“ और “) से न घेरना।<br /><br />7. printf() फलनक के कोष्ठकों की उक्ति के अंत में समापन उद्धरण चिह्न छूट जाना।<br /><br />8. scanf() फलनक में राशि के नाम के पहले पता सूचक चिह्न & न लगाना।<br /><br />9. किसी राशि को घोषित करते समय उसका प्रकार (int, char, long, इत्यादि) सूचक शब्द छोड़ देना।<br /><br />10. राशि का नामकरण करते समय नामकरण के नियमों का उल्लंघन करना – जैसे, नाम के अक्षरों के बीच रिक्त स्थान होना, नाम के रूप में सी के आरक्षित शब्दों का उपयोग करना, नाम को किसी अंक से शुरू करना, नाम में अमान्य वर्ण (!, @, #,%,& आदि) रखना, इत्यादि।<br /><br />इन गलतियों से यदि आप बचते चलें, तो आप सी के प्रोग्राम सफलतापूर्वक लिखते चले जाएंगे।बालसुब्रमण्यम लक्ष्मीनारायणhttp://www.blogger.com/profile/09013592588359905805noreply@blogger.com0tag:blogger.com,1999:blog-4963974732144575217.post-54221550942459658902009-04-24T20:17:00.000-07:002009-04-24T20:29:52.404-07:00सीखिए सी -15 : scanf()पिछले अध्याय में हमने देखा कि printf() की सहायता से हम किस प्रकार कंप्यूटर की स्मृति में से आंकड़े लाकर स्क्रीन पर प्रदर्शित कर सकते हैं। कई बार इसका उल्टा भी आवश्यक होता है, यानी कुंजीपटल पर अंकित सूचनाओं को कंप्यूटर की स्म़ृति में डालना। इस काम में printf() का भाई scanf() नामक फलनक हमारी मदद करता है। scanf() भी stdio.h संग्रह का फलनक है। आइए, उससे परिचय बढ़ाते हैं। निम्नलिखित प्रोग्राम को देखिए।<br /><br />---------------------<br /><span style="font-weight:bold;">प्रोग्राम 5</span><br /><br />/* scanf() ka udaharan */<br /><br />#include <stdio.h><br /><br />void main()<br />{<br />char aapki_pasand;<br />printf("Aapki pasand ka koi akshar enter kijiye:\n");<br />scanf("%c", &aapki_pasand);<br />printf("Aapne %c akshar enter kiya.\n", aapki_pasand);<br />}<br />---------------------<br /><span style="font-weight:bold;">आउटपुट</span><br />Aapki pasand ka koi akshar enter kijiye: a<br />Aapne a akhsar enter kiya.<br />---------------------<br /><br />इस प्रोग्राम में aapki_pasand नामक वर्ण राशि (char) घोषित की गई है, लेकिन उसे कोई मान नहीं दिया गया है। इसके बाद वाली उक्ति आपके लिए परिचित है, वह स्क्रीन पर Aapki pasand ka koi akshar enter kijiye: संदेश प्रदर्शित करता है। इस संदेश को प्रदर्शित करने के बाद नियंत्रण प्रचालन तंत्र, यानी डोस, को नहीं लौट जाता, जैसा कि अब तक के प्रोग्रामों में होता आया है, पर कर्सर विसर्ग चिह्न (:) के आगे रुक जाता है। यह इसलिए क्योंकि अगली उक्ति scanf() है, जो कुंजीपटल पर अंकित संकेतों को स्वीकारता है।<br /><br />अब आप कुंजीपटल पर a वाली कुंजी दबाइए और उसके बाद ऐंटर कुंजी को। तुरंत ही आपको स्क्रीन पर यह वाक्य दिखाई देगा: Aapne a akshar enter kiya.<br /><br />क्या यह जादू जैसा नहीं लगता? आपके प्रोग्राम को कैसे पता चला कि आपने कौन-सा अक्षर ऐंटर किया था? दरअसल यह सब scanf() का कमाल है।<br /><br />scanf() का हुलिया printf() से बहुत मिलता-जुलता है, पर कुछ-कुछ भिन्न भी है। printf() के ही समान इसमें भी गोल कोष्ठकों के बीच एक उक्ति है, जो दुहरे उद्धरण चिह्नों से घिरी है।<br /><br />इस उक्ति में वही प्रतिशत-चिह्न वाला संयुक्त वर्ण %c है जो आंकड़े का प्रकार दर्शाता है (इस उदाहरण में char)। उद्धरण चिह्नों के बाद printf() के ही समान यहां भी अल्प विराम चिह्न (,) है। उसके बाद चर राशि का नाम है, पर चर राशि के नाम के पहले और अल्प विराम के बाद आप यहां एक नया चिह्न देख रहे हैं, जो है &। इसे ऐंपरसैंड कहते हैं। आइए, इसके बारे में जानें।<br /><br />कंप्यूटर ने apni_pasand नामक वर्ण राशि के लिए 8 बिट का स्थान आरक्षित करके उस स्थान के पते को apni_pasand नाम के साथ जोड़ दिया है। पर चूंकि हमने इस आरक्षित स्थान पर कोई मान नहीं रखा है, इसलिए वह जगह उपयोगी आंकड़े से भरी नहीं है। उस जगह पर a अक्षर को रखने के लिए हम scanf() का आह्वान करते हैं और उसे %c चिह्न द्वारा सूचित करते हैं कि हम कंप्यूटर की स्मृति में एक वर्ण को रखना चाहते हैं। अब scanf() के लिए यह जानना जरूरी है कि इस वर्ण राशि को कहां रखे। हम a को apni_pasand नामक चर राशि के लिए आरक्षित स्मृति-कोषों में रखना चाहते हैं। scanf() को इन कोषों का पता बताने के लिए इन कोषों से संबंधित राशि के नाम के पहले & चिह्न जोड़ा जाता है। किसी चर राशि के नाम के पहले & चिह्न जोड़ने से उस चर राशि के लिए आरक्षित स्मृति कोषों का पता प्राप्त होता है।<br /><br />इसीलिए & को एड्रेस प्रचालक, यानी पता बतानेवाला प्रचालक, कहा जाता है।<br /><br />हमारे प्रोग्राम में scanf() को &apni_pasand से apni_pasand के स्मृति-कोषों का पता मिल जाता है और वह a अक्षर को इन कोषों में रख देता है।<br /><br />प्रोग्राम की अगली उक्ति का परिणाम यह सिद्ध कर देता है कि scanf() ने सचमुच ऐसा किया है क्योंकि आउटपुट में हमें %c के स्थान पर a अक्षर दिखाई देता है।<br /><br />printf() के ही समान scanf() भी एक से अधिक चर राशियों को स्वीकार कर सकता है। देखिए कैसे:<br /><br />-------------------------<br /><span style="font-weight:bold;">प्रोग्राम-6</span><br /><br />/* scanf() ek sath do rashiyon ko bhi pad sakta hai. */<br /><br />#include <stdio.h><br /><br />void main()<br />{<br />char pahala_akshar;<br />char doosara_akshar;<br />printf("Apni pasand ke do akshar enter kijiye. Dono aksharon ke beech rikta sthan rakhiye: \n");<br />scanf("%c%c", &pahala_akshar, &doosara_akshar);<br />printf("Aapki pahli pasand hai %c aur doosari %c.\n", pahala_akshar,<br />doosara_akshar);<br />}<br />------------------------<br /><br /><span style="font-weight:bold;">आउटपुट:</span><br />Apni pasand ke do akshar enter kijiye. Donon aksharon ke beech rikta<br />sthan rakhiye: a b<br /><br />Aapki pahli pasand hai a aur doosari b.<br /><br />-------------------------<br />यहां दो वर्ण राशियां घोषित की गई हैं pahala_akshar और doosara_akshar, और scanf() से इनका मान प्राप्त किया जाता है। कुंजी-पटल द्वारा इन दोनों राशियों का मान (a और b) अंकित कीजिए। दोनों अक्षरों के बीच रिक्त स्थान होना जरूरी है, इसलिए a की कुंजी दबाने के बाद रिक्त-दंड (स्पेस-बार) को दबाइए और उसके बाद b की कुंजी को। इस रिक्त स्थान को देखकर scanf() समझ जाता है कि पहली राशि का मान पूरा हो गया है और कुंजी-पटल अब अगली राशि का मान प्रेषित करेगा। रिक्त-दंड के स्थान पर आप टैब अथवा ऐंटर कुंजी भी दबा सकते हैं। इन तीनों को श्वेत-स्थान देनेवाले वर्ण (वाइट स्पेस कैरक्टर) कहा जाता है, क्योंकि ये स्क्रीन पर या कागज पर दिखाई नहीं देते। अंत में ऐंटर कुंजी दबाइए, जिससे कंप्यूटर को मालूम पड़े कि आपने दोनों अक्षरों को ऐंटर कर दिया है।<br /><br />scanf() के कोष्ठकों में इस बार दो %c चिह्न हैं और तदनुसार अल्प-विराम (,) के बाद दो राशियों के नाम भी हैं। दोनों राशियों के पहले & चिह्न भी लगा हुआ है।<br /><br />प्रोग्राम के आउटपुट से हमें पता चलता है कि scanf() ने दोनों राशियों को ठीक प्रकार से स्मृति में पहुंचा दिया है।<br /><br />इस अध्याय के प्रोग्रामों में हमने scanf() की सहायता से वर्ण राशियों को ही पढ़ा है, लेकिन scanf() अन्य प्रकार की राशियों को भी इतनी ही कुशलता से पढ़ सकता है। केवल उसके कोष्ठकों में दुहरे उद्धरण चिह्नों के बीच %c के स्थान पर अन्य राशियों के सूचक-चिह्न, यानी %d, %l या %f रखने की आवश्यकता है।<br /><br />अंत में हम scanf() का उपयोग करते समय ध्यान में रखने की एक जरूरी बात फिर से दुहरा देते हैं। scanf() के लिए यह जानना आवश्यक होता है कि वह कुंजीपटल से प्राप्त सूचनाओं को कंप्यूटर की स्मृति में कहां रखे। यह जानकारी उसे उसके कोष्ठकों में मौजूद चर राशि के नाम के पहले & चिह्न जोड़कर दी जाती है। अपने प्रोग्रामों में scanf() का उपयोग करते समय इस & चिह्न की ओर विशेष ध्यान दीजिए, अन्यथा आपको scanf() से वांचित परिणाम नहीं प्राप्त होंगे।बालसुब्रमण्यम लक्ष्मीनारायणhttp://www.blogger.com/profile/09013592588359905805noreply@blogger.com1tag:blogger.com,1999:blog-4963974732144575217.post-43824202920657726722009-04-22T20:07:00.000-07:002009-04-22T20:30:15.081-07:00सीखिए सी 14 : printf()आप <span style="font-weight:bold;">प्रोग्राम 1</span> में printf() फलनक (फंक्शन) से मिल चुके हैं। यह सी भाषा का एक अत्यंत उपयोगी फलनक है। यह फलनक stdio.h संग्रह में रहता है। इस लेख में हम इसके बारे में विस्तृत जानकारी प्राप्त करेंगे।<br /><br />इसका पूरा नाम है प्रिंट फोर्मैट। इसका मुख्य काम है कंप्यूटर की स्मृति में संचित आंकड़ों को कंप्यूटर के स्क्रीन पर लाना। हमने पहले स्पष्ट किया था कि कंप्यूटर के स्मृति-कोषों में आंकड़े 0 और 1 के क्रम में रहते हैं और राशियों के नामकरण के दौरान char, int, float आदि सूचक शब्द जोड़कर प्रोग्राम कंप्यूटर को यह निर्देश देता है कि इन नामों से जुड़े स्मृति-कोषों में रखे आंकड़े किस प्रकार के हैं। printf() फलनक स्मृति में से आंकड़े लाकर प्रोग्राम में उन्हें जिस रूप में प्रदर्शित करने की आवश्यकता होती है, उस रूप में स्क्रीन पर प्रदर्शित करता है। इसके लिए वह अपने कोष्ठकों में दी गई सूचनाओं का उपयोग करता है। आइए एक उदाहरण से इन सब बातों को समझते हैं।<br /><br />------------------------<br /><span style="font-weight:bold;">प्रोग्राम-2</span><br /><br />/* printf() ka udaharan */<br /><br />#include <stdio.h><br /><br />void main ()<br />{<br />int namoone_ka_ank = 9;<br />printf("Namoone ka ank %d hai.\n", namoone_ka_ank);<br />}<br />------------------------------------<br /><br />प्रोग्राम को संकलित करके चलाने पर स्क्रीन पर यह दिखता है:<br /><br /><span style="font-weight:bold;">आउटपुट:</span><br />Namoone ka ank 9 hai.<br /><br />इस प्रोग्राम में namoone_ka_ank एक पूर्णांक राशि का नाम है। इस नाम के पूर्व लिखा गया int शब्द हमें यह सूचना देता है। इस पूर्णांक राशि को = चिह्न की सहायता से 9 का मान दिया गया है।<br /><br />printf() के कोष्ठकों में आपको तीन-चार नई बातें दिखेंगी। अब हम उन्हें स्पष्ट करते हैं।<br /><br /><span style="font-weight:bold;">1. %d चिह्न</span><br />जैसा कि हमने देखा, आंकड़े char, int, long या float प्रकार के हो सकते हैं। किसी राशि को printf() द्वारा ठीक से प्रदर्शित कराने से पहले हमें printf() को यह बताना होता है कि वह जिस राशि को प्रदर्शित कर रहा है, वह किस प्रकार का है। यह सूचना उसे उसके कोष्ठकों में दुहरे उद्धरण चिह्नों के बीच %c, %d, %l, %s या %f चिह्न रखकर दी जाती है। ये चिह्न क्रमशः char, int, long, string और float को सूचित करते हैं।<br /><br /><table border="1" cellpadding="5" cellspacing="0" bordercolor="#111111" width="62%" ><tr><td width="33%"><b><span lang="hi">प्रकार</span></b></td><td width="32%"><b><span lang="hi">सूचक शब्द</span></b></td><td width="35%"><b><span lang="hi">फोर्मैटिंग चिह्न</span></b></td></tr><tr><td width="33%"><span lang="hi">वर्ण</span></td><td width="32%">char</td><td width="35%">%c</td></tr><tr><td width="33%"><span lang="hi">पूर्णांक</span></td><td width="32%">int</td><td width="35%">%d</td></tr><tr><td width="33%"><span lang="hi">दीर्घ पूर्णांक</span></td><td width="32%">long</td><td width="35%">%l</td></tr><tr><td width="33%"><span lang="hi">दशमलव अंक</span></td><td width="32%">float</td><td width="35%">%f</td></tr><tr><td width="33%"><span lang="hi">वाक्यांश</span></td><td width="32%">string</td><td width="35%">%s</td></tr></table><br /><br />उपर्यूक्त प्रोग्राम में %d को देखकर printf() समझ जाता है कि उसे एक पूर्णांक राशि को %d के स्थान पर प्रदर्शित करना है। यह कौन-सी राशि है, इसकी सूचना printf() को उसके कोष्ठक में दुहरे उद्धरण चिह्नों के आगे लिखे गए चर राशि के नाम से पता चलता है। <br /><br /><span style="font-weight:bold;">2. , चिह्न</span><br />दुहरे उद्धरण चिह्नों के आगे जो अल्प विराम (,) है, उसकी ओर विशेष ध्यान दीजिए। यह अल्प विराम महत्व रखता है। यदि आप उसे छोड़ देंगे तो संकलक प्रोग्राम का संकलन उस स्थान पर आकर रोक देगा। सी भाषा में अल्प विराम (,) किसी उक्ति के दो हिस्सों को अलगाने के लिए उपयोग किया जाता है। इस उक्ति में अल्प विराम के बाद उस राशि का नाम है, जिसे printf() को प्रदर्शित करना है। <br /><br /><span style="font-weight:bold;">3. चर राशि का नाम namoone_ka_ank</span><br />हमारे प्रोग्राम में printf() वाली उक्ति में अल्प विराम के बाद namoone_ka_ank लिखा है। इसे देखकर printf() समझ जाता है कि उसे पूर्णांक के रूप में namoone_ka_ank नामक राशि को प्रदर्शित करना है। वह तुरंत कंप्यूटर की स्मृति में से उन आंकड़ों को ले आता है जो namoone_ka_ank नाम से जुड़े स्मृति कोषों में रखे हैं और इन आंकड़ों को पूर्णांक में बदलकर प्रदर्शित करता है। इसलिए हम आउटपुट वाक्य में %d के स्थान पर 9 देखते हैं, जो इस राशि का मान है।<br /><br /><span style="font-weight:bold;">4. \n चिह्न</span><br />printf() के कोष्ठकों में दुहरे उद्धरण चिह्नों के अंदर जो संदेश रखा गया है, उसके अंत में \n चिह्न है। इसे न्यू-लाइन वर्ण, यानी नई पंक्ति की सूचना देनेवाला वर्ण कहते हैं। कुंजी पटल के ऐंटर या रिटर्न नामक कुंजी को दबाने पर कर्सर एक नई पंक्ति की शुरुआत करता है। \n वर्ण इस ऐंटर या रिटर्न कुंजी का प्रतीक है। यद्यपि यह दो वर्णों से बना है (\ और n), लेकिन कंप्यूटर इसे एक वर्ण के रूप में पढ़ता है। वास्तव में \, जिसे बैकश्लैश कहा जाता है, कुछ वर्णों के साथ जुड़कर कुछ विशेष वर्ण पैदा करता है। ये विशेष वर्ण कुंजी पटल की उन कुंजियों को दर्शाते हैं जो स्क्रीन पर दिखाई नहीं देते, जैसे टैब, ऐंटर या रिटर्न, बैकस्पेस आदि।<br /><br />इन विशेष वर्णों की सूची नीचे दी गई है।<br /><br /><table border="1" cellpadding="5" cellspacing="0" bordercolor="#111111" width="100%"> <tr> <td width="48%"><b><span lang="hi">विशेष वर्ण</span></b></td> <td width="52%"><b><span lang="hi">अर्थ</span></b></td> </tr> <tr> <td width="48%">/n</td> <td width="52%"><span lang="hi">नई पंक्ति</span></td> </tr> <tr> <td width="48%">/t</td> <td width="52%"><span lang="hi">टैब स्पेस</span></td></tr></table><br /><br /><br />हमारे प्रोग्राम में \n को देखकर printf() संदेश के अंत में एक नई पंक्ति शुरू करता है, यानी कर्सर वाक्य पूरा होने के बाद अगली पंक्ति के शुरुआती स्थान पर चला जाता है।<br /><br />printf() एक साथ अनेक राशियों को प्रदर्शित कर सकता है। आइए देखें कैसे।<br /><br />-----------------------<br /><span style="font-weight:bold;">प्रोग्राम-3</span><br /><br />/* printf() dwara ek se adhik rashiyon ka pradarshan */<br /><br />#include <stdio.h><br /><br />void main()<br />{<br />char namoone_ka_varna='a';<br />int namoone_ka_ank=9;<br />printf("Namoone ka varna %c hai aur namoone ka ank %d hai.\n",<br />namoone_ka_varna, namoone_ka_ank); <br />}<br />---------------------<br /><br /><span style="font-weight:bold;">आउटपुट:</span><br />Namoone ka varna a hai aur namoone ka ank 9 hai.<br /><br />इस बार प्रोग्राम में दो राशियां घोषित की गई हैं: namoone_ka_varna और namoone_ka_ank. पहली char (वर्ण) प्रकार की राशि है और दूसरी int (पूर्णांक) प्रकार की।<br /><br />namoone_ka_varna में a का मान आरोपित किया गया है। इसके लिए राशि के नाम के आगे आरोपण चिह्न = के बाद a को इकहरे उद्धरण चिह्नों से घेरकर रखा गया है, ऐसे - 'a'।<br /><br />char प्रकार की राशियों में मान रखने की यही विधि है, यानी मान को इकहरे उद्धरण चिह्नों में दर्शाना। <br /><br />nammone_ka_ank में 9 का मान आरोपित किया गया है।<br /><br />इस बार printf() के कोष्ठकों में प्रतिशत चिह्न (%) वाले दो विशेष वर्ण हैं, %c और %d क्योंकि हम दो राशियों को प्रदर्शित करना चाहते हैं। तदनुसार दुहरे उद्धरण चिह्नों के बाद अल्प विराम के आगे भी दो राशियों के नाम हैं। ध्यान दें कि ये दोनों नाम उसी क्रम में हैं जिस क्रम में प्रतिशत चिह्न वाले वर्ण हैं, यानी namoone_ka_varna पहले और उसके बाद namoone_ka_ank। प्रतिशत-चिह्न-युक्त चिह्नों का क्रम और चर राशियों का क्रम समान होना बिलकुल आवश्यक है।<br />प्रोग्राम को संकलित करके चलाने पर आपको वांचित आउटपुट प्राप्त होता है:<br /><br />Namoone ka varna a hai aur namoone ka ank 9 hai.<br /><br />एक और उदाहरण लीजिए। <br /><br />--------------------------<br /><span style="font-weight:bold;">प्रोग्राम 4</span><br /><br />/* printf() ka ek aur udaharan */<br /><br />#include <stdio.h><br /><br />void main ()<br />{<br />float namoone_ka_ank = 9;<br />printf("Namoone ka ank %f hai.\n", namoone_ka_ank);<br />}<br />-----------------------------<br /><span style="font-weight:bold;">आउटपुट:</span><br />Namoone ka ank 9.000000 hai.<br /><br />क्या आप इस आउटपुट को देखकर चौंके? बात सीधी-सी है। ध्यान दीजिए कि हमने namoone_ka_ank को दशमलव अंक (float) घोषित किया है। सी भाषा में दशमलव अंकों में सामान्यतः दशमलव के बाद छह स्थान होते हैं। चूंकि हमने ये स्थान स्पष्ट नहीं किए हैं (हमने केवल 9 लिखा है), कंप्यूटर ने इन स्थानों को शून्य से भर दिया है।बालसुब्रमण्यम लक्ष्मीनारायणhttp://www.blogger.com/profile/09013592588359905805noreply@blogger.com6tag:blogger.com,1999:blog-4963974732144575217.post-39720428323797392222009-04-19T03:56:00.000-07:002009-04-19T04:00:07.404-07:00सीखिए सी 13 : प्रचालकों का वरीयता-क्रमजब एक ही व्यंजक में अनेक प्रचालक हों, तब कभी-कभी यह निश्चित करना कठिन हो जाता है कि उनमें से किस प्रचालक का निष्पादन पहले होता है। उदाहरण के लिए इस अंकगणितीय व्यंजक को देखिए: 10 + 5 * 2। इसका मान 30 है, या 20?<br /><br />यदि हम + प्रचालक के निष्पादन को पहले माने, तो 30 है और यदि * प्रचालक का निष्पादन पहले माने, तो 20 है। किंतु कंप्यूटर को इस प्रकार की द्विधात्मक स्थितियां पसंद नहीं हैं। इसलिए प्रचालकों की एक वरीयता क्रम मानी गई है और कंप्यूटर इसी क्रम के अनुसार अनेक प्रचालकों वाले व्यंजकों का मूल्यांकन करता है। वह ऊंची वरीयता वाले प्रचालक का निष्पादन नीची वरीयता वाले प्रचालकों के निष्पादन के पहले करता है।<br /><br />प्रचालकों की वरीयता निम्नानुसार है:<br /><br />() सबसे अधिक वरीयता<br />! ++ --<br />* / %<br />+ -<br />< <= > >=<br />&&<br />|| सबसे कम वरीयता<br /><br />उपर्युक्त क्रम को तोड़ना हो, तो संबंधित राशियों को गोल कोष्ठक में रख दीजिए। चूंकि गोल कोष्ठक की वरीयता सबसे अधिक है, इसलिए कंप्यूटर उसके अंदर जो प्रचालक हैं, उनका निष्पादन सबसे पहले करेगा, चाहे इन प्रचालकों की वरीयता अन्य प्रचालकों से कम क्यों न हो।<br /><br />मान लीजिए कि उपर्युक्त उदाहरण में आप 10 और 5 को पहले जोड़ना चाहते हैं और तत्पश्चात उनके योग को 2 से गुणन करना चाहते हैं। इसके लिए आप व्यंजक को इस प्रकार से लिखेंगे:<br /><br />(10 + 5) * 2<br /><br />प्रचालकों का वरीयता-क्रम किसी व्यंजक के दो पड़ौसी प्रचालकों पर ही (यानी कोई भी दो प्रचालक जो व्यंजक में निरंतर आते हों) लागू होता है, दूरस्थ प्रचालकों पर नहीं। आमतौर पर कंप्यूटर व्यंजकों का मूल्यांकन बाईं ओर से दाहिनी ओर करता है। वह बाईं ओर से सबसे पहले आए दो प्रचालकों की वरीयता की तुलना करता है और उनमें से जिसकी वरीयता अधिक हो, उसका निष्पादन करता है। तत्पश्चात वह बचे हुए प्रचालक की वरीयता की तुलना अगले प्रचालक से करता है और इन दोनों में से जिसकी वरीयता अधिक हो, उसका निष्पादन करता है। इत्यादि।<br /><br /><span style="font-weight:bold;">उदाहरण:</span><br />आइए, देखें कि कंप्यूटर निम्नलिखित व्यंजक का निष्पादन किस क्रम में करेगा:<br /><br />10 + 4 - 21 * 6 / 7<br /><br />कंप्यूटर इस व्यंजक का मूल्यांकन बाईं ओर से शुरू करेगा और पहले दो प्राचलकों, यानी + और - की वरीयता की तुलना करेगा। दोनों की वरीयता समान है, इसलिए वह + का निष्पादन करेगा क्योंकि वह व्यंजक में पहले आया है। इसका परिणाम होगा:<br /><br />14 - 21 * 6 / 7<br /><br />तत्पश्चात वह - और * की वरीयता की तुलना करेगा। * की वरीयता अधिक है। लेकिन इसका निष्पादन करने से पहले कंप्यूटर इसकी वरीयता को इसके अगले प्रचालक, यानी /, की वरीयता से करके देखेगा। इन दोनों की वरीयता समान है। इसलिए * का निष्पादन होगा:<br /><br />14 - 126 / 7 <br /><br />अब बचते हैं - और / प्रचालक। इनमें से / प्रचालक की वरीयता अधिक है। अतः उसका निष्पादन होगा:<br /><br />14 - 18<br /><br />अब केवल एक प्रचालक - बचा है। इसके निष्पादन के बाद अंतिम परिणाम प्राप्त होगा, जो है:<br /><br />-4।<br /><br />इस अध्याय में हमने सी के बहुत से प्रचालकों का परिचय प्राप्त किया। संभव है इतने सारे प्रचालकों को एक साथ देखकर आपका मन चकरा रहा हो। घबराइए नहीं, अगले लेखों में जैसे-जैसे हम इन प्रचालकों का उपयोग करने लगेंगे, वैसे-वैसे उनकी विशेषताएं भी आपको स्पष्ट होती जाएंगी। फिलहाल आप बस यह याद रखें कि सी में इन सब प्रचालकों का अस्तित्व है।बालसुब्रमण्यम लक्ष्मीनारायणhttp://www.blogger.com/profile/09013592588359905805noreply@blogger.com3tag:blogger.com,1999:blog-4963974732144575217.post-83278879770463360732009-04-11T23:05:00.000-07:002009-04-15T19:40:14.640-07:00सीखिए सी - 12 : सी के प्रचालकप्रचालक उन प्रतीकों को कहते हैं जो आंकड़ों और चर राशियों में विशिष्ट प्रकार की तब्दीलियां लाते हैं। सी के प्रचालक निम्नानुसार हैं:<br /><br /><span style="font-weight:bold;">1. अंकगणितीय प्रचालक</span><br />ये पांच हैं, +, -, *, / और %। इनमें से प्रथम चार जोड़ने, घटाने, गुणन करने और विभाजित करने के प्रचालक हैं। अंतिम को माड्युलस प्रचालक कहा जाता है। यह किन्हीं दो अंकों को विभाजित करने पर बची राशि को व्यक्त करता है।<br /><br /><span style="font-weight:bold;">उदाहरण:</span><br />8 % 3 = 5<br /><br />8 को 3 से विभाजित करने पर 5 शेष रहता है। अतः, माड्युलस प्रचालक 5 का मान देता है।<br /><br /><span style="font-weight:bold;">2. तार्किक प्रचालक</span><br />तार्किक प्रचालक तीन हैं &&, || और !। <br /><br />तार्किक प्रचालकों के केवल दो मान हो सकते हैं, सही या गलत, जिन्हें 1 या 0 से निर्दिष्ट किया जाता है। इन प्रचालकों में से प्रथम && को ऐंड (और) प्रचालक कहते हैं। यह 1 का मान तब देता है जब सब संकार्यों (ओपरेन्ड्स) का मान 1 हो। यदि किसी एक संकार्य का भी मान 0 हो, तो यह प्रचालक 0 नतीजा देता है।<br /><br />दूसरा प्रचालक || है, जिसे ओर (या) प्रचालक कहते है। यह 1 का मान तब देता है जब किसी भी एक या उससे अधिक संकार्यों का मान 1 हो। यह 0 मान तभी देता है जब सभी संकार्यों का मान 0 हो। <br /><br />अंतिम तार्किक प्रचालक ! नोट (नहीं) प्रचालक है। यह किसी तार्किक व्यंजक (एक्सप्रेशन) पर असर करता है और उसके मान को उलट देता है। ध्यान रहे कि तार्किक व्यंजकों के केवल दो ही मान हो सकते हैं, 1 या 0। अत:, यदि किसी तार्किक व्यंजक का प्रारंभिक मान 1 हो, तो उस पर नोट प्रचालक लगाने पर व्यंजक का नया मान 0 हो जाएगा। <br />इन प्रचालकों के प्रभाव को नीचे की तालिका में स्पष्ट किया गया है।<br /><br /><span style="font-weight:bold;">&& प्रचालक</span><br /><table border="1" cellpadding="5" cellspacing="0" bordercolor="#111111" width="100%"><br /><tr><td width="22%" bgcolor="#C0C0C0"><b>संकार्य 1</b></td><td width="23%" bgcolor="#C0C0C0"><b>संकार्य 2</b></td><td width="55%" bgcolor="#C0C0C0"><b>संकार्य 1 && संकार्य 2</b></td></tr><tr><td width="22%">0</td><td width="23%">1</td><td width="55%">0</td></tr><tr><td width="22%">1</td><td width="23%">0</td><td width="55%">0</td></tr><tr><td width="22%">0</td><td width="23%">0</td><td width="55%">0</td></tr><tr><td width="22%">1</td><td width="23%">1</td><td width="55%">1</td></tr></table><br /><span style="font-weight:bold;">|| प्रचालक</span><br /><table border="1" cellpadding="5" cellspacing="0" bordercolor="#111111" width="100%"><tr><td width="22%" bgcolor="#C0C0C0"><b>संकार्य 1</b></td><td width="23%" bgcolor="#C0C0C0"><b>संकार्य 2</b></td><td width="55%" bgcolor="#C0C0C0"><b>संकार्य 1 || संकार्य 2</b></td></tr><tr><td width="22%">0</td><td width="23%">1</td><td width="55%">1</td></tr><tr><td width="22%">1</td><td width="23%">0</td><td width="55%">1</td></tr><tr><td width="22%">0</td><td width="23%">0</td><td width="55%">0</td></tr><tr><td width="22%">1</td><td width="23%">1</td><td width="55%">1</td></tr></table><br /><span style="font-weight:bold;">! प्रचालक</span><br /><table border="1" cellpadding="5" cellspacing="0" bordercolor="#111111" width="100%" id="AutoNumber1"><tr><td width="44%" bgcolor="#C0C0C0"><b>संकार्य 1</b></td><td width="56%" bgcolor="#C0C0C0"><b>! संकार्य 1</b></td></tr><tr><td width="44%">1</td><td width="56%">0</td></tr><tr><td width="44%">0</td><td width="56%">1</td></tr></table><br />इन प्रचालकों का उपयोग if...else और while वाली उक्तियों में बहुत होता है, जिनके बारे में हम आगे के लेखों में सीखेंगे।<br /><br /><span style="font-weight:bold;">3. संबंधपरक प्रचालक</span><br />ये निम्नलिखित हैं:<br /><br /><table border="1" cellpadding="5" cellspacing="0" bordercolor="#111111" width="100%"><tr><td width="50%" bgcolor="#C0C0C0"><b>प्रचालक</b></td><td width="50%" bgcolor="#C0C0C0"><b>अर्थ</b></td></tr><tr><td width="50%">= =</td><td width="50%">के बराबर है</td></tr><tr><td width="50%">!=</td><td width="50%">के बराबर नहीं है</td></tr><tr><td width="50%"><=</td><td width="50%">से छोटा है या बराबर है</td></tr><tr><td width="50%"><</td><td width="50%">से छोटा है</td></tr><tr><td width="50%">>=</td><td width="50%">से बड़ा है या बराबर है</td></tr><tr><td width="50%">></td><td width="50%">से बड़ा है</td></tr></table><br /><br />इन प्रचालकों के भी केवल दो मान हो सकते हैं, 1 या 0।<br /><br /><span style="font-weight:bold;">उदाहरण:</span><br /><table border="1" cellpadding="5" cellspacing="0" bordercolor="#111111" width="100%"><tr><td width="14%"><b>व्यंजन</b></td><td width="16%"><b>मान</b></td><td width="70%"><b>टिप्पणी</b></td></tr><tr><td width="14%">4 == 8</td><td width="16%">0 </td><td width="70%"> यह व्यंजक गलत है, 4 8 के बराबर नहीं है</td></tr><tr><td width="14%">4 !== 8</td><td width="16%">1</td><td width="70%">यह सही है, 4 8 के बराबर नहीं है</td></tr><tr><td width="14%">4 <= 8</td><td width="16%">1</td><td width="70%">यह सही है, 4 8 से छोटा है</td></tr><tr><td width="14%">4 < 8</td><td width="16%">1</td><td width="70%">यह सही है, 4 8 से छोटा है</td></tr><tr><td width="14%">4 >= 8</td><td width="16%">0</td><td width="70%">यह गलत है, 4 8 से बड़ा नहीं है</td></tr><tr><td width="14%">4 > 8</td><td width="16%">0</td><td width="70%">यह गलत है, 4 8 से बड़ा नहीं है</td></tr></table><br /><br /><span style="font-weight:bold;">4. = प्रचालक</span><br />यह आरोपण प्रचालक है और आप इससे मिल चुके हैं। यह इसके बाईं ओर की चर राशि में इसके दाहिनी ओर की राशि का मान आरोपित करता है। <br /><br /><span style="font-weight:bold;">उदाहरण:</span><br />x =10;<br />x= y+z;<br />x=y=z=8;<br /><br />अंतिम उदाहरण में आरोपण की प्रक्रिया दाहिनी ओर से बाईं ओर क्रमवार संपन्न होती है, यानी पहले z में 8 का मान आता है, फिर y में z का मान (जो अब 8 है), और अंत में x में y का मान। इस प्रकार तीनों का मान 8 हो जाता है।<br /><br />ध्यान दीजिए कि == प्रचालक और = प्रचालक में जमीन आसमान का अंतर है। == एक संबंधसूचक प्रचालक है जो केवल यह बताता है कि उसके दोनों ओर के संकार्य बराबर हैं या नहीं। यदि वे बराबर हैं, तो वह 1 का मान देता है, अन्यथा 0 का। इसके विपरीत = प्रचालक आरोपण प्रचालक है जो उसके दाहिनी ओर के मान को बाईं ओर की चर राशि में आरोपित करता है।<br /><br /><span style="font-weight:bold;">5. & प्रचालक</span><br />इससे भी आप scanf() के प्रसंग में मिल चुके हैं। यह ऐड्रेस प्रचालक है, यानी पता बतानेवाला प्राचालक। इसे लगाकर हम किसी चर राशि से जुड़े स्मृति कोषों का पता जान सकते हैं।<br /><br />ध्यान में रखें, तार्किक ऐंड प्रचालक (&&) और राशियों का पता बतानेवाला प्रचालक (&) पूर्णतः भिन्न हैं।<br /><br /><span style="font-weight:bold;">6. ++ और -- प्रचालक</span><br />इन्हें क्रमश: इंक्रिमेंट प्रचालक और डिक्रिमेंट प्रचालक कहा जाता है। इंक्रिमेंट प्रचालक किसी चर राशि के मान को 1 से बढ़ा देता है और डिक्रिमेंट प्रचालक किसी चर राशि के मान को 1 से कम कर देता है।<br /><br /><span style="font-weight:bold;">उदाहरण:</span><br /><table border="1" cellpadding="5" cellspacing="0" bordercolor="#111111" width="100%" ><tr><td width="18%"><b>सी की उक्ति</b></td><td width="82%"><b>टिप्पणी</b></td></tr><tr><td width="18%">x = 10; </td><td width="82%">x का प्रारंभिक मान 10 है।</td></tr><tr><td width="18%">x++;</td><td width="82%"> अब x का मान एक से बढ़कर 11 हो गया है। </td></tr><tr><td width="18%">x--; </td><td width="82%">अब x का मान एक से कम होकर दुबारा 10 हो गया है।</td></tr></table><br /><br />ये दोनों प्रचालक राशि के बाईं ओर या दाहिनी ओर लग सकते हैं। दोनों स्थितियों में इनका प्रभाव अलग-अलग होता है। जब ये राशि के दाहिनी ओर लगते हैं, तो इंक्रिमेंट या डिक्रिमेंट का काम बाद में होता है। यदि ये प्रचलाक राशि के बाईं ओर लगे, तो इंक्रिमेंट या डिक्रिमेंट का काम पहले होता है। ऐरे की चर्चा करते समय हम इस बारीकी पर अधिक प्रकाश डालेंगे।<br /><br /><span style="font-weight:bold;">7. , (अल्प-विराम) प्रचालक</span><br />यह अनेक व्यंजकों को जोड़कर एक उक्ति बनाने में काम आता है।<br /><br /><span style="font-weight:bold;">उदाहरण:</span><br />int x,y,z;<br /><br />यह एक उक्ति निम्नलिखित तीन उक्तियों के बराबर है:<br />int x;<br />int y;<br />int z;बालसुब्रमण्यम लक्ष्मीनारायणhttp://www.blogger.com/profile/09013592588359905805noreply@blogger.com0tag:blogger.com,1999:blog-4963974732144575217.post-91347450447726372512009-04-11T21:00:00.000-07:002009-04-11T22:36:13.972-07:00सीखिए सी - 11 : आंकड़ों के प्रकारकंप्यूटर सभी आंकड़ों को शून्य (0) और एक (1) के क्रम में अपनी स्मृति में संचित करता है, पर हम इन 0 और 1 की कड़ियों को विभिन्न रूपों में समझते हैं, जैसे वर्ण के रूप में, अंक के रूप में, चित्र के रूप में आदि। इसलिए किसी प्रोग्राम में किसी राशि का नामकरण करते समय कंप्यूटर को यह बताना जरूरी होता है कि उस नाम से जानी जानेवाली राशि किस प्रकार की है। सी में आंकड़े मुख्यतः निम्नलिखित प्रकार के होते हैं:-<br /><table border="1" bordercolor="#111111" cellpadding="5" cellspacing="0" width="100%"><br /><tr><td bgcolor="#c0c0c0" width="20%"><b>प्रकार</b></td><td bgcolor="#c0c0c0" width="19%"><b>सूचक शब्द</b></td><td bgcolor="#c0c0c0" width="14%"><b>विस्तार</b></td><td bgcolor="#c0c0c0" width="80%"><b>उदाहरण</b></td></tr><br /> <tr><td width="20%">वर्ण</td><td width="19%">char</td><td width="14%">8 bits</td><td width="80%">a,b,A,1,&,%,9,>,?</td></tr><tr><td width="20%">पूर्णांक</td><td width="19%">int</td><td width="14%">16 bits</td><td width="80%">4,9,80,789</td></tr><tr><td width="20%">दीर्घ पूर्णांक</td><td width="19%">long</td><td width="14%">32 bits</td><td width="80%">1000000,786589, 870987</td></tr><tr><td width="20%">दशमलव</td><td width="19%">float</td><td width="14%">32 bits</td><td width="80%">8.5,89.098, 12.000000</td></tr></table><br /><br />अतः किसी राशि के पूर्ण नामकरण के लिए उसके प्रकार और उसके नाम, इन दो चीजों की आवश्यकता रहती है।<br /><br /><span style="font-weight: bold;">उदाहरण:</span><br /><br />char naam;<br />int roll_number;<br />float kul_ank;<br /><br />यहां naam किसी राशि का नाम है, जिसका प्रकार है char (यानी वर्ण), roll_number पूर्णांक (int) प्रकार की राशि है और kul_ank दशमलव अंक (float) वाली राशि है। char, int और float सूचक शब्दों को देखकर कंप्यूटर समझ जाता है कि इन राशियों के लिए उसे अपनी स्मृति में कितनी जगह आरक्षित करनी है। वह naam के लिए 8 बिट, roll_number के लिए 16 बिट और kul_ank के लिए 32 बिट की स्मृति आरक्षित कर देगा।<br /><br />इस तरह, किसी राशि को नाम देते समय उसके प्रकार को भी स्पष्ट करना आवश्यक होता है। तभी कंप्यूटर अपनी स्मृति में उस राशि के पूर्ण रूपांकन के लिए आवश्यक स्थान आवंटित कर सकेगा। इसके बाद कंप्यूटर उस स्थान के पते को राशि के नाम के साथ जोड़ देगा। यह हो जाने पर प्रोग्राम का संकलन होते समय जहां-जहां उस राशि का नाम आएगा, वहां उस नाम के साथ जुड़े पते पर कंप्यूटर की स्मृति में जो भी आंकड़े हों वह आ जाएगा।<br /><br />राशियों के लिए आंकड़ों का प्रकार चुनते समय सही प्रकार चुनने की ओर विशेष ध्यान देना चाहिए। ऐसा आंकड़ा प्रकार चुनना चाहिए जो उस राशि के तहत आनेवाले आंकड़ों के लिए पर्याप्त हो।<br /><br />उदाहरण के लिए int डेटा प्रकार में 32,000 से अधिक बड़ी संख्याएं नहीं समा सकती हैं। यदि किसी राशि का मान 32,000 से अधिक होने की संभावना हो, उसे int न घोषित करके long घोषित करना चाहिए जिसमें 32,000 से कहीं अधिक बड़ी संख्याएं समा सकती हैं।<br /><br />इसकी विपरीत स्थिति भी ध्यान देने योग्य है। यदि किसी राशि में 32,000 से कहीं कम वाले मान ही होनेवाले हों, तो इस राशि को long घोषित करने से कोई अतिरिक्त प्रयोजन नहीं सिद्ध होगा। इसके बजाए उसे int ही घोषित करना चाहिए। उदाहरण के लिए roll_number राशि को लें जिसमें आप किसी कक्षा के छात्रों के रोल नंबर को संचित करना चाहते हैं। अब कक्षा में छात्रों की संख्या 40, 50 या अधक से अधिक 100 तक जा सकती है। इसलिए इस राशि के लिए int प्रकार पर्याप्त है। इसे long घोषित करने की कोई आवश्यकता नहीं है। long घोषित करने से भी आपका प्रोग्राम ठीक तरह से चलेगा, लेकिन वह अधिक स्मृति खपाएगा। हमने ऊपर देखा कि int के लिए कंप्यूटर में 16 बिट का स्थान उपयोग किया जाता है, जबकि long के लिए उससे दुगना, यानी 32 बिट। इसलिए यदि आप roll_number को int के बजाए long घोषित करें, तो आपके प्रोग्राम में इस राशि के लिए दुगनी स्मृति की आवश्यकता पड़ेगी। अच्छे प्रोग्राम वे माने जाते हैं जो कम से कम संसाधनों का उपयोग करके, कम से कम समय में चलें और वांछित परिणाम दें।<br /><br />इसी प्रकार वेतन, औसत अंक, आदि के लिए int या long प्रकार की राशियां ठीक नहीं रहेंगी, क्योंकि ये दशमलव प्रकार की संख्याएं होंगी। इनके लिए float प्रकार की आवश्यकता है। इन्हें int या long प्रकार घोषित करने पर इनका केवल पूर्णांक वाला अंश ही संचित होगा और दशमलव वाला अंश खो जाएगा। इससे आपका प्रोग्राम सही नतीजा नहीं दे पाएगा।बालसुब्रमण्यम लक्ष्मीनारायणhttp://www.blogger.com/profile/09013592588359905805noreply@blogger.com0tag:blogger.com,1999:blog-4963974732144575217.post-71156145719518929172009-04-10T19:38:00.000-07:002009-04-11T08:00:10.957-07:00सीखिए सी - 10 : राशियों के नामकरण के नियमसी की राशियों के नामकरण के कुछ नियम हैं, जो इस प्रकार हैं:-<br /><br />1. राशियों के नाम केवल एक शब्द के बने हो सकते हैं, वे दो या अधिक शब्दों के नहीं हो सकते, या यों कह लीजिए कि नामों के वर्णों (अक्षरों) के बीच रिक्त स्थान नहीं हो सकता।<br /><br /><span style="font-weight:bold;">उदाहरण:</span><br />x, moolya, naam, pata, taapman आदि सब मान्य नाम हैं।<br /><br />adhiktam tapman, pahla naam, ausat taapman, ये सब अमान्य हैं क्योंकि ये एक से अधिक शब्दों से बने हैं।<br /><br />ध्यान रहे कि सी केस-संवेदनशील भाषा है, यानी कि वह अंग्रेजी के अपर-केस (A,B,C,...) और लोअर-केस (a,b,c,...) वर्णों में फर्क करता है। इसलिए NAAM, Naam और naam, ये तीन अलग-अलग राशियां मानी जाएंगी, एक नहीं।<br /><br />2. नाम के वर्णों में मात्र 0,1,...,9, a,b,c,...z, A,B,C,...Z या रेखांकन चिह्न (_) का ही उपयोग हो सकता है।<br /><br /><span style="font-weight:bold;">उदाहरण:</span><br />adhiktam_taapman, con2bin, ABCefg, ये सब मान्य नाम है। ध्यान दें कि पहले नाम (adhiktam_tapman) में दो शब्दों को रेखांकन चिह्न (_) द्वारा जोड़ा गया है।<br /><br />3. राशियों के नामों में सी के कुछ आरक्षित चिह्न और विशेष वर्ण नहीं रखे जा सकते। इनमें शामिल हैं: +, -, *, /, %, #, !, (, ), :, ;, <, >, {, }, |, आदि, क्योंकि इन्हें सी भाषा में अन्य कार्यों के लिए उपयोग किया जाता है। उदाहरण के लिए प्रथम चार चिह्न अंकगणित की संक्रियाओं को सूचित करनेवाले चिह्न हैं। <br /><br /><span style="font-weight:bold;">उदाहरण:</span><br />adhiktam-tapman अमान्य नाम है, क्योंकि उसमें - चिह्न (घटाने का चिह्न) का उपयोग हुआ है। इस चिह्न के कारण कंप्यूटर इस नाम को दो अलग-अलग नाम मानेगा, यानी adhiktam और tapman, और tapman को adhiktam से घटाने की कोशिश करेगा।<br /><br />4. सी के आरक्षित शब्द, जैसे int, char, float, struct, return आदि को राशियों के नामों के रूप में इस्तेमाल नहीं किया जा सकता। इन आरक्षित पदों की संपूर्ण सूची यह है:-<br /><br />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<br /><br /><span style="font-weight:bold;">उदाहरण:</span><br />while, switch, case ये अमान्य नाम हैं, क्योंकि ये सब सी के आरक्षित शब्द हैं।<br /><br />5. सी राशियों के नामों का पहला वर्ण कोई अंक नहीं हो सकता।<br /><br /><span style="font-weight:bold;">उदाहरण:</span><br />2inone, 3rdyear, 0value, ये सब अमान्य नाम हैं, क्योंकि इन सबका प्रथम वर्ण कोई अंक है।<br /><br />राशियों का नाम देते समय उपर्युक्त बातों का ध्यान रखना अनिवार्य है। राशियों के नाम यदि उन वस्तुओं की सूचना दें जिनका वे प्रतिनिधित्व कर रहे हों, तो प्रोग्राम क्लिष्ट होने से बच सकता है।<br /><br />उदाहरण के लिए, यदि कोई राशि मासिक आय को व्यक्त करती हो, तो उसे x या y नाम देने के बजाए maasicaay या maasic_aay जैसा कोई नाम देना अधिक उपयुक्त होगा क्योंकि ऐसे नामों को देखकर तुरंत स्पष्ट हो जाता है कि राशि किस चीज को व्यक्त कर रही है।बालसुब्रमण्यम लक्ष्मीनारायणhttp://www.blogger.com/profile/09013592588359905805noreply@blogger.com3tag:blogger.com,1999:blog-4963974732144575217.post-77990478235242177912009-04-10T19:17:00.000-07:002009-04-10T19:24:00.047-07:00सीखिए सी – 9 : चर और अचर राशियांकंप्यूटर विभिन्न प्रकार के आंकड़ों को संचित करता है और उन्हें विभिन्न प्रकार से संसाधित करता है। यह सब करने के लिए कंप्यूटर इन आंकड़ों को अपनी स्मृति (मेमरी) में रखता है। यह स्मृति अनेक कोषों से बनी होती है। प्रत्येक कोष का अपना एक विशिष्ट पता होता है।<br /><br />आंकड़ों को स्मृति में रखने और वहां से उसे पुनः प्राप्त करने की प्रक्रिया को सुगम बनाने के लिए सभी कंप्यूटर भाषाओं में इन आंकड़ों को नाम द्वारा निर्दिष्ट करने की सुविधा प्रदान की जाती है।<br /><br />नाम द्वारा निर्दिष्ट ये आंकड़े दो प्रकार के होते हैं, चर राशियां (वेरिएबल्स) और अचर राशियां (कॉन्सटेन्ट्स)। <br /><br /><span style="font-weight:bold;">चर राशियां</span><br />चर राशियां उन राशियों को कहते हैं जिनका मान प्रोग्राम के निष्पादन के दौरान बदलता रहता है।<br /><br />प्रोग्राम में चर राशियों में कोई मान आरोपित करने के लिए = चिह्न का इस्तेमाल होता है। सी की इस उक्ति को देखिए:<br /><br />x = 10;<br /><br />इसमें x एक चर राशि है, जिसमें = चिह्न 10 का मान आरोपित करता है। <br /><br />इस उक्ति के बाद प्रोग्राम में जहां-जहां x आएगा, वहां-वहां कंप्यूटर उसका मान 10 मानकर चलेगा, बशर्ते कि प्रोग्राम की कोई अन्य उक्ति इसे बदल नहीं देती। <br /><br />सी की यह आरोपण संबंधी उक्ति बीजगणित के x = 20 निर्देश से कुछ भिन्न होती है। बीजगणित में इस निर्देश का मतलब होता है "x 20 के बराबर है"। लेकिन सी की x=20; वाली उक्ति का मतलब होता है "x को 20 मानकर चलो"। इस अंतर को समझना जरूरी है, क्योंकि प्रोग्राम में चर राशियों का मान बदलता रहता है। उदाहरण के लिए x=15; उक्ति देकर आप कभी भी x का मान 10 से 15 कर सकते हैं। <br /><br /><span style="font-weight:bold;">अचर राशियां</span><br />सी में एक अन्य प्रकार की राशियां भी होती हैं, जिन्हें अचर राशियां कहा जाता है। इनका मान प्रोग्राम के शुरू में ही निश्चित कर दिया जाता है और वह बाद में बदल नहीं सकता। अचर राशियों को घोषित करने के लिए define पारिभाषिक शब्द का इस्तेमाल होता है। यह शब्द पूर्वसंकलक से जुड़ा है, न कि संकलक से। इसलिए इसके पहले # चिह्न लगाना भी आवश्यक है। यदि आप adhiktamman नामक एक अचर राशि घोषित करके उसे 100 का मान देना चाहें, तो आप निम्नानुसार निर्देश देंगे:<br /><br />#define adhiktamman 100<br /><br />उपर्युक्त उदाहरण में define पूर्वसंकलक का एक पारिभाषिक शब्द है। adhiktamman अचर राशि का नाम है, और 100 उसे दिया गया मान है। इस निर्देश के बाद प्रोग्राम में 100 की जगह आप adhiktamman का उपयोग कर सकते हैं। प्रोग्राम के संकलन के समय पूर्वसंकलक adhiktamman स्थान पर 100 रखता जाएगा। <br /><br />एक-दो बातें यहां ध्यान देने की हैं। <br /><br />1. पूर्वसंकलक के निर्देशों के अंत में अर्ध-विराम चिह्न (;) नहीं लगता, जैसा कि सी की उक्तियों में लगता है। <br />2. अचर राशियों में मान आरोपित करते समय आरोपण चिह्न = का इस्तेमाल नहीं होता। इसलिए<br /><br />#define adhiktamman = 100<br /><br />ऐसा लिखना गलत है।बालसुब्रमण्यम लक्ष्मीनारायणhttp://www.blogger.com/profile/09013592588359905805noreply@blogger.com0tag:blogger.com,1999:blog-4963974732144575217.post-1434063489209548412009-04-09T22:37:00.001-07:002009-04-10T19:11:34.564-07:00सीखिए सी – 8 : सी प्रोग्राम की विशेषताएं – 6 और 7<span style="font-weight:bold;">सी की उक्तियां</span><br />सी एक व्यवस्थित प्रोग्रामन भाषा है (स्ट्रक्चर्ड प्रोग्रामन भाषा) और यह बात उसके हर पहलू में नजर आती है। पिछले लेख में हमने समझाया था कि हर सी प्रोग्राम अनेक सुव्यवस्थित प्रोग्राम खंडों से बना होता है, जिसमें प्रत्येक कोड खंड को धनु कोष्ठकों से घेरा गया होता है।<br /><br />प्रत्येक कोड खंड भी अनेक अधिक छोटी इकाइयों से बना होता है। इन्हें स्टेटमेंट (इस ट्यूटोरियल में मैं स्टेटमेंट शब्द के लिए उक्ति या कथन शब्द का प्रयोग करूंगा) कहा जाता है। हमारे प्रोग्राम 1 में केवल एक उक्ति है, यानी यह:-<br /><br />printf("Namaskar.");<br /><br />इसे ध्यान से देखिए, क्या आपको इसके अंत में जो अर्ध विराम चिह्न है (;) वह नजर आया? यह अर्ध विराम बहुत महत्वपूर्ण है। वह संकलक को सूचित करता है कि उक्ति कहां खत्म हो रही है।<br /><br />हमने पिछले लेख में कहा था कि सी का संकलक वाइट स्पेसों (स्पेसबार, टैब, ऐंटर) की ओर कोई ध्यान नहीं देता है। सामान्य लेखन में हम इन वाइट स्पेसों का उपयोग करके ही शब्दों, वाक्यों, पैराओं को एक-दूसरे से अलग करते हैं। लेकिन संकलक इन वाइट स्पेसों को देख नहीं सकता। वह यह पता करने के लिए कि कोई उक्ति कहां खत्म हो रही है, अर्ध विराम (;) को देखता है। जैसे ही उसे एक अर्ध विराम चिह्न मिल जाए, वह समझ जाता है कि उक्ति खत्म हो गई है। इसलिए हर सी उक्ति के अंत में अर्ध विराम लगाना जरूरी है।<br /><br />सी में नया प्रोग्राम लिख रहे लोगों से जो आम गलती बारबार होती है, वह है उनसे इस अर्ध विराम का छूटना जाना। इसलिए प्रोग्राम लिख लेने के बाद उसे एक बार फिर ध्यान से देख लें कि क्या सभी सी उक्तियों के अंत में अर्ध विराम चिह्न लगा है या नहीं।<br /><br />ध्यान रखें, पूर्वसंकलक के लिए लिखी गई उक्तियों में अर्ध विराम नहीं लगता है। पूर्व संकलक की उक्तियों को सूचित करने के लिए उनके शुरू में # यह चिह्न रहता है। इसलिए उनके आगे अर्ध विराम लगाने की आवश्यकता नहीं है। यदि लगाएं, तो संकलक आपत्ति कर सकता है।<br /><br />इस लेख के साथ सी प्रोग्राम की हमारी चीरफाड़ पूरी हुई। आगे बढ़ने से पहले आप एक बार फिर सी प्रोग्रामों की आठ विशेषताओं को समझ लें ताकि सी के प्रोग्राम लिखते समय आपसे कोई गलती न हो।बालसुब्रमण्यम लक्ष्मीनारायणhttp://www.blogger.com/profile/09013592588359905805noreply@blogger.com1tag:blogger.com,1999:blog-4963974732144575217.post-20585160873757591162009-04-09T22:09:00.000-07:002009-04-09T22:23:26.838-07:00सीखिए सी – 7 : सी प्रोग्राम की विशेषताएं – 5 और 8<span style="font-weight:bold;">सी में धनु कोष्ठकों ({ }) का महत्व</span><br /><br />यदि आप प्रोग्राम 1 को देखें, तो आपको उसमें धनु कोष्ठकों ( { }) का प्रयोग हुआ मेलेगा। बायां धनु कोष्ठक चिह्न ( { ) तीसरी पंक्ति में आया है, और दायां धनु कोष्ठक चिह्न ( } ) प्रोग्राम की अंतिम पंक्ति में आया है।<br /><br />सी एक स्ट्रक्चर्ड प्रोग्रामन भाषा है। वह इतनी शक्तिशाली और सुगठित प्रोग्रामन भाषा इसीलिए है, कि उसमें बहुत ही अनुशासित और व्यवस्थित ढंग से प्रोग्राम लिखे जाते हैं। कोड खंडों में रहते हैं, यानी एक प्रकार्य से जुड़ी कोड पंक्तियों को एक समुच्चय के रूप में रखा जाता है। संकलक के लिए इन कोड खंडों को पहचानना आसान बनाने के लिए कोड में उन्हें धनु कोष्ठकों से घेरा जाता है। सी में आप धनु कोष्ठकों को बारबार देखेंगे। टिप्पणी सूचक चिह्न (/* और */) के समान ये भी दुहरे चिह्न हैं, यानी कोड खंड के शुरू में बायां धनु कोष्ठक चिह्न रहता है, और अंत में दायां धनु कोष्ठक चिह्न। इनमें से किसी एक को छोड़ देने को संकलक बर्दाश्त नहीं करता है, और ऐसा करने पर वह बुरी तरह बौखला उठता है।<br /><br />हर सी प्रोग्राम भी कोड का एक सुगठिक खंड होता है, भले ही उसमें कितनी ही पंक्तियां क्यों न हों, और वह कितने ही फंक्शनों का आह्वान करता हो। इस कोड खंड को धनु कोष्ठों से घेरा जाता है। यानी प्रोग्राम के शुरू में बायां धनु कोष्ठक रहेगा और प्रोग्राम के अंत में दायां धनु कोष्ठक रहेगा।<br /><br />इन दोनों धनु कोष्ठकों के भीतर कई और कोड खंड भी हो सकते हैं, और प्रत्येक कोड़ खंड को धनु कोष्ठकों से घेरना जरूरी है। इसलिए एक लंबे सी प्रोग्राम में आपको कई धनु कोष्ठक चिह्न देखने को मिलेंगे। ध्यान में रखने की बात यही है कि इन कोष्ठक चिह्नों का सही तरह से प्रयोग किया गया हो। यदि बायां धनु कोष्ठक चिह्न आया हो तो उसका जोड़ीदार दायां कोष्ठक चिह्न भी सही जगह पर डालना होगा, अन्यथा आपका प्रोग्राम ठीक तरह से काम नहीं करेगा।<br /><br />सी में वाइट स्पेस (वाइट स्पेस उन कुंजियों को कहते हैं, जो दो वर्णों के बीच रिक्त स्थान पैदा करते हैं, जैसे स्पेसबार कुंजी, टैब कुंजी या ऐंटर कुंजी) का कोई महत्व नहीं होता है। इसलिए प्रोग्राम 1 को आप इनमें से किसी भी तरह से लिख सकते हैं:- <br /><br />1.<br /><br />/*Namaskar shabd ko screen par chapnewala program*/<br /><br /><br />#include <'studio.h><br />void main (){<br />printf("Namaskar.");<br />}<br /><br />2.<br />#include <'studio.h><br /><br />void main (){printf("Namaskar.");<br />}<br /><br />3.<br />#include <'studio.h><br /><br />void main (){printf("Namaskar.");}<br /><br />सी संकलक की दृष्टि से ये सब वाजिब सी प्रोग्राम हैं, और वह इन सबको बिना शिकायत किए संकलित कर देगा।<br /><br />पर हमारी सुविधा के लिए प्रोग्राम को अधिक व्यवस्थिति ढंग से लिखना बेहतर रहेगा। नहीं तो बड़े सी प्रोग्रामों में जिनमें बीसियों पंक्तियां और दर्जनों धनुकोष्ठक हो सकते हैं, आप चक्कर में पड़ जाएंगे कि कौन सा कोड खंड कहां खत्म हो रहा है।<br />इसलिए सी प्रोग्रामन सिखानेवाले अधिकांश पुस्तकों में नौसिखियों को सबसे पहली सलाह यही दी जाती है कि कोड व्यवस्थित ढंग से लिखें। अधिकांश पुस्तकों में बाएं धनु कोष्ठक चिह्न को अलग पंक्ति में अथवा फंक्शन नाम के ठीक आगे, और दाएं धनु कोष्ठक चिह्न को कोड खंड के अंत में अलग पंक्ति में लिखने की सलाह दी जाती है।<br /><br />यहां इसे प्रोग्राम 1 का उदाहरण लेकर समझाया गया है।<br /><br /><span style="font-weight:bold;">प्रोग्राम लिखने की रीति 1</span><br />#include <'studio.h><br /><br />void main (){<br />printf("Namaskar.");<br />}<br /><br /><span style="font-weight:bold;">प्रोग्राम लिखने की रीति 2</span><br />#include <'studio.h><br /><br />void main ()<br />{<br />printf("Namaskar.");<br /><br />}<br /><br />इस तरह लिखने से धनु कोष्ठक कहां हैं यह तुरंत पता चल जाता है, और उनके बीच स्थित कोड खंड का स्वरूप भी स्पष्ट नजर आता है। इससे कोड में विद्यमान गलतियों को पकड़ना आसान हो जाता है। और यदि धनु कोष्ठक चिह्नों में से कोई एक नदारद हो, तो वह भी तुरंत पता चल जाता है।<br /><br />अपने कोड लेखन में इन दो रीतियों में से किसी एक का सदा पालन करें।<br /><br />इस ट्यूटोरियल में दूसरी रीति का पालन किया गया है।बालसुब्रमण्यम लक्ष्मीनारायणhttp://www.blogger.com/profile/09013592588359905805noreply@blogger.com1tag:blogger.com,1999:blog-4963974732144575217.post-9656716563137711302009-04-09T11:22:00.000-07:002009-04-09T11:36:16.851-07:00एचटीएमएल ट्यूटोरियलप्रिंटेफ-स्कैनेफ के जरिए मैं कुछ कंप्यूटर प्रोग्रामन भाषाओं का ट्यूटोरियल प्रस्तुत करूंगा। शुरुआत सी भाषा से की है, जिसके पांच-सात लेख अब तक प्रकाशित हो चुके हैं।<br /><br />सी का यह ट्यूटोरियल मुझे अगले एक दो महीने तक व्यस्त रखेगा। उसके बाद विचार है कि सीप्लसप्लस का ट्यूटोरियल शुरू करूं क्योंकि सीप्लसप्लस सी का ही विकसित रूप है।<br /><br />इसलिए, एचटीएमल, जावस्क्रिप्ट, आदि के ट्यूटोरियल की बारी आने में काफी समय लग सकता है।<br /><br />अभी मुझे हाल में <a href="http://www.blogger.com/profile/03365783238832526912">लवली कुमारी</a> का लिखा हुआ <a href="http://sanchika.blogspot.com/search/label/%E0%A4%A4%E0%A4%95%E0%A4%A8%E0%A5%80%E0%A4%95%20(Technology)">एचटीएमएल का यह अच्छा हिंदी ट्यूटोरियल</a> मिला है। प्रिंटेफ-स्कैनेफ के जिन पाठकों को एचटीएमल सीखने में रुचि हो, वे मेरे ट्यूटोरियल के आने तक इस ट्यूटोरियल से लाभ उठाएं।बालसुब्रमण्यम लक्ष्मीनारायणhttp://www.blogger.com/profile/09013592588359905805noreply@blogger.com2tag:blogger.com,1999:blog-4963974732144575217.post-86363379778047663052009-04-09T02:34:00.001-07:002009-04-09T02:36:44.914-07:00सीखिए सी - 6: सी प्रोग्राम की विशेषताएं - 4<span style="font-weight:bold;">void main ()</span><br /><br />सी एक स्ट्रक्चर्ड प्रोग्रामन भाषा है। इसका मतलब यह है कि सी के प्रोग्राम अनेक छोटे खंडों से मिलकर बनते हैं। कोई भी समस्या पहली नजर में विकराल और असाध्य सी लगती है, लेकिन जब हम उसे परस्पर जुड़ी छोटी समस्याओं में बांट देते हैं, और इन छोटी समस्याओं से अलग-अलग से निपटते हैं, तो बड़ी समस्या भी अपने आप सुलझ जाती है।<br /><br />सी के प्रोग्राम लिखते समय भी प्रोग्रामर इस नीति का अनुसरण करता है। वह जिस समस्या के लिए प्रोग्राम लिख रहा हो, उसे अनेक छोटी समस्याओं में बांट देता है और प्रत्येक छोटी समस्या के लिए अलग-अलग प्रोग्राम लिख देता है, और बाद में इन सबको जोड़कर एक बड़ा प्रोग्राम बनाता है, जो मूल समस्या का निराकरण पेश करता है।<br /><br />इन छोटे प्रोग्रामों को सी में फंक्शन कहा जाता है। प्रत्येक फंक्शन की कुछ विशेषताएं होती हैं, जो ये हैं –<br />1. प्रत्येक फंक्शन का एक अद्वितीय नाम होता है।<br />2. प्रत्येक फंक्शन उसे बुलानेवाले फंक्शन को कोई न कोई डेटा प्रकार लौटाता है।<br />3. प्रत्येक फंक्शन कोई न कोई डेटा प्रकार स्वीकारता है।<br /><br />फंक्शनों के संबंध में एक और बात जानने की है। वह यह कि प्रत्येक फंक्शन को दूसरा कोई फंक्शन आह्वान करता है।<br /><br />इसे इस तरह से समझिए। मान लीजिए आप मकान बनवा रहे हैं। उसके लिए आपको बढ़ई, मिस्त्री, लुहार, इलेक्ट्रीशियन, नलसाज, आदि की जरूरत है। ये सब फंक्शन हुए। आप भी एक फंक्शन हैं, जिसका कार्य है मकान बनवाना। पर आपकी हैसियत कुछ खास है। यदि आप न हों, तो मकान बनवाने काम होगा ही नहीं, क्योंकि आप ही बढ़ई, मिस्त्री, नलसाज आदि को इकट्ठा करके उन्हें काम सौंपते हैं।<br /><br />इसी तरह हर सी प्रोग्राम में भी एक खास फंक्शन होता है, जिसे main () कहा जाता है। हर प्रोग्राम में इस main () फंक्शन का होना अनिवार्य है। संकलक किसी प्रोग्राम का संकलन शुरू करने से पहले यही देखता है कि main () कहां है? यदि प्रोग्राम में main () फंक्शन न हो, तो संकलक इसे एक गंभीर त्रुटि मानकर संकलन कार्य को रोक देता है।<br /><br />तो यों समझिए कि हर प्रोग्राम में main () फंक्शन का होना अनिवार्य है। हमारे प्रोग्राम 1 में भी यह फंक्शन है। चूंकि यह एक छोटा सा प्रोग्राम है, इसमें केवल main () फंक्शन ही है, लेकिन वास्तविक सी प्रोग्रामों में main () के अलावा भी बीसियों फंक्शन होंगे।<br /><br />अब देखते हैं main () के पहले जो void शब्द है, वह किस लिए है। हमने पहले कहा था कि प्रत्येक फंक्शन उसे बुलानेवाले फंक्शन को कुछ न कुछ लौटाता है। कई बार यह रिक्त राशि भी हो सकती है, यानी आप यों समझ लें कि वह कुछ नहीं लौटाता। लेकिन सी की दृष्टि से यह कुछ नहीं भी, कुछ होता है! है न गूढ़ बात! खैर, इस रिक्त राशि को NULL कहते हैं, और main () के पहले जो void शब्द है (जिसका शाब्दिक अर्थ है, खाली) यही सूचित करता है, कि main () फंक्शन कुछ भी नहीं लौटाता है। बात भी सही है, main () ठहरा प्रोग्राम का मालिकाना फंक्शन वह क्या किसी को लौटाएगा, उसका काम है, सबसे कुछ न कुछ लेना।<br /><br />तो void का मतलब है कि यह फंक्शन कुछ लौटाता नहीं है। और यदि आप प्रोग्राम 1 को ध्यान से देखें, तो आपको विदित हो जाएगा कि वह कुछ भी नहीं लौटा रहा है किसी को। वह केवल Namaskar. को कंप्यूटर स्क्रीन पर छाप देता है।<br /><br />आगे आप ऐसे फंक्शन लिखेंगे जो अनेक प्रकार के डेटा टाइपों में से कोई न कोई एक डेटा टाइप दूसरे फंक्शनों को लौटाएंगे। इन फंक्शनों के आगे इस डेटा टाइप का संकेत शब्द रहेगा।<br /><br />अब void main () की एक तीसरी विशेषता पर आते हैं। वह है गोल कोष्ठक ()। आपके मन में यह सवाल जरूर उठ रहा होगा, कि यह किस लिए है और कोष्ठक के अंदर कुछ क्यों नहीं है। आपका सवाल वाजिब है, और उसका उत्तर नीचे दिया गया है।<br /><br />मैंने शुरू में कहा था कि सी प्रोग्रामों में सब कुछ फंक्शनों द्वारा कराया जाता है। अब जब फंक्शनों से कुछ कराना हो, तो उन्हें कुछ न कुछ देना भी होगा, जिस पर वे कुछ करें। चक्की वाले उदाहरण को ही लें, तो, चक्की में जब तक हम गेंहूं न डालें, वह आटा पैदा कैसे करेगी। चक्की में गेहूं डालने के लिए एक कीपनुमा पात्र होता है, जिसमें हम गेंहूं डालते हैं, और चक्की गेहूं को पीसकर आटा बनाकर उसके निचले भाग के नली से निकाल देती है।<br /><br />main () में, अथवा किसी भी अन्य फंक्शन में, जो गोल कोष्ठक है, वह चक्की के कीपनुमा पात्र के जैसा ही है। इसमें हम वह डेटा टाइप रखते हैं, जिस पर वह फंक्शन कोई कार्य करता है। मान लीजिए आपने ऐसा कोई फंक्शन लिखा हो, जो दो पूर्णांक संख्याओं का योग पता करता है। तो हम इस फंक्शन को ये दो संख्याएं देंगे, और वह इनका योग निकालकर हमें देगा।<br /><br />किसी भी फंक्शन को जो कुछ भी हमें देना हो, उसे हम इन गोल कोष्ठकों में रखेंगे। यहां रखने से ये संख्याएं उस फंक्शन के लिए उपलब्ध हो जाएंगी, और उन राशियों पर फंक्शन अपना कम कर सकेगा। हालांकि अभी आपने उतनी सी नहीं सीखी है कि इस तरह के फंक्शन आप लिख सकें, पर आपको उसका कोड यहां अवलोकनार्थ दे रहा हूं।<br /><br />int add (int x, inty) {<br />return (x+y);<br />}<br /><br />यह छोटा सा फंक्शन है जो उसे दी गई दो पूर्णांक संख्याओं x और y का योग निकालकर देता है।<br /><br />योग निकालने के लिए उसे दो संख्याएं देने की जरूरत है। इन्हें उसके गोल कोष्टकों के अंदर रखा गया है। यह जरूरी नहीं है कि गोल कोष्ठकों में दो ही राशियां हों, वहां आप जितनी चाहे राशियां रख सकते हैं। इन सब राशियों को उस फंक्शन का प्राचर (आर्ग्युमेंट) कहा जाता है।<br /><br />प्राचर शून्य से लेकर जितने भी हो सकते हैं, लेकिन हर फंक्शन केवल एक राशि को लौटा सकता है, और उस राशि के डेटा टाइप को सूचित करनेवाला शब्द उस फंक्शन के नाम के पहले लिखा जाता है। यहां दो पूर्णांकों को जोड़ने पर हमें एक पूर्णांक प्राप्त होगा, जिसके लिए int डेटा टाइप पर्याप्त है। int मने integer (पूर्णांक)।<br /><br />तो संक्षेप में यह कि हर सी प्रोग्राम में एक main() फंक्शन होता है। फंक्शन के पहले उसके द्वारा लौटाई गई राशि का डेटा टाइप लिखा जाता है। फंक्शन को दी जानेवाली राशियों को उसके गोल कोष्टकों में रखा जाता है। इन राशियों के साथ उनके डेटा टाइप का उल्लेख करना भी जरूरी है। इसीलिए हमारे add फंक्शन के गोल कोष्ठकों में int x और int y लिखा गया है। इससे add फंक्शन को पता चलता है कि उसे जो दो राशियां x और y दी गई हैं, वे पूर्णांक किस्म की राशियां हैं। यह जानकारी जरूरी है क्योंकि, जैसा कि हम आगे सीखेंगे, सी में राशियां कई प्रकार की हो सकती हैं।बालसुब्रमण्यम लक्ष्मीनारायणhttp://www.blogger.com/profile/09013592588359905805noreply@blogger.com5tag:blogger.com,1999:blog-4963974732144575217.post-2647897819606377482009-04-08T01:37:00.000-07:002009-04-08T04:22:00.545-07:00सीखिए सी - 5: सी प्रोग्राम की विशेषताएं - 2 और 3<span style="font-weight:bold;"># include < stdio.h ></span><br /><br />यह सी प्रोग्राम की दूसरी विशेषता है।<br /><br />यह उक्ति पूर्वसंकलक (प्रीकंपाइलर) के लिए है। किसी भी सी प्रोग्राम को संकलित करने से पहले एक पूर्वसंकलक उस प्रोग्राम को जांचता है, और उसमें कुछ कोड पंक्तियां जोड़ता है।<br /><br />लगभग सभी सी प्रोग्रामों की कुछ आम आवश्यकताएं होती हैं, जैसे कंप्यूटर की स्मृति में विद्यमान सामग्री को स्क्रीन पर लाना (आउटपुट), प्रयोक्ता द्वारा दी गई सूचनाओं को अथवा प्रोग्राम द्वारा निर्मित सूचनाओं को स्मृति में सहेजना (इनपुट)। इसके अलावा कुछ ऐसे प्रकार्य (फंक्शन) भी हैं, जिनकी बार-बार आवश्यकता पड़ती है, जैसे, फाइलों में लिखना, उन्हें पढ़ना, उनमें कुछ जोड़ना, उन्हें खोलना, बंद करना या डिलीट करना, नई फाइल बनाना आदि, अथवा गणित से जुड़े कुछ प्रकार्य, जैसे, किसी संख्या का वर्गमूल निकालना, किसी कोण का साइन, कोसाइन आदि का पता लगाना, इत्यादि। इस तरह के अन्य सामान्य प्रकार्य भी हैं। इन सबके लिए हर बार नए सिरे से कोड लिखने की आवश्यकता को कम करने के लिए सी के पूर्वसंकलक में इनसे संबंधित कोड पहले से ही विद्यमान रहते हैं। इन्हें अलग-अलग लाइब्रेरियों में व्यवस्थित किया गया है और उन लाइब्रेरियों में विद्यमान फंक्शनों के प्रोटोटाइपों (यह क्या है नीचे समझाया गया है) की अलग सूची भी बनाई गई हैं, जिन्हें हेडर फाइलें कहा जाता है। stdio.h ऐसा ही एक हेडर फाइल का नाम है।<br /><br />stdio एक संक्षेपण है और उसका पूरा रूप है standard input and output. इस हेडर फाइल में ऐसे प्रकार्यों (फंक्शनों) के प्रोटोटाइप हैं, जो इनपुट और आटपुट को सुगम बनाते हैं। प्रोग्राम 1 में जो printf() फंक्शन का प्रयोग किया गया है, वह इसी हेडर का एक फंक्शन है। इस फंक्शन का पूरा संकलित कोड पूर्वसंकलक में पहले से मौजूद है। इसलिए हमें इनपुट या आटपुट के कोड स्वयं लिखने की आवश्यकता नहीं है। हमें केवल उस फंक्शन का नाम भर अपने प्रोग्राम में लेना है और उससे संबंधित सी लाइब्रेरी के हेडर फाइल का उल्लेख # include उक्ति में कर देना है। बाकी काम पूर्वसंकलक कर देता है।<br /><br />आप ध्यान दें कि stdio के आगे .h है। यह बताता है कि यह एक हेडर फाइल है। हेडर फाइल में सी में पहले से ही मौजूद फंकश्नों के नामों की सूची रहती है। यदि आप stdio.h फाइल को खोलकर देखें, तो उसमें आपको बीसियों फंक्शनों के नाम दिखाई देंगे, इनमें आपको printf() भी मिलेगा। <br /><br />stdio.h में आपको printf() का कोड नहीं मिलेगा, वह संकलित रूप में अलग-अलग सी लाइब्रेरियों में रहता है। हेडर फाइलों में केवल फंक्शन के प्रोटोटाइप (अर्थात एक विशेष शैली में लिखा हुआ फंक्शन का नाम, घबराइए नहीं, फंक्शन प्रोटोटाइप क्या बला होते हैं, इसकी चर्चा नीचे दी गई है) होते हैं। इन फंक्शन प्रोटोटाइपों को देखकर पूर्वसंकलक आपके प्रोग्राम के संकलन के पहले उस फंक्शन से संबंधति कोड को आपके प्रोग्राम में ठीक स्थान पर लगा देता है, और उसके बाद आपके प्रोग्राम का संकलन होता है और .obj और .exe फाइलें बनती हैं।<br /><br />एक चीज और ध्यान देने की है, वह है stdio.h को घेरे हुए कोणीय कोष्ठक (अर्थात < और >)। ये महत्वपूर्ण हैं। इनसे पूर्वसंकलक को पता चलता है कि stdio.h फाइल के लिए उसे वहां खोजना है, जहां संकलक ने सभी सी लाइब्रेरियों और उनके हेडर फाइलों को संचित किया है। आप stdio.h को दुहरे उद्धरण चिह्नों से भी घेर सकते हैं, ऐसे #include “stdio.h”। ऐसा करने से पूर्वसंकलक stdio.h फाइल के लिए पहले उस निर्देशिका (डाइरेक्ट्ररी) में ढूंढ़ता है जिसमें आपका प्रोग्राम संचित है। यदि उसे वह वहां न मिले, तो पूर्वसंकलक stdio.h फाइल के लिए अन्य निर्देशिकाओं में खोज करता है। कई बार प्रोग्रामरों को अपने लिखे हुए कुछ फलनों (फंक्शनों) का बारबार भिन्न-भिन्न प्रोग्रामों में उपयोग करना पड़ता है। सुविधा के लिए वे इन सब फलनों को एक हेडर फाइल में संचित करके उसे कोई नाम दे देते हैं, जैसे jaihindi.h। अब वे अपने प्रोग्रामों में<br /><br />#include “jaihindi.h”<br /><br />वाला पूर्वसंकलक निर्देश जोड़कर इन फंक्शनों को सीधे आह्वान कर सकते हैं, और उनका कोड उन्हें दुबारा लिखना नहीं पड़ता।<br />इस तरह के हेडर फाइलों को प्रयोक्ता-परिभाषित हेडर फाइल कहा जाता है, और ये पूर्वसंकलक में पहले से ही विद्यमान हेडर फाइलों से भिन्न होते हैं। हेडर फाइलों को उद्धरण चिह्नों (“ और ”) अथवा कोणीय कोष्ठकों (< और >) से घेरकर हम पूर्वसंकलक को बताते हैं कि यह प्रयोक्ता द्वारा लिखा गया हेडर फाइल हैं या सी का अपना कोई हेडर फाइल, और उसे पूर्वसंकलक को कहां ढूंढ़ना है, उस निर्देशिका में जिसमें वह प्रोग्राम संचित है जिसमें यह निर्देश आया है, अथवा उस निर्देशिका में जिसमें सी की सभी हेडर फाइलें संचित हैं।<br /><br />#include वाले पूर्वसंकलक उक्ति के बारे में कुछ और महत्वपूर्ण बातें।<br /><br />1. इसे अलग पंक्ति में लिखना जरूरी है और # वाला चिह्न पंक्ति के प्रथम स्थान पर आना चाहिए।<br />अर्थात, इसे यों लिखना गलता होगा:-<br /><br />abcddx #include ......<br /><br />2. सी की उक्तियों के अंत में ; (अर्ध विराम चिह्न) रहता है, लेकिन पूर्वसंकलक से संबंधित उक्तियों के अंत में अर्ध विराम चिह्न ; नहीं रहता है। इसलिए यों लिखना गलत है:-<br /><br />#include “stdio.h”;<br /><br />और अब सी की कुछ प्रमुख हेडर फाइलों की चर्चा हो जाए, जिनका आप बारबार उपयोग करेंगे।<br /><br /><span style="font-weight:bold;">math.h</span><br />इसमें वर्ग मूल निकालने, किसी संख्या का घात निकालने, किसी कोण का साइन, कोसाइन, टेंजेंट, कोटेंजेंट आदि निकालने, इत्यादि के फंक्शनों के प्रोटोटाइप रहते हैं।<br /><br /><span style="font-weight:bold;">conio.h</span><br />यह भी stdio.h के समान है और इसमें भी इनपुट-आउटपुट से संबंधित फंक्शनों के प्रोटोटाइप रहते हैं। इस हेडर के फंक्शनों का उपयोग सी++ में अधिक होता है, न कि सी में।<br /><br /><span style="font-weight:bold;">string.h</span><br />इसमें स्मृति और स्ट्रिंग से संबंधित फंक्शनों के प्रोटाटाइप रहते हैं, उदाहरण के लिए, किसी दिए गए स्ट्रिंग में से कुछ वर्णों को छांटकर उपस्ट्रिंग बनाने के फंक्शन, किसी स्ट्रिंग को तोड़कर दो स्ट्रिंगों में बांटने के फंक्शन, किसी स्ट्रिंग के वर्णों को उलटने के फंक्शन (यानी jaihindi को idnihiaj बना देना), इत्यादि फंक्शनों के प्रोटोटाइप रहते हैं।<br /><br /><span style="font-weight:bold;">फंक्शन और फंक्शन प्रोटोटाइप</span><br />इस लेख में फंक्शन प्रोटोटाइप बारबार आया है, और आप सोच रहे होंगे ये क्या होते हैं। तो आपको संक्षिप्त में बता देते हैं। जब आप किसी फंक्शन का उपयोग करते हैं, तो वह कुछ डेटा टाइपों पर कार्य करता है, उन पर गणना करता है, या उन्हें अन्य रीति से बदलता है, और फिर बदली हुई चीज को उसे बुलानेवाले फंक्शन को लौटा देता है। यह सब कंप्यूटर की स्मृति का उपयोग करके किया जाता है। इसलिए किसी भी फंक्शन का उपयोग करने से पहले संकलक को उसके लिए पर्याप्त स्मृति आवंटित करना होता है। अब संकलक को कैसे पता चले कि किसी फंक्शन को कितनी स्मृति चाहिए होगी। यहीं फंक्शन प्रोटोटाइप का महत्व है। संकलक फंक्शन प्रोटोटाइप को देखकर समझ जाता है कि यह फंक्शन किस तरह के डेटा टाइपों पर कार्य करता है और किस डेटा टाइप को अपने परिणाम के रूप में लौटा है, और इस जानकारी के आधार पर वह फंक्शन के लिए स्मृति आवंटित करता है।<br /><br />फंक्शन, डेटा टाइप आदि पर आगे चर्चा होगी, और इन्हें पूरी तरह समझे बिना आप ठीक से समझ भी नहीं पाएंगे कि प्रोटोटाइप क्या हैं। मैंने सिर्फ आपकी जिज्ञासा शांत करने के लिए यहां थोड़ा सा संकेत भर कर दिया है।<br /><br />सी के फंक्शन क्या होते हैं, इसे आम जीवन के एक उदाहरण से स्पष्ट करने की कोशिश करता हूं।<br /><br />मान लीजिए आप गेहूं लेकर चक्की में पिसाने जाते हैं, और पिसा हुआ आटा लेकर घर लौट आते हैं। इस उदाहरण में चक्की फंक्शन है, गेहूं, उसे दिया गया डेटा टाइप है, आटा उस फंक्शन, यानी चक्की, द्वारा लौटाया गया डेटा टाइप है, और आप चक्की फंक्शन का आह्वान करनेवाला फंक्शन है (जी हां, फंक्शनों को दूसरे फंक्शन ही आह्वान करते हैं। सी में तो आवर्ती (रिकरिंग) फंक्शन भी हैं, जो स्वयं का आह्वान करते हैं, पर ये सब आगे सीखेंगे।)। यानी चक्की फंक्शन गेहूं डेटा टाइप पर कुछ क्रियाएं करके उसे आटा डेटा टाइप में बदलकर आपको दे देता है।<br /><br />अब आपको एक फंक्शन प्रोटोटाइप का हुलिया भी दिखा दूं। वह ऐसा दिखेगा:-<br /><br />int calculate (char);<br /><br />यह calculate नामक किसी फंक्शन का प्रोटोटाइप है। इसमें जो पहले int आया है, वह ऊपर के उदाहरण के आटे के बराबर है, गोल कोष्ठकों में जो char आया है, वह गेहूं के बराबर है। और ध्यान दीजिए, उसके अंत में ; (अर्ध विराम है) जो सी की हर उक्ति के अंत में होता है।<br /><br />लेख बहुत लंबा हो गया है, इसलिए यहीं समाप्त करता हूं। यदि इसकी बहुत सी बातें समझ में न आए तो घबराइए मत। आगा-आगे सब साफ हो जाएगा, बस अंत तक साथ बने रहिए।बालसुब्रमण्यम लक्ष्मीनारायणhttp://www.blogger.com/profile/09013592588359905805noreply@blogger.com5tag:blogger.com,1999:blog-4963974732144575217.post-36197769125908115682009-04-07T03:34:00.000-07:002009-04-07T03:45:58.525-07:00सीखेए सी - 4 : सी प्रोग्राम की विशेषता 1पिछले लेख में हमने सी प्रोग्रामों की आठ विशेषताओं का जिक्र किया था। आइए इन्हें अधिक विस्तार से समझें। सुविधा के लिए हर विशेषता की व्याख्या अलग पोस्ट में देता हूं।<br /><br />पहली विशेषता यह थी:-<br /><br /><span style="font-weight:bold;">1) /* और */ चिह्न</span><br /><br />ये दुहरे चिह्न प्राग्राम के बारे में सूचनाएं देने के लिए या उसके किसी जटिल अंश को स्पष्ट करने वाली कोई टिप्पणी जोड़ने के लिए उपयोग में लाए जाते हैं। इन दोनों चिह्नों के बीच जो भी संदेश लिखा जाता है, उसे संकलक नजरंदाज कर देता है। <br /><br />आप पूछ सकते हैं, कि तब इन संदेशों का उपयोग क्या है। बात यह है कि सी के बड़े-बड़े प्रोग्राम बहुत जटिल होते हैं और उन्हें एक नजर में समझना मुश्किल होता है। ऐसे में प्रोग्राम पढ़ने वालों की सुविधा के लिए प्रोग्राम-लेखक प्रोग्राम के अधिक जटिल हिस्सों को समझानेवाली टिप्पणियां प्रोग्राम में उपयुक्त स्थानों में जोड़ देते हैं। <br /><br />इन्हें /* और */ चिह्नों के बीच रखने से एक साथ दो काम हो जाते हैं। प्रथम, संकलक इन टिप्पणियों को लांघ जाता है, इसलिए इन टिप्पणियों का प्रोग्राम पर कोई प्रभाव नहीं पड़ता, पर प्रोग्राम पढ़नेवाले को प्रोग्राम को समझने में मदद मिलती है। दूसरा फायदा यह है कि इन दुहरे चिह्नों द्वारा घिरे रहने के कारण प्रोग्राम के टिप्पणी वाले अंश पढ़नेवाले की नजर में एकदम आ जाते हैं, और वह उन्हें प्रोग्राम का ही एक अंश समझने की गलती नहीं करता।<br /><br />ध्यान में रखने की बात यह है कि ये दुहरे चिह्न हैं, यानी इनमें से केवल एक का प्रयोग नहीं हो सकता। केवल एक के प्रयोग को संकलक गलती के रूप में लेगा और प्रोग्राम के संकलन को रोक देगा। इन दुहरे चिह्नों के बीच लिखी गई टिप्पणि अनेक पंक्तियों की हो सकती है। आवश्यकता केवल इस बात की है कि टिप्पणी के आरंभ में /* चिह्न रहे और उसके अंत में */ चिह्न।<br /><br />टिप्पणी देने के अलावा इन चिह्नों का एक अन्य उपयोग भी है। जैसा कि हमने ऊपर स्पष्ट किया, संकलक इन दोनों चिह्नों के बीच में जो भी लिखा होता है, उसे नजरंदाज कर देता है। यह विशेषता प्रोग्राम की पंक्तियों में रह गई त्रुटियों को ढूंढ़ने और उन्हें सुधारने में बहुत उपयोगी है। संदिग्ध पंक्तियों को इन चिह्नों से घेरकर प्रोग्राम का संकलन करके देखा जा सकता है। यदि संकलन हो जाता है, तो त्रुटि इन चिह्नों के भीतर की पंक्तियों में ही है। इस तरह लंबे और जटिल प्रोग्रामों में त्रुटिवाले अंशों का आसानी से पता लगाया जा सकता है।बालसुब्रमण्यम लक्ष्मीनारायणhttp://www.blogger.com/profile/09013592588359905805noreply@blogger.com2