[Powered by Google Translate] [Walkthrough - समस्या 2 सेट] [Zamyla चान - हार्वर्ड विश्वविद्यालय] [यह CS50 है. CS50.TV] सही सभी. सबको नमस्ते, और 2 Walkthrough के लिए आपका स्वागत है. सबसे पहले, मैं आप 1 pset परिष्करण के लिए बधाई देना चाहता हूँ. मुझे पता है कि आप में से कुछ के लिए एक सा कठिन हो सकता था, अपना पहला कंप्यूटर प्रोग्राम है कि आप ने लिखा हो सकता है, लेकिन सिर्फ इस के अंत में है कि याद है, जब आप सेमेस्टर के अंत में वापस देखो, आप 1 pset को देखो और आप कहते हैं, "अरे, मैं कर सकता है कि 5 मिनट में." तो पता है और विश्वास है कि इस के अंत में आप निश्चित रूप से 1 pset काफी सरल लगता हूँ. लेकिन अब के लिए यह एक बड़ी उपलब्धि है, और किया हो रही के लिए बधाई. अब एक जल्दी ध्यान दें, पहले भी हम walkthrough के मांस में मिलता है. मैं बस एक त्वरित टिप्पणी करना चाहते हैं कि मैं कभी कभी पर्याप्त समय नहीं होगा walkthroughs के दौरान समस्या सेट करने के हर एक तरह के माध्यम से जाने के लिए और नहीं बल्कि सिर्फ शायद कार्यान्वयन की 1 या 2 प्रकार पर ध्यान केंद्रित करने के लिए, तरीके कि तुम यह कर सकता है. लेकिन यह है कि कहने के लिए नहीं है कि आप इसे दूसरे तरीके से करने से मना कर रहे हैं. वहाँ अक्सर होते हैं, के रूप में कंप्यूटर विज्ञान के साथ बातें कर के कई तरीके हैं, और तो निश्चित रूप से करने के लिए समाधान के एक अलग प्रकार की तुलना में मैं प्रस्तुत हो सकता है का उपयोग करने के लिए स्वतंत्र महसूस हो रहा है. [2 pset: क्रिप्टोप्लग - Zamyla चान - zamyla@cs50.net] [Pset2 - 0. सवालों की एक धारा - 1. सीज़र - 2. Vigenere] सही सभी. इसलिए इस समस्या का सेट 2: क्रिप्टोप्लग एक मजाक है. फिर से, हर pset के साथ आप सवालों की एक खंड के साथ शुरू करेंगे कि अपने वर्गों में अपने नियत अध्यापन साथी के साथ आयोजित किया जा रहा है. हम walkthrough पर इन के माध्यम से जाने के लिए नहीं जा रहे हैं, लेकिन वे निश्चित रूप से मदद मिलेगी आप pset पूरा. तो समस्या सेट के पहले भाग सीज़र है. और इसलिए सीज़र में किसी को आप एक पूर्णांक के साथ एक महत्वपूर्ण पारित करेंगे, और आप पाठ की एक स्ट्रिंग एन्क्रिप्ट करेगा कि वे आप प्रदान और उन्हें वापस दे एक एन्क्रिप्टेड बात. अगर किसी को भी एक क्रिसमस स्टोरी देखा, वहाँ है कि एक उदाहरण है. फिर समस्या सेट के दूसरे भाग Vigenere है, जो एक और अधिक उन्नत एन्क्रिप्शन तकनीक है. और इसलिए हम पाठ का एक टुकड़ा कूटलेखन जा रहे हैं, बजाय सिर्फ एक पूर्णांक के साथ छोड़कर, हम वास्तव में यह सांकेतिक शब्दों में बदलना करने के लिए जा रहे हैं साथ एक कीवर्ड है कि उपयोगकर्ता हमें प्रदान करेगा. ठीक है, तो toolbox में आज पहली उपकरण वास्तव में उपकरण को अद्यतन किया जा रहा है. चर्चा बोर्ड पर हम चीजों की तरह देखते हैं, "क्यों यह काम नहीं करता है?" "50 काम सबमिट क्यों नहीं करता है?" और अक्सर समाधान वास्तव में सिर्फ अपने उपकरण अद्यतन. और यदि ऐसा है तो आप सिर्फ अपने उपकरण sudo yum-y में एक टर्मिनल विंडो में चलाने - कि हाँ कह झंडा है, सब कुछ अद्यतन अद्यतन, तो अपने उपकरण अद्यतन अगर जरूरत हो जाएगा. और यह बात अगर आप पहले से ही उपकरण का सबसे हाल के संस्करण में चोट नहीं है. तो यह सिर्फ कहना है कि कोई नया अद्यतन उपलब्ध होगा और आप के साथ काम जारी रख सकते हैं. लेकिन यह अच्छा है के लिए भी हर समय है कि आप उपकरण खुला निष्पादित क्योंकि हम अभी भी बहुत ज्यादा कर रहे हैं - यह उपकरण में फिक्सिंग - कभी कभी तो हम एक बग में आते हैं. तो यह सुनिश्चित करें कि आप उपकरण का सबसे हाल के संस्करण है चलाने के लिए और है कि वहाँ अद्यतन. सही सभी. के बाद से तो हम पत्र के साथ काम कर रहे हैं और बदल रहा है, बातें enciphering हम वास्तव में हमारे ASCII चार्ट के साथ अच्छे दोस्त बन चाहते करने के लिए जा रहे हैं. वहाँ कई लोगों को ऑनलाइन कर रहे हैं, यदि आप पाते हैं. शायद अपने खुद भी कर सकते हैं. असल में, हर पत्र और हर संख्या और हर चरित्र के साथ वहाँ उनके साथ जुड़े संख्या है, और तो यह अच्छा है वास्तविक पत्र के साथ - साथ उनके ASCII मूल्यों को देखने. यह निश्चित रूप से आप समस्या सेट में मदद मिलेगी. एक बात है कि वास्तव में मुझे इस समस्या सेट में मदद करने के लिए वास्तव में इसे बाहर प्रिंट था, और के रूप में मैं के माध्यम से जा रहा था, मैं वास्तव में इस पर आकर्षित करेगा, लिखते हैं, "यदि यह करने के लिए वहाँ जाने के लिए है, तो ..." एक तरह से उस पर आकर्षित और यह निशान, अपने ASCII तालिका के साथ अच्छे दोस्त बन गए. तो फिर हम अपने निपटान में कुछ अन्य उपकरण है. इस समय के बजाय वास्तव में अपने इनपुट के सभी के लिए उपयोगकर्ता उत्साह हम एक संयोजन करने के लिए जा रहे हैं. हम उन्हें कुछ इनपुट के लिए संकेत करने के लिए जा रहे हैं, लेकिन हम भी सिर्फ कमांड लाइन तर्क का उपयोग करने के लिए जा रहे हैं. तो जब वे अपने कार्यक्रम चलाते हैं, आम तौर पर आप कहते हैं. / हैलो, उदाहरण के लिए, यदि आपके प्रोग्राम hello.c था. लेकिन इस समय के बजाय बस कह रही है कि, वे शब्द, तर्क बाद में डाल सकते हैं. और इसलिए हम प्रयोग करने जा रहे हैं जो कुछ भी वे अपने निवेश के रूप में हमें के रूप में अच्छी तरह से पारित तो सिर्फ पूर्णांक के लिए उत्साह से परे जा रहा है, लेकिन यह भी कमांड लाइन तर्क का उपयोग. और फिर हम arrays और तार, जो हम एक बहुत का उपयोग कर के रूप में अच्छी तरह से हो जाएगा में जाना होगा. यहाँ सिर्फ 1 छोटा ASCII चार्ट का एक उदाहरण है. जैसा कि मैंने कहा, हर पत्र एक संख्या से मेल खाती है, और इसलिए अपने आप को उस के साथ परिचित. यह काम में आ जाएगा. और बाद में जब हम कुछ ASCIIMath संख्या के साथ काम कर रही शुरू - जोड़ने, उन्हें subtracting तो निश्चित रूप से इस चार्ट का उल्लेख करने के लिए अच्छा है. कुछ है कि आप के साथ खेला हो सकता है - तो यहाँ एक सीज़र सिफर के एक उदाहरण है. यह सिर्फ एक पहिया है. मूलतः, वहाँ एक बाहरी वर्णमाला है और फिर वहाँ एक आंतरिक वर्णमाला है. तो ठीक है यहाँ सीज़र सिफर के 0 की एक प्रमुख के साथ एक उदाहरण है. अनिवार्य रूप से, एक साथ गठबंधन किया है, बी बी के साथ गठबंधन किया है, जेड के लिए सभी तरह से ऊपर लेकिन तब हम कहते हैं कि हम 3 की एक प्रमुख उदाहरण के लिए चाहता था,. तो फिर हम भीतरी पहिया बारी बारी से इतना है कि अब एक डी, आदि के साथ aligns और इसलिए यह अनिवार्य है कि हम क्या करने जा रहे हैं. हम एक पहिया नहीं है, लेकिन हम क्या करने जा रहे हैं जो हमारे कार्यक्रम बनाने के लिए है संख्या की एक निश्चित राशि की तरह हमारे साथ वर्णमाला पाली. तो जैसा कि मैंने पहले कहा, हम कमांड लाइन तर्क के साथ काम किया जा रहे हैं के रूप में अच्छी तरह से एक पूर्णांक के रूप में हो रही है. तो जिस तरह से है कि एक उपयोगकर्ता अपने सीज़र कार्यक्रम चलेंगे कह रही है. / कैसर और फिर उसके बाद एक संख्या में प्रवेश. और उस नंबर कुंजी, पाली का प्रतिनिधित्व करता है, कितनी बार आप अपने सीज़र सिफर के भीतरी पहिया घूर्णन हो जा रहे हैं. और इसलिए तुम यहाँ एक उदाहरण देखते हैं. यदि हम हमारे सीज़र सिफर में एक एल से पत्र में प्रवेश किया है, तो यह हे के माध्यम से डी इनपुट है कि क्योंकि हर 3 से अधिक बार स्थानांतरित पत्र होता है, बस पहिया है कि मैं तुम्हें दिखाया के उदाहरण की तरह. तो अगर आप में प्रवेश किया है, उदाहरण के लिए, यह CS50 है! तो यह भी पत्र के सभी कदम होगा. और कि दोनों सीज़र और Vigenere में एक महत्वपूर्ण बात है यह है कि हम किसी भी गैर - पत्र को छोड़ जा रहे हैं. तो किसी भी स्थान, वर्ण, आदि, संख्या, हम उन्हें एक ही रखने के लिए जा रहे हैं. हम केवल इस मामले में पत्र बदलाव करने के लिए जा रहे हैं. तो जैसा कि आप पहिया में देखते हैं, हम केवल हमारे लिए उपलब्ध पत्र है, इसलिए हम केवल पत्र पारी और पत्र एन्क्रिप्ट करने के लिए करना चाहते हैं. तो पहली बात करना, तुमने देखा कि इस समस्या में सीज़र के लिए उपयोग 2 सेट कैसर चलाने के लिए और फिर एक संख्या दर्ज करें जब आप यह टर्मिनल में चलाया है. तो हम क्या करने की जरूरत के लिए किसी भी तरह कि कुंजी पाने के लिए और इसे का उपयोग करने के लिए है. और इसलिए हम किसी भी तरह यह 2 कमांड लाइन तर्क होने जा रहा है देखना चाहता हूँ. पहले एक कैसर / होने जा रहा है और अगले एक कुंजी संख्या होने जा रहा है. तो इससे पहले कि हम int मुख्य (शून्य) हमारे सी कार्यक्रम शुरू किया था. हम वापस छील एक परत एक छोटा सा करने के लिए जा रहे हैं और वास्तव में देखना है कि शून्य में हमारे मुख्य समारोह के लिए पारित करने के बजाय हम वास्तव में 2 मानकों के साथ काम कर रहे हैं. हम एक argc नाम int है और फिर तारों की एक सरणी argv कहा जाता है. तो argc एक पूर्णांक है, और यह अपने कार्यक्रम के लिए पारित तर्क की संख्या का प्रतिनिधित्व करता है. और फिर argv वास्तव में पारित तर्कों की सूची है. सभी तर्कों के तार कर रहे हैं, और इतना argv एक सरणी, तारों की एक सूची का प्रतिनिधित्व करता है. चलो एक छोटा सा arrays के बारे में बात करते हैं. Arrays अनिवार्य रूप से एक नया डेटा संरचना हैं. हम ints हम डबल्स है, हम तार है, और अब हम arrays है. Arrays डेटा संरचनाओं कि एक ही प्रकार के कई मूल्यों को पकड़ कर सकते हैं, इसलिए अनिवार्य रूप से, आप चाहते हैं जो कुछ भी प्रकार की एक सूची है. अनिवार्य रूप से, अगर आप एक चर में सभी integers की एक सूची चाहता था, तो आप एक नया चर कि प्रकार int सरणी था पैदा होगा. तो arrays शून्य अनुक्रमित कर रहे हैं, जिसका अर्थ है कि सरणी के पहले तत्व 0 सूचकांक में है. यदि सरणी 4, इस उदाहरण के रूप में लंबाई की है, तो अपने अंतिम तत्व सूचकांक 3 होगा, 1 - जो 4 है. तो सरणी बनाने के लिए, आप कुछ इस तरह करना होगा. कहते हैं कि आप एक डबल सरणी चाहता था. यह डेटा प्रकार के किसी भी प्रकार के लिए चला जाता है, यद्यपि. तो कहते हैं कि तुम एक डबल सरणी चाहते. कहते हैं कि तुम यह मेलबॉक्स कॉल करना चाहते हैं. वैसे ही जैसे आप किसी अन्य डबल प्रारंभ होगा, आप डबल और फिर नाम कहना होगा, लेकिन इस बार हम वर्ग कोष्ठक डाल दिया, और फिर संख्या सरणी की लंबाई होगा. ध्यान दें कि हम कभी arrays में लंबाई नहीं बदल सकते हैं, ताकि आप हमेशा को परिभाषित करने के लिए और कितने बक्से का चयन है, कितने मूल्यों को अपने सरणी के लिए आयोजित करने जा रहा है. ऐसा करने के लिए अपने सरणी में विभिन्न मूल्यों को निर्धारित करने के लिए, आप इस निम्न सिंटैक्स का उपयोग करने के लिए जा रहे हैं, के रूप में आप स्लाइड पर देखते हैं. आप मेलबॉक्स सूचकांक शून्य 1.2 पर निर्धारित किया जाएगा, मेलबॉक्स सूचकांक 1 2.4 करने के लिए सेट, आदि तो अब है कि हम arrays एक बिट की समीक्षा की है, चलो argc और argv करने के लिए वापस जाना. हम जानते हैं कि argv अब तारों की एक सरणी है. तो जब एक उपयोगकर्ता में गुजरता है - कहते हैं कि वे एक कार्यक्रम चल रहे हैं - वे कहते हैं. / हैलो डेविड Malan, कार्यक्रम के लिए आप पहले से ही वास्तव में argc और argv क्या कर रहे हैं के साथ ऊपर आ जाएगा. तो क्या आप इस बारे में चिंता करने की जरूरत नहीं है. इस मामले में argc 3 हो सकता है क्योंकि यह 3 अलग स्थानों के द्वारा पृथक शब्दों देखता होगा. और यदि ऐसा है तो फिर इस उदाहरण में सरणी, पहली सूचकांक / नमस्ते होगा, अगले एक डेविड, अगले एक Malan. क्या किसी को भी सही दूर क्या argv के बीच संबंध देखते हैं,  सरणी, और argc है? हाँ. हम उस में args.c. में एक उदाहरण में मिल जाएगा चलो देखते हैं अगर हम 2 के बीच संबंधों का लाभ ले सकते हैं. यहाँ आप उपकरण में मिल सकता है कि डिफ़ॉल्ट अनुप्रयोग ग फ़ाइलों को खोलने कभी कभी Emacs. लेकिन हम gedit के साथ सौदा करना चाहते हैं, तो तुम क्या कर सकते है कि आप सही अपनी सी फाइल पर क्लिक कर सकते हैं, गुण के लिए जाना है, साथ खुला, और तो जीएडिट, डिफ़ॉल्ट के रूप में सेट चुनते हैं, और अब अपने कार्यक्रम के बजाय जीएडिट Emacs में खोल देना चाहिए. बिल्कुल सही. यहाँ तो मैं एक प्रोग्राम है कि मैं प्रत्येक कमांड लाइन तर्क मुद्रित करना चाहते हैं. तो जो उपयोगकर्ता इनपुट, मैं करने के लिए अनिवार्य रूप से यह एक नई लाइन पर उन्हें वापस लौटने के लिए करना चाहते हैं. तो एक संरचना है कि हम पर कुछ पुनरावृति का उपयोग कर सकते हैं क्या है - कुछ है कि आप शायद अपने pset 1 में प्रयोग किया जाता है? यदि आप चीजों की एक निर्धारित संख्या के माध्यम से जाना चाहते हैं? >> पाश के लिए [छात्र]. पाश के लिए. बिल्कुल सही. तो चलो पाश के लिए के साथ शुरू करते हैं. हम int i = 0 के लिए है. चलो बस एक मानक initialization चर के साथ शुरू करते हैं. मैं एक सेट के लिए शर्त को छोड़ दो और फिर कहते हैं कि मैं + +, चीजों को करने के लिए जा रहा करने के लिए जा रहा हूँ. सही सभी. तो argv के लिए वापस सोच, अगर argv में कार्यक्रम के लिए पारित तर्क की सूची है और argc कार्यक्रम में तर्कों की संख्या है, तो इसका मतलब है कि argc अनिवार्य रूप से argv की लंबाई, सही है, क्योंकि वहाँ argc के मूल्य के रूप में कई तर्क के रूप में जा रहे हैं. तो अगर हम पर argv में प्रत्येक तत्व पुनरावृति करना चाहते हैं, हम हर बार करने के लिए दिए गए इंडेक्स पर argv में चर का उपयोग करना चाहते करने के लिए जा रहे हैं. इस के साथ प्रतिनिधित्व किया जा सकता है, है ना? यहाँ यह इस उदाहरण में विशेष स्ट्रिंग चर का प्रतिनिधित्व करता है क्योंकि यह एक स्ट्रिंग सरणी है कि दिए गए इंडेक्स पर विशेष स्ट्रिंग. हम क्या करना चाहते हैं, तो इस मामले में हम इसे बाहर प्रिंट करना चाहते हैं, तो चलो printf का कहना है. और अब argv एक स्ट्रिंग है, तो हम उस प्लेसहोल्डर डाल करना चाहते हैं. हम एक नई लाइन बस बनाने के लिए यह अच्छा लग चाहते हैं. तो यहाँ हम एक के लिए पाश है. हम हालत अभी तक नहीं है. तो मैं 0 में शुरू होता है, और फिर हर बार यह दी गई स्ट्रिंग मुद्रित करने के लिए जा रहा है सरणी में है कि विशेष रूप से सूचकांक में. तो जब हम बाहर सरणी में तत्वों मुद्रण बंद करना चाहते हैं? जब हम खत्म कर दिया है, है ना? जब हम सरणी के अंत तक पहुँच है. तो हम पिछले सरणी की लंबाई से अधिक नहीं करना चाहते, और हम पहले से ही पता है कि हम वास्तव में सक्रिय रूप से argv की लंबाई क्या है की जरूरत नहीं है क्योंकि यह हमारे लिए दिया है, और वह क्या है? Argc. बिल्कुल सही. तो हम समय की इस प्रक्रिया argc संख्या करना चाहते हैं. मैं सही निर्देशिका में नहीं हूँ. सही सभी. अब चलो args बनाने. कोई त्रुटि है, जो महान है. तो चलो बस args चलाने. क्या इस के लिए हमें वापस जा रहा है? यह सिर्फ इसे छापने के लिए वापस जा रहा है. "आप इस कार्यक्रम में args inputted, मैं इसे आप को वापस देने के लिए जा रहा हूँ." तो चलो कहते हैं कि हम args तो foo बार कहना चाहता हूँ. तो फिर इसे वापस बाहर प्रिंट हमारे लिए. सही? Argc और argv कैसे उपयोग कर सकते हैं का एक उदाहरण है कि argc जानने argv की लंबाई का प्रतिनिधित्व करता है. सुनिश्चित करें कि आप कभी arrays का उपयोग एक साथ सरणी की लंबाई से परे नहीं है क्योंकि सी निश्चित रूप से आप पर चिल्लाओ जाएगा. सेगमेंटेशन फॉल्ट बुलाया कुछ मिल जाएगा, जो मजा है, कभी नहीं है, मूल रूप से कह आप कुछ का उपयोग करने के लिए कोशिश कर रहे हैं कि अस्तित्व में नहीं है, तो आप से संबंधित नहीं है. तो यकीन है, और शून्य अनुक्रमण के साथ विशेष रूप से, हम नहीं चाहते हो - जैसे उदाहरण के लिए, अगर हम 4 लंबाई की एक सरणी है, कि सरणी सूचकांक 4 क्योंकि हम 0 में शुरू शून्य सूचकांक में मौजूद नहीं है. Loops के लिए यह दूसरी प्रकृति की तरह ही हो जब हम 0 में शुरू होगा. तो बस ध्यान में रखना है. आप कभी एक सरणी है कि अपनी पहुंच से परे है के सूचकांक का उपयोग नहीं करना चाहती. तो अब हम देखते हैं कि हम कैसे उपयोग की तरह कर सकते हैं कमांड लाइन तर्क है कि पारित कर रहे हैं. लेकिन जैसा कि आप स्ट्रिंग देखा, argv वास्तव में एक स्ट्रिंग सरणी है. तो यह वास्तव में अभी तक है, एक पूर्णांक नहीं लेकिन सीज़र में हम integers के साथ सौदा करना चाहते हैं. सौभाग्य से, वहाँ हमारे लिए बनाई गई एक समारोह में कहा कि वास्तव में एक पूर्णांक के लिए एक स्ट्रिंग में परिवर्तित कर सकते हैं. यहाँ भी हम उपयोगकर्ता इनपुट के साथ काम नहीं कर रहे हैं जहां हम उन्हें उत्साह रहे हैं यहाँ कुंजी के लिए इनपुट के लिए है, तो हम वास्तव में नहीं है और reprompt कह सकते हैं, "ओह, मुझे एक और पूर्णांक देते हैं, कहते हैं, अगर यह मान्य नहीं है." लेकिन हम अभी भी सही उपयोग के लिए जांच की जरूरत नहीं है. सीज़र में वे केवल 1 संख्या में पारित करने के लिए अनुमति दी जाती है, और इसलिए वे कैसर / चलाने है और फिर वे तुम्हें एक नंबर दे दिया है. तो argc एक निश्चित संख्या है. संख्या क्या है कि अगर वे तुम्हें / कैसर और फिर एक कुंजी पारित करना होगा? Argc क्या है? >> 2 [छात्र]. दो. >> बिल्कुल सही. तो आप यह सुनिश्चित करें कि argc 2 है बनाना चाहते हैं. अन्यथा आप मूल रूप से इस कार्यक्रम को चलाने के इंकार कर दिया. मुख्य में यह एक समारोह है कि int मुख्य कहते हैं, ऐसा है तो हम हमेशा एक सफल कार्यक्रम के अंत में अच्छा अभ्यास वापसी 0 में. यदि हां, तो कहते हैं, वे आप 3 कमांड लाइन तर्क के बजाय 2 दे या आप 1 देते हैं, उदाहरण के लिए, तो तुम क्या करोगे क्या है तुम उस के लिए जाँच करने के लिए चाहता हूँ और फिर 1 लौटने के कह रही है, नहीं, मैं इस कार्यक्रम के साथ आगे नहीं बढ़ सकते हैं. [छात्र] वहाँ अपने पाठ में एक स्थान नहीं हो सकता. >> माफ़ करना? [छात्र] पाठ आप एन्क्रिप्ट करने की कोशिश कर रहे हैं में एक जगह नहीं हो सकता. आह! पाठ है कि हम एन्क्रिप्ट करने के लिए कोशिश कर रहे हैं के संदर्भ में, जो वास्तव में बाद में आता है जब हम उस पाठ दे. इसलिए अभी हम सिर्फ आदेश तर्क के रूप में स्वीकार कर रहे हैं वास्तविक संख्या, सीज़र एन्क्रिप्शन के लिए वास्तविक बदलाव. [छात्र] आप 2 की आवश्यकता क्यों है के रूप में सिर्फ 1 argc विरोध? वहाँ निश्चित रूप से 1 संख्या है. सही है. कारण है कि हम argc के लिए 2 की जरूरत के बजाय 1 जब आप एक प्रोग्राम चलाने के लिए और कहते हैं कि वजह से है. / कैसर / या हैलो, कि वास्तव में एक कमांड लाइन तर्क के रूप में गिना जाता है. तो है कि पहले से ही लेता है 1 और तो फिर हम एक अतिरिक्त inputting रहे हैं. तो आप वास्तव में कमांड लाइन तर्क में एक स्ट्रिंग inputting रहे हैं. आप क्या करना चाहते हैं, सीज़र के लिए हम एक पूर्णांक के साथ सौदा करना चाहते हैं, तो आप इस atoi समारोह का उपयोग कर सकते हैं. और मूल रूप से, आप इसे एक स्ट्रिंग में पारित करने के लिए और फिर यह आप को वापस लौटने के एक पूर्णांक अगर यह संभव है कि एक पूर्णांक में स्ट्रिंग. अब याद है जब हम उस तरह printf या GetString, चीजों के साथ काम कर रहे हैं, हम पुस्तकालयों कि हमारे लिए विशेष कर रहे हैं शामिल हैं. तो शुरुआत में हम एक हैश की तरह है कि टैग मानक कुछ मैं / हे, ज, के साथ शुरू करते हैं. खैर, atoi उन पुस्तकालयों के भीतर नहीं है, तो हमें क्या करना है क्या है हम उस के लिए सही पुस्तकालय शामिल है. तो 1 Walkthrough जहां मैं मैनुअल कार्य पर विचार - विमर्श करने के लिए याद करते हैं. आप अपने टर्मिनल में आदमी टाइप करें और फिर एक समारोह के नाम से पीछा किया. और इतना है कि इसके उपयोग का एक पूरी सूची लाना होगा, लेकिन साथ ही यह ऊपर लाने के जो पुस्तकालय है कि के अंतर्गत आता है. तो मुझे लगता है कि आप के लिए छोड़ने के लिए atoi साथ मैनुअल कार्य का उपयोग करेंगे और बाहर आंकड़ा जो पुस्तकालय आप atoi समारोह का उपयोग करने के लिए सक्षम होने के शामिल करने की आवश्यकता है. तो हम कुंजी मिल गया है और अब यह सादे पाठ हो रही करने के लिए आता है, और इतना है कि वास्तव में उपयोगकर्ता इनपुट हो सकता है, जहां आपको संकेत जा रहा है. हम GetInt और GetFloat के साथ निपटा है, और तो उसी नस में हम के लिए GetString के साथ काम हो जा रहे हैं. लेकिन इस मामले में हम किसी भी do करने की जरूरत नहीं है, जबकि या जबकि loops की जांच करने के लिए. GetString निश्चित रूप से हमें एक स्ट्रिंग दे देंगे, और हम एन्क्रिप्ट जो उपयोगकर्ता हमें देता है के लिए जा रहे हैं. तो आप कल्पना कर सकते हैं है कि इन उपयोगकर्ता inputted तार के सभी सही हैं. बढ़िया है. तो फिर एक बार आप कुंजी मिल गया है और एक बार आप पाठ मिल गया है, अब क्या बचा है आप plaintext कूटलेखन है. बस जल्दी शब्दावली पर कवर करने के लिए, plaintext उपयोगकर्ता तुम क्या देता है, और सिफर है कि तुम क्या उन्हें वापस. तार तो, वास्तव में पत्र द्वारा पत्र के माध्यम से जाने के लिए सक्षम होने के लिए क्योंकि हम हर पत्र बदलाव है, अगर हम है कि तार को समझते, वापस परत छील हम की तरह, हम देखते हैं कि वे सिर्फ सच वर्णों की एक सूची रहे हैं. एक दूसरे के बाद आता है. और इसलिए हम क्योंकि वे पात्रों के arrays arrays के रूप में तार का इलाज कर सकते हैं. तो कहना आप एक पाठ नामक स्ट्रिंग है, संग्रहीत किया जाता है और उस चर पाठ के भीतर यह CS50 है. फिर 0 सूचकांक में पाठ एक राजधानी टी होगा, सूचकांक 1 घंटे, आदि होगा और फिर arrays के साथ, argc args.c में उदाहरण में, हमने देखा है कि हम पर एक सरणी पुनरावृति था और इसलिए हम से पुनरावृति = 0 मैं जब तक मैं लंबाई से भी कम है. तो हम बाहर लगाना हमारे स्ट्रिंग की लंबाई क्या है की किसी तरह की जरूरत है अगर हम यह अधिक पुनरावृति करने के लिए जा रहे हैं. सौभाग्य से फिर, वहाँ हमारे लिए एक समारोह CS50 में हालांकि बाद में है, आप निश्चित रूप से लागू करने के लिए और अपने खुद के कार्य करने में सक्षम हो जाएगा कि एक स्ट्रिंग की लंबाई की गणना कर सकते हैं. लेकिन अब के लिए हम स्ट्रिंग लंबाई, तो strlen का उपयोग करने के लिए जा रहे हैं. आप एक स्ट्रिंग में पारित, और फिर इसे आप एक int है कि अपने स्ट्रिंग की लंबाई का प्रतिनिधित्व करता है वापस आ जाएगी. कैसे हम एक स्ट्रिंग में प्रत्येक चरित्र पुनरावृति करने में सक्षम हो सकता है की एक उदाहरण देखो और उस के साथ कुछ करना है. हम क्या करना चाहते है पर स्ट्रिंग के प्रत्येक चरित्र पुनरावृति, और हम क्या करना चाहते है कि हम वापस 1 से 1 चरित्र मुद्रित छोड़कर हम इसे करने के लिए अगले कुछ जोड़. तो चलो पाश के लिए के साथ शुरू करते हैं. Int i = 0. हम इस हालत के लिए जगह छोड़ने के लिए जा रहे हैं. हम पुनरावृति करना चाहते हैं जब तक हम स्ट्रिंग के अंत तक पहुँचते हैं, है ना? तो फिर क्या समारोह हमें स्ट्रिंग की लंबाई देता है? [अश्राव्य छात्र प्रतिक्रिया] यह कमांड लाइन तर्क की लंबाई है. लेकिन एक स्ट्रिंग के लिए हम एक समारोह में कहा कि हमें स्ट्रिंग की लंबाई देता का उपयोग करना चाहते हैं. तो यह है कि स्ट्रिंग की लंबाई है. और ऐसा है, तो आप इसे करने के लिए एक स्ट्रिंग में पारित किया है. यह पता करने के लिए क्या स्ट्रिंग की लंबाई की गणना करने की जरूरत की जरूरत है. तो फिर इस मामले में हम स्ट्रिंग है के साथ काम कर रहे हैं. बढ़िया है. तो फिर हम क्या करना चाहते हैं, printf करते हैं. अब, हम पात्रों के साथ सौदा करना चाहते हैं. हम प्रत्येक व्यक्ति के चरित्र मुद्रित करना चाहते हैं. जब आप इसे एक नाव बाहर मुद्रित करने के लिए करना चाहते हैं, तो आप% च की तरह प्लेसहोल्डर का प्रयोग करेंगे. एक int के साथ आप% d का उपयोग होगा. और अब इसी तरह, एक चरित्र के साथ आप% ग का उपयोग करने के लिए कहते हैं कि मैं एक चरित्र मुद्रण किया जा रहा हूँ कि एक चर के अंदर संग्रहित है. इसलिए हम यह है, और चलो एक अवधि और इसे करने के लिए एक स्थान जोड़ने. चरित्र है जो हम कर रहे हैं? हम का उपयोग किया है जो कुछ भी हम चरित्र स्ट्रिंग के हो जा रहे हैं. तो फिर हम तार के साथ कुछ का उपयोग करने जा रहे हैं, लेकिन हम निश्चित चरित्र तक पहुँचने वहाँ चाहते हैं. तो अगर एक स्ट्रिंग एक सरणी है, तो हम कैसे arrays के तत्वों का उपयोग करते हैं? हम उन वर्ग कोष्ठक है, और फिर हम वहाँ में सूचकांक डाल दिया. तो हम वर्ग कोष्ठक है. इस मामले में हमारे सूचकांक हम सिर्फ मैं का उपयोग कर सकते हैं. बिल्कुल सही. यहाँ तो हम कह रहे हैं, हम एक चरित्र मुद्रण डॉट और एक अंतरिक्ष द्वारा पीछा किया जा रहे हैं, और कि चरित्र हमारे स्ट्रिंग s में ith पत्र होने जा रहा है. मैं सिर्फ इतना है कि बचाने के लिए जा रहा हूँ. ठीक है. अब मैं स्ट्रिंग की लंबाई को चलाने के लिए जा रहा हूँ. तो हम एक स्ट्रिंग OMG कहा जाता था, और अब यह और भी अधिक जोर दिया है. इसी तरह, हम कहते हैं कि हम वास्तव में उपयोगकर्ता से एक स्ट्रिंग प्राप्त करना चाहते हैं. हम यह कैसे कर सकता है? इससे पहले, हम एक int कैसे मिला? हम GetInt कहा, सही? लेकिन यह int नहीं है, तो चलो GetString. चलो स्ट्रिंग की लंबाई. यहाँ हम एक विशिष्ट प्रॉम्प्ट दर्ज नहीं किया. तो मुझे नहीं मालूम. मैं यहाँ में मेरा नाम रख दिया जा रहा हूँ और ऐसा है, तो मैं उन चीजों में से एक कर सकते हैं जहां मैं हर पत्र या उस तरह कुछ के लिए एक शब्द असाइन. कूल. तो यह है कि स्ट्रिंग की लंबाई है. तो हम कैसर को वापस कर रहे हैं. हम कैसे हम एक स्ट्रिंग पर पुनरावृति पर कुछ उपकरण है, कैसे हम प्रत्येक व्यक्ति तत्व का उपयोग. तो अब हम इस कार्यक्रम के लिए वापस मिल सकता है. जैसा कि मैंने पहले, ASCII तालिका में अपने सबसे अच्छे दोस्त उल्लेख किया है, आप नंबर है कि हर अक्षर के साथ जुड़े रहे हैं देखने के लिए जा रहे हैं. तो यहाँ कहना है कि हमारे plaintext मुझे चक्कर आ रहा हूँ! फिर इन अक्षरों में से प्रत्येक के लिए एक नंबर और ASCII इसके साथ जुड़े मूल्य जा रहा है, अक्षर लोप या सम्बन्ध का चिह्न भी है, यहां तक ​​कि अंतरिक्ष, यहां तक ​​कि विस्मयादिबोधक चिह्न, तो आप को ध्यान में रखना चाहता हूँ. तो हमारे कुंजी का कहना है कि उपयोगकर्ता अपने कमांड लाइन तर्क में शामिल 6. पहले अक्षर, जो मैं जो 73 द्वारा प्रतिनिधित्व किया है के लिए इसका मतलब है, आप जो भी पत्र 73 + 6 के ASCII मान द्वारा प्रतिनिधित्व किया है उन्हें वापस चाहते हैं. इस मामले में है कि 79 होगा. अब हम अगले चरित्र के लिए जाना चाहते हैं. तो plaintext की 1 सूचकांक में अगले अक्षर लोप या सम्बन्ध का चिह्न होगा. लेकिन याद रखना हम केवल पत्र सांकेतिक शब्दों में बदलना चाहते हैं. इसलिए हम यह सुनिश्चित करें कि apostrophe वास्तव में एक ही रहता है बनाना चाहते हैं, कि हम 39 से 45 जो कुछ भी परिवर्तन नहीं है. हम इसे एक apostrophe के रूप में रखना चाहते हैं. तो हम करने के लिए केवल अक्षर कूटलेखन याद रखना चाहते हैं क्योंकि हम हमारे कार्यक्रम में अन्य प्रतीकों के सभी अपरिवर्तित रहने के लिए करना चाहते हैं. एक और बात यह है कि हम चाहते हैं पूंजीकरण रक्षा करना है. तो जब आप एक अपरकेस पत्र है, यह एक अपरकेस के रूप में रहना चाहिए. Lowercases लोअरकेस के रूप में रहना चाहिए. तो कुछ उपयोगी कार्य केवल enciphering पत्र के साथ सौदा करने में सक्षम होने के लिए और चीजों के पूंजीकरण के संरक्षण रखने isalpha, isupper, islower काम करता है. और इसलिए इन कार्य करता है कि आप एक बूलियन मान वापस कर रहे हैं. असल में, सही है या गलत. यह एक अपरकेस है? इस अक्षरांकीय है? यह एक पत्र है, अनिवार्य रूप से. तो यहाँ आप कैसे है कि समारोह का प्रयोग करेंगे 3 उदाहरण हैं. असल में, आप परीक्षण कर सकता है कि क्या मूल्य है कि समारोह के द्वारा आप को लौट सही है या गलत है कि इनपुट के आधार पर. या तो कुछ नहीं कूटलेखन है या यह बीजलेख या सुनिश्चित करें कि यह अपरकेस, आदि है [छात्र] तुम सिर्फ एक छोटे से अधिक है और आप उन्हें कैसे उपयोग उन लोगों की व्याख्या कर सकते हैं? >> हाँ, सुनिश्चित करने के लिए. तो अगर हम वापस देखो, यहाँ हम एक पूंजी मैं सही है,? इसलिए हम जानते हैं कि मैं हे जाता है क्योंकि मैं 6 + ओ है लेकिन हम यह सुनिश्चित करें कि कि हे एक राजधानी ओ होने जा रहा है बनाना चाहते हैं तो बुनियादी तौर पर, कि हमारे इनपुट बदलने जा रहा है की तरह है. तो क्या यह अपरकेस है या जिस तरह से है कि हम इसके साथ सौदा बदलने की तरह नहीं होगा. तो अगर हम है कि विशेष रूप से सूचकांक पर isupper समारोह का उपयोग करें, ("मैं") isupper, कि हमें सच के लिए देता है, तो हम जानते हैं कि यह ऊपरी है. तो के आधार पर उस पर है, तो बाद में हम एक सूत्र में जाना होगा कि आप सीज़र में बातें बदलाव का उपयोग होगा, ऐसा है, तो बुनियादी तौर पर, वहाँ के लिए एक अलग सूत्र हो जा रहा है अगर यह अपरकेस है के रूप में लोअरकेस विरोध किया. मतलब होता है? हाँ. कोई चिंता नहीं. मैं एक पत्र है, जो काफी समझ नहीं पड़ता है 6 जोड़ने के बारे में एक बिट बात को छोड़कर जब हम किस तरह की समझ है कि इन अक्षरों पूर्णांक के साथ परस्पर विनिमय की तरह हैं. हम क्या हम उपयोग निहित कास्टिंग की तरह है. हम कास्टिंग में जहां आप एक मूल्य लेने पर थोड़ा बाद में जाऊँगा और आप इसे एक अलग प्रकार में बारी की तुलना में यह मूल रूप से किया गया था. लेकिन इस pset के साथ हम तरह का interchangeably वर्णों का उपयोग करने के लिए सक्षम हो जाएगा और उनके इसी पूर्णांक मान. तो अगर आप बस सिर्फ एक उद्धरण के साथ एक चरित्र डिब्बे में बंद, तो आप पूर्णांकों के साथ इसके साथ काम करने के लिए, एक पूर्णांक के रूप में इसके साथ निपटने में सक्षम हो जाएगा. तो राजधानी सी 67 से संबंधित है. लोअरकेस च 102 से संबंधित है. फिर, अगर आप इन मूल्यों को जानना चाहते हैं, अपने ASCII तालिका में देखो. तो चलो कैसे आप घटाना और जोड़ने के लिए सक्षम हो सकता है की कुछ उदाहरणों में जाने, कैसे आप वास्तव में वास्तव में इन पात्रों के साथ काम कर सकते हैं, उन्हें interchangeably उपयोग करें. मैं कहना है कि ASCIIMath एक पूर्णांक के लिए एक चरित्र के अलावा की गणना करने के लिए जा रहा है और फिर परिणामी के रूप में के रूप में अच्छी तरह से परिणामी ASCII मान चरित्र को प्रदर्शित करता है. और इसलिए मैं यहाँ कह रहा हूँ - इस भाग के साथ we'll सौदा बाद - लेकिन मूल रूप से, मैं कह रहा हूँ कि उपयोगकर्ता चलाने ASCIIMath एक कुंजी के साथ साथ कहना चाहिए, और मैं कह रहा हूँ कि कि कुंजी संख्या होने जा रहा है जिसके साथ हम इस चरित्र को जोड़ने के लिए जा रहे हैं. तो यहाँ नोटिस के बाद से मैं एक चाबी की मांग कर रहा हूँ, जब से मैं मांग रहा हूँ कि वे मुझे एक बात दे रहे हैं, मैं केवल / asciimath और एक कुंजी को स्वीकार करना चाहते हैं. तो मैं करने के लिए मांग है कि argc 2 के बराबर है करने के लिए जा रहा हूँ. यदि ऐसा नहीं है, तो मैं 1 लौटने और प्रोग्राम से बाहर निकलें होगा जा रहा हूँ. तो मैं कह रहा हूँ कुंजी के लिए 1 कमांड लाइन तर्क नहीं जा रहा है, यह करने के लिए एक दूसरे के हो रहा है, और जैसा कि आप यहाँ देख, मैं एक पूर्णांक में बारी के लिए जा रहा हूँ. तो फिर मैं एक चरित्र को स्थापित करने के लिए किया जा r के लिए जा रहा हूँ. सूचना है कि चर chr के प्रकार वास्तव में एक पूर्णांक है. जिस तरह से है कि मैं एक पूर्णांक के रूप में आर का उपयोग करने में सक्षम हूँ यह इन एकल उद्धरण के साथ encasing द्वारा है. तो हमारे printf बयान करने के लिए वापस जहां हम एक चरित्र के लिए एक प्लेसहोल्डर है और फिर एक पूर्णांक के लिए एक प्लेसहोल्डर, चरित्र chr द्वारा प्रतिनिधित्व किया है, और पूर्णांक कुंजी है. और यदि ऐसा है तो फिर हम परिणाम में 2 को एक साथ जोड़ने के लिए जा रहे हैं. तो हम r जोड़ने के लिए जा रहे हैं + जो भी कुंजी है, और फिर हम उस का परिणाम मुद्रित करने के लिए जा रहे हैं. तो चलो asciimath बनाने. यह तिथि करने के लिए है, तो चलो बस asciimath चलाने के. ओह देखते हैं, लेकिन यह कुछ भी नहीं है क्योंकि हम वास्तव में यह एक कुंजी नहीं दिया था करता है. तो जब यह सिर्फ 1, हमारे मुख्य समारोह में लौट आए, यह सिर्फ हमारे पास वापस लौट आए. तो चलो एक कुंजी में पारित. किसी ने मुझे एक नंबर दे. >> [छात्र] 4. 4. ठीक है. R 4 हमें v, जो 118 के ASCII मान से मेल खाती है देने के लिए जा रहा है की वृद्धि हुई. तो फिर यह किस तरह का है कि समझ में आता है - दरअसल, मैं आप से पूछना कर सकते हैं, आप क्या सोचते हैं आर के ASCII मान है अगर + r 4 118 है? हाँ फिर, आर 114 है. तो अगर आप ASCII तालिका पर लग रही है, तो यकीन है कि पर्याप्त है, आप देखेंगे कि r 114 द्वारा प्रतिनिधित्व किया है. तो अब है कि हम जानते हैं कि हम integers वर्ण को जोड़ सकते हैं, यह बहुत आसान लगता है. हम सिर्फ एक स्ट्रिंग पुनरावृति जैसे हम एक पहले उदाहरण में देखा जा रहे हैं. हम अगर यह एक पत्र की जांच करेंगे. अगर ऐसा है, तो हम इसे जो भी कुंजी है बदलाव हूँ. बहुत आसान है, जब आप इस तरह की मिल को छोड़कर, आप देखते हैं कि z, 122 द्वारा प्रतिनिधित्व किया है, तो आप एक अलग चरित्र देना होगा. हम वास्तव में हमारी वर्णमाला के भीतर रहना चाहते हैं, है ना? तो हम बाहर चारों ओर लपेटकर की तरह का कोई रास्ता निकालने की जरूरत है. जब आप जेड तक पहुँचने और आप एक निश्चित संख्या में वृद्धि करना चाहते हैं आप ASCII वर्णमाला अनुभाग परे में जाना नहीं चाहते, आप वापस ए के लिए सभी तरह लपेट चाहते हैं लेकिन मन में रखने के लिए आप अभी भी मामले के संरक्षण कर रहे हैं. तो है कि इस पत्र को जानने के प्रतीक नहीं बन सकता प्रतीकों की तरह बस के रूप में अच्छी तरह से बदल नहीं जा रहे हैं. पिछले pset में आप निश्चित रूप से जरूरत नहीं थी, लेकिन एक विकल्प मापांक समारोह का उपयोग करके अपने लालची pset को लागू करने के लिए गया था. लेकिन अब हम वास्तव में करने के लिए मापांक का उपयोग करने की आवश्यकता के लिए जा रहे हैं, तो चलो बस यह एक छोटा सा पर जाना. मूलतः, जब आप एक्स modulo y, कि आप y द्वारा विभाजित एक्स के शेष देता है. यहाँ कुछ उदाहरण हैं. हम 27 से 15% है. असल में, जब आप 27 से नकारात्मक हो रही बिना संभव के रूप में कई बार के रूप में 15 घटाना तो आप 12 बाईं खत्म हो. तो उस तरह की तरह गणित संदर्भ में है, लेकिन हम वास्तव में यह कैसे उपयोग कर सकते हैं? यह हमारे wrapover के लिए उपयोगी होने जा रहा है. इस के लिए, चलो बस का कहना है कि मैं आप सभी 3 समूहों में विभाजित करने को कहा. कभी कभी आप समूहों और ऐसा कुछ करते हैं. कहते हैं कि मैंने कहा, "ठीक है, मैं आप सभी चाहते हैं कि 3 में विभाजित किया है." तुम ऐसा कैसे कर सकता है? [अश्राव्य छात्र प्रतिक्रिया] हाँ, बिल्कुल. बंद गिनो. ठीक है. वास्तव में ऐसा है कि चलो. क्या आप शुरू करना चाहते हैं? 1, 2, 3, 4 [छात्रों से गिनती]. लेकिन याद रखना ... >> [छात्र] ओह, माफ करना. यह एक बहुत अच्छी बात है. तुम 4 ने कहा, लेकिन हम वास्तव में आप 1 कहने के लिए चाहते हैं, क्योंकि हम केवल 3 समूहों चाहते हैं. तो, कैसे - नहीं, कि एक बहुत अच्छा उदाहरण है, क्योंकि तब आप 1 कैसे कह सकते हैं? 4 और 1 के बीच क्या संबंध है? खैर, 4 3 आधुनिक 1. तो अगर आप आगे बढ़ें, 2 होगा. तो हम 1, 2, 3, 1, 2. फिर, आप वास्तव में 5 व्यक्ति रहे हैं. आप कहना 2 के बजाय 5 कैसे जानते हो? आप कहते हैं कि 5 3 आधुनिक 2 है. मैं देखने के लिए कितने 3 के समूह पर छोड़ दिया है, तो जो मैं कर रहा हूँ और अगर ऐसा हो तो हम पूरे कमरे के साथ जारी रखा, तो हमें देखना होगा कि हम वास्तव में हमेशा रहे हैं और खुद को आधुनिक समारोह लागू तरह की गिनती. कि कैसे आप modulo का उपयोग हो सकता है के ठोस उदाहरण के एक अधिक तरह है क्योंकि मुझे यकीन है कि हम में से अधिकांश शायद उस प्रक्रिया के माध्यम से चले गए हैं जहां हम गिनती के लिए रवाना किया है. Modulo पर कोई सवाल? यह बहुत महत्वपूर्ण हो सकता है इस की अवधारणाओं को समझने, तो मुझे यकीन है कि तुम लोगों को समझ बनाना चाहते हैं. [छात्र] अगर वहाँ कोई शेष नहीं है, यह आप वास्तविक संख्या दे? यदि उनमें से 1 3 में से एक यह किया था, यह उन्हें दिया होता है कि वे क्या वास्तव में थे, या उन्हें दिया होता है [अश्राव्य] >> यह एक अच्छा सवाल है. जब वहाँ modulo लिए कोई शेष है तो कहते हैं कि आप 6 3 आधुनिक है - कि वास्तव में आप वापस देता है 0. हम बाद में एक सा है कि बारे में बात करेंगे. अरे हाँ, उदाहरण के लिए, 3 व्यक्ति - 3 3 आधुनिक वास्तव में है 0, लेकिन वह 3 कहा. तो यह है कि एक आंतरिक पकड़ की तरह की तरह है, उदाहरण के लिए, ठीक तरह, अगर आधुनिक 0 है तो मैं 3 व्यक्ति होने जा रहा हूँ. लेकिन हम कैसे हम 0 बाद में क्या है के साथ सौदा करना चाहते हो सकता है की तरह में मिल जाएगा. तो अब हम किसी भी तरह सही पत्र के लिए जेड मानचित्रण का एक तरीका है. तो अब हम इन उदाहरणों के माध्यम से चला गया है, हम किस तरह से देखने के लिए कैसे सीज़र काम हो सकता है. आप 2 अक्षर देखते हैं और फिर आप उन्हें स्थानांतरण. तो चलो कोशिश करते हैं और सूत्र के मामले में है कि एक्सप्रेस. यह सूत्र वास्तव में कल्पना में आप के लिए दिया है, लेकिन चलो जो प्रत्येक परिवर्तनशील मतलब के माध्यम से देखो की तरह. हमारे अंत परिणाम सिफर होने जा रहा है. तो यह कहना है कि सिफर के ith चरित्र plaintext के ith चरित्र के अनुरूप रहा है. यही समझ में आता है क्योंकि हम हमेशा इन चीजों को अस्तर होना चाहता हूँ. तो यह सिफर प्लस कश्मीर, जो हमारे मुख्य है ith चरित्र होने जा रहा है - कि समझ में आता है और फिर हम इस 26 आधुनिक है. वापस याद है जब हम जेड था हम चरित्र में नहीं चाहता था, इसलिए हम यह आधुनिक चाहता था वर्णमाला के आसपास और रैप की तरह. जेड के बाद आप एक के लिए जाना होगा, ख, ग, घ, जब तक आप सही संख्या के लिए मिला है. इसलिए हम जानते हैं कि जेड, अगर 6 +, हमें च दे क्योंकि बाद जेड एक, च बी, सी, डी, ई, आता होगा. तो चलो याद है हम यकीन के लिए पता है कि जेड + 6 हमें च दे रहा है. ASCII मूल्यों में, जेड 122 और च 102 है. तो हम हमारे सीज़र फार्मूला बनाने का कोई रास्ता खोजने के लिए है हमें 102 दे 122 में लेने के बाद. तो अगर हम सिर्फ इस सूत्र, ('Z 6 +) 26%, कि वास्तव में आप 24 देता लागू क्योंकि 122 + 6 128, 128 26% शेष 24 देता है. लेकिन वह वास्तव में च मतलब नहीं है. यह निश्चित रूप से 102 नहीं है. यह भी वर्णमाला में 6 अक्षर नहीं है. तो जाहिर है, हम यह एक थोड़ा tweaking का कोई रास्ता है की जरूरत है. नियमित वर्णमाला के संदर्भ में, हम जानते हैं कि z 26 पत्र और च 6 है. लेकिन हम कंप्यूटर विज्ञान के क्षेत्र में कर रहे हैं, तो हम 0 में सूचकांक के लिए जा रहे हैं. तो फिर z 26 संख्या होने के बजाय, हम कहने के लिए यह संख्या 25 जा रहे हैं क्योंकि एक 0 है. तो अब यह फार्मूला लागू है. हम z 25 + 6 से प्रतिनिधित्व किया है, जो आप 31 देता है. और 31 26 आधुनिक आप एक के रूप में शेष 5 देता है. यह बिल्कुल सही है क्योंकि हम जानते हैं कि वर्णमाला में 5 पत्र है. लेकिन यह अभी भी च, सही नहीं है? यह अभी भी 102 नहीं है. तो फिर इस pset के लिए, एक चुनौती बाहर रिश्ते का पता लगाने की कोशिश कर रहा हो जाएगा इन ASCII मूल्यों और वर्णमाला अनुक्रमणिका के बीच परिवर्तित करने के बीच. मूलतः, तुम क्या करना चाहते हैं, आप ASCII मूल्यों के साथ शुरू करना चाहते हैं, लेकिन फिर आप को किसी भी तरह कि एक वर्णमाला सूचकांक में अनुवाद करना चाहते हैं तो गणना पत्र क्या यह होना चाहिए - बुनियादी तौर पर, अपने वर्णमाला सूचकांक क्या है बीजलेख चरित्र की तो उस ASCII मूल्यों को वापस अनुवाद. तो अगर आप अपने ASCII तालिका कोड़ा, तो कोशिश करते हैं और के बीच रिश्तों को लगता है, कहते हैं, 102 और 5 या 122 और 25. हम कमांड लाइन तर्क से हमारे कुंजी मिल गया है, हम plaintext मिल गया है, हम इसे enciphered है. अब हम सभी को करना छोड़ दिया है इसे मुद्रित. हम यह अलग अलग तरीकों की एक जोड़ी कर सकता है. हम क्या कर सकता है वास्तव में मुद्रित रूप में हम साथ चलते है. , के रूप में हम पर स्ट्रिंग में वर्णों पुनरावृति हम बस सिर्फ सही है तो प्रिंट सकता है जब हम यह गणना. वैकल्पिक रूप से, आप यह भी एक सरणी में स्टोर कर सकता है और वर्णों की एक सरणी है और अंत में है कि पूरी सरणी पर पुनरावृति और इसे बाहर प्रिंट. तो तुम उस के लिए विकल्पों में से एक जोड़ी है. और याद रखें कि% ग एक चरित्र मुद्रण के लिए प्लेसहोल्डर होने जा रहा है. इसलिए हम सीज़र है, और अब हम Vigenere पर स्थानांतरित करने के लिए, जो बहुत सीज़र के समान है लेकिन बस थोड़ा और अधिक जटिल है. तो Vigenere के साथ अनिवार्य रूप से आप एक कीवर्ड में पारित हो जा रहे हैं. तो एक संख्या के बजाय, आप एक स्ट्रिंग के लिए जा रहे हैं, और इतनी है कि अपने कीवर्ड के रूप में कार्य करने के लिए जा रहा है. फिर, सामान्य रूप से, आप एक स्ट्रिंग के लिए उपयोगकर्ता से संकेत मिलता है जा रहे हैं और तो यह सांकेतिक शब्दों में बदलना और फिर उन्हें सिफर वापस दे. तो जैसा कि मैंने कहा, यह बहुत सीज़र के लिए इसी तरह की है, बजाय एक निश्चित संख्या से स्थानांतरण के अलावा, संख्या वास्तव में चरित्र से चरित्र के लिए हर समय बदल रहा है. कि वास्तविक संख्या का प्रतिनिधित्व करने के लिए शिफ्ट करने के लिए, यह कीबोर्ड पत्र द्वारा प्रतिनिधित्व किया है. तो अगर आप उदाहरण के लिए, एक की पाली में दर्ज करते हैं, तो यह है कि 0 के एक बदलाव के अनुरूप होगा. तो इसे फिर से वर्णमाला अनुक्रमणिका वापस करने के लिए है. क्या उपयोगी हो सकता है अगर आप देख रहे हैं कि हम वास्तव में ASCII मूल्यों के साथ काम कर रहे हैं हो सकता है के रूप में अच्छी तरह से पत्र, के रूप में के रूप में अच्छी तरह से वर्णमाला अनुक्रमणिका के रूप में, शायद खोजने के लिए या अपने खुद के ASCII तालिका है कि 25 के माध्यम से 0 की वर्णमाला अनुक्रमणिका से पता चलता है, इतना है कि Z के माध्यम से एक, और ASCII मूल्यों संबंध की तरह देख सकते हैं और बाहर स्केच और कोशिश करते हैं और कुछ पैटर्न मिल. इसी तरह, अगर आप कुछ उदाहरण में च द्वारा जा रहे थे - और यह भी लोअरकेस या अपरकेस च है - तो यह है कि 5 के अनुरूप होगा. क्या हम अब तक तो अच्छा है? Vigenere के लिए एक अलग सा सूत्र है. असल में, आप देखते हैं कि यह बस सीज़र की तरह है, के बजाय सिर्फ कश्मीर को छोड़कर हम कश्मीर सूचकांक j है. सूचना है कि हम क्योंकि अनिवार्य रूप से मैं का उपयोग नहीं कर रहे हैं, कीवर्ड की लंबाई जरूरी नहीं कि हमारे सिफर की लंबाई. यह थोड़ा स्पष्ट हो सकता है जब हम एक उदाहरण है कि मैं थोड़ा बाद में देखेंगे. असल में, अगर आप ohai की एक कीवर्ड के साथ अपने कार्यक्रम चलाने के लिए, तो इसका मतलब है कि हर समय, ohai अपनी शिफ्ट होने जा रहा है. तो क्या स्थिति आप अपने खोजशब्द में हैं पर निर्भर करता है, आप उस राशि से अपने कुछ सिफर चरित्र में बदलाव करने के लिए जा रहे हैं. फिर, कैसर की तरह, हम यकीन है कि हम चीजों की पूंजीकरण की रक्षा करना चाहते हैं और हम केवल कूटलेखन, वर्ण या स्थान नहीं पत्र. तो कैसर को वापस कार्य करता है कि आप का इस्तेमाल हो सकता है पर देखो, जिस तरह से कि आप का फैसला कैसे चीजों को शिफ्ट करने के लिए, और अपने कार्यक्रम के लिए कि यहाँ लागू. तो इस नक्शे से बाहर. हम एक plaintext कि हम उपयोगकर्ता से GetString से मिल गया है यह कह रही है ... CS50 है! तो फिर हम ohai की एक कीवर्ड है. 1 4 अक्षर बहुत आसान है. हम जानते हैं कि टी ओ द्वारा स्थानांतरित किया जा रहा है, तो ज ज द्वारा स्थानांतरित किया जा रहा है, मैं करने के लिए एक से स्थानांतरित किया जा रहा है. यहाँ आप देखेंगे कि एक 0 का प्रतिनिधित्व करता है, ऐसा है तो अंत मूल्य वास्तव में पहले के रूप में सिर्फ एक ही पत्र है. फिर एस मैं द्वारा स्थानांतरित कर दिया है. लेकिन फिर आप इन अवधियों यहाँ है. हम कूटलेखन कि, यदि ऐसा है तो फिर हम इसे से कुछ भी नहीं बदल सकता हूँ नहीं करना चाहती और बस से बाहर अपरिवर्तित अवधि प्रिंट. [छात्र] मैं समझ कैसे आप जानते हैं कि इस से स्थानांतरित कर दिया है नहीं है - तुम कहाँ किया - >> ओह, माफ करना. यहाँ शीर्ष पर है कि कमांड लाइन तर्क यहाँ ohai देखते हैं, कि कीवर्ड होने जा रहा है. और तो बुनियादी तौर पर, आप खोजशब्द में पात्रों पर साइकिल रहे हैं. [छात्र] तो ओ को ही स्थानांतरित हो जा रहा है - ओ तो वर्णमाला में एक निश्चित संख्या से मेल खाती है. [छात्र] ठीक है. लेकिन तुम कहाँ CS50 भाग से मिला? ओह. GetString जहाँ आप की तरह कर रहे हैं, में है, "मुझे एक स्ट्रिंग सांकेतिक शब्दों में बदलना करने के लिए दे." [छात्र] वे आपको लगता है कि करने के लिए तर्क से शिफ्ट करने के लिए देने के लिए जा रहे हैं और फिर तुम अपनी पहली स्ट्रिंग के लिए पूछता हूँ. >> हाँ. इसलिए जब वे प्रोग्राम चलाते हैं, वे कीवर्ड को शामिल करने के लिए जा रहे हैं अपने कमांड लाइन तर्क में जब वे इसे चलाते हैं. फिर एक बार आप की जाँच की है कि वे वास्तव में आप 1 दिया है और अधिक नहीं, कम नहीं, तो आप उन्हें एक स्ट्रिंग के लिए संकेत करने के लिए जा रहे हैं, कहते हैं, "मुझे एक स्ट्रिंग दे." इतना है कि जहां इस मामले में वे आपको यह दिया है ... CS50 है! तो फिर आप का उपयोग करें और ohai का उपयोग करने के लिए और अधिक पुनरावृति करने के लिए जा रहे हैं. सूचना है कि हम यहाँ encrypting अवधि पर छोड़ दिया, लेकिन हमारी स्थिति के ohai, अगले एक के लिए संदर्भ में हम ओ का इस्तेमाल किया. इस मामले में यह थोड़ा कठिन है क्योंकि कि 4 है, तो चलो एक बिट जारी. बस मेरे साथ यहाँ रहना. फिर हम और मैं है, जो तब ओ और घंटे के द्वारा क्रमशः अनुवादित है. तो फिर हम एक जगह है, और इतना तो हम जानते हैं कि हम के लिए रिक्त स्थान कूटलेखन के लिए नहीं जा रहे हैं. लेकिन सूचना है कि इस जगह में एक यहीं पर जाने की बजाय, हम एक से encrypting रहे हैं - सही यहाँ मैं अगर आपको लगता है कि देख सकते हैं पता नहीं. तो आप वास्तव में पूर्व निर्धारित इसे पसंद नहीं है, कहते हैं, ओ यहाँ जाता है, ज यहाँ जाता है, यहाँ एक हो जाता है, मैं यहाँ जाता है, ओ, ज, एक, मैं, ओ, ज, मैं एक. आप ऐसा नहीं करते. आप केवल कीवर्ड में अपनी स्थिति में बदलाव जब आप जानते हैं कि आप वास्तव में एक वास्तविक पत्र encrypting हो जा रहे हैं. क्या उस तरह मतलब होता है? ठीक है. तो बस कुछ अनुस्मारक. आप सुनिश्चित करें कि आप केवल अपने खोजशब्द में अगले पत्र अग्रिम बनाना चाहते हैं अगर आपके plaintext में चरित्र एक पत्र है. तो हम कहते हैं कि हम ओ हो. हमने देखा है कि अगले चरित्र, plaintext की मैं सूचकांक, उदाहरण के लिए, एक संख्या है. तो हम जम्मू, हमारे खोजशब्द के लिए सूचकांक अग्रिम नहीं है, जब तक हम एक पत्र तक पहुँचने. फिर, तुम भी कीवर्ड की शुरुआत करने के लिए सुनिश्चित करें कि आप wraparound बनाना चाहते हैं जब आप इसे के अंत में कर रहे हैं. यदि आप देखते हैं यहाँ हम मैं कर रहे हैं, अगले एक ओ हो गया है. तो आप अपने कीवर्ड की शुरुआत करने के लिए wraparound करने में सक्षम होने का कोई रास्ता मिल चाहते हैं हर समय है कि आप अंत तक पहुँचते हैं. तो फिर, क्या ऑपरेटर की तरह चारों ओर लपेटकर के लिए है कि मामले में उपयोगी है? जैसे उदाहरण के बंद गिनती में. [छात्र] प्रतिशत संकेत है. >> हाँ, प्रतिशत संकेत है, जो सापेक्ष है. तो modulo काम में यहाँ आते हैं जब आप अपने ohai में सूचकांक लपेटो चाहते जाएगा. और सिर्फ एक त्वरित संकेत: गिनती की तरह एक सा कीवर्ड पर लपेटकर के बारे में सोच की कोशिश करो, जहां अगर वहाँ 3 समूहों, 4 व्यक्ति है, उनकी संख्या है कि उन्होंने कहा कि 4 3 आधुनिक, जो 1 था था. तो कोशिश करते हैं और यह सोचने के लिए कि जिस तरह से. जैसा कि आप सूत्र में देखा, जहाँ भी तुम ci और pi तो है, लेकिन फिर के.जे., आप सुनिश्चित करें कि आप उन का ट्रैक रखने बनाना चाहते. आप यह मैं फोन करने की जरूरत नहीं है, तो आप यह जम्मू के फोन करने की जरूरत नहीं है, लेकिन आप यह सुनिश्चित करें कि आप अपने plaintext में स्थिति यह है कि आप कर रहे हैं ट्रैक रखने बनाना चाहते हैं के रूप में की स्थिति के रूप में अच्छी तरह से पता है कि आप अपने खोजशब्द में कर रहे हैं क्योंकि उन जरूरी करने के लिए ही नहीं जा रहे हैं. न केवल कीवर्ड करता है - यह अपने plaintext की तुलना में एक पूरी तरह से अलग लंबाई हो सकता है. इसके अलावा, अपने plaintext, संख्या और अक्षर हैं, तो यह पूरी तरह से एक साथ मैच नहीं जा रहा है. हां. [छात्र] वहाँ मामले को बदलने के लिए एक समारोह है? आप के लिए एक पूंजी के लिए बदल सकते हैं? >> हाँ, निश्चित रूप से है. तुम बाहर की जाँच कर सकते हैं - मैं यह toupper, सभी 1 शब्द का मानना ​​है. लेकिन, जब आप चीजों को बीजलेख और पाठ की रक्षा करने की कोशिश कर रहे हैं यह मूल रूप से सबसे अच्छा करने के लिए अलग - अलग मामलों के लिए. यदि यह एक अपरकेस है, तो आप इस से बदलाव करना चाहते हैं क्योंकि अपने सूत्र में, जब तुम वापस देखो कैसे हम जाने की तरह है interchangeably ASCII संख्या का प्रतिनिधित्व करने के रास्ते के बीच और वास्तविक वर्णमाला अनुक्रमणिका, हम यह सुनिश्चित करना चाहते हैं वहाँ पैटर्न के कुछ प्रकार है कि आप का उपयोग करने के लिए जा रहे हैं होने जा रहा है. पैटर्न पर एक और नोट, वास्तव में. आप के लिए निश्चित रूप से संख्या के साथ काम करने जा रहे हैं. जादुई संख्या नहीं का उपयोग करने के लिए प्रयास करें, जो शैली का एक उदाहरण है. तो कहते हैं कि तुम तरह से हर समय पाली कुछ चाहते हैं - ठीक है, संकेत तो, एक और बिगाड़ने जब आप कुछ स्थानांतरण हो जा रहे हैं एक निश्चित राशि से, कि एक वास्तविक संख्या से का प्रतिनिधित्व नहीं करने की कोशिश बल्कि कोशिश करते हैं और देखने के लिए अगर आप ASCII मान का उपयोग कर सकते हैं, जो तरह के और अधिक समझ कर देगा. एक और नोट: क्योंकि हम फार्मूले के साथ काम कर रहे हैं, भले ही आपके TF तरह का पता पैटर्न क्या आप का उपयोग किया जा सकता है, में अपनी टिप्पणी तरह का सबसे अच्छा तर्क की तरह, की व्याख्या करने के लिए, "मैं क्योंकि इस पद्धति का उपयोग कर रहा है ..." और किस तरह का पैटर्न succinctly समझा अपनी टिप्पणी में. [इस 2 walkthrough] अगर कोई अन्य सवाल नहीं कर रहे हैं, तो मैं सिर्फ एक छोटा सा के लिए यहाँ रहना होगा. क्रिप्टो और आने के लिए धन्यवाद: 2 pset के साथ गुड लक. [छात्र] धन्यवाद. >> धन्यवाद. [मीडिया ऑफ़लाइन परिचय]