[Powered by Google Translate] [استعراض] [مسابقة 0] [يكسي روس، تومي MacWilliam، لوكاس فريتاس، جوزيف أونج] [جامعة هارفارد] [هذا CS50.] [CS50.TV] مهلا، الجميع. مرحبا بكم في دورة الاستعراض للمسابقة 0، والذي يجري اليوم الاربعاء. ما نحن بصدد القيام به هذه الليلة، وأنا مع 3 TFS أخرى، ونحن في طريقنا معا للذهاب من خلال استعراض ما فعلناه في معرض حتى الآن. انها لن تكون 100٪ شاملة، ولكن يجب أن تعطيك فكرة أفضل من ما لديك بالفعل أسفل وما كنت لا تزال بحاجة إلى دراسة قبل يوم الاربعاء. وتتردد في رفع يدك مع الأسئلة ونحن في طريقنا على طول، ولكن نأخذ في الاعتبار أن علينا أيضا قليلا من الوقت في نهاية إذا تجاوزنا مع بضع دقائق لتجنيب لقيام المسائل العامة، حتى أن تبقي في الاعتبار، ولذا فإننا في طريقنا للبدء في بداية الأسبوع مع 0. [مسابقة 0 مشاركة!] [الجزء 0] [يكسي روس] ولكن قبل أن تفعل ذلك دعونا نتحدث عن لوجستيات هذه المسابقة. [اللوجستية] [مسابقة تجري يوم الأربعاء 10/10 في محاضرة بدلا من] [(انظر http://cdn.cs50.net/2012/fall/quizzes/0/about0.pdf للتفاصيل)] وعلى الأربعاء 10 أكتوبر. هذا اليوم الاربعاء، وإذا ذهبت إلى هذا URL هنا الذي هو أيضا يمكن الوصول إليها من CS50.net-هناك ليالي "وصلة لتكنولوجيا المعلومات يمكنك عرض معلومات حول أين تذهب بناء على اسمك أو الانتماء مشاركة المدرسة وكذلك فإنه يقول بالضبط ما سوف تغطي هذه المسابقة وأنواع الأسئلة التي كنت تريد الذهاب للحصول على. نضع في اعتبارنا أن سيكون لديك أيضا فرصة لاستعراض لهذه المسابقة في القسم، لذلك ينبغي أن يحدث TFS الخاص على ممارسة بعض المشاكل، وهذا هو آخر فرصة جيدة لنرى أين كنت لا تزال بحاجة إلى دراسة حتى لهذه المسابقة. دعونا نبدأ في بداية بايت مع 'ن' بت. تذكر بعض الشيء هو مجرد 0 أو 1، والبايت هو مجموعة من 8 بت تلك. دعونا ننظر في هذه المجموعة من البتات هنا. يجب أن نكون قادرين على معرفة عدد البتات هناك. حيث نعول هناك فقط 8 منها، وثمانية 0 أو 1 وحدة. وهناك منذ 8 بت، وهذا 1 بايت، ودعونا تحويله إلى رقم سداسي عشري. ست عشرية هي قاعدة 16، وأنه من السهل جدا لتحويل رقم في ثنائي، وهو ما وهذا هو، لعدد بالنظام الست عشري. كل ما نفعله هو أننا ننظر إلى مجموعات من 4، ونحن تحويلها إلى أرقام ست عشرية المناسبة. نبدأ مع مجموعة أقصى اليمين من 4، لذلك 0011. أن يحدث ليكون واحدا (1) واحد 2، معا بحيث يجعل 3. وثم دعونا ننظر إلى كتلة أخرى من 4. 1101. أن يحدث ليكون واحدا 1، وواحدة 4، و 8 واحد. معا أن سيكون 13، مما يجعل D. وسوف نتذكر أنه في ست عشري فإننا لا مجرد الذهاب من 0 إلى 9. نذهب من 0 إلى F، وذلك بعد 9 و 10 يناظر، 11 إلى B، وهلم جرا حيث F هو 15. 13 هنا هي D، ذلك لتحويلها إلى عشري كل ما نفعله هو أننا في الواقع علاج كل منصب أس 2. هذا واحد 1، وواحدة 2، صفر 4S، 8S صفر، واحد 16، وهلم جرا، وانها قليلا من الصعب حساب في رأسك، ولكن إذا ذهبنا إلى الشريحة التالية يمكننا أن نرى الإجابة على ذلك. أساسا نحن في طريقنا على الجانب الآخر من الظهير الايمن إلى اليسار، ونحن ضرب كل رقم من قبل السلطة المقابلة من 2. وتذكر، لأننا عشري دلالة هذه الأرقام مع 0x في بداية لذلك نحن لا نخلط مع رقم عشري. استمرار على، وهذا هو الجدول ASCII، وما نستخدمه لASCII هو لتعيين من الأحرف إلى قيم رقمية. تذكر في pset التشفير التي قطعناها على أنفسنا الاستخدام الواسع النطاق للجدول ASCII من اجل استخدام أساليب مختلفة من التشفير، قيصر والشفرات Vigenère، لتحويل رسائل مختلفة في سلسلة وفقا لمفتاح معين من قبل المستخدم. دعونا ننظر في قليلا من الرياضيات ASCII. يبحث في 'P' + 1، في شكل الحرف الذي سيكون Q، وتذكر أن "'5 ≠ 5. وكيف بالضبط نقوم بتحويل بين تلك الأشكال 2؟ انها ليست في الواقع من الصعب جدا. من أجل الحصول على 5 طرحنا '0 ' لأن هناك 5 أماكن في '0 بين 'و'5 لل". من أجل الذهاب في الاتجاه الآخر نضيف فقط 0، حتى انها نوع من مثل الحساب العادية. فقط تذكر أن لديه عندما يكون هناك شيء من حوله يقتبس انها شخصية ويتوافق بالتالي إلى قيمة ASCII في الجدول. الانتقال الى مواضيع أكثر عمومية علوم الكمبيوتر. تعلمنا ما هو خوارزمية وكيف نستخدم البرمجة لتنفيذ خوارزميات. بعض الأمثلة على الخوارزميات هي شيء بسيط حقا مثل التحقق ما إذا كان العدد زوجي أو فردي. لذلك نحن نتذكر وزارة الدفاع عدد (2) وقبل معرفة ما اذا كان الناتج 0. إذا كان الأمر كذلك، فمن ذلك. إن لم يكن، فمن الغريب. وهذا مثال على الخوارزمية الأساسية حقا. قليلا من واحد أكثر انخراطا هو البحث الثنائي، التي سنذهب في فترة لاحقة في دورة الاستعراض. والبرمجة هو المصطلح الذي نستخدمه لاتخاذ خوارزمية ويمكن تحويله إلى رمز جهاز الكمبيوتر قراءتها. 2 أمثلة للبرمجة هو خدش، وهو ما فعلناه في الأسبوع 0. على الرغم من أننا لا تكتب فعلا رمز انها وسيلة لتنفيذ هذه الخوارزمية، التي تطبع الأرقام 1-10، وهنا نحن نفعل نفس الشيء في لغة البرمجة C. هذه هي ما يعادل وظيفيا، وكتب في لغات مختلفة فقط أو بناء الجملة. بعد ذلك تعلمنا عن التعبيرات المنطقية، ومنطقية هو القيمة التي إما صحيحة أو خاطئة، والعبارات هنا منطقية في كثير من الأحيان الذهاب إلى الداخل من الشروط، إذا كان الأمر كذلك (X ≤ 5)، حسنا، نحن بالفعل تعيين X = 5، لذلك هذا الشرط هو الذهاب الى تقييم إلى true. وإذا كان هذا صحيحا، أيا كان هو رمز تحت شرط سوف يتم تقييمها من قبل الكمبيوتر، لذلك هذه السلسلة سوف تكون مطبوعة إلى الإخراج القياسي، وحالة الأجل يشير إلى كل ما هو داخل الأقواس من البيان إذا. تذكر جميع المشغلين. تذكر && انها و| | عندما نحاول الجمع بين 2 أو أكثر من الشروط، لا == = للتحقق ما إذا 2 الأشياء متساوية. تذكر أن = هو تخصيص حين == عبارة عن مشغل منطقية. ≤، ≥ ثم 2 انتهاء تشرح نفسها بنفسها. مراجعة عامة للمنطق منطقية هنا. والتعبيرات المنطقية هي أيضا مهمة في حلقات، التي سوف نذهب أكثر من الآن. تعلمنا عن 3 أنواع من الحلقات حتى الآن في CS50، ل، في حين، والقيام الوقت. ومن المهم أن نعرف أنه في حين أن لمعظم أغراض في الواقع يمكننا استخدام أي نوع من حلقة عموما هناك أنواع معينة من الأغراض أو الأنماط الشائعة في البرمجة التي تتطلب على وجه الخصوص واحدة من هذه الحلقات التي تجعل من بين أكثر كفاءة أو رمز أنيقة لأنها بهذه الطريقة دعونا نذهب أكثر من ما كل من هذه الحلقات يميل لاستخدامها في معظم الأحيان. في حلقة For عموما نحن نعرف كم مرة نريد تكرار. هذا ما وضعنا في هذه الحالة. ل، ط = 0، I <10، على سبيل المثال. نحن نعلم بالفعل أننا نريد أن نفعل شيئا 10 مرات. الآن، لحين حلقة، وعموما نحن لا بالضرورة معرفة عدد مرات نريد حلقة لتشغيل. ولكننا نعرف نوعا من حالة أننا نريد أن تكون دائما صحيحة أو خاطئة على الدوام. على سبيل المثال، يتم تعيين الوقت. دعنا نقول أن هذا متغير منطقية. في حين أن هذا صحيح ونحن نريد رمز لتقييم، حتى أكثر قليلا الموسعة، أكثر قليلا من عام لحلقة، ولكن يمكن أيضا للحلقة أي يمكن تحويلها إلى حلقة من الوقت. وأخيرا، في حين تفعل الحلقات، والتي قد تكون أصعب على الفهم على الفور، وغالبا ما تستخدم عندما نريد لتقييم رمز الأول قبل المرة الأولى التي تحقق الشرط. وهناك حالة الاستخدام المشترك لتفعل حين حلقة عندما كنت ترغب في الحصول إدخال المستخدم، وكنت أعلم أنك تريد أن تسأل المستخدم لإدخال على الأقل مرة واحدة، ولكن إذا كانوا لا تعطيك المدخلات جيدة على الفور كنت تريد أن تبقي يطلب منهم حتى أنها تعطيك المدخلات جيدة. هذا هو الاستخدام الأكثر شيوعا من القيام به أثناء الحلقة، ودعونا ننظر في هيكل الفعلي لهذه الحلقات. أنها عادة ما تميل دائما لاتباع هذه الأنماط. على حلقة لداخل لديك 3 عناصر هي: التهيئة، شيء مثل عادة كثافة العمليات ط = 0 حيث كنت غير وصفة طبية، حالة، حيث أننا نريد أن نقول لتشغيل هذا حلقة طالما هذا الشرط لا يزال يحمل، مثل التحديث <10، ثم وأخيرا، أود، وهو كيف أننا زيادة المتغير العداد في كل نقطة في الحلقة. شيء الشائع أن نرى هناك فقط أنا + +، وهو ما يعني زيادة بنسبة 1 أنا في كل مرة. هل يمكن أن تفعل شيئا من هذا القبيل أيضا ط 2 = +، وهو ما يعني إضافة 2 إلى ط في كل مرة تذهب من خلال الحلقة. وبعد ذلك قيام بذلك يشير فقط إلى أي رمز يعمل في الواقع كجزء من الحلقة. وللحلقة حين، وهذه المرة لدينا في الواقع التهيئة خارج الحلقة، ذلك على سبيل المثال، دعنا نقول أننا نحاول القيام به نفس النوع من الحلقة كما وصفتها للتو. لقلنا كثافة العمليات ط = 0 قبل الحلقة يبدأ. ثم يمكن أن نقول في حين ط <10 قيام بذلك، وبالتالي فإن كتلة من التعليمات البرمجية نفس كما كان من قبل، وهذه المرة من جانب التحديث من القانون، على سبيل المثال، وأنا + +، يذهب في الواقع داخل الحلقة. وأخيرا، لحين قيام، انها مشابهة للحلقة في حين، ولكن علينا أن نتذكر أن الكود وتقييم مرة واحدة قبل التحقق من الشرط، لذلك فمن المنطقي أكثر بكثير إذا نظرتم في ترتيب أعلى إلى أسفل. في، في حين القيام بتقييم حلقة رمز قبل أن ننظر حتى في حالة بينما في حين أن حلقة في حين، فإنه يتحقق أولا. البيانات والمتغيرات. عندما نريد لإنشاء متغير جديد نريد أول من تهيئة ذلك. على سبيل المثال، شريط الباحث تهيئة شريط متغير، ولكنها لا تعطيه قيمة، لذلك ما هو قيمة الحانة الآن؟ أننا لا نعرف. يمكن أن يكون بعض القيمة القمامة التي تم تخزينها مسبقا في الذاكرة هناك، ونحن لا نريد لاستخدام هذا المتغير حتى نعطي قيمة فعلا، لذلك فإننا نعلن من هنا. ثم أننا تهيئة لها أن تكون 42 أدناه. الآن، بطبيعة الحال، نحن نعرف ويمكن أن يتم هذا على سطر واحد بار الباحث، = 42. ولكن فقط ليكون واضحا للخطوات المتعددة التي تجري، الإعلان والتهيئة للتحدث بشكل منفصل هنا. يحدث في خطوة واحدة، والمرحلة التالية، وكثافة العمليات = باز بار + 1، هذا البيان أدناه، أن الزيادات باز، لذلك في نهاية هذه الكتلة رمز إذا كنا لطباعة قيمة باز سيكون من 44 لأننا نعلن وتهيئة أن يكون 1 بار>، وبعد ذلك زيادة لمرة واحدة مع أكثر + +. ذهبنا لفترة وجيزة خلال هذه جميلة، ولكن من الجيد أن يكون العام فهم ما هي المواضيع والأحداث. فعلنا هذا أساسا في سكراتش، لذلك يمكنك التفكير في المواضيع وتسلسل متعددة من التعليمات البرمجية تشغيل في نفس الوقت. في واقع الأمر، فإنه على الأرجح لم يكن قيد التشغيل في نفس الوقت، ولكن نوع من تجريدي يمكننا التفكير في الأمر بهذه الطريقة. في سكراتش، على سبيل المثال، كان لدينا العفاريت متعددة. ويمكن أن يكون تنفيذ التعليمات البرمجية مختلفة في نفس الوقت. يمكن للمرء أن يكون المشي في حين أن الآخر يقول شيئا في جزء آخر من الشاشة. الأحداث هي آخر وسيلة لفصل من المنطق بين العناصر المختلفة من التعليمات البرمجية الخاصة بك، وخدش في تمكنا من محاكاة الأحداث باستخدام البث، وهذا في الواقع عندما كنت تلقي، وليس عندما أسمع، ولكن أساسا انها وسيلة لنقل المعلومات من العفريت إلى آخر. على سبيل المثال، قد تحتاج إلى نقل أكثر من لعبة، وعندما يتلقى شبح آخر أكثر من لعبة، فإنه يستجيب بطريقة معينة. انها نموذج المهم أن نفهم للبرمجة. فقط ليذهب أكثر من أسبوع الأساسية 0، ما خضنا في حتى الآن، دعونا ننظر في هذا البرنامج C بسيطة. قد يكون النص قليلا صغيرة من هنا، ولكنني سوف تذهب أكثر من ذلك حقا سريعة. نحن بما في ذلك ملفات رأس 2 في cs50.h، أعلى وstdio.h. نحن ثم تحديد حد المستمر دعا الى ان يكون 100. نحن وظيفتنا ثم تنفيذ الرئيسي. وبما أننا لا تستخدم وسائط سطر الأوامر هنا نحن بحاجة لوضع باطل كما الحجج لالرئيسية. نرى الباحث الرئيسي أعلاه. هذا هو نوع الإرجاع، والعودة بالتالي 0 في الأسفل. ونحن نستخدم وظيفة CS50 مكتبة حصول على كثافة العمليات أن يطلب من المستخدم لإدخال، ونحن تخزينها في هذا المتغير x، لذلك فإننا نعلن X أعلاه، ونحن مع تهيئة X = GetInt. نحن ثم تحقق لمعرفة ما إذا كان المستخدم أعطانا مدخلات جيدة. إذا كان ≥ LIMIT نريد أن نعود رمز خطأ من 1 وطباعة رسالة خطأ. وأخيرا، إذا كان المستخدم قد أعطانا مدخلات جيدة ونحن في طريقنا الى المربع رقم وطباعة تلك النتيجة. فقط للتأكد من أن تلك المنازل ضرب جميع تستطيع أن ترى في التسميات من أجزاء مختلفة من قانون هنا. ذكرت ثابتة، ملفات رأس. أوه، الباحث العاشر. تأكد من أن نتذكر أن هذا متغير محلي. أن يتناقض ذلك من متغير العالمية، والتي سوف نتحدث عن قليلا في وقت لاحق في دورة الاستعراض، ونحن استدعاء الدالة printf مكتبة، إذا كان الأمر كذلك كان لدينا لا يتم تضمين ملف الرأس stdio.h ونحن لن تكون قادرة على استدعاء printf. وأعتقد أن السهم الذي حصل بقطع هنا يتم الإشارة إلى د٪، وهو سلسلة التنسيق في printf. تقول طباعة هذا المتغير كما د عددا٪. وهذا هو عليه لأسبوع 0. الآن لوكاس سوف يستمر. يا شباب. اسمي لوكاس. أنا طالبة في أفضل منزل في الحرم الجامعي، ماذر، وانا ذاهب الى الحديث قليلا عن أسبوع 1 و 2.1. [أسبوع 1 و 2.1!] [لوكاس فريتاس] كما يكسي قائلا: عندما بدأنا ترجمة التعليمات البرمجية من الصفر لC واحدة من الأشياء التي لاحظنا هو أنك لا تستطيع فقط كتابة التعليمات البرمجية وتشغيلها باستخدام العلم الأخضر بعد الآن. في الواقع، لديك لاستخدام بعض الخطوات لجعل حياتك برنامج C أصبح ملف قابل للتنفيذ. أساسا ما تفعله عندما كنت كتابة برنامج هو أن يمكنك ترجمة فكرتك إلى اللغة التي يمكن أن نفهم مترجم، لذلك عندما كنت كتابة برنامج C في ما تفعلونه هو كتابة شيئا في الواقع أن المترجم الخاص بك هو الذهاب لفهم، وبعد ذلك يتم الانتقال إلى مترجم ترجمة هذا الرمز إلى شيء من أن الكمبيوتر سوف تفهم. والشيء هو، جهاز الكمبيوتر الخاص بك هو في الواقع غبية جدا. يمكن جهاز الكمبيوتر الخاص بك لا يفهمون إلا و 0s 1s، في الواقع حتى في أجهزة الكمبيوتر الأولى المبرمجة عادة الناس باستخدام 0S و1S، ولكن ليس بعد الآن، والحمد لله. ليس لدينا لتسجيل تسلسل لو 0s 1s للحلقة أو حلقة في حين وهلم جرا. هذا هو السبب لدينا مترجم. ما يفعله هو مترجم يترجم ذلك أساسا رمز C، في حالتنا، إلى لغة الكمبيوتر الخاص بك وسوف تفهم، الذي هو رمز الكائن، والمترجم الذي نستخدمه ويسمى رنة، لذلك هذا هو في الواقع رمز لرنة. عندما يكون لديك البرنامج الخاص بك، ما عليك القيام به الأشياء 2. أولا، لديك لتجميع البرنامج، ومن ثم كنت تريد الذهاب لتشغيل البرنامج. لتجميع البرنامج لديك الكثير من الخيارات للقيام بذلك. أول واحد هو أن تفعل program.c رنة في البرنامج الذي هو اسم البرنامج. في هذه الحالة يمكنك ان ترى انهم يقولون فقط "يا وتجميع برنامجي". كنت لا أقول: "أريد هذا الاسم لبرنامجي" أو أي شيء. الخيار الثاني هو اعطاء اسم لبرنامجك. يمكنك أن تقول رنة-O ثم الاسم الذي تريد الكشف عن اسمه الملف القابل للتنفيذ وثم program.c. ويمكنك أيضا القيام جعل البرنامج، ونرى كيف في الحالات الأولى 2 أنا وضعت جيم، والثالث واحد وليس لدي سوى البرامج؟ نعم، يجب أن تضع في الواقع ليست (ج) عند استخدام القيام بها. وإلا فإن المترجم يجري في الواقع ليصيح فيك. وأيضا، وأنا لا أعرف ما إذا كنت تتذكر اللاعبين، ولكن في الكثير من الأحيان ونحن أيضا استخدام lcs50-OR-LM. ويسمى هذا الارتباط. انها مجرد يقول المترجم الذي سوف تستخدمه هذه المكتبات هناك، حتى إذا كنت ترغب في استخدام cs50.h لديك فعلا لكتابة رنة program.c-lcs50. إذا كنت لا تفعل ذلك، والمترجم لن تعرف أن كنت تستخدم هذه الوظائف في cs50.h. وعندما تريد تشغيل البرنامج لديك 2 الخيارات. إذا لم program.c رنة أنت لم تسمية البرنامج. لديك لتشغيله باستخدام / a.out. A.out هو اسم القياسية التي رنة يعطي البرنامج الخاص بك إذا كنت لا تعطيه اسما. وإلا كنت تنوي القيام به. / البرنامج إذا أعطيته اسما لبرنامجك، وأيضا إذا كنت لم تجعل البرنامج الاسم الذي برنامج هو الذهاب الى الحصول على يجري بالفعل أن تكون مبرمجة بنفس اسم الملف C. ثم تحدث لنا عن أنواع البيانات والبيانات. في الأساس أنواع البيانات هي نفس الشيء مثل صناديق صغيرة يستخدمونها لتخزين القيم، لذلك أنواع البيانات هي في الواقع تماما مثل Pokémons. أنها تأتي في جميع الأحجام والأنواع. أنا لا أعرف إذا كان هذا القياس المنطقي. حجم البيانات تعتمد في الواقع على بنية الجهاز. جميع الأحجام البيانات التي انا ذاهب لاظهار هنا هي في الواقع لجهاز 32 بت، كما هو الحال لدينا من الأجهزة، ولكن إذا كنت فعلا الترميز الخاص بك ماك أو ويندوز أيضا في ربما كنت ستكون لدينا جهاز 64 بت، تذكر ذلك أن أحجام البيانات التي انا ذاهب لاظهار هنا هي لآلة 32 بت. وكان أول واحد التي رأيناها على الباحث، التي هي جميلة واضحة. استخدام الباحث لتخزين عدد صحيح. ورأينا أيضا الطابع، وشار. إذا كنت ترغب في استخدام حرف أو رمز قليلا وأنت تسير على الارجح الى استخدام شار. A حرف و1 بايت، وهو ما يعني 8 بت، مثل يكسي قال. في الأساس لدينا جدول ASCII أن لديه 256 تركيبة ممكنة و 0s 1s، وبعد ذلك عندما قمت بكتابة حرف انه سيكون لترجمة الحرف الذي قال لك عدد المدخلات التي لديك في الجدول ASCII، مثل يكسي. لدينا أيضا تعويم، والتي نستخدمها لتخزين الأرقام العشرية. إذا كنت ترغب في اختيار 3.14، على سبيل المثال، وأنت تسير لاستخدام تعويم أو مزدوجة لديها أكثر دقة. A تعويم لديها 4 بايت. A مزدوج يحتوي على 8 بايت، وبالتالي فإن الفرق الوحيد هو دقة. كما ان لدينا منذ فترة طويلة أن يستخدم لأعداد صحيحة، ويمكنك ان ترى لجهاز 32-بت عدد صحيح ومنذ فترة طويلة لديهم نفس الحجم، لذلك لا يجعل حقا معنى لاستخدام طويل في جهاز 32 بت. ولكن إذا كنت تستخدم جهاز ماك و 64 بت، في الواقع منذ فترة طويلة وحجم 8، لذلك يعتمد حقا على الهندسة المعمارية. للجهاز 32-بت فإنه لا معنى لاستخدام طويل حقا. وبعد ذلك طويلة جدا، من ناحية أخرى، يحتوي على 8 بايت، حتى انه لامر جيد جدا إذا كنت تريد أن يكون عددا صحيحا لفترة أطول. وأخيرا، لدينا سلسلة، الذي هو في الواقع * شار، وهو مؤشر إلى شار. أنه من السهل جدا أن نعتقد أن حجم السلسلة ستكون مثل عدد الأحرف التي لديك هناك، ولكن في الواقع * شار نفسه وحجم مؤشر إلى شار، الذي هو 4 بايت. حجم * شار هو 4 بايت. لا يهم إذا كان لديك كلمة صغيرة أو رسالة أو أي شيء. انها سوف تكون 4 بايت. تعلمنا أيضا قليلا عن الصب، وذلك ترون، إذا كان لديك، على سبيل المثال، برنامج الذي يقول الباحث X = 3 ثم printf ("٪ د"، X / 2) هل الرجال يعرفون ما يجري في الطباعة على الشاشة؟ شخص ما؟ >> [طلاب] 2. 1. >> 1، نعم. عند القيام 3/2 انه سيكون للحصول على 1.5، ولكن بما أننا نستخدم عدد صحيح انه سيكون لتجاهل الجزء العشري، وأنت تسير أن يكون 1. إذا كنت لا تريد أن يحدث ذلك ما يمكنك القيام به، على سبيل المثال، ويعلن تعويم ص = س. ثم X التي تستخدم ليكون 3 وسيكون الان 3،000 في ذ. ومن ثم يمكنك طباعة ذ / 2. في الواقع، ينبغي أن لدي 2. هناك. انها تنوي القيام به 3.00/2.00، وأنت تسير في الحصول على 1.5. وليس لدينا هذا و 0.2 فقط لطلب 2 وحدة عشرية في الجزء العشري. إذا كان لديك 0.3 و انها ستكون لدينا في الواقع 1.500. اذا كان 2 وسيكون 1.50. لدينا أيضا هذه الحالة هنا. إذا كنت تفعل تعويم X = 3.14 ثم X printf وأنت تسير في الحصول على 3.14. وإذا كان لديك س = كثافة العمليات العاشر، مما يعني علاج X باعتباره الباحث وقمت بطباعة X الآن وأنت تسير أن يكون 3.00. هل هذا معقول؟ لأنك أولا معالجة X كعدد، لذلك كنت تجاهل جزء عشري، ثم كنت تقوم بطباعة X. وأخيرا، يمكنك أيضا القيام بذلك، الباحث س = 65، ومن ثم تقوم بتعريف شار ج = س، ثم إذا قمت بطباعة ج وأنت تسير في الواقع للحصول على A، وذلك ما تفعلونه في الأساس هنا وترجمة عدد صحيح في حرف، تماما مثل جدول ASCII لا. تحدثنا أيضا عن معاملات رياضية. معظمهم من جميلة واضحة، لذلك +، -، *، /، وتحدث أيضا عن وزارة الدفاع ونحن، وهو ما تبقى من تقسيم من 2 الأرقام. إذا كان لديك 10٪ 3، على سبيل المثال، فهذا يعني تقسيم 10 بواسطة 3، والباقي ما هو؟ انها سوف تكون 1، لذلك في الواقع مفيدة جدا لكثير من البرامج. لVigenère وقيصر وأنا متأكد من أن كل واحد منكم الرجال تستخدم وزارة الدفاع. حول معاملات رياضية، نكون حذرين للغاية عند الجمع بين و* /. على سبيل المثال، إذا قمت بذلك (3/2) * 2 ما انت ذاهب للحصول على؟ [الطلاب] 2. نعم، 2، لأن 3/2 سيكون 1.5، ولكن منذ كنت تفعل عمليات الأعداد الصحيحة بين 2 كنت في الواقع مجرد الذهاب الى النظر 1، ثم 1 * 2 ستكون 2، لذلك جدا، ودقيق جدا عند القيام الحسابية مع الأعداد الصحيحة لأن قد تحصل على هذا 2 = 3، في هذه الحالة. وأيضا أن تكون حذرة للغاية حول أسبقية. يجب عليك استخدام الأقواس عادة للتأكد من أن كنت تعرف ما تفعلونه. بعض الاختصارات المفيدة، بطبيعة الحال، هو واحد ط ط + + أو + = 1 أو استخدام + =. وهذا هو نفس الشيء مثل القيام ط = ط + 1. يمكنك أيضا القيام ط - ط أو - = 1، وهو نفس الشيء وأنا = ط -1، شيء يا رفاق استخدام الكثير في لحلقات على الأقل. أيضا، ل*، إذا كنت تستخدم * = وإذا قمت بذلك، على سبيل المثال، ط = 2 * هو نفس الشيء قوله ط = ط * 2، ونفس الشيء للانقسام. إذا كنت تفعل I / = 2 انها نفس الشيء وأنا = ط / 2. الآن عن وظائف. تعلمت أن الرجال وظائف هي استراتيجية جيدة جدا لحفظ رمز بينما كنت البرمجة، لذلك إذا كنت تريد تنفيذ نفس المهمة في التعليمات البرمجية مرة أخرى ومرة ​​أخرى، ربما تحتاج إلى استخدام وظيفة فقط حتى لم يكن لديك لنسخ ولصق رمز مرارا وتكرارا. في الواقع، الرئيسي هو وظيفة، وعندما تظهر لك شكل وظيفة وأنت تسير أن نرى أن هذا واضح جدا. ونحن أيضا استخدام وظائف من بعض المكتبات، على سبيل المثال، printf، GetIn، وهو من مكتبة CS50، وغيرها من المهام مثل toupper. وتنفذ في الواقع كل تلك المهام في مكتبات أخرى، وعندما كنت وضعت تلك الملفات حبل في بداية البرنامج تقوله يمكنك من فضلك أعطني رمز لتلك الوظائف لذلك أنا لم يكن لديك لتنفيذها من قبل نفسي؟ ويمكنك أيضا كتابة وظائف الخاصة بك، لذلك عند بدء البرمجة كنت أدرك أن المكتبات لم يكن لديك جميع الوظائف التي تحتاج إليها. لpset الماضي، على سبيل المثال، كتب نرسم، والتدافع، والبحث، وانها مهم جدا جدا أن تكون قادرا على كتابة وظائف لأنها مفيدة، ونحن استخدامها في كل وقت في البرمجة، وأنه يوفر الكثير من التعليمات البرمجية. شكل هو وظيفة هذا واحد. لدينا نوع الإرجاع في البداية. ما هو نوع المقابل؟ انها مجرد وظيفة عندما الخاص بك هو الذهاب للعودة. إذا كان لديك وظيفة، على سبيل المثال، مضروب، ما يحدث لحساب مضروب عدد صحيح، ربما انه سيكون لإرجاع عدد صحيح أيضا. ثم نوع الإرجاع ستكون كثافة العمليات. Printf في الواقع فراغا نوع الإرجاع لأنك لا تعود أي شيء. كنت تقوم بطباعة الأشياء إلى الشاشة والإقلاع عن التدخين وظيفة بعد ذلك. ثم لديك اسم الدالة التي يمكنك الاختيار. يجب أن تكون معقولة قليلا، مثل لا اختيار اسم مثل XYZ أو مثل x2f. محاولة للتعويض وهو الاسم الذي له معنى. على سبيل المثال، إذا كان مضروب، ويقول مضروب. إذا كان وظيفة التي يتم الانتقال إلى رسم شيء ما، سمها ما رسم. ثم لدينا المعلمات، والتي تسمى أيضا الحجج، التي هي مثل وظيفة الموارد التي يحتاج من التعليمات البرمجية لأداء مهمتها. إذا كنت ترغب في حساب مضروب عدد ربما تحتاج إلى أن يكون عدد لحساب مضروب. واحدة من الحجج التي كنت تريد الذهاب ليكون هو الرقم نفسه. ثم انها سوف تفعل شيئا وإرجاع القيمة في نهاية إلا إذا كان وظيفة الفراغ. دعونا نرى مثالا على ذلك. إذا كنت تريد أن تكتب دالة التي تلخص جميع الأرقام في مجموعة من الأعداد الصحيحة، بادئ ذي بدء، نوع الإرجاع سيكون الباحث لأن لدي مجموعة من الأعداد الصحيحة. ثم انا ذاهب الى أن يكون اسم الدالة مثل sumArray، ثم انه سيكون لاتخاذ مجموعة نفسها، لnums الباحث، ثم طول الصفيف إذا كنت لا تعرف عدد الأرقام لا بد لي من المبلغ. ثم لا بد لي من تهيئة مبلغ متغير يسمى، على سبيل المثال، إلى 0، وفي كل مرة أرى عنصر في مجموعة وأود أن أضيف إلى المبلغ، لذلك فعلت لحلقة. مثلما قال يكسي، لديك كثافة العمليات ط = 0، طول <أنا وأنا + +. ولكل عنصر في الصفيف فعلت مبلغ + = nums [أنا]، ثم عدت مجموع، لذلك الأمر في غاية البساطة، وأنه يوفر الكثير من التعليمات البرمجية إذا كنت تستخدم هذه الوظيفة في الكثير من الأحيان. ثم أخذ لدينا نظرة على الظروف. إذا لدينا، عدا ذلك، وإذا آخر. دعونا نرى ما هو الفرق بين هؤلاء. نلقي نظرة على هذه الرموز 2. ما هو الفرق بينهما؟ أول واحد في الأساس ورموز نريد لك أن تقول إذا كان الرقم هو +، -، أو 0. أول واحد يقول ما اذا كان> 0 ثم انها ايجابية. إذا كان = إلى 0 ثم انها 0، واذا كان <0 ثم انها سلبية. والآخر يقوم به إذا، الا اذا، عدا ذلك. الفرق بين الاثنين هو أن هذا واحد هو الذهاب فعلا إلى تحقق مما إذا> 0، <0 = 0 أو ثلاث مرات، إذا كان الأمر كذلك لديك عدد 2، على سبيل المثال، فإنه سوف يأتي هنا ويقول إذا كان (X> 0)، وانها سوف نقول نعم، لذلك أنا طباعة إيجابية. ولكن على الرغم من أنني أعرف أنه من> 0 وانها لن تكون 0 أو <0 أنا ذاهب لا يزال القيام به هو أنها 0، هو <0، لذلك أنا ذاهب فعلا داخل المؤسسة الدولية للعلوم التي لم يكن لدي ل لأنني أعرف مسبقا أن ذلك لن يرضي أي من هذه الشروط. يمكنني استخدام إذا، الا اذا، عدا ذلك البيان. تقول في الأساس إذا كانت x = 0 I طباعة إيجابية. إذا لم يكن، انا ذاهب لاختبار هذا أيضا. اذا كان 2 لا انا ذاهب للقيام بذلك. أساسا إذا كان X = 2 ستقول إذا كان (X> 0)، نعم، لذلك هذا طباعة. الآن وأنا أعلم أنه من> 0 واقتنعت أن أول حالة أنا لا أذهب حتى لتشغيل هذه التعليمات البرمجية. تشغيل التعليمات البرمجية بشكل أسرع، في الواقع، و 3 مرات أسرع إذا كنت تستخدم هذا. تعلمنا أيضا عن وأو و. أنا لن تذهب من خلال ذلك ليكسي تحدث عنها بالفعل. انها مجرد و&& | المشغل |. الشيء الوحيد الذي سوف أقوله هو أن تكون حذرا عندما يكون لديك 3 شروط. استخدام الأقواس لأنها مربكة جدا عندما يكون لديك حالة وآخر واحد أو الآخر. استخدام الأقواس لمجرد التأكد من أن الظروف الخاصة بك معنى لأنه في هذه الحالة، على سبيل المثال، يمكنك أن تتخيل أن يمكن أن يكون الشرط الأول واحدة أو أخرى أو الشروط مجتمعة 2 في و أو الثلث، بحيث يكون مجرد الحذر. وأخيرا، تحدثنا عن مفاتيح. A التبديل مفيد جدا عندما يكون لديك متغير. دعنا نقول أن لديك متغير مثل ن التي يمكن أن تكون 0 أو 1 أو 2، ولكل من هذه الحالات وأنت تسير في تنفيذ مهمة. يمكنك أن تقول تبديل المتغير، ويشير إلى أن ثم كانت القيمة مثل value1 إلى انا ذاهب للقيام بذلك، وبعد ذلك كسر، وهو ما يعني أنني لست سوف ننظر في أي من الحالات الأخرى لأننا بالفعل راض هذه الحالة و value2 ثم وهلم جرا، وأنا يمكن أن يكون لها أيضا التبديل الافتراضية. وهذا يعني إذا كان لا يلبي أي من الحالات التي كان لي انني ذاهب لفعل شيء آخر، ولكن هذا اختياري. هذا كل شيء بالنسبة لي. الآن دعونا لها تومي. حسنا، هذا سيكون الأسبوع 3-ISH. هذه هي بعض من المواضيع التي تغطي سنكون، التشفير، نطاق، صفائف، وهلم جرا. مجرد كلمة سريعة على التشفير. نحن لن توصل هذا الوطن. فعلنا ذلك في pset 2، ولكن لمسابقة تأكد من أنك تعرف الفرق بين قيصر والشفرات والشفرات Vigenère، كيف عمل كل من هذه الاصفار وما يشبه لتشفير وفك تشفير نص باستخدام تلك الأصفار 2. تذكر، والشفرات قيصر تدور ببساطة كل حرف بنفس المقدار، التأكد من وزارة الدفاع من قبل عدد من الحروف في الأبجدية. والشفرات Vigenère، من ناحية أخرى، بالتناوب كل حرف بمقدار مختلفة، وذلك بدلا من القول وتناوب كل حرف بنسبة 3 Vigenère تدوير كل حرف بمقدار مختلفة اعتمادا على بعض الكلمات الرئيسية حيث كل حرف في الكلمة تمثل بعض كمية مختلفة لتدوير نص واضح من قبل. دعونا نتحدث أولا عن نطاق متغير. هناك 2 أنواع مختلفة من المتغيرات. لدينا المتغيرات المحلية، وهذه ستكون محددة خارج الرئيسي أو أي وظيفة أو خارج الكتلة، وسوف تكون متاحة في أي مكان هذه في البرنامج. إذا كان لديك وظيفة وظيفة في هذا هو حلقة في حين المتغير عالمية ضخمة يمكن الوصول إليها في كل مكان. A متغير محلي، من ناحية أخرى، هو راقب إلى المكان الذي تم تعريفه. إذا كان لديك وظيفة هنا، على سبيل المثال، لدينا هذا ز وظيفة، وداخل ز هناك متغير يسمى هنا ذ، وهذا يعني أن هذا هو متغير محلي. على الرغم من هذا ما يسمى متغير Y ويسمى هذا المتغير ذ هذه الوظائف 2 ليس لدي فكرة عما المتغيرات بعضها البعض المحلية. من جهة أخرى، وهنا نقول ما يصل الباحث س = 5، وهذا لا يدخل في نطاق أي وظيفة. انها خارج نطاق الرئيسي، لذلك هذا هو متغير عمومي. وهذا يعني أن داخل هذه الوظائف 2 عندما أقول X - X + + أو أنا الوصول إلى X Y نفس هذا حيث وذ هذه هي المتغيرات المختلفة. هذا هو الفرق بين المتغير العالمي ومتغير محلي. بقدر ما تشعر التصميم، وأحيانا هو على الأرجح أفضل فكرة للحفاظ على المتغيرات المحلية كلما استطعت ربما منذ وجود يمكن أن حفنة من المتغيرات العالمية الحصول على مربكا حقا. إذا كان لديك مجموعة من المهام تعديل جميع نفس الشيء قد ينسى ما إذا كانت هذه الوظيفة عن طريق الخطأ يعدل هذا العالم، وهذا وظيفة أخرى لا يعرف عن ذلك، وأنه لا يحصل مربكة جدا كما يمكنك الحصول على المزيد من التعليمات البرمجية. حفظ المتغيرات المحلية كلما استطعت ربما التصميم الجيد هو فقط. صفائف، تذكر، هي ببساطة قوائم العناصر من نفس النوع. يمكن داخل CI يكن لديك قائمة مثل 2.0، 1، مرحبا. إلا أننا لا نستطيع فعل ذلك. عندما نعلن صفيف في C كل العناصر يجب أن تكون من نفس النوع. هنا لدي مجموعة من 3 أعداد صحيحة. هنا لدي طول الصفيف، ولكن إذا أنا فقط معلنا في هذا الجملة حيث يمكنني تحديد ما كل العناصر هي لا حاجة لي هذا من الناحية الفنية 3. المترجم ذكي بما فيه الكفاية لمعرفة كيفية كبيرة الصفيف ينبغي أن يكون. الآن عندما كنت ترغب في الحصول على أو تعيين قيمة صفيف هذا هو بناء الجملة للقيام بذلك. وهذا في الواقع تعديل العنصر الثاني للصفيف ل، تذكر، ترقيم يبدأ في 0، وليس في 1. إذا كنت ترغب في قراءة تلك القيمة أستطيع أن أقول شيء من هذا القبيل الباحث س = مجموعة [1]. أو إذا كنت تريد تعيين هذه القيمة، مثل أفعله هنا، أستطيع أن أقول مجموعة [1] = 4. ذلك الوقت الوصول إلى عناصر من الرقم القياسي أو وضعهم أو مكان وجودهم في الصفيف، وان ادراج يبدأ في 0. يمكننا أيضا صفائف صفائف، وهذا ما يسمى مجموعة متعددة الأبعاد. عندما يكون لدينا مجموعة متعددة الأبعاد هذا يعني أننا يمكن أن يكون شيء من هذا القبيل الصفوف والأعمدة، وهذا هو مجرد وسيلة لتصور هذا أو التفكير فيه. عندما يكون لدي مجموعة متعددة الأبعاد وهذا يعني أنني ذاهب لبدء تحتاج إلى أكثر من 1 مؤشر لأن إذا كان لدي شبكة فقط يقول ما كنت في الصف لا يعطينا عددا. هذا هو حقا مجرد الذهاب ليقدم لنا قائمة من الأرقام. دعنا نقول لدي هذه المجموعة هنا. لدي مجموعة تسمى الشبكة، وأنا أقول أنه في 2 الصفوف والأعمدة 3، وحتى هذا هو أحد السبل لتصور ذلك. عندما أقول أريد الحصول على العنصر في [1] [2] وهذا يعني أن لأن هذه هي الصفوف الأولى ومن ثم الأعمدة انا ذاهب للانتقال إلى الصف 1 منذ قلت 1. ثم أنا سوف يأتي إلى هنا إلى العمود 2، وأنا ذاهب للحصول على القيمة 6. معنى؟ صفائف متعددة الأبعاد، تذكر، من الناحية الفنية فقط مجموعة من المصفوفات. فإننا يمكن أن يكون صفائف صفائف صفائف. يمكننا الاستمرار، ولكن في الحقيقة طريقة واحدة للتفكير كيف يتم ذلك وضعت ما يحدث هو أنه تصور في شبكة من هذا القبيل. عندما كنا تمرير صفائف إلى وظائف، انهم ذاهبون الى التصرف بشكل مختلف قليلا مما كانت عليه عندما كنا تمرير متغيرات العادية إلى وظائف مثل تمرير الباحث أو طوف. عندما نعبر في أنواع الباحث أو حرف أو أي من هذه البيانات الأخرى نحن فقط أخذت نظرة على إذا كانت وظيفة يعدل قيمة هذا المتغير أن التغيير لن تصل للنشر إلى الدالة الاستدعاء. مع مجموعة، من ناحية أخرى، فإن ذلك يحدث. إذا كنت تمر في صفيف إلى بعض من وظيفة وظيفة أن يغير بعض العناصر، عندما أعود إلى الدالة التي تسمى مجموعة بلدي يجري الآن في أن تكون مختلفة، والمفردات لذلك يتم تمرير صفائف هي المرجعية، كما سنرى لاحقا. ويرتبط هذا العمل مؤشرات كيفية، مكان هذه الأنواع من البيانات الأساسية، من ناحية أخرى، يتم تمرير من حيث القيمة. يمكن أن نفكر في وصنع نسخة من بعض متغير ثم تمرير في نسخة. لا يهم ما نفعله مع هذا المتغير. وتدعو وظيفة لا تكون على علم بأن تم تغييره. صفائف ليست سوى مختلفة قليلا في هذا الصدد. على سبيل المثال، كما رأينا للتو، هو ببساطة الرئيسي وظيفة يمكن أن تأخذ في 2 الحجج. الوسيطة الأولى إلى الدالة الرئيسي هو argc، أو عدد من الحجج، ويسمى الوسيطة الثانية argv، وتلك هي القيم الفعلية لتلك الحجج. دعنا نقول لدي برنامج يسمى this.c، وأنا أقول جعل هذا، وأنا ذاهب لتشغيل هذا في سطر الأوامر. الآن لتمرير بعض الحجج لفي برنامجي هذا ما يسمى، يمكن أن أقول شيء من هذا القبيل. / هذا هو CS 50. هذا هو ما نتصور ديفيد للقيام كل يوم في المحطة. ولكن الآن داخل الوظيفة الرئيسية لهذا البرنامج وهذه القيم، لذلك argc هو 4. قد يكون قليلا مربكة حقا لأننا فقط في تمرير هو CS 50. هذا فقط 3. ولكن تذكر أن العنصر الأول من argv أو الوسيطة الأولى هو اسم الدالة نفسها. وهذا يعني أن لدينا 4 أشياء هنا، والعنصر الأول سيكون / هذا. وسوف تكون ممثلة هذا كسلسلة. ثم العناصر المتبقية هي ما نحن كتبته في بعد اسم البرنامج. وذلك مجرد جانبا، كما رأينا ربما في pset 2، تذكر أن ≠ السلسلة 50 ال 50 صحيح. لذلك لا نستطيع أن نقول شيئا من هذا القبيل، "الباحث س = argv 3. ' هذا مجرد لن يكون له معنى، لأن هذا هو سلسلة، وهذا هو عدد صحيح. حتى إذا كنت ترغب في تحويل بين 2 و تذكر، ونحن في طريقنا إلى لديك هذه الوظيفة السحر دعا atoi. أن تأخذ سلسلة وإرجاع عدد صحيح يمثل داخل تلك السلسلة. بحيث هذا خطأ سهلة لجعل هذه المسابقة على، مجرد التفكير في أن تكون هذه النوع الصحيح تلقائيا. ولكن نعرف فقط أن هذه ستكون دائما سلاسل حتى لو كان يحتوي فقط على سلسلة عددا صحيحا أو حرف أو طوف. حتى الآن دعونا نتحدث عن إدارة الوقت. عندما يكون لدينا كل هذه الخوارزميات التي تفعل كل هذه الأشياء المجنونة، يصبح مفيدا حقا أن نطرح هذا السؤال: "كم من الوقت أنها لا تأخذ؟" نمثلها أنه مع شيء يسمى تدوين مقارب. ولذلك فإن هذا يعني أن - حسنا، دعنا نقول أن نعطي لدينا خوارزمية بعض المدخلات حقا، حقا، حقا كبيرة. نريد أن نطرح هذا السؤال: "كم من الوقت هو الذهاب الى اتخاذ؟ كم عدد الخطوات التي تتخذ لدينا لتشغيل خوارزمية بوصفها وظيفة من حجم المدخلات؟ " وبالتالي فإن الطريقة الأولى التي يمكن أن تصف وقت التشغيل هو مع O. كبيرة وهذا هو وقتنا تشغيل أسوأ الحالات. إذا كان الأمر كذلك نريد لفرز صفيف، ونعطي لدينا مجموعة خوارزمية هذا في ترتيب تنازلي عندما يجب أن تكون في ترتيب تصاعدي، وهذا سوف يكون أسوأ الحالات. هذا هو الجزء العلوي لدينا ملزمة في الحد الأقصى لطول الوقت سيستغرق لدينا خوارزمية. من ناحية أخرى، وهذا هو الذهاب الى Ω أفضل وصف حدة إدارة الوقت. إذا كان الأمر كذلك نقدم مجموعة مصنفة بالفعل إلى خوارزمية الفرز، كم من الوقت يستغرق لترتيب هذا الأمر؟ وهذا، بعد ذلك، يصف الأدني على إدارة الوقت. حتى هنا ليست سوى بعض الكلمات التي تصف بعض الأوقات المشتركة على التوالي. هذه هي في ترتيب تصاعدي. ويسمى الوقت أسرع تشغيل لدينا ثابتة. وهذا يعني بغض النظر عن عدد العناصر نعطي خوارزمية لدينا، مهما كانت كبيرة لدينا مجموعة والفرز عليه أو القيام بكل ما سوف نقوم به إلى الصفيف دائما تأخذ نفس المقدار من الوقت. حتى نتمكن من أن تمثل فقط مع 1، والذي هو ثابت. ونحن ننظر أيضا في وقت التشغيل لوغاريتمي. حتى شيء من هذا القبيل البحث الثنائية لوغاريتمي، حيث قطعت نحن المشكلة في وقت كل نصف ومن ثم تصبح الأمور مجرد أعلى من هناك. وإذا كنت من أي وقت مضى على الكتابة في أي خوارزمية O مضروب، يجب عليك ربما لا اعتبار ذلك العمل يومك. عندما نقارن مرات تشغيل من المهم أن نأخذ في الاعتبار هذه الأمور. إذا كان الأمر كذلك لدي خوارزمية هذا O (n)، وشخص آخر وقد خوارزمية من O (2N) هذه هي في الواقع ما يعادل مقارب. إذا كان الأمر كذلك ونحن نتصور أن تكون ن عدد كبير مثل eleventy مليار: لذلك عندما نقوم بمقارنة eleventy مليار لشيء من هذا القبيل eleventy مليار + 3، فجأة أن +3 لا حقا أن تحدث فرقا كبيرا بعد الآن. هذا هو السبب ونحن في طريقنا لبدء النظر في هذه الأمور ليكون معادلا. حتى أشياء مثل هذه الثوابت هنا، وهناك 2 × بذلك، أو إضافة 3، هذه ليست سوى الثوابت، وهذه ستكون لإسقاط ما يصل. ولهذا السبب كل 3 من هذه الأوقات المدى هي نفسها قوله انهم O (N). وبالمثل، إذا كان لدينا 2 مرات أخرى تديرها، دعنا نقول O (ن ³ + 2N ²)، يمكننا أن نضيف + N، + 7، ثم لدينا آخر وقت التشغيل هذا فقط O (ن ³). مرة أخرى، وهذه هي نفس الشيء لأن هذه - وهذه ليست هي نفسها. هذه هي الأشياء نفسها، آسف. لذلك فان هذه هي نفسها لأن هذه ³ ن سوف تهيمن على هذه ² 2N. ما ليست هي الشيء نفسه هو اذا كان لدينا مثل تشغيل مرات O (ن ³) وO (ن ²) لأن هذا ³ n هو أكبر بكثير من هذا ² ن. حتى إذا كان لدينا الأس، وفجأة يبدأ هذا يهم، ولكن عندما نتعامل فقط مع عوامل ونحن هنا، ثم انها لن يهم لأنهم مجرد الذهاب إلى الانقطاع. دعونا نلقي نظرة على بعض من الخوارزميات رأيناه حتى الآن والحديث عن وقت التشغيل الخاصة بهم. الطريقة الأولى من البحث عن رقم في القائمة، وكان أن رأينا، والبحث الخطي. وتنفيذ بحث خطي واضح ومباشر عظمى. لدينا مجرد قائمة، ونحن سوف ننظر في كل عنصر واحد في القائمة حتى نجد عدد نبحث عنه. بحيث يعني أنه في أسوأ الحالات، وهذا O (N). ويمكن أسوأ الحالات يكون هنا إذا كان العنصر هو العنصر الأخير، ثم استخدام البحث الخطي علينا أن ننظر في كل عنصر واحد حتى نصل إلى آخر لمعرفة أنه كان في الواقع في القائمة. لا يمكننا التخلي تماما في منتصف الطريق ويقول: "انها على الارجح ليس هناك". مع البحث الخطي علينا أن ننظر في كل شيء. إدارة الوقت أفضل حال، من ناحية أخرى، هو ثابت لأنه في أفضل الأحوال العنصر الذي نبحث عنه هو مجرد أول واحد في القائمة. لذلك يحدث أن تأخذنا تماما 1 الخطوة، مهما كانت كبيرة والقائمة إذا كنا نبحث عن العنصر الأول في كل مرة. لذلك عند البحث، تذكر، أنها لا تتطلب أن يكون فرز قائمتنا. لأننا في طريقنا للنظر أكثر من مجرد عنصر واحد في كل، وأنه لا يهم حقا ما هو ترتيب هذه العناصر فيه. خوارزمية بحث أكثر ذكاء هو شيء من هذا القبيل البحث الثنائية. تذكر، وتنفيذ بحث ثنائية هو عندما كنت تريد الذهاب ل مواصلة البحث في منتصف القائمة. ولأننا نبحث في الوسط، ونحن تتطلب أن يتم فرز القائمة وإلا فإننا لا نعرف أين هو وسط، وعلينا أن ننظر أكثر قائمة كاملة للعثور عليه، وبعد ذلك في هذه النقطة نحن مجرد إضاعة الوقت. حتى إذا كان لدينا قائمة تم فرزها ونجد الوسط، ونحن في طريقنا لمقارنة الأوسط إلى العنصر الذي نبحث عنه. اذا كان مرتفع جدا، ثم يمكننا أن ننسى النصف الأيمن لأننا نعلم أن لدينا إذا عنصر بالفعل عالية جدا وكل شيء إلى يمين هذا العنصر هو أعلى من ذلك، ثم نحن لسنا بحاجة للبحث هناك بعد الآن. حيث من ناحية أخرى، إذا عنصر لدينا هو منخفض جدا، نحن نعرف كل شيء على يسار هذا العنصر هو أيضا منخفضة جدا، لذلك لا معنى لجعل حقا تبدو هناك، أيضا. بهذه الطريقة، مع كل خطوة، وفي كل مرة ننظر في منتصف القائمة، ونحن في طريقنا لخفض مشكلتنا في النصف بسبب فجأة ونحن نعلم في مجمله مجموعة من الأرقام التي لا يمكن أن يكون واحد ونحن تبحث عنه. في شبة الكود هذا من شأنه أن ننظر بشيء من هذا القبيل، وقطع لأننا القائمة في كل نصف الساعة واحدة، لدينا وقت التشغيل أسوأ الحالات يقفز من الخطية لوغاريتمي. حتى فجأة لدينا سجل في الخطوات من أجل العثور عنصر في القائمة. إدارة الوقت أفضل حال، رغم ذلك، لا يزال مستمر لأنه الآن، دعنا نقول فقط أن العنصر الذي نبحث عنه هو دائما منتصف الدقيق للقائمة الأصلية. حتى نتمكن من النمو لدينا قائمة كبيرة مثل نريد، ولكن إذا كان العنصر الذي نبحث عنه هو في الوسط، ثم انه لن يؤدي الا الى اتخاذ خطوة بنا 1. ولهذا السبب نحن O (سجل ن) وΩ (1) أو ثابت. دعونا بالفعل تشغيل ثنائي البحث في هذه القائمة. لذلك دعونا نقول اننا نبحث عن العنصر 164. أول شيء سنقوم به هو العثور على نقطة الوسط من هذه القائمة. انها مجرد أن ذلك يحدث في نقطة الوسط هو الذهاب الى الوقوع في هذه الأرقام بين 2، لذلك دعونا نقول فقط تعسفا، في كل مرة تقع نقطة الوسط بين 2 الأرقام، دعونا جولة للتو. نحن بحاجة فقط للتأكد من أننا نفعل ذلك في كل خطوة على الطريق. لذلك نحن ذاهبون الى محاصرة، ونحن في طريقنا إلى القول أن 161 هو وسط قائمتنا. حتى 161 <164، وكل عنصر إلى اليسار من 161 هو أيضا <164، لذلك نحن نعلم أنه لن يساعدنا على الإطلاق للبدء في النظر إلى هنا لأن العنصر الذي نبحث عنه لا يمكن أن يكون هناك. ذلك ما يمكننا القيام به هو أننا يمكن أن ينسوا أن حوالي نصف من الزمن كاملة من القائمة، والآن ننظر فقط من حق فصاعدا 161. ذلك مرة أخرى، وهذا هو نقطة الوسط، دعونا حتى مجرد جولة. الآن 175 كبير جدا. لذلك نحن نعلم انه لن يساعدنا يبحث هنا أو هنا، حتى نتمكن من مجرد رمي بعيدا أن، وسنقوم في نهاية المطاف ضرب 164. أي أسئلة حول البحث الثنائية؟ دعنا ننتقل من البحث من خلال قائمة بالفعل مصنفة بالفعل اخذ لقائمة من الأرقام في أي أمر وجعل تلك القائمة في ترتيب تصاعدي. كانت تسمى الخوارزمية الأولى التي نظرت في نوع فقاعة. وهذا من شأنه أن يكون أكثر بساطة من الخوارزميات رأينا. نوع فقاعة يقول أنه عندما الأركان 2 أي داخل القائمة هي خارج المكان، وهذا يعني وجود عدد أكبر من اليسار إلى عدد أقل، ثم ونحن في طريقنا لمقايضتهم، لأن ذلك يعني أن القائمة ستكون "أكثر مصنفة" مما كان عليه من قبل. ونحن في طريقنا لمجرد مواصلة هذه العملية مرارا وتكرارا، ومرة ​​أخرى حتى في نهاية المطاف نوع من فقاعة عناصر إلى موقعها الصحيح وليس لدينا قائمة تم فرزها. وقت التشغيل هذا سيكون O (ن ²). لماذا؟ حسنا، لأنه في أسوأ الحالات، ونحن في طريقنا إلى اتخاذ كل عنصر، و ونحن في طريقنا إلى نهاية المطاف مقارنتها على كل عنصر آخر في القائمة. ولكن في أحسن الأحوال، لدينا قائمة تم فرزها بالفعل، فقاعة نوع من مجرد الذهاب من خلال الذهاب الى مرة واحدة، ويقول "كلا، وأنا لم تتقدم أي مقايضة، لذلك أنا فعلت." لذلك لدينا الوقت أفضل حالة تشغيل Ω (ن). دعونا تشغيل نوع فقاعة على القائمة. أو أولا، دعونا ننظر فقط في بعض شبة الكود بسرعة حقا. نريد أن نقول أننا نريد أن تتبع، في كل تكرار للحلقة، بمراقبة ما إذا كان أو لا غيرنا أي عناصر. وبالتالي فإن السبب في ذلك هو، ونحن في طريقنا لوقف عندما يكون لدينا أي عناصر لا تبديل. حتى في بداية حلقة لدينا أننا لم تبادلت أي شيء، لذلك نحن نقول هذا سوف كاذبة. الآن، ونحن في طريقنا للذهاب من خلال قائمة وقارن بين العنصر الأول إلى العنصر الأول + 1 وإذا كان صحيحا أن هناك عددا أكبر على يسار عدد أقل، ثم ونحن في طريقنا فقط لمقايضتهم. ثم ونحن في طريقنا إلى أن نتذكر أننا تبادلت عنصر. وهذا يعني أننا في حاجة إلى الذهاب من خلال قائمة لا يقل عن 1 المزيد من الوقت لأن الشرط الذي توقفنا هو عندما يتم فرز القائمة بالفعل كلها، هذا يعني أننا لم تقدم أي مقايضة. ولهذا السبب وضعنا هنا إلى أسفل "في حين تم تبديل بعض العناصر." حتى الآن دعونا ننظر فقط في هذا يعمل على القائمة. لدي قائمة 5،0،1،6،4. نوع فقاعة سوف تبدأ على طول الطريق على اليسار، وانه سيكون لمقارنة العناصر ط، ط 0 إلى ذلك + 1، وهو العنصر 1. انها سوف يقول، وأيضا 5> 0، ولكن في الوقت الحالي 5 هو إلى اليسار، لذلك أنا بحاجة لمبادلة ال 5 و 0 من. عندما كنت مقايضتهم، وفجأة أحصل على هذه القائمة مختلفة. الآن 5> 1، لذلك نحن ذاهبون لمقايضتهم. 5 ليس> 6، لذلك نحن لسنا في حاجة لفعل أي شيء هنا. ولكن 6> 4، لذلك نحن بحاجة لمبادلة. مرة أخرى، نحن بحاجة إلى تشغيل من خلال قائمة كاملة لاكتشاف النهاية أن هذه هي خارج الترتيب، ونحن مقايضتهم، ونحن في هذه المرحلة تحتاج إلى تشغيل من خلال قائمة وقت 1 أكثر للتأكد من أن كل شيء على ما في نظامها، وفي هذا النوع فقاعة نقطة الانتهاء و. خوارزمية مختلفة لأخذ بعض العناصر والفرز لهم هو نوع الاختيار. الفكرة وراء اختيار نوع هو أننا ذاهبون لبناء جزء من قائمة مصنفة 1 عنصر في المرة الواحدة. والطريقة ونحن في طريقنا لتحقيق ذلك هي عن طريق بناء الجزء الأيسر من القائمة. وأساسا، كل - على كل خطوة، ونحن في طريقنا لأخذ أصغر عنصر أننا لم يقم التي لم يتم فرزها حتى الآن، ونحن في طريقنا لنقلها إلى تلك الشريحة التي تم فرزها. هذا يعني أننا بحاجة إلى إيجاد باستمرار العنصر الحد الأدنى التي لم يتم فرزها ثم أخذ هذا العنصر الحد الأدنى ومبادلتها مع أي أقصى اليسار العناصر التي لم يتم فرزها. وقت التشغيل هذا سيكون O (ن ²) لأنه في أسوأ الحالات نحن في حاجة إلى المقارنة كل عنصر واحد إلى كل عنصر آخر. لأننا نقول أنه إذا بدأنا في النصف الأيسر من قائمة، ونحن بحاجة من خلال الذهاب الى الجزء كامل الحق للعثور على أصغر عنصر. وبعد ذلك، مرة أخرى، نحن بحاجة للذهاب على الجزء كامل الحق و الاستمرار على ذلك مرارا وتكرارا وتكرارا. وهذا سوف يكون ن ². ونحن في طريقنا إلى حاجة الى داخل حلقة لآخر حلقة لل مما يوحي ن ². في أفضل الأحوال الفكر، دعنا نقول أننا إعطائها قائمة مصنفة بالفعل؛ ونحن في الواقع لا تفعل أي أفضل من ² ن. لأن نوع الاختيار ليس لديه وسيلة لمعرفة ذلك العنصر الحد الأدنى هو مجرد واحدة وأنا يحدث أن تبحث في. ما زال يحتاج للتأكد من أن هذا هو في الواقع الحد الأدنى. والطريقة الوحيدة للتأكد من أنه الحد الأدنى، وذلك باستخدام هذه الخوارزمية، هو أن ننظر إلى كل عنصر واحد مرة أخرى. ذلك حقا، إذا كنت تعطيه - إذا كنت تعطي نوع الاختيار من قائمة تم فرزها بالفعل، انها لن تفعل أي أفضل من دفعها إلى القائمة التي يتم حتى الآن غير مصنفة. بالمناسبة، إذا كان يحدث أن تكون حالة ان هناك شيئا O (شيء) وأوميغا من شيء، يمكننا أن نقول فقط أكثر وضوحا أنه θ لشيء ما. لذلك إذا كنت ترى أن الخروج في أي مكان، وهذا ما يعني أن للتو. إذا كان شيء ما ثيتا ن ²، فإنه على حد سواء O كبيرة (ن ²) وΩ (ن ²). حتى أفضل الأحوال وأسوأ الحالات، فإنه لا يحدث فرقا، الخوارزمية سوف تفعل الشيء نفسه في كل مرة. لذلك هذا هو ما شبة الكود لاختيار نوع يمكن أن تبدو. ونحن في طريقنا أساسا أن أقول إنني أريد أن تكرار عبر قائمة من اليسار إلى اليمين، وعلى كل التكرار من الحلقة، وانا ذاهب للانتقال العنصر الحد الأدنى في هذا الجزء تم الفرز القائمة. وبمجرد أن تحرك شيئا هناك، وأنا لا نحتاج إلى النظر في هذا العنصر مرة أخرى. لأن بمجرد أن عنصرا في مبادلة إلى الجزء الأيسر من القائمة، فإنه يتم فرز لأننا نبذل كل ما في ترتيب تصاعدي باستخدام الحد الأدنى. ذلك قلنا، حسنا، نحن في موقف الأول، ونحن بحاجة الى ان ننظر في جميع العناصر إلى يمين كنت في أجل العثور على الحد الأدنى. وهذا يعني أننا نريد أن ننظر من 1 + i لنهاية القائمة. والآن، إذا كان العنصر الذي نبحث حاليا في أقل من الحد الأدنى لدينا حتى الآن، التي تذكر، ونحن بدأنا في الخروج إلى الدنيا يكون مجرد أيا كان عنصر نحن حاليا في، وأنا سوف نفترض أن هذا هو الحد الأدنى. إذا وجدت أحد العناصر التي أصغر من ذلك، ثم أنا أريد أن أقول، حسنا، حسنا، لقد وجدت ما لا يقل جديدة. انا ذاهب الى أن تتذكر أين كان الحد الأدنى. حتى الآن، لقد ذهبت مرة واحدة من خلال القطعة التي لم يتم فرزها الحق، ويمكنني أن أقول أنا ذاهب لمبادلة العنصر الحد الأدنى مع العنصر الذي هو في موقف ط. أن يحدث لبناء قائمتي، نصيبي من قائمة مصنفة من اليسار إلى اليمين، ونحن لسنا بحاجة من أي وقت مضى للنظر في عنصر مرة اخرى انها في هذا الجزء. مرة واحدة لقد تبادلت نحن عليه. لذلك دعونا تشغيل نوع الاختيار على هذه القائمة. العنصر الأزرق هنا ستكون في الأول، والعنصر الأحمر ستكون العنصر الحد الأدنى. لذلك أنا يبدأ كل وسيلة على يسار القائمة، وذلك في 5. الآن نحن بحاجة للعثور على العنصر الحد الأدنى التي لم يتم فرزها. ولذلك نقول 0 <5، 0 هو الحد الأدنى حتى بلدي جديد. ولكن لا أستطيع أن تتوقف عند هذا الحد، لأن على الرغم من أننا يمكن أن ندرك أن 0 هو أصغر، نحن بحاجة لتشغيل من خلال كل عنصر آخر من القائمة للتأكد. 1 هو أكبر حتى، 6 هو أكبر، 4 أكبر. وهذا يعني أنه بعد النظر في جميع هذه العناصر، لقد تحدد 0 هو أصغر. لذلك أنا ذاهب لمبادلة ال 5 و 0 من. مرة واحدة أن مبادلة، انا ذاهب للحصول على قائمة جديدة، وأنا أعلم أنني بحاجة الى ان ننظر أبدا في ذلك 0 مرة أخرى لأنه بمجرد لقد تبادلت ذلك، لقد تم الفرز I عليه وننتهي. الآن مجرد أن ذلك يحدث العنصر الأزرق مرة أخرى 5، ونحن بحاجة الى ان ننظر في 1، 6 و 4 على لتحديد أن 1 هو العنصر أصغر الدنيا، ولذا فإننا سوف مبادلة 1 و 5 و. مرة أخرى، نحن بحاجة الى ان ننظر في - مقارنة 5 إلى 6 و 4 و، ونحن في طريقنا للمبادلة 4 و 5، وأخيرا مقارنة، هذه الأرقام 2 و مقايضتهم حتى نحصل على قائمتنا فرزها. أي أسئلة حول نوع الاختيار؟ حسنا. دعنا ننتقل إلى موضوع آخر هنا، وهذا هو العودية. العودية، وتذكر، وهذا هو الشيء ميتا حقا حيث وظيفة يدعو مرارا وتكرارا نفسها. حتى في مرحلة ما، في حين لدينا فوكتيون تدعو مرارا وتكرارا نفسها، يجب أن يكون هناك بعض النقطة التي توقفنا يدعو أنفسنا. لأنه إذا لم نفعل ذلك، ثم ونحن في طريقنا فقط لمواصلة القيام بذلك إلى الأبد، وبرنامجنا هو عدم الذهاب الى إنهاء. نحن نسمي هذا الشرط حالة القاعدة. وقضية القاعدة تقول، بدلا من استدعاء الدالة مرة أخرى، انا فقط لإعادة بعض القيمة. حتى مرة واحدة لدينا إرجاع قيمة، لقد توقفنا يدعو أنفسنا، ويمكن للبقية المكالمات التي قمنا بها حتى الآن العودة أيضا. على العكس من الحالة الأساسية هي الحالة العودية. وهذا هو عندما نريد أن نجعل مكالمة أخرى إلى الدالة أننا حاليا. ونحن على الأرجح، وإن لم يكن دائما، تريد استخدام الوسائط المختلفة. إذا كان الأمر كذلك لدينا دالة يسمى F و F فقط ودعا تأخذ 1 الحجة، ونحن نستمر الدعوة و (1)، و (1)، و (1)، وأنه مجرد أن ذلك يحدث 1 حجة يقع في حالة متكررة، ونحن لا تزال لن تتوقف. حتى لو لدينا الحالة الأساسية، ونحن بحاجة للتأكد من أن في نهاية المطاف ونحن في طريقنا ليصل هذه الحالة قاعدة. نحن لا تبقي فقط البقاء في هذه الحالة متكررة. عموما، عندما ندعو أنفسنا، ونحن الارجح ستكون لدينا حجة مختلفة في كل مرة. هنا وظيفة بسيطة حقا العودية. ولذلك فإن هذا حساب مضروب عدد. أعلى حتى هنا لدينا قاعدة حالتنا. في حالة أن ن ≤ 1، ونحن لن ندعو مضروب مرة أخرى. ونحن في طريقنا لوقف، ونحن في طريقنا للعودة فقط بعض القيمة. إذا لم يكن هذا صحيحا، ثم ونحن في طريقنا ليصل حالتنا متكررة. تلاحظ هنا أننا لا ندعو فقط مضروب (ن)، لأن ذلك لن يكون مفيدا للغاية. ونحن في طريقنا للدعوة مضروب شيء آخر. وحتى تستطيع أن ترى، إذا في نهاية المطاف نحن تمرير شيء مضروب (5) أو، ونحن في طريقنا للدعوة مضروب (4) وهلم جرا، ونحن في طريقنا في نهاية المطاف لتصل إلى هذه الحالة قاعدة. ولذلك فإن هذا يبدو جيدا. دعونا نرى ما يحدث عندما نقوم بتشغيل هذا الواقع. هذا هو مكدس، ودعونا نقول أن أهم هو الذهاب الى استدعاء هذه الدالة مع وسيطة (4). لذلك يرى ومضروب مرة واحدة = 4، سيدعو مضروب نفسها. الآن، فجأة، لدينا مضروب (3). لذلك فان هذه الوظائف ستكون لتستمر في النمو حتى في نهاية المطاف نحن حالتنا ضرب القاعدة. عند هذه النقطة، القيمة المرجعة من هذا هو عودة (NX القيمة المرجعة من هذا)، القيمة المرجعة من هذا NX القيمة المرجعة من هذا. في نهاية المطاف نحن بحاجة ليصل عدد بعض. في الجزء العلوي هنا، نقول العودة 1. وهذا يعني أنه بمجرد أن نعود هذا العدد، يمكننا البوب ​​قبالة هذا المكدس. لذلك هذا مضروب (1) هو القيام به. عندما 1 إرجاع، هذا مضروب (1) العودة، هذه العودة إلى 1. القيمة المرجعة من هذا، وتذكر، وكان NX القيمة المرجعة من هذا. فجأة، هذا الرجل يعرف أن أريد العودة 2. تذكر ذلك، والعودة قيمة هذا هو NX فقط قيمة الإرجاع هنا. حتى الآن يمكن أن نقول 3 × 2، وأخيرا، وهنا يمكن أن نقول هذا هو الذهاب لمجرد أن يكون 4 × 3 × 2. ومرة واحدة هذا يعود، وحصلنا على وصولا الى داخل عدد صحيح واحد من الرئيسي. أي أسئلة حول العودية؟ حسنا. ولذلك لا يوجد المزيد من الوقت لطرح الأسئلة في نهاية المطاف، ولكن الآن سوف جوزيف تغطية الموضوعات المتبقية. [جوزيف أونج] حسنا. حتى الآن بعد أن تحدثنا عن recursions، دعونا نتحدث قليلا عن ما هو نوع دمج. دمج النوع هو في الأساس وسيلة أخرى من فرز قائمة من الأرقام. وكيف يعمل هو، مع دمج النوع لديك قائمة، وهذا ما نقوم به نقول، دعونا تقسيم هذا إلى 2 نصفين. سنقوم أولا تشغيل دمج النوع مرة أخرى على النصف الأيسر، ثم سنقوم بتشغيل دمج النوع في النصف الأيمن، وهذا يعطينا الآن 2 نصفين أن يتم فرز، والآن ونحن في طريقنا إلى الجمع بين تلك نصفين معا. انها قليلا من الصعب أن نرى دون كمثال على ذلك، ولذا فإننا سوف تذهب من خلال الاقتراحات ونرى ما سيحدث. لذلك عليك أن تبدأ مع هذه القائمة، ونحن تقسيمه إلى 2 نصفين. نحن تشغيل دمج النوع على النصف الأيسر أولا. ذلك أن النصف الأيسر، والآن نحن تشغيلها من خلال هذه القائمة مرة أخرى مرت يحصل في النوع الذي دمج، ثم ننظر، مرة أخرى، في الجانب الأيسر من هذه القائمة، ونحن تشغيل دمج النوع على ذلك. الآن، ونحن ننكب على قائمة من 2 الأرقام، والآن النصف الأيسر هو فقط 1 عنصر طويل، وأننا لا نستطيع تقسيم قائمة هذا العنصر فقط 1 في نصف، لذلك نحن نقول فقط، مرة واحدة لدينا 50، الذي هو مجرد 1 عنصر، يتم فرز بالفعل. مرة ننتهي مع ذلك، يمكننا أن نرى أن في وسعنا الانتقال إلى النصف الأيمن من هذه القائمة، وأيضا يتم فرز 3، وحتى الآن بعد أن يتم فرز كل شطر من هذه القائمة يمكننا الانضمام إلى هذه الأرقام معا مرة أخرى. لذلك نحن ننظر إلى 50 و 3؛ 3 هو أصغر من 50، لذلك يذهب في أول ثم 50 يأتي فيها الآن، انها فعلت ذلك؛ نعود إلى تلك القائمة والترتيب انها النصف الأيمن. 42 هو عدد بحد ذاته، لذلك تم الفرز بالفعل. حتى الآن ما قارنا هذه 2 و 3 أصغر من 42، بحيث يحصل في وضع الأول، الآن يحصل على 42 في وضع، ويحصل على وضع 50 في. الآن، وهذا فرزها، نذهب كل في طريق العودة إلى الأعلى، و 1337، و 15. حسنا، نحن ننظر الآن في النصف الأيسر من هذه القائمة؛ 1337 هو في حد ذاته حتى فإنه يتم فرز ونفس الشيء مع 15. لذلك نحن الآن الجمع بين هذه الأرقام من 2 إلى فرز هذه القائمة الأصلية، 15 <1337، لذلك يذهب في البداية، ثم يذهب فيها 1337 وفرزها ونحن الآن كل شطر من القائمة الأصلية لأعلى ومن أعلى. وكل ما عليك القيام به هو الجمع بين هذه. ننظر إلى الأرقام الأولى 2 من هذه القائمة، 3 <15، لذلك يذهب الى مجموعة النوع الأول. 15 <42، لذلك يذهب فيها الآن، 42 <1337، الذي يذهب فيه. 50 <1337، لذلك يذهب فيها. وتلاحظ أن أخذنا أرقام فقط 2 الخروج من هذه القائمة. لذلك نحن لا فقط بالتناوب بين القوائم 2. نحن نبحث فقط في البداية، ونحن مع العنصر هذا أصغر ومن ثم وضعه في مجموعتنا. الآن لقد دمجنا كل نصفين وننتهي. أي أسئلة حول دمج النوع؟ نعم؟ [طالب] إذا كان تقسيم إلى مجموعات مختلفة، لماذا لا تقسيم لمرة واحدة فقط وكان لديك 3 و 2 في مجموعة؟ [بقية السؤال غير مفهومة] السبب - وبالتالي فإن السؤال هو، لماذا لا نستطيع دمج منهم فقط في ذلك الخطوة الأولى بعد أن يكون لهم؟ السبب في أننا يمكن أن نفعل ذلك، تبدأ في عناصر أقصى اليسار من كلا الجانبين، ثم أخذ أصغر واحد ووضعها في، هو أننا نعرف أن هذه قوائم الفردية في أوامر تم فرزها. إذا كان الأمر كذلك أنا أبحث في عناصر أقصى اليسار من كل شطر، وأنا أعلم انهم ذاهبون ليكون أصغر عناصر تلك القوائم. حتى أتمكن من وضعها في بقع أصغر عنصر من هذه القائمة الكبيرة. من ناحية أخرى، إذا كنت تبحث في هذه القوائم 2 في المستوى الثاني هناك، 50، 3، 42، 1337 و15، لا يتم فرز تلك. إذا كان الأمر كذلك أنظر إلى 50 و 1337، وأنا ذاهب إلى وضع 50 في قائمتي الأولى. ولكن هذا لا يجعل حقا المعنى، لأن 3 هو أصغر عنصر من كل هؤلاء جميعا. وبالتالي فإن السبب الوحيد الذي يمكننا القيام بهذه الخطوة لأن الجمع بين يتم تصنيف بالفعل قوائمنا. وهذا هو السبب علينا أن ننكب على طول الطريق إلى أسفل لأن عندما يكون لدينا عدد واحد فقط، وتعلمون أن عدد واحد في حد ذاته هو بالفعل قائمة فرزها. أي أسئلة؟ لا؟ التعقيد؟ حسنا، يمكنك أن ترى أن في كل خطوة هناك أرقام نهاية، ويمكن أن نقسم قائمة في 1/2 سجل n مرة، وهو الى اين نحصل على هذا السجل X ن ن التعقيد. وسترى أفضل الأحوال لدمج النوع هو ن ن سجل، ويحدث ذلك فقط حتى أن أسوأ الحالات، أو Ω هناك، أيضا ن ن تسجيل الدخول. شيء أن نأخذ في الاعتبار. الانتقال، دعونا نذهب إلى ملف بعض السوبر الأساسية I / O. إذا كنت نظرت إلى التدافع، ستلاحظ كان لدينا نوع من النظام حيث يمكن الكتابة إلى ملف السجل إذا كنت تقرأ من خلال التعليمات البرمجية. دعونا نرى كيف يمكن القيام بذلك. حسنا، لدينا fprintf، والتي يمكن ان يخطر لك لل printf تماما كما، ولكن فقط طباعة إلى ملف بدلا من ذلك، وبالتالي و في البداية. هذا النوع من التعليمات البرمجية هنا حتى، ما تقوم به هو، كما قد شهدت في التنافس، وغني عن طريق الطباعة الخاصة بك مجموعة من الأبعاد 2-من صف ما كانت الأرقام. في هذه الحالة، يطبع printf إلى محطة أو ما نسميه الإخراج القياسي من القسم. والآن، في هذه الحالة، كل ما عليك القيام به هو استبدال printf مع fprintf، أقول ذلك ما الملف الذي تريد الطباعة إلى، وفي هذه الحالة فإنه يطبع فقط إلى هذا الملف بدلا من طباعته إلى محطة الخاص بك. حسنا فان ذلك يطرح السؤال: أين نحصل على هذا النوع من الملفات من بينها، أليس كذلك؟ مرت علينا تسجيل الدخول إلى هذا فوكتيون fprintf لكن كان لدينا أي فكرة من أين جاء. حسنا، في وقت مبكر من التعليمات البرمجية، ما لدينا كان هذا جزء من التعليمات البرمجية أكثر من هنا، التي تقول أساسا يمكن فتحها ملف يدعو log.txt. ما نقوم به بعد ذلك هو ان لدينا للتأكد من أن يتم فتح الملف بنجاح في الواقع. لذا قد تفشل لأسباب متعددة؛ لم يكن لديك مساحة كافية على جهاز الكمبيوتر الخاص بك، على سبيل المثال. لذلك فمن المهم دائما قبل أن تفعل أي عمليات مع الملف أن نتحقق ما إذا تم فتح هذا الملف بنجاح. فما أن، وهذا حجة لالدالة fopen، حسنا، يمكننا فتح ملف في نواح كثيرة. ما يمكننا القيام به هو، لا يمكننا نقله ث، وهو ما يعني تجاوز الملف إذا كان خروجها بالفعل، يمكننا تمرير ل، التي إلحاق إلى نهاية الملف بدلا من تجاوز ذلك، أو يمكننا تحديد R، الأمر الذي يعني، دعونا فتح الملف للقراءة فقط. إذا كان الأمر كذلك يحاول البرنامج إجراء أية تغييرات على الملف، يصيح عليهم وعدم السماح لهم القيام بذلك. وأخيرا، مرة واحدة ننتهي مع الملف، وفعلت القيام بعمليات على ذلك، نحن بحاجة للتأكد من أننا إغلاق الملف. وذلك في نهاية البرنامج الخاص بك، وأنت تسير لتمرير لهم مرة أخرى هذا الملف الذي فتح لك، وعلى مقربة فقط. لذلك هذا هو شيء مهم أن يكون لديك للتأكد من أنك تفعل. تذكر حتى تتمكن من فتح ملف، ثم يمكنك الكتابة إلى ملف، القيام بعمليات في الملف، ولكن بعد ذلك لديك لإغلاق الملف في نهاية المطاف. أي أسئلة حول الملفات الأساسية I / O؟ نعم؟ [سؤال الطالب، غير مفهومة] الحق هنا. والسؤال هو، أين هذا الملف log.txt تظهر؟ حسنا، إذا كنت تعطي فقط log.txt، فإنه ينشئ في نفس الدليل القابل للتنفيذ. إذا كان الأمر كذلك أنت الآن على - >> [سؤال الطالب، غير مفهومة] نعم. في نفس المجلد، أو في نفس الدليل، كما تسمونه. الآن الذاكرة، المكدس، وكومة. فكيف هي الذاكرة المنصوص عليها في جهاز الكمبيوتر؟ حسنا، يمكنك أن تتخيل الذاكرة ونوع من هذه الكتلة هنا. وفي الذاكرة لدينا ما يسمى كومة عالقة هناك، وهذا هو مكدس الى هناك. وينمو كومة كومة الهبوط وينمو إلى أعلى. وذلك ذكر تومي - أوه، حسنا، ونحن لدينا هذه الشرائح الأخرى 4 التي سوف تحصل على في الثانية - كما قال في وقت سابق تومي، وانت تعرف كيف مهامه يسمون أنفسهم والاتصال ببعضهم البعض؟ وهم يعملون على تعزيز هذا النوع من الإطار المكدس. حسنا، إذا المكالمات الرئيسي فو، ويحصل على وضع فو على المكدس. فو يدعو بار، بار في الحصول على وضعت على المكدس، وأن يحصل على وضعه على كومة بعد. وبعد عودتهم، فإنهم الحصول على كل سحبه من المكدس. ماذا كل هذه المواقع والذاكرة عقد؟ حسنا، الأعلى، الذي هو جزء النص، يحتوي على البرنامج نفسه. وبالتالي فإن رمز الجهاز، وهذا هناك، وبمجرد تجميع البرنامج. المقبل، أي تهيئة المتغيرات العالمية. ولذلك عليك المتغيرات العالمية في البرنامج الخاص بك، وكنت أقول مثل، 5 =، أن يحصل على وضعها في هذا الجزء، والحق في إطار ذلك، لديك أي بيانات غير مهيأ العالمي، الذي الباحث مجرد، ولكنك لا نقول انها تساوي شيئا. تحقيق هذه هي المتغيرات العالمية، حتى انهم خارج الرئيسي. لذلك هذا يعني أية متغيرات العالمية التي تم تعريفها ولكن لا يتم تهيئة. حتى ما هو في كومة؟ تخصيص الذاكرة باستخدام malloc، والتي سوف نحصل عليها في قليلا. وأخيرا، مع مكدس لديك أية متغيرات المحلية وأية وظائف قد استدعاء في أي من المعلمات الخاصة بهم. آخر شيء، لم يكن لديك حقا أن تعرف ما تفعل متغيرات البيئة، ولكن كلما قمت بتشغيل البرنامج، هناك شيء المرتبطة بها، مثل هذا هو اسم الشخص الذي كان يدير البرنامج. والتي ستكون من نوع في الأسفل. من حيث عناوين الذاكرة، والتي هي القيم الست عشرية، القيم في بداية الأعلى في 0، ويذهبون على طول الطريق إلى أسفل. في هذه الحالة، إذا كنت على نظام 32 بت، عنوان في أسفل ستكون 0x، تليها بالعربية، لأن هذا هو 32 بت، الذي هو 8 بايت، و في هذه الحالة 8 بايت يتوافق مع أرقام ست عشرية 8. حتى إلى هنا وأنت تسير أن يكون، مثل، 0xffffff، وهناك ما يصل كنت ستكون لدينا 0. فما هي المؤشرات؟ قد لا بعضكم قد غطت ذلك في القسم من قبل. ولكننا لم نذهب أكثر من ذلك في محاضرة، لذلك مؤشر هو مجرد نوع البيانات الذي يخزن، بدلا من نوع ما من قيمة مثل 50، فإنه يخزن عنوان الموقع بعض في الذاكرة. مثل تلك الذاكرة (غير مفهوم). حتى في هذه الحالة، ما لدينا هو، لدينا مؤشر إلى عدد صحيح أو عدد صحيح *، وأنه يحتوي على هذا العنوان الست عشرية من 0xDEADBEEF. ذلك ما لدينا هو، الآن، يشير هذا المؤشر في مكان في الذاكرة، وهذا مجرد، وقيمة 50 هو في هذا الموقع الذاكرة. على بعض أنظمة 32 بت، على جميع أنظمة 32 بت، مؤشرات يستغرق 32 بت أو بايت 4. ولكن، على سبيل المثال، على نظام 64 بت، مؤشرات هي 64 بت. لذلك هذا شيء سترغب أن نأخذ في الاعتبار. إلى ذلك نهاية نظام بت، بت هو مؤشر نهاية فترة طويلة. مؤشرات هي نوع من الصعب هضم دون اشياء اضافية، لذلك دعونا نذهب من خلال مثال على تخصيص الذاكرة الديناميكية. ذاكرة ديناميكية تخصيص ما لا للكم، أو ما نسميه malloc، فإنه يتيح لك تخصيص نوع من البيانات خارج المجموعة. لذلك هذا النوع من البيانات أكثر ديمومة لمدة البرنامج. لأنه كما تعرفون، إذا قمت بتعريف X داخل دالة، والتي ترجع الدالة، لم يعد لديك الوصول إلى البيانات التي تم تخزينها في العاشر. ما المؤشرات دعونا القيام به هو أنها تسمح لنا تخزين الذاكرة أو تخزين القيم في قطعة مختلفة من الذاكرة، أي كومة. الآن نعود مرة من الوظيفة، ما دام لدينا مؤشر إلى ذلك الموقع في الذاكرة، ثم ما يمكننا القيام به هو أننا يمكن أن مجرد إلقاء نظرة على القيم هناك. دعونا ننظر إلى مثال على ذلك: هذا هو لدينا تخطيط الذاكرة مرة أخرى. ونحن لدينا هذه الوظيفة، الرئيسية. ما يفعله هو - حسنا، بسيطة جدا، أليس كذلك -؟ الباحث س = 5، هذا مجرد متغير في بنية تخزين العناصر الرئيسية في. من ناحية أخرى، ونحن الآن نعلن مؤشر الذي يستدعي giveMeThreeInts ظيفة. وحتى الآن نذهب إلى هذه الوظيفة ونحن إنشاء إطار جديد مكدس لذلك. ومع ذلك، في هذا الإطار مكدس، نعلن الباحث * درجة الحرارة، أعداد صحيحة في 3 التي mallocs بالنسبة لنا. لذلك سوف حجم كثافة العمليات تعطينا عدد البايتات هذا الباحث هو، وmalloc يعطينا أن العديد بايت من المساحة على الكومة. حتى في هذه الحالة، وقد انشأنا مساحة كافية لمدة 3 أعداد صحيحة، وهناك طريقة الكومة تصل، وهذا هو السبب لقد رسمها على مستوى اعلى. مرة ننتهي، نعود هنا، وكنت بحاجة فقط 3 رجات عاد، وتقوم بإرجاع عنوان، في هذه الحالة أكثر من حيث أن الذاكرة. وضعنا المؤشر = التبديل، وهناك ما يصل لدينا مجرد مؤشر. ولكن ما أن ترجع الدالة مكدسة هنا ويختفي. حتى يختفي درجة الحرارة، ولكننا لا تزال تحافظ على عنوان حيث تلك الأعداد الصحيحة 3 هي داخل أنابيب. حتى في هذه المجموعة، هي مؤشرات خاصة بتطبيق محليا للإطار مكدسة، لكن الذاكرة التي تشير إليها هي في كومة. هل هذا معقول؟ [طالب] هل يمكن أن يتكرر ذلك؟ >> [يوسف] نعم. حتى اذا عدت قليلا، سترى أن درجة الحرارة المخصصة بعض الذاكرة على الكومة هناك. لذلك عندما هذه الوظيفة، giveMeThreeInts العودة، هذا المكدس هنا سوف تختفي. ومعها أي من المتغيرات، في هذه الحالة، وهذا مؤشر التي تم تخصيصها في إطار مكدسة. ما يحدث أن تختفي، ولكن منذ عدنا TEMP وضعنا المؤشر = TEMP، يجري الآن مؤشر للإشارة نفس الذاكرة من الموقع كما كان مؤقت. حتى الآن، على الرغم من أننا تفقد الحرارة، وهذا مؤشر المحلية، ونحن لا تزال تبقي على عنوان الذاكرة ما كان لافتا لهذا المؤشر من داخل متغير. الأسئلة؟ يمكن أن يكون نوع من الخلط بين الموضوع إذا لم تكن قد ذهبت أكثر من ذلك في القسم. يمكننا، TF الخاص بك وسوف تذهب بالتأكيد أكثر من ذلك وطبعا لا يمكن الإجابة على الأسئلة في نهاية الدورة تقييم لهذا. ولكن هذا هو نوع من موضوع معقد، وليس لدي مزيد من الأمثلة التي سوف تظهر من شأنها أن تساعد المؤشرات توضيح ما هي في الواقع. في هذه الحالة، مؤشرات تعادل صفائف، حتى أتمكن من مجرد استخدام هذا المؤشر كما نفس الشيء كصفيف الباحث. لذلك أنا في فهرسة 0، وتغيير عدد صحيح أول من 1، تغيير عدد صحيح الثاني إلى 2، وعدد صحيح 3 إلى 3. أكثر من ذلك على مؤشرات. حسنا، أذكر Binky. في هذه الحالة قد خصصنا مؤشر، أو أعلنا مؤشر، ولكن في البداية، عندما أعلن I مجرد مؤشر، انها ليست لافتا إلى أي مكان في الذاكرة. انها القيم القمامة فقط داخل منه. لذلك ليس لدي أي فكرة عن مكان هذا المؤشر يشير إلى. أنه يحتوي على عنوان الذي يملأ فقط مع ل0 و 1 حيث لأعلن في البداية. لا أستطيع أن أفعل أي شيء مع هذا حتى أعطي الكلمة malloc عليه وبعد ذلك يعطيني مساحة صغيرة على كومة أين يمكنني وضع القيم في الداخل. مرة أخرى، أنا لا أعرف ما هو داخل هذه الذاكرة. لذا فإن أول شيء يجب أن أقوم به هو التحقق ما إذا كان النظام ذاكرة كافية أن تعطيني السابق 1 عدد صحيح في المقام الأول، وهذا هو السبب وأنا أفعل هذا الاختيار. إذا مؤشر باطل، وهذا يعني أنه لم يكن لديك مساحة كافية أو بعض خطأ أخرى وقعت، لذلك ينبغي I الخروج من برنامجي.  ولكن إذا فعلت تنجح، والآن يمكنني استخدام هذا المؤشر وما يفعله هو مؤشر * ويترتب حيث كان العنوان إلى حيث القيمة بعد، ويحدد ذلك يساوي 1. حتى أكثر من هنا، نحن فحص إذا كان ذلك موجودا الذاكرة. بمجرد أن تعرف أنه موجود، يمكنك وضع فيه ما القيمة التي تريد وضعت فيه، وفي هذه الحالة 1. مرة ننتهي معها، تحتاج إلى تحرير هذا المؤشر لأننا بحاجة إلى العودة إلى النظام الذي الذاكرة التي سألت عنها في المقام الأول. لأن الكمبيوتر لا يعرف متى ننتهي معها. في هذه الحالة نحن نقول صراحة، حسنا، ننتهي مع تلك الذاكرة. إذا كان بعض عملية أخرى يحتاج إليها، وبعض البرامج الأخرى يحتاج إليها، لا تتردد في المضي قدما وأعتبر. ما يمكننا القيام به هو أيضا يمكن أن نحصل فقط على عنوان المتغيرات المحلية على مجموعة. X الباحث ذلك هو داخل الإطار مكدسة من الرئيسي. وعندما نستخدم هذه العلامة، وهذا المشغل، ما تقوم به هو فإنه يأخذ العاشر، والعاشر هو مجرد بعض البيانات في الذاكرة، لكنه لا يملك عنوان. انها تقع في مكان ما. ذلك عن طريق الاتصال بالرقم & X، هذا ما يفعله هو أنه يعطينا عنوان X. وعند القيام بذلك، نحن نحقق نقطة المؤشر إلى حيث x هو في الذاكرة. الآن نحن فقط لا شيء من هذا القبيل * س، ونحن في طريقنا للحصول على 5 الظهر. ودعا النجم يعتبر إلغاء مرجعية ذلك. كنت تتبع عنوان وتحصل على قيمة تخزينها هناك. أي أسئلة؟ نعم؟ [طالب] إذا كنت لا تفعل الشيء 3-مدببة، وأنها لا تزال تجميع؟ نعم. إذا كنت لا تفعل الشيء 3-المؤشر، فإنها ما تزال مستمرة لتجميع، ولكن سوف تظهر لك ما يحدث في الثانية، ودون أن تفعل ذلك، هذا ما نسميه تسرب الذاكرة. كنت لا يعطي النظام دعم الذاكرة، وذلك بعد فترة من الوقت البرنامج سوف تتراكم الذاكرة التي لا تستخدم انها، ولا شيء غير ذلك يمكن استخدامها. إذا كنت قد رأيت من أي وقت مضى فايرفوكس مع 1.5 مليون كيلو بايت على جهاز الكمبيوتر الخاص بك، في إدارة المهام، وهذا ما يحدث. لديك تسرب للذاكرة في برنامج انهم لا يعالج. كيف ذلك المؤشر الحسابي العمل؟ حسنا، الحسابي المؤشر هو نوع من فهرسة مثل في صفيف. في هذه الحالة، لدي المؤشر، وما أقوم به هو تقديم وجهة I المؤشر إلى العنصر الأول هذه مجموعة من 3 أعداد صحيحة أنني المخصصة. حتى الآن ما أقوم به، يتغير المؤشر فقط نجمة العنصر الأول في القائمة. نجم مؤشر +1 نقاط أكثر من هنا. ذلك المؤشر أكثر من هنا، مؤشر +1 هو أكثر من هنا، مؤشر +2 هو أكثر من هنا. مضيفا بذلك فقط 1 هو نفس الشيء تتحرك على طول هذه المجموعة. ما نقوم به هو، عندما نفعل مؤشر +1 تحصل على عنوان أكثر من هنا، ومن أجل الحصول على قيمة هنا، يمكنك وضع نجمة في التعبير عن كامل لإلغاء مرجعية ذلك. لذلك، في هذه الحالة، وأنا وضع الموقع الأول في هذه المجموعة إلى 1، 2 موقع ل2، وموقع ثالث إلى 3. ثم ما أفعله هنا هو أكثر من أنا الطباعة لدينا مؤشر +1، الذي يعطي لي فقط 2. الآن أنا تزايد مؤشر، لذلك المؤشر يساوي مؤشر +1، والتي تتحرك للأمام. وحتى لو كنت الآن طباعة مؤشر +1، مؤشر +1 الآن 3، وهو في هذه الحالة بطباعة 3. ومن أجل شيء مجانا، والمؤشر الذي أعطيها يجب الإشارة في بداية المصفوفة التي عدت من malloc. لذلك، في هذه الحالة، إذا كان لي أن استدعاء 3 هنا الحق، فإن هذا لن يكون على حق، لأنه في منتصف الصفيف. ولا بد لي من طرح للوصول إلى الموقع الأصلي البقعة الأولية الأولى قبل أن أتمكن من تحريرها. لذلك، وهنا مثال أكثر المعنية. في هذه الحالة، نحن تخصيص 7 حروف في مجموعة حرف. وفي هذه الحالة ما نفعله هو أننا حلقات على مدى 6 الأولى منها، ونحن لهم وضع Z. لذلك، لكثافة العمليات ط = 0، ط> 6، ط + +، لذلك، مؤشر + أنا سأعطي فقط لنا، في هذه الحالة، مؤشر، مؤشر +1، مؤشر +2، مؤشر +3، وهلم جرا وهكذا دواليك في حلقة. ما يجري القيام به هو أن يحصل هذا العنوان، فإنه dereferences للحصول على القيمة، والتغييرات التي القيمة إلى Z. ثم في نهاية نتذكر هذا هو سلسلة، أليس كذلك؟ جميع سلاسل يجب أن تنتهي مع حرف فارغة إنهاء. لذا، ما أقوم به هو في المؤشر 6 I وضع حرف فاصل فارغة فيها والآن ما أفعله هنا هو أساسا على تنفيذ printf عن سلسلة، أليس كذلك؟ لذلك، عندما لا printf الآن عندما يكون وصل إلى نهاية سلسلة؟ عندما يضرب الطابع فارغة تنتهي. لذلك، في هذه الحالة، نقاطي المؤشر الأصلي لبداية هذه المجموعة. I طباعة الحرف الأول بها. قمت بنقلها أكثر من واحد. I طباعة هذا الطابع بها. أنتقل أكثر من ذلك. وأنا نواصل القيام بهذا حتى وصولي الى النهاية. والآن سوف المؤشر * إلغاء مرجعية نهاية هذا الطابع والحصول على إنهاء فارغة مرة أخرى. وذلك في حين يدير حلقة بلدي فقط عندما القيمة غير أن الطابع فارغة تنتهي. لذلك، وأنا الآن الخروج من هذه الحلقة. وحتى لو كنت اطرح 6 من هذا المؤشر، أعود كل وسيلة لبداية. تذكر، أنا أفعل ذلك لأنني يجب أن أذهب إلى بداية من أجل اطلاق سراحه. لذلك، وأنا أعرف أن كان هناك الكثير. هل هناك أي أسئلة؟ من فضلك، نعم؟ [السؤال غير مفهومة الطلاب] هل يمكن القول أن ارتفاع؟ آسف. [طالب] على الشريحة الأخيرة قبل إطلاق سراح حق لك المؤشر، حيث كنت في الواقع تغيير قيمة المؤشر؟ [جوزيف] لذلك، والحق هنا. >> [طالب] أوه، حسنا. [جوزيف] لذلك، لدي مؤشر ناقص ناقص، حق، والتي تتحرك على شيء واحد مرة أخرى، وبعد ذلك سراحه، لأن هذا مؤشر لابد من وأشار إلى بداية الصفيف. [طالب] ولكن ذلك لن تكون هناك حاجة بعد كنت قد توقفت عن هذا الخط. [يوسف] لذا، إذا كنت قد توقفت بعد هذا، يعتبر هذا تسرب الذاكرة، لم أكن لتشغيل الحرة. [طالب] I [غير واضح] بعد ثلاثة خطوط الأول حيث كان لديك مؤشر +1 (غير مفهوم). [يوسف] هاه. الأمر كذلك، فما هو السؤال هناك؟ آسف. لا، لا. اذهب، اذهب من فضلك. [طالب] لذلك، كنت لا تغيير قيمة المؤشرات. لن كان لديك للقيام المؤشر ناقص ناقص. [يوسف] نعم، بالضبط. لذلك، عندما أفعل مؤشر مؤشر +1 و +2، أنا لا أفعل المؤشر يساوي مؤشر +1. لذلك، يبقى مجرد مؤشر لافتا في بداية الصفيف. انها فقط عندما أفعل بالإضافة إلى أنه بالإضافة إلى تعيين قيمة إلى داخل المؤشر، أنه يتحرك في الواقع هذا جنبا إلى جنب. حسنا. المزيد من الأسئلة؟ مرة أخرى، إذا كان هذا هو نوع من الساحقة، سيتم تغطية هذا في الدورة. نسأل زملائك التدريس حول هذا الموضوع، ويمكننا الإجابة على الأسئلة في نهاية المطاف. ونحن عادة لا أحب أن تفعل هذا الشيء ناقص. هذا يتطلب أن تتبع لي كم كنت تعويض في الصفيف. لذلك، بشكل عام، وهذا هو فقط لشرح كيفية عمل المؤشر الحسابي. ولكن عادة ما نحب القيام به هو أننا نود أن إنشاء نسخة من المؤشر، ثم سنستخدم هذه النسخة عندما كنا نسير في جميع أنحاء السلسلة. لذلك، في هذه الحالة يمكنك استخدام نسخة لطباعة السلسلة بأكملها، لكننا لا يجب أن نفعل مثل مؤشر ناقص 6 أو تتبع مدى انتقلنا في هذا، فقط لأننا نعلم أن وجهة نظرنا لا يزال أشار الأصلي إلى بداية القائمة وكان كل ما نقوم تغيير هذه النسخة. لذلك، بشكل عام، تغيير مؤشر الماوس نسخ من الأصلي. لا تحاول نوع من مثل - تغيير مش نسخ أصلية. في محاولة لتغيير النسخ الأصلية فقط من الخاص بك. لذلك، لاحظت عندما نعبر السلسلة إلى printf لم يكن لديك لوضع نجمة في أمامه كما فعلنا مع سائر dereferences، أليس كذلك؟ لذا، إذا كنت تطبع٪ السلسلة بأكملها ليالي تتوقع هو عنوان، وفي هذه الحالة مؤشر أو في هذه الحالة مثل مجموعة من الأحرف. حرفا، شار * S، والمصفوفات هي الشيء نفسه. المؤشر إلى أحرف، وصفائف حرف هي الشيء نفسه. وهكذا، كل ما علينا فعله هو تمرير مؤشر في. نحن لا يجب أن تمر في مثل مؤشر * أو أي شيء من هذا القبيل. لذلك، المصفوفات والمؤشرات هي الشيء نفسه. عندما كنت تفعل شيئا مثل X [ص] إلى هنا لصفيف، ما يفعل تحت غطاء محرك السيارة هو انها تقول، حسنا، انها صفيف حرف، لذلك هو المؤشر. وهكذا X هي الشيء نفسه، وهكذا ما يفعله هو أنه يضيف إلى ذ س، وهو نفس الشيء المضي قدما في الذاكرة كثيرا. والآن X + Y يعطينا نوعا من العنوان، ونحن إلغاء مرجعية عنوان أو اتبع السهم إلى حيث ذلك الموقع في الذاكرة ونحصل على القيمة من هذا الموقع في الذاكرة. لذلك، لذلك هذه هما بالضبط نفس الشيء. انها مجرد السكر النحوية. يفعلون نفس الشيء. انهم فقط syntactics مختلفة عن بعضها البعض. لذا، ماذا يمكن أن تسوء مع مؤشرات؟ مثل الكثير. حسنا. لذلك، أشياء سيئة. بعض الأشياء السيئة يمكنك القيام به إذا لم يتم التحقق من مكالمتك malloc ترجع فارغة، أليس كذلك؟ في هذه الحالة، أنا أسأل النظام أن تعطيني - ما هو هذا العدد؟ مثل 2 مليار مرة 4، لأن حجم عددا صحيحا هو 4 بايت. أنا أسأل عن ذلك مثل 8 مليار بايت. بالطبع جهاز الكمبيوتر الخاص بي لن تكون قادرة على اعطاء لي أن عودة الكثير من الذاكرة. ونحن لم تحقق ما إذا كان هذا باطل، لذلك عندما نحاول أن هناك إلغاء مرجعية - اتبع السهم إلى حيث انه سيكون ل- ليس لدينا تلك الذاكرة. هذا هو ما نسميه يعتبر إلغاء مرجعية مؤشر فارغة. وهذا يسبب لك أساسا سوف segfault. هذه هي واحدة من الطرق التي يمكنك سوف segfault. أشياء سيئة أخرى يمكنك القيام به - يا جيدا. ويعتبر إلغاء مرجعية أن مؤشر فارغة. حسنا. أشياء سيئة أخرى - حسنا، لإصلاح التي وضعت مجرد الاختيار في وجود يتحقق ما إذا كان مؤشر فارغة والخروج من البرنامج إذا حدث أن malloc بإرجاع مؤشر فارغة. هذا هو فكاهي xkcd. الناس يفهمون عليه الآن. نوع من. لذلك، والذاكرة. وذهبت أكثر من ذلك. نحن نطلق malloc في حلقة، لكن في كل مرة ندعو malloc نحن نخسر المسار من حيث هذا المؤشر يشير إلى، لأننا clobbering ذلك. لذا، فإن الدعوة إلى malloc الأولية يعطيني الذاكرة أكثر من هنا. مؤشرات المؤشر بلدي لذلك. الآن، أنا لا تحريرها، وحتى الآن أدعو malloc مرة أخرى. الآن يشير إلى هنا. ذاكرتي الآن يشير إلى هنا. مشيرا إلى هنا. مشيرا إلى هنا. ولكن لقد فقدت المسار من عناوين الذاكرة في جميع أنحاء هنا أنني المخصصة. وحتى الآن ليس لدي أي إشارة لهم بعد الآن. لذلك، لا أستطيع أن تحريرهم من خارج هذه الحلقة. وذلك من أجل إصلاح شيء من هذا القبيل، إذا كنت قد نسيت لتحرير الذاكرة ولك هذا تسرب الذاكرة، لديك لتحرير الذاكرة من داخل هذه الحلقة بمجرد الانتهاء من ذلك معها. حسنا، هذا هو ما يحدث. أنا أعرف الكثير من كنت أكره هذا. ولكن الآن - ياي! تحصل مثل 44000 كيلو بايت. بذلك، يمكنك تحريرها في نهاية الحلقة، وأن يحدث لتحرير الذاكرة فقط في كل مرة. أساسا، برنامج لايوجد تسرب للذاكرة بعد الآن. والآن شيء آخر يمكنك القيام به هو تحرير بعض الذاكرة التي كنت قد طلبت مرتين. في هذه الحالة، لك شيئا malloc، يمكنك تغيير قيمته. كنت سراحه لأنه بمجرد أن تم الانتهاء قال معها. ثم افرج عنهم ونحن مرة أخرى. هذا هو الشيء الذي أمر سيئ جدا. انها لن سوف segfault في البداية، ولكن بعد حين هذا ما يفعله هو اطلاق سراح ضعف هذا تفسد بنية كومة، وستعرف أكثر قليلا حول هذا إذا اخترت اتخاذ الطبقة مثل CS61. ولكن بعد فترة من الزمن أساسا جهاز الكمبيوتر الخاص بك هو الذهاب الى الحصول على الخلط حول ما هي مواقع الذاكرة حيث وحيث يتم تخزينها - حيث يتم تخزين البيانات في الذاكرة. وتحرير ذلك مؤشر ضعف شيئا سيئا أن كنت لا تريد أن تفعل. الأشياء الأخرى التي يمكن ان تتعرض له لا تستخدم sizeof. لذلك، في هذه الحالة يمكنك malloc 8 بايت، وهذا هو نفس الشيء عن اثنين من الأعداد الصحيحة، أليس كذلك؟ لذلك، وهذا آمنة تماما، ولكن هو؟ حسنا، كما تحدث عن لوكاس على أبنية مختلفة، أعداد صحيحة هي من أطوال مختلفة. بذلك، في الأجهزة التي تستخدمها، ما يقرب من 4 أعداد صحيحة بايت، ولكن في بعض نظام آخر لأنها قد تكون 8 بايت أو أنها قد تكون 16 بايت. لذلك، إذا كنت تستخدم فقط هذا العدد أكثر من هنا، هذا البرنامج قد عمل على الأجهزة، ولكنه لن تخصيص ذاكرة كافية على بعض النظام الأخرى. في هذه الحالة، وهذا هو ما يتم استخدام عامل التشغيل sizeof ل. عندما ندعو sizeof (الباحث)، وهذا ما يفعله هو  أنه يعطينا حجم عدد صحيح على النظام أن البرنامج قيد التشغيل. لذلك، في هذه الحالة، سوف sizeof (الباحث) العودة 4 على شيء من هذا القبيل الجهاز، والآن هذه الإرادة 4 * 2، والذي هو 8، الذي هو مجرد مقدار المساحة اللازمة لاثنين من الأعداد الصحيحة. على نظام مختلف، إذا كان الباحث هو 16 بايت أو مثل بايت 8، انها مجرد الذهاب الى العودة بايت لتخزين ما يكفي من هذا المبلغ. وأخيرا، البنيات. لذا، إذا كنت تريد تخزين لوحة سودوكو في الذاكرة، كيف يمكن لنا أن نفعل ذلك؟ قد تفكر في مثل متغير لأول شيء، متغير والشيء الثاني، متغير لشيء ثالث، متغير لشيء الرابع - سيئة، أليس كذلك؟ لذلك، واحدة يمكنك ان تجعل تحسين وفوق كل هذا هو تقديم مجموعة 9 × 9. هذا شيء طيب، ولكن ماذا لو أردت أن أضم أمور أخرى مع مجلس سودوكو مثل ما صعوبة المجلس هو، أو، على سبيل المثال، ما هو درجاتك، أو كم من الوقت انها اتخذت أنت أن يحل هذا المجلس؟ حسنا، ما يمكنك القيام به هو أن تتمكن من إنشاء البنية. ما أقوله هو أساسا أنا تحديد هذا الهيكل أكثر من هنا، وأنا تحديد لوحة سودوكو الذي يتكون من المجلس أن هو 9 × 9. وما لديها لديها مؤشرات إلى اسم المستوى. كما أن لديها X و Y، والتي هي إحداثيات أين أنا الآن. كما أن لديها الوقت الذي يقضيه [غير واضح]، ولها عدد من التحركات لقد إدخالها حتى الآن. وحتى في هذه الحالة، يمكن أن المجموعة الأولى مجموعة كاملة من البيانات في هيكل واحد فقط بدلا من وجود لها مثل في تحلق حولها مثل المتغيرات المختلفة لا أستطيع أن تبقي حقا مسار. وهذا يتيح لنا أن بناء جملة لطيفة لمجرد نوع من الرجوع أشياء مختلفة داخل هذه البنية. يمكن أنا فقط لم board.board، وأحصل على متن سودوكو الظهر. Board.level، وأحصل على مدى صعوبة الوضع. Board.x وboard.y تعطيني إحداثيات حيث كنت قد تكون في المجلس. وحتى أنا الوصول إلى ما نسميه الحقول في البنية. هذا يحدد sudokuBoard، وهو النوع الذي لدي. والآن نحن هنا. لدي متغير يسمى "المجلس" من نوع sudokuBoard. وحتى الآن لا أستطيع الوصول إلى كافة المجالات التي تشكل هذا الهيكل أكثر من هنا. أي أسئلة حول البنيات؟ نعم؟ [طالب] ل X الباحث، Y، أعلن لكم كل على سطر واحد؟ >> [يوسف] هاه. [طالب] لذلك، هل يمكن أن تفعل ذلك تماما مع كل منهم؟ كما هو الحال في X Y فاصلة، أن إجمالي مرات؟ جوزيف] نعم، يمكن القيام به بالتأكيد ذلك، ولكن السبب في أنني وضعت x و y على نفس الخط - والسؤال هو لماذا يمكننا أن نفعل هذا فقط على نفس الخط؟ لماذا لا يتم فقط وضع كل من هذه على نفس الخط هو ترتبط x و y لبعضها البعض، وهذا هو مجرد أسلوبيا الأصح، بمعنى من المعاني، لانها تضم ​​أمرين على نفس الخط هذا النوع من مثل تتعلق نفس الشيء. وقمت بتقسيم هذه فقط على حدة. انها مجرد شيء الاسلوب. يجعل لا فرق على الإطلاق وظيفيا. أي أسئلة أخرى حول البنيات؟ يمكنك تعريف Pokédex مع البنية. A بوكيمون لديها عدد ولها رسالة، صاحب، وهو نوع. ثم إذا كان لديك مجموعة من بوكيمون، يمكنك يشكلون Pokédex، أليس كذلك؟ حسنا، باردة. لذلك، على البنيات الأسئلة. تلك هي المتعلقة البنيات. وأخيرا، GDB. ماذا GDB لك أن تفعل؟ فإنه يتيح لك تصحيح البرنامج. وإذا كنت لم تستخدم GDB، وأود أن أوصى مشاهدة قصيرة ومجرد الذهاب على ما هو GDB، وكيف كنت تعمل معها، وكيف يمكن استخدامها، واختباره على البرنامج. وذلك ما يتيح GDB ما عليك فعله هو أنه يتيح إيقاف [غير واضح] حتى البرنامج الخاص بك وخط العملية. على سبيل المثال، أريد أن إيقاف التنفيذ في مثل خط 3 من برنامجي، وبينما أنا في السطر 3 يمكنني طباعة جميع القيم الموجودة هناك. وذلك ما نسميه مثل التوقف في خط ونحن نسمي هذا وضع نقطة توقف في هذا الخط وبعد ذلك يمكننا طباعة المتغيرات في حالة البرنامج في ذلك الوقت. ثم يمكننا من هناك من خلال برنامج تعزيز خط سطرا. ومن ثم يمكننا أن ننظر في حالة المكدس في ذلك الوقت. وذلك من أجل استخدام GDB، ما نقوم به هو نسميه رنة على الملف C، ولكن لدينا لتمرير عليها ggdb العلم. ومرة ننتهي مع أننا فقط تشغيل GDB الناتج عن الملف الناتج. وحتى تحصل على بعض مثل كتلة من النص مثل هذا، ولكن في الواقع كل ما عليك القيام به هو كتابة الأوامر في البداية. كسر الرئيسي يضع نقطة توقف في الرئيسية. قائمة 400 قائمة الأسطر من التعليمات البرمجية في جميع أنحاء خط 400. وحتى في هذه الحالة يمكنك مجرد إلقاء نظرة حول وأقول، يا، أريد أن تعيين نقطة توقف عند خط 397، وهو هذا الخط، ثم البرنامج الخاص بك يعمل في هذه الخطوة وانه سيكون لكسر. انه سيكون هناك وقفة، ويمكنك طباعة، على سبيل المثال، قيمة منخفضة أو عالية. وهكذا هناك مجموعة من الأوامر التي تحتاج إلى معرفة، وسيكون هذا العرض ترتفع على الموقع، حتى إذا كنت ترغب فقط في مرجع هذه أو ما شابه وضعها على ورقة الغش الخاص بك، لا تتردد. بارد. كان ذلك اختبار مراجعة 0، وسنقوم عصا حول إذا كان لديك أي سؤال. حسنا.  [تصفيق] [CS50.TV]