1 00:00:00,000 --> 00:00:03,000 [Powered by Google Translate] [الأسبوع 4] 2 00:00:03,000 --> 00:00:05,000 [ديفيد J. مالان] [جامعة هارفارد] 3 00:00:05,000 --> 00:00:08,000 [هذا CS50.] [CS50.TV] 4 00:00:08,000 --> 00:00:12,000 >> كل الحق، وهذا هو CS50، وهذا هو بداية الأسبوع 4، 5 00:00:12,000 --> 00:00:16,000 وهذا هو واحد من خوارزميات الفرز أبطأ ممكن. 6 00:00:16,000 --> 00:00:19,000 الذي كان واحدا أن شاهدنا للتو هناك؟ 7 00:00:19,000 --> 00:00:24,000 وكان هذا النوع فقاعة، في أمر كبير O (N ^ 2) + خلاصة القول، 8 00:00:24,000 --> 00:00:28,000 والواقع أننا لسنا الوحيدين في هذا العالم ليبدو أن نعرف 9 00:00:28,000 --> 00:00:30,000 ما هو نوع فقاعة أو وقته على التوالي. 10 00:00:30,000 --> 00:00:33,000 في الواقع، كان هذا حديث مع إريك شميدت جوجل 11 00:00:33,000 --> 00:00:45,000 والسناتور السابق باراك أوباما قبل سنوات قليلة مضت. 12 00:00:45,000 --> 00:00:48,000 >> الآن، عضو مجلس الشيوخ، وكنت هنا في جوجل، 13 00:00:48,000 --> 00:00:54,000 وأود أن أفكر في خوض انتخابات الرئاسة كمرشح مقابلة عمل. 14 00:00:54,000 --> 00:00:58,000 الآن، فإنه من الصعب الحصول على وظيفة رئيسا للبلاد، وأنت تسير من خلال قسوة الآن. 15 00:00:58,000 --> 00:01:00,000 كما انها من الصعب الحصول على وظيفة في غوغل. 16 00:01:00,000 --> 00:01:05,000 لدينا أسئلة، ونحن نطلب من المرشحين لدينا أسئلة، 17 00:01:05,000 --> 00:01:10,000 وهذا هو واحد من لاري شويمر. 18 00:01:10,000 --> 00:01:14,000 اعتقد يا رفاق أنا تمزح؟ انها هنا. 19 00:01:14,000 --> 00:01:18,000 ما هي الطريقة الأكثر فعالية لفرز مليون 32-بت أعداد صحيحة؟ 20 00:01:18,000 --> 00:01:21,000 [ضحك] 21 00:01:21,000 --> 00:01:24,000 جيدا 22 00:01:24,000 --> 00:01:26,000 أنا آسف. >> لا، لا، لا، لا. 23 00:01:26,000 --> 00:01:34,000 أعتقد أن نوع فقاعة سيكون بطريقة خاطئة للذهاب. 24 00:01:34,000 --> 00:01:39,000 >> هيا، الذي قال له ذلك؟ 25 00:01:39,000 --> 00:01:43,000 الأسبوع الماضي أذكر أننا حصل على اجازة من التعليمات البرمجية، على الأقل ليوم واحد، 26 00:01:43,000 --> 00:01:46,000 وبدأ التركيز على بعض الأفكار مستوى أعلى وحل المشكلات بشكل أعم 27 00:01:46,000 --> 00:01:49,000 في سياق البحث والفرز، 28 00:01:49,000 --> 00:01:53,000 وقدمنا ​​شيئا لأننا لم صفعة على هذا الاسم في الأسبوع الماضي، 29 00:01:53,000 --> 00:01:56,000 ولكن مقارب التدوين، وO الكبير، وأوميغا الكبير، 30 00:01:56,000 --> 00:02:00,000 وكانت في بعض الأحيان التدوين ثيتا الكبير، وهذه ببساطة طرق 31 00:02:00,000 --> 00:02:02,000 لوصف إدارة الوقت من الخوارزميات، 32 00:02:02,000 --> 00:02:05,000 كم من الوقت يستغرق لخوارزمية لتشغيل. 33 00:02:05,000 --> 00:02:08,000 >> وربما تذكرون أن تحدثت عن إدارة الوقت من حيث حجم 34 00:02:08,000 --> 00:02:11,000 من المدخلات، والتي نسميها عموما N، مهما كانت المشكلة قد يكون، 35 00:02:11,000 --> 00:02:13,000 حيث n هو عدد الأشخاص في الغرفة، 36 00:02:13,000 --> 00:02:17,000 بدأ عدد من الصفحات في دفتر الهاتف، ونحن لكتابة الامور 37 00:02:17,000 --> 00:02:21,000 مثل O (N ^ 2) أو O (ن) أو O (ن سجل ن)، 38 00:02:21,000 --> 00:02:24,000 وحتى عندما لم الرياضيات لا يعمل تماما من ذلك تماما 39 00:02:24,000 --> 00:02:28,000 وكان ن ² - ن / 2 أو شيء من هذا القبيل 40 00:02:28,000 --> 00:02:31,000 بدلا من ذلك فإننا مجرد رمي بعيدا بعض المصطلحات أقل النظام، 41 00:02:31,000 --> 00:02:34,000 وهناك الدافع هو أننا نريد حقا 42 00:02:34,000 --> 00:02:37,000 نوع من طريقة الهدف من تقييم 43 00:02:37,000 --> 00:02:39,000 أداء البرامج أو أداء خوارزميات 44 00:02:39,000 --> 00:02:42,000 أنه في نهاية اليوم لا علاقة له، على سبيل المثال، 45 00:02:42,000 --> 00:02:45,000 مع سرعة جهاز الكمبيوتر الخاص بك اليوم. 46 00:02:45,000 --> 00:02:47,000 >> على سبيل المثال، إذا قمت بتطبيق نوع فقاعة، 47 00:02:47,000 --> 00:02:50,000 أو تطبيق دمج نوع أو اختيار نوع على جهاز الكمبيوتر اليوم، 48 00:02:50,000 --> 00:02:53,000 كمبيوتر غيغاهرتز 2، وتشغيله، 49 00:02:53,000 --> 00:02:56,000 والأمر يحتاج إلى بعض عدد الثواني في العام القادم هناك 3 غيغاهرتز 50 00:02:56,000 --> 00:02:59,000 أو قد غيغاهرتز جهاز كمبيوتر 4، وتدعون بعد ذلك أن "نجاح باهر، بلدي خوارزمية 51 00:02:59,000 --> 00:03:03,000 الآن أسرع مرتين "، بينما الحقيقة أن من الواضح ليس هو الحال. 52 00:03:03,000 --> 00:03:06,000 انها مجرد حصلت أسرع الأجهزة، ولكن جهاز الكمبيوتر الخاص بك 53 00:03:06,000 --> 00:03:10,000 لم، وهكذا كنا نريد حقا أن تتخلص من الأشياء مثل 54 00:03:10,000 --> 00:03:13,000 مضاعفات 2 أو مضاعفات 3 عندما يتعلق الأمر بوصف 55 00:03:13,000 --> 00:03:17,000 سرعة وبطء كيف خوارزمية هو حقا فقط والتركيز 56 00:03:17,000 --> 00:03:20,000 على n أو بعض العوامل منها، 57 00:03:20,000 --> 00:03:24,000 بعض السلطة منه كما في حالة أنواع من الأسبوع الماضي. 58 00:03:24,000 --> 00:03:27,000 وأذكر أنه مع مساعدة من نوع الدمج 59 00:03:27,000 --> 00:03:31,000 كنا قادرين على القيام بذلك أفضل بكثير من نوع فقاعة ونوع الاختيار 60 00:03:31,000 --> 00:03:33,000 وحتى نوع الإدراج. 61 00:03:33,000 --> 00:03:36,000 >> وصلنا الى ن ن سجل، ومرة ​​أخرى، 62 00:03:36,000 --> 00:03:39,000 يذكر أن ن سجل عموما يشير إلى شيء ما ينمو 63 00:03:39,000 --> 00:03:43,000 أكثر ببطء ثم ن، ن ذلك السجل ن بالتالي كان بعيدا جيدة 64 00:03:43,000 --> 00:03:45,000 لأنه كان أقل من ² ن. 65 00:03:45,000 --> 00:03:47,000 ولكن لتحقيق ن ن مع تسجيل نوع الدمج 66 00:03:47,000 --> 00:03:51,000 ما هو الجرثومية الأساسية للفكرة التي كانت لدينا للاستفادة 67 00:03:51,000 --> 00:03:54,000 كما أننا الاستدانة مرة أخرى في الأسبوع 0؟ 68 00:03:54,000 --> 00:03:58,000 كيف نعالج مشكلة الفرز بذكاء مع نوع الدمج؟ 69 00:03:58,000 --> 00:04:04,000 ما هو الفكرة الرئيسية، ربما؟ 70 00:04:04,000 --> 00:04:07,000 أي شخص على الإطلاق. 71 00:04:07,000 --> 00:04:09,000 حسنا، دعونا اتخاذ خطوة إلى الوراء. 72 00:04:09,000 --> 00:04:11,000 وصف دمج النوع في الكلمات الخاصة بك. 73 00:04:11,000 --> 00:04:15,000 كيف يعمل؟ 74 00:04:15,000 --> 00:04:17,000 حسنا، سنقوم الصف إلى 0 الاسبوع. 75 00:04:17,000 --> 00:04:19,000 حسنا، نعم. 76 00:04:19,000 --> 00:04:22,000 [غير مسموع والطالب] 77 00:04:22,000 --> 00:04:26,000 حسنا، وحسن، وتنقسم لذلك نحن مجموعة من الأرقام في 2 قطعة. 78 00:04:26,000 --> 00:04:29,000 قمنا بفرز كل من هذه القطع، وبعد ذلك اندمجت بها، 79 00:04:29,000 --> 00:04:33,000 ولقد رأينا هذه الفكرة قبل اتخاذ هذا مشكلة بهذا الحجم 80 00:04:33,000 --> 00:04:36,000 وتقطيع عنه إلى مشكلة بهذا الحجم وهذا أو كبيرة هذا. 81 00:04:36,000 --> 00:04:38,000 >> أذكر على سبيل المثال دفتر الهاتف. 82 00:04:38,000 --> 00:04:42,000 أذكر خوارزمية العد الذاتي من أسابيع، 83 00:04:42,000 --> 00:04:45,000 وقد لخص ذلك النوع دمج هذا شبة الكود هنا. 84 00:04:45,000 --> 00:04:48,000 عندما كنت تحصل عناصر N، كان لأول مرة تحقق التعقل. 85 00:04:48,000 --> 00:04:51,000 إذا كانت n <2 ثم لا تفعل أي شيء على الإطلاق 86 00:04:51,000 --> 00:04:55,000 لأنه إذا كان N <2 N ثم من الواضح 0 أو 1، 87 00:04:55,000 --> 00:04:57,000 وهكذا اذا كان إما 0 أو 1 لا يوجد شيء لفرز. 88 00:04:57,000 --> 00:04:59,000 الانتهاء من ذلك. 89 00:04:59,000 --> 00:05:01,000 وبالفعل قائمة مصنفة بشكل مسلي. 90 00:05:01,000 --> 00:05:04,000 ولكن إذا كنت قد حصلت على خلاف ذلك 2 أو أكثر من العناصر المضي قدما وتفرق بينهما 91 00:05:04,000 --> 00:05:06,000 في 2 نصفين، الأيمن والأيسر. 92 00:05:06,000 --> 00:05:09,000 فرز كل تلك نصفين، ثم دمج شطري فرزها. 93 00:05:09,000 --> 00:05:13,000 ولكن المشكلة هنا هي أن هذا للوهلة الأولى يشعر وكأننا التسيير. 94 00:05:13,000 --> 00:05:17,000 هذا هو تعريف دائري في أنني إذا كنت قد طلبت لفرز هذه العناصر ن 95 00:05:17,000 --> 00:05:22,000 وكنت تقول لي: "حسنا، حسنا، سنقوم فرز تلك العناصر ن / 2 و ن تلك / 2،" 96 00:05:22,000 --> 00:05:27,000 ثم سؤالي القادم سيكون "الجميلة، كيف فرز ن / عناصر 2؟" 97 00:05:27,000 --> 00:05:30,000 >> ولكن نظرا للهيكل هذا البرنامج، 98 00:05:30,000 --> 00:05:33,000 بسبب وجود هذه الحالة قاعدة، إذا جاز التعبير، 99 00:05:33,000 --> 00:05:39,000 هذه الحالة الخاصة التي تقول إذا كانت n هي قيمة ثابتة <بعض مثل 2 العودة فورا. 100 00:05:39,000 --> 00:05:42,000 لا تستجيب مع نفس الجواب الذي دائرية. 101 00:05:42,000 --> 00:05:46,000 هذه العملية، وهذا دوروية نهاية المطاف. 102 00:05:46,000 --> 00:05:50,000 إذا أطلب منكم "فرز هذه العناصر ن"، وتقول، "حسنا، هذه المرتبة ن / 2" 103 00:05:50,000 --> 00:05:53,000 ثم تقول: "حسنا، هذه النوع ن / 4، N / 8، n/16" 104 00:05:53,000 --> 00:05:56,000 في نهاية المطاف سوف القسمة على عدد كبير بما فيه الكفاية 105 00:05:56,000 --> 00:05:59,000 أن سيكون لديك فقط 1 عنصر الزمن، وعند هذه النقطة يمكن القول، 106 00:05:59,000 --> 00:06:02,000 "هنا، وهنا عنصر مصنفة واحدة." 107 00:06:02,000 --> 00:06:06,000 ثم تألق هذه الخوارزمية حتى هنا هو اشتقاق من حقيقة 108 00:06:06,000 --> 00:06:09,000 أنه بمجرد أن يكون لديك كل هذه القوائم تم الفرز بشكل فردي، 109 00:06:09,000 --> 00:06:12,000 وكلها من حجم 1، والذي يبدو أن لا طائل منه، 110 00:06:12,000 --> 00:06:15,000 بمجرد أن تبدأ دمجها ودمجها 111 00:06:15,000 --> 00:06:19,000 يمكنك بناء وأخيرا روب فعلت في الفيديو قائمة تم فرزها أخيرا. 112 00:06:19,000 --> 00:06:22,000 >> ولكن هذه الفكرة تمتد إلى ما هو أبعد الفرز. 113 00:06:22,000 --> 00:06:26,000 هناك هذه الفكرة جزءا لا يتجزأ من هذا البرنامج المعروف باسم العودية، 114 00:06:26,000 --> 00:06:29,000 فكرة حيث كنت البرنامج، 115 00:06:29,000 --> 00:06:32,000 ولحل بعض المشاكل يمكنك استدعاء نفسك، 116 00:06:32,000 --> 00:06:36,000 أو وضعها في سياق لغات البرمجة كنت وظيفة، 117 00:06:36,000 --> 00:06:39,000 ومن أجل حل المشكلة، لك وظيفة استدعاء نفسك 118 00:06:39,000 --> 00:06:42,000 مرة أخرى ومرة ​​أخرى ومرة ​​أخرى، ولكن لك وظيفة 119 00:06:42,000 --> 00:06:44,000 لا يمكن استدعاء نفسك عدة مرات بلا حدود. 120 00:06:44,000 --> 00:06:47,000 في نهاية المطاف لديك لأسفل خارج، إذا جاز التعبير، 121 00:06:47,000 --> 00:06:49,000 وبعض حالة الثابت ترميز قاعدة التي تقول 122 00:06:49,000 --> 00:06:53,000 عند هذه النقطة تتوقف الدعوة نفسك بحيث العملية برمتها 123 00:06:53,000 --> 00:06:56,000 وأخيرا لا تتوقف في الواقع. 124 00:06:56,000 --> 00:06:58,000 ماذا يعني هذا حقا، لإعادة لعنة؟ 125 00:06:58,000 --> 00:07:01,000 >> دعونا نرى، ما اذا كنا نستطيع القيام بسيطة، على سبيل المثال تافهة مع، ويقول، 126 00:07:01,000 --> 00:07:03,000 3 أشخاص معي هنا على خشبة المسرح، إذا كان شخص ما هو مريح. 127 00:07:03,000 --> 00:07:06,000 1، تأتي في 2 و حتى و 3. 128 00:07:06,000 --> 00:07:09,000 إذا أنت 3 تريد أن تأتي إلى هنا. 129 00:07:09,000 --> 00:07:12,000 إذا كنت تريد أن تقف بجوار لي هنا في خط، لنفترض أن المشكلة في متناول اليد 130 00:07:12,000 --> 00:07:15,000 ومسلي جدا حساب عدد الناس الموجودين هنا. 131 00:07:15,000 --> 00:07:18,000 ولكن بصراحة، أنا متعب من كل هذه الأمثلة العد. 132 00:07:18,000 --> 00:07:21,000 هذا هو الذهاب الى يستغرق بعض الوقت، 1، 2، ونقطة، نقطة، نقطة. 133 00:07:21,000 --> 00:07:23,000 انه سيكون لاتخاذ إلى الأبد. 134 00:07:23,000 --> 00:07:25,000 يهمني فقط بدلا بونت هذه المشكلة تماما بمساعدة-ما هو اسمك؟ 135 00:07:25,000 --> 00:07:27,000 سارة. >> سارة، كل الحق. 136 00:07:27,000 --> 00:07:29,000 كيلي. >> كيلي و؟ 137 00:07:29,000 --> 00:07:31,000 >> ويلي. >> ويلي، وسارة، كيلي، وويلي. 138 00:07:31,000 --> 00:07:34,000 الآن لقد طلب مني من قبل شخص على السؤال 139 00:07:34,000 --> 00:07:37,000 كم من الناس على ما يصل هذه المرحلة، وليس لدي أي فكرة. 140 00:07:37,000 --> 00:07:40,000 هذه هي قائمة طويلة حقا، وبدلا من ذلك أنا ذاهب للقيام بذلك خدعة. 141 00:07:40,000 --> 00:07:43,000 انا ذاهب الى أن تطلب من الشخص المجاور لي أن تفعل أكثر من عمل، 142 00:07:43,000 --> 00:07:46,000 وبمجرد القيام فعلت أكثر من عمل 143 00:07:46,000 --> 00:07:49,000 انا ذاهب الى القيام حجم العمل بأقل قدر ممكن وإضافة فقط 1 144 00:07:49,000 --> 00:07:51,000 الجواب على كل ما هو لها، حتى هنا نذهب. 145 00:07:51,000 --> 00:07:54,000 لقد سألت كم عدد الناس على خشبة المسرح. 146 00:07:54,000 --> 00:07:57,000 كم عدد الناس على خشبة المسرح إلى اليسار من أنت؟ 147 00:07:57,000 --> 00:08:00,000 يسار لي؟ >> حسنا، ولكن لا تغش لا. 148 00:08:00,000 --> 00:08:04,000 هذا امر جيد، وهذا صحيح، ولكن إذا أردنا أن يستمر هذا المنطق 149 00:08:04,000 --> 00:08:08,000 دعونا نفترض أنك تريد على غرار بونت هذه المشكلة على يسار لك، 150 00:08:08,000 --> 00:08:11,000 وذلك بدلا من الذهاب مباشرة قبل الإجابة ويمر باك. 151 00:08:11,000 --> 00:08:14,000 أوه، كم من الناس هم على يسار البيانات؟ 152 00:08:14,000 --> 00:08:16,000 كم عدد الناس إلى اليسار؟ 153 00:08:16,000 --> 00:08:18,000 1. 154 00:08:18,000 --> 00:08:27,000 [ضحك] 155 00:08:27,000 --> 00:08:30,000 حسنا، لذلك 0، ويلي ذلك ما قامت به الآن 156 00:08:30,000 --> 00:08:33,000 ولقد عاد لك إجابتك هذا الاتجاه قائلا 0. 157 00:08:33,000 --> 00:08:36,000 الآن، ماذا يجب ان تفعل؟ >> 1. 158 00:08:36,000 --> 00:08:39,000 حسنا، لذلك كنت من 1، لذلك أقول لك، "حسنا، أنا ذاهب إلى إضافة 1 159 00:08:39,000 --> 00:08:41,000 إلى أي عدد كان ويلي، "لذلك 1 + 0. 160 00:08:41,000 --> 00:08:43,000 كنت الآن 1 حتى الإجابة على الحق الآن، 161 00:08:43,000 --> 00:08:45,000 1. أن يكون >> والألغام 2. 162 00:08:45,000 --> 00:08:48,000 جيدة، لذلك كنت أخذ الجواب السابق 1، 163 00:08:48,000 --> 00:08:51,000 واضاف ان كمية ضئيلة من العمل الذي تريد القيام به، وهو +1. 164 00:08:51,000 --> 00:08:55,000 لديك الآن 2، وأنت تسلم لي ثم القيمة التي؟ 165 00:08:55,000 --> 00:08:57,000 3، أعني، آسف، 2. 166 00:08:57,000 --> 00:08:59,000 جيدة. 167 00:08:59,000 --> 00:09:02,000 >> حسنا، كان لدينا 0 إلى اليسار. 168 00:09:02,000 --> 00:09:05,000 ثم كان لدينا 1 ثم نضيف 2، 169 00:09:05,000 --> 00:09:07,000 والآن أنت لي تسليم عدد 2، 170 00:09:07,000 --> 00:09:10,000 وأنا أقول ذلك، حسنا، +1، 3. 171 00:09:10,000 --> 00:09:13,000 هناك بالفعل 3 أشخاص يقف بجانبي في هذه المرحلة، 172 00:09:13,000 --> 00:09:16,000 لذلك يمكن فعلنا من الواضح أن هذا خطيا جدا، 173 00:09:16,000 --> 00:09:19,000 كثيرا في الأزياء واضحة، ولكن ما لم نفعله حقا؟ 174 00:09:19,000 --> 00:09:21,000 اتخذنا مشكلة حجم 3 في البداية. 175 00:09:21,000 --> 00:09:24,000 ونحن بعد ذلك حطم عليه إلى مشكلة حجم 2، 176 00:09:24,000 --> 00:09:27,000 ثم مشكلة حجم 1، ثم أخيرا الحالة الأساسية 177 00:09:27,000 --> 00:09:29,000 كان حقا، أوه، لا يوجد أحد هناك، 178 00:09:29,000 --> 00:09:33,000 في نقطة ويلي الذي عاد بشكل فعال على إجابة الثابت ترميز بضع مرات، 179 00:09:33,000 --> 00:09:36,000 وانفجر بعد ذلك حتى ثانية واحدة، حتى انفجر، انفجر فوق، 180 00:09:36,000 --> 00:09:39,000 ومن ثم عن طريق إضافة 1 واحد في هذا إضافية 181 00:09:39,000 --> 00:09:41,000 لقد نفذنا هذه الفكرة الأساسية من العودية. 182 00:09:41,000 --> 00:09:44,000 >> الآن، في هذه الحالة فإنه لا يحل مشكلة حقا 183 00:09:44,000 --> 00:09:46,000 أي على نحو أكثر فعالية ثم شاهدنا حتى الآن. 184 00:09:46,000 --> 00:09:48,000 ولكن التفكير في الخوارزميات فعلناه على خشبة المسرح حتى الآن. 185 00:09:48,000 --> 00:09:51,000 كان لدينا 8 قطع من الورق على السبورة، 186 00:09:51,000 --> 00:09:55,000 على الفيديو عند شون كان يبحث عن رقم 7، وماذا يفعل حقا؟ 187 00:09:55,000 --> 00:09:58,000 حسنا، أنه لم يفعل أي نوع من فرق تسد. 188 00:09:58,000 --> 00:10:01,000 وقال انه لا يفعل أي نوع من العودية. 189 00:10:01,000 --> 00:10:03,000 بل كان مجرد فعل هذه الخوارزمية الخطية. 190 00:10:03,000 --> 00:10:07,000 ولكن عندما قدمنا ​​فكرة أرقام مصنفة على خشبة المسرح يعيش الأسبوع الماضي 191 00:10:07,000 --> 00:10:09,000 ثم كان لدينا هذه الغريزة من الذهاب إلى الوسط، 192 00:10:09,000 --> 00:10:13,000 وعند هذه النقطة كان لدينا قائمة من أصغر حجم 4 أو قائمة أخرى من حجم 4، 193 00:10:13,000 --> 00:10:17,000 ومن ثم كان لدينا نفس المشكلة بالضبط، لذلك نحن المتكررة، المتكررة المتكررة. 194 00:10:17,000 --> 00:10:19,000 وبعبارة أخرى، نحن recursed. 195 00:10:19,000 --> 00:10:24,000 شكرا جزيلا للمتطوعين لدينا 3 لبيان العودية هنا معنا. 196 00:10:24,000 --> 00:10:28,000 >> دعونا نرى ما اذا كنا نستطيع لا تجعل من هذا الآن ملموسة أكثر من ذلك بقليل، 197 00:10:28,000 --> 00:10:30,000 حل المشكلة التي يمكننا القيام به مرة أخرى بسهولة جدا، 198 00:10:30,000 --> 00:10:34,000 ولكن سوف نستخدمها كنقطة انطلاق لتنفيذ هذه الفكرة الأساسية. 199 00:10:34,000 --> 00:10:37,000 إذا أريد لحساب محصلة مجموعة من الأرقام، 200 00:10:37,000 --> 00:10:39,000 على سبيل المثال، إذا كنت تمر في عدد 3، 201 00:10:39,000 --> 00:10:42,000 أريد أن أعطيك قيمة سيجما 3، 202 00:10:42,000 --> 00:10:46,000 وبالتالي فإن مجموع 3 + 2 + 1 + 0. 203 00:10:46,000 --> 00:10:48,000 أريد أن نعود الجواب 6، 204 00:10:48,000 --> 00:10:51,000 وهكذا لن ننفذ هذه المهمة سيجما، هذه الخاصية الجمع 205 00:10:51,000 --> 00:10:54,000 أنه، مرة أخرى، ويأخذ في الإدخال، ومن ثم إرجاع الجمع 206 00:10:54,000 --> 00:10:57,000 من هذا العدد على طول الطريق وصولا الى 0. 207 00:10:57,000 --> 00:10:59,000 يمكن أن نفعل ذلك ببساطة جدا، أليس كذلك؟ 208 00:10:59,000 --> 00:11:01,000 يمكن أن نفعل هذا مع نوع ما من بنية التكرار، 209 00:11:01,000 --> 00:11:04,000 لذلك اسمحوا لي المضي قدما والحصول على هذا بدأت. 210 00:11:04,000 --> 00:11:07,000 >> وتشمل stdio.h. 211 00:11:07,000 --> 00:11:09,000 اسمحوا لي أن الحصول على نفسي في الرئيسية للعمل مع هنا. 212 00:11:09,000 --> 00:11:12,000 دعونا حفظ هذا كما sigma.c. 213 00:11:12,000 --> 00:11:14,000 ثم انا ذاهب للذهاب هنا، وانا ذاهب الى اعلان ن الباحث، 214 00:11:14,000 --> 00:11:18,000 وانا ذاهب الى القيام بما يلي في حين أن المستخدم لم تتعاون. 215 00:11:18,000 --> 00:11:22,000 في حين أن المستخدم لم تعط لي رقما موجبا 216 00:11:22,000 --> 00:11:26,000 اسمحوا لي أن تمضي قدما وتدفعهم للGetInt = ن، 217 00:11:26,000 --> 00:11:28,000 واسمحوا لي أن أقدم لهم بعض الإرشادات حول ما يجب القيام به، 218 00:11:28,000 --> 00:11:33,000 حتى printf ("عدد صحيح موجب من فضلك"). 219 00:11:33,000 --> 00:11:39,000 مجرد شيء بسيط نسبيا مثل هذا بحيث بحلول الوقت الذي يصل السطر 14 220 00:11:39,000 --> 00:11:42,000 لدينا الآن عدد صحيح موجب يفترض في ن. 221 00:11:42,000 --> 00:11:44,000 >> الآن دعونا نفعل شيئا معها. 222 00:11:44,000 --> 00:11:50,000 اسمحوا لي أن تمضي قدما وحساب الجمع، لذلك الباحث المبلغ. = سيجما (ن) 223 00:11:50,000 --> 00:11:54,000 سيغما هو مجرد الجمع، لذلك أنا أكتب فقط في طريقة مربي الحيوانات. 224 00:11:54,000 --> 00:11:56,000 سنقوم فقط الذي يطلق عليه سيجما هناك. 225 00:11:56,000 --> 00:11:58,000 هذا المبلغ، والآن انا ذاهب لطباعة النتيجة، 226 00:11:58,000 --> 00:12:08,000 printf ("مجموع هو٪ د \ ن"، SUM). 227 00:12:08,000 --> 00:12:11,000 وبعد ذلك سوف أعود 0 لحسن التدبير. 228 00:12:11,000 --> 00:12:15,000 لقد فعلنا كل شيء أن هذا البرنامج يتطلب إلا الجزء مثيرة للاهتمام، 229 00:12:15,000 --> 00:12:18,000 وهو في الواقع لتنفيذ وظيفة سيغما. 230 00:12:18,000 --> 00:12:22,000 >> اسمحوا لي هنا تنخفض إلى أسفل، واسمحوا لي أن تعلن وظيفة سيغما. 231 00:12:22,000 --> 00:12:26,000 انها حصلت على اتخاذ متغير عدد صحيح من هذا النوع، 232 00:12:26,000 --> 00:12:30,000 وما نوع البيانات لا أريد العودة من المفترض سيجما؟ 233 00:12:30,000 --> 00:12:34,000 الباحث، لأنني أريد أن يطابق توقعاتي على خط 15. 234 00:12:34,000 --> 00:12:37,000 اسمحوا لي هنا في المضي قدما وتنفيذ هذه 235 00:12:37,000 --> 00:12:41,000 بطريقة جميلة واضحة. 236 00:12:41,000 --> 00:12:45,000 >> دعونا نمضي قدما ويقول الباحث مجموع = 0، 237 00:12:45,000 --> 00:12:47,000 والآن انا ذاهب للذهاب لديها القليل لحلقة هنا 238 00:12:47,000 --> 00:12:50,000 هذا ما أريد أن أقول شيئا من هذا القبيل، 239 00:12:50,000 --> 00:13:01,000 ل (كثافة العمليات ط = 0، وأنا <= عدد، وأنا + +) + مبلغ = ط. 240 00:13:01,000 --> 00:13:05,000 ثم انا ذاهب الى العودة المبلغ. 241 00:13:05,000 --> 00:13:07,000 كان يمكن أن تنفذ في أي I هذا بعدة طرق. 242 00:13:07,000 --> 00:13:09,000 يمكن أن تستخدم I حلقة من الوقت. 243 00:13:09,000 --> 00:13:11,000 يمكن أن يكون تخطي I باستخدام متغير مبلغ إذا أردت حقا أن، 244 00:13:11,000 --> 00:13:15,000 ولكن باختصار، لدينا فقط وظيفة أنه إذا لم أكن الأبله تعلن المبلغ هو 0. 245 00:13:15,000 --> 00:13:18,000 بعد ذلك بالتكرار من 0 على ما يصل من خلال العدد، 246 00:13:18,000 --> 00:13:23,000 وعلى كل التكرار فإنه يضيف أن القيمة الحالية لمجموع وإرجاع المبلغ. 247 00:13:23,000 --> 00:13:25,000 >> الآن، هناك التحسين الطفيف هنا. 248 00:13:25,000 --> 00:13:29,000 وربما هذا هو خطوة يضيع، ولكن فليكن ذلك. هذا شيء طيب في الوقت الراهن. 249 00:13:29,000 --> 00:13:32,000 نحن على الأقل يجري شامل والذهاب 0 جميع الطريق على ما يصل. 250 00:13:32,000 --> 00:13:34,000 ليس من الصعب جدا وجميلة واضحة، 251 00:13:34,000 --> 00:13:37,000 ولكن تبين أن وظيفة مع سيجما لدينا نفس الفرصة 252 00:13:37,000 --> 00:13:39,000 كما فعلنا هنا على خشبة المسرح. 253 00:13:39,000 --> 00:13:42,000 على خشبة المسرح اعتمدنا فقط عدد الاشخاص الذين كانوا بجواري، 254 00:13:42,000 --> 00:13:47,000 ولكن بدلا من ذلك إذا أردنا أن نحصي عدد 3 + 2 + 1 255 00:13:47,000 --> 00:13:51,000 نزولا إلى 0 يمكن بونت نحن بالمثل إلى وظيفة 256 00:13:51,000 --> 00:13:55,000 التي سوف أصف بدلا بأنها متكررة. 257 00:13:55,000 --> 00:13:57,000 دعونا هنا في للا التعقل سريعة تحقق وتأكد من أنني لم الأبله. 258 00:13:57,000 --> 00:14:00,000 >> أنا أعلم أن هناك على الأقل شيء واحد في هذا البرنامج أنني لم ظلموا. 259 00:14:00,000 --> 00:14:04,000 عندما تصل إلى تدخل أنا ذاهب للحصول على أي نوع من الصراخ في وجهي؟ 260 00:14:04,000 --> 00:14:06,000 ما أنا على وشك أن صرخ في وحول؟ 261 00:14:06,000 --> 00:14:11,000 نعم، لقد نسيت النموذج، لذلك أنا باستخدام دالة يسمى سيغما على خط 15، 262 00:14:11,000 --> 00:14:16,000 ولكن هذا لم تعلن حتى السطر 22، لذلك أنا أفضل ترتفع بشكل استباقي هنا 263 00:14:16,000 --> 00:14:22,000 وتعلن نموذج أولي، وأنا أقول الباحث سيجما (الباحث العدد)، وهذا كل شيء. 264 00:14:22,000 --> 00:14:24,000 انها تنفذ في الجزء السفلي. 265 00:14:24,000 --> 00:14:27,000 >> أو وسيلة أخرى أستطيع أن حل هذه، 266 00:14:27,000 --> 00:14:30,000 ويمكنني أن تتحرك وظيفة هناك، وهي ليست سيئة، 267 00:14:30,000 --> 00:14:32,000 ولكن على الأقل عندما تبدأ البرامج للحصول على البعيد، بصراحة، 268 00:14:32,000 --> 00:14:35,000 أعتقد أن هناك بعض القيمة في وجود دائما في أعلى الرئيسية 269 00:14:35,000 --> 00:14:38,000 بحيث يمكنك في القارئ فتح الملف ونرى بعد ذلك على الفور 270 00:14:38,000 --> 00:14:40,000 ما يقوم به البرنامج دون الحاجة إلى البحث من خلال ذلك 271 00:14:40,000 --> 00:14:42,000 أبحث عن تلك الوظيفة الرئيسية. 272 00:14:42,000 --> 00:14:49,000 دعونا نذهب الى نافذة طرفية بلدي هنا، ومحاولة جعل سيغما جعل سيغما، 273 00:14:49,000 --> 00:14:51,000 وثمل بي الأمر هنا أيضا. 274 00:14:51,000 --> 00:14:55,000 إعلان ضمني من GetInt ظيفة يعني أنني قد نسيت أن تفعل ماذا؟ 275 00:14:55,000 --> 00:14:57,000 [غير مسموع والطالب] 276 00:14:57,000 --> 00:15:00,000 جيد، على ما يبدو حتى خطأ شائع، لذلك دعونا نضع هذا الأمر هنا، 277 00:15:00,000 --> 00:15:04,000 cs50.h، والآن دعونا نعود إلى إطار المحطة الطرفية بلدي. 278 00:15:04,000 --> 00:15:08,000 >> سوف أقوم بمسح الشاشة، وأنا أعد جعل سيغما. 279 00:15:08,000 --> 00:15:11,000 ويبدو أنها قد جمعت. اسمحوا لي الآن تشغيل سيغما. 280 00:15:11,000 --> 00:15:15,000 أنا اكتب في عدد 3، وأنا لم احصل على 6، حتى لا شيك صارمة، 281 00:15:15,000 --> 00:15:18,000 ولكن على الأقل يبدو أن العمل لأول وهلة، ولكن الآن دعونا مزق إربا، 282 00:15:18,000 --> 00:15:21,000 ودعونا النفوذ في الواقع فكرة العودية، مرة أخرى، 283 00:15:21,000 --> 00:15:24,000 في سياق بسيط جدا لدرجة أنه في غضون أسابيع قليلة " 284 00:15:24,000 --> 00:15:27,000 عندما نبدأ استكشاف هياكل البيانات مربي الحيوانات من المصفوفات 285 00:15:27,000 --> 00:15:30,000 لدينا أداة أخرى في مجموعة الأدوات التي ل 286 00:15:30,000 --> 00:15:33,000 التلاعب تلك هياكل البيانات كما سنرى. 287 00:15:33,000 --> 00:15:36,000 هذا هو النهج متكررة، والنهج القائم على حلقة. 288 00:15:36,000 --> 00:15:39,000 >> اسمحوا لي أن تفعل هذا الآن بدلا. 289 00:15:39,000 --> 00:15:44,000 اسمحوا لي أن أقول بدلا من ذلك أن الجمع من عدد 290 00:15:44,000 --> 00:15:48,000 نزولا إلى 0 هو في الحقيقة نفس الشيء 291 00:15:48,000 --> 00:15:53,000 عدد سيغما + (عدد - 1). 292 00:15:53,000 --> 00:15:57,000 وبعبارة أخرى، تماما مثل على خشبة المسرح I مسير إلى كل من الشعب المجاور لي، 293 00:15:57,000 --> 00:16:00,000 وهؤلاء بدورهم أبقى التسيير حتى نحصل في النهاية إلى أدنى مستوياته في ويلي، 294 00:16:00,000 --> 00:16:03,000 الذين اضطروا إلى العودة على إجابة الثابت تلوينها مثل 0. 295 00:16:03,000 --> 00:16:07,000 هنا نحن الآن التسيير على غرار سيغما 296 00:16:07,000 --> 00:16:10,000 نفس الوظيفة كما كان يسمى في الأصل، ولكن الفكرة الرئيسية هنا 297 00:16:10,000 --> 00:16:12,000 هو أننا لا ندعو سيغما مماثل. 298 00:16:12,000 --> 00:16:14,000 نحن لا يمر في ن. 299 00:16:14,000 --> 00:16:17,000 نحن يمر بوضوح في عدد - 1، 300 00:16:17,000 --> 00:16:20,000 ذلك مشكلة أصغر قليلا، المشكلة أصغر قليلا. 301 00:16:20,000 --> 00:16:23,000 >> للأسف، هذا ليس حلا للغاية حتى الآن، وقبل إصلاح نحن 302 00:16:23,000 --> 00:16:26,000 قد يكون ما القفز كما هو واضح في بعض منكم 303 00:16:26,000 --> 00:16:28,000 اسمحوا لي أن تمضي قدما وجعل إعادة تشغيل. 304 00:16:28,000 --> 00:16:30,000 يبدو أن يجمع بخير. 305 00:16:30,000 --> 00:16:32,000 اسمحوا لي أن أعد تشغيل سيجما مع 6. 306 00:16:32,000 --> 00:16:37,000 يصيح، اسمحوا لي أن أعد تشغيل سيجما مع 6. 307 00:16:37,000 --> 00:16:42,000 لقد شهدنا هذا من قبل، وإن كان ذلك آخر مرة بطريق الخطأ كذلك. 308 00:16:42,000 --> 00:16:48,000 لماذا لم أحصل على هذا الخطأ تجزئة خفي؟ نعم. 309 00:16:48,000 --> 00:16:50,000 [غير مسموع والطالب] 310 00:16:50,000 --> 00:16:53,000 ليس هناك حالة قاعدة، وبشكل أكثر تحديدا، ما حدث ربما؟ 311 00:16:53,000 --> 00:16:58,000 هذا هو عرض من أعراض ما السلوك؟ 312 00:16:58,000 --> 00:17:00,000 يقول بصوت أعلى قليلا. 313 00:17:00,000 --> 00:17:02,000 [غير مسموع والطالب] 314 00:17:02,000 --> 00:17:05,000 انها حلقة لا نهائية على نحو فعال، والمشكلة مع حلقات لانهائية 315 00:17:05,000 --> 00:17:08,000 عندما تنطوي على العودية في هذه الحالة، وهي وظيفة تطلق على نفسها، 316 00:17:08,000 --> 00:17:10,000 ما يحدث كل مرة تقوم فيها استدعاء دالة؟ 317 00:17:10,000 --> 00:17:13,000 حسنا، اعتقد مرة أخرى إلى الطريقة التي وضعت الذاكرة في جهاز الكمبيوتر. 318 00:17:13,000 --> 00:17:16,000 قلنا أن هناك جزءا من الذاكرة هذا يسمى كومة هذا في الجزء السفلي، 319 00:17:16,000 --> 00:17:19,000 ويحصل على وضع كل مرة كنت استدعاء دالة الذاكرة أكثر من ذلك بقليل 320 00:17:19,000 --> 00:17:24,000 على هذا المكدس يسمى المتغيرات التي تحتوي على الدالة المحلية أو معلمات، 321 00:17:24,000 --> 00:17:27,000 إذا كان الأمر كذلك سيجما سيجما سيجما المكالمات يدعو سيجما 322 00:17:27,000 --> 00:17:29,000  يدعو سيغما أين هذه الغاية القصة؟ 323 00:17:29,000 --> 00:17:31,000 >> حسنا، انها في نهاية المطاف تجاوز المبلغ الإجمالي 324 00:17:31,000 --> 00:17:33,000 من الذاكرة التي لديك المتاحة على جهاز الكمبيوتر الخاص بك. 325 00:17:33,000 --> 00:17:37,000 كنت تجاوز القطعة التي كنت من المفترض أن البقاء في حدود، 326 00:17:37,000 --> 00:17:40,000 ملقاة الأساسية وتحصل على هذا الخطأ تجزئة،، 327 00:17:40,000 --> 00:17:43,000 وماذا يعني ملقاة الأساسية هي أن لدي الآن ملف يسمى الأساسية 328 00:17:43,000 --> 00:17:46,000 وهو الملف الذي يحتوي على الأصفار ومنها 329 00:17:46,000 --> 00:17:49,000 التي ستكون في الواقع في المستقبل أن تكون مفيدة في التشخيص. 330 00:17:49,000 --> 00:17:52,000 إذا لم تكن واضحة بالنسبة لك حيث الخاص بك هو علة 331 00:17:52,000 --> 00:17:54,000 يمكنك القيام به في الواقع قليلا من تحليل الطب الشرعي، إذا جاز التعبير، 332 00:17:54,000 --> 00:17:58,000 على هذا الملف تفريغ الأساسية، والتي، مرة أخرى، هو مجرد مجموعة كاملة من الأصفار ومنها 333 00:17:58,000 --> 00:18:02,000 الذي يمثل أساسا لحالة البرنامج في الذاكرة 334 00:18:02,000 --> 00:18:05,000 تحطمت لحظة في هذا الطريق. 335 00:18:05,000 --> 00:18:11,000 >> الإصلاح هنا هو أن نتمكن من العودة وليس فقط عمياء سيغما، 336 00:18:11,000 --> 00:18:14,000 عدد سيغما + من مشكلة أصغر قليلا. 337 00:18:14,000 --> 00:18:16,000 نحن في حاجة الى نوع من الحالة الأساسية هنا، 338 00:18:16,000 --> 00:18:19,000 وماذا يجب أن تكون الحالة الأساسية ربما؟ 339 00:18:19,000 --> 00:18:22,000 [غير مسموع والطالب] 340 00:18:22,000 --> 00:18:25,000 حسنا، طالما كان الرقم إيجابيا يجب علينا أن نعود في الواقع هذا، 341 00:18:25,000 --> 00:18:29,000 أو بعبارة أخرى، إذا كان الرقم هو، مثلا، <= إلى 0 342 00:18:29,000 --> 00:18:32,000 كنت تعرف ما، سوف تمضي قدما والعودة 0، 343 00:18:32,000 --> 00:18:36,000 مثل الكثير ويلي فعل، وآخر، وأنا ذاهب إلى المضي قدما 344 00:18:36,000 --> 00:18:41,000 وهذا يعود، حتى انها ليست أن الكثير أقصر 345 00:18:41,000 --> 00:18:44,000 من الإصدار متكررة أننا جلد حتى باستخدام لأول مرة عن حلقة، 346 00:18:44,000 --> 00:18:48,000 ولكن لاحظت أن هناك هذا النوع من الأناقة على ذلك. 347 00:18:48,000 --> 00:18:51,000 بدلا من إعادة بعض عدد وتنفيذ جميع هذه الرياضيات 348 00:18:51,000 --> 00:18:54,000 وإضافة الامور مع المتغيرات المحلية 349 00:18:54,000 --> 00:18:57,000 كنت تقول بدلا من ذلك "حسنا، إذا كان هذا هو مشكلة السوبر سهلة، 350 00:18:57,000 --> 00:19:01,000 مثل هذا العدد <0، اسمحوا لي العودة فورا 0 ". 351 00:19:01,000 --> 00:19:03,000 >> نحن لن يزعج الأرقام السالبة الداعمة، 352 00:19:03,000 --> 00:19:05,000 لذلك أنا ذاهب إلى رمز الثابت قيمة 0. 353 00:19:05,000 --> 00:19:08,000 لكن على خلاف ذلك، لتنفيذ هذه الفكرة من تلخيص 354 00:19:08,000 --> 00:19:11,000 كل هذه الأرقام معا بشكل فعال يمكنك أن تأخذ لدغة صغيرة 355 00:19:11,000 --> 00:19:14,000 من المشكلة، مثل الكثير من فعلنا هنا على خشبة المسرح، 356 00:19:14,000 --> 00:19:18,000 ثم بونت بقية من المشكلة إلى الشخص التالي، 357 00:19:18,000 --> 00:19:20,000 لكن في هذه الحالة الشخص التالي هو نفسك. 358 00:19:20,000 --> 00:19:22,000 انها دالة باسم مماثل. 359 00:19:22,000 --> 00:19:25,000 يمر عليه مشكلة أصغر وأصغر وأصغر في كل مرة، 360 00:19:25,000 --> 00:19:28,000 وعلى الرغم من أننا لم أشياء رسمية جدا في الرمز هنا 361 00:19:28,000 --> 00:19:33,000 هذا هو بالضبط ما كان يدور في الاسبوع 0 مع دفتر الهاتف. 362 00:19:33,000 --> 00:19:36,000 هذا هو بالضبط ما كان يدور في الأسابيع الماضية مع شون 363 00:19:36,000 --> 00:19:39,000 ومع المظاهرات لدينا من البحث عن الأرقام. 364 00:19:39,000 --> 00:19:42,000 انها مشكلة مع وتقسيمه مرة أخرى ومرة ​​أخرى. 365 00:19:42,000 --> 00:19:44,000 >> وبعبارة أخرى، هناك طريقة لترجمة الآن 366 00:19:44,000 --> 00:19:47,000 هذا بناء العالم الحقيقي، وهذا بناء مستوى أعلى 367 00:19:47,000 --> 00:19:51,000 من فرق تسد والقيام بشيء مرة أخرى ومرة ​​أخرى 368 00:19:51,000 --> 00:19:56,000 في التعليمات البرمجية، لذلك هذا هو شيء سوف نرى مرة أخرى على مر الزمن. 369 00:19:56,000 --> 00:20:00,000 الآن، بوصفها جانبا، إذا كنت جديدا على العودية يجب أن نفهم الآن على الأقل 370 00:20:00,000 --> 00:20:02,000 لماذا هذا هو مضحك. 371 00:20:02,000 --> 00:20:05,000 انا ذاهب للذهاب إلى google.com، 372 00:20:05,000 --> 00:20:17,000 وانا ذاهب للبحث عن بعض النصائح والحيل على العودية، أدخل. 373 00:20:17,000 --> 00:20:21,000 نقول للشخص إلى جانبك إذا كانوا لا يضحكون الآن فقط. 374 00:20:21,000 --> 00:20:23,000 هل تقصد العودية؟ 375 00:20:23,000 --> 00:20:25,000 هل تقصد آه، هناك نذهب. 376 00:20:25,000 --> 00:20:28,000 حسنا، الآن هي بقية الجميع. 377 00:20:28,000 --> 00:20:30,000 A بيضة عيد الفصح قليلا جزءا لا يتجزأ من هناك في مكان ما في جوجل. 378 00:20:30,000 --> 00:20:33,000 بوصفها جانبا، واحدة من وصلات وضعنا على الموقع الإلكتروني للدورة في 379 00:20:33,000 --> 00:20:36,000 لهذا اليوم فقط هذه الشبكة من خوارزميات الفرز المختلفة، 380 00:20:36,000 --> 00:20:39,000 بعضها بدا ونحن في الأسبوع الماضي، ولكن ما هو الجميل في هذا التصور 381 00:20:39,000 --> 00:20:43,000 كما كنت في محاولة للالتفاف حول عقلك الأشياء مختلفة تتعلق خوارزميات 382 00:20:43,000 --> 00:20:46,000 تعلم أنه يمكنك بسهولة جدا تبدأ الآن مع أنواع مختلفة من المدخلات. 383 00:20:46,000 --> 00:20:50,000 المدخلات عكس كل شيء، والمدخلات مصنفة في معظمها، والمدخلات العشوائية وهكذا دواليك. 384 00:20:50,000 --> 00:20:53,000 وأنت تحاول أن، مرة أخرى، تميز هذه الأشياء في عقلك 385 00:20:53,000 --> 00:20:57,000 ندرك أن هذا URL على موقع الدورة على محاضرات في الصفحة 386 00:20:57,000 --> 00:21:00,000 قد تساعدك السبب من خلال بعض من هؤلاء. 387 00:21:00,000 --> 00:21:05,000 >> اليوم نصل في النهاية إلى حل هذه المشكلة من حين الى الوراء، 388 00:21:05,000 --> 00:21:08,000 وكان أن هذه الوظيفة التي المبادلة فقط لا يعمل، 389 00:21:08,000 --> 00:21:12,000 وماذا كانت المشكلة الأساسية مع هذا مبادلة وظيفة، 390 00:21:12,000 --> 00:21:15,000 والهدف منه هو، مرة أخرى، لتبادل قيمة هنا وهنا 391 00:21:15,000 --> 00:21:17,000 مثل ذلك؟ 392 00:21:17,000 --> 00:21:20,000 لم يكن هذا العمل فعلا. لماذا؟ 393 00:21:20,000 --> 00:21:22,000 نعم. 394 00:21:22,000 --> 00:21:28,000 [غير مسموع والطالب] 395 00:21:28,000 --> 00:21:31,000 بالضبط، وتفسير لهذا bugginess 396 00:21:31,000 --> 00:21:34,000 كان ببساطة لأن عند استدعاء وظائف في C 397 00:21:34,000 --> 00:21:38,000 وهذه المهام تأخذ الحجج، مثل ألف وباء هنا، 398 00:21:38,000 --> 00:21:42,000 الذي يتم تمرير كل ما في نسخ من قيمة كنت تزويد تلك الوظيفة. 399 00:21:42,000 --> 00:21:46,000 أنت لا تقدم القيم الأصلية نفسها، 400 00:21:46,000 --> 00:21:49,000 حتى رأينا هذا في سياق buggyc، 401 00:21:49,000 --> 00:21:52,000 buggy3.c، التي بدت شيئا قليلا من هذا القبيل. 402 00:21:52,000 --> 00:21:57,000 >> أذكر أنه كان لدينا x و y تهيئة إلى 1 و 2 على التوالي. 403 00:21:57,000 --> 00:21:59,000 نحن المطبوعة ثم ما كانت عليه. 404 00:21:59,000 --> 00:22:03,000 ثم زعم أن أنا كنت مبادلة منهم عن طريق استدعاء مبادلة س، ص. 405 00:22:03,000 --> 00:22:06,000 ولكن المشكلة أن عملت مبادلة، 406 00:22:06,000 --> 00:22:10,000 ولكن فقط في نطاق مبادلة الدالة نفسها. 407 00:22:10,000 --> 00:22:13,000 بمجرد ضرب لنا خط 40 تبادلت تلك القيم 408 00:22:13,000 --> 00:22:16,000 وألقيت بعيدا، وهكذا شيئا 409 00:22:16,000 --> 00:22:21,000 في وظيفة الأصلي تم تغيير الواقع الرئيسي في كل شيء، 410 00:22:21,000 --> 00:22:26,000 حتى إذا كنت تعتقد في ذلك الوقت على ما يبدو هذا من حيث ذاكرتنا 411 00:22:26,000 --> 00:22:29,000 إذا هذا الجانب الأيسر من لوحة تمثل- 412 00:22:29,000 --> 00:22:33,000 وسوف أبذل قصارى جهدي للجميع لرؤية هذا، إذا كانت هذه الجانب الأيسر من لوحة 413 00:22:33,000 --> 00:22:37,000 يمثل، مثلا، RAM الخاص بك، والمكدس هو الذهاب الى تنمو على ما يصل بهذه الطريقة، 414 00:22:37,000 --> 00:22:43,000 وندعو وظيفة مثل الرئيسية، وأهم المتغيرات المحلية يوجد 2، X و Y، 415 00:22:43,000 --> 00:22:48,000 دعونا كما وصف تلك X هنا، ودعونا وصف هذه كما ذ هنا، 416 00:22:48,000 --> 00:22:55,000 ودعونا نضع في قيم 1 و 2، لذلك هذا هو هنا الرئيسية، 417 00:22:55,000 --> 00:22:58,000 وعندما يستدعي الدالة الرئيسي المبادلة نظام التشغيل 418 00:22:58,000 --> 00:23:02,000 يعطي وظيفة مبادلة رقعة الخاصة من الذاكرة على المكدس، 419 00:23:02,000 --> 00:23:04,000 الإطار الخاص بها على المكدس، إذا جاز التعبير. 420 00:23:04,000 --> 00:23:08,000 فإنه يخصص أيضا 32 بت لهذه رجات. 421 00:23:08,000 --> 00:23:11,000 يحدث أن تسميها ألف وباء، ولكن هذا التعسفي تماما. 422 00:23:11,000 --> 00:23:13,000 كان يمكن أن يطلق عليه منها ما تشاء، ولكن ماذا يحدث عندما الرئيسي 423 00:23:13,000 --> 00:23:19,000 مكالمات المبادلة يستغرق هذا 1، يضع نسخة هناك، ويضع نسخة هناك. 424 00:23:19,000 --> 00:23:23,000 >> هناك 1 متغير المحلية الأخرى في مبادلة، على الرغم من، ودعا ماذا؟ >> TMP. 425 00:23:23,000 --> 00:23:27,000 TMP، لذلك اسمحوا لي أن أقدم نفسي آخر 32 بت هنا، 426 00:23:27,000 --> 00:23:29,000 وماذا فعلت في هذه الوظيفة؟ 427 00:23:29,000 --> 00:23:34,000 قلت TMP الباحث يحصل على، لذلك عدد 1، لذلك فعلت هذا عندما لعبنا مع هذا المثال الأخير. 428 00:23:34,000 --> 00:23:39,000 ثم يحصل ب، لذلك هو 2 ب، وحتى الآن هذا يصبح 2، 429 00:23:39,000 --> 00:23:42,000 والآن يحصل ب مؤقت، لذلك الحرارة هي 1، 430 00:23:42,000 --> 00:23:44,000 حتى الآن ب يصبح هذا. 431 00:23:44,000 --> 00:23:46,000 هذا أمر عظيم. عملت. 432 00:23:46,000 --> 00:23:49,000 ولكن بعد ذلك بأسرع ما ترجع الدالة 433 00:23:49,000 --> 00:23:52,000 ذاكرة مبادلة لليختفي بشكل فعال بحيث يمكن إعادة استخدامها 434 00:23:52,000 --> 00:23:58,000 من قبل بعض وظيفة أخرى في المستقبل، وأهم من الواضح تماما دون تغيير. 435 00:23:58,000 --> 00:24:00,000 نحن بحاجة إلى وسيلة لحل هذه المشكلة جذريا، 436 00:24:00,000 --> 00:24:03,000 واليوم سيكون لدينا أخيرا وسيلة لتحقيق ذلك حيث 437 00:24:03,000 --> 00:24:06,000 يمكننا تقديم شيء يسمى المؤشر. 438 00:24:06,000 --> 00:24:09,000 تبين أن نتمكن من حل هذه المشكلة 439 00:24:09,000 --> 00:24:12,000 لا عن طريق تمرير في نسخ من x و y 440 00:24:12,000 --> 00:24:18,000 ولكن بدلا من ذلك عن طريق تمرير ما في، هل تعتقد، إلى وظيفة المبادلة؟ 441 00:24:18,000 --> 00:24:20,000 نعم، ماذا عن عنوان؟ 442 00:24:20,000 --> 00:24:22,000 نحن لم نتحدث حقا عن عناوين في الكثير من التفاصيل، 443 00:24:22,000 --> 00:24:25,000 ولكن إذا كانت هذه السبورة يمثل ذاكرة الكمبيوتر الخاص بي 444 00:24:25,000 --> 00:24:28,000 يمكن أن نبدأ بالتأكيد ترقيم بايت RAM في بلدي 445 00:24:28,000 --> 00:24:31,000 وأقول هذا هو البايت رقم 1، وهذا هو البايت رقم 2، رقم 3 بايت، 446 00:24:31,000 --> 00:24:35,000 # 4 بايت، بايت # ... 2 مليار جنيه إذا لدي 2 غيغا بايت من ذاكرة الوصول العشوائي، 447 00:24:35,000 --> 00:24:38,000 لذا فإننا يمكن أن تأتي بالتأكيد مع بعض نظام ترقيم التعسفي 448 00:24:38,000 --> 00:24:41,000 لجميع الأفراد بايت في ذاكرة الكمبيوتر الخاص بي. 449 00:24:41,000 --> 00:24:43,000 >> ماذا لو بدلا عندما أعطي الكلمة المبادلة 450 00:24:43,000 --> 00:24:47,000 بدلا من النجاح في نسخ من x و y 451 00:24:47,000 --> 00:24:51,000 لماذا لا استطيع تمرير بدلا من ذلك في عنوان X هنا، 452 00:24:51,000 --> 00:24:55,000 عنوان Y هنا، أساسا العنوان البريدي 453 00:24:55,000 --> 00:24:59,000 x و y لأنه مبادلة ثم، وإذا ما أبلغ 454 00:24:59,000 --> 00:25:01,000 من عنوان في الذاكرة من X و Y، 455 00:25:01,000 --> 00:25:04,000 مبادلة ثم، إذا كنا تدريب له قليلا، 456 00:25:04,000 --> 00:25:07,000 يمكن أن تدفع إلى هذا العنوان يحتمل، إذا جاز التعبير، 457 00:25:07,000 --> 00:25:11,000 س، وهناك تغيير رقم، ثم دفع إلى عنوان ذ، 458 00:25:11,000 --> 00:25:16,000 تغيير رقم هناك، حتى في الوقت الذي لا تحصل على نسخ من تلك القيم نفسه، 459 00:25:16,000 --> 00:25:19,000 على الرغم من ذلك تحدثنا عن هذا بأنه في الذاكرة الرئيسية 460 00:25:19,000 --> 00:25:23,000 وهذا كما يجري تبادل للذاكرة قوية وخطيرة من الجزء C 461 00:25:23,000 --> 00:25:28,000 هو أن أي وظيفة في أي مكان يمكن أن تلمس الذاكرة في الكمبيوتر، 462 00:25:28,000 --> 00:25:32,000 وهذا هو قوي في ذلك يمكنك أن تفعل أشياء يتوهم جدا مع برامج الكمبيوتر في C. 463 00:25:32,000 --> 00:25:36,000 هذا أمر خطير لأنه يمكنك أيضا المسمار بسهولة بالغة. 464 00:25:36,000 --> 00:25:39,000 في الواقع، يمكن استغلالها واحدة من الطرق الأكثر شيوعا لبرامج هذه الأيام 465 00:25:39,000 --> 00:25:42,000 لا يزال لمبرمج لا لتحقيق 466 00:25:42,000 --> 00:25:45,000 أن كان هو أو هي السماح لبيانات 467 00:25:45,000 --> 00:25:49,000 أن تكون مكتوبة في موقع في الذاكرة التي لم يكن القصد. 468 00:25:49,000 --> 00:25:51,000 >> على سبيل المثال، أو أنها تعلن مجموعة من حجم 10 469 00:25:51,000 --> 00:25:56,000 ولكن بعد ذلك يحاول أن يضع بطريق الخطأ 11 بايت إلى أن مجموعة من الذاكرة، 470 00:25:56,000 --> 00:25:59,000 وتبدأ لمس أجزاء من الذاكرة التي لم تعد صالحة. 471 00:25:59,000 --> 00:26:02,000 فقط لهذا السياق، قد يعلم بعضكم أن 472 00:26:02,000 --> 00:26:06,000 برنامج المطالبات كثيرا ما كنت لالأرقام التسلسلية أو مفاتيح التسجيل، 473 00:26:06,000 --> 00:26:08,000 فوتوشوب و Word وبرامج من هذا القبيل. 474 00:26:08,000 --> 00:26:12,000 توجد الشقوق، كما يعلم بعضكم، حيث عبر الإنترنت يمكنك تشغيل برنامج قليلا، 475 00:26:12,000 --> 00:26:14,000 وفويلا، لا أكثر طلب للحصول على الرقم التسلسلي. 476 00:26:14,000 --> 00:26:16,000 كيف ذلك العمل؟ 477 00:26:16,000 --> 00:26:21,000 في كثير من الحالات هذه الأشياء تجد ببساطة في أجهزة الكمبيوتر 478 00:26:21,000 --> 00:26:24,000 النص في قطاعات الأصفار للكمبيوتر الفعلية ومنها 479 00:26:24,000 --> 00:26:28,000 حيث أن وظيفة حيث يتم طلب الرقم التسلسلي، 480 00:26:28,000 --> 00:26:31,000 وقمت بالكتابة فوق هذه المساحة، أو أثناء تشغيل البرنامج 481 00:26:31,000 --> 00:26:33,000 يمكنك معرفة حيث يتم تخزين المفتاح في الواقع 482 00:26:33,000 --> 00:26:37,000 باستخدام ما يسمى مصحح، ويمكنك قضاء البرمجيات على هذا النحو. 483 00:26:37,000 --> 00:26:40,000 هذا لا يعني أن هذا هو هدفنا لاليومين القادمين، 484 00:26:40,000 --> 00:26:42,000 لكنه لا يملك جدا في العالم الحقيقي تداعيات. 485 00:26:42,000 --> 00:26:45,000 يحدث أن واحدا على إشراك سرقة البرمجيات، 486 00:26:45,000 --> 00:26:47,000 ولكن هناك أيضا حل وسط من الآلات كلها. 487 00:26:47,000 --> 00:26:50,000 >> في الواقع، عندما يتم استغلال المواقع في هذه الأيام 488 00:26:50,000 --> 00:26:53,000 وخطر تسرب البيانات وسرقة كلمات المرور ويتم 489 00:26:53,000 --> 00:26:58,000 هذا في كثير من الأحيان تتصل سوء إدارة الذاكرة واحد، 490 00:26:58,000 --> 00:27:01,000 أو، في حالة قواعد البيانات، وعدم توقع 491 00:27:01,000 --> 00:27:03,000 الخصومة الإدخال، أكثر من ذلك على أنه في الأسابيع القادمة، 492 00:27:03,000 --> 00:27:07,000 لكن في الوقت الراهن مجرد معاينة التسلل من هذا النوع من الضرر الذي يمكنك القيام به 493 00:27:07,000 --> 00:27:11,000 من خلال عدم فهم كيفية عمل الأشياء تماما تحت غطاء محرك السيارة. 494 00:27:11,000 --> 00:27:14,000 دعونا نذهب حول فهم لماذا يتم تقسيم هذه 495 00:27:14,000 --> 00:27:17,000 مع أداة من شأنها أن تصبح أكثر وأكثر فائدة 496 00:27:17,000 --> 00:27:19,000 كما برامجنا الحصول على أكثر تعقيدا. 497 00:27:19,000 --> 00:27:21,000 حتى الآن عندما كنت قد خلل في البرنامج 498 00:27:21,000 --> 00:27:23,000 كيف لك أن ذهبت حول تصحيح الأخطاء ذلك؟ 499 00:27:23,000 --> 00:27:25,000 ما لم تكن التقنيات الخاصة بك حتى الآن، ما إذا كانت تدرس من قبل TF الخاص 500 00:27:25,000 --> 00:27:27,000 أو مجرد العصاميين؟ 501 00:27:27,000 --> 00:27:29,000 [طالب] Printf. 502 00:27:29,000 --> 00:27:31,000 Printf، لذلك ربما كان printf صديقك في أنه إذا كنت تريد أن ترى 503 00:27:31,000 --> 00:27:33,000 ما يجري في الداخل للبرنامج الخاص بك 504 00:27:33,000 --> 00:27:36,000 كنت وضعت للتو هنا printf، وهنا printf، وهنا printf. 505 00:27:36,000 --> 00:27:38,000 ثم تشغيله، وتحصل على مجموعة كاملة من الاشياء التي تظهر على الشاشة 506 00:27:38,000 --> 00:27:43,000 التي يمكنك استخدامها للاستدلال ثم ما يجري في الواقع خطأ في البرنامج. 507 00:27:43,000 --> 00:27:45,000 >> يميل إلى أن يكون Printf شيء قوي جدا، 508 00:27:45,000 --> 00:27:47,000 ولكن من عملية يدوية جدا. 509 00:27:47,000 --> 00:27:49,000 لديك لوضع printf هنا، وهنا printf، 510 00:27:49,000 --> 00:27:51,000 وإذا وضعته داخل حلقة قد تحصل على 100 خطوط 511 00:27:51,000 --> 00:27:53,000 من الإخراج الذي لديك ثم للتدقيق من خلال. 512 00:27:53,000 --> 00:27:58,000 انها ليست آلية جدا سهل الاستعمال أو التفاعلية لبرامج التصحيح، 513 00:27:58,000 --> 00:28:00,000 لكن لحسن الحظ هناك بدائل. 514 00:28:00,000 --> 00:28:03,000 هناك برنامج، على سبيل المثال، دعا GDB، المصحح GNU، 515 00:28:03,000 --> 00:28:06,000 وهو غامضة قليلا في كيفية استخدامه. 516 00:28:06,000 --> 00:28:08,000 انها معقدة قليلا، ولكن بصراحة، 517 00:28:08,000 --> 00:28:11,000 هذا هو واحد من تلك الأشياء التي إذا وضعت في هذا الاسبوع والقادم 518 00:28:11,000 --> 00:28:14,000 وساعة اضافية لفهم شيء من هذا القبيل GDB 519 00:28:14,000 --> 00:28:18,000 سيوفر لك عشرات ربما ساعات في المدى الطويل، 520 00:28:18,000 --> 00:28:21,000 حتى مع ذلك، اسمحوا لي أن أقدم لك ودعابة من هذا الشيء كيف يعمل. 521 00:28:21,000 --> 00:28:23,000 >> أنا في بلدي نافذة طرفية. 522 00:28:23,000 --> 00:28:26,000 اسمحوا لي أن تمضي قدما وتجميع هذا البرنامج، buggy3. 523 00:28:26,000 --> 00:28:28,000 انها بالفعل حتى الآن. 524 00:28:28,000 --> 00:28:31,000 اسمحوا لي تشغيله مثلما فعلنا في الظهر الوقت، وبالفعل، انها مكسورة. 525 00:28:31,000 --> 00:28:34,000 ولكن لماذا هذا؟ ثمل ربما حتى انني وظيفة المبادلة. 526 00:28:34,000 --> 00:28:37,000 ربما انها وباء. أنا لا تتحرك تماما حول لهم بشكل صحيح. 527 00:28:37,000 --> 00:28:39,000 اسمحوا لي أن نمضي قدما ونفعل ذلك. 528 00:28:39,000 --> 00:28:43,000 بدلا من مجرد تشغيل buggy3 اسمحوا لي بدلا تشغيل هذا البرنامج GDB، 529 00:28:43,000 --> 00:28:48,000 وانا ذاهب الى ان اقول انها لتشغيل buggy3، 530 00:28:48,000 --> 00:28:52,000 وانا ذاهب لتشمل سيطة سطر الأوامر، توي،، 531 00:28:52,000 --> 00:28:55,000 وسوف نضع هذا في مشاكل في المستقبل في المواصفات لتذكير. 532 00:28:55,000 --> 00:28:57,000 وبرزت هذه الواجهة الآن بالأبيض والأسود حتى أنه مرة أخرى، 533 00:28:57,000 --> 00:28:59,000 قليلا في البداية الساحقة لأن هناك كل هذا 534 00:28:59,000 --> 00:29:02,000 معلومات الضمان إلى هنا، ولكن على الأقل هناك شيء مألوف. 535 00:29:02,000 --> 00:29:04,000 في الجزء العلوي من النافذة قانون بلدي الفعلية، 536 00:29:04,000 --> 00:29:08,000 وإذا كنت انتقل لأعلى هنا اسمحوا لي أن انتقل إلى أعلى جدا من ملفي، 537 00:29:08,000 --> 00:29:11,000 وبالفعل، هناك buggy3.c، وإشعار في أسفل هذه النافذة 538 00:29:11,000 --> 00:29:13,000 لدي هذه المطالبة GDB. 539 00:29:13,000 --> 00:29:16,000 >> ليست هذه هي نفس الأوامر العادية بلدي هارفارد جون. 540 00:29:16,000 --> 00:29:19,000 هذا هو المطالبة التي يجري للسماح لي للسيطرة على GDB. 541 00:29:19,000 --> 00:29:21,000 GDB هو المصحح. 542 00:29:21,000 --> 00:29:24,000 A المصحح هو البرنامج الذي يتيح لك المشي من خلال 543 00:29:24,000 --> 00:29:27,000 تنفيذ برنامج عن طريق خط سطرا سطرا، 544 00:29:27,000 --> 00:29:30,000 على طول الطريق تفعل أي شيء تريده لهذا البرنامج، 545 00:29:30,000 --> 00:29:33,000 حتى الدعوة الوظائف، أو تبحث، والأهم من ذلك 546 00:29:33,000 --> 00:29:35,000 في قيم المتغيرات المختلفة لل. 547 00:29:35,000 --> 00:29:37,000 دعونا نمضي قدما ونفعل ذلك. 548 00:29:37,000 --> 00:29:40,000 انا ذاهب الى المضي قدما واكتب في المدى الفوري في GDB ل، 549 00:29:40,000 --> 00:29:43,000 لاحظت ذلك في الجزء السفلي الأيسر من الشاشة لقد كتبته تشغيل، 550 00:29:43,000 --> 00:29:45,000 ولقد أصبت الدخول، وماذا فعل ذلك؟ 551 00:29:45,000 --> 00:29:50,000 هو ركض حرفيا برنامج بلدي، ولكن لا أرى في الواقع يذهب الكثير هنا 552 00:29:50,000 --> 00:29:55,000 لأنني لم أخبر الواقع المصحح 553 00:29:55,000 --> 00:29:57,000 وقفة في لحظة معينة من الزمن. 554 00:29:57,000 --> 00:29:59,000 مجرد كتابة المدى بتشغيل البرنامج. 555 00:29:59,000 --> 00:30:01,000 أنا لا أرى أي شيء في الواقع. لا أستطيع التلاعب به. 556 00:30:01,000 --> 00:30:03,000 >> اسمحوا لي بدلا قيام بذلك. 557 00:30:03,000 --> 00:30:08,000 في هذه المطالبة GDB اسمحوا لي أن اكتب بدلا انقطاع، أدخل. 558 00:30:08,000 --> 00:30:10,000 هذا ليس ما قصدته لكتابة. 559 00:30:10,000 --> 00:30:13,000 دعونا بدلا من ذلك اكتب انقطاع الرئيسية. 560 00:30:13,000 --> 00:30:15,000 وبعبارة أخرى، أريد أن تعيين ما يسمى نقطة توقف، 561 00:30:15,000 --> 00:30:18,000 الذي هو اسم على مسمى لأنه سيتم قطع أو إيقاف 562 00:30:18,000 --> 00:30:21,000 تنفيذ البرنامج في ذلك المكان بالذات. 563 00:30:21,000 --> 00:30:23,000 الرئيسية هو اسم مهامي. 564 00:30:23,000 --> 00:30:25,000 تلاحظ أن GDB ذكية جدا. 565 00:30:25,000 --> 00:30:28,000 ترد عليها أن يحدث الرئيسي لبدء تقريبا في السطر 18 566 00:30:28,000 --> 00:30:32,000 من buggy3.c، وتلاحظ ثم هنا في أعلى اليسار 567 00:30:32,000 --> 00:30:34,000 ب + حق بجوار خط 18. 568 00:30:34,000 --> 00:30:38,000 هذا ما يذكرني بأنني تعيين نقطة توقف عند خط 18. 569 00:30:38,000 --> 00:30:42,000 هذه المرة عندما كنت اكتب المدى، وانا ذاهب لتشغيل برنامجي 570 00:30:42,000 --> 00:30:45,000 حتى أن يضرب نقطة، 571 00:30:45,000 --> 00:30:48,000 لذلك فإن برنامج قفة بالنسبة لي في خط 18. 572 00:30:48,000 --> 00:30:50,000 هنا نذهب، تشغيل. 573 00:30:50,000 --> 00:30:53,000 لا شيء يبدو أن يحدث، لكنه ترك إشعار في اسفل 574 00:30:53,000 --> 00:30:58,000 بدء تشغيل البرنامج، buggy3، نقطة 1 في الرئيسي في خط buggy3.c 18. 575 00:30:58,000 --> 00:31:00,000 ماذا يمكن أن أفعل الآن؟ 576 00:31:00,000 --> 00:31:03,000 >> تلاحظ أن أبدأ بكتابة أشياء مثل الطباعة، 577 00:31:03,000 --> 00:31:08,000 لا printf، X الطباعة، والآن هذا هو الغريب. 578 00:31:08,000 --> 00:31:11,000 دولار 1 هو مجرد الفضول، كما سنرى 579 00:31:11,000 --> 00:31:14,000 في كل مرة قمت بطباعة شيء تحصل على قيمة جديدة $. 580 00:31:14,000 --> 00:31:18,000 هذا بحيث يمكنك الرجوع إلى القيم السابقة فقط في حالة، 581 00:31:18,000 --> 00:31:21,000 لكن في الوقت الراهن ما تقول لي الطباعة هو أن قيمة x في هذه المرحلة من القصة 582 00:31:21,000 --> 00:31:26,000 على ما يبدو 134514032. 583 00:31:26,000 --> 00:31:29,000 ماذا؟ أين التي تأتي حتى من؟ 584 00:31:29,000 --> 00:31:31,000 [غير مسموع والطالب] 585 00:31:31,000 --> 00:31:34,000 والواقع أن هذا هو ما سنقوم استدعاء قيمة القمامة، ولقد تحدثت عن هذا لا بعد، 586 00:31:34,000 --> 00:31:37,000 ولكن السبب الذي تهيئة المتغيرات 587 00:31:37,000 --> 00:31:40,000 كذلك من الواضح أن لديهم بعض القيمة التي تريدها لهم. 588 00:31:40,000 --> 00:31:44,000 لكن الصيد هو أذكر أنه يمكنك تعريف متغيرات 589 00:31:44,000 --> 00:31:46,000 مثل فعلت قبل لحظة في بلدي على سبيل المثال سيجما 590 00:31:46,000 --> 00:31:48,000 دون ان يعطي لهم فعلا قيمة. 591 00:31:48,000 --> 00:31:50,000 أذكر ما فعلته هنا في سيغما. 592 00:31:50,000 --> 00:31:52,000 أعلن أنا ن، ولكن ما قيمة لم أعطيها؟ 593 00:31:52,000 --> 00:31:56,000 لا شيء، لأنني كنت أعرف أنه في الأسطر القليلة القادمة 594 00:31:56,000 --> 00:31:59,000 وGetInt رعاية لمشكلة وضع قيمة داخل ن. 595 00:31:59,000 --> 00:32:02,000 >> ولكن في هذه المرحلة من القصة من السطر 11 596 00:32:02,000 --> 00:32:05,000 و 12 خط والخط 13 و السطر 14 597 00:32:05,000 --> 00:32:08,000 طوال تلك عدة أسطر ما هي قيمة ن؟ 598 00:32:08,000 --> 00:32:10,000 في C انك لا تعرف. 599 00:32:10,000 --> 00:32:14,000 انها عموما بعض القيمة القمامة، وبعض رقم عشوائي تماما 600 00:32:14,000 --> 00:32:17,000 ما تبقى أساسا على الدالة السابقة من بعض 601 00:32:17,000 --> 00:32:21,000 بعد أن تم تشغيل، وذلك البرنامج الخاص بك يعمل 602 00:32:21,000 --> 00:32:24,000 يذكر أن وظيفة يحصل وظيفة، وظيفة، وظيفة. 603 00:32:24,000 --> 00:32:27,000 الحصول على وضع كل هذه الأطر على الذاكرة، ومن ثم عودة تلك الوظائف، 604 00:32:27,000 --> 00:32:31,000 وتماما مثل اقترحت مع ممحاة يتم استخدامها في نهاية المطاف ذاكرتهم. 605 00:32:31,000 --> 00:32:37,000 حسنا، انها مجرد أن ذلك يحدث هذا المتغير x في هذا البرنامج 606 00:32:37,000 --> 00:32:41,000 ويبدو أن بعض القيمة الواردة القمامة مثل 134514032 607 00:32:41,000 --> 00:32:44,000 من بعض من وظيفة سابقة، وليس تلك التي كتبت. 608 00:32:44,000 --> 00:32:47,000 يمكن أن يكون شيء يأتي بشكل فعال مع نظام التشغيل، 609 00:32:47,000 --> 00:32:49,000 بعض من وظيفة تحت غطاء محرك السيارة. 610 00:32:49,000 --> 00:32:52,000 >> حسنا، هذا شيء طيب، ولكن دعونا الآن تقدم إلى السطر التالي. 611 00:32:52,000 --> 00:32:55,000 إذا كنت اكتب "التالي" في موجه GDB بلدي وأنا ضربت الدخول، 612 00:32:55,000 --> 00:32:58,000 تلاحظ أن تسليط الضوء على خطوات وصولا الى خط 19، 613 00:32:58,000 --> 00:33:01,000 ولكن الآثار المترتبة المنطقي هو أن السلالة 18 614 00:33:01,000 --> 00:33:06,000 انتهى الآن تنفيذ، حتى لو كنت اكتب مرة أخرى "الطباعة X" 615 00:33:06,000 --> 00:33:10,000 يجب أن نرى الآن 1، وبالفعل، هل. 616 00:33:10,000 --> 00:33:14,000 مرة أخرى، والاشياء $ هو وسيلة لتذكيرك GDB 617 00:33:14,000 --> 00:33:17,000 ما تاريخ الطبعات هي التي قمت به. 618 00:33:17,000 --> 00:33:21,000 والآن اسمحوا لي المضي قدما وطباعة ذ، وبالفعل، Y هو بعض القيمة مجنون أيضا، 619 00:33:21,000 --> 00:33:24,000 ولكن ليست صفقة كبيرة لأنه في السطر 19 ونحن على وشك تعيينه 620 00:33:24,000 --> 00:33:27,000 قيمة 2، لذلك اسمحوا لي اكتب "التالي" مرة أخرى. 621 00:33:27,000 --> 00:33:29,000 ونحن الآن على خط printf. 622 00:33:29,000 --> 00:33:31,000 اسمحوا لي أن تفعل X الطباعة. 623 00:33:31,000 --> 00:33:34,000 اسمحوا لي أن تفعل ذ الطباعة. بصراحة، أنا متعب قليلا الحصول على طبع هذا. 624 00:33:34,000 --> 00:33:38,000 اسمحوا لي أن اكتب بدلا من ذلك "العرض X" و "Y العرض،" 625 00:33:38,000 --> 00:33:41,000 والآن في كل مرة اكتب I أمر في المستقبل 626 00:33:41,000 --> 00:33:45,000 سيتم تذكرت ما X و Y، ما هو X و Y، ما هو x و y. 627 00:33:45,000 --> 00:33:48,000 >> أستطيع أيضا، بوصف ذلك النوع، جانبا في "السكان المحليين من المعلومات." 628 00:33:48,000 --> 00:33:50,000 معلومات هو أمر خاص. 629 00:33:50,000 --> 00:33:52,000 السكان المحليين يعني أنه يظهر لي المتغيرات المحلية. 630 00:33:52,000 --> 00:33:55,000 فقط في حالة انسى أو هذا هو مجنون، وظيفة معقدة 631 00:33:55,000 --> 00:33:57,000 أن كتبت أو أي شخص آخر من السكان المحليين وسوف اقول لكم معلومات 632 00:33:57,000 --> 00:34:00,000 ما هي جميع المتغيرات المحلية داخل هذه الوظيفة المحلية 633 00:34:00,000 --> 00:34:03,000 قد يهمك إذا كنت تريد لكزة حولها. 634 00:34:03,000 --> 00:34:07,000 الآن، هو على وشك تنفيذ printf، لذلك اسمحوا لي المضي قدما واكتب فقط "التالي". 635 00:34:07,000 --> 00:34:10,000 لأننا في هذه البيئة نحن لا نرى فعلا 636 00:34:10,000 --> 00:34:14,000 تنفيذ إلى هنا، ولكن لاحظت أنه يزداد قليلا حطام هنا. 637 00:34:14,000 --> 00:34:17,000 ولكن لاحظ انها تجاوز الشاشة هناك، 638 00:34:17,000 --> 00:34:21,000 حتى انها ليست برنامج مثالي هنا، ولكن هذا ما يرام لأنني يمكن أن يظهر دائما حول 639 00:34:21,000 --> 00:34:23,000 باستخدام الطباعة إذا أريد. 640 00:34:23,000 --> 00:34:26,000 >> اسمحوا لي أن اكتب مرة أخرى القادم، والآن هنا هو الجزء مثيرة للاهتمام. 641 00:34:26,000 --> 00:34:29,000 في هذه المرحلة من القصة هو ذ 2، وx هو 1، 642 00:34:29,000 --> 00:34:32,000 كما اقترح هنا، ومرة ​​أخرى، 643 00:34:32,000 --> 00:34:35,000 والسبب في هذا هو عرض تلقائيا الآن لأنني استخدام الأمر 644 00:34:35,000 --> 00:34:40,000 عرض x و y العرض، وبالتالي فإن لحظة I اكتب المقبل 645 00:34:40,000 --> 00:34:43,000 وينبغي في العاشر نظرية Y وتصبح تبادلت. 646 00:34:43,000 --> 00:34:45,000 الآن، ونحن نعلم بالفعل أن لن يكون الأمر كذلك، 647 00:34:45,000 --> 00:34:49,000 ولكن سنرى في لحظة كيف يمكننا الغوص أعمق لمعرفة لماذا هذا صحيح. 648 00:34:49,000 --> 00:34:54,000 المقبل، ولسوء الحظ، لا يزال ذ 2 و X لا يزال 1، واستطيع ان اؤكد القدر. 649 00:34:54,000 --> 00:34:56,000 طباعة X، Y الطباعة. 650 00:34:56,000 --> 00:34:59,000 في الواقع، لا مقايضة ما حصل فعلا، لذلك دعونا نبدأ هذا انتهى. 651 00:34:59,000 --> 00:35:01,000 بوضوح مكسورة المبادلة. 652 00:35:01,000 --> 00:35:04,000 دعونا بدلا من ذلك اكتب "تشغيل" مرة أخرى. 653 00:35:04,000 --> 00:35:07,000 اسمحوا لي أن أقول نعم، أريد أن أعد تشغيله من البداية، أدخل. 654 00:35:07,000 --> 00:35:09,000 >> الآن أنا في خط النسخ الاحتياطي 18. 655 00:35:09,000 --> 00:35:11,000 تلاحظ الآن x و y هي القيم القمامة مرة أخرى. 656 00:35:11,000 --> 00:35:15,000 المقبل، المقبل، المقبلة، القادمة. 657 00:35:15,000 --> 00:35:17,000 إذا كنت تشعر بالملل يمكنني أيضا اكتب فقط ن المقبل. 658 00:35:17,000 --> 00:35:21,000 يمكنك اختصار لتسلسل أقصر وقت ممكن من الأحرف. 659 00:35:21,000 --> 00:35:23,000 الآن يتم تقسيم المبادلة. 660 00:35:23,000 --> 00:35:25,000 دعونا الغوص في، لذلك بدلا من كتابة المقبل، 661 00:35:25,000 --> 00:35:30,000 الآن انا ذاهب لكتابة الخطوة بحيث يخطو أنا داخل هذه الوظيفة 662 00:35:30,000 --> 00:35:33,000 حتى أستطيع أن المشي من خلال ذلك، لذلك أنا ضربت خطوة ثم أدخل. 663 00:35:33,000 --> 00:35:37,000 تلاحظ أن يقفز تسليط الضوء عليها في أقل برنامجي إلى خط 36. 664 00:35:37,000 --> 00:35:39,000 الآن ما هي المتغيرات المحلية؟ 665 00:35:39,000 --> 00:35:41,000 معلومات السكان المحليين. 666 00:35:41,000 --> 00:35:43,000 لا شيء فقط حتى الآن لأننا لم نصل إلى هذا الخط، 667 00:35:43,000 --> 00:35:47,000 لذلك دعونا نمضي قدما ويقول "التالي". 668 00:35:47,000 --> 00:35:50,000 ونحن الآن يبدو أن لديها TMP TMP الطباعة. 669 00:35:50,000 --> 00:35:52,000 قيمة القمامة، أليس كذلك؟ أعتقد ذلك. 670 00:35:52,000 --> 00:35:55,000 كيف حول طباعة، والطباعة ب، 1 و 2؟ 671 00:35:55,000 --> 00:35:58,000 في لحظة، في أقرب وقت اكتب من جديد المقبل 672 00:35:58,000 --> 00:36:02,000 TMP سوف تأخذ على قيمة 1، ونأمل، 673 00:36:02,000 --> 00:36:05,000 لأن TMP سوف يتم تعيين قيمة. 674 00:36:05,000 --> 00:36:08,000 >> الآن دعونا لا طباعة طباعة ب،، 675 00:36:08,000 --> 00:36:11,000 ولكن الآن طباعة TMP، وانها في الواقع 1. 676 00:36:11,000 --> 00:36:14,000 اسمحوا لي أن تفعل المقبل. اسمحوا لي أن تفعل المقبل. 677 00:36:14,000 --> 00:36:16,000 لقد انتهيت من وظيفة المبادلة. 678 00:36:16,000 --> 00:36:19,000 ما زلت داخل منه في خط 40، لذلك اسمحوا لي طباعة، 679 00:36:19,000 --> 00:36:22,000 ب الطباعة، وأنا لا يهمني ما هو TMP. 680 00:36:22,000 --> 00:36:27,000 يبدو المبادلة هو الصحيح عندما يتعلق الأمر مبادلة ألف وباء. 681 00:36:27,000 --> 00:36:31,000 ولكن إذا كنت اكتب الآن المقبلة، I القفز مرة أخرى إلى خط 25، 682 00:36:31,000 --> 00:36:34,000 وبطبيعة الحال، إذا كنت اكتب في x و y الطباعة 683 00:36:34,000 --> 00:36:38,000 انهم ما زالوا دون تغيير، لذلك نحن لم إصلاح المشكلة. 684 00:36:38,000 --> 00:36:41,000 ولكن التشخيص ربما الآن مع هذا البرنامج GDB 685 00:36:41,000 --> 00:36:44,000 لقد حصلت على ما لا يقل عن خطوة واحدة لفهم 686 00:36:44,000 --> 00:36:47,000 ما على غير ما يرام دون الحاجة إلى القمامة لدينا قانون عن طريق وضع printf هنا، 687 00:36:47,000 --> 00:36:50,000 هنا printf، printf هنا ثم تشغيله مرة أخرى، ومرة ​​أخرى 688 00:36:50,000 --> 00:36:52,000 في محاولة لمعرفة ما على غير ما يرام. 689 00:36:52,000 --> 00:36:55,000 >> انا ذاهب الى المضي قدما وإنهاء للخروج من هذا تماما مع الإقلاع عن التدخين. 690 00:36:55,000 --> 00:36:57,000 انها سوف يقول ذلك الحين، "الخروج على أي حال؟" نعم. 691 00:36:57,000 --> 00:37:00,000 الآن سأعود في موجه بلدي العادية، وانتهيت باستخدام GDB. 692 00:37:00,000 --> 00:37:03,000 بوصفها جانبا، لا تحتاج لاستخدام هذا توي العلم. 693 00:37:03,000 --> 00:37:07,000 في الواقع، إذا قمت بحذف ذلك تحصل أساسا في النصف السفلي من الشاشة. 694 00:37:07,000 --> 00:37:11,000 إذا كنت اكتب انقطاع الرئيسي ثم قم بتشغيل 695 00:37:11,000 --> 00:37:15,000 لا أستطيع تشغيل برنامج لا يزال بلدي، ولكن ما سوف تفعله هو أكثر حرفيا 696 00:37:15,000 --> 00:37:18,000 تظهر لي فقط في سطر واحد في وقت الحالي. 697 00:37:18,000 --> 00:37:21,000 وتوي، واجهة المستخدم النصية، 698 00:37:21,000 --> 00:37:25,000 فقط يظهر لك أكثر من برنامج في وقت واحد، والتي ربما تكون أسهل قليلا من الناحية المفاهيمية. 699 00:37:25,000 --> 00:37:27,000 ولكن في الواقع، لا أستطيع القيام بذلك تماما المقبل، المقبل، المقبلة، 700 00:37:27,000 --> 00:37:30,000 وانا ذاهب لرؤية سطر واحد في كل مرة، وإذا كنت تريد حقا أن نرى ما يحدث على 701 00:37:30,000 --> 00:37:35,000 لا أستطيع كتابة قائمة ونرى في مجمله مجموعة من خطوط المجاورة. 702 00:37:35,000 --> 00:37:39,000 >> هناك الفيديو الذي طلبنا أن تشاهد لمشكلة يحدد 3 703 00:37:39,000 --> 00:37:43,000 الذي يغطي نيت بعض تعقيدات GDB، 704 00:37:43,000 --> 00:37:46,000 وهذا هو واحد من تلك الأشياء، بصراحة، حيث أن بعض نسبة غير تافهة منكم 705 00:37:46,000 --> 00:37:49,000 لن أتطرق GDB، والتي من شأنها أن تكون أمرا سيئا 706 00:37:49,000 --> 00:37:53,000 لأن حرفيا سوف ينتهي بك الأمر إنفاق المزيد من الوقت في وقت لاحق هذا الفصل الدراسي 707 00:37:53,000 --> 00:37:56,000 مطاردة الحشرات ثم هل إذا كنت وضعت في هذا نصف ساعة / ساعة 708 00:37:56,000 --> 00:38:00,000 هذا الاسبوع القادم والتعلم للحصول على راحة مع GDB. 709 00:38:00,000 --> 00:38:02,000 كان Printf صديقك. 710 00:38:02,000 --> 00:38:05,000 يجب أن تكون الآن GDB صديقك. 711 00:38:05,000 --> 00:38:08,000 >> أي أسئلة حول GDB؟ 712 00:38:08,000 --> 00:38:12,000 وهنا قائمة سريعة لبعض الأوامر الأكثر قوية ومفيدة. 713 00:38:12,000 --> 00:38:15,000 نعم تستطيع. >> قمت بطباعة سلسلة؟ 714 00:38:15,000 --> 00:38:17,000 يمكنك طباعة سلسلة؟ على الاطلاق. 715 00:38:17,000 --> 00:38:19,000 فإنه ليس من الضروري أن يكون مجرد أعداد صحيحة. 716 00:38:19,000 --> 00:38:22,000 إذا كان هذا المتغير هو سلسلة اكتب فقط في ليالي الطباعة. 717 00:38:22,000 --> 00:38:24,000 وسوف تظهر لك ما هو هذا المتغير سلسلة. 718 00:38:24,000 --> 00:38:26,000 [غير مسموع والطالب] 719 00:38:26,000 --> 00:38:28,000 سوف تعطيك العنوان والسلسلة نفسها. 720 00:38:28,000 --> 00:38:32,000 وسوف تظهر لك على حد سواء. 721 00:38:32,000 --> 00:38:34,000 وآخر شيء واحد، فقط لأن هذه هي جيدة لمعرفة جدا. 722 00:38:34,000 --> 00:38:37,000 التتبع المعاكس والإطار، اسمحوا لي أن يغوص في هذه المرة آخر، 723 00:38:37,000 --> 00:38:39,000 بالضبط نفس البرنامج مع GDB. 724 00:38:39,000 --> 00:38:44,000 اسمحوا لي أن تمضي قدما وتشغيل واجهة المستخدم النصية الإصدار، 725 00:38:44,000 --> 00:38:46,000 كسر الرئيسية. 726 00:38:46,000 --> 00:38:49,000 اسمحوا لي أن تمضي قدما وتشغيل مرة أخرى. أنا هنا. 727 00:38:49,000 --> 00:38:55,000 والآن اسمحوا لي الذهاب القادم، القادمة، القادم، القادمة، القادمة، خطوة، أدخل. 728 00:38:55,000 --> 00:39:00,000 >> والآن لنفترض الآن أنا في مبادلة عمدا، ولكن أنا مثل "اللعنة، ما هو قيمة x؟" 729 00:39:00,000 --> 00:39:02,000 لا أستطيع أن أفعل X بعد الآن. 730 00:39:02,000 --> 00:39:05,000 لا أستطيع أن أفعل Y لأنها لم تكن في نطاقها. 731 00:39:05,000 --> 00:39:07,000 انهم ليسوا في السياق، ولكن المشكلة لا. 732 00:39:07,000 --> 00:39:09,000 أستطيع أن اكتب التتبع المعاكس. 733 00:39:09,000 --> 00:39:13,000 الذي يظهر لي كل وظائف و ذلك نظرا ليصل إلى هذه النقطة في الوقت المناسب. 734 00:39:13,000 --> 00:39:16,000 لاحظت أن واحدة على الجزء السفلي، الرئيسي، يصطف مع الرئيسية 735 00:39:16,000 --> 00:39:18,000 يجري على الجزء السفلي من الصورة هنا. 736 00:39:18,000 --> 00:39:22,000 حقيقة أن المبادلة فوقه يصطف مع مبادلة يجري فوقه في الذاكرة هنا، 737 00:39:22,000 --> 00:39:26,000 وإذا كنت ترغب في الحصول على العودة الى الأصل مؤقتا أستطيع أن أقول "الإطار." 738 00:39:26,000 --> 00:39:30,000 ما العدد؟ الرئيسي هو الإطار رقم 1. 739 00:39:30,000 --> 00:39:32,000 انا ذاهب الى المضي قدما ويقول "الإطار 1." 740 00:39:32,000 --> 00:39:36,000 >> الآن أنا مرة أخرى في الرئيسي، وأنا يمكن طباعة العاشر، وأنا يمكن طباعة ذ، 741 00:39:36,000 --> 00:39:40,000 ولكن لا أستطيع طباعة A أو B. 742 00:39:40,000 --> 00:39:43,000 ولكن يمكنني أن أقول إذا، "حسنا، انتظر لحظة. أين كان المبادلة؟" 743 00:39:43,000 --> 00:39:46,000 اسمحوا لي أن تمضي قدما ويقول "الإطار 0". 744 00:39:46,000 --> 00:39:48,000 الآن سأعود حيث كنت تريد أن تكون، وبوصفها جانبا، 745 00:39:48,000 --> 00:39:52,000 هناك أوامر أخرى أيضا، مثل إذا كنت حقا الحصول على بالملل الكتابة المقبل، المقبل، المقبلة، المقبل، 746 00:39:52,000 --> 00:39:56,000 هل يمكن القول عموما أشياء مثل "ال 10 المقبلة"، والتي من شأنها أن الخطوة من خلال خطوط ال 10 المقبلة. 747 00:39:56,000 --> 00:39:59,000 يمكنك أيضا كتابة "تواصل" عندما كنت حقا الحصول على ضاقوا ذرعا التنقل خلال ذلك. 748 00:39:59,000 --> 00:40:05,000 ستواصل تشغيل البرنامج دون انقطاع حتى آخر نقطة توقف يضرب، 749 00:40:05,000 --> 00:40:07,000 سواء في حلقة أو للأسفل في البرنامج. 750 00:40:07,000 --> 00:40:11,000 >> في هذه الحالة اصلنا حتى النهاية، وبرنامج خرجت بشكل طبيعي. 751 00:40:11,000 --> 00:40:13,000 هذا هو وسيلة الهوى، عملية السفلي. 752 00:40:13,000 --> 00:40:16,000 خرجت للتو البرنامج بشكل طبيعي. 753 00:40:16,000 --> 00:40:24,000 المزيد عن هذا في شريط الفيديو والتصحيح في الدورات المقبلة. 754 00:40:24,000 --> 00:40:26,000 كان ذلك كثيرا. 755 00:40:26,000 --> 00:40:35,000 دعونا نلقي دينا 5 دقائق استراحة هنا، ونحن سوف يعود مع البنيات والملفات. 756 00:40:35,000 --> 00:40:38,000 >> إذا كان قد سقط ارضا لكم في هذا الأسبوع pset بالفعل 757 00:40:38,000 --> 00:40:41,000 عليك أن تعرف أن نستخدمها في رمز التوزيع، 758 00:40:41,000 --> 00:40:45,000 مصدر التعليمات البرمجية التي نقدمها لك كنقطة انطلاق، بعض التقنيات الجديدة. 759 00:40:45,000 --> 00:40:50,000 على وجه الخصوص، قدمنا ​​هذه الكلمة الرئيسية جديد يسمى البنية، لهيكل، 760 00:40:50,000 --> 00:40:53,000 حتى نتمكن من إنشاء متغيرات مخصصة من نوع ما. 761 00:40:53,000 --> 00:40:57,000 قدمنا ​​أيضا فكرة إدخال ملف I / O، والإخراج، 762 00:40:57,000 --> 00:41:00,000 وهذا هو حتى نتمكن من إنقاذ الدولة 763 00:41:00,000 --> 00:41:03,000 مجلس التدافع إلى ملف على القرص 764 00:41:03,000 --> 00:41:06,000 بحيث يمكن للزملاء التدريس وأنا أفهم 765 00:41:06,000 --> 00:41:09,000 ما يجري في الداخل للبرنامج الخاص بك دون الحاجة للعب يدويا 766 00:41:09,000 --> 00:41:11,000 عشرات من الألعاب من التدافع. 767 00:41:11,000 --> 00:41:13,000 يمكننا أن نفعل ذلك أكثر automatedly. 768 00:41:13,000 --> 00:41:18,000 >> هذه فكرة البنية يحل مشكلة مقنعة إلى حد ما. 769 00:41:18,000 --> 00:41:21,000 لنفترض أننا نريد أن تنفيذ بعض البرامج 770 00:41:21,000 --> 00:41:25,000 التي تحافظ بطريقة أو بأخرى تتبع المعلومات على الطلاب، 771 00:41:25,000 --> 00:41:28,000 وربما يكون الطلاب، على سبيل المثال، معرف، وهو اسم 772 00:41:28,000 --> 00:41:31,000 ومنزل في مكان مثل جامعة هارفارد، لذلك هذه هي 3 قطع من المعلومات 773 00:41:31,000 --> 00:41:34,000 نريد للحفاظ على حولها، لذلك اسمحوا لي المضي قدما والبدء في كتابة برنامج قليلا هنا، 774 00:41:34,000 --> 00:41:38,000 وتشمل stdio.h. 775 00:41:38,000 --> 00:41:42,000 اسمحوا لي أن تفعل تشمل cs50.h. 776 00:41:42,000 --> 00:41:44,000 وتبدأ بعد ذلك مهامي الرئيسية. 777 00:41:44,000 --> 00:41:46,000 وأنا لن عناء مع أي وسائط سطر الأوامر، 778 00:41:46,000 --> 00:41:49,000 وهنا أريد أن يكون طالبا، لذلك أنا ذاهب الى القول 779 00:41:49,000 --> 00:41:54,000 طالب له اسم، لذلك أنا ذاهب الى القول "اسم السلسلة." 780 00:41:54,000 --> 00:41:59,000 ثم أنا ذاهب أن أقول طالب أيضا ID، ID INT ذلك، 781 00:41:59,000 --> 00:42:03,000 وطالب لديه منزل، لذلك أنا ذاهب أيضا أن أقول "بيت السلسلة." 782 00:42:03,000 --> 00:42:06,000 ثم أنا من أجل هذه قليلا أكثر نظافة مثل هذا. 783 00:42:06,000 --> 00:42:11,000 حسنا، والآن لدي 3 المتغيرات التي تمثل الطلاب، وذلك "الطالب". 784 00:42:11,000 --> 00:42:15,000 >> والآن أريد أن تعبئة هذه القيم، لذلك اسمحوا لي المضي قدما وتقول شيئا مثل 785 00:42:15,000 --> 00:42:18,000 "معرف = 123". 786 00:42:18,000 --> 00:42:21,000 اسم هو الذهاب الى الحصول على داود. 787 00:42:21,000 --> 00:42:24,000 دعنا نقول البيت هو الذهاب الى الحصول ماثر، 788 00:42:24,000 --> 00:42:31,000 ثم انا ذاهب الى القيام بشيء مثل printf بشكل تعسفي ("٪ S، 789 00:42:31,000 --> 00:42:37,000 ID الذي هو د٪، يعيش في ليالي٪. 790 00:42:37,000 --> 00:42:41,000 والآن، ماذا أريد أن سد العجز في هنا، واحدا بعد الآخر؟ 791 00:42:41,000 --> 00:42:47,000 الاسم والهوية، المنزل؛ عودة 0. 792 00:42:47,000 --> 00:42:50,000 حسنا، ما لم ثمل بي الأمر هنا في مكان ما 793 00:42:50,000 --> 00:42:54,000 أعتقد أن لدينا برنامج جيد جدا يقوم بتخزين طالب واحد. 794 00:42:54,000 --> 00:42:57,000 بالطبع، هذا ليس كل ما مثيرة للاهتمام. ماذا لو أريد أن يكون 2 طالب؟ 795 00:42:57,000 --> 00:42:59,000 هذا ليس صفقة كبيرة. أعالج 2 و. 796 00:42:59,000 --> 00:43:03,000 اسمحوا لي أن تمضي قدما وتسليط الضوء على هذا النزول وهنا، 797 00:43:03,000 --> 00:43:09,000 وأستطيع أن أقول "ID = 456" لشخص مثل روب الذي يعيش في كيركلاند. 798 00:43:09,000 --> 00:43:12,000 >> حسنا، انتظر، لكنني لا يمكن استدعاء هذه نفس الشيء، 799 00:43:12,000 --> 00:43:15,000 ويبدو انا ذاهب الى أن نسخ هذا، 800 00:43:15,000 --> 00:43:19,000 لذلك اسمحوا لي أن أقول إن هذه المتغيرات سيكون ديفيد، 801 00:43:19,000 --> 00:43:23,000 واسمحوا لي أن الحصول على بعض نسخ من هذه لروب. 802 00:43:23,000 --> 00:43:27,000 سوف نطلق هذه لروب ولكن هذا لن يعمل الآن 803 00:43:27,000 --> 00:43:33,000 لأنني-الانتظار، دعونا تغيير لي أن ID1، وNAME1 house1. 804 00:43:33,000 --> 00:43:35,000 وسوف يكون روب 2، 2. 805 00:43:35,000 --> 00:43:42,000 لقد حصلت لتغيير هذا هنا، هنا، هنا، هنا، هنا، هنا. 806 00:43:42,000 --> 00:43:45,000 الانتظار، ماذا عن تومي؟ دعونا نفعل ذلك مرة أخرى. 807 00:43:45,000 --> 00:43:49,000 إذا كنت لا تزال تعتقد الواضح هذا هو وسيلة جيدة للقيام بذلك، انها ليست، 808 00:43:49,000 --> 00:43:52,000 نسخ ذلك / لصق سيئة. 809 00:43:52,000 --> 00:43:55,000 ولكن حللنا هذا قبل أسبوع. 810 00:43:55,000 --> 00:43:59,000 >> ما هو الحل لدينا عندما كنا نريد أن حالات متعددة من نفس نوع البيانات؟ 811 00:43:59,000 --> 00:44:01,000 [الطلاب] صفيف. 812 00:44:01,000 --> 00:44:03,000 صفيف، لذلك اسمحوا لي أن أحاول بتنظيف هذا. 813 00:44:03,000 --> 00:44:07,000 اسمحوا لي أن بعض الغرف لنفسي في القمة، واسمحوا لي أن تفعل هذا بدلا هنا. 814 00:44:07,000 --> 00:44:12,000 سوف ندعو هؤلاء الناس، وبدلا من ذلك انا ذاهب الى القول "IDS الباحث" 815 00:44:12,000 --> 00:44:14,000 وانا ذاهب لدعم 3 منا في الوقت الراهن. 816 00:44:14,000 --> 00:44:18,000 انا ذاهب الى القول "أسماء السلسلة،" وأنا منا الدعم 3، 817 00:44:18,000 --> 00:44:22,000 ثم انا ذاهب الى القول "بيوت السلسلة،" وأنا ذاهب لدعم 3 منا. 818 00:44:22,000 --> 00:44:26,000 الآن هنا بدلا من ديفيد الحصول على المتغيرات المحلية الخاصة به 819 00:44:26,000 --> 00:44:28,000 يمكننا التخلص من تلك. 820 00:44:28,000 --> 00:44:30,000 أن يشعر جيدة أننا تنظيف هذا الأمر. 821 00:44:30,000 --> 00:44:35,000 أستطيع أن أقول ثم ديفيد سيكون [0] وأسماء [0] 822 00:44:35,000 --> 00:44:38,000 والبيوت [0]. 823 00:44:38,000 --> 00:44:41,000 ومن ثم يمكننا انقاذ روب بالمثل في هذا الشأن. 824 00:44:41,000 --> 00:44:46,000 دعونا نضع هذا هنا إلى أسفل، حتى انه سيكون تعسفا IDS [1]. 825 00:44:46,000 --> 00:44:50,000 انه سيكون من الأسماء [1]، 826 00:44:50,000 --> 00:44:53,000 وأخيرا ثم والمنازل [1]. 827 00:44:53,000 --> 00:44:57,000 >> لا تزال شاقة بعض الشيء، والآن لا بد لي من هذا الرقم، 828 00:44:57,000 --> 00:45:03,000 لذلك دعونا نقول "أسماء [0]، رقم [0]، والمنازل [0]، 829 00:45:03,000 --> 00:45:06,000 ودعونا pluralize هذا. 830 00:45:06,000 --> 00:45:09,000 هويات، هويات، هويات. 831 00:45:09,000 --> 00:45:12,000 ومرة أخرى، أنا أفعل ذلك، ومرة ​​أخرى كان الأمر كذلك، أنا بالفعل اللجوء إلى نسخ / لصق مرة أخرى، 832 00:45:12,000 --> 00:45:14,000 لذلك كل الاحتمالات هناك حل آخر هنا. 833 00:45:14,000 --> 00:45:18,000 ربما يمكنني تنظيف هذا الأمر أيضا مع حلقة أو شيء من هذا القبيل، 834 00:45:18,000 --> 00:45:21,000 لذلك باختصار، انها أفضل قليلا ولكن لا يزال يشعر مثل 835 00:45:21,000 --> 00:45:24,000 أنا اللجوء إلى نسخ / لصق، ولكن حتى هذا، يدعي الأول، 836 00:45:24,000 --> 00:45:27,000 ليس جوهريا حقا الحل الصحيح لأن 837 00:45:27,000 --> 00:45:29,000 ماذا لو كنت في وقت ما قررنا تعرف لماذا؟ 838 00:45:29,000 --> 00:45:32,000 يجب علينا حقا تم تخزين عناوين البريد الإلكتروني لديفيد روب و 839 00:45:32,000 --> 00:45:34,000 والجميع في هذا البرنامج. 840 00:45:34,000 --> 00:45:36,000 يجب علينا أيضا تخزين أرقام الهواتف. 841 00:45:36,000 --> 00:45:39,000 يجب علينا أيضا تخزين أرقام الاتصال في حالات الطوارئ. 842 00:45:39,000 --> 00:45:41,000 لدينا كل هذه القطع من البيانات التي نريد لتخزين، 843 00:45:41,000 --> 00:45:43,000 لذلك كيف يمكنك أن تذهب نحو ذلك؟ 844 00:45:43,000 --> 00:45:46,000 >> تقوم بتعريف مجموعة أخرى في القمة، ثم قمت بإضافة يدويا 845 00:45:46,000 --> 00:45:49,000 عنوان بريد إلكتروني [0]، وعنوان البريد الإلكتروني [1] 846 00:45:49,000 --> 00:45:51,000 لديفيد وروب وهكذا دواليك. 847 00:45:51,000 --> 00:45:56,000 ولكن هناك في الحقيقة مجرد افتراض الكامنة وراء هذا التصميم 848 00:45:56,000 --> 00:45:59,000 أن أنا باستخدام نظام الشرف أن نعرف أن 849 00:45:59,000 --> 00:46:03,000 [أنا] في كل من صفائف عدة 850 00:46:03,000 --> 00:46:06,000 يحدث ذلك فقط للإشارة إلى الشخص نفسه، 851 00:46:06,000 --> 00:46:10,000 حتى [0] في هويات هو رقم 123، 852 00:46:10,000 --> 00:46:13,000 وأنا ذاهب لنفترض أن أسماء [0] 853 00:46:13,000 --> 00:46:16,000 هو نفس الشخص اسم والمنازل [0] 854 00:46:16,000 --> 00:46:21,000 هو منزل الشخص نفسه وهكذا دواليك بالنسبة لجميع المصفوفات المختلفة التي يمكنني إنشاء. 855 00:46:21,000 --> 00:46:24,000 ولكن لاحظت أنه لا يوجد ربط الأساسية 856 00:46:24,000 --> 00:46:27,000 بين هذه القطع 3 من المعلومات الاسم ورقم البيت و، 857 00:46:27,000 --> 00:46:32,000 على الرغم من أن الكيان نحاول نموذج في هذا البرنامج ليس صفائف. 858 00:46:32,000 --> 00:46:35,000 صفائف ليست سوى بهذه الطريقة البرنامجية للقيام بذلك. 859 00:46:35,000 --> 00:46:38,000 ما نريد حقا في تصميم نموذج في برنامجنا هو شخص 860 00:46:38,000 --> 00:46:41,000 مثل ديفيد، شخص مثل روب داخل منها 861 00:46:41,000 --> 00:46:46,000 أو التغليف هو اسم ورقم ومنزل. 862 00:46:46,000 --> 00:46:49,000 >> يمكننا التعبير عن هذه الفكرة بطريقة أو بأخرى من التغليف 863 00:46:49,000 --> 00:46:52,000 حيث يكون الشخص لديه ID، اسم ومنزل 864 00:46:52,000 --> 00:46:55,000 وعدم اللجوء الى هذا الإختراق حقا حيث أننا فقط 865 00:46:55,000 --> 00:46:58,000 على ثقة من أن شيئا قوس 866 00:46:58,000 --> 00:47:02,000 يشير إلى كيان الإنسان نفسه في كل من هذه المصفوفات المتباينة؟ 867 00:47:02,000 --> 00:47:04,000 يمكننا أن نفعل هذا الواقع. 868 00:47:04,000 --> 00:47:08,000 اسمحوا لي ان اذهب الآن فوق الرئيسي ل، واسمحوا لي خلق نوع البيانات الخاصة بي 869 00:47:08,000 --> 00:47:10,000 لحقا للمرة الأولى. 870 00:47:10,000 --> 00:47:14,000 استخدمنا هذه التقنية في التنافس، 871 00:47:14,000 --> 00:47:17,000 ولكن هنا انا ذاهب الى المضي قدما وخلق نوع البيانات، 872 00:47:17,000 --> 00:47:19,000 وأنت تعرف ماذا، أنا ذاهب إلى نسميها طالب أو شخص، 873 00:47:19,000 --> 00:47:23,000 وانا ذاهب الى استخدام typedef لتعريف نوع. 874 00:47:23,000 --> 00:47:25,000 انا ذاهب الى القول بأن هذا هو الهيكل، 875 00:47:25,000 --> 00:47:29,000 ثم هذا الهيكل سيكون من نوع الطالب، ونحن سوف يقول، 876 00:47:29,000 --> 00:47:31,000 على الرغم من انها قليلا مؤرخة الآن بالنسبة لي. 877 00:47:31,000 --> 00:47:33,000 سوف نقول "الباحث الهوية." 878 00:47:33,000 --> 00:47:35,000 سوف نقول "اسم السلسلة." 879 00:47:35,000 --> 00:47:37,000 ثم سوف نقول "سلسلة المنزل" 880 00:47:37,000 --> 00:47:40,000 الآن ذلك قبل نهاية هذه السطور القليلة من التعليمات البرمجية 881 00:47:40,000 --> 00:47:45,000 لقد علمت للتو أن هناك رنة 882 00:47:45,000 --> 00:47:49,000 نوع بيانات إلى جانب رجات، إلى جانب سلاسل، إلى جانب الزوجي، إلى جانب يطفو. 883 00:47:49,000 --> 00:47:54,000 >> اعتبارا من هذه اللحظة في الوقت الخط 11، وهناك الآن نوع بيانات جديدة تسمى الطلاب، 884 00:47:54,000 --> 00:47:58,000 والآن يمكنني تعريف متغير في أي مكان أريد الطالب، 885 00:47:58,000 --> 00:48:01,000 لذلك اسمحوا لي انزل هنا للناس. 886 00:48:01,000 --> 00:48:05,000 الآن يمكنني التخلص من هذا، وأستطيع أن أعود الى هنا ديفيد، 887 00:48:05,000 --> 00:48:10,000 وأستطيع أن أقول ديفيد الواقع أن ديفيد، 888 00:48:10,000 --> 00:48:13,000 يمكننا تسمية المتغير حرفيا بعد نفسي، 889 00:48:13,000 --> 00:48:16,000 سيكون من نوع الطالب. 890 00:48:16,000 --> 00:48:18,000 هذا قد تبدو غريبة قليلا، ولكن هذا ليس كل ما مختلفة 891 00:48:18,000 --> 00:48:22,000 من إعلان شيء على أنه صحيح أو سلسلة أو طوف. 892 00:48:22,000 --> 00:48:24,000 يحدث ذلك فقط من أجل أن يسمى الطالب الآن، 893 00:48:24,000 --> 00:48:28,000 وإذا كنت تريد أن تضع شيئا داخل هذا الهيكل 894 00:48:28,000 --> 00:48:31,000 لدي الآن لاستخدام قطعة جديدة من بناء الجملة، ولكنه جميلة واضحة، 895 00:48:31,000 --> 00:48:39,000 david.id = 123، david.name = "ديفيد" في العاصمة D، 896 00:48:39,000 --> 00:48:42,000 وdavid.house = "ماذر" 897 00:48:42,000 --> 00:48:46,000 والآن لا أستطيع التخلص من هذه الأشياء هنا. 898 00:48:46,000 --> 00:48:51,000 لاحظت لقد أعدنا تصميم برنامجنا الآن بطريقة أفضل بكثير حقا 899 00:48:51,000 --> 00:48:54,000 في هذا الآن برنامجنا يعكس العالم الحقيقي. 900 00:48:54,000 --> 00:48:57,000 >> هناك فكرة في العالم الحقيقي لشخص أو الطالب. 901 00:48:57,000 --> 00:49:02,000 هنا لدينا الآن نسخة C لشخص أو أكثر على وجه التحديد الطالب. 902 00:49:02,000 --> 00:49:05,000 داخل هذا الشخص هي هذه الخصائص ذات الصلة، 903 00:49:05,000 --> 00:49:10,000 ID، واسم البيت، لذلك يصبح روب أساسا نفس الشيء هنا إلى أسفل، 904 00:49:10,000 --> 00:49:14,000 لذلك طالب روب، وrob.id الآن = 456، 905 00:49:14,000 --> 00:49:17,000 rob.name = "روب". 906 00:49:17,000 --> 00:49:20,000 حقيقة أن ما يسمى المتغير روب هو نوع من معنى. 907 00:49:20,000 --> 00:49:22,000 كان يمكن أن أطلق عليها X أو Y أو Z. 908 00:49:22,000 --> 00:49:25,000 نحن فقط روب اسمه أن تكون متسقة غويا، 909 00:49:25,000 --> 00:49:28,000 ولكن في الحقيقة هو اسم من داخل هذا المجال نفسه، 910 00:49:28,000 --> 00:49:30,000 حتى الآن لدي هذا. 911 00:49:30,000 --> 00:49:33,000 هذا أيضا لا أشعر بأن أفضل تصميم في أنني الثابت ترميز ديفيد. 912 00:49:33,000 --> 00:49:35,000 لقد مشفرة يصعب I روب. 913 00:49:35,000 --> 00:49:39,000 وأنا لا تزال بحاجة الى اللجوء الى بعض نسخ ولصق في كل مرة أريد المتغيرات الجديدة. 914 00:49:39,000 --> 00:49:43,000 وعلاوة على ذلك، لا بد لي من إعطاء ما يبدو كل من هذه المتغيرات اسم، 915 00:49:43,000 --> 00:49:46,000 على الرغم من ذلك بكثير فما استقاموا لكم فاستقيموا بدلا وصف هذه المتغيرات 916 00:49:46,000 --> 00:49:48,000  أكثر بشكل عام باسم الطلاب. 917 00:49:48,000 --> 00:49:52,000 >> الآن يمكننا دمج الأفكار التي تم العمل بشكل جيد بالنسبة لنا 918 00:49:52,000 --> 00:49:56,000 ويقول بدلا من ذلك "أنت تعرف ما، أعطني الطلاب متغير يسمى، 919 00:49:56,000 --> 00:50:01,000 ودعونا أن يكون من حجم 3، "حتى الآن يمكنني تحسين هذا مزيد، 920 00:50:01,000 --> 00:50:04,000 تخلص من ديفيد أعلن يدويا، 921 00:50:04,000 --> 00:50:08,000 وأستطيع أن أقول شيء من هذا القبيل بدلا الطلاب [0] هنا. 922 00:50:08,000 --> 00:50:11,000 ويمكنني أن أقول بعد ذلك الطلاب [0] هنا، 923 00:50:11,000 --> 00:50:14,000 يمكن للطلاب [0] هنا، وهكذا دواليك، وأنا يرحل 924 00:50:14,000 --> 00:50:16,000 وتنظيف ما يصل لروب. 925 00:50:16,000 --> 00:50:19,000 ويمكنني أن استمر أيضا عن إضافة الآن ربما حلقة 926 00:50:19,000 --> 00:50:23,000 واستخدام GetString وGetInt للحصول على هذه القيم في الواقع من المستخدم. 927 00:50:23,000 --> 00:50:27,000 ويمكنني أن استمر حوالي إضافة ثابت لأن هذا هو ممارسة سيئة عموما 928 00:50:27,000 --> 00:50:29,000 إلى رمز الصعب بعض التعسفي عدد مثل 3 هنا 929 00:50:29,000 --> 00:50:33,000 ثم فقط تذكر أن عليك أن تضع ما لا يزيد عن 3 طلاب في ذلك. 930 00:50:33,000 --> 00:50:36,000 ربما يكون من الأفضل استخدام # تعريف في الجزء العلوي من الملف الخاص بي 931 00:50:36,000 --> 00:50:40,000 والعوامل التي، لذلك في الواقع، اسمحوا لي أن تمضي قدما وتعميم هذا. 932 00:50:40,000 --> 00:50:43,000 >> اسمحوا لي أن فتح هذا مثال بين اليوم 933 00:50:43,000 --> 00:50:46,000 الأمثلة في وقت مبكر، structs1. 934 00:50:46,000 --> 00:50:49,000 هذا هو برنامج يستخدم أكثر اكتمالا # تعريف هنا 935 00:50:49,000 --> 00:50:51,000 ويقول نحن ستكون لدينا 3 طلاب بشكل افتراضي. 936 00:50:51,000 --> 00:50:54,000 أنا هنا اعلان يستحق فئة من الطلاب، 937 00:50:54,000 --> 00:50:57,000 لذلك الفصول الدراسية من الطلاب، والآن أنا باستخدام حلقة 938 00:50:57,000 --> 00:51:00,000 فقط لجعل رمز قليلا أكثر أناقة، تعبئة الطبقة 939 00:51:00,000 --> 00:51:05,000 مع مدخلات المستخدم، حتى أعاد من 0 = أنا على ما يصل إلى الطلاب، والتي هي 3. 940 00:51:05,000 --> 00:51:07,000 وبعد ذلك مطالبة المستخدم في هذا الإصدار 941 00:51:07,000 --> 00:51:10,000  ما هو رقم الطالب، ويمكنني الحصول عليه مع GetInt. 942 00:51:10,000 --> 00:51:13,000 ما هو اسم الطالب، ومن ثم أحصل عليه مع GetString. 943 00:51:13,000 --> 00:51:15,000 ما هو منزل الطالب؟ يمكنني الحصول عليه مع GetString. 944 00:51:15,000 --> 00:51:19,000 ثم في الجزء السفلي هنا أنا فقط قررت تغيير 945 00:51:19,000 --> 00:51:22,000 كيف أنا طباعة هذه من وإلى استخدامها في الواقع حلقة، 946 00:51:22,000 --> 00:51:24,000 وأنا الذي الطباعة؟ 947 00:51:24,000 --> 00:51:27,000 وفقا لتعليق أنا طباعة أي شخص في ماذر، 948 00:51:27,000 --> 00:51:30,000 وهذا كل شيء حتى روب وتومي وهكذا دواليك في الواقع، تومي في ماذر. 949 00:51:30,000 --> 00:51:34,000 سيتم طباعة تومي وديفيد في هذه الحالة، ولكن كيف يعمل هذا؟ 950 00:51:34,000 --> 00:51:40,000 لم نر هذه الوظيفة من قبل، ولكن اتخاذ تخمين على ما يفعل هذا. 951 00:51:40,000 --> 00:51:42,000 يقارن السلاسل. 952 00:51:42,000 --> 00:51:45,000 >> انها قليلا غير واضحة كيف يقارن السلاسل لأنه تبين 953 00:51:45,000 --> 00:51:49,000 إذا كان هذا يعني بإرجاع 0 السلاسل متساوون. 954 00:51:49,000 --> 00:51:53,000 إذا كان بإرجاع -1 وهذا يعني أحد يأتي أبجديا قبل الآخر، 955 00:51:53,000 --> 00:51:57,000 وإذا كان هذا يعني إرجاع +1 كلمة أخرى يأتي حسب الترتيب الأبجدي 956 00:51:57,000 --> 00:52:00,000 قبل الآخر، ويمكنك البحث على الانترنت أو في صفحة رجل 957 00:52:00,000 --> 00:52:04,000 لنرى بالضبط التي هي الطريق التي، ولكن كل هذا تقوم به الآن هو قائلا انه 958 00:52:04,000 --> 00:52:09,000 إذا كان [أنا]. منزل يساوي "ماذر" 959 00:52:09,000 --> 00:52:13,000 ثم المضي قدما وذلك بطباعة وكذلك في ماذر. 960 00:52:13,000 --> 00:52:16,000 ولكن هنا شيء ونحن لم نر من قبل، وسوف نعود إلى هذا. 961 00:52:16,000 --> 00:52:21,000 لا أذكر الاضطرار إلى القيام بذلك في أي من برامج بلدي. 962 00:52:21,000 --> 00:52:24,000 مجانا يشير على ما يبدو إلى الذاكرة، وتحرير الذاكرة، 963 00:52:24,000 --> 00:52:31,000 ولكن ما أنا الذاكرة على ما يبدو في تحرير هذه الحلقة في الجزء السفلي من هذا البرنامج؟ 964 00:52:31,000 --> 00:52:34,000 يبدو أنني تحرير اسم الشخص 965 00:52:34,000 --> 00:52:37,000 ومنزل الشخص، ولكن لماذا؟ 966 00:52:37,000 --> 00:52:41,000 >> اتضح أن كل هذه الأسابيع كنت قد تم استخدام GetString 967 00:52:41,000 --> 00:52:45,000 لقد تم إدخال نوع من الخلل في كل واحد من البرامج الخاصة بك. 968 00:52:45,000 --> 00:52:51,000 GetString من الذاكرة يخصص التصميم بحيث يمكن العودة لكم سلسلة، 969 00:52:51,000 --> 00:52:55,000 يمكن مثل ديفيد، أو روب، وأنت تفعل ما تريد ثم 970 00:52:55,000 --> 00:52:59,000 مع هذه السلسلة في البرنامج لأننا محفوظة في الذاكرة بالنسبة لك. 971 00:52:59,000 --> 00:53:02,000 المشكلة هي كل هذا الوقت في كل مرة استدعاء GetString 972 00:53:02,000 --> 00:53:05,000 ونحن، من الكتاب من GetString، تم طرح نظام التشغيل 973 00:53:05,000 --> 00:53:07,000 أن يقدم لنا شيئا من ذاكرة الوصول العشوائي لهذه السلسلة. 974 00:53:07,000 --> 00:53:09,000 يقدم لنا شيئا من ذاكرة الوصول العشوائي لهذه السلسلة القادمة. 975 00:53:09,000 --> 00:53:11,000 تعطينا بعض RAM أكثر لهذه السلسلة القادمة. 976 00:53:11,000 --> 00:53:13,000 ما لك، مبرمج، لم يتم القيام 977 00:53:13,000 --> 00:53:15,000 تعطي لنا أن عودة الذاكرة، 978 00:53:15,000 --> 00:53:17,000 ذلك لعدة أسابيع هذه كافة برامج كنت قد كتبت 979 00:53:17,000 --> 00:53:20,000 وكان ما يسمى قفزة الذاكرة حيث أنها تبقي باستخدام 980 00:53:20,000 --> 00:53:24,000 الذاكرة أكثر وأكثر في كل مرة استدعاء GetString، وهذا شيء طيب. 981 00:53:24,000 --> 00:53:27,000 ونحن نفعل ذلك عن عمد في الأسابيع الأولى لأنها ليست مثيرة للاهتمام أن 982 00:53:27,000 --> 00:53:29,000 لداعي للقلق حول حيث السلسلة القادمة من. 983 00:53:29,000 --> 00:53:34,000 كل ما تريد هي الكلمة روب للعودة عندما يقوم المستخدم فيه. أنواع 984 00:53:34,000 --> 00:53:38,000 >> لكن المضي قدما لدينا الآن والبدء في الحصول على أكثر تطورا حول هذا الموضوع. 985 00:53:38,000 --> 00:53:42,000 أي وقت ونحن تخصيص ذاكرة أفضل ونحن في نهاية المطاف تسليم مرة أخرى. 986 00:53:42,000 --> 00:53:45,000 على خلاف ذلك في العالم الحقيقي على جهاز ماكنتوش أو كمبيوتر شخصي قد يكون لديك خبرة في بعض الأحيان 987 00:53:45,000 --> 00:53:50,000 حيث الأعراض الكمبيوتر يوشك على التوقف في نهاية المطاف 988 00:53:50,000 --> 00:53:54,000 أو غبي كرة الشاطئ الغزل تحتل فقط في الكمبيوتر 989 00:53:54,000 --> 00:53:56,000 يمكن الانتباه كامل ويمكنك أن تفعل الأشياء. 990 00:53:56,000 --> 00:54:00,000 ويمكن تفسير ذلك من خلال أي عدد من البق، ولكن من بين تلك الأخطاء المحتملة 991 00:54:00,000 --> 00:54:03,000 ودعا الأشياء التسرب في الذاكرة حيث أن الشخص الذي كتب قطعة من البرمجيات 992 00:54:03,000 --> 00:54:07,000 كنت تستخدم لم تذكر لتحرير الذاكرة 993 00:54:07,000 --> 00:54:10,000 أن يطلب هو أو هي نظام التشغيل ل، 994 00:54:10,000 --> 00:54:14,000 لا تستخدم GetString، لأن هذا شيء CS50، ولكن باستخدام وظائف مماثلة 995 00:54:14,000 --> 00:54:16,000 أن تطلب من نظام التشغيل للذاكرة. 996 00:54:16,000 --> 00:54:19,000 إذا كنت أنت أو كانت المسمار ويعود أبدا في الواقع أن الذاكرة 997 00:54:19,000 --> 00:54:24,000 عرض من أعراض التي يمكن أن تكون أن برنامج يبطئ ويبطئ ويبطئ 998 00:54:24,000 --> 00:54:26,000 إلا إذا كنت تذكر أن الكلمة الحرة. 999 00:54:26,000 --> 00:54:28,000 >> سوف نعود إلى متى وماذا كنت الكلمة الحرة، 1000 00:54:28,000 --> 00:54:32,000 ولكن دعونا نمضي قدما فقط لحسن التدبير وحاول تشغيل هذا البرنامج خاصة. 1001 00:54:32,000 --> 00:54:35,000 كان يسمى هذا structs1، أدخل. 1002 00:54:35,000 --> 00:54:40,000 اسمحوا لي أن تمضي قدما وتشغيل structs1، 123، ديفيد ماثر، 1003 00:54:40,000 --> 00:54:47,000 456، روب كيركلاند، 789، 1004 00:54:47,000 --> 00:54:50,000 تومي ماثر، ونحن نرى ديفيد في ماذر، تومي في ماذر. 1005 00:54:50,000 --> 00:54:53,000 هذا هو مجرد الاختيار التعقل قليلا أن البرنامج يعمل. 1006 00:54:53,000 --> 00:54:56,000 الآن، للأسف، هذا البرنامج هو محبط قليلا في هذا 1007 00:54:56,000 --> 00:55:00,000 فعلت كل هذا العمل، وأنا كتبته في 9 سلاسل مختلفة، تصل إلى تدخل، 1008 00:55:00,000 --> 00:55:04,000 وقيل الذي كان في ماذر، ولكن من الواضح كنت أعرف الذي كان في ماذر بالفعل لأنني كتابتها. 1009 00:55:04,000 --> 00:55:07,000 سيكون جميلا لو على الأقل هذا البرنامج هو أشبه قاعدة البيانات 1010 00:55:07,000 --> 00:55:10,000 ويتذكر فعلا ما كتبته في أنني 1011 00:55:10,000 --> 00:55:12,000 لذلك أنا أبدا مرة أخرى لإدخال هذه السجلات الطلابية. 1012 00:55:12,000 --> 00:55:15,000 ربما انها مثل نظام registrarial. 1013 00:55:15,000 --> 00:55:21,000 >> يمكننا القيام بذلك باستخدام هذه التقنية المعروفة باسم ملف الإدخال ملف I / O، والإخراج، 1014 00:55:21,000 --> 00:55:24,000 بصورة عامة جدا للقول في أي وقت تريده لقراءة الملفات أو كتابة الملفات 1015 00:55:24,000 --> 00:55:26,000 يمكنك القيام بذلك مع مجموعة معينة من الوظائف. 1016 00:55:26,000 --> 00:55:29,000 اسمحوا لي أن تمضي قدما وفتح هذا structs2.c سبيل المثال، 1017 00:55:29,000 --> 00:55:33,000 التي هي نفسها تقريبا، ولكن دعونا نرى ما تفعله الآن. 1018 00:55:33,000 --> 00:55:36,000 في الجزء العلوي من الملف أعلن فئة من الطلاب. 1019 00:55:36,000 --> 00:55:38,000 I تعبئة ثم الطبقة مع مدخلات المستخدم، 1020 00:55:38,000 --> 00:55:41,000 بحيث يتم بالضبط تلك الأسطر من التعليمات البرمجية مثل قبل. 1021 00:55:41,000 --> 00:55:45,000 ثم إذا كنت انزل هنا يمكنني طباعة كل من هو في مثل ماثر بشكل تعسفي من قبل، 1022 00:55:45,000 --> 00:55:47,000 ولكن هذا هو ميزة جديدة مثيرة للاهتمام. 1023 00:55:47,000 --> 00:55:51,000 هذه الأسطر من التعليمات البرمجية الجديدة، وأنها أعرض شيئا هنا، 1024 00:55:51,000 --> 00:55:55,000 FILE، كل مباراة دولية، ولها * هنا أيضا. 1025 00:55:55,000 --> 00:55:58,000 اسمحوا لي أن نقل هذا أكثر من هنا، و* أكثر من هنا أيضا. 1026 00:55:58,000 --> 00:56:00,000 >> هذه الوظيفة لم نر من قبل، الدالة fopen، 1027 00:56:00,000 --> 00:56:03,000 ولكنه يعني ملف مفتوح، لذلك دعونا المقشود من خلال هذه، 1028 00:56:03,000 --> 00:56:05,000 وهذا شيء نحن سوف نعود إليها في المستقبل psets، 1029 00:56:05,000 --> 00:56:10,000 ولكن هذا الخط أساسا هنا يفتح ملف يسمى قاعدة البيانات، 1030 00:56:10,000 --> 00:56:13,000 ويفتح ذلك تحديدا في مثل هذه الطريقة أنه يمكن أن يفعل ما عليه؟ 1031 00:56:13,000 --> 00:56:15,000 [غير مسموع والطالب] 1032 00:56:15,000 --> 00:56:19,000 الحق، لذلك "W" يعني فقط انه يقول للنظام التشغيل 1033 00:56:19,000 --> 00:56:21,000 فتح هذا الملف في مثل هذه الطريقة التي يمكنني الكتابة إليه. 1034 00:56:21,000 --> 00:56:23,000 أنا لا أريد أن تقرأها. أنا لا أريد أن مجرد إلقاء نظرة على ذلك. 1035 00:56:23,000 --> 00:56:26,000 أريد أن تغييره واضافة اشياء محتملة لذلك، 1036 00:56:26,000 --> 00:56:28,000 وملف سوف يتم استدعاؤها قاعدة البيانات. 1037 00:56:28,000 --> 00:56:30,000 يمكن أن يسمى هذا أي شيء. 1038 00:56:30,000 --> 00:56:32,000 هذا يمكن أن يكون database.txt. هذا يمكن أن يكون. ديسيبل. 1039 00:56:32,000 --> 00:56:37,000 هذا يمكن أن يكون مثل كلمة فو، ولكن اخترت تعسفا لتسمية ملف قاعدة البيانات. 1040 00:56:37,000 --> 00:56:42,000 هذا هو الاختيار التعقل قليلا أننا سوف نعود إلى بتفصيل كبير مع مرور الوقت، 1041 00:56:42,000 --> 00:56:47,000 إذا FP، لمؤشر الملف، لا تساوي NULL يعني أن كل شيء على ما يرام. 1042 00:56:47,000 --> 00:56:51,000 >> قصة قصيرة طويلة، وظائف مثل الدالة fopen تفشل أحيانا. 1043 00:56:51,000 --> 00:56:53,000 ربما الملف غير موجود. ربما كنت نفاد مساحة القرص. 1044 00:56:53,000 --> 00:56:55,000 ربما لم يكن لديك إذن لهذا المجلد، 1045 00:56:55,000 --> 00:56:58,000 إذا كان الأمر كذلك الدالة fopen ترجع فارغة حدث شيء سيء. 1046 00:56:58,000 --> 00:57:02,000 على العكس، إذا لا يرجع الدالة fopen فارغة شيء على ما يرام 1047 00:57:02,000 --> 00:57:04,000 وأستطيع أن أبدأ في الكتابة إلى هذا الملف. 1048 00:57:04,000 --> 00:57:06,000 وهنا خدعة جديدة. 1049 00:57:06,000 --> 00:57:08,000 هذه حلقة لهذا ما بالتكرار عبر كل من طلابي، 1050 00:57:08,000 --> 00:57:10,000 وهذا يبدو مشابها لذلك ما فعلناه من قبل، 1051 00:57:10,000 --> 00:57:15,000 ولكن هذه الوظيفة هو ابن عم يسمى printf fprintf لملف printf، 1052 00:57:15,000 --> 00:57:18,000 وتلاحظ انها مختلفة فقط في 2 طرق. 1053 00:57:18,000 --> 00:57:20,000 واحد، ويبدأ مع و بدلا من ف، 1054 00:57:20,000 --> 00:57:23,000 ولكن بعد ذلك حجة على ما يبدو أول ما؟ 1055 00:57:23,000 --> 00:57:25,000 [الطلاب] ملف. >> إنها الملف. 1056 00:57:25,000 --> 00:57:30,000 هذا الشيء يسمى تنظيم الأسرة، والتي سنقوم في نهاية المطاف بصرف النظر ما ندف مؤشر الملف، 1057 00:57:30,000 --> 00:57:35,000 لكن في الوقت الراهن يمثل ببساطة FP الملف بأنني فتحت، 1058 00:57:35,000 --> 00:57:41,000 حتى هنا يقول fprintf طباعة ID هذا المستخدم إلى ملف، وليس على الشاشة. 1059 00:57:41,000 --> 00:57:44,000 طباعة اسم المستخدم إلى ملف، وليس إلى الشاشة، 1060 00:57:44,000 --> 00:57:47,000 البيت إلى ملف، وليس على الشاشة، ثم إلى هنا، من الواضح، 1061 00:57:47,000 --> 00:57:50,000 إغلاق الملف، ومن ثم إلى هنا مجانا الذاكرة. 1062 00:57:50,000 --> 00:57:53,000 >> والفرق الوحيد بين هذا الإصدار 2 و الإصدار 1 1063 00:57:53,000 --> 00:57:58,000 هو إدخال الدالة fopen ومع هذا الملف * 1064 00:57:58,000 --> 00:58:01,000 وهذه الفكرة من fprintf، لذلك دعونا نرى ما النتيجة النهائية هي. 1065 00:58:01,000 --> 00:58:03,000 اسمحوا لي ان اذهب الى بلدي نافذة طرفية. 1066 00:58:03,000 --> 00:58:06,000 اسمحوا لي أن تشغيل structs2، أدخل. 1067 00:58:06,000 --> 00:58:09,000 يبدو كل شيء على ما يرام. دعونا إعادة تشغيل structs2. 1068 00:58:09,000 --> 00:58:15,000 123، ديفيد ماثر، 456، روب كيركلاند، 1069 00:58:15,000 --> 00:58:19,000 789، تومي ماثر، أدخل. 1070 00:58:19,000 --> 00:58:23,000 يبدو أنه تصرف نفسه، ولكن إذا كنت تفعل الآن ليرة سورية 1071 00:58:23,000 --> 00:58:28,000 تلاحظ ما في الملف هو هنا بين قانون بلدي كل شيء، قاعدة البيانات، 1072 00:58:28,000 --> 00:58:32,000 لذلك دعونا أن فتح، gedit من قاعدة البيانات، ونظرة على ذلك. 1073 00:58:32,000 --> 00:58:34,000 انها ليست جاذبية من تنسيقات الملفات. 1074 00:58:34,000 --> 00:58:38,000 هو حقا قطعة واحدة من خط البيانات في كل سطر في كل سطر، 1075 00:58:38,000 --> 00:58:42,000 ولكن أولئك منكم الذين يستخدمون ملفات Excel أو CSV، مفصولة بفواصل قيم، 1076 00:58:42,000 --> 00:58:47,000 يمكن بالتأكيد لقد استخدمت fprintf لربما بدلا تفعل شيئا مثل هذا 1077 00:58:47,000 --> 00:58:50,000 بحيث يمكن أن تخلق في الواقع ما يعادل ملف Excel 1078 00:58:50,000 --> 00:58:53,000 من خلال فصل الأشياء مع الفواصل، وليس مجرد خطوط جديدة. 1079 00:58:53,000 --> 00:58:56,000 >> في هذه الحالة إذا كنت قد استخدمت بدلا الفواصل بدلا من الخطوط الجديدة 1080 00:58:56,000 --> 00:59:01,000 ويمكنني أن فتح هذا الملف حرفيا قاعدة البيانات في Excel إذا أدليت به بدلا من ذلك تبدو هذه. 1081 00:59:01,000 --> 00:59:03,000 وباختصار، الآن أن لدينا القدرة على الكتابة إلى الملفات 1082 00:59:03,000 --> 00:59:07,000 يمكننا أن نبدأ الآن البيانات استمرار، والحفاظ عليها في جميع أنحاء على القرص 1083 00:59:07,000 --> 00:59:10,000 حتى نتمكن من الحفاظ على المعلومات حول مرة أخرى ومرة ​​أخرى. 1084 00:59:10,000 --> 00:59:14,000 لاحظت وجود زوجين من الأشياء الأخرى التي هي الآن أكثر قليلا مألوفة. 1085 00:59:14,000 --> 00:59:16,000 في الجزء العلوي من هذا الملف C لدينا typedef 1086 00:59:16,000 --> 00:59:21,000 لأن أردنا أن إنشاء نوع البيانات التي تمثل كلمة واحدة، 1087 00:59:21,000 --> 00:59:25,000 لذلك يسمى هذا النوع كلمة، وداخل هذا الهيكل 1088 00:59:25,000 --> 00:59:27,000 انها قليلا مربي الحيوانات الآن. 1089 00:59:27,000 --> 00:59:30,000 لماذا كلمة تتكون من صفيف على ما يبدو؟ 1090 00:59:30,000 --> 00:59:33,000 ما هي كلمة حدسي فقط؟ 1091 00:59:33,000 --> 00:59:35,000 >> انها مجموعة من الأحرف. 1092 00:59:35,000 --> 00:59:37,000 انها تتابع من الأحرف إلى العودة إلى الوراء. 1093 00:59:37,000 --> 00:59:41,000 الحروف في كل مباراة دولية يحدث أن تكون تعسفية نقول الحد الأقصى للطول 1094 00:59:41,000 --> 00:59:44,000 أي كلمة في القاموس الذي نستخدمه لالتدافع. 1095 00:59:44,000 --> 00:59:46,000 لماذا لدي +1؟ 1096 00:59:46,000 --> 00:59:48,000 الحرف فارغة. 1097 00:59:48,000 --> 00:59:51,000 أذكر عندما فعلنا المثال Bananagrams كنا بحاجة إلى قيمة خاصة 1098 00:59:51,000 --> 00:59:55,000 في نهاية الكلمة من اجل الحفاظ على المسار 1099 00:59:55,000 --> 00:59:59,000 من حيث الكلمات قد انتهى فعلا، وكما يقول مواصفات مجموعة مشكلة 1100 00:59:59,000 --> 01:00:03,000 نحن هنا ربط بكلمة إعطاء قيمة منطقية، 1101 01:00:03,000 --> 01:00:05,000 علم، إذا جاز التعبير، صحيحة أو خاطئة. 1102 01:00:05,000 --> 01:00:09,000 لقد وجدت هذه الكلمة بالفعل، لأننا ندرك 1103 01:00:09,000 --> 01:00:13,000 نحن حقا بحاجة الى وسيلة لتذكر ليس فقط ما هو في كلمة التدافع 1104 01:00:13,000 --> 01:00:15,000 ولكن ما إذا كنت، والإنسان، وقد وجدت أنه 1105 01:00:15,000 --> 01:00:20,000 بحيث إذا كنت لا تجد كلمة "في" لا يمكنك كتابة فقط، أدخل، و، أدخل، و، أدخل 1106 01:00:20,000 --> 01:00:23,000 والحصول على 3 نقاط بفارق 3 نقاط و 3 نقاط بفارق 3 نقاط. 1107 01:00:23,000 --> 01:00:26,000 نريد أن نكون قادرين على القائمة السوداء تلك الكلمة من خلال تحديد BOOL 1108 01:00:26,000 --> 01:00:29,000 إلى True إذا كنت قد وجدت بالفعل، وذلك لهذا السبب نحن 1109 01:00:29,000 --> 01:00:31,000 مغلفة في هذه البنية. 1110 01:00:31,000 --> 01:00:35,000 >> الآن، إلى هنا في هذا التدافع هناك بنية أخرى تسمى القاموس. 1111 01:00:35,000 --> 01:00:39,000 غياب هنا هي الكلمة typedef لأنه في هذه الحالة 1112 01:00:39,000 --> 01:00:43,000 نحن في حاجة لتغليف فكرة القاموس، 1113 01:00:43,000 --> 01:00:46,000 والقاموس يحتوي على مجموعة كاملة من الكلمات، 1114 01:00:46,000 --> 01:00:49,000 كما ضمنا هذه المجموعة، وكيف كثير من تلك الكلمات هي هناك 1115 01:00:49,000 --> 01:00:51,000 حسنا، أيا كان حجم هذا المتغير يسمى يقول. 1116 01:00:51,000 --> 01:00:53,000 ولكننا بحاجة فقط قاموس واحد. 1117 01:00:53,000 --> 01:00:55,000 نحن لسنا بحاجة إلى نوع البيانات يسمى القاموس. 1118 01:00:55,000 --> 01:00:58,000 نحن بحاجة فقط واحد منهم، لذلك تبين في C 1119 01:00:58,000 --> 01:01:03,000 أنه إذا كنت لا أقول typedef، كنت أقول البنية، ثم داخل الأقواس المتعرجة 1120 01:01:03,000 --> 01:01:05,000 كنت وضعت المتغيرات الخاصة بك، ثم قمت بوضع اسم. 1121 01:01:05,000 --> 01:01:09,000 هذا يعلن متغير واحد يسمى القاموس 1122 01:01:09,000 --> 01:01:11,000 يشبه هذا. 1123 01:01:11,000 --> 01:01:16,000 على النقيض من ذلك، فإن هذه الخطوط تقوم بإنشاء بنية بيانات قابلة لإعادة الاستخدام دعا كلمة 1124 01:01:16,000 --> 01:01:19,000 أن يمكنك إنشاء نسخ متعددة من، مثلما أنشأنا 1125 01:01:19,000 --> 01:01:22,000 نسخ متعددة من الطلاب. 1126 01:01:22,000 --> 01:01:24,000 >> ما معنى هذا يسمح في نهاية المطاف منا أن نفعل؟ 1127 01:01:24,000 --> 01:01:30,000 اسمحوا لي أن أعود إلى، دعنا نقول، أبسط مثال من أبسط مرات، 1128 01:01:30,000 --> 01:01:34,000 واسمحوا لي أن تفتح، دعنا نقول، compare1.c. 1129 01:01:34,000 --> 01:01:38,000 المشكلة هنا هي في متناول اليد لفي الواقع قشر العودة 1130 01:01:38,000 --> 01:01:41,000 طبقة من سلسلة والبدء في اتخاذ قبالة عجلات التدريب هذه 1131 01:01:41,000 --> 01:01:44,000 لأنه تبين أن سلسلة كل هذا الوقت 1132 01:01:44,000 --> 01:01:47,000 كما وعدنا في الحقيقة مجرد أسبوع 1 كنية، 1133 01:01:47,000 --> 01:01:51,000 مرادفا من مكتبة CS50 عن شيء التي تبدو أكثر من ذلك بقليل خفي، 1134 01:01:51,000 --> 01:01:53,000 * شار، ولقد رأينا هذا النجم من قبل. 1135 01:01:53,000 --> 01:01:55,000 رأينا ذلك في سياق الملفات. 1136 01:01:55,000 --> 01:01:59,000 >> دعونا نرى الآن لماذا كنا مختبئين هذا التفصيل لبعض الوقت الآن. 1137 01:01:59,000 --> 01:02:02,000 هنا ملف يسمى compare1.c، 1138 01:02:02,000 --> 01:02:07,000 وعلى ما يبدو ما يطلب المستخدم لمدة 2 سلاسل وقاف وراء، 1139 01:02:07,000 --> 01:02:11,000 ومن ثم فإنه يحاول مقارنة تلك السلاسل من أجل المساواة في خط 26، 1140 01:02:11,000 --> 01:02:14,000 واذا كانا لا يزالان على قدم المساواة على حد قولها، "قمت بكتابة نفس الشيء،" 1141 01:02:14,000 --> 01:02:17,000 وإذا هم ليسوا على قدم المساواة على حد قولها، "لقد كتبت أشياء مختلفة". 1142 01:02:17,000 --> 01:02:19,000 اسمحوا لي أن تمضي قدما وتشغيل هذا البرنامج. 1143 01:02:19,000 --> 01:02:23,000 اسمحوا لي ان اذهب الى بلدي الدليل المصدر، وجعل compare1. انها جمعت حسنا. 1144 01:02:23,000 --> 01:02:25,000 اسمحوا لي أن تشغيل compare1. 1145 01:02:25,000 --> 01:02:27,000 أنا تكبير، دخول. 1146 01:02:27,000 --> 01:02:29,000 أقول شيئا. مرحبا. 1147 01:02:29,000 --> 01:02:32,000 أنا أقول شيئا مرة أخرى. مرحبا. 1148 01:02:32,000 --> 01:02:34,000 أنا بالتأكيد لم اكتب أشياء مختلفة. 1149 01:02:34,000 --> 01:02:37,000 >> اسمحوا لي أن جربت هذا مرة أخرى. BYE BYE. 1150 01:02:37,000 --> 01:02:40,000 بالتأكيد ليست مختلفة، لذلك ما يحدث هنا؟ 1151 01:02:40,000 --> 01:02:44,000 حسنا، ما هو حقا يجري مقارنة في خط 26؟ 1152 01:02:44,000 --> 01:02:46,000 [غير مسموع والطالب] 1153 01:02:46,000 --> 01:02:49,000 نعم، لذلك تبين أن سلسلة، نوع البيانات، هو نوع من كذبة بيضاء. 1154 01:02:49,000 --> 01:02:53,000 سلسلة * هو حرف، ولكن ما هو شار *؟ 1155 01:02:53,000 --> 01:02:56,000 A * شار، كما يقولون، هو مؤشر، 1156 01:02:56,000 --> 01:03:00,000 والمؤشر بشكل فعال عنوان، 1157 01:03:00,000 --> 01:03:05,000 موقع مجموع في الذاكرة، وإذا كنت يحدث لديها كتبته في كلمة واحدة مثل مرحبا 1158 01:03:05,000 --> 01:03:08,000 أذكر من المناقشات السابقة من السلاسل 1159 01:03:08,000 --> 01:03:16,000 هذا هو مثل كلمة الترحيب. 1160 01:03:16,000 --> 01:03:19,000 تذكر أنه يمكن تمثيل كلمة تحب Hello 1161 01:03:19,000 --> 01:03:22,000 كصفيف من الأحرف مثل هذا 1162 01:03:22,000 --> 01:03:25,000 ثم ذو طابع خاص دعا في نهاية الحرف فارغة، 1163 01:03:25,000 --> 01:03:27,000 كما يدل \. 1164 01:03:27,000 --> 01:03:29,000 ما هو في الواقع سلسلة؟ 1165 01:03:29,000 --> 01:03:32,000 لاحظ أن هذا هو قطع متعددة من الذاكرة، 1166 01:03:32,000 --> 01:03:36,000 في واقع الأمر، لا يعرفه إلا نهاية لها بمجرد النظر من خلال السلسلة بأكملها 1167 01:03:36,000 --> 01:03:38,000 يبحث عن الحرف فارغة خاصة. 1168 01:03:38,000 --> 01:03:41,000 ولكن إذا كان هذا هو قطعة من الذاكرة من ذاكرة الكمبيوتر الخاص بي، 1169 01:03:41,000 --> 01:03:44,000 دعنا نقول أن هذه السلسلة بشكل تعسفي فقط حصلت على الحظ، 1170 01:03:44,000 --> 01:03:47,000 وحصلت على وضعها في بداية جدا من RAM جهاز الكمبيوتر الخاص بي ل. 1171 01:03:47,000 --> 01:03:54,000 هذا هو البايت 0، 1، 2، 3، 4، 5، 6 ... 1172 01:03:54,000 --> 01:04:02,000 >> عندما أقول شيء من هذا القبيل، وأنا أفعل GetString سلسلة S = GetString 1173 01:04:02,000 --> 01:04:04,000 ما يجري حقا عاد؟ 1174 01:04:04,000 --> 01:04:08,000 لهذه الأسابيع القليلة الماضية، في الحقيقة ما يجري تخزينها في ق 1175 01:04:08,000 --> 01:04:13,000 ليست هذه السلسلة في حد ذاته، ولكن في هذه الحالة هو ما يجري تخزينها 1176 01:04:13,000 --> 01:04:18,000 و0 عدد GetString لأن ما في الواقع لا 1177 01:04:18,000 --> 01:04:20,000 وذلك لا يرجع جسديا سلسلة. 1178 01:04:20,000 --> 01:04:22,000 حتى لا حقا جعل الناحية المفاهيمية. 1179 01:04:22,000 --> 01:04:24,000 ما تقوم به هو عودة عدد. 1180 01:04:24,000 --> 01:04:28,000 هذا العدد هو عنوان مرحبا في الذاكرة، 1181 01:04:28,000 --> 01:04:32,000 وسلسلة ليالي ثم، إذا كنا قشر هذه الطبقة مرة أخرى، سلسلة غير موجود حقا. 1182 01:04:32,000 --> 01:04:35,000 انها فقط التبسيط في مكتبة CS50. 1183 01:04:35,000 --> 01:04:38,000 >> هذا هو حقا ما يسمى * شار. 1184 01:04:38,000 --> 01:04:41,000 شار المنطقي لأن ما هو كلمة واحدة، مثل مرحبا؟ 1185 01:04:41,000 --> 01:04:44,000 حسنا، انها سلسلة من حرف، سلسلة من الأحرف. 1186 01:04:44,000 --> 01:04:47,000 * شار يعني عنوان حرف، 1187 01:04:47,000 --> 01:04:50,000 فماذا يعني ذلك لإرجاع سلسلة؟ 1188 01:04:50,000 --> 01:04:53,000 لطيفة، طريقة بسيطة لإرجاع سلسلة 1189 01:04:53,000 --> 01:04:57,000 هو بدلا من محاولة لمعرفة كيف أعود إلى 5 أو 6 بايت مختلفة 1190 01:04:57,000 --> 01:05:01,000 اسمحوا لي أن أعود إلى العنوان الذي بايت؟ 1191 01:05:01,000 --> 01:05:03,000 أول واحد. 1192 01:05:03,000 --> 01:05:06,000 وبعبارة أخرى، اسمحوا لي أن أقدم لكم عنوان حرف في الذاكرة. 1193 01:05:06,000 --> 01:05:10,000 هذا ما شار * يمثل، عنوان واحد حرف واحد في الذاكرة. 1194 01:05:10,000 --> 01:05:12,000 استدعاء هذا هو المتغير. 1195 01:05:12,000 --> 01:05:15,000 متجر في ليالي هذا العنوان وجه الخصوص، والتي قلت بشكل تعسفي 0، 1196 01:05:15,000 --> 01:05:19,000 فقط للحفاظ على الأشياء البسيطة، ولكن في الواقع انها عموما أكبر عدد. 1197 01:05:19,000 --> 01:05:21,000 >> انتظر لحظة. 1198 01:05:21,000 --> 01:05:23,000 إذا كنت تعطي فقط لي عنوان الحرف الأول، كيف لي أن أعرف ما هو عنوان 1199 01:05:23,000 --> 01:05:25,000 من الحرف الثاني، والثالث، والرابع والخامس؟ 1200 01:05:25,000 --> 01:05:27,000 [غير مسموع والطالب] 1201 01:05:27,000 --> 01:05:31,000 تعرف فقط حيث نهاية السلسلة من طريق هذه الحيلة في متناول يدي، 1202 01:05:31,000 --> 01:05:35,000 حتى عند استخدام شيء من هذا القبيل printf، ما يأخذ حرفيا printf وحجتها، 1203 01:05:35,000 --> 01:05:39,000 يذكر أن نستخدم هذا العنصر النائب٪ S، ومن ثم قمت بتمرير في 1204 01:05:39,000 --> 01:05:41,000 المتغير هذا ما تخزين سلسلة. 1205 01:05:41,000 --> 01:05:47,000 ما كنت حقا يمر هو عنوان الحرف الأول من هذه السلسلة. 1206 01:05:47,000 --> 01:05:50,000 Printf ثم يستخدم لحلقة أو حلقة في حين أن لدى استقباله عنوان، 1207 01:05:50,000 --> 01:05:53,000 على سبيل المثال، 0، لذلك اسمحوا لي أن تفعل هذا الآن، 1208 01:05:53,000 --> 01:06:02,000 printf ("٪ S \ N"، ق)؛ 1209 01:06:02,000 --> 01:06:07,000 عندما أعطي الكلمة printf ("٪ S \ N"، ق)؛ ما أنا حقا printf مع توفير 1210 01:06:07,000 --> 01:06:13,000 هو عنوان الحرف الأول في ليالي، وهو في هذه الحالة هو التعسفي H. 1211 01:06:13,000 --> 01:06:16,000 >> كيف أعرف بالضبط ما printf للعرض على الشاشة؟ 1212 01:06:16,000 --> 01:06:19,000 الشخص الذي نفذت تنفيذ printf حلقة الوقت أو حلقة For 1213 01:06:19,000 --> 01:06:23,000 تقول هذه الشخصية لا يساوي حرف فارغة خاصة؟ 1214 01:06:23,000 --> 01:06:25,000 إن لم يكن، طباعته. ماذا عن هذا؟ 1215 01:06:25,000 --> 01:06:28,000 إن لم يكن طباعته، طباعته، طباعته، طباعته. 1216 01:06:28,000 --> 01:06:32,000 أوه، هذا هو واحد خاصة. إيقاف الطباعة والعودة إلى المستخدم. 1217 01:06:32,000 --> 01:06:35,000 وهذا هو حرفيا كل ما كان يحدث تحت غطاء محرك السيارة، 1218 01:06:35,000 --> 01:06:38,000 وهذا هو الكثير لهضم في اليوم الأول من فئة، 1219 01:06:38,000 --> 01:06:43,000 لكن في الوقت الراهن انها حقا لبنة من كل شيء فهم 1220 01:06:43,000 --> 01:06:46,000 ما كان ذلك يدور داخل جهاز الكمبيوتر من الذاكرة لدينا، 1221 01:06:46,000 --> 01:06:49,000 وسنقوم في نهاية المطاف بصرف النظر ندف هذا مع القليل من المساعدة 1222 01:06:49,000 --> 01:06:51,000 من واحد من أصدقائنا في جامعة ستانفورد. 1223 01:06:51,000 --> 01:06:56,000 >> وقد فعلت أستاذ في جامعة ستانفورد نيك Parlante هذا التسلسل فيديو رائع 1224 01:06:56,000 --> 01:06:58,000 من جميع أنواع لغات مختلفة التي أدخلت 1225 01:06:58,000 --> 01:07:00,000 هذه الشخصية قليلا Claymation Binky. 1226 01:07:00,000 --> 01:07:03,000 صوت كنت على وشك أن نسمع فقط في معاينة التسلل الثانية قليلة 1227 01:07:03,000 --> 01:07:05,000 هو أن من الاستاذ بجامعة ستانفورد، وكنت تحصل على 1228 01:07:05,000 --> 01:07:07,000 فقط 5 أو 6 ثوان من هذا الحق الآن، 1229 01:07:07,000 --> 01:07:09,000 ولكن هذه هي مذكرة عن التي سنقوم تختتم اليوم 1230 01:07:09,000 --> 01:07:11,000 ويبدأ يوم الاربعاء. 1231 01:07:11,000 --> 01:07:15,000 أنا أعطيك المرح مع مؤشر Binky، المعاينة. 1232 01:07:15,000 --> 01:07:18,000 [♪ ♪ موسيقى] [أستاذ Parlante] مرحبا، Binky. 1233 01:07:18,000 --> 01:07:21,000 يستيقظون. حان الوقت للمتعة المؤشر. 1234 01:07:21,000 --> 01:07:24,000 [Binky] ما هذا؟ التعلم عن مؤشرات؟ 1235 01:07:24,000 --> 01:07:26,000 أوه، جودي! 1236 01:07:26,000 --> 01:07:29,000 >> سوف نرى لك يوم الاربعاء. 1237 01:07:29,000 --> 01:07:32,000 [CS50.TV]