[Muzikos grojimo] Doug LLOYD: Visos dešinę. Geras keistą temą, tiesa? Magic numeriai. Kas Doe jis reiškia, kai jis kalbame apie magija numerius? Na, kai kurių programų kad mes parašyta CS50 Iki šiol buvo kažkokiam keistam numeriai rūšies išmesti į juos. Galbūt dėl ​​priežasčių, mes ne visiškai suprasti dabar. Pavyzdžiui, Mario problemą, apribotos piramidės aukštis 23. Mes aiškiai pasakė, kad tu negali būti didesnis kaip 23. Bet ką reiškia 23? Na, jei jūs skaityti Atidžiai spec, jums galėjo pastebėti, kad priežastis, kodėl mes apribota jį 23 yra todėl, kad standartinio aukščio iš terminalo lange yra 24. Ir todėl, jei mes turime piramidės būti aukštesni nei, kad ji gali tai padaryti Keistas dalykas kur jis eina išjungti ekraną. Ir žinote, ką tai reiškia, kad atsižvelgiant į kontekstą, tiesa? Ar 23 karto akivaizdus prasmė į ką nors, kas žiūri savo programą o gal turi skirtingą dydis terminalo langą? Tikriausiai ne. Atrodo, Gerai. Na, kodėl ji šiek tiek mažiau nei 23 yra? Apskritai, tai tipo iš blogas įprotis iš tikrųjų rašyti konstantas į savo kodą. Vykdydamas šią funkciją, kai jūs iš tikrųjų parašyti konstantą į savo kodą, jis kartais vadinamas naudojant magija numeriai, kuri yra kažkas mes paprastai norite išbandyti ir išvengti. Pavyzdžiui, leiskite pažvelgti Šiuo paprasta funkcija čia. Akivaizdu nėra duomenų tipas C vadinamas kortelę arba denio. Taigi tiesiog būti su manimi. Tai šiek tiek Pseudocode sumaišyti čia. Tai yra funkcija vadinama spręsti kortelę, kuri, matyt, mano denio, kaip jo parametru, ir atras man vieną kortelę. Ir aš darau kažką čia, kur aš turi kilpą, kuri veikia nuo 0 iki 52, ir aš spręsti kortelę. Na, mes turime magija skaičius čia teisus. Ar matote, ką Magiškas skaičius yra? Arba dar svarbiau, ar ne pamatyti, kas yra problema čia? Ypač jei tai yra tik viena funkcija į savo failą į aplankas, kuriame yra įvairių krūva failai, iš kurių kiekvienas daro dar vienas dalykas, kortų kaladė. Gal tai sumaišo juos, ar kalbama apie ranką iš penkių kortelių vietoj vieno kortelę. Ar matote, ką Problema gali būti čia? Ar matote magišką skaičių Aš švirkščiamas į kodą? Tai 52, į dešinę. Kaip, intuityviai jūs turbūt žinote, Gerai. Kaip standartinis denio kortelės yra 52 kortų. Bet mūsų programoje, tai tik rūšies plūduriuojančius aplink ten. Tai kaip visi staiga ten 52. Vienas iš būdų išspręsti šią problemą Problema yra tai padaryti. Mes labai aiškiai dabar skambinama iš denio dydį kaip 52. Tai suteikia jai šiek tiek paprastesnis tai reiškia, kai už kilpos Vėliau mes tada sakyti, kad aš yra mažesnis nei denio dydžio. Taip tik atrodo geriau, nei sakydamas 52. Dabar tai nereiškia, faktiškai nustatyti problemą. Ji suteikia simbolinę prasmę pastovus. Bet ji iš tikrųjų rūšies pristatyti dar vieną problemą kad gali būti ne iš karto. Net jei šis kintamasis deklaruojama globally-- jūs prisiminti, ką jis reiškia, kai mes pareiškiame kintamasis pasaulyje palyginti vietoje? Net jei mes pareiškiame kintamąjį visame pasaulyje, kas būtų, jei ten kitą funkciją Mūsų rinkinys funkcijų kad sandoris su kortelės manipuliacijos kad netyčia keičia denio dydį, ar jis padidina jį 1 arba sumažina jį 1 d. Tai gali rašybos problemų, tiesa? Ypač, jei mes susiduriame su rinkiniu kortelių, kur maišymo visą denio nereikia. Jei denio dydis sumažėjo 1, pavyzdžiui, 51, mes ne iš tikrųjų maišymo visos kortos galbūt. Mes paliekant vieną jų. Ir ta vertė galbūt bus Prognozuojama, ar išnaudojami blogas aktorius. C suteikia tai, kas vadinama Preprocesorius direktyva, taip pat vadinamas makrolygio sukurti simbolines konstantas. Ir iš tiesų, jūs jau ve matyti preprocesoriaus direktyvą, net jei nesate girdėję ją vadinamas, kad su # include. Tai dar vienas pavyzdys, makro ar pirminio apdorojimo direktyva. Būdas sukurti simbolines konstantas, arba suteikiant pavadinimą pastovus taip, kad ji turi daugiau reiškia, yra taip. #define, vardas, keitimas. Tikrai svarbu panaikinti Čia tikrai greitai. Nedėkite kabliataškį ne tavo #defines pabaigos. Taigi, tai #define, vardas, keitimas. Kai jūsų programa yra parengta, kas iš tikrųjų vyksta yra, jei ketinate kompiliatorius eiti per savo kodą ir pakeisti kiekvieną atvejį žodis "pavadinimas" su Whatever You įdėti kaip pakaitalas. Analogiškai, jei include yra tarsi panašią į kopijuodami, tada #define yra tarsi panašus į rasti ir pakeisti, jei jūs kada nors naudoti šią funkciją A tekstų apdorojimo programa,, pavyzdžiui. Taigi, pavyzdžiui, jei aš #define PI 3.14159265, jei jūs geriau matematiškai linkę ir staiga matyti 3.14159265 plaukioja aplink savo kodą, Jūs tikriausiai žinote, kad kalba apie pi. Bet gal mes galime suteikti jai šiek tiek daugiau simbolinė prasmė. Ir mes galime pasakyti, o ne #define Pi kaip tą skaičių gurkšnis kad aš neketinu laikyti skaityti daugiau ir daugiau. Ir kas nutiks vėliau kaupia laikas yra tada, kai programa yra parengta, pirmas dalykas, kad nutiks tai bus eiti per ir jis pakeis kiekvieną kartą ji mato kapitalo P, kapitalo I, jis bus tiesiog pakeisti jį 3.14 ir tt, kad jūs neturite įveskite jį kiekvieną laikas, o jūsų programa vis dar turi funkciją, kuri jums tikėtis, nes jūs dirbate su manipuliavimo, dauginant, dalijant, kokia ji yra, PI. Čia yra ne tik tai Keitimas tik numeriais. Pavyzdžiui, galėčiau #define Žinoma, kaip styginių CS50. Šiuo atveju, kai Programa parengta, #define bus eiti per kodas, pakeisti kiekvieną kartą ji mato "kursą" su styginių CS50. Jūs pastebėsite čia taip pat, kad aš dažnai #define visi mano apibrėžta simbolinis konstantos, taip sakant, visada visais dangteliais. Tai konvencija. Tai nėra būtina. Priežastis dažniausiai žmonės naudoja Visos sostinės, kai jie #defining yra tik, kad tai tikrai aišku, kad Tai ypač elementas mano kodas yra apibrėžtų pastovus. Jei jis buvo mažosiomis raidėmis, tai įmanoma, kad jis gali būti painiojamas su kintamąjį. Ir tai tikriausiai nėra geras dalykas daryti. Taigi tai ypač sprendimas yra daug geriau nei viena iš ankstesnių. Jei aš pirmą #define denio dydis 52, tada dabar mano panaudojimas 52, arba denio dydį čia yra daug paprastesnis ir daug saugiau. Jūs negalite manipuliuoti konstanta. Jūs negalite pasakyti 52 plius pliusas. Tai ne ketinate jį konvertuoti į 53. Jūs negalite keisti 52 į kažką. Jūs galite pakeisti kintamąjį kurio vertė yra 52, kuris buvo pirmasis Fix mes turėjome anksčiau. Ir jūs galėtų padidinti kad kintamasis 53. Bet jūs negalite pasakyti 52 plius plius ir turite, kad staiga pasukti 52 į 53. 52 visada yra 52. Ir todėl jūs negalite netyčia pakeisti denis dydis čia manipuliuojant ją, Dar viena gera pusė poveikis šiuo, nors tai kad tu žinoti, kad ne Visos pasaulio šalys naudoti korteles dydžio 52 denio? Pavyzdžiui, tai tikrai dažnas Vokietija naudoti denio dydį 32, kur jie juostelės iš kai iš mažesnės vertės kortelės. Ir šiuo atveju, aš norėjau uosto My Suite funkcijų, kurios susijusios su skyriaus manipuliacijos į Vokietiją. Galėčiau pirmiausia mes parodė, turite eiti ir pakeisti Visi 52 atvejų, mano kodas 32. Bet čia, jei aš #define denio dydis kaip 32 pačiame viršuje mano kodas, jei man reikia jį pakeisti, galiu tiesiog eiti ir pakeisti tą vieną dalyką. Rekompilowanie savo kodą, ir visi staiga ji plinta. Iš tiesų, mes galima pakeisti denio dydis bet vertės norime. Ar galiu sudominti jus žaidimas denio dydžio pikapas? Aš Doug Lloyd. Ir tai yra CS50.