1 00:00:00,000 --> 00:00:02,350 >> [CHWARAE CERDDORIAETH] 2 00:00:02,350 --> 00:00:05,444 3 00:00:05,444 --> 00:00:06,360 DOUG LLOYD: Pob hawl. 4 00:00:06,360 --> 00:00:07,770 Fath o bwnc rhyfedd, dde? 5 00:00:07,770 --> 00:00:09,050 Rhifau Hud. 6 00:00:09,050 --> 00:00:12,012 Beth ewig mae'n ei olygu pan ei fod siarad am rifau hud? 7 00:00:12,012 --> 00:00:14,220 Wel, mae rhai o'r rhaglenni ein bod wedi ysgrifennu yn CS50 8 00:00:14,220 --> 00:00:16,660 hyd yn hyn wedi cael rhywfaint o 'n annaearol rhifau fath o daflu ynddynt. 9 00:00:16,660 --> 00:00:19,680 Efallai am resymau nad ydym yn ei wneud yn deall yn gyfan gwbl ar hyn o bryd. 10 00:00:19,680 --> 00:00:23,950 Er enghraifft, yn y broblem Mario, rydym yn gapio uchder y pyramid yn 23. 11 00:00:23,950 --> 00:00:26,880 Rydym yn dweud yn benodol i chi Ni all fynd yn uwch na 23. 12 00:00:26,880 --> 00:00:28,702 >> Ond beth mae 23 yn ei olygu? 13 00:00:28,702 --> 00:00:30,410 Wel, os ydych yn darllen y fanyleb yn ofalus, byddwch yn 14 00:00:30,410 --> 00:00:32,493 allai fod wedi gweld bod y rheswm yr ydym yn ei gapio ar 23 15 00:00:32,493 --> 00:00:36,160 oherwydd bod y uchder safonol o derfynnell ffenest yw 24. 16 00:00:36,160 --> 00:00:38,860 Ac felly os oes gennym y pyramid fod yn dalach na hynny, 17 00:00:38,860 --> 00:00:41,290 gallai fod yn gwneud hyn beth rhyfedd lle y mae'n rhedeg oddi ar y sgrin. 18 00:00:41,290 --> 00:00:45,140 A ydych yn gwybod, beth mae hynny olygu yn y cyd-destun, dde? 19 00:00:45,140 --> 00:00:48,880 >> A yw'r ystyr o 23 amlwg ar unwaith i rywun sy'n edrych ar eich rhaglen 20 00:00:48,880 --> 00:00:51,550 ac efallai mae gan wahanol ffenestr terfynell maint? 21 00:00:51,550 --> 00:00:52,330 Mae'n debyg nad. 22 00:00:52,330 --> 00:00:53,080 Mae'n ymddangos fel, OK. 23 00:00:53,080 --> 00:00:55,005 Wel, pam ei fod ychydig yn llai na 23? 24 00:00:55,005 --> 00:00:56,880 Yn gyffredinol, mae'n fath o arfer gwael mewn gwirionedd 25 00:00:56,880 --> 00:00:58,940 i ysgrifennu cysonion i mewn eich cod. 26 00:00:58,940 --> 00:01:02,190 Wrth wneud hynny, pan fyddwch yn ei wneud mewn gwirionedd ysgrifennu cyson i mewn eich cod, 27 00:01:02,190 --> 00:01:05,630 Weithiau mae'n cyfeirir ato fel defnyddio rhifau hud, sy'n rhywbeth 28 00:01:05,630 --> 00:01:08,030 rydym yn gyffredinol yn awyddus i geisio osgoi. 29 00:01:08,030 --> 00:01:12,830 >> Er enghraifft, gadewch i ni edrych ar hyn o swyddogaeth syml yma. 30 00:01:12,830 --> 00:01:15,726 Yn amlwg does dim data teipiwch C elwir cerdyn neu dec. 31 00:01:15,726 --> 00:01:16,600 Felly, dim ond yn amyneddgar gyda mi. 32 00:01:16,600 --> 00:01:18,910 Mae'n ychydig o pseudocode cymysg i mewn yma. 33 00:01:18,910 --> 00:01:21,050 Mae hon yn swyddogaeth o'r enw yn delio cerdyn sydd yn ôl pob golwg 34 00:01:21,050 --> 00:01:26,570 cymryd dec fel ei paramedr, a ewyllys allbwn i mi cerdyn sengl. 35 00:01:26,570 --> 00:01:30,990 >> Ac yr wyf i'n gwneud rhywbeth yma lle rwy'n gael dolen sy'n rhedeg 0-52, 36 00:01:30,990 --> 00:01:33,394 ac yr wyf yn delio cerdyn. 37 00:01:33,394 --> 00:01:35,310 Wel, mae gennym hud rhif yn fan hyn, ar y dde. 38 00:01:35,310 --> 00:01:38,790 A ydych yn gweld yr hyn y mae'r rhif hud yw? 39 00:01:38,790 --> 00:01:42,280 Neu yn bwysicach, a ydych gweld beth yw'r broblem yma? 40 00:01:42,280 --> 00:01:44,310 Yn enwedig os yw hyn yn un swyddogaeth yn unig 41 00:01:44,310 --> 00:01:48,030 yn ei ffeil ei hun mewn ffolder sy'n cynnwys 42 00:01:48,030 --> 00:01:49,970 criw o wahanol ffeiliau, pob un ohonynt 43 00:01:49,970 --> 00:01:51,670 mae peth arall i dec o gardiau. 44 00:01:51,670 --> 00:01:57,310 Efallai ei fod shuffles hwy, neu yn ymdrin â llaw o bum gardiau yn lle cerdyn sengl. 45 00:01:57,310 --> 00:01:59,420 >> A ydych yn gweld yr hyn y mae'r Gallai problem fod yma? 46 00:01:59,420 --> 00:02:03,220 A ydych yn gweld y rhif hud Rydw i wedi chwistrellu i mewn i'r cod? 47 00:02:03,220 --> 00:02:04,390 Mae'n 52, ar y dde. 48 00:02:04,390 --> 00:02:06,440 >> Fel, yn reddfol mae'n debyg eich bod yn gwybod, OK. 49 00:02:06,440 --> 00:02:09,740 Fel dec safonol cardiau yn cynnwys 52 o gardiau. 50 00:02:09,740 --> 00:02:12,570 Ond yn ein rhaglen, 'i' jyst fath o fel y bo'r angen o gwmpas i mewn 'na. 51 00:02:12,570 --> 00:02:15,280 Mae fel yn sydyn mae 'na 52. 52 00:02:15,280 --> 00:02:18,290 >> Un ffordd o ddatrys hyn broblem yw i wneud hyn. 53 00:02:18,290 --> 00:02:22,724 Rydym yn benodol iawn erbyn hyn galw allan faint dec fel 52. 54 00:02:22,724 --> 00:02:25,390 Mae'n rhoi ei fod yn ychydig yn fwy 'n athrylithgar sy'n golygu pan fyddwch yn y ddolen ar gyfer 55 00:02:25,390 --> 00:02:28,650 yn nes ymlaen byddwn wedyn yn dweud, fi yn llai na maint dec. 56 00:02:28,650 --> 00:02:32,666 'I jyst yn ymddangos yn well na dweud 52. 57 00:02:32,666 --> 00:02:34,290 Yn awr mae hyn yn mewn gwirionedd yn datrys y broblem. 58 00:02:34,290 --> 00:02:38,460 Yw'n rhoi rhai symbolaidd ystyr i'r cyson. 59 00:02:38,460 --> 00:02:40,820 Ond mae'n ei wneud mewn gwirionedd yn fath o cyflwyno problem arall 60 00:02:40,820 --> 00:02:43,770 Efallai nad yw yn amlwg ar unwaith. 61 00:02:43,770 --> 00:02:45,859 Hyd yn oed os newidyn hwn ei ddatgan globally-- 62 00:02:45,859 --> 00:02:47,650 ydych chi'n cofio beth mae'n ei yn golygu pan fyddwn yn datgan 63 00:02:47,650 --> 00:02:50,500 newidyn yn fyd-eang yn erbyn yn lleol? 64 00:02:50,500 --> 00:02:53,340 Hyd yn oed os ydym yn datgan newidyn yn fyd-eang, beth os oes 65 00:02:53,340 --> 00:02:55,500 swyddogaeth arall yn ein cyfres o swyddogaethau 66 00:02:55,500 --> 00:02:59,750 sy'n delio â cherdyn trin hynny anfwriadol yn newid maint dec, 67 00:02:59,750 --> 00:03:02,727 neu mae'n cynyddu iddo gan 1 neu ostyngiad erbyn 1. 68 00:03:02,727 --> 00:03:04,060 Gallai hynny sillafu trafferth, dde? 69 00:03:04,060 --> 00:03:08,261 Yn enwedig os ydym yn delio gyda set o gardiau lle shuffling y dec llawn 70 00:03:08,261 --> 00:03:08,760 sydd ei angen. 71 00:03:08,760 --> 00:03:12,804 Os Maint y dec yn cael ei gostwng gan 1, er enghraifft, i 51, 72 00:03:12,804 --> 00:03:14,970 nid ydym yn shuffling mewn gwirionedd yr holl gardiau o bosibl. 73 00:03:14,970 --> 00:03:16,500 Rydym yn gadael un o nhw allan. 74 00:03:16,500 --> 00:03:21,680 A gallai fod gwerth o bosibl yn a ragwelir neu eu hecsbloetio gan actor gwael. 75 00:03:21,680 --> 00:03:24,920 >> C yn rhoi hyn a elwir yn gyfarwyddeb Preprocessor, a oedd yn 76 00:03:24,920 --> 00:03:27,764 a elwir hefyd yn macro ar gyfer creu cysonion symbolaidd. 77 00:03:27,764 --> 00:03:30,180 Ac yn wir, eich bod wedi eisoes gweld gyfarwyddeb Preprocessor, 78 00:03:30,180 --> 00:03:32,916 hyd yn oed os nad ydych wedi clywed ei Gelwir hynny gyda #include. 79 00:03:32,916 --> 00:03:37,150 Mae'n enghraifft arall o macro neu gyfarwyddeb Preprocessor. 80 00:03:37,150 --> 00:03:41,290 >> Y ffordd i greu cysonion symbolaidd, neu roi enw i gysonyn 81 00:03:41,290 --> 00:03:43,740 fel y mae wedi mwy sy'n golygu, fel a ganlyn. 82 00:03:43,740 --> 00:03:47,030 #define, enw, amnewid. 83 00:03:47,030 --> 00:03:49,140 Yn bwysig iawn o'r neilltu yma wir yn gyflym. 84 00:03:49,140 --> 00:03:54,180 Peidiwch â rhoi hanner colon yn diwedd eich #defines. 85 00:03:54,180 --> 00:03:57,310 Felly mae'n #define, enw, amnewid. 86 00:03:57,310 --> 00:03:59,540 >> Pan fydd eich rhaglen yn cael ei llunio, beth sy'n digwydd mewn gwirionedd 87 00:03:59,540 --> 00:04:01,740 yw'r compiler os mynd i fynd drwy eich cod 88 00:04:01,740 --> 00:04:06,770 a disodli pob achos o y gair "enw" gyda beth bynnag yr ydych 89 00:04:06,770 --> 00:04:08,860 rhoi fel amnewid. 90 00:04:08,860 --> 00:04:13,060 Analogously, os #include yn didoli o debyg i gopïo a gludo, 91 00:04:13,060 --> 00:04:15,700 Yna #define yn fath o tebyg i canfod a newid, 92 00:04:15,700 --> 00:04:19,180 os ydych chi wedi defnyddio bod nodwedd erioed mewn rhaglen prosesu geiriau, er enghraifft. 93 00:04:19,180 --> 00:04:26,345 >> Felly, er enghraifft, os wyf #define pi fel 3.14159265, 94 00:04:26,345 --> 00:04:28,720 os ydych chi'n well fathemategol dueddol ac rydych yn sydyn 95 00:04:28,720 --> 00:04:31,640 gweld 3.14159265 hedfan o gwmpas yn eich cod, 96 00:04:31,640 --> 00:04:33,517 mae'n debyg eich bod yn gwybod ei fod yn siarad am pi. 97 00:04:33,517 --> 00:04:35,850 Ond efallai y gallwn roi cynnig ychydig iawn o ystyr yn fwy symbolaidd. 98 00:04:35,850 --> 00:04:39,850 A gallwn ddweud yn lle hynny #define pi fel y llond ceg o rifau 99 00:04:39,850 --> 00:04:42,110 nad wyf ddim yn mynd i gadw darllen drosodd a throsodd. 100 00:04:42,110 --> 00:04:45,560 >> A beth sy'n mynd i ddigwydd yna yn llunio amser yw pan fydd y rhaglen yn 101 00:04:45,560 --> 00:04:48,530 llunio, y peth cyntaf a a fydd yn digwydd yw y bydd yn mynd drwy 102 00:04:48,530 --> 00:04:51,520 a bydd yn cymryd lle bob tro y gwêl cyfalaf P, cyfalaf I, 103 00:04:51,520 --> 00:04:55,610 bydd yn llythrennol yn ei le 3.14 ac yn y blaen, er mwyn i chi 104 00:04:55,610 --> 00:04:58,090 Nid oes rhaid i deipio pob amser tra bod eich rhaglen yn dal i 105 00:04:58,090 --> 00:05:00,631 Mae swyddogaeth yr ydych ddisgwyl, oherwydd eich bod yn gweithio 106 00:05:00,631 --> 00:05:05,090 gyda trin, lluosi, rannu, beth bynnag ydyw drwy pi. 107 00:05:05,090 --> 00:05:08,230 >> Nid ydych yn cael eu cyfyngu i hyn lle'r rhifau yn unig. 108 00:05:08,230 --> 00:05:12,279 Er enghraifft, gallwn i #define cwrs gan fod y CS50 llinyn. 109 00:05:12,279 --> 00:05:14,070 Yn yr achos hwn, pan fydd y rhaglen yn cael ei llunio, 110 00:05:14,070 --> 00:05:16,236 Bydd #define fynd drwy'r cod, yn cymryd lle bob tro 111 00:05:16,236 --> 00:05:19,900 y gwêl "cwrs" gyda'r CS50 llinyn. 112 00:05:19,900 --> 00:05:21,720 >> Byddwch yn sylwi yma hefyd fy mod yn aml 113 00:05:21,720 --> 00:05:26,090 #define fy ddiffinnir pob symbolaidd cysonion, fel petai, 114 00:05:26,090 --> 00:05:28,130 bob amser yn yr holl gapiau. 115 00:05:28,130 --> 00:05:28,960 Mae'n confensiwn. 116 00:05:28,960 --> 00:05:30,170 Nid ei angen. 117 00:05:30,170 --> 00:05:33,900 Y rheswm yn gyffredinol bydd pobl yn defnyddio pob brifddinasoedd pan fyddant yn #defining 118 00:05:33,900 --> 00:05:37,590 yn unig ei gwneud yn wir yn glir bod yr elfen benodol o'r grantiau fy cod 119 00:05:37,590 --> 00:05:38,820 yn gysonyn diffiniedig. 120 00:05:38,820 --> 00:05:43,730 Os oedd llythrennau bach, mae'n bosibl y gallai gael ei gamgymryd am amrywiol. 121 00:05:43,730 --> 00:05:46,120 A dyna yn ôl pob tebyg Nid yw yn beth da i'w wneud. 122 00:05:46,120 --> 00:05:48,910 >> Felly, mae hyn arbennig ateb yn llawer gwell 123 00:05:48,910 --> 00:05:50,550 na'r naill neu'r llall o'r rhai blaenorol. 124 00:05:50,550 --> 00:05:59,950 Os byddaf yn #define gyntaf maint dec 52, yna nawr fy nefnydd o 52, neu faint dec yma, 125 00:05:59,950 --> 00:06:01,850 yn llawer mwy greddfol a llawer mwy diogel. 126 00:06:01,850 --> 00:06:03,280 Ni allwch drin yn gyson. 127 00:06:03,280 --> 00:06:05,259 Ni allwch ddweud 52 a mwy a mwy. 128 00:06:05,259 --> 00:06:06,800 Nid yw hynny'n mynd i drosi i 53. 129 00:06:06,800 --> 00:06:09,390 Ni allwch newid 52 i rywbeth. 130 00:06:09,390 --> 00:06:12,470 >> Gallwch newid newidyn y mae eu gwerth yn 52, 131 00:06:12,470 --> 00:06:14,870 sef y atgyweiria cyntaf oedd gennym o'r blaen. 132 00:06:14,870 --> 00:06:17,000 A gallech gynyddu y newidyn i 53. 133 00:06:17,000 --> 00:06:21,100 Ond ni allwch ddweud 52 a mwy a mwy a wedi bod yn sydyn yn troi i mewn i 52 53. 134 00:06:21,100 --> 00:06:23,350 52 yw 52 bob amser. 135 00:06:23,350 --> 00:06:28,860 Ac felly ni allwch newid anfwriadol Maint y dec yma drwy drin y peth, 136 00:06:28,860 --> 00:06:29,940 137 00:06:29,940 --> 00:06:32,390 >> Ochr arall da Effaith y er bod hyn yn 138 00:06:32,390 --> 00:06:38,310 sydd a ydych yn ymwybodol nad yw yr holl wledydd o gwmpas y byd 139 00:06:38,310 --> 00:06:40,690 defnyddio dec o gardiau o faint 52? 140 00:06:40,690 --> 00:06:45,630 Er enghraifft, 'i' 'n sylweddol gyffredin mewn Yr Almaen dewis maint dec o 32, 141 00:06:45,630 --> 00:06:48,020 lle maent yn stribed allan rhai o'r cardiau gwerth is. 142 00:06:48,020 --> 00:06:50,960 Ac yn yr achos hwn, yr wyf yn yn awyddus i borthladd fy suite 143 00:06:50,960 --> 00:06:55,390 swyddogaethau sy'n ymdrin â trin cerdyn i'r Almaen. 144 00:06:55,390 --> 00:06:59,440 Gallwn yn y lle cyntaf i ni Dangosodd, rhaid i chi fynd a rhoi yn ei le 145 00:06:59,440 --> 00:07:03,570 bob enghraifft o 52 yn fy cod gyda 32. 146 00:07:03,570 --> 00:07:07,940 >> Ond yma, os wyf #define maint dec fel 32 ar frig fy cod, 147 00:07:07,940 --> 00:07:11,730 os bydd angen i mi ei newid, gallaf dim ond mynd a newid hynny un peth. 148 00:07:11,730 --> 00:07:15,010 Ail-grynhoi, mae fy cod a phob un Yn sydyn mae'n ehangun drwodd. 149 00:07:15,010 --> 00:07:18,850 Yn wir, gallwn newid dec maint i unrhyw werth yr ydym ei eisiau. 150 00:07:18,850 --> 00:07:22,500 >> A allaf ddiddordeb i chi mewn gêm o faint dec pickup? 151 00:07:22,500 --> 00:07:23,430 >> Rwy'n Doug Lloyd. 152 00:07:23,430 --> 00:07:25,840 Ac mae hyn yn CS50. 153 00:07:25,840 --> 00:07:27,772