DAVID مالان: كل الحق، نرحب مرة. هذا هو CS50. هذه هي بداية من الأسبوع السبعة. حتى انها كانت فترة من الوقت، لذلك اعتقد اننا كنا القيام بجولة مكوكية من حيث نحن توقفت وإلى أين نحن ذاهبون الآن. لذلك هذا الشيء هنا قد يكون تسبب بعض القلق في البداية. ولكن نأمل، كنت بدأت يتأقلم مع ما يدل على هذا هنا - نجمة يمثل المؤشر، الذي هو فقط ما، من حيث أكثر شخص العادي؟ لذلك فمن عنوان. لذلك فمن عنوان شيء ما في الذاكرة. وبدأنا في قشر العودة طبقات وقبل أسبوعين، وأشياء مثل GetString وأي وظائف أخرى كل هذا الوقت تم إرجاع عناوين من الأشياء في الذاكرة، مثل عنوان الحرف الأول في بعض التسلسل. لذلك نحن أيضا قدم valgrind، التي عليك أن تبدأ في استخدام لهذه المشكلة مجموعة، ولا سيما لالمقبل مشكلة تعيين كذلك. وvalgrind يفعل ما بالنسبة لنا؟ فإنه يتحقق من وجود تسرب الذاكرة، و يتحقق أيضا لإساءة استخدام الذاكرة. يمكن ذلك، مع بعض الاحتمالات، والكشف عن حالة كود الخاص بك هو الذهاب للمس الذاكرة أنه ببساطة لا ينبغي. لذلك ليس بالضرورة أن يكون تسرب، ولكن إذا تتجاوز حدود بعض مجموعة، وكنت في الواقع تشغيل valgrind وحمل هذه السلوك أثناء يتم تشغيل valgrind في البرنامج هو تشغيل داخله، ستحصل على رسائل مثل هذا - "الكتابة غير صالحة لل حجم 4 "، والتي، أذكر بضعة قبل أسابيع من المفترض ان كان لي بطريق الخطأ مثل على كثافة واحدة بعيدا جدا ما وراء حدود صفيف. وحتى حجم 4 يعني هنا حجم من أن كثافة معينة. حتى تأخذ الطمأنينة في حقيقة أن خرج valgrind، وشكل ذلك، هو مجرد فظيعة. من الصعب حقا أن نرى من خلال الفوضى لمعلومات مثيرة للاهتمام. وذلك ما فعلناه هنا هو مقتطفات فقط بعض من اثنين من أكثر خطوط مثيرة للاهتمام. ولكن ندرك أن 80 في المئة من صادرات valgrind الناتج سيكون قليلا من الهاء. مجرد إلقاء نظرة على أنماط مثل هذه - الحق غير صالحة، غير صالحة للقراءة، 40 بايت وبعض عدد من كتل هي بالتأكيد فقدت، والكلمات الرئيسية من هذا القبيل. وسترى ما نأمل هو بعض نوع من تتبع ما يعمل الخطأ هو في الواقع فيها. في هذه الحالة هنا، في ما سطر من وكان قانون بلدي الخطأ على ما يبدو؟ 26 في ملف يسمى memory.c، الذي كان على سبيل المثال كنا نلعب مع في ذلك الوقت. لذلك فمن المحتمل أن لا في malloc. ربما كان عليه في قانون بلدي بدلا من ذلك. لذلك سنرى هذا مرة أخرى ومرة أخرى قبل فترة طويلة. حتى scanf، وجاء هذا الأمر في حتى الآن زوجين من الأشكال. شاهدنا sscanf لفترة وجيزة. كان عليه شيء عددا من كنت اتجه الى في الخاص التحضير للمسابقة. و scanf هو في الواقع ما CS50 لقد تم استخدام المكتبة تحت هود لبعض الوقت من أجل للحصول على مدخلات من المستخدم. على سبيل المثال، إذا كنت تتحرك فوق إلى CS50 الأجهزة هنا، اسمحوا لي أن فتح و مثلا اليوم أن يسمى scanf-0.c وانها السوبر بسيطة. انها مجرد بضعة أسطر من التعليمات البرمجية. لكنه يوضح حقا كيف getInt ظلت تعمل كل هذا الوقت. في هذا البرنامج هنا، في السطر 16 ، لاحظ أن أعلن عدد صحيح. لذلك لا مؤشرات، لا شيء سحري هناك، مجرد كثافة العمليات. ثم في خط 17، وأنا مطالبة المستخدم لعدد من فضلك. ثم في أواخر 18، وأنا استخدم scanf هنا. وأنا المحدد، نوع من مثل printf، أن أتوقع اقتباس في المئة نهاية الاقتباس ط. لذلك أنا في المئة، بطبيعة الحال، يدل على كثافة العمليات. ولكن لاحظ ما ثاني حجة لscanf هو. كيف تصف الثاني حجة بعد الفاصلة؟ ما هذا؟ انها عنوان خ. لذلك هذا هو مفيد لمن خلال توفير scanf مع عنوان س، ما يفعله التي تمكن أن يعمل أن تفعل؟ ليس فقط الذهاب إلى هناك، ولكن أيضا أن تفعل ماذا؟ إجراء تغيير على ذلك. لأنه يمكنك الذهاب إلى هناك، انها نوع من مثل خريطة لموقع في الذاكرة. وطالما أنك توفر scanf، أو أي وظيفة مع مثل هذه الخريطة، التي وظيفة يمكن أن تذهب هناك، وليس فقط ننظر إلى القيمة، ولكنها يمكن أيضا تغيير هذه القيمة، وهو أمر مفيد إذا غرض في حياة scanf هو مسح مدخلات من المستخدم، وتحديدا من لوحة المفاتيح. وو يدل منسق، تماما مثل printf، وو ترمز الى منسق السلسلة التي تريد طباعتها. لذلك باختصار، هذا الخط 18 يقول ببساطة، محاولة لقراءة عدد صحيح من المستخدم لوحة المفاتيح وتخزينه داخل س، في أيا كان عنوان س يحدث للعيش في. ثم أخيرا، خط 19 يقول عادل، شكرا لكثافة العمليات، في هذه الحالة. لذلك اسمحوا لي المضي قدما وجعل هذا. لذا تأكد scanf 0. اسمحوا لي أن تمضي قدما وتكبير. سأذهب وتشغيل هذا مع النقاط خفض scanf 0. عدد، من فضلك؟ 50. شكرا لل50. حتى انها بسيطة جدا. الآن ما لا تفعل؟ انها لا تفعل في مجمله مجموعة من تدقيق الأخطاء. على سبيل المثال، إذا كنت لا تتعاون، وأنا لا اكتب في عدد، ولكن بدلا من ذلك أنا أكتب شيئا مثل "مرحبا" هذا مجرد نوع غريب. وذلك واحد من الأشياء CS50 مكتبة كانت تقوم به بالنسبة لنا لبعض الوقت هو أن reprompting وreprompting. كان عبارة استدعاء إعادة المحاولة في cs50.c، وهذا هو السبب في أن getInt في مكتبة CS50 هو في الواقع كله مجموعة من خطوط طويلة، لأننا التحقق من وجود الاشياء الغبية مثل هذا. لم لا تعطي المستخدم لنا، في الواقع، وكثافة العمليات؟ وقال انه او انها تعطينا شيئا مثل رسالة الأبجدي؟ إذا كان الأمر كذلك، ونحن نريد للكشف عن أن والصراخ عليهم. ولكن الامور أكثر إثارة للاهتمام في هذا المثال التالي. اذا ذهبت الى scanf-1.C، ما هو الشيء الذي تغير جذري في هذا المثال التالي؟ أنا باستخدام شار *، بطبيعة الحال، بدلا من كثافة العمليات. لذلك هذا هو المثير للاهتمام، لأن شار *، نذكر، هو في الحقيقة مجرد نفس الشيء مثل السلسلة. لذلك يبدو وكأنه ربما هذا هو السوبر تنفيذ بسيط من GetString. ولكني مقشر مرة أخرى طبقة مكتبة CS50، لذلك أنا استدعاء هذا تشار * الآن. لذلك دعونا نرى فيها، وإذا في أي مكان، أخطأنا. خط 17 - أنا أقول مرة أخرى، من فضلك أعطني شيئا، في هذه الحالة، سلسلة. ثم في السطر التالي، وأدعو scanf، مرة أخرى، ويعطيها رمز تنسيق، ولكن هذه المرة في المئة ق. ثم هذه المرة، وأنا يعطيها العازلة. الآن لاحظ، أنا لا تستخدم علامة الضم. ولكن لماذا هو أنه من المحتمل موافق هنا؟ لأن ما هو عازلة بالفعل؟ انها بالفعل المؤشر. انها بالفعل عنوان. ودعونا هذه الكلمة "الخلط"، اسمحوا لي مجرد دعوة ليالي، على سبيل المثال، ل البساطة. ولكني يطلق عليه العازلة لأنه في عموما، في مجال البرمجة، إذا كان لديك جزء من الذاكرة، والذي سلسلة حقا فقط هو، قد نسميها العازلة. انها مكان لتخزين المعلومات. مماثلة لأشياء مثل يوتيوب، عندما انهم التخزين المؤقت، إذا جاز التعبير، التي يعني فقط انها تحميله بت من الإنترنت وتخزينها في مجموعة المحلية، جزءا من الذاكرة المحلية حتى يمكنك مشاهدته في وقت لاحق دون ذلك تخطي أو معلقة على كنت حين لعب مرة أخرى. ولذلك لا يوجد مشكلة هنا الرغم من ذلك، لأن أنا أقول scanf، ونتوقع سلسلة من المستخدم. وهنا عنوان قطعة من الذاكرة. وضعت هذه السلسلة هناك. لماذا هو أن تعطي المربوطة لنا المتاعب، على الرغم من؟ ما هذا؟ أنا سمحت بالحصول ذلك الجزء من الذاكرة؟ كما تعلمون، أنا لا أعرف. لأنه قد تم تهيئة العازلة إلى أي شيء؟ لا حقا. وذلك ما كنا الدعوة قيمة القمامة، والتي ليست كلمة رسمية. بل يعني فقط ليس لدينا أي فكرة عما بت في الداخل من وحدات البايت الأربعة التي لقد خصصت كما العازلة. أنا لم تسمى malloc. لقد بالتأكيد لا يسمى GetString. لذلك من يدري ما هو في الواقع داخل المخزن؟ وبعد إخبار scanf عمياء، الذهاب إلى هناك ووضع كل ما كتبته المستخدم. فما هو السبب المرجح ل في التعليمات البرمجية لدينا إذا نحن تشغيله؟ ربما سوف segfault. ربما لا، ولكن ربما سوف segfault. وأنا أقول ربما لأن في بعض الأحيان لا كنت تفعل، وأحيانا كنت لا تحصل على سوف segfault. في بعض الأحيان كنت مجرد الحصول على محظوظ، ولكن انها مع ذلك ستكون خطأ في برنامجنا. لذلك اسمحوا لي المضي قدما وتجميع هذه. انا ذاهب للقيام بذلك الطريق المدرسة القديمة. اندفاعة رنة حتى 0، scanf-1، scanf-1.C، أدخل. عفوا، المدرسة القديمة جدا. دعونا نرى. حيث لم يذهب؟ أوه، تشار * العازلة. أوه، شكرا لك - حفظ، موافق - المدرسة القديمة جدا. كل الحق، انها كانت فترة من الوقت. حتى لقد حفظته للتو الملف بعد جعل هذا مؤقتة تغيير منذ لحظة. والآن لقد جمعت عليه يدويا مع ضجيج. والآن انا ذاهب الى المضي قدما وتشغيل scanf-1، أدخل. سلسلة من فضلك. سوف اكتب في "مرحبا." والآن، وهنا حيث، بصراحة، printf يمكن هو مزعج قليلا. انها ليست في طريقها فعلا ل سوف segfault في هذه الحالة. Printf هو خاص قليلا لأن انها تستخدم عادة حتى السوبر التي تقوم أساسا printf لنا صالح وتحقيق، هذا ليس مؤشر صالحة. اسمحوا لي أن أغتنم على نفسي لمجرد الطباعة في الأقواس فارغة، حتى على الرغم من انها ليست بالضرورة ما نحن أنفسنا المتوقع. لذلك نحن لا يمكن أن تحدث بسهولة حقا سوف segfault مع هذا، ولكن من الواضح أن هذا ليس سلوك أردت. فما هو الحل بسيط؟ حسنا، في scanf-2، اسمحوا لي أن أقترح أن بدلا من الواقع مجرد تخصيص * شار، اسمحوا لي أن أكون أكثر ذكاء قليلا عن هذا، واسمحوا لي أن تخصيص عازلة كما تتابع من 16 حرف. لذلك أستطيع أن أفعل ذلك في عدة طرق. ويمكنني أن استخدام malloc على الاطلاق. ولكن يمكنني أن أعود إلى أسبوعين عندما أنا فقط بحاجة في مجمله مجموعة من حرفا. هذا مجرد صفيف. لذلك اسمحوا لي بدلا تعريف العازلة أن تكون مجموعة من 16 حرفا. والآن، عندما أمرر عازلة في - وهذا شيء لم نكن الحديث عنها في أسبوعين - ولكن هل يمكن علاج مجموعة كما على الرغم من انها عنوان. من الناحية الفنية، كما رأينا، وانهم مختلفة قليلا. ولكن سوف scanf لا تمانع إذا كنت تمر عليه اسم صفيف، لأن ما سوف رنة تفعل بالنسبة لنا هي في جوهرها علاج اسم ذلك مجموعة باسم عنوان قطعة من 16 بايت. لذلك هذا هو أفضل. وهذا يعني الآن أستطيع أن نأمل القيام بما يلي. اسمحوا لي التصغير للحظة و لا تجعل scanf-2، وقد تم تجميعها موافق. الآن اسمحوا لي أن لا حصلت مائل scanf-2. سلسلة من فضلك. "مرحبا". و وبدا أن تنجح هذه المرة. ولكن يمكن للشخص أن يقترح سيناريو التي قد لا تزال تعمل؟ نعم؟ شيء أطول من 16 حرفا. وفعلا، ونحن يمكن أن يكون أكثر من ذلك بقليل دقيقة. شيء أطول ثم 15 حرفا، لأن حقا نحن بحاجة إلى أن نضع في اعتبارنا أننا بحاجة أن الصفر مائل ضمنا في نهاية السلسلة، وهو scanf جانبا وعادة رعاية بالنسبة لنا. لذلك اسمحوا لي أن تفعل شيئا من هذا القبيل - أحيانا ما في وسعنا فقط ترك الأمر من هذا القبيل. موافق، لذلك قمنا بفعل الآن خطأ تجزئة لدينا. لماذا؟ لأنني كتبته إلى أكثر من 15 أحرف، وهكذا قمنا فعلا الذاكرة لمست أنني فعلا لا ينبغي أن يكون. فما هو الحل حقا هنا؟ حسنا، ما إذا كنا بحاجة إلى سلسلة أطول؟ حسنا، نحن ربما تجعل من 32 بايت. حسنا، ما إذا كان هذا لا يكفي طويلة؟ ماذا عن 64 بايت؟ ما إذا كان هذا لا يكفي طويلة؟ ماذا عن 128 أو 200 بايت؟ ما هو حقا الحل هنا في الحالة العامة، إذا كنا لا نعرف في تقدم ما يحدث للمستخدم اكتب؟ انها مجرد نوع من الألم كبيرا في الحمار، أن نكون صادقين، وهذا هو السبب في مكتبة CS50 لديه بضع عشرات من خطوط التعليمات البرمجية التي تنفذ بشكل جماعي GetString سلسلة بطريقة لم نفعل يجب أن تعرف مسبقا ما المستخدم هو الذهاب الى الكتابة. على وجه الخصوص، إذا كنت ننظر إلى الوراء في cs50.c من قبل اسبوعين، سترى أن الواقع لا GetString عدم استخدام scanf في هذا السبيل. بدلا من ذلك، فإنه يقرأ حرف واحد في وقت واحد. لأن شيء واحد لطيفة عن قراءة حرف واحد هو في وسعنا تضمن أنفسنا دائما لديها حرف واحد على الأقل. يمكنني فقط أن يعلن شار، ومن ثم اتخاذ هذه خطوات طفل حقا فقط قراءة حرف واحد في في الوقت من لوحة المفاتيح. ثم، ماذا سترى GetString هل هو كل الوقت الذي نفدت، مثلا، 16 بايت من الذاكرة، فإنه يستخدم malloc، أو ابن عم له، ل تخصيص المزيد من الذاكرة، نسخ القديمة الذاكرة في الجديدة، ثم الزحف جنبا إلى جنب، والحصول على حرف واحد في وقت واحد، وعندما نفدت أن جزء من الذاكرة، ويلقي بها بعيدا، العناوين الرئيسية للصحف قسما أكبر من الذاكرة، النسخ القديمة في جديدة، ويكرر. وانها حقا الألم إلى الواقع تنفيذ شيء بسيط مثل الحصول على مدخلات من المستخدم. بحيث يمكنك استخدام scanf. يمكنك استخدام وظائف أخرى مماثلة. والكثير من الكتب وعلى شبكة الإنترنت أمثلة القيام به، لكنهم جميعا عرضة للمشاكل من هذا القبيل. وفي نهاية المطاف، والحصول على سوف segfault هو نوع من مزعج. انها ليست جيدة للمستخدم. ولكن في أسوأ الحالات، ما يفعله انها وضعت في الأساس الخاص كود في خطر؟ نوع من الهجوم المحتمل. تحدثنا عن واحد مثل هذا الهجوم - تفيض المكدس. ولكن بصفة عامة، إذا كنت سمحت ل تجاوز منطقة عازلة، كما فعلنا ل قبل بضعة أسابيع، مع مجرد كتابة أكثر من "مرحبا" على المكدس، ل يمكن أن يستغرق أكثر من الواقع، وربما، و الكمبيوتر، أو على الأقل الحصول على البيانات التي لا ينتمي لك. لذلك باختصار، وهذا هو السبب لدينا تلك العجلات التدريب. ولكن الآن، ونحن نبدأ في اتخاذ أجبرتها على الفرار، كما برامجنا لم تعد تحتاج إليها، بالضرورة، ومدخلات من المستخدم. ولكن في حالة وجود مشكلة تعيين ستة، سوف تأتي من المدخلات الخاصة بك ضخمة ملف القاموس مع بعض 150 الغريب ألف كلمة. لذلك سوف لا يكون لديك ما يدعو للقلق مدخلات التعسفي للمستخدم. وسنقدم لكم بعض الافتراضات حول هذا الملف. أي أسئلة حول مؤشرات أو scanf أو إدخال المستخدم بشكل عام؟ كل الحق، لذلك نظرة سريعة ثم في واحد زائدة الموضوع من قبل اسبوعين. وكان هذا مفهوم البنية. ليس ذلك - وهذا مفهوم البنية، والذي كان ماذا؟ ماذا تفعل البنية بالنسبة لنا؟ تعريف - آسف؟ تعريف نوع المتغير. ذلك النوع. نحن الجمع بين موضوعين في الواقع. حتى مع الرموز المميزة ل typedef، أذكر ما في وسعنا تعلن نوع من منطقتنا، مثل مرادف، مثل سلسلة لشار *. ولكن باستخدام الرموز المميزة ل typedef والبنية، في وسعنا خلق حقا هياكل البيانات الخاصة بنا. على سبيل المثال، إذا أعود إلى gedit هنا لمجرد لحظة، وأنا المضي قدما وتفعل شيئا مثل، اسمحوا لي حفظ هذا الحال، دعنا نقول، structs.c مؤقتا، سأقوم المضي قدما، وتشمل standardio.h، باطلة الرئيسي كثافة العمليات. ثم هنا، لنفترض أنني أريد لكتابة برنامج يخزن طلاب متعددة من عدة المنازل، على سبيل المثال. لذلك فمن مثل registrarial قاعدة بيانات من نوع ما. حتى لو كنت في حاجة إلى اسم طالب واحد، وأنا قد تفعل شيئا مثل شار * الاسم، وسأفعل شيئا مثل - في الواقع، دعونا استخدام المكتبة CS50 لمجرد لحظة لجعل هذه أبسط قليلا، حتى نتمكن من الاقتراض تلك العشرات من الأسطر من التعليمات البرمجية. ودعونا فقط يبقيه بسيط. سنقوم يبقيه سلسلة، وGetString الآن. لذلك يدعون أنا الآن بعد أن كنت تخزين اسم بعض الطلاب، وبيت بعض الطلاب، ومجرد استخدام المتغيرات وكما فعلنا في أسبوع واحد. ولكن لنفترض الآن أنا أريد أن دعم الطلاب متعددة. كل الحق، لذلك موهبتي هي أن تفعل سلسلة NAME2، يحصل GetString، سلسلة house2 يحصل GetString. ثم طالب ثالث دينا، دعونا نفعل NAME3 GetString. كل الحق، لذلك هذا هو المأمول ضرب لكم ونوع من الغباء، لأن هذه العملية هي حقا أبدا الذهاب الى النهاية، وانها مجرد الذهاب الى جعل قانون بلدي تبدو أسوأ وأسوأ وأسوأ. لكننا حلها هذا أيضا في أسبوعين. ما كان لدينا حل نظيفة نسبيا عندما كان لدينا متغيرات متعددة من نفس نوع البيانات التي ترتبط كل شيء، ولكن لأننا لا نريد هذه الفوضى الفظيعة من اسمه بالمثل المتغيرات؟ ماذا نفعل بدلا من ذلك؟ لذلك أعتقد أنني سمعت عدد قليل من الأماكن. كان لدينا مجموعة. إذا كنت تريد مثيلات متعددة من شيء، لماذا لا نقوم بتنظيف كل هذا ونقول فقط، أعطني مجموعة تدعى أسماء؟ والآن، دعونا رمز القرص الثابت 3. ثم تعطيني مجموعة أخرى دعا المنازل، واسمحوا لي ل الآن رمز القرص الثابت 3. ولقد تنظيفها على نطاق واسع حتى الفوضى التي أنا خلقت للتو. الآن، لقد زال الثابت ترميز 3، ولكن حتى 3 يمكن أن تأتي حيوي من المستخدم، أو ARGV، أو ما شابه ذلك. لذلك هذا هو أنظف بالفعل. ولكن ما هو مزعج في هذا هو أن الآن، على الرغم من أن الاسم هو بطريقة أو بأخرى ترتبط جوهريا ل بيت الطالب - انها طالبة أنني حقا تريد أن تمثل - لدي الآن اثنين من المصفوفات التي هي موازية بمعنى انهم ل قوس نفس الحجم، وأسماء 0 خرائط يفترض أن المنازل قوس 0، وأسماء القوس 1 الخرائط إلى المنازل قوس 1. وبعبارة أخرى، يعيش الطالب في ذلك البيت، والتي طالب آخر يعيش في ذلك المنزل الأخرى. ولكن من المؤكد أن هذا يمكن أن يكون القيام به حتى أكثر نظافة. كذلك، فإنه يمكن، في الواقع. واسمحوا لي أن تمضي قدما وفتح حتى structs.h، وعليك نرى هذه الفكرة هنا. تلاحظ أن كنت تستخدم الرموز المميزة ل typedef، كما كنت ألمح إلى قبل لحظة لتعلن لدينا نوع البيانات الخاصة. ولكن أنا أيضا باستخدام هذه الكلمة الرئيسية الأخرى دعا البنية التي يعطيني جديدة هيكل البيانات. وهذا الهيكل بيانات أزعم يجري لدينا اثنين من الأشياء داخل ذلك - سلسلة يسمى الاسم، و ودعا سلسلة المنزل. واسم انا ذاهب لإعطاء هذا الهيكل بيانات يجري ليتم استدعاؤها الطالب. أنا يمكن أن نسميها أي شيء أريد، ولكن هذا جعل لغويا الشعور لي في ذهني. وحتى الآن، وإذا كنت تفتح نسخة أفضل البرنامج بدأت الكتابة هناك، اسمحوا لي أن انتقل إلى الأعلى. وهناك بعض أكثر الأسطر من التعليمات البرمجية هنا، ولكن اسمحوا لي أن أركز ل لحظة على واحد. لقد أعلن ثابت دعا الطلاب والثابت ترميز 3 في الوقت الراهن. ولكن الآن، لاحظ كيف نظيفة قانون بلدي يبدأ في الحصول عليها. في السطر 22، أعلن مجموعة من الطلاب. وتلاحظ أن الطالب هو على ما يبدو الآن نوع البيانات. لأنه في الجزء العلوي من هذا الملف، لاحظ لقد تضمنت أن ملف الرأس انني انسحب قبل لحظة فقط. وأن ملف الرأس تماما كان ببساطة هذا التعريف للطالب. حتى الآن، لقد خلق بلدي البيانات المخصصة الخاصة اكتب أن واضعي C سنوات قبل لا يعتقد من قبل. ولكن لا توجد مشكلة. أنا يمكن أن تجعل من نفسي. لذلك هذا هو مجموعة تسمى الطلاب، كل من أعضائها هو بنية الطالب. وأريد ثلاثة من تلك في صفيف. والآن، ماذا يفعل بقية هذا البرنامج تفعل؟ أنا بحاجة لشيء التعسفي قليلا. حتى من على الانترنت 24 فصاعدا، أنا تكرار 0-3. أنا ثم يطلب من المستخدم ل اسم الطالب. وبعد ذلك استخدام GetString كما كان من قبل. ثم أطلب منزل الطالب، ويمكنني استخدام GetString كما كان من قبل. ولكن لاحظ - جديدة طفيف قطعة من جملة - استطيع يزال مؤشر للطالب ط عشر، ولكن كيف يمكنني الحصول على بيانات محددة الحقل داخل البنية؟ كذلك، ما هو على ما يبدو قطعة جديدة من جملة؟ انها مجرد المشغل نقطة. لم نشهد حقا هذا من قبل. كنت قد رأيت ذلك في خمسة pset إذا كنت قد ارتمى في بالفعل مع ملفات الصور النقطية. ولكن النقطة يعني فقط داخل هذا مجالات البنية أو متعددة، وإعطاء نقطة اسم، أو تعطيني بيت دوت. وهذا يعني ذهاب داخل البنية والحصول على تلك حقول معينة. ماذا بقية هذا البرنامج تفعل؟ انها ليست كل ما مثير. أنا لاحظت أن تكرار 0-3 مرة أخرى، وأنا ببساطة خلق الانجليزية عبارة مثل فلان وفلان في كذا و مثل هذا المنزل، ويمر في اسم نقطة من الطالب ط عشر والتي المنزل كذلك. ثم أخيرا، ونحن الآن سوف تبدأ في الحصول على الشرج حول هذا الموضوع، الآن أننا على دراية بما malloc و وكانت وظائف أخرى تفعل كل هذا الوقت. لماذا لدي لتحرير كل من الاسم والمنزل، على الرغم من أنني لم يدع malloc؟ لم GetString. وهذا هو السر الصغير القذر ل عدة أسابيع، ولكن لديها GetString تم تسريب الذاكرة في جميع أنحاء وضع كل فصل دراسي حتى الآن. وسوف valgrand أخيرا تكشف هذه بالنسبة لنا. ولكنها ليست مشكلة كبيرة، لأنني أعرف أستطيع أن مجرد تحرير اسم والمنزل، على الرغم من الناحية الفنية، ل أن السوبر، السوبر آمنة، وأرجو أن القيام ببعض تدقيق الأخطاء هنا. ما هي الغرائز الخاص أقول لك؟ ما ينبغي أن يكون التحقق من وجود قبل أن تحرير ما هو سلسلة، الملقب التي شار *؟ وأرجو أن يكون حقا التحقق إذا كان الطلاب قوس ط دوت اسم لا فارغة متساوية. ثم انها سوف تكون موافق على المضي قدما وحرة هذا المؤشر، ونفس أو أخرى واحد كذلك. إذا كان الطلاب قوس ط دوت البيت ليس يساوي فارغة، وهذا سوف يحمي الآن ضد حالة الزاوية التي GetString يعود شيء من هذا القبيل فارغة. وشاهدنا لحظة مضت، printf الإرادة حماية لنا هنا من قبل مجرد القول لاغية، والتي سوف تبدو غريبة. ولكن على الأقل فإنه لن سوف segfault، كما رأينا. حسنا، اسمحوا لي أن تفعل الشيء الآخر هنا. البنيات-0 هو نوع من برنامج غبي لأنني تدخل جميع هذه البيانات، ومن ثم انها فقدت بمجرد انتهاء البرنامج. ولكن اسمحوا لي أن نمضي قدما ونفعل ذلك. اسمحوا لي أن المحطة نافذة أكبر قليلا. اسمحوا لي أن البنيات-1، والذي هو نسخة جديدة من هذا. أنا تكبير قليلا. والآن اسمحوا لي أن تشغيل نقطة مائل البنيات-1. اسم الطالب - ديفيد ماذر، دعونا نفعل روب كيركلاند، دعونا نفعل لورين يفيريت. ما هو مثير للاهتمام الآن هو إشعار - وأنا أعرف هذا فقط لأن كتبت البرنامج - هناك ملف الآن في بلدي الحالي دليل يسمى students.csv. قد شهدت بعض منكم هذه في العالم الحقيقي. ما هو ملف CSV؟ قيم مفصولة بفواصل. انها نوع من مثل الرجل الفقير نسخة من ملف Excel. انها الجدول الصفوف والأعمدة التي يمكنك فتح في برنامج مثل إكسل، أو أرقام على نظام التشغيل Mac. وإذا قمت بفتح هذا الملف هنا على gedit، لاحظت - والأرقام ليست هناك. وهذا قول gedit فقط لي خط الأعداد. تلاحظ في السطر الأول من هذا الملف هو ديفيد وماثر. السطر التالي هو روب فاصلة كيركلاند. والخط الثالث هو لورين فاصلة يفيريت. ذلك ما أنا خلقت؟ لقد كتبت الآن برنامج C التي على نحو فعال يمكن أن تولد جداول البيانات التي يمكن فتحها في برنامج مثل إكسل. ليس كل ما مقنعة مجموعة من البيانات، ولكن إذا كان لديك قطع أكبر بكثير من البيانات التي تريد فعلا ل التلاعب وجعل الرسوم البيانية من و مثل، وهذا ربما يكون واحدا وسيلة لخلق تلك البيانات. علاوة على ذلك، ملفات CSV هي في الواقع مشتركة عظمى فقط لتخزين البيانات بسيطة - ياهو المالية، على سبيل المثال، إذا كنت تحصل أسعار الأسهم عن طريق ما يسمى ب API، وخدمة مجانية تسمح لك الحصول على المخزون الحالي يصل إلى التاريخ، يقتبس للشركات، فإنها إعطاء الظهر البيانات في تنسيق CSV السوبر بسيطة. فكيف فعلنا ذلك؟ كذلك لاحظت أن معظم هذا البرنامج تقريبا نفس. ولكن لاحظ أسفل هنا، بدلا من الطباعة الطلاب بها، على خط 35 فصاعدا، أزعم أنني إنقاذ الطلاب إلى القرص، لذلك حفظ ملف. حتى إشعار أنا اعلان FILE * - الآن، وهذا هو نوع من الشذوذ في C. لأي سبب من الأسباب، FILE هو كل القبعات، و التي ليست مثل معظم أنواع البيانات الأخرى في C. ولكن هذا هو المدمج في نوع البيانات، FILE *. وأنا معلنا مؤشر إلى ملف، هو كيف يمكن ان يخطر لك ذلك. الدالة fopen يعني فتح الملف. ما الملف الذي تريد فتح؟ أريد أن أفتح ملف أنني سوف استدعاء تعسفي students.csv. أنا يمكن أن نسمي ذلك أي شيء أريد. ومن ثم اتخاذ تخمين. ماذا الوسيطة الثانية لFOPEN ربما يعني؟ الحق، ث للكتابة، يمكن ص تكون للقراءة. هناك لالإلحاقي إذا كنت تريد إضافة صفوف ويست الكتابة فوق كل شيء. ولكن أريد فقط أن إنشاء هذا الملف مرة واحدة، ولذا فإنني سوف تستخدم قوسي الإقتباس ث. وأنا أعلم أن فقط من بعد قراءة وثائق، أو صفحة الرجل. إذا لم يكن الملف فارغة - وبعبارة أخرى، إذا كان أي شيء ذهب على نحو خاطئ هناك - اسمحوا لي تكرار عبر الطلاب 0-3. والآن لاحظ هناك شيء أي وقت مضى حتى قليلا مختلفة حول خط 41 هنا. انها ليست printf. انها fprintf لملف printf. حتى انها تسير الكتابة إلى ملف. أي ملف؟ واحد الذي تحدده المؤشر كما الوسيطة الأولى. ثم نقوم بتحديد سلسلة تنسيق. ثم نقوم بتحديد ما نريد أن سلسلة سد العجز في المئة للأول، و ثم متغير آخر أو ق في المئة الثانية. ثم نغلق الملف مع fclose. مما كنت تحرير الذاكرة كما كان من قبل، على الرغم من أود أن أعود في وإضافة بعض الشيكات لاغية. وهذا كل شيء. الدالة fopen، fprintf، fclose يعطيني القدرة على إنشاء الملفات النصية. الآن، سترى في مشكلة تعيين خمسة، الذي ينطوي على الصور، فسوف يكون باستخدام الملفات الثنائية بدلا من ذلك. ولكن في الأساس، والفكرة هي نفسها، على الرغم من أن وظائف عليك تراها هي مختلفة قليلا. جولة مكوكية لذلك، ولكن سوف تحصل مألوفة جدا مع ملف I/O-- المدخلات والمخرجات - مع pset الخمسة. وأي أسئلة حول أساسيات الأولية هنا؟ نعم؟ ماذا لو كنت في محاولة لتحرير قيمة فارغة؟ أعتقد، إلا إذا حصلت الحرة أكثر قليلا سهلة الاستعمال، يمكنك يحتمل سوف segfault. فمررها فارغة سيئة لأنني لا ويعتقد يزعج الحرة للتحقق بالنسبة لك، لأنه يحتمل أن يكون مضيعة من الوقت من أجل أن تفعل نفسها ل كل شخص في العالم. سؤال جيد، وإن كان. كل الحق، لذلك هذا النوع من يحصل بنا إلى موضوع مثير للاهتمام. موضوع المشكلة تعيين خمسة هو الطب الشرعي. هذا جزء على الأقل المشكلة تعيين. الطب الشرعي عموما يشير إلى الانتعاش من المعلومات التي قد تكون أو قد لا يكون تم حذفه عمدا. وهكذا اعتقدت تعطيك سريعة تذوق ما يحدث في الواقع كل هذه المرة تحت غطاء محرك السيارة من جهاز الكمبيوتر الخاص بك. على سبيل المثال، إذا كان لديك داخل الخاص كمبيوتر محمول أو كمبيوتر سطح المكتب القرص الصلب، انها إما الميكانيكية الجهاز الذي يدور في الواقع - هناك أشياء دائرية تسمى صحون التي تبدو تماما مثل ما أنا وكان للتو على الشاشة هنا، على الرغم من هذا هو المدرسة القديمة على نحو متزايد. هذا هو ونصف بوصة ثلاث سنوات القرص الصلب. ويشير ثلاثة ونصف بوصة من مع من الشيء عند تثبيته في جهاز الكمبيوتر. العديد منكم الرجال في أجهزة الكمبيوتر المحمولة الخاصة بك الآن لديك محركات الأقراص الصلبة للدولة، أو سواقات الأقراص الصلبة الجامدة، التي ليس لها أجزاء متحركة. انهم أكثر مثل ذاكرة الوصول العشوائي وأقل مثل هذه الأجهزة الميكانيكية. ولكن الأفكار لا تزال هي نفسها، بالتأكيد من حيث صلتها مشكلة تعيين خمسة. وإذا كنت تفكر في الآن القرص الصلب يمثل كونه دائرة، والتي أنا أوجه مثل هذا هنا. عند إنشاء ملف على جهاز الكمبيوتر الخاص بك، سواء كان ذلك في SSD، أو في هذه الحالة، قرص صلب المدرسة القديمة، ويتألف هذا الملف بت متعددة. دعنا نقول أنه من هذا 0 و 1، في مجمله مجموعة من 1S و 0s. لذلك هذا هو بلدي القرص الصلب بأكمله. هذا هو على ما يبدو ملف كبير جدا. وأنه يستخدم حتى و 0s 1S في أن جزء من طبق المادية. حسنا، ما هو ذلك الجزء المادي؟ كذلك، اتضح أن على القرص الصلب، على الأقل من هذا النوع، وهناك هذه الجسيمات المغناطيسية الصغير للغاية. ولديهم أساسا الشمال و أقطاب الجنوب لهم، بحيث إذا كان ل تحويل واحدة من تلك الجسيمات المغناطيسية بهذه الطريقة، يمكنك القول أنه من وهو ما يمثل 1. واذا كان رأسا على عقب الجنوب ل الشمال، قد يقول أنه يمثل 0. حتى في العالم المادي الحقيقي، وهذا كيف يمكن أن تمثل شيئا في الدولة الثنائية من 0 و 1. بحيث كل ملف هو. هناك مجموعة كاملة من المغناطيسية الجزيئات التي هي على هذا النحو أو بهذه الطريقة، وأنماط خلق و 0s 1S. ولكن تبين عند حفظ ملف، يتم حفظ بعض المعلومات بشكل منفصل. لذلك هذا هو جدول قليلا، دليل، إذا جاز التعبير. وسوف نطلق على هذا اسم العمود، و سأتصل هذا الموقع العمود. وانا ذاهب الى القول، افترض هذا هو سيرتي الذاتية. يتم تخزين بلدي resume.doc في موقع، دعنا نقول 123. أنا دائما أذهب لهذا العدد. ولكن يكفي أن نقول أن مثل في ذاكرة الوصول العشوائي، يمكنك أن تأخذ القرص الصلب هذا هو غيغابايت أو 200 غيغابايت أو تيرابايت، ويمكنك عددهم كل بايت. يمكنك ترقيم جميع أجزاء من 8 بت. ولذا فإننا سوف أقول إن هذا هو موقع 123. لذلك هذا الدليل داخل التشغيل الخاص بي يتذكر النظام أن بلدي السيرة الذاتية هي في موقع 123. ولكنه يحصل على اهتمام عندما قمت بحذف الملف. لذلك على سبيل المثال - والحمد لله، ومعظم دول العالم لديها القبض على هذا - ما يحدث عندما قمت بسحب الملف إلى جهاز Mac OS المهملات أو ويندوز الخاص بك سلة المهملات؟ ما هو الغرض من ذلك؟ فمن الواضح للتخلص من الملف، ولكن ماذا يفعل فعل سحب و اسقاط في سلة المهملات أو الخاص بك سلة المحذوفات القيام به على جهاز كمبيوتر؟ لا شيء على الإطلاق، حقا. انها مجرد مثل مجلد. انها مجلد خاص، للتأكد. لكن هل فعلا حذف الملف؟ حسنا، لا، وذلك لأن البعض منكم ربما وكانت مثل، يا لعنة، أنت لم يعني للقيام بذلك. لذلك يمكنك النقر المزدوج على القمامة أو سلة المهملات. كنت قد مطعون حول وكنت قد تعافى الملف فقط عن طريق سحبه من هناك. بوضوح، انها ليست بالضرورة حذفها. موافق، أنت أذكى من ذلك. أنت تعرف أن مجرد سحبه إلى القمامة أو سلة المهملات لا يعني كنت إفراغ سلة المهملات. لذلك تذهب إلى القائمة، وكنت أقول فارغة المهملات أو إفراغ سلة المحذوفات. ثم ماذا يحدث؟ نعم، حتى يتم حذفه أكثر من ذلك. ولكن كل ما يحدث هو هذا. الكمبيوتر ينسى حيث كان resume.doc. ولكن ما لم يتغير على ما يبدو في الصورة؟ البتات، و1S و 0s أن أزعم هي في الموقع من بعض الجوانب المادية لل الأجهزة. انهم ما زالوا هناك. انها مجرد جهاز الكمبيوتر لديه نسيت ما هي عليه. حتى انها حررت أساسا للملف بت بحيث يمكن إعادة استخدامها. ولكن ليس حتى إنشاء المزيد من الملفات، والمزيد من الملفات، والمزيد من الملفات سوف احتماليا، تلك و 0s 1S، و تلك الجسيمات المغناطيسية، والحصول على استخدامها، رأسا على عقب أو الجانب الأيمن الأعلى، ل ملفات أخرى، و 0s 1S. بحيث يكون لديك هذه النافذة من الزمن. وانها ليست من يمكن التنبؤ بها طول، حقا. ذلك يعتمد على حجم الثابت وكيف تدفع العديد من الملفات لديك و مدى السرعة التي جعل جديدة. ولكن هناك هذا الإطار من الوقت خلال هذا الملف الذي لا يزال تماما استردادها. لذلك إذا كنت من أي وقت مضى استخدام برامج مثل مكافي أو نورتون لمحاولة استعادة البيانات، كل ما يفعلونه هو محاولة ل استعادة هذا ما يسمى الدليل إلى معرفة أين كان الملف الخاص بك. وأحيانا سوف نورتون ويقول: الملف هو 93٪ للاسترداد. حسنا، ماذا يعني ذلك؟ هذا يعني فقط أن بعض الملفات الأخرى انتهت قبيل الصدفة حتى باستخدام، مثلا، هذه البتات من الملف الأصلي. فما هو في الواقع تشارك في استعادة البيانات؟ حسنا، إذا لم يكن لديك شيء من هذا القبيل نورتون مثبتة مسبقا على جهاز الكمبيوتر الخاص بك، أفضل ما يمكنك فعله هو أن ننظر في بعض الأحيان في القرص الثابت بأكمله يبحث عن أنماط من البتات. وأحد الموضوعات من مشكلة تعيين خمسة هو أنك لن تستطيع البحث في يعادل القرص الصلب، والطب الشرعي صورة من بطاقة فلاش مدمج من كاميرا رقمية، والبحث عن 0S و1S التي عادة، مع ارتفاع احتمال، وتمثل بدء من صورة JPEG. ويمكن يا رفاق استعادة تلك الصور من قبل على افتراض، إذا رأيت هذا النمط من بت على الصورة الشرعي، مع احتمال كبير، أن علامات بداية JPEG. وإذا رأيت نفس النمط مرة أخرى، التي ربما يصادف بداية JPEG آخر، وآخر JPEG، و JPEG آخر. وهذا هو عادة كيف سوف استعادة البيانات العمل. ما هو لطيف حول ملفات JPEG هو على الرغم من تنسيق الملف نفسه هو إلى حد ما معقدة، بداية من كل هذه الملف هو في الواقع التعرف إلى حد ما وبسيطة، كما سترون، إذا كنت قد بالفعل لا. لذلك دعونا نلقي نظرة فاحصة تحت غطاء محرك السيارة فيما يتعلق بالضبط ما كان يجري، وما هذه 1S و 0s هي، لتعطيك أكثر قليلا من سياق هذا التحدي بالذات. [تشغيل الفيديو] أين مخازن جهاز الكمبيوتر الخاص بك أكثر البيانات الدائمة. للقيام بذلك، ويسافر البيانات من ذاكرة الوصول العشوائي جنبا إلى جنب مع إشارات البرامج والتي تخبر القرص الصلب كيفية تخزين تلك البيانات. دارات القرص الصلب ترجمة تلك الإشارات إلى الجهد تقلبات. هذه، بدورها، والسيطرة على محرك الأقراص الصلبة أجزاء متحركة، وبعض من قليل الأجزاء المتحركة اليسار في الكمبيوتر الحديثة. بعض إشارات التحكم في المحرك الذي يدور صحون المغلفة المعادن. يتم تخزين البيانات الخاصة بك في الواقع على هذه صحون. إشارات أخرى نقل القراءة / الكتابة رؤساء لقراءة أو كتابة البيانات على صحون. هذه الآلات الدقيقة بحيث الإنسان الشعر لا يمكن أن تمر حتى بين رؤساء وصحون الغزل. بعد، كل ذلك يعمل بسرعة رائعة. [END تشغيل الفيديو] DAVID مالان: التكبير قليلا أعمق الآن على ما هو في الواقع على تلك صحون. [تشغيل الفيديو] دعنا ننظر إلى ما نحن فقط ورأى في حركة بطيئة. عندما نبضة قصيرة من الكهرباء إرسالها إلى رأس القراءة / الكتابة، إذا تقلب على الصغير الكهرومغناطيسية ل جزء من الثانية. المغناطيس بإنشاء حقل، والذي تغيير القطبية من صغيرة، صغيرة جزء من الجزيئات المعدنية التي معطف كل سطح طبق. سلسلة نمط هذه صغيرة، المناطق المشحونة المتابعة على القرص يمثل بت واحد من البيانات في رقم ثنائي النظام المستخدم من قبل أجهزة الكمبيوتر. الآن، إذا تم إرسال الحالية في اتجاه واحد من خلال رأس القراءة / الكتابة، ومنطقة هو الاستقطاب في اتجاه واحد. إذا تم إرسال الراهنة في الاتجاه المعاكس، و يتم عكس الاستقطاب. كيف تحصل على البيانات من القرص الصلب؟ فقط عكس العملية. لذلك فمن الجسيمات على القرص التي تحصل على التيار في قراءة / الكتابة رئيس الحركة. وضعت معا الملايين من هذه شرائح ممغنطة، و كنت قد حصلت على الملف. الآن، قد قطعة من ملف واحد تكون مبعثرة في جميع أنحاء حملة ل صحون، وكأنه نوع من الفوضى الأوراق على مكتبك. حتى ملف اضافية خاصة بتتبع من حيث كل شيء. لا كنت ترغب في زيارتها شيء من هذا القبيل؟ [END تشغيل الفيديو] DAVID مالان: OK، وربما لا. فكيف العديد من رفاق نشأ مع هؤلاء؟ موافق، لذلك فمن أقل وأقل يد كل عام. ولكن أنا سعيد كنت على دراية على الأقل معهم، لأن هذا ومنطقتنا الكتاب التجريبي، للأسف، يموتون لغاية بالموت البطيء هنا من الألفة. ولكن هذا هو ما أنا، على الأقل، مرة أخرى في المدرسة الثانوية، واستخدام تستخدم لتخزين النسخ الاحتياطية. وكان من المدهش، لأنك يمكن تخزين 1.4 ميغا بايت على هذا القرص معينة. وكان هذا الإصدار كثافة عالية، كما يدل على ذلك HD، التي لديها يعني قبل أشرطة الفيديو HD اليوم. وكانت الكثافة القياسية 800 كيلو بايت. وقبل ذلك، كان هناك الأقراص 400 كيلوبايت. وقبل ذلك، كان هناك 5 و 1/4 الأقراص بوصة، والتي كانت المرنة حقا، وعلى نطاق أوسع قليلا وأطول من هذه الأمور هنا. ولكن يمكنك أن ترى في الواقع ما يسمى الجانب المرن من هذه الأقراص. وظيفيا، وانهم فعلا جميلة مماثلة لمحركات الأقراص الصلبة من في الأقل هذا النوع. مرة أخرى، محركات الأقراص الصلبة في أجهزة الكمبيوتر الحديثة تعمل بشكل مختلف قليلا. ولكن إذا قمت بنقل علامة التبويب هذه المعادن قليلا، يمكنك فعلا رؤية القليل من الكعكة، أو طبق. انها ليست المعدنية مثل هذا واحد. هذا واحد في الواقع بعض أرخص المواد البلاستيكية. ويمكنك نوع من تذبذب ذلك. وكنت قد مسحت تروللي قبالة بعض عدد البتات أو الجزيئات المغناطيسية من هذا القرص. لذلك ولله الحمد، لا يوجد شيء على ذلك. إذا كان هذا الشيء هو في الطريق - والغطاء عينيك وتلك من جارك - يمكنك فقط نوع من سحب هذا غمد كامل من هذا القبيل. ولكن هناك القليل من الربيع، حتى يكون علم أنه مع عينيك. حتى الآن لديك حقا قرص مرن. وما هو ملحوظا عن هذا هو أنه في قدر هذا هو التمثيل على نطاق صغير من أكبر القرص الصلب، وهذه الأمور هي السوبر، سوبر بسيطة. إذا كنت قرصة الجزء السفلي منه، الآن بعد أن قبالة هذا الشيء المعدن، وقشر فتح لهم، كل ما هو قطعتين من اللباد ويسمى القرص المرن مع قطعة من المعدن في الداخل. وهناك يذهب نصف محتويات بلدي القرص. يذهب هناك نصف آخر منهم. ولكن هذا كل ما كان داخل الغزل من جهاز الكمبيوتر الخاص بك في الأمس. ومرة أخرى، لوضع هذا في المنظور، كيف كبيرة هي معظم الخاص محركات الأقراص الصلبة هذه الأيام؟ 500 غيغابايت، تيرابايت، وربما في كمبيوتر سطح المكتب، 2 تيرابايت، 3 تيرابايت و 4 تيرابايت، أليس كذلك؟ هذا هو واحد ميغا بايت، يعطي أو يأخذ، والتي لا يمكن حتى تناسب MP3 نموذجية بعد الآن في هذه الأيام، أو بعض ملف الموسيقى مماثلة. لذلك التذكارية قليلا بالنسبة لك اليوم، و أيضا للمساعدة في تأطير ما سنكون مع لمنح الآن في مشكلة تعيين خمسة. حتى تلك هي لك للحفاظ عليه. لذلك اسمحوا لي الانتقال إلى حيث سيكون قضاء pset المقبل كذلك. لذلك قمنا الآن بتعيين هذه الصفحة ل- أوه، بضعة إعلانات بسرعة. هذا يوم الجمعة، إذا كنت ترغب الانضمام CS50 لتناول طعام الغداء، انتقل إلى المكان المعتاد، cs50.net/rsvp. والمشروع النهائي - حتى في المنهج، لقد نشر مواصفات المشروع النهائي بالفعل. ندرك أن هذا لا يعني انها نتيجة لا سيما في وقت قريب. لقد نشرت ذلك، حقا، لمجرد الحصول على يا رفاق التفكير فيه. والواقع، وهو كبير السوبر نسبة تكونوا معالجة المشاريع النهائية على المواد التي نحن لم تقم حتى نصل الى في الصف، ولكن سوف اعتبارا من الاسبوع القادم. سابق إنذار، على الرغم من أن المواصفات يدعو ل عدد قليل من العناصر المختلفة لل المشروع النهائي. الأولى، في غضون بضعة أسابيع، هو قبل الاقتراح، والبريد الإلكتروني عارضة جميلة ل TF لأقول له أو ما كنت التفكير للمشروع الخاص بك، مع الالتزام لا. وسوف تكون خاصة الاقتراح الخاص الالتزام، قائلا: هنا، وهذا هو ما أود القيام به لمشروعي. ما رأيك؟ كبيرة جدا؟ صغير جدا؟ هو يمكن التحكم فيها؟ وترى المواصفات لمزيد من التفاصيل. بضعة أسابيع بعد ذلك هو الوضع التقرير، الذي هو بالمثل البريد الإلكتروني عارضة لفريق العمل الخاص بك لأقول كيف بعيدا وراء وجودك في النهائي تنفيذ المشروع، تليها وCS50 Hackathon التي الجميع مدعو، والتي ستكون حدثا من 20:00 مساء حتى 07:00 احدة صباحا في صباح اليوم التالي. البيتزا، وأنا قد ذكرت في الأسبوع الصفر، فيل أن خدم في الساعة 9:00 مساء، الطعام الصيني في 01:00. وإذا كنت لا تزال مستيقظا في الساعة 5:00 صباحا، سنقوم يأخذك إلى بيت الصلاة العالمي من أجل وجبة الإفطار. وبالتالي فإن Hackathon هي واحدة من أكثر تجارب لا تنسى في الصف. ثم يرجع للتنفيذ، و ثم CS50 العادلة المناخية. مزيد من التفاصيل حول جميع هذه في الأسابيع القادمة. ولكن دعونا نعود إلى شيء المدرسة القديمة - مرة أخرى، صفيف. لذلك مجموعة لطيفة، لأنه لا يحل مشاكل مثل رأينا مجرد منذ لحظة مع الهياكل الطالب الحصول قليلا خارج نطاق السيطرة إذا كنا تريد أن يكون طالب واحد، طالب اثنين، طالب ثلاثة، طالب نقطة نقطة نقطة، بعض التعسفي عدد من الطلاب. حتى المصفوفات، قبل بضعة أسابيع، انقض في وتحل كل مشاكلنا لا مع العلم مسبقا كم من الأشياء من نوع ما قد نريد. ورأينا أن البنيات يمكن أن تساعدنا مزيد من تنظيم والحفاظ على رمز لنا متغيرات مماثلة من الناحية المفاهيمية، مثل اسم ومنزل، جنبا إلى جنب، حتى نتمكن يمكن التعامل معها ككيان واحد، داخل التي يوجد منها قطع أصغر. ولكن لديها بعض العيوب صفائف. ما هي بعض من مساوئ لقد واجهنا مع المصفوفات حتى الآن؟ ما هذا؟ حجم ثابت - حتى على الرغم من أنك قد تكون قادرة على تخصيص ذاكرة ل مجموعة، وبمجرد معرفة عدد الطلاب لديك، وكيفية العديد من الشخصيات لديك من المستخدم، مرة واحدة كنت قد خصصت مجموعة، وكنت قد رسمت نوع من نفسك في مأزق. لأنك لا يمكن إدراج عناصر جديدة في منتصف صفيف. لا يمكنك إدراج المزيد من العناصر في نهاية صفيف. حقا، عليك أن تلجأ إلى خلق مجموعة جديدة كاملة، كما ناقشناه، نسخ القديمة إلى الجديدة. ومرة أخرى، وهذا هو الصداع الذي GetString يتناول بالنسبة لك. ولكن مرة أخرى، لا يمكنك حتى إدراج شيء في منتصف مجموعة إذا لم يتم شغل معدل بالكامل. على سبيل المثال، إذا كان هذا مجموعة من حجم هنا ستة لديها سوى خمسة أشياء في ذلك، كذلك، هل يمكن أن تك فقط شيء على النهاية. ولكن ماذا لو كنت تريد إدراج شيء في منتصف مجموعة، على الرغم من أنه قد يكون خمسة من أصل ستة أشياء في ذلك؟ حسنا، ماذا نفعل عندما كان لدينا جميعا من متطوعين من البشر لدينا على خشبة المسرح في الأسابيع الماضية؟ إذا أردنا أن وضع شخص ما هنا، إما هؤلاء الناس كيفية نقل هذه الطريق، أو هؤلاء الناس كيفية نقل هذه الطريقة، والتي أصبحت مكلفة. التحول من الناس داخل ل انتهت مجموعة تصل بجمع وتكلف لنا الوقت، وبالتالي لدينا الكثير من ن التربيعية تشغيل مرات مثل الإدراج الفرز، ل المثال، في أسوأ الحالات. حتى صفائف كبيرة، ولكن لديك ل تعرف مسبقا كيف كبيرة تريد لهم. لذلك حسنا، هنا الحل. إذا كنت لا تعرف مسبقا كيف العديد من الطلاب كنت قد يكون، وأنا أعرف مرة واحدة أقرر، رغم ذلك، أنا عالقة مع أن العديد من الطلاب، لماذا لا أنا فقط دائما تخصيص مساحة ضعفي كما أود أن أعتقد أنني في حاجة؟ غير أنه لا يوجد حل معقول؟ واقعيا، لا أعتقد أننا سوف تحتاج إلى أكثر من 50 فتحات في مجموعة لفئة متوسطة الحجم، لذلك دعونا فقط محاصرة. أنا سوف تجعل فتحات في 100 مجموعة بلدي، فقط حتى نتمكن من الحصول على بالتأكيد عدد من الطلاب وأتوقع أن تكون في بعض الطبقة المتوسطة الحجم. فلماذا لا مجرد محاصرة وتخصيص المزيد من الذاكرة، وعادة، لمجموعة مما كنت تعتقد أنك قد تحتاج حتى؟ ما هذا النكسة بسيطة لهذه الفكرة؟ كنت مجرد إضاعة الذاكرة. حرفيا كل برنامج تكتبه ثم وربما باستخدام ضعف الذاكرة و تحتاج فعلا. وأنه فقط لا يشعر وكأنه حل أنيق للغاية. وعلاوة على ذلك، فإنه يقلل فقط احتمال وجود مشكلة. إذا كنت يحدث لديها بالطبع شعبية فصل دراسي واحد وكان لديك 101 الطلاب، والبرنامج لا يزال تواجه نفس المشكلة جذريا. لذلك ولله الحمد، وهناك حل ل جميع مشاكل هذا الإعلان دينا في شكل هياكل البيانات التي أكثر تعقيدا من تلك التي رأيناه حتى الآن. هذا، وأنا يدعون، هي قائمة مرتبطة. هذه هي قائمة من الأرقام - 9، 17، 22، 26، و 34 - التي تم ربطها معا عن طريق من ما كنت رسمها كما السهام. وبعبارة أخرى، إذا أردت أن تمثل صفيف، يمكن أن أفعله شيء من هذا القبيل. وسوف أضع هذا على النفقات العامة في مجرد لحظة. أستطيع أن أفعل - مرحبا، كل الحق. الوقوف إلى جانب. كمبيوتر جديد هنا، واضحة - كل الحق. حتى لو كان لدي هذه الأرقام في مجموعة - 9، 17، 22، 26، 24 - ليس بالضرورة على نطاق كبير. كل الحق، لذلك هنا هو مجموعة بلدي - يا إلهي. كل الحق، حتى هنا هو مجموعة بي. يا إلهي. [ضحك] DAVID مالان: التظاهر. انها الكثير من الجهد للعودة وتحديد ذلك، لذلك هناك - 26. لذلك لدينا هذه المجموعة من 9، 17، 22، 26، و 34. لأولئك منكم أن ترى خطأ محرج أنا أدلى به للتو، هناك هو عليه. لذلك أزعم أن هذا هو حل فعال للغاية. لقد خصصت العديد من رجات كما أحتاج - واحد، اثنان، ثلاثة، أربعة، خمسة، أو ستة - ولقد ثم تخزين أرقام داخل هذه المجموعة. ولكن لنفترض، بعد ذلك، أريد أن إدراج قيمة مثل عدد 8؟ حسنا، أين تذهب؟ لنفترض أنني أريد أن إدراج عدد مثل 20. حسنا، أين تذهب؟ هناك في مكان ما في الوسط، أو عدد 35 لديه للذهاب في مكان ما في نهاية المطاف. ولكن أنا كل من الفضاء. وهكذا وهذا هو التحدي الأساسي من المصفوفات التي لا هي الحل. أنا ادعى قبل لحظة، GetString يحل هذه المشكلة. إذا كنت ترغب في إدراج عدد السادسة في هذه المجموعة، ما هو واحد على الأقل الحل الذي يمكن أن تقع مرة أخرى على لعلى يقين، مثلما نفعل مع GetString؟ ما هذا؟ حسنا، وجعلها أكبر و وقال أسهل من القيام به. نحن لا يمكن أن تجعل بالضرورة مجموعة أكبر، ولكن ماذا يمكننا أن نفعل؟ جعل مجموعة جديدة هذا هو أكبر من حجم 6، أو ربما حجم 10، إذا كنا نريد المضي قدما من الأشياء، ثم نسخ مجموعة القديم إلى الجديد، ومن ثم تحرير مجموعة من العمر. ولكن ما هو الوقت تشغيل الآن من هذه العملية؟ انها يا كبير من ن، لأن النسخ سوف يكلفك بعض وحدات الوقت، لذلك ليست مثالية لذلك إذا كان لدينا ل تخصيص مجموعة جديدة، والتي يجري تستهلك ضعفي الذاكرة مؤقتا. نسخ القديمة إلى الجديدة - أعني، انها مجرد صداع، والتي هو، مرة أخرى، لماذا كتبنا GetString بالنسبة لك. ذلك ما يمكن أن نقوم به بدلا من ذلك؟ حسنا، ماذا لو بنية البيانات لدينا لديه ثغرات في الواقع في ذلك؟ لنفترض أنني الاسترخاء هدفي من وجود قطع متجاورة من الذاكرة، حيث 9 هو حق القادم إلى 17، والذي هو الحق المقبل إلى 22، وهلم جرا. ونفترض أن 9 يمكن أن يكون أكثر من هنا في ذاكرة الوصول العشوائي، و 17 يمكن أن يكون أكثر هنا في ذاكرة الوصول العشوائي، و 22 يمكن أن يكون أكثر هنا في ذاكرة الوصول العشوائي. وبعبارة أخرى، أنا لا حاجة إليها حتى العودة إلى الوراء بعد الآن. أود فقط أن الخيط بطريقة أو بأخرى إبرة من خلال كل هذه الأرقام، أو كل من هذه العقد، كما سنقوم باستدعاء المستطيلات كما كنت رسمها لهم، ل أتذكر كيف للوصول الى مشاركة هذه العقدة من الأولى. فما هو بناء البرمجة رأيناه مؤخرا جدا مع الذي أنا يمكن تنفيذ ذلك الموضوع، أو رسمها هنا، والتي يمكنني تنفيذ تلك السهام؟ لذلك مؤشرات، أليس كذلك؟ إذا كنت تخصيص يست مجرد كثافة، ولكن عقدة - و عقدة، أنا فقط يعني الحاوية. وبصريا، يعني مستطيل. لذلك يحتاج على ما يبدو عقدة لاحتواء قيمتين - والباحث نفسه، وبعد ذلك، كما تنطوي عليها النصف السفلي من المستطيل، مساحة كافية لكثافة العمليات. حتى مجرد التفكير في المستقبل هنا، كيف كبيرة هي هذه العقدة، وهذا الحاويات في السؤال؟ وكم بايت لكثافة العمليات؟ يفترض 4، إذا كان نفس كالمعتاد. ثم كم عدد بايت للمؤشر؟ 4. حتى هذه الحاوية، أو هذه العقدة، هو ستكون بنية 8 بايت. أوه، وهذا من قبيل المصادفة السعيدة التي قدمنا ​​مجرد هذه الفكرة من البنية، أو بنية C. لذلك أزعم أنني أريد أن اتخاذ خطوة نحو هذا أكثر تطورا تنفيذ قائمة من الأرقام، و قائمة أرقام مرتبطة، ولست بحاجة للقيام أكثر قليلا التفكير في خط الهجوم و تعلن يست مجرد كثافة، ولكن البنية أن سأتصل تقليديا هنا، عقدة. أننا يمكن أن نسميها أي شيء نريد، ولكن عقدة ستكون الموضوعية في الكثير من الأشياء التي تبدأ في النظر في الآن. داخل تلك العقدة هو ن الباحث. ومن ثم بناء الجملة هذا، قليلا غريبة لأول وهلة - عقدة البنية * المقبل. بالصور جيدا، ما هو؟ هذا هو النصف السفلي من المستطيل الذي شاهدناه قبل لحظة فقط. ولكن لماذا أنا أقول عقدة البنية * بدلا من مجرد عقدة *؟ لأنه إذا كان هذا المؤشر يشير في عقدة أخرى، انها مجرد عنوان عقدة. وهذا يتفق مع ما كنا ناقش حول مؤشرات حتى الآن. ولكن لماذا، إذا كنت تدعي هذا الهيكل هو دعا عقدة، لا بد لي من القول البنية عقدة داخل هنا؟ بالضبط. انها نوع من واقع غبي من C. والرموز المميزة ل typedef، إذا جاز التعبير، لم يحدث حتى الآن. C هو السوبر حرفية. يقرأ أعلى التعليمات البرمجية ل أسفل، من اليسار إلى اليمين. وحتى أنه يضرب على أن منقوطة خلاصة القول، تخمين ما لا توجد كنوع بيانات؟ عقدة، عقدة قوسي الإقتباس. ولكن بسبب أكثر مطول إعلان فعلت في السطر الأول - الرموز المميزة ل typedef عقدة البنية - لأن ذلك يأتي في المرتبة الأولى، وذلك قبل الأقواس المتعرجة، وهذا نوع من مثل قبل تثقيف ضجيج ذلك، كنت تعرف ما، أعطني البنية دعا عقدة البنية. بصراحة، أنا لا أحب تسمية الأشياء عقدة البنية، عقدة البنية جميع في جميع أنحاء قانون بلدي. ولكنني سوف تستخدم فقط لمرة واحدة، في الداخل فقط، حتى أستطيع أن فعالية خلق نوع من مرجع معاد، وليس مؤشر إلى نفسي في حد ذاتها، ولكن مؤشر آخر من نوع متطابقة. لذلك تبين أنه في بنية بيانات مثل هذا، هناك عدد قليل من العمليات التي قد تكون من مصلحة لنا. ونحن قد ترغب في إدراج في قائمة من هذا القبيل. ونحن قد ترغب في حذف من قائمة من هذا القبيل. ونحن قد ترغب في البحث في قائمة ل القيمة، أو أكثر عموما، اجتياز. واجتياز هو مجرد وسيلة يتوهم من قائلا في بداية الأيسر ونقل جميع الطريق إلى اليمين. وتلاحظ، وحتى مع هذا أكثر قليلا بنية بيانات متطورة، والسماح لي اقتراح أننا يمكن أن تقترض بعض أفكار الأسبوعين الماضيين و تنفيذ دالة يسمى بحث من هذا القبيل. انها سوف العودة الحقيقية أو كاذبة، مشيرا إلى، نعم أو لا، n هو في القائمة. الحجة الثانية لها هو مؤشر إلى القائمة نفسها، لذلك مؤشر إلى العقدة. جميع انا ذاهب الى القيام به ثم هو الإعلان متغير مؤقت. سنقوم نسميها PTR بواسطة الاتفاقية، للمؤشر. وأنا تعيينها مساويا ل بداية القائمة. والآن لاحظ حلقة الوقت. طالما المؤشر لا تساوي لاغية، وانا ذاهب للتحقق. هو مؤشر السهم ن يساوي ن التي تم تمريرها في؟ والانتظار لمدة دقيقة - جديدة قطعة من بناء الجملة. ما هو السهم فجأة؟ نعم؟ بالضبط. قبل ذلك حين بضع دقائق، كنا التدوين نقطة للوصول إلى شيء ما من داخل البنية، إذا كان المتغير لديك ليس البنية في حد ذاته، ولكن مؤشر إلى البنية، الحمد لله، وقطعة من الجملة التي أخيرا المنطقي بديهية. السهم يعني أن يتبع المؤشر، مثل السهام يعني عادة لدينا بالصور، وتذهب في حقل البيانات في الداخل. لذلك السهم هو نفس الشيء مثل النقطة، ولكن استخدامه عندما يكون لديك مؤشر. لذلك لمجرد أن نلخص ذلك الحين، إذا كان الحقل ن داخل البنية يسمى مؤشر يساوي يساوي ن، والعودة الحقيقية. خلاف ذلك، هذا الخط هنا - المؤشر يساوي مؤشر المقبل. وذلك ما يقوم به هذا، لاحظ، هو إذا أنا أنا مشيرا حاليا في البنية تحتوي على 9، و 9 هو ليس عدد أنا أبحث عن - لنفترض أنا أبحث لن يساوي 50 - أنا ذاهب لتحديث مؤشر بلدي مؤقت ليست نقطة في هذه العقدة بعد الآن، ولكن مؤشر السهم القادم، والتي هو الذهاب الى وضعني هنا. الآن، أدركت هي زوبعة مقدمة. يوم الاربعاء، ونحن سوف تفعل في الواقع هذا مع بعض البشر ومع بعض أكثر كود بوتيرة أبطأ. ولكن ندرك، ونحن الآن مما يجعل البيانات المتوفرة لدينا هياكل أكثر تعقيدا بحيث لدينا يمكن الحصول على خوارزميات أكثر كفاءة، والتي ستكون اللازمة ل pset ستة، عندما كنا في تحميل، مرة أخرى، تلك 150،000 الكلمات، ولكن بحاجة للقيام بذلك بكفاءة، وبشكل مثالي، إنشاء البرنامج الذي يمتد لمستخدمينا ليس في الخطي، وليس في ن التربيعية، ولكن في وقت ثابت، في مثالية. سنرى لك يوم الاربعاء. سرور: في CS50 المقبل، ديفيد ينسى القضية قاعدته. DAVID مالان: وهذه هي الطريقة التي ترسلها رسائل نصية مع C. ما - [نص الرسالة المختلفة وصل مرحلة الإخطار]