[Speel van musiek] DOUG LLOYD: Alle reg. Soort van 'n vreemde onderwerp, reg? Magic nommers. Wat doen hy bedoel wanneer hy praat oor magic nommers? Wel, sommige van die programme dat ons in CS50 geskryf het so ver het 'n paar weird het getalle soort gegooi in hulle nie. Miskien vir redes wat ons doen nie heeltemal verstaan ​​nou. Byvoorbeeld, in die Mario probleem, het ons beperk die hoogte van die piramide op 23. Ons uitdruklik gesê jy kan nie gaan hoër as 23. Maar wat beteken 23 beteken? Wel, as jy lees die spec versigtig, jy dalk het gesien dat die Daarom het ons opgehoopte dit op 23 is omdat die standaard hoogte van 'n terminale venster is 24. En so as ons die piramide langer as dit, dit dalk die vreemde ding om te doen waar dit loop van die skerm af. En jy weet, wat beteken wat beteken in konteks, reg? Is die betekenis van 23 onmiddellik voor die hand liggend aan iemand wat kyk na jou program en het dalk 'n ander grootte terminale venster? Waarskynlik nie. Dit lyk asof, OK. Wel, hoekom is dit net minder as 23? In die algemeen, dit is soort van 'n slegte gewoonte eintlik om konstantes skryf in jou kode. Deur dit te doen, wanneer jy eintlik doen skryf 'n konstante in jou kode, dit is ook soms na verwys as die gebruik van magic nommers, en dit is iets ons in die algemeen wil probeer vermy. Byvoorbeeld, laat ons neem 'n blik op hierdie eenvoudige funksie hier. Dit is duidelik dat daar is geen data tipe in C genoem kaart of dek. Dus net met my dra. Dit is 'n bietjie van pseudokode gemeng hier. Dit is 'n funksie genoem hanteer kaart wat blykbaar neem 'n pak as sy parameter en wil uitvoer na my 'n enkele kaart. En ek is om iets te doen hier waar ek 'n lus wat loop 0-52, en ek gaan 'n kaart. Wel, ons het 'n magie het nommer in hier, reg. Sien jy wat die magie nommer is? Of meer belangrik, het jy sien wat die probleem is hier? Veral as dit is net een funksie in sy eie lêer in 'n gids wat bevat 'n klomp van verskillende lêers, wat elk doen 'n ander ding om 'n pak kaarte. Miskien is dit skud hulle, of 'n hand oor van vyf kaarte in plaas van 'n enkele kaart. Sien jy wat die probleem kan wees hier? Sien jy die magie nommer Ek het ingespuit in die kode? Dit is 52, regs. Soos, intuïtief waarskynlik weet jy, OK. Soos 'n standaard dek van kaarte bevat 52 kaarte. Maar in ons program, dit is net soort rond dryf in daar. Dit is soos al van 'n skielike daar is 'n 52. Een manier om dit op te los probleem is om dit te doen. Ons is nou baie uitdruklik roep die dek grootte as 52. Dit gee dit 'n bietjie meer intuïtief beteken wanneer dit in die lus later op ons dan sê, het ek minder is as die dek grootte. Dit lyk net beter as om te sê 52. Nou dit beteken eintlik die probleem op te los. Dit gee nie 'n simboliese betekenis aan die konstante. Maar dit soort van eintlik Nog 'n probleem te stel wat dalk nie onmiddellik duidelik. Selfs as hierdie veranderlike verklaar globally-- onthou jy wat dit beteken wanneer ons verklaar 'n veranderlike wêreldwyd versus plaaslik? Selfs as ons verklaar 'n veranderlike wêreldwyd, wat as daar is ander funksie in ons suite van funksies wat handel oor card manipulasie wat per ongeluk verander dek grootte, of dit verhoog dit deur 1 of verminder dit met 1. Dit kan die moeilikheid spel, reg? Veral as ons te doen het met 'n stel kaarte waar geskuifel die volle dek word benodig. As dek grootte verminder deur 1, byvoorbeeld, tot 51, ons is nie eintlik geskuifel al die kaarte moontlik. Ons vertrek een van hulle uit. En wat waarde kan miskien voorspel of uitgebuit word deur 'n slegte akteur. C bied 'n sogenaamde voorverwerker richtlijn, wat word ook genoem 'n makro vir skep simboliese konstantes. En in die feit, wat reeds het jy gesien hoe 'n richtlijn voorverwerker, selfs as jy dit nie gehoor het nie genoem dat met die include. Dit is nog 'n voorbeeld van 'n makro of lasgewing voorverwerker. Die manier om simbolies konstantes te skep, of gee 'n naam om 'n konstante sodat dit meer beteken, is soos volg. # define naam, vervanging. Werklik belangrik opsy hier regtig vinnig. Moenie 'n kommapunt te die einde van jou #defines. So dit is # define naam, vervanging. Wanneer jou program is saamgestel, wat werklik gebeur is die samesteller as gaan om te gaan deur jou kode en vervang elke geval van die woord "naam" met alles wat jy sit as plaasvervanger. Analoog, as include is 'n soort van soortgelyke kopieer en plak, dan is # define soort soortgelyk aan te vind en te vervang, as jy ooit gebruik dat die funksie in 'n woordverwerkingsprogram, byvoorbeeld. So byvoorbeeld, as ek # define pi as 3.14159265, As jy 'n beter wiskundig is geneig en jy skielik sien 3.14159265 vlieg rond in jou kode, jy waarskynlik weet dit praat oor pi. Maar miskien kan ons dit 'n gee bietjie meer simboliese betekenis. En ons kan plaas sê # define pi as wat mondvol getalle dat ek nie gaan hou lees oor en oor. En wat gaan dan gebeur stel tyd is wanneer die program is saamgestel, die eerste ding wat sal gebeur is dit gaan deur en dit sal elke keer vervang dit sien kapitaal P, kapitaal I, dit sal letterlik vervang dit met 3,14 en so aan, sodat jy hoef nie te tik dit elke tyd terwyl jou program steeds het die funksie dat jy verwag, want jy werk met manipuleer, te vermenigvuldig, verdeel, wat dit ookal is deur pi. Jy is nie beperk tot hierdie vervanging van net getalle. Byvoorbeeld, kan ek # define Natuurlik as die string CS50. In hierdie geval, toe die program word saamgestel, # define sal gaan deur die kode, vervang elke keer dit sien "kursus" met die string CS50. Jy sal hier sien ook dat ek gereeld # define al my gedefinieer simboliese konstantes, om so te praat, is altyd in hoofletters. Dit is 'n konvensie. Dit is nie nodig nie. Die rede algemeen mense sal gebruik hoofletters wanneer hulle #defining is net om dit regtig duidelik dat maak hierdie spesifieke element van my kode is 'n omskrewe konstant. As dit was klein, is dit moontlik dat dit kan verwar word met 'n veranderlike. En dit is waarskynlik nie 'n goeie ding om te doen. So hierdie spesifieke oplossing is baie beter as een van die voriges. As ek die eerste keer # define dek grootte 52, dan nou my gebruik van 52, of dek grootte hier, is 'n baie meer intuïtief en 'n baie veiliger. Jy kan 'n konstante nie manipuleer. Jy kan nie sê 52 plus plus. Dit is nie van plan om dit te omskep in 53. Jy kan nie verander nie 52 tot iets. Jy kan 'n veranderlike verander waarvan die waarde is 52, wat was die eerste fix ons voorheen gehad het. En jy kan verhoog daardie veranderlike tot 53. Maar jy kan nie sê 52 plus plus en het wat skielik draai 52 in 53. 52 is altyd 52. En so kan jy nie per ongeluk verander dek grootte hier deur te manipuleer nie, Nog 'n goeie kant effek van hierdie al is wat jy bewus daarvan dat nie alle lande regoor die wêreld gebruik 'n pak kaarte grootte 52? Byvoorbeeld, dit is regtig algemeen in Duitsland 'n pak van 32 te gebruik grootte, waar hulle stroop uit 'n paar van die laer waarde kaarte. En in hierdie geval, ek wou hawe my suite van funksies wat met card manipulasie na Duitsland. Ek kon in die eerste plek ons getoon, het om te gaan en te vervang alle gevalle van 52 in my kode met 32. Maar hier, as ek # define dek grootte as 32 by die top van my kode, as ek nodig het om dit te verander, ek kan net gaan en verander een ding. Heropstel my kode, en almal van 'n skielike dit voortplant deur. In werklikheid is, kan ons dek verander grootte om enige waarde wat ons wil hê. Ek kan jou interesseer in 'n spel dek grootte bakkie? Ek is Doug Lloyd. En dit is CS50.