1 00:00:00,000 --> 00:00:02,350 >> [عزف الموسيقى] 2 00:00:02,350 --> 00:00:05,444 3 00:00:05,444 --> 00:00:06,360 DOUG لويد: حسنا. 4 00:00:06,360 --> 00:00:07,770 نوع من موضوع غريب، أليس كذلك؟ 5 00:00:07,770 --> 00:00:09,050 الأرقام السحرية. 6 00:00:09,050 --> 00:00:12,012 ما ظبية انه يعني عندما يكون نتحدث عن الأرقام السحرية؟ 7 00:00:12,012 --> 00:00:14,220 حسنا، بعض البرامج أننا قد كتبت في CS50 8 00:00:14,220 --> 00:00:16,660 لقد كان حتى الآن بعض غريب أرقام ألقيت نوع من فيها. 9 00:00:16,660 --> 00:00:19,680 ربما لاسباب لا نفهمها فهم تماما الآن. 10 00:00:19,680 --> 00:00:23,950 على سبيل المثال، في مشكلة ماريو، نحن توج ذروة الهرم في 23. 11 00:00:23,950 --> 00:00:26,880 قلنا صراحة لك لا يمكن أن تذهب أعلى من 23. 12 00:00:26,880 --> 00:00:28,702 >> ولكن ماذا يعني 23؟ 13 00:00:28,702 --> 00:00:30,410 حسنا، إذا كنت تقرأ المواصفات بعناية، ل 14 00:00:30,410 --> 00:00:32,493 قد رأينا أن السبب في أننا توج في 23 15 00:00:32,493 --> 00:00:36,160 لأن الارتفاع القياسي من نافذة الصالة هو 24. 16 00:00:36,160 --> 00:00:38,860 وحتى إذا كانت لدينا الهرم أن تكون أطول من ذلك، 17 00:00:38,860 --> 00:00:41,290 قد تفعل هذا الشيء غريب حيث يمتد خارج الشاشة. 18 00:00:41,290 --> 00:00:45,140 وكما تعلمون، ما يفعل هذا يعني في السياق، أليس كذلك؟ 19 00:00:45,140 --> 00:00:48,880 >> معنى 23 وضوحا على الفور لشخص الذي ينظر إلى برنامجك 20 00:00:48,880 --> 00:00:51,550 وربما لديها مختلفة حجم إطار المحطة؟ 21 00:00:51,550 --> 00:00:52,330 على الاغلب لا. 22 00:00:52,330 --> 00:00:53,080 يبدو مثل، OK. 23 00:00:53,080 --> 00:00:55,005 حسنا، لماذا هو فقط أقل من 23؟ 24 00:00:55,005 --> 00:00:56,880 بشكل عام، انها نوع من عادة سيئة في الواقع 25 00:00:56,880 --> 00:00:58,940 لكتابة الثوابت في التعليمات البرمجية. 26 00:00:58,940 --> 00:01:02,190 في القيام بذلك، وعندما تفعل فعلا إرسال ثابت في التعليمات البرمجية الخاصة بك، 27 00:01:02,190 --> 00:01:05,630 انها يشار إليها أحيانا باستخدام الأرقام السحرية، وهو أمر 28 00:01:05,630 --> 00:01:08,030 نريد عموما في محاولة لتجنب. 29 00:01:08,030 --> 00:01:12,830 >> على سبيل المثال، دعونا نلقي نظرة في هذه الوظيفة بسيطة هنا. 30 00:01:12,830 --> 00:01:15,726 من الواضح أن هناك أية بيانات اكتب في C تسمى بطاقة أو سطح السفينة. 31 00:01:15,726 --> 00:01:16,600 لذلك يتحمل فقط معي. 32 00:01:16,600 --> 00:01:18,910 انها قليلا من شبة الكود مختلطة هنا. 33 00:01:18,910 --> 00:01:21,050 هذه هي وظيفة تسمى التعامل البطاقة التي على ما يبدو 34 00:01:21,050 --> 00:01:26,570 يأخذ سطح كمعلمة به، و إرادة إخراج لي بطاقة واحدة. 35 00:01:26,570 --> 00:01:30,990 >> وأنا أفعل شيء هنا حيث أنا يكون حلقة التي تدير 0-52، 36 00:01:30,990 --> 00:01:33,394 وأنا أتعامل بطاقة. 37 00:01:33,394 --> 00:01:35,310 حسنا، لقد حصلت على السحر عدد هنا، الصحيح. 38 00:01:35,310 --> 00:01:38,790 هل ترى ما هو الرقم السحري؟ 39 00:01:38,790 --> 00:01:42,280 أو الأهم، هل ترى ما هي المشكلة هنا؟ 40 00:01:42,280 --> 00:01:44,310 لا سيما إذا كان هذا هي وظيفة واحدة فقط 41 00:01:44,310 --> 00:01:48,030 في ملف خاص به في المجلد الذي يحتوي على 42 00:01:48,030 --> 00:01:49,970 حفنة من مختلف ملفات، كل واحدة منها 43 00:01:49,970 --> 00:01:51,670 لا شيء آخر لمجموعة من البطاقات. 44 00:01:51,670 --> 00:01:57,310 ربما المراوغات لهم، أو يتعامل يد خمس بطاقات بدلا من بطاقة واحدة. 45 00:01:57,310 --> 00:01:59,420 >> هل ترى ما يمكن أن تكون المشكلة هنا؟ 46 00:01:59,420 --> 00:02:03,220 هل ترى الرقم السحري لقد حقنها في المدونة؟ 47 00:02:03,220 --> 00:02:04,390 انها 52، والحق. 48 00:02:04,390 --> 00:02:06,440 >> مثل، حدسي ربما كنت أعرف، OK. 49 00:02:06,440 --> 00:02:09,740 مثل سطح القياسي ل بطاقات تحتوي على 52 ورقة. 50 00:02:09,740 --> 00:02:12,570 ولكن في برنامجنا، انها مجرد نوع من تطوف هناك. 51 00:02:12,570 --> 00:02:15,280 انها مثل فجأة هناك 52. 52 00:02:15,280 --> 00:02:18,290 >> طريقة واحدة لحل هذه المشكلة هي أن تفعل هذا. 53 00:02:18,290 --> 00:02:22,724 نحن صراحة جدا الآن نداء حجم سطح السفينة، إذ كانت 52. 54 00:02:22,724 --> 00:02:25,390 فإنه يعطيها أكثر من ذلك بقليل بديهية وهذا يعني عندما تكون في لحلقة 55 00:02:25,390 --> 00:02:28,650 في وقت لاحق نحن بعد ذلك أقول، وأنا أقل من حجم سطح السفينة. 56 00:02:28,650 --> 00:02:32,666 هو فقط يبدو أفضل من القول 52. 57 00:02:32,666 --> 00:02:34,290 الآن هذا لا إصلاح المشكلة في الواقع. 58 00:02:34,290 --> 00:02:38,460 أنها لا تعطي بعض رمزية وهذا يعني أن الثابت. 59 00:02:38,460 --> 00:02:40,820 ولكنه نوع من الواقع إدخال مشكلة أخرى 60 00:02:40,820 --> 00:02:43,770 قد لا تكون واضحة على الفور. 61 00:02:43,770 --> 00:02:45,859 حتى لو كان هذا المتغير أعلن globally-- 62 00:02:45,859 --> 00:02:47,650 هل تذكرون ما يعني عندما نعلن 63 00:02:47,650 --> 00:02:50,500 متغير على مستوى العالم مقابل محليا؟ 64 00:02:50,500 --> 00:02:53,340 حتى لو كنا بتعريف متغير على الصعيد العالمي، ما إذا كان هناك 65 00:02:53,340 --> 00:02:55,500 وظيفة أخرى في لدينا مجموعة من الوظائف 66 00:02:55,500 --> 00:02:59,750 التي تتعامل مع التلاعب بطاقة الذي يتغير عن غير قصد حجم سطح السفينة، 67 00:02:59,750 --> 00:03:02,727 أو أنه يزيد عليها 1 أو يقلل من قبل 1. 68 00:03:02,727 --> 00:03:04,060 يمكن أن يسبب مشاكل، أليس كذلك؟ 69 00:03:04,060 --> 00:03:08,261 خاصة إذا كنا نتعامل مع مجموعة بطاقات حيث خلط كامل سطح السفينة 70 00:03:08,261 --> 00:03:08,760 مطلوب. 71 00:03:08,760 --> 00:03:12,804 إذا انخفض حجم سطح السفينة بنسبة 1، على سبيل المثال، إلى 51، 72 00:03:12,804 --> 00:03:14,970 نحن لا خلط الواقع كل الأوراق ربما. 73 00:03:14,970 --> 00:03:16,500 نحن ترك واحد منهم بها. 74 00:03:16,500 --> 00:03:21,680 وتلك القيمة ربما يكون توقع أو يستغلها لاعبا سيئا. 75 00:03:21,680 --> 00:03:24,920 >> C يوفر ما يسمى التوجيه المعالج، الذي 76 00:03:24,920 --> 00:03:27,764 ويسمى أيضا ماكرو ل خلق ثوابت رمزية. 77 00:03:27,764 --> 00:03:30,180 في واقع الأمر، لقد قمت بالفعل شهدت توجيه المعالج، 78 00:03:30,180 --> 00:03:32,916 حتى إذا لم تكن قد سمعت به يسمى ذلك مع تضمين #. 79 00:03:32,916 --> 00:03:37,150 انها مثال آخر على ماكرو أو التوجيه المعالج. 80 00:03:37,150 --> 00:03:41,290 >> الطريق لخلق رمزي الثوابت، أو إعطاء إسم لثابت 81 00:03:41,290 --> 00:03:43,740 ذلك أن لديها أكثر وهذا يعني، هي على النحو التالي. 82 00:03:43,740 --> 00:03:47,030 رقم تعريف والاسم والاستبدال. 83 00:03:47,030 --> 00:03:49,140 حقا أهمية جانبا هنا سريعة حقا. 84 00:03:49,140 --> 00:03:54,180 لا تضع فاصلة منقوطة في نهاية #defines الخاص بك. 85 00:03:54,180 --> 00:03:57,310 لذلك فمن # تعريف والاسم والاستبدال. 86 00:03:57,310 --> 00:03:59,540 >> عندما يتم ترجمة البرنامج، ما يحدث في الواقع 87 00:03:59,540 --> 00:04:01,740 هو المترجم إذا كان الذهاب للذهاب من خلال التعليمات البرمجية 88 00:04:01,740 --> 00:04:06,770 واستبدال كل مثيل كلمة "اسم" مع كل ما كنت 89 00:04:06,770 --> 00:04:08,860 وضع كبديل. 90 00:04:08,860 --> 00:04:13,060 بالقياس، إذا تتضمن # هو نوع من تشبه النسخ واللصق، 91 00:04:13,060 --> 00:04:15,700 ثم تعريف # هو نوع من على غرار ايجاد واستبدال، 92 00:04:15,700 --> 00:04:19,180 إذا كنت قد استخدمت من أي وقت مضى أن الميزة في برنامج معالجة النصوص على سبيل المثال. 93 00:04:19,180 --> 00:04:26,345 >> هكذا على سبيل المثال، إذا كنت # تعريف بي كما 3.14159265، 94 00:04:26,345 --> 00:04:28,720 إذا كنت أفضل رياضيا ميلا وكنت فجأة 95 00:04:28,720 --> 00:04:31,640 رؤية 3.14159265 الطيران حول في التعليمات البرمجية الخاصة بك، 96 00:04:31,640 --> 00:04:33,517 ربما كنت أعلم أنه يتحدث عن بي. 97 00:04:33,517 --> 00:04:35,850 ولكن ربما يمكننا أن تعطيه يذكر معنى أكثر رمزية. 98 00:04:35,850 --> 00:04:39,850 ويمكننا بدلا من ذلك قل تعريف # بي كما أن الفم من الأرقام 99 00:04:39,850 --> 00:04:42,110 أنني لست ذاهب للحفاظ على القراءة مرارا وتكرارا. 100 00:04:42,110 --> 00:04:45,560 >> وماذا سيحدث بعد ذلك في تجميع الوقت عندما البرنامج 101 00:04:45,560 --> 00:04:48,530 المترجمة، أول ما سيحدث هو انها سوف تذهب من خلال 102 00:04:48,530 --> 00:04:51,520 وانه سيحل محل كل الوقت ترى P العاصمة، عاصمة I، 103 00:04:51,520 --> 00:04:55,610 انها سوف تحل محل حرفيا مع 3.14 وهلم جرا، حتى يتسنى لك 104 00:04:55,610 --> 00:04:58,090 لم يكن لديك لكتابته كل الوقت في حين لا يزال البرنامج 105 00:04:58,090 --> 00:05:00,631 لديه الوظائف التي نتوقع، لأنك تعمل 106 00:05:00,631 --> 00:05:05,090 مع التلاعب، ضرب، تقسيم، كل ما هو عن طريق باي. 107 00:05:05,090 --> 00:05:08,230 >> لا تقتصر على هذا عوضا عن أرقام فقط. 108 00:05:08,230 --> 00:05:12,279 على سبيل المثال، يمكن أن #DEFINE بالطبع كما CS50 السلسلة. 109 00:05:12,279 --> 00:05:14,070 في هذه الحالة، عندما يتم ترجمة البرنامج، 110 00:05:14,070 --> 00:05:16,236 # تعريف سوف تذهب من خلال رمز، محل في كل مرة 111 00:05:16,236 --> 00:05:19,900 ترى "بالطبع" مع CS50 السلسلة. 112 00:05:19,900 --> 00:05:21,720 >> ستلاحظ هنا كما أنني في كثير من الأحيان 113 00:05:21,720 --> 00:05:26,090 # تعريف كل ما عندي تعريف رمزي الثوابت، إذا جاز التعبير، 114 00:05:26,090 --> 00:05:28,130 دائما في كل مباراة دولية. 115 00:05:28,130 --> 00:05:28,960 انها الاتفاقية. 116 00:05:28,960 --> 00:05:30,170 ليس مطلوبا. 117 00:05:30,170 --> 00:05:33,900 السبب عموما سوف يستخدم الناس كل العواصم عندما كنت #defining 118 00:05:33,900 --> 00:05:37,590 هو مجرد أن يكون واضحا حقا أن هذا عنصر معين من قانون بلدي 119 00:05:37,590 --> 00:05:38,820 هو ثابت تحديدا. 120 00:05:38,820 --> 00:05:43,730 إذا كان صغيرة، فمن الممكن أن قد يتم الخلط بينها وبين متغير. 121 00:05:43,730 --> 00:05:46,120 وهذا هو الأرجح ليس شيئا جيدا للقيام به. 122 00:05:46,120 --> 00:05:48,910 >> لذلك هذا الخصوص الحل هو أفضل بكثير 123 00:05:48,910 --> 00:05:50,550 من أي من سابقاتها. 124 00:05:50,550 --> 00:05:59,950 إذا كنت # تعريف أولا حجم سطح السفينة 52، ثم الآن استخدامي ل52، أو حجم سطح السفينة هنا، 125 00:05:59,950 --> 00:06:01,850 هو الكثير أكثر سهولة وأكثر أمنا. 126 00:06:01,850 --> 00:06:03,280 لا يمكنك التلاعب ثابت. 127 00:06:03,280 --> 00:06:05,259 لا يمكنك أن تقول 52 زائد زائد. 128 00:06:05,259 --> 00:06:06,800 هذا لن تحويله إلى 53. 129 00:06:06,800 --> 00:06:09,390 لا يمكنك تغيير 52 إلى شيء. 130 00:06:09,390 --> 00:06:12,470 >> يمكنك تغيير متغير قيمته هو 52، 131 00:06:12,470 --> 00:06:14,870 الذي كان الإصلاح الأول كان لدينا من قبل. 132 00:06:14,870 --> 00:06:17,000 ويمكن أن تزيد هذا المتغير إلى 53. 133 00:06:17,000 --> 00:06:21,100 ولكن لا يمكنك أن تقول 52 زائد زائد و لدينا التي تتحول فجأة إلى 52 53. 134 00:06:21,100 --> 00:06:23,350 52 هو دائما 52. 135 00:06:23,350 --> 00:06:28,860 وبالتالي لا يمكنك تغيير عن غير قصد حجم سطح السفينة هنا عن طريق التلاعب به، 136 00:06:28,860 --> 00:06:29,940 137 00:06:29,940 --> 00:06:32,390 >> الجانب الجيد آخر تأثير هذا على الرغم من و 138 00:06:32,390 --> 00:06:38,310 التي أنت على علم بأن لا جميع البلدان في جميع أنحاء العالم 139 00:06:38,310 --> 00:06:40,690 استخدام مجموعة من البطاقات من حجم 52؟ 140 00:06:40,690 --> 00:06:45,630 على سبيل المثال، فإنه من الشائع حقا في ألمانيا إلى استخدام حجم سطح السفينة من 32، 141 00:06:45,630 --> 00:06:48,020 حيث تجريد بعض بطاقات قيمة أقل. 142 00:06:48,020 --> 00:06:50,960 وفي هذه الحالة، I أراد أن ميناء بلدي جناح 143 00:06:50,960 --> 00:06:55,390 من الوظائف التي تتعامل مع بطاقة التلاعب في ألمانيا. 144 00:06:55,390 --> 00:06:59,440 لم أستطع في المقام الأول ونحن أظهرت، أن تذهب وتحل محل 145 00:06:59,440 --> 00:07:03,570 جميع الحالات من 52 في قانون بلدي مع 32. 146 00:07:03,570 --> 00:07:07,940 >> ولكن هنا، إذا كنت # تعريف حجم سطح السفينة إلى 32 في أعلى جدا من قانون بلدي، 147 00:07:07,940 --> 00:07:11,730 إذا كنت بحاجة إلى تغيير ذلك، يمكنني اذهبوا وتغيير ذلك شيئا واحدا. 148 00:07:11,730 --> 00:07:15,010 إعادة ترجمة قانون بلدي، وجميع فجأة أنها تنتشر من خلال. 149 00:07:15,010 --> 00:07:18,850 في الواقع، لا يمكننا تغيير سطح السفينة حجم إلى أي قيمة نريد. 150 00:07:18,850 --> 00:07:22,500 >> يمكنني تهمك في لعبة من حجم سطح السفينة صغيرة؟ 151 00:07:22,500 --> 00:07:23,430 >> أنا دوغ ويد. 152 00:07:23,430 --> 00:07:25,840 وهذا هو CS50. 153 00:07:25,840 --> 00:07:27,772