1 00:00:00,000 --> 00:00:02,350 >> [MUSIC nagpe-play] 2 00:00:02,350 --> 00:00:05,444 3 00:00:05,444 --> 00:00:06,360 DOUG LLOYD: Lahat ng karapatan. 4 00:00:06,360 --> 00:00:07,770 Uri ng isang kakaibang topic, di ba? 5 00:00:07,770 --> 00:00:09,050 Magic numero. 6 00:00:09,050 --> 00:00:12,012 Ano usang babae niyang sabihin kapag siya ay pakikipag-usap tungkol magic numero? 7 00:00:12,012 --> 00:00:14,220 Well, ilan sa mga programa na namin ang nakasulat sa CS50 8 00:00:14,220 --> 00:00:16,660 sa ngayon ay nagkaroon ng ilang mga kakatwang numero ng uri ng itinapon sa kanila. 9 00:00:16,660 --> 00:00:19,680 Marahil para sa mga kadahilanang hindi kami ganap na maunawaan ngayon. 10 00:00:19,680 --> 00:00:23,950 Halimbawa, sa ang problema Mario, tayo capped ang taas ng pyramid sa 23. 11 00:00:23,950 --> 00:00:26,880 Tahasan naming sinabi mo hindi maaaring pumunta mas mataas kaysa sa 23. 12 00:00:26,880 --> 00:00:28,702 >> Ngunit ano ang ibig sabihin ng 23? 13 00:00:28,702 --> 00:00:30,410 Well, kung ikaw basahin ang pagsasapalaran maingat, ikaw 14 00:00:30,410 --> 00:00:32,493 maaaring nakita na ang dahilan capped namin ito sa 23 15 00:00:32,493 --> 00:00:36,160 ay dahil ang standard na taas ng isang terminal na window ay 24. 16 00:00:36,160 --> 00:00:38,860 At kaya kung mayroon kaming ang pyramid na mas matangkad kaysa sa, 17 00:00:38,860 --> 00:00:41,290 maaaring ito gawin ito kakaiba bagay kung saan ito ay tumatakbo off ang screen. 18 00:00:41,290 --> 00:00:45,140 At alam mo, kung ano ang ginagawa na ang ibig sabihin sa konteksto, di ba? 19 00:00:45,140 --> 00:00:48,880 >> Ay ang kahulugan ng 23 agad maliwanag sa isang tao na tumitingin sa iyong mga programa 20 00:00:48,880 --> 00:00:51,550 at marahil ay may ibang laki ng window ng terminal? 21 00:00:51,550 --> 00:00:52,330 Hindi siguro. 22 00:00:52,330 --> 00:00:53,080 Tila gusto, OK. 23 00:00:53,080 --> 00:00:55,005 Well, kung bakit ito lamang mas mababa sa 23? 24 00:00:55,005 --> 00:00:56,880 Sa pangkalahatan, ito ay uri ng isang masamang ugali talaga 25 00:00:56,880 --> 00:00:58,940 na magsulat ng constants sa iyong code. 26 00:00:58,940 --> 00:01:02,190 Sa paggawa nito, kapag ang tunay na gagawin magsulat ng isang pare-pareho sa iyong code, 27 00:01:02,190 --> 00:01:05,630 kung minsan ito ay tinutukoy bilang gamit magic numero, na kung saan ay isang bagay na 28 00:01:05,630 --> 00:01:08,030 kami ay karaniwang gusto mong subukan at iwasan. 29 00:01:08,030 --> 00:01:12,830 >> Halimbawa, sabihin tumagal ng isang pagtingin sa simpleng pag-andar na ito dito. 30 00:01:12,830 --> 00:01:15,726 Malinaw na walang data uri sa C tinatawag card o deck. 31 00:01:15,726 --> 00:01:16,600 Kaya lamang madala sa akin. 32 00:01:16,600 --> 00:01:18,910 Ito ay isang maliit na piraso ng pseudocode mixed in dito. 33 00:01:18,910 --> 00:01:21,050 Ito ay isang function na tinatawag na pakikitungo card na tila 34 00:01:21,050 --> 00:01:26,570 tumatagal ng isang deck ng mga parameter nito, at kalooban output sa akin ng isang solong card. 35 00:01:26,570 --> 00:01:30,990 >> At ako ng paggawa ng isang bagay dito kung saan ako magkaroon ng isang loop na tumatakbo mula 0 hanggang 52, 36 00:01:30,990 --> 00:01:33,394 at harapin ko ang isang card. 37 00:01:33,394 --> 00:01:35,310 Well, namin nakuha ng isang magic numero sa dito, right. 38 00:01:35,310 --> 00:01:38,790 Huwag mong makita kung ano ang magic number ay? 39 00:01:38,790 --> 00:01:42,280 O mas mahalaga, gawin mo tingnan mo kung ano ang problema dito? 40 00:01:42,280 --> 00:01:44,310 Lalo na kung ito ay isang function na lamang 41 00:01:44,310 --> 00:01:48,030 sa sarili nitong file sa isang folder na naglalaman ng 42 00:01:48,030 --> 00:01:49,970 ng grupo ng mga iba't-ibang mga file, ang bawat isa ay 43 00:01:49,970 --> 00:01:51,670 ang ginagawa ng iba pang bagay sa isang deck ng mga baraha. 44 00:01:51,670 --> 00:01:57,310 Siguro ito shuffles mga ito, o ang trato ng isang kamay ng limang card sa halip ng isang solong card. 45 00:01:57,310 --> 00:01:59,420 >> Huwag mong makita kung ano ang maaaring maging dito problema? 46 00:01:59,420 --> 00:02:03,220 Nakikita mo ba ang magic number Na iturok ko sa code? 47 00:02:03,220 --> 00:02:04,390 Ito ay 52, sa kanan. 48 00:02:04,390 --> 00:02:06,440 >> Tulad ng, intuitively mo marahil alam, OK. 49 00:02:06,440 --> 00:02:09,740 Tulad ng isang standard na deck ng mga card ay naglalaman ng 52 card. 50 00:02:09,740 --> 00:02:12,570 Ngunit sa aming programa, ito lang uri ng lumulutang sa paligid sa doon. 51 00:02:12,570 --> 00:02:15,280 Ito ay tulad ng lahat ng isang biglaang mayroong isang 52. 52 00:02:15,280 --> 00:02:18,290 >> Ang isang paraan upang malutas ito problema ay upang gawin ito. 53 00:02:18,290 --> 00:02:22,724 Kami ay labis na malinaw ngayon pagtawag out ang laki deck bilang 52. 54 00:02:22,724 --> 00:02:25,390 Ito ay nagbibigay ito ng isang maliit na mas magaling ibig sabihin kapag sa para sa loop 55 00:02:25,390 --> 00:02:28,650 mamaya sa ating sasabihin, i Mababa sa laki deck. 56 00:02:28,650 --> 00:02:32,666 Ito lamang tila mas mahusay kaysa sa sinasabi 52. 57 00:02:32,666 --> 00:02:34,290 Ngayon na ito ay tunay na ayusin ang problema. 58 00:02:34,290 --> 00:02:38,460 Ito ay magbibigay sa ilang mga symbolic ibig sabihin ay sa pare-pareho. 59 00:02:38,460 --> 00:02:40,820 Ngunit ito ay hindi ang uri ng tunay na ipakilala ang isa pang problema 60 00:02:40,820 --> 00:02:43,770 na maaaring hindi agad maliwanag. 61 00:02:43,770 --> 00:02:45,859 Kahit na ang variable na ito ay ipinahayag globally-- 62 00:02:45,859 --> 00:02:47,650 pagpapabalik sa iyo kung ano ito ibig sabihin kapag ipinapahayag namin 63 00:02:47,650 --> 00:02:50,500 isang variable globally kumpara sa local? 64 00:02:50,500 --> 00:02:53,340 Kahit na ipinapahayag namin ang isang variable globally, ano kung mayroong 65 00:02:53,340 --> 00:02:55,500 isa pang function sa ang aming suite ng mga function 66 00:02:55,500 --> 00:02:59,750 na pakikitungo sa pagmamanipula card na hindi sinasadyang pagbabago laki deck, 67 00:02:59,750 --> 00:03:02,727 o ito ay nagdaragdag sa pamamagitan 1 o nababawasan ito ng 1. 68 00:03:02,727 --> 00:03:04,060 Na maaaring spell problema, di ba? 69 00:03:04,060 --> 00:03:08,261 Lalo na kung kami ay pagharap sa isang hanay ng mga baraha kung saan shuffling ang buong deck 70 00:03:08,261 --> 00:03:08,760 ay kinakailangan. 71 00:03:08,760 --> 00:03:12,804 Kung size deck ay nabawasan sa pamamagitan ng 1, halimbawa, sa 51, 72 00:03:12,804 --> 00:03:14,970 hindi kami talaga shuffling lahat ng mga card marahil. 73 00:03:14,970 --> 00:03:16,500 Kami ay umaalis sa isa sa kanila out. 74 00:03:16,500 --> 00:03:21,680 At ang halaga na maaaring marahil ay hinulaang o pinagsamantalahan sa pamamagitan ng isang masamang artista. 75 00:03:21,680 --> 00:03:24,920 >> C nagbibigay ng kung ano ang tinatawag na isang preprocessor directive, na 76 00:03:24,920 --> 00:03:27,764 ay tinatawag ding isang macro para sa paglikha symbolic constants. 77 00:03:27,764 --> 00:03:30,180 At sa katunayan, na sa iyo na nakita ng isang preprocessor directive, 78 00:03:30,180 --> 00:03:32,916 kahit na hindi mo pa naririnig ito tinatawag na may # include. 79 00:03:32,916 --> 00:03:37,150 Ito ay isa pang halimbawa ng isang macro o preprocessor direktiba. 80 00:03:37,150 --> 00:03:41,290 >> Ang paraan upang lumikha ng mga symbolic constants, o pagbibigay ng pangalan sa isang pare-pareho 81 00:03:41,290 --> 00:03:43,740 upang ito ay may higit ibig sabihin, ay ang sumusunod. 82 00:03:43,740 --> 00:03:47,030 # tukuyin, pangalan, kapalit. 83 00:03:47,030 --> 00:03:49,140 Talagang mahalaga muna dito talagang mabilis. 84 00:03:49,140 --> 00:03:54,180 Huwag maglagay ng isang tuldok-kuwit sa sa dulo ng iyong # tinutukoy. 85 00:03:54,180 --> 00:03:57,310 Kaya ito ay ang # tukuyin, pangalan, kapalit. 86 00:03:57,310 --> 00:03:59,540 >> Kapag ang iyong programa ay pinagsama-sama, kung ano talaga ang mangyayari 87 00:03:59,540 --> 00:04:01,740 ay ang compiler kung pagpunta upang pumunta sa pamamagitan ng iyong code 88 00:04:01,740 --> 00:04:06,770 at palitan ang bawat pagkakataon ng ang salitang "pangalan" sa kahit anong ikaw 89 00:04:06,770 --> 00:04:08,860 ilagay bilang kapalit. 90 00:04:08,860 --> 00:04:13,060 Analogously, kung #include ay uri ng mga katulad na pagkopya at pag-paste, 91 00:04:13,060 --> 00:04:15,700 pagkatapos # tukuyin ang uri ng katulad sa hanapin at palitan, 92 00:04:15,700 --> 00:04:19,180 kung ka na ginagamit ang tampok na iyon sa isang word processing program, halimbawa. 93 00:04:19,180 --> 00:04:26,345 >> Kaya halimbawa, kung ako # tukuyin pi bilang 3.14159265, 94 00:04:26,345 --> 00:04:28,720 kung ikaw ay mas mahusay na mathematically hilig at ikaw bigla 95 00:04:28,720 --> 00:04:31,640 makita 3.14159265 paglipad sa paligid sa iyong code, 96 00:04:31,640 --> 00:04:33,517 ikaw ay malamang na malaman ito ay ang pakikipag-usap tungkol sa mga pay. 97 00:04:33,517 --> 00:04:35,850 Ngunit marahil maaari naming bigyan ito ng isang maliit na mas symbolic kahulugan. 98 00:04:35,850 --> 00:04:39,850 At maaari naming halip sabihin #define pi bilang na katiting ng numero 99 00:04:39,850 --> 00:04:42,110 na hindi ako pagpunta sa panatilihin nang paulit-ulit ang pagbabasa. 100 00:04:42,110 --> 00:04:45,560 >> At kung ano ang nangyayari sa mangyayari pagkatapos ay sa itala oras ay kapag ang programa ay 101 00:04:45,560 --> 00:04:48,530 pinagsama-sama, ang unang bagay na ang mangyayari ay ito ay pumunta sa pamamagitan ng 102 00:04:48,530 --> 00:04:51,520 at ito ay palitan sa bawat oras nakikita ito capital P, capital ko, 103 00:04:51,520 --> 00:04:55,610 Makikita ito literal palitan ito 3.14 at iba pa, kaya na kayo 104 00:04:55,610 --> 00:04:58,090 Hindi mo na kailangang i-type ito sa bawat oras habang ang iyong programa pa rin 105 00:04:58,090 --> 00:05:00,631 ay ang pag-andar na iyong asahan, dahil ikaw ay nagtatrabaho 106 00:05:00,631 --> 00:05:05,090 sa pagmamanipula, multiply, paghahati, ano man ito ay sa pamamagitan ng pay. 107 00:05:05,090 --> 00:05:08,230 >> Hindi ka limitado sa mga ito pagpapalit para sa mga numero lamang. 108 00:05:08,230 --> 00:05:12,279 Halimbawa, maaari akong # tukuyin Syempre bilang mga string CS50. 109 00:05:12,279 --> 00:05:14,070 Sa kasong ito, kapag ang programa ay pinagsama-sama, 110 00:05:14,070 --> 00:05:16,236 Makikita # tukuyin pumunta sa pamamagitan ng code, palitan sa bawat oras 111 00:05:16,236 --> 00:05:19,900 nakikita ito "kurso" sa mga string CS50. 112 00:05:19,900 --> 00:05:21,720 >> Mapapansin mo dito rin na madalas ko 113 00:05:21,720 --> 00:05:26,090 # tukuyin ang lahat ng mga tinukoy na aking symbolic constants, kaya na magsalita, 114 00:05:26,090 --> 00:05:28,130 ay palaging sa lahat ng takip. 115 00:05:28,130 --> 00:05:28,960 Ito ay isang convention. 116 00:05:28,960 --> 00:05:30,170 Ito ay hindi kinakailangan. 117 00:05:30,170 --> 00:05:33,900 Ang dahilan dito ay karaniwang mga tao ay gagamit lahat ng capitals kapag sila ay #defining 118 00:05:33,900 --> 00:05:37,590 ay lamang upang gawin itong tunay na malinaw na ito partikular na elemento ng aking code 119 00:05:37,590 --> 00:05:38,820 ay isang tinukoy na pare-pareho. 120 00:05:38,820 --> 00:05:43,730 Kung ito ay lowercase, posible na maaaring ito ay malito sa isang variable. 121 00:05:43,730 --> 00:05:46,120 At iyon ay marahil hindi isang magandang bagay na gawin. 122 00:05:46,120 --> 00:05:48,910 >> Kaya ito partikular na solusyon ay lubhang mas mahusay 123 00:05:48,910 --> 00:05:50,550 kaysa sa alinman sa mga nakaraang mga bago. 124 00:05:50,550 --> 00:05:59,950 Kung ako unang #define size deck 52, pagkatapos ay ngayon ang aking paggamit ng 52, o laki deck dito, 125 00:05:59,950 --> 00:06:01,850 ay mas madaling maunawaan ng maraming at ng maraming mas ligtas. 126 00:06:01,850 --> 00:06:03,280 Hindi mo maaaring manipulahin ang isang pare-pareho. 127 00:06:03,280 --> 00:06:05,259 Hindi mo maaaring sabihin 52 plus plus. 128 00:06:05,259 --> 00:06:06,800 Iyan ay hindi pagpunta sa convert ito sa 53. 129 00:06:06,800 --> 00:06:09,390 Hindi mo maaaring baguhin 52 sa isang bagay. 130 00:06:09,390 --> 00:06:12,470 >> Maaari mong baguhin ang isang variable na ang halaga ay 52, 131 00:06:12,470 --> 00:06:14,870 na kung saan ay ang unang fix namin ay bago. 132 00:06:14,870 --> 00:06:17,000 At maaari mong dagdagan na variable sa 53. 133 00:06:17,000 --> 00:06:21,100 Ngunit hindi ka maaaring sabihin 52 plus plus at Mayroon na biglang i-52 sa 53. 134 00:06:21,100 --> 00:06:23,350 52 ay palaging 52. 135 00:06:23,350 --> 00:06:28,860 At para makita mo na hindi sinasadyang baguhin size deck dito sa pamamagitan ng pagmamanipula ng mga ito, 136 00:06:28,860 --> 00:06:29,940 137 00:06:29,940 --> 00:06:32,390 >> Isa pang magandang side epekto ng ito bagaman ay 138 00:06:32,390 --> 00:06:38,310 na ikaw ay malaman na hindi lahat ng mga bansa sa buong mundo 139 00:06:38,310 --> 00:06:40,690 gumamit ng isang deck ng mga baraha ng laki 52? 140 00:06:40,690 --> 00:06:45,630 Halimbawa, ito ay tunay na karaniwan sa Germany na gumamit ng isang laki deck ng 32, 141 00:06:45,630 --> 00:06:48,020 kung saan sila alisin ang ilang mga ng mas mababang halaga cards. 142 00:06:48,020 --> 00:06:50,960 At sa kasong ito, ako nais na port ng aking suite 143 00:06:50,960 --> 00:06:55,390 ng pag-andar na pakikitungo sa pagmamanipula card sa Germany. 144 00:06:55,390 --> 00:06:59,440 Kaya kong sa unang pagkakataon namin nagpakita, kailangang pumunta at palitan 145 00:06:59,440 --> 00:07:03,570 lahat ng mga pagkakataon ng 52 sa aking code sa 32. 146 00:07:03,570 --> 00:07:07,940 >> Ngunit dito, kung # tukuyin ko laki deck bilang 32 sa pinakatuktok ng aking code, 147 00:07:07,940 --> 00:07:11,730 kung kailangan ko upang baguhin ito, maaari ko pumunta lamang sa at baguhin na ang isang bagay. 148 00:07:11,730 --> 00:07:15,010 Recompile aking code, at lahat ng isang biglaang ito kumakalat sa pamamagitan ng. 149 00:07:15,010 --> 00:07:18,850 Sa katunayan, maaari naming baguhin ang deck sukat sa anumang halaga na gusto namin. 150 00:07:18,850 --> 00:07:22,500 >> Maaari ba akong interes sa iyo sa isang laro ng size deck pickup? 151 00:07:22,500 --> 00:07:23,430 >> Ako Doug Lloyd. 152 00:07:23,430 --> 00:07:25,840 At ito ay CS50. 153 00:07:25,840 --> 00:07:27,772