1 00:00:00,000 --> 00:00:02,350 >> [MUSIC JOC] 2 00:00:02,350 --> 00:00:05,444 3 00:00:05,444 --> 00:00:06,360 DOUG LLOYD: Bine. 4 00:00:06,360 --> 00:00:07,770 Un fel de subiect ciudat, nu? 5 00:00:07,770 --> 00:00:09,050 Numere magice. 6 00:00:09,050 --> 00:00:12,012 Ce doe să spună când e vorbim despre numere magice? 7 00:00:12,012 --> 00:00:14,220 Ei bine, unele dintre programele pe care le-am scris în CS50 8 00:00:14,220 --> 00:00:16,660 până în prezent au avut unele ciudat Numerele tip de aruncat în ele. 9 00:00:16,660 --> 00:00:19,680 Poate din motive nu avem înțelege pe deplin acum. 10 00:00:19,680 --> 00:00:23,950 De exemplu, în problema Mario, am plafonate înălțimea piramidei la 23. 11 00:00:23,950 --> 00:00:26,880 Vă spus în mod explicit nu poate merge mai mare de 23. 12 00:00:26,880 --> 00:00:28,702 >> Dar ce înseamnă 23? 13 00:00:28,702 --> 00:00:30,410 Ei bine, dacă ai citit spec atenție, vă 14 00:00:30,410 --> 00:00:32,493 ar fi văzut că motiv am limitat la 23 15 00:00:32,493 --> 00:00:36,160 se datorează faptului că înălțimea standard de de o fereastră de terminal este de 24. 16 00:00:36,160 --> 00:00:38,860 Și astfel, dacă avem piramidă să fie mai înalt decât că, 17 00:00:38,860 --> 00:00:41,290 s-ar putea face acest lucru ciudat în cazul în care se execută de pe ecran. 18 00:00:41,290 --> 00:00:45,140 Și știi, ce face Asta înseamnă, în context, nu? 19 00:00:45,140 --> 00:00:48,880 >> Este sensul de 23 imediat evidente pentru cineva care se uita la programul tău 20 00:00:48,880 --> 00:00:51,550 și poate are un alt fereastră terminal dimensiune? 21 00:00:51,550 --> 00:00:52,330 Probabil ca nu. 22 00:00:52,330 --> 00:00:53,080 Se pare ca, OK. 23 00:00:53,080 --> 00:00:55,005 Ei bine, de ce este doar mai puțin de 23? 24 00:00:55,005 --> 00:00:56,880 În general, e un fel de un obicei prost de fapt 25 00:00:56,880 --> 00:00:58,940 pentru a scrie constante în codul. 26 00:00:58,940 --> 00:01:02,190 În acest sens, atunci când de fapt, nu scrie o constantă în codul, 27 00:01:02,190 --> 00:01:05,630 este uneori menționată ca folosind numere magice, care este ceva 28 00:01:05,630 --> 00:01:08,030 Noi, în general doriți să încercați și de a evita. 29 00:01:08,030 --> 00:01:12,830 >> De exemplu, haideți să aruncăm o privire la această funcție simplă aici. 30 00:01:12,830 --> 00:01:15,726 Evident, nu există nici date tip în C numit card sau punte. 31 00:01:15,726 --> 00:01:16,600 Deci, doar să poarte cu mine. 32 00:01:16,600 --> 00:01:18,910 E un pic de pseudocod amestecat aici. 33 00:01:18,910 --> 00:01:21,050 Aceasta este o funcție numită face carte de care se pare că 34 00:01:21,050 --> 00:01:26,570 ia o punte ca parametru său și voința de ieșire pentru mine un singur card. 35 00:01:26,570 --> 00:01:30,990 >> Și eu fac ceva aici, unde am au o buclă care ruleaza 0-52, 36 00:01:30,990 --> 00:01:33,394 și am face un card. 37 00:01:33,394 --> 00:01:35,310 Ei bine, avem o magie Numărul aici, dreapta. 38 00:01:35,310 --> 00:01:38,790 Vezi ce numărul magic este? 39 00:01:38,790 --> 00:01:42,280 Sau mai important, nu-i așa vezi care e problema aici? 40 00:01:42,280 --> 00:01:44,310 În special în cazul în care acest lucru este doar o funcție 41 00:01:44,310 --> 00:01:48,030 în propriul fișier într-un dosar care conține 42 00:01:48,030 --> 00:01:49,970 o grămadă de diferite fișiere, fiecare dintre care 43 00:01:49,970 --> 00:01:51,670 nu un alt lucru la un pachet de cărți. 44 00:01:51,670 --> 00:01:57,310 Poate că le amesteca, oferte o mână de cinci cărți în loc de un singur card. 45 00:01:57,310 --> 00:01:59,420 >> Ai vedea ce problemă ar putea fi aici? 46 00:01:59,420 --> 00:02:03,220 Nu veți vedea numărul magic Am injectat în codul? 47 00:02:03,220 --> 00:02:04,390 E 52, dreapta. 48 00:02:04,390 --> 00:02:06,440 >> Ca, intuitiv probabil știți, OK. 49 00:02:06,440 --> 00:02:09,740 Ca un pachet standard de Carduri conține 52 de cărți. 50 00:02:09,740 --> 00:02:12,570 Dar, în programul nostru, e doar fel de plutesc în jurul acolo. 51 00:02:12,570 --> 00:02:15,280 E ca și cum dintr-o dată există o 52. 52 00:02:15,280 --> 00:02:18,290 >> O modalitate de a rezolva această problema este de a face acest lucru. 53 00:02:18,290 --> 00:02:22,724 Suntem foarte explicit acum strigând dimensiunea punte ca 52. 54 00:02:22,724 --> 00:02:25,390 Acesta oferă un pic mai mult intuitiv adică atunci când în bucla de 55 00:02:25,390 --> 00:02:28,650 mai târziu vom spune atunci, am este mai mică decât dimensiunea punte. 56 00:02:28,650 --> 00:02:32,666 Mi se pare mai bine decât a spune 52. 57 00:02:32,666 --> 00:02:34,290 Acum, acest lucru nu rezolva de fapt problema. 58 00:02:34,290 --> 00:02:38,460 Aceasta dă unele simbolică adică la constanta. 59 00:02:38,460 --> 00:02:40,820 Dar nu un fel de efectiv introduce o altă problemă 60 00:02:40,820 --> 00:02:43,770 care ar putea să nu fie vizibile imediat. 61 00:02:43,770 --> 00:02:45,859 Chiar dacă această variabilă este declarat globally-- 62 00:02:45,859 --> 00:02:47,650 Îți amintești ce înseamnă că atunci când ne declarăm 63 00:02:47,650 --> 00:02:50,500 o variabilă la nivel global față de la nivel local? 64 00:02:50,500 --> 00:02:53,340 Chiar dacă ne-am declara o variabilă la nivel global, ce dacă e 65 00:02:53,340 --> 00:02:55,500 o altă funcție în suita noastră de funcții 66 00:02:55,500 --> 00:02:59,750 care se ocupă cu manipularea carte care se schimbă accidental dimensiuni punte, 67 00:02:59,750 --> 00:03:02,727 sau crește de 1 sau scade cu 1. 68 00:03:02,727 --> 00:03:04,060 Asta ar putea vraja probleme, nu? 69 00:03:04,060 --> 00:03:08,261 Mai ales dacă avem de-a face cu un set de cărți în care amestecarea pachetul complet 70 00:03:08,261 --> 00:03:08,760 este necesară. 71 00:03:08,760 --> 00:03:12,804 Dacă dimensiunea punte este scăzut de 1, de exemplu, la 51, 72 00:03:12,804 --> 00:03:14,970 nu suntem de fapt amestecare toate cărțile eventual. 73 00:03:14,970 --> 00:03:16,500 Plecăm una dintre ele afară. 74 00:03:16,500 --> 00:03:21,680 Și că ar putea fi, probabil, o valoare prezis sau exploatat de către un actor prost. 75 00:03:21,680 --> 00:03:24,920 >> C oferă ceea ce se numește un Directiva preprocesor, care 76 00:03:24,920 --> 00:03:27,764 este de asemenea, numit un macro pentru crearea constante simbolice. 77 00:03:27,764 --> 00:03:30,180 Și, de fapt, ai deja văzut o directivă preprocesor, 78 00:03:30,180 --> 00:03:32,916 chiar dacă nu ați auzit numit care cu #include. 79 00:03:32,916 --> 00:03:37,150 Este un alt exemplu de macro sau directiva preprocesor. 80 00:03:37,150 --> 00:03:41,290 >> Modul de a crea constante simbolice, sau de a da un nume pentru o constantă 81 00:03:41,290 --> 00:03:43,740 astfel încât acesta are mai adică, este după cum urmează. 82 00:03:43,740 --> 00:03:47,030 #define, numele, de înlocuire. 83 00:03:47,030 --> 00:03:49,140 Într-adevăr importantă parte aici foarte repede. 84 00:03:49,140 --> 00:03:54,180 Nu pune punct și virgulă la la sfârșitul anului #defines tale. 85 00:03:54,180 --> 00:03:57,310 Deci e #define, numele, de înlocuire. 86 00:03:57,310 --> 00:03:59,540 >> Când programul este compilat, ce se întâmplă de fapt 87 00:03:59,540 --> 00:04:01,740 este compilatorul dacă merge pentru a merge prin codul 88 00:04:01,740 --> 00:04:06,770 și înlocuiți fiecare instanță a cuvântul "nume" cu tot ce 89 00:04:06,770 --> 00:04:08,860 pune ca înlocuitor. 90 00:04:08,860 --> 00:04:13,060 În mod analog, în cazul în care este un fel #include de similar cu copierea și lipirea, 91 00:04:13,060 --> 00:04:15,700 atunci #define este un fel de similar cu a găsi și înlocui, 92 00:04:15,700 --> 00:04:19,180 Dacă ați folosit vreodată că într-o funcție program de procesare de text, de exemplu. 93 00:04:19,180 --> 00:04:26,345 >> Deci, de exemplu, dacă am #define pi ca 3.14159265, 94 00:04:26,345 --> 00:04:28,720 daca esti mai bine matematic înclinat și dintr-o dată 95 00:04:28,720 --> 00:04:31,640 vezi 3.14159265 zbor în jurul valorii de în codul dvs., 96 00:04:31,640 --> 00:04:33,517 Probabil știi că vorbește despre pi. 97 00:04:33,517 --> 00:04:35,850 Dar poate putem da o puțin mai mult simbolic înțeles. 98 00:04:35,850 --> 00:04:39,850 Și putem spune în schimb #define pi ca și gura de numere 99 00:04:39,850 --> 00:04:42,110 că nu am de gând să păstreze lectură de peste si peste. 100 00:04:42,110 --> 00:04:45,560 >> Și ce se va întâmpla apoi la compila timp este atunci când programul este 101 00:04:45,560 --> 00:04:48,530 compilat, primul lucru pe care se va întâmpla este va trece prin 102 00:04:48,530 --> 00:04:51,520 și va înlocui de fiecare dată vede de capital P, capitalul I, 103 00:04:51,520 --> 00:04:55,610 acesta va înlocui literalmente cu o 3.14 și așa mai departe, astfel încât să 104 00:04:55,610 --> 00:04:58,090 Nu trebuie să tastați în fiecare timp în timp ce programul tău încă 105 00:04:58,090 --> 00:05:00,631 are funcționalitatea pe care le se așteaptă, pentru că lucrezi 106 00:05:00,631 --> 00:05:05,090 cu manipulare, înmulțirea, divizarea, orice ar fi de pi. 107 00:05:05,090 --> 00:05:08,230 >> Tu nu sunt limitate la acest înlocuire pentru doar numere. 108 00:05:08,230 --> 00:05:12,279 De exemplu, aș putea #define Desigur ca CS50 șir. 109 00:05:12,279 --> 00:05:14,070 În acest caz, în cazul în care Programul este compilat, 110 00:05:14,070 --> 00:05:16,236 #define va trece prin cod, înlocuiți de fiecare dată 111 00:05:16,236 --> 00:05:19,900 vede "curs", cu CS50 șir. 112 00:05:19,900 --> 00:05:21,720 >> Veți observa aici de asemenea, că am frecvent 113 00:05:21,720 --> 00:05:26,090 #define toate mea definit simbolic constante, ca să spunem așa, 114 00:05:26,090 --> 00:05:28,130 sunt întotdeauna în toate capacele. 115 00:05:28,130 --> 00:05:28,960 E o convenție. 116 00:05:28,960 --> 00:05:30,170 Nu este necesar. 117 00:05:30,170 --> 00:05:33,900 Motivul, în general, oamenii vor folosi toate capitalele atunci când acestea sunt #defining 118 00:05:33,900 --> 00:05:37,590 este doar pentru a face într-adevăr clar că acest element special de codul meu 119 00:05:37,590 --> 00:05:38,820 este o constantă definită. 120 00:05:38,820 --> 00:05:43,730 Dacă ar fi fost cu litere mici, este posibil ca ar putea fi confundat cu o variabilă. 121 00:05:43,730 --> 00:05:46,120 Și asta e, probabil, nu un lucru bun pentru a face. 122 00:05:46,120 --> 00:05:48,910 >> Deci, acest special soluție este mult mai bine 123 00:05:48,910 --> 00:05:50,550 decât oricare dintre cele anterioare. 124 00:05:50,550 --> 00:05:59,950 Dacă aș prima #define dimensiune pachet de 52, atunci acum utilizarea mea de 52, sau dimensiunea punte aici, 125 00:05:59,950 --> 00:06:01,850 este mult mai intuitivă și mult mai sigure. 126 00:06:01,850 --> 00:06:03,280 Nu puteți manipula o constantă. 127 00:06:03,280 --> 00:06:05,259 Nu se poate spune 52, plus, plus. 128 00:06:05,259 --> 00:06:06,800 Asta nu o să-l convertească la 53. 129 00:06:06,800 --> 00:06:09,390 Nu puteți schimba 52 la ceva. 130 00:06:09,390 --> 00:06:12,470 >> Puteți schimba o variabilă a căror valoare este de 52, 131 00:06:12,470 --> 00:06:14,870 care a fost primul fix am avut-o înainte. 132 00:06:14,870 --> 00:06:17,000 Și ar putea crește variabila la 53. 133 00:06:17,000 --> 00:06:21,100 Dar nu se poate spune 52, plus, plus și au ca transforma brusc 52 în 53. 134 00:06:21,100 --> 00:06:23,350 52 este întotdeauna 52. 135 00:06:23,350 --> 00:06:28,860 Și astfel nu se poate schimba din greșeală Dimensiunea punte aici prin manipularea acesteia, 136 00:06:28,860 --> 00:06:29,940 137 00:06:29,940 --> 00:06:32,390 >> Un alt parte buna efect de acest lucru, deși este 138 00:06:32,390 --> 00:06:38,310 că sunteți conștienți de faptul că nu toate țările din întreaga lume 139 00:06:38,310 --> 00:06:40,690 utilizați un pachet de cărți de dimensiuni 52? 140 00:06:40,690 --> 00:06:45,630 De exemplu, este foarte comun în Germania a utiliza o dimensiune pachet de 32, 141 00:06:45,630 --> 00:06:48,020 în cazul în care benzi unele de carduri de valoare inferioare. 142 00:06:48,020 --> 00:06:50,960 Și în acest caz, am a vrut să-mi port de suită 143 00:06:50,960 --> 00:06:55,390 de funcții care se ocupă cu manipulare carte în Germania. 144 00:06:55,390 --> 00:06:59,440 Am putea, în primul rând ne-am a arătat, trebuie să meargă și să înlocuiască 145 00:06:59,440 --> 00:07:03,570 toate cazurile de 52 în codul meu cu 32. 146 00:07:03,570 --> 00:07:07,940 >> Dar aici, dacă am #define dimensiune punte ca 32 la foarte de sus a codul meu, 147 00:07:07,940 --> 00:07:11,730 dacă am nevoie să-l schimbe, pot du-te și schimba asta un lucru. 148 00:07:11,730 --> 00:07:15,010 Recompilați codul meu, și toate Dintr-o dată se propagă prin intermediul. 149 00:07:15,010 --> 00:07:18,850 De fapt, putem schimba punte dimensiune la orice valoare dorim. 150 00:07:18,850 --> 00:07:22,500 >> Pot să vă interes într-o joc de dimensiuni punte pickup? 151 00:07:22,500 --> 00:07:23,430 >> Sunt Doug Lloyd. 152 00:07:23,430 --> 00:07:25,840 Și acest lucru este CS50. 153 00:07:25,840 --> 00:07:27,772