[Musiikkia] DOUG Lloyd: Selvä. Kind of outo aihe, eikö? Taikanumeroita. Mitä doe hän tarkoittaa, kun hän on puhumme Magic Numbers? Hyvin, jotkut ohjelmat että olemme kirjoitettu CS50 toistaiseksi on ollut outoja numerot eräänlainen heittää niitä. Ehkä syistä emme täysin ymmärtää juuri nyt. Esimerkiksi Mario ongelma, me rajattu korkeus pyramidin 23. Me nimenomaan sanoi, voi mennä yli 23. Mutta mitä 23 tarkoittaa? No, jos olet lukenut spec huolellisesti, voit ehkä nähnyt että Siksi meidän rajattu se 23 johtuu standardi korkeus of pääteikkuna on 24. Joten jos meillä pyramidi olla pitempi kuin, se voisi tehdä tämän outo juttu jossa se kulkee pois ruudulta. Ja tiedätkö, mitä että tarkoittaa yhteydessä, eikö? On merkitys 23 ilmiselvää joku joka katselee ohjelma ja ehkä on erilainen koko pääteikkuna? Luultavasti ei. Tuntuu siltä, ​​OK. No, miksi se on vain alle 23? Yleensä se on eräänlainen huono tapa todella kirjoittaa vakiot koodi. Näin kun itse tehdä kirjoittaa vakio osaksi koodia, se joskus kutsutaan käyttäen Magic Numbers, joka on jotain me yleensä haluavat kokeilla ja välttää. Esimerkiksi, katsotaanpa katsomaan Tämän yksinkertainen funktio tässä. Ilmeisesti ei ole mitään tietoja tyyppi C kutsutaan kortti tai kannella. Joten vastaa minulle. Se on hieman pseudokoodilla sekoittaa täällä. Tämä on toiminto nimeltään käsitellä kortti että ilmeisesti ottaa kannen sen parametri, ja tahtoa lähtö minulle yhden kortin. Ja minä teen jotain täällä missä minä on silmukka, joka kulkee 0-52, ja minä käsitellä kortti. No, meillä maaginen numero tässä, juuri. Ymmärrätkö, mitä maaginen numero on? Tai vielä tärkeämpää, oletteko mitä ongelma on täällä? Varsinkin jos tämä on vain yksi toiminto omassa tiedostoon kansio, joka sisältää joukko erilaisia tiedostoja, joista kukin ei toinen asia korttipakan. Ehkä se sekoittaa ne, tai käsittelee käsi viisi korttia sijasta yhden kortin. Ymmärrätkö, mitä Ongelma voi olla täällä? Näetkö maaginen numero Olen ruiskutetaan koodi? Se on 52, oikea. Kuten, intuitiivisesti tiedät varmasti, OK. Kuten standardi kannella kortteja sisältää 52 korttia. Mutta meidän ohjelma, se on vain eräänlainen kelluva noin siellä. Se on kuin yhtäkkiä siellä 52. Yksi tapa ratkaista tämä ongelma on tehdä tämä. Olemme erittäin selvästi nyt huuteli kannen kokoinen kuin 52. Se antaa sille vähän enemmän intuitiivinen eli kun silmukan myöhemmin me sitten sanoa, i on pienempi kuin kannen koko. Se vain tuntuu paremmalta kuin sanomalla 52. Nyt tämä ei itse korjata ongelman. Se antaa joitakin symbolinen merkityksen vakiona. Mutta se eräänlainen todella käyttöön toinen ongelma jotka eivät ehkä ole heti ilmeinen. Vaikka tämä muuttuja on ilmoitettu globally-- Muistatko mitä se tarkoittaa, kun me julistamme muuttuja maailmanlaajuisesti verrattuna paikallisesti? Vaikka me julistamme muuttuja maailmanlaajuisesti, mitä jos siellä toinen toiminto meidän sviitti toimintoja jotka käsittelevät kortin manipuloinnista että vahingossa muuttaa kannen koko, tai se lisää sitä 1 tai vähentää sitä 1. Tämä voisi oikeinkirjoituksen ongelmia, eikö? Varsinkin jos olemme tekemisissä asettaa kortteja jossa laahustavat täyskannellisia vaaditaan. Jos kansi koko on pienentynyt 1, esimerkiksi, 51, emme oikeastaan ​​laahustavat kaikki kortit mahdollisesti. Lähdemme yksi heistä pois. Ja tämä arvo voisi ehkä olla ennusti tai hyödyntää huono näyttelijä. C tarjoaa mitä kutsutaan esikäsittelijään direktiivi, joka kutsutaan myös makro luo symbolinen vakioita. Ja itse asiassa, olet jo nähnyt esikäsittelijään direktiivi, vaikka et ole kuullut sitä nimeltään että # include. Se on toinen esimerkki makro tai esikäsittelijä direktiivi. Tapa luoda symbolinen vakioita, tai antaa nimen vakio niin että se on enemmän tarkoittaa, on seuraava. #define, nimi, vaihto. Todella tärkeä syrjään tässä todella nopeasti. Älä laita puolipiste lopussa oman #defines. Joten se on #define, nimi, vaihto. Kun ohjelma on koottu, mitä todella tapahtuu on kääntäjä jos menee käydä läpi koodi ja korvata jokainen esiintymä sana "nimi" ja mitä laittaa korvaaviksi. Vastaavasti, jos #include on eräänlainen on samanlainen kopioimalla, sitten #define on eräänlainen samanlainen löytää ja korvata, jos olet koskaan käytetty että ominaisuus tekstinkäsittely ohjelma, esimerkiksi. Niinpä esimerkiksi, jos en #define pi kuin 3.14159265, jos olet parempi matemaattisesti kalteva ja yhtäkkiä katso 3.14159265 Flying noin koodissa, luultavasti tiedät sen puhuu pi. Mutta ehkä voimme antaa sille hieman symbolinen merkitys. Ja voimme sen sijaan sanoa #define pi kuin suupala numerot että en aio pitää lukeminen yli ja ohi. Ja mitä tulee tapahtumaan sitten koota aika on, kun ohjelma on koottu, ensimmäinen asia, että tapahtuu on se menee läpi ja se korvaa joka kerta se näkee pääoma P, pääoma I, se tulee kirjaimellisesti korvata sen 3.14 ja niin edelleen, niin että te ei tarvitse kirjoittaa sitä joka aikaa, kun ohjelma vielä on toimintoja, jotka olet odottaa, koska olet työskennellyt manipuloimalla, kertomalla, jakamalla, mikä se on PI. Et ei rajoitu tähän korvaaminen vain numerot. Esimerkiksi, voisin #define kurssin merkkijono CS50. Tässä tapauksessa, kun ohjelma on laadittu, #define menee läpi koodi, vaihda joka kerta se näkee "kurssi" kanssa merkkijono CS50. Huomaat täällä myös, että olen usein #define kaikki minun määritelty symbolista vakiot, niin sanoakseni, ovat aina kaikissa korkit. Se on sopimusta. Se ei tarvita. Syynä yleensä ihmiset käyttävät kaikki pääkaupungit kun he #defining on vain tehdä todella selväksi, että tämä osa minun koodi on määritelty vakio. Jos se oli pieniä, on mahdollista, että se voitaisiin sekoittaa muuttuja. Ja se on luultavasti ei hyvä asia tehdä. Joten tässä ratkaisu on paljon parempi kuin kumpikaan aiemmat. Jos haluan ensin #define kannella koko 52, sitten nyt minun käyttö 52, tai kannella koko täällä, on paljon enemmän intuitiivinen ja paljon turvallisempaa. Et voi käsitellä jatkuvasti. Et voi sanoa 52 plus plus. Se ei aio muuttaa sitä 53. Et voi muuttaa 52 jotain. Voit vaihtaa muuttujaa joiden arvo on 52, joka oli ensimmäinen korjata meillä oli ennen. Ja voit lisätä että muuttuja 53. Mutta et voi sanoa 52 plus plus ja on, että yhtäkkiä kääntää 52 kielelle 53. 52 on aina 52. Ja joten et voi vahingossa muuttaa kannella koko tässä manipuloimalla sitä, Toinen hyvä puoli vaikutus tämän kuitenkin on että olet tietoinen siitä, että ei kaikissa maissa ympäri maailmaa käyttää korttipakan koon 52? Esimerkiksi, se on todella yleistä Saksa käyttää kannen koko 32, jos ne nauhat pois joitakin alemman arvon kortit. Ja tässä tapauksessa olen halusi satamaan minun sviitti toimintoja, jotka käsittelevät kortti manipulointia Saksaan. Voisin ensisijaisesti me osoitti, täytyy mennä ja tilalle kaikki esiintymät 52 minun koodia 32. Mutta täällä, jos en #define kannella koko kuten 32 hyvin alkuun minun koodi, jos minun täytyy muuttaa sitä, voin vain mennä ja vaihtaa että yksi asia. Kääntää minun koodi, ja kaikki yhtäkkiä se etenee läpi. Itse asiassa, voimme muuttaa kannen koko mihin tahansa arvoon haluamme. Voinko kiinnostaa sinua peli kannella koko pickup? Olen Doug Lloyd. Ja tämä on CS50.