[Muzika] DOUG Lloyd: Në rregull. Lloj i një teme të çuditshme, e drejtë? Numrat magjike. Çfarë doe thoshte kur ai është duke folur për numrat magjike? E pra, disa nga programet që ne kemi shkruar në CS50 deri më tani kanë pasur disa pazakontë Numrat lloj i hedhur në to. Ndoshta për arsye që ne nuk bëjmë tërësisht e kuptoj tani. Për shembull, në problemin Mario, ne mbuluar lartësinë e piramidës në 23. Ne në mënyrë eksplicite tha se ju nuk mund të shkojnë më të larta se 23. Por çfarë do të thotë 23? E pra, në qoftë se ju lexoni spekulim me kujdes, ju mund të keni parë se Arsyeja që ne mbuluar atë në 23 është për shkak të lartësisë standarde nga një dritare terminali është 24. Dhe kështu që në qoftë se ne kemi piramidale të jetë shtatlartë se ajo, ajo mund të bëjë një gjë të tillë të pazakontë ku ajo shkon jashtë ekranit. Dhe ju e dini, se çfarë bën që do të thotë në kontekst, e drejtë? Është kuptimi i 23 menjëherë e dukshme për dikë që shikon programin tuaj dhe ndoshta ka një tjetër dritare terminali Madhësia? Ndoshta jo. Duket sikur, OK. E pra, pse është vetëm më pak se 23? Në përgjithësi, kjo është lloj e një zakon i keq në fakt të shkruani konstanta në kodin tuaj. Duke vepruar kështu, kur ju të vërtetë të bëni shkruaj një konstante në kodin tuaj, kjo është nganjëherë referuar si duke përdorur numrat magjike, e cila është diçka ne përgjithësi të dëshironi të provoni dhe për të shmangur. Për shembull, le të marrin një vështrim në këtë funksion të thjeshtë këtu. Natyrisht nuk ka të dhëna lloji në C e quajtur kartë ose kuvertë. Pra, vetëm të kesh durim me mua. Kjo është pak e pseudokod përziera në këtu. Ky është një funksion i quajtur merren kartë që me sa duket merr një kuvertë si parametër të saj, dhe Vullneti i prodhimit për mua një kartë të vetme. Dhe unë jam duke bërë diçka këtu, ku unë kanë një lak që shkon nga 0 deri ne 52, dhe unë të merren një kartë. E pra, ne kemi marrë një magji numër në këtu, e drejtë. A e shihni se çfarë numri magjik është? Ose më e rëndësishmja, a të shohim se çfarë problemi është këtu? Veçanërisht nëse kjo është vetëm një funksion në dosjen e vet në një dosje që përmban një bandë e ndryshme fotografi, secila prej të cilave bën një tjetër gjë në një kuvertë të kartave. Ndoshta kjo lëvizjet e tyre, ose të bëjë një dorë e pesë letra në vend të një kartë të vetme. A e shihni se çfarë Problemi mund të jetë këtu? A e shihni numrin magjik Unë e kam injektuar në kodin? Kjo është 52, e drejtë. Si, intuitive ju ndoshta e dini, OK. Si një kuvertë standarde të Kartat përmban 52 karta. Por në programin tonë, kjo është vetëm lloj lundrues rreth në atje. Është si të gjithë një e papritur ka një 52. Një mënyrë për të zgjidhur këtë Problemi është për të bërë këtë. Ne jemi shumë të qartë tani duke thirrur madhësinë kuvertë si 52. Ai jep atë një pak më shumë intuitiv që do të thotë kur në për lak më vonë themi, pra, unë është më pak se madhësia kuvertë. Ajo vetëm duket më mirë se duke thënë se 52. Tani ky fakt ka rregulluar problemin. Ajo i jep disa simbolik kuptim konstante. Por ajo ka lloj i vërtetë futur një problem tjetër që nuk mund të jetë menjëherë e dukshme. Edhe në qoftë se ky variabël është deklaruar globally-- A ju kujtohet se çfarë do të thotë që kur ne të deklarojë një variabël globalisht kundrejt nivel lokal? Edhe në qoftë se ne të deklarojë një ndryshore globalisht, çfarë nëse nuk ka një tjetër funksion në suite ynë i funksioneve që kanë të bëjnë me kartë manipulimin që pa dashje ndryshon madhësinë kuvertë, ose ajo rrit atë duke 1 ose ul atë me 1. Kjo mund të spell probleme, e drejtë? Sidomos në qoftë se kemi të bëjmë me një grup i kartave ku shuffling kuvertë plotë Kërkohet. Nëse madhësia kuvertë është zvogëluar me 1, për shembull, për 51, ne nuk jemi në fakt shuffling të gjitha kartat ndoshta. Ne jemi duke e lënë një prej tyre jashtë. Dhe kjo vlerë mund të jetë ndoshta parashikuar ose shfrytëzuar nga një aktor i keq. C siguron atë që quhet një direktivë preprocessor, e cila është quajtur gjithashtu një makro për krijuar konstante simbolike. Dhe në fakt, ju keni tashmë shihet një direktivë Preprocessor, edhe në qoftë se ju nuk e keni dëgjuar atë quhet se me #include. Kjo është një tjetër shembull i një makro ose direktivë preprocessor. Mënyra për të krijuar konstante simbolike, ose duke i dhënë një emër për një konstante në mënyrë që ajo ka më që do të thotë, është si vijon. #define, emri, zëvendësim. Të vërtetë e rëndësishme mënjanë këtu me të vërtetë të shpejtë. A nuk e vënë një pikëpresje në fundi i #defines tuaj. Pra, kjo është #define, emri, zëvendësim. Kur programi juaj është hartuar, çfarë ndodh në të vërtetë është përpilues nëse do për të shkuar nëpërmjet kodit tuaj dhe të zëvendësojë çdo shembull i fjala "emër" me çdo gjë që ju vënë si zëvendësim. Në mënyrë analoge, nëse #include është lloj e ngjashme me kopjimi dhe pasting, atëherë #define është lloj i i ngjashëm për të gjetur dhe të zëvendësojë, në qoftë se ju keni përdorur ndonjëherë këtë funksion në një program word processing, për shembull. Kështu për shembull, në qoftë se unë #define pi si 3.14159265, në qoftë se ju jeni më të mirë matematikisht të prirur dhe ju papritmas shih 3.14159265 flying rreth në kodin tuaj, ju ndoshta e dini se është duke folur në lidhje me pi. Por ndoshta ne mund të japim atë një pak kuptim më shumë simbolik. Dhe në vend të kësaj ne mund të themi #define pi si atë kafshatë e numrave se unë nuk jam duke shkuar për të mbajtur duke lexuar mbi dhe mbi. Dhe çfarë do të ndodhë më pas në përpilojnë koha është kur programi është hartuar, gjëja e parë që do të ndodhë është se do të kalojnë nëpër dhe ajo do të zëvendësojë çdo kohë ajo sheh P kapitalit, kapitali I, ajo fjalë për fjalë do të zëvendësojë atë me 3.14 dhe kështu me radhë, kështu që ju nuk duhet të shkruani atë çdo koha ndërkohë që programi juaj ende ka funksionalitetin që ju presin, për shkak se ju jeni duke punuar me manipulimin, shumëzuar, ndarjes, çfarëdo qoftë ajo është me pi. Ju nuk janë të kufizuara në këtë zëvendësim për vetëm numra. Për shembull, unë mund të #define Sigurisht si CS50 string. Në këtë rast, kur Programi është hartuar, #define do të shkojnë përmes Kodi, të zëvendësojë çdo kohë ajo sheh "kursin" me CS50 string. Ju do të vëreni këtu gjithashtu që unë shpesh #define gjithë përcaktuar time simbolike konstantet, kështu që të flasin, janë gjithmonë në të gjitha shkronja kapitale. Kjo është një konventë. Kjo nuk është e nevojshme. Arsyeja përgjithësisht njerëz do të përdorin Të gjitha kryeqytetet kur ata janë #defining është vetëm për të bërë me të vërtetë të qartë se ky element i veçantë i kodit tim është një konstante përcaktuar. Në qoftë se kjo ishte Fjala, është e mundur që ajo mund të ngatërrohet me një ndryshore. Dhe kjo është ndoshta nuk është një gjë e mirë për të bërë. Pra këtë të veçantë Zgjidhja është shumë më mirë se secila nga ato të mëparshme. Nëse unë #define parë kuvertë madhësia 52, atëherë tani Përdorimi im i 52, apo madhësia kuvertë këtu, është shumë më intuitive dhe shumë më të sigurt. Ju nuk mund të manipulojnë një konstante. Ju nuk mund të themi 52 plus plus. Kjo nuk do të kthyer atë në 53. Ju nuk mund të ndryshoni 52 për diçka. Ju mund të ndryshojë një variabël vlera e të cilit është 52, e cila ishte fix parë kemi pasur më parë. Dhe ju mund të rritet që ndryshueshme në 53. Por ju nuk mund të them se 52 plus plus dhe kanë që papritmas kthehet 52 në 53. 52 është gjithmonë 52. Dhe kështu që ju nuk mund të ndryshojë pa dashje Madhësia kuvertë këtu duke manipuluar atë, Një tjetër anë e mirë Efekti i kësaj edhe pse është se a jeni të vetëdijshëm se nuk të gjitha vendet në botë përdorni një kuvertë të kartave të madhësisë 52? Për shembull, është e vërtetë e zakonshme në Gjermania për të përdorur një madhësi kuvertë e 32, ku ata zhvesh nga disa e kartave me vlerë më të ulët. Dhe në këtë rast, unë donte të portit suite tim e funksioneve që kanë të bëjnë me kartë manipulim në Gjermani. Unë mund të në radhë të parë ne tregoi, duhet të shkoni dhe të zëvendësojë të gjitha instancat e 52 në kodin tim me 32. Por këtu, në qoftë se unë #define madhësia kuvertë si 32 në krye të kodit tim, nëse kam nevojë për të ndryshuar atë, unë mund të thjesht shkoni dhe për të ndryshuar atë një gjë. Përpiluar kodin tim, dhe të gjithë një e papritur ajo propagandon përmes. Në fakt, ne mund të ndryshojmë kuvertë Madhësia e çdo vlere ne duam. Unë mund të ju interesojnë në një lojë e rastit madhësisë kuvertë? Unë jam Doug Lloyd. Dhe kjo është CS50.