>> [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.