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 Даг Ллоид: У реду. 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 Па, неки од програма да смо написали у ЦС50 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 Чини се као, у реду. 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 Очигледно нема података Тип у Ц зове картицу или палубу. 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 >> Као, интуитивно што вероватно знате, у реду. 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 Чак и ако ова варијабла је проглашен глобалли-- 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 >> Ц обезбеђује оно што се зове препроцесор директива, која 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 Немојте стављати зарез у крај ваших #дефинес. 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 и она ће заменити сваки пут види Цапитал П, капитал И, 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 На пример, могу да #дефине Наравно као стринг ЦС50. 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 види "ток" са стринг ЦС50. 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 Разлог углавном људи ће користити све престоницама када су #дефининг 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 И у овом случају, желео да порта мој пакет 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 А ово је ЦС50. 153 00:07:25,840 --> 00:07:27,772