1 00:00:00,000 --> 00:00:03,000 [Powered by Google Translate] [4-я тыдзень] 2 00:00:03,000 --> 00:00:05,000 [David J. малая] [Harvard University] 3 00:00:05,000 --> 00:00:08,000 [Гэта CS50.] [CS50.TV] 4 00:00:08,000 --> 00:00:12,000 >> Усё правільна, гэта CS50, і гэта пачатак тыдня 4, 5 00:00:12,000 --> 00:00:16,000 і гэта адна з самых павольных магчымыя алгарытмы сартавання. 6 00:00:16,000 --> 00:00:19,000 Які гэта быў, што мы проста глядзелі туды? 7 00:00:19,000 --> 00:00:24,000 Гэта было пузырьковый сартавання, для таго, вялікая O (N ^ 2) + сума, 8 00:00:24,000 --> 00:00:28,000 ды і мы не адзіныя ў гэтым свеце, каб, здаецца, ведаюць 9 00:00:28,000 --> 00:00:30,000 што бурбалка сартавання або час яго працы. 10 00:00:30,000 --> 00:00:33,000 Сапраўды, гэта было інтэрв'ю з Эрыкам Шмітам з Google 11 00:00:33,000 --> 00:00:45,000 і былы сенатар Барак Абама ўсяго толькі некалькі гадоў таму. 12 00:00:45,000 --> 00:00:48,000 >> Цяпер, сенатар, вы тут, у Google, 13 00:00:48,000 --> 00:00:54,000 і мне падабаецца думаць прэзідэнцтва, як сумоўе. 14 00:00:54,000 --> 00:00:58,000 Цяпер, цяжка ўладкавацца на працу ў якасці прэзідэнта, і вы збіраецеся праз суровыя цяпер. 15 00:00:58,000 --> 00:01:00,000 Гэта таксама цяжка ўладкавацца на працу ў Google. 16 00:01:00,000 --> 00:01:05,000 У нас ёсць пытанні, і мы просім нашых кандыдатаў пытанні, 17 00:01:05,000 --> 00:01:10,000 і гэта адна з Лары Швімэр. 18 00:01:10,000 --> 00:01:14,000 Вы, хлопцы, думаеце, я жартую? Гэта прама тут. 19 00:01:14,000 --> 00:01:18,000 Які самы эфектыўны спосаб сартавання мільёнаў 32-разрадных цэлых лікаў? 20 00:01:18,000 --> 00:01:21,000 [Смех] 21 00:01:21,000 --> 00:01:24,000 Ну- 22 00:01:24,000 --> 00:01:26,000 Мне вельмі шкада. >> Не, не, не, не. 23 00:01:26,000 --> 00:01:34,000 Я думаю, што пузырьковый сартавання б няправільны шлях. 24 00:01:34,000 --> 00:01:39,000 >> Ну, хто сказаў яму пра гэта? 25 00:01:39,000 --> 00:01:43,000 На мінулым тыдні памятаеце, мы ўзялі перапынак з кодам, па меншай меры, на адзін дзень, 26 00:01:43,000 --> 00:01:46,000 і пачаў упорам на больш высокім узроўні ідэй і вырашэння праблем у больш агульным 27 00:01:46,000 --> 00:01:49,000 ў кантэксце пошуку і сартаванні, 28 00:01:49,000 --> 00:01:53,000 і мы ўвялі тое, што мы не пляскаць гэтае імя на мінулым тыдні, 29 00:01:53,000 --> 00:01:56,000 але асімптатычнай абазначэння, Big O, Вялікі Omega, 30 00:01:56,000 --> 00:02:00,000 , А часам і большую абазначэння Theta, і яны былі проста спосабы 31 00:02:00,000 --> 00:02:02,000 апісання часу працы алгарытмаў, 32 00:02:02,000 --> 00:02:05,000 Колькі часу патрабуецца для алгарытму для запуску. 33 00:02:05,000 --> 00:02:08,000 >> А вы памятаеце, што вы казалі пра час працы з пункту гледжання памеру 34 00:02:08,000 --> 00:02:11,000 на ўваходзе, які мы звычайна называем п, што праблема можа быць, 35 00:02:11,000 --> 00:02:13,000 дзе п-колькасць людзей у пакоі, 36 00:02:13,000 --> 00:02:17,000 Колькасць старонак у тэлефоннай кнізе, і мы пачалі пісаць рэчы 37 00:02:17,000 --> 00:02:21,000 як O (N ^ 2) ці O (п) або O (п § п), 38 00:02:21,000 --> 00:02:24,000 і нават калі матэматыка не зусім выпрацаваць так выдатна 39 00:02:24,000 --> 00:02:28,000 і гэта быў п ² - п / 2 ці нешта накшталт таго 40 00:02:28,000 --> 00:02:31,000 замест гэтага мы будзем проста выкінуць некаторыя з малодшых членаў, 41 00:02:31,000 --> 00:02:34,000 і матывацыя ёсць тое, што мы сапраўды хочам 42 00:02:34,000 --> 00:02:37,000 роду аб'ектыўны спосаб ацэнкі 43 00:02:37,000 --> 00:02:39,000 выкананне праграмы або выкананне алгарытмаў 44 00:02:39,000 --> 00:02:42,000 што ў канцы дня не мае нічога агульнага, напрыклад, 45 00:02:42,000 --> 00:02:45,000 з хуткасцю кампутара сёння. 46 00:02:45,000 --> 00:02:47,000 >> Напрыклад, калі вы рэалізуеце пузырьковый сартавання, 47 00:02:47,000 --> 00:02:50,000 ці вы рэалізуеце сартавання зліццём ці выбар роду на кампутары сённяшнім 48 00:02:50,000 --> 00:02:53,000 2 Ггц кампутар, і вы запусціце яго, 49 00:02:53,000 --> 00:02:56,000 і гэта займае некаторы колькасць секунд, у наступным годзе ёсць 3 Ггц 50 00:02:56,000 --> 00:02:59,000 або 4 Ггц кампутар, і вы маглі б тады сцвярджаць, што "Ух ты, мой алгарытм 51 00:02:59,000 --> 00:03:03,000 Цяпер у два разы хутчэй ", калі на самай справе гэта, відавочна, не так. 52 00:03:03,000 --> 00:03:06,000 Гэта проста апаратныя атрымала хутчэй, але кампутар 53 00:03:06,000 --> 00:03:10,000 не, і таму мы сапраўды хочам, каб выкінуць рэчы, як 54 00:03:10,000 --> 00:03:13,000 кратныя 2 або кратных 3, калі справа даходзіць да апісання 55 00:03:13,000 --> 00:03:17,000 як хутка або як павольна алгарытм і сапраўды проста засяродзіцца 56 00:03:17,000 --> 00:03:20,000 на п або некаторы фактар ​​іх, 57 00:03:20,000 --> 00:03:24,000 некаторыя сілы яго, як у выпадку з відамі на мінулым тыдні. 58 00:03:24,000 --> 00:03:27,000 І нагадаем, што з дапамогай сартавання зліццём 59 00:03:27,000 --> 00:03:31,000 мы былі ў стане зрабіць гэта значна лепш, чым пузырьковый сартавання і выбару роду 60 00:03:31,000 --> 00:03:33,000 і нават уставак. 61 00:03:33,000 --> 00:03:36,000 >> Мы прыступілі да п § п, і зноў, 62 00:03:36,000 --> 00:03:39,000 Нагадаем, што часопіс п як правіла, адносіцца да таго, што расце 63 00:03:39,000 --> 00:03:43,000 павольней, чым я, так што п § п да гэтага часу было добра 64 00:03:43,000 --> 00:03:45,000 таму што гэта было менш, чым ² н. 65 00:03:45,000 --> 00:03:47,000 Але для дасягнення п п ўвайсці з сартавання зліццём 66 00:03:47,000 --> 00:03:51,000 тое, што было асноўнай парастак ідэя, што мы павінны былі выкарыстаць 67 00:03:51,000 --> 00:03:54,000 што мы таксама выкарыстала яшчэ ў тыдні 0? 68 00:03:54,000 --> 00:03:58,000 Як мы будзем вырашаць задачы сартавання разумна з сартавання зліццём? 69 00:03:58,000 --> 00:04:04,000 Што было ключавым разуменнем, ці што? 70 00:04:04,000 --> 00:04:07,000 Любы наогул. 71 00:04:07,000 --> 00:04:09,000 Добра, давайце зробім крок назад. 72 00:04:09,000 --> 00:04:11,000 Апішыце сартавання зліццём у свае словы. 73 00:04:11,000 --> 00:04:15,000 Як гэта працуе? 74 00:04:15,000 --> 00:04:17,000 Добра, мы будзем веславаць назад у тыдзень 0. 75 00:04:17,000 --> 00:04:19,000 Добра, так. 76 00:04:19,000 --> 00:04:22,000 [Неразборліва-студэнт] 77 00:04:22,000 --> 00:04:26,000 Добра, добра, так што мы падзялілі масіў лікаў на 2 часткі. 78 00:04:26,000 --> 00:04:29,000 Мы адсартаваныя кожнай з гэтых частак, і тады мы аб'ядналі іх, 79 00:04:29,000 --> 00:04:33,000 і мы бачылі гэтую ідэю да прыняцця Праблема вось гэтая вялікая 80 00:04:33,000 --> 00:04:36,000 і драбненне яго ў праблему, вось гэтая вялікая ці гэта вялікае. 81 00:04:36,000 --> 00:04:38,000 >> Нагадаем, напрыклад, тэлефонную кнігу. 82 00:04:38,000 --> 00:04:42,000 Нагадаем, самастойнага падліку алгарытм з тыдні таму, 83 00:04:42,000 --> 00:04:45,000 так сартавання зліццём былі падведзены вынікі гэтага псевдокод тут. 84 00:04:45,000 --> 00:04:48,000 Калі вам даюць п элементаў, спачатку гэта была праверка спраўнасці. 85 00:04:48,000 --> 00:04:51,000 Калі п <2, то нічога не робім на ўсіх 86 00:04:51,000 --> 00:04:55,000 таму што, калі п <2, то п, відавочна, 0 або 1, 87 00:04:55,000 --> 00:04:57,000 і таму, калі гэта 0 або 1 няма нічога, каб адсартаваць. 88 00:04:57,000 --> 00:04:59,000 Вы зрабілі. 89 00:04:59,000 --> 00:05:01,000 Ваш спіс ужо трывіяльна адсартаваныя. 90 00:05:01,000 --> 00:05:04,000 Але ў адваротным выпадку, калі ў вас ёсць 2 або больш элементаў, ісці наперад і падзяліць іх 91 00:05:04,000 --> 00:05:06,000 на 2 паловы, злева і справа. 92 00:05:06,000 --> 00:05:09,000 Сартаванне кожнай з гэтых палоў, а затым аб'яднаць адсартаваныя паловы. 93 00:05:09,000 --> 00:05:13,000 Але праблема тут у тым, што на першы погляд гэта выглядае, як быццам мы понтировавшего. 94 00:05:13,000 --> 00:05:17,000 Гэта кругавая вызначэння у тым, што, калі я папрасіў вас разабрацца гэтых п элементаў 95 00:05:17,000 --> 00:05:22,000 і ты кажаш мне "Добра, добра, мы разбярэмся тых, п / 2 і тых, п / 2 элементаў" 96 00:05:22,000 --> 00:05:27,000 Затым мой наступны пытанне будзе "Добра, як вы сартаваць п / 2 элементаў?" 97 00:05:27,000 --> 00:05:30,000 >> Але з-за структуры гэтай праграмы, 98 00:05:30,000 --> 00:05:33,000 таму што гэта базавы варыянт, так бы мовіць, 99 00:05:33,000 --> 00:05:39,000 гэта асаблівы выпадак, які кажа, што калі п <некаторы фіксаванае значэнне, як 2 вяртанне неадкладна. 100 00:05:39,000 --> 00:05:42,000 Не адказваць з той жа кругавой адказ. 101 00:05:42,000 --> 00:05:46,000 Гэты працэс, гэтая цыклічнасць у канчатковым рахунку скончыцца. 102 00:05:46,000 --> 00:05:50,000 Калі я спытаюся ў цябе "Сартаванне гэтых п элементаў", і вы кажаце: "Добра, адсартаваць п / 2" 103 00:05:50,000 --> 00:05:53,000 Затым вы кажаце: "Добра, род гэтых п / 4, п / 8, n/16" 104 00:05:53,000 --> 00:05:56,000 у канчатковым выніку вы будзеце дзяліць на досыць вялікая колькасць 105 00:05:56,000 --> 00:05:59,000 што вы будзеце мець толькі 1 элемент налева, і ў гэты момант можна сказаць, 106 00:05:59,000 --> 00:06:02,000 "Вось, вось адсартаваныя аднаго элемента." 107 00:06:02,000 --> 00:06:06,000 Тады бляск гэтага алгарытму тут з'яўляецца вывад з таго факту, 108 00:06:06,000 --> 00:06:09,000 што, як толькі ў Вас ёсць усе гэтыя адсартаваны спісы, 109 00:06:09,000 --> 00:06:12,000 усе з якіх маюць памер 1, які, здаецца, бескарысна, 110 00:06:12,000 --> 00:06:15,000 як толькі вы пачынаеце іх зліццё і аб'яднанне іх 111 00:06:15,000 --> 00:06:19,000 Вы сформируете, нарэшце, як Роб зрабіў у відэа, нарэшце, адсартаваны спіс. 112 00:06:19,000 --> 00:06:22,000 >> Але гэтая ідэя выходзіць далёка за рамкі сартавання. 113 00:06:22,000 --> 00:06:26,000 Існуе гэтая ідэя убудаваных у гэтую праграму вядомы як рэкурсіі, 114 00:06:26,000 --> 00:06:29,000 Ідэя, у якім вы знаходзіцеся праграмы, 115 00:06:29,000 --> 00:06:32,000 і вырашыць некаторыя праблемы, вы называеце сябе, 116 00:06:32,000 --> 00:06:36,000 або пакласці ў кантэксце моў праграмавання вы знаходзіцеся функцыі, 117 00:06:36,000 --> 00:06:39,000 і для таго, каб вырашыць праблему, вы называеце сябе функцыі 118 00:06:39,000 --> 00:06:42,000 зноў і зноў, і зноў, але вам функцыю 119 00:06:42,000 --> 00:06:44,000 не можа называць сябе бясконца шмат разоў. 120 00:06:44,000 --> 00:06:47,000 У рэшце рэшт вы павінны дна, так бы мовіць, 121 00:06:47,000 --> 00:06:49,000 і ёсць жорстка базы ўмове, што кажа 122 00:06:49,000 --> 00:06:53,000 у гэты момант спыніць называць сябе так, што ўвесь працэс 123 00:06:53,000 --> 00:06:56,000 Нарэшце, на справе спыніць. 124 00:06:56,000 --> 00:06:58,000 Што гэта сапраўды азначае, рэкурсіўна? 125 00:06:58,000 --> 00:07:01,000 >> Давайце паглядзім, калі мы можам зрабіць просты, банальны прыклад, скажам, 126 00:07:01,000 --> 00:07:03,000 3 чалавекі са мной тут, на сцэне, калі хтосьці гэта зручна. 127 00:07:03,000 --> 00:07:06,000 1, давай ўверх, 2 і 3. 128 00:07:06,000 --> 00:07:09,000 Калі вам 3 хочуць прыехаць сюды. 129 00:07:09,000 --> 00:07:12,000 Калі вы жадаеце стаяць побач са мной тут, у лінію, выкажам здагадку, што праблема пад рукой 130 00:07:12,000 --> 00:07:15,000 вельмі трывіяльна падлічыць колькасць людзей, якія знаходзяцца тут. 131 00:07:15,000 --> 00:07:18,000 Але, шчыра кажучы, я стаміўся ад усіх гэтых падліку прыкладаў. 132 00:07:18,000 --> 00:07:21,000 Гэта зойме некаторы час, 1, 2, і кропка, кропка, кропка. 133 00:07:21,000 --> 00:07:23,000 Гэта будзе доўжыцца вечна. 134 00:07:23,000 --> 00:07:25,000 Я б аддаў перавагу проста Пунт гэтай праблемы ў цэлым з дапамогай, як цябе завуць? 135 00:07:25,000 --> 00:07:27,000 Сара. >> Сара, усё ў парадку. 136 00:07:27,000 --> 00:07:29,000 Кэлі. >> Кэлі і? 137 00:07:29,000 --> 00:07:31,000 >> Вілі. >> Вілі, Сара, Кэлі, і Вілі. 138 00:07:31,000 --> 00:07:34,000 Зараз я задаў пытанне хтосьці 139 00:07:34,000 --> 00:07:37,000 колькі людзей на гэтым этапе, і я паняцця не маю. 140 00:07:37,000 --> 00:07:40,000 Гэта вельмі доўгі спіс, і таму замест гэтага я буду рабіць гэты трук. 141 00:07:40,000 --> 00:07:43,000 Я збіраюся папрасіць чалавека побач са мной, каб зрабіць вялікую частку працы, 142 00:07:43,000 --> 00:07:46,000 і як толькі яна робіцца робяць вялікую частку працы 143 00:07:46,000 --> 00:07:49,000 Я збіраюся зрабіць найменшую колькасць работ можна і проста дадаць 1 144 00:07:49,000 --> 00:07:51,000 да таго, што яе адказ, так што тут мы ідзем. 145 00:07:51,000 --> 00:07:54,000 Я спытаў, як шмат людзей на сцэне. 146 00:07:54,000 --> 00:07:57,000 Колькі чалавек на сцэну, каб злева ад вас? 147 00:07:57,000 --> 00:08:00,000 Злева ад мяне? >> Добра, але не падманваюць. 148 00:08:00,000 --> 00:08:04,000 Гэта добра, гэта правільна, але калі мы хочам працягнуць гэтую логіку 149 00:08:04,000 --> 00:08:08,000 Давайце выкажам здагадку, што вы так жа хочаце, каб выбіваць з рук гэтую праблему злева ад вас, 150 00:08:08,000 --> 00:08:11,000 Такім чынам, замест адказу напрамую ісці наперад і проста звальваць. 151 00:08:11,000 --> 00:08:14,000 Ах, як шмат людзей знаходзяцца злева ад мяне? 152 00:08:14,000 --> 00:08:16,000 Колькі людзей налева? 153 00:08:16,000 --> 00:08:18,000 1. 154 00:08:18,000 --> 00:08:27,000 [Смех] 155 00:08:27,000 --> 00:08:30,000 Такім чынам, 0, так што зараз Вілі зрабіў 156 00:08:30,000 --> 00:08:33,000 гэта ты вярнуўся ваш адказ гэтым кірунку кажучы 0. 157 00:08:33,000 --> 00:08:36,000 Такім чынам, што вы павінны зрабіць? >> 1. 158 00:08:36,000 --> 00:08:39,000 Такім чынам, вы 1, так вы кажаце: "Добра, я збіраюся дадаць 1 159 00:08:39,000 --> 00:08:41,000 да таго, што колькасць Вілі было ", так што 1 + 0. 160 00:08:41,000 --> 00:08:43,000 Вы цяпер 1 так што ваш адказ на правым цяпер 161 00:08:43,000 --> 00:08:45,000 1. >> А мая будзе 2. 162 00:08:45,000 --> 00:08:48,000 Добра, так вы прымаеце папярэдні адказ 1, 163 00:08:48,000 --> 00:08:51,000 дадаўшы мінімальнае колькасць працы, якую вы хочаце зрабіць, што з'яўляецца +1. 164 00:08:51,000 --> 00:08:55,000 Зараз у вас ёсць 2, а затым вы перадаць мне, якое значэнне? 165 00:08:55,000 --> 00:08:57,000 3, я маю на ўвазе, прабачце, 2. 166 00:08:57,000 --> 00:08:59,000 Добра. 167 00:08:59,000 --> 00:09:02,000 >> Ну, у нас было ад 0 да левага. 168 00:09:02,000 --> 00:09:05,000 Тады ў нас была 1, а затым мы дадаем 2, 169 00:09:05,000 --> 00:09:07,000 і зараз вы уручаючы мне нумар 2, 170 00:09:07,000 --> 00:09:10,000 і таму я кажу, добра, +1, 3. 171 00:09:10,000 --> 00:09:13,000 Там на самай справе 3 чалавек стаяў побач са мной на гэтай сцэне, 172 00:09:13,000 --> 00:09:16,000 такім чынам, мы маглі б, відавочна, зрабіў гэта вельмі лінейна, 173 00:09:16,000 --> 00:09:19,000 вельмі відавочным чынам, але што мы сапраўды робім? 174 00:09:19,000 --> 00:09:21,000 Мы ўзялі праблеме памерам 3 на пачатковым этапе. 175 00:09:21,000 --> 00:09:24,000 Затым мы зламалі яго на праблеме памер 2, 176 00:09:24,000 --> 00:09:27,000 Затым праблема памер 1, і, нарэшце, базавы сцэнар 177 00:09:27,000 --> 00:09:29,000 сапраўды, ой, там нікога няма, 178 00:09:29,000 --> 00:09:33,000 у гэты момант Вілі вярнуўся эфектыўна жорстка адказаць пару разоў, 179 00:09:33,000 --> 00:09:36,000 , А другі затым прапускаюць да бурбалкамі, уверх, уверх бурбалкамі, 180 00:09:36,000 --> 00:09:39,000 , А затым, дадаўшы ў гэты дадатковы 1 181 00:09:39,000 --> 00:09:41,000 мы рэалізавалі гэтую асноўную ідэю рэкурсіі. 182 00:09:41,000 --> 00:09:44,000 >> Зараз, у дадзеным выпадку гэта сапраўды не вырашыць праблему 183 00:09:44,000 --> 00:09:46,000 любы больш эфектыўна тое, што мы бачылі да гэтага часу. 184 00:09:46,000 --> 00:09:48,000 Але думаць аб алгарытмах мы зрабілі на сцэне да гэтага часу. 185 00:09:48,000 --> 00:09:51,000 У нас было 8 лістоў паперы на дошцы, 186 00:09:51,000 --> 00:09:55,000 на відэа, калі Шон шукаў нумар 7, і што ён рэальна зрабіць? 187 00:09:55,000 --> 00:09:58,000 Ну, ён не рабіў любыя падзяляй і ўладар. 188 00:09:58,000 --> 00:10:01,000 Ён не зрабіў любой рэкурсіі. 189 00:10:01,000 --> 00:10:03,000 Хутчэй, ён проста зрабіў гэта лінейны алгарытм. 190 00:10:03,000 --> 00:10:07,000 Але калі мы прапанавалі ідэю адсартаваныя нумары на сцэне жывуць на мінулым тыдні 191 00:10:07,000 --> 00:10:09,000 Затым у нас быў гэты інстынкт збіраецца да сярэдзіны, 192 00:10:09,000 --> 00:10:13,000 у гэты момант у нас было менш спісе памеры 4 ці іншы спіс памеры 4, 193 00:10:13,000 --> 00:10:17,000 а потым у нас была дакладна такая ж праблема, таму мы паўтарылі, паўтараецца, паўтараецца. 194 00:10:17,000 --> 00:10:19,000 Іншымі словамі, мы Рэкурсія. 195 00:10:19,000 --> 00:10:24,000 Вялікі дзякуй нашаму 3 добраахвотнікаў тут для дэманстрацыі рэкурсіі з намі. 196 00:10:24,000 --> 00:10:28,000 >> Давайце паглядзім, калі мы не можам зрабіць гэтага зараз крыху больш канкрэтным, 197 00:10:28,000 --> 00:10:30,000 вырашэння праблемы, што зноў мы маглі б зрабіць даволі лёгка, 198 00:10:30,000 --> 00:10:34,000 але мы будзем выкарыстоўваць яго як трамплін для ажыццяўлення гэтай асноўнай ідэі. 199 00:10:34,000 --> 00:10:37,000 Калі я хачу, каб вылічыць сумаваннем кучу лічбаў, 200 00:10:37,000 --> 00:10:39,000 Напрыклад, калі вы праходзіце ў лік 3, 201 00:10:39,000 --> 00:10:42,000 Я хачу даць вам значэнне сігма-3, 202 00:10:42,000 --> 00:10:46,000 так што сума 3 + 2 + 1 + 0. 203 00:10:46,000 --> 00:10:48,000 Я хачу атрымаць назад адказ 6, 204 00:10:48,000 --> 00:10:51,000 такім чынам, мы будзем рэалізоўваць гэтую функцыю сігма, гэтая функцыя сумавання 205 00:10:51,000 --> 00:10:54,000 што, зноў жа, бярэ на ўваходзе, а затым вяртае сумавання 206 00:10:54,000 --> 00:10:57,000 з гэтага ліку аж да 0. 207 00:10:57,000 --> 00:10:59,000 Мы маглі б зрабіць гэта даволі проста, ці не так? 208 00:10:59,000 --> 00:11:01,000 Мы маглі б зрабіць гэта з нейкай цыкл структуры, 209 00:11:01,000 --> 00:11:04,000 так што дазвольце мне ісці наперад і атрымаць гэтую працу. 210 00:11:04,000 --> 00:11:07,000 >> Ўключыць stdio.h. 211 00:11:07,000 --> 00:11:09,000 Дазвольце мне атрымаць сабе ў асноўную працу з тут. 212 00:11:09,000 --> 00:11:12,000 Давайце захаваем гэта як sigma.c. 213 00:11:12,000 --> 00:11:14,000 Тады я пайду сюды, і я збіраюся абвясціць Int N, 214 00:11:14,000 --> 00:11:18,000 і я збіраюся зрабіць наступнае, пакуль карыстач не супрацоўнічаюць. 215 00:11:18,000 --> 00:11:22,000 Пакуль карыстальнік не даў мне станоўчага ліку 216 00:11:22,000 --> 00:11:26,000 Дазвольце мне ісці наперад і заахвоціць іх да GetInt п =, 217 00:11:26,000 --> 00:11:28,000 і дазвольце мне даць ім інструкцыі адносна таго, што рабіць, 218 00:11:28,000 --> 00:11:33,000 так што Е ("Станоўчае цэлае, калі ласка»). 219 00:11:33,000 --> 00:11:39,000 Проста нешта адносна простае, як гэта так, што да таго часу мы патрапілі лінія 14 220 00:11:39,000 --> 00:11:42,000 у нас зараз ёсць натуральны лік, верагодна, у с. 221 00:11:42,000 --> 00:11:44,000 >> Зараз давайце нешта рабіць з гэтым. 222 00:11:44,000 --> 00:11:50,000 Дазвольце мне ісці наперад і вылічыць сумы, так Int сума = сігма (п). 223 00:11:50,000 --> 00:11:54,000 Sigma проста сумаванне, так што я проста пішу гэта ў мудрагелістыя шляху. 224 00:11:54,000 --> 00:11:56,000 Мы проста называем гэта сігма там. 225 00:11:56,000 --> 00:11:58,000 Гэта сума, і цяпер я збіраюся раздрукаваць вынік, 226 00:11:58,000 --> 00:12:08,000 Е ("Сума% г \ п", сума). 227 00:12:08,000 --> 00:12:11,000 І тады я буду вяртаць 0 для добрай мерай. 228 00:12:11,000 --> 00:12:15,000 Мы зрабілі ўсё, што гэтая праграма патрабуе, акрамя цікавай часткі, 229 00:12:15,000 --> 00:12:18,000 якая з'яўляецца на самай справе рэалізацыі сігма функцыі. 230 00:12:18,000 --> 00:12:22,000 >> Адпусці мяне сюды на дно, і дазвольце мне абвясціць функцыю сігма. 231 00:12:22,000 --> 00:12:26,000 Гэта павінна прымаць пераменнае, што гэта тыпу цэлы лік, 232 00:12:26,000 --> 00:12:30,000 і які тып дадзеных, я хачу, каб вярнуцца мяркуецца, ад Sigma? 233 00:12:30,000 --> 00:12:34,000 Int, таму што я хачу, каб адпавядаць маім чаканням па лініі 15. 234 00:12:34,000 --> 00:12:37,000 У тут, дазвольце мне пайсці далей і рэалізаваць гэтую 235 00:12:37,000 --> 00:12:41,000 У даволі простым спосабам. 236 00:12:41,000 --> 00:12:45,000 >> Давайце пойдзем далей і сказаць Int сума = 0, 237 00:12:45,000 --> 00:12:47,000 і цяпер я збіраюся крыху цыклу тут 238 00:12:47,000 --> 00:12:50,000 што збіраецца сказаць нешта накшталт гэтага, 239 00:12:50,000 --> 00:13:01,000 для (INT = 0; I <= нумар, я + +) Сума + = я. 240 00:13:01,000 --> 00:13:05,000 А потым я збіраюся вярнуць суму. 241 00:13:05,000 --> 00:13:07,000 Я мог бы ажыццяўляцца гэтым у любым колькасці спосабамі. 242 00:13:07,000 --> 00:13:09,000 Я мог бы выкарыстаць цыкл. 243 00:13:09,000 --> 00:13:11,000 Я мог бы прапусціць з дапамогай сумы зменнай, калі я сапраўды хацеў, 244 00:13:11,000 --> 00:13:15,000 але ўвогуле, мы проста ёсць функцыя, якая, калі я не лох заяўляе сума роўная 0. 245 00:13:15,000 --> 00:13:18,000 Затым ён перабірае ад 0 на ўверх праз нумар, 246 00:13:18,000 --> 00:13:23,000 і на кожнай ітэрацыі ён дадае, што бягучае значэнне сумы, а затым вяртае суму. 247 00:13:23,000 --> 00:13:25,000 >> Дык вось, ёсць невялікая аптымізацыя тут. 248 00:13:25,000 --> 00:13:29,000 Гэта, напэўна, дарма крок, але хай будзе так. Гэта добра на дадзены момант. 249 00:13:29,000 --> 00:13:32,000 Мы па крайняй меры быць дбайным і збіраўся 0 ўсе шляхі ўверх. 250 00:13:32,000 --> 00:13:34,000 Не вельмі жорсткі і даволі простая, 251 00:13:34,000 --> 00:13:37,000 але аказваецца, што з дапамогай функцыі сігма мы маем тыя ж магчымасці 252 00:13:37,000 --> 00:13:39,000 як мы зрабілі тут, на сцэне. 253 00:13:39,000 --> 00:13:42,000 На сцэне мы проста палічыў, колькі людзей было побач са мной, 254 00:13:42,000 --> 00:13:47,000 але замест гэтага, калі мы хочам падлічыць лік 3 + 2 + 1 255 00:13:47,000 --> 00:13:51,000 на да 0, мы маглі аналагічным пласкадонку да функцыі 256 00:13:51,000 --> 00:13:55,000 што я буду апісваць, а не як рэкурсіўнага. 257 00:13:55,000 --> 00:13:57,000 Вось давайце зробім хутка здаровае праверыць і пераканацца, што я не лох. 258 00:13:57,000 --> 00:14:00,000 >> Я ведаю, што ёсць па меншай меры адна рэч у гэтай праграме, што я зрабіў няправільна. 259 00:14:00,000 --> 00:14:04,000 Калі я трапіла ўвесці я збіраюся атрымаць любую крычаць на мяне? 260 00:14:04,000 --> 00:14:06,000 Што мне будзе крычаць на аб? 261 00:14:06,000 --> 00:14:11,000 Так, я забыўся прататып, таму я выкарыстоўваю функцыю пад назвай Sigma ў радку 15, 262 00:14:11,000 --> 00:14:16,000 але гэта не абвешчаныя, пакуль лінія 22, так што я лепшы актыўна ідуць сюды 263 00:14:16,000 --> 00:14:22,000 і абвясціць прататып, і я скажу Int сігма (внутр нумар), вось і ўсё. 264 00:14:22,000 --> 00:14:24,000 Ён рэалізаваны ў ніжняй часткі. 265 00:14:24,000 --> 00:14:27,000 >> Ці іншы спосаб я магу вырашыць гэтую праблему, 266 00:14:27,000 --> 00:14:30,000 Я мог бы перамясціць функцыю там, наверсе, які не дрэнны, 267 00:14:30,000 --> 00:14:32,000 але па крайняй меры, калі вашы праграмы пачынаюць атрымліваць доўгі, шчыра кажучы, 268 00:14:32,000 --> 00:14:35,000 Я думаю, што ёсць некаторы значэнне ў заўсёды з асноўнымі ў верхнім 269 00:14:35,000 --> 00:14:38,000 так што вы ў чытача можа адкрыць файл, а затым адразу ж убачыць 270 00:14:38,000 --> 00:14:40,000 тое, што робіць праграма, без неабходнасці шукаць праз яго 271 00:14:40,000 --> 00:14:42,000 шукае, што асноўнай функцыяй. 272 00:14:42,000 --> 00:14:49,000 Пойдзем у мой акне тэрмінала тут, паспрабуйце зрабіць сігма зрабіць сігма, 273 00:14:49,000 --> 00:14:51,000 і я аблажаўся тут. 274 00:14:51,000 --> 00:14:55,000 Няяўна дэкларацыя функцыі GetInt азначае, што я забыўся зрабіць тое, што яшчэ? 275 00:14:55,000 --> 00:14:57,000 [Неразборліва-студэнт] 276 00:14:57,000 --> 00:15:00,000 Добра, такім чынам, па-відаць распаўсюджаная памылка, дык давайце гэта тут, 277 00:15:00,000 --> 00:15:04,000 cs50.h, а цяпер давайце вернемся да майго акне тэрмінала. 278 00:15:04,000 --> 00:15:08,000 >> Я буду ачысціць экран, і я буду паўторна зрабіць сігма. 279 00:15:08,000 --> 00:15:11,000 Мне здаецца, сабралі. Дазвольце мне зараз працаваць сігма. 280 00:15:11,000 --> 00:15:15,000 Я увядзіце нумар 3, і я атрымаць 6, так што не строгая праверка, 281 00:15:15,000 --> 00:15:18,000 але па крайняй меры, здаецца, працуе на першы погляд, але цяпер давай драць яго на часткі, 282 00:15:18,000 --> 00:15:21,000 і давайце на самай справе абапіраюцца на ідэю рэкурсіі, зноў жа, 283 00:15:21,000 --> 00:15:24,000 У вельмі простых умоў, з тым, што на працягу некалькіх тыдняў 284 00:15:24,000 --> 00:15:27,000 калі мы пачынаем вывучаць аматар структур дадзеных, чым масівы 285 00:15:27,000 --> 00:15:30,000 у нас ёсць яшчэ адзін інструмент у інструментары, з якім 286 00:15:30,000 --> 00:15:33,000 маніпуляваць гэтымі дадзенымі структурамі, як мы ўбачым. 287 00:15:33,000 --> 00:15:36,000 Гэта итеративный падыход, цыкл падыходу. 288 00:15:36,000 --> 00:15:39,000 >> Дазвольце мне замест гэтага цяпер зрабіць гэта. 289 00:15:39,000 --> 00:15:44,000 Дазвольце мне сказаць, што замест сумавання ліку 290 00:15:44,000 --> 00:15:48,000 на да 0 на самай справе тое ж самае, 291 00:15:48,000 --> 00:15:53,000 Колькасць + сігма (колькасць - 1). 292 00:15:53,000 --> 00:15:57,000 Іншымі словамі, гэтак жа, як на сцэне, я плыла па плыні, каб кожны з людзей побач са мной, 293 00:15:57,000 --> 00:16:00,000 а яны, у сваю чаргу, трымалі понтировавшего, пакуль мы, нарэшце, дна на Вілі, 294 00:16:00,000 --> 00:16:03,000 , Якія павінны былі вярнуцца жорстка адказаць, як 0. 295 00:16:03,000 --> 00:16:07,000 Вось зараз мы так жа понтировавшего сігма 296 00:16:07,000 --> 00:16:10,000 тыя ж функцыі, першапачаткова называлася, але ключ разумення тут 297 00:16:10,000 --> 00:16:12,000 тое, што мы не заклікаем сігма аднолькава. 298 00:16:12,000 --> 00:16:14,000 Мы не праходзіць на рускай мове. 299 00:16:14,000 --> 00:16:17,000 Мы выразна праходзіць у нумар - 1, 300 00:16:17,000 --> 00:16:20,000 так што крыху менш праблем, крыху менш праблем. 301 00:16:20,000 --> 00:16:23,000 >> На жаль, гэта не зусім рашэнне яшчэ, і перш, чым мы фіксуем 302 00:16:23,000 --> 00:16:26,000 што можна было б скакаць, як відавочна на некаторыя з вас 303 00:16:26,000 --> 00:16:28,000 Дазвольце мне ісці наперад і паўторна зрабіць. 304 00:16:28,000 --> 00:16:30,000 Здаецца, сабраць усё ў парадку. 305 00:16:30,000 --> 00:16:32,000 Дазвольце мне паўторна сігма з 6. 306 00:16:32,000 --> 00:16:37,000 Ой, дайце мне паўторна сігма з 6. 307 00:16:37,000 --> 00:16:42,000 Мы бачылі гэта раней, хоць і выпадкова апошні раз. 308 00:16:42,000 --> 00:16:48,000 Чаму я атрымліваю гэта загадкавае віне сегментацыі? Так. 309 00:16:48,000 --> 00:16:50,000 [Неразборліва-студэнт] 310 00:16:50,000 --> 00:16:53,000 Там няма базавага варыянту і, больш канкрэтна, што, верагодна, адбылося? 311 00:16:53,000 --> 00:16:58,000 Гэта сімптом таго, што паводзіны? 312 00:16:58,000 --> 00:17:00,000 Скажыце гэта трохі гучней. 313 00:17:00,000 --> 00:17:02,000 [Неразборліва-студэнт] 314 00:17:02,000 --> 00:17:05,000 Гэта бясконцы цыкл эфектыўна, і праблема з бясконцай завесы 315 00:17:05,000 --> 00:17:08,000 калі яны звязаны рэкурсіі ў дадзеным выпадку, функцыі, якая заве сябе, 316 00:17:08,000 --> 00:17:10,000 тое, што адбываецца кожны раз, калі вы выклікаеце функцыю? 317 00:17:10,000 --> 00:17:13,000 Ну, успомніце, як мы выклалі памяці ў кампутары. 318 00:17:13,000 --> 00:17:16,000 Мы сказалі, што ёсць гэты кавалак памяці, званай стэкам, што гэта на дне, 319 00:17:16,000 --> 00:17:19,000 і кожны раз, калі вы выклікаеце функцыю крыху больш памяці, атрымлівае пакласці 320 00:17:19,000 --> 00:17:24,000 На гэтай так званай стэкам, якія змяшчаюць лакальныя зменныя, функцыі або параметры, 321 00:17:24,000 --> 00:17:27,000 так што калі сігма сігма называе званкі сігма называе сігма 322 00:17:27,000 --> 00:17:29,000  заклікае сігма дзе ж гэтая гісторыя скончыцца? 323 00:17:29,000 --> 00:17:31,000 >> Ну, гэта ў канчатковым выніку перарасход на агульную суму 324 00:17:31,000 --> 00:17:33,000 памяці, якія ў вас ёсць для вашага кампутара. 325 00:17:33,000 --> 00:17:37,000 Вы перапаўнення сегмента, што вы павінны заставацца ў межах, 326 00:17:37,000 --> 00:17:40,000 і вы атрымаеце гэтую памылку сегментацыі, асноўныя кінулі, 327 00:17:40,000 --> 00:17:43,000 і тое, што асноўнай скідалі азначае, што зараз у мяне ёсць файл з імем асноўнага 328 00:17:43,000 --> 00:17:46,000 які ўяўляе сабой файл, які змяшчае нулі і адзінкі 329 00:17:46,000 --> 00:17:49,000 што на самой справе ў будучыні будзе Дыягнастычныя карысныя. 330 00:17:49,000 --> 00:17:52,000 Калі гэта не відавочна для вас, дзе ваша памылка 331 00:17:52,000 --> 00:17:54,000 Вы можаце фактычна зрабіць трохі судова-медыцынскай экспертызы, так бы мовіць, 332 00:17:54,000 --> 00:17:58,000 На гэтай файла дампа памяці, які, зноў жа, гэта проста цэлая куча нулёў і адзінак 333 00:17:58,000 --> 00:18:02,000 , Што па сутнасці ўяўляе стан вашай праграмы ў памяці 334 00:18:02,000 --> 00:18:05,000 момант ён разбіўся на гэтым шляху. 335 00:18:05,000 --> 00:18:11,000 >> Выпраўленне ў тым, што мы не можам проста слепа вярнуцца сігма, 336 00:18:11,000 --> 00:18:14,000 Колькасць + сігма крыху менш праблем. 337 00:18:14,000 --> 00:18:16,000 Мы павінны мець нейкая падстава ў дадзеным выпадку, 338 00:18:16,000 --> 00:18:19,000 і што павінна базавы варыянт, верагодна, будзе? 339 00:18:19,000 --> 00:18:22,000 [Неразборліва-студэнт] 340 00:18:22,000 --> 00:18:25,000 Такім чынам, калі лік з'яўляецца станоўчым, мы фактычна павінны вярнуць гэта, 341 00:18:25,000 --> 00:18:29,000 або, іншымі словамі, калі лік, скажам, <= 0, 342 00:18:29,000 --> 00:18:32,000 Вы ведаеце, што я буду ісці наперад і вяртаць 0, 343 00:18:32,000 --> 00:18:36,000 гэтак жа, як Вілі зрабіў, і яшчэ, я збіраюся ісці наперад 344 00:18:36,000 --> 00:18:41,000 і вярнуць гэтую, так што гэта не тое, што нашмат карацей, 345 00:18:41,000 --> 00:18:44,000 чым итерационные версіі, што мы на хуткую руку спачатку з дапамогай цыклу, 346 00:18:44,000 --> 00:18:48,000 але зьвярніце ўвагу, што ёсць такая элегантнасць да яго. 347 00:18:48,000 --> 00:18:51,000 Замест вяртання некаторага ліку і выканання ўсёй гэтай матэматыцы 348 00:18:51,000 --> 00:18:54,000 і даданне рэчы з лакальнымі зменнымі 349 00:18:54,000 --> 00:18:57,000 Вы замест таго, кажучы: "Добра, калі гэта супер лёгкая задача, 350 00:18:57,000 --> 00:19:01,000 як лік <0, дазвольце мне неадкладна вярнуць 0 ". 351 00:19:01,000 --> 00:19:03,000 >> Мы не збіраемся важдацца падтрымкі адмоўных лікаў, 352 00:19:03,000 --> 00:19:05,000 так што я збіраюся на жорсткі код значэннем 0. 353 00:19:05,000 --> 00:19:08,000 Але з іншага боку, для рэалізацыі гэтай ідэі сумавання 354 00:19:08,000 --> 00:19:11,000 Усе гэтыя лічбы разам, вы можаце эфектыўна ўзяць невялікі ўкус 355 00:19:11,000 --> 00:19:14,000 з гэтай праблемы, так жа, як мы рабілі тут, на сцэне, 356 00:19:14,000 --> 00:19:18,000 Затым пласкадонку астатнія задачы на ​​наступны чалавек, 357 00:19:18,000 --> 00:19:20,000 але ў гэтым выпадку наступны чалавек, гэта вы самі. 358 00:19:20,000 --> 00:19:22,000 Гэта ж імем функцыі. 359 00:19:22,000 --> 00:19:25,000 Проста перадайце яго ўсё менш і менш праблемай кожны раз, 360 00:19:25,000 --> 00:19:28,000 І хоць у нас не зусім фармалізаваных рэчы ў кодзе тут 361 00:19:28,000 --> 00:19:33,000 гэта менавіта тое, што адбывалася ў тыдзень 0 з тэлефоннай кнігай. 362 00:19:33,000 --> 00:19:36,000 Гэта менавіта тое, што адбываецца ў апошнія тыдні з Шонам 363 00:19:36,000 --> 00:19:39,000 і з нашай дэманстрацыі пошуку нумароў. 364 00:19:39,000 --> 00:19:42,000 Гэта займае праблема і падзяліўшы яго зноў і зноў. 365 00:19:42,000 --> 00:19:44,000 >> Іншымі словамі, ёсць спосаб ў цяперашні час перакладу 366 00:19:44,000 --> 00:19:47,000 гэта рэальная канструкцыя свету, гэта больш высокі ўзровень канструкцыі 367 00:19:47,000 --> 00:19:51,000 падзяляй і ўладар і рабіць нешта зноў і зноў 368 00:19:51,000 --> 00:19:56,000 У кодзе, так гэта тое, што мы ўбачым зноў на працягу доўгага часу. 369 00:19:56,000 --> 00:20:00,000 Цяпер, як і ў бок, калі вы пачатковец у рэкурсіі вы павінны па крайняй меры, зразумець зараз 370 00:20:00,000 --> 00:20:02,000 чаму гэта смешна. 371 00:20:02,000 --> 00:20:05,000 Я збіраюся пайсці на google.com, 372 00:20:05,000 --> 00:20:17,000 і я буду шукаць нейкія парады і рэкамендацыі па рэкурсіі, увядзіце. 373 00:20:17,000 --> 00:20:21,000 Раскажыце чалавек побач з вамі, калі яны не смяяліся толькі цяпер. 374 00:20:21,000 --> 00:20:23,000 Вы мелі на ўвазе рэкурсіі? 375 00:20:23,000 --> 00:20:25,000 Вы мелі на ўвазе-а-а, вось так. 376 00:20:25,000 --> 00:20:28,000 Добра, цяпер вось астатнія кожнага. 377 00:20:28,000 --> 00:20:30,000 Трохі велікоднае яйка ўбудаваных недзе там, у Google. 378 00:20:30,000 --> 00:20:33,000 Як у бок, адной з спасылак мы ставім на сайце курсу 379 00:20:33,000 --> 00:20:36,000 на сённяшні дзень з'яўляецца толькі гэтая сетка розных алгарытмаў сартавання, 380 00:20:36,000 --> 00:20:39,000 некаторыя з якіх мы паглядзелі на мінулым тыдні, але тое, што добра пра гэта візуалізацыя 381 00:20:39,000 --> 00:20:43,000 як вы спрабуеце абгарнуць ваш розум вакол розных рэчаў, звязаных з алгарытмамі 382 00:20:43,000 --> 00:20:46,000 ведаю, што вы можаце вельмі лёгка пачынаць з рознымі тыпамі уваходаў. 383 00:20:46,000 --> 00:20:50,000 Ўваходы усё назад, ўваходы асноўным сартуецца, выпадковыя ўваходы і гэтак далей. 384 00:20:50,000 --> 00:20:53,000 Як вы спрабуеце, зноў жа, адрозніваць гэтыя рэчы ў сваім розуме 385 00:20:53,000 --> 00:20:57,000 разумею, што гэта URL на вэб-сайце курсу на лекцыі старонку 386 00:20:57,000 --> 00:21:00,000 можа дапамагчы вам прычыну праз некаторыя з іх. 387 00:21:00,000 --> 00:21:05,000 >> Сёння мы, нарэшце, атрымаць, каб вырашыць гэтую праблему некаторы час таму, 388 00:21:05,000 --> 00:21:08,000 якіх было тое, што гэтая функцыя падпампоўкі проста не працуе, 389 00:21:08,000 --> 00:21:12,000 і тое, што асноўная праблема з гэтай функцыяй падпампоўкі, 390 00:21:12,000 --> 00:21:15,000 мэтай якой было, зноў жа, для абмену значэнне тут і тут 391 00:21:15,000 --> 00:21:17,000 такое, што гэта адбываецца? 392 00:21:17,000 --> 00:21:20,000 Гэта на самай справе не працуюць. Чаму? 393 00:21:20,000 --> 00:21:22,000 Так. 394 00:21:22,000 --> 00:21:28,000 [Неразборліва-студэнт] 395 00:21:28,000 --> 00:21:31,000 Сапраўды, тлумачэнне гэтаму грубых памылак 396 00:21:31,000 --> 00:21:34,000 Проста таму, што калі вы выклікаеце функцыі ў C 397 00:21:34,000 --> 00:21:38,000 і гэтыя функцыі прымаюць аргументы, як і б тут, 398 00:21:38,000 --> 00:21:42,000 Вы перадаеце ў копіі якое б значэнне вы падаеце да гэтай функцыі. 399 00:21:42,000 --> 00:21:46,000 Вы не прадастаўлення зыходных значэнняў сабе, 400 00:21:46,000 --> 00:21:49,000 такім чынам, мы бачылі гэта ў кантэксце buggyc, 401 00:21:49,000 --> 00:21:52,000 buggy3.c, які выглядаў трохі нешта накшталт гэтага. 402 00:21:52,000 --> 00:21:57,000 >> Нагадаем, што ў нас было х і ў ініцыялізуецца 1 і 2, адпаведна. 403 00:21:57,000 --> 00:21:59,000 Затым раздрукаваць тое, што яны былі. 404 00:21:59,000 --> 00:22:03,000 Я тады сцвярджаў, што я быў замяняючы іх па тэлефоне своп х, у. 405 00:22:03,000 --> 00:22:06,000 Але праблема ў тым, што замена працаваў, 406 00:22:06,000 --> 00:22:10,000 але толькі ў рамках своп самой функцыі. 407 00:22:10,000 --> 00:22:13,000 Як толькі мы трапілі лінія 40-м месцы гэтыя значэнні 408 00:22:13,000 --> 00:22:16,000 былі выкінутыя на сметнік, а так нічога 409 00:22:16,000 --> 00:22:21,000 У зыходнай функцыі асноўнага быў на самай справе змянілася, 410 00:22:21,000 --> 00:22:26,000 таму, калі вы лічыце, тады як, у якой гэта выглядае з пункту гледжання нашай памяці 411 00:22:26,000 --> 00:22:29,000 калі гэта левая бок платы ўяўляе сабой- 412 00:22:29,000 --> 00:22:33,000 і я зраблю ўсё магчымае, каб усе бачылі гэта, калі гэта левая бок платы 413 00:22:33,000 --> 00:22:37,000 ўяўляе, скажам, ваша памяць і стэк будзе расці на гэтую чынам, 414 00:22:37,000 --> 00:22:43,000 і мы выклікаем функцыю як асноўнага, а галоўнае ёсць 2 лакальныя зменныя х і у, 415 00:22:43,000 --> 00:22:48,000 Давайце апісваць іх як х тут, і апішам, як у гэтых тут, 416 00:22:48,000 --> 00:22:55,000 і давайце ў значэнні 1 і 2, так што тут галоўны, 417 00:22:55,000 --> 00:22:58,000 і калі асноўны выклікае функцыю падпампоўкі аперацыйнай сістэмы 418 00:22:58,000 --> 00:23:02,000 дае функцыю падпампоўкі сваю паласу памяці ў стэку, 419 00:23:02,000 --> 00:23:04,000 сваіх кадраў у стэку, так бы мовіць. 420 00:23:04,000 --> 00:23:08,000 Ён таксама вылучае 32 біт для гэтых цэлымі. 421 00:23:08,000 --> 00:23:11,000 Гэта адбываецца называць іх А і Б, але гэта зусім адвольнымі. 422 00:23:11,000 --> 00:23:13,000 Гэта магло б назваў іх, што хоча, але тое, што адбываецца, калі асноўны 423 00:23:13,000 --> 00:23:19,000 званкі своп ён прымае гэта 1, змяшчае копію там, змяшчае копію там. 424 00:23:19,000 --> 00:23:23,000 >> Існуе 1 іншыя лакальныя зменныя ў падпампоўкі, аднак, тое, што называецца? >> Tmp. 425 00:23:23,000 --> 00:23:27,000 Tmp, таму дазвольце мне даць сабе яшчэ 32 біта тут, 426 00:23:27,000 --> 00:23:29,000 і што ж мне рабіць у гэтай функцыі? 427 00:23:29,000 --> 00:23:34,000 Я сказаў Int TMP атрымлівае, такім чынам, мае 1, так што я зрабіў гэта, калі мы ў апошні раз гулялі з гэтым прыкладам. 428 00:23:34,000 --> 00:23:39,000 Тады б атрымлівае, такім чынам, бы = 2, так што зараз гэта становіцца 2, 429 00:23:39,000 --> 00:23:42,000 і цяпер б атрымлівае часовы, так што тэмпература роўная 1, 430 00:23:42,000 --> 00:23:44,000 так што зараз гэта становіцца б. 431 00:23:44,000 --> 00:23:46,000 Гэта вельмі добра. Гэта спрацавала. 432 00:23:46,000 --> 00:23:49,000 Але тады, як толькі функцыя вяртае 433 00:23:49,000 --> 00:23:52,000 памяці свопу эфектыўна знікае, так што яго можна выкарыстоўваць паўторна 434 00:23:52,000 --> 00:23:58,000 некаторыя іншыя функцыі ў будучыні, а галоўнае, відавочна, зусім не змяніўся. 435 00:23:58,000 --> 00:24:00,000 Нам патрэбен спосаб прынцыпова вырашыць гэтую праблему, 436 00:24:00,000 --> 00:24:03,000 і сёння мы, нарэшце, ёсць спосаб зрабіць гэта з дапамогай чаго 437 00:24:03,000 --> 00:24:06,000 мы можам ўвесці так званы паказальнік. 438 00:24:06,000 --> 00:24:09,000 Атрымліваецца, што мы можам вырашыць гэтую праблему 439 00:24:09,000 --> 00:24:12,000 Не пераходзячы ў копіі х і ў 440 00:24:12,000 --> 00:24:18,000 але замест гэтага, перадаўшы ў чым, як вы думаеце, у своп функцыі? 441 00:24:18,000 --> 00:24:20,000 Так, наконт адрасы? 442 00:24:20,000 --> 00:24:22,000 Мы яшчэ не казалі аб адрасах вельмі падрабязна, 443 00:24:22,000 --> 00:24:25,000 але калі гэтая дошка ўяўляе памяці майго кампутара 444 00:24:25,000 --> 00:24:28,000 Мы, безумоўна, можа пачаць нумарацыю байт у маёй памяці 445 00:24:28,000 --> 00:24:31,000 і кажуць, што гэта байт № 1, гэта байт № 2, № 3 байта, 446 00:24:31,000 --> 00:24:35,000 № 4 байта, байт # ... 2 мільярдаў, калі ў мяне ёсць 2 гігабайта аператыўнай памяці, 447 00:24:35,000 --> 00:24:38,000 такім чынам, мы, безумоўна, можа выступіць з некаторымі адвольнай схемы нумарацыі 448 00:24:38,000 --> 00:24:41,000 для ўсіх асобных байтаў ў памяці майго кампутара. 449 00:24:41,000 --> 00:24:43,000 >> Што, калі замест гэтага, калі я называю своп 450 00:24:43,000 --> 00:24:47,000 , А не пропуск ў копіі х і ў 451 00:24:47,000 --> 00:24:51,000 чаму б мне не прайсці, а не ў адрас х тут, 452 00:24:51,000 --> 00:24:55,000 адрас у тут, па сутнасці, паштовы адрас, 453 00:24:55,000 --> 00:24:59,000 х і у, таму што тады памяняцца, калі ён праінфармаваў 454 00:24:59,000 --> 00:25:01,000 адрасы ў памяць аб х і у, 455 00:25:01,000 --> 00:25:04,000 Затым памяняцца, калі мы навучылі яго крыху, 456 00:25:04,000 --> 00:25:07,000 Ён патэнцыйна можа ездзіць па гэтым адрасе, так бы мовіць, 457 00:25:07,000 --> 00:25:11,000 х, і змяніць нумар ёсць, то ехаць у адрас у, 458 00:25:11,000 --> 00:25:16,000 змяніць нумар ёсць, нават калі на самай справе не атрымлівае копіі гэтых значэнняў сабе, 459 00:25:16,000 --> 00:25:19,000 так што нават калі мы пра гэта казалі як асноўнай памяці ў 460 00:25:19,000 --> 00:25:23,000 і гэта як своп-памяці магутная і небяспечная частка C 461 00:25:23,000 --> 00:25:28,000 з'яўляецца тое, што любая функцыя можа закрануць памяти дзе-небудзь у кампутар, 462 00:25:28,000 --> 00:25:32,000 і гэта магутны, што вы можаце зрабіць вельмі модныя рэчы з кампутарнымі праграмамі на мове C. 463 00:25:32,000 --> 00:25:36,000 Гэта небяспечна, таму што вы можаце сапсаваць вельмі лёгка. 464 00:25:36,000 --> 00:25:39,000 На самай справе, адным з найбольш распаўсюджаных спосабаў для праграм, у гэтыя дні быць выкарыстаны 465 00:25:39,000 --> 00:25:42,000 па-ранейшаму з'яўляецца для праграміста, каб не разумець 466 00:25:42,000 --> 00:25:45,000 што ён ці яна дазваляе дадзеных 467 00:25:45,000 --> 00:25:49,000 быць напісаны на месца ў памяці, якая не была прызначаная. 468 00:25:49,000 --> 00:25:51,000 >> Напрыклад, ён або яна аб'яўляе масіў памерам 10 469 00:25:51,000 --> 00:25:56,000 але потым выпадкова спрабуе паставіць 11 байт у гэтым масіве памяці, 470 00:25:56,000 --> 00:25:59,000 і вы пачынаеце дакранаючыся частак памяці, якія больш не з'яўляюцца сапраўднымі. 471 00:25:59,000 --> 00:26:02,000 Проста кантэкстнай гэта, некаторыя з вас могуць ведаць, што 472 00:26:02,000 --> 00:26:06,000 Праграмнае забеспячэнне часта прапануе ўвесці серыйны нумар або рэгістрацыйныя ключы, 473 00:26:06,000 --> 00:26:08,000 Photoshop і Слова і падобных праграмах. 474 00:26:08,000 --> 00:26:12,000 Там існуюць расколіны, так як некаторыя з вас ведаюць, у Інтэрнэце, дзе вы можаце запусціць невялікую праграму, 475 00:26:12,000 --> 00:26:14,000 і вуаля, не больш за запыт на серыйны нумар. 476 00:26:14,000 --> 00:26:16,000 Як гэта працуе? 477 00:26:16,000 --> 00:26:21,000 У многіх выпадках гэтыя рэчы проста знайсці ў кампутарах 478 00:26:21,000 --> 00:26:24,000 Тэкст сегментаў у рэальнай нулі кампутара і тыя, 479 00:26:24,000 --> 00:26:28,000 дзе гэта функцыя, дзе серыйны нумар прасіла, 480 00:26:28,000 --> 00:26:31,000 і перазапісу, што прастора або падчас выканання праграмы 481 00:26:31,000 --> 00:26:33,000 Вы можаце высветліць, дзе ключ захоўваецца на самай справе 482 00:26:33,000 --> 00:26:37,000 выкарыстанне так званых адладчык, і вы зможаце ўзламаць праграмнае забеспячэнне такім чынам. 483 00:26:37,000 --> 00:26:40,000 Гэта не азначае, што гэта наша мэта на бліжэйшыя пару дзён, 484 00:26:40,000 --> 00:26:42,000 але яна мае вельмі рэальныя наступствы. 485 00:26:42,000 --> 00:26:45,000 Той адбываецца прыцягнуць крадзеж праграмнага забеспячэння, 486 00:26:45,000 --> 00:26:47,000 але ёсць таксама кампраміс ўсёй машыны. 487 00:26:47,000 --> 00:26:50,000 >> На самай справе, калі вэб-сайты ў гэтыя дні эксплуатуецца 488 00:26:50,000 --> 00:26:53,000 і скампраметаваны і дадзеныя пратачыліся і паролі былі выкрадзеныя 489 00:26:53,000 --> 00:26:58,000 гэта вельмі часта звязана з дрэнным кіраваннем сваёй памяці, 490 00:26:58,000 --> 00:27:01,000 ці, у выпадку баз дадзеных, няздольнасць прадбачыць 491 00:27:01,000 --> 00:27:03,000 спаборнасці ўваход, так што больш на тым, што ў бліжэйшыя тыдні, 492 00:27:03,000 --> 00:27:07,000 але пакуль толькі папярэдні прагляд роду шкоду, які вы можаце зрабіць 493 00:27:07,000 --> 00:27:11,000 , Не зусім разумеючы, як усё гэта працуе пад капотам. 494 00:27:11,000 --> 00:27:14,000 Давайце ісці аб разумеючы, чаму гэта не працуе 495 00:27:14,000 --> 00:27:17,000 з інструментам, які будзе станавіцца ўсё больш і больш карыснымі 496 00:27:17,000 --> 00:27:19,000 як нашы праграмы становяцца ўсё больш складанымі. 497 00:27:19,000 --> 00:27:21,000 Да гэтага часу, калі ў вас была памылка ў вашай праграме 498 00:27:21,000 --> 00:27:23,000 як вы сышлі аб адладцы гэта? 499 00:27:23,000 --> 00:27:25,000 Што вашы метады былі да гэтага часу, вучыў ці ваша TF 500 00:27:25,000 --> 00:27:27,000 ці проста самавук? 501 00:27:27,000 --> 00:27:29,000 [Студэнт] Printf. 502 00:27:29,000 --> 00:27:31,000 Printf, так Printf, верагодна, быў вашым сябрам у тым, калі вы хочаце ўбачыць 503 00:27:31,000 --> 00:27:33,000 што адбываецца ўнутры вашай праграмы 504 00:27:33,000 --> 00:27:36,000 вы проста пакласці Printf тут, Printf тут, Printf тут. 505 00:27:36,000 --> 00:27:38,000 Тады вы запусціце яго, і вы атрымаеце цэлую кучу рэчаў на экране 506 00:27:38,000 --> 00:27:43,000 , Якія можна выкарыстоўваць, каб потым вывесці тое, што на самой справе адбываецца не так у вашай праграме. 507 00:27:43,000 --> 00:27:45,000 >> Printf, як правіла, вельмі магутная рэч, 508 00:27:45,000 --> 00:27:47,000 але гэта вельмі ручной працэс. 509 00:27:47,000 --> 00:27:49,000 Вы павінны паставіць Printf тут, Printf тут, 510 00:27:49,000 --> 00:27:51,000 і калі вы змесціце яго ўнутры цыклу вы можаце атрымаць 100 ліній 511 00:27:51,000 --> 00:27:53,000 прадукцыі, якія затым трэба просеять праз. 512 00:27:53,000 --> 00:27:58,000 Гэта не вельмі зручна ці інтэрактыўны механізм для адладкі праграм, 513 00:27:58,000 --> 00:28:00,000 але, на шчасце, існуе альтэрнатывы. 514 00:28:00,000 --> 00:28:03,000 Там у праграме, напрыклад, называюць GDB, GNU Debugger, 515 00:28:03,000 --> 00:28:06,000 які трохі таямніцай у тым, як вы яго выкарыстоўваеце. 516 00:28:06,000 --> 00:28:08,000 Гэта крыху складана, але, шчыра кажучы, 517 00:28:08,000 --> 00:28:11,000 гэта адна з тых рэчаў, дзе, калі вы пакладзеце ў гэтую тыдзень і наступную 518 00:28:11,000 --> 00:28:14,000 дадатковы гадзіну, каб нешта зразумець, як GDB 519 00:28:14,000 --> 00:28:18,000 гэта зэканоміць вам, верагодна, дзесяткі гадзін у доўгатэрміновай перспектыве, 520 00:28:18,000 --> 00:28:21,000 Так з гэтым, дазвольце мне даць вам тізер, як гэтая штука працуе. 521 00:28:21,000 --> 00:28:23,000 >> Я ў маім акне тэрмінала. 522 00:28:23,000 --> 00:28:26,000 Дазвольце мне ісці наперад і скампіляваць гэтую праграму, buggy3. 523 00:28:26,000 --> 00:28:28,000 Ён ужо ў курсе. 524 00:28:28,000 --> 00:28:31,000 Дазвольце мне запусціць яго гэтак жа, як мы рабілі некаторы час таму, і, сапраўды, яна зламаная. 525 00:28:31,000 --> 00:28:34,000 Але чаму гэта адбываецца? Можа быць, я аблажаўся своп функцыі. 526 00:28:34,000 --> 00:28:37,000 Можа быць, гэта і Коммерсанта. Я не зусім іх перамяшчэннем правільна. 527 00:28:37,000 --> 00:28:39,000 Дазвольце мне ісці наперад і рабіць гэта. 528 00:28:39,000 --> 00:28:43,000 Замест таго, каб проста запусціць buggy3 дазвольце мне замест запуску гэтай праграмы GDB, 529 00:28:43,000 --> 00:28:48,000 і я збіраюся сказаць яму, каб запусціць buggy3, 530 00:28:48,000 --> 00:28:52,000 і я збіраюся ўключыць параметр каманднага радка,-туй, 531 00:28:52,000 --> 00:28:55,000 і мы змесцім гэта ў будучыні праблем у спецыфікацыі, каб нагадаць. 532 00:28:55,000 --> 00:28:57,000 І вось зараз гэты чорна-белы інтэрфейс выскачыў, што, зноў жа, 533 00:28:57,000 --> 00:28:59,000 трохі пераважнай спачатку, таму што там усё гэта 534 00:28:59,000 --> 00:29:02,000 Інфармацыя пра гарантыі тут, але па крайняй меры ёсць нешта знаёмае. 535 00:29:02,000 --> 00:29:04,000 У верхняй частцы акна знаходзіцца мой рэальны код, 536 00:29:04,000 --> 00:29:08,000 і калі я пракруткі уверх тут, дазвольце мне перайсці да самай верхняй часткі майго файла, 537 00:29:08,000 --> 00:29:11,000 і, сапраўды, ёсць buggy3.c, і звернеце ўвагу, у ніжняй частцы гэтага акна 538 00:29:11,000 --> 00:29:13,000 У мяне ёсць GDB радку. 539 00:29:13,000 --> 00:29:16,000 >> Гэта не тое ж самае, як мая нармальная Джон Гарвард радку. 540 00:29:16,000 --> 00:29:19,000 Гэта падказка, якая збіраецца, каб дазволіць мне кантраляваць GDB. 541 00:29:19,000 --> 00:29:21,000 GDB з'яўляецца адладчыкам. 542 00:29:21,000 --> 00:29:24,000 Адладчык гэта праграма, якая дазваляе вам ісці праз 543 00:29:24,000 --> 00:29:27,000 выкананне праграмы радок за радком за радком, 544 00:29:27,000 --> 00:29:30,000 па шляху робім усё, што вы хочаце праграму, 545 00:29:30,000 --> 00:29:33,000 нават выклікам функцый, альбо шукаць, што яшчэ больш важна, 546 00:29:33,000 --> 00:29:35,000 пры значэннях розных зменных. 547 00:29:35,000 --> 00:29:37,000 Давайце пойдзем далей і зрабіць гэта. 548 00:29:37,000 --> 00:29:40,000 Я збіраюся пайсці далей і ўвесці ў бегу на аператыўнае GDB, 549 00:29:40,000 --> 00:29:43,000 так што заўважыць у левай ніжняй частцы экрана, я набраў бегчы, 550 00:29:43,000 --> 00:29:45,000 і я трапіў ўвесці, і што ж, што рабіць? 551 00:29:45,000 --> 00:29:50,000 Ён літаральна бег мая праграма, але я на самой справе не бачу вялікай працягваць тут 552 00:29:50,000 --> 00:29:55,000 таму што я на самой справе не сказаў адладчык 553 00:29:55,000 --> 00:29:57,000 , Каб прыпыніць на пэўны момант часу. 554 00:29:57,000 --> 00:29:59,000 Проста увядзіце перспектыве запускае праграму. 555 00:29:59,000 --> 00:30:01,000 Я на самой справе не бачу. Я не магу кіраваць ёю. 556 00:30:01,000 --> 00:30:03,000 >> Замест гэтага дазвольце мне зрабіць гэта. 557 00:30:03,000 --> 00:30:08,000 У гэтым радку GDB дазвольце мне замест увядзіце перапынку, ўвесці. 558 00:30:08,000 --> 00:30:10,000 Гэта не тое, што я меў на ўвазе, каб надрукаваць. 559 00:30:10,000 --> 00:30:13,000 Давайце замест гэтага ўвесці перапынак асноўны. 560 00:30:13,000 --> 00:30:15,000 Іншымі словамі, я хачу ўсталяваць так званы супыну, 561 00:30:15,000 --> 00:30:18,000 якую назвалі таму, што ён зламаецца ці паўзы 562 00:30:18,000 --> 00:30:21,000 выкананне праграмы ў гэтым канкрэтным месцы. 563 00:30:21,000 --> 00:30:23,000 Галоўнае гэтае імя маёй функцыі. 564 00:30:23,000 --> 00:30:25,000 Звярніце ўвагу, што GDB з'яўляецца даволі разумная. 565 00:30:25,000 --> 00:30:28,000 Ён высветліў, што асноўная адбываецца, каб пачаць прыкладна на лініі 18 566 00:30:28,000 --> 00:30:32,000 з buggy3.c, а затым заўважыць тут, у левым верхнім 567 00:30:32,000 --> 00:30:34,000 B + размешчаны побач з лініяй 18. 568 00:30:34,000 --> 00:30:38,000 Гэта нагадвае мне, што я паставіў кропку супыну на радку 18. 569 00:30:38,000 --> 00:30:42,000 Гэта час, калі я друкую перспектыве, я збіраюся запусціць маю праграму 570 00:30:42,000 --> 00:30:45,000 Да яна трапляе, што супыну, 571 00:30:45,000 --> 00:30:48,000 так што праграма будзе прыпыненая для мяне ў радку 18. 572 00:30:48,000 --> 00:30:50,000 Тут мы ідзем, бегчы. 573 00:30:50,000 --> 00:30:53,000 Нішто, здаецца, здарылася, але зьвярніце ўвагу на левы ніжні 574 00:30:53,000 --> 00:30:58,000 пачынаючы праграму, buggy3, супыну 1 у асноўны buggy3.c на лініі 18. 575 00:30:58,000 --> 00:31:00,000 Што я магу зрабіць зараз? 576 00:31:00,000 --> 00:31:03,000 >> Звярніце ўвагу, я магу пачаць друкаваць такія рэчы, як друк, 577 00:31:03,000 --> 00:31:08,000 Ня Printf, друк х, і зараз гэта дзіўна. 578 00:31:08,000 --> 00:31:11,000 $ 1 гэта проста цікаўнасць, як мы ўбачым 579 00:31:11,000 --> 00:31:14,000 кожны раз, калі вы друкуеце тое, што вы атрымаеце новы $ значэнне. 580 00:31:14,000 --> 00:31:18,000 Вось, так што вы можаце вярнуцца да папярэдніх значэнняў на ўсялякі выпадак, 581 00:31:18,000 --> 00:31:21,000 але цяпер тое, што друк кажа мне, што значэнне х у гэты момант у гісторыі 582 00:31:21,000 --> 00:31:26,000 мабыць 134514032. 583 00:31:26,000 --> 00:31:29,000 Што? Дзе, што нават узяўся? 584 00:31:29,000 --> 00:31:31,000 [Неразборліва-студэнт] 585 00:31:31,000 --> 00:31:34,000 На самай справе, гэта тое, што мы называем смеццем значэнне, і мы не казалі з гэтай нагоды, 586 00:31:34,000 --> 00:31:37,000 але прычына, што вы ініцыялізацыя зменных 587 00:31:37,000 --> 00:31:40,000 Відавочна, так што яны маюць некаторы значэнне, якое вы хочаце іх мець. 588 00:31:40,000 --> 00:31:44,000 Але ўлоў нагадаць, што вы можаце аб'яўляць зменныя 589 00:31:44,000 --> 00:31:46,000 як я хвіліну назад у маім прыкладзе сігма 590 00:31:46,000 --> 00:31:48,000 , Фактычна не даючы ім значэння. 591 00:31:48,000 --> 00:31:50,000 Нагадаем, што я зрабіў тут, у сігма. 592 00:31:50,000 --> 00:31:52,000 Я заявіў, п, але якое значэнне я даць яму? 593 00:31:52,000 --> 00:31:56,000 Не, таму што я ведаў, што ў бліжэйшыя некалькі радкоў 594 00:31:56,000 --> 00:31:59,000 GetInt будзе клапаціцца аб праблеме пакласці значэнне ўнутры н. 595 00:31:59,000 --> 00:32:02,000 >> Але ў гэты момант у гісторыі радку 11 596 00:32:02,000 --> 00:32:05,000 і 12 лініяй і лініяй 13 і радок 14 597 00:32:05,000 --> 00:32:08,000 на працягу гэтых некалькіх радках тое, што значэнне п? 598 00:32:08,000 --> 00:32:10,000 У C Вы проста не ведаю. 599 00:32:10,000 --> 00:32:14,000 Гэта ўвогуле нейкая фігня значэнне, некаторыя зусім выпадковае лік 600 00:32:14,000 --> 00:32:17,000 што застаецца за галоўным чынам з некаторых папярэдніх функцый 601 00:32:17,000 --> 00:32:21,000 быўшы працаваць, так як ваша праграма працуе 602 00:32:21,000 --> 00:32:24,000 Нагадаем, што функцыя атрымлівае функцыі, функцыі, функцыі. 603 00:32:24,000 --> 00:32:27,000 Усе гэтыя кадры атрымаць пакласці на памяць, а затым гэтыя функцыі вяртаюць, 604 00:32:27,000 --> 00:32:31,000 і гэтак жа, як я прапанаваў, з гумкай іх памяці, у канчатковым рахунку паўторна. 605 00:32:31,000 --> 00:32:37,000 Ну, так ужо здарылася, што гэтая пераменная х у гэтай праграме 606 00:32:37,000 --> 00:32:41,000 па-відаць, утрымлівае некаторыя смецця значэнне, як 134514032 607 00:32:41,000 --> 00:32:44,000 ад некаторых папярэдніх функцыі, а не той, які я напісаў. 608 00:32:44,000 --> 00:32:47,000 Гэта можа быць нешта, што прыходзіць эфектыўна з аперацыйнай сістэмай, 609 00:32:47,000 --> 00:32:49,000 некаторыя функцыі пад капотам. 610 00:32:49,000 --> 00:32:52,000 >> Добра, гэта добра, але давайце цяпер перайсці да наступнай радку. 611 00:32:52,000 --> 00:32:55,000 Калі я тыпу "Наступны" на GDB мае радкі, і я ударыў ўвайсці, 612 00:32:55,000 --> 00:32:58,000 заўважыць, што вылучэнне рухаецца ўніз да лініі 19, 613 00:32:58,000 --> 00:33:01,000 але лагічны маецца на ўвазе, што радок 18 614 00:33:01,000 --> 00:33:06,000 У цяперашні час скончыў працу, так што калі я яшчэ раз увядзіце "друк х" 615 00:33:06,000 --> 00:33:10,000 Я павінен з'явіцца 1, і, сапраўды, я раблю. 616 00:33:10,000 --> 00:33:14,000 Зноў жа, $ рэчаў з'яўляецца спосабам GDB нагадваць вам 617 00:33:14,000 --> 00:33:17,000 што гісторыя адбіткі, што вы зрабілі. 618 00:33:17,000 --> 00:33:21,000 Цяпер дазвольце мне ісці наперад і раздрукаваць у, і, сапраўды, у ёсць некаторыя вар'яты значэння, а таксама, 619 00:33:21,000 --> 00:33:24,000 але не вялікая праблема, таму што ў радку 19 мы збіраемся прызначыць яго 620 00:33:24,000 --> 00:33:27,000 значэнне 2, так што дазвольце мне ўвесці "Наступны" яшчэ раз. 621 00:33:27,000 --> 00:33:29,000 І зараз мы знаходзімся на Printf лініі. 622 00:33:29,000 --> 00:33:31,000 Дазвольце мне зрабіць друк х. 623 00:33:31,000 --> 00:33:34,000 Дазвольце мне зрабіць друк у. Шчыра кажучы, я ўжо крыху стаміўся ад гэтай друку. 624 00:33:34,000 --> 00:33:38,000 Дазвольце мне замест гэтага ўвесці "дысплей X" і "Y Дысплей", 625 00:33:38,000 --> 00:33:41,000 і зараз кожны раз, калі я увядзіце каманду ў будучыні 626 00:33:41,000 --> 00:33:45,000 Я буду нагадаў пра тое, што гэта х і у, што х і у, што х і у. 627 00:33:45,000 --> 00:33:48,000 >> Я таксама магу, а ў бок, тыпу "Інфармацыя мясцовымі жыхарамі". 628 00:33:48,000 --> 00:33:50,000 Інфармацыя з'яўляецца спецыяльнай камандай. 629 00:33:50,000 --> 00:33:52,000 Мясцовыя жыхары азначае, што ён паказвае мне лакальныя зменныя. 630 00:33:52,000 --> 00:33:55,000 На ўсялякі выпадак я забыўся, ці гэта вар'ятка, складаная функцыя 631 00:33:55,000 --> 00:33:57,000 што я ці хтосьці іншы пісаў Інфармацыя мясцовыя жыхары скажуць вам, 632 00:33:57,000 --> 00:34:00,000 што ўсе лакальныя зменныя ўнутры гэтай лакальнай функцыі 633 00:34:00,000 --> 00:34:03,000 што вы маглі б клапаціцца аб тым, калі вы хочаце, каб ткнуць вакол. 634 00:34:03,000 --> 00:34:07,000 Цяпер, Printf збіраецца выконваць, таму дазвольце мне ісці наперад і толькі тыпу "Далей". 635 00:34:07,000 --> 00:34:10,000 Таму што мы ў гэтым асяроддзі мы на самай справе не бачачы яго 636 00:34:10,000 --> 00:34:14,000 выканаць тут, але заўважыў, што гэта становіцца трохі скажонае тут. 637 00:34:14,000 --> 00:34:17,000 Але звярніце ўвагу, што гэта пераазначэнне экрана ёсць, 638 00:34:17,000 --> 00:34:21,000 так што гэта не ідэальная праграма тут, але гэта нармальна, таму што я заўсёды магу капацца 639 00:34:21,000 --> 00:34:23,000 выкарыстаннем друку, калі я хачу. 640 00:34:23,000 --> 00:34:26,000 >> Дазвольце мне ўвесці наступны раз, і вось зараз самае цікавае. 641 00:34:26,000 --> 00:34:29,000 На дадзены момант у гэтай гісторыі ў 2, а х 1, 642 00:34:29,000 --> 00:34:32,000 як прапанавана тут, і зноў, 643 00:34:32,000 --> 00:34:35,000 Прычынай гэтага аўтаматычна адлюстроўваюцца зараз, таму што я выкарыстаў каманду 644 00:34:35,000 --> 00:34:40,000 Дысплей х і ў дысплея, так што момант, калі я увядзіце наступную 645 00:34:40,000 --> 00:34:43,000 У тэорыі х і ў павінны стаць месцамі. 646 00:34:43,000 --> 00:34:45,000 Цяпер мы ўжо ведаем, што не збіраецца быць у выпадку, 647 00:34:45,000 --> 00:34:49,000 але мы ўбачым праз імгненне, як мы можам ныраць глыбей, каб высветліць, чаму гэта так. 648 00:34:49,000 --> 00:34:54,000 Далей, і, на жаль, у яшчэ 2 і х яшчэ 1, і я магу пацвердзіць, як шмат. 649 00:34:54,000 --> 00:34:56,000 Друк х, у друку. 650 00:34:56,000 --> 00:34:59,000 Сапраўды, ні замена адбылося на самай справе, так што давайце пачнем над гэтым. 651 00:34:59,000 --> 00:35:01,000 Ясна, што своп зламаны. 652 00:35:01,000 --> 00:35:04,000 Давайце замест гэтага ўвесці "Выканаць". 653 00:35:04,000 --> 00:35:07,000 Дазвольце мне сказаць, так, я хачу, каб перазапусціць яго з самага пачатку, ўвесці. 654 00:35:07,000 --> 00:35:09,000 >> Цяпер я назад у радку 18. 655 00:35:09,000 --> 00:35:11,000 Зараз звернеце ўвагу х і ў смеццевых значэння зноў. 656 00:35:11,000 --> 00:35:15,000 Наступны, наступны, наступны, наступны. 657 00:35:15,000 --> 00:35:17,000 Калі я атрымліваю сумна я магу проста увядзіце п для наступнага. 658 00:35:17,000 --> 00:35:21,000 Вы можаце скараціць яго ў самыя кароткія паслядоўнасць знакаў. 659 00:35:21,000 --> 00:35:23,000 Зменны цяпер зламаная. 660 00:35:23,000 --> 00:35:25,000 Давайце пагрузіліся ў, так што замест таго, каб друкаваць далей, 661 00:35:25,000 --> 00:35:30,000 Цяпер я збіраюся ўвесці крокам, так што я актывізацыі ўнутры гэтай функцыі 662 00:35:30,000 --> 00:35:33,000 так што я магу прайсці праз гэта, так што я ўдарыў крок, а затым ўвесці. 663 00:35:33,000 --> 00:35:37,000 Звярніце ўвагу, што вылучэнне скокі ўніз ніжэй у маёй праграме лініі 36. 664 00:35:37,000 --> 00:35:39,000 Цяпер тое, што з'яўляюцца лакальныя зменныя? 665 00:35:39,000 --> 00:35:41,000 Інфармацыя мясцовыя жыхары. 666 00:35:41,000 --> 00:35:43,000 Нішто не проста яшчэ і таму, што мы не дайшлі да гэтага радка, 667 00:35:43,000 --> 00:35:47,000 так што давайце ісці наперад і сказаць: "Наступны". 668 00:35:47,000 --> 00:35:50,000 Цяпер мы, здаецца, TMP, друк TMP. 669 00:35:50,000 --> 00:35:52,000 Смецце значэнне, ці не так? Я так думаю. 670 00:35:52,000 --> 00:35:55,000 Як наконт друк, друк б, 1 і 2? 671 00:35:55,000 --> 00:35:58,000 У момант, як толькі я набіраю наступны раз 672 00:35:58,000 --> 00:36:02,000 TMP будзе прымаць значэнне 1, мы спадзяемся, 673 00:36:02,000 --> 00:36:05,000 TMP, таму што збіраецца быць прысвоена значэнне. 674 00:36:05,000 --> 00:36:08,000 >> Зараз давайце зробім друк, друк б, 675 00:36:08,000 --> 00:36:11,000 але цяпер друку TMP, і гэта сапраўды 1. 676 00:36:11,000 --> 00:36:14,000 Дазвольце мне рабіць далей. Дазвольце мне рабіць далей. 677 00:36:14,000 --> 00:36:16,000 Я скончыў своп функцыі. 678 00:36:16,000 --> 00:36:19,000 Я ўсё яшчэ ўнутры яго ў радку 40, так што дазвольце мне друк, 679 00:36:19,000 --> 00:36:22,000 б друку, і я не хвалюе, што TMP ёсць. 680 00:36:22,000 --> 00:36:27,000 Падобна на тое, што своп правільна, калі справа даходзіць да замены і б. 681 00:36:27,000 --> 00:36:31,000 Але калі я зараз увядзіце наступную, я каб вярнуцца да радка 25, 682 00:36:31,000 --> 00:36:34,000 і, вядома, калі я тыпу х і друку ў 683 00:36:34,000 --> 00:36:38,000 яны па-ранейшаму без зменаў, так што мы не вырашылі праблему. 684 00:36:38,000 --> 00:36:41,000 Але Дыягнастычныя зараз, мабыць, з гэтай праграмай GDB 685 00:36:41,000 --> 00:36:44,000 Мы па крайняй меры, атрымаў адзін крок бліжэй да разумення 686 00:36:44,000 --> 00:36:47,000 што адбываецца не так, не засмечваць наш код, паставіўшы Printf тут, 687 00:36:47,000 --> 00:36:50,000 Printf тут, Printf тут, а затым запусціць яго зноў і зноў 688 00:36:50,000 --> 00:36:52,000 спрабуе высветліць, што адбываецца не так. 689 00:36:52,000 --> 00:36:55,000 >> Я збіраюся ісці наперад і выйсці з гэтага ўсяго з курыць. 690 00:36:55,000 --> 00:36:57,000 Гэта будзе сказаць: "Усё роўна выйсці?" Так. 691 00:36:57,000 --> 00:37:00,000 Зараз я вярнуўся ў мой нармальны радкі, і я зроблена з дапамогай GDB. 692 00:37:00,000 --> 00:37:03,000 Як у баку, вы не павінны выкарыстоўваць гэтую-туй сцяг. 693 00:37:03,000 --> 00:37:07,000 На самай справе, калі вы прапусціце яго, то атрымаеце па сутнасці ў ніжняй палове экрана. 694 00:37:07,000 --> 00:37:11,000 Калі б я затым увядзіце перапынак асноўнай, а затым запусціце 695 00:37:11,000 --> 00:37:15,000 Я ўсё яшчэ можна запускаць маю праграму, але што ён будзе рабіць больш тэкстава 696 00:37:15,000 --> 00:37:18,000 проста пакажыце мне бягучым адзін радок за адзін раз. 697 00:37:18,000 --> 00:37:21,000 -Туй, тэкставы інтэрфэйс, 698 00:37:21,000 --> 00:37:25,000 проста паказвае вам некалькі праграм адначасова, што, верагодна, крыху канцэптуальна прасцей. 699 00:37:25,000 --> 00:37:27,000 Але на самай справе, я магу проста зрабіць наступны, наступны, наступны, 700 00:37:27,000 --> 00:37:30,000 і я іду да адной радку за адзін раз, і калі я сапраўды хачу бачыць, што адбываецца на 701 00:37:30,000 --> 00:37:35,000 Я магу надрукаваць спіс і ўбачыць цэлую кучу суседніх ліній. 702 00:37:35,000 --> 00:37:39,000 >> Там ёсць відэа, якое мы прасілі, што вы сочыце за праблемы ўсталёўвае 3 703 00:37:39,000 --> 00:37:43,000 , У якім Nate пакрывае некаторыя з тонкасцяў GDB, 704 00:37:43,000 --> 00:37:46,000 і гэта адна з тых рэчаў, шчыра кажучы, дзе некаторыя нетрывіяльныя адсотак вы 705 00:37:46,000 --> 00:37:49,000 ніколі не закране GDB, і гэта будзе дрэнна 706 00:37:49,000 --> 00:37:53,000 таму што літаральна вы будзеце ў канчатковым выніку марнуюць больш часу ў гэтым семестры 707 00:37:53,000 --> 00:37:56,000 ганяцца за памылкі, то вы б, калі б вы паклалі ў тым, што паўгадзіны / гадзіну 708 00:37:56,000 --> 00:38:00,000 На гэтым тыдні і ў наступным навучання, каб асвоіцца з GDB. 709 00:38:00,000 --> 00:38:02,000 Printf быў вашым сябрам. 710 00:38:02,000 --> 00:38:05,000 GDB павінен зараз быць вашым сябрам. 711 00:38:05,000 --> 00:38:08,000 >> Любыя пытанні па GDB? 712 00:38:08,000 --> 00:38:12,000 І вось кароткі спіс некаторых з найбольш магутных і карысных каманд. 713 00:38:12,000 --> 00:38:15,000 Так. >> Ці можна друкаваць радок? 714 00:38:15,000 --> 00:38:17,000 Вы можаце друкаваць радок? Цалкам дакладна. 715 00:38:17,000 --> 00:38:19,000 Гэта не павінны быць проста цэлыя лікі. 716 00:38:19,000 --> 00:38:22,000 Калі зменная а ўяўляе сабой радок, проста набярыце ў друку з. 717 00:38:22,000 --> 00:38:24,000 Ён пакажа вам, што гэта радок зменнай. 718 00:38:24,000 --> 00:38:26,000 [Неразборліва-студэнт] 719 00:38:26,000 --> 00:38:28,000 Гэта дасць вам адрас і саму радок. 720 00:38:28,000 --> 00:38:32,000 Ён пакажа вам абодвум. 721 00:38:32,000 --> 00:38:34,000 І яшчэ адна апошняя рэч, толькі таму, што гэта добра, каб ведаць таксама. 722 00:38:34,000 --> 00:38:37,000 Backtrace і рамы, дазвольце мне пагрузіцца ў гэта ў апошні раз, 723 00:38:37,000 --> 00:38:39,000 сапраўды такі жа праграме з GDB. 724 00:38:39,000 --> 00:38:44,000 Дазвольце мне ісці наперад і запусціць тэкставую версію карыстацкага інтэрфейсу, 725 00:38:44,000 --> 00:38:46,000 разбіць асноўныя. 726 00:38:46,000 --> 00:38:49,000 Дазвольце мне ісці наперад і бегчы зноў. Вось я. 727 00:38:49,000 --> 00:38:55,000 Цяпер дазвольце мне ісці далей, далей, далей, далей, далей, крок, ўвесці. 728 00:38:55,000 --> 00:39:00,000 >> А цяпер выкажам здагадку, што я цяпер у своп наўмысна, але я, як "Чорт, што было значэнне х?" 729 00:39:00,000 --> 00:39:02,000 Я не магу зрабіць больш х. 730 00:39:02,000 --> 00:39:05,000 Я не магу зрабіць у, таму што яны не ўваходзяць у камплект. 731 00:39:05,000 --> 00:39:07,000 Яны не ў кантэксце, але не праблема. 732 00:39:07,000 --> 00:39:09,000 Я магу надрукаваць след. 733 00:39:09,000 --> 00:39:13,000 Гэта паказвае мне ўсе функцыі, якія выконваюцца да гэтага моманту часу. 734 00:39:13,000 --> 00:39:16,000 Звярніце ўвагу, што адзін на дно, галоўнае, на адной лініі з асноўнымі 735 00:39:16,000 --> 00:39:18,000 знаходзячыся на ніжняй часткі нашай карціны тут. 736 00:39:18,000 --> 00:39:22,000 Той факт, што своп вышэй лініі з своп быць вышэй яго ў памяці тут, 737 00:39:22,000 --> 00:39:26,000 і калі я хачу вярнуцца да асноўнай часовай я магу сказаць "рамку". 738 00:39:26,000 --> 00:39:30,000 Які нумар? Галоўнае гэта кадр № 1. 739 00:39:30,000 --> 00:39:32,000 Я збіраюся ісці наперад і сказаць: "кадр 1". 740 00:39:32,000 --> 00:39:36,000 >> Зараз я вярнуўся ў асноўны, і я магу друкаваць х, і я магу надрукаваць у, 741 00:39:36,000 --> 00:39:40,000 але я не магу раздрукаваць або б. 742 00:39:40,000 --> 00:39:43,000 Але я магу, калі я скажу: «Добра, пачакайце хвілінку. Дзе быў своп?" 743 00:39:43,000 --> 00:39:46,000 Дазвольце мне ісці наперад і сказаць: "кадр 0". 744 00:39:46,000 --> 00:39:48,000 Цяпер я там, дзе я хачу быць, і ў бок, 745 00:39:48,000 --> 00:39:52,000 ёсць іншыя каманды таксама, як калі б вы сапраўды сумна набраўшы наступны, наступны, наступны, наступны, 746 00:39:52,000 --> 00:39:56,000 Вы можаце наогул сказаць нешта накшталт "наступныя 10", і што сыдзе на працягу наступных 10 радкоў. 747 00:39:56,000 --> 00:39:59,000 Вы таксама можаце напісаць "працягнуць", калі вы сапраўды стамляецеся ад пакрокавага ён. 748 00:39:59,000 --> 00:40:05,000 Працягвайце будзе запусціць праграму без перапынку, пакуль не сустрэне іншую кропку супыну, 749 00:40:05,000 --> 00:40:07,000 будзь то ў пятлю або ніжэй у вашу праграму. 750 00:40:07,000 --> 00:40:11,000 >> У гэтым выпадку мы працягвалі да канца, і праграма нармальна завяршыўся. 751 00:40:11,000 --> 00:40:13,000 Гэта мудрагелісты спосаб, саступае працэсу. 752 00:40:13,000 --> 00:40:16,000 Проста ваша праграма нармальна завяршыўся. 753 00:40:16,000 --> 00:40:24,000 Падрабязней пра гэта ў відэа і ў адладцы сесій у будучыні. 754 00:40:24,000 --> 00:40:26,000 Гэта было шмат. 755 00:40:26,000 --> 00:40:35,000 Давайце возьмем наш 5-хвілінны перапынак тут, і мы вернемся з структурам і файлаў. 756 00:40:35,000 --> 00:40:38,000 >> Калі вы нырнулі ў PSET на гэтым тыдні ўжо 757 00:40:38,000 --> 00:40:41,000 Вы будзеце ведаць, што мы выкарыстоўваем у размеркаванні код, 758 00:40:41,000 --> 00:40:45,000 зыходны код, які мы прадстаўляем вам у якасці адпраўной кропкі, некаторыя новыя метады. 759 00:40:45,000 --> 00:40:50,000 У прыватнасці, мы ўвялі гэта новае ключавое слова называецца структура, для структуры, 760 00:40:50,000 --> 00:40:53,000 так што мы можам ствараць карыстацкія зменныя гатункаў. 761 00:40:53,000 --> 00:40:57,000 Мы таксама ўвялі паняцце файла I / O, файлавага ўводу і высновы, 762 00:40:57,000 --> 00:41:00,000 і гэта так, што мы можам захаваць стан 763 00:41:00,000 --> 00:41:03,000 Вашай Scramble платы ў файл на дыску 764 00:41:03,000 --> 00:41:06,000 так што навучанне стыпендыятаў і я магу зразумець 765 00:41:06,000 --> 00:41:09,000 што адбываецца ўнутры вашай праграмы без неабходнасці ўручную гуляць 766 00:41:09,000 --> 00:41:11,000 дзесяткі гульняў Scramble. 767 00:41:11,000 --> 00:41:13,000 Мы можам зрабіць гэта больш automatedly. 768 00:41:13,000 --> 00:41:18,000 >> Гэтая ідэя структуры вырашае даволі пераканаўчыя праблемы. 769 00:41:18,000 --> 00:41:21,000 Выкажам здагадку, што мы хочам рэалізаваць некаторыя праграмы 770 00:41:21,000 --> 00:41:25,000 што нейкім чынам адсочвае інфармацыю пра студэнтаў, 771 00:41:25,000 --> 00:41:28,000 і студэнты маглі б мець, напрыклад, ID, імя, 772 00:41:28,000 --> 00:41:31,000 і дом у такім месцы, як Гарвард, таму гэтыя 3 часткі інфармацыі 773 00:41:31,000 --> 00:41:34,000 мы хочам, каб вакол, так што дазвольце мне ісці наперад і пачаць пісаць невялікую праграму тут, 774 00:41:34,000 --> 00:41:38,000 ўключае stdio.h. 775 00:41:38,000 --> 00:41:42,000 Дазвольце мне зрабіць ўключаць cs50.h. 776 00:41:42,000 --> 00:41:44,000 А потым пачаць сваю асноўную функцыю. 777 00:41:44,000 --> 00:41:46,000 Я не буду з любымі аргументамі каманднага радка, 778 00:41:46,000 --> 00:41:49,000 і вось я хачу, каб студэнт, так што я збіраюся сказаць, 779 00:41:49,000 --> 00:41:54,000 Студэнт мае імя, так што я збіраюся сказаць "радок імя". 780 00:41:54,000 --> 00:41:59,000 Тады я збіраўся сказаць студэнт таксама мае ідэнтыфікатар, так Int Ідэнтыфікатар, 781 00:41:59,000 --> 00:42:03,000 і студэнт мае дом, таму я таксама хацеў сказаць "радок дом". 782 00:42:03,000 --> 00:42:06,000 Тады я замоўлю гэтыя трохі больш акуратна, як гэта. 783 00:42:06,000 --> 00:42:11,000 Добра, зараз у мяне ёсць 3 зменныя, з якімі ўяўляюць студэнта, так што "студэнт". 784 00:42:11,000 --> 00:42:15,000 >> А цяпер я хачу, каб запоўніць гэтыя каштоўнасці, так што дазвольце мне ісці наперад і сказаць нешта накшталт: 785 00:42:15,000 --> 00:42:18,000 "ID = 123". 786 00:42:18,000 --> 00:42:21,000 Імя збіраецца атрымаць Давіда. 787 00:42:21,000 --> 00:42:24,000 Скажам, дом збіраецца атрымаць Mather, 788 00:42:24,000 --> 00:42:31,000 , А затым я збіраюся зрабіць нешта адвольна, як Е ("% S, 789 00:42:31,000 --> 00:42:37,000 з ідэнтыфікатарам% D,% пражывае ў с. 790 00:42:37,000 --> 00:42:41,000 А цяпер, што я хачу падлучыць сюды, адзін за адным? 791 00:42:41,000 --> 00:42:47,000 Імя, ідэнтыфікатар, дом, вяртаецца 0. 792 00:42:47,000 --> 00:42:50,000 Добра, калі я аблажаўся дзесьці тут 793 00:42:50,000 --> 00:42:54,000 Я думаю, што ў нас ёсць даволі добрая праграма, якая захоўвае адзін студэнт. 794 00:42:54,000 --> 00:42:57,000 Вядома, гэта не ўсё, што цікава. Што рабіць, калі я хачу мець 2 студэнта? 795 00:42:57,000 --> 00:42:59,000 Гэта не вялікая праблема. Я магу падтрымліваць 2 чалавек. 796 00:42:59,000 --> 00:43:03,000 Дазвольце мне пайсці далей і вылучыць гэта і спусціцца сюды, 797 00:43:03,000 --> 00:43:09,000 і я магу сказаць "ID = 456" для кагосьці, як Роб, які жыве ў Kirkland. 798 00:43:09,000 --> 00:43:12,000 >> Добра, пачакай, але я не магу назваць гэта тое ж самае, 799 00:43:12,000 --> 00:43:15,000 і, падобна, я буду мець, каб скапіяваць гэта, 800 00:43:15,000 --> 00:43:19,000 так што дазвольце мне сказаць, што гэта будуць зменныя Давіда, 801 00:43:19,000 --> 00:43:23,000 і дазвольце мне атрымаць копіі гэтых Роба. 802 00:43:23,000 --> 00:43:27,000 Мы называем гэтыя Роба, але гэта не будзе працаваць зараз 803 00:43:27,000 --> 00:43:33,000 таму што я-пачакайце, давайце зменім мяне id1, name1 і House1. 804 00:43:33,000 --> 00:43:35,000 Роб будзе 2, 2. 805 00:43:35,000 --> 00:43:42,000 Я павінен змяніць гэта тут, тут, тут, тут, тут, тут. 806 00:43:42,000 --> 00:43:45,000 Пачакайце, а як жа Томі? Давайце зробім гэта зноў. 807 00:43:45,000 --> 00:43:49,000 Відавочна, што калі вы ўсё яшчэ думаеце, што гэта добры спосаб зрабіць гэта, гэта не так, 808 00:43:49,000 --> 00:43:52,000 так капіяваць / ўставіць дрэнна. 809 00:43:52,000 --> 00:43:55,000 Але мы вырашылі гэты тыдзень таму. 810 00:43:55,000 --> 00:43:59,000 >> Што гэта было наша рашэнне, калі мы хацелі мець некалькі асобнікаў аднаго і таго ж тыпу дадзеных? 811 00:43:59,000 --> 00:44:01,000 [Студэнты] масіва. 812 00:44:01,000 --> 00:44:03,000 Масіва, так што дазвольце мне паспрабаваць ачысціць гэта. 813 00:44:03,000 --> 00:44:07,000 Дазвольце мне зрабіць некалькі нумароў для сябе на вяршыні, і дазвольце мне замест гэтага тут. 814 00:44:07,000 --> 00:44:12,000 Мы называем гэтых людзей, а замест гэтага я збіраюся сказаць "Int ідэнтыфікатары" 815 00:44:12,000 --> 00:44:14,000 і я збіраюся падтрымаць 3 з нас у цяперашні час. 816 00:44:14,000 --> 00:44:18,000 Я збіраюся сказаць "радок імёнаў", і я буду падтрымліваць 3 з нас, 817 00:44:18,000 --> 00:44:22,000 і тады я буду казаць "радок дома", і я буду падтрымліваць 3 з нас. 818 00:44:22,000 --> 00:44:26,000 Цяпер тут замест Давіда атрымліваць свае лакальныя зменныя 819 00:44:26,000 --> 00:44:28,000 Мы можам пазбавіцца ад іх. 820 00:44:28,000 --> 00:44:30,000 Гэта адчувае сябе добра, што мы ачыстка гэта. 821 00:44:30,000 --> 00:44:35,000 Затым я магу сказаць Дэвід будзе [0] і імёнаў [0] 822 00:44:35,000 --> 00:44:38,000 і дома [0]. 823 00:44:38,000 --> 00:44:41,000 А потым Роб аналагічна можна зэканоміць на гэтым. 824 00:44:41,000 --> 00:44:46,000 Давайце паставім гэта тут, так што ён збіраецца быць адвольна ідэнтыфікатараў [1]. 825 00:44:46,000 --> 00:44:50,000 Ён збіраецца быць імёны [1], 826 00:44:50,000 --> 00:44:53,000 , А затым, нарэшце, дома [1]. 827 00:44:53,000 --> 00:44:57,000 >> Яшчэ трохі стомна, і зараз у мяне ёсць, каб зразумець гэта, 828 00:44:57,000 --> 00:45:03,000 так скажам, "імёны [0], ID [0], дома [0], 829 00:45:03,000 --> 00:45:06,000 і давайце множным ліку гэта. 830 00:45:06,000 --> 00:45:09,000 Ідэнтыфікатары, ідэнтыфікатары, ідэнтыфікатары. 831 00:45:09,000 --> 00:45:12,000 І зноў жа, я раблю гэта, так зноў, я ўжо звяртаючыся да капіяваць / ўставіць зноў, 832 00:45:12,000 --> 00:45:14,000 так што шанцы ёсць іншае рашэнне тут. 833 00:45:14,000 --> 00:45:18,000 Я, верагодна, можа ачысціць гэта далей з пятлёй ці нешта накшталт гэтага, 834 00:45:18,000 --> 00:45:21,000 Карацей кажучы, гэта крыху лепш, але ўсё яшчэ адчувае сябе 835 00:45:21,000 --> 00:45:24,000 Я звяртаючыся да капіяваць / ўставіць, але нават гэта, я сцвярджаю, 836 00:45:24,000 --> 00:45:27,000 на самай справе не прынцыпова правільнае рашэнне, таму што 837 00:45:27,000 --> 00:45:29,000 Што рабіць, калі калі-небудзь мы вырашым вы ведаеце, што? 838 00:45:29,000 --> 00:45:32,000 Мы сапраўды павінны былі захоўвання адрасоў электроннай пошты для Дэвіда і Роб 839 00:45:32,000 --> 00:45:34,000 і ўсё астатняе ў гэтай праграме. 840 00:45:34,000 --> 00:45:36,000 Мы павінны таксама захоўваць тэлефонныя нумары. 841 00:45:36,000 --> 00:45:39,000 Мы павінны таксама захоўваць нумары экстранай сувязі. 842 00:45:39,000 --> 00:45:41,000 У нас ёсць усе гэтыя фрагменты дадзеных, якія мы хочам захаваць, 843 00:45:41,000 --> 00:45:43,000 так як вы ідзяце для гэтага зрабіць? 844 00:45:43,000 --> 00:45:46,000 >> Вы аб'яўляеце іншы масіў у верхняй частцы, а затым ўручную дадаць 845 00:45:46,000 --> 00:45:49,000 адрас электроннай пошты [0], адрас электроннай пошты [1] 846 00:45:49,000 --> 00:45:51,000 для Дэвіда і Роб і гэтак далей. 847 00:45:51,000 --> 00:45:56,000 Але на самай справе ўсяго толькі здагадка, якія ляжаць у аснове гэтай канструкцыі 848 00:45:56,000 --> 00:45:59,000 што я выкарыстоўваю сістэме гонару ведаць, што 849 00:45:59,000 --> 00:46:03,000 [I] у кожным з некалькіх масіваў 850 00:46:03,000 --> 00:46:06,000 Проста так здарылася, каб звярнуцца да тых жа асобай, 851 00:46:06,000 --> 00:46:10,000 так [0] у ідэнтыфікатарамі гэта нумар 123, 852 00:46:10,000 --> 00:46:13,000 і я буду лічыць, што імёны [0] 853 00:46:13,000 --> 00:46:16,000 такое ж імя чалавека і дома [0] 854 00:46:16,000 --> 00:46:21,000 з'яўляецца домам таго ж самага чалавека і так далей для ўсіх розных масіваў, якія я ствараю. 855 00:46:21,000 --> 00:46:24,000 Але звярніце ўвагу, што няма ніякіх фундаментальных сувязяў 856 00:46:24,000 --> 00:46:27,000 Сярод гэтых 3 частак інфармацыі, нумар, імя і дом, 857 00:46:27,000 --> 00:46:32,000 нават калі асоба мы спрабуем мадэль у гэтай праграме не масівы. 858 00:46:32,000 --> 00:46:35,000 Масівы з'яўляюцца менавіта гэты праграмны спосаб зрабіць гэта. 859 00:46:35,000 --> 00:46:38,000 Тое, што мы сапраўды хочам, каб змадэляваць ў нашай праграме гэта чалавек, 860 00:46:38,000 --> 00:46:41,000 як Давід, чалавек, як Роб, усярэдзіне якога 861 00:46:41,000 --> 00:46:46,000 або інкапсуляцыі гэтае імя і ID і дома. 862 00:46:46,000 --> 00:46:49,000 >> Ці можам мы неяк выказаць гэтую ідэю інкапсуляцыі 863 00:46:49,000 --> 00:46:52,000 , Пры якім чалавек мае ідэнтыфікатар, назву і дом 864 00:46:52,000 --> 00:46:55,000 і не звяртацца да рэчаіснасці гэты хак якой мы толькі што 865 00:46:55,000 --> 00:46:58,000 верыць, што нешта кранштэйны 866 00:46:58,000 --> 00:47:02,000 ставіцца да той жа чалавечай сутнасці ў кожным з гэтых разрозненых масіваў? 867 00:47:02,000 --> 00:47:04,000 Мы можам рэальна зрабіць гэта. 868 00:47:04,000 --> 00:47:08,000 Дазвольце мне пайсці вышэй асноўнага на дадзены момант, і дазвольце мне стварыць свой уласны тып дадзеных 869 00:47:08,000 --> 00:47:10,000 на самай справе ў першы раз. 870 00:47:10,000 --> 00:47:14,000 Мы выкарысталі гэтую тэхніку ў Scramble, 871 00:47:14,000 --> 00:47:17,000 але тут я збіраюся пайсці далей і стварыць тып дадзеных, 872 00:47:17,000 --> 00:47:19,000 і вы ведаеце, што я збіраюся называць гэта студэнт або чалавек, 873 00:47:19,000 --> 00:47:23,000 і я збіраюся выкарыстоўваць ЬурейеЕ для вызначэння тыпу. 874 00:47:23,000 --> 00:47:25,000 Я хачу сказаць, што гэта структура, 875 00:47:25,000 --> 00:47:29,000 а затым гэтая структура будзе мець тып студэнта, мы будзем казаць, 876 00:47:29,000 --> 00:47:31,000 хоць гэта крыху датаваныя цяпер для мяне. 877 00:47:31,000 --> 00:47:33,000 Мы гаворым "Int Ідэнтыфікатар». 878 00:47:33,000 --> 00:47:35,000 Мы кажам "радок імя". 879 00:47:35,000 --> 00:47:37,000 Тады мы кажам "Радок дом" 880 00:47:37,000 --> 00:47:40,000 так што цяпер да канца гэтыя некалькі радкоў кода 881 00:47:40,000 --> 00:47:45,000 Я толькі што вучыў ляск, што існуе 882 00:47:45,000 --> 00:47:49,000 Тып дадзеных, акрамя цэлых лікаў, акрамя радкоў, акрамя таго, у два разы, акрамя таго, паплаўкі. 883 00:47:49,000 --> 00:47:54,000 >> Па стане на дадзены момант часу радок 11, у цяперашні час новы тып дадзеных, які завецца студэнтаў, 884 00:47:54,000 --> 00:47:58,000 і цяпер я магу абвясціць зменную любы студэнт я хачу, 885 00:47:58,000 --> 00:48:01,000 так што дазвольце мне пракруціць ўніз для людзей. 886 00:48:01,000 --> 00:48:05,000 Цяпер я магу пазбавіцца ад гэтага, і я магу вярнуцца ўніз да Давіда тут, 887 00:48:05,000 --> 00:48:10,000 і для Дэвіда я магу рэальна сказаць, што Давід, 888 00:48:10,000 --> 00:48:13,000 можна літаральна назваць зменнай пасля сябе, 889 00:48:13,000 --> 00:48:16,000 будзе тып студэнта. 890 00:48:16,000 --> 00:48:18,000 Гэта можа здацца трохі дзіўным, але гэта не ўсё, што адрозніваецца 891 00:48:18,000 --> 00:48:22,000 ад аб'явы нешта ў выглядзе цэлага ліку або радкі або з якая плавае кропкай. 892 00:48:22,000 --> 00:48:24,000 Проста так здарылася, будзе называцца студэнтам зараз, 893 00:48:24,000 --> 00:48:28,000 і калі я хачу паставіць нешта ўнутры гэтай структуры 894 00:48:28,000 --> 00:48:31,000 У мяне зараз ёсць выкарыстоўваць новую частку сінтаксісу, але гэта даволі проста, 895 00:48:31,000 --> 00:48:39,000 david.id = 123, david.name = "Давід" у сталіцы D, 896 00:48:39,000 --> 00:48:42,000 і david.house = "Mather," 897 00:48:42,000 --> 00:48:46,000 і цяпер я магу пазбавіцца ад гэтай рэчы тут. 898 00:48:46,000 --> 00:48:51,000 Звярніце ўвагу, зараз мы перапрацавалі нашы праграмы сапраўды нашмат лепш 899 00:48:51,000 --> 00:48:54,000 у тым, што цяпер наша праграма адлюстроўвае рэальны свет. 900 00:48:54,000 --> 00:48:57,000 >> Там у рэальным свеце паняцце чалавека ці студэнта. 901 00:48:57,000 --> 00:49:02,000 Тут мы маем цяпер версіі C асобы або, больш канкрэтна студэнта. 902 00:49:02,000 --> 00:49:05,000 Унутры гэтага чалавека гэтыя адпаведныя характарыстыкі, 903 00:49:05,000 --> 00:49:10,000 ID, імя і дом, так што Роб сутнасці становіцца тое ж самае тут, 904 00:49:10,000 --> 00:49:14,000 так абрабаваць студэнта, а цяпер rob.id = 456, 905 00:49:14,000 --> 00:49:17,000 rob.name = "Боб". 906 00:49:17,000 --> 00:49:20,000 Той факт, што пераменная называецца Rob з'яўляецца свайго роду бессэнсоўнымі. 907 00:49:20,000 --> 00:49:22,000 Мы маглі б назваў гэта х ці ў, або г. 908 00:49:22,000 --> 00:49:25,000 Мы толькі што назваў яго Роб быць семантычна паслядоўным, 909 00:49:25,000 --> 00:49:28,000 але на самой справе клічуць ўнутры гэтага самага поля, 910 00:49:28,000 --> 00:49:30,000 так што зараз у мяне ёсць. 911 00:49:30,000 --> 00:49:33,000 Гэта таксама не падобна на лепшы дызайн у тым, што я жорстка Давіда. 912 00:49:33,000 --> 00:49:35,000 Я цвёрда Роб. 913 00:49:35,000 --> 00:49:39,000 І я ўсё яшчэ вымушаныя звяртацца да некаторых скапіруйце і ўстаўце кожны раз, калі я хачу новых зменных. 914 00:49:39,000 --> 00:49:43,000 Акрамя таго, я павінен па-відаць даць кожнай з гэтых зменных імя, 915 00:49:43,000 --> 00:49:46,000 хоць я б аддаў перавагу апісаць гэтыя зменныя 916 00:49:46,000 --> 00:49:48,000  ў больш агульным плане, як студэнты. 917 00:49:48,000 --> 00:49:52,000 >> Цяпер мы можам аб'яднаць ідэі, якія працуюць добра для нас 918 00:49:52,000 --> 00:49:56,000 і замест гэтага сказаў: "Ведаеш што, дай мне зменную званую студэнтаў, 919 00:49:56,000 --> 00:50:01,000 і няхай вас гэта будзе памерам 3 ", так што зараз я магу ўдакладніць гэта далей, 920 00:50:01,000 --> 00:50:04,000 пазбавіцца ад ручной заявіў Давід, 921 00:50:04,000 --> 00:50:08,000 і я магу, а сказаць нешта накшталт студэнтаў [0] тут. 922 00:50:08,000 --> 00:50:11,000 Затым я магу сказаць студэнтаў [0] тут, 923 00:50:11,000 --> 00:50:14,000 Студэнты [0] Тут і гэтак далей, і я магу хадзіць 924 00:50:14,000 --> 00:50:16,000 і чысты, што для Роба. 925 00:50:16,000 --> 00:50:19,000 Я мог бы таксама ісці аб цяпер, магчыма, даданне завесы 926 00:50:19,000 --> 00:50:23,000 і выкарыстанне GetString і GetInt на самай справе атрымаць гэтыя значэнні ад карыстальніка. 927 00:50:23,000 --> 00:50:27,000 Я мог бы ісці аб даданні пастаяннай, таму што гэта наогул дрэнная практыка 928 00:50:27,000 --> 00:50:29,000 на жорсткі код некаторыя адвольныя ліку, як 3 прама тут 929 00:50:29,000 --> 00:50:33,000 , А затым проста памятаеце, што вы павінны паставіць не больш за 3 студэнтаў у ім. 930 00:50:33,000 --> 00:50:36,000 Верагодна, было б лепш выкарыстоўваць # вызначыць у верхняй частцы майго файла 931 00:50:36,000 --> 00:50:40,000 і фактар, які, такім чынам, сапраўды, дай мне пайсці далей і абагульніць гэта. 932 00:50:40,000 --> 00:50:43,000 >> Дазвольце мне адкрыць прыкладу, што сярод сённяшніх 933 00:50:43,000 --> 00:50:46,000 Прыклады загадзя, structs1. 934 00:50:46,000 --> 00:50:49,000 Гэта больш поўная праграма, якая выкарыстоўвае # вызначыць тут 935 00:50:49,000 --> 00:50:51,000 і кажа, што мы збіраемся мець 3 студэнтаў па змаўчанні. 936 00:50:51,000 --> 00:50:54,000 Тут я аб'яўленні класа варта студэнтаў, 937 00:50:54,000 --> 00:50:57,000 так класе студэнтаў, і зараз я з дапамогай цыкла 938 00:50:57,000 --> 00:51:00,000 толькі, каб зрабіць код крыху больш элегантна, запоўніць клас 939 00:51:00,000 --> 00:51:05,000 з удзелам карыстальніка, так ітэрацыі з I = 0 на да студэнтаў, што на 3. 940 00:51:05,000 --> 00:51:07,000 І тады я прапанаваць карыстачу ў гэтай версіі 941 00:51:07,000 --> 00:51:10,000  Што ID студэнта, і я атрымліваю яго з GetInt. 942 00:51:10,000 --> 00:51:13,000 Што імя студэнта, а потым атрымаць яго з GetString. 943 00:51:13,000 --> 00:51:15,000 Што доме студэнта? Я атрымліваю яго з GetString. 944 00:51:15,000 --> 00:51:19,000 А затым у ніжняй тут я проста вырашыў змяніць 945 00:51:19,000 --> 00:51:22,000 як я друкую гэтыя, і на самай справе выкарыстаць цыкл, 946 00:51:22,000 --> 00:51:24,000 І хто я пячаткай? 947 00:51:24,000 --> 00:51:27,000 У адпаведнасці з каментаром я друкую нікому ў Mather, 948 00:51:27,000 --> 00:51:30,000 і вось менавіта таму Роб і Томі і гэтак далей, на самай справе Томі ў Mather. 949 00:51:30,000 --> 00:51:34,000 Томі і Дэвід будуць надрукаваныя ў гэтым выпадку, але як гэта працуе? 950 00:51:34,000 --> 00:51:40,000 Мы не бачылі гэтую функцыю раней, але зрабіць здагадку аб тым, што гэта робіць. 951 00:51:40,000 --> 00:51:42,000 Параўноўвае радка. 952 00:51:42,000 --> 00:51:45,000 >> Гэта крыху невідавочным, як ён параўноўвае радкі, таму што аказваецца, 953 00:51:45,000 --> 00:51:49,000 калі яна вяртае 0, што азначае, што радкі роўныя. 954 00:51:49,000 --> 00:51:53,000 Калі яна вяртае -1, што азначае, што чалавек прыходзіць у алфавітным парадку перад іншымі, 955 00:51:53,000 --> 00:51:57,000 і калі яна вяртае +1, што азначае слова прыходзіць іншы ў алфавітным парадку 956 00:51:57,000 --> 00:52:00,000 перад іншымі, і вы можаце глядзець онлайн або ў даведачную старонку 957 00:52:00,000 --> 00:52:04,000 , Каб убачыць, які менавіта спосаб якую, але ўсё гэта цяпер робіць гэта кажа 958 00:52:04,000 --> 00:52:09,000 калі [I]. Дом роўна "Мазер" 959 00:52:09,000 --> 00:52:13,000 затым пайсці далей і раздрукаваць так і так знаходзіцца ў Mather. 960 00:52:13,000 --> 00:52:16,000 Але вось тое, што мы раней не бачылі, і мы вернемся да гэтага. 961 00:52:16,000 --> 00:52:21,000 Я не памятаю, ніколі не маючы для гэтага ні ў адной з маіх праграм. 962 00:52:21,000 --> 00:52:24,000 Бясплатныя мабыць спасылкай на памяць, вызваляючы аператыўную памяць, 963 00:52:24,000 --> 00:52:31,000 але тое, што памяць я мабыць вызваленне ў гэтым цыкле ў ніжняй часткі гэтай праграмы? 964 00:52:31,000 --> 00:52:34,000 Падобна на тое, я вызваляючы імя чалавека 965 00:52:34,000 --> 00:52:37,000 і дом чалавека, але навошта гэта? 966 00:52:37,000 --> 00:52:41,000 >> Аказваецца, усе гэтыя тыдні, што вы выкарыстоўваеце GetString 967 00:52:41,000 --> 00:52:45,000 Мы відаў ўкараняе памылку ў кожнай з вашых праграм. 968 00:52:45,000 --> 00:52:51,000 GetString памяццю дызайн вылучае так што ён можа вярнуцца да вас радкі, 969 00:52:51,000 --> 00:52:55,000 падобна Давіду, і Роб, і вы можаце рабіць усё, што вы хочаце 970 00:52:55,000 --> 00:52:59,000 з гэтага радка ў праграме, таму што мы абаронены памяці для вас. 971 00:52:59,000 --> 00:53:02,000 Праблема ў тым, увесь гэты час кожны раз, калі вы тэлефануеце GetString 972 00:53:02,000 --> 00:53:05,000 Мы, аўтары GetString, пыталіся аперацыйнай сістэмы 973 00:53:05,000 --> 00:53:07,000 , Каб даць нам крыху аператыўнай памяці для гэтага радка. 974 00:53:07,000 --> 00:53:09,000 Дайце нам крыху АЗП для наступнага радка. 975 00:53:09,000 --> 00:53:11,000 Дайце нам крыху больш аператыўнай памяці для наступнага радка. 976 00:53:11,000 --> 00:53:13,000 Тое, што вы праграміст, ніколі не рабіў 977 00:53:13,000 --> 00:53:15,000 дае нам, што памяць назад, 978 00:53:15,000 --> 00:53:17,000 Такім чынам, для гэтых некалькіх тыдняў усе праграмы, вы напісалі 979 00:53:17,000 --> 00:53:20,000 было тое, што завецца памяццю скачок якой яны працягваюць выкарыстоўваць 980 00:53:20,000 --> 00:53:24,000 больш і больш памяці пры кожным выкліку GetString, і гэта нармальна. 981 00:53:24,000 --> 00:53:27,000 Мы свядома робім, што ў першыя тыдні, таму што гэта не цікава 982 00:53:27,000 --> 00:53:29,000 , Каб турбавацца пра тое, дзе радка і адкуль. 983 00:53:29,000 --> 00:53:34,000 Усё, што вы хочаце гэта слова адзежу вярнуцца, калі карыстальнік ўводзіць яго цалі 984 00:53:34,000 --> 00:53:38,000 >> Але рух наперад у нас зараз ёсць, каб пачаць атрымліваць больш складаныя з гэтай нагоды. 985 00:53:38,000 --> 00:53:42,000 Кожны раз, калі мы вылучаем памяць, мы лепш у канчатковым выніку перадаць яго назад. 986 00:53:42,000 --> 00:53:45,000 У адваротным выпадку ў рэальным свеце на вашым Mac ці PC вы, магчыма, часам дасведчаныя 987 00:53:45,000 --> 00:53:50,000 Сімптомы, дзе ваш кампутар завісае ў канчатковым выніку 988 00:53:50,000 --> 00:53:54,000 альбо дурны які верціцца шар пляж знаходзіцца ўсяго займаюць кампутара 989 00:53:54,000 --> 00:53:56,000 ўся ўвага, і вы не можаце рабіць рэчы. 990 00:53:56,000 --> 00:54:00,000 Гэта можна растлумачыць любую колькасць памылак, але сярод тых, магчымыя памылкі 991 00:54:00,000 --> 00:54:03,000 якія, што называецца ўцечка памяці якой той, хто пісаў, што частка праграмнага забеспячэння 992 00:54:03,000 --> 00:54:07,000 Вы выкарыстоўваеце не памятаю, каб вызваліць памяць 993 00:54:07,000 --> 00:54:10,000 што ён ці яна папрасіла аперацыйнай сістэмы для, 994 00:54:10,000 --> 00:54:14,000 не выкарыстоўваецца GetString, таму што гэта CS50 рэч, але з выкарыстаннем аналагічных функцый 995 00:54:14,000 --> 00:54:16,000 спытаеце, што аперацыйная сістэма на памяць. 996 00:54:16,000 --> 00:54:19,000 Калі вы ці яны сапсаваць і ніколі не вернуцца, што памяць 997 00:54:19,000 --> 00:54:24,000 сімптом, які можа быць тое, што праграма запавольваецца і запавольваецца і запавольваецца 998 00:54:24,000 --> 00:54:26,000 калі вы памятаеце, каб патэлефанаваць бясплатна. 999 00:54:26,000 --> 00:54:28,000 >> Мы вернемся, калі і чаму вы маглі б назваць вольным, 1000 00:54:28,000 --> 00:54:32,000 Але давайце ісці наперад толькі для добрай мерай і паспрабуйце запусціць гэтую канкрэтную праграму. 1001 00:54:32,000 --> 00:54:35,000 Гэта называецца structs1, увядзіце. 1002 00:54:35,000 --> 00:54:40,000 Дазвольце мне ісці наперад і працаваць structs1, 123, David Mather, 1003 00:54:40,000 --> 00:54:47,000 456, Rob Kirkland, 789, 1004 00:54:47,000 --> 00:54:50,000 Томі Mather, і мы бачым Давіда ў Mather, Томі ў Mather. 1005 00:54:50,000 --> 00:54:53,000 Гэта ўсяго толькі маленькая праверка наяўнасці свядомасці, што праграма працуе. 1006 00:54:53,000 --> 00:54:56,000 Зараз, на жаль, гэтая праграма з'яўляецца трохі хвалюе ў тым, што 1007 00:54:56,000 --> 00:55:00,000 Я зрабіў усё, што праца, я набраў у 9 розных радкоў, націсніце ўвод, 1008 00:55:00,000 --> 00:55:04,000 сказалі, хто быў у Mather, але, відавочна, я не ведаў, хто быў у Mather ўжо таму, што я набраў яго. 1009 00:55:04,000 --> 00:55:07,000 Было б па меншай меры нядрэнна, калі б гэтая праграма больш падобная на базу дадзеных 1010 00:55:07,000 --> 00:55:10,000 і ён сапраўды памятае, што я набраў у 1011 00:55:10,000 --> 00:55:12,000 так што я ніколі больш не прыйдзецца ўводзіць гэтыя запісы студэнтаў. 1012 00:55:12,000 --> 00:55:15,000 Можа быць, гэта як registrarial сістэмы. 1013 00:55:15,000 --> 00:55:21,000 >> Мы можам зрабіць гэта з дапамогай гэтага метаду, вядомага як файлавы ўвод / выснова, файлавага ўводу і высновы, 1014 00:55:21,000 --> 00:55:24,000 Вельмі агульны спосаб сказаць, што ў любы час вы хочаце чытаць файлы або запісаць файлы 1015 00:55:24,000 --> 00:55:26,000 Вы можаце зрабіць гэта з пэўным наборам функцый. 1016 00:55:26,000 --> 00:55:29,000 Дазвольце мне ісці наперад і адкрыць гэты прыклад structs2.c, 1017 00:55:29,000 --> 00:55:33,000 якія амаль ідэнтычныя, але давайце паглядзім, што ён зараз робіць. 1018 00:55:33,000 --> 00:55:36,000 У верхняй частцы файла я абвясціць клас студэнтаў. 1019 00:55:36,000 --> 00:55:38,000 Я тады запаўнення класа з карыстацкім уводам, 1020 00:55:38,000 --> 00:55:41,000 так што тыя радкі кода гэтак жа, як і раней. 1021 00:55:41,000 --> 00:55:45,000 Тады, калі я пракруціць ўніз тут я друкую ўсе, хто знаходзіцца ў Mather адвольна, як і раней, 1022 00:55:45,000 --> 00:55:47,000 Але гэта цікавая новая функцыя. 1023 00:55:47,000 --> 00:55:51,000 Гэтыя радкі кода з'яўляюцца новымі, і яны ўносяць нешта тут, 1024 00:55:51,000 --> 00:55:55,000 FILE, усё загалоўныя, і яна мае * тут таксама. 1025 00:55:55,000 --> 00:55:58,000 Дазвольце мне перанесці гэты сюды, * тут таксама. 1026 00:55:58,000 --> 00:56:00,000 >> Гэтая функцыя, якую мы раней не бачылі, Еореп, 1027 00:56:00,000 --> 00:56:03,000 але гэта азначае адкрыццё файла, так што давайце бегла гэтым, 1028 00:56:03,000 --> 00:56:05,000 і гэта тое, што мы вернемся ў будучыні psets, 1029 00:56:05,000 --> 00:56:10,000 але гэтая лінія тут па сутнасці адкрывае файл з імем базы дадзеных, 1030 00:56:10,000 --> 00:56:13,000 і гэта вызначана адкрывае яго такім чынам, што ён можа рабіць усё, што з ім? 1031 00:56:13,000 --> 00:56:15,000 [Неразборліва-студэнт] 1032 00:56:15,000 --> 00:56:19,000 Права, такім чынам, "W" азначае толькі то гэта гаворыць аперацыйнай сістэмы 1033 00:56:19,000 --> 00:56:21,000 адкрыць гэты файл такім чынам, што я магу напісаць да яго. 1034 00:56:21,000 --> 00:56:23,000 Я не хачу, каб прачытаць яго. Я не хачу, каб проста паглядзець на яе. 1035 00:56:23,000 --> 00:56:26,000 Я хачу змяніць і дадаць матэрыял патэнцыйна да яго, 1036 00:56:26,000 --> 00:56:28,000 і файл будзе называцца базай дадзеных. 1037 00:56:28,000 --> 00:56:30,000 Гэта можна назваць што заўгодна. 1038 00:56:30,000 --> 00:56:32,000 Гэта можа быць database.txt. Гэта магло б быць. Дб. 1039 00:56:32,000 --> 00:56:37,000 Гэта можа быць слова, як Foo, але я адвольна выбраў імя файла базы дадзеных. 1040 00:56:37,000 --> 00:56:42,000 Гэта крыху праверку наяўнасці свядомасці, што мы вернемся да вельмі падрабязна з цягам часу, 1041 00:56:42,000 --> 00:56:47,000 Калі FP, для паказальніка файла, не роўна NULL, што азначае, што ўсё добра. 1042 00:56:47,000 --> 00:56:51,000 >> Карацей кажучы, такія функцыі, як Еореп часам церпяць няўдачу. 1043 00:56:51,000 --> 00:56:53,000 Магчыма, файл не існуе. Можа быць, вы з дыскавай прасторы. 1044 00:56:53,000 --> 00:56:55,000 Можа быць, вы не маеце правоў доступу да гэтай тэчцы, 1045 00:56:55,000 --> 00:56:58,000 так што калі Еореп вяртае нулявое нешта дрэннае здарылася. 1046 00:56:58,000 --> 00:57:02,000 І наадварот, калі Еореп не вяртае нулявое усё добра 1047 00:57:02,000 --> 00:57:04,000 і я магу пачаць пісаць у гэты файл. 1048 00:57:04,000 --> 00:57:06,000 Вось новы трук. 1049 00:57:06,000 --> 00:57:08,000 Гэта цыкл які ітэрацыі па кожным з маіх студэнтаў, 1050 00:57:08,000 --> 00:57:10,000 і гэта выглядае так падобныя на тое, што мы рабілі раней, 1051 00:57:10,000 --> 00:57:15,000 але гэтая функцыя з'яўляецца стрыечным братам Printf называецца Fprintf для файла Printf, 1052 00:57:15,000 --> 00:57:18,000 і заўважыце, што ён адрозніваецца толькі 2 шляхі. 1053 00:57:18,000 --> 00:57:20,000 Па-першае, ён пачынаецца з F замест р, 1054 00:57:20,000 --> 00:57:23,000 але тады яе першым аргументам з'яўляецца тое, што мабыць? 1055 00:57:23,000 --> 00:57:25,000 [Студэнты] файла. >> Гэта файл. 1056 00:57:25,000 --> 00:57:30,000 Гэта тое, што называецца FP, які мы ў рэшце рэшт дражняць адзін ад аднаго, што файл паказальніка, 1057 00:57:30,000 --> 00:57:35,000 але цяпер FP ўяўляе сабой проста файл, які я адкрыў, 1058 00:57:35,000 --> 00:57:41,000 так Fprintf тут кажуць раздрукаваць ID гэтага карыстальніка да файла, а не на экран. 1059 00:57:41,000 --> 00:57:44,000 Надрукаваць імя карыстальніка ў файл, а не на экран, 1060 00:57:44,000 --> 00:57:47,000 Хата ў файл, а не на экране, а затым тут, відавочна, 1061 00:57:47,000 --> 00:57:50,000 зачыніць файл, а затым сюды бясплатны памяці. 1062 00:57:50,000 --> 00:57:53,000 >> Адзіная розніца паміж гэтай версіі 2 і версіі 1 1063 00:57:53,000 --> 00:57:58,000 з'яўляецца ўвядзенне Еореп і гэта файл з пашырэннем * 1064 00:57:58,000 --> 00:58:01,000 і гэта паняцце Fprintf, так што давайце паглядзім, што канчатковы вынік. 1065 00:58:01,000 --> 00:58:03,000 Адпусціце мяне ў маім акне тэрмінала. 1066 00:58:03,000 --> 00:58:06,000 Дазвольце мне выканаць structs2, увядзіце. 1067 00:58:06,000 --> 00:58:09,000 Падобна на тое, усё будзе добра. Давайце паўторна structs2. 1068 00:58:09,000 --> 00:58:15,000 123, David Mather, 456, Rob Kirkland, 1069 00:58:15,000 --> 00:58:19,000 789, Томі Mather, увядзіце. 1070 00:58:19,000 --> 00:58:23,000 Падобна на тое, ён паводзіў сябе так жа, але калі я цяпер раблю Ls 1071 00:58:23,000 --> 00:58:28,000 заўважыце, што файл знаходзіцца тут сярод усіх мой код, базы дадзеных, 1072 00:58:28,000 --> 00:58:32,000 так давайце адкрыем, што Gedit базы дадзеных, і глядзець на гэта. 1073 00:58:32,000 --> 00:58:34,000 Гэта не самы сэксуальны фарматаў файлаў. 1074 00:58:34,000 --> 00:58:38,000 Гэта на самай справе адна частка дадзеных лініі на лінію за лініяй, 1075 00:58:38,000 --> 00:58:42,000 але тыя з вас, хто выкарыстоўвае Excel або CSV файлаў, значэнні, падзеленыя коскамі, 1076 00:58:42,000 --> 00:58:47,000 Я мог бы, вядома, выкарыстоўваць Fprintf замест гэтага, можа быць, зрабіць нешта накшталт гэтага 1077 00:58:47,000 --> 00:58:50,000 так што я мог фактычна стварыць эквівалент файл Excel 1078 00:58:50,000 --> 00:58:53,000 шляхам аддзялення рэчы з коскамі, а не толькі новых ліній. 1079 00:58:53,000 --> 00:58:56,000 >> У гэтым выпадку, калі б замест гэтага выкарыстоўваць коскі замест новых ліній 1080 00:58:56,000 --> 00:59:01,000 Я мог літаральна адкрыць гэты файл базы дадзеных у Excel, калі я замест гэтага зрабіў яго падобным на гэта. 1081 00:59:01,000 --> 00:59:03,000 Карацей кажучы, цяпер, калі ў нас ёсць сілы, каб пісаць файлы 1082 00:59:03,000 --> 00:59:07,000 Цяпер мы можам пачаць захавання дадзеных, захоўваючы яго на дыск вакол 1083 00:59:07,000 --> 00:59:10,000 так што мы можам захоўваць інфармацыю вакол зноў і зноў. 1084 00:59:10,000 --> 00:59:14,000 Звярніце ўвагу на некалькі іншых рэчаў, якія зараз крыху больш знаёма. 1085 00:59:14,000 --> 00:59:16,000 У верхняй часткі гэтага файла C мы маем ЬурейеЕ 1086 00:59:16,000 --> 00:59:21,000 таму што мы хацелі стварыць тып дадзеных, які ўяўляе сабой слова, 1087 00:59:21,000 --> 00:59:25,000 так што гэты тып называецца словам, а ў сярэдзіне гэтай структуры 1088 00:59:25,000 --> 00:59:27,000 гэта крыху аматар цяпер. 1089 00:59:27,000 --> 00:59:30,000 Чаму слова складаецца з відаць масіва? 1090 00:59:30,000 --> 00:59:33,000 Што такое слова проста інтуітыўна? 1091 00:59:33,000 --> 00:59:35,000 >> Гэта масіў знакаў. 1092 00:59:35,000 --> 00:59:37,000 Гэта паслядоўнасць знакаў, спіна да спіны да спіны. 1093 00:59:37,000 --> 00:59:41,000 ЛІСТЫ загалоўнымі літарамі, здараецца, мы калі заўгодна казаць максімальнай даўжыні 1094 00:59:41,000 --> 00:59:44,000 любое слова ў слоўнік, які мы выкарыстоўваем для Scramble. 1095 00:59:44,000 --> 00:59:46,000 Чаму я 1? 1096 00:59:46,000 --> 00:59:48,000 Нулявы знак. 1097 00:59:48,000 --> 00:59:51,000 Нагадаем, калі мы рабілі напрыклад Bananagrams мы павінны асаблівае значэнне 1098 00:59:51,000 --> 00:59:55,000 У канцы слова для таго, каб адсочваць 1099 00:59:55,000 --> 00:59:59,000 , Дзе словы на самой справе скончыліся, і як спецыфікацыя праблема набору кажа 1100 00:59:59,000 --> 01:00:03,000 Тут мы зносін з дадзеным словам лагічнае значэнне, 1101 01:00:03,000 --> 01:00:05,000 Сцяг, так бы мовіць, сапраўдным або ілжывым. 1102 01:00:05,000 --> 01:00:09,000 Знайшлі Ці вы гэта слова ўжо, таму што мы разумеем, 1103 01:00:09,000 --> 01:00:13,000 мы сапраўды маем патрэбу спосаб запамінання не толькі тое, што слова ёсць у Scramble 1104 01:00:13,000 --> 01:00:15,000 але вы ці не, чалавека, знайшлі яго 1105 01:00:15,000 --> 01:00:20,000 так што калі вы знойдзеце слова "" Вы не можаце проста ўвесці, уводзіць, уводзіць, увядзіце 1106 01:00:20,000 --> 01:00:23,000 і атрымаеце 3 балы, 3 балы, 3 балы, 3 балы. 1107 01:00:23,000 --> 01:00:26,000 Мы хочам мець магчымасць у чорны спіс, што слова, усталяваўшы лагічнае 1108 01:00:26,000 --> 01:00:29,000 праўдзіва, калі вы ўжо знайшлі яго, і менавіта таму мы 1109 01:00:29,000 --> 01:00:31,000 інкапсуляваць яго ў гэтую структуру. 1110 01:00:31,000 --> 01:00:35,000 >> Цяпер, тут, у Scramble ёсць гэтая іншая структура называецца слоўнікам. 1111 01:00:35,000 --> 01:00:39,000 Пры адсутнасці тут з'яўляецца слова ЬурейеЕ, таму што ў гэтым выпадку 1112 01:00:39,000 --> 01:00:43,000 мы павінны інкапсуляваць Ідэя слоўніка, 1113 01:00:43,000 --> 01:00:46,000 і слоўнік змяшчае цэлую кучу слоў, 1114 01:00:46,000 --> 01:00:49,000 як вынікае з гэтага масіва, і як многія з гэтых слоў? 1115 01:00:49,000 --> 01:00:51,000 Ну, што б гэта зменная памеры кажа. 1116 01:00:51,000 --> 01:00:53,000 Але нам проста трэба адзін слоўнік. 1117 01:00:53,000 --> 01:00:55,000 Нам не патрэбныя тыпы дадзеных называюцца слоўнік. 1118 01:00:55,000 --> 01:00:58,000 Нам трэба ўсяго толькі адно з іх, так атрымліваецца ў C 1119 01:00:58,000 --> 01:01:03,000 што, калі вы не кажаце ЬурейеЕ, вы проста кажаце структуры, то ў фігурных дужках 1120 01:01:03,000 --> 01:01:05,000 Вы змяшчаеце вашыя зменныя, то вы змяшчаеце імя. 1121 01:01:05,000 --> 01:01:09,000 Гэта аб'ява адной зменнай называецца слоўнік 1122 01:01:09,000 --> 01:01:11,000 які выглядае наступным чынам. 1123 01:01:11,000 --> 01:01:16,000 З іншага боку, гэтыя лініі стварэння шматразовых структура дадзеных называецца словам 1124 01:01:16,000 --> 01:01:19,000 што вы можаце стварыць некалькі копій, гэтак жа, як мы стварылі 1125 01:01:19,000 --> 01:01:22,000 некалькі копій студэнтаў. 1126 01:01:22,000 --> 01:01:24,000 >> Што гэта ў канчатковым выніку дазволіць нам рабіць? 1127 01:01:24,000 --> 01:01:30,000 Дазвольце мне вярнуцца ў, скажам так, больш просты прыклад з больш простых часоў, 1128 01:01:30,000 --> 01:01:34,000 і дазвольце мне адкрыць, скажам, compare1.c. 1129 01:01:34,000 --> 01:01:38,000 Праблема тут у руках на самай справе адхіліце 1130 01:01:38,000 --> 01:01:41,000 пласт радок і пачаць ўзлёт гэтых навучальных колах 1131 01:01:41,000 --> 01:01:44,000 таму што атрымліваецца, што радок ўвесь гэты час 1132 01:01:44,000 --> 01:01:47,000 з'яўляецца, як мы і абяцалі ў тыдзень 1 сапраўды толькі мянушка, 1133 01:01:47,000 --> 01:01:51,000 Сінонім ад CS50 бібліятэкі за тое, што выглядае трохі больш загадкавым, 1134 01:01:51,000 --> 01:01:53,000 сімвал *, і мы бачылі гэтую зорку раней. 1135 01:01:53,000 --> 01:01:55,000 Мы бачылі гэта ў кантэксце файлы. 1136 01:01:55,000 --> 01:01:59,000 >> Давайце паглядзім, чаму мы хавалі гэтую дэталь на працягу некаторага часу. 1137 01:01:59,000 --> 01:02:02,000 Вось файл з імем compare1.c, 1138 01:02:02,000 --> 01:02:07,000 і ён, відавочна, прапануе карыстачу на 2 радкі, з і т, 1139 01:02:07,000 --> 01:02:11,000 а затым ён спрабуе параўнаць гэтыя радкі роўнасці ў радку 26, 1140 01:02:11,000 --> 01:02:14,000 і калі яны роўныя яна кажа: "Вы набралі адно і тое ж», 1141 01:02:14,000 --> 01:02:17,000 і калі яны не роўныя яна кажа: "Вы ўвялі розныя рэчы". 1142 01:02:17,000 --> 01:02:19,000 Дазвольце мне ісці наперад і запусціць гэтую праграму. 1143 01:02:19,000 --> 01:02:23,000 Адпусціце мяне ў мой зыходны каталог, зрабіць compare1. Ён складзены ў парадку. 1144 01:02:23,000 --> 01:02:25,000 Дазвольце мне выканаць compare1. 1145 01:02:25,000 --> 01:02:27,000 Я буду павялічваць, увядзіце. 1146 01:02:27,000 --> 01:02:29,000 Скажы што-небудзь. HELLO. 1147 01:02:29,000 --> 01:02:32,000 Я скажу нешта зноў. HELLO. 1148 01:02:32,000 --> 01:02:34,000 Я дакладна не ўводзіць розныя рэчы. 1149 01:02:34,000 --> 01:02:37,000 >> Дазвольце мне паспрабаваць гэта зноў. BYE BYE. 1150 01:02:37,000 --> 01:02:40,000 Вызначана не адрозніваецца, так што тут адбываецца? 1151 01:02:40,000 --> 01:02:44,000 Ну, тое, што сапраўды па параўнанні ў радку 26? 1152 01:02:44,000 --> 01:02:46,000 [Неразборліва-студэнт] 1153 01:02:46,000 --> 01:02:49,000 Так, так атрымліваецца, што радок, тып дадзеных, гэта свайго роду хлусня ў выратаванне. 1154 01:02:49,000 --> 01:02:53,000 Радок знакаў *, але тое, што знак *? 1155 01:02:53,000 --> 01:02:56,000 Сімвал *, як кажуць, з'яўляецца паказальнікам, 1156 01:02:56,000 --> 01:03:00,000 і паказальнік эфектыўна адрас, 1157 01:03:00,000 --> 01:03:05,000 Сума месца ў памяці, і, калі вам здарыцца ўвялі ў слова, як HELLO, 1158 01:03:05,000 --> 01:03:08,000 Нагадаем мінулых абмеркаванняў радкоў 1159 01:03:08,000 --> 01:03:16,000 гэта падобна на слова HELLO. 1160 01:03:16,000 --> 01:03:19,000 Памятаеце, што слова, як PRIVET могуць быць прадстаўлены 1161 01:03:19,000 --> 01:03:22,000 як масіў сімвалаў, як гэта 1162 01:03:22,000 --> 01:03:25,000 а затым з дапамогай спецыяльнага знака ў канцы званы нулявы знак, 1163 01:03:25,000 --> 01:03:27,000 як \ пазначае. 1164 01:03:27,000 --> 01:03:29,000 Што на самай справе з'яўляецца радком? 1165 01:03:29,000 --> 01:03:32,000 Заўважым, што гэта некалькі участкаў памяці, 1166 01:03:32,000 --> 01:03:36,000 і на самай справе, канец вядома толькі, калі паглядзець усю радок 1167 01:03:36,000 --> 01:03:38,000 шукае асаблівы характар ​​нулявы. 1168 01:03:38,000 --> 01:03:41,000 Але калі гэта кавалак памяці з майго кампутара, 1169 01:03:41,000 --> 01:03:44,000 Давайце адвольна сказаць, што гэты радок проста пашанцавала, 1170 01:03:44,000 --> 01:03:47,000 і ён, былі ўладкаваны ў самым пачатку аператыўнай памяці майго кампутара. 1171 01:03:47,000 --> 01:03:54,000 Гэта байт 0, 1, 2, 3, 4, 5, 6 ... 1172 01:03:54,000 --> 01:04:02,000 >> Калі я кажу нешта накшталт GetString і я радок S = GetString 1173 01:04:02,000 --> 01:04:04,000 што на самой справе вяртаюцца? 1174 01:04:04,000 --> 01:04:08,000 За гэтыя апошнія некалькі тыдняў, што на самой справе захоўваецца ў ы 1175 01:04:08,000 --> 01:04:13,000 Але не гэтая радок сама па сабе, але ў дадзеным выпадку тое, што захоўваецца з'яўляецца 1176 01:04:13,000 --> 01:04:18,000 лік 0, так што на самай справе робіць GetString 1177 01:04:18,000 --> 01:04:20,000 яно фізічна не вяртаць радок. 1178 01:04:20,000 --> 01:04:22,000 Гэта нават не рэальна зрабіць канцэптуальным сэнсе. 1179 01:04:22,000 --> 01:04:24,000 Што яна робіць вяртанне ліку. 1180 01:04:24,000 --> 01:04:28,000 Гэта лік з'яўляецца адрасам PRIVET у памяці, 1181 01:04:28,000 --> 01:04:32,000 і радок з потам, калі мы адхіліце гэты пласт, радок на самай справе не існуе. 1182 01:04:32,000 --> 01:04:35,000 Гэта ўсяго толькі спрашчэнне CS50 бібліятэкі. 1183 01:04:35,000 --> 01:04:38,000 >> Гэта сапраўды тое, што называецца сімвал *. 1184 01:04:38,000 --> 01:04:41,000 Char мае сэнс, таму што слова, як Ала? 1185 01:04:41,000 --> 01:04:44,000 Ну, гэта серыя знакаў, набор знакаў. 1186 01:04:44,000 --> 01:04:47,000 Char * азначае, што адрас характару, 1187 01:04:47,000 --> 01:04:50,000 так што гэта значыць для вяртання радкі? 1188 01:04:50,000 --> 01:04:53,000 Добры, просты спосаб вяртання радкі 1189 01:04:53,000 --> 01:04:57,000 ёсць, а не спрабаваць высветліць, як я вяртаюся ў 5 або 6 розных байтаў 1190 01:04:57,000 --> 01:05:01,000 Дазвольце мне вярнуцца ў адрас якога байт? 1191 01:05:01,000 --> 01:05:03,000 Першы. 1192 01:05:03,000 --> 01:05:06,000 Іншымі словамі, дазвольце мне даць вам адрас знака ў памяці. 1193 01:05:06,000 --> 01:05:10,000 Вось што знак * ўяўляе сабой, па адрасе аднаго знака ў памяці. 1194 01:05:10,000 --> 01:05:12,000 Выклічце гэтую зменную с. 1195 01:05:12,000 --> 01:05:15,000 Захоўваць у прыватнасці, што з адрасу, які я ўмоўна сказаў роўны 0, 1196 01:05:15,000 --> 01:05:19,000 толькі, каб трымаць рэчы простымі, але на самой справе гэта наогул вялікія ліку. 1197 01:05:19,000 --> 01:05:21,000 >> Пачакайце хвіліну. 1198 01:05:21,000 --> 01:05:23,000 Калі вы толькі што далі мне адрас першага знака, як я ведаю, што адрас 1199 01:05:23,000 --> 01:05:25,000 Другі персанаж, трэці, чацвёрты і пяты? 1200 01:05:25,000 --> 01:05:27,000 [Неразборліва-студэнт] 1201 01:05:27,000 --> 01:05:31,000 Вы толькі ведаеце, дзе ў канцы радка праз гэты зручны трук, 1202 01:05:31,000 --> 01:05:35,000 таму, калі вы выкарыстоўваеце нешта накшталт Printf, што Printf літаральна бярэ ў якасці аргументу, 1203 01:05:35,000 --> 01:05:39,000 Нагадаем, што мы выкарыстоўваем запаўняльнік% з гэтым, а потым перайсці ў 1204 01:05:39,000 --> 01:05:41,000 зменнай, якая захоўвання радка. 1205 01:05:41,000 --> 01:05:47,000 Тое, што вы сапраўды праходзіць гэта адрас першага знака гэтага радка. 1206 01:05:47,000 --> 01:05:50,000 Printf затым выкарыстоўваецца для цыклу або час цыклу пры атрыманні гэтым адрасе, 1207 01:05:50,000 --> 01:05:53,000 Напрыклад, 0, так што дазвольце мне зрабіць гэта цяпер, 1208 01:05:53,000 --> 01:06:02,000 Е ("% з \ п", с); 1209 01:06:02,000 --> 01:06:07,000 Калі я называю Е ("% з \ п", с); што я сапраўды прадастаўленні Printf з 1210 01:06:07,000 --> 01:06:13,000 гэта адрас першага знака ў S, якое ў гэтым выпадку з'яўляецца адвольным H. 1211 01:06:13,000 --> 01:06:16,000 >> Як Printf ведаць, што менавіта для адлюстравання на экране? 1212 01:06:16,000 --> 01:06:19,000 Чалавек, які рэалізуецца Printf рэалізаваны цыкл падчас або цыкл 1213 01:06:19,000 --> 01:06:23,000 , Што кажа гэтая характар ​​роўная спецыяльны сімвал NULL? 1214 01:06:23,000 --> 01:06:25,000 Калі няма, то раздрукаваць яго. Як наконт гэтага? 1215 01:06:25,000 --> 01:06:28,000 Калі не друкаваць, друкаваць, друкаваць, друкаваць. 1216 01:06:28,000 --> 01:06:32,000 О, гэта адно асаблівае. Спыніце друк і вярнуцца да карыстача. 1217 01:06:32,000 --> 01:06:35,000 І вось літаральна ўсё, што адбывалася пад капотам, 1218 01:06:35,000 --> 01:06:38,000 і што гэта шмат, каб пераварыць ў першы дзень класа, 1219 01:06:38,000 --> 01:06:43,000 але цяпер гэта сапраўды будаўнічы блок разуменні ўсё 1220 01:06:43,000 --> 01:06:46,000 , Які быў адбываецца ўнутры памяці нашага кампутара, 1221 01:06:46,000 --> 01:06:49,000 і ў канчатковым выніку мы будзем дражніць гэтага адзін ад аднаго з невялікай дапамогай 1222 01:06:49,000 --> 01:06:51,000 у аднаго з нашых сяброў у Стэнфардзе. 1223 01:06:51,000 --> 01:06:56,000 >> Прафесар Нік Parlante ў Стэнфардзе зрабілі гэты выдатны відэашэраг 1224 01:06:56,000 --> 01:06:58,000 ад усіх відаў розных моў, якія ўвялі 1225 01:06:58,000 --> 01:07:00,000 гэтая маленькая Бинки характар ​​Claymation. 1226 01:07:00,000 --> 01:07:03,000 Голас вы пачуеце ўсяго некалькі секунд прагляду падхалімаў 1227 01:07:03,000 --> 01:07:05,000 з'яўляецца тое, што прафесар Стэнфорда, і вы атрымліваеце 1228 01:07:05,000 --> 01:07:07,000 Толькі 5 або 6 секунд гэта прама цяпер, 1229 01:07:07,000 --> 01:07:09,000 Але гэта да ведама, на якіх мы скончым сёння 1230 01:07:09,000 --> 01:07:11,000 і пачаць у сераду. 1231 01:07:11,000 --> 01:07:15,000 Я даю вам Паказальнік Fun з Бинки, папярэдні прагляд. 1232 01:07:15,000 --> 01:07:18,000 [♪ Музыка ♪] [Прафесар Parlante] Гэй, Бинки. 1233 01:07:18,000 --> 01:07:21,000 Прачніся. Гэта час для паказальніка весела. 1234 01:07:21,000 --> 01:07:24,000 [Бинки] Што гэта? Даведацца пра паказальнікаў? 1235 01:07:24,000 --> 01:07:26,000 О, сентыментальны! 1236 01:07:26,000 --> 01:07:29,000 >> Мы будзем бачыць Вас у сераду. 1237 01:07:29,000 --> 01:07:32,000 [CS50.TV]