1 00:00:00,000 --> 00:00:02,350 >> [Muzikos grojimo] 2 00:00:02,350 --> 00:00:05,444 3 00:00:05,444 --> 00:00:06,360 Doug LLOYD: Visos dešinę. 4 00:00:06,360 --> 00:00:07,770 Geras keistą temą, tiesa? 5 00:00:07,770 --> 00:00:09,050 Magic numeriai. 6 00:00:09,050 --> 00:00:12,012 Kas Doe jis reiškia, kai jis kalbame apie magija numerius? 7 00:00:12,012 --> 00:00:14,220 Na, kai kurių programų kad mes parašyta CS50 8 00:00:14,220 --> 00:00:16,660 Iki šiol buvo kažkokiam keistam numeriai rūšies išmesti į juos. 9 00:00:16,660 --> 00:00:19,680 Galbūt dėl ​​priežasčių, mes ne visiškai suprasti dabar. 10 00:00:19,680 --> 00:00:23,950 Pavyzdžiui, Mario problemą, apribotos piramidės aukštis 23. 11 00:00:23,950 --> 00:00:26,880 Mes aiškiai pasakė, kad tu negali būti didesnis kaip 23. 12 00:00:26,880 --> 00:00:28,702 >> Bet ką reiškia 23? 13 00:00:28,702 --> 00:00:30,410 Na, jei jūs skaityti Atidžiai spec, jums 14 00:00:30,410 --> 00:00:32,493 galėjo pastebėti, kad priežastis, kodėl mes apribota jį 23 15 00:00:32,493 --> 00:00:36,160 yra todėl, kad standartinio aukščio iš terminalo lange yra 24. 16 00:00:36,160 --> 00:00:38,860 Ir todėl, jei mes turime piramidės būti aukštesni nei, kad 17 00:00:38,860 --> 00:00:41,290 ji gali tai padaryti Keistas dalykas kur jis eina išjungti ekraną. 18 00:00:41,290 --> 00:00:45,140 Ir žinote, ką tai reiškia, kad atsižvelgiant į kontekstą, tiesa? 19 00:00:45,140 --> 00:00:48,880 >> Ar 23 karto akivaizdus prasmė į ką nors, kas žiūri savo programą 20 00:00:48,880 --> 00:00:51,550 o gal turi skirtingą dydis terminalo langą? 21 00:00:51,550 --> 00:00:52,330 Tikriausiai ne. 22 00:00:52,330 --> 00:00:53,080 Atrodo, Gerai. 23 00:00:53,080 --> 00:00:55,005 Na, kodėl ji šiek tiek mažiau nei 23 yra? 24 00:00:55,005 --> 00:00:56,880 Apskritai, tai tipo iš blogas įprotis iš tikrųjų 25 00:00:56,880 --> 00:00:58,940 rašyti konstantas į savo kodą. 26 00:00:58,940 --> 00:01:02,190 Vykdydamas šią funkciją, kai jūs iš tikrųjų parašyti konstantą į savo kodą, 27 00:01:02,190 --> 00:01:05,630 jis kartais vadinamas naudojant magija numeriai, kuri yra kažkas 28 00:01:05,630 --> 00:01:08,030 mes paprastai norite išbandyti ir išvengti. 29 00:01:08,030 --> 00:01:12,830 >> Pavyzdžiui, leiskite pažvelgti Šiuo paprasta funkcija čia. 30 00:01:12,830 --> 00:01:15,726 Akivaizdu nėra duomenų tipas C vadinamas kortelę arba denio. 31 00:01:15,726 --> 00:01:16,600 Taigi tiesiog būti su manimi. 32 00:01:16,600 --> 00:01:18,910 Tai šiek tiek Pseudocode sumaišyti čia. 33 00:01:18,910 --> 00:01:21,050 Tai yra funkcija vadinama spręsti kortelę, kuri, matyt, 34 00:01:21,050 --> 00:01:26,570 mano denio, kaip jo parametru, ir atras man vieną kortelę. 35 00:01:26,570 --> 00:01:30,990 >> Ir aš darau kažką čia, kur aš turi kilpą, kuri veikia nuo 0 iki 52, 36 00:01:30,990 --> 00:01:33,394 ir aš spręsti kortelę. 37 00:01:33,394 --> 00:01:35,310 Na, mes turime magija skaičius čia teisus. 38 00:01:35,310 --> 00:01:38,790 Ar matote, ką Magiškas skaičius yra? 39 00:01:38,790 --> 00:01:42,280 Arba dar svarbiau, ar ne pamatyti, kas yra problema čia? 40 00:01:42,280 --> 00:01:44,310 Ypač jei tai yra tik viena funkcija 41 00:01:44,310 --> 00:01:48,030 į savo failą į aplankas, kuriame yra 42 00:01:48,030 --> 00:01:49,970 įvairių krūva failai, iš kurių kiekvienas 43 00:01:49,970 --> 00:01:51,670 daro dar vienas dalykas, kortų kaladė. 44 00:01:51,670 --> 00:01:57,310 Gal tai sumaišo juos, ar kalbama apie ranką iš penkių kortelių vietoj vieno kortelę. 45 00:01:57,310 --> 00:01:59,420 >> Ar matote, ką Problema gali būti čia? 46 00:01:59,420 --> 00:02:03,220 Ar matote magišką skaičių Aš švirkščiamas į kodą? 47 00:02:03,220 --> 00:02:04,390 Tai 52, į dešinę. 48 00:02:04,390 --> 00:02:06,440 >> Kaip, intuityviai jūs turbūt žinote, Gerai. 49 00:02:06,440 --> 00:02:09,740 Kaip standartinis denio kortelės yra 52 kortų. 50 00:02:09,740 --> 00:02:12,570 Bet mūsų programoje, tai tik rūšies plūduriuojančius aplink ten. 51 00:02:12,570 --> 00:02:15,280 Tai kaip visi staiga ten 52. 52 00:02:15,280 --> 00:02:18,290 >> Vienas iš būdų išspręsti šią problemą Problema yra tai padaryti. 53 00:02:18,290 --> 00:02:22,724 Mes labai aiškiai dabar skambinama iš denio dydį kaip 52. 54 00:02:22,724 --> 00:02:25,390 Tai suteikia jai šiek tiek paprastesnis tai reiškia, kai už kilpos 55 00:02:25,390 --> 00:02:28,650 Vėliau mes tada sakyti, kad aš yra mažesnis nei denio dydžio. 56 00:02:28,650 --> 00:02:32,666 Taip tik atrodo geriau, nei sakydamas 52. 57 00:02:32,666 --> 00:02:34,290 Dabar tai nereiškia, faktiškai nustatyti problemą. 58 00:02:34,290 --> 00:02:38,460 Ji suteikia simbolinę prasmę pastovus. 59 00:02:38,460 --> 00:02:40,820 Bet ji iš tikrųjų rūšies pristatyti dar vieną problemą 60 00:02:40,820 --> 00:02:43,770 kad gali būti ne iš karto. 61 00:02:43,770 --> 00:02:45,859 Net jei šis kintamasis deklaruojama globally-- 62 00:02:45,859 --> 00:02:47,650 jūs prisiminti, ką jis reiškia, kai mes pareiškiame 63 00:02:47,650 --> 00:02:50,500 kintamasis pasaulyje palyginti vietoje? 64 00:02:50,500 --> 00:02:53,340 Net jei mes pareiškiame kintamąjį visame pasaulyje, kas būtų, jei ten 65 00:02:53,340 --> 00:02:55,500 kitą funkciją Mūsų rinkinys funkcijų 66 00:02:55,500 --> 00:02:59,750 kad sandoris su kortelės manipuliacijos kad netyčia keičia denio dydį, 67 00:02:59,750 --> 00:03:02,727 ar jis padidina jį 1 arba sumažina jį 1 d. 68 00:03:02,727 --> 00:03:04,060 Tai gali rašybos problemų, tiesa? 69 00:03:04,060 --> 00:03:08,261 Ypač, jei mes susiduriame su rinkiniu kortelių, kur maišymo visą denio 70 00:03:08,261 --> 00:03:08,760 nereikia. 71 00:03:08,760 --> 00:03:12,804 Jei denio dydis sumažėjo 1, pavyzdžiui, 51, 72 00:03:12,804 --> 00:03:14,970 mes ne iš tikrųjų maišymo visos kortos galbūt. 73 00:03:14,970 --> 00:03:16,500 Mes paliekant vieną jų. 74 00:03:16,500 --> 00:03:21,680 Ir ta vertė galbūt bus Prognozuojama, ar išnaudojami blogas aktorius. 75 00:03:21,680 --> 00:03:24,920 >> C suteikia tai, kas vadinama Preprocesorius direktyva, 76 00:03:24,920 --> 00:03:27,764 taip pat vadinamas makrolygio sukurti simbolines konstantas. 77 00:03:27,764 --> 00:03:30,180 Ir iš tiesų, jūs jau ve matyti preprocesoriaus direktyvą, 78 00:03:30,180 --> 00:03:32,916 net jei nesate girdėję ją vadinamas, kad su # include. 79 00:03:32,916 --> 00:03:37,150 Tai dar vienas pavyzdys, makro ar pirminio apdorojimo direktyva. 80 00:03:37,150 --> 00:03:41,290 >> Būdas sukurti simbolines konstantas, arba suteikiant pavadinimą pastovus 81 00:03:41,290 --> 00:03:43,740 taip, kad ji turi daugiau reiškia, yra taip. 82 00:03:43,740 --> 00:03:47,030 #define, vardas, keitimas. 83 00:03:47,030 --> 00:03:49,140 Tikrai svarbu panaikinti Čia tikrai greitai. 84 00:03:49,140 --> 00:03:54,180 Nedėkite kabliataškį ne tavo #defines pabaigos. 85 00:03:54,180 --> 00:03:57,310 Taigi, tai #define, vardas, keitimas. 86 00:03:57,310 --> 00:03:59,540 >> Kai jūsų programa yra parengta, kas iš tikrųjų vyksta 87 00:03:59,540 --> 00:04:01,740 yra, jei ketinate kompiliatorius eiti per savo kodą 88 00:04:01,740 --> 00:04:06,770 ir pakeisti kiekvieną atvejį žodis "pavadinimas" su Whatever You 89 00:04:06,770 --> 00:04:08,860 įdėti kaip pakaitalas. 90 00:04:08,860 --> 00:04:13,060 Analogiškai, jei include yra tarsi panašią į kopijuodami, 91 00:04:13,060 --> 00:04:15,700 tada #define yra tarsi panašus į rasti ir pakeisti, 92 00:04:15,700 --> 00:04:19,180 jei jūs kada nors naudoti šią funkciją A tekstų apdorojimo programa,, pavyzdžiui. 93 00:04:19,180 --> 00:04:26,345 >> Taigi, pavyzdžiui, jei aš #define PI 3.14159265, 94 00:04:26,345 --> 00:04:28,720 jei jūs geriau matematiškai linkę ir staiga 95 00:04:28,720 --> 00:04:31,640 matyti 3.14159265 plaukioja aplink savo kodą, 96 00:04:31,640 --> 00:04:33,517 Jūs tikriausiai žinote, kad kalba apie pi. 97 00:04:33,517 --> 00:04:35,850 Bet gal mes galime suteikti jai šiek tiek daugiau simbolinė prasmė. 98 00:04:35,850 --> 00:04:39,850 Ir mes galime pasakyti, o ne #define Pi kaip tą skaičių gurkšnis 99 00:04:39,850 --> 00:04:42,110 kad aš neketinu laikyti skaityti daugiau ir daugiau. 100 00:04:42,110 --> 00:04:45,560 >> Ir kas nutiks vėliau kaupia laikas yra tada, kai programa yra 101 00:04:45,560 --> 00:04:48,530 parengta, pirmas dalykas, kad nutiks tai bus eiti per 102 00:04:48,530 --> 00:04:51,520 ir jis pakeis kiekvieną kartą ji mato kapitalo P, kapitalo I, 103 00:04:51,520 --> 00:04:55,610 jis bus tiesiog pakeisti jį 3.14 ir tt, kad jūs 104 00:04:55,610 --> 00:04:58,090 neturite įveskite jį kiekvieną laikas, o jūsų programa vis dar 105 00:04:58,090 --> 00:05:00,631 turi funkciją, kuri jums tikėtis, nes jūs dirbate 106 00:05:00,631 --> 00:05:05,090 su manipuliavimo, dauginant, dalijant, kokia ji yra, PI. 107 00:05:05,090 --> 00:05:08,230 >> Čia yra ne tik tai Keitimas tik numeriais. 108 00:05:08,230 --> 00:05:12,279 Pavyzdžiui, galėčiau #define Žinoma, kaip styginių CS50. 109 00:05:12,279 --> 00:05:14,070 Šiuo atveju, kai Programa parengta, 110 00:05:14,070 --> 00:05:16,236 #define bus eiti per kodas, pakeisti kiekvieną kartą 111 00:05:16,236 --> 00:05:19,900 ji mato "kursą" su styginių CS50. 112 00:05:19,900 --> 00:05:21,720 >> Jūs pastebėsite čia taip pat, kad aš dažnai 113 00:05:21,720 --> 00:05:26,090 #define visi mano apibrėžta simbolinis konstantos, taip sakant, 114 00:05:26,090 --> 00:05:28,130 visada visais dangteliais. 115 00:05:28,130 --> 00:05:28,960 Tai konvencija. 116 00:05:28,960 --> 00:05:30,170 Tai nėra būtina. 117 00:05:30,170 --> 00:05:33,900 Priežastis dažniausiai žmonės naudoja Visos sostinės, kai jie #defining 118 00:05:33,900 --> 00:05:37,590 yra tik, kad tai tikrai aišku, kad Tai ypač elementas mano kodas 119 00:05:37,590 --> 00:05:38,820 yra apibrėžtų pastovus. 120 00:05:38,820 --> 00:05:43,730 Jei jis buvo mažosiomis raidėmis, tai įmanoma, kad jis gali būti painiojamas su kintamąjį. 121 00:05:43,730 --> 00:05:46,120 Ir tai tikriausiai nėra geras dalykas daryti. 122 00:05:46,120 --> 00:05:48,910 >> Taigi tai ypač sprendimas yra daug geriau 123 00:05:48,910 --> 00:05:50,550 nei viena iš ankstesnių. 124 00:05:50,550 --> 00:05:59,950 Jei aš pirmą #define denio dydis 52, tada dabar mano panaudojimas 52, arba denio dydį čia 125 00:05:59,950 --> 00:06:01,850 yra daug paprastesnis ir daug saugiau. 126 00:06:01,850 --> 00:06:03,280 Jūs negalite manipuliuoti konstanta. 127 00:06:03,280 --> 00:06:05,259 Jūs negalite pasakyti 52 plius pliusas. 128 00:06:05,259 --> 00:06:06,800 Tai ne ketinate jį konvertuoti į 53. 129 00:06:06,800 --> 00:06:09,390 Jūs negalite keisti 52 į kažką. 130 00:06:09,390 --> 00:06:12,470 >> Jūs galite pakeisti kintamąjį kurio vertė yra 52, 131 00:06:12,470 --> 00:06:14,870 kuris buvo pirmasis Fix mes turėjome anksčiau. 132 00:06:14,870 --> 00:06:17,000 Ir jūs galėtų padidinti kad kintamasis 53. 133 00:06:17,000 --> 00:06:21,100 Bet jūs negalite pasakyti 52 plius plius ir turite, kad staiga pasukti 52 į 53. 134 00:06:21,100 --> 00:06:23,350 52 visada yra 52. 135 00:06:23,350 --> 00:06:28,860 Ir todėl jūs negalite netyčia pakeisti denis dydis čia manipuliuojant ją, 136 00:06:28,860 --> 00:06:29,940 137 00:06:29,940 --> 00:06:32,390 >> Dar viena gera pusė poveikis šiuo, nors tai 138 00:06:32,390 --> 00:06:38,310 kad tu žinoti, kad ne Visos pasaulio šalys 139 00:06:38,310 --> 00:06:40,690 naudoti korteles dydžio 52 denio? 140 00:06:40,690 --> 00:06:45,630 Pavyzdžiui, tai tikrai dažnas Vokietija naudoti denio dydį 32, 141 00:06:45,630 --> 00:06:48,020 kur jie juostelės iš kai iš mažesnės vertės kortelės. 142 00:06:48,020 --> 00:06:50,960 Ir šiuo atveju, aš norėjau uosto My Suite 143 00:06:50,960 --> 00:06:55,390 funkcijų, kurios susijusios su skyriaus manipuliacijos į Vokietiją. 144 00:06:55,390 --> 00:06:59,440 Galėčiau pirmiausia mes parodė, turite eiti ir pakeisti 145 00:06:59,440 --> 00:07:03,570 Visi 52 atvejų, mano kodas 32. 146 00:07:03,570 --> 00:07:07,940 >> Bet čia, jei aš #define denio dydis kaip 32 pačiame viršuje mano kodas, 147 00:07:07,940 --> 00:07:11,730 jei man reikia jį pakeisti, galiu tiesiog eiti ir pakeisti tą vieną dalyką. 148 00:07:11,730 --> 00:07:15,010 Rekompilowanie savo kodą, ir visi staiga ji plinta. 149 00:07:15,010 --> 00:07:18,850 Iš tiesų, mes galima pakeisti denio dydis bet vertės norime. 150 00:07:18,850 --> 00:07:22,500 >> Ar galiu sudominti jus žaidimas denio dydžio pikapas? 151 00:07:22,500 --> 00:07:23,430 >> Aš Doug Lloyd. 152 00:07:23,430 --> 00:07:25,840 Ir tai yra CS50. 153 00:07:25,840 --> 00:07:27,772