1 00:00:00,000 --> 00:00:02,350 >> [Musiikkia] 2 00:00:02,350 --> 00:00:05,444 3 00:00:05,444 --> 00:00:06,360 DOUG Lloyd: Selvä. 4 00:00:06,360 --> 00:00:07,770 Kind of outo aihe, eikö? 5 00:00:07,770 --> 00:00:09,050 Taikanumeroita. 6 00:00:09,050 --> 00:00:12,012 Mitä doe hän tarkoittaa, kun hän on puhumme Magic Numbers? 7 00:00:12,012 --> 00:00:14,220 Hyvin, jotkut ohjelmat että olemme kirjoitettu CS50 8 00:00:14,220 --> 00:00:16,660 toistaiseksi on ollut outoja numerot eräänlainen heittää niitä. 9 00:00:16,660 --> 00:00:19,680 Ehkä syistä emme täysin ymmärtää juuri nyt. 10 00:00:19,680 --> 00:00:23,950 Esimerkiksi Mario ongelma, me rajattu korkeus pyramidin 23. 11 00:00:23,950 --> 00:00:26,880 Me nimenomaan sanoi, voi mennä yli 23. 12 00:00:26,880 --> 00:00:28,702 >> Mutta mitä 23 tarkoittaa? 13 00:00:28,702 --> 00:00:30,410 No, jos olet lukenut spec huolellisesti, voit 14 00:00:30,410 --> 00:00:32,493 ehkä nähnyt että Siksi meidän rajattu se 23 15 00:00:32,493 --> 00:00:36,160 johtuu standardi korkeus of pääteikkuna on 24. 16 00:00:36,160 --> 00:00:38,860 Joten jos meillä pyramidi olla pitempi kuin, 17 00:00:38,860 --> 00:00:41,290 se voisi tehdä tämän outo juttu jossa se kulkee pois ruudulta. 18 00:00:41,290 --> 00:00:45,140 Ja tiedätkö, mitä että tarkoittaa yhteydessä, eikö? 19 00:00:45,140 --> 00:00:48,880 >> On merkitys 23 ilmiselvää joku joka katselee ohjelma 20 00:00:48,880 --> 00:00:51,550 ja ehkä on erilainen koko pääteikkuna? 21 00:00:51,550 --> 00:00:52,330 Luultavasti ei. 22 00:00:52,330 --> 00:00:53,080 Tuntuu siltä, ​​OK. 23 00:00:53,080 --> 00:00:55,005 No, miksi se on vain alle 23? 24 00:00:55,005 --> 00:00:56,880 Yleensä se on eräänlainen huono tapa todella 25 00:00:56,880 --> 00:00:58,940 kirjoittaa vakiot koodi. 26 00:00:58,940 --> 00:01:02,190 Näin kun itse tehdä kirjoittaa vakio osaksi koodia, 27 00:01:02,190 --> 00:01:05,630 se joskus kutsutaan käyttäen Magic Numbers, joka on jotain 28 00:01:05,630 --> 00:01:08,030 me yleensä haluavat kokeilla ja välttää. 29 00:01:08,030 --> 00:01:12,830 >> Esimerkiksi, katsotaanpa katsomaan Tämän yksinkertainen funktio tässä. 30 00:01:12,830 --> 00:01:15,726 Ilmeisesti ei ole mitään tietoja tyyppi C kutsutaan kortti tai kannella. 31 00:01:15,726 --> 00:01:16,600 Joten vastaa minulle. 32 00:01:16,600 --> 00:01:18,910 Se on hieman pseudokoodilla sekoittaa täällä. 33 00:01:18,910 --> 00:01:21,050 Tämä on toiminto nimeltään käsitellä kortti että ilmeisesti 34 00:01:21,050 --> 00:01:26,570 ottaa kannen sen parametri, ja tahtoa lähtö minulle yhden kortin. 35 00:01:26,570 --> 00:01:30,990 >> Ja minä teen jotain täällä missä minä on silmukka, joka kulkee 0-52, 36 00:01:30,990 --> 00:01:33,394 ja minä käsitellä kortti. 37 00:01:33,394 --> 00:01:35,310 No, meillä maaginen numero tässä, juuri. 38 00:01:35,310 --> 00:01:38,790 Ymmärrätkö, mitä maaginen numero on? 39 00:01:38,790 --> 00:01:42,280 Tai vielä tärkeämpää, oletteko mitä ongelma on täällä? 40 00:01:42,280 --> 00:01:44,310 Varsinkin jos tämä on vain yksi toiminto 41 00:01:44,310 --> 00:01:48,030 omassa tiedostoon kansio, joka sisältää 42 00:01:48,030 --> 00:01:49,970 joukko erilaisia tiedostoja, joista kukin 43 00:01:49,970 --> 00:01:51,670 ei toinen asia korttipakan. 44 00:01:51,670 --> 00:01:57,310 Ehkä se sekoittaa ne, tai käsittelee käsi viisi korttia sijasta yhden kortin. 45 00:01:57,310 --> 00:01:59,420 >> Ymmärrätkö, mitä Ongelma voi olla täällä? 46 00:01:59,420 --> 00:02:03,220 Näetkö maaginen numero Olen ruiskutetaan koodi? 47 00:02:03,220 --> 00:02:04,390 Se on 52, oikea. 48 00:02:04,390 --> 00:02:06,440 >> Kuten, intuitiivisesti tiedät varmasti, OK. 49 00:02:06,440 --> 00:02:09,740 Kuten standardi kannella kortteja sisältää 52 korttia. 50 00:02:09,740 --> 00:02:12,570 Mutta meidän ohjelma, se on vain eräänlainen kelluva noin siellä. 51 00:02:12,570 --> 00:02:15,280 Se on kuin yhtäkkiä siellä 52. 52 00:02:15,280 --> 00:02:18,290 >> Yksi tapa ratkaista tämä ongelma on tehdä tämä. 53 00:02:18,290 --> 00:02:22,724 Olemme erittäin selvästi nyt huuteli kannen kokoinen kuin 52. 54 00:02:22,724 --> 00:02:25,390 Se antaa sille vähän enemmän intuitiivinen eli kun silmukan 55 00:02:25,390 --> 00:02:28,650 myöhemmin me sitten sanoa, i on pienempi kuin kannen koko. 56 00:02:28,650 --> 00:02:32,666 Se vain tuntuu paremmalta kuin sanomalla 52. 57 00:02:32,666 --> 00:02:34,290 Nyt tämä ei itse korjata ongelman. 58 00:02:34,290 --> 00:02:38,460 Se antaa joitakin symbolinen merkityksen vakiona. 59 00:02:38,460 --> 00:02:40,820 Mutta se eräänlainen todella käyttöön toinen ongelma 60 00:02:40,820 --> 00:02:43,770 jotka eivät ehkä ole heti ilmeinen. 61 00:02:43,770 --> 00:02:45,859 Vaikka tämä muuttuja on ilmoitettu globally-- 62 00:02:45,859 --> 00:02:47,650 Muistatko mitä se tarkoittaa, kun me julistamme 63 00:02:47,650 --> 00:02:50,500 muuttuja maailmanlaajuisesti verrattuna paikallisesti? 64 00:02:50,500 --> 00:02:53,340 Vaikka me julistamme muuttuja maailmanlaajuisesti, mitä jos siellä 65 00:02:53,340 --> 00:02:55,500 toinen toiminto meidän sviitti toimintoja 66 00:02:55,500 --> 00:02:59,750 jotka käsittelevät kortin manipuloinnista että vahingossa muuttaa kannen koko, 67 00:02:59,750 --> 00:03:02,727 tai se lisää sitä 1 tai vähentää sitä 1. 68 00:03:02,727 --> 00:03:04,060 Tämä voisi oikeinkirjoituksen ongelmia, eikö? 69 00:03:04,060 --> 00:03:08,261 Varsinkin jos olemme tekemisissä asettaa kortteja jossa laahustavat täyskannellisia 70 00:03:08,261 --> 00:03:08,760 vaaditaan. 71 00:03:08,760 --> 00:03:12,804 Jos kansi koko on pienentynyt 1, esimerkiksi, 51, 72 00:03:12,804 --> 00:03:14,970 emme oikeastaan ​​laahustavat kaikki kortit mahdollisesti. 73 00:03:14,970 --> 00:03:16,500 Lähdemme yksi heistä pois. 74 00:03:16,500 --> 00:03:21,680 Ja tämä arvo voisi ehkä olla ennusti tai hyödyntää huono näyttelijä. 75 00:03:21,680 --> 00:03:24,920 >> C tarjoaa mitä kutsutaan esikäsittelijään direktiivi, joka 76 00:03:24,920 --> 00:03:27,764 kutsutaan myös makro luo symbolinen vakioita. 77 00:03:27,764 --> 00:03:30,180 Ja itse asiassa, olet jo nähnyt esikäsittelijään direktiivi, 78 00:03:30,180 --> 00:03:32,916 vaikka et ole kuullut sitä nimeltään että # include. 79 00:03:32,916 --> 00:03:37,150 Se on toinen esimerkki makro tai esikäsittelijä direktiivi. 80 00:03:37,150 --> 00:03:41,290 >> Tapa luoda symbolinen vakioita, tai antaa nimen vakio 81 00:03:41,290 --> 00:03:43,740 niin että se on enemmän tarkoittaa, on seuraava. 82 00:03:43,740 --> 00:03:47,030 #define, nimi, vaihto. 83 00:03:47,030 --> 00:03:49,140 Todella tärkeä syrjään tässä todella nopeasti. 84 00:03:49,140 --> 00:03:54,180 Älä laita puolipiste lopussa oman #defines. 85 00:03:54,180 --> 00:03:57,310 Joten se on #define, nimi, vaihto. 86 00:03:57,310 --> 00:03:59,540 >> Kun ohjelma on koottu, mitä todella tapahtuu 87 00:03:59,540 --> 00:04:01,740 on kääntäjä jos menee käydä läpi koodi 88 00:04:01,740 --> 00:04:06,770 ja korvata jokainen esiintymä sana "nimi" ja mitä 89 00:04:06,770 --> 00:04:08,860 laittaa korvaaviksi. 90 00:04:08,860 --> 00:04:13,060 Vastaavasti, jos #include on eräänlainen on samanlainen kopioimalla, 91 00:04:13,060 --> 00:04:15,700 sitten #define on eräänlainen samanlainen löytää ja korvata, 92 00:04:15,700 --> 00:04:19,180 jos olet koskaan käytetty että ominaisuus tekstinkäsittely ohjelma, esimerkiksi. 93 00:04:19,180 --> 00:04:26,345 >> Niinpä esimerkiksi, jos en #define pi kuin 3.14159265, 94 00:04:26,345 --> 00:04:28,720 jos olet parempi matemaattisesti kalteva ja yhtäkkiä 95 00:04:28,720 --> 00:04:31,640 katso 3.14159265 Flying noin koodissa, 96 00:04:31,640 --> 00:04:33,517 luultavasti tiedät sen puhuu pi. 97 00:04:33,517 --> 00:04:35,850 Mutta ehkä voimme antaa sille hieman symbolinen merkitys. 98 00:04:35,850 --> 00:04:39,850 Ja voimme sen sijaan sanoa #define pi kuin suupala numerot 99 00:04:39,850 --> 00:04:42,110 että en aio pitää lukeminen yli ja ohi. 100 00:04:42,110 --> 00:04:45,560 >> Ja mitä tulee tapahtumaan sitten koota aika on, kun ohjelma on 101 00:04:45,560 --> 00:04:48,530 koottu, ensimmäinen asia, että tapahtuu on se menee läpi 102 00:04:48,530 --> 00:04:51,520 ja se korvaa joka kerta se näkee pääoma P, pääoma I, 103 00:04:51,520 --> 00:04:55,610 se tulee kirjaimellisesti korvata sen 3.14 ja niin edelleen, niin että te 104 00:04:55,610 --> 00:04:58,090 ei tarvitse kirjoittaa sitä joka aikaa, kun ohjelma vielä 105 00:04:58,090 --> 00:05:00,631 on toimintoja, jotka olet odottaa, koska olet työskennellyt 106 00:05:00,631 --> 00:05:05,090 manipuloimalla, kertomalla, jakamalla, mikä se on PI. 107 00:05:05,090 --> 00:05:08,230 >> Et ei rajoitu tähän korvaaminen vain numerot. 108 00:05:08,230 --> 00:05:12,279 Esimerkiksi, voisin #define kurssin merkkijono CS50. 109 00:05:12,279 --> 00:05:14,070 Tässä tapauksessa, kun ohjelma on laadittu, 110 00:05:14,070 --> 00:05:16,236 #define menee läpi koodi, vaihda joka kerta 111 00:05:16,236 --> 00:05:19,900 se näkee "kurssi" kanssa merkkijono CS50. 112 00:05:19,900 --> 00:05:21,720 >> Huomaat täällä myös, että olen usein 113 00:05:21,720 --> 00:05:26,090 #define kaikki minun määritelty symbolista vakiot, niin sanoakseni, 114 00:05:26,090 --> 00:05:28,130 ovat aina kaikissa korkit. 115 00:05:28,130 --> 00:05:28,960 Se on sopimusta. 116 00:05:28,960 --> 00:05:30,170 Se ei tarvita. 117 00:05:30,170 --> 00:05:33,900 Syynä yleensä ihmiset käyttävät kaikki pääkaupungit kun he #defining 118 00:05:33,900 --> 00:05:37,590 on vain tehdä todella selväksi, että tämä osa minun koodi 119 00:05:37,590 --> 00:05:38,820 on määritelty vakio. 120 00:05:38,820 --> 00:05:43,730 Jos se oli pieniä, on mahdollista, että se voitaisiin sekoittaa muuttuja. 121 00:05:43,730 --> 00:05:46,120 Ja se on luultavasti ei hyvä asia tehdä. 122 00:05:46,120 --> 00:05:48,910 >> Joten tässä ratkaisu on paljon parempi 123 00:05:48,910 --> 00:05:50,550 kuin kumpikaan aiemmat. 124 00:05:50,550 --> 00:05:59,950 Jos haluan ensin #define kannella koko 52, sitten nyt minun käyttö 52, tai kannella koko täällä, 125 00:05:59,950 --> 00:06:01,850 on paljon enemmän intuitiivinen ja paljon turvallisempaa. 126 00:06:01,850 --> 00:06:03,280 Et voi käsitellä jatkuvasti. 127 00:06:03,280 --> 00:06:05,259 Et voi sanoa 52 plus plus. 128 00:06:05,259 --> 00:06:06,800 Se ei aio muuttaa sitä 53. 129 00:06:06,800 --> 00:06:09,390 Et voi muuttaa 52 jotain. 130 00:06:09,390 --> 00:06:12,470 >> Voit vaihtaa muuttujaa joiden arvo on 52, 131 00:06:12,470 --> 00:06:14,870 joka oli ensimmäinen korjata meillä oli ennen. 132 00:06:14,870 --> 00:06:17,000 Ja voit lisätä että muuttuja 53. 133 00:06:17,000 --> 00:06:21,100 Mutta et voi sanoa 52 plus plus ja on, että yhtäkkiä kääntää 52 kielelle 53. 134 00:06:21,100 --> 00:06:23,350 52 on aina 52. 135 00:06:23,350 --> 00:06:28,860 Ja joten et voi vahingossa muuttaa kannella koko tässä manipuloimalla sitä, 136 00:06:28,860 --> 00:06:29,940 137 00:06:29,940 --> 00:06:32,390 >> Toinen hyvä puoli vaikutus tämän kuitenkin on 138 00:06:32,390 --> 00:06:38,310 että olet tietoinen siitä, että ei kaikissa maissa ympäri maailmaa 139 00:06:38,310 --> 00:06:40,690 käyttää korttipakan koon 52? 140 00:06:40,690 --> 00:06:45,630 Esimerkiksi, se on todella yleistä Saksa käyttää kannen koko 32, 141 00:06:45,630 --> 00:06:48,020 jos ne nauhat pois joitakin alemman arvon kortit. 142 00:06:48,020 --> 00:06:50,960 Ja tässä tapauksessa olen halusi satamaan minun sviitti 143 00:06:50,960 --> 00:06:55,390 toimintoja, jotka käsittelevät kortti manipulointia Saksaan. 144 00:06:55,390 --> 00:06:59,440 Voisin ensisijaisesti me osoitti, täytyy mennä ja tilalle 145 00:06:59,440 --> 00:07:03,570 kaikki esiintymät 52 minun koodia 32. 146 00:07:03,570 --> 00:07:07,940 >> Mutta täällä, jos en #define kannella koko kuten 32 hyvin alkuun minun koodi, 147 00:07:07,940 --> 00:07:11,730 jos minun täytyy muuttaa sitä, voin vain mennä ja vaihtaa että yksi asia. 148 00:07:11,730 --> 00:07:15,010 Kääntää minun koodi, ja kaikki yhtäkkiä se etenee läpi. 149 00:07:15,010 --> 00:07:18,850 Itse asiassa, voimme muuttaa kannen koko mihin tahansa arvoon haluamme. 150 00:07:18,850 --> 00:07:22,500 >> Voinko kiinnostaa sinua peli kannella koko pickup? 151 00:07:22,500 --> 00:07:23,430 >> Olen Doug Lloyd. 152 00:07:23,430 --> 00:07:25,840 Ja tämä on CS50. 153 00:07:25,840 --> 00:07:27,772