[عزف الموسيقى] DOUG لويد: حسنا. نوع من موضوع غريب، أليس كذلك؟ الأرقام السحرية. ما ظبية انه يعني عندما يكون نتحدث عن الأرقام السحرية؟ حسنا، بعض البرامج أننا قد كتبت في CS50 لقد كان حتى الآن بعض غريب أرقام ألقيت نوع من فيها. ربما لاسباب لا نفهمها فهم تماما الآن. على سبيل المثال، في مشكلة ماريو، نحن توج ذروة الهرم في 23. قلنا صراحة لك لا يمكن أن تذهب أعلى من 23. ولكن ماذا يعني 23؟ حسنا، إذا كنت تقرأ المواصفات بعناية، ل قد رأينا أن السبب في أننا توج في 23 لأن الارتفاع القياسي من نافذة الصالة هو 24. وحتى إذا كانت لدينا الهرم أن تكون أطول من ذلك، قد تفعل هذا الشيء غريب حيث يمتد خارج الشاشة. وكما تعلمون، ما يفعل هذا يعني في السياق، أليس كذلك؟ معنى 23 وضوحا على الفور لشخص الذي ينظر إلى برنامجك وربما لديها مختلفة حجم إطار المحطة؟ على الاغلب لا. يبدو مثل، OK. حسنا، لماذا هو فقط أقل من 23؟ بشكل عام، انها نوع من عادة سيئة في الواقع لكتابة الثوابت في التعليمات البرمجية. في القيام بذلك، وعندما تفعل فعلا إرسال ثابت في التعليمات البرمجية الخاصة بك، انها يشار إليها أحيانا باستخدام الأرقام السحرية، وهو أمر نريد عموما في محاولة لتجنب. على سبيل المثال، دعونا نلقي نظرة في هذه الوظيفة بسيطة هنا. من الواضح أن هناك أية بيانات اكتب في C تسمى بطاقة أو سطح السفينة. لذلك يتحمل فقط معي. انها قليلا من شبة الكود مختلطة هنا. هذه هي وظيفة تسمى التعامل البطاقة التي على ما يبدو يأخذ سطح كمعلمة به، و إرادة إخراج لي بطاقة واحدة. وأنا أفعل شيء هنا حيث أنا يكون حلقة التي تدير 0-52، وأنا أتعامل بطاقة. حسنا، لقد حصلت على السحر عدد هنا، الصحيح. هل ترى ما هو الرقم السحري؟ أو الأهم، هل ترى ما هي المشكلة هنا؟ لا سيما إذا كان هذا هي وظيفة واحدة فقط في ملف خاص به في المجلد الذي يحتوي على حفنة من مختلف ملفات، كل واحدة منها لا شيء آخر لمجموعة من البطاقات. ربما المراوغات لهم، أو يتعامل يد خمس بطاقات بدلا من بطاقة واحدة. هل ترى ما يمكن أن تكون المشكلة هنا؟ هل ترى الرقم السحري لقد حقنها في المدونة؟ انها 52، والحق. مثل، حدسي ربما كنت أعرف، OK. مثل سطح القياسي ل بطاقات تحتوي على 52 ورقة. ولكن في برنامجنا، انها مجرد نوع من تطوف هناك. انها مثل فجأة هناك 52. طريقة واحدة لحل هذه المشكلة هي أن تفعل هذا. نحن صراحة جدا الآن نداء حجم سطح السفينة، إذ كانت 52. فإنه يعطيها أكثر من ذلك بقليل بديهية وهذا يعني عندما تكون في لحلقة في وقت لاحق نحن بعد ذلك أقول، وأنا أقل من حجم سطح السفينة. هو فقط يبدو أفضل من القول 52. الآن هذا لا إصلاح المشكلة في الواقع. أنها لا تعطي بعض رمزية وهذا يعني أن الثابت. ولكنه نوع من الواقع إدخال مشكلة أخرى قد لا تكون واضحة على الفور. حتى لو كان هذا المتغير أعلن globally-- هل تذكرون ما يعني عندما نعلن متغير على مستوى العالم مقابل محليا؟ حتى لو كنا بتعريف متغير على الصعيد العالمي، ما إذا كان هناك وظيفة أخرى في لدينا مجموعة من الوظائف التي تتعامل مع التلاعب بطاقة الذي يتغير عن غير قصد حجم سطح السفينة، أو أنه يزيد عليها 1 أو يقلل من قبل 1. يمكن أن يسبب مشاكل، أليس كذلك؟ خاصة إذا كنا نتعامل مع مجموعة بطاقات حيث خلط كامل سطح السفينة مطلوب. إذا انخفض حجم سطح السفينة بنسبة 1، على سبيل المثال، إلى 51، نحن لا خلط الواقع كل الأوراق ربما. نحن ترك واحد منهم بها. وتلك القيمة ربما يكون توقع أو يستغلها لاعبا سيئا. C يوفر ما يسمى التوجيه المعالج، الذي ويسمى أيضا ماكرو ل خلق ثوابت رمزية. في واقع الأمر، لقد قمت بالفعل شهدت توجيه المعالج، حتى إذا لم تكن قد سمعت به يسمى ذلك مع تضمين #. انها مثال آخر على ماكرو أو التوجيه المعالج. الطريق لخلق رمزي الثوابت، أو إعطاء إسم لثابت ذلك أن لديها أكثر وهذا يعني، هي على النحو التالي. رقم تعريف والاسم والاستبدال. حقا أهمية جانبا هنا سريعة حقا. لا تضع فاصلة منقوطة في نهاية #defines الخاص بك. لذلك فمن # تعريف والاسم والاستبدال. عندما يتم ترجمة البرنامج، ما يحدث في الواقع هو المترجم إذا كان الذهاب للذهاب من خلال التعليمات البرمجية واستبدال كل مثيل كلمة "اسم" مع كل ما كنت وضع كبديل. بالقياس، إذا تتضمن # هو نوع من تشبه النسخ واللصق، ثم تعريف # هو نوع من على غرار ايجاد واستبدال، إذا كنت قد استخدمت من أي وقت مضى أن الميزة في برنامج معالجة النصوص على سبيل المثال. هكذا على سبيل المثال، إذا كنت # تعريف بي كما 3.14159265، إذا كنت أفضل رياضيا ميلا وكنت فجأة رؤية 3.14159265 الطيران حول في التعليمات البرمجية الخاصة بك، ربما كنت أعلم أنه يتحدث عن بي. ولكن ربما يمكننا أن تعطيه يذكر معنى أكثر رمزية. ويمكننا بدلا من ذلك قل تعريف # بي كما أن الفم من الأرقام أنني لست ذاهب للحفاظ على القراءة مرارا وتكرارا. وماذا سيحدث بعد ذلك في تجميع الوقت عندما البرنامج المترجمة، أول ما سيحدث هو انها سوف تذهب من خلال وانه سيحل محل كل الوقت ترى P العاصمة، عاصمة I، انها سوف تحل محل حرفيا مع 3.14 وهلم جرا، حتى يتسنى لك لم يكن لديك لكتابته كل الوقت في حين لا يزال البرنامج لديه الوظائف التي نتوقع، لأنك تعمل مع التلاعب، ضرب، تقسيم، كل ما هو عن طريق باي. لا تقتصر على هذا عوضا عن أرقام فقط. على سبيل المثال، يمكن أن #DEFINE بالطبع كما CS50 السلسلة. في هذه الحالة، عندما يتم ترجمة البرنامج، # تعريف سوف تذهب من خلال رمز، محل في كل مرة ترى "بالطبع" مع CS50 السلسلة. ستلاحظ هنا كما أنني في كثير من الأحيان # تعريف كل ما عندي تعريف رمزي الثوابت، إذا جاز التعبير، دائما في كل مباراة دولية. انها الاتفاقية. ليس مطلوبا. السبب عموما سوف يستخدم الناس كل العواصم عندما كنت #defining هو مجرد أن يكون واضحا حقا أن هذا عنصر معين من قانون بلدي هو ثابت تحديدا. إذا كان صغيرة، فمن الممكن أن قد يتم الخلط بينها وبين متغير. وهذا هو الأرجح ليس شيئا جيدا للقيام به. لذلك هذا الخصوص الحل هو أفضل بكثير من أي من سابقاتها. إذا كنت # تعريف أولا حجم سطح السفينة 52، ثم الآن استخدامي ل52، أو حجم سطح السفينة هنا، هو الكثير أكثر سهولة وأكثر أمنا. لا يمكنك التلاعب ثابت. لا يمكنك أن تقول 52 زائد زائد. هذا لن تحويله إلى 53. لا يمكنك تغيير 52 إلى شيء. يمكنك تغيير متغير قيمته هو 52، الذي كان الإصلاح الأول كان لدينا من قبل. ويمكن أن تزيد هذا المتغير إلى 53. ولكن لا يمكنك أن تقول 52 زائد زائد و لدينا التي تتحول فجأة إلى 52 53. 52 هو دائما 52. وبالتالي لا يمكنك تغيير عن غير قصد حجم سطح السفينة هنا عن طريق التلاعب به، الجانب الجيد آخر تأثير هذا على الرغم من و التي أنت على علم بأن لا جميع البلدان في جميع أنحاء العالم استخدام مجموعة من البطاقات من حجم 52؟ على سبيل المثال، فإنه من الشائع حقا في ألمانيا إلى استخدام حجم سطح السفينة من 32، حيث تجريد بعض بطاقات قيمة أقل. وفي هذه الحالة، I أراد أن ميناء بلدي جناح من الوظائف التي تتعامل مع بطاقة التلاعب في ألمانيا. لم أستطع في المقام الأول ونحن أظهرت، أن تذهب وتحل محل جميع الحالات من 52 في قانون بلدي مع 32. ولكن هنا، إذا كنت # تعريف حجم سطح السفينة إلى 32 في أعلى جدا من قانون بلدي، إذا كنت بحاجة إلى تغيير ذلك، يمكنني اذهبوا وتغيير ذلك شيئا واحدا. إعادة ترجمة قانون بلدي، وجميع فجأة أنها تنتشر من خلال. في الواقع، لا يمكننا تغيير سطح السفينة حجم إلى أي قيمة نريد. يمكنني تهمك في لعبة من حجم سطح السفينة صغيرة؟ أنا دوغ ويد. وهذا هو CS50.