1 00:00:00,000 --> 00:00:11,200 2 00:00:11,200 --> 00:00:12,580 >> DAVID مالان: كل الحق، نرحب مرة. 3 00:00:12,580 --> 00:00:13,290 هذا هو CS50. 4 00:00:13,290 --> 00:00:15,130 هذه هي بداية من الأسبوع السبعة. 5 00:00:15,130 --> 00:00:18,890 حتى انها كانت فترة من الوقت، لذلك اعتقد اننا كنا القيام بجولة مكوكية من حيث نحن 6 00:00:18,890 --> 00:00:20,760 توقفت وإلى أين نحن ذاهبون الآن. 7 00:00:20,760 --> 00:00:23,310 >> لذلك هذا الشيء هنا قد يكون تسبب بعض القلق في البداية. 8 00:00:23,310 --> 00:00:27,680 ولكن نأمل، كنت بدأت يتأقلم مع ما يدل على هذا هنا - 9 00:00:27,680 --> 00:00:32,670 نجمة يمثل المؤشر، الذي هو فقط ما، من حيث أكثر شخص العادي؟ 10 00:00:32,670 --> 00:00:33,400 لذلك فمن عنوان. 11 00:00:33,400 --> 00:00:35,490 >> لذلك فمن عنوان شيء ما في الذاكرة. 12 00:00:35,490 --> 00:00:38,260 وبدأنا في قشر العودة طبقات وقبل أسبوعين، وأشياء مثل 13 00:00:38,260 --> 00:00:41,800 GetString وأي وظائف أخرى كل هذا الوقت تم إرجاع 14 00:00:41,800 --> 00:00:46,010 عناوين من الأشياء في الذاكرة، مثل عنوان الحرف الأول في 15 00:00:46,010 --> 00:00:46,990 بعض التسلسل. 16 00:00:46,990 --> 00:00:50,360 >> لذلك نحن أيضا قدم valgrind، التي عليك أن تبدأ في استخدام لهذه المشكلة 17 00:00:50,360 --> 00:00:53,380 مجموعة، ولا سيما لالمقبل مشكلة تعيين كذلك. 18 00:00:53,380 --> 00:00:54,980 وvalgrind يفعل ما بالنسبة لنا؟ 19 00:00:54,980 --> 00:00:57,520 20 00:00:57,520 --> 00:01:01,020 فإنه يتحقق من وجود تسرب الذاكرة، و يتحقق أيضا لإساءة استخدام الذاكرة. 21 00:01:01,020 --> 00:01:05,890 >> يمكن ذلك، مع بعض الاحتمالات، والكشف عن حالة كود الخاص بك هو الذهاب للمس الذاكرة 22 00:01:05,890 --> 00:01:07,100 أنه ببساطة لا ينبغي. 23 00:01:07,100 --> 00:01:10,410 لذلك ليس بالضرورة أن يكون تسرب، ولكن إذا تتجاوز حدود بعض 24 00:01:10,410 --> 00:01:14,730 مجموعة، وكنت في الواقع تشغيل valgrind وحمل هذه السلوك أثناء 25 00:01:14,730 --> 00:01:17,870 يتم تشغيل valgrind في البرنامج هو تشغيل داخله، ستحصل على 26 00:01:17,870 --> 00:01:21,460 رسائل مثل هذا - "الكتابة غير صالحة لل حجم 4 "، والتي، أذكر بضعة 27 00:01:21,460 --> 00:01:25,880 قبل أسابيع من المفترض ان كان لي بطريق الخطأ مثل على كثافة واحدة بعيدا جدا 28 00:01:25,880 --> 00:01:27,250 ما وراء حدود صفيف. 29 00:01:27,250 --> 00:01:30,790 وحتى حجم 4 يعني هنا حجم من أن كثافة معينة. 30 00:01:30,790 --> 00:01:35,260 >> حتى تأخذ الطمأنينة في حقيقة أن خرج valgrind، وشكل ذلك، 31 00:01:35,260 --> 00:01:36,170 هو مجرد فظيعة. 32 00:01:36,170 --> 00:01:40,180 من الصعب حقا أن نرى من خلال الفوضى لمعلومات مثيرة للاهتمام. 33 00:01:40,180 --> 00:01:42,910 وذلك ما فعلناه هنا هو مقتطفات فقط بعض من اثنين من أكثر 34 00:01:42,910 --> 00:01:43,850 خطوط مثيرة للاهتمام. 35 00:01:43,850 --> 00:01:46,760 ولكن ندرك أن 80 في المئة من صادرات valgrind الناتج سيكون قليلا من 36 00:01:46,760 --> 00:01:47,650 الهاء. 37 00:01:47,650 --> 00:01:52,820 >> مجرد إلقاء نظرة على أنماط مثل هذه - الحق غير صالحة، غير صالحة للقراءة، 40 بايت 38 00:01:52,820 --> 00:01:56,690 وبعض عدد من كتل هي بالتأكيد فقدت، والكلمات الرئيسية من هذا القبيل. 39 00:01:56,690 --> 00:02:01,920 وسترى ما نأمل هو بعض نوع من تتبع ما يعمل 40 00:02:01,920 --> 00:02:03,340 الخطأ هو في الواقع فيها. 41 00:02:03,340 --> 00:02:07,195 في هذه الحالة هنا، في ما سطر من وكان قانون بلدي الخطأ على ما يبدو؟ 42 00:02:07,195 --> 00:02:09,729 43 00:02:09,729 --> 00:02:14,130 >> 26 في ملف يسمى memory.c، الذي كان على سبيل المثال كنا نلعب مع 44 00:02:14,130 --> 00:02:14,890 في ذلك الوقت. 45 00:02:14,890 --> 00:02:16,460 لذلك فمن المحتمل أن لا في malloc. 46 00:02:16,460 --> 00:02:18,630 ربما كان عليه في قانون بلدي بدلا من ذلك. 47 00:02:18,630 --> 00:02:20,910 لذلك سنرى هذا مرة أخرى ومرة أخرى قبل فترة طويلة. 48 00:02:20,910 --> 00:02:24,080 >> حتى scanf، وجاء هذا الأمر في حتى الآن زوجين من الأشكال. 49 00:02:24,080 --> 00:02:26,410 شاهدنا sscanf لفترة وجيزة. 50 00:02:26,410 --> 00:02:28,330 كان عليه شيء عددا من كنت اتجه الى في الخاص 51 00:02:28,330 --> 00:02:29,535 التحضير للمسابقة. 52 00:02:29,535 --> 00:02:33,130 و scanf هو في الواقع ما CS50 لقد تم استخدام المكتبة تحت 53 00:02:33,130 --> 00:02:36,560 هود لبعض الوقت من أجل للحصول على مدخلات من المستخدم. 54 00:02:36,560 --> 00:02:40,420 >> على سبيل المثال، إذا كنت تتحرك فوق إلى CS50 الأجهزة هنا، اسمحوا لي أن فتح و 55 00:02:40,420 --> 00:02:45,315 مثلا اليوم أن يسمى scanf-0.c وانها السوبر بسيطة. 56 00:02:45,315 --> 00:02:46,590 انها مجرد بضعة أسطر من التعليمات البرمجية. 57 00:02:46,590 --> 00:02:50,880 لكنه يوضح حقا كيف getInt ظلت تعمل كل هذا الوقت. 58 00:02:50,880 --> 00:02:54,710 >> في هذا البرنامج هنا، في السطر 16 ، لاحظ أن أعلن عدد صحيح. 59 00:02:54,710 --> 00:02:57,270 لذلك لا مؤشرات، لا شيء سحري هناك، مجرد كثافة العمليات. 60 00:02:57,270 --> 00:03:00,330 ثم في خط 17، وأنا مطالبة المستخدم لعدد من فضلك. 61 00:03:00,330 --> 00:03:02,930 ثم في أواخر 18، وأنا استخدم scanf هنا. 62 00:03:02,930 --> 00:03:06,910 وأنا المحدد، نوع من مثل printf، أن أتوقع اقتباس 63 00:03:06,910 --> 00:03:08,110 في المئة نهاية الاقتباس ط. 64 00:03:08,110 --> 00:03:10,920 >> لذلك أنا في المئة، بطبيعة الحال، يدل على كثافة العمليات. 65 00:03:10,920 --> 00:03:14,580 ولكن لاحظ ما ثاني حجة لscanf هو. 66 00:03:14,580 --> 00:03:17,350 كيف تصف الثاني حجة بعد الفاصلة؟ 67 00:03:17,350 --> 00:03:19,450 ما هذا؟ 68 00:03:19,450 --> 00:03:20,670 >> انها عنوان خ. 69 00:03:20,670 --> 00:03:25,490 لذلك هذا هو مفيد لمن خلال توفير scanf مع عنوان س، ما يفعله 70 00:03:25,490 --> 00:03:29,560 التي تمكن أن يعمل أن تفعل؟ 71 00:03:29,560 --> 00:03:33,010 ليس فقط الذهاب إلى هناك، ولكن أيضا أن تفعل ماذا؟ 72 00:03:33,010 --> 00:03:34,060 >> إجراء تغيير على ذلك. 73 00:03:34,060 --> 00:03:38,080 لأنه يمكنك الذهاب إلى هناك، انها نوع من مثل خريطة لموقع في الذاكرة. 74 00:03:38,080 --> 00:03:41,900 وطالما أنك توفر scanf، أو أي وظيفة مع مثل هذه الخريطة، التي 75 00:03:41,900 --> 00:03:45,840 وظيفة يمكن أن تذهب هناك، وليس فقط ننظر إلى القيمة، ولكنها يمكن أيضا 76 00:03:45,840 --> 00:03:49,670 تغيير هذه القيمة، وهو أمر مفيد إذا غرض في حياة scanf هو 77 00:03:49,670 --> 00:03:53,060 مسح مدخلات من المستخدم، وتحديدا من لوحة المفاتيح. 78 00:03:53,060 --> 00:03:57,830 وو يدل منسق، تماما مثل printf، وو ترمز الى منسق 79 00:03:57,830 --> 00:03:58,930 السلسلة التي تريد طباعتها. 80 00:03:58,930 --> 00:04:04,430 >> لذلك باختصار، هذا الخط 18 يقول ببساطة، محاولة لقراءة عدد صحيح من المستخدم 81 00:04:04,430 --> 00:04:10,420 لوحة المفاتيح وتخزينه داخل س، في أيا كان عنوان س يحدث للعيش في. 82 00:04:10,420 --> 00:04:14,860 ثم أخيرا، خط 19 يقول عادل، شكرا لكثافة العمليات، في هذه الحالة. 83 00:04:14,860 --> 00:04:15,940 >> لذلك اسمحوا لي المضي قدما وجعل هذا. 84 00:04:15,940 --> 00:04:18,570 لذا تأكد scanf 0. 85 00:04:18,570 --> 00:04:20,130 اسمحوا لي أن تمضي قدما وتكبير. 86 00:04:20,130 --> 00:04:22,960 سأذهب وتشغيل هذا مع النقاط خفض scanf 0. 87 00:04:22,960 --> 00:04:24,020 عدد، من فضلك؟ 88 00:04:24,020 --> 00:04:24,720 50. 89 00:04:24,720 --> 00:04:25,730 شكرا لل50. 90 00:04:25,730 --> 00:04:27,270 حتى انها بسيطة جدا. 91 00:04:27,270 --> 00:04:28,160 >> الآن ما لا تفعل؟ 92 00:04:28,160 --> 00:04:29,940 انها لا تفعل في مجمله مجموعة من تدقيق الأخطاء. 93 00:04:29,940 --> 00:04:33,000 على سبيل المثال، إذا كنت لا تتعاون، وأنا لا اكتب في عدد، ولكن 94 00:04:33,000 --> 00:04:37,860 بدلا من ذلك أنا أكتب شيئا مثل "مرحبا" هذا مجرد نوع غريب. 95 00:04:37,860 --> 00:04:41,130 وذلك واحد من الأشياء CS50 مكتبة كانت تقوم به بالنسبة لنا لبعض 96 00:04:41,130 --> 00:04:43,440 الوقت هو أن reprompting وreprompting. 97 00:04:43,440 --> 00:04:49,320 >> كان عبارة استدعاء إعادة المحاولة في cs50.c، وهذا هو السبب في أن getInt في 98 00:04:49,320 --> 00:04:51,670 مكتبة CS50 هو في الواقع كله مجموعة من خطوط طويلة، لأننا 99 00:04:51,670 --> 00:04:53,190 التحقق من وجود الاشياء الغبية مثل هذا. 100 00:04:53,190 --> 00:04:55,730 لم لا تعطي المستخدم لنا، في الواقع، وكثافة العمليات؟ 101 00:04:55,730 --> 00:04:57,910 وقال انه او انها تعطينا شيئا مثل رسالة الأبجدي؟ 102 00:04:57,910 --> 00:05:01,410 إذا كان الأمر كذلك، ونحن نريد للكشف عن أن والصراخ عليهم. 103 00:05:01,410 --> 00:05:03,915 >> ولكن الامور أكثر إثارة للاهتمام في هذا المثال التالي. 104 00:05:03,915 --> 00:05:09,840 اذا ذهبت الى scanf-1.C، ما هو الشيء الذي تغير جذري في 105 00:05:09,840 --> 00:05:11,135 هذا المثال التالي؟ 106 00:05:11,135 --> 00:05:13,690 107 00:05:13,690 --> 00:05:16,010 أنا باستخدام شار *، بطبيعة الحال، بدلا من كثافة العمليات. 108 00:05:16,010 --> 00:05:19,210 >> لذلك هذا هو المثير للاهتمام، لأن شار *، نذكر، هو في الحقيقة مجرد 109 00:05:19,210 --> 00:05:20,190 نفس الشيء مثل السلسلة. 110 00:05:20,190 --> 00:05:23,840 لذلك يبدو وكأنه ربما هذا هو السوبر تنفيذ بسيط من GetString. 111 00:05:23,840 --> 00:05:26,010 ولكني مقشر مرة أخرى طبقة مكتبة CS50، لذلك أنا 112 00:05:26,010 --> 00:05:27,550 استدعاء هذا تشار * الآن. 113 00:05:27,550 --> 00:05:30,070 لذلك دعونا نرى فيها، وإذا في أي مكان، أخطأنا. 114 00:05:30,070 --> 00:05:30,840 >> خط 17 - 115 00:05:30,840 --> 00:05:33,950 أنا أقول مرة أخرى، من فضلك أعطني شيئا، في هذه الحالة، سلسلة. 116 00:05:33,950 --> 00:05:37,940 ثم في السطر التالي، وأدعو scanf، مرة أخرى، ويعطيها رمز تنسيق، 117 00:05:37,940 --> 00:05:39,310 ولكن هذه المرة في المئة ق. 118 00:05:39,310 --> 00:05:41,900 ثم هذه المرة، وأنا يعطيها العازلة. 119 00:05:41,900 --> 00:05:43,550 >> الآن لاحظ، أنا لا تستخدم علامة الضم. 120 00:05:43,550 --> 00:05:47,120 ولكن لماذا هو أنه من المحتمل موافق هنا؟ 121 00:05:47,120 --> 00:05:49,760 لأن ما هو عازلة بالفعل؟ 122 00:05:49,760 --> 00:05:50,770 انها بالفعل المؤشر. 123 00:05:50,770 --> 00:05:51,650 انها بالفعل عنوان. 124 00:05:51,650 --> 00:05:54,510 >> ودعونا هذه الكلمة "الخلط"، اسمحوا لي مجرد دعوة ليالي، على سبيل المثال، ل 125 00:05:54,510 --> 00:05:55,050 البساطة. 126 00:05:55,050 --> 00:05:58,250 ولكني يطلق عليه العازلة لأنه في عموما، في مجال البرمجة، إذا كان لديك 127 00:05:58,250 --> 00:06:02,130 جزء من الذاكرة، والذي سلسلة حقا فقط هو، قد نسميها العازلة. 128 00:06:02,130 --> 00:06:04,460 انها مكان لتخزين المعلومات. 129 00:06:04,460 --> 00:06:07,400 >> مماثلة لأشياء مثل يوتيوب، عندما انهم التخزين المؤقت، إذا جاز التعبير، التي 130 00:06:07,400 --> 00:06:10,270 يعني فقط انها تحميله بت من الإنترنت وتخزينها في 131 00:06:10,270 --> 00:06:14,160 مجموعة المحلية، جزءا من الذاكرة المحلية حتى يمكنك مشاهدته في وقت لاحق دون 132 00:06:14,160 --> 00:06:16,830 ذلك تخطي أو معلقة على كنت حين لعب مرة أخرى. 133 00:06:16,830 --> 00:06:20,930 >> ولذلك لا يوجد مشكلة هنا الرغم من ذلك، لأن أنا أقول scanf، ونتوقع 134 00:06:20,930 --> 00:06:22,320 سلسلة من المستخدم. 135 00:06:22,320 --> 00:06:24,410 وهنا عنوان قطعة من الذاكرة. 136 00:06:24,410 --> 00:06:26,180 وضعت هذه السلسلة هناك. 137 00:06:26,180 --> 00:06:31,230 لماذا هو أن تعطي المربوطة لنا المتاعب، على الرغم من؟ 138 00:06:31,230 --> 00:06:33,490 >> ما هذا؟ 139 00:06:33,490 --> 00:06:35,510 أنا سمحت بالحصول ذلك الجزء من الذاكرة؟ 140 00:06:35,510 --> 00:06:36,250 كما تعلمون، أنا لا أعرف. 141 00:06:36,250 --> 00:06:39,210 لأنه قد تم تهيئة العازلة إلى أي شيء؟ 142 00:06:39,210 --> 00:06:39,820 لا حقا. 143 00:06:39,820 --> 00:06:43,090 وذلك ما كنا الدعوة قيمة القمامة، والتي 144 00:06:43,090 --> 00:06:44,040 ليست كلمة رسمية. 145 00:06:44,040 --> 00:06:49,200 بل يعني فقط ليس لدينا أي فكرة عما بت في الداخل من وحدات البايت الأربعة التي 146 00:06:49,200 --> 00:06:51,240 لقد خصصت كما العازلة. 147 00:06:51,240 --> 00:06:52,450 >> أنا لم تسمى malloc. 148 00:06:52,450 --> 00:06:53,940 لقد بالتأكيد لا يسمى GetString. 149 00:06:53,940 --> 00:06:56,380 لذلك من يدري ما هو في الواقع داخل المخزن؟ 150 00:06:56,380 --> 00:07:00,550 وبعد إخبار scanf عمياء، الذهاب إلى هناك ووضع كل ما كتبته المستخدم. 151 00:07:00,550 --> 00:07:04,460 >> فما هو السبب المرجح ل في التعليمات البرمجية لدينا إذا نحن تشغيله؟ 152 00:07:04,460 --> 00:07:05,700 ربما سوف segfault. 153 00:07:05,700 --> 00:07:07,970 ربما لا، ولكن ربما سوف segfault. 154 00:07:07,970 --> 00:07:10,620 وأنا أقول ربما لأن في بعض الأحيان لا كنت تفعل، وأحيانا 155 00:07:10,620 --> 00:07:11,380 كنت لا تحصل على سوف segfault. 156 00:07:11,380 --> 00:07:14,280 في بعض الأحيان كنت مجرد الحصول على محظوظ، ولكن انها مع ذلك ستكون 157 00:07:14,280 --> 00:07:15,340 خطأ في برنامجنا. 158 00:07:15,340 --> 00:07:17,060 >> لذلك اسمحوا لي المضي قدما وتجميع هذه. 159 00:07:17,060 --> 00:07:18,280 انا ذاهب للقيام بذلك الطريق المدرسة القديمة. 160 00:07:18,280 --> 00:07:23,825 اندفاعة رنة حتى 0، scanf-1، scanf-1.C، أدخل. 161 00:07:23,825 --> 00:07:24,720 عفوا، المدرسة القديمة جدا. 162 00:07:24,720 --> 00:07:26,550 دعونا نرى. 163 00:07:26,550 --> 00:07:28,440 حيث لم يذهب؟ 164 00:07:28,440 --> 00:07:29,700 أوه، تشار * العازلة. 165 00:07:29,700 --> 00:07:33,595 166 00:07:33,595 --> 00:07:35,130 أوه، شكرا لك - 167 00:07:35,130 --> 00:07:36,930 حفظ، موافق - 168 00:07:36,930 --> 00:07:37,690 المدرسة القديمة جدا. 169 00:07:37,690 --> 00:07:38,900 كل الحق، انها كانت فترة من الوقت. 170 00:07:38,900 --> 00:07:41,720 >> حتى لقد حفظته للتو الملف بعد جعل هذا مؤقتة 171 00:07:41,720 --> 00:07:42,700 تغيير منذ لحظة. 172 00:07:42,700 --> 00:07:46,090 والآن لقد جمعت عليه يدويا مع ضجيج. 173 00:07:46,090 --> 00:07:49,500 والآن انا ذاهب الى المضي قدما وتشغيل scanf-1، أدخل. 174 00:07:49,500 --> 00:07:50,290 سلسلة من فضلك. 175 00:07:50,290 --> 00:07:51,600 سوف اكتب في "مرحبا." 176 00:07:51,600 --> 00:07:54,070 >> والآن، وهنا حيث، بصراحة، printf يمكن هو مزعج قليلا. 177 00:07:54,070 --> 00:07:56,020 انها ليست في طريقها فعلا ل سوف segfault في هذه الحالة. 178 00:07:56,020 --> 00:07:59,860 Printf هو خاص قليلا لأن انها تستخدم عادة حتى السوبر التي 179 00:07:59,860 --> 00:08:03,570 تقوم أساسا printf لنا صالح وتحقيق، 180 00:08:03,570 --> 00:08:04,830 هذا ليس مؤشر صالحة. 181 00:08:04,830 --> 00:08:09,080 اسمحوا لي أن أغتنم على نفسي لمجرد الطباعة في الأقواس فارغة، حتى 182 00:08:09,080 --> 00:08:13,340 على الرغم من انها ليست بالضرورة ما نحن أنفسنا المتوقع. 183 00:08:13,340 --> 00:08:16,940 >> لذلك نحن لا يمكن أن تحدث بسهولة حقا سوف segfault مع هذا، ولكن من الواضح أن هذا 184 00:08:16,940 --> 00:08:18,600 ليس سلوك أردت. 185 00:08:18,600 --> 00:08:19,800 فما هو الحل بسيط؟ 186 00:08:19,800 --> 00:08:25,650 حسنا، في scanf-2، اسمحوا لي أن أقترح أن بدلا من الواقع مجرد تخصيص 187 00:08:25,650 --> 00:08:30,100 * شار، اسمحوا لي أن أكون أكثر ذكاء قليلا عن هذا، واسمحوا لي أن تخصيص عازلة 188 00:08:30,100 --> 00:08:32,940 كما تتابع من 16 حرف. 189 00:08:32,940 --> 00:08:34,200 >> لذلك أستطيع أن أفعل ذلك في عدة طرق. 190 00:08:34,200 --> 00:08:35,610 ويمكنني أن استخدام malloc على الاطلاق. 191 00:08:35,610 --> 00:08:38,980 ولكن يمكنني أن أعود إلى أسبوعين عندما أنا فقط بحاجة في مجمله مجموعة من 192 00:08:38,980 --> 00:08:39,620 حرفا. 193 00:08:39,620 --> 00:08:40,860 هذا مجرد صفيف. 194 00:08:40,860 --> 00:08:44,870 لذلك اسمحوا لي بدلا تعريف العازلة أن تكون مجموعة من 16 حرفا. 195 00:08:44,870 --> 00:08:47,340 >> والآن، عندما أمرر عازلة في - 196 00:08:47,340 --> 00:08:49,940 وهذا شيء لم نكن الحديث عنها في أسبوعين - 197 00:08:49,940 --> 00:08:53,730 ولكن هل يمكن علاج مجموعة كما على الرغم من انها عنوان. 198 00:08:53,730 --> 00:08:56,390 من الناحية الفنية، كما رأينا، وانهم مختلفة قليلا. 199 00:08:56,390 --> 00:09:01,290 ولكن سوف scanf لا تمانع إذا كنت تمر عليه اسم صفيف، لأن ما 200 00:09:01,290 --> 00:09:05,030 سوف رنة تفعل بالنسبة لنا هي في جوهرها علاج اسم ذلك مجموعة باسم 201 00:09:05,030 --> 00:09:08,280 عنوان قطعة من 16 بايت. 202 00:09:08,280 --> 00:09:09,550 >> لذلك هذا هو أفضل. 203 00:09:09,550 --> 00:09:12,110 وهذا يعني الآن أستطيع أن نأمل القيام بما يلي. 204 00:09:12,110 --> 00:09:16,800 اسمحوا لي التصغير للحظة و لا تجعل scanf-2، وقد تم تجميعها موافق. 205 00:09:16,800 --> 00:09:19,390 الآن اسمحوا لي أن لا حصلت مائل scanf-2. 206 00:09:19,390 --> 00:09:22,430 سلسلة من فضلك. "مرحبا". و وبدا أن تنجح هذه المرة. 207 00:09:22,430 --> 00:09:26,020 >> ولكن يمكن للشخص أن يقترح سيناريو التي قد لا تزال تعمل؟ 208 00:09:26,020 --> 00:09:28,550 نعم؟ 209 00:09:28,550 --> 00:09:30,640 شيء أطول من 16 حرفا. 210 00:09:30,640 --> 00:09:32,020 وفعلا، ونحن يمكن أن يكون أكثر من ذلك بقليل دقيقة. 211 00:09:32,020 --> 00:09:36,540 شيء أطول ثم 15 حرفا، لأن حقا نحن بحاجة إلى أن نضع في اعتبارنا 212 00:09:36,540 --> 00:09:39,920 أننا بحاجة أن الصفر مائل ضمنا في نهاية السلسلة، 213 00:09:39,920 --> 00:09:42,950 وهو scanf جانبا وعادة رعاية بالنسبة لنا. 214 00:09:42,950 --> 00:09:46,210 >> لذلك اسمحوا لي أن تفعل شيئا من هذا القبيل - 215 00:09:46,210 --> 00:09:48,040 أحيانا ما في وسعنا فقط ترك الأمر من هذا القبيل. 216 00:09:48,040 --> 00:09:50,630 موافق، لذلك قمنا بفعل الآن خطأ تجزئة لدينا. 217 00:09:50,630 --> 00:09:51,000 لماذا؟ 218 00:09:51,000 --> 00:09:54,940 لأنني كتبته إلى أكثر من 15 أحرف، وهكذا قمنا فعلا 219 00:09:54,940 --> 00:09:58,280 الذاكرة لمست أنني فعلا لا ينبغي أن يكون. 220 00:09:58,280 --> 00:10:00,180 >> فما هو الحل حقا هنا؟ 221 00:10:00,180 --> 00:10:02,210 حسنا، ما إذا كنا بحاجة إلى سلسلة أطول؟ 222 00:10:02,210 --> 00:10:03,960 حسنا، نحن ربما تجعل من 32 بايت. 223 00:10:03,960 --> 00:10:05,160 حسنا، ما إذا كان هذا لا يكفي طويلة؟ 224 00:10:05,160 --> 00:10:06,040 ماذا عن 64 بايت؟ 225 00:10:06,040 --> 00:10:07,080 ما إذا كان هذا لا يكفي طويلة؟ 226 00:10:07,080 --> 00:10:09,640 ماذا عن 128 أو 200 بايت؟ 227 00:10:09,640 --> 00:10:12,660 ما هو حقا الحل هنا في الحالة العامة، إذا كنا لا نعرف في 228 00:10:12,660 --> 00:10:14,460 تقدم ما يحدث للمستخدم اكتب؟ 229 00:10:14,460 --> 00:10:20,000 230 00:10:20,000 --> 00:10:23,050 >> انها مجرد نوع من الألم كبيرا في الحمار، أن نكون صادقين، وهذا هو السبب في 231 00:10:23,050 --> 00:10:29,050 مكتبة CS50 لديه بضع عشرات من خطوط التعليمات البرمجية التي تنفذ بشكل جماعي 232 00:10:29,050 --> 00:10:32,390 GetString سلسلة بطريقة لم نفعل يجب أن تعرف مسبقا ما 233 00:10:32,390 --> 00:10:33,430 المستخدم هو الذهاب الى الكتابة. 234 00:10:33,430 --> 00:10:37,370 على وجه الخصوص، إذا كنت ننظر إلى الوراء في cs50.c من قبل اسبوعين، سترى 235 00:10:37,370 --> 00:10:40,480 أن الواقع لا GetString عدم استخدام scanf في هذا السبيل. 236 00:10:40,480 --> 00:10:43,720 بدلا من ذلك، فإنه يقرأ حرف واحد في وقت واحد. 237 00:10:43,720 --> 00:10:46,010 >> لأن شيء واحد لطيفة عن قراءة حرف واحد هو في وسعنا 238 00:10:46,010 --> 00:10:48,490 تضمن أنفسنا دائما لديها حرف واحد على الأقل. 239 00:10:48,490 --> 00:10:51,740 يمكنني فقط أن يعلن شار، ومن ثم اتخاذ هذه خطوات طفل حقا فقط 240 00:10:51,740 --> 00:10:54,380 قراءة حرف واحد في في الوقت من لوحة المفاتيح. 241 00:10:54,380 --> 00:10:58,240 ثم، ماذا سترى GetString هل هو كل الوقت الذي نفدت، 242 00:10:58,240 --> 00:11:02,280 مثلا، 16 بايت من الذاكرة، فإنه يستخدم malloc، أو ابن عم له، ل 243 00:11:02,280 --> 00:11:06,810 تخصيص المزيد من الذاكرة، نسخ القديمة الذاكرة في الجديدة، ثم الزحف 244 00:11:06,810 --> 00:11:09,900 جنبا إلى جنب، والحصول على حرف واحد في وقت واحد، وعندما نفدت أن 245 00:11:09,900 --> 00:11:13,370 جزء من الذاكرة، ويلقي بها بعيدا، العناوين الرئيسية للصحف قسما أكبر من الذاكرة، النسخ القديمة 246 00:11:13,370 --> 00:11:14,750 في جديدة، ويكرر. 247 00:11:14,750 --> 00:11:18,480 وانها حقا الألم إلى الواقع تنفيذ شيء بسيط مثل 248 00:11:18,480 --> 00:11:19,710 الحصول على مدخلات من المستخدم. 249 00:11:19,710 --> 00:11:21,090 >> بحيث يمكنك استخدام scanf. 250 00:11:21,090 --> 00:11:22,430 يمكنك استخدام وظائف أخرى مماثلة. 251 00:11:22,430 --> 00:11:25,420 والكثير من الكتب وعلى شبكة الإنترنت أمثلة القيام به، لكنهم جميعا 252 00:11:25,420 --> 00:11:27,210 عرضة للمشاكل من هذا القبيل. 253 00:11:27,210 --> 00:11:29,550 وفي نهاية المطاف، والحصول على سوف segfault هو نوع من مزعج. 254 00:11:29,550 --> 00:11:30,680 انها ليست جيدة للمستخدم. 255 00:11:30,680 --> 00:11:33,560 >> ولكن في أسوأ الحالات، ما يفعله انها وضعت في الأساس الخاص 256 00:11:33,560 --> 00:11:37,160 كود في خطر؟ 257 00:11:37,160 --> 00:11:39,250 نوع من الهجوم المحتمل. 258 00:11:39,250 --> 00:11:41,680 تحدثنا عن واحد مثل هذا الهجوم - تفيض المكدس. 259 00:11:41,680 --> 00:11:44,660 ولكن بصفة عامة، إذا كنت سمحت ل تجاوز منطقة عازلة، كما فعلنا ل 260 00:11:44,660 --> 00:11:48,070 قبل بضعة أسابيع، مع مجرد كتابة أكثر من "مرحبا" على المكدس، ل 261 00:11:48,070 --> 00:11:52,330 يمكن أن يستغرق أكثر من الواقع، وربما، و الكمبيوتر، أو على الأقل الحصول على البيانات التي 262 00:11:52,330 --> 00:11:53,510 لا ينتمي لك. 263 00:11:53,510 --> 00:11:55,970 >> لذلك باختصار، وهذا هو السبب لدينا تلك العجلات التدريب. 264 00:11:55,970 --> 00:11:59,090 ولكن الآن، ونحن نبدأ في اتخاذ أجبرتها على الفرار، كما برامجنا لم تعد تحتاج إليها، 265 00:11:59,090 --> 00:12:00,610 بالضرورة، ومدخلات من المستخدم. 266 00:12:00,610 --> 00:12:03,960 ولكن في حالة وجود مشكلة تعيين ستة، سوف تأتي من المدخلات الخاصة بك ضخمة 267 00:12:03,960 --> 00:12:07,520 ملف القاموس مع بعض 150 الغريب ألف كلمة. 268 00:12:07,520 --> 00:12:10,330 >> لذلك سوف لا يكون لديك ما يدعو للقلق مدخلات التعسفي للمستخدم. 269 00:12:10,330 --> 00:12:13,720 وسنقدم لكم بعض الافتراضات حول هذا الملف. 270 00:12:13,720 --> 00:12:20,340 أي أسئلة حول مؤشرات أو scanf أو إدخال المستخدم بشكل عام؟ 271 00:12:20,340 --> 00:12:24,450 >> كل الحق، لذلك نظرة سريعة ثم في واحد زائدة الموضوع من قبل اسبوعين. 272 00:12:24,450 --> 00:12:28,590 وكان هذا مفهوم البنية. 273 00:12:28,590 --> 00:12:34,180 ليس ذلك - وهذا مفهوم البنية، والذي كان ماذا؟ 274 00:12:34,180 --> 00:12:35,430 ماذا تفعل البنية بالنسبة لنا؟ 275 00:12:35,430 --> 00:12:39,280 276 00:12:39,280 --> 00:12:39,860 >> تعريف - 277 00:12:39,860 --> 00:12:41,710 آسف؟ 278 00:12:41,710 --> 00:12:42,820 تعريف نوع المتغير. 279 00:12:42,820 --> 00:12:44,410 ذلك النوع. 280 00:12:44,410 --> 00:12:46,180 نحن الجمع بين موضوعين في الواقع. 281 00:12:46,180 --> 00:12:49,510 حتى مع الرموز المميزة ل typedef، أذكر ما في وسعنا تعلن نوع من منطقتنا، مثل 282 00:12:49,510 --> 00:12:51,500 مرادف، مثل سلسلة لشار *. 283 00:12:51,500 --> 00:12:56,200 ولكن باستخدام الرموز المميزة ل typedef والبنية، في وسعنا خلق حقا هياكل البيانات الخاصة بنا. 284 00:12:56,200 --> 00:12:59,600 >> على سبيل المثال، إذا أعود إلى gedit هنا لمجرد لحظة، وأنا المضي قدما 285 00:12:59,600 --> 00:13:08,230 وتفعل شيئا مثل، اسمحوا لي حفظ هذا الحال، دعنا نقول، structs.c 286 00:13:08,230 --> 00:13:10,840 مؤقتا، سأقوم المضي قدما، وتشمل 287 00:13:10,840 --> 00:13:14,360 standardio.h، باطلة الرئيسي كثافة العمليات. 288 00:13:14,360 --> 00:13:18,960 ثم هنا، لنفترض أنني أريد لكتابة برنامج يخزن 289 00:13:18,960 --> 00:13:21,840 طلاب متعددة من عدة المنازل، على سبيل المثال. 290 00:13:21,840 --> 00:13:24,430 لذلك فمن مثل registrarial قاعدة بيانات من نوع ما. 291 00:13:24,430 --> 00:13:29,550 >> حتى لو كنت في حاجة إلى اسم طالب واحد، وأنا قد تفعل شيئا مثل شار * الاسم، 292 00:13:29,550 --> 00:13:31,570 وسأفعل شيئا مثل - 293 00:13:31,570 --> 00:13:34,410 في الواقع، دعونا استخدام المكتبة CS50 لمجرد لحظة لجعل هذه 294 00:13:34,410 --> 00:13:38,380 أبسط قليلا، حتى نتمكن من الاقتراض تلك العشرات من الأسطر من التعليمات البرمجية. 295 00:13:38,380 --> 00:13:39,340 ودعونا فقط يبقيه بسيط. 296 00:13:39,340 --> 00:13:42,610 سنقوم يبقيه سلسلة، وGetString الآن. 297 00:13:42,610 --> 00:13:47,420 >> لذلك يدعون أنا الآن بعد أن كنت تخزين اسم بعض الطلاب، وبيت 298 00:13:47,420 --> 00:13:50,240 بعض الطلاب، ومجرد استخدام المتغيرات وكما فعلنا في أسبوع واحد. 299 00:13:50,240 --> 00:13:52,370 ولكن لنفترض الآن أنا أريد أن دعم الطلاب متعددة. 300 00:13:52,370 --> 00:13:58,460 كل الحق، لذلك موهبتي هي أن تفعل سلسلة NAME2، يحصل GetString، سلسلة 301 00:13:58,460 --> 00:14:01,370 house2 يحصل GetString. 302 00:14:01,370 --> 00:14:05,850 ثم طالب ثالث دينا، دعونا نفعل NAME3 GetString. 303 00:14:05,850 --> 00:14:09,170 >> كل الحق، لذلك هذا هو المأمول ضرب لكم ونوع من الغباء، 304 00:14:09,170 --> 00:14:11,580 لأن هذه العملية هي حقا أبدا الذهاب الى النهاية، وانها مجرد الذهاب الى 305 00:14:11,580 --> 00:14:13,130 جعل قانون بلدي تبدو أسوأ وأسوأ وأسوأ. 306 00:14:13,130 --> 00:14:14,810 لكننا حلها هذا أيضا في أسبوعين. 307 00:14:14,810 --> 00:14:19,450 ما كان لدينا حل نظيفة نسبيا عندما كان لدينا متغيرات متعددة من 308 00:14:19,450 --> 00:14:23,580 نفس نوع البيانات التي ترتبط كل شيء، ولكن لأننا لا نريد هذه الفوضى الفظيعة 309 00:14:23,580 --> 00:14:26,870 من اسمه بالمثل المتغيرات؟ 310 00:14:26,870 --> 00:14:30,060 ماذا نفعل بدلا من ذلك؟ 311 00:14:30,060 --> 00:14:31,260 >> لذلك أعتقد أنني سمعت عدد قليل من الأماكن. 312 00:14:31,260 --> 00:14:32,590 كان لدينا مجموعة. 313 00:14:32,590 --> 00:14:37,110 إذا كنت تريد مثيلات متعددة من شيء، لماذا لا نقوم بتنظيف كل هذا 314 00:14:37,110 --> 00:14:39,540 ونقول فقط، أعطني مجموعة تدعى أسماء؟ 315 00:14:39,540 --> 00:14:41,640 >> والآن، دعونا رمز القرص الثابت 3. 316 00:14:41,640 --> 00:14:44,450 ثم تعطيني مجموعة أخرى دعا المنازل، واسمحوا لي ل 317 00:14:44,450 --> 00:14:45,800 الآن رمز القرص الثابت 3. 318 00:14:45,800 --> 00:14:49,220 ولقد تنظيفها على نطاق واسع حتى الفوضى التي أنا خلقت للتو. 319 00:14:49,220 --> 00:14:52,400 الآن، لقد زال الثابت ترميز 3، ولكن حتى 3 يمكن أن تأتي حيوي من 320 00:14:52,400 --> 00:14:54,350 المستخدم، أو ARGV، أو ما شابه ذلك. 321 00:14:54,350 --> 00:14:55,720 لذلك هذا هو أنظف بالفعل. 322 00:14:55,720 --> 00:15:00,100 >> ولكن ما هو مزعج في هذا هو أن الآن، على الرغم من أن الاسم هو بطريقة أو بأخرى 323 00:15:00,100 --> 00:15:02,280 ترتبط جوهريا ل بيت الطالب - 324 00:15:02,280 --> 00:15:04,720 انها طالبة أنني حقا تريد أن تمثل - 325 00:15:04,720 --> 00:15:08,080 لدي الآن اثنين من المصفوفات التي هي موازية بمعنى انهم ل 326 00:15:08,080 --> 00:15:13,930 قوس نفس الحجم، وأسماء 0 خرائط يفترض أن المنازل قوس 0، 327 00:15:13,930 --> 00:15:16,600 وأسماء القوس 1 الخرائط إلى المنازل قوس 1. 328 00:15:16,600 --> 00:15:19,280 وبعبارة أخرى، يعيش الطالب في ذلك البيت، والتي طالب آخر 329 00:15:19,280 --> 00:15:20,530 يعيش في ذلك المنزل الأخرى. 330 00:15:20,530 --> 00:15:23,720 ولكن من المؤكد أن هذا يمكن أن يكون القيام به حتى أكثر نظافة. 331 00:15:23,720 --> 00:15:24,990 >> كذلك، فإنه يمكن، في الواقع. 332 00:15:24,990 --> 00:15:28,730 واسمحوا لي أن تمضي قدما وفتح حتى structs.h، وعليك 333 00:15:28,730 --> 00:15:31,130 نرى هذه الفكرة هنا. 334 00:15:31,130 --> 00:15:34,905 تلاحظ أن كنت تستخدم الرموز المميزة ل typedef، كما كنت ألمح إلى قبل لحظة لتعلن لدينا 335 00:15:34,905 --> 00:15:35,570 نوع البيانات الخاصة. 336 00:15:35,570 --> 00:15:39,660 ولكن أنا أيضا باستخدام هذه الكلمة الرئيسية الأخرى دعا البنية التي يعطيني جديدة 337 00:15:39,660 --> 00:15:40,790 هيكل البيانات. 338 00:15:40,790 --> 00:15:43,980 >> وهذا الهيكل بيانات أزعم يجري لدينا اثنين من الأشياء داخل 339 00:15:43,980 --> 00:15:47,060 ذلك - سلسلة يسمى الاسم، و ودعا سلسلة المنزل. 340 00:15:47,060 --> 00:15:49,820 واسم انا ذاهب لإعطاء هذا الهيكل بيانات يجري 341 00:15:49,820 --> 00:15:51,005 ليتم استدعاؤها الطالب. 342 00:15:51,005 --> 00:15:54,030 أنا يمكن أن نسميها أي شيء أريد، ولكن هذا جعل لغويا 343 00:15:54,030 --> 00:15:55,810 الشعور لي في ذهني. 344 00:15:55,810 --> 00:15:59,160 >> وحتى الآن، وإذا كنت تفتح نسخة أفضل البرنامج بدأت الكتابة 345 00:15:59,160 --> 00:16:00,390 هناك، اسمحوا لي أن انتقل إلى الأعلى. 346 00:16:00,390 --> 00:16:03,190 وهناك بعض أكثر الأسطر من التعليمات البرمجية هنا، ولكن اسمحوا لي أن أركز ل 347 00:16:03,190 --> 00:16:04,160 لحظة على واحد. 348 00:16:04,160 --> 00:16:07,790 لقد أعلن ثابت دعا الطلاب والثابت ترميز 3 في الوقت الراهن. 349 00:16:07,790 --> 00:16:11,110 ولكن الآن، لاحظ كيف نظيفة قانون بلدي يبدأ في الحصول عليها. 350 00:16:11,110 --> 00:16:15,030 >> في السطر 22، أعلن مجموعة من الطلاب. 351 00:16:15,030 --> 00:16:18,760 وتلاحظ أن الطالب هو على ما يبدو الآن نوع البيانات. 352 00:16:18,760 --> 00:16:23,360 لأنه في الجزء العلوي من هذا الملف، لاحظ لقد تضمنت أن ملف الرأس 353 00:16:23,360 --> 00:16:24,820 انني انسحب قبل لحظة فقط. 354 00:16:24,820 --> 00:16:28,820 وأن ملف الرأس تماما كان ببساطة هذا التعريف للطالب. 355 00:16:28,820 --> 00:16:32,470 >> حتى الآن، لقد خلق بلدي البيانات المخصصة الخاصة اكتب أن واضعي C سنوات 356 00:16:32,470 --> 00:16:33,890 قبل لا يعتقد من قبل. 357 00:16:33,890 --> 00:16:34,570 ولكن لا توجد مشكلة. 358 00:16:34,570 --> 00:16:35,870 أنا يمكن أن تجعل من نفسي. 359 00:16:35,870 --> 00:16:39,050 لذلك هذا هو مجموعة تسمى الطلاب، كل من أعضائها 360 00:16:39,050 --> 00:16:41,100 هو بنية الطالب. 361 00:16:41,100 --> 00:16:44,270 وأريد ثلاثة من تلك في صفيف. 362 00:16:44,270 --> 00:16:46,030 >> والآن، ماذا يفعل بقية هذا البرنامج تفعل؟ 363 00:16:46,030 --> 00:16:47,550 أنا بحاجة لشيء التعسفي قليلا. 364 00:16:47,550 --> 00:16:51,450 حتى من على الانترنت 24 فصاعدا، أنا تكرار 0-3. 365 00:16:51,450 --> 00:16:54,000 أنا ثم يطلب من المستخدم ل اسم الطالب. 366 00:16:54,000 --> 00:16:56,110 وبعد ذلك استخدام GetString كما كان من قبل. 367 00:16:56,110 --> 00:16:59,410 ثم أطلب منزل الطالب، ويمكنني استخدام GetString كما كان من قبل. 368 00:16:59,410 --> 00:17:01,780 >> ولكن لاحظ - جديدة طفيف قطعة من جملة - 369 00:17:01,780 --> 00:17:07,010 استطيع يزال مؤشر للطالب ط عشر، ولكن كيف يمكنني الحصول على بيانات محددة 370 00:17:07,010 --> 00:17:08,354 الحقل داخل البنية؟ 371 00:17:08,354 --> 00:17:11,770 كذلك، ما هو على ما يبدو قطعة جديدة من جملة؟ 372 00:17:11,770 --> 00:17:13,339 انها مجرد المشغل نقطة. 373 00:17:13,339 --> 00:17:14,510 >> لم نشهد حقا هذا من قبل. 374 00:17:14,510 --> 00:17:17,819 كنت قد رأيت ذلك في خمسة pset إذا كنت قد ارتمى في بالفعل مع ملفات الصور النقطية. 375 00:17:17,819 --> 00:17:22,372 ولكن النقطة يعني فقط داخل هذا مجالات البنية أو متعددة، وإعطاء نقطة 376 00:17:22,372 --> 00:17:24,510 اسم، أو تعطيني بيت دوت. 377 00:17:24,510 --> 00:17:28,690 وهذا يعني ذهاب داخل البنية والحصول على تلك حقول معينة. 378 00:17:28,690 --> 00:17:30,200 >> ماذا بقية هذا البرنامج تفعل؟ 379 00:17:30,200 --> 00:17:31,190 انها ليست كل ما مثير. 380 00:17:31,190 --> 00:17:34,640 أنا لاحظت أن تكرار 0-3 مرة أخرى، وأنا ببساطة خلق الانجليزية 381 00:17:34,640 --> 00:17:40,500 عبارة مثل فلان وفلان في كذا و مثل هذا المنزل، ويمر في اسم نقطة من 382 00:17:40,500 --> 00:17:43,320 الطالب ط عشر والتي المنزل كذلك. 383 00:17:43,320 --> 00:17:47,560 >> ثم أخيرا، ونحن الآن سوف تبدأ في الحصول على الشرج حول هذا الموضوع، الآن أننا 384 00:17:47,560 --> 00:17:49,580 على دراية بما malloc و وكانت وظائف أخرى 385 00:17:49,580 --> 00:17:50,570 تفعل كل هذا الوقت. 386 00:17:50,570 --> 00:17:54,220 لماذا لدي لتحرير كل من الاسم والمنزل، على الرغم من أنني 387 00:17:54,220 --> 00:17:56,960 لم يدع malloc؟ 388 00:17:56,960 --> 00:17:58,020 >> لم GetString. 389 00:17:58,020 --> 00:18:00,930 وهذا هو السر الصغير القذر ل عدة أسابيع، ولكن لديها GetString 390 00:18:00,930 --> 00:18:03,530 تم تسريب الذاكرة في جميع أنحاء وضع كل فصل دراسي حتى الآن. 391 00:18:03,530 --> 00:18:05,990 وسوف valgrand أخيرا تكشف هذه بالنسبة لنا. 392 00:18:05,990 --> 00:18:10,730 >> ولكنها ليست مشكلة كبيرة، لأنني أعرف أستطيع أن مجرد تحرير اسم 393 00:18:10,730 --> 00:18:15,750 والمنزل، على الرغم من الناحية الفنية، ل أن السوبر، السوبر آمنة، وأرجو أن 394 00:18:15,750 --> 00:18:17,890 القيام ببعض تدقيق الأخطاء هنا. 395 00:18:17,890 --> 00:18:19,040 ما هي الغرائز الخاص أقول لك؟ 396 00:18:19,040 --> 00:18:22,480 ما ينبغي أن يكون التحقق من وجود قبل أن تحرير ما هو 397 00:18:22,480 --> 00:18:25,470 سلسلة، الملقب التي شار *؟ 398 00:18:25,470 --> 00:18:33,460 >> وأرجو أن يكون حقا التحقق إذا كان الطلاب قوس ط دوت اسم لا 399 00:18:33,460 --> 00:18:34,840 فارغة متساوية. 400 00:18:34,840 --> 00:18:40,400 ثم انها سوف تكون موافق على المضي قدما وحرة هذا المؤشر، ونفس أو أخرى 401 00:18:40,400 --> 00:18:41,160 واحد كذلك. 402 00:18:41,160 --> 00:18:46,860 إذا كان الطلاب قوس ط دوت البيت ليس يساوي فارغة، وهذا سوف يحمي الآن 403 00:18:46,860 --> 00:18:52,520 ضد حالة الزاوية التي GetString يعود شيء من هذا القبيل فارغة. 404 00:18:52,520 --> 00:18:57,310 وشاهدنا لحظة مضت، printf الإرادة حماية لنا هنا من قبل مجرد القول 405 00:18:57,310 --> 00:18:58,990 لاغية، والتي سوف تبدو غريبة. 406 00:18:58,990 --> 00:19:02,340 ولكن على الأقل فإنه لن سوف segfault، كما رأينا. 407 00:19:02,340 --> 00:19:05,990 >> حسنا، اسمحوا لي أن تفعل الشيء الآخر هنا. البنيات-0 هو نوع من برنامج غبي 408 00:19:05,990 --> 00:19:09,700 لأنني تدخل جميع هذه البيانات، ومن ثم انها فقدت بمجرد انتهاء البرنامج. 409 00:19:09,700 --> 00:19:10,940 ولكن اسمحوا لي أن نمضي قدما ونفعل ذلك. 410 00:19:10,940 --> 00:19:12,830 اسمحوا لي أن المحطة نافذة أكبر قليلا. 411 00:19:12,830 --> 00:19:17,000 اسمحوا لي أن البنيات-1، والذي هو نسخة جديدة من هذا. 412 00:19:17,000 --> 00:19:18,520 >> أنا تكبير قليلا. 413 00:19:18,520 --> 00:19:21,620 والآن اسمحوا لي أن تشغيل نقطة مائل البنيات-1. 414 00:19:21,620 --> 00:19:22,590 اسم الطالب - 415 00:19:22,590 --> 00:19:31,500 ديفيد ماذر، دعونا نفعل روب كيركلاند، دعونا نفعل لورين يفيريت. 416 00:19:31,500 --> 00:19:33,650 ما هو مثير للاهتمام الآن هو إشعار - 417 00:19:33,650 --> 00:19:35,540 وأنا أعرف هذا فقط لأن كتبت البرنامج - 418 00:19:35,540 --> 00:19:38,930 هناك ملف الآن في بلدي الحالي دليل يسمى students.csv. 419 00:19:38,930 --> 00:19:40,420 قد شهدت بعض منكم هذه في العالم الحقيقي. 420 00:19:40,420 --> 00:19:42,980 >> ما هو ملف CSV؟ 421 00:19:42,980 --> 00:19:44,170 قيم مفصولة بفواصل. 422 00:19:44,170 --> 00:19:46,670 انها نوع من مثل الرجل الفقير نسخة من ملف Excel. 423 00:19:46,670 --> 00:19:50,580 انها الجدول الصفوف والأعمدة التي يمكنك فتح في برنامج مثل إكسل، 424 00:19:50,580 --> 00:19:51,800 أو أرقام على نظام التشغيل Mac. 425 00:19:51,800 --> 00:19:55,180 >> وإذا قمت بفتح هذا الملف هنا على gedit، لاحظت - والأرقام ليست هناك. 426 00:19:55,180 --> 00:19:57,360 وهذا قول gedit فقط لي خط الأعداد. 427 00:19:57,360 --> 00:19:59,740 تلاحظ في السطر الأول من هذا الملف هو ديفيد وماثر. 428 00:19:59,740 --> 00:20:01,450 السطر التالي هو روب فاصلة كيركلاند. 429 00:20:01,450 --> 00:20:04,170 والخط الثالث هو لورين فاصلة يفيريت. 430 00:20:04,170 --> 00:20:05,480 >> ذلك ما أنا خلقت؟ 431 00:20:05,480 --> 00:20:09,580 لقد كتبت الآن برنامج C التي على نحو فعال يمكن أن تولد جداول البيانات 432 00:20:09,580 --> 00:20:11,840 التي يمكن فتحها في برنامج مثل إكسل. 433 00:20:11,840 --> 00:20:15,520 ليس كل ما مقنعة مجموعة من البيانات، ولكن إذا كان لديك قطع أكبر بكثير من 434 00:20:15,520 --> 00:20:18,440 البيانات التي تريد فعلا ل التلاعب وجعل الرسوم البيانية من و 435 00:20:18,440 --> 00:20:21,260 مثل، وهذا ربما يكون واحدا وسيلة لخلق تلك البيانات. 436 00:20:21,260 --> 00:20:25,370 علاوة على ذلك، ملفات CSV هي في الواقع مشتركة عظمى فقط لتخزين البيانات بسيطة - 437 00:20:25,370 --> 00:20:28,940 ياهو المالية، على سبيل المثال، إذا كنت تحصل أسعار الأسهم عن طريق ما يسمى ب 438 00:20:28,940 --> 00:20:33,180 API، وخدمة مجانية تسمح لك الحصول على المخزون الحالي يصل إلى التاريخ، 439 00:20:33,180 --> 00:20:35,650 يقتبس للشركات، فإنها إعطاء الظهر البيانات في 440 00:20:35,650 --> 00:20:37,800 تنسيق CSV السوبر بسيطة. 441 00:20:37,800 --> 00:20:39,380 >> فكيف فعلنا ذلك؟ 442 00:20:39,380 --> 00:20:42,530 كذلك لاحظت أن معظم هذا البرنامج تقريبا نفس. 443 00:20:42,530 --> 00:20:46,870 ولكن لاحظ أسفل هنا، بدلا من الطباعة الطلاب بها، على خط 35 444 00:20:46,870 --> 00:20:51,040 فصاعدا، أزعم أنني إنقاذ الطلاب إلى القرص، لذلك حفظ ملف. 445 00:20:51,040 --> 00:20:53,630 >> حتى إشعار أنا اعلان FILE * - 446 00:20:53,630 --> 00:20:57,260 الآن، وهذا هو نوع من الشذوذ في C. لأي سبب من الأسباب، FILE هو كل القبعات، و 447 00:20:57,260 --> 00:21:00,690 التي ليست مثل معظم أنواع البيانات الأخرى في C. ولكن هذا هو المدمج في 448 00:21:00,690 --> 00:21:02,320 نوع البيانات، FILE *. 449 00:21:02,320 --> 00:21:05,900 وأنا معلنا مؤشر إلى ملف، هو كيف يمكن ان يخطر لك ذلك. 450 00:21:05,900 --> 00:21:08,070 >> الدالة fopen يعني فتح الملف. 451 00:21:08,070 --> 00:21:09,470 ما الملف الذي تريد فتح؟ 452 00:21:09,470 --> 00:21:12,620 أريد أن أفتح ملف أنني سوف استدعاء تعسفي students.csv. 453 00:21:12,620 --> 00:21:14,480 أنا يمكن أن نسمي ذلك أي شيء أريد. 454 00:21:14,480 --> 00:21:15,200 >> ومن ثم اتخاذ تخمين. 455 00:21:15,200 --> 00:21:18,960 ماذا الوسيطة الثانية لFOPEN ربما يعني؟ 456 00:21:18,960 --> 00:21:21,480 الحق، ث للكتابة، يمكن ص تكون للقراءة. 457 00:21:21,480 --> 00:21:24,120 هناك لالإلحاقي إذا كنت تريد إضافة صفوف ويست 458 00:21:24,120 --> 00:21:25,200 الكتابة فوق كل شيء. 459 00:21:25,200 --> 00:21:28,005 >> ولكن أريد فقط أن إنشاء هذا الملف مرة واحدة، ولذا فإنني سوف تستخدم قوسي الإقتباس ث. 460 00:21:28,005 --> 00:21:31,880 وأنا أعلم أن فقط من بعد قراءة وثائق، أو صفحة الرجل. 461 00:21:31,880 --> 00:21:35,100 إذا لم يكن الملف فارغة - وبعبارة أخرى، إذا كان أي شيء ذهب على نحو خاطئ هناك - 462 00:21:35,100 --> 00:21:37,820 اسمحوا لي تكرار عبر الطلاب 0-3. 463 00:21:37,820 --> 00:21:40,410 >> والآن لاحظ هناك شيء أي وقت مضى حتى قليلا مختلفة 464 00:21:40,410 --> 00:21:42,110 حول خط 41 هنا. 465 00:21:42,110 --> 00:21:42,960 انها ليست printf. 466 00:21:42,960 --> 00:21:46,530 انها fprintf لملف printf. 467 00:21:46,530 --> 00:21:47,790 حتى انها تسير الكتابة إلى ملف. 468 00:21:47,790 --> 00:21:48,860 أي ملف؟ 469 00:21:48,860 --> 00:21:53,630 واحد الذي تحدده المؤشر كما الوسيطة الأولى. 470 00:21:53,630 --> 00:21:55,940 >> ثم نقوم بتحديد سلسلة تنسيق. 471 00:21:55,940 --> 00:21:59,660 ثم نقوم بتحديد ما نريد أن سلسلة سد العجز في المئة للأول، و 472 00:21:59,660 --> 00:22:04,320 ثم متغير آخر أو ق في المئة الثانية. 473 00:22:04,320 --> 00:22:06,760 ثم نغلق الملف مع fclose. 474 00:22:06,760 --> 00:22:09,380 مما كنت تحرير الذاكرة كما كان من قبل، على الرغم من أود أن أعود في وإضافة 475 00:22:09,380 --> 00:22:10,540 بعض الشيكات لاغية. 476 00:22:10,540 --> 00:22:12,090 >> وهذا كل شيء. 477 00:22:12,090 --> 00:22:16,960 الدالة fopen، fprintf، fclose يعطيني القدرة على إنشاء الملفات النصية. 478 00:22:16,960 --> 00:22:19,640 الآن، سترى في مشكلة تعيين خمسة، الذي ينطوي على الصور، فسوف يكون باستخدام 479 00:22:19,640 --> 00:22:20,990 الملفات الثنائية بدلا من ذلك. 480 00:22:20,990 --> 00:22:24,200 ولكن في الأساس، والفكرة هي نفسها، على الرغم من أن وظائف عليك 481 00:22:24,200 --> 00:22:28,710 تراها هي مختلفة قليلا. 482 00:22:28,710 --> 00:22:32,580 >> جولة مكوكية لذلك، ولكن سوف تحصل مألوفة جدا مع ملف I/O-- 483 00:22:32,580 --> 00:22:34,960 المدخلات والمخرجات - مع pset الخمسة. 484 00:22:34,960 --> 00:22:38,607 وأي أسئلة حول أساسيات الأولية هنا؟ 485 00:22:38,607 --> 00:22:39,857 نعم؟ 486 00:22:39,857 --> 00:22:41,880 487 00:22:41,880 --> 00:22:43,710 >> ماذا لو كنت في محاولة لتحرير قيمة فارغة؟ 488 00:22:43,710 --> 00:22:48,880 أعتقد، إلا إذا حصلت الحرة أكثر قليلا سهلة الاستعمال، يمكنك 489 00:22:48,880 --> 00:22:49,890 يحتمل سوف segfault. 490 00:22:49,890 --> 00:22:54,160 فمررها فارغة سيئة لأنني لا ويعتقد يزعج الحرة للتحقق بالنسبة لك، 491 00:22:54,160 --> 00:22:57,330 لأنه يحتمل أن يكون مضيعة من الوقت من أجل أن تفعل نفسها ل 492 00:22:57,330 --> 00:22:59,022 كل شخص في العالم. 493 00:22:59,022 --> 00:23:00,590 سؤال جيد، وإن كان. 494 00:23:00,590 --> 00:23:04,300 >> كل الحق، لذلك هذا النوع من يحصل بنا إلى موضوع مثير للاهتمام. 495 00:23:04,300 --> 00:23:07,010 موضوع المشكلة تعيين خمسة هو الطب الشرعي. 496 00:23:07,010 --> 00:23:08,420 هذا جزء على الأقل المشكلة تعيين. 497 00:23:08,420 --> 00:23:12,030 الطب الشرعي عموما يشير إلى الانتعاش من المعلومات التي قد تكون أو 498 00:23:12,030 --> 00:23:14,110 قد لا يكون تم حذفه عمدا. 499 00:23:14,110 --> 00:23:18,680 وهكذا اعتقدت تعطيك سريعة تذوق ما يحدث في الواقع كل 500 00:23:18,680 --> 00:23:21,230 هذه المرة تحت غطاء محرك السيارة من جهاز الكمبيوتر الخاص بك. 501 00:23:21,230 --> 00:23:23,960 >> على سبيل المثال، إذا كان لديك داخل الخاص كمبيوتر محمول أو كمبيوتر سطح المكتب 502 00:23:23,960 --> 00:23:28,040 القرص الصلب، انها إما الميكانيكية الجهاز الذي يدور في الواقع - 503 00:23:28,040 --> 00:23:31,650 هناك أشياء دائرية تسمى صحون التي تبدو تماما مثل ما أنا 504 00:23:31,650 --> 00:23:34,540 وكان للتو على الشاشة هنا، على الرغم من هذا هو المدرسة القديمة على نحو متزايد. 505 00:23:34,540 --> 00:23:37,370 هذا هو ونصف بوصة ثلاث سنوات القرص الصلب. 506 00:23:37,370 --> 00:23:40,070 ويشير ثلاثة ونصف بوصة من مع من الشيء عند تثبيته 507 00:23:40,070 --> 00:23:40,890 في جهاز الكمبيوتر. 508 00:23:40,890 --> 00:23:44,890 >> العديد منكم الرجال في أجهزة الكمبيوتر المحمولة الخاصة بك الآن لديك محركات الأقراص الصلبة للدولة، أو سواقات الأقراص الصلبة الجامدة، 509 00:23:44,890 --> 00:23:46,260 التي ليس لها أجزاء متحركة. 510 00:23:46,260 --> 00:23:49,170 انهم أكثر مثل ذاكرة الوصول العشوائي وأقل مثل هذه الأجهزة الميكانيكية. 511 00:23:49,170 --> 00:23:51,450 ولكن الأفكار لا تزال هي نفسها، بالتأكيد من حيث صلتها 512 00:23:51,450 --> 00:23:52,790 مشكلة تعيين خمسة. 513 00:23:52,790 --> 00:23:57,400 >> وإذا كنت تفكر في الآن القرص الصلب يمثل كونه دائرة، والتي 514 00:23:57,400 --> 00:23:58,930 أنا أوجه مثل هذا هنا. 515 00:23:58,930 --> 00:24:02,290 عند إنشاء ملف على جهاز الكمبيوتر الخاص بك، سواء كان ذلك في SSD، أو في 516 00:24:02,290 --> 00:24:06,610 هذه الحالة، قرص صلب المدرسة القديمة، ويتألف هذا الملف بت متعددة. 517 00:24:06,610 --> 00:24:10,510 دعنا نقول أنه من هذا 0 و 1، في مجمله مجموعة من 1S و 0s. 518 00:24:10,510 --> 00:24:11,660 لذلك هذا هو بلدي القرص الصلب بأكمله. 519 00:24:11,660 --> 00:24:13,225 هذا هو على ما يبدو ملف كبير جدا. 520 00:24:13,225 --> 00:24:18,080 وأنه يستخدم حتى و 0s 1S في أن جزء من طبق المادية. 521 00:24:18,080 --> 00:24:19,750 >> حسنا، ما هو ذلك الجزء المادي؟ 522 00:24:19,750 --> 00:24:25,310 كذلك، اتضح أن على القرص الصلب، على الأقل من هذا النوع، وهناك 523 00:24:25,310 --> 00:24:27,340 هذه الجسيمات المغناطيسية الصغير للغاية. 524 00:24:27,340 --> 00:24:32,630 ولديهم أساسا الشمال و أقطاب الجنوب لهم، بحيث إذا كان ل 525 00:24:32,630 --> 00:24:35,710 تحويل واحدة من تلك الجسيمات المغناطيسية بهذه الطريقة، يمكنك القول أنه من 526 00:24:35,710 --> 00:24:36,720 وهو ما يمثل 1. 527 00:24:36,720 --> 00:24:39,340 واذا كان رأسا على عقب الجنوب ل الشمال، قد يقول أنه 528 00:24:39,340 --> 00:24:40,390 يمثل 0. 529 00:24:40,390 --> 00:24:43,660 >> حتى في العالم المادي الحقيقي، وهذا كيف يمكن أن تمثل شيئا في 530 00:24:43,660 --> 00:24:45,670 الدولة الثنائية من 0 و 1. 531 00:24:45,670 --> 00:24:46,720 بحيث كل ملف هو. 532 00:24:46,720 --> 00:24:49,300 هناك مجموعة كاملة من المغناطيسية الجزيئات التي هي على هذا النحو أو 533 00:24:49,300 --> 00:24:51,920 بهذه الطريقة، وأنماط خلق و 0s 1S. 534 00:24:51,920 --> 00:24:56,760 >> ولكن تبين عند حفظ ملف، يتم حفظ بعض المعلومات بشكل منفصل. 535 00:24:56,760 --> 00:25:00,000 لذلك هذا هو جدول قليلا، دليل، إذا جاز التعبير. 536 00:25:00,000 --> 00:25:05,810 وسوف نطلق على هذا اسم العمود، و سأتصل هذا الموقع العمود. 537 00:25:05,810 --> 00:25:08,850 >> وانا ذاهب الى القول، افترض هذا هو سيرتي الذاتية. 538 00:25:08,850 --> 00:25:14,050 يتم تخزين بلدي resume.doc في موقع، دعنا نقول 123. 539 00:25:14,050 --> 00:25:15,390 أنا دائما أذهب لهذا العدد. 540 00:25:15,390 --> 00:25:18,810 ولكن يكفي أن نقول أن مثل في ذاكرة الوصول العشوائي، يمكنك أن تأخذ القرص الصلب 541 00:25:18,810 --> 00:25:22,350 هذا هو غيغابايت أو 200 غيغابايت أو تيرابايت، ويمكنك 542 00:25:22,350 --> 00:25:23,750 عددهم كل بايت. 543 00:25:23,750 --> 00:25:26,480 يمكنك ترقيم جميع أجزاء من 8 بت. 544 00:25:26,480 --> 00:25:29,030 >> ولذا فإننا سوف أقول إن هذا هو موقع 123. 545 00:25:29,030 --> 00:25:32,070 لذلك هذا الدليل داخل التشغيل الخاص بي يتذكر النظام أن بلدي 546 00:25:32,070 --> 00:25:34,250 السيرة الذاتية هي في موقع 123. 547 00:25:34,250 --> 00:25:36,850 ولكنه يحصل على اهتمام عندما قمت بحذف الملف. 548 00:25:36,850 --> 00:25:37,820 >> لذلك على سبيل المثال - 549 00:25:37,820 --> 00:25:40,790 والحمد لله، ومعظم دول العالم لديها القبض على هذا - ما يحدث عندما 550 00:25:40,790 --> 00:25:45,040 قمت بسحب الملف إلى جهاز Mac OS المهملات أو ويندوز الخاص بك سلة المهملات؟ 551 00:25:45,040 --> 00:25:48,290 552 00:25:48,290 --> 00:25:50,510 ما هو الغرض من ذلك؟ 553 00:25:50,510 --> 00:25:53,860 فمن الواضح للتخلص من الملف، ولكن ماذا يفعل فعل سحب و 554 00:25:53,860 --> 00:25:57,550 اسقاط في سلة المهملات أو الخاص بك سلة المحذوفات القيام به على جهاز كمبيوتر؟ 555 00:25:57,550 --> 00:25:59,230 >> لا شيء على الإطلاق، حقا. 556 00:25:59,230 --> 00:26:00,320 انها مجرد مثل مجلد. 557 00:26:00,320 --> 00:26:01,800 انها مجلد خاص، للتأكد. 558 00:26:01,800 --> 00:26:04,460 لكن هل فعلا حذف الملف؟ 559 00:26:04,460 --> 00:26:06,780 >> حسنا، لا، وذلك لأن البعض منكم ربما وكانت مثل، يا لعنة، أنت لم 560 00:26:06,780 --> 00:26:07,420 يعني للقيام بذلك. 561 00:26:07,420 --> 00:26:09,130 لذلك يمكنك النقر المزدوج على القمامة أو سلة المهملات. 562 00:26:09,130 --> 00:26:11,630 كنت قد مطعون حول وكنت قد تعافى الملف فقط عن طريق سحبه 563 00:26:11,630 --> 00:26:12,110 من هناك. 564 00:26:12,110 --> 00:26:14,420 بوضوح، انها ليست بالضرورة حذفها. 565 00:26:14,420 --> 00:26:15,990 >> موافق، أنت أذكى من ذلك. 566 00:26:15,990 --> 00:26:18,860 أنت تعرف أن مجرد سحبه إلى القمامة أو سلة المهملات لا يعني 567 00:26:18,860 --> 00:26:19,930 كنت إفراغ سلة المهملات. 568 00:26:19,930 --> 00:26:24,110 لذلك تذهب إلى القائمة، وكنت أقول فارغة المهملات أو إفراغ سلة المحذوفات. 569 00:26:24,110 --> 00:26:25,360 ثم ماذا يحدث؟ 570 00:26:25,360 --> 00:26:29,070 571 00:26:29,070 --> 00:26:32,530 >> نعم، حتى يتم حذفه أكثر من ذلك. 572 00:26:32,530 --> 00:26:37,660 ولكن كل ما يحدث هو هذا. 573 00:26:37,660 --> 00:26:45,350 الكمبيوتر ينسى حيث كان resume.doc. 574 00:26:45,350 --> 00:26:47,400 >> ولكن ما لم يتغير على ما يبدو في الصورة؟ 575 00:26:47,400 --> 00:26:51,390 576 00:26:51,390 --> 00:26:55,570 البتات، و1S و 0s أن أزعم هي في الموقع من بعض الجوانب المادية لل 577 00:26:55,570 --> 00:26:56,280 الأجهزة. 578 00:26:56,280 --> 00:26:57,110 انهم ما زالوا هناك. 579 00:26:57,110 --> 00:26:58,930 انها مجرد جهاز الكمبيوتر لديه نسيت ما هي عليه. 580 00:26:58,930 --> 00:27:03,160 >> حتى انها حررت أساسا للملف بت بحيث يمكن إعادة استخدامها. 581 00:27:03,160 --> 00:27:06,940 ولكن ليس حتى إنشاء المزيد من الملفات، والمزيد من الملفات، والمزيد من الملفات سوف 582 00:27:06,940 --> 00:27:12,150 احتماليا، تلك و 0s 1S، و تلك الجسيمات المغناطيسية، والحصول على استخدامها، 583 00:27:12,150 --> 00:27:16,220 رأسا على عقب أو الجانب الأيمن الأعلى، ل ملفات أخرى، و 0s 1S. 584 00:27:16,220 --> 00:27:17,980 >> بحيث يكون لديك هذه النافذة من الزمن. 585 00:27:17,980 --> 00:27:19,860 وانها ليست من يمكن التنبؤ بها طول، حقا. 586 00:27:19,860 --> 00:27:22,240 ذلك يعتمد على حجم الثابت وكيف تدفع العديد من الملفات لديك و 587 00:27:22,240 --> 00:27:23,490 مدى السرعة التي جعل جديدة. 588 00:27:23,490 --> 00:27:27,050 ولكن هناك هذا الإطار من الوقت خلال هذا الملف الذي لا يزال تماما 589 00:27:27,050 --> 00:27:27,770 استردادها. 590 00:27:27,770 --> 00:27:31,050 >> لذلك إذا كنت من أي وقت مضى استخدام برامج مثل مكافي أو نورتون لمحاولة استعادة 591 00:27:31,050 --> 00:27:35,680 البيانات، كل ما يفعلونه هو محاولة ل استعادة هذا ما يسمى الدليل إلى 592 00:27:35,680 --> 00:27:37,340 معرفة أين كان الملف الخاص بك. 593 00:27:37,340 --> 00:27:40,605 وأحيانا سوف نورتون ويقول: الملف هو 93٪ للاسترداد. 594 00:27:40,605 --> 00:27:42,020 حسنا، ماذا يعني ذلك؟ 595 00:27:42,020 --> 00:27:45,690 هذا يعني فقط أن بعض الملفات الأخرى انتهت قبيل الصدفة حتى باستخدام، مثلا، 596 00:27:45,690 --> 00:27:48,920 هذه البتات من الملف الأصلي. 597 00:27:48,920 --> 00:27:51,950 >> فما هو في الواقع تشارك في استعادة البيانات؟ 598 00:27:51,950 --> 00:27:55,720 حسنا، إذا لم يكن لديك شيء من هذا القبيل نورتون مثبتة مسبقا على جهاز الكمبيوتر الخاص بك، 599 00:27:55,720 --> 00:27:59,510 أفضل ما يمكنك فعله هو أن ننظر في بعض الأحيان في القرص الثابت بأكمله يبحث عن 600 00:27:59,510 --> 00:28:00,510 أنماط من البتات. 601 00:28:00,510 --> 00:28:05,350 وأحد الموضوعات من مشكلة تعيين خمسة هو أنك لن تستطيع البحث في 602 00:28:05,350 --> 00:28:09,570 يعادل القرص الصلب، والطب الشرعي صورة من بطاقة فلاش مدمج من 603 00:28:09,570 --> 00:28:13,660 كاميرا رقمية، والبحث عن 0S و1S التي عادة، مع ارتفاع 604 00:28:13,660 --> 00:28:16,720 احتمال، وتمثل بدء من صورة JPEG. 605 00:28:16,720 --> 00:28:21,120 >> ويمكن يا رفاق استعادة تلك الصور من قبل على افتراض، إذا رأيت هذا النمط من 606 00:28:21,120 --> 00:28:24,380 بت على الصورة الشرعي، مع احتمال كبير، أن علامات 607 00:28:24,380 --> 00:28:25,650 بداية JPEG. 608 00:28:25,650 --> 00:28:29,520 وإذا رأيت نفس النمط مرة أخرى، التي ربما يصادف بداية 609 00:28:29,520 --> 00:28:32,440 JPEG آخر، وآخر JPEG، و JPEG آخر. 610 00:28:32,440 --> 00:28:34,970 وهذا هو عادة كيف سوف استعادة البيانات العمل. 611 00:28:34,970 --> 00:28:37,870 ما هو لطيف حول ملفات JPEG هو على الرغم من تنسيق الملف نفسه هو إلى حد ما 612 00:28:37,870 --> 00:28:44,400 معقدة، بداية من كل هذه الملف هو في الواقع التعرف إلى حد ما 613 00:28:44,400 --> 00:28:47,370 وبسيطة، كما سترون، إذا كنت قد بالفعل لا. 614 00:28:47,370 --> 00:28:50,270 >> لذلك دعونا نلقي نظرة فاحصة تحت غطاء محرك السيارة فيما يتعلق بالضبط ما كان 615 00:28:50,270 --> 00:28:53,360 يجري، وما هذه 1S و 0s هي، لتعطيك أكثر قليلا من 616 00:28:53,360 --> 00:28:55,330 سياق هذا التحدي بالذات. 617 00:28:55,330 --> 00:28:55,510 >> [تشغيل الفيديو] 618 00:28:55,510 --> 00:28:58,700 >> أين مخازن جهاز الكمبيوتر الخاص بك أكثر البيانات الدائمة. 619 00:28:58,700 --> 00:29:03,390 للقيام بذلك، ويسافر البيانات من ذاكرة الوصول العشوائي جنبا إلى جنب مع إشارات البرامج والتي تخبر 620 00:29:03,390 --> 00:29:06,110 القرص الصلب كيفية تخزين تلك البيانات. 621 00:29:06,110 --> 00:29:09,410 دارات القرص الصلب ترجمة تلك الإشارات إلى الجهد 622 00:29:09,410 --> 00:29:10,870 تقلبات. 623 00:29:10,870 --> 00:29:14,970 هذه، بدورها، والسيطرة على محرك الأقراص الصلبة أجزاء متحركة، وبعض من قليل 624 00:29:14,970 --> 00:29:17,910 الأجزاء المتحركة اليسار في الكمبيوتر الحديثة. 625 00:29:17,910 --> 00:29:22,130 >> بعض إشارات التحكم في المحرك الذي يدور صحون المغلفة المعادن. 626 00:29:22,130 --> 00:29:25,470 يتم تخزين البيانات الخاصة بك في الواقع على هذه صحون. 627 00:29:25,470 --> 00:29:28,610 إشارات أخرى نقل القراءة / الكتابة رؤساء لقراءة أو 628 00:29:28,610 --> 00:29:30,710 كتابة البيانات على صحون. 629 00:29:30,710 --> 00:29:35,450 هذه الآلات الدقيقة بحيث الإنسان الشعر لا يمكن أن تمر حتى بين 630 00:29:35,450 --> 00:29:37,280 رؤساء وصحون الغزل. 631 00:29:37,280 --> 00:29:40,316 بعد، كل ذلك يعمل بسرعة رائعة. 632 00:29:40,316 --> 00:29:40,660 >> [END تشغيل الفيديو] 633 00:29:40,660 --> 00:29:42,190 >> DAVID مالان: التكبير قليلا أعمق الآن على ما هو 634 00:29:42,190 --> 00:29:44,360 في الواقع على تلك صحون. 635 00:29:44,360 --> 00:29:44,720 >> [تشغيل الفيديو] 636 00:29:44,720 --> 00:29:47,660 >> دعنا ننظر إلى ما نحن فقط ورأى في حركة بطيئة. 637 00:29:47,660 --> 00:29:51,710 عندما نبضة قصيرة من الكهرباء إرسالها إلى رأس القراءة / الكتابة، إذا تقلب 638 00:29:51,710 --> 00:29:54,650 على الصغير الكهرومغناطيسية ل جزء من الثانية. 639 00:29:54,650 --> 00:29:58,970 المغناطيس بإنشاء حقل، والذي تغيير القطبية من صغيرة، صغيرة 640 00:29:58,970 --> 00:30:02,850 جزء من الجزيئات المعدنية التي معطف كل سطح طبق. 641 00:30:02,850 --> 00:30:05,940 >> سلسلة نمط هذه صغيرة، المناطق المشحونة المتابعة على القرص 642 00:30:05,940 --> 00:30:08,470 يمثل بت واحد من البيانات في رقم ثنائي 643 00:30:08,470 --> 00:30:10,530 النظام المستخدم من قبل أجهزة الكمبيوتر. 644 00:30:10,530 --> 00:30:13,775 الآن، إذا تم إرسال الحالية في اتجاه واحد من خلال رأس القراءة / الكتابة، ومنطقة 645 00:30:13,775 --> 00:30:15,970 هو الاستقطاب في اتجاه واحد. 646 00:30:15,970 --> 00:30:17,950 إذا تم إرسال الراهنة في الاتجاه المعاكس، و 647 00:30:17,950 --> 00:30:19,930 يتم عكس الاستقطاب. 648 00:30:19,930 --> 00:30:22,370 >> كيف تحصل على البيانات من القرص الصلب؟ 649 00:30:22,370 --> 00:30:24,090 فقط عكس العملية. 650 00:30:24,090 --> 00:30:26,550 لذلك فمن الجسيمات على القرص التي تحصل على التيار في 651 00:30:26,550 --> 00:30:27,960 قراءة / الكتابة رئيس الحركة. 652 00:30:27,960 --> 00:30:30,700 وضعت معا الملايين من هذه شرائح ممغنطة، و 653 00:30:30,700 --> 00:30:32,160 كنت قد حصلت على الملف. 654 00:30:32,160 --> 00:30:36,060 >> الآن، قد قطعة من ملف واحد تكون مبعثرة في جميع أنحاء حملة ل 655 00:30:36,060 --> 00:30:39,970 صحون، وكأنه نوع من الفوضى الأوراق على مكتبك. 656 00:30:39,970 --> 00:30:43,500 حتى ملف اضافية خاصة بتتبع من حيث كل شيء. 657 00:30:43,500 --> 00:30:45,985 لا كنت ترغب في زيارتها شيء من هذا القبيل؟ 658 00:30:45,985 --> 00:30:46,470 >> [END تشغيل الفيديو] 659 00:30:46,470 --> 00:30:47,820 >> DAVID مالان: OK، وربما لا. 660 00:30:47,820 --> 00:30:52,070 فكيف العديد من رفاق نشأ مع هؤلاء؟ 661 00:30:52,070 --> 00:30:53,970 موافق، لذلك فمن أقل وأقل يد كل عام. 662 00:30:53,970 --> 00:30:56,550 ولكن أنا سعيد كنت على دراية على الأقل معهم، لأن هذا ومنطقتنا 663 00:30:56,550 --> 00:31:00,520 الكتاب التجريبي، للأسف، يموتون لغاية بالموت البطيء هنا من الألفة. 664 00:31:00,520 --> 00:31:04,010 >> ولكن هذا هو ما أنا، على الأقل، مرة أخرى في المدرسة الثانوية، واستخدام تستخدم لتخزين النسخ الاحتياطية. 665 00:31:04,010 --> 00:31:08,110 وكان من المدهش، لأنك يمكن تخزين 1.4 ميغا بايت على 666 00:31:08,110 --> 00:31:08,930 هذا القرص معينة. 667 00:31:08,930 --> 00:31:12,260 وكان هذا الإصدار كثافة عالية، كما يدل على ذلك HD، التي لديها 668 00:31:12,260 --> 00:31:14,240 يعني قبل أشرطة الفيديو HD اليوم. 669 00:31:14,240 --> 00:31:16,400 >> وكانت الكثافة القياسية 800 كيلو بايت. 670 00:31:16,400 --> 00:31:18,640 وقبل ذلك، كان هناك الأقراص 400 كيلوبايت. 671 00:31:18,640 --> 00:31:23,120 وقبل ذلك، كان هناك 5 و 1/4 الأقراص بوصة، والتي كانت المرنة حقا، 672 00:31:23,120 --> 00:31:25,680 وعلى نطاق أوسع قليلا وأطول من هذه الأمور هنا. 673 00:31:25,680 --> 00:31:29,150 ولكن يمكنك أن ترى في الواقع ما يسمى الجانب المرن من هذه الأقراص. 674 00:31:29,150 --> 00:31:32,630 >> وظيفيا، وانهم فعلا جميلة مماثلة لمحركات الأقراص الصلبة من في 675 00:31:32,630 --> 00:31:33,570 الأقل هذا النوع. 676 00:31:33,570 --> 00:31:37,270 مرة أخرى، محركات الأقراص الصلبة في أجهزة الكمبيوتر الحديثة تعمل بشكل مختلف قليلا. 677 00:31:37,270 --> 00:31:41,530 ولكن إذا قمت بنقل علامة التبويب هذه المعادن قليلا، يمكنك فعلا رؤية القليل من الكعكة، 678 00:31:41,530 --> 00:31:42,560 أو طبق. 679 00:31:42,560 --> 00:31:43,830 >> انها ليست المعدنية مثل هذا واحد. 680 00:31:43,830 --> 00:31:46,000 هذا واحد في الواقع بعض أرخص المواد البلاستيكية. 681 00:31:46,000 --> 00:31:46,750 ويمكنك نوع من تذبذب ذلك. 682 00:31:46,750 --> 00:31:50,310 وكنت قد مسحت تروللي قبالة بعض عدد البتات أو الجزيئات المغناطيسية 683 00:31:50,310 --> 00:31:51,220 من هذا القرص. 684 00:31:51,220 --> 00:31:52,710 >> لذلك ولله الحمد، لا يوجد شيء على ذلك. 685 00:31:52,710 --> 00:31:55,790 إذا كان هذا الشيء هو في الطريق - والغطاء عينيك وتلك من جارك - 686 00:31:55,790 --> 00:31:58,865 يمكنك فقط نوع من سحب هذا غمد كامل من هذا القبيل. 687 00:31:58,865 --> 00:32:01,900 ولكن هناك القليل من الربيع، حتى يكون علم أنه مع عينيك. 688 00:32:01,900 --> 00:32:03,620 حتى الآن لديك حقا قرص مرن. 689 00:32:03,620 --> 00:32:07,090 >> وما هو ملحوظا عن هذا هو أنه في قدر هذا هو 690 00:32:07,090 --> 00:32:10,830 التمثيل على نطاق صغير من أكبر القرص الصلب، وهذه الأمور هي السوبر، 691 00:32:10,830 --> 00:32:11,590 سوبر بسيطة. 692 00:32:11,590 --> 00:32:15,170 إذا كنت قرصة الجزء السفلي منه، الآن بعد أن قبالة هذا الشيء المعدن، وقشر 693 00:32:15,170 --> 00:32:20,990 فتح لهم، كل ما هو قطعتين من اللباد ويسمى القرص المرن 694 00:32:20,990 --> 00:32:22,930 مع قطعة من المعدن في الداخل. 695 00:32:22,930 --> 00:32:25,990 >> وهناك يذهب نصف محتويات بلدي القرص. 696 00:32:25,990 --> 00:32:27,540 يذهب هناك نصف آخر منهم. 697 00:32:27,540 --> 00:32:31,375 ولكن هذا كل ما كان داخل الغزل من جهاز الكمبيوتر الخاص بك في الأمس. 698 00:32:31,375 --> 00:32:35,220 699 00:32:35,220 --> 00:32:38,310 >> ومرة أخرى، لوضع هذا في المنظور، كيف كبيرة هي معظم الخاص 700 00:32:38,310 --> 00:32:39,560 محركات الأقراص الصلبة هذه الأيام؟ 701 00:32:39,560 --> 00:32:41,960 702 00:32:41,960 --> 00:32:46,230 500 غيغابايت، تيرابايت، وربما في كمبيوتر سطح المكتب، 2 تيرابايت، 3 703 00:32:46,230 --> 00:32:47,630 تيرابايت و 4 تيرابايت، أليس كذلك؟ 704 00:32:47,630 --> 00:32:52,480 هذا هو واحد ميغا بايت، يعطي أو يأخذ، والتي لا يمكن حتى تناسب MP3 نموذجية 705 00:32:52,480 --> 00:32:55,310 بعد الآن في هذه الأيام، أو بعض ملف الموسيقى مماثلة. 706 00:32:55,310 --> 00:32:59,500 >> لذلك التذكارية قليلا بالنسبة لك اليوم، و أيضا للمساعدة في تأطير ما 707 00:32:59,500 --> 00:33:03,570 سنكون مع لمنح الآن في مشكلة تعيين خمسة. 708 00:33:03,570 --> 00:33:04,820 حتى تلك هي لك للحفاظ عليه. 709 00:33:04,820 --> 00:33:07,340 710 00:33:07,340 --> 00:33:13,370 لذلك اسمحوا لي الانتقال إلى حيث سيكون قضاء pset المقبل كذلك. 711 00:33:13,370 --> 00:33:18,470 لذلك قمنا الآن بتعيين هذه الصفحة ل- أوه، بضعة إعلانات بسرعة. 712 00:33:18,470 --> 00:33:21,730 >> هذا يوم الجمعة، إذا كنت ترغب الانضمام CS50 لتناول طعام الغداء، انتقل إلى المكان المعتاد، 713 00:33:21,730 --> 00:33:23,610 cs50.net/rsvp. 714 00:33:23,610 --> 00:33:25,100 والمشروع النهائي - 715 00:33:25,100 --> 00:33:28,520 حتى في المنهج، لقد نشر مواصفات المشروع النهائي بالفعل. 716 00:33:28,520 --> 00:33:31,410 ندرك أن هذا لا يعني انها نتيجة لا سيما في وقت قريب. 717 00:33:31,410 --> 00:33:33,990 لقد نشرت ذلك، حقا، لمجرد الحصول على يا رفاق التفكير فيه. 718 00:33:33,990 --> 00:33:37,620 والواقع، وهو كبير السوبر نسبة تكونوا معالجة 719 00:33:37,620 --> 00:33:40,780 المشاريع النهائية على المواد التي نحن لم تقم حتى نصل الى في الصف، 720 00:33:40,780 --> 00:33:42,730 ولكن سوف اعتبارا من الاسبوع القادم. 721 00:33:42,730 --> 00:33:45,530 >> سابق إنذار، على الرغم من أن المواصفات يدعو ل عدد قليل من العناصر المختلفة لل 722 00:33:45,530 --> 00:33:46,190 المشروع النهائي. 723 00:33:46,190 --> 00:33:49,590 الأولى، في غضون بضعة أسابيع، هو قبل الاقتراح، والبريد الإلكتروني عارضة جميلة ل 724 00:33:49,590 --> 00:33:52,760 TF لأقول له أو ما كنت التفكير للمشروع الخاص بك، مع 725 00:33:52,760 --> 00:33:53,650 الالتزام لا. 726 00:33:53,650 --> 00:33:56,710 وسوف تكون خاصة الاقتراح الخاص الالتزام، قائلا: هنا، وهذا هو ما 727 00:33:56,710 --> 00:33:57,770 أود القيام به لمشروعي. 728 00:33:57,770 --> 00:33:58,250 ما رأيك؟ 729 00:33:58,250 --> 00:33:58,650 كبيرة جدا؟ 730 00:33:58,650 --> 00:33:59,145 صغير جدا؟ 731 00:33:59,145 --> 00:34:00,330 هو يمكن التحكم فيها؟ 732 00:34:00,330 --> 00:34:02,230 وترى المواصفات لمزيد من التفاصيل. 733 00:34:02,230 --> 00:34:05,060 >> بضعة أسابيع بعد ذلك هو الوضع التقرير، الذي هو بالمثل 734 00:34:05,060 --> 00:34:08,260 البريد الإلكتروني عارضة لفريق العمل الخاص بك لأقول كيف بعيدا وراء وجودك في النهائي 735 00:34:08,260 --> 00:34:12,360 تنفيذ المشروع، تليها وCS50 Hackathon التي الجميع 736 00:34:12,360 --> 00:34:17,520 مدعو، والتي ستكون حدثا من 20:00 مساء حتى 07:00 احدة 737 00:34:17,520 --> 00:34:19,150 صباحا في صباح اليوم التالي. 738 00:34:19,150 --> 00:34:22,560 البيتزا، وأنا قد ذكرت في الأسبوع الصفر، فيل أن خدم في الساعة 9:00 مساء، 739 00:34:22,560 --> 00:34:24,120 الطعام الصيني في 01:00. 740 00:34:24,120 --> 00:34:27,929 وإذا كنت لا تزال مستيقظا في الساعة 5:00 صباحا، سنقوم يأخذك إلى بيت الصلاة العالمي من أجل وجبة الإفطار. 741 00:34:27,929 --> 00:34:31,310 >> وبالتالي فإن Hackathon هي واحدة من أكثر تجارب لا تنسى في الصف. 742 00:34:31,310 --> 00:34:35,290 ثم يرجع للتنفيذ، و ثم CS50 العادلة المناخية. 743 00:34:35,290 --> 00:34:38,070 مزيد من التفاصيل حول جميع هذه في الأسابيع القادمة. 744 00:34:38,070 --> 00:34:40,739 >> ولكن دعونا نعود إلى شيء المدرسة القديمة - 745 00:34:40,739 --> 00:34:41,920 مرة أخرى، صفيف. 746 00:34:41,920 --> 00:34:45,040 لذلك مجموعة لطيفة، لأنه لا يحل مشاكل مثل رأينا مجرد 747 00:34:45,040 --> 00:34:49,290 منذ لحظة مع الهياكل الطالب الحصول قليلا خارج نطاق السيطرة إذا كنا 748 00:34:49,290 --> 00:34:52,405 تريد أن يكون طالب واحد، طالب اثنين، طالب ثلاثة، طالب نقطة نقطة نقطة، 749 00:34:52,405 --> 00:34:54,400 بعض التعسفي عدد من الطلاب. 750 00:34:54,400 --> 00:34:58,850 >> حتى المصفوفات، قبل بضعة أسابيع، انقض في وتحل كل مشاكلنا لا 751 00:34:58,850 --> 00:35:03,340 مع العلم مسبقا كم من الأشياء من نوع ما قد نريد. 752 00:35:03,340 --> 00:35:07,390 ورأينا أن البنيات يمكن أن تساعدنا مزيد من تنظيم والحفاظ على رمز لنا 753 00:35:07,390 --> 00:35:11,660 متغيرات مماثلة من الناحية المفاهيمية، مثل اسم ومنزل، جنبا إلى جنب، حتى نتمكن 754 00:35:11,660 --> 00:35:15,570 يمكن التعامل معها ككيان واحد، داخل التي يوجد منها قطع أصغر. 755 00:35:15,570 --> 00:35:17,810 >> ولكن لديها بعض العيوب صفائف. 756 00:35:17,810 --> 00:35:19,780 ما هي بعض من مساوئ لقد واجهنا 757 00:35:19,780 --> 00:35:22,320 مع المصفوفات حتى الآن؟ 758 00:35:22,320 --> 00:35:23,450 ما هذا؟ 759 00:35:23,450 --> 00:35:28,130 حجم ثابت - حتى على الرغم من أنك قد تكون قادرة على تخصيص ذاكرة ل 760 00:35:28,130 --> 00:35:32,310 مجموعة، وبمجرد معرفة عدد الطلاب لديك، وكيفية العديد من الشخصيات لديك 761 00:35:32,310 --> 00:35:35,460 من المستخدم، مرة واحدة كنت قد خصصت مجموعة، وكنت قد رسمت نوع من 762 00:35:35,460 --> 00:35:36,740 نفسك في مأزق. 763 00:35:36,740 --> 00:35:40,600 >> لأنك لا يمكن إدراج عناصر جديدة في منتصف صفيف. 764 00:35:40,600 --> 00:35:43,660 لا يمكنك إدراج المزيد من العناصر في نهاية صفيف. 765 00:35:43,660 --> 00:35:47,750 حقا، عليك أن تلجأ إلى خلق مجموعة جديدة كاملة، كما ناقشناه، 766 00:35:47,750 --> 00:35:49,320 نسخ القديمة إلى الجديدة. 767 00:35:49,320 --> 00:35:52,610 ومرة أخرى، وهذا هو الصداع الذي GetString يتناول بالنسبة لك. 768 00:35:52,610 --> 00:35:56,170 >> ولكن مرة أخرى، لا يمكنك حتى إدراج شيء في منتصف مجموعة 769 00:35:56,170 --> 00:35:58,200 إذا لم يتم شغل معدل بالكامل. 770 00:35:58,200 --> 00:36:03,010 على سبيل المثال، إذا كان هذا مجموعة من حجم هنا ستة لديها سوى خمسة أشياء في ذلك، 771 00:36:03,010 --> 00:36:06,080 كذلك، هل يمكن أن تك فقط شيء على النهاية. 772 00:36:06,080 --> 00:36:08,200 ولكن ماذا لو كنت تريد إدراج شيء في منتصف 773 00:36:08,200 --> 00:36:11,280 مجموعة، على الرغم من أنه قد يكون خمسة من أصل ستة أشياء في ذلك؟ 774 00:36:11,280 --> 00:36:14,250 >> حسنا، ماذا نفعل عندما كان لدينا جميعا من متطوعين من البشر لدينا على خشبة المسرح في 775 00:36:14,250 --> 00:36:15,110 الأسابيع الماضية؟ 776 00:36:15,110 --> 00:36:18,710 إذا أردنا أن وضع شخص ما هنا، إما هؤلاء الناس كيفية نقل هذه 777 00:36:18,710 --> 00:36:22,540 الطريق، أو هؤلاء الناس كيفية نقل هذه الطريقة، والتي أصبحت مكلفة. 778 00:36:22,540 --> 00:36:26,950 التحول من الناس داخل ل انتهت مجموعة تصل بجمع وتكلف 779 00:36:26,950 --> 00:36:31,240 لنا الوقت، وبالتالي لدينا الكثير من ن التربيعية تشغيل مرات مثل الإدراج الفرز، ل 780 00:36:31,240 --> 00:36:32,550 المثال، في أسوأ الحالات. 781 00:36:32,550 --> 00:36:36,520 حتى صفائف كبيرة، ولكن لديك ل تعرف مسبقا كيف كبيرة تريد لهم. 782 00:36:36,520 --> 00:36:38,030 >> لذلك حسنا، هنا الحل. 783 00:36:38,030 --> 00:36:43,860 إذا كنت لا تعرف مسبقا كيف العديد من الطلاب كنت قد يكون، وأنا أعرف مرة واحدة 784 00:36:43,860 --> 00:36:47,870 أقرر، رغم ذلك، أنا عالقة مع أن العديد من الطلاب، لماذا لا أنا فقط دائما 785 00:36:47,870 --> 00:36:51,740 تخصيص مساحة ضعفي كما أود أن أعتقد أنني في حاجة؟ 786 00:36:51,740 --> 00:36:54,450 غير أنه لا يوجد حل معقول؟ 787 00:36:54,450 --> 00:36:58,240 >> واقعيا، لا أعتقد أننا سوف تحتاج إلى أكثر من 50 فتحات 788 00:36:58,240 --> 00:37:02,190 في مجموعة لفئة متوسطة الحجم، لذلك دعونا فقط محاصرة. 789 00:37:02,190 --> 00:37:07,040 أنا سوف تجعل فتحات في 100 مجموعة بلدي، فقط حتى نتمكن من الحصول على بالتأكيد 790 00:37:07,040 --> 00:37:10,330 عدد من الطلاب وأتوقع أن تكون في بعض الطبقة المتوسطة الحجم. 791 00:37:10,330 --> 00:37:14,320 فلماذا لا مجرد محاصرة وتخصيص المزيد من الذاكرة، وعادة، لمجموعة 792 00:37:14,320 --> 00:37:16,290 مما كنت تعتقد أنك قد تحتاج حتى؟ 793 00:37:16,290 --> 00:37:20,190 ما هذا النكسة بسيطة لهذه الفكرة؟ 794 00:37:20,190 --> 00:37:21,440 >> كنت مجرد إضاعة الذاكرة. 795 00:37:21,440 --> 00:37:25,350 حرفيا كل برنامج تكتبه ثم وربما باستخدام ضعف الذاكرة و 796 00:37:25,350 --> 00:37:26,680 تحتاج فعلا. 797 00:37:26,680 --> 00:37:28,990 وأنه فقط لا يشعر وكأنه حل أنيق للغاية. 798 00:37:28,990 --> 00:37:31,990 وعلاوة على ذلك، فإنه يقلل فقط احتمال وجود مشكلة. 799 00:37:31,990 --> 00:37:35,300 إذا كنت يحدث لديها بالطبع شعبية فصل دراسي واحد وكان لديك 101 800 00:37:35,300 --> 00:37:39,610 الطلاب، والبرنامج لا يزال تواجه نفس المشكلة جذريا. 801 00:37:39,610 --> 00:37:44,280 >> لذلك ولله الحمد، وهناك حل ل جميع مشاكل هذا الإعلان دينا في شكل 802 00:37:44,280 --> 00:37:46,790 هياكل البيانات التي أكثر تعقيدا من تلك التي 803 00:37:46,790 --> 00:37:47,970 رأيناه حتى الآن. 804 00:37:47,970 --> 00:37:50,530 هذا، وأنا يدعون، هي قائمة مرتبطة. 805 00:37:50,530 --> 00:37:51,920 هذه هي قائمة من الأرقام - 806 00:37:51,920 --> 00:37:54,970 9، 17، 22، 26، و 34 - 807 00:37:54,970 --> 00:38:00,120 التي تم ربطها معا عن طريق من ما كنت رسمها كما السهام. 808 00:38:00,120 --> 00:38:03,580 >> وبعبارة أخرى، إذا أردت أن تمثل صفيف، يمكن أن أفعله 809 00:38:03,580 --> 00:38:04,910 شيء من هذا القبيل. 810 00:38:04,910 --> 00:38:07,310 وسوف أضع هذا على النفقات العامة في مجرد لحظة. 811 00:38:07,310 --> 00:38:09,970 أستطيع أن أفعل - 812 00:38:09,970 --> 00:38:12,520 مرحبا، كل الحق. 813 00:38:12,520 --> 00:38:14,470 الوقوف إلى جانب. 814 00:38:14,470 --> 00:38:17,360 كمبيوتر جديد هنا، واضحة - 815 00:38:17,360 --> 00:38:18,090 كل الحق. 816 00:38:18,090 --> 00:38:21,730 >> حتى لو كان لدي هذه الأرقام في مجموعة - 817 00:38:21,730 --> 00:38:28,880 9، 17، 22، 26، 24 - 818 00:38:28,880 --> 00:38:30,530 ليس بالضرورة على نطاق كبير. 819 00:38:30,530 --> 00:38:33,730 كل الحق، لذلك هنا هو مجموعة بلدي - 820 00:38:33,730 --> 00:38:34,980 يا إلهي. 821 00:38:34,980 --> 00:38:38,700 822 00:38:38,700 --> 00:38:40,395 كل الحق، حتى هنا هو مجموعة بي. 823 00:38:40,395 --> 00:38:44,110 824 00:38:44,110 --> 00:38:45,050 يا إلهي. 825 00:38:45,050 --> 00:38:48,820 >> [ضحك] 826 00:38:48,820 --> 00:38:49,440 >> DAVID مالان: التظاهر. 827 00:38:49,440 --> 00:38:52,330 انها الكثير من الجهد للعودة وتحديد ذلك، لذلك هناك - 828 00:38:52,330 --> 00:38:54,290 26. 829 00:38:54,290 --> 00:38:57,650 لذلك لدينا هذه المجموعة من 9، 17، 22، 26، و 34. 830 00:38:57,650 --> 00:39:00,260 لأولئك منكم أن ترى خطأ محرج أنا أدلى به للتو، 831 00:39:00,260 --> 00:39:00,830 هناك هو عليه. 832 00:39:00,830 --> 00:39:04,490 >> لذلك أزعم أن هذا هو حل فعال للغاية. 833 00:39:04,490 --> 00:39:07,310 لقد خصصت العديد من رجات كما أحتاج - واحد، اثنان، ثلاثة، 834 00:39:07,310 --> 00:39:09,100 أربعة، خمسة، أو ستة - 835 00:39:09,100 --> 00:39:11,660 ولقد ثم تخزين أرقام داخل هذه المجموعة. 836 00:39:11,660 --> 00:39:15,220 ولكن لنفترض، بعد ذلك، أريد أن إدراج قيمة مثل عدد 8؟ 837 00:39:15,220 --> 00:39:16,100 حسنا، أين تذهب؟ 838 00:39:16,100 --> 00:39:18,530 لنفترض أنني أريد أن إدراج عدد مثل 20. 839 00:39:18,530 --> 00:39:19,790 حسنا، أين تذهب؟ 840 00:39:19,790 --> 00:39:23,160 هناك في مكان ما في الوسط، أو عدد 35 لديه للذهاب 841 00:39:23,160 --> 00:39:24,010 في مكان ما في نهاية المطاف. 842 00:39:24,010 --> 00:39:25,320 ولكن أنا كل من الفضاء. 843 00:39:25,320 --> 00:39:29,120 >> وهكذا وهذا هو التحدي الأساسي من المصفوفات التي لا هي الحل. 844 00:39:29,120 --> 00:39:32,280 أنا ادعى قبل لحظة، GetString يحل هذه المشكلة. 845 00:39:32,280 --> 00:39:37,380 إذا كنت ترغب في إدراج عدد السادسة في هذه المجموعة، ما هو واحد على الأقل 846 00:39:37,380 --> 00:39:40,090 الحل الذي يمكن أن تقع مرة أخرى على لعلى يقين، مثلما نفعل مع GetString؟ 847 00:39:40,090 --> 00:39:44,340 848 00:39:44,340 --> 00:39:46,030 ما هذا؟ 849 00:39:46,030 --> 00:39:48,190 >> حسنا، وجعلها أكبر و وقال أسهل من القيام به. 850 00:39:48,190 --> 00:39:52,810 نحن لا يمكن أن تجعل بالضرورة مجموعة أكبر، ولكن ماذا يمكننا أن نفعل؟ 851 00:39:52,810 --> 00:39:56,570 جعل مجموعة جديدة هذا هو أكبر من حجم 6، أو ربما حجم 10، إذا كنا نريد 852 00:39:56,570 --> 00:40:00,490 المضي قدما من الأشياء، ثم نسخ مجموعة القديم إلى الجديد، ومن ثم 853 00:40:00,490 --> 00:40:01,680 تحرير مجموعة من العمر. 854 00:40:01,680 --> 00:40:05,770 >> ولكن ما هو الوقت تشغيل الآن من هذه العملية؟ 855 00:40:05,770 --> 00:40:09,870 انها يا كبير من ن، لأن النسخ سوف يكلفك بعض وحدات 856 00:40:09,870 --> 00:40:13,480 الوقت، لذلك ليست مثالية لذلك إذا كان لدينا ل تخصيص مجموعة جديدة، والتي يجري 857 00:40:13,480 --> 00:40:15,610 تستهلك ضعفي الذاكرة مؤقتا. 858 00:40:15,610 --> 00:40:16,660 نسخ القديمة إلى الجديدة - 859 00:40:16,660 --> 00:40:18,800 أعني، انها مجرد صداع، والتي هو، مرة أخرى، لماذا كتبنا 860 00:40:18,800 --> 00:40:19,920 GetString بالنسبة لك. 861 00:40:19,920 --> 00:40:21,380 >> ذلك ما يمكن أن نقوم به بدلا من ذلك؟ 862 00:40:21,380 --> 00:40:25,000 حسنا، ماذا لو بنية البيانات لدينا لديه ثغرات في الواقع في ذلك؟ 863 00:40:25,000 --> 00:40:30,790 لنفترض أنني الاسترخاء هدفي من وجود قطع متجاورة من الذاكرة، حيث 9 864 00:40:30,790 --> 00:40:34,500 هو حق القادم إلى 17، والذي هو الحق المقبل إلى 22، وهلم جرا. 865 00:40:34,500 --> 00:40:39,570 >> ونفترض أن 9 يمكن أن يكون أكثر من هنا في ذاكرة الوصول العشوائي، و 17 يمكن أن يكون أكثر هنا في ذاكرة الوصول العشوائي، 866 00:40:39,570 --> 00:40:40,990 و 22 يمكن أن يكون أكثر هنا في ذاكرة الوصول العشوائي. 867 00:40:40,990 --> 00:40:43,610 وبعبارة أخرى، أنا لا حاجة إليها حتى العودة إلى الوراء بعد الآن. 868 00:40:43,610 --> 00:40:47,850 أود فقط أن الخيط بطريقة أو بأخرى إبرة من خلال كل هذه الأرقام، أو كل 869 00:40:47,850 --> 00:40:51,010 من هذه العقد، كما سنقوم باستدعاء المستطيلات كما كنت رسمها لهم، ل 870 00:40:51,010 --> 00:40:55,670 أتذكر كيف للوصول الى مشاركة هذه العقدة من الأولى. 871 00:40:55,670 --> 00:40:59,940 >> فما هو بناء البرمجة رأيناه مؤخرا جدا مع الذي أنا 872 00:40:59,940 --> 00:41:03,030 يمكن تنفيذ ذلك الموضوع، أو رسمها هنا، والتي يمكنني 873 00:41:03,030 --> 00:41:05,430 تنفيذ تلك السهام؟ 874 00:41:05,430 --> 00:41:06,500 لذلك مؤشرات، أليس كذلك؟ 875 00:41:06,500 --> 00:41:09,560 إذا كنت تخصيص يست مجرد كثافة، ولكن عقدة - و 876 00:41:09,560 --> 00:41:10,810 عقدة، أنا فقط يعني الحاوية. 877 00:41:10,810 --> 00:41:12,900 وبصريا، يعني مستطيل. 878 00:41:12,900 --> 00:41:16,420 لذلك يحتاج على ما يبدو عقدة لاحتواء قيمتين - 879 00:41:16,420 --> 00:41:21,490 والباحث نفسه، وبعد ذلك، كما تنطوي عليها النصف السفلي من المستطيل، 880 00:41:21,490 --> 00:41:23,010 مساحة كافية لكثافة العمليات. 881 00:41:23,010 --> 00:41:26,130 >> حتى مجرد التفكير في المستقبل هنا، كيف كبيرة هي هذه العقدة، وهذا 882 00:41:26,130 --> 00:41:27,170 الحاويات في السؤال؟ 883 00:41:27,170 --> 00:41:29,250 وكم بايت لكثافة العمليات؟ 884 00:41:29,250 --> 00:41:31,310 يفترض 4، إذا كان نفس كالمعتاد. 885 00:41:31,310 --> 00:41:33,270 ثم كم عدد بايت للمؤشر؟ 886 00:41:33,270 --> 00:41:33,650 4. 887 00:41:33,650 --> 00:41:37,940 حتى هذه الحاوية، أو هذه العقدة، هو ستكون بنية 8 بايت. 888 00:41:37,940 --> 00:41:41,760 أوه، وهذا من قبيل المصادفة السعيدة التي قدمنا ​​مجرد هذه الفكرة من 889 00:41:41,760 --> 00:41:44,400 البنية، أو بنية C. 890 00:41:44,400 --> 00:41:48,890 >> لذلك أزعم أنني أريد أن اتخاذ خطوة نحو هذا أكثر تطورا 891 00:41:48,890 --> 00:41:52,560 تنفيذ قائمة من الأرقام، و قائمة أرقام مرتبطة، ولست بحاجة للقيام 892 00:41:52,560 --> 00:41:56,920 أكثر قليلا التفكير في خط الهجوم و تعلن يست مجرد كثافة، ولكن البنية 893 00:41:56,920 --> 00:41:58,620 أن سأتصل تقليديا هنا، عقدة. 894 00:41:58,620 --> 00:42:01,630 أننا يمكن أن نسميها أي شيء نريد، ولكن عقدة ستكون الموضوعية في الكثير 895 00:42:01,630 --> 00:42:03,560 من الأشياء التي تبدأ في النظر في الآن. 896 00:42:03,560 --> 00:42:06,480 >> داخل تلك العقدة هو ن الباحث. 897 00:42:06,480 --> 00:42:09,350 ومن ثم بناء الجملة هذا، قليلا غريبة لأول وهلة - 898 00:42:09,350 --> 00:42:12,960 عقدة البنية * المقبل. 899 00:42:12,960 --> 00:42:16,900 بالصور جيدا، ما هو؟ 900 00:42:16,900 --> 00:42:21,000 هذا هو النصف السفلي من المستطيل الذي شاهدناه 901 00:42:21,000 --> 00:42:22,730 قبل لحظة فقط. 902 00:42:22,730 --> 00:42:27,600 >> ولكن لماذا أنا أقول عقدة البنية * بدلا من مجرد عقدة *؟ 903 00:42:27,600 --> 00:42:31,370 لأنه إذا كان هذا المؤشر يشير في عقدة أخرى، انها مجرد 904 00:42:31,370 --> 00:42:32,760 عنوان عقدة. 905 00:42:32,760 --> 00:42:35,630 وهذا يتفق مع ما كنا ناقش حول مؤشرات حتى الآن. 906 00:42:35,630 --> 00:42:39,690 ولكن لماذا، إذا كنت تدعي هذا الهيكل هو دعا عقدة، لا بد لي من القول البنية 907 00:42:39,690 --> 00:42:42,660 عقدة داخل هنا؟ 908 00:42:42,660 --> 00:42:43,190 >> بالضبط. 909 00:42:43,190 --> 00:42:46,490 انها نوع من واقع غبي من C. والرموز المميزة ل typedef، إذا جاز التعبير، لم 910 00:42:46,490 --> 00:42:47,220 يحدث حتى الآن. 911 00:42:47,220 --> 00:42:48,510 C هو السوبر حرفية. 912 00:42:48,510 --> 00:42:51,050 يقرأ أعلى التعليمات البرمجية ل أسفل، من اليسار إلى اليمين. 913 00:42:51,050 --> 00:42:54,930 وحتى أنه يضرب على أن منقوطة خلاصة القول، تخمين ما لا 914 00:42:54,930 --> 00:42:57,590 توجد كنوع بيانات؟ 915 00:42:57,590 --> 00:42:59,060 عقدة، عقدة قوسي الإقتباس. 916 00:42:59,060 --> 00:43:03,050 >> ولكن بسبب أكثر مطول إعلان فعلت في السطر الأول - 917 00:43:03,050 --> 00:43:05,340 الرموز المميزة ل typedef عقدة البنية - 918 00:43:05,340 --> 00:43:08,790 لأن ذلك يأتي في المرتبة الأولى، وذلك قبل الأقواس المتعرجة، وهذا نوع من مثل 919 00:43:08,790 --> 00:43:11,800 قبل تثقيف ضجيج ذلك، كنت تعرف ما، أعطني البنية 920 00:43:11,800 --> 00:43:13,570 دعا عقدة البنية. 921 00:43:13,570 --> 00:43:16,270 بصراحة، أنا لا أحب تسمية الأشياء عقدة البنية، عقدة البنية جميع 922 00:43:16,270 --> 00:43:17,090 في جميع أنحاء قانون بلدي. 923 00:43:17,090 --> 00:43:20,660 ولكنني سوف تستخدم فقط لمرة واحدة، في الداخل فقط، حتى أستطيع أن فعالية 924 00:43:20,660 --> 00:43:25,010 خلق نوع من مرجع معاد، وليس مؤشر إلى نفسي في حد ذاتها، ولكن 925 00:43:25,010 --> 00:43:29,400 مؤشر آخر من نوع متطابقة. 926 00:43:29,400 --> 00:43:32,330 >> لذلك تبين أنه في بنية بيانات مثل هذا، هناك عدد قليل من 927 00:43:32,330 --> 00:43:34,470 العمليات التي قد تكون من مصلحة لنا. 928 00:43:34,470 --> 00:43:37,460 ونحن قد ترغب في إدراج في قائمة من هذا القبيل. 929 00:43:37,460 --> 00:43:39,850 ونحن قد ترغب في حذف من قائمة من هذا القبيل. 930 00:43:39,850 --> 00:43:43,490 ونحن قد ترغب في البحث في قائمة ل القيمة، أو أكثر عموما، اجتياز. 931 00:43:43,490 --> 00:43:46,410 واجتياز هو مجرد وسيلة يتوهم من قائلا في بداية الأيسر ونقل جميع 932 00:43:46,410 --> 00:43:47,650 الطريق إلى اليمين. 933 00:43:47,650 --> 00:43:52,640 >> وتلاحظ، وحتى مع هذا أكثر قليلا بنية بيانات متطورة، والسماح 934 00:43:52,640 --> 00:43:56,510 لي اقتراح أننا يمكن أن تقترض بعض أفكار الأسبوعين الماضيين و 935 00:43:56,510 --> 00:43:58,410 تنفيذ دالة يسمى بحث من هذا القبيل. 936 00:43:58,410 --> 00:44:01,360 انها سوف العودة الحقيقية أو كاذبة، مشيرا إلى، نعم أو 937 00:44:01,360 --> 00:44:03,390 لا، n هو في القائمة. 938 00:44:03,390 --> 00:44:05,960 الحجة الثانية لها هو مؤشر إلى القائمة نفسها، لذلك 939 00:44:05,960 --> 00:44:07,920 مؤشر إلى العقدة. 940 00:44:07,920 --> 00:44:10,350 >> جميع انا ذاهب الى القيام به ثم هو الإعلان متغير مؤقت. 941 00:44:10,350 --> 00:44:12,730 سنقوم نسميها PTR بواسطة الاتفاقية، للمؤشر. 942 00:44:12,730 --> 00:44:15,220 وأنا تعيينها مساويا ل بداية القائمة. 943 00:44:15,220 --> 00:44:16,680 >> والآن لاحظ حلقة الوقت. 944 00:44:16,680 --> 00:44:20,640 طالما المؤشر لا تساوي لاغية، وانا ذاهب للتحقق. 945 00:44:20,640 --> 00:44:24,520 هو مؤشر السهم ن يساوي ن التي تم تمريرها في؟ 946 00:44:24,520 --> 00:44:26,410 والانتظار لمدة دقيقة - جديدة قطعة من بناء الجملة. 947 00:44:26,410 --> 00:44:29,324 ما هو السهم فجأة؟ 948 00:44:29,324 --> 00:44:30,574 نعم؟ 949 00:44:30,574 --> 00:44:34,200 950 00:44:34,200 --> 00:44:34,810 >> بالضبط. 951 00:44:34,810 --> 00:44:38,860 قبل ذلك حين بضع دقائق، كنا التدوين نقطة للوصول إلى شيء ما 952 00:44:38,860 --> 00:44:43,080 من داخل البنية، إذا كان المتغير لديك ليس البنية 953 00:44:43,080 --> 00:44:47,420 في حد ذاته، ولكن مؤشر إلى البنية، الحمد لله، وقطعة من الجملة التي 954 00:44:47,420 --> 00:44:48,620 أخيرا المنطقي بديهية. 955 00:44:48,620 --> 00:44:52,360 السهم يعني أن يتبع المؤشر، مثل السهام يعني عادة لدينا 956 00:44:52,360 --> 00:44:56,570 بالصور، وتذهب في حقل البيانات في الداخل. 957 00:44:56,570 --> 00:44:59,700 لذلك السهم هو نفس الشيء مثل النقطة، ولكن استخدامه عندما يكون لديك مؤشر. 958 00:44:59,700 --> 00:45:05,270 >> لذلك لمجرد أن نلخص ذلك الحين، إذا كان الحقل ن داخل البنية يسمى مؤشر 959 00:45:05,270 --> 00:45:07,760 يساوي يساوي ن، والعودة الحقيقية. 960 00:45:07,760 --> 00:45:11,970 خلاف ذلك، هذا الخط هنا - المؤشر يساوي مؤشر المقبل. 961 00:45:11,970 --> 00:45:17,540 وذلك ما يقوم به هذا، لاحظ، هو إذا أنا أنا مشيرا حاليا في البنية 962 00:45:17,540 --> 00:45:21,430 تحتوي على 9، و 9 هو ليس عدد أنا أبحث عن - لنفترض أنا أبحث 963 00:45:21,430 --> 00:45:22,830 لن يساوي 50 - 964 00:45:22,830 --> 00:45:25,930 أنا ذاهب لتحديث مؤشر بلدي مؤقت ليست نقطة في هذه العقدة 965 00:45:25,930 --> 00:45:31,190 بعد الآن، ولكن مؤشر السهم القادم، والتي هو الذهاب الى وضعني هنا. 966 00:45:31,190 --> 00:45:34,270 >> الآن، أدركت هي زوبعة مقدمة. 967 00:45:34,270 --> 00:45:37,380 يوم الاربعاء، ونحن سوف تفعل في الواقع هذا مع بعض البشر ومع بعض أكثر 968 00:45:37,380 --> 00:45:38,900 كود بوتيرة أبطأ. 969 00:45:38,900 --> 00:45:42,990 ولكن ندرك، ونحن الآن مما يجعل البيانات المتوفرة لدينا هياكل أكثر تعقيدا بحيث لدينا 970 00:45:42,990 --> 00:45:45,780 يمكن الحصول على خوارزميات أكثر كفاءة، والتي ستكون اللازمة ل 971 00:45:45,780 --> 00:45:50,500 pset ستة، عندما كنا في تحميل، مرة أخرى، تلك 150،000 الكلمات، ولكن بحاجة للقيام بذلك 972 00:45:50,500 --> 00:45:55,650 بكفاءة، وبشكل مثالي، إنشاء البرنامج الذي يمتد لمستخدمينا ليس في 973 00:45:55,650 --> 00:46:00,460 الخطي، وليس في ن التربيعية، ولكن في وقت ثابت، في مثالية. 974 00:46:00,460 --> 00:46:02,300 >> سنرى لك يوم الاربعاء. 975 00:46:02,300 --> 00:46:07,240 >> سرور: في CS50 المقبل، ديفيد ينسى القضية قاعدته. 976 00:46:07,240 --> 00:46:12,770 >> DAVID مالان: وهذه هي الطريقة التي ترسلها رسائل نصية مع C. ما - 977 00:46:12,770 --> 00:46:14,020 >> [نص الرسالة المختلفة وصل مرحلة الإخطار] 978 00:46:14,020 --> 00:46:19,734