Chapter 04 Introduction to Problem Solving

4.1 परिचय

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

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

केवल कंप्यूटरों के उपयोग के कारण ही आज ट्रेन टिकटों की बुकिंग आसान हो गई है। ट्रेन टिकटों की ऑनलाइन बुकिंग ने हमें कहीं से भी, कभी भी टिकट बुक करने में सक्षम बनाकर हमारी सुविधा बढ़ाई है।

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

“कंप्यूटर विज्ञान अमूर्तता का विज्ञान है — किसी समस्या के लिए सही मॉडल बनाना और उसे हल करने के लिए उपयुक्त यांत्रिकीकरण योग्य तकनीकें तैयार करना।”

$\quad$ — ए. अहो और जे. उलमैन

GIGO (Garbage In Garbage Out)

कंप्यूटर द्वारा दी गई आउटपुट की सटीकता इस बात पर निर्भर करती है कि दी गई इनपुट कितनी सही है।

4.2 समस्या समाधान के लिए चरण

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

चित्र 4.1: समस्या समाधान के चरण

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

4.2.1 समस्या का विश्लेषण

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

एल्गोरिद्म

सटीक चरणों का एक समूह जिसका पालन करने पर समस्या हल हो जाती है या आवश्यक कार्य पूरा हो जाता है।

4.2.2 एल्गोरिद्म विकसित करना

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

हम एक प्रारंभिक समाधान योजना से शुरू करते हैं और तब तक एल्गोरिद्म को परिष्कृत करते रहते हैं जब तक कि एल्गोरिद्म वांछित समाधान के सभी पहलुओं को कैप्चर न कर ले। किसी दी गई समस्या के लिए एक से अधिक एल्गोरिद्म संभव हैं और हमें सबसे उपयुक्त समाधान चुनना होता है। एल्गोरिद्म पर अनुभाग 4.3 में चर्चा की गई है।

4.2.3 कोडिंग

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

कोडिंग प्रक्रियाओं के विवरण को रिकॉर्ड करना और समाधान का दस्तावेज़ीकरण करना उतना ही महत्वपूर्ण है। यह बाद में प्रोग्रामों को फिर से देखने में सहायक होता है। कोडिंग को विस्तार से अनुभाग 4.8 में समझाया गया है।

4.2.4 परीक्षण और डिबगिंग

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

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

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

गतिविधि 4.1

दो संख्याओं का लघुतम समापवर्त्य (LCM) निकालने के लिए आप किस क्रम के चरणों का पालन करेंगे?

‘एल्गोरिदम’ शब्द की उत्पत्ति फारसी के खगोलशास्त्री और गणितज्ञ, अबू अब्दुल्ला मुहम्मद इब्न मूसा अल-ख्वारिज़मी (लगभग 850 ई.) से जोड़ी जाती है, क्योंकि अल-ख्वारिज़मी का लैटिन अनुवाद ‘अल्गोरिदमी’ कहलाता था।

4.3 एल्गोरिदम

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

  1. साइकिल को स्टैंड से निकालना,
  2. साइकिल की सीट पर बैठना,
  3. पैडल चलाना शुरू करना,
  4. जरूरत पड़ने पर ब्रेक लगाना और
  5. गंतव्य स्थान पर पहुँचने पर रुकना।

अब हम दी गई संख्याओं 45 और 54 का महत्तम समापवर्त्य (GCD) निकालते हैं।

नोट: GCD वह सबसे बड़ी संख्या है जो दी गई दोनों संख्याओं को विभाजित करती है।

चरण 1: उन संख्याओं (भाजकों) को खोजें जो दी गई संख्याओं को विभाजित कर सकें

45 के भाजक हैं: 1,3,5,9,15 और 45

54 के भाजक हैं: 1,2,3,6,9,18,27 और 54

चरण 2: फिर इन दोनों सूचियों से सबसे बड़ी उभयनिष्ठ संख्या खोजें।

इसलिए, 45 और 54 का महत्तम समापवर्तक 9 है

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

4.3.1 हमें एल्गोरिद्म की आवश्यकता क्यों है?

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

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

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

(A) एक अच्छे अल्गोरिद्म की विशेषताएँ

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

(B) अल्गोरिद्म लिखते समय निम्नलिखित को स्पष्ट रूप से पहचानना आवश्यक है:

  • उपयोगकर्ता से लिया जाने वाला इनपुट
  • वांछित परिणाम प्राप्त करने के लिए किया जाने वाला प्रोसेसिंग या गणना
  • उपयोगकर्ता द्वारा वांछित आउटपुट

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

  • यह समस्या समाधान की तर्क को दर्शाता है, कार्यान्वयन संबंधी विवरणों को छोड़कर
  • यह प्रोग्राम के निष्पादन के दौरान नियंत्रण के प्रवाह को स्पष्ट रूप से प्रकट करता है

4.4.1 फ्लोचार्ट — अल्गोरिदम की दृश्य प्रस्तुति

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

फ्लोचार्ट बनाने के लिए मानक प्रतीक होते हैं। कुछ को तालिका 4.1 में दिया गया है।

$\hspace{2.5cm}$ तालिका 4.1 फ्लो चार्ट बनाने के लिए आकृतियाँ या प्रतीक


उदाहरण 4.1: किसी संख्या का वर्ग निकालने के लिए एक अल्गोरिदम लिखिए।

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

- इनपुट: वह संख्या जिसका वर्ग निकालना है

- प्रक्रिया: संख्या को स्वयं से गुणा करके उसका वर्ग प्राप्त करें

- आउटपुट: संख्या का वर्ग

किसी संख्या का वर्ग निकालने के लिए एल्गोरिद्म।

चरण 1: एक संख्या इनपुट करें और उसे num में स्टोर करें

चरण 2: num * num की गणना करें और उसे square में स्टोर करें

चरण 3: square प्रिंट करें

किसी संख्या का वर्ग निकालने के लिए एल्गोरिद्म को चित्र 4.2 में दिखाए गए फ्लोचार्ट के माध्यम से चित्रात्मक रूप से दर्शाया जा सकता है।

चित्र 4.2: किसी संख्या का वर्ग गणना करने के लिए फ्लोचार्ट

उदाहरण 4.2: एक खराब बल्ब की समस्या को हल करने के लिए फ्लोचार्ट बनाएं

चित्र 4.3: खराब बल्ब की समस्या को हल करने के लिए फ्लोचार्ट

सोचिए और विचार कीजिए

क्या होगा यदि कोई एल्गोरिद्म सीमित संख्या में चरणों के बाद बंद नहीं होता?

गतिविधि 4.2

एक ऐसा फ्लोचार्ट बनाइए जो आपके करियर लक्ष्य की प्राप्ति को दर्शाता हो।

4.4.2 छद्द-कोड

एक pseudocode (उच्चारण: सू-डो-कोड) एल्गोरिद्म को दर्शाने का एक और तरीका है। इसे एक अनौपचारिक भाषा माना जाता है जो प्रोग्रामरों को एल्गोरिद्म लिखने में मदद करती है। यह निर्देशों का एक विस्तृत विवरण है जिसे कंप्यूटर को एक विशेष क्रम में पालन करना होता है। यह मानव पठन के लिए होता है और कंप्यूटर द्वारा सीधे निष्पादित नहीं किया जा सकता। pseudocode लिखने के लिए कोई विशिष्ट मानक मौजूद नहीं है। “pseudo” शब्द का अर्थ है “असली नहीं”, इसलिए “pseudocode” का अर्थ है “असली कोड नहीं”। नीचे pseudocode लिखते समय कुछ बार-बार प्रयुक्त होने वाले कीवर्ड दिए गए हैं:

  • INPUT
  • COMPUTE
  • PRINT
  • INCREMENT
  • DECREMENT
  • IF/ELSE
  • WHILE
  • TRUE/FALSE

उदाहरण 4.3: दो संख्याओं का योग प्रदर्शित करने के लिए एक एल्गोरिद्म लिखें जो उपयोगकर्ता द्वारा दर्ज की गई हैं, pseudocode और flowchart दोनों का उपयोग करके।

दो संख्याओं के योग के लिए pseudocode इस प्रकार होगा:

INPUT num1

INPUT num2

COMPUTE Result = num1 + num2

PRINT Result

इस एल्गोरिद्म के लिए flowchart Figure 4.4 में दिया गया है।

Figure 4.4: दो संख्याओं के योग को प्रदर्शित करने के लिए flowchart

गतिविधि 4.3

हॉकी मैच के लिए एक स्कोरबोर्ड बनाने के लिए pseudocode लिखें।

उदाहरण 4.4: एक आयत के क्षेत्रफल और परिमाप की गणना करने के लिए एक एल्गोरिद्म लिखें, NOTES pseudocode और flowchart दोनों का उपयोग करके।

अनुवादित अध्याय – 04 (भाग 12)

आयत के क्षेत्रफल और परिमाप की गणना के लिए स्यूडोकोड

INPUT लंबाई
INPUT चौड़ाई
COMPUTE क्षेत्रफल = लंबाई * चौड़ाई
PRINT क्षेत्रफल
COMPUTE परिमाप = 2 * (लंबाई + चौड़ाई)
PRINT परिमाप

इस एल्गोरिद्म का फ्लोचार्ट चित्र 4.5 में दिया गया है।

चित्र 4.5: आयत के क्षेत्रफल और परिमाप की गणना के लिए फ्लोचार्ट

(A) स्यूडोकोड के लाभ

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

> सोचिए और विचार कीजिए
क्या आप अपने दैनिक जीवन की कुछ ऐसी नियमित गतिविधियाँ गिना सकते हैं जिनमें निर्णय लेना शामिल हो?

4.5 नियंत्रण प्रवाह (FLOW OF CONTROL)

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

4.5.1 क्रम (Sequence)

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

4.5.2 चयन

चित्र 4.6 में दिखाए गए पड़ोस के नक्शे पर विचार करें। मान लें कि लाल छत वाली गुलाबी इमारत स्कूल है; नक्शे के सबसे दूर छोर पर पीले रंग से रंगा हुआ घर एक घर है।

चित्र 4.6: वास्तविक जीवन में निर्णय लेना

चित्र 4.6 के संदर्भ में, आइए निम्नलिखित प्रश्नों के उत्तर दें:

  • क्या घर से स्कूल तक पैदल चलने के लिए कोई पूर्वनिर्धारित मार्ग है?
  • क्या हम वापस आते समय कोई अलग मार्ग ले सकते हैं?

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

आइए कुछ अन्य उदाहरणों को देखें जहाँ निर्णय लेना कुछ शर्तों पर निर्भर करता है। उदाहरण के लिए,

(i) मतदान के लिए पात्रता की जाँच करना।

उनकी उम्र के आधार पर, एक व्यक्ति को या तो मतदान करने की अनुमति दी जाएगी या नहीं दी जाएगी:

  • यदि उम्र 18 से अधिक या बराबर है, तो व्यक्ति मतदान के लिए पात्र है
  • यदि उम्र 18 से कम है, तो व्यक्ति मतदान के लिए पात्र नहीं है

(ii) आइए एक अन्य उदाहरण पर विचार करें

यदि एक छात्र 8 वर्ष का है और छात्र को गणित पसंद है तो छात्र को समूह A में रखें

अन्यथा

$\quad$ छात्र को समूह B में रखें

उपरोक्त शर्त के अनुसार ये छात्र किस समूह में जाएँगे?

$\hspace{7cm}$ परिणाम

  • 8 वर्षीय रवि जिसे गणित पसंद नहीं है: $\hspace{0.5cm}$ समूह B

  • 8 वर्षीय प्रीति जिसे गणित पसंद है: $\hspace{1.5cm}$ समूह A

  • 7 वर्षीय अनीश जिसे गणित पसंद है: $\hspace{1.5cm}$ समूह B

इन उदाहरणों में, किसी एक विकल्प का चयन किसी शर्त के परिणाम के आधार पर किया जाता है। शर्तें (Conditionals) संभावनाओं की जाँच करने के लिए प्रयुक्त होती हैं। कार्यक्रम एक या अधिक शर्तों की जाँच करता है और शर्त के सत्य (true) या असत्य (false) मान के आधार पर संचालन (क्रियाओं की श्रृंखला) करता है। इन सत्य या असत्य मानों को द्विआधारी मान (binary values) कहा जाता है।

आकृति 4.7: किसी शर्त के सत्य या असत्य होने पर क्रियाएँ

शर्तों को एल्गोरिद्म में इस प्रकार लिखा जाता है:

यदि < शर्त > तो
$\quad$ वे चरण जो शर्त के सत्य/पूर्ण होने पर करने हैं

ऐसी परिस्थितियाँ भी होती हैं जहाँ हमें शर्त के पूर्ण न होने पर भी क्रिया करनी होती है (आकृति 4.7)। इसे दर्शाने के लिए हम लिख सकते हैं:

यदि < शर्त > सत्य है तो
वे चरण जो शर्त के सत्य/पूर्ण होने पर करने हैं
अन्यथा
$\quad$ वे चरण जो शर्त के असत्य/अपूर्ण होने पर करने हैं

प्रोग्रामिंग भाषाओं में ‘अन्यथा’ (otherwise) को Else की-वर्ड द्वारा दर्शाया जाता है। इसलिए, सत्य/असत्य शर्त को वास्तविक प्रोग्रामों में if-else ब्लॉक का प्रयोग करके लिखा जाता है।

उदाहरण 4.5: आइए एक एल्गोरिद्म लिखें जो जाँच करे कि कोई संख्या विषम है या सम।

- इनपुट: कोई भी संख्या
- प्रक्रिया: जाँच करें कि संख्या सम है या नहीं
- आउटपुट: संदेश “सम” या “विषम”

एल्गोरिदम का स्यूडोकोड इस प्रकार लिखा जा सकता है:

PRINT “Enter the Number” INPUT number
IF number MOD $2==0$ THEN
$\quad$ PRINT “Number is Even”
ELSE
$\quad$ PRINT “Number is Odd”

एल्गोरिदम का फ्लोचार्ट प्रतिनिधित्व चित्र 4.8 में दिखाया गया है।

चित्र 4.8: किसी संख्या के सम या विषम होने की जाँच करने का फ्लोचार्ट

उदाहरण 4.6: आइए एक स्यूडोकोड लिखें और एक फ्लोचार्ट बनाएँ जहाँ कई शर्तों की जाँच की जाती है ताकि किसी व्यक्ति को बच्चा $(<13)$, किशोर $(>=13$ लेकिन $<20$ ) या वयस्क ( $>=20$ ) के रूप में वर्गीकृत किया जा सके, आयु के आधार पर:

- इनपुट: आयु
- प्रक्रिया: दी गई मानदंडों के अनुसार आयु की जाँच करें
- आउटपुट: या तो “Child”, “Teenager”, “Adult” प्रिंट करें

स्यूडोकोड इस प्रकार है:

INPUT Age
IF Age < 13 THEN
$\quad$ PRINT “Child” ELSE IF Age < 20 THEN
$\quad$ PRINT “Teenager”
ELSE
$\quad$ PRINT “Adult”

एल्गोरिदम का फ्लोचार्ट प्रतिनिधित्व चित्र 4.9 में दिखाया गया है

चित्र 4.9: कई शर्तों की जाँच करने का फ्लोचार्ट

उदाहरण 4.7: “ड्रैगन्स और विज़र्ड्स” नामक कार्ड गेम के लिए एल्गोरिदम।

दो टीमें बनाएं DRAGONS और WIZARDS
इस खेल के नियम इस प्रकार हैं:

  • यदि खींचा गया कार्ड हीरा या क्लब है, तो टीम DRAGONS को एक अंक मिलता है
  • यदि खींचा गया कार्ड ह्रदय है जो एक संख्या है, तो टीम WIZARDS को एक अंक मिलता है
  • यदि खींचा गया कार्ड ह्रदय है जो संख्या नहीं है, तो टीम DRAGONS को एक अंक मिलता है
  • किसी अन्य कार्ड के लिए, टीम WIZARDS को एक अंक मिलता है
  • सबसे अधिक अंक वाली टीम विजेता है

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

अब आइए इस खेल के लिए कंडीशनल लिखें:

यदि (आकृति हीरा है) OR (आकृति क्लब है)
$\quad$ टीम DRAGONS को एक अंक मिलता है
ELSE IF (आकृति ह्रदय है) AND (मान संख्या है )
$\quad$ टीम WIZARDS को एक अंक मिलता है
ELSE IF (आकृति ह्रदय है) AND (मान संख्या नहीं है )
$\quad$ टीम DRAGONS को एक अंक मिलता है
ELSE
$\quad$ टीम WIZARDS को एक अंक मिलता है

प्रोग्राम के लिए pseudocode इस प्रकार हो सकता है:

नोट: Dpoint (ड्रैगन के लिए) और Wpoint (विज़र्ड के लिए) संबंधित टीमों द्वारा अर्जित अंक स्टोर करते हैं।

INPUT shape
INPUT value
SET Dpoint $=0$, wpoint $=0$
IF (shape is diamond) OR (shape is club) THEN
$\quad$ INCREMENT Dpoint
ELSE IF (shape is heart) AND (value is number ) THEN
$\quad$ INCREMENT Wpoint
ELSE IF (shape is heart) AND (value is not a number) THEN
$\quad$ INCREMENT Dpoint
ELSE
$\quad$ INCREMENT Wpoint
END IF
IF Dpoint > Wpoint THEN
$\quad$ PRINT “Dragon team is the winner”
ELSE
$\quad$ PRINT “Wizard team is the winner”

4.5.3 पुनरावृत्ति

जब हम किसी स्थान पर जाने के लिए निर्देश देते हैं, तो हम कुछ इस तरह कहते हैं, “50 कदम चलें फिर दाएं मुड़ें”। या “अगले चौराहे तक चलें फिर दाएं मुड़ें”। कुछ अन्य उदाहरणों पर विचार करें:

  • अपने हाथ पाँच बार ताली बजाओ
  • आगे 10 कदम चलो
  • थकने तक जगह पर कूदो

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

सोचिए और विचार कीजिए

क्या आप अपने दैनिक जीवन की कुछ नियमित गतिविधियों की सूची बना सकते हैं जहाँ पुनरावृत्ति या iteration शामिल है?

उदाहरण 4.8: 5 संख्याएँ स्वीकार करके उनका औसत निकालने के लिए pseudocode लिखिए और प्रवाह चित्र बनाइए।

प्रवाह चित्र का चित्रण चित्र 4.10 में दिखाया गया है।

सूद-कोड इस प्रकार होगा:

चरण 1: SET count $=0$, sum $=0$
चरण 2: WHILE count $<5$, चरण 3 से 5 तक दोहराएं
चरण 3: INPUT a number to num
चरण 4: sum $=$ sum + num
चरण 5: count $=$ count +1
चरण 6: COMPUTE average $=$ sum $/ 5$
चरण 7: PRINT average

उदाहरण 4.8 में, “count” नामक एक काउंटर यह ट्रैक रखता है कि लूप कितनी बार दोहराया गया है। लूप के प्रत्येक पुनरावृत्ति के बाद, count का मान 1 से बढ़ाया जाता है जब तक कि यह निर्धारित पुनरावृत्तियों की संख्या को पूरा नहीं कर लेता, जो पुनरावृत्ति की शर्त में दी गई है।

चित्र 4.10: 5 संख्याओं का औसत निकालने के लिए प्रवाह चित्र

ऐसी स्थितियाँ होती हैं जब हम पहले से नहीं जानते कि कथनों के समुच्चय को कितनी बार दोहराना है। अज्ञात पुनरावृत्तियों की ऐसी आवश्यकताओं को WHILE निर्माण का उपयोग करके संभाला जाता है।

उदाहरण 4.9: सूद-कोड लिखें और प्रवाह चित्र बनाएं जब तक उपयोगकर्ता 0 दर्ज नहीं करता तब तक संख्याएँ स्वीकार करें और फिर उनका औसत निकालें।

सूद-कोड इस प्रकार है:

चरण 1: SET count $=0$, sum $=0$
चरण 2: INPUT num
चरण 3: WHILE num is not equal to 0, REPEAT Steps 4 to 6
चरण 4: sum $=$ sum + num
चरण 5: count $=$ count +1
चरण 6: INPUT num
चरण 7: COMPUTE average $=$ sum $/$ count
चरण 8: PRINT average_

प्रवाहचित्र प्रस्तुति चित्र 4.11 में दिखाई गई है।

चित्र 4.11: प्रवाहचित्र जब तक उपयोगकर्ता 0 नहीं दर्ज करता तब तक संख्याओं को स्वीकार करने के लिए

इस उदाहरण में, हम नहीं जानते कि उपयोगकर्ता 0 दर्ज करने से पहले कितनी संख्याएँ दर्ज करने वाला है। यह तब तक बार-बार शर्त की जाँच करके संभाला जाता है जब तक शर्त गलत नहीं हो जाती।

गतिविधि 4.4

आइए उदाहरण 4.9 में दिए गए छद्मकोड का उपयोग करके निम्नलिखित प्रश्नों के उत्तर दें:

  1. जब इनपुट 6, 7, 4, 8, 2, 5, 0, 3, 1 हैं तो योग क्या होगा।

  2. count का मान क्या होगा?

  3. हमने num दर्ज करने के लिए इनपुट कथन को दो बार क्यों प्रयोग किया?

  4. हमने sum को count से क्यों विभाजित किया? 5) क्या कोई अन्य दृष्टिकोण हो सकता है?

4.6 एल्गोरिदम का सत्यापन

क्या आप कल्पना कर सकते हैं कि यदि बैंकिंग सॉफ्टवेयर सही तरीके से काम न करे तो क्या होगा? मान लीजिए ऑनलाइन मनी ट्रांसफर मॉड्यूल को सही ढंग से प्रोग्राम नहीं किया गया है और यह लेन-देन की गई राशि का केवल आधा हिस्सा खाते में जमा करता है! यदि खाते को क्रेडिट करने के बजाय डेबिट कर दिया जाए तो क्या होगा? ऐसा गलत सॉफ्टवेयर पूरे सिस्टम के कामकाज को बिगाड़ देगा और तबाही मचा देगा! आजकल सॉफ्टवेयर और भी अधिक महत्वपूर्ण सेवाओं में प्रयोग होते हैं — जैसे चिकित्सा क्षेत्र में या अंतरिक्ष शटल में। ऐसे सॉफ्टवेयर को हर स्थिति में सही काम करना चाहिए। इसलिए सॉफ्टवेयर डिज़ाइनर को यह सुनिश्चित करना चाहिए कि सभी घटकों का कार्य सही ढंग से परिभाषित किया गया हो, और उसे हर संभव तरीके से जांचा और सत्यापित किया गया हो।

सोचिए और विचार कीजिए

एल्गोरिद्म का सत्यापन समस्या समाधान में एक महत्वपूर्ण कदम क्यों है?

जब हमें बताया गया कि पहले $\mathrm{N}$ प्राकृतिक संख्याओं का योग $\frac{\mathrm{N}(\mathrm{N}+\mathrm{N})}{2}$ है, तो हमने इसे कैसे सत्यापित किया? खैर, हम इसे छोटी संख्याओं के लिए जांच सकते हैं, जिनका योग हम मैन्युअल रूप से निकाल सकते हैं। मान लीजिए $\mathrm{N}=6$, तो योग है $1+2+3+4+5+6=21$

सूत्र का उपयोग करके हमें योग $=\frac{6 \times(6+1)}{2}$ मिलता है

हम इस तरह कुछ और संख्याओं के साथ भी कोशिश कर सकते हैं ताकि यह सुनिश्चित हो सके कि सूत्र सही काम करता है।

गतिविधि 4.5

एक ऐल्गोरिद्म लिखिए जो आयताकार आकृति की लंबाई और चौड़ाई को फीट और इंच में इनपुट के रूप में ले (उदाहरण के लिए, $5 \mathrm{ft} 6$ inch) और उसका क्षेत्रफल और परिमाप गणना करे।

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

1. एल्गोरिद्म में किसी भी गलत चरण की पहचान करने में
2. एल्गोरिद्म में छूटे हुए विवरण या विशिष्टताओं को समझने में

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

एक एल्गोरिद्म लिखिए जो स्थान $\mathrm{A}$ से स्थान $\mathrm{C}$ तक B के रास्ते जाने में लगे कुल समय (T_total) की गणना करे, जहाँ A से B तक लगा समय (T1) और B से C तक लगा समय (T2) दिया गया है। अर्थात्, हमें ऐसा एल्गोरिद्म चाहिए जो घंटों और मिनटों में दिए गए समय को जोड़ सके। एल्गोरिद्म को एक तरह से लिखा जा सकता है:

PRINT value for T1
INPUT hh1
INPUT mm1
PRINT value for T2
INPUT hh2
INPUT mm2
hh_total $=$ hh1 + hh2 (Add hours)
mm_total =mm1+mm2 (Add mins)
Print T_total as hh_total, mm_total

अब आइए सत्यापित करें। मान लीजिए हम पहला उदाहरण लेते हैं जहाँ $\mathrm{T} 1=5 \mathrm{hrs} 20 \mathrm{mins}$ और $\mathrm{T} 2=7 \mathrm{hrs} 30 \mathrm{mins}$ है। सूखे रन पर, हमें परिणाम $12 \mathrm{hrs}$ और $50 \mathrm{mins}$ मिलता है। यह ठीक लगता है।

अब आइए एक और उदाहरण लें जहाँ $\mathrm{T} 1=4 \mathrm{hrs} 50$ mins और $\mathrm{T} 2=2 \mathrm{hrs} 20 \mathrm{mins}$ है, और हमें परिणाम 6 hrs 70 mins मिलता है जो समय मापने का सही तरीका नहीं है। परिणाम $7 \mathrm{hrs} 10$ mins होना चाहिए था।

इस दूसरे उदाहरण से हमें यह समझ आता है कि हमारा एल्गोरिद्म तभी काम करेगा जब $\mathrm{mm} 1+\mathrm{mm} 2$ (mm_total) $<60$ हो। बाकी सभी मामलों में, यह हमें वांछित तरीके से आउटपुट नहीं देगा। जब mm_total $>=60$ हो, तो एल्गोरिद्म को घंटों के योग (hh_total) को 1 बढ़ाना चाहिए और mm_total को 60 से घटाना चाहिए, यानी (mm_total-60)। तो संशोधित एल्गोरिद्म होगा:

PRINT value for T1
INPUT hh1
INPUT mm1
PRINT value for T2
INPUT hh2
INPUT mm2
hh_total = hh1 + hh2 (Add hours)
mm_total =mm1+mm2 (Add mins)
hh_total $=$ hh1 + hh2 (Add hours)
mm_total =mm1+mm2 (Add mins)
IF (mm_total >=60 ) THEN
$\quad$ hh_total $=$ hh_total +1
$\quad$ mm_total $=$ mm_total - 60
PRINT T_total as hh_total, mm_total

अब हम एल्गोरिद्म का अनुकरण कर सकते हैं $\mathrm{T} 1=4$ hrs 50 mins और $\mathrm{T} 2=2 \mathrm{hrs} 20 \mathrm{mins}$ के लिए, और T_total $=7 \mathrm{hrs}$ और $10 \mathrm{mins}$ प्राप्त करते हैं, जिसका अर्थ है कि एल्गोरिद्म सही तरीके से काम कर रहा है।

मान लीजिए हम किसी अल्गोरिदम की जाँच किए बिना कोई सॉफ्टवेयर विकसित करते हैं और यदि अल्गोरिदम में त्रुटियाँ हैं, तो विकसित सॉफ्टवेयर चलेगा नहीं। इसलिए अल्गोरिदम को सत्यापित करना महत्वपूर्ण है क्योंकि गलती को पकड़ने और ठीक करने के लिए आवश्यक प्रयास न्यूनतम होता है।

4.7 अल्गोरिदम की तुलना

किसी समस्या को कंप्यूटर द्वारा हल करने के लिए एक से अधिक उपाय हो सकते हैं और इसलिए हमारे पास एक से अधिक अल्गोरिदम हो सकते हैं। फिर कोई पूछ सकता है कि कौन-सा अल्गोरिदम इस्तेमाल किया जाए?

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

(i) भाजक 2 से प्रारंभ करते हुए, दी गई संख्या (भाज्य) को विभाजित करें और जाँचें कि कोई गुणनखंड है या नहीं। प्रत्येक पुनरावृत्ति में भाजक बढ़ाएँ और पिछले चरणों को तब तक दोहराएँ जब तक भाजक < भाज्य है। यदि कोई गुणनखंड है, तो दी गई संख्या अभाज्य नहीं है

(ii) (i) में, भाज्य तक सभी संख्याओं की जाँच करने के बजाय, केवल दी गई मान (भाज्य) के आधे तक ही जाँचें क्योंकि भाजक भाज्य के आधे से अधिक नहीं हो सकता

(iii) विधि (i) में, केवल भाज्य (संख्या) के वर्गमूल तक ही जाँच करें

(iv) यदि 100 तक की अभाज्य संख्याओं की पहले से सूची दी गई है, तो दी गई संख्या को सूची में मौजूद प्रत्येक संख्या से विभाजित करें। यदि यह किसी भी संख्या से विभाजित नहीं होती है, तो वह संख्या अभाज्य है, अन्यथा यह अभाज्य नहीं है।

ये सभी चार विधियाँ यह जाँच सकती हैं कि दी गई संख्या अभाज्य है या नहीं। अब प्रश्न यह है कि इन विधियों में से कौन-सी बेहतर या दक्ष है?

एल्गोरिदम (i) में बड़ी संख्या में गणनाओं की आवश्यकता होती है (अर्थात् अधिक प्रोसेसिंग समय), क्योंकि यह तब तक सभी संख्याओं से जाँच करता है जब तक भाजक संख्या से छोटा है। यदि दी गई संख्या बड़ी है, तो यह विधि परिणाम देने में अधिक समय लेगी।

विघटन द्वारा समस्या समाधान की भावना है ‘विभाजित करो और जीतो’। प्रसिद्ध गणितज्ञ हावर्ड राफा के शब्दों में:

“एक जटिल समस्या को सरल समस्याओं में विघटित करो, इन सरल समस्याओं में अपनी सोच को स्पष्ट करो, इन विश्लेषणों को तार्किक गोंद के साथ एक साथ रखो”

एल्गोरिदम (ii) एल्गोरिदम (i) से अधिक दक्ष है क्योंकि यह संख्या के आधे तक ही विभाज्यता की जाँच करता है, और इस प्रकार अभाज्य संख्या की गणना के लिए समय को कम करता है। एल्गोरिदम (iii) और भी अधिक दक्ष है क्योंकि यह संख्या के वर्गमूल तक ही विभाज्यता की जाँच करता है, जिससे लिया गया समय और भी कम हो जाता है।

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

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

4.8 कोडिंग

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

मशीन भाषा या निम्न-स्तरीय भाषा, जिसमें केवल 0 और 1 होते हैं, कंप्यूटर प्रोग्राम लिखने का आदर्श तरीका माना जाता है। बाइनरी अंकों का उपयोग करके लिखे गए प्रोग्राम सीधे कंप्यूटर हार्डवेयर द्वारा समझे जाते हैं, लेकिन इन्हें इंसानों के लिए समझना और काम करना कठिन होता है। इसी कारण उच्च-स्तरीय भाषाओं का आविष्कार हुआ, जो प्राकृतिक भाषाओं के करीब होती हैं और पढ़ने, लिखने और रखरखाव के लिए आसान होती हैं, लेकिन इन्हें कंप्यूटर हार्डवेयर सीधे नहीं समझता। उच्च-स्तरीय भाषाओं का उपयोग करने का एक लाभ यह है कि ये पोर्टेबल होती हैं, अर्थात् ये विभिन्न प्रकार के कंप्यूटरों पर थोड़े या बिना संशोधन के चल सकती हैं। निम्न-स्तरीय प्रोग्राम केवल एक प्रकार के कंप्यूटर पर चल सकते हैं और दूसरे प्रकार की प्रणाली पर चलाने के लिए इन्हें फिर से लिखना पड़ता है। FORTRAN, C, C++, Java, Python आदि जैसी कई उच्च-स्तरीय भाषाएं मौजूद हैं।

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

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

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

4.9 विघटन (DECOMPOSITION)

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

एक जटिल समस्या को विघटन द्वारा हल करने की मूल भावना यह है कि जटिल समस्या को छोटे-छोटे उप-समस्याओं में ‘विघटित’ या तोड़ दिया जाए जैसा कि चित्र 4.12 में दिखाया गया है। ये उप-समस्याएँ मूल समस्या की तुलना में अपेक्षाकृत आसान होती हैं। अंत में, उप-समस्याओं को तार्किक तरीके से जोड़कर बड़ी, मुख्य समस्या का समाधान प्राप्त किया जाता है।

चित्र 4.12: रेलवे आरक्षण प्रणाली

किसी जटिल समस्या को उप-समस्याओं में तोड़ने का अर्थ यह भी है कि प्रत्येक उप-समस्या को विस्तार से परखा जा सकता है। प्रत्येक उप-समस्या को स्वतंत्र रूप से और भिन्न व्यक्तियों (या टीमों) द्वारा हल किया जा सकता है। विभिन्न टीमों को विभिन्न उप-समस्याओं पर काम सौंपना लाभदायक भी हो सकता है क्योंकि विशिष्ट उप-समस्याएँ उन टीमों को सौंपी जा सकती हैं जो ऐसी समस्याओं को हल करने में विशेषज्ञ हैं।

ऐसी कई वास्तविक जीवन की समस्याएँ हैं जिन्हें विघटन का उपयोग करके हल किया जा सकता है। उदाहरणों में गणित और विज्ञान की समस्याओं को हल करना, विद्यालय में आयोजन प्रबंधन, मौसम पूर्वानुमान, वितरण प्रबंधन प्रणाली आदि शामिल हैं।

एक बार जब व्यक्तिगत उप-समस्याएँ हल हो जाती हैं, तो उनकी सही-सहीता की जाँच करना और उन्हें एकीकृत कर पूर्ण समाधान प्राप्त करना आवश्यक होता है।

सारांश

  • एक एल्गोरिद्म को एक चरण-दर-चरण प्रक्रिया के रूप में परिभाषित किया जाता है जिसे किसी संचालन को करने के लिए बनाया गया है ताकि वांछित परिणाम प्राप्त हो सके, यदि इसे सही ढंग से अपनाया जाए।
  • एल्गोरिद्म का एक निश्चित प्रारंभ और एक निश्चित अंत होता है, और इसमें सीमित संख्या में चरण होते हैं।
  • एक अच्छा एल्गोरिद्म, जो सटीक, अद्वितीय और सीमित होता है, इनपुट प्राप्त करता है और आउटपुट उत्पन्न करता है।
  • प्रभावी एल्गोरिद्म लिखने के लिए हमें नोट्स तैयार करने होंगे: इनपुट की पहचान, अनुसरण करने वाली प्रक्रिया और वांछित आउटपुट।
  • एक फ्लोचार्ट एक प्रकार का चित्र है जो एल्गोरिद्म को विभिन्न प्रकार के बक्सों का उपयोग करके ग्राफिकली दर्शाता है, जिन्हें तीरों द्वारा क्रम में जोड़ा जाता है।
  • एक एल्गोरिद्म जिसमें सभी चरण एक के बाद एक क्रियान्वित होते हैं, क्रमबद्ध (sequence) क्रियान्वयन कहलाता है।
  • निर्णय लेने में किसी शर्त के परिणाम के आधार पर विकल्पों में से एक का चयन शामिल होता है।
  • एक एल्गोरिद्म में कुछ ऐसे चरण हो सकते हैं जो सीमित बार दोहराए जाते हैं; ऐसे एल्गोरिद्म को पुनरावृत्त (iterative) कहा जाता है।
  • किसी समस्या को हल करने के एक से अधिक तरीके हो सकते हैं, इसलिए किसी विशेष समस्या के लिए एक से अधिक एल्गोरिद्म हो सकते हैं।
  • एल्गोरिद्म का चयन समय और स्थान जटिलता (time and space complexity) के आधार पर किया जाना चाहिए।

अभ्यास

1. दो संख्याएँ पढ़कर एक को दूसरे से विभाजित कर भागफल प्रदर्शित करने वाला स्यूडोकोड लिखिए।

2. दो दोस्त सिक्का पाँच बार उछालकर तय करते हैं कि केक का आख़िरी टुकड़ा किसे मिलेगा। जो पहले तीन बार जीत जाएगा, वह केक पाएगा। इनपुट में 1 का मतलब खिलाड़ी 1 ने फ़्लिप जीता, और 2 का मतलब खिलाड़ी 2 ने फ़्लिप जीता। यह तय करने के लिए एक एल्गोरिद्म बनाइए कि केक कौन ले जाता है?

3. सभी 5 के गुणकों को 10 और 25 के बीच (10 और 25 दोनों को शामिल करते हुए) प्रिंट करने के लिए pseudocode लिखिए।

4. एक ऐसे लूप का उदाहरण दीजिए जिसे निश्चित बार चलाया जाना है।

5. मान लीजिए आप किसी चीज़ के लिए पैसे इकट्ठा कर रहे हैं। आपको कुल ₹ 200 चाहिए। आप अपने माता-पिता, चाचा-चाचियों और दादा-दादी से पूछते हैं। अलग-अलग लोग या तो ₹ 10, ₹ 20 या ₹ 50 दे सकते हैं। आप तब तक इकट्ठा करेंगे जब तक कुल ₹ 200 न हो जाए। एल्गोरिद्म लिखिए।

6. किसी वस्तु की कीमत और मात्रा के आधार पर बिल प्रिंट करने के लिए pseudocode लिखिए। साथ ही Bill GST प्रिंट करिए, जो कुल बिल में 5% टैक्स जोड़ने के बाद का बिल है।

7. ऐसा pseudocode लिखिए जो निम्न कार्य करे:

a) तीन विषयों—कंप्यूटर साइंस, गणित और भौतिकी—के अंक 100 में से पढ़े

b) कुल योग अंक की गणना करे

c) अंकों का प्रतिशत निकाले

8. उपयोगकर्ता द्वारा दर्ज किए गए दो अलग-अलग नंबरों में से सबसे बड़ा खोजने के लिए एक एल्गोरिद्म लिखिए।

9. एक ऐल्गोरिद्म लिखिए जो निम्नलिखित कार्य करे: उपयोगकर्ता से एक संख्या दर्ज करने को कहिए। यदि संख्या 5 और 15 के बीच है, तो शब्द GREEN लिखिए। यदि संख्या 15 और 25 के बीच है, तो शब्द BLUE लिखिए। यदि संख्या 25 और 35 के बीच है, तो शब्द ORANGE लिखिए। यदि यह कोई अन्य संख्या है, तो लिखिए ALL COLOURS ARE BEAUTIFUL।

10. एक ऐल्गोरिद्म लिखिए जो चार संख्याओं को इनपुट के रूप में स्वीकार करे और उनमें से सबसे बड़ी और सबसे छोटी संख्या खोजे।

11. एक ऐल्गोरिद्म लिखिए जो महीने के कुल पानी के बिल शुल्क प्रदर्शित करे, जो ग्राहक द्वारा खपत की गई इकाइयों की संख्या के आधार पर निम्नलिखित मानदंडों के अनुसार हो:

  • पहली 100 इकाइयों के लिए $@ 5$ प्रति इकाई
  • अगली 150 इकाइयों के लिए @ 10 प्रति इकाई
  • 250 इकाइयों से अधिक के लिए @ 20 प्रति इकाई

कुल पानी के बिल की गणना करने के लिए प्रति माह 75 के मीटर शुल्क को भी जोड़िए।

12. कंडीशनल क्या होते हैं? वे किसी प्रोग्राम में कब आवश्यक होते हैं?

13. जोड़ियों का मिलान कीजिए

14. निम्नलिखित स्कूल या कॉलेज जाने के लिए एक ऐल्गोरिद्म है। क्या आप इसमें अन्य विकल्पों को शामिल करने के लिए सुधार सुझा सकते हैं?

Reach_School_Algorithm

a) जागिए
b) तैयार हो जाइए
c) लंच बॉक्स लीजिए
d) बस पकड़िए
e) बस से उतरिए
f) स्कूल या कॉलेज पहुंचिए

15. किसी संख्या का फैक्टोरियल गणना करने के लिए एक स्यूडोकोड लिखिए (संकेत: 5 का फैक्टोरियल, जिसे $5!=5 \times 4 \times 3 \times 2 \times 1$ के रूप में लिखा जाता है)।

16. एक ऐसा फ्लोचार्ट बनाइए जो यह जाँच करे कि दी गई संख्या आर्मस्ट्रांग संख्या है या नहीं। तीन अंकों की आर्मस्ट्रांग संख्या एक ऐसा पूर्णांक होता है जिसके अंकों के घनों का योग स्वयं उस संख्या के बराबर होता है। उदाहरण के लिए, 371 एक आर्मस्ट्रांग संख्या है क्योंकि $33 + 73 + 1**3 = 371$ है।

17. नीचे एक ऐल्गोरिद्म दिया गया है जो संख्याओं को “एक अंक”, “दो अंक” या “बड़ी” वर्गीकृत करता है।

Classify_Numbers_Algo

INPUT Number
IF Number < 9
$\quad$ “Single Digit”
Else If Number < 99
$\quad$ “Double Digit”
Else
$\quad$ “Big”

इसकी जाँच $(5,9,47,99,100, 200)$ पर करें और आवश्यक हो तो ऐल्गोरिद्म को सही करें

18. कुछ गणनाओं के लिए हमें एक ऐसे ऐल्गोरिद्म की जरूरत है जो केवल 100 तक के धनात्मक पूर्णांकों को स्वीकार करे।

Accept_1to100_Algo

INPUT Number
IF ( $0<=$ Number) AND (Number $<=100$ )
$\quad$ ACCEPT
Else
$\quad$ REJECT

a) इस ऐल्गोरिद्म पर किन मानों पर यह विफल होगा?

b) क्या आप इस ऐल्गोरिद्म को बेहतर बना सकते हैं?