>> [Predvaja glasba]
Doug LLOYD: V redu.
Nekako čudno temo, kajne?
Magic številke.
Kaj doe je mislil, ko je to govorimo o magičnih številkah?
No, nekateri programi da smo napisan v CS50
doslej so imeli nekaj čudnega številke nekako vrže v njih.
Morda razlogov ne bomo popolnoma razumem zdaj.
Na primer, v problemu Mario smo omejeno višino piramide pri 23.
Izrecno vam rekel ne more iti višje od 23.
>> Ampak kaj 23 pomeni?
No, če ste prebrali skrbno spec, vas
Morda so videli, da je Zato smo jo omejili na 23
Kajti standardne višine okna terminala je 24.
In tako, če imamo piramida biti višji od tistega,
to lahko storite to čudno stvar kjer odteka zaslon.
In veste, kaj počne to pomeni, da v zvezi s tem, kajne?
>> Je smisel 23 takoj jasno, za nekoga, ki gleda na vaš program
in ima morda drugačen Velikost terminal okno?
Verjetno ne.
Zdi se kot, OK.
No, zakaj je bilo nekaj manj kot 23?
Na splošno velja, da je vrsta slabe navade dejansko
pisati konstante v kodi.
Pri tem, ko ste dejansko storiti napisati konstanto v kodi,
to je včasih označuje kot uporabo čarobne številke, kar je nekaj,
smo na splošno želijo poskusiti in se izogniti.
>> Na primer, recimo, si oglejte na tej preprosti funkciji tukaj.
Očitno ni podatkov tip v C imenovano kartico ali krova.
Torej le nosijo s seboj.
To je malo psevdokoda mešati tukaj.
To je funkcija imenuje Ukvarjamo kartico, ki očitno
strel krova njen parameter, in volja izhod zame ena kartica.
>> In delam nekaj, kar tukaj, kjer sem imajo zanko, ki teče od 0 do 52,
in sem se ukvarjajo kartico.
No, imamo čarovnijo število tukaj, kajne.
Ali vidite, kaj je magična številka je?
Ali pa je še bolj pomembno, kajne videli, kaj je problem tukaj?
Še posebej, če je to je le ena funkcija
v svojem datoteko v Mapa, ki vsebuje
kup drugačen datoteke, od katerih je vsak
pa še ena stvar, da kart.
Mogoče jih premeša, ali pa se ukvarja z roko iz petih kart namesto eno kartico.
>> Ali vidite, kaj se Problem bi lahko bil tukaj?
Ali vidite magično številko Sem vbrizga v kodo?
To je 52, kajne.
>> Kot, intuitivno verjetno veste, OK.
Kot standardnim kompletom kartice vsebuje 52 kartic.
Toda v našem programu, to je samo nekako plava okoli tam.
To je kot naenkrat tam je 52.
>> Eden od načinov za rešitev tega Problem je, da to storijo.
Mi smo zelo eksplicitno zdaj kliče velikost krova kot 52 let.
Daje pa malo bolj intuitivna kar pomeni, ko v zanko
Kasneje smo potem reči, da sem manjša od velikosti krova.
Samo zdi bolje, kot pravijo, 52.
Zdaj to ne dejansko odpraviti težavo.
To pa daje nekaj simbolična kar pomeni, da je konstanta.
Ampak kljub temu nekako dejansko uvede drug problem
da morda ne bo takoj vidna.
Tudi če je ta spremenljivka se razglasi globally--
se spomnite, kaj je pomeni, ko izjavljamo
spremenljivka globalno proti lokalno?
Tudi če izjavljamo spremenljivko globalno, kaj če je
drugo funkcijo v naš suite funkcij
ki se ukvarjajo s kartico manipulacijo da nehote spreminja velikost krova,
ali jo poveča za 1 ali pa se zmanjša za 1.
To bi lahko pomenilo težave, kajne?
Še posebej, če imamo opravka z nizom kartic kjer shuffling neprekinjeni krov
je potrebno.
Če je velikost krova zmanjšala z 1, na primer do 51,
smo dejansko ne shuffling vse karte morda.
Odšli bomo enega izmed njih ven.
In ta vrednost lahko morda napovedati ali izkoriščajo slab igralec.
>> C določa, kaj se ti Direktiva Predprocesor, ki
se imenuje tudi makro za ustvarjanje simbolne konstante.
In v resnici, ste že videl direktivo Predprocesor,
tudi če še niste slišali pozval, da se z #include.
To je še en primer makro ali direktiva Predprocesor.
>> Način za ustvarjanje simbolne konstante, ali daje ime konstanta
tako, da ima več kar pomeni, je, kot sledi.
#define, ime, zamenjava.
Res pomembno stran tukaj res hitro.
Ne dal podpičje na konec vaše #define.
Torej je #define, ime, zamenjava.
>> Ko je vaš program sestavljen, kaj se dejansko dogaja
je prevajalnik, če bo iti skozi kodo
in zamenjati vsak primerek Beseda "ime" s Karkoli
dal kot zamenjavo.
Analogno, če #include je nekako za podoben kopiranje in lepljenje,
potem #define je nekako Podobno najti in zamenjati,
če ste kdaj uporabili to funkcijo, je z Beseda program obdelave, npr.
>> Tako na primer, če sem #define pi kot 3.14159265,
če ste boljši matematično nagnjena in nenadoma
glej 3.14159265 letenja okrog v kodi,
verjetno veste, da je govoril o pi.
Toda morda jo je mogoče dati malo bolj simbolni pomen.
In bomo lahko namesto #define reči pi kot tisti zalogaja številk
da ne bom obdržati branju znova in znova.
>> In kaj se bo potem zgodilo na zbere čas, ko je program
zbrati, prva stvar, ki se bo zgodilo, je, da bo šel skozi
in bo zamenjati vsakič se vidi kapitalsko P, kapital I,
to bo dobesedno ga nadomestiti z 3.14 in tako naprej, tako da se
nimajo, da tip je vsak Čas, ko je vaš program, še
Ima funkcionalnosti, ki vas pričakujejo, ker delate
z manipulacijo, razmnoževanje, delitvijo, karkoli že je, ki jih pi.
>> Si niso omejeni na to nadomeščanje samo številke.
Na primer, lahko bi #define Seveda, kot je godalnega CS50.
V tem primeru, ko je Program je sestavljen,
#define bo šel skozi koda, zamenjajte vsakič
se vidi "tečaj" z godalnim CS50.
>> Opazili boste tukaj tudi to, da sem pogosto
#define vse moje opredeljena simbolična konstante, tako rekoč,
so vedno v vseh kape.
To je konvencija.
To ni potrebno.
Razlog splošno bo ljudi uporablja vse prestolnice, ko oni #defining
je le, da bi bilo res jasno, da To zlasti element moje kode
je definirana konstanta.
Če je bil male, je možno, da to bi lahko zamenjali s spremenljivko.
In to je verjetno ni dobra stvar.
>> Torej je to predvsem Rešitev je veliko bolje
kot eno od prejšnjih.
Če sem prvič #define velikost deck 52, potem Zdaj je moja uporaba 52 ali velikosti krova tukaj,
je veliko bolj intuitiven in veliko varnejši.
Ne, ne moreš manipulirati konstanto.
Ne morete reči, 52 plus plus.
To se ne dogaja, da ga pretvoriti v 53.
Ne morete spremeniti 52 do nečesa.
>> Lahko spremenite spremenljivko katerih vrednost je 52,
ki je bil prvi fix smo imeli prej.
In bi lahko povečali da spremenljivka do 53.
Ampak ne moreš reči 52 plus plus in imajo, da nenadoma spremeni 52 na 53.
52 je vedno 52.
In tako ne morete nehote spremeniti Velikost krova tukaj z njeno manipulacijo,
>> Še ena dobra stran Učinek tega je, čeprav
da se zavedate, da ne vse države po svetu
uporabite kart velikosti 52?
Na primer, to je res pogost v Nemčija uporabiti velikost krova 32,
kadar trak iz nekaterih spodnjih kartic vrednostjo.
In v tem primeru sem želel vrata moje suite
funkcij, ki se ukvarjajo z Kartica manipulacija v Nemčijo.
Jaz bi na prvi stopnji smo pokazala, moram iti in zamenjati
vse primerke 52 v moji kodi z 32.
>> Ampak tukaj, če sem #define velikost deck kot 32 na samem vrhu mojega kodo,
če moram spremeniti, ne morem samo pojdi in spremenite to eno stvar.
Prevedem kodo, in vsi Nenadoma se širi skozi.
V bistvu, lahko spremenimo krova velikost na katerokoli vrednost želimo.
>> Vam lahko interes za Igra velikosti deck pickup?
>> Sem Doug Lloyd.
In to je CS50.