[Powered by Google Translate] [الأسبوع 4] [ديفيد J. مالان] [جامعة هارفارد] [هذا CS50.] [CS50.TV] كل الحق، وهذا هو CS50، وهذا هو بداية الأسبوع 4، وهذا هو واحد من خوارزميات الفرز أبطأ ممكن. الذي كان واحدا أن شاهدنا للتو هناك؟ وكان هذا النوع فقاعة، في أمر كبير O (N ^ 2) + خلاصة القول، والواقع أننا لسنا الوحيدين في هذا العالم ليبدو أن نعرف ما هو نوع فقاعة أو وقته على التوالي. في الواقع، كان هذا حديث مع إريك شميدت جوجل والسناتور السابق باراك أوباما قبل سنوات قليلة مضت. الآن، عضو مجلس الشيوخ، وكنت هنا في جوجل، وأود أن أفكر في خوض انتخابات الرئاسة كمرشح مقابلة عمل. الآن، فإنه من الصعب الحصول على وظيفة رئيسا للبلاد، وأنت تسير من خلال قسوة الآن. كما انها من الصعب الحصول على وظيفة في غوغل. لدينا أسئلة، ونحن نطلب من المرشحين لدينا أسئلة، وهذا هو واحد من لاري شويمر. اعتقد يا رفاق أنا تمزح؟ انها هنا. ما هي الطريقة الأكثر فعالية لفرز مليون 32-بت أعداد صحيحة؟ [ضحك] جيدا أنا آسف. >> لا، لا، لا، لا. أعتقد أن نوع فقاعة سيكون بطريقة خاطئة للذهاب. هيا، الذي قال له ذلك؟ الأسبوع الماضي أذكر أننا حصل على اجازة من التعليمات البرمجية، على الأقل ليوم واحد، وبدأ التركيز على بعض الأفكار مستوى أعلى وحل المشكلات بشكل أعم في سياق البحث والفرز، وقدمنا ​​شيئا لأننا لم صفعة على هذا الاسم في الأسبوع الماضي، ولكن مقارب التدوين، وO الكبير، وأوميغا الكبير، وكانت في بعض الأحيان التدوين ثيتا الكبير، وهذه ببساطة طرق لوصف إدارة الوقت من الخوارزميات، كم من الوقت يستغرق لخوارزمية لتشغيل. وربما تذكرون أن تحدثت عن إدارة الوقت من حيث حجم من المدخلات، والتي نسميها عموما N، مهما كانت المشكلة قد يكون، حيث n هو عدد الأشخاص في الغرفة، بدأ عدد من الصفحات في دفتر الهاتف، ونحن لكتابة الامور مثل O (N ^ 2) أو O (ن) أو O (ن سجل ن)، وحتى عندما لم الرياضيات لا يعمل تماما من ذلك تماما وكان ن ² - ن / 2 أو شيء من هذا القبيل بدلا من ذلك فإننا مجرد رمي بعيدا بعض المصطلحات أقل النظام، وهناك الدافع هو أننا نريد حقا نوع من طريقة الهدف من تقييم أداء البرامج أو أداء خوارزميات أنه في نهاية اليوم لا علاقة له، على سبيل المثال، مع سرعة جهاز الكمبيوتر الخاص بك اليوم. على سبيل المثال، إذا قمت بتطبيق نوع فقاعة، أو تطبيق دمج نوع أو اختيار نوع على جهاز الكمبيوتر اليوم، كمبيوتر غيغاهرتز 2، وتشغيله، والأمر يحتاج إلى بعض عدد الثواني في العام القادم هناك 3 غيغاهرتز أو قد غيغاهرتز جهاز كمبيوتر 4، وتدعون بعد ذلك أن "نجاح باهر، بلدي خوارزمية الآن أسرع مرتين "، بينما الحقيقة أن من الواضح ليس هو الحال. انها مجرد حصلت أسرع الأجهزة، ولكن جهاز الكمبيوتر الخاص بك لم، وهكذا كنا نريد حقا أن تتخلص من الأشياء مثل مضاعفات 2 أو مضاعفات 3 عندما يتعلق الأمر بوصف سرعة وبطء كيف خوارزمية هو حقا فقط والتركيز على n أو بعض العوامل منها، بعض السلطة منه كما في حالة أنواع من الأسبوع الماضي. وأذكر أنه مع مساعدة من نوع الدمج كنا قادرين على القيام بذلك أفضل بكثير من نوع فقاعة ونوع الاختيار وحتى نوع الإدراج. وصلنا الى ن ن سجل، ومرة ​​أخرى، يذكر أن ن سجل عموما يشير إلى شيء ما ينمو أكثر ببطء ثم ن، ن ذلك السجل ن بالتالي كان بعيدا جيدة لأنه كان أقل من ² ن. ولكن لتحقيق ن ن مع تسجيل نوع الدمج ما هو الجرثومية الأساسية للفكرة التي كانت لدينا للاستفادة كما أننا الاستدانة مرة أخرى في الأسبوع 0؟ كيف نعالج مشكلة الفرز بذكاء مع نوع الدمج؟ ما هو الفكرة الرئيسية، ربما؟ أي شخص على الإطلاق. حسنا، دعونا اتخاذ خطوة إلى الوراء. وصف دمج النوع في الكلمات الخاصة بك. كيف يعمل؟ حسنا، سنقوم الصف إلى 0 الاسبوع. حسنا، نعم. [غير مسموع والطالب] حسنا، وحسن، وتنقسم لذلك نحن مجموعة من الأرقام في 2 قطعة. قمنا بفرز كل من هذه القطع، وبعد ذلك اندمجت بها، ولقد رأينا هذه الفكرة قبل اتخاذ هذا مشكلة بهذا الحجم وتقطيع عنه إلى مشكلة بهذا الحجم وهذا أو كبيرة هذا. أذكر على سبيل المثال دفتر الهاتف. أذكر خوارزمية العد الذاتي من أسابيع، وقد لخص ذلك النوع دمج هذا شبة الكود هنا. عندما كنت تحصل عناصر N، كان لأول مرة تحقق التعقل. إذا كانت n <2 ثم لا تفعل أي شيء على الإطلاق لأنه إذا كان N <2 N ثم من الواضح 0 أو 1، وهكذا اذا كان إما 0 أو 1 لا يوجد شيء لفرز. الانتهاء من ذلك. وبالفعل قائمة مصنفة بشكل مسلي. ولكن إذا كنت قد حصلت على خلاف ذلك 2 أو أكثر من العناصر المضي قدما وتفرق بينهما في 2 نصفين، الأيمن والأيسر. فرز كل تلك نصفين، ثم دمج شطري فرزها. ولكن المشكلة هنا هي أن هذا للوهلة الأولى يشعر وكأننا التسيير. هذا هو تعريف دائري في أنني إذا كنت قد طلبت لفرز هذه العناصر ن وكنت تقول لي: "حسنا، حسنا، سنقوم فرز تلك العناصر ن / 2 و ن تلك / 2،" ثم سؤالي القادم سيكون "الجميلة، كيف فرز ن / عناصر 2؟" ولكن نظرا للهيكل هذا البرنامج، بسبب وجود هذه الحالة قاعدة، إذا جاز التعبير، هذه الحالة الخاصة التي تقول إذا كانت n هي قيمة ثابتة <بعض مثل 2 العودة فورا. لا تستجيب مع نفس الجواب الذي دائرية. هذه العملية، وهذا دوروية نهاية المطاف. إذا أطلب منكم "فرز هذه العناصر ن"، وتقول، "حسنا، هذه المرتبة ن / 2" ثم تقول: "حسنا، هذه النوع ن / 4، N / 8، n/16" في نهاية المطاف سوف القسمة على عدد كبير بما فيه الكفاية أن سيكون لديك فقط 1 عنصر الزمن، وعند هذه النقطة يمكن القول، "هنا، وهنا عنصر مصنفة واحدة." ثم تألق هذه الخوارزمية حتى هنا هو اشتقاق من حقيقة أنه بمجرد أن يكون لديك كل هذه القوائم تم الفرز بشكل فردي، وكلها من حجم 1، والذي يبدو أن لا طائل منه، بمجرد أن تبدأ دمجها ودمجها يمكنك بناء وأخيرا روب فعلت في الفيديو قائمة تم فرزها أخيرا. ولكن هذه الفكرة تمتد إلى ما هو أبعد الفرز. هناك هذه الفكرة جزءا لا يتجزأ من هذا البرنامج المعروف باسم العودية، فكرة حيث كنت البرنامج، ولحل بعض المشاكل يمكنك استدعاء نفسك، أو وضعها في سياق لغات البرمجة كنت وظيفة، ومن أجل حل المشكلة، لك وظيفة استدعاء نفسك مرة أخرى ومرة ​​أخرى ومرة ​​أخرى، ولكن لك وظيفة لا يمكن استدعاء نفسك عدة مرات بلا حدود. في نهاية المطاف لديك لأسفل خارج، إذا جاز التعبير، وبعض حالة الثابت ترميز قاعدة التي تقول عند هذه النقطة تتوقف الدعوة نفسك بحيث العملية برمتها وأخيرا لا تتوقف في الواقع. ماذا يعني هذا حقا، لإعادة لعنة؟ دعونا نرى، ما اذا كنا نستطيع القيام بسيطة، على سبيل المثال تافهة مع، ويقول، 3 أشخاص معي هنا على خشبة المسرح، إذا كان شخص ما هو مريح. 1، تأتي في 2 و حتى و 3. إذا أنت 3 تريد أن تأتي إلى هنا. إذا كنت تريد أن تقف بجوار لي هنا في خط، لنفترض أن المشكلة في متناول اليد ومسلي جدا حساب عدد الناس الموجودين هنا. ولكن بصراحة، أنا متعب من كل هذه الأمثلة العد. هذا هو الذهاب الى يستغرق بعض الوقت، 1، 2، ونقطة، نقطة، نقطة. انه سيكون لاتخاذ إلى الأبد. يهمني فقط بدلا بونت هذه المشكلة تماما بمساعدة-ما هو اسمك؟ سارة. >> سارة، كل الحق. كيلي. >> كيلي و؟ ويلي. >> ويلي، وسارة، كيلي، وويلي. الآن لقد طلب مني من قبل شخص على السؤال كم من الناس على ما يصل هذه المرحلة، وليس لدي أي فكرة. هذه هي قائمة طويلة حقا، وبدلا من ذلك أنا ذاهب للقيام بذلك خدعة. انا ذاهب الى أن تطلب من الشخص المجاور لي أن تفعل أكثر من عمل، وبمجرد القيام فعلت أكثر من عمل انا ذاهب الى القيام حجم العمل بأقل قدر ممكن وإضافة فقط 1 الجواب على كل ما هو لها، حتى هنا نذهب. لقد سألت كم عدد الناس على خشبة المسرح. كم عدد الناس على خشبة المسرح إلى اليسار من أنت؟ يسار لي؟ >> حسنا، ولكن لا تغش لا. هذا امر جيد، وهذا صحيح، ولكن إذا أردنا أن يستمر هذا المنطق دعونا نفترض أنك تريد على غرار بونت هذه المشكلة على يسار لك، وذلك بدلا من الذهاب مباشرة قبل الإجابة ويمر باك. أوه، كم من الناس هم على يسار البيانات؟ كم عدد الناس إلى اليسار؟ 1. [ضحك] حسنا، لذلك 0، ويلي ذلك ما قامت به الآن ولقد عاد لك إجابتك هذا الاتجاه قائلا 0. الآن، ماذا يجب ان تفعل؟ >> 1. حسنا، لذلك كنت من 1، لذلك أقول لك، "حسنا، أنا ذاهب إلى إضافة 1 إلى أي عدد كان ويلي، "لذلك 1 + 0. كنت الآن 1 حتى الإجابة على الحق الآن، 1. أن يكون >> والألغام 2. جيدة، لذلك كنت أخذ الجواب السابق 1، واضاف ان كمية ضئيلة من العمل الذي تريد القيام به، وهو +1. لديك الآن 2، وأنت تسلم لي ثم القيمة التي؟ 3، أعني، آسف، 2. جيدة. حسنا، كان لدينا 0 إلى اليسار. ثم كان لدينا 1 ثم نضيف 2، والآن أنت لي تسليم عدد 2، وأنا أقول ذلك، حسنا، +1، 3. هناك بالفعل 3 أشخاص يقف بجانبي في هذه المرحلة، لذلك يمكن فعلنا من الواضح أن هذا خطيا جدا، كثيرا في الأزياء واضحة، ولكن ما لم نفعله حقا؟ اتخذنا مشكلة حجم 3 في البداية. ونحن بعد ذلك حطم عليه إلى مشكلة حجم 2، ثم مشكلة حجم 1، ثم أخيرا الحالة الأساسية كان حقا، أوه، لا يوجد أحد هناك، في نقطة ويلي الذي عاد بشكل فعال على إجابة الثابت ترميز بضع مرات، وانفجر بعد ذلك حتى ثانية واحدة، حتى انفجر، انفجر فوق، ومن ثم عن طريق إضافة 1 واحد في هذا إضافية لقد نفذنا هذه الفكرة الأساسية من العودية. الآن، في هذه الحالة فإنه لا يحل مشكلة حقا أي على نحو أكثر فعالية ثم شاهدنا حتى الآن. ولكن التفكير في الخوارزميات فعلناه على خشبة المسرح حتى الآن. كان لدينا 8 قطع من الورق على السبورة، على الفيديو عند شون كان يبحث عن رقم 7، وماذا يفعل حقا؟ حسنا، أنه لم يفعل أي نوع من فرق تسد. وقال انه لا يفعل أي نوع من العودية. بل كان مجرد فعل هذه الخوارزمية الخطية. ولكن عندما قدمنا ​​فكرة أرقام مصنفة على خشبة المسرح يعيش الأسبوع الماضي ثم كان لدينا هذه الغريزة من الذهاب إلى الوسط، وعند هذه النقطة كان لدينا قائمة من أصغر حجم 4 أو قائمة أخرى من حجم 4، ومن ثم كان لدينا نفس المشكلة بالضبط، لذلك نحن المتكررة، المتكررة المتكررة. وبعبارة أخرى، نحن recursed. شكرا جزيلا للمتطوعين لدينا 3 لبيان العودية هنا معنا. دعونا نرى ما اذا كنا نستطيع لا تجعل من هذا الآن ملموسة أكثر من ذلك بقليل، حل المشكلة التي يمكننا القيام به مرة أخرى بسهولة جدا، ولكن سوف نستخدمها كنقطة انطلاق لتنفيذ هذه الفكرة الأساسية. إذا أريد لحساب محصلة مجموعة من الأرقام، على سبيل المثال، إذا كنت تمر في عدد 3، أريد أن أعطيك قيمة سيجما 3، وبالتالي فإن مجموع 3 + 2 + 1 + 0. أريد أن نعود الجواب 6، وهكذا لن ننفذ هذه المهمة سيجما، هذه الخاصية الجمع أنه، مرة أخرى، ويأخذ في الإدخال، ومن ثم إرجاع الجمع من هذا العدد على طول الطريق وصولا الى 0. يمكن أن نفعل ذلك ببساطة جدا، أليس كذلك؟ يمكن أن نفعل هذا مع نوع ما من بنية التكرار، لذلك اسمحوا لي المضي قدما والحصول على هذا بدأت. وتشمل stdio.h. اسمحوا لي أن الحصول على نفسي في الرئيسية للعمل مع هنا. دعونا حفظ هذا كما sigma.c. ثم انا ذاهب للذهاب هنا، وانا ذاهب الى اعلان ن الباحث، وانا ذاهب الى القيام بما يلي في حين أن المستخدم لم تتعاون. في حين أن المستخدم لم تعط لي رقما موجبا اسمحوا لي أن تمضي قدما وتدفعهم للGetInt = ن، واسمحوا لي أن أقدم لهم بعض الإرشادات حول ما يجب القيام به، حتى printf ("عدد صحيح موجب من فضلك"). مجرد شيء بسيط نسبيا مثل هذا بحيث بحلول الوقت الذي يصل السطر 14 لدينا الآن عدد صحيح موجب يفترض في ن. الآن دعونا نفعل شيئا معها. اسمحوا لي أن تمضي قدما وحساب الجمع، لذلك الباحث المبلغ. = سيجما (ن) سيغما هو مجرد الجمع، لذلك أنا أكتب فقط في طريقة مربي الحيوانات. سنقوم فقط الذي يطلق عليه سيجما هناك. هذا المبلغ، والآن انا ذاهب لطباعة النتيجة، printf ("مجموع هو٪ د \ ن"، SUM). وبعد ذلك سوف أعود 0 لحسن التدبير. لقد فعلنا كل شيء أن هذا البرنامج يتطلب إلا الجزء مثيرة للاهتمام، وهو في الواقع لتنفيذ وظيفة سيغما. اسمحوا لي هنا تنخفض إلى أسفل، واسمحوا لي أن تعلن وظيفة سيغما. انها حصلت على اتخاذ متغير عدد صحيح من هذا النوع، وما نوع البيانات لا أريد العودة من المفترض سيجما؟ الباحث، لأنني أريد أن يطابق توقعاتي على خط 15. اسمحوا لي هنا في المضي قدما وتنفيذ هذه بطريقة جميلة واضحة. دعونا نمضي قدما ويقول الباحث مجموع = 0، والآن انا ذاهب للذهاب لديها القليل لحلقة هنا هذا ما أريد أن أقول شيئا من هذا القبيل، ل (كثافة العمليات ط = 0، وأنا <= عدد، وأنا + +) + مبلغ = ط. ثم انا ذاهب الى العودة المبلغ. كان يمكن أن تنفذ في أي I هذا بعدة طرق. يمكن أن تستخدم I حلقة من الوقت. يمكن أن يكون تخطي I باستخدام متغير مبلغ إذا أردت حقا أن، ولكن باختصار، لدينا فقط وظيفة أنه إذا لم أكن الأبله تعلن المبلغ هو 0. بعد ذلك بالتكرار من 0 على ما يصل من خلال العدد، وعلى كل التكرار فإنه يضيف أن القيمة الحالية لمجموع وإرجاع المبلغ. الآن، هناك التحسين الطفيف هنا. وربما هذا هو خطوة يضيع، ولكن فليكن ذلك. هذا شيء طيب في الوقت الراهن. نحن على الأقل يجري شامل والذهاب 0 جميع الطريق على ما يصل. ليس من الصعب جدا وجميلة واضحة، ولكن تبين أن وظيفة مع سيجما لدينا نفس الفرصة كما فعلنا هنا على خشبة المسرح. على خشبة المسرح اعتمدنا فقط عدد الاشخاص الذين كانوا بجواري، ولكن بدلا من ذلك إذا أردنا أن نحصي عدد 3 + 2 + 1 نزولا إلى 0 يمكن بونت نحن بالمثل إلى وظيفة التي سوف أصف بدلا بأنها متكررة. دعونا هنا في للا التعقل سريعة تحقق وتأكد من أنني لم الأبله. أنا أعلم أن هناك على الأقل شيء واحد في هذا البرنامج أنني لم ظلموا. عندما تصل إلى تدخل أنا ذاهب للحصول على أي نوع من الصراخ في وجهي؟ ما أنا على وشك أن صرخ في وحول؟ نعم، لقد نسيت النموذج، لذلك أنا باستخدام دالة يسمى سيغما على خط 15، ولكن هذا لم تعلن حتى السطر 22، لذلك أنا أفضل ترتفع بشكل استباقي هنا وتعلن نموذج أولي، وأنا أقول الباحث سيجما (الباحث العدد)، وهذا كل شيء. انها تنفذ في الجزء السفلي. أو وسيلة أخرى أستطيع أن حل هذه، ويمكنني أن تتحرك وظيفة هناك، وهي ليست سيئة، ولكن على الأقل عندما تبدأ البرامج للحصول على البعيد، بصراحة، أعتقد أن هناك بعض القيمة في وجود دائما في أعلى الرئيسية بحيث يمكنك في القارئ فتح الملف ونرى بعد ذلك على الفور ما يقوم به البرنامج دون الحاجة إلى البحث من خلال ذلك أبحث عن تلك الوظيفة الرئيسية. دعونا نذهب الى نافذة طرفية بلدي هنا، ومحاولة جعل سيغما جعل سيغما، وثمل بي الأمر هنا أيضا. إعلان ضمني من GetInt ظيفة يعني أنني قد نسيت أن تفعل ماذا؟ [غير مسموع والطالب] جيد، على ما يبدو حتى خطأ شائع، لذلك دعونا نضع هذا الأمر هنا، cs50.h، والآن دعونا نعود إلى إطار المحطة الطرفية بلدي. سوف أقوم بمسح الشاشة، وأنا أعد جعل سيغما. ويبدو أنها قد جمعت. اسمحوا لي الآن تشغيل سيغما. أنا اكتب في عدد 3، وأنا لم احصل على 6، حتى لا شيك صارمة، ولكن على الأقل يبدو أن العمل لأول وهلة، ولكن الآن دعونا مزق إربا، ودعونا النفوذ في الواقع فكرة العودية، مرة أخرى، في سياق بسيط جدا لدرجة أنه في غضون أسابيع قليلة " عندما نبدأ استكشاف هياكل البيانات مربي الحيوانات من المصفوفات لدينا أداة أخرى في مجموعة الأدوات التي ل التلاعب تلك هياكل البيانات كما سنرى. هذا هو النهج متكررة، والنهج القائم على حلقة. اسمحوا لي أن تفعل هذا الآن بدلا. اسمحوا لي أن أقول بدلا من ذلك أن الجمع من عدد نزولا إلى 0 هو في الحقيقة نفس الشيء عدد سيغما + (عدد - 1). وبعبارة أخرى، تماما مثل على خشبة المسرح I مسير إلى كل من الشعب المجاور لي، وهؤلاء بدورهم أبقى التسيير حتى نحصل في النهاية إلى أدنى مستوياته في ويلي، الذين اضطروا إلى العودة على إجابة الثابت تلوينها مثل 0. هنا نحن الآن التسيير على غرار سيغما نفس الوظيفة كما كان يسمى في الأصل، ولكن الفكرة الرئيسية هنا هو أننا لا ندعو سيغما مماثل. نحن لا يمر في ن. نحن يمر بوضوح في عدد - 1، ذلك مشكلة أصغر قليلا، المشكلة أصغر قليلا. للأسف، هذا ليس حلا للغاية حتى الآن، وقبل إصلاح نحن قد يكون ما القفز كما هو واضح في بعض منكم اسمحوا لي أن تمضي قدما وجعل إعادة تشغيل. يبدو أن يجمع بخير. اسمحوا لي أن أعد تشغيل سيجما مع 6. يصيح، اسمحوا لي أن أعد تشغيل سيجما مع 6. لقد شهدنا هذا من قبل، وإن كان ذلك آخر مرة بطريق الخطأ كذلك. لماذا لم أحصل على هذا الخطأ تجزئة خفي؟ نعم. [غير مسموع والطالب] ليس هناك حالة قاعدة، وبشكل أكثر تحديدا، ما حدث ربما؟ هذا هو عرض من أعراض ما السلوك؟ يقول بصوت أعلى قليلا. [غير مسموع والطالب] انها حلقة لا نهائية على نحو فعال، والمشكلة مع حلقات لانهائية عندما تنطوي على العودية في هذه الحالة، وهي وظيفة تطلق على نفسها، ما يحدث كل مرة تقوم فيها استدعاء دالة؟ حسنا، اعتقد مرة أخرى إلى الطريقة التي وضعت الذاكرة في جهاز الكمبيوتر. قلنا أن هناك جزءا من الذاكرة هذا يسمى كومة هذا في الجزء السفلي، ويحصل على وضع كل مرة كنت استدعاء دالة الذاكرة أكثر من ذلك بقليل على هذا المكدس يسمى المتغيرات التي تحتوي على الدالة المحلية أو معلمات، إذا كان الأمر كذلك سيجما سيجما سيجما المكالمات يدعو سيجما  يدعو سيغما أين هذه الغاية القصة؟ حسنا، انها في نهاية المطاف تجاوز المبلغ الإجمالي من الذاكرة التي لديك المتاحة على جهاز الكمبيوتر الخاص بك. كنت تجاوز القطعة التي كنت من المفترض أن البقاء في حدود، ملقاة الأساسية وتحصل على هذا الخطأ تجزئة،، وماذا يعني ملقاة الأساسية هي أن لدي الآن ملف يسمى الأساسية وهو الملف الذي يحتوي على الأصفار ومنها التي ستكون في الواقع في المستقبل أن تكون مفيدة في التشخيص. إذا لم تكن واضحة بالنسبة لك حيث الخاص بك هو علة يمكنك القيام به في الواقع قليلا من تحليل الطب الشرعي، إذا جاز التعبير، على هذا الملف تفريغ الأساسية، والتي، مرة أخرى، هو مجرد مجموعة كاملة من الأصفار ومنها الذي يمثل أساسا لحالة البرنامج في الذاكرة تحطمت لحظة في هذا الطريق. الإصلاح هنا هو أن نتمكن من العودة وليس فقط عمياء سيغما، عدد سيغما + من مشكلة أصغر قليلا. نحن في حاجة الى نوع من الحالة الأساسية هنا، وماذا يجب أن تكون الحالة الأساسية ربما؟ [غير مسموع والطالب] حسنا، طالما كان الرقم إيجابيا يجب علينا أن نعود في الواقع هذا، أو بعبارة أخرى، إذا كان الرقم هو، مثلا، <= إلى 0 كنت تعرف ما، سوف تمضي قدما والعودة 0، مثل الكثير ويلي فعل، وآخر، وأنا ذاهب إلى المضي قدما وهذا يعود، حتى انها ليست أن الكثير أقصر من الإصدار متكررة أننا جلد حتى باستخدام لأول مرة عن حلقة، ولكن لاحظت أن هناك هذا النوع من الأناقة على ذلك. بدلا من إعادة بعض عدد وتنفيذ جميع هذه الرياضيات وإضافة الامور مع المتغيرات المحلية كنت تقول بدلا من ذلك "حسنا، إذا كان هذا هو مشكلة السوبر سهلة، مثل هذا العدد <0، اسمحوا لي العودة فورا 0 ". نحن لن يزعج الأرقام السالبة الداعمة، لذلك أنا ذاهب إلى رمز الثابت قيمة 0. لكن على خلاف ذلك، لتنفيذ هذه الفكرة من تلخيص كل هذه الأرقام معا بشكل فعال يمكنك أن تأخذ لدغة صغيرة من المشكلة، مثل الكثير من فعلنا هنا على خشبة المسرح، ثم بونت بقية من المشكلة إلى الشخص التالي، لكن في هذه الحالة الشخص التالي هو نفسك. انها دالة باسم مماثل. يمر عليه مشكلة أصغر وأصغر وأصغر في كل مرة، وعلى الرغم من أننا لم أشياء رسمية جدا في الرمز هنا هذا هو بالضبط ما كان يدور في الاسبوع 0 مع دفتر الهاتف. هذا هو بالضبط ما كان يدور في الأسابيع الماضية مع شون ومع المظاهرات لدينا من البحث عن الأرقام. انها مشكلة مع وتقسيمه مرة أخرى ومرة ​​أخرى. وبعبارة أخرى، هناك طريقة لترجمة الآن هذا بناء العالم الحقيقي، وهذا بناء مستوى أعلى من فرق تسد والقيام بشيء مرة أخرى ومرة ​​أخرى في التعليمات البرمجية، لذلك هذا هو شيء سوف نرى مرة أخرى على مر الزمن. الآن، بوصفها جانبا، إذا كنت جديدا على العودية يجب أن نفهم الآن على الأقل لماذا هذا هو مضحك. انا ذاهب للذهاب إلى google.com، وانا ذاهب للبحث عن بعض النصائح والحيل على العودية، أدخل. نقول للشخص إلى جانبك إذا كانوا لا يضحكون الآن فقط. هل تقصد العودية؟ هل تقصد آه، هناك نذهب. حسنا، الآن هي بقية الجميع. A بيضة عيد الفصح قليلا جزءا لا يتجزأ من هناك في مكان ما في جوجل. بوصفها جانبا، واحدة من وصلات وضعنا على الموقع الإلكتروني للدورة في لهذا اليوم فقط هذه الشبكة من خوارزميات الفرز المختلفة، بعضها بدا ونحن في الأسبوع الماضي، ولكن ما هو الجميل في هذا التصور كما كنت في محاولة للالتفاف حول عقلك الأشياء مختلفة تتعلق خوارزميات تعلم أنه يمكنك بسهولة جدا تبدأ الآن مع أنواع مختلفة من المدخلات. المدخلات عكس كل شيء، والمدخلات مصنفة في معظمها، والمدخلات العشوائية وهكذا دواليك. وأنت تحاول أن، مرة أخرى، تميز هذه الأشياء في عقلك ندرك أن هذا URL على موقع الدورة على محاضرات في الصفحة قد تساعدك السبب من خلال بعض من هؤلاء. اليوم نصل في النهاية إلى حل هذه المشكلة من حين الى الوراء، وكان أن هذه الوظيفة التي المبادلة فقط لا يعمل، وماذا كانت المشكلة الأساسية مع هذا مبادلة وظيفة، والهدف منه هو، مرة أخرى، لتبادل قيمة هنا وهنا مثل ذلك؟ لم يكن هذا العمل فعلا. لماذا؟ نعم. [غير مسموع والطالب] بالضبط، وتفسير لهذا bugginess كان ببساطة لأن عند استدعاء وظائف في C وهذه المهام تأخذ الحجج، مثل ألف وباء هنا، الذي يتم تمرير كل ما في نسخ من قيمة كنت تزويد تلك الوظيفة. أنت لا تقدم القيم الأصلية نفسها، حتى رأينا هذا في سياق buggyc، buggy3.c، التي بدت شيئا قليلا من هذا القبيل. أذكر أنه كان لدينا x و y تهيئة إلى 1 و 2 على التوالي. نحن المطبوعة ثم ما كانت عليه. ثم زعم أن أنا كنت مبادلة منهم عن طريق استدعاء مبادلة س، ص. ولكن المشكلة أن عملت مبادلة، ولكن فقط في نطاق مبادلة الدالة نفسها. بمجرد ضرب لنا خط 40 تبادلت تلك القيم وألقيت بعيدا، وهكذا شيئا في وظيفة الأصلي تم تغيير الواقع الرئيسي في كل شيء، حتى إذا كنت تعتقد في ذلك الوقت على ما يبدو هذا من حيث ذاكرتنا إذا هذا الجانب الأيسر من لوحة تمثل- وسوف أبذل قصارى جهدي للجميع لرؤية هذا، إذا كانت هذه الجانب الأيسر من لوحة يمثل، مثلا، RAM الخاص بك، والمكدس هو الذهاب الى تنمو على ما يصل بهذه الطريقة، وندعو وظيفة مثل الرئيسية، وأهم المتغيرات المحلية يوجد 2، X و Y، دعونا كما وصف تلك X هنا، ودعونا وصف هذه كما ذ هنا، ودعونا نضع في قيم 1 و 2، لذلك هذا هو هنا الرئيسية، وعندما يستدعي الدالة الرئيسي المبادلة نظام التشغيل يعطي وظيفة مبادلة رقعة الخاصة من الذاكرة على المكدس، الإطار الخاص بها على المكدس، إذا جاز التعبير. فإنه يخصص أيضا 32 بت لهذه رجات. يحدث أن تسميها ألف وباء، ولكن هذا التعسفي تماما. كان يمكن أن يطلق عليه منها ما تشاء، ولكن ماذا يحدث عندما الرئيسي مكالمات المبادلة يستغرق هذا 1، يضع نسخة هناك، ويضع نسخة هناك. هناك 1 متغير المحلية الأخرى في مبادلة، على الرغم من، ودعا ماذا؟ >> TMP. TMP، لذلك اسمحوا لي أن أقدم نفسي آخر 32 بت هنا، وماذا فعلت في هذه الوظيفة؟ قلت TMP الباحث يحصل على، لذلك عدد 1، لذلك فعلت هذا عندما لعبنا مع هذا المثال الأخير. ثم يحصل ب، لذلك هو 2 ب، وحتى الآن هذا يصبح 2، والآن يحصل ب مؤقت، لذلك الحرارة هي 1، حتى الآن ب يصبح هذا. هذا أمر عظيم. عملت. ولكن بعد ذلك بأسرع ما ترجع الدالة ذاكرة مبادلة لليختفي بشكل فعال بحيث يمكن إعادة استخدامها من قبل بعض وظيفة أخرى في المستقبل، وأهم من الواضح تماما دون تغيير. نحن بحاجة إلى وسيلة لحل هذه المشكلة جذريا، واليوم سيكون لدينا أخيرا وسيلة لتحقيق ذلك حيث يمكننا تقديم شيء يسمى المؤشر. تبين أن نتمكن من حل هذه المشكلة لا عن طريق تمرير في نسخ من x و y ولكن بدلا من ذلك عن طريق تمرير ما في، هل تعتقد، إلى وظيفة المبادلة؟ نعم، ماذا عن عنوان؟ نحن لم نتحدث حقا عن عناوين في الكثير من التفاصيل، ولكن إذا كانت هذه السبورة يمثل ذاكرة الكمبيوتر الخاص بي يمكن أن نبدأ بالتأكيد ترقيم بايت RAM في بلدي وأقول هذا هو البايت رقم 1، وهذا هو البايت رقم 2، رقم 3 بايت، # 4 بايت، بايت # ... 2 مليار جنيه إذا لدي 2 غيغا بايت من ذاكرة الوصول العشوائي، لذا فإننا يمكن أن تأتي بالتأكيد مع بعض نظام ترقيم التعسفي لجميع الأفراد بايت في ذاكرة الكمبيوتر الخاص بي. ماذا لو بدلا عندما أعطي الكلمة المبادلة بدلا من النجاح في نسخ من x و y لماذا لا استطيع تمرير بدلا من ذلك في عنوان X هنا، عنوان Y هنا، أساسا العنوان البريدي x و y لأنه مبادلة ثم، وإذا ما أبلغ من عنوان في الذاكرة من X و Y، مبادلة ثم، إذا كنا تدريب له قليلا، يمكن أن تدفع إلى هذا العنوان يحتمل، إذا جاز التعبير، س، وهناك تغيير رقم، ثم دفع إلى عنوان ذ، تغيير رقم هناك، حتى في الوقت الذي لا تحصل على نسخ من تلك القيم نفسه، على الرغم من ذلك تحدثنا عن هذا بأنه في الذاكرة الرئيسية وهذا كما يجري تبادل للذاكرة قوية وخطيرة من الجزء C هو أن أي وظيفة في أي مكان يمكن أن تلمس الذاكرة في الكمبيوتر، وهذا هو قوي في ذلك يمكنك أن تفعل أشياء يتوهم جدا مع برامج الكمبيوتر في C. هذا أمر خطير لأنه يمكنك أيضا المسمار بسهولة بالغة. في الواقع، يمكن استغلالها واحدة من الطرق الأكثر شيوعا لبرامج هذه الأيام لا يزال لمبرمج لا لتحقيق أن كان هو أو هي السماح لبيانات أن تكون مكتوبة في موقع في الذاكرة التي لم يكن القصد. على سبيل المثال، أو أنها تعلن مجموعة من حجم 10 ولكن بعد ذلك يحاول أن يضع بطريق الخطأ 11 بايت إلى أن مجموعة من الذاكرة، وتبدأ لمس أجزاء من الذاكرة التي لم تعد صالحة. فقط لهذا السياق، قد يعلم بعضكم أن برنامج المطالبات كثيرا ما كنت لالأرقام التسلسلية أو مفاتيح التسجيل، فوتوشوب و Word وبرامج من هذا القبيل. توجد الشقوق، كما يعلم بعضكم، حيث عبر الإنترنت يمكنك تشغيل برنامج قليلا، وفويلا، لا أكثر طلب للحصول على الرقم التسلسلي. كيف ذلك العمل؟ في كثير من الحالات هذه الأشياء تجد ببساطة في أجهزة الكمبيوتر النص في قطاعات الأصفار للكمبيوتر الفعلية ومنها حيث أن وظيفة حيث يتم طلب الرقم التسلسلي، وقمت بالكتابة فوق هذه المساحة، أو أثناء تشغيل البرنامج يمكنك معرفة حيث يتم تخزين المفتاح في الواقع باستخدام ما يسمى مصحح، ويمكنك قضاء البرمجيات على هذا النحو. هذا لا يعني أن هذا هو هدفنا لاليومين القادمين، لكنه لا يملك جدا في العالم الحقيقي تداعيات. يحدث أن واحدا على إشراك سرقة البرمجيات، ولكن هناك أيضا حل وسط من الآلات كلها. في الواقع، عندما يتم استغلال المواقع في هذه الأيام وخطر تسرب البيانات وسرقة كلمات المرور ويتم هذا في كثير من الأحيان تتصل سوء إدارة الذاكرة واحد، أو، في حالة قواعد البيانات، وعدم توقع الخصومة الإدخال، أكثر من ذلك على أنه في الأسابيع القادمة، لكن في الوقت الراهن مجرد معاينة التسلل من هذا النوع من الضرر الذي يمكنك القيام به من خلال عدم فهم كيفية عمل الأشياء تماما تحت غطاء محرك السيارة. دعونا نذهب حول فهم لماذا يتم تقسيم هذه مع أداة من شأنها أن تصبح أكثر وأكثر فائدة كما برامجنا الحصول على أكثر تعقيدا. حتى الآن عندما كنت قد خلل في البرنامج كيف لك أن ذهبت حول تصحيح الأخطاء ذلك؟ ما لم تكن التقنيات الخاصة بك حتى الآن، ما إذا كانت تدرس من قبل TF الخاص أو مجرد العصاميين؟ [طالب] Printf. Printf، لذلك ربما كان printf صديقك في أنه إذا كنت تريد أن ترى ما يجري في الداخل للبرنامج الخاص بك كنت وضعت للتو هنا printf، وهنا printf، وهنا printf. ثم تشغيله، وتحصل على مجموعة كاملة من الاشياء التي تظهر على الشاشة التي يمكنك استخدامها للاستدلال ثم ما يجري في الواقع خطأ في البرنامج. يميل إلى أن يكون Printf شيء قوي جدا، ولكن من عملية يدوية جدا. لديك لوضع printf هنا، وهنا printf، وإذا وضعته داخل حلقة قد تحصل على 100 خطوط من الإخراج الذي لديك ثم للتدقيق من خلال. انها ليست آلية جدا سهل الاستعمال أو التفاعلية لبرامج التصحيح، لكن لحسن الحظ هناك بدائل. هناك برنامج، على سبيل المثال، دعا GDB، المصحح GNU، وهو غامضة قليلا في كيفية استخدامه. انها معقدة قليلا، ولكن بصراحة، هذا هو واحد من تلك الأشياء التي إذا وضعت في هذا الاسبوع والقادم وساعة اضافية لفهم شيء من هذا القبيل GDB سيوفر لك عشرات ربما ساعات في المدى الطويل، حتى مع ذلك، اسمحوا لي أن أقدم لك ودعابة من هذا الشيء كيف يعمل. أنا في بلدي نافذة طرفية. اسمحوا لي أن تمضي قدما وتجميع هذا البرنامج، buggy3. انها بالفعل حتى الآن. اسمحوا لي تشغيله مثلما فعلنا في الظهر الوقت، وبالفعل، انها مكسورة. ولكن لماذا هذا؟ ثمل ربما حتى انني وظيفة المبادلة. ربما انها وباء. أنا لا تتحرك تماما حول لهم بشكل صحيح. اسمحوا لي أن نمضي قدما ونفعل ذلك. بدلا من مجرد تشغيل buggy3 اسمحوا لي بدلا تشغيل هذا البرنامج GDB، وانا ذاهب الى ان اقول انها لتشغيل buggy3، وانا ذاهب لتشمل سيطة سطر الأوامر، توي،، وسوف نضع هذا في مشاكل في المستقبل في المواصفات لتذكير. وبرزت هذه الواجهة الآن بالأبيض والأسود حتى أنه مرة أخرى، قليلا في البداية الساحقة لأن هناك كل هذا معلومات الضمان إلى هنا، ولكن على الأقل هناك شيء مألوف. في الجزء العلوي من النافذة قانون بلدي الفعلية، وإذا كنت انتقل لأعلى هنا اسمحوا لي أن انتقل إلى أعلى جدا من ملفي، وبالفعل، هناك buggy3.c، وإشعار في أسفل هذه النافذة لدي هذه المطالبة GDB. ليست هذه هي نفس الأوامر العادية بلدي هارفارد جون. هذا هو المطالبة التي يجري للسماح لي للسيطرة على GDB. GDB هو المصحح. A المصحح هو البرنامج الذي يتيح لك المشي من خلال تنفيذ برنامج عن طريق خط سطرا سطرا، على طول الطريق تفعل أي شيء تريده لهذا البرنامج، حتى الدعوة الوظائف، أو تبحث، والأهم من ذلك في قيم المتغيرات المختلفة لل. دعونا نمضي قدما ونفعل ذلك. انا ذاهب الى المضي قدما واكتب في المدى الفوري في GDB ل، لاحظت ذلك في الجزء السفلي الأيسر من الشاشة لقد كتبته تشغيل، ولقد أصبت الدخول، وماذا فعل ذلك؟ هو ركض حرفيا برنامج بلدي، ولكن لا أرى في الواقع يذهب الكثير هنا لأنني لم أخبر الواقع المصحح وقفة في لحظة معينة من الزمن. مجرد كتابة المدى بتشغيل البرنامج. أنا لا أرى أي شيء في الواقع. لا أستطيع التلاعب به. اسمحوا لي بدلا قيام بذلك. في هذه المطالبة GDB اسمحوا لي أن اكتب بدلا انقطاع، أدخل. هذا ليس ما قصدته لكتابة. دعونا بدلا من ذلك اكتب انقطاع الرئيسية. وبعبارة أخرى، أريد أن تعيين ما يسمى نقطة توقف، الذي هو اسم على مسمى لأنه سيتم قطع أو إيقاف تنفيذ البرنامج في ذلك المكان بالذات. الرئيسية هو اسم مهامي. تلاحظ أن GDB ذكية جدا. ترد عليها أن يحدث الرئيسي لبدء تقريبا في السطر 18 من buggy3.c، وتلاحظ ثم هنا في أعلى اليسار ب + حق بجوار خط 18. هذا ما يذكرني بأنني تعيين نقطة توقف عند خط 18. هذه المرة عندما كنت اكتب المدى، وانا ذاهب لتشغيل برنامجي حتى أن يضرب نقطة، لذلك فإن برنامج قفة بالنسبة لي في خط 18. هنا نذهب، تشغيل. لا شيء يبدو أن يحدث، لكنه ترك إشعار في اسفل بدء تشغيل البرنامج، buggy3، نقطة 1 في الرئيسي في خط buggy3.c 18. ماذا يمكن أن أفعل الآن؟ تلاحظ أن أبدأ بكتابة أشياء مثل الطباعة، لا printf، X الطباعة، والآن هذا هو الغريب. دولار 1 هو مجرد الفضول، كما سنرى في كل مرة قمت بطباعة شيء تحصل على قيمة جديدة $. هذا بحيث يمكنك الرجوع إلى القيم السابقة فقط في حالة، لكن في الوقت الراهن ما تقول لي الطباعة هو أن قيمة x في هذه المرحلة من القصة على ما يبدو 134514032. ماذا؟ أين التي تأتي حتى من؟ [غير مسموع والطالب] والواقع أن هذا هو ما سنقوم استدعاء قيمة القمامة، ولقد تحدثت عن هذا لا بعد، ولكن السبب الذي تهيئة المتغيرات كذلك من الواضح أن لديهم بعض القيمة التي تريدها لهم. لكن الصيد هو أذكر أنه يمكنك تعريف متغيرات مثل فعلت قبل لحظة في بلدي على سبيل المثال سيجما دون ان يعطي لهم فعلا قيمة. أذكر ما فعلته هنا في سيغما. أعلن أنا ن، ولكن ما قيمة لم أعطيها؟ لا شيء، لأنني كنت أعرف أنه في الأسطر القليلة القادمة وGetInt رعاية لمشكلة وضع قيمة داخل ن. ولكن في هذه المرحلة من القصة من السطر 11 و 12 خط والخط 13 و السطر 14 طوال تلك عدة أسطر ما هي قيمة ن؟ في C انك لا تعرف. انها عموما بعض القيمة القمامة، وبعض رقم عشوائي تماما ما تبقى أساسا على الدالة السابقة من بعض بعد أن تم تشغيل، وذلك البرنامج الخاص بك يعمل يذكر أن وظيفة يحصل وظيفة، وظيفة، وظيفة. الحصول على وضع كل هذه الأطر على الذاكرة، ومن ثم عودة تلك الوظائف، وتماما مثل اقترحت مع ممحاة يتم استخدامها في نهاية المطاف ذاكرتهم. حسنا، انها مجرد أن ذلك يحدث هذا المتغير x في هذا البرنامج ويبدو أن بعض القيمة الواردة القمامة مثل 134514032 من بعض من وظيفة سابقة، وليس تلك التي كتبت. يمكن أن يكون شيء يأتي بشكل فعال مع نظام التشغيل، بعض من وظيفة تحت غطاء محرك السيارة. حسنا، هذا شيء طيب، ولكن دعونا الآن تقدم إلى السطر التالي. إذا كنت اكتب "التالي" في موجه GDB بلدي وأنا ضربت الدخول، تلاحظ أن تسليط الضوء على خطوات وصولا الى خط 19، ولكن الآثار المترتبة المنطقي هو أن السلالة 18 انتهى الآن تنفيذ، حتى لو كنت اكتب مرة أخرى "الطباعة X" يجب أن نرى الآن 1، وبالفعل، هل. مرة أخرى، والاشياء $ هو وسيلة لتذكيرك GDB ما تاريخ الطبعات هي التي قمت به. والآن اسمحوا لي المضي قدما وطباعة ذ، وبالفعل، Y هو بعض القيمة مجنون أيضا، ولكن ليست صفقة كبيرة لأنه في السطر 19 ونحن على وشك تعيينه قيمة 2، لذلك اسمحوا لي اكتب "التالي" مرة أخرى. ونحن الآن على خط printf. اسمحوا لي أن تفعل X الطباعة. اسمحوا لي أن تفعل ذ الطباعة. بصراحة، أنا متعب قليلا الحصول على طبع هذا. اسمحوا لي أن اكتب بدلا من ذلك "العرض X" و "Y العرض،" والآن في كل مرة اكتب I أمر في المستقبل سيتم تذكرت ما X و Y، ما هو X و Y، ما هو x و y. أستطيع أيضا، بوصف ذلك النوع، جانبا في "السكان المحليين من المعلومات." معلومات هو أمر خاص. السكان المحليين يعني أنه يظهر لي المتغيرات المحلية. فقط في حالة انسى أو هذا هو مجنون، وظيفة معقدة أن كتبت أو أي شخص آخر من السكان المحليين وسوف اقول لكم معلومات ما هي جميع المتغيرات المحلية داخل هذه الوظيفة المحلية قد يهمك إذا كنت تريد لكزة حولها. الآن، هو على وشك تنفيذ printf، لذلك اسمحوا لي المضي قدما واكتب فقط "التالي". لأننا في هذه البيئة نحن لا نرى فعلا تنفيذ إلى هنا، ولكن لاحظت أنه يزداد قليلا حطام هنا. ولكن لاحظ انها تجاوز الشاشة هناك، حتى انها ليست برنامج مثالي هنا، ولكن هذا ما يرام لأنني يمكن أن يظهر دائما حول باستخدام الطباعة إذا أريد. اسمحوا لي أن اكتب مرة أخرى القادم، والآن هنا هو الجزء مثيرة للاهتمام. في هذه المرحلة من القصة هو ذ 2، وx هو 1، كما اقترح هنا، ومرة ​​أخرى، والسبب في هذا هو عرض تلقائيا الآن لأنني استخدام الأمر عرض x و y العرض، وبالتالي فإن لحظة I اكتب المقبل وينبغي في العاشر نظرية Y وتصبح تبادلت. الآن، ونحن نعلم بالفعل أن لن يكون الأمر كذلك، ولكن سنرى في لحظة كيف يمكننا الغوص أعمق لمعرفة لماذا هذا صحيح. المقبل، ولسوء الحظ، لا يزال ذ 2 و X لا يزال 1، واستطيع ان اؤكد القدر. طباعة X، Y الطباعة. في الواقع، لا مقايضة ما حصل فعلا، لذلك دعونا نبدأ هذا انتهى. بوضوح مكسورة المبادلة. دعونا بدلا من ذلك اكتب "تشغيل" مرة أخرى. اسمحوا لي أن أقول نعم، أريد أن أعد تشغيله من البداية، أدخل. الآن أنا في خط النسخ الاحتياطي 18. تلاحظ الآن x و y هي القيم القمامة مرة أخرى. المقبل، المقبل، المقبلة، القادمة. إذا كنت تشعر بالملل يمكنني أيضا اكتب فقط ن المقبل. يمكنك اختصار لتسلسل أقصر وقت ممكن من الأحرف. الآن يتم تقسيم المبادلة. دعونا الغوص في، لذلك بدلا من كتابة المقبل، الآن انا ذاهب لكتابة الخطوة بحيث يخطو أنا داخل هذه الوظيفة حتى أستطيع أن المشي من خلال ذلك، لذلك أنا ضربت خطوة ثم أدخل. تلاحظ أن يقفز تسليط الضوء عليها في أقل برنامجي إلى خط 36. الآن ما هي المتغيرات المحلية؟ معلومات السكان المحليين. لا شيء فقط حتى الآن لأننا لم نصل إلى هذا الخط، لذلك دعونا نمضي قدما ويقول "التالي". ونحن الآن يبدو أن لديها TMP TMP الطباعة. قيمة القمامة، أليس كذلك؟ أعتقد ذلك. كيف حول طباعة، والطباعة ب، 1 و 2؟ في لحظة، في أقرب وقت اكتب من جديد المقبل TMP سوف تأخذ على قيمة 1، ونأمل، لأن TMP سوف يتم تعيين قيمة. الآن دعونا لا طباعة طباعة ب،، ولكن الآن طباعة TMP، وانها في الواقع 1. اسمحوا لي أن تفعل المقبل. اسمحوا لي أن تفعل المقبل. لقد انتهيت من وظيفة المبادلة. ما زلت داخل منه في خط 40، لذلك اسمحوا لي طباعة، ب الطباعة، وأنا لا يهمني ما هو TMP. يبدو المبادلة هو الصحيح عندما يتعلق الأمر مبادلة ألف وباء. ولكن إذا كنت اكتب الآن المقبلة، I القفز مرة أخرى إلى خط 25، وبطبيعة الحال، إذا كنت اكتب في x و y الطباعة انهم ما زالوا دون تغيير، لذلك نحن لم إصلاح المشكلة. ولكن التشخيص ربما الآن مع هذا البرنامج GDB لقد حصلت على ما لا يقل عن خطوة واحدة لفهم ما على غير ما يرام دون الحاجة إلى القمامة لدينا قانون عن طريق وضع printf هنا، هنا printf، printf هنا ثم تشغيله مرة أخرى، ومرة ​​أخرى في محاولة لمعرفة ما على غير ما يرام. انا ذاهب الى المضي قدما وإنهاء للخروج من هذا تماما مع الإقلاع عن التدخين. انها سوف يقول ذلك الحين، "الخروج على أي حال؟" نعم. الآن سأعود في موجه بلدي العادية، وانتهيت باستخدام GDB. بوصفها جانبا، لا تحتاج لاستخدام هذا توي العلم. في الواقع، إذا قمت بحذف ذلك تحصل أساسا في النصف السفلي من الشاشة. إذا كنت اكتب انقطاع الرئيسي ثم قم بتشغيل لا أستطيع تشغيل برنامج لا يزال بلدي، ولكن ما سوف تفعله هو أكثر حرفيا تظهر لي فقط في سطر واحد في وقت الحالي. وتوي، واجهة المستخدم النصية، فقط يظهر لك أكثر من برنامج في وقت واحد، والتي ربما تكون أسهل قليلا من الناحية المفاهيمية. ولكن في الواقع، لا أستطيع القيام بذلك تماما المقبل، المقبل، المقبلة، وانا ذاهب لرؤية سطر واحد في كل مرة، وإذا كنت تريد حقا أن نرى ما يحدث على لا أستطيع كتابة قائمة ونرى في مجمله مجموعة من خطوط المجاورة. هناك الفيديو الذي طلبنا أن تشاهد لمشكلة يحدد 3 الذي يغطي نيت بعض تعقيدات GDB، وهذا هو واحد من تلك الأشياء، بصراحة، حيث أن بعض نسبة غير تافهة منكم لن أتطرق GDB، والتي من شأنها أن تكون أمرا سيئا لأن حرفيا سوف ينتهي بك الأمر إنفاق المزيد من الوقت في وقت لاحق هذا الفصل الدراسي مطاردة الحشرات ثم هل إذا كنت وضعت في هذا نصف ساعة / ساعة هذا الاسبوع القادم والتعلم للحصول على راحة مع GDB. كان Printf صديقك. يجب أن تكون الآن GDB صديقك. أي أسئلة حول GDB؟ وهنا قائمة سريعة لبعض الأوامر الأكثر قوية ومفيدة. نعم تستطيع. >> قمت بطباعة سلسلة؟ يمكنك طباعة سلسلة؟ على الاطلاق. فإنه ليس من الضروري أن يكون مجرد أعداد صحيحة. إذا كان هذا المتغير هو سلسلة اكتب فقط في ليالي الطباعة. وسوف تظهر لك ما هو هذا المتغير سلسلة. [غير مسموع والطالب] سوف تعطيك العنوان والسلسلة نفسها. وسوف تظهر لك على حد سواء. وآخر شيء واحد، فقط لأن هذه هي جيدة لمعرفة جدا. التتبع المعاكس والإطار، اسمحوا لي أن يغوص في هذه المرة آخر، بالضبط نفس البرنامج مع GDB. اسمحوا لي أن تمضي قدما وتشغيل واجهة المستخدم النصية الإصدار، كسر الرئيسية. اسمحوا لي أن تمضي قدما وتشغيل مرة أخرى. أنا هنا. والآن اسمحوا لي الذهاب القادم، القادمة، القادم، القادمة، القادمة، خطوة، أدخل. والآن لنفترض الآن أنا في مبادلة عمدا، ولكن أنا مثل "اللعنة، ما هو قيمة x؟" لا أستطيع أن أفعل X بعد الآن. لا أستطيع أن أفعل Y لأنها لم تكن في نطاقها. انهم ليسوا في السياق، ولكن المشكلة لا. أستطيع أن اكتب التتبع المعاكس. الذي يظهر لي كل وظائف و ذلك نظرا ليصل إلى هذه النقطة في الوقت المناسب. لاحظت أن واحدة على الجزء السفلي، الرئيسي، يصطف مع الرئيسية يجري على الجزء السفلي من الصورة هنا. حقيقة أن المبادلة فوقه يصطف مع مبادلة يجري فوقه في الذاكرة هنا، وإذا كنت ترغب في الحصول على العودة الى الأصل مؤقتا أستطيع أن أقول "الإطار." ما العدد؟ الرئيسي هو الإطار رقم 1. انا ذاهب الى المضي قدما ويقول "الإطار 1." الآن أنا مرة أخرى في الرئيسي، وأنا يمكن طباعة العاشر، وأنا يمكن طباعة ذ، ولكن لا أستطيع طباعة A أو B. ولكن يمكنني أن أقول إذا، "حسنا، انتظر لحظة. أين كان المبادلة؟" اسمحوا لي أن تمضي قدما ويقول "الإطار 0". الآن سأعود حيث كنت تريد أن تكون، وبوصفها جانبا، هناك أوامر أخرى أيضا، مثل إذا كنت حقا الحصول على بالملل الكتابة المقبل، المقبل، المقبلة، المقبل، هل يمكن القول عموما أشياء مثل "ال 10 المقبلة"، والتي من شأنها أن الخطوة من خلال خطوط ال 10 المقبلة. يمكنك أيضا كتابة "تواصل" عندما كنت حقا الحصول على ضاقوا ذرعا التنقل خلال ذلك. ستواصل تشغيل البرنامج دون انقطاع حتى آخر نقطة توقف يضرب، سواء في حلقة أو للأسفل في البرنامج. في هذه الحالة اصلنا حتى النهاية، وبرنامج خرجت بشكل طبيعي. هذا هو وسيلة الهوى، عملية السفلي. خرجت للتو البرنامج بشكل طبيعي. المزيد عن هذا في شريط الفيديو والتصحيح في الدورات المقبلة. كان ذلك كثيرا. دعونا نلقي دينا 5 دقائق استراحة هنا، ونحن سوف يعود مع البنيات والملفات. إذا كان قد سقط ارضا لكم في هذا الأسبوع pset بالفعل عليك أن تعرف أن نستخدمها في رمز التوزيع، مصدر التعليمات البرمجية التي نقدمها لك كنقطة انطلاق، بعض التقنيات الجديدة. على وجه الخصوص، قدمنا ​​هذه الكلمة الرئيسية جديد يسمى البنية، لهيكل، حتى نتمكن من إنشاء متغيرات مخصصة من نوع ما. قدمنا ​​أيضا فكرة إدخال ملف I / O، والإخراج، وهذا هو حتى نتمكن من إنقاذ الدولة مجلس التدافع إلى ملف على القرص بحيث يمكن للزملاء التدريس وأنا أفهم ما يجري في الداخل للبرنامج الخاص بك دون الحاجة للعب يدويا عشرات من الألعاب من التدافع. يمكننا أن نفعل ذلك أكثر automatedly. هذه فكرة البنية يحل مشكلة مقنعة إلى حد ما. لنفترض أننا نريد أن تنفيذ بعض البرامج التي تحافظ بطريقة أو بأخرى تتبع المعلومات على الطلاب، وربما يكون الطلاب، على سبيل المثال، معرف، وهو اسم ومنزل في مكان مثل جامعة هارفارد، لذلك هذه هي 3 قطع من المعلومات نريد للحفاظ على حولها، لذلك اسمحوا لي المضي قدما والبدء في كتابة برنامج قليلا هنا، وتشمل stdio.h. اسمحوا لي أن تفعل تشمل cs50.h. وتبدأ بعد ذلك مهامي الرئيسية. وأنا لن عناء مع أي وسائط سطر الأوامر، وهنا أريد أن يكون طالبا، لذلك أنا ذاهب الى القول طالب له اسم، لذلك أنا ذاهب الى القول "اسم السلسلة." ثم أنا ذاهب أن أقول طالب أيضا ID، ID INT ذلك، وطالب لديه منزل، لذلك أنا ذاهب أيضا أن أقول "بيت السلسلة." ثم أنا من أجل هذه قليلا أكثر نظافة مثل هذا. حسنا، والآن لدي 3 المتغيرات التي تمثل الطلاب، وذلك "الطالب". والآن أريد أن تعبئة هذه القيم، لذلك اسمحوا لي المضي قدما وتقول شيئا مثل "معرف = 123". اسم هو الذهاب الى الحصول على داود. دعنا نقول البيت هو الذهاب الى الحصول ماثر، ثم انا ذاهب الى القيام بشيء مثل printf بشكل تعسفي ("٪ S، ID الذي هو د٪، يعيش في ليالي٪. والآن، ماذا أريد أن سد العجز في هنا، واحدا بعد الآخر؟ الاسم والهوية، المنزل؛ عودة 0. حسنا، ما لم ثمل بي الأمر هنا في مكان ما أعتقد أن لدينا برنامج جيد جدا يقوم بتخزين طالب واحد. بالطبع، هذا ليس كل ما مثيرة للاهتمام. ماذا لو أريد أن يكون 2 طالب؟ هذا ليس صفقة كبيرة. أعالج 2 و. اسمحوا لي أن تمضي قدما وتسليط الضوء على هذا النزول وهنا، وأستطيع أن أقول "ID = 456" لشخص مثل روب الذي يعيش في كيركلاند. حسنا، انتظر، لكنني لا يمكن استدعاء هذه نفس الشيء، ويبدو انا ذاهب الى أن نسخ هذا، لذلك اسمحوا لي أن أقول إن هذه المتغيرات سيكون ديفيد، واسمحوا لي أن الحصول على بعض نسخ من هذه لروب. سوف نطلق هذه لروب ولكن هذا لن يعمل الآن لأنني-الانتظار، دعونا تغيير لي أن ID1، وNAME1 house1. وسوف يكون روب 2، 2. لقد حصلت لتغيير هذا هنا، هنا، هنا، هنا، هنا، هنا. الانتظار، ماذا عن تومي؟ دعونا نفعل ذلك مرة أخرى. إذا كنت لا تزال تعتقد الواضح هذا هو وسيلة جيدة للقيام بذلك، انها ليست، نسخ ذلك / لصق سيئة. ولكن حللنا هذا قبل أسبوع. ما هو الحل لدينا عندما كنا نريد أن حالات متعددة من نفس نوع البيانات؟ [الطلاب] صفيف. صفيف، لذلك اسمحوا لي أن أحاول بتنظيف هذا. اسمحوا لي أن بعض الغرف لنفسي في القمة، واسمحوا لي أن تفعل هذا بدلا هنا. سوف ندعو هؤلاء الناس، وبدلا من ذلك انا ذاهب الى القول "IDS الباحث" وانا ذاهب لدعم 3 منا في الوقت الراهن. انا ذاهب الى القول "أسماء السلسلة،" وأنا منا الدعم 3، ثم انا ذاهب الى القول "بيوت السلسلة،" وأنا ذاهب لدعم 3 منا. الآن هنا بدلا من ديفيد الحصول على المتغيرات المحلية الخاصة به يمكننا التخلص من تلك. أن يشعر جيدة أننا تنظيف هذا الأمر. أستطيع أن أقول ثم ديفيد سيكون [0] وأسماء [0] والبيوت [0]. ومن ثم يمكننا انقاذ روب بالمثل في هذا الشأن. دعونا نضع هذا هنا إلى أسفل، حتى انه سيكون تعسفا IDS [1]. انه سيكون من الأسماء [1]، وأخيرا ثم والمنازل [1]. لا تزال شاقة بعض الشيء، والآن لا بد لي من هذا الرقم، لذلك دعونا نقول "أسماء [0]، رقم [0]، والمنازل [0]، ودعونا pluralize هذا. هويات، هويات، هويات. ومرة أخرى، أنا أفعل ذلك، ومرة ​​أخرى كان الأمر كذلك، أنا بالفعل اللجوء إلى نسخ / لصق مرة أخرى، لذلك كل الاحتمالات هناك حل آخر هنا. ربما يمكنني تنظيف هذا الأمر أيضا مع حلقة أو شيء من هذا القبيل، لذلك باختصار، انها أفضل قليلا ولكن لا يزال يشعر مثل أنا اللجوء إلى نسخ / لصق، ولكن حتى هذا، يدعي الأول، ليس جوهريا حقا الحل الصحيح لأن ماذا لو كنت في وقت ما قررنا تعرف لماذا؟ يجب علينا حقا تم تخزين عناوين البريد الإلكتروني لديفيد روب و والجميع في هذا البرنامج. يجب علينا أيضا تخزين أرقام الهواتف. يجب علينا أيضا تخزين أرقام الاتصال في حالات الطوارئ. لدينا كل هذه القطع من البيانات التي نريد لتخزين، لذلك كيف يمكنك أن تذهب نحو ذلك؟ تقوم بتعريف مجموعة أخرى في القمة، ثم قمت بإضافة يدويا عنوان بريد إلكتروني [0]، وعنوان البريد الإلكتروني [1] لديفيد وروب وهكذا دواليك. ولكن هناك في الحقيقة مجرد افتراض الكامنة وراء هذا التصميم أن أنا باستخدام نظام الشرف أن نعرف أن [أنا] في كل من صفائف عدة يحدث ذلك فقط للإشارة إلى الشخص نفسه، حتى [0] في هويات هو رقم 123، وأنا ذاهب لنفترض أن أسماء [0] هو نفس الشخص اسم والمنازل [0] هو منزل الشخص نفسه وهكذا دواليك بالنسبة لجميع المصفوفات المختلفة التي يمكنني إنشاء. ولكن لاحظت أنه لا يوجد ربط الأساسية بين هذه القطع 3 من المعلومات الاسم ورقم البيت و، على الرغم من أن الكيان نحاول نموذج في هذا البرنامج ليس صفائف. صفائف ليست سوى بهذه الطريقة البرنامجية للقيام بذلك. ما نريد حقا في تصميم نموذج في برنامجنا هو شخص مثل ديفيد، شخص مثل روب داخل منها أو التغليف هو اسم ورقم ومنزل. يمكننا التعبير عن هذه الفكرة بطريقة أو بأخرى من التغليف حيث يكون الشخص لديه ID، اسم ومنزل وعدم اللجوء الى هذا الإختراق حقا حيث أننا فقط على ثقة من أن شيئا قوس يشير إلى كيان الإنسان نفسه في كل من هذه المصفوفات المتباينة؟ يمكننا أن نفعل هذا الواقع. اسمحوا لي ان اذهب الآن فوق الرئيسي ل، واسمحوا لي خلق نوع البيانات الخاصة بي لحقا للمرة الأولى. استخدمنا هذه التقنية في التنافس، ولكن هنا انا ذاهب الى المضي قدما وخلق نوع البيانات، وأنت تعرف ماذا، أنا ذاهب إلى نسميها طالب أو شخص، وانا ذاهب الى استخدام typedef لتعريف نوع. انا ذاهب الى القول بأن هذا هو الهيكل، ثم هذا الهيكل سيكون من نوع الطالب، ونحن سوف يقول، على الرغم من انها قليلا مؤرخة الآن بالنسبة لي. سوف نقول "الباحث الهوية." سوف نقول "اسم السلسلة." ثم سوف نقول "سلسلة المنزل" الآن ذلك قبل نهاية هذه السطور القليلة من التعليمات البرمجية لقد علمت للتو أن هناك رنة نوع بيانات إلى جانب رجات، إلى جانب سلاسل، إلى جانب الزوجي، إلى جانب يطفو. اعتبارا من هذه اللحظة في الوقت الخط 11، وهناك الآن نوع بيانات جديدة تسمى الطلاب، والآن يمكنني تعريف متغير في أي مكان أريد الطالب، لذلك اسمحوا لي انزل هنا للناس. الآن يمكنني التخلص من هذا، وأستطيع أن أعود الى هنا ديفيد، وأستطيع أن أقول ديفيد الواقع أن ديفيد، يمكننا تسمية المتغير حرفيا بعد نفسي، سيكون من نوع الطالب. هذا قد تبدو غريبة قليلا، ولكن هذا ليس كل ما مختلفة من إعلان شيء على أنه صحيح أو سلسلة أو طوف. يحدث ذلك فقط من أجل أن يسمى الطالب الآن، وإذا كنت تريد أن تضع شيئا داخل هذا الهيكل لدي الآن لاستخدام قطعة جديدة من بناء الجملة، ولكنه جميلة واضحة، david.id = 123، david.name = "ديفيد" في العاصمة D، وdavid.house = "ماذر" والآن لا أستطيع التخلص من هذه الأشياء هنا. لاحظت لقد أعدنا تصميم برنامجنا الآن بطريقة أفضل بكثير حقا في هذا الآن برنامجنا يعكس العالم الحقيقي. هناك فكرة في العالم الحقيقي لشخص أو الطالب. هنا لدينا الآن نسخة C لشخص أو أكثر على وجه التحديد الطالب. داخل هذا الشخص هي هذه الخصائص ذات الصلة، ID، واسم البيت، لذلك يصبح روب أساسا نفس الشيء هنا إلى أسفل، لذلك طالب روب، وrob.id الآن = 456، rob.name = "روب". حقيقة أن ما يسمى المتغير روب هو نوع من معنى. كان يمكن أن أطلق عليها X أو Y أو Z. نحن فقط روب اسمه أن تكون متسقة غويا، ولكن في الحقيقة هو اسم من داخل هذا المجال نفسه، حتى الآن لدي هذا. هذا أيضا لا أشعر بأن أفضل تصميم في أنني الثابت ترميز ديفيد. لقد مشفرة يصعب I روب. وأنا لا تزال بحاجة الى اللجوء الى بعض نسخ ولصق في كل مرة أريد المتغيرات الجديدة. وعلاوة على ذلك، لا بد لي من إعطاء ما يبدو كل من هذه المتغيرات اسم، على الرغم من ذلك بكثير فما استقاموا لكم فاستقيموا بدلا وصف هذه المتغيرات  أكثر بشكل عام باسم الطلاب. الآن يمكننا دمج الأفكار التي تم العمل بشكل جيد بالنسبة لنا ويقول بدلا من ذلك "أنت تعرف ما، أعطني الطلاب متغير يسمى، ودعونا أن يكون من حجم 3، "حتى الآن يمكنني تحسين هذا مزيد، تخلص من ديفيد أعلن يدويا، وأستطيع أن أقول شيء من هذا القبيل بدلا الطلاب [0] هنا. ويمكنني أن أقول بعد ذلك الطلاب [0] هنا، يمكن للطلاب [0] هنا، وهكذا دواليك، وأنا يرحل وتنظيف ما يصل لروب. ويمكنني أن استمر أيضا عن إضافة الآن ربما حلقة واستخدام GetString وGetInt للحصول على هذه القيم في الواقع من المستخدم. ويمكنني أن استمر حوالي إضافة ثابت لأن هذا هو ممارسة سيئة عموما إلى رمز الصعب بعض التعسفي عدد مثل 3 هنا ثم فقط تذكر أن عليك أن تضع ما لا يزيد عن 3 طلاب في ذلك. ربما يكون من الأفضل استخدام # تعريف في الجزء العلوي من الملف الخاص بي والعوامل التي، لذلك في الواقع، اسمحوا لي أن تمضي قدما وتعميم هذا. اسمحوا لي أن فتح هذا مثال بين اليوم الأمثلة في وقت مبكر، structs1. هذا هو برنامج يستخدم أكثر اكتمالا # تعريف هنا ويقول نحن ستكون لدينا 3 طلاب بشكل افتراضي. أنا هنا اعلان يستحق فئة من الطلاب، لذلك الفصول الدراسية من الطلاب، والآن أنا باستخدام حلقة فقط لجعل رمز قليلا أكثر أناقة، تعبئة الطبقة مع مدخلات المستخدم، حتى أعاد من 0 = أنا على ما يصل إلى الطلاب، والتي هي 3. وبعد ذلك مطالبة المستخدم في هذا الإصدار  ما هو رقم الطالب، ويمكنني الحصول عليه مع GetInt. ما هو اسم الطالب، ومن ثم أحصل عليه مع GetString. ما هو منزل الطالب؟ يمكنني الحصول عليه مع GetString. ثم في الجزء السفلي هنا أنا فقط قررت تغيير كيف أنا طباعة هذه من وإلى استخدامها في الواقع حلقة، وأنا الذي الطباعة؟ وفقا لتعليق أنا طباعة أي شخص في ماذر، وهذا كل شيء حتى روب وتومي وهكذا دواليك في الواقع، تومي في ماذر. سيتم طباعة تومي وديفيد في هذه الحالة، ولكن كيف يعمل هذا؟ لم نر هذه الوظيفة من قبل، ولكن اتخاذ تخمين على ما يفعل هذا. يقارن السلاسل. انها قليلا غير واضحة كيف يقارن السلاسل لأنه تبين إذا كان هذا يعني بإرجاع 0 السلاسل متساوون. إذا كان بإرجاع -1 وهذا يعني أحد يأتي أبجديا قبل الآخر، وإذا كان هذا يعني إرجاع +1 كلمة أخرى يأتي حسب الترتيب الأبجدي قبل الآخر، ويمكنك البحث على الانترنت أو في صفحة رجل لنرى بالضبط التي هي الطريق التي، ولكن كل هذا تقوم به الآن هو قائلا انه إذا كان [أنا]. منزل يساوي "ماذر" ثم المضي قدما وذلك بطباعة وكذلك في ماذر. ولكن هنا شيء ونحن لم نر من قبل، وسوف نعود إلى هذا. لا أذكر الاضطرار إلى القيام بذلك في أي من برامج بلدي. مجانا يشير على ما يبدو إلى الذاكرة، وتحرير الذاكرة، ولكن ما أنا الذاكرة على ما يبدو في تحرير هذه الحلقة في الجزء السفلي من هذا البرنامج؟ يبدو أنني تحرير اسم الشخص ومنزل الشخص، ولكن لماذا؟ اتضح أن كل هذه الأسابيع كنت قد تم استخدام GetString لقد تم إدخال نوع من الخلل في كل واحد من البرامج الخاصة بك. GetString من الذاكرة يخصص التصميم بحيث يمكن العودة لكم سلسلة، يمكن مثل ديفيد، أو روب، وأنت تفعل ما تريد ثم مع هذه السلسلة في البرنامج لأننا محفوظة في الذاكرة بالنسبة لك. المشكلة هي كل هذا الوقت في كل مرة استدعاء GetString ونحن، من الكتاب من GetString، تم طرح نظام التشغيل أن يقدم لنا شيئا من ذاكرة الوصول العشوائي لهذه السلسلة. يقدم لنا شيئا من ذاكرة الوصول العشوائي لهذه السلسلة القادمة. تعطينا بعض RAM أكثر لهذه السلسلة القادمة. ما لك، مبرمج، لم يتم القيام تعطي لنا أن عودة الذاكرة، ذلك لعدة أسابيع هذه كافة برامج كنت قد كتبت وكان ما يسمى قفزة الذاكرة حيث أنها تبقي باستخدام الذاكرة أكثر وأكثر في كل مرة استدعاء GetString، وهذا شيء طيب. ونحن نفعل ذلك عن عمد في الأسابيع الأولى لأنها ليست مثيرة للاهتمام أن لداعي للقلق حول حيث السلسلة القادمة من. كل ما تريد هي الكلمة روب للعودة عندما يقوم المستخدم فيه. أنواع لكن المضي قدما لدينا الآن والبدء في الحصول على أكثر تطورا حول هذا الموضوع. أي وقت ونحن تخصيص ذاكرة أفضل ونحن في نهاية المطاف تسليم مرة أخرى. على خلاف ذلك في العالم الحقيقي على جهاز ماكنتوش أو كمبيوتر شخصي قد يكون لديك خبرة في بعض الأحيان حيث الأعراض الكمبيوتر يوشك على التوقف في نهاية المطاف أو غبي كرة الشاطئ الغزل تحتل فقط في الكمبيوتر يمكن الانتباه كامل ويمكنك أن تفعل الأشياء. ويمكن تفسير ذلك من خلال أي عدد من البق، ولكن من بين تلك الأخطاء المحتملة ودعا الأشياء التسرب في الذاكرة حيث أن الشخص الذي كتب قطعة من البرمجيات كنت تستخدم لم تذكر لتحرير الذاكرة أن يطلب هو أو هي نظام التشغيل ل، لا تستخدم GetString، لأن هذا شيء CS50، ولكن باستخدام وظائف مماثلة أن تطلب من نظام التشغيل للذاكرة. إذا كنت أنت أو كانت المسمار ويعود أبدا في الواقع أن الذاكرة عرض من أعراض التي يمكن أن تكون أن برنامج يبطئ ويبطئ ويبطئ إلا إذا كنت تذكر أن الكلمة الحرة. سوف نعود إلى متى وماذا كنت الكلمة الحرة، ولكن دعونا نمضي قدما فقط لحسن التدبير وحاول تشغيل هذا البرنامج خاصة. كان يسمى هذا structs1، أدخل. اسمحوا لي أن تمضي قدما وتشغيل structs1، 123، ديفيد ماثر، 456، روب كيركلاند، 789، تومي ماثر، ونحن نرى ديفيد في ماذر، تومي في ماذر. هذا هو مجرد الاختيار التعقل قليلا أن البرنامج يعمل. الآن، للأسف، هذا البرنامج هو محبط قليلا في هذا فعلت كل هذا العمل، وأنا كتبته في 9 سلاسل مختلفة، تصل إلى تدخل، وقيل الذي كان في ماذر، ولكن من الواضح كنت أعرف الذي كان في ماذر بالفعل لأنني كتابتها. سيكون جميلا لو على الأقل هذا البرنامج هو أشبه قاعدة البيانات ويتذكر فعلا ما كتبته في أنني لذلك أنا أبدا مرة أخرى لإدخال هذه السجلات الطلابية. ربما انها مثل نظام registrarial. يمكننا القيام بذلك باستخدام هذه التقنية المعروفة باسم ملف الإدخال ملف I / O، والإخراج، بصورة عامة جدا للقول في أي وقت تريده لقراءة الملفات أو كتابة الملفات يمكنك القيام بذلك مع مجموعة معينة من الوظائف. اسمحوا لي أن تمضي قدما وفتح هذا structs2.c سبيل المثال، التي هي نفسها تقريبا، ولكن دعونا نرى ما تفعله الآن. في الجزء العلوي من الملف أعلن فئة من الطلاب. I تعبئة ثم الطبقة مع مدخلات المستخدم، بحيث يتم بالضبط تلك الأسطر من التعليمات البرمجية مثل قبل. ثم إذا كنت انزل هنا يمكنني طباعة كل من هو في مثل ماثر بشكل تعسفي من قبل، ولكن هذا هو ميزة جديدة مثيرة للاهتمام. هذه الأسطر من التعليمات البرمجية الجديدة، وأنها أعرض شيئا هنا، FILE، كل مباراة دولية، ولها * هنا أيضا. اسمحوا لي أن نقل هذا أكثر من هنا، و* أكثر من هنا أيضا. هذه الوظيفة لم نر من قبل، الدالة fopen، ولكنه يعني ملف مفتوح، لذلك دعونا المقشود من خلال هذه، وهذا شيء نحن سوف نعود إليها في المستقبل psets، ولكن هذا الخط أساسا هنا يفتح ملف يسمى قاعدة البيانات، ويفتح ذلك تحديدا في مثل هذه الطريقة أنه يمكن أن يفعل ما عليه؟ [غير مسموع والطالب] الحق، لذلك "W" يعني فقط انه يقول للنظام التشغيل فتح هذا الملف في مثل هذه الطريقة التي يمكنني الكتابة إليه. أنا لا أريد أن تقرأها. أنا لا أريد أن مجرد إلقاء نظرة على ذلك. أريد أن تغييره واضافة اشياء محتملة لذلك، وملف سوف يتم استدعاؤها قاعدة البيانات. يمكن أن يسمى هذا أي شيء. هذا يمكن أن يكون database.txt. هذا يمكن أن يكون. ديسيبل. هذا يمكن أن يكون مثل كلمة فو، ولكن اخترت تعسفا لتسمية ملف قاعدة البيانات. هذا هو الاختيار التعقل قليلا أننا سوف نعود إلى بتفصيل كبير مع مرور الوقت، إذا FP، لمؤشر الملف، لا تساوي NULL يعني أن كل شيء على ما يرام. قصة قصيرة طويلة، وظائف مثل الدالة fopen تفشل أحيانا. ربما الملف غير موجود. ربما كنت نفاد مساحة القرص. ربما لم يكن لديك إذن لهذا المجلد، إذا كان الأمر كذلك الدالة fopen ترجع فارغة حدث شيء سيء. على العكس، إذا لا يرجع الدالة fopen فارغة شيء على ما يرام وأستطيع أن أبدأ في الكتابة إلى هذا الملف. وهنا خدعة جديدة. هذه حلقة لهذا ما بالتكرار عبر كل من طلابي، وهذا يبدو مشابها لذلك ما فعلناه من قبل، ولكن هذه الوظيفة هو ابن عم يسمى printf fprintf لملف printf، وتلاحظ انها مختلفة فقط في 2 طرق. واحد، ويبدأ مع و بدلا من ف، ولكن بعد ذلك حجة على ما يبدو أول ما؟ [الطلاب] ملف. >> إنها الملف. هذا الشيء يسمى تنظيم الأسرة، والتي سنقوم في نهاية المطاف بصرف النظر ما ندف مؤشر الملف، لكن في الوقت الراهن يمثل ببساطة FP الملف بأنني فتحت، حتى هنا يقول fprintf طباعة ID هذا المستخدم إلى ملف، وليس على الشاشة. طباعة اسم المستخدم إلى ملف، وليس إلى الشاشة، البيت إلى ملف، وليس على الشاشة، ثم إلى هنا، من الواضح، إغلاق الملف، ومن ثم إلى هنا مجانا الذاكرة. والفرق الوحيد بين هذا الإصدار 2 و الإصدار 1 هو إدخال الدالة fopen ومع هذا الملف * وهذه الفكرة من fprintf، لذلك دعونا نرى ما النتيجة النهائية هي. اسمحوا لي ان اذهب الى بلدي نافذة طرفية. اسمحوا لي أن تشغيل structs2، أدخل. يبدو كل شيء على ما يرام. دعونا إعادة تشغيل structs2. 123، ديفيد ماثر، 456، روب كيركلاند، 789، تومي ماثر، أدخل. يبدو أنه تصرف نفسه، ولكن إذا كنت تفعل الآن ليرة سورية تلاحظ ما في الملف هو هنا بين قانون بلدي كل شيء، قاعدة البيانات، لذلك دعونا أن فتح، gedit من قاعدة البيانات، ونظرة على ذلك. انها ليست جاذبية من تنسيقات الملفات. هو حقا قطعة واحدة من خط البيانات في كل سطر في كل سطر، ولكن أولئك منكم الذين يستخدمون ملفات Excel أو CSV، مفصولة بفواصل قيم، يمكن بالتأكيد لقد استخدمت fprintf لربما بدلا تفعل شيئا مثل هذا بحيث يمكن أن تخلق في الواقع ما يعادل ملف Excel من خلال فصل الأشياء مع الفواصل، وليس مجرد خطوط جديدة. في هذه الحالة إذا كنت قد استخدمت بدلا الفواصل بدلا من الخطوط الجديدة ويمكنني أن فتح هذا الملف حرفيا قاعدة البيانات في Excel إذا أدليت به بدلا من ذلك تبدو هذه. وباختصار، الآن أن لدينا القدرة على الكتابة إلى الملفات يمكننا أن نبدأ الآن البيانات استمرار، والحفاظ عليها في جميع أنحاء على القرص حتى نتمكن من الحفاظ على المعلومات حول مرة أخرى ومرة ​​أخرى. لاحظت وجود زوجين من الأشياء الأخرى التي هي الآن أكثر قليلا مألوفة. في الجزء العلوي من هذا الملف C لدينا typedef لأن أردنا أن إنشاء نوع البيانات التي تمثل كلمة واحدة، لذلك يسمى هذا النوع كلمة، وداخل هذا الهيكل انها قليلا مربي الحيوانات الآن. لماذا كلمة تتكون من صفيف على ما يبدو؟ ما هي كلمة حدسي فقط؟ انها مجموعة من الأحرف. انها تتابع من الأحرف إلى العودة إلى الوراء. الحروف في كل مباراة دولية يحدث أن تكون تعسفية نقول الحد الأقصى للطول أي كلمة في القاموس الذي نستخدمه لالتدافع. لماذا لدي +1؟ الحرف فارغة. أذكر عندما فعلنا المثال Bananagrams كنا بحاجة إلى قيمة خاصة في نهاية الكلمة من اجل الحفاظ على المسار من حيث الكلمات قد انتهى فعلا، وكما يقول مواصفات مجموعة مشكلة نحن هنا ربط بكلمة إعطاء قيمة منطقية، علم، إذا جاز التعبير، صحيحة أو خاطئة. لقد وجدت هذه الكلمة بالفعل، لأننا ندرك نحن حقا بحاجة الى وسيلة لتذكر ليس فقط ما هو في كلمة التدافع ولكن ما إذا كنت، والإنسان، وقد وجدت أنه بحيث إذا كنت لا تجد كلمة "في" لا يمكنك كتابة فقط، أدخل، و، أدخل، و، أدخل والحصول على 3 نقاط بفارق 3 نقاط و 3 نقاط بفارق 3 نقاط. نريد أن نكون قادرين على القائمة السوداء تلك الكلمة من خلال تحديد BOOL إلى True إذا كنت قد وجدت بالفعل، وذلك لهذا السبب نحن مغلفة في هذه البنية. الآن، إلى هنا في هذا التدافع هناك بنية أخرى تسمى القاموس. غياب هنا هي الكلمة typedef لأنه في هذه الحالة نحن في حاجة لتغليف فكرة القاموس، والقاموس يحتوي على مجموعة كاملة من الكلمات، كما ضمنا هذه المجموعة، وكيف كثير من تلك الكلمات هي هناك حسنا، أيا كان حجم هذا المتغير يسمى يقول. ولكننا بحاجة فقط قاموس واحد. نحن لسنا بحاجة إلى نوع البيانات يسمى القاموس. نحن بحاجة فقط واحد منهم، لذلك تبين في C أنه إذا كنت لا أقول typedef، كنت أقول البنية، ثم داخل الأقواس المتعرجة كنت وضعت المتغيرات الخاصة بك، ثم قمت بوضع اسم. هذا يعلن متغير واحد يسمى القاموس يشبه هذا. على النقيض من ذلك، فإن هذه الخطوط تقوم بإنشاء بنية بيانات قابلة لإعادة الاستخدام دعا كلمة أن يمكنك إنشاء نسخ متعددة من، مثلما أنشأنا نسخ متعددة من الطلاب. ما معنى هذا يسمح في نهاية المطاف منا أن نفعل؟ اسمحوا لي أن أعود إلى، دعنا نقول، أبسط مثال من أبسط مرات، واسمحوا لي أن تفتح، دعنا نقول، compare1.c. المشكلة هنا هي في متناول اليد لفي الواقع قشر العودة طبقة من سلسلة والبدء في اتخاذ قبالة عجلات التدريب هذه لأنه تبين أن سلسلة كل هذا الوقت كما وعدنا في الحقيقة مجرد أسبوع 1 كنية، مرادفا من مكتبة CS50 عن شيء التي تبدو أكثر من ذلك بقليل خفي، * شار، ولقد رأينا هذا النجم من قبل. رأينا ذلك في سياق الملفات. دعونا نرى الآن لماذا كنا مختبئين هذا التفصيل لبعض الوقت الآن. هنا ملف يسمى compare1.c، وعلى ما يبدو ما يطلب المستخدم لمدة 2 سلاسل وقاف وراء، ومن ثم فإنه يحاول مقارنة تلك السلاسل من أجل المساواة في خط 26، واذا كانا لا يزالان على قدم المساواة على حد قولها، "قمت بكتابة نفس الشيء،" وإذا هم ليسوا على قدم المساواة على حد قولها، "لقد كتبت أشياء مختلفة". اسمحوا لي أن تمضي قدما وتشغيل هذا البرنامج. اسمحوا لي ان اذهب الى بلدي الدليل المصدر، وجعل compare1. انها جمعت حسنا. اسمحوا لي أن تشغيل compare1. أنا تكبير، دخول. أقول شيئا. مرحبا. أنا أقول شيئا مرة أخرى. مرحبا. أنا بالتأكيد لم اكتب أشياء مختلفة. اسمحوا لي أن جربت هذا مرة أخرى. BYE BYE. بالتأكيد ليست مختلفة، لذلك ما يحدث هنا؟ حسنا، ما هو حقا يجري مقارنة في خط 26؟ [غير مسموع والطالب] نعم، لذلك تبين أن سلسلة، نوع البيانات، هو نوع من كذبة بيضاء. سلسلة * هو حرف، ولكن ما هو شار *؟ A * شار، كما يقولون، هو مؤشر، والمؤشر بشكل فعال عنوان، موقع مجموع في الذاكرة، وإذا كنت يحدث لديها كتبته في كلمة واحدة مثل مرحبا أذكر من المناقشات السابقة من السلاسل هذا هو مثل كلمة الترحيب. تذكر أنه يمكن تمثيل كلمة تحب Hello كصفيف من الأحرف مثل هذا ثم ذو طابع خاص دعا في نهاية الحرف فارغة، كما يدل \. ما هو في الواقع سلسلة؟ لاحظ أن هذا هو قطع متعددة من الذاكرة، في واقع الأمر، لا يعرفه إلا نهاية لها بمجرد النظر من خلال السلسلة بأكملها يبحث عن الحرف فارغة خاصة. ولكن إذا كان هذا هو قطعة من الذاكرة من ذاكرة الكمبيوتر الخاص بي، دعنا نقول أن هذه السلسلة بشكل تعسفي فقط حصلت على الحظ، وحصلت على وضعها في بداية جدا من RAM جهاز الكمبيوتر الخاص بي ل. هذا هو البايت 0، 1، 2، 3، 4، 5، 6 ... عندما أقول شيء من هذا القبيل، وأنا أفعل GetString سلسلة S = GetString ما يجري حقا عاد؟ لهذه الأسابيع القليلة الماضية، في الحقيقة ما يجري تخزينها في ق ليست هذه السلسلة في حد ذاته، ولكن في هذه الحالة هو ما يجري تخزينها و0 عدد GetString لأن ما في الواقع لا وذلك لا يرجع جسديا سلسلة. حتى لا حقا جعل الناحية المفاهيمية. ما تقوم به هو عودة عدد. هذا العدد هو عنوان مرحبا في الذاكرة، وسلسلة ليالي ثم، إذا كنا قشر هذه الطبقة مرة أخرى، سلسلة غير موجود حقا. انها فقط التبسيط في مكتبة CS50. هذا هو حقا ما يسمى * شار. شار المنطقي لأن ما هو كلمة واحدة، مثل مرحبا؟ حسنا، انها سلسلة من حرف، سلسلة من الأحرف. * شار يعني عنوان حرف، فماذا يعني ذلك لإرجاع سلسلة؟ لطيفة، طريقة بسيطة لإرجاع سلسلة هو بدلا من محاولة لمعرفة كيف أعود إلى 5 أو 6 بايت مختلفة اسمحوا لي أن أعود إلى العنوان الذي بايت؟ أول واحد. وبعبارة أخرى، اسمحوا لي أن أقدم لكم عنوان حرف في الذاكرة. هذا ما شار * يمثل، عنوان واحد حرف واحد في الذاكرة. استدعاء هذا هو المتغير. متجر في ليالي هذا العنوان وجه الخصوص، والتي قلت بشكل تعسفي 0، فقط للحفاظ على الأشياء البسيطة، ولكن في الواقع انها عموما أكبر عدد. انتظر لحظة. إذا كنت تعطي فقط لي عنوان الحرف الأول، كيف لي أن أعرف ما هو عنوان من الحرف الثاني، والثالث، والرابع والخامس؟ [غير مسموع والطالب] تعرف فقط حيث نهاية السلسلة من طريق هذه الحيلة في متناول يدي، حتى عند استخدام شيء من هذا القبيل printf، ما يأخذ حرفيا printf وحجتها، يذكر أن نستخدم هذا العنصر النائب٪ S، ومن ثم قمت بتمرير في المتغير هذا ما تخزين سلسلة. ما كنت حقا يمر هو عنوان الحرف الأول من هذه السلسلة. Printf ثم يستخدم لحلقة أو حلقة في حين أن لدى استقباله عنوان، على سبيل المثال، 0، لذلك اسمحوا لي أن تفعل هذا الآن، printf ("٪ S \ N"، ق)؛ عندما أعطي الكلمة printf ("٪ S \ N"، ق)؛ ما أنا حقا printf مع توفير هو عنوان الحرف الأول في ليالي، وهو في هذه الحالة هو التعسفي H. كيف أعرف بالضبط ما printf للعرض على الشاشة؟ الشخص الذي نفذت تنفيذ printf حلقة الوقت أو حلقة For تقول هذه الشخصية لا يساوي حرف فارغة خاصة؟ إن لم يكن، طباعته. ماذا عن هذا؟ إن لم يكن طباعته، طباعته، طباعته، طباعته. أوه، هذا هو واحد خاصة. إيقاف الطباعة والعودة إلى المستخدم. وهذا هو حرفيا كل ما كان يحدث تحت غطاء محرك السيارة، وهذا هو الكثير لهضم في اليوم الأول من فئة، لكن في الوقت الراهن انها حقا لبنة من كل شيء فهم ما كان ذلك يدور داخل جهاز الكمبيوتر من الذاكرة لدينا، وسنقوم في نهاية المطاف بصرف النظر ندف هذا مع القليل من المساعدة من واحد من أصدقائنا في جامعة ستانفورد. وقد فعلت أستاذ في جامعة ستانفورد نيك Parlante هذا التسلسل فيديو رائع من جميع أنواع لغات مختلفة التي أدخلت هذه الشخصية قليلا Claymation Binky. صوت كنت على وشك أن نسمع فقط في معاينة التسلل الثانية قليلة هو أن من الاستاذ بجامعة ستانفورد، وكنت تحصل على فقط 5 أو 6 ثوان من هذا الحق الآن، ولكن هذه هي مذكرة عن التي سنقوم تختتم اليوم ويبدأ يوم الاربعاء. أنا أعطيك المرح مع مؤشر Binky، المعاينة. [♪ ♪ موسيقى] [أستاذ Parlante] مرحبا، Binky. يستيقظون. حان الوقت للمتعة المؤشر. [Binky] ما هذا؟ التعلم عن مؤشرات؟ أوه، جودي! سوف نرى لك يوم الاربعاء. [CS50.TV]