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