1 00:00:00,000 --> 00:00:02,350 >> [Muusika mängib] 2 00:00:02,350 --> 00:00:05,444 3 00:00:05,444 --> 00:00:06,360 DOUG LLOYD: Okei. 4 00:00:06,360 --> 00:00:07,770 Kind of kummaline teema, eks? 5 00:00:07,770 --> 00:00:09,050 Magic numbrid. 6 00:00:09,050 --> 00:00:12,012 Mis doe ta mõtles, kui ta on räägime magic numbrid? 7 00:00:12,012 --> 00:00:14,220 Noh, mõned programmid et me oleme kirjutatud CS50 8 00:00:14,220 --> 00:00:16,660 Seni on olnud mõned imelik numbrid liiki visati neid. 9 00:00:16,660 --> 00:00:19,680 Võib-olla põhjus, miks me seda ei tee täielikult aru kohe. 10 00:00:19,680 --> 00:00:23,950 Näiteks Mario probleem, me piiristatud kõrgus püramiidi temperatuuril 23. 11 00:00:23,950 --> 00:00:26,880 Me selgesõnaliselt öelnud, et sa ei saa minna kõrgem kui 23. 12 00:00:26,880 --> 00:00:28,702 >> Aga mida see 23 tähendab? 13 00:00:28,702 --> 00:00:30,410 Noh, kui sa loed spec hoolikalt, siis 14 00:00:30,410 --> 00:00:32,493 võis näha, et Põhjus, miks me ülempiir on 23 15 00:00:32,493 --> 00:00:36,160 sellepärast, et standard kõrgus terminali aken on 24. 16 00:00:36,160 --> 00:00:38,860 Ja nii, kui meil on Püramiidi olla pikem kui, 17 00:00:38,860 --> 00:00:41,290 see võib teha see imelik asi kus ta jookseb ekraanilt. 18 00:00:41,290 --> 00:00:45,140 Ja sa tead, mida tähendab mis tähendab kontekstis, eks? 19 00:00:45,140 --> 00:00:48,880 >> Kas tähenduses 23 silmatorkavam et keegi, kes vaatab oma programmi 20 00:00:48,880 --> 00:00:51,550 ja võibolla on erinev suurus terminalis? 21 00:00:51,550 --> 00:00:52,330 Ilmselt mitte. 22 00:00:52,330 --> 00:00:53,080 Tundub, OK. 23 00:00:53,080 --> 00:00:55,005 Noh, miks see on pisut vähem kui 23? 24 00:00:55,005 --> 00:00:56,880 Üldiselt see on selline halb harjumus tegelikult 25 00:00:56,880 --> 00:00:58,940 kirjutada konstandid oma koodi. 26 00:00:58,940 --> 00:01:02,190 Seejuures, kui sa tegelikult teha kirjuta pidev oma kood, 27 00:01:02,190 --> 00:01:05,630 See on mõnikord viidatud kui lehe magic numbrid, mis on midagi 28 00:01:05,630 --> 00:01:08,030 me üldiselt tahan proovida ja vältida. 29 00:01:08,030 --> 00:01:12,830 >> Näiteks võtame pilk See lihtne ülesanne siin. 30 00:01:12,830 --> 00:01:15,726 Ilmselt pole andmeid kirjuta C nimetatakse kaardi või tekil. 31 00:01:15,726 --> 00:01:16,600 Nii lihtsalt kanda koos minuga. 32 00:01:16,600 --> 00:01:18,910 See on natuke pseudokoodi segada siin. 33 00:01:18,910 --> 00:01:21,050 See on funktsioon, mida nimetatakse tegeleda kaart, mis ilmselt 34 00:01:21,050 --> 00:01:26,570 võtab teki parameetrina, ja väljund mulle ühe kaardi. 35 00:01:26,570 --> 00:01:30,990 >> Ja ma teen midagi siin, kus ma on silmus, mis jookseb 0-52, 36 00:01:30,990 --> 00:01:33,394 ja ma tegelen kaardi. 37 00:01:33,394 --> 00:01:35,310 Noh, meil on maagia number siin, eks. 38 00:01:35,310 --> 00:01:38,790 Kas sa näed, mida maagiline number on? 39 00:01:38,790 --> 00:01:42,280 Või mis veelgi tähtsam, sa vaata, mis probleem on siin? 40 00:01:42,280 --> 00:01:44,310 Eriti siis, kui see on vaid üks funktsioon 41 00:01:44,310 --> 00:01:48,030 oma faili kaust, mis sisaldab 42 00:01:48,030 --> 00:01:49,970 hunnik erinevaid faile, millest igaüks 43 00:01:49,970 --> 00:01:51,670 teeb teine ​​asi kaardipakk. 44 00:01:51,670 --> 00:01:57,310 Võib-olla see segab neid, või tegeleb käsi viie kaardid asemel ühe kaardi. 45 00:01:57,310 --> 00:01:59,420 >> Kas sa näed, mida probleem võib siin olla? 46 00:01:59,420 --> 00:02:03,220 Kas sa näed maagiline number Olen süstitakse koodi? 47 00:02:03,220 --> 00:02:04,390 See on 52, eks. 48 00:02:04,390 --> 00:02:06,440 >> Like, intuitiivselt te ilmselt teate, OK. 49 00:02:06,440 --> 00:02:09,740 Nagu standard tekk kaardid sisaldab 52 kaarti. 50 00:02:09,740 --> 00:02:12,570 Aga meie programmi, see on lihtsalt Selline ujuvad ringi seal. 51 00:02:12,570 --> 00:02:15,280 See on nagu äkki seal on 52. 52 00:02:15,280 --> 00:02:18,290 >> Üks võimalus selle probleemi lahendamiseks Probleem on selles, et seda teha. 53 00:02:18,290 --> 00:02:22,724 Oleme väga selgelt nüüd hüüdes teki suurus kui 52. 54 00:02:22,724 --> 00:02:25,390 See annab talle veidi selgem mis tähendab, kui on silmus 55 00:02:25,390 --> 00:02:28,650 Hiljem me siis ütleme, i on väiksem kui valim suurusest. 56 00:02:28,650 --> 00:02:32,666 See lihtsalt tundub parem kui öelda 52. 57 00:02:32,666 --> 00:02:34,290 Nüüd see tegelikult probleemi lahendada. 58 00:02:34,290 --> 00:02:38,460 See ei anna mõned sümboolsed mõtestasid konstantne. 59 00:02:38,460 --> 00:02:40,820 Aga see mingi reaalselt tutvustada üks probleem 60 00:02:40,820 --> 00:02:43,770 mis ei pruugi olla kohe selge. 61 00:02:43,770 --> 00:02:45,859 Isegi kui see muutuja kuulutatakse globally-- 62 00:02:45,859 --> 00:02:47,650 sa meenutada, mida ta tähendab, kui me tunnistada 63 00:02:47,650 --> 00:02:50,500 muutuva maailma versus kohapeal? 64 00:02:50,500 --> 00:02:53,340 Isegi kui me kuulutame muutuja maailmas, mis siis, kui seal on 65 00:02:53,340 --> 00:02:55,500 teise funktsiooni Meie komplekt funktsioone 66 00:02:55,500 --> 00:02:59,750 et tegeleda kaardi manipulatsioon et kogemata muudab teki suurus, 67 00:02:59,750 --> 00:03:02,727 või suurendab seda 1 või vähendab seda 1. 68 00:03:02,727 --> 00:03:04,060 See võiks õigekirja probleeme, eks? 69 00:03:04,060 --> 00:03:08,261 Eriti kui me tegeleme komplekt kaardimäng, kus lohistades kogu teki 70 00:03:08,261 --> 00:03:08,760 on nõutud. 71 00:03:08,760 --> 00:03:12,804 Kui teki suurus on vähenenud 1, näiteks kuni 51, 72 00:03:12,804 --> 00:03:14,970 me tegelikult ei lohistades kõik kaardid võimalik. 73 00:03:14,970 --> 00:03:16,500 Me lahkume üks neist välja. 74 00:03:16,500 --> 00:03:21,680 Ja et väärtus võiks ehk olla ennustas või ära kasutada halb näitleja. 75 00:03:21,680 --> 00:03:24,920 >> C annab, mida nimetatakse eeltöötluse direktiiv, mis 76 00:03:24,920 --> 00:03:27,764 nimetatakse ka makro luua sümboolne konstandid. 77 00:03:27,764 --> 00:03:30,180 Ja tegelikult olete juba näinud eeltöötluse direktiivi 78 00:03:30,180 --> 00:03:32,916 isegi kui sa ei ole kuulnud seda nimetatakse, et koos #include. 79 00:03:32,916 --> 00:03:37,150 See on järjekordne näide makro või eeltöötluse direktiivi. 80 00:03:37,150 --> 00:03:41,290 >> See, kuidas luua sümboolne konstandid, või anda nime pidev 81 00:03:41,290 --> 00:03:43,740 nii, et see on rohkem mis tähendab, on järgmine. 82 00:03:43,740 --> 00:03:47,030 #define nimi, asendamist. 83 00:03:47,030 --> 00:03:49,140 Tõesti oluline kõrvale siin tõesti kiire. 84 00:03:49,140 --> 00:03:54,180 Ärge pange semikoolon juures Aasta lõpus oma #defines. 85 00:03:54,180 --> 00:03:57,310 Nii et see on #define nimi, asendamist. 86 00:03:57,310 --> 00:03:59,540 >> Kui teie programm on koostatud, Mis tegelikult juhtub 87 00:03:59,540 --> 00:04:01,740 on koostaja kui lähed minna läbi oma koodi 88 00:04:01,740 --> 00:04:06,770 ja asendada igakordne Sõna "nimi" iganes sa 89 00:04:06,770 --> 00:04:08,860 pane asendajana. 90 00:04:08,860 --> 00:04:13,060 Analoogiliselt, kui #include on omamoodi on sarnane kopeerimist ja kleepimist, 91 00:04:13,060 --> 00:04:15,700 siis #define on omamoodi sarnast leida ja asendada, 92 00:04:15,700 --> 00:04:19,180 Kui olete kunagi kasutanud seda funktsiooni tekstitöötluse programmi, näiteks. 93 00:04:19,180 --> 00:04:26,345 >> Nii näiteks, kui ma #define pi nagu 3.14159265, 94 00:04:26,345 --> 00:04:28,720 kui sa oled parem matemaatiliselt valmis ja äkki 95 00:04:28,720 --> 00:04:31,640 vaata 3.14159265 sõidavad ümber oma kood, 96 00:04:31,640 --> 00:04:33,517 te ilmselt teate seda räägib pi. 97 00:04:33,517 --> 00:04:35,850 Aga äkki saame anda talle veidi rohkem sümboolne tähendus. 98 00:04:35,850 --> 00:04:39,850 Ja me saame selle asemel öelda #define pi nagu suutäis numbrid 99 00:04:39,850 --> 00:04:42,110 et ma ei kavatse hoida lugedes ikka ja jälle. 100 00:04:42,110 --> 00:04:45,560 >> Ja mis juhtub siis kompileerimise ajal on siis, kui programm on 101 00:04:45,560 --> 00:04:48,530 koostatud on esimene asi, mis juhtub see läheb läbi 102 00:04:48,530 --> 00:04:51,520 ja see tuleb vahetada iga kord, see näeb kapitali P, kapitali I 103 00:04:51,520 --> 00:04:55,610 see saab sõna otseses mõttes asendada see 3.14 ja nii edasi, nii et teil 104 00:04:55,610 --> 00:04:58,090 ei pea seda iga sel ajal, kui teie programm veel 105 00:04:58,090 --> 00:05:00,631 on funktsionaalsus, mida oodata, sest te töötate 106 00:05:00,631 --> 00:05:05,090 manipuleerides, korrutades, jagamisel, mis see on, mida pi. 107 00:05:05,090 --> 00:05:08,230 >> Te ei ole sellega piiratud asendamine numbreid. 108 00:05:08,230 --> 00:05:12,279 Näiteks, ma ei #define Muidugi, kui string CS50. 109 00:05:12,279 --> 00:05:14,070 Sel juhul, kui Programm on koostatud, 110 00:05:14,070 --> 00:05:16,236 #define läheb läbi koodi, tuleb vahetada iga kord, 111 00:05:16,236 --> 00:05:19,900 see näeb "Loomulikult" string CS50. 112 00:05:19,900 --> 00:05:21,720 >> Märkad siin Samuti, et ma sageli 113 00:05:21,720 --> 00:05:26,090 #define kõik minu määratletud sümboolse konstandid, kui nii võib öelda, 114 00:05:26,090 --> 00:05:28,130 on alati kõik mütsid. 115 00:05:28,130 --> 00:05:28,960 See konventsioon. 116 00:05:28,960 --> 00:05:30,170 See ei ole vajalik. 117 00:05:30,170 --> 00:05:33,900 Põhjuseks enamasti inimesed kasutavad kõik pealinnades, kui nad #defining 118 00:05:33,900 --> 00:05:37,590 on vaid teha seda tõesti selge, et see konkreetne element minu koodi 119 00:05:37,590 --> 00:05:38,820 on kindlaksmääratud konstantne. 120 00:05:38,820 --> 00:05:43,730 Kui see oli väiketähed, siis on võimalik, et see võib segamini ajada muutuv. 121 00:05:43,730 --> 00:05:46,120 Ja see on ilmselt ei ole hea asi, mida teha. 122 00:05:46,120 --> 00:05:48,910 >> Nii et see eriti Lahenduseks on palju parem 123 00:05:48,910 --> 00:05:50,550 kui kumbki eelmised. 124 00:05:50,550 --> 00:05:59,950 Kui ma esimest #define teki suurus 52, siis nüüd on mu kasutamine 52 või teki suurus siin 125 00:05:59,950 --> 00:06:01,850 on palju intuitiivsem ja palju turvalisem. 126 00:06:01,850 --> 00:06:03,280 Sa ei saa manipuleerida pidev. 127 00:06:03,280 --> 00:06:05,259 Sa ei saa öelda 52 pluss pluss. 128 00:06:05,259 --> 00:06:06,800 See ei kavatse muuta see 53. 129 00:06:06,800 --> 00:06:09,390 Sa ei saa muuta 52 midagi. 130 00:06:09,390 --> 00:06:12,470 >> Sa saad muuta muutuja mille väärtus on 52, 131 00:06:12,470 --> 00:06:14,870 mis oli esimene fix meil oli enne. 132 00:06:14,870 --> 00:06:17,000 Ja sa võiksid suurendada et muutuja 53. 133 00:06:17,000 --> 00:06:21,100 Aga sa ei saa öelda 52 pluss pluss ja on, et äkki keerata 52 sisse 53. 134 00:06:21,100 --> 00:06:23,350 52 on alati 52. 135 00:06:23,350 --> 00:06:28,860 Ja nii sa ei saa tahtmatult muuta teki suurus siin manipuleerides see, 136 00:06:28,860 --> 00:06:29,940 137 00:06:29,940 --> 00:06:32,390 >> Teine hea külg mõju see küll on 138 00:06:32,390 --> 00:06:38,310 et kas te olete teadlik, et ei kõik maailma riigid 139 00:06:38,310 --> 00:06:40,690 kasuta kaardipakk suurus 52? 140 00:06:40,690 --> 00:06:45,630 Näiteks, see on tõesti levinud Saksamaa kasutada teki suurus 32, 141 00:06:45,630 --> 00:06:48,020 kus nad ribad mõned madalamat väärtust kaardid. 142 00:06:48,020 --> 00:06:50,960 Ja sel juhul, ma tahtsin port minu suite 143 00:06:50,960 --> 00:06:55,390 funktsioone, mis tegelevad kaardi manipulatsioon Saksamaale. 144 00:06:55,390 --> 00:06:59,440 Ma võiks kõigepealt me näitas, pead minema ja asenda 145 00:06:59,440 --> 00:07:03,570 kõik juhtumid 52 minu kood 32. 146 00:07:03,570 --> 00:07:07,940 >> Aga siin, kui ma #define teki suurus kui 32 ülaservas minu koodi 147 00:07:07,940 --> 00:07:11,730 kui mul on vaja seda muuta, ma ei lihtsalt minna ja muuta, et üks asi. 148 00:07:11,730 --> 00:07:15,010 Kompileeri minu koodi ja kõik äkki see levib. 149 00:07:15,010 --> 00:07:18,850 Tegelikult saame muuta teki suurus mingit väärtust tahame. 150 00:07:18,850 --> 00:07:22,500 >> Kas ma saan teile huvi on mängu teki suurus pikap? 151 00:07:22,500 --> 00:07:23,430 >> Ma olen Doug Lloyd. 152 00:07:23,430 --> 00:07:25,840 Ja see on CS50. 153 00:07:25,840 --> 00:07:27,772