1 00:00:00,000 --> 00:00:02,350 >> [Speel van musiek] 2 00:00:02,350 --> 00:00:05,444 3 00:00:05,444 --> 00:00:06,360 DOUG LLOYD: Alle reg. 4 00:00:06,360 --> 00:00:07,770 Soort van 'n vreemde onderwerp, reg? 5 00:00:07,770 --> 00:00:09,050 Magic nommers. 6 00:00:09,050 --> 00:00:12,012 Wat doen hy bedoel wanneer hy praat oor magic nommers? 7 00:00:12,012 --> 00:00:14,220 Wel, sommige van die programme dat ons in CS50 geskryf het 8 00:00:14,220 --> 00:00:16,660 so ver het 'n paar weird het getalle soort gegooi in hulle nie. 9 00:00:16,660 --> 00:00:19,680 Miskien vir redes wat ons doen nie heeltemal verstaan ​​nou. 10 00:00:19,680 --> 00:00:23,950 Byvoorbeeld, in die Mario probleem, het ons beperk die hoogte van die piramide op 23. 11 00:00:23,950 --> 00:00:26,880 Ons uitdruklik gesê jy kan nie gaan hoër as 23. 12 00:00:26,880 --> 00:00:28,702 >> Maar wat beteken 23 beteken? 13 00:00:28,702 --> 00:00:30,410 Wel, as jy lees die spec versigtig, jy 14 00:00:30,410 --> 00:00:32,493 dalk het gesien dat die Daarom het ons opgehoopte dit op 23 15 00:00:32,493 --> 00:00:36,160 is omdat die standaard hoogte van 'n terminale venster is 24. 16 00:00:36,160 --> 00:00:38,860 En so as ons die piramide langer as dit, 17 00:00:38,860 --> 00:00:41,290 dit dalk die vreemde ding om te doen waar dit loop van die skerm af. 18 00:00:41,290 --> 00:00:45,140 En jy weet, wat beteken wat beteken in konteks, reg? 19 00:00:45,140 --> 00:00:48,880 >> Is die betekenis van 23 onmiddellik voor die hand liggend aan iemand wat kyk na jou program 20 00:00:48,880 --> 00:00:51,550 en het dalk 'n ander grootte terminale venster? 21 00:00:51,550 --> 00:00:52,330 Waarskynlik nie. 22 00:00:52,330 --> 00:00:53,080 Dit lyk asof, OK. 23 00:00:53,080 --> 00:00:55,005 Wel, hoekom is dit net minder as 23? 24 00:00:55,005 --> 00:00:56,880 In die algemeen, dit is soort van 'n slegte gewoonte eintlik 25 00:00:56,880 --> 00:00:58,940 om konstantes skryf in jou kode. 26 00:00:58,940 --> 00:01:02,190 Deur dit te doen, wanneer jy eintlik doen skryf 'n konstante in jou kode, 27 00:01:02,190 --> 00:01:05,630 dit is ook soms na verwys as die gebruik van magic nommers, en dit is iets 28 00:01:05,630 --> 00:01:08,030 ons in die algemeen wil probeer vermy. 29 00:01:08,030 --> 00:01:12,830 >> Byvoorbeeld, laat ons neem 'n blik op hierdie eenvoudige funksie hier. 30 00:01:12,830 --> 00:01:15,726 Dit is duidelik dat daar is geen data tipe in C genoem kaart of dek. 31 00:01:15,726 --> 00:01:16,600 Dus net met my dra. 32 00:01:16,600 --> 00:01:18,910 Dit is 'n bietjie van pseudokode gemeng hier. 33 00:01:18,910 --> 00:01:21,050 Dit is 'n funksie genoem hanteer kaart wat blykbaar 34 00:01:21,050 --> 00:01:26,570 neem 'n pak as sy parameter en wil uitvoer na my 'n enkele kaart. 35 00:01:26,570 --> 00:01:30,990 >> En ek is om iets te doen hier waar ek 'n lus wat loop 0-52, 36 00:01:30,990 --> 00:01:33,394 en ek gaan 'n kaart. 37 00:01:33,394 --> 00:01:35,310 Wel, ons het 'n magie het nommer in hier, reg. 38 00:01:35,310 --> 00:01:38,790 Sien jy wat die magie nommer is? 39 00:01:38,790 --> 00:01:42,280 Of meer belangrik, het jy sien wat die probleem is hier? 40 00:01:42,280 --> 00:01:44,310 Veral as dit is net een funksie 41 00:01:44,310 --> 00:01:48,030 in sy eie lêer in 'n gids wat bevat 42 00:01:48,030 --> 00:01:49,970 'n klomp van verskillende lêers, wat elk 43 00:01:49,970 --> 00:01:51,670 doen 'n ander ding om 'n pak kaarte. 44 00:01:51,670 --> 00:01:57,310 Miskien is dit skud hulle, of 'n hand oor van vyf kaarte in plaas van 'n enkele kaart. 45 00:01:57,310 --> 00:01:59,420 >> Sien jy wat die probleem kan wees hier? 46 00:01:59,420 --> 00:02:03,220 Sien jy die magie nommer Ek het ingespuit in die kode? 47 00:02:03,220 --> 00:02:04,390 Dit is 52, regs. 48 00:02:04,390 --> 00:02:06,440 >> Soos, intuïtief waarskynlik weet jy, OK. 49 00:02:06,440 --> 00:02:09,740 Soos 'n standaard dek van kaarte bevat 52 kaarte. 50 00:02:09,740 --> 00:02:12,570 Maar in ons program, dit is net soort rond dryf in daar. 51 00:02:12,570 --> 00:02:15,280 Dit is soos al van 'n skielike daar is 'n 52. 52 00:02:15,280 --> 00:02:18,290 >> Een manier om dit op te los probleem is om dit te doen. 53 00:02:18,290 --> 00:02:22,724 Ons is nou baie uitdruklik roep die dek grootte as 52. 54 00:02:22,724 --> 00:02:25,390 Dit gee dit 'n bietjie meer intuïtief beteken wanneer dit in die lus 55 00:02:25,390 --> 00:02:28,650 later op ons dan sê, het ek minder is as die dek grootte. 56 00:02:28,650 --> 00:02:32,666 Dit lyk net beter as om te sê 52. 57 00:02:32,666 --> 00:02:34,290 Nou dit beteken eintlik die probleem op te los. 58 00:02:34,290 --> 00:02:38,460 Dit gee nie 'n simboliese betekenis aan die konstante. 59 00:02:38,460 --> 00:02:40,820 Maar dit soort van eintlik Nog 'n probleem te stel 60 00:02:40,820 --> 00:02:43,770 wat dalk nie onmiddellik duidelik. 61 00:02:43,770 --> 00:02:45,859 Selfs as hierdie veranderlike verklaar globally-- 62 00:02:45,859 --> 00:02:47,650 onthou jy wat dit beteken wanneer ons verklaar 63 00:02:47,650 --> 00:02:50,500 'n veranderlike wêreldwyd versus plaaslik? 64 00:02:50,500 --> 00:02:53,340 Selfs as ons verklaar 'n veranderlike wêreldwyd, wat as daar is 65 00:02:53,340 --> 00:02:55,500 ander funksie in ons suite van funksies 66 00:02:55,500 --> 00:02:59,750 wat handel oor card manipulasie wat per ongeluk verander dek grootte, 67 00:02:59,750 --> 00:03:02,727 of dit verhoog dit deur 1 of verminder dit met 1. 68 00:03:02,727 --> 00:03:04,060 Dit kan die moeilikheid spel, reg? 69 00:03:04,060 --> 00:03:08,261 Veral as ons te doen het met 'n stel kaarte waar geskuifel die volle dek 70 00:03:08,261 --> 00:03:08,760 word benodig. 71 00:03:08,760 --> 00:03:12,804 As dek grootte verminder deur 1, byvoorbeeld, tot 51, 72 00:03:12,804 --> 00:03:14,970 ons is nie eintlik geskuifel al die kaarte moontlik. 73 00:03:14,970 --> 00:03:16,500 Ons vertrek een van hulle uit. 74 00:03:16,500 --> 00:03:21,680 En wat waarde kan miskien voorspel of uitgebuit word deur 'n slegte akteur. 75 00:03:21,680 --> 00:03:24,920 >> C bied 'n sogenaamde voorverwerker richtlijn, wat 76 00:03:24,920 --> 00:03:27,764 word ook genoem 'n makro vir skep simboliese konstantes. 77 00:03:27,764 --> 00:03:30,180 En in die feit, wat reeds het jy gesien hoe 'n richtlijn voorverwerker, 78 00:03:30,180 --> 00:03:32,916 selfs as jy dit nie gehoor het nie genoem dat met die include. 79 00:03:32,916 --> 00:03:37,150 Dit is nog 'n voorbeeld van 'n makro of lasgewing voorverwerker. 80 00:03:37,150 --> 00:03:41,290 >> Die manier om simbolies konstantes te skep, of gee 'n naam om 'n konstante 81 00:03:41,290 --> 00:03:43,740 sodat dit meer beteken, is soos volg. 82 00:03:43,740 --> 00:03:47,030 # define naam, vervanging. 83 00:03:47,030 --> 00:03:49,140 Werklik belangrik opsy hier regtig vinnig. 84 00:03:49,140 --> 00:03:54,180 Moenie 'n kommapunt te die einde van jou #defines. 85 00:03:54,180 --> 00:03:57,310 So dit is # define naam, vervanging. 86 00:03:57,310 --> 00:03:59,540 >> Wanneer jou program is saamgestel, wat werklik gebeur 87 00:03:59,540 --> 00:04:01,740 is die samesteller as gaan om te gaan deur jou kode 88 00:04:01,740 --> 00:04:06,770 en vervang elke geval van die woord "naam" met alles wat jy 89 00:04:06,770 --> 00:04:08,860 sit as plaasvervanger. 90 00:04:08,860 --> 00:04:13,060 Analoog, as include is 'n soort van soortgelyke kopieer en plak, 91 00:04:13,060 --> 00:04:15,700 dan is # define soort soortgelyk aan te vind en te vervang, 92 00:04:15,700 --> 00:04:19,180 as jy ooit gebruik dat die funksie in 'n woordverwerkingsprogram, byvoorbeeld. 93 00:04:19,180 --> 00:04:26,345 >> So byvoorbeeld, as ek # define pi as 3.14159265, 94 00:04:26,345 --> 00:04:28,720 As jy 'n beter wiskundig is geneig en jy skielik 95 00:04:28,720 --> 00:04:31,640 sien 3.14159265 vlieg rond in jou kode, 96 00:04:31,640 --> 00:04:33,517 jy waarskynlik weet dit praat oor pi. 97 00:04:33,517 --> 00:04:35,850 Maar miskien kan ons dit 'n gee bietjie meer simboliese betekenis. 98 00:04:35,850 --> 00:04:39,850 En ons kan plaas sê # define pi as wat mondvol getalle 99 00:04:39,850 --> 00:04:42,110 dat ek nie gaan hou lees oor en oor. 100 00:04:42,110 --> 00:04:45,560 >> En wat gaan dan gebeur stel tyd is wanneer die program is 101 00:04:45,560 --> 00:04:48,530 saamgestel, die eerste ding wat sal gebeur is dit gaan deur 102 00:04:48,530 --> 00:04:51,520 en dit sal elke keer vervang dit sien kapitaal P, kapitaal I, 103 00:04:51,520 --> 00:04:55,610 dit sal letterlik vervang dit met 3,14 en so aan, sodat jy 104 00:04:55,610 --> 00:04:58,090 hoef nie te tik dit elke tyd terwyl jou program steeds 105 00:04:58,090 --> 00:05:00,631 het die funksie dat jy verwag, want jy werk 106 00:05:00,631 --> 00:05:05,090 met manipuleer, te vermenigvuldig, verdeel, wat dit ookal is deur pi. 107 00:05:05,090 --> 00:05:08,230 >> Jy is nie beperk tot hierdie vervanging van net getalle. 108 00:05:08,230 --> 00:05:12,279 Byvoorbeeld, kan ek # define Natuurlik as die string CS50. 109 00:05:12,279 --> 00:05:14,070 In hierdie geval, toe die program word saamgestel, 110 00:05:14,070 --> 00:05:16,236 # define sal gaan deur die kode, vervang elke keer 111 00:05:16,236 --> 00:05:19,900 dit sien "kursus" met die string CS50. 112 00:05:19,900 --> 00:05:21,720 >> Jy sal hier sien ook dat ek gereeld 113 00:05:21,720 --> 00:05:26,090 # define al my gedefinieer simboliese konstantes, om so te praat, 114 00:05:26,090 --> 00:05:28,130 is altyd in hoofletters. 115 00:05:28,130 --> 00:05:28,960 Dit is 'n konvensie. 116 00:05:28,960 --> 00:05:30,170 Dit is nie nodig nie. 117 00:05:30,170 --> 00:05:33,900 Die rede algemeen mense sal gebruik hoofletters wanneer hulle #defining 118 00:05:33,900 --> 00:05:37,590 is net om dit regtig duidelik dat maak hierdie spesifieke element van my kode 119 00:05:37,590 --> 00:05:38,820 is 'n omskrewe konstant. 120 00:05:38,820 --> 00:05:43,730 As dit was klein, is dit moontlik dat dit kan verwar word met 'n veranderlike. 121 00:05:43,730 --> 00:05:46,120 En dit is waarskynlik nie 'n goeie ding om te doen. 122 00:05:46,120 --> 00:05:48,910 >> So hierdie spesifieke oplossing is baie beter 123 00:05:48,910 --> 00:05:50,550 as een van die voriges. 124 00:05:50,550 --> 00:05:59,950 As ek die eerste keer # define dek grootte 52, dan nou my gebruik van 52, of dek grootte hier, 125 00:05:59,950 --> 00:06:01,850 is 'n baie meer intuïtief en 'n baie veiliger. 126 00:06:01,850 --> 00:06:03,280 Jy kan 'n konstante nie manipuleer. 127 00:06:03,280 --> 00:06:05,259 Jy kan nie sê 52 plus plus. 128 00:06:05,259 --> 00:06:06,800 Dit is nie van plan om dit te omskep in 53. 129 00:06:06,800 --> 00:06:09,390 Jy kan nie verander nie 52 tot iets. 130 00:06:09,390 --> 00:06:12,470 >> Jy kan 'n veranderlike verander waarvan die waarde is 52, 131 00:06:12,470 --> 00:06:14,870 wat was die eerste fix ons voorheen gehad het. 132 00:06:14,870 --> 00:06:17,000 En jy kan verhoog daardie veranderlike tot 53. 133 00:06:17,000 --> 00:06:21,100 Maar jy kan nie sê 52 plus plus en het wat skielik draai 52 in 53. 134 00:06:21,100 --> 00:06:23,350 52 is altyd 52. 135 00:06:23,350 --> 00:06:28,860 En so kan jy nie per ongeluk verander dek grootte hier deur te manipuleer nie, 136 00:06:28,860 --> 00:06:29,940 137 00:06:29,940 --> 00:06:32,390 >> Nog 'n goeie kant effek van hierdie al is 138 00:06:32,390 --> 00:06:38,310 wat jy bewus daarvan dat nie alle lande regoor die wêreld 139 00:06:38,310 --> 00:06:40,690 gebruik 'n pak kaarte grootte 52? 140 00:06:40,690 --> 00:06:45,630 Byvoorbeeld, dit is regtig algemeen in Duitsland 'n pak van 32 te gebruik grootte, 141 00:06:45,630 --> 00:06:48,020 waar hulle stroop uit 'n paar van die laer waarde kaarte. 142 00:06:48,020 --> 00:06:50,960 En in hierdie geval, ek wou hawe my suite 143 00:06:50,960 --> 00:06:55,390 van funksies wat met card manipulasie na Duitsland. 144 00:06:55,390 --> 00:06:59,440 Ek kon in die eerste plek ons getoon, het om te gaan en te vervang 145 00:06:59,440 --> 00:07:03,570 alle gevalle van 52 in my kode met 32. 146 00:07:03,570 --> 00:07:07,940 >> Maar hier, as ek # define dek grootte as 32 by die top van my kode, 147 00:07:07,940 --> 00:07:11,730 as ek nodig het om dit te verander, ek kan net gaan en verander een ding. 148 00:07:11,730 --> 00:07:15,010 Heropstel my kode, en almal van 'n skielike dit voortplant deur. 149 00:07:15,010 --> 00:07:18,850 In werklikheid is, kan ons dek verander grootte om enige waarde wat ons wil hê. 150 00:07:18,850 --> 00:07:22,500 >> Ek kan jou interesseer in 'n spel dek grootte bakkie? 151 00:07:22,500 --> 00:07:23,430 >> Ek is Doug Lloyd. 152 00:07:23,430 --> 00:07:25,840 En dit is CS50. 153 00:07:25,840 --> 00:07:27,772