[CHWARAE CERDDORIAETH] DOUG LLOYD: Pob hawl. Fath o bwnc rhyfedd, dde? Rhifau Hud. Beth ewig mae'n ei olygu pan ei fod siarad am rifau hud? Wel, mae rhai o'r rhaglenni ein bod wedi ysgrifennu yn CS50 hyd yn hyn wedi cael rhywfaint o 'n annaearol rhifau fath o daflu ynddynt. Efallai am resymau nad ydym yn ei wneud yn deall yn gyfan gwbl ar hyn o bryd. Er enghraifft, yn y broblem Mario, rydym yn gapio uchder y pyramid yn 23. Rydym yn dweud yn benodol i chi Ni all fynd yn uwch na 23. Ond beth mae 23 yn ei olygu? Wel, os ydych yn darllen y fanyleb yn ofalus, byddwch yn allai fod wedi gweld bod y rheswm yr ydym yn ei gapio ar 23 oherwydd bod y uchder safonol o derfynnell ffenest yw 24. Ac felly os oes gennym y pyramid fod yn dalach na hynny, gallai fod yn gwneud hyn beth rhyfedd lle y mae'n rhedeg oddi ar y sgrin. A ydych yn gwybod, beth mae hynny olygu yn y cyd-destun, dde? A yw'r ystyr o 23 amlwg ar unwaith i rywun sy'n edrych ar eich rhaglen ac efallai mae gan wahanol ffenestr terfynell maint? Mae'n debyg nad. Mae'n ymddangos fel, OK. Wel, pam ei fod ychydig yn llai na 23? Yn gyffredinol, mae'n fath o arfer gwael mewn gwirionedd i ysgrifennu cysonion i mewn eich cod. Wrth wneud hynny, pan fyddwch yn ei wneud mewn gwirionedd ysgrifennu cyson i mewn eich cod, Weithiau mae'n cyfeirir ato fel defnyddio rhifau hud, sy'n rhywbeth rydym yn gyffredinol yn awyddus i geisio osgoi. Er enghraifft, gadewch i ni edrych ar hyn o swyddogaeth syml yma. Yn amlwg does dim data teipiwch C elwir cerdyn neu dec. Felly, dim ond yn amyneddgar gyda mi. Mae'n ychydig o pseudocode cymysg i mewn yma. Mae hon yn swyddogaeth o'r enw yn delio cerdyn sydd yn ôl pob golwg cymryd dec fel ei paramedr, a ewyllys allbwn i mi cerdyn sengl. Ac yr wyf i'n gwneud rhywbeth yma lle rwy'n gael dolen sy'n rhedeg 0-52, ac yr wyf yn delio cerdyn. Wel, mae gennym hud rhif yn fan hyn, ar y dde. A ydych yn gweld yr hyn y mae'r rhif hud yw? Neu yn bwysicach, a ydych gweld beth yw'r broblem yma? Yn enwedig os yw hyn yn un swyddogaeth yn unig yn ei ffeil ei hun mewn ffolder sy'n cynnwys criw o wahanol ffeiliau, pob un ohonynt mae peth arall i dec o gardiau. Efallai ei fod shuffles hwy, neu yn ymdrin â llaw o bum gardiau yn lle cerdyn sengl. A ydych yn gweld yr hyn y mae'r Gallai problem fod yma? A ydych yn gweld y rhif hud Rydw i wedi chwistrellu i mewn i'r cod? Mae'n 52, ar y dde. Fel, yn reddfol mae'n debyg eich bod yn gwybod, OK. Fel dec safonol cardiau yn cynnwys 52 o gardiau. Ond yn ein rhaglen, 'i' jyst fath o fel y bo'r angen o gwmpas i mewn 'na. Mae fel yn sydyn mae 'na 52. Un ffordd o ddatrys hyn broblem yw i wneud hyn. Rydym yn benodol iawn erbyn hyn galw allan faint dec fel 52. Mae'n rhoi ei fod yn ychydig yn fwy 'n athrylithgar sy'n golygu pan fyddwch yn y ddolen ar gyfer yn nes ymlaen byddwn wedyn yn dweud, fi yn llai na maint dec. 'I jyst yn ymddangos yn well na dweud 52. Yn awr mae hyn yn mewn gwirionedd yn datrys y broblem. Yw'n rhoi rhai symbolaidd ystyr i'r cyson. Ond mae'n ei wneud mewn gwirionedd yn fath o cyflwyno problem arall Efallai nad yw yn amlwg ar unwaith. Hyd yn oed os newidyn hwn ei ddatgan globally-- ydych chi'n cofio beth mae'n ei yn golygu pan fyddwn yn datgan newidyn yn fyd-eang yn erbyn yn lleol? Hyd yn oed os ydym yn datgan newidyn yn fyd-eang, beth os oes swyddogaeth arall yn ein cyfres o swyddogaethau sy'n delio â cherdyn trin hynny anfwriadol yn newid maint dec, neu mae'n cynyddu iddo gan 1 neu ostyngiad erbyn 1. Gallai hynny sillafu trafferth, dde? Yn enwedig os ydym yn delio gyda set o gardiau lle shuffling y dec llawn sydd ei angen. Os Maint y dec yn cael ei gostwng gan 1, er enghraifft, i 51, nid ydym yn shuffling mewn gwirionedd yr holl gardiau o bosibl. Rydym yn gadael un o nhw allan. A gallai fod gwerth o bosibl yn a ragwelir neu eu hecsbloetio gan actor gwael. C yn rhoi hyn a elwir yn gyfarwyddeb Preprocessor, a oedd yn a elwir hefyd yn macro ar gyfer creu cysonion symbolaidd. Ac yn wir, eich bod wedi eisoes gweld gyfarwyddeb Preprocessor, hyd yn oed os nad ydych wedi clywed ei Gelwir hynny gyda #include. Mae'n enghraifft arall o macro neu gyfarwyddeb Preprocessor. Y ffordd i greu cysonion symbolaidd, neu roi enw i gysonyn fel y mae wedi mwy sy'n golygu, fel a ganlyn. #define, enw, amnewid. Yn bwysig iawn o'r neilltu yma wir yn gyflym. Peidiwch â rhoi hanner colon yn diwedd eich #defines. Felly mae'n #define, enw, amnewid. Pan fydd eich rhaglen yn cael ei llunio, beth sy'n digwydd mewn gwirionedd yw'r compiler os mynd i fynd drwy eich cod a disodli pob achos o y gair "enw" gyda beth bynnag yr ydych rhoi fel amnewid. Analogously, os #include yn didoli o debyg i gopïo a gludo, Yna #define yn fath o tebyg i canfod a newid, os ydych chi wedi defnyddio bod nodwedd erioed mewn rhaglen prosesu geiriau, er enghraifft. Felly, er enghraifft, os wyf #define pi fel 3.14159265, os ydych chi'n well fathemategol dueddol ac rydych yn sydyn gweld 3.14159265 hedfan o gwmpas yn eich cod, mae'n debyg eich bod yn gwybod ei fod yn siarad am pi. Ond efallai y gallwn roi cynnig ychydig iawn o ystyr yn fwy symbolaidd. A gallwn ddweud yn lle hynny #define pi fel y llond ceg o rifau nad wyf ddim yn mynd i gadw darllen drosodd a throsodd. A beth sy'n mynd i ddigwydd yna yn llunio amser yw pan fydd y rhaglen yn llunio, y peth cyntaf a a fydd yn digwydd yw y bydd yn mynd drwy a bydd yn cymryd lle bob tro y gwêl cyfalaf P, cyfalaf I, bydd yn llythrennol yn ei le 3.14 ac yn y blaen, er mwyn i chi Nid oes rhaid i deipio pob amser tra bod eich rhaglen yn dal i Mae swyddogaeth yr ydych ddisgwyl, oherwydd eich bod yn gweithio gyda trin, lluosi, rannu, beth bynnag ydyw drwy pi. Nid ydych yn cael eu cyfyngu i hyn lle'r rhifau yn unig. Er enghraifft, gallwn i #define cwrs gan fod y CS50 llinyn. Yn yr achos hwn, pan fydd y rhaglen yn cael ei llunio, Bydd #define fynd drwy'r cod, yn cymryd lle bob tro y gwêl "cwrs" gyda'r CS50 llinyn. Byddwch yn sylwi yma hefyd fy mod yn aml #define fy ddiffinnir pob symbolaidd cysonion, fel petai, bob amser yn yr holl gapiau. Mae'n confensiwn. Nid ei angen. Y rheswm yn gyffredinol bydd pobl yn defnyddio pob brifddinasoedd pan fyddant yn #defining yn unig ei gwneud yn wir yn glir bod yr elfen benodol o'r grantiau fy cod yn gysonyn diffiniedig. Os oedd llythrennau bach, mae'n bosibl y gallai gael ei gamgymryd am amrywiol. A dyna yn ôl pob tebyg Nid yw yn beth da i'w wneud. Felly, mae hyn arbennig ateb yn llawer gwell na'r naill neu'r llall o'r rhai blaenorol. Os byddaf yn #define gyntaf maint dec 52, yna nawr fy nefnydd o 52, neu faint dec yma, yn llawer mwy greddfol a llawer mwy diogel. Ni allwch drin yn gyson. Ni allwch ddweud 52 a mwy a mwy. Nid yw hynny'n mynd i drosi i 53. Ni allwch newid 52 i rywbeth. Gallwch newid newidyn y mae eu gwerth yn 52, sef y atgyweiria cyntaf oedd gennym o'r blaen. A gallech gynyddu y newidyn i 53. Ond ni allwch ddweud 52 a mwy a mwy a wedi bod yn sydyn yn troi i mewn i 52 53. 52 yw 52 bob amser. Ac felly ni allwch newid anfwriadol Maint y dec yma drwy drin y peth, Ochr arall da Effaith y er bod hyn yn sydd a ydych yn ymwybodol nad yw yr holl wledydd o gwmpas y byd defnyddio dec o gardiau o faint 52? Er enghraifft, 'i' 'n sylweddol gyffredin mewn Yr Almaen dewis maint dec o 32, lle maent yn stribed allan rhai o'r cardiau gwerth is. Ac yn yr achos hwn, yr wyf yn yn awyddus i borthladd fy suite swyddogaethau sy'n ymdrin â trin cerdyn i'r Almaen. Gallwn yn y lle cyntaf i ni Dangosodd, rhaid i chi fynd a rhoi yn ei le bob enghraifft o 52 yn fy cod gyda 32. Ond yma, os wyf #define maint dec fel 32 ar frig fy cod, os bydd angen i mi ei newid, gallaf dim ond mynd a newid hynny un peth. Ail-grynhoi, mae fy cod a phob un Yn sydyn mae'n ehangun drwodd. Yn wir, gallwn newid dec maint i unrhyw werth yr ydym ei eisiau. A allaf ddiddordeb i chi mewn gêm o faint dec pickup? Rwy'n Doug Lloyd. Ac mae hyn yn CS50.