[Powered by Google Translate] [4-я тыдзень] [David J. малая] [Harvard University] [Гэта CS50.] [CS50.TV] Усё правільна, гэта CS50, і гэта пачатак тыдня 4, і гэта адна з самых павольных магчымыя алгарытмы сартавання. Які гэта быў, што мы проста глядзелі туды? Гэта было пузырьковый сартавання, для таго, вялікая O (N ^ 2) + сума, ды і мы не адзіныя ў гэтым свеце, каб, здаецца, ведаюць што бурбалка сартавання або час яго працы. Сапраўды, гэта было інтэрв'ю з Эрыкам Шмітам з Google і былы сенатар Барак Абама ўсяго толькі некалькі гадоў таму. Цяпер, сенатар, вы тут, у Google, і мне падабаецца думаць прэзідэнцтва, як сумоўе. Цяпер, цяжка ўладкавацца на працу ў якасці прэзідэнта, і вы збіраецеся праз суровыя цяпер. Гэта таксама цяжка ўладкавацца на працу ў Google. У нас ёсць пытанні, і мы просім нашых кандыдатаў пытанні, і гэта адна з Лары Швімэр. Вы, хлопцы, думаеце, я жартую? Гэта прама тут. Які самы эфектыўны спосаб сартавання мільёнаў 32-разрадных цэлых лікаў? [Смех] Ну- Мне вельмі шкада. >> Не, не, не, не. Я думаю, што пузырьковый сартавання б няправільны шлях. Ну, хто сказаў яму пра гэта? На мінулым тыдні памятаеце, мы ўзялі перапынак з кодам, па меншай меры, на адзін дзень, і пачаў упорам на больш высокім узроўні ідэй і вырашэння праблем у больш агульным ў кантэксце пошуку і сартаванні, і мы ўвялі тое, што мы не пляскаць гэтае імя на мінулым тыдні, але асімптатычнай абазначэння, Big O, Вялікі Omega, , А часам і большую абазначэння Theta, і яны былі проста спосабы апісання часу працы алгарытмаў, Колькі часу патрабуецца для алгарытму для запуску. А вы памятаеце, што вы казалі пра час працы з пункту гледжання памеру на ўваходзе, які мы звычайна называем п, што праблема можа быць, дзе п-колькасць людзей у пакоі, Колькасць старонак у тэлефоннай кнізе, і мы пачалі пісаць рэчы як O (N ^ 2) ці O (п) або O (п § п), і нават калі матэматыка не зусім выпрацаваць так выдатна і гэта быў п ² - п / 2 ці нешта накшталт таго замест гэтага мы будзем проста выкінуць некаторыя з малодшых членаў, і матывацыя ёсць тое, што мы сапраўды хочам роду аб'ектыўны спосаб ацэнкі выкананне праграмы або выкананне алгарытмаў што ў канцы дня не мае нічога агульнага, напрыклад, з хуткасцю кампутара сёння. Напрыклад, калі вы рэалізуеце пузырьковый сартавання, ці вы рэалізуеце сартавання зліццём ці выбар роду на кампутары сённяшнім 2 Ггц кампутар, і вы запусціце яго, і гэта займае некаторы колькасць секунд, у наступным годзе ёсць 3 Ггц або 4 Ггц кампутар, і вы маглі б тады сцвярджаць, што "Ух ты, мой алгарытм Цяпер у два разы хутчэй ", калі на самай справе гэта, відавочна, не так. Гэта проста апаратныя атрымала хутчэй, але кампутар не, і таму мы сапраўды хочам, каб выкінуць рэчы, як кратныя 2 або кратных 3, калі справа даходзіць да апісання як хутка або як павольна алгарытм і сапраўды проста засяродзіцца на п або некаторы фактар ​​іх, некаторыя сілы яго, як у выпадку з відамі на мінулым тыдні. І нагадаем, што з дапамогай сартавання зліццём мы былі ў стане зрабіць гэта значна лепш, чым пузырьковый сартавання і выбару роду і нават уставак. Мы прыступілі да п § п, і зноў, Нагадаем, што часопіс п як правіла, адносіцца да таго, што расце павольней, чым я, так што п § п да гэтага часу было добра таму што гэта было менш, чым ² н. Але для дасягнення п п ўвайсці з сартавання зліццём тое, што было асноўнай парастак ідэя, што мы павінны былі выкарыстаць што мы таксама выкарыстала яшчэ ў тыдні 0? Як мы будзем вырашаць задачы сартавання разумна з сартавання зліццём? Што было ключавым разуменнем, ці што? Любы наогул. Добра, давайце зробім крок назад. Апішыце сартавання зліццём у свае словы. Як гэта працуе? Добра, мы будзем веславаць назад у тыдзень 0. Добра, так. [Неразборліва-студэнт] Добра, добра, так што мы падзялілі масіў лікаў на 2 часткі. Мы адсартаваныя кожнай з гэтых частак, і тады мы аб'ядналі іх, і мы бачылі гэтую ідэю да прыняцця Праблема вось гэтая вялікая і драбненне яго ў праблему, вось гэтая вялікая ці гэта вялікае. Нагадаем, напрыклад, тэлефонную кнігу. Нагадаем, самастойнага падліку алгарытм з тыдні таму, так сартавання зліццём былі падведзены вынікі гэтага псевдокод тут. Калі вам даюць п элементаў, спачатку гэта была праверка спраўнасці. Калі п <2, то нічога не робім на ўсіх таму што, калі п <2, то п, відавочна, 0 або 1, і таму, калі гэта 0 або 1 няма нічога, каб адсартаваць. Вы зрабілі. Ваш спіс ужо трывіяльна адсартаваныя. Але ў адваротным выпадку, калі ў вас ёсць 2 або больш элементаў, ісці наперад і падзяліць іх на 2 паловы, злева і справа. Сартаванне кожнай з гэтых палоў, а затым аб'яднаць адсартаваныя паловы. Але праблема тут у тым, што на першы погляд гэта выглядае, як быццам мы понтировавшего. Гэта кругавая вызначэння у тым, што, калі я папрасіў вас разабрацца гэтых п элементаў і ты кажаш мне "Добра, добра, мы разбярэмся тых, п / 2 і тых, п / 2 элементаў" Затым мой наступны пытанне будзе "Добра, як вы сартаваць п / 2 элементаў?" Але з-за структуры гэтай праграмы, таму што гэта базавы варыянт, так бы мовіць, гэта асаблівы выпадак, які кажа, што калі п <некаторы фіксаванае значэнне, як 2 вяртанне неадкладна. Не адказваць з той жа кругавой адказ. Гэты працэс, гэтая цыклічнасць у канчатковым рахунку скончыцца. Калі я спытаюся ў цябе "Сартаванне гэтых п элементаў", і вы кажаце: "Добра, адсартаваць п / 2" Затым вы кажаце: "Добра, род гэтых п / 4, п / 8, n/16" у канчатковым выніку вы будзеце дзяліць на досыць вялікая колькасць што вы будзеце мець толькі 1 элемент налева, і ў гэты момант можна сказаць, "Вось, вось адсартаваныя аднаго элемента." Тады бляск гэтага алгарытму тут з'яўляецца вывад з таго факту, што, як толькі ў Вас ёсць усе гэтыя адсартаваны спісы, усе з якіх маюць памер 1, які, здаецца, бескарысна, як толькі вы пачынаеце іх зліццё і аб'яднанне іх Вы сформируете, нарэшце, як Роб зрабіў у відэа, нарэшце, адсартаваны спіс. Але гэтая ідэя выходзіць далёка за рамкі сартавання. Існуе гэтая ідэя убудаваных у гэтую праграму вядомы як рэкурсіі, Ідэя, у якім вы знаходзіцеся праграмы, і вырашыць некаторыя праблемы, вы называеце сябе, або пакласці ў кантэксце моў праграмавання вы знаходзіцеся функцыі, і для таго, каб вырашыць праблему, вы называеце сябе функцыі зноў і зноў, і зноў, але вам функцыю не можа называць сябе бясконца шмат разоў. У рэшце рэшт вы павінны дна, так бы мовіць, і ёсць жорстка базы ўмове, што кажа у гэты момант спыніць называць сябе так, што ўвесь працэс Нарэшце, на справе спыніць. Што гэта сапраўды азначае, рэкурсіўна? Давайце паглядзім, калі мы можам зрабіць просты, банальны прыклад, скажам, 3 чалавекі са мной тут, на сцэне, калі хтосьці гэта зручна. 1, давай ўверх, 2 і 3. Калі вам 3 хочуць прыехаць сюды. Калі вы жадаеце стаяць побач са мной тут, у лінію, выкажам здагадку, што праблема пад рукой вельмі трывіяльна падлічыць колькасць людзей, якія знаходзяцца тут. Але, шчыра кажучы, я стаміўся ад усіх гэтых падліку прыкладаў. Гэта зойме некаторы час, 1, 2, і кропка, кропка, кропка. Гэта будзе доўжыцца вечна. Я б аддаў перавагу проста Пунт гэтай праблемы ў цэлым з дапамогай, як цябе завуць? Сара. >> Сара, усё ў парадку. Кэлі. >> Кэлі і? Вілі. >> Вілі, Сара, Кэлі, і Вілі. Зараз я задаў пытанне хтосьці колькі людзей на гэтым этапе, і я паняцця не маю. Гэта вельмі доўгі спіс, і таму замест гэтага я буду рабіць гэты трук. Я збіраюся папрасіць чалавека побач са мной, каб зрабіць вялікую частку працы, і як толькі яна робіцца робяць вялікую частку працы Я збіраюся зрабіць найменшую колькасць работ можна і проста дадаць 1 да таго, што яе адказ, так што тут мы ідзем. Я спытаў, як шмат людзей на сцэне. Колькі чалавек на сцэну, каб злева ад вас? Злева ад мяне? >> Добра, але не падманваюць. Гэта добра, гэта правільна, але калі мы хочам працягнуць гэтую логіку Давайце выкажам здагадку, што вы так жа хочаце, каб выбіваць з рук гэтую праблему злева ад вас, Такім чынам, замест адказу напрамую ісці наперад і проста звальваць. Ах, як шмат людзей знаходзяцца злева ад мяне? Колькі людзей налева? 1. [Смех] Такім чынам, 0, так што зараз Вілі зрабіў гэта ты вярнуўся ваш адказ гэтым кірунку кажучы 0. Такім чынам, што вы павінны зрабіць? >> 1. Такім чынам, вы 1, так вы кажаце: "Добра, я збіраюся дадаць 1 да таго, што колькасць Вілі было ", так што 1 + 0. Вы цяпер 1 так што ваш адказ на правым цяпер 1. >> А мая будзе 2. Добра, так вы прымаеце папярэдні адказ 1, дадаўшы мінімальнае колькасць працы, якую вы хочаце зрабіць, што з'яўляецца +1. Зараз у вас ёсць 2, а затым вы перадаць мне, якое значэнне? 3, я маю на ўвазе, прабачце, 2. Добра. Ну, у нас было ад 0 да левага. Тады ў нас была 1, а затым мы дадаем 2, і зараз вы уручаючы мне нумар 2, і таму я кажу, добра, +1, 3. Там на самай справе 3 чалавек стаяў побач са мной на гэтай сцэне, такім чынам, мы маглі б, відавочна, зрабіў гэта вельмі лінейна, вельмі відавочным чынам, але што мы сапраўды робім? Мы ўзялі праблеме памерам 3 на пачатковым этапе. Затым мы зламалі яго на праблеме памер 2, Затым праблема памер 1, і, нарэшце, базавы сцэнар сапраўды, ой, там нікога няма, у гэты момант Вілі вярнуўся эфектыўна жорстка адказаць пару разоў, , А другі затым прапускаюць да бурбалкамі, уверх, уверх бурбалкамі, , А затым, дадаўшы ў гэты дадатковы 1 мы рэалізавалі гэтую асноўную ідэю рэкурсіі. Зараз, у дадзеным выпадку гэта сапраўды не вырашыць праблему любы больш эфектыўна тое, што мы бачылі да гэтага часу. Але думаць аб алгарытмах мы зрабілі на сцэне да гэтага часу. У нас было 8 лістоў паперы на дошцы, на відэа, калі Шон шукаў нумар 7, і што ён рэальна зрабіць? Ну, ён не рабіў любыя падзяляй і ўладар. Ён не зрабіў любой рэкурсіі. Хутчэй, ён проста зрабіў гэта лінейны алгарытм. Але калі мы прапанавалі ідэю адсартаваныя нумары на сцэне жывуць на мінулым тыдні Затым у нас быў гэты інстынкт збіраецца да сярэдзіны, у гэты момант у нас было менш спісе памеры 4 ці іншы спіс памеры 4, а потым у нас была дакладна такая ж праблема, таму мы паўтарылі, паўтараецца, паўтараецца. Іншымі словамі, мы Рэкурсія. Вялікі дзякуй нашаму 3 добраахвотнікаў тут для дэманстрацыі рэкурсіі з намі. Давайце паглядзім, калі мы не можам зрабіць гэтага зараз крыху больш канкрэтным, вырашэння праблемы, што зноў мы маглі б зрабіць даволі лёгка, але мы будзем выкарыстоўваць яго як трамплін для ажыццяўлення гэтай асноўнай ідэі. Калі я хачу, каб вылічыць сумаваннем кучу лічбаў, Напрыклад, калі вы праходзіце ў лік 3, Я хачу даць вам значэнне сігма-3, так што сума 3 + 2 + 1 + 0. Я хачу атрымаць назад адказ 6, такім чынам, мы будзем рэалізоўваць гэтую функцыю сігма, гэтая функцыя сумавання што, зноў жа, бярэ на ўваходзе, а затым вяртае сумавання з гэтага ліку аж да 0. Мы маглі б зрабіць гэта даволі проста, ці не так? Мы маглі б зрабіць гэта з нейкай цыкл структуры, так што дазвольце мне ісці наперад і атрымаць гэтую працу. Ўключыць stdio.h. Дазвольце мне атрымаць сабе ў асноўную працу з тут. Давайце захаваем гэта як sigma.c. Тады я пайду сюды, і я збіраюся абвясціць Int N, і я збіраюся зрабіць наступнае, пакуль карыстач не супрацоўнічаюць. Пакуль карыстальнік не даў мне станоўчага ліку Дазвольце мне ісці наперад і заахвоціць іх да GetInt п =, і дазвольце мне даць ім інструкцыі адносна таго, што рабіць, так што Е ("Станоўчае цэлае, калі ласка»). Проста нешта адносна простае, як гэта так, што да таго часу мы патрапілі лінія 14 у нас зараз ёсць натуральны лік, верагодна, у с. Зараз давайце нешта рабіць з гэтым. Дазвольце мне ісці наперад і вылічыць сумы, так Int сума = сігма (п). Sigma проста сумаванне, так што я проста пішу гэта ў мудрагелістыя шляху. Мы проста называем гэта сігма там. Гэта сума, і цяпер я збіраюся раздрукаваць вынік, Е ("Сума% г \ п", сума). І тады я буду вяртаць 0 для добрай мерай. Мы зрабілі ўсё, што гэтая праграма патрабуе, акрамя цікавай часткі, якая з'яўляецца на самай справе рэалізацыі сігма функцыі. Адпусці мяне сюды на дно, і дазвольце мне абвясціць функцыю сігма. Гэта павінна прымаць пераменнае, што гэта тыпу цэлы лік, і які тып дадзеных, я хачу, каб вярнуцца мяркуецца, ад Sigma? Int, таму што я хачу, каб адпавядаць маім чаканням па лініі 15. У тут, дазвольце мне пайсці далей і рэалізаваць гэтую У даволі простым спосабам. Давайце пойдзем далей і сказаць Int сума = 0, і цяпер я збіраюся крыху цыклу тут што збіраецца сказаць нешта накшталт гэтага, для (INT = 0; I <= нумар, я + +) Сума + = я. А потым я збіраюся вярнуць суму. Я мог бы ажыццяўляцца гэтым у любым колькасці спосабамі. Я мог бы выкарыстаць цыкл. Я мог бы прапусціць з дапамогай сумы зменнай, калі я сапраўды хацеў, але ўвогуле, мы проста ёсць функцыя, якая, калі я не лох заяўляе сума роўная 0. Затым ён перабірае ад 0 на ўверх праз нумар, і на кожнай ітэрацыі ён дадае, што бягучае значэнне сумы, а затым вяртае суму. Дык вось, ёсць невялікая аптымізацыя тут. Гэта, напэўна, дарма крок, але хай будзе так. Гэта добра на дадзены момант. Мы па крайняй меры быць дбайным і збіраўся 0 ўсе шляхі ўверх. Не вельмі жорсткі і даволі простая, але аказваецца, што з дапамогай функцыі сігма мы маем тыя ж магчымасці як мы зрабілі тут, на сцэне. На сцэне мы проста палічыў, колькі людзей было побач са мной, але замест гэтага, калі мы хочам падлічыць лік 3 + 2 + 1 на да 0, мы маглі аналагічным пласкадонку да функцыі што я буду апісваць, а не як рэкурсіўнага. Вось давайце зробім хутка здаровае праверыць і пераканацца, што я не лох. Я ведаю, што ёсць па меншай меры адна рэч у гэтай праграме, што я зрабіў няправільна. Калі я трапіла ўвесці я збіраюся атрымаць любую крычаць на мяне? Што мне будзе крычаць на аб? Так, я забыўся прататып, таму я выкарыстоўваю функцыю пад назвай Sigma ў радку 15, але гэта не абвешчаныя, пакуль лінія 22, так што я лепшы актыўна ідуць сюды і абвясціць прататып, і я скажу Int сігма (внутр нумар), вось і ўсё. Ён рэалізаваны ў ніжняй часткі. Ці іншы спосаб я магу вырашыць гэтую праблему, Я мог бы перамясціць функцыю там, наверсе, які не дрэнны, але па крайняй меры, калі вашы праграмы пачынаюць атрымліваць доўгі, шчыра кажучы, Я думаю, што ёсць некаторы значэнне ў заўсёды з асноўнымі ў верхнім так што вы ў чытача можа адкрыць файл, а затым адразу ж убачыць тое, што робіць праграма, без неабходнасці шукаць праз яго шукае, што асноўнай функцыяй. Пойдзем у мой акне тэрмінала тут, паспрабуйце зрабіць сігма зрабіць сігма, і я аблажаўся тут. Няяўна дэкларацыя функцыі GetInt азначае, што я забыўся зрабіць тое, што яшчэ? [Неразборліва-студэнт] Добра, такім чынам, па-відаць распаўсюджаная памылка, дык давайце гэта тут, cs50.h, а цяпер давайце вернемся да майго акне тэрмінала. Я буду ачысціць экран, і я буду паўторна зрабіць сігма. Мне здаецца, сабралі. Дазвольце мне зараз працаваць сігма. Я увядзіце нумар 3, і я атрымаць 6, так што не строгая праверка, але па крайняй меры, здаецца, працуе на першы погляд, але цяпер давай драць яго на часткі, і давайце на самай справе абапіраюцца на ідэю рэкурсіі, зноў жа, У вельмі простых умоў, з тым, што на працягу некалькіх тыдняў калі мы пачынаем вывучаць аматар структур дадзеных, чым масівы у нас ёсць яшчэ адзін інструмент у інструментары, з якім маніпуляваць гэтымі дадзенымі структурамі, як мы ўбачым. Гэта итеративный падыход, цыкл падыходу. Дазвольце мне замест гэтага цяпер зрабіць гэта. Дазвольце мне сказаць, што замест сумавання ліку на да 0 на самай справе тое ж самае, Колькасць + сігма (колькасць - 1). Іншымі словамі, гэтак жа, як на сцэне, я плыла па плыні, каб кожны з людзей побач са мной, а яны, у сваю чаргу, трымалі понтировавшего, пакуль мы, нарэшце, дна на Вілі, , Якія павінны былі вярнуцца жорстка адказаць, як 0. Вось зараз мы так жа понтировавшего сігма тыя ж функцыі, першапачаткова называлася, але ключ разумення тут тое, што мы не заклікаем сігма аднолькава. Мы не праходзіць на рускай мове. Мы выразна праходзіць у нумар - 1, так што крыху менш праблем, крыху менш праблем. На жаль, гэта не зусім рашэнне яшчэ, і перш, чым мы фіксуем што можна было б скакаць, як відавочна на некаторыя з вас Дазвольце мне ісці наперад і паўторна зрабіць. Здаецца, сабраць усё ў парадку. Дазвольце мне паўторна сігма з 6. Ой, дайце мне паўторна сігма з 6. Мы бачылі гэта раней, хоць і выпадкова апошні раз. Чаму я атрымліваю гэта загадкавае віне сегментацыі? Так. [Неразборліва-студэнт] Там няма базавага варыянту і, больш канкрэтна, што, верагодна, адбылося? Гэта сімптом таго, што паводзіны? Скажыце гэта трохі гучней. [Неразборліва-студэнт] Гэта бясконцы цыкл эфектыўна, і праблема з бясконцай завесы калі яны звязаны рэкурсіі ў дадзеным выпадку, функцыі, якая заве сябе, тое, што адбываецца кожны раз, калі вы выклікаеце функцыю? Ну, успомніце, як мы выклалі памяці ў кампутары. Мы сказалі, што ёсць гэты кавалак памяці, званай стэкам, што гэта на дне, і кожны раз, калі вы выклікаеце функцыю крыху больш памяці, атрымлівае пакласці На гэтай так званай стэкам, якія змяшчаюць лакальныя зменныя, функцыі або параметры, так што калі сігма сігма называе званкі сігма называе сігма  заклікае сігма дзе ж гэтая гісторыя скончыцца? Ну, гэта ў канчатковым выніку перарасход на агульную суму памяці, якія ў вас ёсць для вашага кампутара. Вы перапаўнення сегмента, што вы павінны заставацца ў межах, і вы атрымаеце гэтую памылку сегментацыі, асноўныя кінулі, і тое, што асноўнай скідалі азначае, што зараз у мяне ёсць файл з імем асноўнага які ўяўляе сабой файл, які змяшчае нулі і адзінкі што на самой справе ў будучыні будзе Дыягнастычныя карысныя. Калі гэта не відавочна для вас, дзе ваша памылка Вы можаце фактычна зрабіць трохі судова-медыцынскай экспертызы, так бы мовіць, На гэтай файла дампа памяці, які, зноў жа, гэта проста цэлая куча нулёў і адзінак , Што па сутнасці ўяўляе стан вашай праграмы ў памяці момант ён разбіўся на гэтым шляху. Выпраўленне ў тым, што мы не можам проста слепа вярнуцца сігма, Колькасць + сігма крыху менш праблем. Мы павінны мець нейкая падстава ў дадзеным выпадку, і што павінна базавы варыянт, верагодна, будзе? [Неразборліва-студэнт] Такім чынам, калі лік з'яўляецца станоўчым, мы фактычна павінны вярнуць гэта, або, іншымі словамі, калі лік, скажам, <= 0, Вы ведаеце, што я буду ісці наперад і вяртаць 0, гэтак жа, як Вілі зрабіў, і яшчэ, я збіраюся ісці наперад і вярнуць гэтую, так што гэта не тое, што нашмат карацей, чым итерационные версіі, што мы на хуткую руку спачатку з дапамогай цыклу, але зьвярніце ўвагу, што ёсць такая элегантнасць да яго. Замест вяртання некаторага ліку і выканання ўсёй гэтай матэматыцы і даданне рэчы з лакальнымі зменнымі Вы замест таго, кажучы: "Добра, калі гэта супер лёгкая задача, як лік <0, дазвольце мне неадкладна вярнуць 0 ". Мы не збіраемся важдацца падтрымкі адмоўных лікаў, так што я збіраюся на жорсткі код значэннем 0. Але з іншага боку, для рэалізацыі гэтай ідэі сумавання Усе гэтыя лічбы разам, вы можаце эфектыўна ўзяць невялікі ўкус з гэтай праблемы, так жа, як мы рабілі тут, на сцэне, Затым пласкадонку астатнія задачы на ​​наступны чалавек, але ў гэтым выпадку наступны чалавек, гэта вы самі. Гэта ж імем функцыі. Проста перадайце яго ўсё менш і менш праблемай кожны раз, І хоць у нас не зусім фармалізаваных рэчы ў кодзе тут гэта менавіта тое, што адбывалася ў тыдзень 0 з тэлефоннай кнігай. Гэта менавіта тое, што адбываецца ў апошнія тыдні з Шонам і з нашай дэманстрацыі пошуку нумароў. Гэта займае праблема і падзяліўшы яго зноў і зноў. Іншымі словамі, ёсць спосаб ў цяперашні час перакладу гэта рэальная канструкцыя свету, гэта больш высокі ўзровень канструкцыі падзяляй і ўладар і рабіць нешта зноў і зноў У кодзе, так гэта тое, што мы ўбачым зноў на працягу доўгага часу. Цяпер, як і ў бок, калі вы пачатковец у рэкурсіі вы павінны па крайняй меры, зразумець зараз чаму гэта смешна. Я збіраюся пайсці на google.com, і я буду шукаць нейкія парады і рэкамендацыі па рэкурсіі, увядзіце. Раскажыце чалавек побач з вамі, калі яны не смяяліся толькі цяпер. Вы мелі на ўвазе рэкурсіі? Вы мелі на ўвазе-а-а, вось так. Добра, цяпер вось астатнія кожнага. Трохі велікоднае яйка ўбудаваных недзе там, у Google. Як у бок, адной з спасылак мы ставім на сайце курсу на сённяшні дзень з'яўляецца толькі гэтая сетка розных алгарытмаў сартавання, некаторыя з якіх мы паглядзелі на мінулым тыдні, але тое, што добра пра гэта візуалізацыя як вы спрабуеце абгарнуць ваш розум вакол розных рэчаў, звязаных з алгарытмамі ведаю, што вы можаце вельмі лёгка пачынаць з рознымі тыпамі уваходаў. Ўваходы усё назад, ўваходы асноўным сартуецца, выпадковыя ўваходы і гэтак далей. Як вы спрабуеце, зноў жа, адрозніваць гэтыя рэчы ў сваім розуме разумею, што гэта URL на вэб-сайце курсу на лекцыі старонку можа дапамагчы вам прычыну праз некаторыя з іх. Сёння мы, нарэшце, атрымаць, каб вырашыць гэтую праблему некаторы час таму, якіх было тое, што гэтая функцыя падпампоўкі проста не працуе, і тое, што асноўная праблема з гэтай функцыяй падпампоўкі, мэтай якой было, зноў жа, для абмену значэнне тут і тут такое, што гэта адбываецца? Гэта на самай справе не працуюць. Чаму? Так. [Неразборліва-студэнт] Сапраўды, тлумачэнне гэтаму грубых памылак Проста таму, што калі вы выклікаеце функцыі ў C і гэтыя функцыі прымаюць аргументы, як і б тут, Вы перадаеце ў копіі якое б значэнне вы падаеце да гэтай функцыі. Вы не прадастаўлення зыходных значэнняў сабе, такім чынам, мы бачылі гэта ў кантэксце buggyc, buggy3.c, які выглядаў трохі нешта накшталт гэтага. Нагадаем, што ў нас было х і ў ініцыялізуецца 1 і 2, адпаведна. Затым раздрукаваць тое, што яны былі. Я тады сцвярджаў, што я быў замяняючы іх па тэлефоне своп х, у. Але праблема ў тым, што замена працаваў, але толькі ў рамках своп самой функцыі. Як толькі мы трапілі лінія 40-м месцы гэтыя значэнні былі выкінутыя на сметнік, а так нічога У зыходнай функцыі асноўнага быў на самай справе змянілася, таму, калі вы лічыце, тады як, у якой гэта выглядае з пункту гледжання нашай памяці калі гэта левая бок платы ўяўляе сабой- і я зраблю ўсё магчымае, каб усе бачылі гэта, калі гэта левая бок платы ўяўляе, скажам, ваша памяць і стэк будзе расці на гэтую чынам, і мы выклікаем функцыю як асноўнага, а галоўнае ёсць 2 лакальныя зменныя х і у, Давайце апісваць іх як х тут, і апішам, як у гэтых тут, і давайце ў значэнні 1 і 2, так што тут галоўны, і калі асноўны выклікае функцыю падпампоўкі аперацыйнай сістэмы дае функцыю падпампоўкі сваю паласу памяці ў стэку, сваіх кадраў у стэку, так бы мовіць. Ён таксама вылучае 32 біт для гэтых цэлымі. Гэта адбываецца называць іх А і Б, але гэта зусім адвольнымі. Гэта магло б назваў іх, што хоча, але тое, што адбываецца, калі асноўны званкі своп ён прымае гэта 1, змяшчае копію там, змяшчае копію там. Існуе 1 іншыя лакальныя зменныя ў падпампоўкі, аднак, тое, што называецца? >> Tmp. Tmp, таму дазвольце мне даць сабе яшчэ 32 біта тут, і што ж мне рабіць у гэтай функцыі? Я сказаў Int TMP атрымлівае, такім чынам, мае 1, так што я зрабіў гэта, калі мы ў апошні раз гулялі з гэтым прыкладам. Тады б атрымлівае, такім чынам, бы = 2, так што зараз гэта становіцца 2, і цяпер б атрымлівае часовы, так што тэмпература роўная 1, так што зараз гэта становіцца б. Гэта вельмі добра. Гэта спрацавала. Але тады, як толькі функцыя вяртае памяці свопу эфектыўна знікае, так што яго можна выкарыстоўваць паўторна некаторыя іншыя функцыі ў будучыні, а галоўнае, відавочна, зусім не змяніўся. Нам патрэбен спосаб прынцыпова вырашыць гэтую праблему, і сёння мы, нарэшце, ёсць спосаб зрабіць гэта з дапамогай чаго мы можам ўвесці так званы паказальнік. Атрымліваецца, што мы можам вырашыць гэтую праблему Не пераходзячы ў копіі х і ў але замест гэтага, перадаўшы ў чым, як вы думаеце, у своп функцыі? Так, наконт адрасы? Мы яшчэ не казалі аб адрасах вельмі падрабязна, але калі гэтая дошка ўяўляе памяці майго кампутара Мы, безумоўна, можа пачаць нумарацыю байт у маёй памяці і кажуць, што гэта байт № 1, гэта байт № 2, № 3 байта, № 4 байта, байт # ... 2 мільярдаў, калі ў мяне ёсць 2 гігабайта аператыўнай памяці, такім чынам, мы, безумоўна, можа выступіць з некаторымі адвольнай схемы нумарацыі для ўсіх асобных байтаў ў памяці майго кампутара. Што, калі замест гэтага, калі я называю своп , А не пропуск ў копіі х і ў чаму б мне не прайсці, а не ў адрас х тут, адрас у тут, па сутнасці, паштовы адрас, х і у, таму што тады памяняцца, калі ён праінфармаваў адрасы ў памяць аб х і у, Затым памяняцца, калі мы навучылі яго крыху, Ён патэнцыйна можа ездзіць па гэтым адрасе, так бы мовіць, х, і змяніць нумар ёсць, то ехаць у адрас у, змяніць нумар ёсць, нават калі на самай справе не атрымлівае копіі гэтых значэнняў сабе, так што нават калі мы пра гэта казалі як асноўнай памяці ў і гэта як своп-памяці магутная і небяспечная частка C з'яўляецца тое, што любая функцыя можа закрануць памяти дзе-небудзь у кампутар, і гэта магутны, што вы можаце зрабіць вельмі модныя рэчы з кампутарнымі праграмамі на мове C. Гэта небяспечна, таму што вы можаце сапсаваць вельмі лёгка. На самай справе, адным з найбольш распаўсюджаных спосабаў для праграм, у гэтыя дні быць выкарыстаны па-ранейшаму з'яўляецца для праграміста, каб не разумець што ён ці яна дазваляе дадзеных быць напісаны на месца ў памяці, якая не была прызначаная. Напрыклад, ён або яна аб'яўляе масіў памерам 10 але потым выпадкова спрабуе паставіць 11 байт у гэтым масіве памяці, і вы пачынаеце дакранаючыся частак памяці, якія больш не з'яўляюцца сапраўднымі. Проста кантэкстнай гэта, некаторыя з вас могуць ведаць, што Праграмнае забеспячэнне часта прапануе ўвесці серыйны нумар або рэгістрацыйныя ключы, Photoshop і Слова і падобных праграмах. Там існуюць расколіны, так як некаторыя з вас ведаюць, у Інтэрнэце, дзе вы можаце запусціць невялікую праграму, і вуаля, не больш за запыт на серыйны нумар. Як гэта працуе? У многіх выпадках гэтыя рэчы проста знайсці ў кампутарах Тэкст сегментаў у рэальнай нулі кампутара і тыя, дзе гэта функцыя, дзе серыйны нумар прасіла, і перазапісу, што прастора або падчас выканання праграмы Вы можаце высветліць, дзе ключ захоўваецца на самай справе выкарыстанне так званых адладчык, і вы зможаце ўзламаць праграмнае забеспячэнне такім чынам. Гэта не азначае, што гэта наша мэта на бліжэйшыя пару дзён, але яна мае вельмі рэальныя наступствы. Той адбываецца прыцягнуць крадзеж праграмнага забеспячэння, але ёсць таксама кампраміс ўсёй машыны. На самай справе, калі вэб-сайты ў гэтыя дні эксплуатуецца і скампраметаваны і дадзеныя пратачыліся і паролі былі выкрадзеныя гэта вельмі часта звязана з дрэнным кіраваннем сваёй памяці, ці, у выпадку баз дадзеных, няздольнасць прадбачыць спаборнасці ўваход, так што больш на тым, што ў бліжэйшыя тыдні, але пакуль толькі папярэдні прагляд роду шкоду, які вы можаце зрабіць , Не зусім разумеючы, як усё гэта працуе пад капотам. Давайце ісці аб разумеючы, чаму гэта не працуе з інструментам, які будзе станавіцца ўсё больш і больш карыснымі як нашы праграмы становяцца ўсё больш складанымі. Да гэтага часу, калі ў вас была памылка ў вашай праграме як вы сышлі аб адладцы гэта? Што вашы метады былі да гэтага часу, вучыў ці ваша TF ці проста самавук? [Студэнт] Printf. Printf, так Printf, верагодна, быў вашым сябрам у тым, калі вы хочаце ўбачыць што адбываецца ўнутры вашай праграмы вы проста пакласці Printf тут, Printf тут, Printf тут. Тады вы запусціце яго, і вы атрымаеце цэлую кучу рэчаў на экране , Якія можна выкарыстоўваць, каб потым вывесці тое, што на самой справе адбываецца не так у вашай праграме. Printf, як правіла, вельмі магутная рэч, але гэта вельмі ручной працэс. Вы павінны паставіць Printf тут, Printf тут, і калі вы змесціце яго ўнутры цыклу вы можаце атрымаць 100 ліній прадукцыі, якія затым трэба просеять праз. Гэта не вельмі зручна ці інтэрактыўны механізм для адладкі праграм, але, на шчасце, існуе альтэрнатывы. Там у праграме, напрыклад, называюць GDB, GNU Debugger, які трохі таямніцай у тым, як вы яго выкарыстоўваеце. Гэта крыху складана, але, шчыра кажучы, гэта адна з тых рэчаў, дзе, калі вы пакладзеце ў гэтую тыдзень і наступную дадатковы гадзіну, каб нешта зразумець, як GDB гэта зэканоміць вам, верагодна, дзесяткі гадзін у доўгатэрміновай перспектыве, Так з гэтым, дазвольце мне даць вам тізер, як гэтая штука працуе. Я ў маім акне тэрмінала. Дазвольце мне ісці наперад і скампіляваць гэтую праграму, buggy3. Ён ужо ў курсе. Дазвольце мне запусціць яго гэтак жа, як мы рабілі некаторы час таму, і, сапраўды, яна зламаная. Але чаму гэта адбываецца? Можа быць, я аблажаўся своп функцыі. Можа быць, гэта і Коммерсанта. Я не зусім іх перамяшчэннем правільна. Дазвольце мне ісці наперад і рабіць гэта. Замест таго, каб проста запусціць buggy3 дазвольце мне замест запуску гэтай праграмы GDB, і я збіраюся сказаць яму, каб запусціць buggy3, і я збіраюся ўключыць параметр каманднага радка,-туй, і мы змесцім гэта ў будучыні праблем у спецыфікацыі, каб нагадаць. І вось зараз гэты чорна-белы інтэрфейс выскачыў, што, зноў жа, трохі пераважнай спачатку, таму што там усё гэта Інфармацыя пра гарантыі тут, але па крайняй меры ёсць нешта знаёмае. У верхняй частцы акна знаходзіцца мой рэальны код, і калі я пракруткі уверх тут, дазвольце мне перайсці да самай верхняй часткі майго файла, і, сапраўды, ёсць buggy3.c, і звернеце ўвагу, у ніжняй частцы гэтага акна У мяне ёсць GDB радку. Гэта не тое ж самае, як мая нармальная Джон Гарвард радку. Гэта падказка, якая збіраецца, каб дазволіць мне кантраляваць GDB. GDB з'яўляецца адладчыкам. Адладчык гэта праграма, якая дазваляе вам ісці праз выкананне праграмы радок за радком за радком, па шляху робім усё, што вы хочаце праграму, нават выклікам функцый, альбо шукаць, што яшчэ больш важна, пры значэннях розных зменных. Давайце пойдзем далей і зрабіць гэта. Я збіраюся пайсці далей і ўвесці ў бегу на аператыўнае GDB, так што заўважыць у левай ніжняй частцы экрана, я набраў бегчы, і я трапіў ўвесці, і што ж, што рабіць? Ён літаральна бег мая праграма, але я на самой справе не бачу вялікай працягваць тут таму што я на самой справе не сказаў адладчык , Каб прыпыніць на пэўны момант часу. Проста увядзіце перспектыве запускае праграму. Я на самой справе не бачу. Я не магу кіраваць ёю. Замест гэтага дазвольце мне зрабіць гэта. У гэтым радку GDB дазвольце мне замест увядзіце перапынку, ўвесці. Гэта не тое, што я меў на ўвазе, каб надрукаваць. Давайце замест гэтага ўвесці перапынак асноўны. Іншымі словамі, я хачу ўсталяваць так званы супыну, якую назвалі таму, што ён зламаецца ці паўзы выкананне праграмы ў гэтым канкрэтным месцы. Галоўнае гэтае імя маёй функцыі. Звярніце ўвагу, што GDB з'яўляецца даволі разумная. Ён высветліў, што асноўная адбываецца, каб пачаць прыкладна на лініі 18 з buggy3.c, а затым заўважыць тут, у левым верхнім B + размешчаны побач з лініяй 18. Гэта нагадвае мне, што я паставіў кропку супыну на радку 18. Гэта час, калі я друкую перспектыве, я збіраюся запусціць маю праграму Да яна трапляе, што супыну, так што праграма будзе прыпыненая для мяне ў радку 18. Тут мы ідзем, бегчы. Нішто, здаецца, здарылася, але зьвярніце ўвагу на левы ніжні пачынаючы праграму, buggy3, супыну 1 у асноўны buggy3.c на лініі 18. Што я магу зрабіць зараз? Звярніце ўвагу, я магу пачаць друкаваць такія рэчы, як друк, Ня Printf, друк х, і зараз гэта дзіўна. $ 1 гэта проста цікаўнасць, як мы ўбачым кожны раз, калі вы друкуеце тое, што вы атрымаеце новы $ значэнне. Вось, так што вы можаце вярнуцца да папярэдніх значэнняў на ўсялякі выпадак, але цяпер тое, што друк кажа мне, што значэнне х у гэты момант у гісторыі мабыць 134514032. Што? Дзе, што нават узяўся? [Неразборліва-студэнт] На самай справе, гэта тое, што мы называем смеццем значэнне, і мы не казалі з гэтай нагоды, але прычына, што вы ініцыялізацыя зменных Відавочна, так што яны маюць некаторы значэнне, якое вы хочаце іх мець. Але ўлоў нагадаць, што вы можаце аб'яўляць зменныя як я хвіліну назад у маім прыкладзе сігма , Фактычна не даючы ім значэння. Нагадаем, што я зрабіў тут, у сігма. Я заявіў, п, але якое значэнне я даць яму? Не, таму што я ведаў, што ў бліжэйшыя некалькі радкоў GetInt будзе клапаціцца аб праблеме пакласці значэнне ўнутры н. Але ў гэты момант у гісторыі радку 11 і 12 лініяй і лініяй 13 і радок 14 на працягу гэтых некалькіх радках тое, што значэнне п? У C Вы проста не ведаю. Гэта ўвогуле нейкая фігня значэнне, некаторыя зусім выпадковае лік што застаецца за галоўным чынам з некаторых папярэдніх функцый быўшы працаваць, так як ваша праграма працуе Нагадаем, што функцыя атрымлівае функцыі, функцыі, функцыі. Усе гэтыя кадры атрымаць пакласці на памяць, а затым гэтыя функцыі вяртаюць, і гэтак жа, як я прапанаваў, з гумкай іх памяці, у канчатковым рахунку паўторна. Ну, так ужо здарылася, што гэтая пераменная х у гэтай праграме па-відаць, утрымлівае некаторыя смецця значэнне, як 134514032 ад некаторых папярэдніх функцыі, а не той, які я напісаў. Гэта можа быць нешта, што прыходзіць эфектыўна з аперацыйнай сістэмай, некаторыя функцыі пад капотам. Добра, гэта добра, але давайце цяпер перайсці да наступнай радку. Калі я тыпу "Наступны" на GDB мае радкі, і я ударыў ўвайсці, заўважыць, што вылучэнне рухаецца ўніз да лініі 19, але лагічны маецца на ўвазе, што радок 18 У цяперашні час скончыў працу, так што калі я яшчэ раз увядзіце "друк х" Я павінен з'явіцца 1, і, сапраўды, я раблю. Зноў жа, $ рэчаў з'яўляецца спосабам GDB нагадваць вам што гісторыя адбіткі, што вы зрабілі. Цяпер дазвольце мне ісці наперад і раздрукаваць у, і, сапраўды, у ёсць некаторыя вар'яты значэння, а таксама, але не вялікая праблема, таму што ў радку 19 мы збіраемся прызначыць яго значэнне 2, так што дазвольце мне ўвесці "Наступны" яшчэ раз. І зараз мы знаходзімся на Printf лініі. Дазвольце мне зрабіць друк х. Дазвольце мне зрабіць друк у. Шчыра кажучы, я ўжо крыху стаміўся ад гэтай друку. Дазвольце мне замест гэтага ўвесці "дысплей X" і "Y Дысплей", і зараз кожны раз, калі я увядзіце каманду ў будучыні Я буду нагадаў пра тое, што гэта х і у, што х і у, што х і у. Я таксама магу, а ў бок, тыпу "Інфармацыя мясцовымі жыхарамі". Інфармацыя з'яўляецца спецыяльнай камандай. Мясцовыя жыхары азначае, што ён паказвае мне лакальныя зменныя. На ўсялякі выпадак я забыўся, ці гэта вар'ятка, складаная функцыя што я ці хтосьці іншы пісаў Інфармацыя мясцовыя жыхары скажуць вам, што ўсе лакальныя зменныя ўнутры гэтай лакальнай функцыі што вы маглі б клапаціцца аб тым, калі вы хочаце, каб ткнуць вакол. Цяпер, Printf збіраецца выконваць, таму дазвольце мне ісці наперад і толькі тыпу "Далей". Таму што мы ў гэтым асяроддзі мы на самай справе не бачачы яго выканаць тут, але заўважыў, што гэта становіцца трохі скажонае тут. Але звярніце ўвагу, што гэта пераазначэнне экрана ёсць, так што гэта не ідэальная праграма тут, але гэта нармальна, таму што я заўсёды магу капацца выкарыстаннем друку, калі я хачу. Дазвольце мне ўвесці наступны раз, і вось зараз самае цікавае. На дадзены момант у гэтай гісторыі ў 2, а х 1, як прапанавана тут, і зноў, Прычынай гэтага аўтаматычна адлюстроўваюцца зараз, таму што я выкарыстаў каманду Дысплей х і ў дысплея, так што момант, калі я увядзіце наступную У тэорыі х і ў павінны стаць месцамі. Цяпер мы ўжо ведаем, што не збіраецца быць у выпадку, але мы ўбачым праз імгненне, як мы можам ныраць глыбей, каб высветліць, чаму гэта так. Далей, і, на жаль, у яшчэ 2 і х яшчэ 1, і я магу пацвердзіць, як шмат. Друк х, у друку. Сапраўды, ні замена адбылося на самай справе, так што давайце пачнем над гэтым. Ясна, што своп зламаны. Давайце замест гэтага ўвесці "Выканаць". Дазвольце мне сказаць, так, я хачу, каб перазапусціць яго з самага пачатку, ўвесці. Цяпер я назад у радку 18. Зараз звернеце ўвагу х і ў смеццевых значэння зноў. Наступны, наступны, наступны, наступны. Калі я атрымліваю сумна я магу проста увядзіце п для наступнага. Вы можаце скараціць яго ў самыя кароткія паслядоўнасць знакаў. Зменны цяпер зламаная. Давайце пагрузіліся ў, так што замест таго, каб друкаваць далей, Цяпер я збіраюся ўвесці крокам, так што я актывізацыі ўнутры гэтай функцыі так што я магу прайсці праз гэта, так што я ўдарыў крок, а затым ўвесці. Звярніце ўвагу, што вылучэнне скокі ўніз ніжэй у маёй праграме лініі 36. Цяпер тое, што з'яўляюцца лакальныя зменныя? Інфармацыя мясцовыя жыхары. Нішто не проста яшчэ і таму, што мы не дайшлі да гэтага радка, так што давайце ісці наперад і сказаць: "Наступны". Цяпер мы, здаецца, TMP, друк TMP. Смецце значэнне, ці не так? Я так думаю. Як наконт друк, друк б, 1 і 2? У момант, як толькі я набіраю наступны раз TMP будзе прымаць значэнне 1, мы спадзяемся, TMP, таму што збіраецца быць прысвоена значэнне. Зараз давайце зробім друк, друк б, але цяпер друку TMP, і гэта сапраўды 1. Дазвольце мне рабіць далей. Дазвольце мне рабіць далей. Я скончыў своп функцыі. Я ўсё яшчэ ўнутры яго ў радку 40, так што дазвольце мне друк, б друку, і я не хвалюе, што TMP ёсць. Падобна на тое, што своп правільна, калі справа даходзіць да замены і б. Але калі я зараз увядзіце наступную, я каб вярнуцца да радка 25, і, вядома, калі я тыпу х і друку ў яны па-ранейшаму без зменаў, так што мы не вырашылі праблему. Але Дыягнастычныя зараз, мабыць, з гэтай праграмай GDB Мы па крайняй меры, атрымаў адзін крок бліжэй да разумення што адбываецца не так, не засмечваць наш код, паставіўшы Printf тут, Printf тут, Printf тут, а затым запусціць яго зноў і зноў спрабуе высветліць, што адбываецца не так. Я збіраюся ісці наперад і выйсці з гэтага ўсяго з курыць. Гэта будзе сказаць: "Усё роўна выйсці?" Так. Зараз я вярнуўся ў мой нармальны радкі, і я зроблена з дапамогай GDB. Як у баку, вы не павінны выкарыстоўваць гэтую-туй сцяг. На самай справе, калі вы прапусціце яго, то атрымаеце па сутнасці ў ніжняй палове экрана. Калі б я затым увядзіце перапынак асноўнай, а затым запусціце Я ўсё яшчэ можна запускаць маю праграму, але што ён будзе рабіць больш тэкстава проста пакажыце мне бягучым адзін радок за адзін раз. -Туй, тэкставы інтэрфэйс, проста паказвае вам некалькі праграм адначасова, што, верагодна, крыху канцэптуальна прасцей. Але на самай справе, я магу проста зрабіць наступны, наступны, наступны, і я іду да адной радку за адзін раз, і калі я сапраўды хачу бачыць, што адбываецца на Я магу надрукаваць спіс і ўбачыць цэлую кучу суседніх ліній. Там ёсць відэа, якое мы прасілі, што вы сочыце за праблемы ўсталёўвае 3 , У якім Nate пакрывае некаторыя з тонкасцяў GDB, і гэта адна з тых рэчаў, шчыра кажучы, дзе некаторыя нетрывіяльныя адсотак вы ніколі не закране GDB, і гэта будзе дрэнна таму што літаральна вы будзеце ў канчатковым выніку марнуюць больш часу ў гэтым семестры ганяцца за памылкі, то вы б, калі б вы паклалі ў тым, што паўгадзіны / гадзіну На гэтым тыдні і ў наступным навучання, каб асвоіцца з GDB. Printf быў вашым сябрам. GDB павінен зараз быць вашым сябрам. Любыя пытанні па GDB? І вось кароткі спіс некаторых з найбольш магутных і карысных каманд. Так. >> Ці можна друкаваць радок? Вы можаце друкаваць радок? Цалкам дакладна. Гэта не павінны быць проста цэлыя лікі. Калі зменная а ўяўляе сабой радок, проста набярыце ў друку з. Ён пакажа вам, што гэта радок зменнай. [Неразборліва-студэнт] Гэта дасць вам адрас і саму радок. Ён пакажа вам абодвум. І яшчэ адна апошняя рэч, толькі таму, што гэта добра, каб ведаць таксама. Backtrace і рамы, дазвольце мне пагрузіцца ў гэта ў апошні раз, сапраўды такі жа праграме з GDB. Дазвольце мне ісці наперад і запусціць тэкставую версію карыстацкага інтэрфейсу, разбіць асноўныя. Дазвольце мне ісці наперад і бегчы зноў. Вось я. Цяпер дазвольце мне ісці далей, далей, далей, далей, далей, крок, ўвесці. А цяпер выкажам здагадку, што я цяпер у своп наўмысна, але я, як "Чорт, што было значэнне х?" Я не магу зрабіць больш х. Я не магу зрабіць у, таму што яны не ўваходзяць у камплект. Яны не ў кантэксце, але не праблема. Я магу надрукаваць след. Гэта паказвае мне ўсе функцыі, якія выконваюцца да гэтага моманту часу. Звярніце ўвагу, што адзін на дно, галоўнае, на адной лініі з асноўнымі знаходзячыся на ніжняй часткі нашай карціны тут. Той факт, што своп вышэй лініі з своп быць вышэй яго ў памяці тут, і калі я хачу вярнуцца да асноўнай часовай я магу сказаць "рамку". Які нумар? Галоўнае гэта кадр № 1. Я збіраюся ісці наперад і сказаць: "кадр 1". Зараз я вярнуўся ў асноўны, і я магу друкаваць х, і я магу надрукаваць у, але я не магу раздрукаваць або б. Але я магу, калі я скажу: «Добра, пачакайце хвілінку. Дзе быў своп?" Дазвольце мне ісці наперад і сказаць: "кадр 0". Цяпер я там, дзе я хачу быць, і ў бок, ёсць іншыя каманды таксама, як калі б вы сапраўды сумна набраўшы наступны, наступны, наступны, наступны, Вы можаце наогул сказаць нешта накшталт "наступныя 10", і што сыдзе на працягу наступных 10 радкоў. Вы таксама можаце напісаць "працягнуць", калі вы сапраўды стамляецеся ад пакрокавага ён. Працягвайце будзе запусціць праграму без перапынку, пакуль не сустрэне іншую кропку супыну, будзь то ў пятлю або ніжэй у вашу праграму. У гэтым выпадку мы працягвалі да канца, і праграма нармальна завяршыўся. Гэта мудрагелісты спосаб, саступае працэсу. Проста ваша праграма нармальна завяршыўся. Падрабязней пра гэта ў відэа і ў адладцы сесій у будучыні. Гэта было шмат. Давайце возьмем наш 5-хвілінны перапынак тут, і мы вернемся з структурам і файлаў. Калі вы нырнулі ў PSET на гэтым тыдні ўжо Вы будзеце ведаць, што мы выкарыстоўваем у размеркаванні код, зыходны код, які мы прадстаўляем вам у якасці адпраўной кропкі, некаторыя новыя метады. У прыватнасці, мы ўвялі гэта новае ключавое слова называецца структура, для структуры, так што мы можам ствараць карыстацкія зменныя гатункаў. Мы таксама ўвялі паняцце файла I / O, файлавага ўводу і высновы, і гэта так, што мы можам захаваць стан Вашай Scramble платы ў файл на дыску так што навучанне стыпендыятаў і я магу зразумець што адбываецца ўнутры вашай праграмы без неабходнасці ўручную гуляць дзесяткі гульняў Scramble. Мы можам зрабіць гэта больш automatedly. Гэтая ідэя структуры вырашае даволі пераканаўчыя праблемы. Выкажам здагадку, што мы хочам рэалізаваць некаторыя праграмы што нейкім чынам адсочвае інфармацыю пра студэнтаў, і студэнты маглі б мець, напрыклад, ID, імя, і дом у такім месцы, як Гарвард, таму гэтыя 3 часткі інфармацыі мы хочам, каб вакол, так што дазвольце мне ісці наперад і пачаць пісаць невялікую праграму тут, ўключае stdio.h. Дазвольце мне зрабіць ўключаць cs50.h. А потым пачаць сваю асноўную функцыю. Я не буду з любымі аргументамі каманднага радка, і вось я хачу, каб студэнт, так што я збіраюся сказаць, Студэнт мае імя, так што я збіраюся сказаць "радок імя". Тады я збіраўся сказаць студэнт таксама мае ідэнтыфікатар, так Int Ідэнтыфікатар, і студэнт мае дом, таму я таксама хацеў сказаць "радок дом". Тады я замоўлю гэтыя трохі больш акуратна, як гэта. Добра, зараз у мяне ёсць 3 зменныя, з якімі ўяўляюць студэнта, так што "студэнт". А цяпер я хачу, каб запоўніць гэтыя каштоўнасці, так што дазвольце мне ісці наперад і сказаць нешта накшталт: "ID = 123". Імя збіраецца атрымаць Давіда. Скажам, дом збіраецца атрымаць Mather, , А затым я збіраюся зрабіць нешта адвольна, як Е ("% S, з ідэнтыфікатарам% D,% пражывае ў с. А цяпер, што я хачу падлучыць сюды, адзін за адным? Імя, ідэнтыфікатар, дом, вяртаецца 0. Добра, калі я аблажаўся дзесьці тут Я думаю, што ў нас ёсць даволі добрая праграма, якая захоўвае адзін студэнт. Вядома, гэта не ўсё, што цікава. Што рабіць, калі я хачу мець 2 студэнта? Гэта не вялікая праблема. Я магу падтрымліваць 2 чалавек. Дазвольце мне пайсці далей і вылучыць гэта і спусціцца сюды, і я магу сказаць "ID = 456" для кагосьці, як Роб, які жыве ў Kirkland. Добра, пачакай, але я не магу назваць гэта тое ж самае, і, падобна, я буду мець, каб скапіяваць гэта, так што дазвольце мне сказаць, што гэта будуць зменныя Давіда, і дазвольце мне атрымаць копіі гэтых Роба. Мы называем гэтыя Роба, але гэта не будзе працаваць зараз таму што я-пачакайце, давайце зменім мяне id1, name1 і House1. Роб будзе 2, 2. Я павінен змяніць гэта тут, тут, тут, тут, тут, тут. Пачакайце, а як жа Томі? Давайце зробім гэта зноў. Відавочна, што калі вы ўсё яшчэ думаеце, што гэта добры спосаб зрабіць гэта, гэта не так, так капіяваць / ўставіць дрэнна. Але мы вырашылі гэты тыдзень таму. Што гэта было наша рашэнне, калі мы хацелі мець некалькі асобнікаў аднаго і таго ж тыпу дадзеных? [Студэнты] масіва. Масіва, так што дазвольце мне паспрабаваць ачысціць гэта. Дазвольце мне зрабіць некалькі нумароў для сябе на вяршыні, і дазвольце мне замест гэтага тут. Мы называем гэтых людзей, а замест гэтага я збіраюся сказаць "Int ідэнтыфікатары" і я збіраюся падтрымаць 3 з нас у цяперашні час. Я збіраюся сказаць "радок імёнаў", і я буду падтрымліваць 3 з нас, і тады я буду казаць "радок дома", і я буду падтрымліваць 3 з нас. Цяпер тут замест Давіда атрымліваць свае лакальныя зменныя Мы можам пазбавіцца ад іх. Гэта адчувае сябе добра, што мы ачыстка гэта. Затым я магу сказаць Дэвід будзе [0] і імёнаў [0] і дома [0]. А потым Роб аналагічна можна зэканоміць на гэтым. Давайце паставім гэта тут, так што ён збіраецца быць адвольна ідэнтыфікатараў [1]. Ён збіраецца быць імёны [1], , А затым, нарэшце, дома [1]. Яшчэ трохі стомна, і зараз у мяне ёсць, каб зразумець гэта, так скажам, "імёны [0], ID [0], дома [0], і давайце множным ліку гэта. Ідэнтыфікатары, ідэнтыфікатары, ідэнтыфікатары. І зноў жа, я раблю гэта, так зноў, я ўжо звяртаючыся да капіяваць / ўставіць зноў, так што шанцы ёсць іншае рашэнне тут. Я, верагодна, можа ачысціць гэта далей з пятлёй ці нешта накшталт гэтага, Карацей кажучы, гэта крыху лепш, але ўсё яшчэ адчувае сябе Я звяртаючыся да капіяваць / ўставіць, але нават гэта, я сцвярджаю, на самай справе не прынцыпова правільнае рашэнне, таму што Што рабіць, калі калі-небудзь мы вырашым вы ведаеце, што? Мы сапраўды павінны былі захоўвання адрасоў электроннай пошты для Дэвіда і Роб і ўсё астатняе ў гэтай праграме. Мы павінны таксама захоўваць тэлефонныя нумары. Мы павінны таксама захоўваць нумары экстранай сувязі. У нас ёсць усе гэтыя фрагменты дадзеных, якія мы хочам захаваць, так як вы ідзяце для гэтага зрабіць? Вы аб'яўляеце іншы масіў у верхняй частцы, а затым ўручную дадаць адрас электроннай пошты [0], адрас электроннай пошты [1] для Дэвіда і Роб і гэтак далей. Але на самай справе ўсяго толькі здагадка, якія ляжаць у аснове гэтай канструкцыі што я выкарыстоўваю сістэме гонару ведаць, што [I] у кожным з некалькіх масіваў Проста так здарылася, каб звярнуцца да тых жа асобай, так [0] у ідэнтыфікатарамі гэта нумар 123, і я буду лічыць, што імёны [0] такое ж імя чалавека і дома [0] з'яўляецца домам таго ж самага чалавека і так далей для ўсіх розных масіваў, якія я ствараю. Але звярніце ўвагу, што няма ніякіх фундаментальных сувязяў Сярод гэтых 3 частак інфармацыі, нумар, імя і дом, нават калі асоба мы спрабуем мадэль у гэтай праграме не масівы. Масівы з'яўляюцца менавіта гэты праграмны спосаб зрабіць гэта. Тое, што мы сапраўды хочам, каб змадэляваць ў нашай праграме гэта чалавек, як Давід, чалавек, як Роб, усярэдзіне якога або інкапсуляцыі гэтае імя і ID і дома. Ці можам мы неяк выказаць гэтую ідэю інкапсуляцыі , Пры якім чалавек мае ідэнтыфікатар, назву і дом і не звяртацца да рэчаіснасці гэты хак якой мы толькі што верыць, што нешта кранштэйны ставіцца да той жа чалавечай сутнасці ў кожным з гэтых разрозненых масіваў? Мы можам рэальна зрабіць гэта. Дазвольце мне пайсці вышэй асноўнага на дадзены момант, і дазвольце мне стварыць свой уласны тып дадзеных на самай справе ў першы раз. Мы выкарысталі гэтую тэхніку ў Scramble, але тут я збіраюся пайсці далей і стварыць тып дадзеных, і вы ведаеце, што я збіраюся называць гэта студэнт або чалавек, і я збіраюся выкарыстоўваць ЬурейеЕ для вызначэння тыпу. Я хачу сказаць, што гэта структура, а затым гэтая структура будзе мець тып студэнта, мы будзем казаць, хоць гэта крыху датаваныя цяпер для мяне. Мы гаворым "Int Ідэнтыфікатар». Мы кажам "радок імя". Тады мы кажам "Радок дом" так што цяпер да канца гэтыя некалькі радкоў кода Я толькі што вучыў ляск, што існуе Тып дадзеных, акрамя цэлых лікаў, акрамя радкоў, акрамя таго, у два разы, акрамя таго, паплаўкі. Па стане на дадзены момант часу радок 11, у цяперашні час новы тып дадзеных, які завецца студэнтаў, і цяпер я магу абвясціць зменную любы студэнт я хачу, так што дазвольце мне пракруціць ўніз для людзей. Цяпер я магу пазбавіцца ад гэтага, і я магу вярнуцца ўніз да Давіда тут, і для Дэвіда я магу рэальна сказаць, што Давід, можна літаральна назваць зменнай пасля сябе, будзе тып студэнта. Гэта можа здацца трохі дзіўным, але гэта не ўсё, што адрозніваецца ад аб'явы нешта ў выглядзе цэлага ліку або радкі або з якая плавае кропкай. Проста так здарылася, будзе называцца студэнтам зараз, і калі я хачу паставіць нешта ўнутры гэтай структуры У мяне зараз ёсць выкарыстоўваць новую частку сінтаксісу, але гэта даволі проста, david.id = 123, david.name = "Давід" у сталіцы D, і david.house = "Mather," і цяпер я магу пазбавіцца ад гэтай рэчы тут. Звярніце ўвагу, зараз мы перапрацавалі нашы праграмы сапраўды нашмат лепш у тым, што цяпер наша праграма адлюстроўвае рэальны свет. Там у рэальным свеце паняцце чалавека ці студэнта. Тут мы маем цяпер версіі C асобы або, больш канкрэтна студэнта. Унутры гэтага чалавека гэтыя адпаведныя характарыстыкі, ID, імя і дом, так што Роб сутнасці становіцца тое ж самае тут, так абрабаваць студэнта, а цяпер rob.id = 456, rob.name = "Боб". Той факт, што пераменная называецца Rob з'яўляецца свайго роду бессэнсоўнымі. Мы маглі б назваў гэта х ці ў, або г. Мы толькі што назваў яго Роб быць семантычна паслядоўным, але на самой справе клічуць ўнутры гэтага самага поля, так што зараз у мяне ёсць. Гэта таксама не падобна на лепшы дызайн у тым, што я жорстка Давіда. Я цвёрда Роб. І я ўсё яшчэ вымушаныя звяртацца да некаторых скапіруйце і ўстаўце кожны раз, калі я хачу новых зменных. Акрамя таго, я павінен па-відаць даць кожнай з гэтых зменных імя, хоць я б аддаў перавагу апісаць гэтыя зменныя  ў больш агульным плане, як студэнты. Цяпер мы можам аб'яднаць ідэі, якія працуюць добра для нас і замест гэтага сказаў: "Ведаеш што, дай мне зменную званую студэнтаў, і няхай вас гэта будзе памерам 3 ", так што зараз я магу ўдакладніць гэта далей, пазбавіцца ад ручной заявіў Давід, і я магу, а сказаць нешта накшталт студэнтаў [0] тут. Затым я магу сказаць студэнтаў [0] тут, Студэнты [0] Тут і гэтак далей, і я магу хадзіць і чысты, што для Роба. Я мог бы таксама ісці аб цяпер, магчыма, даданне завесы і выкарыстанне GetString і GetInt на самай справе атрымаць гэтыя значэнні ад карыстальніка. Я мог бы ісці аб даданні пастаяннай, таму што гэта наогул дрэнная практыка на жорсткі код некаторыя адвольныя ліку, як 3 прама тут , А затым проста памятаеце, што вы павінны паставіць не больш за 3 студэнтаў у ім. Верагодна, было б лепш выкарыстоўваць # вызначыць у верхняй частцы майго файла і фактар, які, такім чынам, сапраўды, дай мне пайсці далей і абагульніць гэта. Дазвольце мне адкрыць прыкладу, што сярод сённяшніх Прыклады загадзя, structs1. Гэта больш поўная праграма, якая выкарыстоўвае # вызначыць тут і кажа, што мы збіраемся мець 3 студэнтаў па змаўчанні. Тут я аб'яўленні класа варта студэнтаў, так класе студэнтаў, і зараз я з дапамогай цыкла толькі, каб зрабіць код крыху больш элегантна, запоўніць клас з удзелам карыстальніка, так ітэрацыі з I = 0 на да студэнтаў, што на 3. І тады я прапанаваць карыстачу ў гэтай версіі  Што ID студэнта, і я атрымліваю яго з GetInt. Што імя студэнта, а потым атрымаць яго з GetString. Што доме студэнта? Я атрымліваю яго з GetString. А затым у ніжняй тут я проста вырашыў змяніць як я друкую гэтыя, і на самай справе выкарыстаць цыкл, І хто я пячаткай? У адпаведнасці з каментаром я друкую нікому ў Mather, і вось менавіта таму Роб і Томі і гэтак далей, на самай справе Томі ў Mather. Томі і Дэвід будуць надрукаваныя ў гэтым выпадку, але як гэта працуе? Мы не бачылі гэтую функцыю раней, але зрабіць здагадку аб тым, што гэта робіць. Параўноўвае радка. Гэта крыху невідавочным, як ён параўноўвае радкі, таму што аказваецца, калі яна вяртае 0, што азначае, што радкі роўныя. Калі яна вяртае -1, што азначае, што чалавек прыходзіць у алфавітным парадку перад іншымі, і калі яна вяртае +1, што азначае слова прыходзіць іншы ў алфавітным парадку перад іншымі, і вы можаце глядзець онлайн або ў даведачную старонку , Каб убачыць, які менавіта спосаб якую, але ўсё гэта цяпер робіць гэта кажа калі [I]. Дом роўна "Мазер" затым пайсці далей і раздрукаваць так і так знаходзіцца ў Mather. Але вось тое, што мы раней не бачылі, і мы вернемся да гэтага. Я не памятаю, ніколі не маючы для гэтага ні ў адной з маіх праграм. Бясплатныя мабыць спасылкай на памяць, вызваляючы аператыўную памяць, але тое, што памяць я мабыць вызваленне ў гэтым цыкле ў ніжняй часткі гэтай праграмы? Падобна на тое, я вызваляючы імя чалавека і дом чалавека, але навошта гэта? Аказваецца, усе гэтыя тыдні, што вы выкарыстоўваеце GetString Мы відаў ўкараняе памылку ў кожнай з вашых праграм. GetString памяццю дызайн вылучае так што ён можа вярнуцца да вас радкі, падобна Давіду, і Роб, і вы можаце рабіць усё, што вы хочаце з гэтага радка ў праграме, таму што мы абаронены памяці для вас. Праблема ў тым, увесь гэты час кожны раз, калі вы тэлефануеце GetString Мы, аўтары GetString, пыталіся аперацыйнай сістэмы , Каб даць нам крыху аператыўнай памяці для гэтага радка. Дайце нам крыху АЗП для наступнага радка. Дайце нам крыху больш аператыўнай памяці для наступнага радка. Тое, што вы праграміст, ніколі не рабіў дае нам, што памяць назад, Такім чынам, для гэтых некалькіх тыдняў усе праграмы, вы напісалі было тое, што завецца памяццю скачок якой яны працягваюць выкарыстоўваць больш і больш памяці пры кожным выкліку GetString, і гэта нармальна. Мы свядома робім, што ў першыя тыдні, таму што гэта не цікава , Каб турбавацца пра тое, дзе радка і адкуль. Усё, што вы хочаце гэта слова адзежу вярнуцца, калі карыстальнік ўводзіць яго цалі Але рух наперад у нас зараз ёсць, каб пачаць атрымліваць больш складаныя з гэтай нагоды. Кожны раз, калі мы вылучаем памяць, мы лепш у канчатковым выніку перадаць яго назад. У адваротным выпадку ў рэальным свеце на вашым Mac ці PC вы, магчыма, часам дасведчаныя Сімптомы, дзе ваш кампутар завісае ў канчатковым выніку альбо дурны які верціцца шар пляж знаходзіцца ўсяго займаюць кампутара ўся ўвага, і вы не можаце рабіць рэчы. Гэта можна растлумачыць любую колькасць памылак, але сярод тых, магчымыя памылкі якія, што называецца ўцечка памяці якой той, хто пісаў, што частка праграмнага забеспячэння Вы выкарыстоўваеце не памятаю, каб вызваліць памяць што ён ці яна папрасіла аперацыйнай сістэмы для, не выкарыстоўваецца GetString, таму што гэта CS50 рэч, але з выкарыстаннем аналагічных функцый спытаеце, што аперацыйная сістэма на памяць. Калі вы ці яны сапсаваць і ніколі не вернуцца, што памяць сімптом, які можа быць тое, што праграма запавольваецца і запавольваецца і запавольваецца калі вы памятаеце, каб патэлефанаваць бясплатна. Мы вернемся, калі і чаму вы маглі б назваць вольным, Але давайце ісці наперад толькі для добрай мерай і паспрабуйце запусціць гэтую канкрэтную праграму. Гэта называецца structs1, увядзіце. Дазвольце мне ісці наперад і працаваць structs1, 123, David Mather, 456, Rob Kirkland, 789, Томі Mather, і мы бачым Давіда ў Mather, Томі ў Mather. Гэта ўсяго толькі маленькая праверка наяўнасці свядомасці, што праграма працуе. Зараз, на жаль, гэтая праграма з'яўляецца трохі хвалюе ў тым, што Я зрабіў усё, што праца, я набраў у 9 розных радкоў, націсніце ўвод, сказалі, хто быў у Mather, але, відавочна, я не ведаў, хто быў у Mather ўжо таму, што я набраў яго. Было б па меншай меры нядрэнна, калі б гэтая праграма больш падобная на базу дадзеных і ён сапраўды памятае, што я набраў у так што я ніколі больш не прыйдзецца ўводзіць гэтыя запісы студэнтаў. Можа быць, гэта як registrarial сістэмы. Мы можам зрабіць гэта з дапамогай гэтага метаду, вядомага як файлавы ўвод / выснова, файлавага ўводу і высновы, Вельмі агульны спосаб сказаць, што ў любы час вы хочаце чытаць файлы або запісаць файлы Вы можаце зрабіць гэта з пэўным наборам функцый. Дазвольце мне ісці наперад і адкрыць гэты прыклад structs2.c, якія амаль ідэнтычныя, але давайце паглядзім, што ён зараз робіць. У верхняй частцы файла я абвясціць клас студэнтаў. Я тады запаўнення класа з карыстацкім уводам, так што тыя радкі кода гэтак жа, як і раней. Тады, калі я пракруціць ўніз тут я друкую ўсе, хто знаходзіцца ў Mather адвольна, як і раней, Але гэта цікавая новая функцыя. Гэтыя радкі кода з'яўляюцца новымі, і яны ўносяць нешта тут, FILE, усё загалоўныя, і яна мае * тут таксама. Дазвольце мне перанесці гэты сюды, * тут таксама. Гэтая функцыя, якую мы раней не бачылі, Еореп, але гэта азначае адкрыццё файла, так што давайце бегла гэтым, і гэта тое, што мы вернемся ў будучыні psets, але гэтая лінія тут па сутнасці адкрывае файл з імем базы дадзеных, і гэта вызначана адкрывае яго такім чынам, што ён можа рабіць усё, што з ім? [Неразборліва-студэнт] Права, такім чынам, "W" азначае толькі то гэта гаворыць аперацыйнай сістэмы адкрыць гэты файл такім чынам, што я магу напісаць да яго. Я не хачу, каб прачытаць яго. Я не хачу, каб проста паглядзець на яе. Я хачу змяніць і дадаць матэрыял патэнцыйна да яго, і файл будзе называцца базай дадзеных. Гэта можна назваць што заўгодна. Гэта можа быць database.txt. Гэта магло б быць. Дб. Гэта можа быць слова, як Foo, але я адвольна выбраў імя файла базы дадзеных. Гэта крыху праверку наяўнасці свядомасці, што мы вернемся да вельмі падрабязна з цягам часу, Калі FP, для паказальніка файла, не роўна NULL, што азначае, што ўсё добра. Карацей кажучы, такія функцыі, як Еореп часам церпяць няўдачу. Магчыма, файл не існуе. Можа быць, вы з дыскавай прасторы. Можа быць, вы не маеце правоў доступу да гэтай тэчцы, так што калі Еореп вяртае нулявое нешта дрэннае здарылася. І наадварот, калі Еореп не вяртае нулявое усё добра і я магу пачаць пісаць у гэты файл. Вось новы трук. Гэта цыкл які ітэрацыі па кожным з маіх студэнтаў, і гэта выглядае так падобныя на тое, што мы рабілі раней, але гэтая функцыя з'яўляецца стрыечным братам Printf называецца Fprintf для файла Printf, і заўважыце, што ён адрозніваецца толькі 2 шляхі. Па-першае, ён пачынаецца з F замест р, але тады яе першым аргументам з'яўляецца тое, што мабыць? [Студэнты] файла. >> Гэта файл. Гэта тое, што называецца FP, які мы ў рэшце рэшт дражняць адзін ад аднаго, што файл паказальніка, але цяпер FP ўяўляе сабой проста файл, які я адкрыў, так Fprintf тут кажуць раздрукаваць ID гэтага карыстальніка да файла, а не на экран. Надрукаваць імя карыстальніка ў файл, а не на экран, Хата ў файл, а не на экране, а затым тут, відавочна, зачыніць файл, а затым сюды бясплатны памяці. Адзіная розніца паміж гэтай версіі 2 і версіі 1 з'яўляецца ўвядзенне Еореп і гэта файл з пашырэннем * і гэта паняцце Fprintf, так што давайце паглядзім, што канчатковы вынік. Адпусціце мяне ў маім акне тэрмінала. Дазвольце мне выканаць structs2, увядзіце. Падобна на тое, усё будзе добра. Давайце паўторна structs2. 123, David Mather, 456, Rob Kirkland, 789, Томі Mather, увядзіце. Падобна на тое, ён паводзіў сябе так жа, але калі я цяпер раблю Ls заўважыце, што файл знаходзіцца тут сярод усіх мой код, базы дадзеных, так давайце адкрыем, што Gedit базы дадзеных, і глядзець на гэта. Гэта не самы сэксуальны фарматаў файлаў. Гэта на самай справе адна частка дадзеных лініі на лінію за лініяй, але тыя з вас, хто выкарыстоўвае Excel або CSV файлаў, значэнні, падзеленыя коскамі, Я мог бы, вядома, выкарыстоўваць Fprintf замест гэтага, можа быць, зрабіць нешта накшталт гэтага так што я мог фактычна стварыць эквівалент файл Excel шляхам аддзялення рэчы з коскамі, а не толькі новых ліній. У гэтым выпадку, калі б замест гэтага выкарыстоўваць коскі замест новых ліній Я мог літаральна адкрыць гэты файл базы дадзеных у Excel, калі я замест гэтага зрабіў яго падобным на гэта. Карацей кажучы, цяпер, калі ў нас ёсць сілы, каб пісаць файлы Цяпер мы можам пачаць захавання дадзеных, захоўваючы яго на дыск вакол так што мы можам захоўваць інфармацыю вакол зноў і зноў. Звярніце ўвагу на некалькі іншых рэчаў, якія зараз крыху больш знаёма. У верхняй часткі гэтага файла C мы маем ЬурейеЕ таму што мы хацелі стварыць тып дадзеных, які ўяўляе сабой слова, так што гэты тып называецца словам, а ў сярэдзіне гэтай структуры гэта крыху аматар цяпер. Чаму слова складаецца з відаць масіва? Што такое слова проста інтуітыўна? Гэта масіў знакаў. Гэта паслядоўнасць знакаў, спіна да спіны да спіны. ЛІСТЫ загалоўнымі літарамі, здараецца, мы калі заўгодна казаць максімальнай даўжыні любое слова ў слоўнік, які мы выкарыстоўваем для Scramble. Чаму я 1? Нулявы знак. Нагадаем, калі мы рабілі напрыклад Bananagrams мы павінны асаблівае значэнне У канцы слова для таго, каб адсочваць , Дзе словы на самой справе скончыліся, і як спецыфікацыя праблема набору кажа Тут мы зносін з дадзеным словам лагічнае значэнне, Сцяг, так бы мовіць, сапраўдным або ілжывым. Знайшлі Ці вы гэта слова ўжо, таму што мы разумеем, мы сапраўды маем патрэбу спосаб запамінання не толькі тое, што слова ёсць у Scramble але вы ці не, чалавека, знайшлі яго так што калі вы знойдзеце слова "" Вы не можаце проста ўвесці, уводзіць, уводзіць, увядзіце і атрымаеце 3 балы, 3 балы, 3 балы, 3 балы. Мы хочам мець магчымасць у чорны спіс, што слова, усталяваўшы лагічнае праўдзіва, калі вы ўжо знайшлі яго, і менавіта таму мы інкапсуляваць яго ў гэтую структуру. Цяпер, тут, у Scramble ёсць гэтая іншая структура называецца слоўнікам. Пры адсутнасці тут з'яўляецца слова ЬурейеЕ, таму што ў гэтым выпадку мы павінны інкапсуляваць Ідэя слоўніка, і слоўнік змяшчае цэлую кучу слоў, як вынікае з гэтага масіва, і як многія з гэтых слоў? Ну, што б гэта зменная памеры кажа. Але нам проста трэба адзін слоўнік. Нам не патрэбныя тыпы дадзеных называюцца слоўнік. Нам трэба ўсяго толькі адно з іх, так атрымліваецца ў C што, калі вы не кажаце ЬурейеЕ, вы проста кажаце структуры, то ў фігурных дужках Вы змяшчаеце вашыя зменныя, то вы змяшчаеце імя. Гэта аб'ява адной зменнай называецца слоўнік які выглядае наступным чынам. З іншага боку, гэтыя лініі стварэння шматразовых структура дадзеных называецца словам што вы можаце стварыць некалькі копій, гэтак жа, як мы стварылі некалькі копій студэнтаў. Што гэта ў канчатковым выніку дазволіць нам рабіць? Дазвольце мне вярнуцца ў, скажам так, больш просты прыклад з больш простых часоў, і дазвольце мне адкрыць, скажам, compare1.c. Праблема тут у руках на самай справе адхіліце пласт радок і пачаць ўзлёт гэтых навучальных колах таму што атрымліваецца, што радок ўвесь гэты час з'яўляецца, як мы і абяцалі ў тыдзень 1 сапраўды толькі мянушка, Сінонім ад CS50 бібліятэкі за тое, што выглядае трохі больш загадкавым, сімвал *, і мы бачылі гэтую зорку раней. Мы бачылі гэта ў кантэксце файлы. Давайце паглядзім, чаму мы хавалі гэтую дэталь на працягу некаторага часу. Вось файл з імем compare1.c, і ён, відавочна, прапануе карыстачу на 2 радкі, з і т, а затым ён спрабуе параўнаць гэтыя радкі роўнасці ў радку 26, і калі яны роўныя яна кажа: "Вы набралі адно і тое ж», і калі яны не роўныя яна кажа: "Вы ўвялі розныя рэчы". Дазвольце мне ісці наперад і запусціць гэтую праграму. Адпусціце мяне ў мой зыходны каталог, зрабіць compare1. Ён складзены ў парадку. Дазвольце мне выканаць compare1. Я буду павялічваць, увядзіце. Скажы што-небудзь. HELLO. Я скажу нешта зноў. HELLO. Я дакладна не ўводзіць розныя рэчы. Дазвольце мне паспрабаваць гэта зноў. BYE BYE. Вызначана не адрозніваецца, так што тут адбываецца? Ну, тое, што сапраўды па параўнанні ў радку 26? [Неразборліва-студэнт] Так, так атрымліваецца, што радок, тып дадзеных, гэта свайго роду хлусня ў выратаванне. Радок знакаў *, але тое, што знак *? Сімвал *, як кажуць, з'яўляецца паказальнікам, і паказальнік эфектыўна адрас, Сума месца ў памяці, і, калі вам здарыцца ўвялі ў слова, як HELLO, Нагадаем мінулых абмеркаванняў радкоў гэта падобна на слова HELLO. Памятаеце, што слова, як PRIVET могуць быць прадстаўлены як масіў сімвалаў, як гэта а затым з дапамогай спецыяльнага знака ў канцы званы нулявы знак, як \ пазначае. Што на самай справе з'яўляецца радком? Заўважым, што гэта некалькі участкаў памяці, і на самай справе, канец вядома толькі, калі паглядзець усю радок шукае асаблівы характар ​​нулявы. Але калі гэта кавалак памяці з майго кампутара, Давайце адвольна сказаць, што гэты радок проста пашанцавала, і ён, былі ўладкаваны ў самым пачатку аператыўнай памяці майго кампутара. Гэта байт 0, 1, 2, 3, 4, 5, 6 ... Калі я кажу нешта накшталт GetString і я радок S = GetString што на самой справе вяртаюцца? За гэтыя апошнія некалькі тыдняў, што на самой справе захоўваецца ў ы Але не гэтая радок сама па сабе, але ў дадзеным выпадку тое, што захоўваецца з'яўляецца лік 0, так што на самай справе робіць GetString яно фізічна не вяртаць радок. Гэта нават не рэальна зрабіць канцэптуальным сэнсе. Што яна робіць вяртанне ліку. Гэта лік з'яўляецца адрасам PRIVET у памяці, і радок з потам, калі мы адхіліце гэты пласт, радок на самай справе не існуе. Гэта ўсяго толькі спрашчэнне CS50 бібліятэкі. Гэта сапраўды тое, што называецца сімвал *. Char мае сэнс, таму што слова, як Ала? Ну, гэта серыя знакаў, набор знакаў. Char * азначае, што адрас характару, так што гэта значыць для вяртання радкі? Добры, просты спосаб вяртання радкі ёсць, а не спрабаваць высветліць, як я вяртаюся ў 5 або 6 розных байтаў Дазвольце мне вярнуцца ў адрас якога байт? Першы. Іншымі словамі, дазвольце мне даць вам адрас знака ў памяці. Вось што знак * ўяўляе сабой, па адрасе аднаго знака ў памяці. Выклічце гэтую зменную с. Захоўваць у прыватнасці, што з адрасу, які я ўмоўна сказаў роўны 0, толькі, каб трымаць рэчы простымі, але на самой справе гэта наогул вялікія ліку. Пачакайце хвіліну. Калі вы толькі што далі мне адрас першага знака, як я ведаю, што адрас Другі персанаж, трэці, чацвёрты і пяты? [Неразборліва-студэнт] Вы толькі ведаеце, дзе ў канцы радка праз гэты зручны трук, таму, калі вы выкарыстоўваеце нешта накшталт Printf, што Printf літаральна бярэ ў якасці аргументу, Нагадаем, што мы выкарыстоўваем запаўняльнік% з гэтым, а потым перайсці ў зменнай, якая захоўвання радка. Тое, што вы сапраўды праходзіць гэта адрас першага знака гэтага радка. Printf затым выкарыстоўваецца для цыклу або час цыклу пры атрыманні гэтым адрасе, Напрыклад, 0, так што дазвольце мне зрабіць гэта цяпер, Е ("% з \ п", с); Калі я называю Е ("% з \ п", с); што я сапраўды прадастаўленні Printf з гэта адрас першага знака ў S, якое ў гэтым выпадку з'яўляецца адвольным H. Як Printf ведаць, што менавіта для адлюстравання на экране? Чалавек, які рэалізуецца Printf рэалізаваны цыкл падчас або цыкл , Што кажа гэтая характар ​​роўная спецыяльны сімвал NULL? Калі няма, то раздрукаваць яго. Як наконт гэтага? Калі не друкаваць, друкаваць, друкаваць, друкаваць. О, гэта адно асаблівае. Спыніце друк і вярнуцца да карыстача. І вось літаральна ўсё, што адбывалася пад капотам, і што гэта шмат, каб пераварыць ў першы дзень класа, але цяпер гэта сапраўды будаўнічы блок разуменні ўсё , Які быў адбываецца ўнутры памяці нашага кампутара, і ў канчатковым выніку мы будзем дражніць гэтага адзін ад аднаго з невялікай дапамогай у аднаго з нашых сяброў у Стэнфардзе. Прафесар Нік Parlante ў Стэнфардзе зрабілі гэты выдатны відэашэраг ад усіх відаў розных моў, якія ўвялі гэтая маленькая Бинки характар ​​Claymation. Голас вы пачуеце ўсяго некалькі секунд прагляду падхалімаў з'яўляецца тое, што прафесар Стэнфорда, і вы атрымліваеце Толькі 5 або 6 секунд гэта прама цяпер, Але гэта да ведама, на якіх мы скончым сёння і пачаць у сераду. Я даю вам Паказальнік Fun з Бинки, папярэдні прагляд. [♪ Музыка ♪] [Прафесар Parlante] Гэй, Бинки. Прачніся. Гэта час для паказальніка весела. [Бинки] Што гэта? Даведацца пра паказальнікаў? О, сентыментальны! Мы будзем бачыць Вас у сераду. [CS50.TV]