1 00:00:00,000 --> 00:00:02,350 >> [Prehrávanie hudby] 2 00:00:02,350 --> 00:00:05,444 3 00:00:05,444 --> 00:00:06,360 DOUG LLOYD: Dobre. 4 00:00:06,360 --> 00:00:07,770 Druh podivné tému, nie? 5 00:00:07,770 --> 00:00:09,050 Magická čísla. 6 00:00:09,050 --> 00:00:12,012 Čo laň myslel, keď je hovoríme o mágiu čísel? 7 00:00:12,012 --> 00:00:14,220 No, niektoré programy že sme napísaný v CS50 8 00:00:14,220 --> 00:00:16,660 Doteraz mal nejaký divný Čísla druh hodil v nich. 9 00:00:16,660 --> 00:00:19,680 Možno, že z dôvodov, my nie úplne pochopiť práve teraz. 10 00:00:19,680 --> 00:00:23,950 Napríklad, v probléme Mario, sme limitovaný výšku pyramídy na 23 ° C. 11 00:00:23,950 --> 00:00:26,880 Výslovne sme vás povedal, Nemôžete ísť vyššie ako 23. 12 00:00:26,880 --> 00:00:28,702 >> Ale čo 23 znamená? 13 00:00:28,702 --> 00:00:30,410 No, ak ste si prečítať spec opatrne, vám 14 00:00:30,410 --> 00:00:32,493 mohli vidieť, že Dôvod, prečo sme ju obmedzený na 23 15 00:00:32,493 --> 00:00:36,160 Je tomu tak preto štandardnou výškou z okna terminálu je 24. 16 00:00:36,160 --> 00:00:38,860 A tak ak máme pyramída byť vyššie ako to, 17 00:00:38,860 --> 00:00:41,290 to by mohlo robiť taký divný veci kde to beží mimo obrazovku. 18 00:00:41,290 --> 00:00:45,140 A viete, čo robí to znamená v kontexte, že jo? 19 00:00:45,140 --> 00:00:48,880 >> Je význam 23 okamžite zrejmé s niekým, kto sa pozrie na váš program 20 00:00:48,880 --> 00:00:51,550 a možno má iný Veľkosť okna terminálu? 21 00:00:51,550 --> 00:00:52,330 Pravdepodobne nie. 22 00:00:52,330 --> 00:00:53,080 Vyzerá to ako, OK. 23 00:00:53,080 --> 00:00:55,005 Tak prečo je to len menej ako 23? 24 00:00:55,005 --> 00:00:56,880 Všeobecne možno povedať, že je to druh zlého zvyku vlastne 25 00:00:56,880 --> 00:00:58,940 písať konštanty do kódu. 26 00:00:58,940 --> 00:01:02,190 Pritom, keď ste vlastne robiť napísať konštantu do kódu, 27 00:01:02,190 --> 00:01:05,630 to je niekedy označovaná ako použitie Magická čísla, čo je niečo, 28 00:01:05,630 --> 00:01:08,030 sme sa všeobecne chcete vyskúšať a vyhnúť sa. 29 00:01:08,030 --> 00:01:12,830 >> Napríklad, poďme sa pozrieť v tejto jednoduchej funkcie tu. 30 00:01:12,830 --> 00:01:15,726 Je zrejmé, že to žiadne dáta typu v C s názvom karty alebo paluby. 31 00:01:15,726 --> 00:01:16,600 Takže len majte so mnou. 32 00:01:16,600 --> 00:01:18,910 Je to trochu pseudokód zmiešané v sem. 33 00:01:18,910 --> 00:01:21,050 Jedná sa o funkciu s názvom vysporiadať kartu, ktorá zjavne 34 00:01:21,050 --> 00:01:26,570 berie palubu ako jeho parameter, a vypíše sa mi jedna karta. 35 00:01:26,570 --> 00:01:30,990 >> A robím niečo, čo tu, kde som majú slučku, ktorá beží od 0 do 52, 36 00:01:30,990 --> 00:01:33,394 a ja sa vysporiadať kartu. 37 00:01:33,394 --> 00:01:35,310 No, máme mágiu číslo tu, hneď. 38 00:01:35,310 --> 00:01:38,790 Vidíte, čo je magické číslo je? 39 00:01:38,790 --> 00:01:42,280 Alebo je ešte dôležitejšie, že nie vidieť, čo je problém tu? 40 00:01:42,280 --> 00:01:44,310 Najmä ak je táto je len jedna funkcia 41 00:01:44,310 --> 00:01:48,030 vo vlastnom súbore v zložka, ktorá obsahuje 42 00:01:48,030 --> 00:01:49,970 banda iný súbory, z ktorých každý 43 00:01:49,970 --> 00:01:51,670 robí niečo iné k balíčku kariet. 44 00:01:51,670 --> 00:01:57,310 Možno, že to zamieša je, alebo spoločnosti ruku z piatich kariet namiesto jednej karty. 45 00:01:57,310 --> 00:01:59,420 >> Vidíte, čo sa Problém by mohol byť? 46 00:01:59,420 --> 00:02:03,220 Vidíte magické číslo Ja som vstrekuje 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 >> Rovnako ako, intuitívne asi viete, OK. 49 00:02:06,440 --> 00:02:09,740 Ako štandardným balíčkom karty obsahuje 52 kariet. 50 00:02:09,740 --> 00:02:12,570 Ale v našom programe, je to len druh plávajúce okolo tam. 51 00:02:12,570 --> 00:02:15,280 Je to ako všetko naraz je tu 52. 52 00:02:15,280 --> 00:02:18,290 >> Jeden spôsob, ako vyriešiť tento problém Problém je v tom, ako to urobiť. 53 00:02:18,290 --> 00:02:22,724 Teraz sme veľmi výslovne volali veľkosť paluby 52. 54 00:02:22,724 --> 00:02:25,390 Dáva to trochu viac intuitívne čo znamená, keď v cykle for 55 00:02:25,390 --> 00:02:28,650 Neskôr sme sa potom povedať, že som je menšia ako veľkosť paluby. 56 00:02:28,650 --> 00:02:32,666 Proste to vyzerá lepšie, než hovoriť 52. 57 00:02:32,666 --> 00:02:34,290 Teraz to však v skutočnosti problém vyriešiť. 58 00:02:34,290 --> 00:02:38,460 To sa dať nejaké symbolické zmysel konštanty. 59 00:02:38,460 --> 00:02:40,820 Ale to vlastne druh zaviesť ďalší problém 60 00:02:40,820 --> 00:02:43,770 ktoré nemusia byť na prvý pohľad zrejmé. 61 00:02:43,770 --> 00:02:45,859 Aj keď sa táto premenná je deklarovaný globally-- 62 00:02:45,859 --> 00:02:47,650 spomínaš si, čo to znamená, že keď prehlasujeme 63 00:02:47,650 --> 00:02:50,500 premenná globálne proti lokálne? 64 00:02:50,500 --> 00:02:53,340 Aj keby sme deklarovať premennú globálne, čo keď je tu 65 00:02:53,340 --> 00:02:55,500 ďalšie funkcie v Naša sada funkcií 66 00:02:55,500 --> 00:02:59,750 ktoré sa zaoberajú manipuláciou kartou že nechtiac zmení veľkosť Deck, 67 00:02:59,750 --> 00:03:02,727 alebo zvyšuje ju 1 alebo je znižuje o 1. 68 00:03:02,727 --> 00:03:04,060 To by mohlo znamenať problémy, že jo? 69 00:03:04,060 --> 00:03:08,261 Zvlášť keď máme čo do činenia so súborom kariet, kde zamiešanie palubu 70 00:03:08,261 --> 00:03:08,760 je nutné. 71 00:03:08,760 --> 00:03:12,804 Ak sa zníži veľkosť paluba 1, napríklad na 51, 72 00:03:12,804 --> 00:03:14,970 nie sme vlastne miešanie všetky karty možná. 73 00:03:14,970 --> 00:03:16,500 Odchádzame jeden z nich von. 74 00:03:16,500 --> 00:03:21,680 A že hodnota by mohla byť možná predpovedal, alebo zneužiť zlý herec. 75 00:03:21,680 --> 00:03:24,920 >> C poskytuje to, čo sa nazýva Smernice preprocesor, ktorý 76 00:03:24,920 --> 00:03:27,764 je tiež nazývaný makro pre vytvárať symbolické konštanty. 77 00:03:27,764 --> 00:03:30,180 A v skutočnosti, ktoré ste už Videl direktíva preprocesoru, 78 00:03:30,180 --> 00:03:32,916 aj keď ste ju počuť volal, že sa #include. 79 00:03:32,916 --> 00:03:37,150 Je to ďalší príklad toho, makro alebo smernice preprocesor. 80 00:03:37,150 --> 00:03:41,290 >> Spôsob, ako vytvoriť symbolické konštanty, alebo dávať meno konštantné 81 00:03:41,290 --> 00:03:43,740 tak, že má viac čo znamená, je nasledujúci. 82 00:03:43,740 --> 00:03:47,030 #define, názov, výmena. 83 00:03:47,030 --> 00:03:49,140 Naozaj dôležitá stranou Tu naozaj rýchlo. 84 00:03:49,140 --> 00:03:54,180 Nedávajte bodkočiarka na koniec vašich #DEFINEs. 85 00:03:54,180 --> 00:03:57,310 Takže je to #define, názov, výmena. 86 00:03:57,310 --> 00:03:59,540 >> Ak je váš program zostavený, čo sa v skutočnosti deje 87 00:03:59,540 --> 00:04:01,740 je kompilátor, pokiaľ ide prejsť kódu 88 00:04:01,740 --> 00:04:06,770 a nahraďte každý výskyt Slovo "name" s tým, čo ste 89 00:04:06,770 --> 00:04:08,860 dal ako náhradu. 90 00:04:08,860 --> 00:04:13,060 Analogicky, ak #include je trochu z podobne ako kopírovanie a vkladanie, 91 00:04:13,060 --> 00:04:15,700 potom #define je trochu podobný nájsť a nahradiť, 92 00:04:15,700 --> 00:04:19,180 ak ste niekedy používali túto funkciu v slovo spracovateľský program, napríklad. 93 00:04:19,180 --> 00:04:26,345 >> Tak napríklad, ak I #define PI ako 3,14159265, 94 00:04:26,345 --> 00:04:28,720 ak ste lepšie matematicky naklonený a zrazu 95 00:04:28,720 --> 00:04:31,640 pozri 3,14159265 lietanie okolo v kóde, 96 00:04:31,640 --> 00:04:33,517 asi viete, že hovorí o pi. 97 00:04:33,517 --> 00:04:35,850 Ale možno, že môžeme dať to trochu viac symbolický význam. 98 00:04:35,850 --> 00:04:39,850 A môžeme povedať, namiesto toho #define pi ako tá plnými čísel 99 00:04:39,850 --> 00:04:42,110 že nebudem mať čítať znova a znova. 100 00:04:42,110 --> 00:04:45,560 >> A čo sa stane potom na kompilácie čas je, keď je program 101 00:04:45,560 --> 00:04:48,530 skompilovaný, prvá vec, ktorá sa stane, je, že bude prechádzať 102 00:04:48,530 --> 00:04:51,520 a nahradí zakaždým vidí veľkým P, kapitál I, 103 00:04:51,520 --> 00:04:55,610 to bude doslova ho nahradiť 3.14 a tak ďalej, takže si 104 00:04:55,610 --> 00:04:58,090 Nemusíte písať, že každý Doba zatiaľ čo váš program stále 105 00:04:58,090 --> 00:05:00,631 má funkcie, ktoré vám Očakávame, pretože pracujete 106 00:05:00,631 --> 00:05:05,090 s Manipulácia s, násobenie, delenie, nech je to čokoľvek PI. 107 00:05:05,090 --> 00:05:08,230 >> Tie nie sú obmedzené na to substitúcia iba čísla. 108 00:05:08,230 --> 00:05:12,279 Napríklad by som mohol #define Samozrejme, ako reťazec CS50. 109 00:05:12,279 --> 00:05:14,070 V tomto prípade, keď sa Program je zostavený, 110 00:05:14,070 --> 00:05:16,236 #define prejde kód, nahraďte zakaždým 111 00:05:16,236 --> 00:05:19,900 vidí "kurz" sa sláčikovým CS50. 112 00:05:19,900 --> 00:05:21,720 >> Určite ste si všimli tu tiež, že ja často 113 00:05:21,720 --> 00:05:26,090 #define všetky moje definované symbolické konštanty, aby som tak povedal, 114 00:05:26,090 --> 00:05:28,130 sú vždy vo všetkých čiapky. 115 00:05:28,130 --> 00:05:28,960 Je to konvencie. 116 00:05:28,960 --> 00:05:30,170 Nie je to nutné. 117 00:05:30,170 --> 00:05:33,900 Dôvodom všeobecne ľudí bude používať všetky kapitály keď sú #defining 118 00:05:33,900 --> 00:05:37,590 je len, aby to naozaj jasné, že tento konkrétny prvok mojom kódu 119 00:05:37,590 --> 00:05:38,820 je definovaný konštantný. 120 00:05:38,820 --> 00:05:43,730 Ak by to bolo malé písmeno, je možné, že to by mohlo byť zamieňaná s premennou. 121 00:05:43,730 --> 00:05:46,120 A to je asi nie je dobrá vec. 122 00:05:46,120 --> 00:05:48,910 >> Tak tento konkrétny riešenie je oveľa lepší 123 00:05:48,910 --> 00:05:50,550 ako jeden z tých predchádzajúcich. 124 00:05:50,550 --> 00:05:59,950 Ak som prvýkrát #define veľkosť paluba 52, potom teraz môj užívanie 52 alebo veľkosti paluby tu, 125 00:05:59,950 --> 00:06:01,850 je oveľa viac intuitívne a oveľa bezpečnejšie. 126 00:06:01,850 --> 00:06:03,280 Nemôžete manipulovať s konštantu. 127 00:06:03,280 --> 00:06:05,259 Nemôžete povedať, 52 a plus. 128 00:06:05,259 --> 00:06:06,800 To nebude previesť na 53. 129 00:06:06,800 --> 00:06:09,390 Nemôžete zmeniť 52 na niečo. 130 00:06:09,390 --> 00:06:12,470 >> Môžete zmeniť premenné ktorého hodnota je 52, 131 00:06:12,470 --> 00:06:14,870 ktorý bol prvý fix sme predtým. 132 00:06:14,870 --> 00:06:17,000 A by sa mohol zvýšiť že premenná na 53. 133 00:06:17,000 --> 00:06:21,100 Ale nemôžete povedať, 52 a navyše plus a majú, ktoré sa náhle otočiť 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 nechtiac zmeniť veľkosť paluba tu manipuláciou to, 136 00:06:28,860 --> 00:06:29,940 137 00:06:29,940 --> 00:06:32,390 >> Ďalším dobrým strana Účinok tejto však je, 138 00:06:32,390 --> 00:06:38,310 že sú si vedomí toho, že nie Všetky krajiny po celom svete 139 00:06:38,310 --> 00:06:40,690 použiť balíček kariet veľkosti 52? 140 00:06:40,690 --> 00:06:45,630 Napríklad, je to naozaj bežné v Nemecko použiť veľkosť balíček 32, 141 00:06:45,630 --> 00:06:48,020 kde sa vyradiť niektoré nižších karty hodnotou. 142 00:06:48,020 --> 00:06:50,960 A v tomto prípade, myslím, chcel prístavu My Suite 143 00:06:50,960 --> 00:06:55,390 funkcií, ktoré sa zaoberajú manipulácia karty do Nemecka. 144 00:06:55,390 --> 00:06:59,440 Mohol by som v prvom rade sme ukázal, musím ísť a nahradiť 145 00:06:59,440 --> 00:07:03,570 všetky inštancie 52 v mojom kódu s 32. 146 00:07:03,570 --> 00:07:07,940 >> Ale tu, keď som #define veľkosť deck as 32 na samom vrchole mojej kódu, 147 00:07:07,940 --> 00:07:11,730 keď potrebujem ju zmeniť, môžem jednoducho ísť a zmeniť, že jedna vec. 148 00:07:11,730 --> 00:07:15,010 Překompilovat môj kód, a všetky Zrazu to šíri. 149 00:07:15,010 --> 00:07:18,850 V skutočnosti, môžeme zmeniť palubu Veľkosť na ľubovoľnú hodnotu chceme. 150 00:07:18,850 --> 00:07:22,500 >> Môžem zaujímať v Hra veľkosti palube vyzdvihnutie? 151 00:07:22,500 --> 00:07:23,430 >> Som Doug Lloyd. 152 00:07:23,430 --> 00:07:25,840 A to je CS50. 153 00:07:25,840 --> 00:07:27,772