1 00:00:00,000 --> 00:00:02,350 >> [Muzika] 2 00:00:02,350 --> 00:00:05,444 3 00:00:05,444 --> 00:00:06,360 DOUG Lloyd: Në rregull. 4 00:00:06,360 --> 00:00:07,770 Lloj i një teme të çuditshme, e drejtë? 5 00:00:07,770 --> 00:00:09,050 Numrat magjike. 6 00:00:09,050 --> 00:00:12,012 Çfarë doe thoshte kur ai është duke folur për numrat magjike? 7 00:00:12,012 --> 00:00:14,220 E pra, disa nga programet që ne kemi shkruar në CS50 8 00:00:14,220 --> 00:00:16,660 deri më tani kanë pasur disa pazakontë Numrat lloj i hedhur në to. 9 00:00:16,660 --> 00:00:19,680 Ndoshta për arsye që ne nuk bëjmë tërësisht e kuptoj tani. 10 00:00:19,680 --> 00:00:23,950 Për shembull, në problemin Mario, ne mbuluar lartësinë e piramidës në 23. 11 00:00:23,950 --> 00:00:26,880 Ne në mënyrë eksplicite tha se ju nuk mund të shkojnë më të larta se 23. 12 00:00:26,880 --> 00:00:28,702 >> Por çfarë do të thotë 23? 13 00:00:28,702 --> 00:00:30,410 E pra, në qoftë se ju lexoni spekulim me kujdes, ju 14 00:00:30,410 --> 00:00:32,493 mund të keni parë se Arsyeja që ne mbuluar atë në 23 15 00:00:32,493 --> 00:00:36,160 është për shkak të lartësisë standarde nga një dritare terminali është 24. 16 00:00:36,160 --> 00:00:38,860 Dhe kështu që në qoftë se ne kemi piramidale të jetë shtatlartë se ajo, 17 00:00:38,860 --> 00:00:41,290 ajo mund të bëjë një gjë të tillë të pazakontë ku ajo shkon jashtë ekranit. 18 00:00:41,290 --> 00:00:45,140 Dhe ju e dini, se çfarë bën që do të thotë në kontekst, e drejtë? 19 00:00:45,140 --> 00:00:48,880 >> Është kuptimi i 23 menjëherë e dukshme për dikë që shikon programin tuaj 20 00:00:48,880 --> 00:00:51,550 dhe ndoshta ka një tjetër dritare terminali Madhësia? 21 00:00:51,550 --> 00:00:52,330 Ndoshta jo. 22 00:00:52,330 --> 00:00:53,080 Duket sikur, OK. 23 00:00:53,080 --> 00:00:55,005 E pra, pse është vetëm më pak se 23? 24 00:00:55,005 --> 00:00:56,880 Në përgjithësi, kjo është lloj e një zakon i keq në fakt 25 00:00:56,880 --> 00:00:58,940 të shkruani konstanta në kodin tuaj. 26 00:00:58,940 --> 00:01:02,190 Duke vepruar kështu, kur ju të vërtetë të bëni shkruaj një konstante në kodin tuaj, 27 00:01:02,190 --> 00:01:05,630 kjo është nganjëherë referuar si duke përdorur numrat magjike, e cila është diçka 28 00:01:05,630 --> 00:01:08,030 ne përgjithësi të dëshironi të provoni dhe për të shmangur. 29 00:01:08,030 --> 00:01:12,830 >> Për shembull, le të marrin një vështrim në këtë funksion të thjeshtë këtu. 30 00:01:12,830 --> 00:01:15,726 Natyrisht nuk ka të dhëna lloji në C e quajtur kartë ose kuvertë. 31 00:01:15,726 --> 00:01:16,600 Pra, vetëm të kesh durim me mua. 32 00:01:16,600 --> 00:01:18,910 Kjo është pak e pseudokod përziera në këtu. 33 00:01:18,910 --> 00:01:21,050 Ky është një funksion i quajtur merren kartë që me sa duket 34 00:01:21,050 --> 00:01:26,570 merr një kuvertë si parametër të saj, dhe Vullneti i prodhimit për mua një kartë të vetme. 35 00:01:26,570 --> 00:01:30,990 >> Dhe unë jam duke bërë diçka këtu, ku unë kanë një lak që shkon nga 0 deri ne 52, 36 00:01:30,990 --> 00:01:33,394 dhe unë të merren një kartë. 37 00:01:33,394 --> 00:01:35,310 E pra, ne kemi marrë një magji numër në këtu, e drejtë. 38 00:01:35,310 --> 00:01:38,790 A e shihni se çfarë numri magjik është? 39 00:01:38,790 --> 00:01:42,280 Ose më e rëndësishmja, a të shohim se çfarë problemi është këtu? 40 00:01:42,280 --> 00:01:44,310 Veçanërisht nëse kjo është vetëm një funksion 41 00:01:44,310 --> 00:01:48,030 në dosjen e vet në një dosje që përmban 42 00:01:48,030 --> 00:01:49,970 një bandë e ndryshme fotografi, secila prej të cilave 43 00:01:49,970 --> 00:01:51,670 bën një tjetër gjë në një kuvertë të kartave. 44 00:01:51,670 --> 00:01:57,310 Ndoshta kjo lëvizjet e tyre, ose të bëjë një dorë e pesë letra në vend të një kartë të vetme. 45 00:01:57,310 --> 00:01:59,420 >> A e shihni se çfarë Problemi mund të jetë këtu? 46 00:01:59,420 --> 00:02:03,220 A e shihni numrin magjik Unë e kam injektuar në kodin? 47 00:02:03,220 --> 00:02:04,390 Kjo është 52, e drejtë. 48 00:02:04,390 --> 00:02:06,440 >> Si, intuitive ju ndoshta e dini, OK. 49 00:02:06,440 --> 00:02:09,740 Si një kuvertë standarde të Kartat përmban 52 karta. 50 00:02:09,740 --> 00:02:12,570 Por në programin tonë, kjo është vetëm lloj lundrues rreth në atje. 51 00:02:12,570 --> 00:02:15,280 Është si të gjithë një e papritur ka një 52. 52 00:02:15,280 --> 00:02:18,290 >> Një mënyrë për të zgjidhur këtë Problemi është për të bërë këtë. 53 00:02:18,290 --> 00:02:22,724 Ne jemi shumë të qartë tani duke thirrur madhësinë kuvertë si 52. 54 00:02:22,724 --> 00:02:25,390 Ai jep atë një pak më shumë intuitiv që do të thotë kur në për lak 55 00:02:25,390 --> 00:02:28,650 më vonë themi, pra, unë është më pak se madhësia kuvertë. 56 00:02:28,650 --> 00:02:32,666 Ajo vetëm duket më mirë se duke thënë se 52. 57 00:02:32,666 --> 00:02:34,290 Tani ky fakt ka rregulluar problemin. 58 00:02:34,290 --> 00:02:38,460 Ajo i jep disa simbolik kuptim konstante. 59 00:02:38,460 --> 00:02:40,820 Por ajo ka lloj i vërtetë futur një problem tjetër 60 00:02:40,820 --> 00:02:43,770 që nuk mund të jetë menjëherë e dukshme. 61 00:02:43,770 --> 00:02:45,859 Edhe në qoftë se ky variabël është deklaruar globally-- 62 00:02:45,859 --> 00:02:47,650 A ju kujtohet se çfarë do të thotë që kur ne të deklarojë 63 00:02:47,650 --> 00:02:50,500 një variabël globalisht kundrejt nivel lokal? 64 00:02:50,500 --> 00:02:53,340 Edhe në qoftë se ne të deklarojë një ndryshore globalisht, çfarë nëse nuk ka 65 00:02:53,340 --> 00:02:55,500 një tjetër funksion në suite ynë i funksioneve 66 00:02:55,500 --> 00:02:59,750 që kanë të bëjnë me kartë manipulimin që pa dashje ndryshon madhësinë kuvertë, 67 00:02:59,750 --> 00:03:02,727 ose ajo rrit atë duke 1 ose ul atë me 1. 68 00:03:02,727 --> 00:03:04,060 Kjo mund të spell probleme, e drejtë? 69 00:03:04,060 --> 00:03:08,261 Sidomos në qoftë se kemi të bëjmë me një grup i kartave ku shuffling kuvertë plotë 70 00:03:08,261 --> 00:03:08,760 Kërkohet. 71 00:03:08,760 --> 00:03:12,804 Nëse madhësia kuvertë është zvogëluar me 1, për shembull, për 51, 72 00:03:12,804 --> 00:03:14,970 ne nuk jemi në fakt shuffling të gjitha kartat ndoshta. 73 00:03:14,970 --> 00:03:16,500 Ne jemi duke e lënë një prej tyre jashtë. 74 00:03:16,500 --> 00:03:21,680 Dhe kjo vlerë mund të jetë ndoshta parashikuar ose shfrytëzuar nga një aktor i keq. 75 00:03:21,680 --> 00:03:24,920 >> C siguron atë që quhet një direktivë preprocessor, e cila 76 00:03:24,920 --> 00:03:27,764 është quajtur gjithashtu një makro për krijuar konstante simbolike. 77 00:03:27,764 --> 00:03:30,180 Dhe në fakt, ju keni tashmë shihet një direktivë Preprocessor, 78 00:03:30,180 --> 00:03:32,916 edhe në qoftë se ju nuk e keni dëgjuar atë quhet se me #include. 79 00:03:32,916 --> 00:03:37,150 Kjo është një tjetër shembull i një makro ose direktivë preprocessor. 80 00:03:37,150 --> 00:03:41,290 >> Mënyra për të krijuar konstante simbolike, ose duke i dhënë një emër për një konstante 81 00:03:41,290 --> 00:03:43,740 në mënyrë që ajo ka më që do të thotë, është si vijon. 82 00:03:43,740 --> 00:03:47,030 #define, emri, zëvendësim. 83 00:03:47,030 --> 00:03:49,140 Të vërtetë e rëndësishme mënjanë këtu me të vërtetë të shpejtë. 84 00:03:49,140 --> 00:03:54,180 A nuk e vënë një pikëpresje në fundi i #defines tuaj. 85 00:03:54,180 --> 00:03:57,310 Pra, kjo është #define, emri, zëvendësim. 86 00:03:57,310 --> 00:03:59,540 >> Kur programi juaj është hartuar, çfarë ndodh në të vërtetë 87 00:03:59,540 --> 00:04:01,740 është përpilues nëse do për të shkuar nëpërmjet kodit tuaj 88 00:04:01,740 --> 00:04:06,770 dhe të zëvendësojë çdo shembull i fjala "emër" me çdo gjë që ju 89 00:04:06,770 --> 00:04:08,860 vënë si zëvendësim. 90 00:04:08,860 --> 00:04:13,060 Në mënyrë analoge, nëse #include është lloj e ngjashme me kopjimi dhe pasting, 91 00:04:13,060 --> 00:04:15,700 atëherë #define është lloj i i ngjashëm për të gjetur dhe të zëvendësojë, 92 00:04:15,700 --> 00:04:19,180 në qoftë se ju keni përdorur ndonjëherë këtë funksion në një program word processing, për shembull. 93 00:04:19,180 --> 00:04:26,345 >> Kështu për shembull, në qoftë se unë #define pi si 3.14159265, 94 00:04:26,345 --> 00:04:28,720 në qoftë se ju jeni më të mirë matematikisht të prirur dhe ju papritmas 95 00:04:28,720 --> 00:04:31,640 shih 3.14159265 flying rreth në kodin tuaj, 96 00:04:31,640 --> 00:04:33,517 ju ndoshta e dini se është duke folur në lidhje me pi. 97 00:04:33,517 --> 00:04:35,850 Por ndoshta ne mund të japim atë një pak kuptim më shumë simbolik. 98 00:04:35,850 --> 00:04:39,850 Dhe në vend të kësaj ne mund të themi #define pi si atë kafshatë e numrave 99 00:04:39,850 --> 00:04:42,110 se unë nuk jam duke shkuar për të mbajtur duke lexuar mbi dhe mbi. 100 00:04:42,110 --> 00:04:45,560 >> Dhe çfarë do të ndodhë më pas në përpilojnë koha është kur programi është 101 00:04:45,560 --> 00:04:48,530 hartuar, gjëja e parë që do të ndodhë është se do të kalojnë nëpër 102 00:04:48,530 --> 00:04:51,520 dhe ajo do të zëvendësojë çdo kohë ajo sheh P kapitalit, kapitali I, 103 00:04:51,520 --> 00:04:55,610 ajo fjalë për fjalë do të zëvendësojë atë me 3.14 dhe kështu me radhë, kështu që ju 104 00:04:55,610 --> 00:04:58,090 nuk duhet të shkruani atë çdo koha ndërkohë që programi juaj ende 105 00:04:58,090 --> 00:05:00,631 ka funksionalitetin që ju presin, për shkak se ju jeni duke punuar 106 00:05:00,631 --> 00:05:05,090 me manipulimin, shumëzuar, ndarjes, çfarëdo qoftë ajo është me pi. 107 00:05:05,090 --> 00:05:08,230 >> Ju nuk janë të kufizuara në këtë zëvendësim për vetëm numra. 108 00:05:08,230 --> 00:05:12,279 Për shembull, unë mund të #define Sigurisht si CS50 string. 109 00:05:12,279 --> 00:05:14,070 Në këtë rast, kur Programi është hartuar, 110 00:05:14,070 --> 00:05:16,236 #define do të shkojnë përmes Kodi, të zëvendësojë çdo kohë 111 00:05:16,236 --> 00:05:19,900 ajo sheh "kursin" me CS50 string. 112 00:05:19,900 --> 00:05:21,720 >> Ju do të vëreni këtu gjithashtu që unë shpesh 113 00:05:21,720 --> 00:05:26,090 #define gjithë përcaktuar time simbolike konstantet, kështu që të flasin, 114 00:05:26,090 --> 00:05:28,130 janë gjithmonë në të gjitha shkronja kapitale. 115 00:05:28,130 --> 00:05:28,960 Kjo është një konventë. 116 00:05:28,960 --> 00:05:30,170 Kjo nuk është e nevojshme. 117 00:05:30,170 --> 00:05:33,900 Arsyeja përgjithësisht njerëz do të përdorin Të gjitha kryeqytetet kur ata janë #defining 118 00:05:33,900 --> 00:05:37,590 është vetëm për të bërë me të vërtetë të qartë se ky element i veçantë i kodit tim 119 00:05:37,590 --> 00:05:38,820 është një konstante përcaktuar. 120 00:05:38,820 --> 00:05:43,730 Në qoftë se kjo ishte Fjala, është e mundur që ajo mund të ngatërrohet me një ndryshore. 121 00:05:43,730 --> 00:05:46,120 Dhe kjo është ndoshta nuk është një gjë e mirë për të bërë. 122 00:05:46,120 --> 00:05:48,910 >> Pra këtë të veçantë Zgjidhja është shumë më mirë 123 00:05:48,910 --> 00:05:50,550 se secila nga ato të mëparshme. 124 00:05:50,550 --> 00:05:59,950 Nëse unë #define parë kuvertë madhësia 52, atëherë tani Përdorimi im i 52, apo madhësia kuvertë këtu, 125 00:05:59,950 --> 00:06:01,850 është shumë më intuitive dhe shumë më të sigurt. 126 00:06:01,850 --> 00:06:03,280 Ju nuk mund të manipulojnë një konstante. 127 00:06:03,280 --> 00:06:05,259 Ju nuk mund të themi 52 plus plus. 128 00:06:05,259 --> 00:06:06,800 Kjo nuk do të kthyer atë në 53. 129 00:06:06,800 --> 00:06:09,390 Ju nuk mund të ndryshoni 52 për diçka. 130 00:06:09,390 --> 00:06:12,470 >> Ju mund të ndryshojë një variabël vlera e të cilit është 52, 131 00:06:12,470 --> 00:06:14,870 e cila ishte fix parë kemi pasur më parë. 132 00:06:14,870 --> 00:06:17,000 Dhe ju mund të rritet që ndryshueshme në 53. 133 00:06:17,000 --> 00:06:21,100 Por ju nuk mund të them se 52 plus plus dhe kanë që papritmas kthehet 52 në 53. 134 00:06:21,100 --> 00:06:23,350 52 është gjithmonë 52. 135 00:06:23,350 --> 00:06:28,860 Dhe kështu që ju nuk mund të ndryshojë pa dashje Madhësia kuvertë këtu duke manipuluar atë, 136 00:06:28,860 --> 00:06:29,940 137 00:06:29,940 --> 00:06:32,390 >> Një tjetër anë e mirë Efekti i kësaj edhe pse është 138 00:06:32,390 --> 00:06:38,310 se a jeni të vetëdijshëm se nuk të gjitha vendet në botë 139 00:06:38,310 --> 00:06:40,690 përdorni një kuvertë të kartave të madhësisë 52? 140 00:06:40,690 --> 00:06:45,630 Për shembull, është e vërtetë e zakonshme në Gjermania për të përdorur një madhësi kuvertë e 32, 141 00:06:45,630 --> 00:06:48,020 ku ata zhvesh nga disa e kartave me vlerë më të ulët. 142 00:06:48,020 --> 00:06:50,960 Dhe në këtë rast, unë donte të portit suite tim 143 00:06:50,960 --> 00:06:55,390 e funksioneve që kanë të bëjnë me kartë manipulim në Gjermani. 144 00:06:55,390 --> 00:06:59,440 Unë mund të në radhë të parë ne tregoi, duhet të shkoni dhe të zëvendësojë 145 00:06:59,440 --> 00:07:03,570 të gjitha instancat e 52 në kodin tim me 32. 146 00:07:03,570 --> 00:07:07,940 >> Por këtu, në qoftë se unë #define madhësia kuvertë si 32 në krye të kodit tim, 147 00:07:07,940 --> 00:07:11,730 nëse kam nevojë për të ndryshuar atë, unë mund të thjesht shkoni dhe për të ndryshuar atë një gjë. 148 00:07:11,730 --> 00:07:15,010 Përpiluar kodin tim, dhe të gjithë një e papritur ajo propagandon përmes. 149 00:07:15,010 --> 00:07:18,850 Në fakt, ne mund të ndryshojmë kuvertë Madhësia e çdo vlere ne duam. 150 00:07:18,850 --> 00:07:22,500 >> Unë mund të ju interesojnë në një lojë e rastit madhësisë kuvertë? 151 00:07:22,500 --> 00:07:23,430 >> Unë jam Doug Lloyd. 152 00:07:23,430 --> 00:07:25,840 Dhe kjo është CS50. 153 00:07:25,840 --> 00:07:27,772