1 00:00:00,000 --> 00:00:02,350 >> [Гуляе музыка] 2 00:00:02,350 --> 00:00:05,444 3 00:00:05,444 --> 00:00:06,360 Даг Lloyd: Добра. 4 00:00:06,360 --> 00:00:07,770 Выгляд дзіўнай тэмы, праўда? 5 00:00:07,770 --> 00:00:09,050 Магічныя колькасці. 6 00:00:09,050 --> 00:00:12,012 Што ён меў на ўвазе самка, калі ён казаць аб магічных лікаў? 7 00:00:12,012 --> 00:00:14,220 Ну, некаторыя з праграм што мы напісалі ў CS50 8 00:00:14,220 --> 00:00:16,660 да гэтага часу былі некаторыя дзіўныя лік выгляд кінулі ў іх. 9 00:00:16,660 --> 00:00:19,680 Магчыма, па прычынах, мы не цалкам зразумець прама цяпер. 10 00:00:19,680 --> 00:00:23,950 Напрыклад, у задачы Марыё, мы абмежаваны вышыню піраміды на 23. 11 00:00:23,950 --> 00:00:26,880 Мы відавочна кажа вам не можа пайсці вышэй, чым 23. 12 00:00:26,880 --> 00:00:28,702 >> Але што значыць 23? 13 00:00:28,702 --> 00:00:30,410 Ну, калі вы чытаеце спец ўважліва, вы 14 00:00:30,410 --> 00:00:32,493 магчыма, бачылі, што Таму мы абмежаваныя яго на 23 15 00:00:32,493 --> 00:00:36,160 гэта таму, што стандартнай вышыні тэрмінальнага акна 24. 16 00:00:36,160 --> 00:00:38,860 І таму, калі ў нас ёсць Піраміда быць вышэй, чым, што, 17 00:00:38,860 --> 00:00:41,290 гэта можа зрабіць гэтую рэч дзіўны дзе ён працуе з экрана. 18 00:00:41,290 --> 00:00:45,140 І вы ведаеце, што робіць што азначае ў кантэксце, праўда? 19 00:00:45,140 --> 00:00:48,880 >> Ёсць сэнс адразу відаць 23 для каго-небудзь, хто глядзіць на вашай праграме 20 00:00:48,880 --> 00:00:51,550 і, магчыма, мае розныя Памер акно тэрмінала? 21 00:00:51,550 --> 00:00:52,330 Напэўна, не. 22 00:00:52,330 --> 00:00:53,080 Падобна на тое ,, ОК. 23 00:00:53,080 --> 00:00:55,005 Ну, чаму гэта крыху менш за 23? 24 00:00:55,005 --> 00:00:56,880 Увогуле, гэта свайго роду ад шкоднай звычкі на самай справе 25 00:00:56,880 --> 00:00:58,940 напісаць канстанты ў кодзе. 26 00:00:58,940 --> 00:01:02,190 Пры гэтым, калі вы на самой справе напісаць канстанту ў вашым кодзе, 27 00:01:02,190 --> 00:01:05,630 гэта часам называюць выкарыстаннем магічныя колькасці, якія нешта 28 00:01:05,630 --> 00:01:08,030 мы звычайна хочам, каб паспрабаваць пазбегнуць. 29 00:01:08,030 --> 00:01:12,830 >> Напрыклад, давайце зірнем у гэтай простай функцыі тут. 30 00:01:12,830 --> 00:01:15,726 Відавочна, што няма дадзеных увядзіце C называецца карту або палубы. 31 00:01:15,726 --> 00:01:16,600 Так што церпіце мяне. 32 00:01:16,600 --> 00:01:18,910 Гэта крыху псевдокод змешваецца тут. 33 00:01:18,910 --> 00:01:21,050 Гэтая функцыя называецца справа, па-відаць, што карты 34 00:01:21,050 --> 00:01:26,570 бярэ калоду ў якасці параметру, і выведзе мяне адна карта. 35 00:01:26,570 --> 00:01:30,990 >> І я раблю што-то тут, дзе я ёсць цыкл, які праходзіць ад 0 да 52, 36 00:01:30,990 --> 00:01:33,394 і я справу карту. 37 00:01:33,394 --> 00:01:35,310 Ну, у нас ёсць магія Колькасць тут, прама. 38 00:01:35,310 --> 00:01:38,790 Вы бачыце, што магічнае лік? 39 00:01:38,790 --> 00:01:42,280 Ці, што больш важна, ці не так бачыць, што праблема тут? 40 00:01:42,280 --> 00:01:44,310 Асабліва, калі гэта проста адна функцыя 41 00:01:44,310 --> 00:01:48,030 у сваім уласным файле ў Тэчка, якая змяшчае 42 00:01:48,030 --> 00:01:49,970 кучу розных Файлы, кожны з якіх 43 00:01:49,970 --> 00:01:51,670 робіць яшчэ адну рэч, каб калода карт. 44 00:01:51,670 --> 00:01:57,310 Можа быць, гэта змешвае іх, ці наносіць руку з пяці карт замест адной карце. 45 00:01:57,310 --> 00:01:59,420 >> Вы бачыце, што ў Праблема можа быць тут? 46 00:01:59,420 --> 00:02:03,220 Вы бачыце магічнае лік Я ўводзіцца ў кодзе? 47 00:02:03,220 --> 00:02:04,390 Гэта 52, правільна. 48 00:02:04,390 --> 00:02:06,440 >> Маўляў, інтуітыўна вы, напэўна, ведаеце, добра. 49 00:02:06,440 --> 00:02:09,740 Як стандартнай калодай з карты змяшчае 52 карт. 50 00:02:09,740 --> 00:02:12,570 Але ў нашай праграме, то гэта проста выгляд плаваюць вакол там. 51 00:02:12,570 --> 00:02:15,280 Гэта як раптам ёсць 52. 52 00:02:15,280 --> 00:02:18,290 >> Адзін са спосабаў вырашыць гэтую праблему Праблема ў тым, каб зрабіць гэта. 53 00:02:18,290 --> 00:02:22,724 Мы вельмі відавочна Цяпер заклікаючы памер палубе 52. 54 00:02:22,724 --> 00:02:25,390 Гэта дае яму крыху больш зразумелым гэта азначае, калі ў цыкл 55 00:02:25,390 --> 00:02:28,650 пазней мы тады сказаць, я менш, чым памер палубы. 56 00:02:28,650 --> 00:02:32,666 Гэта толькі здаецца, лепш, чым кажу 52. 57 00:02:32,666 --> 00:02:34,290 Зараз гэта на самай справе вырашыць праблему. 58 00:02:34,290 --> 00:02:38,460 Гэта дае некаторы сімвалічнае сэнс канстанты. 59 00:02:38,460 --> 00:02:40,820 Але гэта на самай справе свайго роду ўвесці яшчэ адну праблему 60 00:02:40,820 --> 00:02:43,770 якія не могуць быць адразу. 61 00:02:43,770 --> 00:02:45,859 Нават калі гэтая пераменная абвешчаны globally-- 62 00:02:45,859 --> 00:02:47,650 вы можаце ўспомніць, што гэта значыць, калі мы заяўляем, 63 00:02:47,650 --> 00:02:50,500 пераменная глабальна супраць лакальна? 64 00:02:50,500 --> 00:02:53,340 Нават калі мы аб'яўляем зменную ў глабальным маштабе, што, калі ёсць 65 00:02:53,340 --> 00:02:55,500 іншая функцыя ў наш набор функцый 66 00:02:55,500 --> 00:02:59,750 што здзелка з маніпуляцыяй карты што міжволі змяняе памер палубы, 67 00:02:59,750 --> 00:03:02,727 або павялічвае яго 1 або памяншае яго на 1. 68 00:03:02,727 --> 00:03:04,060 Гэта можа азначаць праблемы, дакладна? 69 00:03:04,060 --> 00:03:08,261 Асабліва, калі мы маем справу з наборам карт, дзе ператасоўкі калоды поўную 70 00:03:08,261 --> 00:03:08,760 патрабуецца. 71 00:03:08,760 --> 00:03:12,804 Калі памер палубы памяншаецца на 1, напрыклад, да 51, 72 00:03:12,804 --> 00:03:14,970 мы на самай справе не шоргаючы усе карты магчыма. 73 00:03:14,970 --> 00:03:16,500 Мы выязджаем аднаго з іх. 74 00:03:16,500 --> 00:03:21,680 І, што значэнне можа быць, магчыма, або прадказаць эксплуатуюцца дрэнны акцёр. 75 00:03:21,680 --> 00:03:24,920 >> З забяспечвае тое, што называецца Дырэктыва препроцессора, якія 76 00:03:24,920 --> 00:03:27,764 таксама называецца макрас стварэнне сімвалічных канстант. 77 00:03:27,764 --> 00:03:30,180 І на самай справе, вы ўжо бачыў дырэктыву препроцессора, 78 00:03:30,180 --> 00:03:32,916 нават калі вы яшчэ не чулі яго назваць тое, што з #include. 79 00:03:32,916 --> 00:03:37,150 Гэта яшчэ адзін прыклад макраса ці дырэктыва препроцессора. 80 00:03:37,150 --> 00:03:41,290 >> Спосаб стварэння сімвалічныя канстанты, ці даваць імя да пастаяннай 81 00:03:41,290 --> 00:03:43,740 такім чынам, што яна мае больш азначае, складаецца ў наступным. 82 00:03:43,740 --> 00:03:47,030 #define, імя, замена. 83 00:03:47,030 --> 00:03:49,140 Сапраўды важна бок тут вельмі хутка. 84 00:03:49,140 --> 00:03:54,180 Не стаўце кропку з коскі ў канец вашых #defines. 85 00:03:54,180 --> 00:03:57,310 Так што гэта #define, імя, замена. 86 00:03:57,310 --> 00:03:59,540 >> Калі ваша праграма складзена, тое, што адбываецца на самай справе 87 00:03:59,540 --> 00:04:01,740 гэта кампілятар, калі адбываецца прайсці праз код 88 00:04:01,740 --> 00:04:06,770 і замяніць кожны асобнік слова "імя" з тым, што вы 89 00:04:06,770 --> 00:04:08,860 змясціць у якасці замены. 90 00:04:08,860 --> 00:04:13,060 Аналагічна, калі #include з'яўляецца свайго роду з падобна на капіяванне і ўстаўка, 91 00:04:13,060 --> 00:04:15,700 Затым #define з'яўляецца свайго роду падобна, каб знайсці і замяніць, 92 00:04:15,700 --> 00:04:19,180 калі вы калі-небудзь выкарыстоўвалі гэтую функцыю ў праграма для апрацоўкі тэксту, напрыклад. 93 00:04:19,180 --> 00:04:26,345 >> Так, напрыклад, калі #define PI 3.14159265, як, 94 00:04:26,345 --> 00:04:28,720 калі вы лепш матэматычна нахільных і вы раптам 95 00:04:28,720 --> 00:04:31,640 см 3.14159265 палёт вакол у кодзе, 96 00:04:31,640 --> 00:04:33,517 Вы, верагодна, ведаеце, што гэта гаворыць пра пі. 97 00:04:33,517 --> 00:04:35,850 Але, можа быць, мы можам даць яму трохі больш сімвалічнае значэнне. 98 00:04:35,850 --> 00:04:39,850 І мы можам сказаць, замест #define пі як тое рот лікаў 99 00:04:39,850 --> 00:04:42,110 што я не збіраюся трымаць чытаць зноў і зноў. 100 00:04:42,110 --> 00:04:45,560 >> І тое, што адбудзецца потым на Час кампіляцыі, калі праграма 101 00:04:45,560 --> 00:04:48,530 складзены, першае, што адбудзецца гэта будзе праходзіць праз 102 00:04:48,530 --> 00:04:51,520 і ён будзе замяніць кожны раз, ён бачыць капіталу P, капітал I, 103 00:04:51,520 --> 00:04:55,610 гэта будзе літаральна замяніць яго 3,14 і гэтак далей, так што вы 104 00:04:55,610 --> 00:04:58,090 не трэба ўводзіць кожны час, пакуль ваша праграма яшчэ 105 00:04:58,090 --> 00:05:00,631 мае функцыянальныя магчымасці, якія вам чакаць, таму што вы працуеце 106 00:05:00,631 --> 00:05:05,090 з маніпулявання, множанне, дзялення, тое, што гэта па пі. 107 00:05:05,090 --> 00:05:08,230 >> Вы не абмяжоўваецца гэтым замена толькі лічбаў. 108 00:05:08,230 --> 00:05:12,279 Напрыклад, я мог бы #define Вядома, як струны CS50. 109 00:05:12,279 --> 00:05:14,070 У гэтым выпадку, калі Праграма складзена, 110 00:05:14,070 --> 00:05:16,236 #define пойдзе праз Код, замяніць кожны раз, 111 00:05:16,236 --> 00:05:19,900 ён бачыць «курс» са струнным CS50. 112 00:05:19,900 --> 00:05:21,720 >> Вы заўважыце, тут І што я часта 113 00:05:21,720 --> 00:05:26,090 #define ўсе мае вызначаецца сімвалічным пастаянныя, так бы мовіць, 114 00:05:26,090 --> 00:05:28,130 заўсёды ва ўсіх накрывак. 115 00:05:28,130 --> 00:05:28,960 Гэта пагадненне. 116 00:05:28,960 --> 00:05:30,170 Гэта не абавязкова. 117 00:05:30,170 --> 00:05:33,900 Прычына, як правіла людзі будуць выкарыстоўваць усе капіталы, калі яны #defining 118 00:05:33,900 --> 00:05:37,590 проста каб зрабіць яго сапраўды ясна, што менавіта гэты элемент майго кода 119 00:05:37,590 --> 00:05:38,820 гэта пэўная канстанта. 120 00:05:38,820 --> 00:05:43,730 Калі б гэта было ў ніжнім рэгістры, то, магчыма, гэта можа быць блытаць з зменнай. 121 00:05:43,730 --> 00:05:46,120 І гэта, напэўна, не вельмі добрая рэч, каб зрабіць. 122 00:05:46,120 --> 00:05:48,910 >> Так што гэта асабліва Раствор нашмат лепш 123 00:05:48,910 --> 00:05:50,550 чым любы з папярэдніх. 124 00:05:50,550 --> 00:05:59,950 Калі я ўпершыню #define памер калода з 52, то Цяпер я выкарыстоўваю 52, або памер палубы тут, 125 00:05:59,950 --> 00:06:01,850 з'яўляецца значна больш інтуітыўным і нашмат бяспечней. 126 00:06:01,850 --> 00:06:03,280 Вы не можаце маніпуляваць канстанту. 127 00:06:03,280 --> 00:06:05,259 Вы не можаце сказаць, 52 плюс плюс. 128 00:06:05,259 --> 00:06:06,800 Гэта не збіраецца пераўтварыць яго ў 53. 129 00:06:06,800 --> 00:06:09,390 Вы не можаце змяніць што-то 52. 130 00:06:09,390 --> 00:06:12,470 >> Вы можаце змяніць зменную значэнне якога складае 52, 131 00:06:12,470 --> 00:06:14,870 які быў першым выпраўленне было раней. 132 00:06:14,870 --> 00:06:17,000 І вы маглі б павялічыць пераменная 53. 133 00:06:17,000 --> 00:06:21,100 Але вы не можаце сказаць, 52 плюс плюс і ёсць, што раптам ператварыць 52 у 53. 134 00:06:21,100 --> 00:06:23,350 52 заўсёды 52. 135 00:06:23,350 --> 00:06:28,860 І таму вы не можаце змяніць выпадкова Памер палубы тут, маніпулюючы яго, 136 00:06:28,860 --> 00:06:29,940 137 00:06:29,940 --> 00:06:32,390 >> Яшчэ адзін добры бок Эфект гэтага, хоць гэта 138 00:06:32,390 --> 00:06:38,310 што вы на ўвазе, што не усе краіны свету 139 00:06:38,310 --> 00:06:40,690 выкарыстоўваць калоду карт памерам 52? 140 00:06:40,690 --> 00:06:45,630 Напрыклад, гэта сапраўды распаўсюджана ў Германія выкарыстоўваць памер палубы 32, 141 00:06:45,630 --> 00:06:48,020 дзе яны выразаць некаторыя ніжніх значэнняў карт. 142 00:06:48,020 --> 00:06:50,960 І ў гэтым выпадку, я хацеў порце мая ванная 143 00:06:50,960 --> 00:06:55,390 функцый, якія маюць справу з маніпуляцыі з картамі Германіі. 144 00:06:55,390 --> 00:06:59,440 Я мог у першую чаргу мы паказалі, трэба ісці і замяніць 145 00:06:59,440 --> 00:07:03,570 усе асобнікі 52 у маім кодзе з 32. 146 00:07:03,570 --> 00:07:07,940 >> Але вось, калі б я #define памер палубы а 32 на самым версе майго кода, 147 00:07:07,940 --> 00:07:11,730 калі мне трэба, каб змяніць яго, я магу проста пайсці і змяніць нешта адно. 148 00:07:11,730 --> 00:07:15,010 Перакампіляваць код, і ўсё Раптам ён распаўсюджваецца праз. 149 00:07:15,010 --> 00:07:18,850 На самай справе, мы можам змяніць калоду Памер любы значэнне мы хочам. 150 00:07:18,850 --> 00:07:22,500 >> Ці магу я зацікавіць Вас у Гульня памеру палубе пікап? 151 00:07:22,500 --> 00:07:23,430 >> Я Дуг Лойд. 152 00:07:23,430 --> 00:07:25,840 І гэта CS50. 153 00:07:25,840 --> 00:07:27,772