1 00:00:00,000 --> 00:00:02,350 >> [Přehrávání hudby] 2 00:00:02,350 --> 00:00:05,444 3 00:00:05,444 --> 00:00:06,360 DOUG LLOYD: Dobře. 4 00:00:06,360 --> 00:00:07,770 Druh podivné téma, ne? 5 00:00:07,770 --> 00:00:09,050 Magická čísla. 6 00:00:09,050 --> 00:00:12,012 Co laň myslel, když je mluvíme o magii čísel? 7 00:00:12,012 --> 00:00:14,220 No, některé programy že jsme napsaný v CS50 8 00:00:14,220 --> 00:00:16,660 Doposud měl nějaký divný Čísla druh hodil v nich. 9 00:00:16,660 --> 00:00:19,680 Možná, že z důvodů, my ne zcela pochopit právě teď. 10 00:00:19,680 --> 00:00:23,950 Například, v problému Mario, jsme limitován výšku pyramidy na 23 ° C. 11 00:00:23,950 --> 00:00:26,880 Výslovně jsme vás řekl, Nemůžete jít výš než 23. 12 00:00:26,880 --> 00:00:28,702 >> Ale co 23 znamená? 13 00:00:28,702 --> 00:00:30,410 No, pokud jste si přečíst spec opatrně, vám 14 00:00:30,410 --> 00:00:32,493 mohli vidět, že Důvod, proč jsme ji omezen na 23 15 00:00:32,493 --> 00:00:36,160 Je tomu tak proto standardní výškou z okna terminálu je 24. 16 00:00:36,160 --> 00:00:38,860 A tak pokud máme pyramida být vyšší než to, 17 00:00:38,860 --> 00:00:41,290 to by mohlo dělat takový divný věci kde to běží mimo obrazovku. 18 00:00:41,290 --> 00:00:45,140 A víte, co dělá to znamená v kontextu, že jo? 19 00:00:45,140 --> 00:00:48,880 >> Je význam 23 okamžitě zřejmé s někým, kdo se podívá na váš program 20 00:00:48,880 --> 00:00:51,550 a možná má jiný Velikost okna terminálu? 21 00:00:51,550 --> 00:00:52,330 Asi ne. 22 00:00:52,330 --> 00:00:53,080 Vypadá to jako, OK. 23 00:00:53,080 --> 00:00:55,005 Tak proč je to jen méně než 23? 24 00:00:55,005 --> 00:00:56,880 Obecně lze říci, že je to druh špatného zvyku vlastně 25 00:00:56,880 --> 00:00:58,940 psát konstanty do kódu. 26 00:00:58,940 --> 00:01:02,190 Přitom, když jste vlastně dělat napsat konstantu do kódu, 27 00:01:02,190 --> 00:01:05,630 to je někdy odkazoval se na jako použití Magická čísla, což je něco, 28 00:01:05,630 --> 00:01:08,030 jsme se obecně chcete vyzkoušet a vyhnout se. 29 00:01:08,030 --> 00:01:12,830 >> Například, pojďme se podívat v této jednoduché funkce zde. 30 00:01:12,830 --> 00:01:15,726 Je zřejmé, že to žádná data typu v C s názvem karty nebo paluby. 31 00:01:15,726 --> 00:01:16,600 Takže jen mějte se mnou. 32 00:01:16,600 --> 00:01:18,910 Je to trochu pseudokód smícháno v sem. 33 00:01:18,910 --> 00:01:21,050 Jedná se o funkci s názvem vypořádat kartu, která zjevně 34 00:01:21,050 --> 00:01:26,570 bere palubu jako jeho parametr, a vypíše se mi jedna karta. 35 00:01:26,570 --> 00:01:30,990 >> A dělám něco, co tady, kde jsem mají smyčku, která běží od 0 do 52, 36 00:01:30,990 --> 00:01:33,394 a já se vypořádat kartu. 37 00:01:33,394 --> 00:01:35,310 No, máme magii číslo tady, hned. 38 00:01:35,310 --> 00:01:38,790 Vidíte, co je magické číslo je? 39 00:01:38,790 --> 00:01:42,280 Nebo je ještě důležitější, že ne vidět, co je problém tady? 40 00:01:42,280 --> 00:01:44,310 Zejména pokud je tato je jen jedna funkce 41 00:01:44,310 --> 00:01:48,030 ve vlastním souboru v složka, která obsahuje 42 00:01:48,030 --> 00:01:49,970 banda jiný soubory, z nichž každý 43 00:01:49,970 --> 00:01:51,670 dělá něco jiného k balíčku karet. 44 00:01:51,670 --> 00:01:57,310 Možná, že to zamíchá je, nebo společnosti ruku z pěti karet místo jedné karty. 45 00:01:57,310 --> 00:01:59,420 >> Vidíte, co se Problém by mohl být? 46 00:01:59,420 --> 00:02:03,220 Vidíte magické číslo Já jsem vstřikuje do kódu? 47 00:02:03,220 --> 00:02:04,390 To je 52, vpravo. 48 00:02:04,390 --> 00:02:06,440 >> Stejně jako, intuitivně asi víte, OK. 49 00:02:06,440 --> 00:02:09,740 Jako standardním balíčkem karty obsahuje 52 karet. 50 00:02:09,740 --> 00:02:12,570 Ale v našem programu, je to jen druh plovoucí kolem tam. 51 00:02:12,570 --> 00:02:15,280 Je to jako všechno najednou je tu 52. 52 00:02:15,280 --> 00:02:18,290 >> Jeden způsob, jak vyřešit tento problém Problém je v tom, jak to udělat. 53 00:02:18,290 --> 00:02:22,724 Teď jsme velmi výslovně volali velikost paluby 52. 54 00:02:22,724 --> 00:02:25,390 Dává to trochu více intuitivní což znamená, když v cyklu for 55 00:02:25,390 --> 00:02:28,650 Později jsme se pak říct, že jsem je menší než velikost paluby. 56 00:02:28,650 --> 00:02:32,666 Prostě to vypadá lépe, než říkat 52. 57 00:02:32,666 --> 00:02:34,290 Teď to však ve skutečnosti problém vyřešit. 58 00:02:34,290 --> 00:02:38,460 To se dát nějaké symbolické smysl konstanty. 59 00:02:38,460 --> 00:02:40,820 Ale to vlastně druh zavést další problém 60 00:02:40,820 --> 00:02:43,770 které nemusí být na první pohled patrné. 61 00:02:43,770 --> 00:02:45,859 I když se tato proměnná je deklarován globally-- 62 00:02:45,859 --> 00:02:47,650 vzpomínáš si, co to znamená, že když prohlašujeme 63 00:02:47,650 --> 00:02:50,500 proměnná globálně proti lokálně? 64 00:02:50,500 --> 00:02:53,340 I kdybychom deklarovat proměnnou globálně, co když je tu 65 00:02:53,340 --> 00:02:55,500 další funkce v Naše sada funkcí 66 00:02:55,500 --> 00:02:59,750 které se zabývají manipulací kartou že nechtěně změní velikost Deck, 67 00:02:59,750 --> 00:03:02,727 nebo zvyšuje ji 1 nebo je snižuje o 1. 68 00:03:02,727 --> 00:03:04,060 To by mohlo znamenat potíže, že jo? 69 00:03:04,060 --> 00:03:08,261 Zvlášť když máme co do činění se souborem karet, kde zamíchání palubu 70 00:03:08,261 --> 00:03:08,760 je požadováno. 71 00:03:08,760 --> 00:03:12,804 Pokud se sníží velikost paluba 1, například na 51, 72 00:03:12,804 --> 00:03:14,970 nejsme vlastně míchání všechny karty možná. 73 00:03:14,970 --> 00:03:16,500 Odjíždíme jeden z nich ven. 74 00:03:16,500 --> 00:03:21,680 A že hodnota by mohla být možná předpověděl, nebo zneužít špatný herec. 75 00:03:21,680 --> 00:03:24,920 >> C poskytuje to, co se nazývá Směrnice preprocesor, který 76 00:03:24,920 --> 00:03:27,764 je také nazýván makro pro vytvářet symbolické konstanty. 77 00:03:27,764 --> 00:03:30,180 A ve skutečnosti, které jste již Viděl direktiva preprocesoru, 78 00:03:30,180 --> 00:03:32,916 i když jste ji slyšet volal, že se #include. 79 00:03:32,916 --> 00:03:37,150 Je to další příklad toho, makro nebo směrnice preprocesor. 80 00:03:37,150 --> 00:03:41,290 >> Způsob, jak vytvořit symbolické konstanty, nebo dávat jméno konstantní 81 00:03:41,290 --> 00:03:43,740 tak, že má více což znamená, je následující. 82 00:03:43,740 --> 00:03:47,030 #define, název, výměna. 83 00:03:47,030 --> 00:03:49,140 Opravdu důležitá stranou Zde opravdu rychle. 84 00:03:49,140 --> 00:03:54,180 Nedávejte středník na konec vašich #DEFINEs. 85 00:03:54,180 --> 00:03:57,310 Takže je to #define, název, výměna. 86 00:03:57,310 --> 00:03:59,540 >> Je-li váš program sestaven, co se ve skutečnosti děje 87 00:03:59,540 --> 00:04:01,740 je kompilátor, pokud jde projít kódu 88 00:04:01,740 --> 00:04:06,770 a nahraďte každý výskyt Slovo "name" s tím, co jste 89 00:04:06,770 --> 00:04:08,860 dal jako náhradu. 90 00:04:08,860 --> 00:04:13,060 Analogicky, pokud #include je trochu z podobně jako kopírování a vkládání, 91 00:04:13,060 --> 00:04:15,700 pak #define je trochu podobný najít a nahradit, 92 00:04:15,700 --> 00:04:19,180 pokud jste někdy používali tuto funkci v slovo zpracovatelský program, například. 93 00:04:19,180 --> 00:04:26,345 >> Tak například, pokud I #define PI jako 3,14159265, 94 00:04:26,345 --> 00:04:28,720 pokud jste lépe matematicky nakloněný a najednou 95 00:04:28,720 --> 00:04:31,640 viz 3,14159265 létání kolem v kódu, 96 00:04:31,640 --> 00:04:33,517 asi víte, že mluví o pí. 97 00:04:33,517 --> 00:04:35,850 Ale možná, že můžeme dát to trochu víc symbolický význam. 98 00:04:35,850 --> 00:04:39,850 A můžeme říci, místo toho #define pi jako ta plnými čísel 99 00:04:39,850 --> 00:04:42,110 že nebudu mít číst znovu a znovu. 100 00:04:42,110 --> 00:04:45,560 >> A co se stane pak na kompilace čas je, když je program 101 00:04:45,560 --> 00:04:48,530 zkompilovaný, první věc, která se stane, je, že bude procházet 102 00:04:48,530 --> 00:04:51,520 a nahradí pokaždé vidí velkým P, kapitál I, 103 00:04:51,520 --> 00:04:55,610 to bude doslova jej nahradit 3.14 a tak dále, takže si 104 00:04:55,610 --> 00:04:58,090 Nemusíte psát, že každý Doba zatímco váš program stále 105 00:04:58,090 --> 00:05:00,631 má funkce, které vám Očekáváme, protože pracujete 106 00:05:00,631 --> 00:05:05,090 s Manipulace s, násobení, dělení, ať je to cokoliv PI. 107 00:05:05,090 --> 00:05:08,230 >> Ty nejsou omezeny na to substituce pouze čísla. 108 00:05:08,230 --> 00:05:12,279 Například bych mohl #define Samozřejmě, jako řetězec CS50. 109 00:05:12,279 --> 00:05:14,070 V tomto případě, kdy se Program je sestaven, 110 00:05:14,070 --> 00:05:16,236 #define projde kód, nahraďte pokaždé 111 00:05:16,236 --> 00:05:19,900 vidí "kurz" se smyčcovým CS50. 112 00:05:19,900 --> 00:05:21,720 >> Určitě jste si všimli zde také, že já často 113 00:05:21,720 --> 00:05:26,090 #define všechny mé definované symbolické konstanty, abych tak řekl, 114 00:05:26,090 --> 00:05:28,130 jsou vždy ve všech čepice. 115 00:05:28,130 --> 00:05:28,960 Je to konvence. 116 00:05:28,960 --> 00:05:30,170 Není to nutné. 117 00:05:30,170 --> 00:05:33,900 Důvodem obecně lidí bude používat všechny kapitály když jsou #defining 118 00:05:33,900 --> 00:05:37,590 je jen, aby to opravdu jasné, že tento konkrétní prvek mém kódu 119 00:05:37,590 --> 00:05:38,820 je definovaný konstantní. 120 00:05:38,820 --> 00:05:43,730 Pokud by to bylo malé písmeno, je možné, že to by mohlo být zaměňována s proměnnou. 121 00:05:43,730 --> 00:05:46,120 A to je asi není dobrá věc. 122 00:05:46,120 --> 00:05:48,910 >> Tak tento konkrétní řešení je mnohem lepší 123 00:05:48,910 --> 00:05:50,550 než jeden z těch předchozích. 124 00:05:50,550 --> 00:05:59,950 Pokud jsem poprvé #define velikost paluba 52, pak teď můj užívání 52 nebo velikosti paluby zde, 125 00:05:59,950 --> 00:06:01,850 je mnohem více intuitivní a mnohem bezpečnější. 126 00:06:01,850 --> 00:06:03,280 Nemůžete manipulovat s konstantu. 127 00:06:03,280 --> 00:06:05,259 Nemůžete říci, 52 a plus. 128 00:06:05,259 --> 00:06:06,800 To nebude převést na 53. 129 00:06:06,800 --> 00:06:09,390 Nemůžete změnit 52 na něco. 130 00:06:09,390 --> 00:06:12,470 >> Můžete změnit proměnné jehož hodnota je 52, 131 00:06:12,470 --> 00:06:14,870 který byl první fix jsme předtím. 132 00:06:14,870 --> 00:06:17,000 A by se mohl zvýšit že proměnná na 53. 133 00:06:17,000 --> 00:06:21,100 Ale nemůžete říct, 52 a navíc plus a mají, které se náhle otočit 52 do 53. 134 00:06:21,100 --> 00:06:23,350 52 je vždy 52. 135 00:06:23,350 --> 00:06:28,860 A tak si můžete nechtěně změnit velikost paluba zde manipulací to, 136 00:06:28,860 --> 00:06:29,940 137 00:06:29,940 --> 00:06:32,390 >> Dalším dobrým strana Účinek této však je, 138 00:06:32,390 --> 00:06:38,310 že jsou si vědomi toho, že ne Všechny země po celém světě 139 00:06:38,310 --> 00:06:40,690 použít balíček karet velikosti 52? 140 00:06:40,690 --> 00:06:45,630 Například, je to opravdu běžné v Německo použít velikost balíček 32, 141 00:06:45,630 --> 00:06:48,020 kde se vyřadit některé nižších karty hodnotou. 142 00:06:48,020 --> 00:06:50,960 A v tomto případě, myslím, chtěl přístavu My Suite 143 00:06:50,960 --> 00:06:55,390 funkcí, které se zabývají manipulace karty do Německa. 144 00:06:55,390 --> 00:06:59,440 Mohl bych v první řadě jsme ukázal, musím jít a nahradit 145 00:06:59,440 --> 00:07:03,570 všechny instance 52 v mém kódu s 32. 146 00:07:03,570 --> 00:07:07,940 >> Ale tady, když jsem #define velikost deck as 32 na samém vrcholu mé kódu, 147 00:07:07,940 --> 00:07:11,730 když potřebuji ji změnit, můžu prostě jít a změnit, že jedna věc. 148 00:07:11,730 --> 00:07:15,010 Překompilovat můj kód, a všechny Najednou to šíří. 149 00:07:15,010 --> 00:07:18,850 Ve skutečnosti, můžeme změnit palubu Velikost na libovolnou hodnotu chceme. 150 00:07:18,850 --> 00:07:22,500 >> Mohu zajímat v Hra velikosti palubě vyzvednutí? 151 00:07:22,500 --> 00:07:23,430 >> Jsem Doug Lloyd. 152 00:07:23,430 --> 00:07:25,840 A to je CS50. 153 00:07:25,840 --> 00:07:27,772