>> [MUSIC SPILLE]
DOUG LLOYD: All right.
Slag av en merkelig tema, ikke sant?
Magiske tall.
Hva doe han mener når han er snakker om magiske tall?
Vel, noen av programmene som vi har skrevet i CS50
så langt har hatt noen rare nummer slags kastet i dem.
Kanskje av grunner vi ikke helt forstår akkurat nå.
For eksempel, i Mario problem, vi avkortet høyden av pyramiden ved 23.
Vi eksplisitt sa du kan ikke gå høyere enn 23.
>> Men hva betyr 23 mener?
Vel, hvis du leser spec nøye, du
har kanskje sett at Grunnen til at vi avkortet det ved 23
er fordi standard høyde av et terminalvindu er 24.
Og så hvis vi har pyramide være høyere enn det,
det kan gjøre dette rare ting hvor det går utenfor skjermen.
Og du vet, hva gjør det betyr i sammenheng, ikke sant?
>> Er betydningen av 23 umiddelbart åpen til noen som ser på programmet
og kanskje har en annen størrelse terminalvindu?
Sannsynligvis ikke.
Det virker som, OK.
Vel, hvorfor er det bare mindre enn 23?
Generelt er det slag av en dårlig vane faktisk
å skrive konstanter inn koden din.
Ved å gjøre det, når du faktisk gjør skrive en konstant i koden din,
det er noen ganger referert til som bruker magiske tall, som er noe
vi vanligvis ønsker å prøve og unngå.
>> For eksempel, la oss ta en titt på dette enkle funksjon her.
Tydeligvis er det ingen data type i C kalles kort eller dekk.
Så bare bære over med meg.
Det er en liten bit av pseudo blandet inn her.
Dette er en funksjon som kalles håndtere kort som tilsynelatende
tar en kortstokk som parameter, og vilje utgang til meg et enkelt kort.
>> Og jeg gjør noe her hvor jeg har en løkke som går 0-52,
og jeg håndtere et kort.
Vel, vi har fått en magisk Tallet i her, ikke sant.
Ser du hva det magiske tallet er?
Eller enda viktigere, gjør du se hva problemet er her?
Særlig hvis dette er bare en funksjon
i en egen fil i en mappen som inneholder
en haug med forskjellige filer, som hver for seg
gjør en annen ting til en kortstokk.
Kanskje det stokker dem, eller omhandler en hånd av fem kort i stedet for ett enkelt kort.
>> Ser du hva Problemet kan være her?
Ser du det magiske tallet Jeg har sprøytet inn koden?
Det er 52, ikke sant.
>> Liker, intuitivt du sikkert vet, OK.
Som en standard kortstokk med kort inneholder 52 kort.
Men i vårt program, det er bare slags flyter rundt der inne.
Det er som plutselig er det en 52.
>> En måte å løse dette Problemet er å gjøre dette.
Vi er veldig eksplisitt nå roper dekk størrelse som 52.
Det gir det litt mer intuitivt betyr når du er i for loop
senere vi da si, jeg er mindre enn dekk størrelse.
Det virker bare bedre enn å si 52.
Nå er dette løser faktisk problemet.
Det gir noen symbolske noe som betyr at vi hele tiden.
Men det gjør slags faktisk introdusere et annet problem
som kanskje ikke er umiddelbart åpenbare.
Selv om denne variabelen erklæres globally--
Husker du hva det betyr at når vi erklærer
en variabel globalt versus lokalt?
Selv om vi erklære en variabel globalt, hva om det er
en annen funksjon vår pakke med funksjoner
som omhandler kort manipulasjon at utilsiktet endrer dekkstørrelse,
eller det øker den ved En eller reduserer den ved en.
Det kan stave problemer, ikke sant?
Spesielt hvis vi har å gjøre med et sett kort hvor shuffling full dekk
er nødvendig.
Hvis dekk størrelse er redusert av en, for eksempel til 51,
vi faktisk ikke shuffling alle kortene muligens.
Vi drar en av dem ut.
Og at verdien kan kanskje være spådd eller utnyttes av en dårlig skuespiller.
>> C gir det som kalles en preprocessor direktiv som
er også kalt en makro for skape symbolske konstanter.
Og faktisk, har du allerede sett en preprosessor direktivet
selv om du ikke har hørt det heter det med # include.
Det er et annet eksempel på en makro eller preprosessor direktivet.
>> Måten å opprette symbolske konstanter, eller gi et navn til en konstant
slik at den har mer betydning, er som følger.
#define, navn, utskifting.
Veldig viktig side her virkelig rask.
Ikke legg et semikolon på slutten av dine #defines.
Så det er #define, navn, utskifting.
>> Når programmet er kompilert, hva som faktisk skjer
er kompilatoren hvis du går å gå gjennom koden din
og erstatte alle forekomster av ordet "navn" med hva du
satt som erstatning.
Analogt, hvis #include er liksom av lik kopiere og lime inn,
deretter #define er liksom lignende for å finne og erstatte,
Hvis du noen gang har brukt denne funksjonen i en tekstbehandlingsprogram, for eksempel.
>> Så for eksempel, hvis jeg #define pi som 3.14159265,
hvis du er bedre matematisk tilbøyelig og du plutselig
se 3.14159265 flying rundt i koden,
har du sannsynligvis vet at det er snakk om pi.
Men kanskje vi kan gi det en litt mer symbolsk betydning.
Og vi kan i stedet si #define pi som at munnfull av tall
at jeg ikke kommer til å holde lese om og om igjen.
>> Og hva kommer til å skje da på kompilering er når programmet er
kompilert, det første som vil skje er det vil gå gjennom
og det vil erstatte hver gang det ser kapital P, kapital I,
det vil bokstavelig talt erstatte det med 3.14 og så videre, slik at du
trenger ikke å skrive det hver tid mens programmet fortsatt
har funksjonalitet som du forvente, fordi du jobber
med manipulering, multiplisere, dele, uansett hva det er ved pi.
>> Man er ikke begrenset til denne erstatning for nummere.
For eksempel kan jeg #define Kurset som strengen CS50.
I dette tilfelle, når Programmet er utarbeidet,
#define vil gå gjennom kode, bytter hver gang
det ser "kurs" med strengen CS50.
>> Du vil merke her også at jeg ofte
#define all min definert symbolsk konstanter, så å si,
er alltid i store bokstaver.
Det er en konvensjon.
Det er ikke nødvendig.
Grunnen generelt folk vil bruke alle hovedsteder når de er #defining
er bare å gjøre det veldig klart at denne spesielle element av min kode
er en definert konstant.
Hvis det var små bokstaver, er det mulig at den kan forveksles med en variabel.
Og det er sannsynligvis ikke en god ting å gjøre.
>> Så dette Løsningen er mye bedre
enn noen av de foregående.
Hvis jeg først #define dekk størrelse 52, deretter nå min bruk av 52, eller dekk størrelse her,
er mye mer intuitivt og mye tryggere.
Du kan ikke manipulere en konstant.
Du kan ikke si 52 pluss pluss.
Det er ikke til å konvertere den til 53.
Du kan ikke endre 52 til noe.
>> Du kan endre en variabel hvis verdi er 52,
som var den første fix vi hadde før.
Og du kan øke denne variabelen til 53.
Men du kan ikke si 52 pluss pluss og har som plutselig slår 52 til 53.
52 er alltid 52.
Og så du kan ikke utilsiktet kan endre dekk størrelse her ved å manipulere den,
>> En annen god side Effekten av dette er skjønt
at du er klar over at ikke alle land rundt om i verden
bruke en kortstokk med størrelse 52?
For eksempel er det veldig vanlig i Tyskland å bruke en dekkstørrelse på 32,
hvor de stripe ut noen av lavere verdi kortene.
Og i dette tilfellet, I ønsket å port min suite
av funksjoner som omhandler kort manipulasjon til Tyskland.
Jeg kunne i første omgang vi viste, må gå og erstatte
alle forekomster av 52 i min kode med 32.
>> Men her, hvis jeg #define dekk størrelse som 32 på toppen av min kode,
hvis jeg trenger å endre det, kan jeg bare gå og endre det én ting.
Rekompilere koden min, og alle plutselig det forplanter seg gjennom.
Faktisk kan vi endre dekk størrelsen til en verdi vi ønsker.
>> Kan jeg interessere deg i en Spillet av dekk størrelse pickup?
>> Jeg er Doug Lloyd.
Og dette er CS50.