[Powered by Google Translate] [4 सप्ताह]
[डेविड जे Malan] [हार्वर्ड विश्वविद्यालय]
[यह CS50 है.] [CS50.TV]
>> ठीक है, यह CS50 है, और यह 4 सप्ताह की शुरुआत है,
और यह एक धीमी संभव छँटाई एल्गोरिदम की है.
जो एक यह है कि हम सिर्फ वहाँ देखा था?
बुलबुला तरह था, क्रम में बड़ा हे (एन ^ 2) राशि +
और वास्तव में हम इस दुनिया में ही लोगों को पता करने के लिए नहीं लगते हैं
क्या बुलबुला तरह है या अपने समय चल रहा है.
वास्तव में, यह गूगल के एरिक श्मिट के साथ एक साक्षात्कार किया गया था
और पूर्व सीनेटर बराक ओबामा अभी कुछ साल पहले.
>> अब, सीनेटर, आप गूगल पर यहाँ कर रहे हैं,
और मैं एक नौकरी के साक्षात्कार के रूप में राष्ट्रपति पद के बारे में सोचना अच्छा लगता है.
अब, यह राष्ट्रपति के रूप में एक नौकरी मिल मुश्किल है, और आप अब कठोरता के माध्यम से जा रहे हैं.
यह भी गूगल पर एक नौकरी पाने के लिए मुश्किल है.
हम प्रश्न हैं, और हम अपने उम्मीदवारों सवालों पूछते हैं,
और इस एक लैरी Schwimmer से है.
आप लोगों को लगता है कि मैं मज़ाक कर रहा हूँ? यह यहीं पर है.
के लिए एक लाख 32 बिट पूर्णांक तरह सबसे कुशल तरीका क्या है?
[हँसी]
अच्छी तरह से
मैं माफी चाहता >> हूँ. नहीं, नहीं, नहीं, नहीं.
मुझे लगता है कि बुलबुला तरह गलत रास्ता तय करना होगा.
>> चलो, जो उसे यह बताया था?
पिछले हफ्ते याद है हम कम से कम एक दिन के लिए कोड से एक ब्रेक ले लिया,
और कुछ उच्च स्तर के विचारों को और अधिक आम तौर पर समस्या को सुलझाने पर ध्यान केंद्रित करना शुरू कर दिया है
खोज और छँटाई के संदर्भ में,
और हम कुछ है कि हम पिछले हफ्ते पर इस नाम थप्पड़ नहीं था शुरू की है,
लेकिन उपगामी संकेतन, बिग हे, बिग ओमेगा,
और कभी कभी बिग थीटा संकेतन, और इन बस तरीके थे
एल्गोरिदम के समय चल रहा है का वर्णन करने के,
कितना समय यह एक एल्गोरिथ्म को चलाने के लिए लेता है.
>> और आप कि आप समय चल रहा है के बारे में बात की थी आकार के संदर्भ में याद कर सकते हैं
इनपुट, जो हम आम तौर पर पता फोन है, जो भी समस्या हो सकता है की,
जहां n कमरे में लोगों की संख्या है,
एक फोन की किताब में पृष्ठों की संख्या है, और हम बातें लिखने से बाहर करने के लिए शुरू
हे की तरह, (n ^ 2) या हे (एन) या हे (n लॉग एन)
और यहां तक ​​कि जब गणित काफी बाहर काम नहीं किया, तो पूरी तरह से
और यह पता था ² n / 2 या उस तरह कुछ
हम बजाय सिर्फ निचले क्रम शर्तों के कुछ दूर फेंक देना होगा,
और प्रेरणा है कि हम वास्तव में चाहते हैं
के मूल्यांकन के के उद्देश्य तरह की तरह
कार्यक्रमों के निष्पादन या एल्गोरिदम के प्रदर्शन
कि दिन के अंत में करने के लिए कुछ भी नहीं है, उदाहरण के लिए,
आपके कंप्यूटर की गति के साथ आज.
>> उदाहरण के लिए, यदि आप बुलबुला तरह लागू करने के लिए,
या आप आज के कंप्यूटर पर तरह का या चयन छंटाई मर्ज को लागू करने के लिए,
एक 2 गीगा कंप्यूटर, और आप इसे चलाने के लिए,
और यह सेकंड के कुछ नंबर लेता है, अगले साल वहाँ एक 3 गीगा
या एक 4 गीगा कंप्यूटर, और आप तो है कि "वाह, मेरे एल्गोरिथ्म दावा कर सकते हैं
अब दो बार उपवास के रूप में है, "जब वास्तविकता में है कि स्पष्ट रूप से मामला नहीं है.
यह सिर्फ हार्डवेयर तेजी से हो गया है, लेकिन अपने कंप्यूटर
है और इसलिए नहीं है, हम वास्तव में दूर की तरह बातें फेंक करना चाहते हैं
2 के गुणकों या 3 के गुणकों जब यह वर्णन करने के लिए आता है
कितनी तेजी से या कैसे धीमी गति से एक एल्गोरिथ्म है और वास्तव में सिर्फ ध्यान
n या कुछ तत्संबंधी कारक पर,
उसके कुछ बिजली के रूप में पिछले सप्ताह से एक तरह के मामले में.
और मर्ज तरह की मदद के साथ याद करते हैं
हम इतना बुलबुला तरह और चयन छंटाई की तुलना में बेहतर करने के लिए सक्षम थे
और यहां तक ​​कि प्रविष्टि तरह.
>> हम n लॉग एन के लिए नीचे मिला, और फिर,
याद है कि लॉग n आम तौर पर कुछ है कि बढ़ता को संदर्भित करता है
अधिक धीरे धीरे फिर n है, तो n लॉग n इस प्रकार अब तक अच्छा था
क्योंकि यह कम से कम n ² था.
लेकिन प्राप्त n करने के लिए मर्ज प्रकार के साथ n लॉग इन
एक विचार है कि हम का लाभ उठाने के लिए किया था की बुनियादी रोगाणु क्या था
कि हम भी 0 सप्ताह में वापस leveraged?
हम छँटाई समस्या कैसे बड़ी चतुराई से निपटने मर्ज प्रकार के साथ?
क्या महत्वपूर्ण अंतर्दृष्टि शायद था?
किसी को भी सब पर.
ठीक है, चलो एक कदम वापस ले.
अपने खुद के शब्दों में तरह मर्ज का वर्णन करें.
यह कैसे काम किया है?
ठीक है, हम वापस सप्ताह 0 पंक्ति हूँ.
ठीक है, हाँ.
[अश्राव्य छात्र]
ठीक है, अच्छा है, इसलिए हम 2 टुकड़ों में संख्याओं की सरणी में विभाजित है.
हम उन टुकड़ों में से प्रत्येक पर छाँटा है, और फिर हम उन्हें विलय कर दिया,
और हम इस विचार से पहले देखा है की एक समस्या यह है कि इस बड़े ले
और यह एक समस्या यह है कि इस बड़े या इस बड़े में काट.
>> फोन की किताब उदाहरण याद.
स्वयं गिनती सप्ताह पहले से एल्गोरिथ्म याद,
इतना मर्ज तरह इस pseudocode से यहाँ संक्षेप किया गया था.
जब आप n तत्वों दिया रहे हैं, पहले यह था मानसिक स्वास्थ्य की जांच.
यदि n <2 तो सभी में कुछ भी नहीं करते हैं
क्योंकि अगर n <2 फिर n 0 या 1 जाहिर है,
और यदि ऐसा है तो यह या तो 0 या 1 सॉर्ट करने के लिए कुछ भी नहीं है.
तुम कर रहे हैं.
अपनी सूची में पहले से ही तुच्छता हल है.
लेकिन अन्यथा यदि आप 2 या अधिक तत्वों मिल गया है आगे जाओ और उन्हें विभाजित
2 हिस्सों में, बाएँ और दाएँ.
उन हिस्सों में से प्रत्येक सॉर्ट करने के लिए, और फिर क्रमबद्ध halves विलय.
लेकिन यहाँ समस्या यह है कि पहली नज़र में यह लगता है जैसे हम punting रहे हैं.
यह उस में एक परिपत्र परिभाषा है अगर मैं आप से पूछा है इन n तत्वों तरह
और आप मुझे कह रहे हैं "ठीक है, ठीक है, हम उन तत्वों n / 2 और उन n / 2 सुलझा लेंगे"
तो मेरा अगला सवाल हो जा रहा है "ठीक है, तुम कैसे n / 2 तत्वों तरह है?"
>> लेकिन इस कार्यक्रम की संरचना की वजह से,
क्योंकि वहाँ इस आधार का मामला है, तो बात है,
इस विशेष मामले में कहते हैं कि यदि n 2 वापसी की तरह कुछ निश्चित मूल्य <तुरंत.
कि एक ही परिपत्र जवाब के साथ जवाब मत करो.
इस प्रक्रिया, इस cyclicity अंततः खत्म हो जाएगा.
अगर मैं तुम्हें "क्रमबद्ध इन n तत्वों," पूछना है और आप कहते हैं, "ठीक है, इन n / 2 सॉर्ट करने के लिए,"
तो आप कहते हैं, "ठीक है, की तरह इन n / 4, 8 / n, n/16,"
अंत में आप एक बड़ा पर्याप्त संख्या से विभाजित करेंगे
जो बिंदु पर आप कह सकते हैं कि आप सिर्फ 1 तत्व बाईं हूँ,
"यहाँ, यहाँ एक क्रमबद्ध एक तत्व है."
तो इस एल्गोरिथ्म की प्रतिभा को यहाँ इस तथ्य से प्राप्त है
कि एक बार आप इन व्यक्तिगत क्रमबद्ध सूचियों के सभी है,
जो सभी के 1 आकार, जो बेकार हो रहा है,
एक बार आप उन्हें विलय और उन्हें विलय शुरू
आप अंत में निर्माण के रूप में में रोब वीडियो एक अंततः क्रमबद्ध सूची में किया था.
>> लेकिन इस विचार छँटाई परे फैली हुई है.
इस विचार recursion के रूप में जाना जाता है इस कार्यक्रम में एम्बेडेड है,
विचार है जिससे आप एक कार्यक्रम कर रहे हैं,
और कुछ समस्या आप अपने फोन को हल करने के लिए,
या आप एक समारोह कर रहे हैं प्रोग्रामिंग भाषाओं के संदर्भ में डाल दिया,
और आदेश में एक समस्या को हल करने के लिए, आप अपने आप समारोह कॉल
फिर से और फिर, लेकिन आप समारोह
असीम रूप से कई बार फोन नहीं खुद कर सकते हैं.
अंततः तुम बाहर नीचे करने के लिए है, तो बात है,
और कुछ आधार हार्ड कोडित शर्त है कि कहते हैं,
इस बिंदु पर अपने आप को इतना फोन बंद है कि पूरी प्रक्रिया
अंत में वास्तव में रोक नहीं है.
यह वास्तव में क्या recurse करने के लिए क्या मतलब है?
>> चलो देखते हैं, अगर हम एक सरल, तुच्छ उदाहरण के साथ कहते हैं, क्या कर सकते हैं,
यहाँ मंच पर मेरे साथ 3 लोगों को, अगर कोई सहज है.
1, 2, और 3 पर आते हैं.
अगर आप 3 करने के लिए यहाँ आने के लिए करना चाहते हैं.
यदि आप मेरे लिए सही बगल में एक लाइन में खड़ा करना चाहते हैं, लगता है कि हाथ में समस्या
बहुत तुच्छता से लोग हैं, जो यहाँ की संख्या गिनती.
लेकिन स्पष्ट रूप से, मैं इन सभी की गिनती उदाहरण के थक गया हूँ.
यह कुछ समय, 1, 2, और डॉट, डॉट, डॉट ले जा रहा है.
यह हमेशा के लिए ले जा रहा है.
मैं नहीं बल्कि सिर्फ मदद के साथ इस समस्या को पूरी तरह बाज़ी - तुम्हारा नाम क्या है? था
सारा. >> सारा, सब ठीक है.
केली >> केली और?
>> विली >> विली, सारा, केली, और विली.
अभी मैं किसी के द्वारा किया गया है प्रश्न पूछा
कितने लोगों को इस स्तर पर कर रहे हैं, और मुझे पता नहीं है.
यह एक बहुत लंबी सूची है, और इसलिए बजाय मैं इस चाल के लिए जा रहा हूँ.
मैं काम के सबसे करने के लिए मेरे लिए अगले व्यक्ति को पूछने के लिए जा रहा हूँ,
और एक बार वह काम के सबसे कर किया जाता है
मैं काम करने के कम से कम राशि संभव करने के लिए जा रहा हूँ और बस 1 जोड़ने
जो कुछ भी उसका जवाब है, तो यहाँ हम चले.
मुझे कहा गया है कि कितने लोगों को मंच पर हैं.
कितने लोगों को मंच पर आप की बाईं के लिए कर रहे हैं?
>> मुझे के छोड़ दिया है? ठीक है, लेकिन धोखा नहीं है.
यह अच्छी बात है, यह सही है, लेकिन अगर हम इस तर्क को जारी रखना चाहते हैं
चलो मान लेते हैं कि आप इसी तरह इस समस्या की बाईं बाज़ी के लिए करना चाहते हैं,
तो जवाब के बजाय सीधे आगे जाना है और सिर्फ पैसा देने.
ओह, कितने लोगों को मुझे छोड़ दिया करने के लिए कर रहे हैं?
कितने लोगों को छोड़ दिया करने के लिए कर रहे हैं?
1.
[हँसी]
ठीक है, तो 0, तो अब क्या विली किया है
आप अपने जवाब इस दिशा 0 कह लौटा दिया है.
अब, तुम क्या >> 1? करना चाहिए.
सब ठीक है, ठीक है, तो आप एक कर रहे हैं, तो आप कह "मैं 1 जोड़ने के लिए जा रहा हूँ
विली गिनती था, "इसलिए एक 0 + जो भी हो.
अब आप कर रहे हैं 1 इसलिए अपने अधिकार के लिए जवाब है अब
1. >> मेरा और 2 होगा.
अच्छा, तो तुम 1 के पिछले जवाब ले जा रहे हैं,
जोड़ने के काम की न्यूनतम राशि है जो आप करना चाहते हैं, जो एक है.
अब आप 2 है, और आप तो मुझे मूल्य जो हाथ?
3, मेरा मतलब है, माफ करना, 2.
अच्छा है.
>> खैर, हम छोड़ दिया करने के लिए 0 था.
फिर हम 1 था, और फिर हम 2 जोड़ने के,
और अब आप मुझे 2 संख्या सौंप रहे हैं,
और इसलिए मैं कह रहा हूँ, ठीक है, एक, 3.
वहाँ वास्तव में 3 लोगों को इस मंच पर मेरे बगल में खड़ा है,
तो हम स्पष्ट रूप से यह हो सकता है बहुत रैखिक से किया,
स्पष्ट फैशन में बहुत ज्यादा है, लेकिन क्या हम वास्तव में क्या किया?
हम 3 आकार के एक समस्या शुरू लिया.
हम तो यह 2 आकार की एक समस्या में टूट गया,
फिर 1 आकार की एक समस्या है, और फिर अंत में आधार के मामले
वास्तव में था, ओह, वहां कोई नहीं है,
पर जो बात विली प्रभावी रूप से एक हार्ड कोडित जवाब समय की एक जोड़ी लौटे,
और दूसरा एक तो ऊपर bubbled bubbled किया गया था, ऊपर bubbled,
और तब से यह एक अतिरिक्त 1 में जोड़ने
हम recursion की इस मूल विचार को क्रियान्वित किया है.
>> अब, इस मामले में यह वास्तव में एक समस्या नहीं हल किया
किसी भी और अधिक प्रभावी ढंग से तो हम इस प्रकार अब तक देखा है.
लेकिन एल्गोरिदम हम मंच पर इस प्रकार दूर किया है के बारे में सोचते हैं.
हम चॉकबोर्ड पर कागज के 8 टुकड़े था,
वीडियो पर जब शॉन नंबर 7 के लिए देख रहा था, और क्या वह वास्तव में क्या किया?
खैर, वह विभाजन के किसी भी तरह नहीं करना था और जीत के लिए.
वह recursion की किसी भी तरह नहीं किया.
बल्कि वह सिर्फ इस रैखिक एल्गोरिथ्म किया.
लेकिन जब हम मंच पर क्रमबद्ध संख्या के विचार की शुरुआत पिछले सप्ताह जीने
फिर हम बीच करने के लिए जा रहा है की इस वृत्ति था,
जो बिंदु पर हम 4 आकार या 4 आकार की एक सूची की एक छोटी सूची था,
और फिर हम सटीक एक ही समस्या थी, तो हम दोहराया, कई बार दोहराया.
दूसरे शब्दों में, हम recursed.
हमारे 3 स्वयंसेवकों के लिए आपको बहुत बहुत हमारे साथ recursion का प्रदर्शन करने के लिए धन्यवाद.
>> चलो देखते हैं अगर हम यह नहीं अब एक छोटे से अधिक ठोस कर सकते हैं,
एक समस्या यह है कि फिर से हम बहुत आसानी से कर सकता को हल,
लेकिन हम इसे इस मूल विचार को लागू करने के लिए एक कदम पत्थर के रूप में इस्तेमाल करेंगे.
अगर मैं संख्या का एक गुच्छा के योग की गणना करने के लिए करना चाहते हैं,
उदाहरण के लिए, अगर आप 3 संख्या में पारित,
मैं आप 3 सिग्मा के मूल्य देना चाहता हूँ,
तो 3 का योग 2 + 1 + 0 +.
मैं वापस 6 जवाब प्राप्त करना चाहते हैं,
इसलिए हम इस सिग्मा समारोह, इस समेशन समारोह लागू करेंगे
कि, फिर से, इनपुट में लेता है, और फिर समेशन रिटर्न
उस नंबर के नीचे 0 से रास्ता.
हम यह बहुत आसानी से कर सकता है, है ना?
हम पाशन संरचना के कुछ प्रकार के साथ यह कर सकता है,
तो मुझे आगे जाना है और यह शुरू कर दिया.
>> Stdio.h शामिल करें.
मुझे अपने आप को मुख्य में पाने के लिए यहाँ के साथ काम.
चलो sigma.c के रूप में बचाने के लिए.
तो मैं यहाँ में जाने के लिए जा रहा हूँ, और मैं एक int n की घोषणा करने के लिए जा रहा हूँ,
और मैं निम्नलिखित करने की जबकि उपयोगकर्ता सहयोग नहीं करने के लिए जा रहा हूँ.
जबकि उपयोगकर्ता मुझे एक सकारात्मक संख्या नहीं दिया है
मुझे आगे जाना है और उन्हें n = GetInt के लिए संकेत करने के लिए,
और मुझे उन्हें क्या करना है के रूप में कुछ निर्देश दे,
अब printf ("सकारात्मक पूर्णांक कृपया").
बस इस तरह अपेक्षाकृत सरल तो कुछ उस समय तक हम 14 लाइन मारा
अब हम n में एक सकारात्मक पूर्णांक संभाव्यतः है.
>> अब इसके साथ कुछ करना है.
मुझे आगे जाना है और समेशन की गणना करने के लिए, तो int राशि = सिग्मा (एन).
सिग्मा बस संकलन, इसलिए मैं सिर्फ शौक़ीन रास्ते में यह लेखन कर रहा हूँ.
हम सिर्फ यह वहाँ सिग्मा फोन करता हूँ.
वह राशि है, और अब मैं बाहर परिणाम मुद्रित जा रहा हूँ,
printf (राशि है, "योग% d, \ n").
और फिर मैं अच्छे उपाय के लिए 0 वापस कर देंगे.
हम दिलचस्प हिस्सा के अलावा सब कुछ किया है कि इस कार्यक्रम की आवश्यकता है,
जो वास्तव में सिग्मा समारोह को लागू करने के लिए है.
>> मुझे यहाँ नीचे नीचे करने के लिए जाने के लिए और मुझे समारोह सिग्मा घोषित.
यह एक चर कि प्रकार पूर्णांक के ले गया है,
और क्या डेटा प्रकार मैं सिग्मा से शायद वापस करना चाहते हैं?
Int, क्योंकि मैं यह 15 लाइन पर मेरी उम्मीदों से मिलान करने के लिए करना चाहते हैं.
यहाँ मुझे आगे जाना है और इस को लागू करने
एक बहुत ही सरल तरीके में.
>> चलो आगे जाओ और int राशि = 0 कहना,
और अब मैं पाश के लिए एक छोटे से यहाँ है जाने के लिए जा रहा हूँ
कि इस तरह से कुछ कहने जा रहा है,
के लिए (int i = 0, मैं <= संख्या, मैं + +) राशि + i =.
और फिर मैं राशि वापस जा रहा हूँ.
मैं किसी भी तरीके की संख्या में यह लागू किया जा सकता है.
मैं एक समय पाश इस्तेमाल किया जा सकता है.
मैं योग चर का उपयोग अगर मैं सच में चाहता था छोड़ दिया सकता है,
लेकिन संक्षेप में, हम सिर्फ एक समारोह में कहा कि अगर मैं नहीं था मूर्ख वाणी योग 0 है.
तो यह 0 से नंबर के माध्यम से दोहराता है,
और योग करने के लिए प्रत्येक यात्रा पर यह कहते हैं कि वर्तमान मूल्य और फिर राशि देता है.
>> अब, वहाँ एक मामूली अनुकूलन यहाँ है.
यह शायद एक बेकार कदम है, लेकिन ऐसा ही होगा. यह ठीक है अब के लिए.
हम कम से कम पूरी तरह से किया जा रहा है और ऊपर पर 0 सभी रास्ते पर जा रहे हैं.
नहीं बहुत कठिन है और बहुत सीधा है,
लेकिन यह पता चला है कि सिग्मा समारोह के साथ हम एक ही मौका है
के रूप में हम मंच पर यहाँ था.
मंच पर हम सिर्फ गिनता है कि कितने लोगों को मेरे बगल में थे,
लेकिन इसके बजाय अगर हम 3 + 1 + 2 संख्या गिनती करना चाहता था
0 नीचे पर हम एक समारोह के लिए इसी तरह बाज़ी
कि मैं बजाय पुनरावर्ती होने के रूप में वर्णन करेंगे.
यहाँ एक त्वरित विवेक और सुनिश्चित करें कि मैं मूर्ख नहीं था.
>> मैं जानता हूँ कि इस कार्यक्रम में कम से कम एक बात यह है कि मैं गलत क्या किया है.
जब मैं हिट दर्ज करें मैं मुझ पर चिल्ला के किसी भी प्रकार प्राप्त करने के लिए जा रहा हूँ?
मैं क्या करने के बारे में चिल्लाया जा रहा हूँ?
हाँ, मैं प्रोटोटाइप भूल गया तो, मैं 15 लाइन पर सिग्मा बुलाया समारोह का उपयोग कर रहा हूँ,
लेकिन यह 22 लाइन तक घोषित नहीं किया है, तो मैं सबसे अच्छा लगातार यहाँ जाना
और एक प्रोटोटाइप की घोषणा, और मैं कहता हूँ int सिग्मा (int संख्या), और यह बात है.
यह नीचे में कार्यान्वित किया है.
>> या किसी अन्य तरह से मैं इस को हल कर सकता है,
मैं वहाँ ऊपर समारोह में ले जाने के लिए, जो बुरा नहीं है हो सकता है,
लेकिन कम से कम जब अपने कार्यक्रमों के लिए लंबे समय स्पष्ट रूप से शुरू करते हैं,
मुझे लगता है कि वहाँ हमेशा शीर्ष पर मुख्य होने में कुछ मूल्य है
इतना है कि आप रीडर में फ़ाइल खोलने के लिए और फिर तुरंत देखने के कर सकते हैं
क्या कार्यक्रम के माध्यम से यह खोज करने के लिए बिना कर रही है
कि मुख्य समारोह के लिए देख रहे हैं.
चलो मेरे टर्मिनल विंडो के लिए यहाँ नीचे जाना, सिग्मा सिग्मा बनाने की कोशिश,
और मैं यहाँ भी खराब कर दिया है.
समारोह GetInt के निहित घोषणा का मतलब है मैं और क्या करने के लिए भूल गए हैं?
[अश्राव्य छात्र]
अच्छा, तो जाहिरा तौर पर एक आम गलती है, तो हम इस यहाँ डाल,
cs50.h, और अब मेरे टर्मिनल विंडो में वापस जाना है.
>> मैं स्क्रीन को साफ कर देंगे, और मैं सिग्मा बनाने फिर से दौड़ना होगा.
यह संकलित किया है लगता है. मुझे अब सिग्मा चलाने.
मैं 3 संख्या में टाइप करें, और मैं 6 मिला, तो एक कठोर चेक नहीं,
लेकिन कम से कम यह पहली नज़र में काम किया जा रहा है, लेकिन अब हम इसे अलावा चीर,
और हम वास्तव में recursion की फिर से विचार का लाभ उठाने,
इतना है कि एक बहुत ही सरल संदर्भ में कुछ सप्ताह का समय में
जब हम arrays की तुलना शौक़ीन डेटा संरचनाओं की खोज शुरू
हम Toolkit में एक और उपकरण के साथ करने के लिए जो किया है
उन डेटा संरचनाओं में हेरफेर के रूप में हम देखेंगे.
यह दृष्टिकोण चलने पाश आधारित दृष्टिकोण है.
>> मुझे बजाय अब यह करना है.
मुझे बजाय कहते हैं कि संख्या के योग
नीचे 0 करने के लिए वास्तव में के रूप में एक ही बात है
+ संख्या सिग्मा (संख्या - 1).
दूसरे शब्दों में, मंच पर बस की तरह मैं मेरे बगल में लोगों में से प्रत्येक के लिए punted
और वे बदले में जब तक हम अंततः विली पर बाहर तली punting रखा,
जो 0 की तरह एक हार्ड कोडित जवाब लौटना पड़ा.
अब यहाँ हम इसी तरह सिग्मा punting रहे हैं
एक ही समारोह के रूप में मूल बुलाया गया था, लेकिन महत्वपूर्ण अंतर्दृष्टि यहाँ
यह है कि हम सिग्मा हूबहू नहीं बुला रहे हैं.
हम n में नहीं गुजर रहे हैं.
हम स्पष्ट रूप से संख्या में गुजर रहे हैं - 1,
तो एक थोड़ा छोटे समस्या, थोड़ा छोटा समस्या.
>> दुर्भाग्य से, यह काफी एक समाधान अभी तक नहीं है, और इससे पहले कि हम तय
स्पष्ट रूप में बाहर हो सकता है आप में से कुछ पर कूद
मुझे आगे जाने के लिए और फिर से दौड़ना.
यह ठीक संकलन लगता है.
मुझे साथ 6 सिग्मा फिर से दौड़ना.
वूप्स, मुझे साथ 6 सिग्मा फिर से दौड़ना.
हमने यह देखा है पहले, हालांकि गलती से पिछली बार के रूप में अच्छी तरह से.
मैं इस गुप्त विभाजन गलती क्यों मिला? हाँ.
[अश्राव्य छात्र]
वहाँ कोई आधार मामला है, और अधिक विशेष रूप से, शायद क्या हुआ?
यह क्या व्यवहार का एक लक्षण है?
यह थोड़ा जोर से कहो.
[अश्राव्य छात्र]
यह एक अनंत पाश प्रभावी ढंग से, और अनंत loops के साथ समस्या है
जब वे इस मामले में recursion शामिल है, एक समारोह ही बुला रहा था,
क्या हर बार जब आप एक समारोह फोन होता है?
खैर, कैसे हम एक कंप्यूटर में स्मृति रखी वापस लगता है.
हम ने कहा कि स्मृति के इस हिस्सा ढेर है कि नीचे बुलाया है,
और हर बार जब आप एक समारोह में एक छोटे से अधिक स्मृति फोन डाल दिया जाता है
इस तथाकथित कि समारोह स्थानीय चर या पैरामीटर युक्त ढेर पर,
यदि ऐसा है तो सिग्मा सिग्मा कॉल कॉल सिग्मा सिग्मा कॉल
सिग्मा कॉल जहां इस कहानी का अंत नहीं है?
>> खैर, यह अंततः कुल राशि overruns
स्मृति है कि आप अपने कंप्यूटर के लिए उपलब्ध है.
आप खंड है कि आप के भीतर रहने के लिए चाहिए रहे हैं उग आया है,
और आप इस विभाजन गलती हो, कोर फेंक दिया,
और कोर फेंक दिया इसका मतलब यह है कि मैं अब एक कोर नामक एक फाइल है
जो शून्य और लोगों से युक्त फ़ाइल है
कि भविष्य में वास्तव में लक्षणपूर्वक उपयोगी होगा.
यदि यह आप के लिए स्पष्ट नहीं है, जहां अपने बग है
आप वास्तव में फोरेंसिक विश्लेषण के एक बिट कर इतनी बात करने के लिए कर सकते हैं,
इस कोर डंप फ़ाइल पर, फिर से, जो सिर्फ शून्य और लोगों की एक पूरी गुच्छा है
है कि अनिवार्य रूप से अपने कार्यक्रम की स्मृति में राज्य का प्रतिनिधित्व करता है
फिलहाल यह इस रास्ते में दुर्घटनाग्रस्त हो गया.
>> यहाँ ठीक है कि हम बस आँख बंद करके सिग्मा नहीं लौट सकते हैं,
+ संख्या एक थोड़ा छोटे समस्या के सिग्मा.
हम आधार मामले की किसी तरह का यहाँ की जरूरत है,
और क्या आधार मामला शायद होना चाहिए?
[अश्राव्य छात्र]
ठीक है, इतने लंबे समय के रूप में संख्या धनात्मक है हम वास्तव में यह वापस आ जाना चाहिए,
या दूसरे तरीके से रखा है, अगर संख्या है, कहते हैं, <= 0 से
तुम्हें पता है, मुझे आगे जाना है और 0 वापस कर देंगे,
बहुत पसंद किया विली, और कुछ, मुझे आगे जाना है जा रहा हूँ
और यह वापस, तो यह है कि छोटे ज्यादा नहीं है
संस्करण चलने का है कि हम मार पड़ी 1 पाश के लिए एक का उपयोग कर से,
लेकिन नोटिस कि वहाँ यह करने के लिए शान की इस तरह है.
इसके बजाय कुछ संख्या लौटने और यह सब गणित प्रदर्शन
और बातें स्थानीय चर के साथ जोड़ने
आप के बजाय कह रहे हैं, "ठीक है, अगर यह एक सुपर आसान समस्या है,
तरह की संख्या <0 है, मुझे तुरंत 0 वापसी. "
>> हम समर्थन करने के लिए नकारात्मक संख्या को परेशान करने के लिए नहीं जा रहे हैं,
तो मैं मुश्किल कोड 0 के मूल्य जा रहा हूँ.
लेकिन अन्यथा, संक्षेप के इस विचार को लागू करने के लिए
इन नंबरों के सभी एक साथ आप प्रभावी रूप से एक छोटा सा टुकड़ा ले जा सकते हैं
समस्या से बाहर बहुत पसंद है, हम यहाँ मंच पर किया था,
तो बाज़ी समस्या का अगले व्यक्ति को आराम
लेकिन इस मामले में अगले व्यक्ति अपने आप को.
यह एक समान समारोह का नाम है.
बस इसे एक और छोटे छोटे और छोटे समस्या हर बार पास,
और फिर भी हम नहीं कोड में चीजें काफी औपचारिक रूप यहाँ है
यह ठीक है कि फोन की किताब के साथ 0 सप्ताह में जा रहा था.
यह ठीक है कि पिछले कुछ हफ्तों में शॉन के साथ जा रहा था
और हमारे प्रदर्शनों के साथ संख्या के लिए खोज की.
यह एक समस्या को ले जा रहा है और इसे फिर से और फिर से विभाजित है.
>> दूसरे शब्दों में, वहाँ एक रास्ता अब अनुवाद करने के
यह असली दुनिया का निर्माण, इस उच्च स्तर का निर्माण
के विभाजन और जीत और कुछ फिर से और फिर कर
कोड में है, तो यह कुछ हम फिर से समय के साथ देखेंगे.
अब, एक अलग रूप में, अगर आप recursion के लिए नए हैं आप कम से कम अब समझना चाहिए
क्यों यह हास्यास्पद है.
मैं google.com पर जाने के लिए जा रहा हूँ,
और मैं recursion पर कुछ युक्तियाँ और चालें के लिए खोज करने के लिए जा रहा हूँ, दर्ज करें.
आप अगले व्यक्ति बताओ कि यदि वे अभी नहीं हँस रहे थे.
क्या आप recursion क्या मतलब है?
क्या आपका मतलब है आह, वहाँ हम चले.
ठीक है, अब है कि हर किसी के बाकी है.
एक छोटी सी ईस्टर अंडे गूगल में कहीं वहाँ एम्बेडेड.
एक तरफ, एक लिंक हम पाठ्यक्रम वेबसाइट पर डाल के रूप में
सिर्फ आज के लिए विभिन्न छँटाई एल्गोरिदम के इस ग्रिड है,
जिनमें से कुछ हम पिछले हफ्ते में देखा है, लेकिन इस दृश्य के बारे में क्या अच्छा है
के रूप में आप विभिन्न एल्गोरिदम से संबंधित बातों के आसपास अपने मन लपेटो करने की कोशिश
पता है कि तुम बहुत आसानी अब आदानों की विभिन्न प्रकार के साथ शुरू कर सकते हैं.
आदानों सभी आदानों ज्यादातर क्रमबद्ध, उलट आदानों यादृच्छिक और बहुत आगे है.
जैसा कि आप, फिर कोशिश करें, अपने मन में इन बातों को भेद
एहसास है कि व्याख्यान पृष्ठ पर पाठ्यक्रम की वेबसाइट पर इस URL
आप उन लोगों में से कुछ के माध्यम से कारण मदद कर सकता है.
>> आज हम अंत में एक देर से इस समस्या हल करने के लिए मिलता है,
जो कि इस स्वैप समारोह सिर्फ काम नहीं किया था,
और क्या इस समारोह स्वैप के साथ मौलिक समस्या थी,
जो लक्ष्य में से एक था, फिर से, यहाँ और यहाँ का आदान - प्रदान करने के लिए एक मूल्य
ऐसा है कि ऐसा होता है?
यह वास्तव में काम नहीं किया. क्यों?
हाँ.
[अश्राव्य छात्र]
वास्तव में, इस bugginess के लिए विवरण
बस गया था क्योंकि जब आप सी में कार्य कॉल
और उन कार्यों तर्क एक और ख यहाँ की तरह लेते हैं,
आप जो कुछ भी आपको लगता है कि समारोह के लिए मूल्य प्रदान कर रहे हैं की प्रतियां में गुजर रहे हैं.
आप मूल मान नहीं प्रदान कर खुद को कर रहे हैं,
तो हम buggyc के संदर्भ में यह देखा,
buggy3.c है, जो इस तरह एक छोटे से कुछ देखा.
>> याद है कि हम x और y 1 और 2 के लिए initialized, क्रमशः था.
हम तो बाहर मुद्रित है कि वे क्या कर रहे थे.
मैं तो दावा किया है कि मैं उन्हें एक्स, वाई के स्वैप फोन करके गमागमन था.
लेकिन समस्या यह थी कि गमागमन काम किया,
लेकिन खुद स्वैप के दायरे में ही कार्य करते हैं.
जैसे ही हम 40 लाइन उन बदली मूल्यों मारा
दूर फेंक दिया गया तो, और कुछ नहीं
मूल समारोह में मुख्य वास्तव में बिल्कुल बदल गया था,
यदि ऐसा है तो आप वापस तो लगता है कि यह क्या हमारी स्मृति के मामले में की तरह लग रहा है के रूप में
अगर बोर्ड के इस बाएँ हाथ की ओर का प्रतिनिधित्व करता है
और मैं हर किसी के लिए अपना सर्वश्रेष्ठ करने के देखेंगे इस अगर बोर्ड के इस बाएँ हाथ की ओर
कहते हैं, अपने राम, का प्रतिनिधित्व करता है और ढेर करने के लिए इस तरह से ऊपर पर बढ़ती जा रही है,
और हम मुख्य तरह एक समारोह फोन, और मुख्य 2 स्थानीय चर, x और y है,
चलो एक्स के रूप में उन लोगों के यहाँ का वर्णन है, और हम y के रूप में इन यहाँ का वर्णन,
और 1 और 2 मूल्यों में डाल दिया तो, यहाँ इस मुख्य है,
और जब मुख्य स्वैप समारोह ऑपरेटिंग सिस्टम कॉल
स्वैप समारोह ढेर पर स्मृति के अपने खुद कटी हुई घास देता है,
ढेर पर अपने स्वयं के फ्रेम, तो बात करो.
यह भी इन ints के लिए 32 बिट का आवंटन है.
यह एक और ख उन्हें फोन करने के लिए होता है, लेकिन यह है कि पूरी तरह से मनमाना है.
यह उन्हें बुलाया हो सकता है जो यह चाहता है, लेकिन क्या होता है मुख्य जब
कॉल स्वैप है यह इस 1 लेता है, वहाँ की नकल कहते हैं, वहाँ एक प्रतिलिपि डालता है.
>> वहाँ 1 स्वैप में अन्य स्थानीय चर है, हालांकि, क्या >> tmp बुलाया है?.
Tmp, तो मुझे अपने आप को एक और 32 बिट यहाँ दे,
और क्या मैं इस समारोह में क्या किया?
मैं ने कहा कि int tmp हो जाता है, तो एक 1 है, इसलिए मैं इस किया था जब हम पिछले इस उदाहरण के साथ खेला.
फिर एक ख हो जाता है, तो बी 2 है, तो अब यह 2 हो जाता है,
और अब अस्थायी ख हो जाता है, तो अस्थायी 1 है,
तो अब ख हो जाता है.
यह बहुत अच्छा है. यह काम किया.
लेकिन तब के रूप में जल्द ही समारोह रिटर्न के रूप में
स्वैप स्मृति को प्रभावी ढंग से गायब हो जाता है इतना है कि यह reused किया जा सकता है
भविष्य में कुछ अन्य समारोह से, और मुख्य स्पष्ट रूप से पूरी तरह से अपरिवर्तित है.
हम मौलिक इस समस्या के हल के लिए एक तरह की जरूरत है,
और आज हम अंत में यह कर रही है जिससे की एक तरीका होगा
हम कुछ एक सूचक बुलाया शुरू कर सकते हैं.
यह पता चला है कि हम इस समस्या को हल कर सकते हैं
एक्स और वाई की प्रतियां में पारित नहीं
लेकिन बदले में क्या गुजर द्वारा, आप स्वैप समारोह के लिए लगता है?
हाँ, पते के बारे में क्या?
हम वास्तव में पतों के बारे में ज्यादा विस्तार से बात नहीं की है,
लेकिन अगर इस ब्लैकबोर्ड अपने कंप्यूटर की स्मृति का प्रतिनिधित्व करता है
हम निश्चित रूप से मेरे राम में बाइट्स नंबरिंग शुरू कर सकता है
और कहते हैं कि यह # 1 बाइट है, इस बाइट # 2, # 3 बाइट,
बाइट # 4, बाइट ... 2 अरब अगर मैं राम का 2 गीगाबाइट है,
तो हम निश्चित रूप से कुछ मनमाने ढंग से क्रमांकन योजना के साथ आ सकता है
मेरे कंप्यूटर की स्मृति में सभी व्यक्तिगत बाइट्स के लिए.
>> अगर बजाय क्या जब मैं स्वैप कॉल
एक्स और वाई के बजाय पास प्रतियों में
मैं बजाय एक्स के पते में यहाँ क्यों पास नहीं है,
यहाँ y के पते, अनिवार्य रूप से डाक पते
एक्स और वाई की वजह से तो स्वैप, अगर उन्होंने बताया है
एक्स और वाई की स्मृति में पते की,
तो स्वैप, अगर हम उसे एक छोटा सा प्रशिक्षित,
वह संभवतः उस पते पर ड्राइव इतनी बात करने के लिए कर सकता है,
x, और वहाँ नंबर बदलने के लिए, तो y के पते पर ड्राइव,
नंबर बदलने के लिए, यहाँ तक कि जब उन मूल्यों खुद की प्रतियां वास्तव में नहीं हो रही है,
तो भले ही हम मुख्य स्मृति के रूप में किया जा रहा इस बारे में बात की थी
और इस के रूप में किया जा रहा स्वैप स्मृति शक्तिशाली और सी के खतरनाक भाग
यह है कि किसी भी समारोह में स्मृति कंप्यूटर में कहीं भी स्पर्श कर सकते हैं,
और इस शक्तिशाली है कि आप सी में कंप्यूटर प्रोग्राम के साथ बहुत फैंसी बातें कर सकते हैं
यह खतरनाक है क्योंकि आप भी बहुत आसानी से बिगाड़ सकता है.
वास्तव में, कार्यक्रमों के लिए सबसे आम तरीके इन दिनों में से शोषण किया जा
अभी भी है के लिए एक प्रोग्रामर का एहसास करने के लिए नहीं
कि वह या वह एक डेटा की अनुमति है
स्मृति में एक स्थान है कि इरादा नहीं था में लिखा हो.
>> उदाहरण के लिए, वह या वह 10 आकार की एक सरणी की घोषणा
लेकिन फिर गलती से स्मृति की कि सरणी में 11 बाइट्स डाल करने की कोशिश करता है,
और आप स्मृति के कुछ हिस्सों कि अब वैध नहीं हैं छू शुरू.
प्रासंगिक इस बस के लिए, आप में से कुछ पता चल सकता है कि
सॉफ्टवेयर अक्सर आप सीरियल नंबर या पंजीकरण कुंजी के लिए संकेत देता है,
Photoshop और वर्ड और इस तरह से प्रोग्राम.
वहाँ दरारें मौजूद हैं, आप में से कुछ के रूप में जानते हैं, ऑनलाइन जहाँ आप एक छोटे से कार्यक्रम चला सकते हैं,
और देखा, एक सीरियल नंबर के लिए कोई अनुरोध.
कैसे है कि काम कर रहा है?
कई मामलों में ये बातें बस कंप्यूटर में पा रहे हैं
कंप्यूटर के वास्तविक शून्य और लोगों में पाठ क्षेत्रों
कहाँ है कि समारोह है जहां सीरियल नंबर का अनुरोध किया जाता है,
और आपको लगता है कि अंतरिक्ष अधिलेखित, या जब प्रोग्राम चल रहा है
तुम बाहर आंकड़ा जहां कुंजी वास्तव में संग्रहित है
कुछ का उपयोग करने के लिए एक डिबगर कहा जाता है, और आप सॉफ्टवेयर तरीका है कि दरार कर सकते हैं.
यह करने के लिए अगले कुछ दिनों के लिए कहते हैं कि यह हमारा उद्देश्य है नहीं है,
लेकिन यह बहुत वास्तविक दुनिया असर है.
यह एक सॉफ्टवेयर की चोरी को शामिल करने के लिए होता है,
लेकिन वहाँ भी पूरे मशीनों के समझौता है.
>> वास्तव में, वेबसाइटों इन दिनों जब शोषण कर रहे हैं
और समझौता और डेटा लीक है और पासवर्ड चोरी हो रहे हैं
यह बहुत अक्सर एक स्मृति के गरीब प्रबंधन से संबंधित है,
या, डेटाबेस के मामले में, विफलता को आशा
adversarial इनपुट, तो सप्ताह में उस पर और अधिक के लिए आने के,
लेकिन अभी के लिए क्षति की तरह का एक पूर्वावलोकन चुपके है कि आप कर सकते हैं
समझ कैसे चीजें हुड के नीचे काम नहीं काफी.
चलो समझ क्यों यह टूट गया है के बारे में जाना
एक उपकरण के साथ कि अधिक से अधिक उपयोगी हो जाएगा
हमारे कार्यक्रमों के रूप में और अधिक जटिल हो.
इस प्रकार अब तक जब आप अपने कार्यक्रम में एक बग था
आप इसे debugging के बारे में कैसे चले गए हैं?
अपनी तकनीक इस प्रकार अब तक क्या किया गया है, चाहे अपने TF द्वारा सिखाया
या सिर्फ आत्म सिखाया?
[छात्र] printf.
Printf, तो printf शायद उस में अपने दोस्त किया गया है अगर आप देखना चाहते हैं
क्या हो रहा है अपने कार्यक्रम के अंदर
तुम सिर्फ printf यहाँ रखा, यहाँ printf printf यहाँ.
तब आप इसे चलाने के लिए, और आप स्क्रीन पर एक सामान की एक पूरी गुच्छा ले आओ
कि तुम तो परिणाम निकालना क्या वास्तव में अपने कार्यक्रम में गलत हो रहा है के लिए उपयोग कर सकते हैं.
>> Printf करने के लिए एक बहुत शक्तिशाली बात हो जाता है,
लेकिन यह एक बहुत मैन्युअल प्रक्रिया है.
आप एक printf यहाँ डाल दिया है एक printf यहाँ,,
और यदि आप इसे एक पाश के अंदर रख दिया आप 100 लाइनों मिल सकता है
उत्पादन है कि आप फिर के माध्यम से कपड़छान की.
यह डिबगिंग कार्यक्रमों के लिए एक बहुत उपयोगकर्ता के अनुकूल या इंटरैक्टिव तंत्र नहीं है,
लेकिन शुक्र है वहाँ विकल्प मौजूद है.
उदाहरण के लिए एक कार्यक्रम है,, GDB कहा जाता है, GNU डिबगर है,
जो कि कैसे आप इसे उपयोग में एक छोटे से रहस्यमय है.
यह थोड़ा जटिल है, लेकिन स्पष्ट रूप से,
यह उन चीजों है जहां अगर आप इस सप्ताह में डाल दिया है और एक अगले है
अतिरिक्त GDB की तरह कुछ को समझने के लिए एक घंटे
यह आप लंबे समय में घंटे की शायद दसियों बचा होगा,
तो उस के साथ, मुझे तुम कैसे काम करता है इस बात का एक नमूना दे.
>> मैं अपने टर्मिनल विंडो में हूँ.
मुझे आगे जाना है और इस कार्यक्रम, buggy3 संकलन.
यह पहले से ही ऊपर है तिथि करने के लिए है.
मुझे इसे चलाने जैसे हम एक समय पहले किया था, और वास्तव में यह टूट गया है.
लेकिन ऐसा क्यों है? शायद मैं स्वैप समारोह खराब कर दिया है.
शायद यह एक और ख है. मैं उन्हें काफी नहीं जा रहा हूँ सही ढंग से चारों ओर.
मुझे आगे जाना है और यह नहीं है.
के बजाय सिर्फ buggy3 चलाने के बजाय मुझे इस कार्यक्रम GDB चलाने,
और मैं यह बताने के लिए buggy3 चलाने के लिए जा रहा हूँ,
और मैं एक कमांड लाइन तर्क, tui को शामिल करने के लिए जा रहा हूँ,
और हम कल्पना में भविष्य की समस्याओं के लिए याद दिलाना में डाल देता हूँ.
और अब इस काले और सफेद इंटरफ़ेस popped है कि फिर से,
पहली बार में थोड़ा भारी है क्योंकि वहाँ यह सब क्या है
यहाँ नीचे वारंटी जानकारी है, लेकिन कम से कम कुछ परिचित है.
विंडो के शीर्ष में मेरी वास्तविक कोड है,
और अगर मैं यहाँ स्क्रॉल मुझे बहुत मेरी फ़ाइल के शीर्ष करने के लिए स्क्रॉल,
और वास्तव में, इस विंडो के नीचे buggy3.c और नोटिस
मैं इस GDB संकेत है.
>> यह मेरे सामान्य जॉन हार्वर्ड संकेत के रूप में ही नहीं है.
यह एक संकेत है कि मुझे GDB को नियंत्रित करने के लिए अनुमति देने के लिए जा रहा है है.
GDB एक डिबगर है.
डीबगर एक प्रोग्राम है जो आप के माध्यम से चलना है
अपने प्रोग्राम लाइन की लाइन से लाइन से निष्पादन,
जिस तरह से कुछ भी आप इस कार्यक्रम के लिए चाहते हैं कर के साथ,
भी कार्यों बुला देख रहे हैं या अधिक महत्वपूर्ण बात,
विभिन्न चर के मूल्यों में.
चलो आगे बढ़ो और इस करना.
मुझे आगे जाना है और GDB शीघ्र चलाने में टाइप करने के लिए जा रहा हूँ,
तो स्क्रीन मैं टाइप चलाने की है के नीचे छोड़ दिया पर नोटिस
और मैं दर्ज मारा है, और कहा कि क्या किया?
यह सचमुच मेरे कार्यक्रम भाग गया, लेकिन मैं वास्तव में बहुत यहाँ पर जाना नहीं देखा था
क्योंकि मैं वास्तव में डिबगर नहीं बताया है
समय में एक खास पल में थामने के लिए.
बस चलाने के लिए टाइपिंग कार्यक्रम चलाता है.
मैं वास्तव में कुछ भी नहीं दिख रहा है. मैं यह हेरफेर नहीं कर सकते.
>> इसके बजाय मुझे यह करना.
इस GDB प्रॉम्प्ट पर मुझे बजाय ब्रेक लिखें, दर्ज करें.
यही नहीं मैं क्या टाइप करने का मतलब है.
बदले जाने को तोड़ने के मुख्य लिखें.
दूसरे शब्दों में, मैं एक breakpoint कहलाती सेट करना चाहते हैं,
जो aptly क्योंकि इसे तोड़ने या को थामने के नाम पर रखा गया है
कि विशेष जगह पर अपने कार्यक्रम के निष्पादन.
मुख्य समारोह के नाम है.
सूचना है कि GDB बहुत चालाक है.
यह पता लगा है कि मुख्य लगभग 18 लाइन पर शुरू होता है
buggy3.c, और फिर ऊपर छोड़ दिया पर नोटिस
बी + 18 लाइन के बगल में है.
कि मुझे याद दिलाता है कि मैं 18 लाइन पर एक ब्रेकपाइंट सेट है.
इस बार जब मैं रन लिखते हैं, मैं अपने कार्यक्रम चलाने के लिए जा रहा हूँ
जब तक यह है कि breakpoint हिट,
तो प्रोग्राम मेरे लिए 18 लाइन पर रुकेगा.
यहाँ हम चले, चलाते हैं.
कुछ भी नहीं हुआ है प्रकट होता है, लेकिन तल पर नोटिस छोड़ दिया
कार्यक्रम शुरू करने, buggy3, मुख्य buggy3.c 18 लाइन पर ब्रेकपाइंट 1.
अब मैं क्या कर सकते हैं?
>> सूचना मैंने प्रिंट की तरह बातें लिखना शुरू कर सकते हैं,
printf नहीं, प्रिंट x, और अब यह अजीब है.
$ 1 बस एक जिज्ञासा है, जैसा कि हम देखेंगे
हर बार जब आप कुछ प्रिंट आप एक नया मान $ मिलता है.
ऐसा है कि तुम वापस बस के मामले में पिछले मूल्यों का उल्लेख कर सकते हैं,
लेकिन अब के लिए क्या है प्रिंट मुझे बता रहा है कि कहानी में इस बिंदु पर एक्स का मान
जाहिरा तौर पर है 134514032.
क्या? कहाँ है कि भी से आए हो?
[अश्राव्य छात्र]
वास्तव में, यह है कि क्या हम एक कचरा मूल्य फोन करता हूँ, और हम इस बारे में अभी तक बात नहीं की है,
लेकिन कारण है कि आप चर इनिशियलाइज़
जाहिर है इतना है कि वे कुछ मूल्य है कि आप उन्हें चाहते है.
लेकिन पकड़ याद है कि आप चर घोषणा कर सकते हैं
जैसे मैं मेरी सिग्मा उदाहरण में एक पल पहले किया था
वास्तव में उन्हें एक मूल्य देने के बिना.
याद है कि मैं क्या सिग्मा में यहाँ था.
मैं n की घोषणा की है, लेकिन क्या मूल्य मैं इसे देने के लिए किया था?
कोई नहीं, क्योंकि मैं जानता था कि अगले कुछ लाइनों में
GetInt n के अंदर एक मूल्य डालने की समस्या का ख्याल रखना होगा.
>> लेकिन 11 लाइन की कहानी में इस बिंदु पर
लाइन और 12 और 13 लाइन और 14 लाइन
उन कई पंक्तियों में n के मूल्य क्या है?
सी में आप अभी पता नहीं है.
यह आम तौर पर कुछ कचरा मान, कुछ पूरी तरह से यादृच्छिक संख्या
पर छोड़ दिया है कि अनिवार्य रूप से पिछले कुछ समारोह से
होने चलाने के लिए किया गया है ताकि अपने कार्यक्रम चलाता
याद है कि समारोह समारोह, समारोह, समारोह, हो जाता है.
इन सभी फ्रेम स्मृति पर डाल दिया हो, और फिर उन कार्यों वापसी
और बस की तरह मैं रबड़ अंततः उनकी स्मृति reused किया है के साथ सुझाव दिया.
ठीक है, यह सिर्फ इतना है कि इस कार्यक्रम में इस चर x होता है
जैसे कुछ कचरा मान 134514032 निहित है लगता है
पिछले कुछ समारोह से एक नहीं है कि मैं ने लिखा.
यह कुछ ऐसा है कि ऑपरेटिंग सिस्टम के साथ प्रभावी ढंग से आता है हो सकता है,
हुड के नीचे कुछ समारोह.
>> ठीक है, ठीक है, लेकिन अब हम अगली पंक्ति के लिए अग्रिम.
यदि मैं अपने GDB प्रांप्ट पर "अगले" टाइप करें और मैं हिट दर्ज करें,
सूचना है कि चाल हाइलाइटिंग 19 लाइन के लिए नीचे,
लेकिन तार्किक निहितार्थ यह है कि 18 लाइन
अब समाप्त हो गया है, "प्रिंट x" को क्रियान्वित करने, यदि ऐसा है तो मैं फिर से लिखें
अब मैं 1 देखें चाहिए, और वास्तव में, मैं.
फिर, सामान $ GDB तुम्हें याद दिलाने का एक तरीका है
प्रिंट के इतिहास किया है कि आप क्या कर रहे हैं.
अब मुझे आगे जाना है और बाहर y मुद्रित करने के लिए, और वास्तव, y कुछ पागल मूल्य के रूप में अच्छी तरह से है,
लेकिन कोई बड़ी बात नहीं है क्योंकि 19 लाइन में, हम इसके बारे में आवंटित करने के लिए कर रहे हैं
मूल्य 2, तो मुझे "अगले" फिर से लिखें.
और अब हम printf लाइन पर हैं.
मुझे प्रिंट x.
मुझे प्रिंट y करते हैं. सच कहूँ तो, मैं एक छोटे से इस मुद्रण के थक चुका हूँ.
मुझे बजाय "प्रदर्शन x" और "प्रदर्शन y," टाइप
और अब हर बार मैं भविष्य में एक आदेश टाइप करें
मैं क्या याद दिलाया जाएगा एक्स और वाई, क्या है एक्स और वाई, एक्स और वाई.
>> मैं भी, एक अलग प्रकार, "जानकारी स्थानीय लोगों के रूप में कर सकते हैं."
जानकारी एक विशेष आदेश है.
स्थानीय लोगों का मतलब है कि यह मेरे स्थानीय चर से पता चलता है.
सिर्फ मामले में मैं भूल जाते हैं या यह एक पागल, जटिल समारोह है
कि मैं या किसी और ने लिखा है की जानकारी स्थानीय लोगों को आपको बता देगा
इस स्थानीय समारोह के अंदर सभी स्थानीय चर क्या कर रहे हैं
है कि आप अगर आप चारों ओर ढकेलना चाहते हैं के बारे में परवाह सकता है.
अब, printf निष्पादित करने के बारे में है, तो मुझे आगे और बस प्रकार जाना "अगले."
क्योंकि हम इस माहौल में कर रहे हैं हम वास्तव में यह नहीं देख रहे हैं
यहाँ नीचे निष्पादित, लेकिन यह एक छोटे से घायल हो रही है नोटिस.
नोटिस लेकिन यह स्क्रीन अधिभावी वहाँ,
तो यह एक सही यहाँ कार्यक्रम नहीं है, लेकिन यह ठीक है क्योंकि मैं हमेशा के आसपास प्रहार कर सकते हैं
प्रिंट का उपयोग अगर मैं चाहता हूँ.
>> मुझे अगले फिर से लिखें, और अब यहाँ दिलचस्प हिस्सा है.
कहानी में इस बिंदु पर y 2 है, और एक्स 1 है,
के रूप में यहाँ का सुझाव दिया, और फिर,
कारण है कि अब यह स्वचालित रूप से प्रदर्शित कर रहा है क्योंकि मैं कमांड का इस्तेमाल किया है
प्रदर्शन एक्स और प्रदर्शन y, तो पल मैं अगले प्रकार
सिद्धांत एक्स और वाई में बदली हो जाना चाहिए.
अब, हम पहले से ही जानते हैं कि इस मामले होना नहीं जा रहा है,
लेकिन हम एक पल में देखते हैं कि हम गहरा गोता के लिए बाहर आंकड़ा क्यों कि यह सच है.
अगला, और दुर्भाग्य से, y अभी भी 2 और एक्स अभी भी है 1, और मैं के रूप में ज्यादा की पुष्टि कर सकते हैं.
प्रिंट x, प्रिंट y.
दरअसल, गमागमन कोई वास्तव में हुआ है, तो हम इस पर शुरू.
जाहिर स्वैप टूट गया है.
चलो बजाय "रन" पुन: लिखें.
मुझे हाँ कहने के, मैं इसे शुरू से पुनः आरंभ करना चाहते हैं.
>> अब मैं वापस 18 लाइन पर हूँ.
अब नोटिस एक्स और वाई कचरा मूल्यों फिर से कर रहे हैं.
अगले, अगले, अगले, अगले.
यदि मैं ऊब मैं भी बस के लिए अगले n टाइप कर सकते हैं.
आप इसे वर्णों की कम से कम संभव अनुक्रम को संक्षिप्त कर सकते हैं.
स्वैप अब टूट गया है.
गोता में, चलो इतना के बजाय अगले टाइपिंग की,
अब मैं करने के लिए कदम लिखने जा रहा हूँ इतना है कि मैं इस समारोह के अंदर कदम रख रहा हूँ
इतना है कि मैं इसे माध्यम से चल सकता है तो, मैं कदम मारा और फिर दर्ज करें.
ध्यान दें कि हाइलाइटिंग कूदता नीचे अपने कार्यक्रम में 36 लाइन के लिए कम.
अब स्थानीय चर क्या कर रहे हैं?
जानकारी स्थानीय लोगों को.
बस अभी तक कुछ भी नहीं है क्योंकि हम उस लाइन के लिए नहीं मिल गया है,
तो चलो आगे जाना है और कहते हैं, "अगले."
अब हम tmp, प्रिंट tmp है लगता है.
कचरा मूल्य, है ना? एसा मुझे मालूम होता हैं
कैसे के बारे में एक, प्रिंट, ख, 1 और 2 प्रिंट?
एक पल में, जैसे ही मैं अगले दोबारा लिखें
tmp 1 के एक मूल्य पर ले, उम्मीद की जा रही है,
क्योंकि tmp करने के लिए एक मूल्य सौंपा जा रहा है.
>> अब चलो एक, प्रिंट ख मुद्रित करते हैं,
लेकिन अब tmp मुद्रित करने के लिए, और यह वास्तव में है 1.
मुझे आगे क्या करना है. मुझे आगे क्या करना है.
मैं स्वैप समारोह समाप्त हो गया है.
मैं अभी भी अंदर 40 लाइन में हूँ, तो मुझे एक प्रिंट
प्रिंट ख, और मैं नहीं परवाह नहीं tmp क्या है.
ऐसा लगता है कि स्वैप सही है जब यह ए और बी गमागमन आता.
लेकिन अगर मैं अब अगले टाइप करें, मैं 25 लाइन के लिए वापस कूद,
और जाहिर है, अगर मैं एक्स और प्रिंट y में प्रकार
वे अभी भी अपरिवर्तित रहे हैं, तो हम इस समस्या को तय नहीं किया है.
लेकिन अब शायद diagnostically इस GDB कार्यक्रम के साथ
हम कम से कम एक कदम को समझने के लिए करीब मिल गया है
कूड़े को एक printf यहाँ डालने से हमारे कोड के लिए बिना क्या गलत हो रहा है,
printf यहाँ, printf यहाँ और फिर इसे फिर से और फिर से चलाने
पता लगाने की क्या गलत हो रहा है की कोशिश कर रहा है.
>> मुझे आगे जाना है और इस के बाहर छोड़ छोड़ने के साथ पूरी तरह करने के लिए जा रहा हूँ.
"वैसे भी छोड़ो?" यह तो कहने जा रहा है हां.
अब मैं अपने सामान्य प्रॉम्प्ट पर वापस आ गया हूँ, और मैं GDB का उपयोग कर रहा हूँ.
एक अलग रूप में, आप इस tui ध्वज का उपयोग करने की जरूरत नहीं है.
वास्तव में, यदि आप यह न आना तुम अनिवार्य रूप से स्क्रीन के नीचे आधा मिलता है.
अगर मैं तब को तोड़ने के मुख्य लिखें और फिर चलाने
मैं अभी भी अपने कार्यक्रम चलाने के लिए, कर सकते हैं, लेकिन क्या यह करना होगा और अधिक पाठ की दृष्टि से है
बस मुझे एक समय में वर्तमान लाइन एक दिखाने.
TUI, शाब्दिक उपयोगकर्ता इंटरफ़ेस,
सिर्फ आपको पता चलता है एक बार, जो शायद एक बिट धारणात्मक आसान है पर कार्यक्रम की अधिक है.
लेकिन वास्तव में, मैं सिर्फ अगले, अगले, अगले कर सकते हैं,
और मैं एक समय में एक लाइन को देखने के लिए जा रहा हूँ, और अगर मैं वास्तव में देखने के लिए क्या हो रहा है
मैं सूची लिखें और पड़ोसी लाइनों की एक पूरी गुच्छा देख सकते हैं.
>> वहाँ एक वीडियो है कि हमने कहा है कि आपको देखने के लिए समस्या है 3 सेट
जिसमें नैट GDB का जटिलताओं के कुछ शामिल है,
और यह उन चीजों में से एक है, ईमानदारी से, जहां आप में से कुछ प्रतिशत गैर तुच्छ
को छूने, कभी नहीं होगा GDB और कि एक बुरी बात हो जाएगा
क्योंकि सचमुच तुम अंत में अधिक समय बाद में इस सेमेस्टर खर्च करेगा
नीचे कीड़े का पीछा करते हुए तो आप अगर आप कि आधे घंटे / घंटे में डाल दिया होगा
इस सप्ताह और अगले सीखने GDB के साथ आराम मिलता है.
Printf तुम्हारा दोस्त था.
GDB अब अपने दोस्त होना चाहिए.
>> GDB पर कोई सवाल?
और यहाँ सबसे शक्तिशाली और उपयोगी आदेशों में से कुछ की एक त्वरित सूची है.
हाँ. >> आप एक स्ट्रिंग मुद्रित कर सकते हैं?
आप एक स्ट्रिंग प्रिंट कर सकते हैं? बिल्कुल.
यह बस हो integers नहीं है.
यदि एक चर के एक प्रिंट है में बस प्रकार स्ट्रिंग है.
यह आपको दिखाने के लिए क्या है कि स्ट्रिंग चर.
[अश्राव्य छात्र]
यह आपको पता और स्ट्रिंग ही दे देंगे.
यह आप दोनों को दिखा देंगे.
और एक आखिरी बात, सिर्फ इसलिए कि ये भी पता करने के लिए अच्छा कर रहे हैं.
बैकट्रैस और फ्रेम, मुझे यह एक पिछले समय में गोता
GDB के साथ एक ही सटीक कार्यक्रम.
मुझे आगे जाना है और शाब्दिक उपयोगकर्ता इंटरफ़ेस संस्करण को चलाने,
मुख्य तोड़ने के लिए.
मुझे आगे जाना है और फिर से चलाने के. मैं यहाँ हूँ.
अब मुझे अगले, अगले, अगले, अगले, अगले जाना, कदम दर्ज करें.
>> और अब लगता है कि मैं स्वैप में अब जानबूझ कर रहा हूँ, लेकिन मैं जैसा हूँ "अरे, एक्स का मान क्या था?"
मैं एक्स और नहीं कर सकता.
मैं y नहीं है क्योंकि वे दायरे में नहीं हो सकता है.
वे संदर्भ में नहीं हो, लेकिन कोई समस्या नहीं है.
मैं बैकट्रैस लिख सकते हैं.
कि मुझे सभी कार्य करता है कि समय में इस बिंदु को मार डाला है पता चलता है.
सूचना है कि मुख्य तल पर एक साथ, मुख्य, अप लाइन
यहाँ हमारी तस्वीर के नीचे जा रहा है.
तथ्य यह है कि स्वैप स्वैप स्मृति में यह ऊपर जा रहा है यह लाइनों के ऊपर के साथ है,
और अगर मैं मुख्य वापस करने के लिए अस्थायी रूप से प्राप्त करना चाहते हैं तो मैं "फ्रेम." कह सकते हैं
संख्या क्या है? मुख्य # 1 फ्रेम है.
मुझे आगे जाना है और कहने जा रहा हूँ "1 फ्रेम."
>> अब मैं मुख्य में वापस आ गया हूँ, और मैं x मुद्रित कर सकते हैं, और मैं y मुद्रित कर सकते हैं,
लेकिन मैं एक ख या मुद्रित नहीं कर सकते.
लेकिन अगर मैं कहूँ कि मैं कर सकते हैं, "ठीक है, एक मिनट रुको स्वैप कहाँ था?"
मुझे आगे जाना है और कहते हैं, "फ्रेम 0."
अब मैं वापस आ गया हूँ जहाँ मैं बनना चाहता हूँ, और एक अलग रूप में,
वहाँ अन्य आज्ञाओं का भी है, अगर आप की तरह सच में ऊब टाइपिंग अगले, अगले, अगले, अगले हो रही है,
आप आम तौर पर की तरह बातें कह सकते हैं "अगले 10," और कहा कि अगले 10 लाइनों के माध्यम से कदम होगा.
आप भी लिख "जारी रखें" जब आप वास्तव में इसे माध्यम से कदम से तंग आ चुके हो सकते हैं.
जारी बिना किसी रुकावट के अपने कार्यक्रम चलाने के लिए जब तक यह एक और breakpoint हिट होगा,
एक पाश में चाहे या अपने कार्यक्रम में कम नीचे हैं.
>> इस मामले में हम अंत करने के लिए जारी रखा, और कार्यक्रम आम तौर से बाहर निकल गया.
यह एक अच्छा तरीका है, अवर प्रक्रिया है.
बस अपने कार्यक्रम सामान्य रूप से बाहर हुआ.
वीडियो में और सत्र के लिए आने के debugging में उस पर और अधिक.
यह एक बहुत कुछ था.
चलो हमारे यहाँ 5 मिनट का ब्रेक लेते हैं, और हम structs और फ़ाइलों के साथ वापस कर देंगे.
>> यदि आप पहले से ही इस सप्ताह के pset में डुबकी लगाई है
आपको पता चल जाएगा कि हम वितरण कोड में उपयोग,
स्रोत कोड है कि हम आप के लिए एक प्रारंभिक बिंदु, कुछ नई तकनीकों के रूप में प्रदान करते हैं.
विशेष रूप से, हम संरचना के लिए इस नई संरचना बुलाया कीवर्ड शुरू की,
इतना है कि हम एक तरह की अनुकूलित चर बना सकते हैं.
हम भी फ़ाइल मैं / हे, इनपुट और आउटपुट के शुरू की धारणा है,
और यह है कि इतना है कि हम राज्य को बचाने के लिए कर सकते हैं
डिस्क पर अपने हाथापाई बोर्ड के एक फाइल करने के लिए
इतना है कि शिक्षण साथियों और मैं समझ सकता हूँ
क्या अपने कार्यक्रम के अंदर पर मैन्युअल खेलने के बिना जा रहा है
हाथापाई के खेल के दर्जनों.
हम यह automatedly अधिक कर सकते हैं.
>> एक struct का यह विचार काफी सम्मोहक समस्या हल करती है.
मान लीजिए कि हम कुछ कार्यक्रम को लागू करना चाहते हैं
कि किसी भी तरह से छात्रों पर जानकारी का ट्रैक रखता है,
और छात्रों को, उदाहरण के लिए, एक आईडी है, हो सकता है एक नाम
और हार्वर्ड की तरह एक जगह पर एक घर है, इसलिए इन सूचना के 3 टुकड़े कर रहे हैं
हम चारों ओर रखना चाहते हैं, तो मुझे आगे जाना है और एक छोटे से कार्यक्रम यहाँ लिख शुरू,
stdio.h शामिल हैं.
मुझे cs50.h. शामिल
और फिर मेरे मुख्य समारोह शुरू.
मैं किसी भी कमांड लाइन तर्क के साथ परेशान नहीं करेगा,
और यहाँ मैं एक छात्र के लिए करना चाहते हैं, तो मैं कहने जा रहा हूँ
एक छात्र एक नाम है, तो मैं कहने जा रहा हूँ "स्ट्रिंग नाम."
तो मैं करने के लिए कहते हैं कि एक छात्र एक आईडी है, तो int आईडी के लिए जा रहा हूँ,
और एक छात्र को एक घर है, इसलिए मैं यह भी कहने जा रहा हूँ "स्ट्रिंग घर है."
तो मैं इन एक छोटे से इस तरह से अधिक सफाई आदेश देंगे.
ठीक है, अब मैं 3 चर के साथ जो एक छात्र का प्रतिनिधित्व करने के लिए है, तो "एक छात्र है."
>> और अब मैं इन मूल्यों को आबाद करना चाहते हैं, तो मुझे आगे जाना है और कुछ कहने की तरह
"आईडी = 123."
नाम डेविड पाने के लिए जा रहा है.
चलो का कहना है कि घर के लिए माथर पाने के लिए जा रहा है,
और फिर मैं printf की तरह मनमाने ढंग से कुछ करने के लिए जा रहा हूँ ("% s,
जिसका आईडी% d,% s में रहता है.
और अब, मैं क्या करने के लिए यहाँ में प्लग करना चाहते हैं, एक दूसरे के बाद?
नाम, आईडी, घर वापसी, 0.
ठीक है, जब तक मैं यहीं कहीं खराब कर दिया है
मुझे लगता है कि हम एक बहुत अच्छा कार्यक्रम है कि भंडार एक छात्र है.
बेशक, यह है कि सभी दिलचस्प नहीं है. क्या होगा यदि मैं 2 छात्रों के लिए करना चाहते हैं?
यह कोई बड़ी बात नहीं है. मैं 2 लोगों का समर्थन कर सकते हैं.
मुझे आगे जाना है और इस पर प्रकाश डाला और यहाँ नीचे जाना,
और मैं "आईडी = 456" रोब की तरह है जो Kirkland में रहता है के लिए कह सकते हैं.
>> ठीक है, इंतजार है, लेकिन मैं एक ही बात इन फोन नहीं कर सकते हैं,
और ऐसा लगता है जैसे मैं इस की नकल करने के लिए किया जा रहा हूँ,
तो मुझे कहना है कि इन दाऊद के चर हो जाएगा,
और मुझे रोब के लिए इनमें से कुछ प्रतियां प्राप्त कर सकते हैं.
हम इन रोब कॉल, लेकिन यह काम करने के लिए अब नहीं जा रहा है
क्योंकि मैं प्रतीक्षा है, चलो मुझे id1 के लिए बदल, NAME1 और house1.
रोब 2, 2.
मैं इस यहाँ, यहाँ, यहाँ, यहाँ, यहाँ, बदल गया है.
रुको, टॉमी के बारे में क्या? यह फिर से करना.
जाहिर है अगर आप अभी भी लगता है कि यह ऐसा करने का एक अच्छा तरीका है, यह नहीं है,
तो कॉपी / पेस्ट करें बुरा.
लेकिन हम इस पर एक सप्ताह पहले हल.
>> हमारे समाधान क्या था जब हम एक ही डेटा प्रकार के कई उदाहरण हैं चाहता था?
[छात्र] एक सरणी.
एक सरणी है, तो मुझे यह साफ करने की कोशिश है.
मुझे शीर्ष पर खुद के लिए कुछ कमरे बनाने के लिए, और मुझे बजाय यहाँ यह सब कर.
हम इन लोगों को फोन करेंगे और इसके बजाय मैं कहने जा रहा हूँ "int आईडी,"
और मैं अब के लिए हम में से 3 का समर्थन करने के लिए जा रहा हूँ.
मैं जा रहा हूँ "स्ट्रिंग नामों," कहते हैं और मैं हम में से 3 का समर्थन करेंगे,
और फिर मैं "स्ट्रिंग घरों," कहते हैं और मैं हम में से 3 का समर्थन करने के लिए जा रहा हूँ जा रहा हूँ.
अब दाऊद ने अपने अपने स्थानीय चर होने की बजाय यहाँ
हम उन लोगों से छुटकारा मिल सकता है.
यह अच्छा है कि हम इस सफाई कर रहे हैं लगता है.
मैं तो कहना है कि दाऊद और नाम [0] [0] होने जा रहा है
और घरों [0].
और फिर रोब हम इसी तरह इस पर बचा सकता है.
चलो इस यहाँ नीचे रखा, तो वह मनमाने ढंग से [1] आईडी होने जा रहा है.
वह नाम होने जा रहा है [1],
और फिर अंत में, घरों [1].
>> अभी भी एक छोटे से कठिन है, और अब मैं यह समझ से बाहर है,
तो हम कहते हैं "के नाम [0], आईडी [0], घरों [0],
और इस बहुवचन में अभिव्यक्त करना.
आईडी, आईडी, आईडी.
और फिर, मैं कर रहा हूँ, तो फिर, मैं पहले से ही कॉपी / दोबारा पेस्ट resorting रहा हूँ,
तो बाधाओं रहे हैं वहाँ एक समाधान है.
मैं शायद इस एक या कुछ की तरह है कि पाश के साथ साफ कर सकते हैं आगे
संक्षेप में, यह थोड़ा बेहतर है, लेकिन अभी भी तरह लगता है
मैं कॉपी पेस्ट / resorting रहा हूँ, लेकिन यह भी, मैं दावा है,
वास्तव में मौलिक सही समाधान नहीं है, क्योंकि
क्या होगा अगर कुछ समय हम तय तुम क्या जानते हो?
हम वास्तव में दाऊद और रोब के लिए किया गया है चाहिए ईमेल पते भंडारण
और इस कार्यक्रम में हर किसी के.
हम भी फोन नंबर स्टोर चाहिए.
हम भी आपातकालीन संपर्क नंबर स्टोर करना चाहिए.
हम सभी डेटा के इन टुकड़ों है कि हम चाहते हैं की दुकान है,
तो आप करने के बारे में कैसे जाना है?
>> आप शीर्ष पर एक और सरणी की घोषणा, और फिर आप मैन्युअल रूप से जोड़ने
एक ईमेल पते [0], ईमेल [1] पता
दाऊद और रोब के लिए और बहुत आगे है.
लेकिन वास्तव में सिर्फ एक इस डिजाइन अंतर्निहित धारणा है
कि मैं सम्मान प्रणाली का उपयोग कर रहा हूँ पता है कि
[I] कई arrays के प्रत्येक में
सिर्फ इतना एक ही व्यक्ति का उल्लेख होता है,
तो [0] आईडी में 123 नंबर है,
और मैं कि नाम मान जा रहा हूँ [0]
एक ही व्यक्ति का नाम और [0] मकान
एक ही व्यक्ति और विभिन्न arrays कि मैं बनाने के सभी के लिए घर में इतना आगे है.
लेकिन नोटिस कि वहाँ कोई मौलिक उठाना
जानकारी, आईडी, नाम, और घर के उन 3 टुकड़ों के बीच,
भले ही हम इस कार्यक्रम में मॉडल के लिए कोशिश कर रहे हैं इकाई arrays नहीं है.
Arrays सिर्फ इस कर के इस प्रोग्रामेटिक तरीका है.
क्या हम वास्तव में हमारे कार्यक्रम में मॉडल चाहते हैं एक व्यक्ति है
डेविड, जो के अंदर रोब तरह एक व्यक्ति की तरह
या encapsulating एक नाम और आईडी और एक घर है.
>> हम किसी भी तरह encapsulation के इस विचार व्यक्त कर सकते हैं
जिससे एक व्यक्ति को एक आईडी, एक नाम और एक घर है
वास्तव में इस हैक करने के लिए सहारा नहीं है और अभी हम जिससे
कि ब्रैकेट कुछ पर भरोसा
इन असमान arrays के प्रत्येक में एक ही मानव संस्था को दर्शाता है?
हम वास्तव में यह कर सकते हैं.
चलो मेरे ऊपर अब के लिए मुख्य जाना, और मुझे अपने डेटा प्रकार बनाने
वास्तव में पहली बार के लिए.
हम हाथापाई में इस तकनीक का इस्तेमाल किया है,
लेकिन यहाँ मैं आगे जाना है और एक डेटा प्रकार बनाने जा रहा हूँ,
और तुम्हें पता है, मैं यह छात्र या व्यक्ति फोन करने के लिए जा रहा हूँ,
और मैं typedef का उपयोग करने के लिए एक प्रकार को परिभाषित करने के लिए जा रहा हूँ.
मैं कहना है कि यह एक संरचना है करने के लिए जा रहा हूँ,
और फिर इस संरचना प्रकार छात्र का हो, तो हम कहेंगे जा रहा है,
भले ही यह एक छोटे से मेरे लिए अब दिनांकित है.
हम "int आईडी कहता हूँ."
हम "स्ट्रिंग नाम कहता हूँ."
तो फिर हम "स्ट्रिंग घर," कह देंगे
अब तो कोड के इन कुछ लाइनों के अंत तक
मैं सिर्फ बजना सिखाया है कि वहाँ मौजूद है
ints के अलावा एक डेटा प्रकार, तार के अलावा, के अलावा है मंगाई के अलावा डबल्स,.
>> समय 11 लाइन में इस क्षण के रूप में, वहाँ अब एक नया डेटा प्रकार छात्रों को कहा जाता है,
और अब मैं एक छात्र चर मैं चाहता हूँ कि कहीं भी घोषित कर सकते हैं,
तो मुझे नीचे स्क्रॉल लोगों को यहाँ.
अब मैं इस से छुटकारा मिलता है, कर सकते हैं और मैं वापस जाने के लिए नीचे दाऊद के पास कर सकते हैं यहाँ
और डेविड के लिए मैं वास्तव में दाऊद कि कह सकते हैं,
हम सचमुच अपने आप के बाद चर नाम कर सकते हैं,
प्रकार छात्र का होने जा रहा है.
यह थोड़ा अजीब लग सकता है, लेकिन यह है कि सभी अलग नहीं है
एक int या एक स्ट्रिंग या एक नाव के रूप में कुछ की घोषणा से.
यह सिर्फ इतना करने के लिए छात्र अब कहा जा होता है,
और अगर मैं इस संरचना के अंदर कुछ डाल करना चाहते हैं
मैं अब वाक्यविन्यास का एक नया टुकड़ा का उपयोग करने के लिए है, लेकिन यह बहुत स्पष्ट है,
david.id = 123, david.name = पूंजी विकास में "दाऊद",
और david.house = "माथर"
और अब मैं यहाँ इस सामान से छुटकारा मिल सकता है.
नोटिस अब हम वास्तव में एक बेहतर तरीका में हमारे कार्यक्रम बदल दिया है
कि अब हमारे कार्यक्रम में असली दुनिया दर्पण.
>> एक व्यक्ति या एक छात्र वास्तविक दुनिया की धारणा है.
यहाँ हम अब एक व्यक्ति या अधिक विशेष रूप से एक छात्र की एक सी संस्करण है.
उस व्यक्ति के अंदर इन प्रासंगिक विशेषताएं हैं,
आईडी, नाम, और घर, तो रोब अनिवार्य रूप से एक ही बात यहाँ नीचे हो जाता है,
इसलिए छात्र लूटने, और अब 456 = rob.id,
rob.name = "रोब."
तथ्य यह है कि चर रोब कहा जाता है व्यर्थ की तरह है.
हम यह एक्स या वाई या जेड कहा हो सकता है.
हम सिर्फ यह शब्दार्थ अनुरूप होना लूटने का नाम है,
लेकिन वास्तव में नाम के अंदर है कि क्षेत्र में ही है,
तो अब मैं इस है.
यह भी सर्वश्रेष्ठ डिजाइन में है कि मैं कड़ी मेहनत डेविड कोडित है की तरह महसूस नहीं करता है.
मैं कठिन कोडित रोब है.
और मैं अभी भी किसी की नकल करने के लिए सहारा और हर बार जब मैं नई चर चाहते पेस्ट है.
इसके अलावा, मैं जाहिरा तौर पर इन चर के हर एक नाम दे दिया है,
भले ही मैं बहुत बल्कि इन चर का वर्णन था
अधिक generically छात्रों.
>> अब हम विचार है कि हमारे लिए अच्छी तरह से काम किया गया है विलय कर सकते हैं
और बजाय कहते हैं, "तुम्हें पता है, मुझे एक चर बुलाया छात्रों को देने,
चलो, तो यह 3 आकार के हो गए हैं, "अब मैं इस आगे परिष्कृत कर सकते हैं,
मैन्युअल घोषित दाऊद से छुटकारा पाने के लिए,
और मैं बजाय छात्रों की तरह [0] यहाँ कुछ कह सकते हैं.
मैं तो छात्रों [0] यहाँ कह सकते हैं,
यहाँ, और इतना आगे [0] छात्रों, और मैं चारों ओर जा सकते हैं
और कि रोब के लिए साफ.
मैं भी अब शायद एक पाश जोड़ने के बारे में जा सकते हैं
और GetString और GetInt का उपयोग करने के लिए वास्तव में उपयोगकर्ता से इन मूल्यों को प्राप्त है.
मैं एक निरंतर जोड़ने के बारे में जाना है क्योंकि यह आम तौर पर बुरा व्यवहार हो सकता है हो सकता है
हार्ड कोड के लिए 3 तरह कुछ मनमाने ढंग से संख्या सही यहाँ
और फिर बस याद है कि आप इसे में कोई 3 से अधिक छात्रों को रखा जाना चाहिए.
यह शायद बेहतर होगा # मेरी फाइल के शीर्ष पर परिभाषित करने के लिए उपयोग होगा
और कारक है कि बाहर है, तो वास्तव में चलो, मुझे आगे जाना है और इस सामान्यीकरण.
>> मुझे एक उदाहरण है कि आज के बीच खुला
अग्रिम में उदाहरण, structs1.
यह एक अधिक पूरा कार्यक्रम का उपयोग करता है कि # यहाँ को परिभाषित है
कहते हैं और हम डिफ़ॉल्ट रूप से 3 छात्रों के लिए जा रहे हैं.
यहाँ मैं छात्रों के एक वर्ग के लायक घोषणा कर रहा हूँ,
तो छात्रों की एक कक्षा, और अब मैं एक पाश का उपयोग कर रहा हूँ
सिर्फ कोड थोड़ा और अधिक सुंदर बनाने के लिए, वर्ग पॉप्युलेट करने के लिए
उपयोगकर्ता इनपुट के साथ है, तो छात्रों, जो 3 i = 0 से पुनरावृति.
और फिर मैं इस संस्करण में उपयोगकर्ता prompt
क्या छात्र आईडी है, और मैं यह GetInt साथ मिलता है.
छात्र का नाम क्या है, और फिर मैं यह GetString साथ मिल.
छात्र घर क्या है? मैं यह GetString के साथ मिलता है.
और फिर यहाँ तल पर मैं सिर्फ बदलने का फैसला किया
, मैं इन कैसे मुद्रण कर रहा हूँ बाहर है और वास्तव में एक पाश का उपयोग
और मैं जो मुद्रण कर रहा हूँ?
टिप्पणी के अनुसार मैं माथर में किसी मुद्रण कर रहा हूँ,
और यह है कि रोब और टॉमी इतना पर और आगे वास्तव में टॉमी माथर में.
टॉमी और दाऊद ने इस मामले में मुद्रित किया जाएगा, लेकिन यह कैसे काम कर रहा है?
हम इस समारोह से पहले नहीं देखा है, लेकिन यह क्या करता है के रूप में एक अनुमान ले.
तार की तुलना करता है.
>> यह एक छोटी सी गैर स्पष्ट है कि यह कैसे तार तुलना क्योंकि यह पता चला है
अगर यह 0 देता है इसका मतलब है कि तार के बराबर हैं.
यदि यह एक -1 देता है इसका मतलब है कि एक दूसरे से पहले वर्णानुक्रम में आता है,
और अगर यह एक रिटर्न वर्णानुक्रम में आता है कि अन्य शब्द का अर्थ
दूसरे से पहले, और आप ऑनलाइन या आदमी पेज पर देख सकते हैं
को देखने के ठीक तरह से जो है, लेकिन अब यह सब कर रही है यह कह रहा है
अगर [i]. घर माथर "के बराबर है
तो आगे जाओ और बाहर तो प्रिंट और इतने माथर में है.
लेकिन यहाँ कुछ हम पहले नहीं देखा है, और हम इस के लिए आया हूँ.
मैं कभी भी अपने कार्यक्रमों में से किसी में यह कर रहा याद नहीं है.
मुफ्त जाहिरा तौर पर याद करने के लिए बात कर रहा है, स्मृति मुक्त,
लेकिन स्मृति क्या मैं जाहिरा तौर पर इस कार्यक्रम के नीचे में इस पाश में मुक्त?
ऐसा लगता है कि मैं एक व्यक्ति के नाम मुक्त कर रहा हूँ
और एक व्यक्ति के घर में है, लेकिन ऐसा क्यों है?
>> यह इन सभी सप्ताह पता चला है कि आप GetString का उपयोग किया गया
हम किस तरह से अपने कार्यक्रमों के हर एक में किया गया है एक बग शुरू.
डिजाइन का आवंटन स्मृति द्वारा GetString इतना है कि यह आप एक स्ट्रिंग के लिए लौट सकते हैं,
जैसे डेविड, या रोब, आप और फिर आप जो चाहते हैं कर सकते हैं
क्योंकि हम आप के लिए स्मृति आरक्षित है कि अपने कार्यक्रम में स्ट्रिंग के साथ.
यह सब समय समस्या हर बार जब आप GetString कॉल
हम, के लेखकों के GetString, ऑपरेटिंग सिस्टम पूछ रहा है
हमें इस स्ट्रिंग के लिए राम की एक बिट दे.
हमें यह अगले स्ट्रिंग के लिए राम की एक बिट दे.
हमें यह अगले स्ट्रिंग के लिए कुछ अधिक रैम दे.
क्या तुम, प्रोग्रामर कर रही है, कभी नहीं किया गया है
हमें कि याददाश्त वापस दे,
तो इन कई हफ्तों के लिए कार्यक्रमों के सभी लिखा है
किया था कि क्या एक स्मृति छलांग कहा जाता है जिससे वे का उपयोग कर रखना
अधिक से अधिक स्मृति हर बार जब आप GetString कहते हैं, और वह ठीक है.
हम जानबूझ कि पहले सप्ताह में नहीं है क्योंकि यह दिलचस्प नहीं है कि
जहां स्ट्रिंग से आ रहा है के बारे में चिंता करने की ज़रूरत है.
सब तुम चाहते है शब्द वापस आ जब उपयोगकर्ता यह प्रकार अंदर रोब
>> लेकिन आगे बढ़ने अब हम इस बारे में और अधिक परिष्कृत हो रही शुरू कर दिया है.
हम किसी भी समय हम स्मृति आवंटित करने के बेहतर अंततः इसे वापस हाथ.
अन्यथा अपने मैक या पीसी पर असली दुनिया में आप कभी कभी अनुभवी हो सकता है
लक्षण है जहाँ आपके कंप्यूटर के एक पड़ाव पर पीस अंततः
या बेवकूफ कताई समुद्र तट गेंद सिर्फ कंप्यूटर कब्जे में है
पूरे ध्यान और आप कुछ नहीं कर सकते.
कीड़े के किसी भी संख्या से समझाया जा सकता है, लेकिन उन संभव कीड़े के बीच
बातें कर रहे हैं स्मृति लीक कहा जिससे कोई है जो सॉफ्टवेयर का टुकड़ा है कि लिखा
आप स्मृति मुक्त करने के लिए याद नहीं किया था का उपयोग कर रहे हैं
कि वह या वह संचालन के लिए प्रणाली से पूछा,
उपयोग नहीं GetString कि क्योंकि एक CS50 बात है, लेकिन इसी तरह के कार्यों का उपयोग
कि स्मृति के लिए ऑपरेटिंग सिस्टम पूछना.
यदि आप या वे पेंच और है कि स्मृति वास्तव में कभी नहीं लौटने
का एक लक्षण है कि हो सकता है कि एक कार्यक्रम धीमा कर देती है और धीमा है और नीचे धीमा कर देती है
जब तक आप के लिए मुक्त कर याद है.
>> हम वापस आने के लिए जब क्यों और आप मुफ्त फोन होगा,
लेकिन अच्छे उपाय के लिए बस आगे बढ़ो और इस विशेष कार्यक्रम चलाने की कोशिश करें.
इस structs1 बुलाया गया था, दर्ज करें.
मुझे आगे जाना है और structs1 चलाने के, 123, डेविड माथर,
456, रोब Kirkland, 789,
टॉमी माथर, और हम माथर में डेविड देखते, टॉमी माथर में.
यह सिर्फ एक छोटे से मानसिक स्वास्थ्य की जांच है कि इस कार्यक्रम के काम कर रहा है है.
अब, दुर्भाग्य से, इस कार्यक्रम में है कि एक छोटे से निराशा होती है
मुझे लगता है कि सब काम किया था, मैं 9 अलग तार में टाइप, हिट दर्ज करें,
बताया गया था जो माथर में था, अभी तक स्पष्ट रूप से मैं जानता था कि जो माथर में पहले से ही था, क्योंकि मैं इसे टाइप.
यह कम से कम अच्छा होगा अगर इस कार्यक्रम और एक डेटाबेस की तरह होता है
और यह वास्तव में याद है कि मैं क्या में टाइप किया है
इसलिए मैं इन छात्र रिकॉर्ड इनपुट के लिए फिर कभी नहीं होगा.
शायद यह एक registrarial प्रणाली की तरह है.
>> हम यह नहीं है इस फ़ाइल मैं / हे, इनपुट और आउटपुट के रूप में जाना तकनीक का उपयोग कर सकते हैं,
किसी भी समय आप फ़ाइलों को पढ़ने या फ़ाइलों लिखना चाहते हैं कह रही है की एक बहुत सामान्य तरीके
आप कार्यों की एक निश्चित सेट के साथ कर सकते हैं.
मुझे आगे जाना है और इस उदाहरण structs2.c खुला,
जो लगभग समान है, लेकिन देखते हैं कि यह क्या करता है अब.
फ़ाइल के शीर्ष पर मैं छात्रों के एक वर्ग की घोषणा.
मैं तो उपयोगकर्ता इनपुट के साथ कक्षा आबाद,
तो कोड के उन लाइनों बिल्कुल पहले की तरह कर रहे हैं.
तो अगर मैं यहाँ नीचे स्क्रॉल मैं प्रिंट हर कोई है जो माथर में मनमाने ढंग से पहले की तरह,
लेकिन यह एक दिलचस्प नई सुविधा है.
कोड के इन लाइनों के लिए नए हैं, और वे कुछ यहाँ शुरू,
फ़ाइल, सभी टोपियां, और यह यहाँ * के रूप में अच्छी तरह से किया गया है.
मुझे यहाँ पर ले जाने के लिए, यहाँ पर एक * के रूप में अच्छी तरह से.
>> इस समारोह में हम पहले नहीं देखा है, fopen,
लेकिन यह फाइल का मतलब है खुला है, तो इन के माध्यम से चलो किसी पदार्थ का उत्तम तत्त्व ले लेना,
और यह कुछ हम वापस करने के लिए भविष्य psets में आ जाएगा,
लेकिन यहाँ इस लाइन अनिवार्य रूप से कहा जाता है एक डेटाबेस फ़ाइल को खोलता है,
और यह विशेष रूप से यह इस तरह है कि यह करने के लिए क्या कर सकते हैं में खुलती है?
[अश्राव्य छात्र]
ठीक है, तो बस "w" मतलब है कि यह ऑपरेटिंग सिस्टम बता रहा है
इस तरह है कि मैं यह करने के लिए लिख सकते हैं में इस फाइल को खोलने.
मैं इसे पढ़ने के लिए नहीं करना चाहती. मैं सिर्फ यह देखना नहीं चाहती.
मैं इसे बदलने के लिए और सामान के लिए संभावित जोड़ चाहते हैं,
और फाइल करने के लिए डेटाबेस कहा जा रहा है.
यह कुछ भी कहा जा सकता है.
यह database.txt हो सकता है. इस DB हो सकता है.
यह foo की तरह एक शब्द हो सकता है, लेकिन मैं मनमाने ढंग से फ़ाइल डेटाबेस का नाम चुना.
यह एक छोटे से मानसिक स्वास्थ्य की जांच है कि हम वापस करने के लिए समय के साथ महान विस्तार में आया हूँ,
अगर fp, फ़ाइल सूचक के लिए, बराबर रिक्त नहीं है इसका मतलब है कि सब कुछ ठीक है.
>> लंबी कहानी कम, fopen की तरह कार्य करता है कभी कभी असफल.
शायद फ़ाइल मौजूद नहीं है. शायद आप डिस्क स्थान से बाहर रहे हैं.
शायद आप उस फ़ोल्डर के लिए अनुमति नहीं है,
यदि ऐसा है तो fopen अशक्त कुछ देता बुरा हुआ है.
इसके विपरीत, यदि fopen अशक्त वापस नहीं करता है सब कुछ ठीक है
और मैं इस फ़ाइल के लिए लिखना शुरू कर सकते हैं.
यहाँ एक नई चाल है.
यह एक के लिए पाश है कि अपने छात्रों के प्रत्येक iterating है,
और यह तो हम क्या पहले किया है के लिए इसी तरह लग रहा है,
लेकिन इस समारोह का एक चचेरा भाई printf printf फ़ाइल के लिए fprintf कहा जाता है,
नोटिस और यह केवल 2 मायनों में अलग है.
एक, यह पी के बजाय च के साथ शुरू होता है,
लेकिन तब क्या जाहिरा तौर पर अपनी पहली तर्क है?
[छात्र] फ़ाइल. >> यह एक फ़ाइल है.
यह fp बुलाया बात है, जो हम अंततः अलग चिढ़ाने के एक फ़ाइल सूचक है,
लेकिन अब के लिए fp बस फ़ाइल का प्रतिनिधित्व करता है कि मैं खोल दिया है,
तो fprintf यहाँ कह रहा है इस उपयोगकर्ता फ़ाइल आईडी प्रिंट स्क्रीन करने के लिए नहीं.
उपयोगकर्ता फाइल करने के लिए नाम, प्रिंट स्क्रीन करने के लिए नहीं,
फ़ाइल के लिए, नहीं स्क्रीन करने के लिए, और फिर यहाँ नीचे, जाहिर है घर,
फ़ाइल को बंद करें, और फिर नीचे मुक्त स्मृति.
>> इस संस्करण 2 और 1 संस्करण के बीच फर्क सिर्फ इतना
fopen का परिचय और * के साथ इस फ़ाइल
और fprintf की इस धारणा है, तो हम देखते हैं कि अंत परिणाम क्या है.
मुझे अपने टर्मिनल विंडो में जाने.
मुझे structs2 चलाने के लिए, दर्ज करें.
लगता है जैसे सब कुछ ठीक है. चलो structs2 फिर से दौड़ना.
123, डेविड माथर, 456, रोब Kirkland,
789, टॉमी माथर दर्ज करें.
जैसे कि यह वही व्यवहार दिखता है, लेकिन अगर मैं अब रास
नोटिस क्या मेरे सभी कोड के बीच यहाँ फ़ाइल में है, डेटाबेस,
तो चलो कि डेटाबेस के जीएडिट, और देखो, उस पर खुला.
यह फ़ाइल स्वरूपों के कामुक नहीं है.
यह वास्तव में प्रति पंक्ति प्रति पंक्ति डेटा लाइन का एक टुकड़ा है,
लेकिन आप में से उन लोगों के लिए, जो Excel या CSV फ़ाइलों का उपयोग अल्पविराम मूल्यों अलग है,
मैं निश्चित रूप से fprintf बजाय शायद कुछ इस तरह करते के लिए इस्तेमाल किया जा सकता है
इतना है कि मैं वास्तव में एक Excel फ़ाइल के बराबर बना सकते हैं
, सिर्फ नई लाइनें नहीं अल्पविराम के साथ चीजों को अलग - अलग करके.
>> इस मामले में अगर मैं बजाय अल्पविराम के बजाय नई लाइनों का इस्तेमाल किया था
मैं सचमुच Excel में इस डेटाबेस फ़ाइल खोल सकता है अगर मैं बजाय यह इस तरह दिखेगा.
संक्षेप में, अब है कि हम फाइल करने के लिए लिखने की शक्ति है
हम अब बने डेटा शुरू कर सकते हैं, यह डिस्क पर आसपास रखने
इतना है कि हम जानकारी के आसपास फिर से और फिर से रख सकते हैं.
अन्य चीजें हैं जो अब कर रहे हैं थोड़ा और अधिक परिचित के एक जोड़े पर ध्यान दें.
इस सी फ़ाइल के शीर्ष पर हम एक typedef
क्योंकि हम एक डेटा प्रकार है कि एक शब्द बनाना चाहता था,
तो इस प्रकार के शब्द कहा जाता है, और अंदर इस संरचना की
अब यह एक छोटे से शौक़ीन है.
जाहिरा तौर पर एक सरणी के एक शब्द क्यों बनाया है?
Intuitively सिर्फ एक शब्द क्या है?
>> यह वर्णों की एक सरणी है.
यह वर्णों के क्रम वापस आ गया है पर वापस.
सभी टोपियां में पत्र के लिए हो सकता है हम मनमाने ढंग से कहना होता है अधिकतम लंबाई
शब्दकोश है कि हम हाथापाई के लिए प्रयोग कर रहे हैं में किसी भी शब्द का.
मैं एक एक क्यों है?
अशक्त चरित्र.
याद जब हम Bananagrams उदाहरण हम एक विशेष मूल्य की जरूरत
शब्द के अंत में क्रम में ट्रैक रखने के लिए
जहां शब्द वास्तव में समाप्त के रूप में, और समस्या सेट विनिर्देश कहते हैं
यहाँ हम एक भी शब्द के साथ एक बूलीयन मान जोड़ रहे हैं,
एक ध्वज है, तो बात है, सही है या गलत.
क्या आप इस शब्द के पहले ही मिल गया है, क्योंकि हम एहसास
हम वास्तव में याद करने का एक तरीका की जरूरत है न केवल हाथापाई में एक शब्द है
लेकिन चाहे या नहीं, मानव, यह मिल गया है
इसलिए कि यदि आप मिल कर शब्द "" आप न सिर्फ टाइप दर्ज कर सकते हैं, दर्ज करें, दर्ज करें,
और 3 अंक, 3 अंक, 3 अंक, 3 अंक मिलता है.
हम एक bool सेटिंग के द्वारा उस शब्द को साल के लिए करने में सक्षम होना चाहते हैं
सच करने के लिए अगर आप पहले से ही पाया है, और इतना है कि क्यों हम है
इस संरचना में समझाया.
>> अब, यहाँ नीचे हाथापाई में यह अन्य शब्दकोश struct कहा जाता है.
यहाँ अनुपस्थित शब्द है typedef है क्योंकि इस मामले में
हम एक शब्दकोश के विचार encapsulate की जरूरत है,
और एक शब्दकोश में शब्दों की एक पूरी गुच्छा है,
इस सरणी के रूप में निहित है, और उन शब्दों में से कितने हैं?
खैर, जो भी इस चर बुलाया आकार कहते हैं.
लेकिन हम सिर्फ एक शब्दकोश की जरूरत है.
हम एक डेटा शब्दकोश बुलाया प्रकार की जरूरत नहीं है.
हम उनमें से सिर्फ एक है, तो यह सी में पता चला है
कि अगर आप typedef कहना नहीं है, तुम सिर्फ struct कहते हैं, तो घुंघराले ब्रेसिज़ के अंदर
आप अपने चर रखा है, तो आप का नाम डाल दिया.
यह एक चर बुलाया शब्दकोश की घोषणा
कि इस तरह दिखता है.
इसके विपरीत करके, इन पंक्तियों के एक पुन: प्रयोज्य डेटा शब्द नामक संरचना पैदा कर रहे हैं
कि आप के कई प्रतियां बनाने के लिए कर सकते हैं, जैसे हम बनाया
छात्रों की कई प्रतियां.
>> यह अंततः क्या करता है हमें ऐसा करने की अनुमति है?
मुझे वापस जाने में, हम कहते हैं, सरल समय से एक सरल उदाहरण,
और मुझे खोलने के लिए, हम कहते हैं, compare1.c.
हाथ में यहाँ समस्या वास्तव में वापस छील है
एक स्ट्रिंग की परत और बंद इन प्रशिक्षण पहियों लेने शुरू
क्योंकि यह है कि एक स्ट्रिंग यह सब समय बदल जाता है
के रूप में हम वास्तव में एक सप्ताह में सिर्फ एक उपनाम का वादा किया है,
एक पर्याय CS50 पुस्तकालय से कुछ है कि एक छोटे से अधिक गुप्त लग रहा है के लिए,
* चार, और हम इस स्टार देखा है पहले.
हम यह फाइलों के संदर्भ में देखा था.
>> चलो अब हम देखते हैं कि हम कुछ समय के लिए किया गया है अब इस विस्तार छुपा.
यहाँ एक compare1.c नामक एक फाइल है,
और यह स्पष्ट तौर पर 2 तार के लिए उपयोगकर्ता पूछता है, और एस टी
और फिर यह लाइन 26 में समानता के लिए उन तार की तुलना करने की कोशिश करता है,
और अगर वे बराबर यह कहते हैं, "आप एक ही बात लिखा है,"
और अगर वे बराबर नहीं कर रहे हैं यह कहते हैं, "आप अलग अलग चीजें टाइप."
मुझे आगे जाना है और इस कार्यक्रम को चलाने.
मुझे अपने स्रोत निर्देशिका में चलते हैं, एक compare1. यह ठीक संकलित.
मुझे compare1 चलाने के.
मैं में ज़ूम प्रवेश करेंगे.
कुछ तो कहो. नमस्कार.
मैं कुछ फिर से कहूँगा. नमस्कार.
मैं निश्चित रूप से अलग अलग बातें नहीं लिखें.
>> मुझे यह फिर से कोशिश. अलविदा.
निश्चित रूप से अलग नहीं है तो, यहां क्या हो रहा है?
खैर, क्या वास्तव में 26 लाइन में तुलना की जा रही है?
[अश्राव्य छात्र]
हाँ, तो यह पता चला है कि एक स्ट्रिंग, डेटा प्रकार, एक सफेद झूठ की तरह है.
एक स्ट्रिंग एक चार * है, लेकिन एक चार * क्या है?
एक चार *, के रूप में वे कहते हैं, एक सूचक है,
और एक सूचक को प्रभावी ढंग से पता है,
स्मृति में एक राशि स्थान है, और यदि आप एक शब्द में नमस्ते की तरह टाइप किया होगा,
तार के पिछले चर्चा से याद
इस शब्द की तरह है, नमस्कार.
याद रखें कि HELLO तरह एक शब्द का प्रतिनिधित्व किया जा सकता है
इस तरह वर्णों की एक सरणी के रूप में
और फिर अंत में एक विशेष चरित्र के साथ अशक्त चरित्र कहा जाता है,
\ अर्थ के रूप में.
क्या वास्तव में एक स्ट्रिंग है?
सूचना है कि इस स्मृति के कई हिस्सा है,
और वास्तव में, यह के अंत में केवल एक बार आप पूरे तार के माध्यम से देखो में जाना जाता है
विशेष अशक्त चरित्र के लिए देख रहे हैं.
लेकिन अगर यह मेरे कंप्यूटर की स्मृति से स्मृति का एक हिस्सा है,
चलो मनमाने ढंग से कहना है कि इस स्ट्रिंग सिर्फ भाग्यशाली है,
और यह मेरे कंप्यूटर रैम के बहुत शुरुआत में रखा गया.
यह बाइट 0, 1, 2, 3, 4, 5, 6 ...
>> जब मैं GetString की तरह कुछ कहते हैं और मैं स्ट्रिंग एस = GetString
क्या वास्तव में वापस आ रहा है जा रहा है?
इन पिछले कई हफ्तों के लिए, क्या वास्तव में एस में संग्रहित किया जा रहा
से प्रति इस स्ट्रिंग नहीं है, लेकिन इस मामले में क्या है संग्रहित किया जा रहा है
क्या वास्तव में GetString करता है क्योंकि संख्या 0
यह शारीरिक रूप से एक स्ट्रिंग वापस नहीं करता है.
वह भी वास्तव में वैचारिक समझ नहीं पड़ता है.
यह क्या करता वापसी एक संख्या है.
उस नंबर HELLO के स्मृति में पता है,
और स्ट्रिंग तो, अगर हम इस परत वापस छील, स्ट्रिंग वास्तव में नहीं मौजूद नहीं है.
यह केवल CS50 पुस्तकालय में सरलीकरण है.
>> यह वास्तव में कुछ चार * कहा जाता है.
चार समझ में आता है, क्योंकि जो एक शब्द की तरह है,?
खैर, यह वर्ण की एक श्रृंखला है, वर्णों की एक श्रृंखला है.
चार * एक चरित्र का पता होता है,
तो क्या यह एक स्ट्रिंग वापस करने के लिए क्या मतलब है?
एक अच्छा, एक स्ट्रिंग लौटने का आसान तरीका
बजाय पता लगाने की कैसे मैं 5 या 6 अलग बाइट्स के लिए वापस करने की कोशिश
मुझे जो बाइट के पते पर लौटने के लिए?
पहले एक.
दूसरे शब्दों में, मुझे तुम स्मृति में एक चरित्र का पता दे.
यही कारण है कि क्या चार * का प्रतिनिधित्व करता है, स्मृति में एक ही चरित्र का पता.
कि चर के कॉल.
एस में स्टोर है कि विशेष रूप से पता है, जो मैं मनमाने ढंग से कहा 0 है,
सिर्फ बातें सरल रखने के लिए है, लेकिन वास्तविकता में यह आम तौर पर एक बड़ी संख्या है.
>> एक मिनट रुको.
यदि आप केवल मुझे पहली चरित्र का पता दे रहे हैं, मैं नहीं जानता कि कैसे पता क्या है
चरित्र के 2, 3, 4 और 5?
[अश्राव्य छात्र]
आप सिर्फ इतना पता है कि जहां स्ट्रिंग के अंत इस काम चाल की जिस तरह से है,
इसलिए जब आप की तरह कुछ printf का उपयोग करें, क्या printf सचमुच अपने तर्क के रूप में लेता है,
याद है कि हम इस% s प्लेसहोल्डर का उपयोग करते हैं, और फिर तुम में पारित
चर कि एक स्ट्रिंग भंडारण है.
क्या तुम सच में गुजर रहे हैं कि स्ट्रिंग के पहले चरित्र का पता है.
Printf तो पाश या एक समय पाश के लिए उस पते प्राप्त करने पर एक का उपयोग करता है,
उदाहरण के लिए, 0, इसलिए मुझे अब यह कर,
printf ("% s \ n");
जब मैं कॉल printf ("% s \ n" s), मैं क्या सच के साथ रहा हूँ printf उपलब्ध कराने के
एस में 1 चरित्र का पता है, जो इस मनमाने ढंग से मामले में एच.
>> Printf कैसे पता है कि क्या वास्तव में स्क्रीन पर प्रदर्शित करने के लिए?
व्यक्ति जो कार्यान्वित किया printf एक समय या पाश के लिए एक पाश लागू
कि का कहना है कि इस चरित्र विशेष अशक्त चरित्र के बराबर है?
यदि नहीं, तो इसे प्रिंट. यह कैसे एक के बारे में?
यदि यह मुद्रित नहीं, इसे प्रिंट, इसे प्रिंट, इसे मुद्रित.
ओह, यह एक खास बात है. मुद्रण बंद करो और उपयोगकर्ता के लिए लौटने.
और कि सचमुच सब कि हुड के नीचे हो रहा है,
और कहा कि एक वर्ग के पहले दिन में पचाने के लिए एक बहुत कुछ है,
लेकिन अब के लिए यह वास्तव में समझ सब कुछ के निर्माण खंड
कि हमारे कंप्यूटर की स्मृति के अंदर चल रहा है,
और अंततः हम एक छोटी सी मदद के साथ अलग चिढ़ाने के हूँ
हमारे मित्रों में से एक से स्टैनफोर्ड में.
>> स्टैनफोर्ड में प्रोफेसर निक Parlante इस अद्भुत वीडियो अनुक्रम किया है
अलग अलग भाषाओं कि शुरू के सभी प्रकार से
इस छोटे claymation चरित्र Binky.
आवाज़ आप कर रहे हैं के बारे में बस कुछ ही 2 पूर्वावलोकन चुपके में सुनना
स्टैनफोर्ड में प्रोफेसर की है, और तुम हो रही है
अब इस अधिकार के केवल 5 या 6 सेकंड,
लेकिन इस नोट जिस पर हम आज समाप्त होगा
और बुधवार को शुरू करते हैं.
मैं आप सूचक Binky पूर्वावलोकन के साथ मज़ा दे.
[♪ ♪ संगीत] [प्रोफेसर Parlante] अरे, Binky.
जागो. यह सूचक मज़ा के लिए समय है.
[Binky] वह क्या है? संकेत के बारे में जानें?
ओह, वाह!
>> हम बुधवार को देखेंगे.
[CS50.TV]