[Powered by Google Translate] [6 सप्ताह]
[डेविड जे Malan] [हार्वर्ड विश्वविद्यालय]
[यह CS50 है.] [CS50.TV]
>> इस CS50 है, और यह 6 सप्ताह की शुरुआत है,
तो नए उपकरणों के एक जोड़े के लिए आप का लाभ लेने के लिए उपलब्ध हैं,
जिनमें से पहले CS50 शैली कहा जाता है.
बाधाओं रहे हैं अगर आप मुझे या किसी भी शिक्षण साथियों की तरह कर रहे हैं,
आप शायद एक प्रोग्राम है जिसकी शैली इस तरह एक छोटे से कुछ लग रहा है देखा है.
हो सकता है कि आप कुछ देर रात में कोनों काटने शुरू, या आप इसके साथ बाद में सौदा होगा,
और फिर एक TF या सीए कार्यालय समय के दौरान आता है.
तो यह मुश्किल है हमें पढ़ने के लिए.
खैर, इस कोड वाक्य रचना सही है, और यह संकलन होगा, और यह वास्तव में चला जाएगा.
लेकिन यह निश्चित रूप से शैली के लिए एक 5 नहीं है.
>> लेकिन अब यहाँ, अगर हम इस निर्देशिका में जाना
और नोटिस कि मैं conditions2.c
और मैं इस फ़ाइल conditions2.c पर इस नए आदेश, style50, चलाने दर्ज करें,,
सूचना है कि यह मुझे सूचित किया है कि यह शैली किया गया है.
जीएडिट में देखा है कि फ़ाइल डिस्क पर बदल दिया गया है,
और अगर मैं लोड करें क्लिक करें, अपने सभी समस्याओं को अब स्वचालित रहे हैं.
[वाहवाही]
ये बातें हम इस सप्ताह के अंत में किया है.
एहसास है कि यह अपूर्ण है क्योंकि वहाँ कुछ कोड
कि यह बस के लिए पूरी तरह से stylize करने में सक्षम नहीं हो जाएगा,
पता नहीं लेकिन यह अब एक उपकरण है आप का लाभ ले सकते है
केवल अगर साफ अधिक रखा errantly घुंघराले ब्रेसिज़ के कुछ और पसंद है.
>> लेकिन अब और अधिक सम्मोहक CS50 जाँच की जाती है.
CS50 जाँच के साथ, आप वास्तव में एक ही शुद्धता परीक्षण प्रदर्शन कर सकते हैं
अपने खुद के कोड है कि शिक्षण साथियों करने में सक्षम हैं.
यह एक कमांड लाइन उपयोगिता है कि उपकरण में अब आता है
जैसे ही आप के रूप में प्रति एक update50 करना
pset 4 विनिर्देशों, और आप इसे अनिवार्य रूप से उपयोग पसंद करते हैं.
आप आदेश check50 चलाते हैं.
तो फिर तुम एक कमांड लाइन तर्क में पास है, या अधिक आम तौर पर एक स्विच या एक ध्वज के रूप में जाना जाता है.
आम तौर पर, चीजें हैं जो हाइफ़न एक स्विच कहा जाता है
एक कमांड लाइन कार्यक्रम के लिए, तो ग निर्दिष्ट
जांच करता है कि आप चलाना चाहते हैं.
>> परीक्षण है कि आप चलाना चाहते हैं इस स्ट्रिंग द्वारा विशिष्ट पहचान कर रहे हैं,
2012/pset4/resize.
दूसरे शब्दों में, यह सिर्फ एक मनमाना लेकिन अद्वितीय स्ट्रिंग
कि हम विशिष्ट pset 4 शुद्धता परीक्षण की पहचान करने के लिए उपयोग.
और फिर आप फ़ाइलों का एक अंतरिक्ष अलग सूची निर्दिष्ट कर सकते हैं कि आप अपलोड करना चाहते हैं
विश्लेषण के लिए CS50 की जांच करने के लिए.
उदाहरण के लिए, अगर मैं अपने समाधान में के लिए यहाँ जाना resize.c
मुझे एक बड़ी खिड़की टर्मिनल खोलने
और मैं आगे बढ़ो और चलो चलाने के check50 - ग 2012/pset4/resize कहते हैं,
और फिर मैं आगे बढ़ो और फ़ाइलों के नामों का उल्लेख है,
resize.c, और फिर हिट दर्ज compresses, यह,
यह अपलोड, यह जाँच करता है, और मैं सिर्फ परीक्षण की एक पूरी गुच्छा विफल.
ऊपर छोड़ दिया पर लाल रंग में एक का कहना है कि resize.c और bmp मौजूद है.
यह परीक्षण किया गया था. कि हम सवाल पूछा था.
और यह दुखी है क्योंकि उत्तर गलत था.
यह नीचे सफेद पाठ मौजूद bmp.h कहते हैं कि उम्मीद थी, और कि बस मेरी गलती है.
मैं इसे अपलोड करने के लिए भूल गया, तो मैं दोनों फ़ाइलों को अपलोड करने की जरूरत है,
resize.c और bmp.h.
लेकिन अब अन्य परीक्षणों के सभी पीले रंग में हैं नोटिस क्योंकि वे नहीं चला है,
और इसलिए Smiley चेहरा खड़ी है, क्योंकि वह न तो खुश है और न ही दुख की बात है,
लेकिन हम लाल रंग में है कि इस मुद्दे से पहले उन अन्य चेक चलेंगे निवारण है.
>> मुझे यह तय.
मुझे बाहर ज़ूम और यह फिर से दौड़ना, bmp.h साथ भी इस समय
कमांड लाइन पर दर्ज करें, और अब अगर सब कुछ ठीक हो जाता है,
यह करने के लिए और फिर परिणाम की जांच करने के लिए रिटर्न की अपनी पकड़ के लिए जा रहा है सांस
सब हरे रंग की है, जिसका मतलब है कि मैं वास्तव में अच्छी तरह से 4 pset पर कर रहा हूँ अब तक.
आप देख और वर्णनात्मक पाठ से अनुमान कर सकते हैं यहाँ
वास्तव में यह क्या है हम परीक्षण किया.
हम परीक्षण फ़ाइलों को पहले अस्तित्व में नहीं है?
हम फिर परीक्षण किया resize.c संकलन करता है?
तब हम इसे दुबारा आकार भी करता है जब, आकार कारक है, 1 एक 1x1 पिक्सेल बीएमपी का परीक्षण किया.
अब, अगर आप कोई विचार नहीं पता क्या है, आप एक बार आप 4 pset में गोता जाएगा,
लेकिन है कि बस एक विवेक की जाँच करने के लिए सुनिश्चित करें कि आप रीसाइज़िंग नहीं कर रहे हैं
सभी में एक छवि का आकार परिवर्तन कारक है 1.
अगर, इसके विपरीत, यह 2x2 सही ढंग से करने के लिए एक 1x1 पिक्सेल बीएमपी के लिए एक 1x1 पिक्सेल resizes
जब 2 है, तो इसी तरह, मेरा तदनुसार रूपों.
>> संक्षेप में, यह करने के लिए, एक का मतलब है, पार उंगलियों ले
में आप पहले सही समीकरण के के बाहर अपने pset प्रस्तुत.
आपको पता चल जाएगा कि क्या वास्तव में अपने TF जल्द ही पता चल जाएगा
, जब आप इन समस्या सेट के कुछ प्रस्तुत करने के बारे में जाना
और भी शैक्षणिक प्रेरणा सच है डाल
आप के सामने तो मौका है कि जब आप एक प्राथमिकताओं पता
कि वहाँ अपने कोड में कीड़े और परीक्षण पारित किया जा रहा है कि नहीं कर रहे हैं,
आप और अधिक प्रभावी समय में सामने प्रस्तुत करने के लिए उन समस्याओं को हल कर सकते हैं
बजाय अंक खो देते हैं, अपने TF से प्रतिक्रिया हो,
और तब जाकर, "आह," की तरह मुझे लगता है कि बाहर लगा है चाहिए.
अब कम से कम मदद करने के लिए आप पाते हैं कि एक उपकरण है.
यह जहां बग है बाहर बात करने के लिए नहीं जा रहा है, लेकिन यह आपको बता देगा
क्या इसे का प्रतीक है.
>> अब एहसास परीक्षण संपूर्ण जरूरी नहीं हैं.
सिर्फ इसलिए कि तुम एक हरे रंग Smiley चेहरे की पूर्ण स्क्रीन मिल
इसका मतलब यह नहीं अपने कोड सही है, लेकिन इसका मतलब यह नहीं है
कि यह कल्पना द्वारा निर्धारित कुछ परीक्षणों से पारित कर दिया गया है.
कभी कभी हम चेक नहीं जारी करेंगे.
उदाहरण के लिए, whodunit, 4 pset के पहलुओं में से एक है,
निराशाजनक की तरह अगर हम आपको दे
यह क्या है, और वहाँ प्रकट करने के तरीके के एक नंबर के रूप में जवाब
व्यक्ति जो कि लाल शोर में है.
कल्पना हमेशा pset 5 आगे के लिए भविष्य में निर्दिष्ट
क्या आप के लिए अस्तित्व की जाँच करता है.
तुम नोटिस हूँ वहाँ नीचे इस सफेद यूआरएल है.
अभी के लिए, यह सिर्फ नैदानिक ​​उत्पादन है.
यदि आपको लगता है कि यूआरएल पर जाएँ, आप पागल, गुप्त संदेश की एक पूरी गुच्छा मिलेगा
कि आप के माध्यम से देखने के लिए स्वागत कर रहे हैं, लेकिन यह ज्यादातर कर्मचारियों के लिए है
इतना है कि हम निदान और check50 में ही कीड़े डिबग कर सकते हैं.
>> हलचल के बिना, हम कहाँ से दूर छोड़ दिया करने के लिए आगे बढ़ना है.
CS50 पुस्तकालय हम ले के लिए कुछ हफ्तों के लिए दी जाती है,
लेकिन फिर पिछले हफ्ते, हम वापस एक यह की परतों के छीलने शुरू कर दिया.
हम बदले क्या के पक्ष में अलग स्ट्रिंग डालने शुरू कर दिया?
[छात्र] चार.
चार *, जो एक चार * किया गया है, यह सब समय है,
लेकिन अब हम बहाना है कि यह एक वास्तविक डेटा प्रकार स्ट्रिंग नहीं है.
बल्कि, यह एक तरह की पर्याय चार * के लिए किया गया है,
और एक स्ट्रिंग वर्णों के क्रम है,
तो क्यों यह समझ पड़ता है करने के लिए चार * एस के रूप में तार का प्रतिनिधित्व करने के लिए?
एक चार * क्या एक स्ट्रिंग की इस अवधारणा के संदर्भ में प्रतिनिधित्व करता है?
हाँ >> [छात्र] 1 चरित्र.
अच्छा, पहली चरित्र, लेकिन नहीं काफी पहले चरित्र.
यह [छात्र] पता है.
अच्छा, पहली चरित्र का पता.
सभी आवश्यक है कि एक कंप्यूटर की स्मृति में एक स्ट्रिंग का प्रतिनिधित्व
बस इसकी बहुत पहली बाइट की अद्वितीय पता है.
तुम्हें पता भी नहीं है कितना समय है
क्योंकि आपको लगता है कि कैसे समझ से बाहर गतिशील कर सकते हैं?
[छात्र] स्ट्रिंग की लंबाई.
आप स्ट्रिंग की लंबाई, उत्कृष्ट, लेकिन स्ट्रिंग लंबाई काम करता है कैसे कह सकता है?
यह क्या करता है? हाँ.
[छात्र] जा रहा है जब तक आप अशक्त चरित्र मिलता रखें.
हाँ, बिल्कुल, यह सिर्फ पाश के लिए एक के साथ दोहराता है, जबकि पाश,
* से अंत करने के लिए जो कुछ भी है, और अंत में प्रतिनिधित्व किया है
\ 0, तथाकथित nul चरित्र, nul,
अशक्त है, जो एक संकेत है के साथ भ्रमित होने की नहीं है,
जो बातचीत में आज फिर आ जाएगा.
>> हम वापस GetInt की एक परत खुली, और फिर हम GetString पर एक नज़र लिया,
और कहा कि उन कार्यों के दोनों, या वास्तव में याद करते हैं,
GetString, एक विशेष समारोह का उपयोग कर रहा था
वास्तव में पार्स, कि, या पढ़ा है विश्लेषण, उपयोगकर्ता इनपुट.
और कहा कि नई समारोह क्या था?
Scanf या sscanf. यह वास्तव में कुछ अलग जायके में आता है.
वहाँ scanf है, वहाँ sscanf है, वहाँ fscanf है.
अभी के लिए, हालांकि, एक सबसे आसानी से सचित्र पर ध्यान केंद्रित,
और मुझे आगे जाना है और उपकरण में खुला
इस तरह से एक फ़ाइल, scanf1.c.
यह एक सुपर सरल कार्यक्रम है,
लेकिन जो कुछ है कि हम कभी नहीं किया करता है
CS50 पुस्तकालय की मदद के बिना.
यह एक उपयोगकर्ता से एक int हो जाता है. यह कैसे काम करता है?
ठीक है, वहाँ 16 लाइन में,
सूचना है कि हम एक int x की घोषणा, और कहानी में इस बिंदु पर,
x का मूल्य क्या है?
[अश्राव्य छात्र प्रतिक्रिया]
[डेविड एम.] ठीक है, कौन जानता है, कुछ कचरा मान संभावित है, तो 17 में, हम सिर्फ उपयोगकर्ता बता
मुझे एक नंबर दे, कृपया, और 18 कदम है, जहां यह दिलचस्प हो जाता है.
Scanf printf से एक विचार है कि यह उद्धरण में इन प्रारूप कोड का उपयोग करता है उधार लेने लगता है.
% D पाठ्यक्रम के एक दशमलव संख्या है.
लेकिन मैं क्यों और के बजाय x सिर्फ एक्स में गुजर रहा हूँ?
पूर्व सही है. हाँ.
[अश्राव्य छात्र प्रतिक्रिया]
वास्तव में, अगर इस कार्यक्रम का लक्ष्य, समारोह की तरह ही GetInt
उपयोगकर्ता से एक int मैं कार्यों को पारित कर सकते हैं
सभी चर मैं चाहता हूँ, लेकिन अगर मैं उन्हें संदर्भ द्वारा पारित नहीं
या पता या द्वारा सूचक, आज के प्रयोजनों के लिए पर्याय बन गया है,
तो उस समारोह में नहीं कि चर की सामग्री को बदलने की क्षमता है.
स्वैप की छोटी गाड़ी संस्करण की तरह यह एक कॉपी में पारित होगा
कि अब हम कुछ समय के बारे में बात की है.
>> लेकिन इसके बजाय, कर रही है और एक्स, मैं सचमुच में क्या गुजर रहा हूँ?
[छात्र] पते x के पते >>.
यह scanf बुलाया समारोह के लिए एक नक्शा ड्राइंग और यहाँ कह की तरह है,
इन कंप्यूटर में स्मृति का एक हिस्सा करने के लिए निर्देश हैं
कि तुम अंदर कुछ पूर्णांक की दुकान करने के लिए जा सकते हैं
Sscanf के लिए आदेश में करने के लिए है कि
क्या ऑपरेटर, क्या वाक्यविन्यास का टुकड़ा करने के लिए उपयोग किया जा रहा है
भले ही हम इसे देख नहीं है क्योंकि किसी और को इस समारोह में लिखा कर सकते हैं?
दूसरे शब्दों में - क्या है?
[छात्र] पढ़ा एक्स.
वहाँ कुछ पढ़ने जा रहा है, लेकिन केवल एक्स के लिए संबंध के साथ.
यदि scanf x के पते पारित किया जा रहा है,
वाक्य रचना, ऑपरेटर क्या कहीं मौजूद ही है
scanf कार्यान्वयन के अंदर इतना है कि scanf
वास्तव में उस पते पर एक 2 नंबर लिख सकते हैं?
हाँ, तो *.
याद है कि * हमारे भिन्नता ऑपरेटर, जो अनिवार्य रूप से मतलब है कि वहाँ जाना है.
>> एक बार जब आप एक पते सौंप दिया गया है, इस मामले के रूप में यहाँ है,
scanf शायद अगर हम वास्तव में अपने स्रोत के आसपास देखा कोड
* एक्स या वास्तव में उस पते पर जाने के लिए और कुछ मूल्य वहाँ डाल बराबर कर रही है.
अब, के रूप में के लिए कैसे scanf कीबोर्ड से इनपुट हो जाता है,
आज हम अपने हाथों के लिए बाहर की लहर हूँ.
बस लगता है कि ऑपरेटिंग सिस्टम की अनुमति देता है sscanf बात करने के लिए
उपयोगकर्ता कुंजीपटल करने के लिए, लेकिन इस बिंदु पर लाइन 19 में अब,
जब हम बस से बाहर x मुद्रित करने के लिए, यह मामला लगता है
scanf कि एक्स में एक int डाल दिया है.
यह वास्तव में कैसे scanf काम करता है, और पिछले हफ्ते याद
है कि वास्तव में कैसे GetString और GetInt और अपने कार्यों के परिवार के अन्य
अंततः काम करता है, यद्यपि sscanf तरह मामूली विचरण के साथ,
जिसका अर्थ है कुंजीपटल के बजाय एक स्ट्रिंग स्कैन.
लेकिन इस के एक छोटे से विचरण पर एक नज़र रखना.
Scanf2 में, मैं वास्तव में बँधा हुआ.
क्या गलत है और मैं टिप्पणी है कि के रूप में ज्यादा बताते छिपा होगा
इस कार्यक्रम के साथ क्या गलत है, 2 संस्करण?
के रूप में इस समय के रूप में संभव तकनीकी.
यह बहुत अच्छा लग रहा है.
यह अच्छी तरह से दांतेदार बना है, लेकिन
ठीक है, के बारे में कैसे हम इसे कम सवालों के नीचे अधिकृन्तन करना?
16 लाइन. क्या 16 लाइन सटीक लेकिन तकनीकी अंग्रेजी में क्या कर रही है?
थोड़ा अजीब रही. हाँ, माइकल.
[छात्र] यह एक स्ट्रिंग के पहले अक्षर की ओर इशारा करते है.
>> ठीक है, करीब है. मुझे कि एक छोटा सा tweak.
एक स्ट्रिंग के पहले अक्षर के लिए उनका कहना है, तो आप एक चर बुलाया बफर की घोषणा कर रहे हैं
कि एक स्ट्रिंग के पहले पता करने के लिए बात करेंगे,
या यों कहें कि एक चार के लिए विशेष रूप से बात करेंगे.
सूचना यह वास्तव में कहीं ओर इशारा करते हुए नहीं है क्योंकि वहाँ कोई असाइनमेंट ऑपरेटर है.
वहाँ कोई बराबर का चिह्न है तो, हम सब कर रहे हैं चर बुलाया बफर का आवंटन है.
यह 32 बिट होता है क्योंकि यह एक सूचक है,
बफर की सामग्री संभाव्यतः और अंततः
एक चार के एक पते होते हैं, लेकिन अब के लिए, बफर में क्या है?
बस कुछ फर्जी कौन जानता है, कुछ कचरा मान,
क्योंकि हम स्पष्ट रूप से यह प्रारंभ नहीं किया है, इसलिए हम कुछ भी नहीं मान लेना चाहिए.
ठीक है, तो अब 17 लाइन क्या 17 लाइन नहीं करता है?
हो सकता है कि इस गर्म होगा.
यह एक स्ट्रिंग प्रिंट, सही?
यह प्रिंट स्ट्रिंग कृपया.
>> रेखा 18 परिचित की तरह है कि अब हम सिर्फ इस का एक विचरण देखा
लेकिन एक अलग स्वरूप कोड के साथ है, तो लाइन में 18,
हम scanf कह रहे हैं यहाँ स्मृति का एक हिस्सा का पता है.
मैं आप एक स्ट्रिंग में अंगूठी के लिए चाहते हैं, के रूप में% s के द्वारा निहित है,
लेकिन समस्या यह है कि हम चीजों की एक जोड़ी यहाँ नहीं किया है.
समस्याओं में से एक है?
[छात्र] यह एक अशक्त संकेतक भिन्नता करने की कोशिश कर रहा है.
अच्छा, अशक्त या अन्यथा अज्ञात संकेत.
तुम एक पते scanf सौंप रहे हैं, लेकिन आप बस एक पल के पहले कहा था
कि उस पते कुछ कचरा मूल्य है क्योंकि हम वास्तव में कुछ भी करने के लिए यह नहीं असाइन करने के लिए किया था,
और इसलिए आप कह रहे हैं scanf प्रभावी ढंग से जाना एक स्ट्रिंग यहाँ डाल,
लेकिन हम कहाँ यहाँ अभी तक पता नहीं है,
इसलिए हम वास्तव में स्मृति बफर के लिए नहीं आवंटित किया है.
इसके अलावा, आप जो भी कर रहे हैं scanf भी नहीं कह रही है?
मान लीजिए यह स्मृति का एक हिस्सा था, और यह एक कचरा मान नहीं था,
लेकिन आप अभी भी कुछ महत्वपूर्ण कह रहे हैं नहीं scanf.
[छात्र] यह वास्तव में कहाँ है, एम्परसेंड.
एम्परसेंड, तो इस मामले में, यह ठीक है.
क्योंकि बफर पहले से ही एक संकेत के रूप में घोषित किया जाता है
* वाक्यविन्यास के टुकड़े के साथ, हम एम्परसेंड प्रयोग की जरूरत नहीं
क्योंकि यह पहले से ही पता है, लेकिन मुझे लगता है कि मैं इसे यहाँ सुना.
[छात्र] कितना बड़ा है?
अच्छा, हम scanf नहीं कह रही है बड़ा कैसे इस बफर है रहे हैं,
जिसका अर्थ है यहां तक ​​कि अगर बफर सूचक थे,
हम scanf कह रहे हैं, एक स्ट्रिंग यहाँ डाल,
लेकिन यहाँ 2 बाइट्स हो सकता है, यह 10 बाइट्स हो सकता है, यह एक मेगाबाइट हो सकता है.
Scanf कोई विचार नहीं है, और क्योंकि यह स्मृति का एक हिस्सा है
शायद, यह एक स्ट्रिंग अभी तक नहीं है.
यह केवल एक स्ट्रिंग है कि एक बार आप अक्षर और एक स्मृति की है कि हिस्सा \ 0 लिखें.
अब यह सिर्फ स्मृति में से कुछ हिस्सा है.
Scanf नहीं पता चल जाएगा जब उस पते पर लिख रोकने के लिए.
>> यदि आप अतीत में कुछ उदाहरण हैं, जहां मैं बेतरतीब ढंग से कीबोर्ड पर टाइप याद
एक बफर अतिप्रवाह की कोशिश कर रहा है, और हम के बारे में ठीक है कि शुक्रवार को बात की थी.
यदि एक विरोधी किसी भी तरह अपने कार्यक्रम में एक बहुत बड़ा शब्द injects
या वाक्य या वाक्यांश तो आप उम्मीद कर रहे थे कि आप उग आया कर सकते हैं
स्मृति का एक हिस्सा है, जो बुरे परिणाम हो सकते हैं,
पूरे कार्यक्रम खुद पर लेने की तरह.
हम यह किसी भी तरह से ठीक करने की जरूरत है.
मुझे बाहर ज़ूम और इस कार्यक्रम के 3 संस्करण में जाना.
यह एक छोटा सा बेहतर है.
इस संस्करण में, अंतर नोटिस.
16 लाइन में, मैं फिर से एक चर बुलाया बफर घोषणा कर रहा हूँ,
लेकिन अब यह क्या है?
यह 16 वर्ण की एक सरणी है.
यह अच्छा है क्योंकि इसका मतलब यह है मैं अब scanf बता सकते हैं
यहाँ स्मृति का एक वास्तविक हिस्सा है.
आप संकेत जा रहा है के रूप में अब लगभग arrays के बारे में सोच सकते हैं,
भले ही वे वास्तव में बराबर नहीं कर रहे हैं.
वे अलग अलग संदर्भों में व्यवहार करेंगे.
लेकिन यह निश्चित रूप से मामला कि बफर संदर्भित है
16 सन्निहित chars क्योंकि है कि क्या एक सरणी है
और अब कुछ हफ्तों के लिए किया गया है.
>> यहाँ, मैं scanf कह रहा हूँ यहाँ स्मृति का एक हिस्सा है.
इस बार, यह वास्तव में स्मृति का एक हिस्सा है,
लेकिन इस कार्यक्रम क्यों अभी भी दोहन?
अभी भी क्या गलत है?
मैंने कहा है मुझे लेकिन 16 बाइट्स दे
[छात्र] क्या होगा अगर वे अधिक से अधिक 16 में लिखा था?
वास्तव में, क्या होगा अगर 17 अक्षर या 1700 वर्ण में उपयोगकर्ता प्रकार?
वास्तव में, हम देखते हैं हम इस गलती पर यात्रा नहीं कर सकते हैं अब अगर.
यह बेहतर है, लेकिन सही नहीं है.
मुझे आगे जाना है और scanf3 बनाने के लिए इस कार्यक्रम के संकलन चलाने के.
मुझे scanf3 चलाने के, स्ट्रिंग कृपया: हैलो, और हम ठीक हो रहे हैं.
मुझे एक थोड़ा अब एक कोशिश, नमस्ते वहाँ.
ठीक है, नमस्ते वहाँ करते आज आप कैसे हैं, दर्ज करें.
भाग्यशाली की तरह यहाँ हो रही है, चलो नमस्ते वहाँ का कहना है कि आप कैसे हैं.
लानत है.
ठीक है, तो हम भाग्यशाली है. चलो देखते हैं अगर हम यह तय नहीं कर सकते.
नहीं, यह मुझे प्रतिलिपि नहीं जा रहा है.
चलो यह फिर से कोशिश.
ठीक है, द्वारा खड़े.
हम देखेंगे कि कितनी देर तक मैं ध्यान केंद्रित करते हुए अभी भी इस कर का नाटक कर सकते हैं.
लानत है. बल्कि उपयुक्त है, वास्तव में.
हम वहाँ जाते हैं.
मुद्दा बनाया है.
>> हालांकि यह भी शर्मनाक, यह भी एक महान भ्रम के स्रोतों में से एक है
जब प्रोग्राम है कि कीड़े लेखन क्योंकि वे स्वयं को प्रकट
कभी कभी एक समय में केवल एक बार.
वास्तविकता यह है कि यदि आपके कोड पूरी तरह से टूट गया है,
यह पूरी तरह से एक समय में केवल हो सकता है एक बार टूट
क्योंकि कभी कभी, अनिवार्य रूप से क्या होता है ऑपरेटिंग सिस्टम का आवंटन
आप एक छोटे से अधिक स्मृति वास्तव में जो भी कारण के लिए जरूरत है,
और तो और कोई नहीं एक के बाद 16 वर्ण के अपने हिस्सा सही स्मृति का उपयोग कर रहा है,
इसलिए यदि आप 17, 18, 19, जो भी, यह इतना बड़ा सौदा नहीं है.
अब, कंप्यूटर, भले ही यह उस बिंदु पर दुर्घटना नहीं है,
अंततः कुछ और के लिए बाइट संख्या 17 या 18 या 19 का उपयोग हो सकता है,
जिस पर अपने डेटा का कहना है कि तुम वहाँ डाल दिया, हालांकि लंबे समय के जरूरत से ज्यादा है,
को अधिलेखित कर दिया कुछ अन्य समारोह से संभावित पाने के लिए जा रहा है.
यह जरूरी बरकरार रहेगा नहीं जा रहा है,
लेकिन यह जरूरी नहीं कि एक seg गलती कारण नहीं होगा.
लेकिन इस मामले में, मैं अंत में पर्याप्त अक्षर प्रदान
कि मैं अनिवार्य रूप से मेरी स्मृति के खंड से अधिक है, और बेम,
ऑपरेटिंग सिस्टम ने कहा, "क्षमा करें, यह अच्छा नहीं है, विभाजन की गलती है."
>> और अब देखने के लिए कि क्या मेरे में यहाँ रहता निर्देशिका
लगता है कि मैं इस फाइल को यहाँ है, कोर.
सूचना है कि यह फिर से एक कोर डंप कहा जाता है.
यह अनिवार्य रूप से एक फ़ाइल है कि अपने कार्यक्रम की स्मृति की सामग्री शामिल है
जो बिंदु पर यह दुर्घटनाग्रस्त हो गया,
और एक छोटा सा उदाहरण यहाँ की कोशिश बस मुझे यहाँ में जाना
और scanf3 पर gdb चलाने के लिए और फिर एक तिहाई कोर कहा जाता तर्क निर्दिष्ट
और यहाँ नोटिस कि अगर मैं कोड की सूची,
हम सामान्य रूप से कर gdb के साथ करने के लिए इस कार्यक्रम के माध्यम से चलने शुरू करेंगे,
और मैं इसे चलाने के लिए और में कदम के रूप में मैं हिट के रूप में आदेश के साथ कर सकते हैं के रूप में जल्द ही gdb
जैसे ही मैं एक विशाल स्ट्रिंग में लिखने के बाद संभावित छोटी गाड़ी लाइन मारा,
मैं वास्तव में इसे यहाँ की पहचान करने में सक्षम हो जाएगा.
अधिक इस पर है, हालांकि, कोर डंप के रूप में अनुभाग में
और की तरह इतना है कि आप वास्तव में चारों ओर कोर डंप के प्रहार के अंदर
पर और देखने के लिए लाइन क्या आप कार्यक्रम में विफल रहा है.
तो संकेत पर और पते पर कोई सवाल?
पर क्योंकि आज हम लेने के लिए दी है कि इन बातों मौजूद शुरू करने के लिए जा रहे हैं
और हम जानते हैं कि क्या वास्तव में वे कर रहे हैं.
हां.
>> [छात्र] आने के आप एक एम्परसेंड बगल में रखा नहीं था हिस्सा
अच्छा सवाल है.
मैं कैसे आए एक एम्परसेंड चरित्र सरणी के बगल में डाल के रूप में मैं पहले था नहीं
हमारे उदाहरण के अधिकांश के साथ?
संक्षिप्त जवाब है arrays एक छोटे से विशेष कर रहे हैं.
आप वास्तव में एक पते होने के रूप में लगभग एक बफर के बारे में सोच सकते हैं,
और यह सिर्फ इतना मामला हो होता है कि वर्ग कोष्ठक संकेतन
एक सुविधा है इतना है कि हम कोष्ठक 0, 1 ब्रैकेट में जा सकते हैं,
* संकेतन का उपयोग करने के लिए बिना, वर्ग 2.
यह एक सफेद झूठ का एक सा है क्योंकि arrays और संकेत
वास्तव में कर रहे हैं, थोड़ा अलग है, लेकिन वे अक्सर लेकिन हमेशा नहीं interchangeably इस्तेमाल किया जा सकता है.
संक्षेप में, जब एक समारोह स्मृति का एक हिस्सा एक सूचक की उम्मीद है,
या तो आप इसे एक पता है कि malloc से लौट रहा था पारित कर सकते हैं,
और हम फिर से malloc लंबे समय से पहले देखेंगे, या आप इसे एक सरणी के नाम पारित कर सकते हैं.
आप arrays के साथ एम्परसेंड करने के लिए नहीं है, क्योंकि वे पहले से ही कर रहे हैं
अनिवार्य रूप से पते की तरह.
यह एक अपवाद है.
वर्ग कोष्ठक उन्हें खास बनाते हैं.
>> आप एक एम्परसेंड बफर करने के लिए बगल में डाल सकते हैं?
इस मामले में नहीं.
वजह यह है कि फिर से, इस कोने मामले का काम नहीं होगा,
जहां arrays काफी वास्तव में पते नहीं हैं.
लेकिन हम शायद कि लंबे समय से पहले अन्य उदाहरणों के साथ वापस आया हूँ.
चलो यहाँ एक समस्या को हल करने की कोशिश.
हम एक डेटा संरचना है कि हम कुछ समय के लिए एक सरणी के रूप में जाना जाता है का उपयोग किया गया है.
बिन्दु में प्रकरण, कि क्या हम सिर्फ था.
लेकिन arrays कुछ upsides और downsides है.
Arrays अच्छा क्यों कर रहे हैं?
एक बात है कि आप की तरह हद तक आप arrays arrays के बारे में की तरह क्या है?
क्या उनके बारे में सुविधाजनक है? सम्मोहक क्या है?
हम पहली जगह में क्यों उन्हें परिचय?
हाँ.
[छात्र] वे डेटा का एक बहुत स्टोर कर सकते हैं, और आप एक पूरी बात का उपयोग नहीं है.
आप एक अनुभाग का उपयोग कर सकते हैं.
अच्छा, आप डेटा का एक बहुत स्टोर कर सकते हैं एक सरणी के साथ,
और तुम जरूरी यह सब का उपयोग करने के लिए नहीं है, तो आप overallocate कर सकते हैं,
जो सुविधाजनक हो सकता है अगर आप पहले से नहीं पता है कि कितने की उम्मीद करने के कुछ नहीं कर सकता है.
>> GetString एक आदर्श उदाहरण है.
, जो हमारे द्वारा लिखित GetString, पता नहीं कितने chars की उम्मीद है,
तथ्य यह है कि हम क्रमिक मेमोरी का हिस्सा आवंटित कर सकते हैं अच्छा है.
Arrays भी एक समस्या हम एक दो सप्ताह पहले अब देखा हल
जहां अपने कोड कुछ बहुत खराब डिजाइन में उतरना शुरू होता है.
याद है कि मैं एक छात्र ने दाऊद को बुलाकर संरचना बनाया,
और फिर है कि वास्तव में एक विकल्प था, हालांकि,
एक चर नाम और एक अन्य चर मुझे लगता है, घर बुलाया होने के लिए,
और एक अन्य आईडी कहा जाता है क्योंकि उस कहानी में मैं तो कुछ और ही शुरू करना चाहता था चर
कार्यक्रम में रोब करना चाहते हैं, तो मैं एक मिनट इंतजार करने का फैसला,
मैं इन चर का नाम बदलने की जरूरत है.
चलो NAME1 मेरा, ID1, house1 कहते हैं.
चलो रोब NAME2, house2, ID2 कहते हैं.
लेकिन फिर एक मिनट, टॉमी के बारे में क्या इंतजार?
तो हम तीन से अधिक चर था.
हम किसी और से, चर के चार सेट की शुरुआत की.
दुनिया गंदा मिल बहुत जल्दी शुरू कर दिया है,
इसलिए हम structs शुरू की है, और क्या एक struct के बारे में मजबूर है?
एक सी struct क्या आप करते हैं?
यह वास्तव में अजीब है आज.
क्या? >> [अश्राव्य छात्र प्रतिक्रिया]
हाँ, विशेष रूप से, typedef आप एक नया डेटा प्रकार बनाने के लिए अनुमति देता है,
और संरचना, संरचना खोजशब्द, encapsulate करने के लिए अनुमति देता है
डेटा की धारणात्मक संबंधित टुकड़े एक साथ
और उसके बाद उन्हें एक छात्र की तरह कुछ कहते हैं.
>> वह अच्छा था क्योंकि अब हम मॉडल कर सकते हैं
बहुत अधिक की तरह धारणात्मक लगातार एक चर में एक छात्र की धारणा
बजाय एक स्ट्रिंग के लिए मनमाने ढंग से, एक एक आईडी के लिए एक होने, और इतना आगे.
Arrays अच्छा कर रहे हैं क्योंकि वे हमें हमारे कोड की सफाई शुरू करने के लिए अनुमति देते हैं.
लेकिन क्या अब एक नकारात्मक पक्ष है एक सरणी के?
आप क्या नहीं कर सकते? हाँ.
[छात्र] आप को पता है कि यह कितना बड़ा है.
आप को पता है कि यह कितना बड़ा है, इसलिए, यह एक दर्द की तरह है.
तुम में से जो पूर्व प्रोग्रामिंग अनुभव के साथ पता है कि भाषाओं का एक बहुत में,
जावा की तरह, आप स्मृति का एक हिस्सा है, विशेष रूप से एक सरणी पूछ सकते हैं,
कितना बड़ा आप कर रहे हैं, लंबाई, संपत्ति, तो बात करने के साथ, और कहा कि वास्तव में सुविधाजनक है.
सी में, तुम भी एक सामान्य सरणी पर strlen फोन नहीं कर सकते हैं
strlen क्योंकि, के रूप में इस शब्द का अर्थ है, तार के लिए ही है,
और आप इस मानव सम्मेलन की वजह से एक स्ट्रिंग की लंबाई समझ सकते हैं
एक \ 0, लेकिन एक सरणी होने के अधिक generically, सिर्फ स्मृति का एक हिस्सा है.
यदि यह ints की एक सरणी है, वहाँ के लिए कुछ विशेष चरित्र होने वाला नहीं है
अंत में आप के लिए इंतज़ार कर रहे हैं.
आप एक सरणी की लंबाई को याद है.
एक सरणी के एक और नकारात्मक पहलू ही GetString में अपने सिर पाला.
एक सरणी के एक और नकारात्मक पहलू क्या है?
महोदय, आप और मैं तो बस आज.
[अश्राव्य छात्र प्रतिक्रिया] >> यह क्या है?
यह ढेर पर घोषित है.
ठीक है, ढेर पर की घोषणा की. आपको लगता है कि क्यों नहीं पसंद करते हैं?
[छात्र] क्योंकि यह reused हो जाता है.
यह reused हो जाता है.
ठीक है, यदि आप एक सरणी का उपयोग करने के लिए स्मृति आवंटित
तुम, उदाहरण के लिए नहीं है, इसे वापस कर सकते हैं क्योंकि यह ढेर पर है.
ठीक है, यह एक नुकसान है.
और कैसे एक के बारे में एक सरणी के साथ अन्य?
एक बार जब आप इसे आवंटित, आप की तरह खराब अगर आप अधिक स्थान की आवश्यकता है
से अधिक है कि सरणी है.
>> फिर हम शुरू की, याद है, malloc, जो हमें गतिशील स्मृति आवंटित करने की क्षमता दे दी है.
लेकिन अगर हम एक अलग दुनिया पूरी तरह से करने की कोशिश की है?
क्या होगा अगर हम उन समस्याओं के एक जोड़े को हल करना चाहता था
तो हम बजाय मेरी कलम सो यहाँ गिर गया है
क्या होगा अगर हम बजाय अनिवार्य रूप से एक दुनिया है कि इस तरह नहीं रह गया है बनाना चाहता था?
यह एक सरणी है, और, ज़ाहिर है, इस तरह कमजोर होती एक बार हम सरणी के अंत मारा,
और मैं अब नहीं रह एक और पूर्णांक या किसी अन्य चरित्र के लिए जगह है.
क्या होगा अगर हम सॉर्ट के preemptively अच्छी तरह से कहते हैं, हम क्यों आराम नहीं है
इस आवश्यकता है कि स्मृति के इन सभी विखंडू वापस सटे वापस हो,
और क्यों, जब मैं एक int या एक चार की जरूरत नहीं है,
सिर्फ मुझे उनमें से एक के लिए जगह देने के?
और जब मैं एक की जरूरत है, मुझे एक और जगह दे,
और जब मैं एक की जरूरत है, मुझे एक और जगह दे.
जो का लाभ अब है कि अगर कोई और है
यहाँ पर स्मृति लेता है, कोई बड़ी बात नहीं है.
मैं यहाँ और फिर यह एक स्मृति के इस अतिरिक्त हिस्सा ले जाऊँगा.
>> अब, केवल यहाँ पकड़ है कि यह लगभग लगता है जैसे मैं
विभिन्न चर की एक पूरी गुच्छा.
यह संभावित पाँच अलग चर की तरह लगता है.
लेकिन अगर हम तार से एक विचार चोरी
जिससे हम किसी भी तरह इन बातों को एक साथ धारणात्मक जोड़ने के लिए, और क्या अगर मैं इस किया?
यह मेरा बहुत खराब तैयार तीर है.
लगता है लेकिन यह है कि स्मृति के इन विखंडू की प्रत्येक
अन्य की ओर इशारा किया है, और इस आदमी, जो अपने अधिकार के लिए कोई भाई है,
ऐसी कोई तीर है.
यह तथ्य यह है क्या कहा जाता है एक लिंक सूची में है.
यह एक नया डेटा संरचना है कि हमें स्मृति का एक हिस्सा आवंटित करने की अनुमति देता है,
फिर एक और, फिर एक और, फिर एक, किसी भी समय हम चाहते हैं
एक कार्यक्रम के दौरान, और हमें याद है कि वे सभी कर रहे हैं किसी भी तरह से संबंधित
उन्हें एक साथ है, और हम सचमुच श्रृंखलन द्वारा कि सचित्र रूप से यहाँ एक तीर के साथ किया था.
लेकिन कोड में क्या व्यवस्था है जिसके माध्यम से आप किसी भी तरह से कनेक्ट कर सकता होगा,
लगभग खरोंच की तरह, एक और हिस्सा करने के लिए एक हिस्सा है?
हम एक सूचक का उपयोग, है ना?
क्योंकि वास्तव में तीर है कि शीर्ष बाएँ वर्ग से जा रहा है,
यह एक आदमी है, इस वर्ग के अंदर होते हैं सकता है
कुछ, न सिर्फ ints कुछ सिर्फ चार नहीं, लेकिन क्या अगर मैं वास्तव में आवंटित
एक छोटे से अतिरिक्त अंतरिक्ष इतना है कि अब,
मेरी स्मृति की मात्रा के प्रत्येक, भले ही यह मुझे लागत जा रहा है,
अब एक छोटे से अधिक आयताकार लग रहा है, जहां एक स्मृति का हिस्सा
एक नंबर के लिए प्रयोग किया जाता है, 1 नंबर की तरह,
और फिर अगर इस आदमी नंबर 2 के भंडार है,
स्मृति के इस दूसरे हिस्सा एक तीर के लिए प्रयोग किया जाता है,
या अधिक concretely, एक सूचक है.
लगता है और मैं यहाँ पर 3 नंबर की दुकान है जबकि मैं उस आदमी को बात करने के लिए उपयोग,
और अब इस आदमी है, लगता है कि मैं केवल स्मृति के तीन ऐसे विखंडू चाहते हैं.
मुझे लगता है कि के माध्यम से एक रेखा खींचना, अशक्त का संकेत होगा.
वहाँ कोई अतिरिक्त चरित्र है.
>> वास्तव में, यह है कि हम कैसे लागू करने के बारे में जा सकते हैं
कुछ है कि एक लिंक सूची कहा जाता है.
एक लिंक सूची एक नया डेटा संरचना है, और यह एक कदम की ओर पत्थर
बहुत शौक़ीन डेटा संरचनाओं कि समस्याओं को हल करने के लिए शुरू
फेसबुक प्रकार की समस्याओं की लाइनों और Google प्रकार की समस्याओं के साथ
जहाँ आप विशाल डाटा सेट है, और यह अब यह कटौती
contiguously के लिए सब कुछ की दुकान और रैखिक खोज की तरह कुछ का उपयोग करें
या बाइनरी खोज की तरह कुछ भी.
तुम भी बेहतर चल बार करना चाहते हैं.
वास्तव में, एक पवित्र Grails हम बाद में इस सप्ताह या अगले के बारे में बात करेंगे
चल रहा है जिसका समय लगातार एक एल्गोरिथ्म है.
दूसरे शब्दों में, यह हमेशा से कोई फर्क नहीं पड़ता कि समय का एक ही राशि लेता है
कितना बड़ा इनपुट है, और कहा कि वास्तव में मजबूर हो जाएगा,
भी अधिक ताकि लघुगणक की तुलना में कुछ.
क्या स्क्रीन पर यह है कि यहाँ?
आयतों की प्रत्येक वास्तव में मैं क्या सिर्फ हाथ से आकर्षित किया है.
लेकिन बाईं तरफ सभी तरह बात एक विशेष चर रहा है.
यह करने के लिए एक एकल सूचक होने जा रहा है क्योंकि एक पकड़ लिया
एक लिंक सूची के साथ, के रूप में इन चीजों को कहा जाता है,
यह है कि आप लिंक की गई सूची के एक छोर पर लटका है.
>> बस एक तार के साथ पसंद है, तो आप पहले चार का पता जानना है.
लिंक सूचियों के लिए एक ही सौदा है.
आप स्मृति का पहला हिस्सा पता पता है
वहाँ से, क्योंकि आप हर एक दूसरे तक पहुँच सकते हैं.
नकारात्मक पहलू.
क्या कीमत हम एक गतिशील होने के इस बहुमुखी प्रतिभा के लिए भुगतान कर रहे हैं
बड़े आकार का डेटा संरचना है कि अगर हम कभी अधिक स्मृति की आवश्यकता है, ठीक है,
सिर्फ एक अधिक हिस्सा आवंटित और एक सूचक से आकर्षित
सूची के नए पूंछ करने के लिए पुराने?
हाँ.
[छात्र] के बारे में दो बार के रूप में ज्यादा जगह ले लेता है.
यह दो बार के रूप में बहुत जगह लेता है, तो है कि निश्चित रूप से एक नकारात्मक पहलू है, और हम यह देखा है
पहले समय और अंतरिक्ष और लचीलेपन के बीच tradeoff
जहां अब तक, हम इन नंबरों में से प्रत्येक के लिए 32 बिट की जरूरत नहीं है.
हम वास्तव में 64, संख्या के लिए 32 और 32 संकेतक के लिए की जरूरत है.
लेकिन हे, मैं राम का 2 गीगाबाइट है.
एक और 32 बिट यहाँ और यहाँ उनका कहना है कि एक सौदे की बड़ी नहीं लगती.
लेकिन बड़े डेटा सेट के लिए, यह निश्चित रूप से सचमुच दो बार के रूप में ज्यादा के लिए कहते हैं.
अब एक और नकारात्मक पक्ष क्या है, या हम क्या सुविधा देना नहीं है,
अगर हम एक लिंक सूची नहीं है और एक सरणी के साथ चीजों की सूची का प्रतिनिधित्व करते हैं?
[छात्र] आप इसे पीछे की ओर नहीं पार कर सकते हैं.
आप इसे पीछे की ओर नहीं पार कर सकते हैं तो, आप की तरह खराब कर रहे हैं यदि आप चल रहे हैं
बाएं से दाएं पाश या एक समय पाश के लिए एक का उपयोग करने के लिए
और फिर तुम्हें पता है, "ओह, मैं सूची की शुरुआत करने के लिए वापस जाना चाहता हूँ."
क्योंकि ये संकेत न केवल बाएं से दाएं जा सकते हैं के रूप में तीर से संकेत मिलता है.
>> अब, आप एक और चर के साथ सूची की शुरुआत याद कर सकता है,
लेकिन है कि एक जटिलता को ध्यान में रखना है.
एक सरणी, कोई फर्क नहीं पड़ता कि कितनी दूर तुम जाओ, तुम हमेशा ऋण, ऋण, ऋण, कर सकते हैं ऋण
और किस स्थान से आया से वापस जाओ.
एक अन्य पहलू यह यहाँ क्या है? हाँ.
[अश्राव्य छात्र प्रश्न]
तुम्हें पता है, तो आप वास्तव में सकता है बस एक डेटा युग्मबंधित सूची बुलाया संरचना का प्रस्ताव रखा है,
और वास्तव में, आप इन rectangles से प्रत्येक के लिए एक और सूचक जोड़ना होगा
जो की है कि दूसरी दिशा में चला जाता है, उल्टा
अब आप आगे और पीछे से पार कर सकते हैं,
के नकारात्मक पक्ष है जो अब आप बहुत स्मृति के रूप में कर रहे हैं तीन बार का उपयोग कर के रूप में हम करने के लिए इस्तेमाल किया
और भी कोड के मामले में जटिलता को जोड़ने आप के लिए यह सही करने के लिए लिखने के लिए है.
लेकिन इन सभी शायद बहुत ही उचित tradeoffs, अगर उत्क्रमण अधिक महत्वपूर्ण है.
हाँ.
[छात्र] तुम भी एक 2d लिंक्ड सूची नहीं हो सकता.
अच्छा, तुम सच में एक 2d लिंक सूची नहीं हो सकता है.
तुम सकता है. यह लगभग रूप में एक सरणी के रूप में आसान नहीं है.
एक सरणी की तरह, आप खुला ब्रैकेट, बंद ब्रैकेट, खुला कोष्ठक, कोष्ठक बंद कर दिया है,
और आप कुछ 2-dimensional संरचना मिलता है.
आप एक दो आयामी लिंक सूची लागू कर सकता है
अगर आप ऐड - के रूप में आप इन बातों में से प्रत्येक के लिए प्रस्तावित 3 सूचक,
और यदि आप एक और सूची के बारे में लगता है कि आप 3 डी शैली आ रहा
स्क्रीन से हम सभी के लिए है, जो सिर्फ कुछ तरह की एक और श्रृंखला है.
हम यह कर सकता है, लेकिन यह के रूप में खुले ब्रैकेट, वर्ग कोष्ठक टाइपिंग के रूप में सरल नहीं है. हाँ.
[अश्राव्य छात्र प्रश्न]
अच्छा, तो यह एक असली दंगेबाज है.
>> इन एल्गोरिदम है कि हम पर, ओह तरह, द्विआधारी खोज pined है,
आप बोर्ड पर संख्या की एक सरणी खोज कर सकते हैं
या एक फोन की किताब इतना अधिक जल्दी यदि आप उपयोग विभाजन और जीत
और एक द्विआधारी खोज एल्गोरिथ्म, लेकिन द्विआधारी खोज दो मान्यताओं की आवश्यकता है.
एक, कि डेटा को हल किया गया था.
अब, हम शायद इस हल रख सकते हैं,
इसलिए हो सकता है कि एक चिंता का विषय नहीं है, लेकिन द्विआधारी खोज भी ग्रहण
कि आप यादृच्छिक संख्याओं की सूची के लिए उपयोग किया था,
और एक सरणी आप यादृच्छिक उपयोग करने की अनुमति देता है, और बिना सोचे समझे,
मेरा मतलब है अगर आप एक सरणी दिया हो, यह आप कितना समय ले करता है
0 वर्ग के लिए मिलता है?
एक आपरेशन, तुम सिर्फ [0] का उपयोग करें और आप सही कर रहे हैं वहाँ.
कितने कदम यह करने के लिए 10 स्थान पर प्राप्त करने के लिए ले करता है?
एक कदम है, तो आप सिर्फ [10] के लिए जाना है और तुम वहाँ हो.
इसके विपरीत करके, आप एक लिंक सूची में 10 पूर्णांक के लिए कैसे मिलता है?
आप शुरुआत में शुरू कर दिया है क्योंकि आप केवल याद कर रहे हैं
एक लिंक सूची के एक स्ट्रिंग की तरह, बस शुरुआत याद किया जा रहा है
अपनी पहली चार के पते से, और कहा कि 10 int खोजने के लिए
या कि एक स्ट्रिंग में 10 चरित्र है, तो आप पूरे लानत बात की खोज की है.
>> फिर, हम हमारी समस्याओं का हल नहीं कर रहे हैं.
हम नए लोगों को शुरू कर रहे हैं, लेकिन यह वास्तव में क्या आप के लिए डिजाइन करने के लिए कोशिश कर रहे हैं पर निर्भर करता है.
इस को लागू करने के मामले में, हम उस छात्र संरचना से एक विचार ले सकते हैं.
वाक्यविन्यास बहुत ही इसी तरह की है, अब है, के अलावा, एक छोटे से विचार अधिक सार है
की तुलना में घर और नाम और आईडी.
लेकिन मैं प्रस्ताव करता हूं कि हम सी में एक डेटा संरचना हो सकता है
है कि नोड कहा जाता है के रूप में, स्लाइड पर अंतिम शब्द से पता चलता है,
एक नोड के अंदर और एक नोड सिर्फ कंप्यूटर विज्ञान के क्षेत्र में एक सामान्य कंटेनर है.
यह आमतौर पर एक वृत्त या एक वर्ग या आयत के रूप में हम किया है के रूप में तैयार की है.
और इस डेटा संरचना में, हम एक int n है,
ताकि संख्या मैं स्टोर करने के लिए करना चाहते हैं.
लेकिन इस दूसरी पंक्ति, संरचना नोड अगले * क्या है?
ऐसा क्यों सही है, या क्या भूमिका इस बात को खेलना है,
भले ही यह पहली नज़र में एक छोटे से गुप्त है?
हाँ.
[अश्राव्य छात्र प्रतिक्रिया]
वास्तव में, तो * लूट की तरह है कि यह किसी तरह का एक सूचक है.
इस सूचक का नाम मनमाने ढंग से अगले है,
लेकिन हम यह कहा जाता हो सकता है कुछ भी हम करना चाहते हैं, लेकिन इस सूचक बिंदु क्या करता है?
छात्र [] एक और नोड >> वास्तव में, यह एक और ऐसी नोड के लिए अंक.
>> अब, इस सी. जिज्ञासा की तरह है
याद है कि सी एक संकलक नीचे से ऊपर द्वारा पढ़ा जाता है, सही करने के लिए छोड़ दिया है,
जिसका मतलब है अगर यह एक छोटे से अलग हम छात्र के साथ क्या किया है.
जब हम एक छात्र को परिभाषित करते हैं, हम वास्तव में एक शब्द नहीं डाल दिया है.
यह सिर्फ typedef कहा.
तो फिर हम int आईडी, स्ट्रिंग नाम, स्ट्रिंग घर था,
और फिर struct के तल पर छात्र.
इस घोषणा के एक छोटे से अलग है, क्योंकि
फिर, सी संकलक एक छोटे से गूंगा है.
यह केवल ऊपर से नीचे पढ़ने के लिए जा रहा है,
यदि ऐसा है तो यह 2 लाइन यहाँ तक पहुँचता है
जहां अगले घोषित किया है और यह देखता है, ओह, यहाँ एक अगले चर बुलाया है.
यह एक struct नोड के लिए एक संकेत है.
संकलक एहसास क्या एक struct नोड के लिए जा रहा है?
मैं इस बात की पहले कभी नहीं सुना है,
क्योंकि शब्द नोड अन्यथा दिखाई नहीं दे सकते
नीचे जब तक है, इसलिए वहाँ इस अतिरेक है.
आप struct नोड यहाँ कहना है, जो तुम तो बाद में कम कर सकते हैं
क्योंकि यहाँ नीचे typedef करने के लिए धन्यवाद, लेकिन यह है
हम संरचना संरचना के अंदर खुद को संदर्भित कर रहे हैं.
कि वहाँ एक से पकड़ लिया है.
>> कुछ दिलचस्प है कि समस्याओं को पैदा करने के लिए जा रहे हैं.
हम संख्याओं की एक सूची मिल गया है. कैसे हम इसे में सम्मिलित करते हैं?
हम यह खोज कैसे करूँ? हम इसे कैसे हटाऊं?
विशेष रूप से अब है कि हम इन सभी संकेत के प्रबंधन है.
तुमने सोचा संकेत दिमाग झुकने की तरह थे
जब आप एक था उनमें से सिर्फ यह एक int पढ़ने की कोशिश कर रहा है.
अब हम एक पूरी सूची की कीमत में हेरफेर की है.
हम हमारे 5 मिनट का ब्रेक क्यों नहीं ले यहाँ, और फिर हम लाती हूँ
मंच पर कुछ लोगों को लगता है कि ठीक करने के लिए.
>> सी बहुत अधिक मज़ा जब यह बाहर काम किया है.
जो सचमुच पहले होना चाहते हैं?
ठीक है, पर आते हैं. आप पहली बार कर रहे हैं.
कौन से 9 होना चाहते हैं? ठीक है, 9.
9 के बारे में कैसे? 17?
थोड़ा यहाँ गुट. 22 और 26 कि सामने की पंक्ति में है.
और फिर वहाँ पर किसी के बारे में बताया जा रहा है.
आप 34 कर रहे हैं. ठीक है, पर 34, आते हैं.
पहले वहाँ पर है. ठीक है, आप सभी लोगों के चार.
और हम जो 9 के लिए कहा था?
9 हमारे कौन है?
कौन सच में 9 होना चाहता है? सब ठीक है, पर आते हैं, 9 हो.
यहाँ हम चले.
34, हम आपको मिलने वहाँ हूँ.
पहले भाग कर अपने आप को इस तरह देखना है.
26, 22, 17, अच्छा है.
यदि आप ओर करने के लिए खड़ा है, क्योंकि हम तुम्हें एक पल में malloc जा रहे हैं कर सकते हैं.
>> अच्छा, अच्छा.
ठीक है, बहुत ही अच्छे हैं, तो चलो सवालों की एक जोड़ी यहाँ पूछना.
और वास्तव में, तुम्हारा नाम क्या है >> अनीता?.
अनीता, ठीक है, यहाँ पर आ जाओ.
अनीता मदद हमें सॉर्ट के एक 1 में काफी सरल सवाल को हल करने के लिए जा रहा है,
जो आप कैसे पता है या नहीं, एक मूल्य सूची में है?
अब सूचना है कि 1, लुकास द्वारा यहाँ का प्रतिनिधित्व
एक छोटे से अलग है, और इसलिए कागज का टुकड़ा अपने जानबूझ बग़ल में है
क्योंकि यह काफी लंबा नहीं है और कई टुकड़े के रूप में नहीं ले करता है,
भले ही तकनीकी रूप से वह कागज के एक ही आकार सिर्फ घुमाया है.
लेकिन वह एक छोटे से अलग है कि वह एक संकेतक के लिए केवल 32 बिट है,
और इन लोगों के सभी 64 बिट, जिनमें से आधे की संख्या है, जिनमें से आधे एक सूचक है.
लेकिन सूचक चित्रित, नहीं है, इसलिए तुम लोगों को कुछ हद तक awkwardly सकता है अगर
अपने बाएँ हाथ का उपयोग करने के लिए आप अगले व्यक्ति में बात करने के लिए.
और आप संख्या 34 हो. आपका नाम क्या है?
अरी.
अरी, तो वास्तव में, अपने दाहिने हाथ में कागज पकड़ है, और बाएं हाथ सीधे नीचे चला जाता है.
आप बाईं तरफ अशक्त का प्रतिनिधित्व करते हैं.
>> अब हमारे मानव चित्र बहुत अनुरूप है.
यह वास्तव में है कि कैसे संकेत काम.
और अगर आप एक छोटा सा इस तरह कुचलना तो मैं अपने रास्ते में नहीं कर रहा हूँ.
यहाँ अनीता, मुझे 22 नंबर मिल,
लेकिन पकड़ नहीं मनुष्य कागज के टुकड़े की एक बाधा मान,
लेकिन यह एक सूची है, और आप केवल लुकास के साथ शुरू करने के लिए है
क्योंकि वह सचमुच पहली सूचक है.
आपको लगता है कि अपने आप को एक सूचक हैं, और इसलिए आप भी कुछ पर बात करने की क्षमता है.
आप वास्तव में क्या लुकास पर इशारा कर रहा है ओर इशारा करते हुए क्यों नहीं शुरू करते?
अच्छा चलो, और मुझे यहाँ पर इस बाहर अधिनियमित.
सिर्फ चर्चा के लिए, मुझे एक खाली पृष्ठ यहाँ खींच.
आप अपना नाम कैसे जादू >> अनीता?.
ठीक है, अनीता.
चलो नोड * अनीता = लुकास कहते हैं.
खैर, हम आपको लुकास नहीं बुलाना चाहिए. हम आपको पहले बुलाना चाहिए.
यहाँ वास्तविकता के अनुरूप वास्तव में ऐसा क्यों होता है?
एक, 1 पहले से ही मौजूद है.
पहले संभाव्यतः आवंटित किया गया है कहीं ऊपर यहाँ.
नोड 1, और यह एक सूची गया है किसी भी तरह आवंटित.
मैं नहीं जानता कि कैसे हुआ. हुआ है कि पहले वर्ग शुरू कर दिया है.
इंसानों की इस लिंक की गई सूची को बनाया गया है.
और अब बाद कहानी यह सब फेसबुक पर जाहिरा तौर पर जाने में इस बिंदु पर
कहानी में इस बिंदु पर, अनीता 1 के बराबर हो गया है initialized किया गया है,
जो लुकास में अनीता कहते हैं कि इसका मतलब यह नहीं है.
बल्कि, वह वह क्या में अंक में अंक
क्योंकि एक ही पते कि लुकास के 32 बिट के अंदर है - 1, 2, 3 -
अब भी अनीता 32 बिट के अंदर - 1, 2, 3.
>> अब 22 पाते हैं. आप ऐसा करने के बारे में कैसे जाना होगा?
क्या है कि जो कुछ भी करने के लिए? >> प्वाइंट.
जो कुछ भी करने के लिए इंगित करें, बहुत आगे जाना है और यह कार्य के रूप में सबसे अच्छा तुम यहाँ कर सकते हैं.
अच्छा, अच्छा, और अब आप इशारा कर रहे हैं पर 22 के साथ अपना नाम क्या है?
तो Ramon. >> Ramon, रेमन 22 पकड़ रहा है.
अब आप एक चेक किया है.
क्या Ramon 22 ==, और अगर ऐसा है, उदाहरण के लिए, हम सच लौट सकते हैं.
मुझे, जबकि इन लोगों को यहाँ कुछ awkwardly खड़े
मुझे कुछ bool की तरह जल्दी से कर पाते हैं.
मुझे आगे जाना है और कहने जा रहा हूँ (नोड * सूची, int n).
मैं तुम लोगों के साथ वापस हो जाएगा. मैं बस कुछ कोड लिखने के लिए है.
और अब मैं आगे जाना है और इस, नोड * अनीता = सूची करने जा रहा हूँ.
और मुझे आगे जाना है और कहने जा रहा हूँ जबकि (अनीता = NULL!).
>> रूपक यहाँ एक छोटे से फैला रही है, लेकिन जबकि (अनीता = NULL!), मैं क्या करना चाहते हो?
मैं संदर्भित करने के कुछ तरीके की जरूरत है
पूर्णांक है कि अनीता पर इशारा कर रहा है.
अतीत में, जब हम संरचनाओं था, जो एक नोड है
हम डॉट संकेतन प्रयोग किया जाता है, और हम कुछ ऐसा कहना होगा
anita.n, लेकिन यहाँ समस्या यह है कि अनीता एक struct प्रति से नहीं है.
वह क्या है?
वह एक सूचक है, तो वास्तव में, अगर हम इस डॉट का उपयोग करना चाहते हैं अंकन
और इस के लिए जानबूझकर एक छोटा सा लग रहा है गुप्त
हम जो कुछ भी अनीता के बाएं हाथ के लिए जाने की तरह कुछ करना है पर इशारा कर रहा है
और तब पता क्षेत्र कहा जाता मिलता है.
अनीता एक सूचक है, लेकिन अनीता * क्या है?
क्या तुम जब अनीता क्या इशारा कर रहा है के लिए जाने के लिए मिल रहा है?
एक struct, एक नोड, और एक नोड याद है, एक n क्षेत्र कहा जाता है
क्योंकि यह याद है, इन 2 क्षेत्रों, अगले और n,
कि हम एक पल पहले सही यहाँ देखा.
>> वास्तव में कोड में यह नकल है,
हम यह कर सकते हैं और कह सकते हैं अगर ((* अनीता) n == n) n है कि मैं देख रहा हूँ.
सूचना है कि मैं संख्या के बारे में परवाह है समारोह में पारित किया गया था.
तो मैं आगे जाना है और क्या कर सकते हैं वापसी की तरह कुछ सच.
वरना, कि अगर मामला नहीं है, तो मैं क्या करना चाहते हो?
मैं कोड अनीता सूची के माध्यम से चलने से क्या इतना intuitively किया कैसे अनुवाद करते हैं?
क्या मैं यहाँ अनीता बाईं कि कदम लेने के लिए, बाईं ओर उस कदम का अनुकरण करना चाहिए?
[अश्राव्य छात्र प्रतिक्रिया] >> वह क्या है?
[अश्राव्य छात्र प्रतिक्रिया]
अच्छा, बुरा विचार नहीं है, लेकिन अतीत में, जब हम इस किया है, हम किया है अनीता + +
क्योंकि कि अनीता के लिए नंबर 1 जोड़ना होगा,
जो आम तौर पर अगले व्यक्ति को Ramon तरह होगा बिंदु,
या उसके बगल में, व्यक्ति या उसे रेखा से नीचे व्यक्ति अगले.
लेकिन यह है कि यहां काफी अच्छा नहीं है, क्योंकि इस बात को क्या स्मृति में की तरह दिखता है?
ऐसा नहीं है कि. हम चाहते हैं कि निष्क्रिय कर दिया है.
यह स्मृति में इस तरह दिखता है, और भले ही मैं 1 और 2 और 3 एक दूसरे के करीब तैयार है,
यदि हम वास्तव में अनुकरण तुम लोगों को इस कर सकते हैं, जबकि अभी भी एक ही लोगों को इशारा,
आप में से कुछ एक यादृच्छिक कदम वापस, आप में से एक यादृच्छिक कदम आगे कुछ ले जा सकते हैं?
>> इस गंदगी को अभी भी एक लिंक सूची है,
लेकिन इन लोगों को स्मृति में कहीं भी हो सकता है,
इतना अनीता + + काम क्यों नहीं जा रहा है?
स्थान अनीता में क्या है + +?
कौन जानता है.
यह कुछ अन्य मूल्य है कि सिर्फ इतना interposed होना होता है
मौका द्वारा इन नोड्स के सब के बीच, क्योंकि हम एक सरणी का उपयोग नहीं कर रहे हैं.
हम इन नोड्स के प्रत्येक व्यक्तिगत आवंटित.
ठीक है, अगर तुम लोगों को अपने आप को साफ करने के लिए वापस कर सकते हैं.
मुझे प्रस्ताव है कि अनीता + +, हम बजाय अनीता के बजाय हो जाता है -
ठीक है, क्यों हम जो भी अनीता पर इशारा कर रहा है के लिए नहीं जाना है और फिर अगली?
दूसरे शब्दों में, हम Ramon, जो 22 नंबर धारण करने के लिए जाना है,
और फिर अगले है के रूप में हालांकि अनीता उसके बाएं हाथ सूचक नकल किया जाएगा.
लेकिन वह Ramon की तुलना में आगे नहीं जाना है क्योंकि हम 22 पाया.
लेकिन यह है कि विचार किया जाएगा. अब, यह एक फालतू गड़बड़ है.
ईमानदारी से, कोई भी कभी भी इस वाक्यविन्यास याद होगा, और शुक्र
यह वास्तव में एक छोटे से जानबूझकर ओह, आप वास्तव में मैं क्या लिखा नहीं देखा था.
यह अधिक सम्मोहक हो अगर तुम सकता है. देखा!
>> परदे के पीछे, मैं समस्या इस तरह से हल किया गया था.
अनिता, करने के लिए छोड़ दिया करने के लिए कदम उठाने के लिए,
1, हम पता करने के लिए जाना है कि अनीता पर इशारा कर रहा है
और जहां वह न केवल पता है, जो हम सिर्फ तुलना खातिर के लिए जाँच मिल जाएगा,
इस मामले में, लेकिन आप भी अगले मिल जाएगा
Ramon के बाएं हाथ की सूची में अगले नोड की ओर इशारा करते.
लेकिन यह फालतू गड़बड़ करने के लिए जो मैंने पहले संदर्भित किया जाता है,
लेकिन यह निकलता सी देता है हमें इस सरल.
लिखने के बजाय (अनीता *), हम बजाय सिर्फ अनीता n> लिख सकते हैं,
और यह कार्यात्मक सटीक एक ही बात है, लेकिन यह एक बहुत अधिक सहज है,
और यह एक बहुत अधिक चित्र के साथ संगत है कि हम ड्राइंग किया गया है
यह सब समय के तीर का उपयोग कर.
>> अन्त में, हम क्या इस कार्यक्रम के अंत में करने की क्या ज़रूरत है?
शेष कोड की एक पंक्ति है.
क्या?
झूठा है, क्योंकि अगर हम पूरे के माध्यम से मिलता है, जबकि पाश
और अनीता है, वास्तव में, अशक्त, इसका मतलब है कि वह सूची के अंत करने के लिए सभी तरह से चला गया
जहां वह इशारा कर रहा था - तुम्हारा नाम क्या है फिर?
अरी >>. अरी बाएं हाथ है, जो शून्य है.
अनीता अब अशक्त है, और मुझे पता है तुम बस यहाँ खड़े कर रहे हैं, अधर में लटकी awkwardly
क्योंकि मैं यहाँ एक एकालाप पर जा रहा हूँ,
लेकिन हम आपको सिर्फ एक पल में फिर से शामिल होगा.
अनीता कहानी में उस बिंदु पर रिक्त है तो, जबकि पाश terminates,
और हम वापसी झूठी है क्योंकि अगर वह तीव्र श्वसन संक्रमण के शून्य सूचक के लिए सभी तरह मिला
तो कोई संख्या है कि वह सूची में मांगी थी.
हम यह भी साफ कर सकते हैं, लेकिन यह एक बहुत अच्छा कार्यान्वयन है तो
एक चंक्रमण समारोह के एक लिंक सूची के लिए एक कार्य लगता है.
यह अभी भी रैखिक खोज है, लेकिन यह + + एक संकेत के रूप में आसान नहीं है
या + + एक मैं चर क्योंकि अब हम नहीं लगता है कि कर सकते हैं
जहां इन नोड्स के प्रत्येक स्मृति में हैं.
हम सचमुच breadcrumbs की राह का अनुसरण करने के लिए है, या अधिक विशेष रूप से,
संकेत, एक नोड से दूसरे को पाने के.
>> अब चलो एक और कोशिश. अनीता, आप यहाँ वापस आना चाहते हो?
हम आगे क्यों नहीं जाना है और दर्शकों से एक अन्य व्यक्ति को आवंटित?
Malloc - तुम्हारा नाम क्या है? >> रेबेका.
रेबेका. रेबेका दर्शकों से malloced गया है,
और वह अब 55 नंबर भंडारण है.
और अब हाथ में लक्ष्य के लिए अनीता डालने के लिए
अपनी उचित जगह में लिंक यहाँ की सूची में रेबेका.
यहाँ पर एक पल के लिए आओ.
मैं कुछ इस तरह किया है.
मैं नोड * किया है. और तुम्हारा नाम क्या है फिर?
रेबेका. >> रेबेका, ठीक है.
रेबेका malloc (sizeof (नोड)) हो जाता है.
वैसे ही जैसे हम अतीत में छात्रों और whatnot की तरह बातें आवंटित किया है,
हम नोड के आकार की जरूरत है, तो अब रेबेका
पर क्या इशारा है?
रेबेका उसके अंदर दो क्षेत्रों, जिनमें से एक 55 है.
चलो क्या करना है, रेबेका> = 55.
लेकिन फिर रेबेका> अगले सही अब की तरह होना चाहिए, उसके हाथ कौन जानता है की तरह है?
यह कुछ कचरा मूल्य पर इशारा कर रहा है, तो अच्छे उपाय के लिए क्यों नहीं
हम कम से कम यह इतना है कि बाएं हाथ अब उसके पक्ष में है.
अब अनिता, इसे यहाँ से ले.
आप रेबेका आवंटित किया गया है.
आगे बढ़ो और पाते हैं जहां हम रेबेका रखा जाना चाहिए.
अच्छा, बहुत अच्छा.
ठीक है, अच्छा है, और अब हम आप दिशा की एक बिट प्रदान करने के लिए की जरूरत है,
ताकि आप अरी पहुँच चुके हैं.
उसका बायां हाथ रिक्त है, लेकिन रेबेका स्पष्ट रूप से सही है,
इसलिए हम इस लिंक की गई सूची में परिवर्तन के लिए है
क्रम में रेबेका उपयुक्त जगह में सम्मिलित करने के लिए?
यदि आप सचमुच के रूप में की जरूरत है लोगों के बाएँ हाथ के आसपास स्थानांतरित कर सकता है,
हम समस्या यह है कि जिस तरह से तय करेंगे.
अच्छा, अच्छा है, और इस बीच, रेबेका बाएं हाथ उसकी तरफ से अब है.
>> यह बहुत आसान था.
चलो कोशिश का आवंटन - हम लगभग पूरा हो चुका है, 20.
ठीक है, पर आते हैं.
20 आवंटित किया गया है, तो मुझे आगे जाना है और फिर यहाँ का कहना है
हम सिर्फ नोड * saad किया है.
हम malloc (sizeof (नोड)).
हम तो एक ही सटीक सिंटैक्स के रूप में हम पहले 20 के लिए किया था,
और मैं अगले = रिक्त करने के लिए, और अब उसने अनिता पर निर्भर है
आप लिंक की गई सूची में सम्मिलित करने के लिए, अगर आपको लगता है कि सटीक एक ही भूमिका निभा सकता है.
चलाएँ.
ठीक है, अच्छा है.
अब ध्यान से लगता है कि इससे पहले कि आप बाएँ हाथ के चारों ओर बढ़ शुरू.
आप आज के द्वारा अब तक के सबसे अजीब भूमिका मिली.
हाथ किसका पहले स्थानांतरित किया जाना चाहिए?
ठीक है, रुको, मैं कुछ नहीं सुन रहा हूँ.
यदि कुछ लोगों को विनम्रता यहाँ एक अजीब स्थिति को हल करने में मदद करना चाहते हैं.
किसका बाएं हाथ 1 शायद अद्यतन किया जाना चाहिए? हाँ.
[छात्र] साद है.
ठीक है, साद, क्यों, हालांकि?
[अश्राव्य छात्र प्रतिक्रिया]
अच्छा है, क्योंकि अगर हम कदम - तुम्हारा नाम क्या है? >> मार्शल.
मार्शल, अगर हम अपने हाथ 1 नीचे स्थानांतरित करने के लिए अशक्त,
अब हम सचमुच इस सूची में चार लोगों के अनाथ
क्योंकि वह Ramon और बाईं करने के लिए हर किसी पर ही बात की ओर इशारा करते हुए था,
इतना है कि सूचक 1 अद्यतन बुरा था.
चलो कि किए हुए कार्य को भ्रष्ट कर देना.
अच्छा है, और अब आगे जाना है और उपयुक्त छोड़ दिया रेमन पर ओर इशारा करते हुए हाथ आगे.
यह एक छोटे से निरर्थक लगता है.
अब वहाँ रेमन पर ओर इशारा करते हुए दो लोगों को है, लेकिन वह ठीक है
क्योंकि अब और कैसे हम सूची अपडेट करूँ?
दूसरी ओर क्या कदम है?
बहुत बढ़िया, अब हम किसी भी याददाश्त खो दिया है?
नहीं है, तो अच्छा है, चलो देखते हैं अगर हम यह अधिक एक बार नहीं तोड़ सकते.
>> एक आखिरी बार 5 संख्या Mallocing.
पीठ में सभी तरह, नीचे आ.
यह बहुत ही रोमांचक है.
[वाहवाही]
आपका नाम क्या है? >> रॉन.
रॉन, ठीक है, आप नंबर 5 के रूप में malloced कर रहे हैं.
हम सिर्फ कोड निष्पादित किया है कि लगभग इन करने के लिए समान है
सिर्फ एक अलग नाम के साथ.
बहुत बढ़िया.
अब, अनीता, अच्छी किस्मत की सूची में 5 संख्या अब डालने.
अच्छा है, और?
बहुत बढ़िया, तो यह वास्तव में तीन कुल मामलों में से 3 है.
हम अंत में पहली बार किसी को था, रेबेका.
हम तो किसी के बीच में था.
अब हम शुरुआत में, और इस उदाहरण में किसी को है,
अब हम पहली बार के लिए लुकास अद्यतन करने के लिए किया था
क्योंकि सूची में पहला तत्व अब एक नया नोड में बात करने के लिए है,
जो, बारी में, नोड संख्या 9 पर इशारा कर रहा है.
>> यह एक बेहद अजीब प्रदर्शन था, मुझे यकीन है,
इसलिए इन लोगों के लिए एक प्रशंसा का एक बड़ा दौर अगर तुम सकता है.
अच्छी तरह से किया.
यही सब है. आप एक छोटी सी स्मृति के रूप में कागज के टुकड़े रख सकते हैं.
यह पता चला है कि कोड में इस कर
काफी के रूप में बस के चारों ओर हाथ आगे बढ़ के रूप में सरल नहीं है
और विभिन्न चीजों पर संकेत की ओर इशारा करते हुए.
लेकिन पता है कि जब यह की तरह कुछ को लागू करने के लिए समय आता है
एक लिंक सूची या यह का एक संस्करण है अगर तुम सच में पर ध्यान केंद्रित
इन बुनियादी सिद्धांतों, काटने के आकार मैं समस्याओं का पता लगाने की है,
यह इस हाथ या हाथ का एहसास है कि जो अन्यथा एक कार्यक्रम काफी जटिल है
कर सकते हैं, वास्तव में, इस तरह काफी सरल इमारत ब्लॉकों को कम किया जा.
>> चलो एक अधिक परिष्कृत दिशा में चीजें अभी भी ले.
अब हम लिंक सूची की धारणा है.
हम यह भी सुझाव वापस वहाँ एक युग्मबंधित सूची है, धन्यवाद,
जो लगभग एक ही लग रहा है, लेकिन अब हम struct के अंदर दो संकेत है
एक के स्थान पर है, और हम शायद उन संकेत पिछले और अगले कह सकते हैं
या छोड़ दिया है या सही, लेकिन हम वास्तव में नहीं करते हैं, उनमें से दो की जरूरत है.
कोड एक छोटे से शामिल होगा.
अनीता मंच पर और अधिक काम करना पड़ा होगा.
लेकिन हम निश्चित रूप से संरचना की है कि तरह लागू कर सकता है.
समय चल रहा है के मामले में, हालांकि, क्या चल रहा है समय होगा
एक लिंक सूची में अब एक संख्या n ढूँढने के लिए अनीता के लिए?
N के अभी भी बड़ा हे, तो यह कोई रैखिक खोज की तुलना में बेहतर है.
हम द्विआधारी खोज नहीं करते हैं, हालांकि, फिर से कर सकते हैं.
मामला है कि क्यों था? आप के आसपास नहीं कूद कर सकते हैं.
हालांकि हम स्पष्ट रूप से मंच पर सभी मनुष्यों को देखने के लिए,
और अनीता eyeballed यह हो सकता है और कहा, "यहाँ सूची के बीच है,"
वह है कि नहीं पता है अगर वह कंप्यूटर प्रोग्राम थे
क्योंकि केवल एक चीज है वह था पर परिदृश्य के शुरू में कड़ी
लुकास, जो 1 सूचक था.
वह जरूरी उन लिंक्स का पालन करना होगा,
उसे जिस तरह से गिनती जब तक वह लगभग बीच पाया,
और फिर भी, वह पता करने के लिए जब वह मध्य तक पहुँच चुकी है नहीं जा रहा है
जब तक वह अंत तक सभी तरह जाता करने के लिए बाहर निकालने के कितने वहाँ रहे हैं,
backtracks कि तब और भी मुश्किल हो सकता है जब तक आप था
किसी प्रकार की एक युग्मबंधित सूची.
>> कुछ समस्याओं को सुलझाने में आज है, लेकिन दूसरों को शुरू करने.
एक अलग डेटा संरचना पूरी तरह के बारे में क्या?
यह माथर हाउस में ट्रे की एक तस्वीर है,
और इस मामले में, हम एक डेटा संरचना हम भी की तरह पहले से ही किया गया है के बारे में बात कर रही है.
हम स्मृति के संदर्भ में एक ढेर के बारे में बात की थी,
और उस तरह का जानबूझकर नाम है क्योंकि स्मृति के मामले में एक ढेर
प्रभावी ढंग से एक डेटा संरचना है कि अधिक से अधिक यह की चोटी पर स्तरित सामान है.
लेकिन एक ढेर के बारे में दिलचस्प बात यह है, के रूप में वास्तव में मामला है,
यह है कि यह आंकड़ा संरचना का एक विशेष प्रकार का है.
यह एक आंकड़ा संरचना है जिससे में पहला तत्व
पिछले तत्व है.
यदि आप 1 के ढेर पर रखा जा ट्रे,
आप दुर्भाग्य से पिछले बंद ढेर लिया जा ट्रे हो जा रहे हैं,
और कहा कि एक अच्छी बात यह जरूरी नहीं है.
इसके विपरीत, आप इसके बारे में आसपास के अन्य तरीके से सोच सकते हैं,
में पिछले 1 बाहर है.
>> अब, किसी भी परिदृश्यों जहां एक ढेर होने मन में आते हो
डेटा संरचना जहां आपको लगता है कि संपत्ति है
में, 1 बाहर पिछले वास्तव में मजबूर है?
कि एक अच्छी बात है? यह है कि एक बुरी बात है?
यह निश्चित रूप से एक बुरी बात है अगर ट्रे सभी समान नहीं थे
और वे सभी विशेष अलग अलग रंग या whatnot थे,
और रंग आप चाहते हैं नीचे सभी तरह है.
बेशक, आपको लगता है कि बहुत प्रयास के बिना नहीं प्राप्त कर सकते हैं.
आप ऊपर से शुरू करने के लिए और अपने रास्ते नीचे काम है.
इसी तरह, अगर आप एक इन लड़कों के प्रशंसक थे
जो सभी के लिए एक iPhone और लाइनों को पाने के लिए कोशिश कर रहा रात इंतजार कर रहा है
इस तरह एक जगह पर?
अच्छा नहीं होगा अगर एप्पल स्टोर
एक ढेर डेटा संरचना थे?
याय? अस्वीकार?
यह पिछले संभव क्षण में ही लोग हैं, जो दिखाने के लिए अच्छा है
और फिर से कतार plucked.
और वास्तव में, तथ्य यह है कि मैं बहुत इच्छुक था कतार कहने के लिए
वास्तव में हम क्या डेटा संरचना के इस तरह के कॉल के साथ संगत है,
वास्तविकता में जहां आदेश बात करता है एक,
और आप में पहली बार एक 1 एक होने के लिए बाहर करना चाहते हैं
केवल अगर मानव निष्पक्षता की खातिर.
हम आम तौर पर एक कतार डेटा संरचना है कि फोन करता हूँ.
>> यह पता चला है लिंक सूचियों के अलावा, हम इन ही बुनियादी विचारों का उपयोग शुरू कर सकते हैं
और समस्याओं के समाधान के लिए नए और अलग अलग प्रकार के निर्माण शुरू करते हैं.
उदाहरण के लिए, एक ढेर के मामले में, हम एक ढेर का प्रतिनिधित्व कर सकता है
इस तरह से एक डेटा संरचना का उपयोग कर, मैं प्रस्ताव होगा.
इस मामले में, मैं एक struct घोषित किया है, और मैं इस संरचना के अंदर कहा है
संख्या की एक सरणी और फिर एक चर आकार बुलाया है,
और मैं इस बात को एक ढेर कॉल करने के लिए जा रहा हूँ.
अब, क्यों यह वास्तव में काम करता है?
एक ढेर के मामले में, मैं एक सरणी के रूप में स्क्रीन पर इस प्रभावी ढंग से आकर्षित कर सकता है.
यहाँ मेरी ढेर है. उन लोगों के लिए मेरा नंबर हैं.
और हम उन्हें इस रूप में आकर्षित, यह हूँ, यह, यह, यह.
और फिर मैं कुछ अन्य डेटा सदस्य यहाँ है,
जो आकार में कहा जाता है, तो यह आकार है, और इस संख्या है,
और सामूहिक, यहाँ पूरी iPad एक ढेर संरचना का प्रतिनिधित्व करता है.
अब, डिफ़ॉल्ट रूप से, आकार संभाव्यतः 0 प्रारंभ किया जा मिला है,
और क्या संख्याओं की सरणी के अंदर शुरू
जब मैं पहली बार एक सरणी आवंटित?
कचरा. कौन जानता है? और यह वास्तव में कोई फर्क नहीं पड़ता.
यह बात अगर यह 1, 2, 3, 4, 5 नहीं है, पूरी तरह से बेतरतीब ढंग से
बुरा मेरे संरचना में संग्रहीत भाग्य की वजह से इतने लंबे समय के रूप में मुझे पता है कि ढेर के आकार
0 है, तो मैं प्रोग्राम पता है, सरणी में तत्वों की किसी में नहीं लग रहे हो.
यह बात नहीं है कि वहाँ क्या है.
उन पर नहीं लग रही है, के रूप में 0 के आकार के निहितार्थ होगा.
>> लेकिन अब लगता है कि मैं आगे जाना है और ढेर में कुछ डालने.
मैं 5 संख्या सम्मिलित करना चाहते हैं, तो मैं 5 संख्या यहाँ डाल,
और फिर मैं क्या नीचे यहाँ रखा है?
अब मैं वास्तव में नीचे आकार के लिए 1 डाल दिया,
और अब ढेर 1 आकार के है.
क्या होगा यदि मैं आगे जाना है और संख्या में डालने, चलो कहते हैं कि, अगले 7?
यह तो 2 से अद्यतन किया जाता है, और फिर हम 9 करूँगा,
और फिर इस 3 से अद्यतन किया जाता है.
लेकिन इस स्टैक का दिलचस्प विशेषता यह है कि
मैं अगर मैं पॉप करने के लिए करना चाहते हैं जो तत्व निकालने वाला हूँ
ढेर से दूर कुछ है, तो बात करने के लिए?
9 पहली बात करने के लिए जाना होगा.
तस्वीर अगर मैं के ढेर से एक तत्व पॉप चाहते कैसे बदलना चाहिए,
ज्यादा माथर में एक ट्रे की तरह?
हाँ >> 2 [छात्र] आकार सेट.
वास्तव में, सब मैं कर आकार 2 के लिए सेट कर दिया जाता है, और मैं सरणी के साथ क्या करते हैं?
मैं कुछ भी करने के लिए नहीं है.
मैं, बस गुदा हो सकता है वहाँ एक 0 या -1 या कुछ को दर्शाता है डाल
कि यह एक कानूनी मूल्य नहीं है, लेकिन यह बात नहीं है, क्योंकि
मैं सरणी ही कितनी देर तक यह है की बाहर रिकॉर्ड कर सकते हैं
इतना है कि मैं जानता हूँ कि केवल इस सरणी में पहले दो तत्वों को देखो.
अब, अगर मैं जाने के लिए और इस सरणी के लिए 8 नंबर जोड़, कैसे चित्र अगले परिवर्तन करता है?
यह 8 हो जाता है, और यह 3 हो जाता है.
मैं कुछ कोनों यहाँ काट रहा हूँ.
अब हम 5, 7, 8, और हम 3 के एक आकार के लिए वापस आ गए हैं.
यह सुंदर को लागू करने के लिए आसान है,
लेकिन जब हम इस डिजाइन निर्णय पर पछतावा करने के लिए जा रहे हैं?
बातें करने के लिए बहुत, बहुत गलत जाना शुरू कर दिया? हाँ.
[अश्राव्य छात्र प्रतिक्रिया]
जब आप वापस जाओ और पहला तत्व आप अंदर डाल चाहते
>> यह पता चला है कि भले ही एक ढेर हुड के नीचे एक सरणी है,
इन डेटा संरचनाओं हम के बारे में बात करना शुरू कर दिया है भी आम तौर पर कर रहे हैं के रूप में जाना जाता है
सार डेटा संरचनाओं जिससे वे कैसे कार्यान्वित कर रहे हैं
बिंदु के अलावा पूरी तरह से है.
एक ढेर की तरह डेटा संरचना के लिए समर्थन जोड़ने के लिए माना जाता है
धक्का है, जो ढेर पर एक ट्रे धक्का तरह संचालन,
और पॉप, जो ढेर से एक तत्व को हटा, और यह बात है.
यदि आप डाउनलोड करने के लिए किसी और के कोड है जो पहले से ही लागू करने के लिए गए थे
इस बात को एक ढेर कहा जाता है, उस व्यक्ति को लिखा होगा
आप के लिए केवल दो कार्यों को धक्का और पॉप, जिनका एकमात्र उद्देश्य जीवन में
ठीक करने के लिए होगा.
आप या उसे या उसके जो कि कार्यक्रम लागू
पूरी तरह से तय कैसे लागू करने के लिए एक हो गया होता
धक्का और हुड के नीचे popping के शब्दों
या धक्का और popping की कार्यक्षमता.
और मैं कुछ हद तक एक अदूरदर्शा निर्णय यहाँ बना दिया है
इस सरल डेटा संरचना के साथ मेरी ढेर को लागू करने से?
जब यह आंकड़ा संरचना तोड़ करता है?
किस बिंदु पर मैं एक त्रुटि वापस जब उपयोगकर्ता धक्का कॉल, उदाहरण के लिए है?
[छात्र] अगर कोई और अधिक स्थान है.
वास्तव में, अगर वहाँ कोई और अधिक जगह है, अगर मैं क्षमता को पार कर दिया है,
जो सभी टोपियां है क्योंकि यह पता चलता है कि यह वैश्विक निरंतर के कुछ प्रकार है.
ठीक है, तो मैं बस के लिए जा रहा हूँ करने के लिए कहते हैं, "माफ करना, मैं एक और मूल्य धक्का नहीं कर सकते
ढेर पर ज्यादा है, "माथर में पसंद है.
>> कुछ बिंदु पर, वे उस छोटे से कैबिनेट के शीर्ष भाग को हिट करने के लिए जा रहे हैं.
वहाँ कोई और अधिक या ढेर में अंतरिक्ष क्षमता है, जो बिंदु पर वहाँ त्रुटि के कुछ प्रकार है.
वे तत्व कहीं और रखा है, ट्रे कहीं और,
या कहीं सब पर.
अब, एक कतार के साथ, हम यह थोड़ा अलग तरह लागू कर सकता है.
एक कतार में थोड़ी अलग है कि हुड के नीचे, इसे लागू किया जा सकता है
एक सरणी के रूप में है, लेकिन क्यों, इस मामले में, मैं प्रस्ताव कर रहा हूँ
करने के लिए भी एक सूची के सिर सिर का प्रतिनिधित्व तत्व है,
सूची के सामने, एप्पल की दुकान पर लाइन में 1 व्यक्ति आकार के अलावा?
मैं डेटा की एक अतिरिक्त टुकड़ा यहाँ क्यों की जरूरत है?
क्या नंबर है वापस सोचो
अगर मैं तैयार किया है यह इस प्रकार है.
मान लीजिए कि यह अब एक ढेर के बजाय एक कतार है,
एप्पल स्टोर कतार की तरह किया जा रहा सिर्फ अंतर उचित है.
सूची के शुरू में लाइन में पहले व्यक्ति, इस मामले में नंबर 5,
वह या वह दुकान में जाने की पहली बार जा रहा है.
चलो कि करना.
मान लीजिए कि यह इस समय मेरी कतार के राज्य में समय है, और अब एप्पल स्टोर
खोलता है और 1 व्यक्ति, संख्या 5, दुकान में नेतृत्व किया है.
कैसे मैं तस्वीर अब बदलने के लिए है कि मैं पहले व्यक्ति कतार
लाइन के सामने?
वह क्या है? >> [छात्र] कतार बदलें.
सिर बदलें, तो 5 से गायब हो जाता है.
वास्तव में, यह रूप में हालांकि सबसे अच्छा कैसे यह करने के लिए?
वास्तव में, यह है हालांकि इस आदमी के रूप में गायब हो जाता है.
7 संख्या एक वास्तविक स्टोर में क्या करना होगा?
वे एक बड़ा कदम आगे ले जाएगा.
>> लेकिन क्या हम सराहना करते आए हैं जब यह arrays के लिए आता है
और आस पास बातें चलती हैं?
यह अपने समय की बर्बादी की तरह है, सही?
आप इतना गुदा होना क्यों है के रूप में 1 व्यक्ति
शारीरिक रूप से स्मृति का हिस्सा के शुरू में पंक्ति के प्रारंभ में?
यह पूरी तरह अनावश्यक है. क्यों?
क्या मैं सिर्फ बजाय याद कर सकता है? >> [अश्राव्य छात्र प्रतिक्रिया]
वास्तव में, मैं सिर्फ इस अतिरिक्त डेटा सदस्य सिर के साथ याद कर सकता
सूची के सिर कि अब नहीं रह गया है 0 है, जो इसे एक पल पहले था.
अब यह वास्तव में एक संख्या है. इस तरह, मैं एक मामूली अनुकूलन मिलता है.
सिर्फ इसलिए कि मैं है पंक्ति के प्रारंभ में एप्पल स्टोर पर लाइन से किसी डे पंक्तिबद्ध
मतलब नहीं है कि हर किसी के लिए पाली, जो एक रेखीय आपरेशन याद है.
मैं बजाय निरंतर समय ही खर्च कर सकते हैं
और फिर एक बहुत तेजी से प्रतिक्रिया प्राप्त करने के.
लेकिन कीमत मैं दे रहा हूँ क्या है कि अतिरिक्त प्रदर्शन हासिल करने के लिए
कर रहे हैं और नहीं के लिए हर किसी बदलाव?
हाँ >> [अश्राव्य छात्र प्रतिक्रिया]
और अधिक लोगों को जोड़ सकते हैं, ठीक है, कि समस्या orthogonal है
तथ्य यह है कि हम लोगों के आसपास नहीं जा रहे हैं.
यह अभी भी एक सरणी है, तो या नहीं, हम सब बदलाव या नहीं
ओह, मैं तुम्हें क्या मतलब है, ठीक है.
असल में, मैं तुम क्या कह रहे है कि हालांकि यह लगभग रूप में के साथ सहमत
अब हम जा रहे हैं इस सरणी की शुरुआत अब उपयोग नहीं
क्योंकि अगर मैं 5 हटाने के लिए है, तो मैं 7 हटा दें.
लेकिन मैं सिर्फ सही करने के लिए लोगों को रखा.
>> ऐसा लगता है जैसे मैं अंतरिक्ष बर्बाद कर रहा हूँ लगता है, और अंततः मेरे कतार कुछ भी नहीं में विखंडित
तो हम सिर्फ लोगों wraparound हो सकता है,
और हम इस सरणी के परिपत्र संरचना के कुछ प्रकार के रूप में वास्तव में सोच सकता है,
लेकिन हम क्या सी में ऑपरेटर का उपयोग करने के लिए wraparound का है कि तरह करते हैं?
[अश्राव्य छात्र प्रतिक्रिया] >> modulo ऑपरेटर.
यह एक छोटे से परेशान हो के माध्यम से लगता है कि कैसे आप wraparound करते हो,
लेकिन हम यह करते हैं, और हम क्या लाइन के सामने थे पर लोगों का उत्साह शुरू कर सकता है,
लेकिन हम सिर्फ इस सिर चर लाइन की वास्तविक सिर जो वास्तव में है के साथ याद है.
क्या होगा अगर, बजाय हालांकि, अंत में हमारे लक्ष्य,
ऊपर की संख्या देखने के लिए गया था, के रूप में हम अनीता के साथ मंच पर यहाँ था,
लेकिन हम वास्तव में इन सभी को संसार का सबसे अच्छा करना चाहते हैं?
हम अधिक परिष्कार से सरणी की अनुमति देता है चाहते हैं
क्योंकि हम गतिशील डेटा संरचना को विकसित करने की क्षमता चाहते हैं.
लेकिन हम करने के लिए कुछ करने के लिए सहारा है कि हम बाहर कहा है नहीं करना चाहती
पहला व्याख्यान में एक इष्टतम एल्गोरिथ्म नहीं था,
रैखिक खोज की है.
यह पता चला है कि आप वास्तव में प्राप्त कर सकते हैं
या कम से कम लगातार समय के लिए बंद करने के लिए, जिससे अनीता की तरह किसी को,
अगर वह अपने डेटा संरचना कॉन्फ़िगर नहीं होने के लिए एक लिंक सूची,
एक ढेर नहीं हो, नहीं एक कतार है, वास्तव में हो सकता है,
एक डेटा संरचना है कि उसे चीजों को देखने के लिए अनुमति देता है के साथ आते हैं,
भी शब्द, संख्या ही नहीं, क्या हम लगातार फोन करता हूँ.
>> और वास्तव में, आगे देख रहे हैं, एक इस वर्ग में psets के लगभग हमेशा
जिससे एक spellchecker का कार्यान्वयन,
हम आपको फिर से दे कुछ 150.000 अंग्रेजी शब्दों और लक्ष्य के लिए है
स्मृति में उन लोगों को लोड करने के लिए और तेजी से फार्म के सवालों के जवाब देने में सक्षम हो
इस शब्द की वर्तनी सही है?
और यह वास्तव में अगर आप सभी 150.000 शब्दों के माध्यम से पुनरावृति करने के लिए जवाब है कि चूसना होगा.
लेकिन, वास्तव में, हम देखेंगे कि हम इसे बहुत, बहुत जल्दी समय में कर सकते हैं.
और यह एक हैश तालिका को लागू करने बुलाया कुछ शामिल हो रहा है,
और यहां तक ​​कि पहली नज़र में इस बात के लिए एक हैश तालिका बुलाया जा रहा है
हमें प्राप्त इन सुपर तेजी से प्रतिक्रिया समय,
यह पता चला है कि वहाँ वास्तव में एक समस्या है.
जब यह करने के लिए इस बात को फिर से बुलाया को लागू करने के लिए समय आता है, मैं इसे फिर से कर रहा हूँ.
मैं यहाँ सिर्फ एक हूँ.
जब यह आता है, इस बात को लागू करने के लिए समय एक हैश तालिका कहा जाता है,
हम करने के लिए एक निर्णय करना है करने के लिए जा रहे हैं.
कितना बड़ा इस बात वास्तव में होना चाहिए?
और जब हम इस हैश तालिका में डालने संख्या शुरू,
हम उन्हें इस तरह से स्टोर करने जा रहे हैं
कि हम उन्हें वापस पाने के लिए बाहर कर सकते हैं के रूप में जल्दी के रूप में हम उन्हें में मिल गया?
लेकिन हम लंबे समय से पहले देखेंगे कि इस प्रश्न
जब हर किसी के जन्मदिन कक्षा में काफी सार्थक होगा.
यह पता चला है कि इस कमरे में, हम कुछ सौ लोगों को मिला है,
बाधाओं इतना है कि हम दोनों एक ही जन्मदिन शायद बहुत अधिक है.
क्या होगा अगर वहाँ इस कमरे में हम में से केवल 40 थे?
दो लोगों को ही जन्मदिन होने के हालात क्या हैं?
[छात्र] 50% से अधिक.
हाँ, 50% से अधिक. वास्तव में, मैं भी एक चार्ट लाया.
यह पता बदल जाता है और यह वास्तव में सिर्फ एक पूर्वावलोकन चुपके है
अगर वहाँ केवल इस कमरे में हम में से 58 है, हम में से 2 की संभावना
एक ही जन्मदिन बेहद उच्च है, लगभग 100%,
और कहा कि हमारे लिए बुधवार को एक चोट की एक पूरी गुच्छा के कारण हो रहा है.
>> साथ उस ने कहा, यहाँ स्थगित. हम बुधवार को देखेंगे.
[वाहवाही]
[CS50.TV]