1 00:00:00,000 --> 00:00:02,350 >> [Predvaja glasba] 2 00:00:02,350 --> 00:00:05,444 3 00:00:05,444 --> 00:00:06,360 Doug LLOYD: V redu. 4 00:00:06,360 --> 00:00:07,770 Nekako čudno temo, kajne? 5 00:00:07,770 --> 00:00:09,050 Magic številke. 6 00:00:09,050 --> 00:00:12,012 Kaj doe je mislil, ko je to govorimo o magičnih številkah? 7 00:00:12,012 --> 00:00:14,220 No, nekateri programi da smo napisan v CS50 8 00:00:14,220 --> 00:00:16,660 doslej so imeli nekaj čudnega številke nekako vrže v njih. 9 00:00:16,660 --> 00:00:19,680 Morda razlogov ne bomo popolnoma razumem zdaj. 10 00:00:19,680 --> 00:00:23,950 Na primer, v problemu Mario smo omejeno višino piramide pri 23. 11 00:00:23,950 --> 00:00:26,880 Izrecno vam rekel ne more iti višje od 23. 12 00:00:26,880 --> 00:00:28,702 >> Ampak kaj 23 pomeni? 13 00:00:28,702 --> 00:00:30,410 No, če ste prebrali skrbno spec, vas 14 00:00:30,410 --> 00:00:32,493 Morda so videli, da je Zato smo jo omejili na 23 15 00:00:32,493 --> 00:00:36,160 Kajti standardne višine okna terminala je 24. 16 00:00:36,160 --> 00:00:38,860 In tako, če imamo piramida biti višji od tistega, 17 00:00:38,860 --> 00:00:41,290 to lahko storite to čudno stvar kjer odteka zaslon. 18 00:00:41,290 --> 00:00:45,140 In veste, kaj počne to pomeni, da v zvezi s tem, kajne? 19 00:00:45,140 --> 00:00:48,880 >> Je smisel 23 takoj jasno, za nekoga, ki gleda na vaš program 20 00:00:48,880 --> 00:00:51,550 in ima morda drugačen Velikost terminal okno? 21 00:00:51,550 --> 00:00:52,330 Verjetno ne. 22 00:00:52,330 --> 00:00:53,080 Zdi se kot, OK. 23 00:00:53,080 --> 00:00:55,005 No, zakaj je bilo nekaj manj kot 23? 24 00:00:55,005 --> 00:00:56,880 Na splošno velja, da je vrsta slabe navade dejansko 25 00:00:56,880 --> 00:00:58,940 pisati konstante v kodi. 26 00:00:58,940 --> 00:01:02,190 Pri tem, ko ste dejansko storiti napisati konstanto v kodi, 27 00:01:02,190 --> 00:01:05,630 to je včasih označuje kot uporabo čarobne številke, kar je nekaj, 28 00:01:05,630 --> 00:01:08,030 smo na splošno želijo poskusiti in se izogniti. 29 00:01:08,030 --> 00:01:12,830 >> Na primer, recimo, si oglejte na tej preprosti funkciji tukaj. 30 00:01:12,830 --> 00:01:15,726 Očitno ni podatkov tip v C imenovano kartico ali krova. 31 00:01:15,726 --> 00:01:16,600 Torej le nosijo s seboj. 32 00:01:16,600 --> 00:01:18,910 To je malo psevdokoda mešati tukaj. 33 00:01:18,910 --> 00:01:21,050 To je funkcija imenuje Ukvarjamo kartico, ki očitno 34 00:01:21,050 --> 00:01:26,570 strel krova njen parameter, in volja izhod zame ena kartica. 35 00:01:26,570 --> 00:01:30,990 >> In delam nekaj, kar tukaj, kjer sem imajo zanko, ki teče od 0 do 52, 36 00:01:30,990 --> 00:01:33,394 in sem se ukvarjajo kartico. 37 00:01:33,394 --> 00:01:35,310 No, imamo čarovnijo število tukaj, kajne. 38 00:01:35,310 --> 00:01:38,790 Ali vidite, kaj je magična številka je? 39 00:01:38,790 --> 00:01:42,280 Ali pa je še bolj pomembno, kajne videli, kaj je problem tukaj? 40 00:01:42,280 --> 00:01:44,310 Še posebej, če je to je le ena funkcija 41 00:01:44,310 --> 00:01:48,030 v svojem datoteko v Mapa, ki vsebuje 42 00:01:48,030 --> 00:01:49,970 kup drugačen datoteke, od katerih je vsak 43 00:01:49,970 --> 00:01:51,670 pa še ena stvar, da kart. 44 00:01:51,670 --> 00:01:57,310 Mogoče jih premeša, ali pa se ukvarja z roko iz petih kart namesto eno kartico. 45 00:01:57,310 --> 00:01:59,420 >> Ali vidite, kaj se Problem bi lahko bil tukaj? 46 00:01:59,420 --> 00:02:03,220 Ali vidite magično številko Sem vbrizga v kodo? 47 00:02:03,220 --> 00:02:04,390 To je 52, kajne. 48 00:02:04,390 --> 00:02:06,440 >> Kot, intuitivno verjetno veste, OK. 49 00:02:06,440 --> 00:02:09,740 Kot standardnim kompletom kartice vsebuje 52 kartic. 50 00:02:09,740 --> 00:02:12,570 Toda v našem programu, to je samo nekako plava okoli tam. 51 00:02:12,570 --> 00:02:15,280 To je kot naenkrat tam je 52. 52 00:02:15,280 --> 00:02:18,290 >> Eden od načinov za rešitev tega Problem je, da to storijo. 53 00:02:18,290 --> 00:02:22,724 Mi smo zelo eksplicitno zdaj kliče velikost krova kot 52 let. 54 00:02:22,724 --> 00:02:25,390 Daje pa malo bolj intuitivna kar pomeni, ko v zanko 55 00:02:25,390 --> 00:02:28,650 Kasneje smo potem reči, da sem manjša od velikosti krova. 56 00:02:28,650 --> 00:02:32,666 Samo zdi bolje, kot pravijo, 52. 57 00:02:32,666 --> 00:02:34,290 Zdaj to ne dejansko odpraviti težavo. 58 00:02:34,290 --> 00:02:38,460 To pa daje nekaj simbolična kar pomeni, da je konstanta. 59 00:02:38,460 --> 00:02:40,820 Ampak kljub temu nekako dejansko uvede drug problem 60 00:02:40,820 --> 00:02:43,770 da morda ne bo takoj vidna. 61 00:02:43,770 --> 00:02:45,859 Tudi če je ta spremenljivka se razglasi globally-- 62 00:02:45,859 --> 00:02:47,650 se spomnite, kaj je pomeni, ko izjavljamo 63 00:02:47,650 --> 00:02:50,500 spremenljivka globalno proti lokalno? 64 00:02:50,500 --> 00:02:53,340 Tudi če izjavljamo spremenljivko globalno, kaj če je 65 00:02:53,340 --> 00:02:55,500 drugo funkcijo v naš suite funkcij 66 00:02:55,500 --> 00:02:59,750 ki se ukvarjajo s kartico manipulacijo da nehote spreminja velikost krova, 67 00:02:59,750 --> 00:03:02,727 ali jo poveča za 1 ali pa se zmanjša za 1. 68 00:03:02,727 --> 00:03:04,060 To bi lahko pomenilo težave, kajne? 69 00:03:04,060 --> 00:03:08,261 Še posebej, če imamo opravka z nizom kartic kjer shuffling neprekinjeni krov 70 00:03:08,261 --> 00:03:08,760 je potrebno. 71 00:03:08,760 --> 00:03:12,804 Če je velikost krova zmanjšala z 1, na primer do 51, 72 00:03:12,804 --> 00:03:14,970 smo dejansko ne shuffling vse karte morda. 73 00:03:14,970 --> 00:03:16,500 Odšli bomo enega izmed njih ven. 74 00:03:16,500 --> 00:03:21,680 In ta vrednost lahko morda napovedati ali izkoriščajo slab igralec. 75 00:03:21,680 --> 00:03:24,920 >> C določa, kaj se ti Direktiva Predprocesor, ki 76 00:03:24,920 --> 00:03:27,764 se imenuje tudi makro za ustvarjanje simbolne konstante. 77 00:03:27,764 --> 00:03:30,180 In v resnici, ste že videl direktivo Predprocesor, 78 00:03:30,180 --> 00:03:32,916 tudi če še niste slišali pozval, da se z #include. 79 00:03:32,916 --> 00:03:37,150 To je še en primer makro ali direktiva Predprocesor. 80 00:03:37,150 --> 00:03:41,290 >> Način za ustvarjanje simbolne konstante, ali daje ime konstanta 81 00:03:41,290 --> 00:03:43,740 tako, da ima več kar pomeni, je, kot sledi. 82 00:03:43,740 --> 00:03:47,030 #define, ime, zamenjava. 83 00:03:47,030 --> 00:03:49,140 Res pomembno stran tukaj res hitro. 84 00:03:49,140 --> 00:03:54,180 Ne dal podpičje na konec vaše #define. 85 00:03:54,180 --> 00:03:57,310 Torej je #define, ime, zamenjava. 86 00:03:57,310 --> 00:03:59,540 >> Ko je vaš program sestavljen, kaj se dejansko dogaja 87 00:03:59,540 --> 00:04:01,740 je prevajalnik, če bo iti skozi kodo 88 00:04:01,740 --> 00:04:06,770 in zamenjati vsak primerek Beseda "ime" s Karkoli 89 00:04:06,770 --> 00:04:08,860 dal kot zamenjavo. 90 00:04:08,860 --> 00:04:13,060 Analogno, če #include je nekako za podoben kopiranje in lepljenje, 91 00:04:13,060 --> 00:04:15,700 potem #define je nekako Podobno najti in zamenjati, 92 00:04:15,700 --> 00:04:19,180 če ste kdaj uporabili to funkcijo, je z Beseda program obdelave, npr. 93 00:04:19,180 --> 00:04:26,345 >> Tako na primer, če sem #define pi kot 3.14159265, 94 00:04:26,345 --> 00:04:28,720 če ste boljši matematično nagnjena in nenadoma 95 00:04:28,720 --> 00:04:31,640 glej 3.14159265 letenja okrog v kodi, 96 00:04:31,640 --> 00:04:33,517 verjetno veste, da je govoril o pi. 97 00:04:33,517 --> 00:04:35,850 Toda morda jo je mogoče dati malo bolj simbolni pomen. 98 00:04:35,850 --> 00:04:39,850 In bomo lahko namesto #define reči pi kot tisti zalogaja številk 99 00:04:39,850 --> 00:04:42,110 da ne bom obdržati branju znova in znova. 100 00:04:42,110 --> 00:04:45,560 >> In kaj se bo potem zgodilo na zbere čas, ko je program 101 00:04:45,560 --> 00:04:48,530 zbrati, prva stvar, ki se bo zgodilo, je, da bo šel skozi 102 00:04:48,530 --> 00:04:51,520 in bo zamenjati vsakič se vidi kapitalsko P, kapital I, 103 00:04:51,520 --> 00:04:55,610 to bo dobesedno ga nadomestiti z 3.14 in tako naprej, tako da se 104 00:04:55,610 --> 00:04:58,090 nimajo, da tip je vsak Čas, ko je vaš program, še 105 00:04:58,090 --> 00:05:00,631 Ima funkcionalnosti, ki vas pričakujejo, ker delate 106 00:05:00,631 --> 00:05:05,090 z manipulacijo, razmnoževanje, delitvijo, karkoli že je, ki jih pi. 107 00:05:05,090 --> 00:05:08,230 >> Si niso omejeni na to nadomeščanje samo številke. 108 00:05:08,230 --> 00:05:12,279 Na primer, lahko bi #define Seveda, kot je godalnega CS50. 109 00:05:12,279 --> 00:05:14,070 V tem primeru, ko je Program je sestavljen, 110 00:05:14,070 --> 00:05:16,236 #define bo šel skozi koda, zamenjajte vsakič 111 00:05:16,236 --> 00:05:19,900 se vidi "tečaj" z godalnim CS50. 112 00:05:19,900 --> 00:05:21,720 >> Opazili boste tukaj tudi to, da sem pogosto 113 00:05:21,720 --> 00:05:26,090 #define vse moje opredeljena simbolična konstante, tako rekoč, 114 00:05:26,090 --> 00:05:28,130 so vedno v vseh kape. 115 00:05:28,130 --> 00:05:28,960 To je konvencija. 116 00:05:28,960 --> 00:05:30,170 To ni potrebno. 117 00:05:30,170 --> 00:05:33,900 Razlog splošno bo ljudi uporablja vse prestolnice, ko oni #defining 118 00:05:33,900 --> 00:05:37,590 je le, da bi bilo res jasno, da To zlasti element moje kode 119 00:05:37,590 --> 00:05:38,820 je definirana konstanta. 120 00:05:38,820 --> 00:05:43,730 Če je bil male, je možno, da to bi lahko zamenjali s spremenljivko. 121 00:05:43,730 --> 00:05:46,120 In to je verjetno ni dobra stvar. 122 00:05:46,120 --> 00:05:48,910 >> Torej je to predvsem Rešitev je veliko bolje 123 00:05:48,910 --> 00:05:50,550 kot eno od prejšnjih. 124 00:05:50,550 --> 00:05:59,950 Če sem prvič #define velikost deck 52, potem Zdaj je moja uporaba 52 ali velikosti krova tukaj, 125 00:05:59,950 --> 00:06:01,850 je veliko bolj intuitiven in veliko varnejši. 126 00:06:01,850 --> 00:06:03,280 Ne, ne moreš manipulirati konstanto. 127 00:06:03,280 --> 00:06:05,259 Ne morete reči, 52 plus plus. 128 00:06:05,259 --> 00:06:06,800 To se ne dogaja, da ga pretvoriti v 53. 129 00:06:06,800 --> 00:06:09,390 Ne morete spremeniti 52 do nečesa. 130 00:06:09,390 --> 00:06:12,470 >> Lahko spremenite spremenljivko katerih vrednost je 52, 131 00:06:12,470 --> 00:06:14,870 ki je bil prvi fix smo imeli prej. 132 00:06:14,870 --> 00:06:17,000 In bi lahko povečali da spremenljivka do 53. 133 00:06:17,000 --> 00:06:21,100 Ampak ne moreš reči 52 plus plus in imajo, da nenadoma spremeni 52 na 53. 134 00:06:21,100 --> 00:06:23,350 52 je vedno 52. 135 00:06:23,350 --> 00:06:28,860 In tako ne morete nehote spremeniti Velikost krova tukaj z njeno manipulacijo, 136 00:06:28,860 --> 00:06:29,940 137 00:06:29,940 --> 00:06:32,390 >> Še ena dobra stran Učinek tega je, čeprav 138 00:06:32,390 --> 00:06:38,310 da se zavedate, da ne vse države po svetu 139 00:06:38,310 --> 00:06:40,690 uporabite kart velikosti 52? 140 00:06:40,690 --> 00:06:45,630 Na primer, to je res pogost v Nemčija uporabiti velikost krova 32, 141 00:06:45,630 --> 00:06:48,020 kadar trak iz nekaterih spodnjih kartic vrednostjo. 142 00:06:48,020 --> 00:06:50,960 In v tem primeru sem želel vrata moje suite 143 00:06:50,960 --> 00:06:55,390 funkcij, ki se ukvarjajo z Kartica manipulacija v Nemčijo. 144 00:06:55,390 --> 00:06:59,440 Jaz bi na prvi stopnji smo pokazala, moram iti in zamenjati 145 00:06:59,440 --> 00:07:03,570 vse primerke 52 v moji kodi z 32. 146 00:07:03,570 --> 00:07:07,940 >> Ampak tukaj, če sem #define velikost deck kot 32 na samem vrhu mojega kodo, 147 00:07:07,940 --> 00:07:11,730 če moram spremeniti, ne morem samo pojdi in spremenite to eno stvar. 148 00:07:11,730 --> 00:07:15,010 Prevedem kodo, in vsi Nenadoma se širi skozi. 149 00:07:15,010 --> 00:07:18,850 V bistvu, lahko spremenimo krova velikost na katerokoli vrednost želimo. 150 00:07:18,850 --> 00:07:22,500 >> Vam lahko interes za Igra velikosti deck pickup? 151 00:07:22,500 --> 00:07:23,430 >> Sem Doug Lloyd. 152 00:07:23,430 --> 00:07:25,840 In to je CS50. 153 00:07:25,840 --> 00:07:27,772