Дэвід Дж малая: Гэта CS50 і гэта пачатак тыдня чатыры. І, хлопчык, Volkswagen у Бяда ўсё з-за праграмнага забеспячэння. Давайце зірнем. [Прайграванне відэа] -автомобили, Самыя разумныя персанажы у Фарсаж фільмаў. На гэтым тыдні нямецкі аўтавытворца Volkswagen апынуўся ў сярэдзіне скандалу патэнцыйна крымінальныя маштабы. -Volkswagen Рыхтуецца мільярды штрафаў, магчымыя крымінальныя абвінавачванні для яе кіраўнікоў, а Кампанія прыносіць свае прабачэнні за фальсіфікацыю 11 мільёнаў аўтамабіляў у дапамагчы яму перамагчы тэсты выкідаў. -Certain Дызельныя мадэлі былі распрацаваны з складанае праграмнае забеспячэнне што б інфармацыя ў тым ліку становішча руля і аўтамабіль паскорыць, каб вызначыць, што аўтамабіль быў праходзіць тэставанне выкідаў. Пад гэтым акалічнасцю, рухавік дазволіць знізіць выкіды таксічных рэчываў. Але машына была абсталявана абысці што, калі ён быў гоняць. Выкіды павялічыліся ад 10 да 40 раз вышэй дапушчальных узроўняў EPA. [КАНЕЦ ПРАГЛЯДУ] Дэвід Дж малая: Дык давайце зірніце на гэта і паглядзець, як менавіта гэта можа быць рэалізавана і як гэта можа паўплываць на так шмат машын, як гэта. Такім чынам, у маёй руцэ вось прэс- рэліз, які быў выпушчаны ў EPA-- Экалагічны Агенцтва па ахове, якія гэта рэгулюе орган ЗША, што ручкі экалагічных праблем, і затым фактычны афіцыйнае апавяшчэнне, што было адправіць Volkswagen ўсяго некалькі дзён таму. Такім чынам, па ахове навакольнага асяроддзя, піша, і ў цяперашні час раскрывае публічна, складаныя праграмнае забеспячэнне Алгарытм на некаторых Аўтамабілі Volkswagen выяўляе калі аўтамабіль праходзіць Тэставанне афіцыйныя выкіды і ператвараецца поўныя выкідаў кантралюе толькі падчас тэсту. Эфектыўнасць Гэтыя транспартныя сродкі забруджванне Прылады кіравання выкіды моцна зніжаецца ва ўсіх нармальных ваджэння сітуацыі. Гэта прыводзіць у аўтамабілях, якая задавальняе як Стандарты ў лабараторыі тэставання або станцыя, але падчас нармальнай працы выпраменьваюць oxides-- азоту або NOx-- з хуткасцю да 40 разоў стандарт. Праграмнае забеспячэнне вытворчасці Volkswagen цытата канец цытаты, паражэнне прылады, як вызначана чыстага Закон Паветра ў ЗША. Яны ідуць на кажуць, што па ахове навакольнага асяроддзя і іншае агенцтва раскрылі паразу прылады Праграмнае забеспячэнне пасля незалежнага аналізу даследчыкамі Захаду Універсітэт Вірджыніі. Забруджванне NOx спрыяе дыяксід азоту, прыземнага азону, і дробных часціц справа. Ўздзеянне гэтых забруджвальнікі была звязана з шырокім дыяпазонам сур'ёзныя наступствы для здароўя, у тым ліку падвышанай астмы атакі і іншыя рэспіраторныя хваробы, якія могуць быць дастаткова сур'ёзнымі, адправіць людзей у бальніцу. Ўздзеянне азону і цвёрдых часціц таксама мае былі звязаны з заўчасным смерць з-за дыхання, звязаныя або сардэчна-сасудзістых эфектаў. Дзеці, пажылыя людзі, людзі з існавалі раней рэспіраторныя захворванні асабліва схільныя рызыцы наступствы для здароўя гэтых забруджвальнікаў. Дастаткова сказаць, гэта даволі сур'ёзна. І давайце на чытаць яшчэ адзін урывак і тады мы будзем глядзець на асноўныя наступствы гэта ў кантэксце машыне. У прыватнасці, Volkswagen выраблены і ўстаноўлены Праграмнае забеспячэнне ў так званы электроннае кіраванне module-- або ECM-- з гэтыя транспартныя сродкі, якія зандзіравання калі транспартны сродак быў апрабаваны для захаванне нормаў выкідаў EPA. Грунтуючыся на розных уваходаў у тым ліку Становішча рулявога колы, аўтамабіль Хуткасць, працягласць рухавіка эксплуатацыя і бараметрычнага ціску, гэтыя ўваходы дакладна адсочваюцца параметры федэральнага працэдуры выпрабаванні, якая выкарыстоўваецца для Тэставанне выкідаў для сертыфікацыі EPA мэтаў. Падчас тэставання выкідаў ера, праграмнае забеспячэнне транспартных сродкаў ECM пабег праграмнае забеспячэнне, якое вырабляецца Вынікі сумяшчальныя выкідаў. На ўсіх іншых выпадках, аўтамабіль ECM праграмнае забеспячэнне пабег асобны дарогу Каліброўка што знізіла Эфектыўнасць працы Агульная сістэма кантролю за выкідамі, у прыватнасці, селектыўнага каталітычнага зніжэнне NOx Lean trap-- які мы ўбачым праз імгненне. У выніку, выкіды NOx павялічана з каэфіцыентам 10 да 40 разоў вышэй за ўзровень, адпаведных EPA У залежнасці ад тыпу прывада цыклу. Дык што ж гэта на самай справе азначае, і Зыходны код праграмнага забеспячэння працуючым на Volkswagen мае не яшчэ былі публічна раскрытыя, з'яўляецца тое, што, фактычна, гэта эквівалентна дзесьці там унутры кода Фальксвагена. Калі вы праходзяць выпрабаванні, і калі аўтамабіль выяўляе пэўныя экалагічныя фактары як рулявое кола становішча або рух або яе адсутнасць у машыне або любую колькасць іншых фактараў якія ў цяперашні час гіпотэза каб быць часткай гэтай формулы, яны проста уключыце Поўны кантроль выкідаў. Іншымі словамі, яны пачынаюць выпраменьвальныя менш забруджвальных рэчываў. У адваротным выпадку, у любой іншай сітуацыі калі ён не знойдзены як у лабараторыі, яны проста не робяць. І так можна спрасціць гэта ў больш бетон псевдокод з чымсьці як гэта. Калі колы паварочваюцца, але руль няма, наводзіць на думку што аўтамабіль знаходзіцца на некаторыя выгляд верціцца цыліндру але ў нейкі склад праходзяць выпрабаванні, то, як паводзяць сябе EPA хачу, каб вы. У адваротным выпадку няма. Такім чынам, давайце зірнем на кароткім відэа, глядзіць на тое, што наступствы маюць гэта на самай справе механічна. [Прайграванне відэа] -за Пятніцу па ахове навакольнага асяроддзя абвясціла, што некаторыя Аўтамабілі Volkswagen Audi паміж 2009 і ў гэтым годзе былі з дапамогай так званы паразу прылада каб абыйсці законы выкідаў прызначаны для падтрымання чысціні паветра. Але што гэта азначае? Ну, сучасныя аўтамабілі маюць дзесяткі кампутараў ўнутры іх. І некаторыя з гэтых кампутараў дапамагчы каардынаваць функцыі рухавіка для аптымальнай прадукцыйнасць, пераканаўшыся, што ёсць не занадта шмат смецця выходзіць з выхлапной трубы. Яны на самой справе працуе Такім чынам на працягу некалькіх дзесяцігоддзяў. У прынцыпе, кожная частка рухавіка сучаснага аўтамабіля мае датчык або кантролер на ім, і гэтыя кампутары чытаюць у дадзеных тысячы раз у секунду карэкціроўкі гарбаты як стаўленне паліва да паветра што адбываецца ў цыліндры. Яны падманваюць Volkswagen і Audi мадэляў дызеляў, і дызелі маюць яшчэ адзін сапраўды важная кампутарная кантраляваныя параметры, што з'яўляецца колькасць несгоревшего паліва адбываецца у выхлап. Зараз гэта гучыць дрэнна. Не гучыць, як вы хацелі б, несгоревшего паліва адбываецца ў выхлап. Але ў выпадку ўключэння дызель, у вас ёсць што называецца пастка NOx, які з'яўляецца прыладай, якое паглынае і пасткі для аксідаў азоту што забруджвальныя рэчывы, якія у адваротным выпадку перайсці ў атмасферу. І эфект ад гэтага NOx пастку ўзмацняецца з несгоревшего паліва. Такім чынам, паражэнне прылада з'яўляецца спецыяльная праграма ўнутры гэтых кампутараў, якія могуць зрабіць гэта выглядаць аўтамабіль адказвае выпраменьванне стандарты, нават калі ён гэтага не робіць. Volkswagen былі праблемы на сваіх руках. Яго дызельныя рухавікі былі вядомыя для атрымання вялікую эканомію паліва, але пастка NOx добра працуе толькі калі больш паліва выкарыстоўваецца. Такім чынам, аўтамабіль будзе выявіць, з дапамогай гэтай прылады паразу, калі ён быў атрымліваць выкіды Тэст, ён будзе выкарыстоўваць больш паліва, зрабіць пасткі працу NOx таксама, выкіды будзе ў парадку. Але тады вы атрымаеце на дарозе, прылада выключаецца, вы спальванне меншага колькасці паліва але вы пакладзеце столькі, колькі 40 разоў больш забруджвальных рэчываў у атмасферу. Але як, чорт вазьмі аўтамабіль ведаю, што гэта было выпрабоўваецца на адпаведнасць выкідаў? Ера кажа, што гэта быў складаны сістэма, якая правяраецца рэчы як руля, Хуткасць, як доўга рухавік быў уключаны, і нават атмасферны ціск. Іншымі словамі, было няма спосаб гэта не было выпадковым таму што праграмнае забеспячэнне было прызначаны вельмі старанна, каб выявіць афіцыйны камінара. Вось некаторыя даволі сур'ёзныя падман і гэта чаму Volkswagen у такія сур'ёзныя непрыемнасці. На самай справе, іх генеральны дырэктар, Марцін Винтеркорн, толькі з'ехаў. Так што ж адбываецца далей? Ну, калі вы адзін з паўтары мільёнаў дызельныя Jettas, Бітлз, Гольфы, Пасаты, ці Audi A3s ажыццяўляецца, добрыя навіны ёсць што ваш аўтамабіль па-ранейшаму бяспечна ездзіць. Вы не павінны пакласці яго прэч да Volkswagen не выдае водгук. Але ў нейкі момант яны верагодна, прыйдзецца абнавіць праграмнае забеспячэнне ўнутры вашага аўтамабіля. Калі гэта адбудзецца, вы маглі б атрымліваць менш міль у баку. Адвакаты ўжо рыхтуецца на пазоваў Такім чынам, уладальнікі, магчыма, атрымаць кампенсацыю у нейкі момант у будучыні. Але гэта не збіраецца адбудзецца ў хуткім часе. [КАНЕЦ ПРАГЛЯДУ] Дэвід Дж малая: Так гэта на самай справе падымае цікавая карціна пытанне больш а давяраць. Дакладна? Ва ўсіх нас ёсць айфонаў або Андроіды або што-то ў нашых кішэнях, хутчэй за ўсё, у гэтыя дні, ці наўтбукі на нашых каленях, якія працуе праграмнае забеспячэнне зрабіў Яблыкам і Microsoft і гронкі іншых кампаній. Але як мы ведаем, што тое, што Гэтыя праграмныя прадукты робяць на самай справе, што гэта кампаніі кажуць, што яны робяць? Напрыклад, хто павінен сказаць, што кожны раз, калі вы зрабіць тэлефонны званок на ваш iPhone або Android-тэлефон або да т.п., што гэта нумар тэлефона таксама ня загружаецца на сервер які-небудзь кампаніі з-за некаторых праграме вы маеце напісаў, няхай гэта будзе аперацыйная Сама сістэма, як прашыўкай або Android, ці таму, што вы спампавалі некаторыя прыкладання трэціх бакоў што-то слухае каб усе вы друкуеце або усё, што вы на самой справе кажуць. Як вы ведаеце, што, калі вы, хлопцы, працуеце Clang або зрабіць, каб скампіляваць уласнае праграмнае забеспячэнне ў CS50, як У вас ёсць персанал, які CS50, у шляхам бібліятэцы CS50, не было ўваходу кожны радок, якую вы калі-небудзь атрымлівалі або кожны цаля вы калі-небудзь атрымлівалі? Ну, вы, безумоўна, можа выглядаць у зыходным кодзе нешта як бібліятэкі CS50, вы мог глядзець на зыходны код для аперацыйнай сістэмы Linux працуе на CS50 IDE. Але дзіўнае прадстаўленне было дадзена ў 1984 годзе ў атрыманні прэміі Цьюрынга на а вельмі вядомы вучоны вядомы as-- імя Кен Томпсан, які атрымаў прэмію Цьюрынга, якая з'яўляецца свайго роду кампутар Навукі Нобелеўская прэмія, калі хочаце, за працу па Аперацыйная сістэма называецца Unix, які вельмі падобны на дух, што мы выкарыстоўваем, які з'яўляецца Linux. І пытанне спытаў ён яго прыняцце гаворка, па сутнасці, ўстанаўлівае рамкі для гады і гады абмеркавання аб даверы і бяспекі, гэта было. У якой меры адным давяраць Зацвярджэнне, што program-- кавалак з software-- бясплатна траянскіх коней? Можа быць, гэта больш важна давяраць людзі, якія напісалі праграмнае забеспячэнне. І на самай справе, мы звязаны да размовы, што ён даў, прымаючы гэтую ўзнагароду у 80-х на сайце CS50 ў пад стар лекцыі на сённяшні дзень. Таму што тое, што вы ўбачыце з'яўляецца тое, што ён на самай справе дае даволі просты прыклад таго, як нават кампілятар Clang, як або што- кампілятары іншыя, якія выкарыстоўваюцца ў мінулым, што, калі убудаваныя ў кампілятара самі карыстаецеся мала, калі стан, якое па сутнасці кажа, калі вы заўважылі, што гэты код выкарыстоўвае функцыя GetString або GetInt Функцыя, ісці наперад і ўстаўце задняя дзверы або траянскі конь напрыклад, што гэтая праграма у цяперашні час мае некаторыя нулі і тыя, якія робяць нешта шкоднаснае. Уваход ўсе вашы націску клавіш, загрузка гэтых дадзеных у нейкі сервер, або сапраўды што-небудзь. І тое, што Кен Томпсан ідзе на зрабіць у гутарцы каб прадэманстраваць, што нават калі ў вас ёсць доступ да крыніцы код кампілятара, які якія злосна можа рабіць гэта, гэта не мае значэння, таму што ёсць гэтая курыца і яйка Рэальнасць мінулым многія гадоў у выніку чаго складальнікі выкарыстоўваюцца для кампіляцыі саміх сябе. Іншымі словамі, шлях назад, калі хто-то давялося б напісаць першы кампілятар. І пасля гэтага, у любы час яны абнаўляюцца кампілятар, змяніўшы зыходны код, дадаючы новыя магчымасці і перакампіляванні для людзей накшталт нас, каб выкарыстоўваць, ну, яны выкарыстоўваюць стары версія кампілятарам сабраць новы версія кампілятара. І калі вы паглядзіце на размовы, што ён даў, вы ўбачыце, што з-за гэтай круглявасці, Вы можаце на самой справе маюць памылкі або Траянскія коні ўбудаваны ў праграмнае забеспячэнне мы выкарыстоўваем. І нават калі вы паглядзіце на Зыходны код для гэтых праграм, яна не можа быць нават відаць таму што падман на самай справе у нейкай старой версіі кампілятар, які з тых часоў быў ін'екцыйных пагрозу ў нашым праграмным забеспячэнні. Якія толькі казаць, што мы сапраўды не можа і не павінен давер праграмнае забеспячэнне працуе на нашых наўтбуках або тэлефоны або любую колькасць месцаў. І на самай справе, пазней у гэтым семестры, калі мы пачынаем казаць аб вэб-праграмаванні а на самай справе пачаць будаваць вэб-прыкладанні, самастойна выходзіць мы пагаворым пра іх пагрозы і інш. Цяпер вы, напэўна, задаваліся і заўважыў, што было малюсенькае Дарт Вейдер ў кліпах, што Грань паказваў там аб Volkswagen. Калі Вы ніколі не бачылі, я думаў, што мы павінны палегчыць настрой, таму што гэта ўсё вельмі гняце і палохае. Я збіраюся азірацца назад на Super Bowl 2011 калі камерцыйная па Volkswagen-- і гэта амаль робіць іх сімпатычным again-- эфір ўпершыню на тэлебачанні. Гэта другі заціск 60 Я думаю, што вы будзеце атрымліваць асалоду ад. [Прайграванне відэа] [МУЗЫКА - тэма з "Зорных войнаў"] [Сабака брэша] [Машына пачынае] [КАНЕЦ ПРАГЛЯДУ] Дэвід Дж малая: Так. Я проста правяраў. Гэты аўтамабіль знаходзіцца ў спісе парушэнняў. Добра. Такім чынам, мы разгледзім некаторыя ПСЕВДОКОД хвіліну таму. А вось больш фрагмент псевдокода кода што мы бачылі некалькі разоў да гэтага часу. І давайце выкарыстоўваць гэта магчымасць Зараз, каб ўвесці новыя праграмы метад, які мы зрабілі см алгарытмічных на мінулым тыдні, калі мы глядзелі на сартавання зліццём. Але давайце фармалізаваць яго і паглядзець, як мы маглі б выкарыстоўваць яго ў рэальны код, а затым мы збіраемся выкарыстоўваць гэта Тэхніка па дарозе найбольш верагодна, каб вырашыць пэўныя іншыя праблемы. Так што гэта быў адзін з першых праграм, якія мы небудзь пісаў, хоць і ў псевдокода кода. І тое, што гэтая праграма дазволіла нам зрабіць курс было знайсці Mike Smith у тэлефоннай кнізе. І звярніце ўвагу, у прыватнасці ліній восем і 11, якія былі гэта заяву Go To. І на самай справе, некаторыя мовы, З сярод іх, на самай справе ёсць Зацвярджэнне, што літаральна перайсці да таго, што дазваляе перайсці да пэўнай радку. Гэтае правіла, з неадабрэннем, паколькі гэта можа быць вельмі лёгка злоўжываць і вы можаце пачаць скакаць вашага Праграма паўсюль, у адрозненне да выкарыстання такой логіка і струмень кіравання што мы выкарыстоўвалі да гэтага часу толькі з Завесы і ўмовы і да таго падобнае. Але мы можам спрасціць гэты алгарытм у псевдокода кода наступным чынам. Замест гэтага итеративного або цыкл падыход дзе мы ўвесь час вяртаюся і таму і вярнуцца да лініі тры, чаму мы не проста выгляд Пунт і больш як правіла, кажуць, у адпаведнасці сем і 10, проста замяніць гэтыя два пар ліній з, інакш, калі Сміт раней у кнізе мы будзем шукаць Майка ў левая палова кнігі. Інакш, калі Сміт пазней у Кніга, пошук Майка ў праве палова кнігі. І заўважце, ужо круглявасці. Дакладна? Я шукаю Майка ў тэлефонная кніга, а затым У рэшце рэшт я трапіў, можа быць, Лінія сем ці, можа быць радок 10 і мая інструкцыя сабе гэта пошук Майка ў палове тэлефоннай кнізе. Ну, як мне знайсці Майка? Я ў сярэдзіне пошук Майка, чаму вы, здаецца, адпраўкі мяне ў кола? Але гэта нармальна, таму што тое, што адбываецца з памерам праблемы, як напісана ў радку 7 і 10? Мы не проста кажу пошуку Майка, шукаць майка. Мы спецыяльна кажу, што? Пошук для яго ў левай палове правая палова якога эфектыўна палова памер праблемы. Так што гэта нармальна, што мы накшталт Удзельнічаючы ў гэтым круглявасці, гэта заганны круг, таму што, па меншай меры, мы што робіць праблему ўсё менш і менш. І ў рэшце рэшт мы збіраемся дасягнуць што так званая база выпадак, калі у нас ёсць толькі адна старонка left-- як наш валанцёр мінулым тыдні did-- мы мелі адну старонку налева, а затым мы не павінны працягваць шукаць Майк Сміт таму што ён альбо на гэтай старонцы ці ён не з'яўляецца. Так як мы можам рэалізаваць гэтую ідэю, гэта Сартаваць круглявасці у рэальны код? Ну, мы можам выкарыстоўваць метад які звычайна называюць Рэкурсія. І мы бачылі гэта ў псевдокод для сартавання зліццём на мінулым тыдні. Нагадаем, што гэта быў псевдокод для сартавання зліццём. Гэта магчыма нават прасцей, чым бурбалка выбар або ўстаўкі роду толькі з пункту гледжання прастаты з дапамогай якога можна выказаць гэта. Але гэта таму, што Мы накшталт кругавой кажучы, шукаць нешта шукаючы яго зноў. Але мы шукаем альбо на левая палова ці правая палова і затым у канчатковым рахунку мы зліцця ў гэтым выпадку. Але тут, таксама, з гэтыя два сартавання лініі, ж мы зноў гэта Ідэя рэкурсіі. І канкрэтна гэта азначае, што, у кантэксце алгарытму, з'яўляецца тое, што алгарытм з'яўляецца рэкурсіўнай калі ён выкарыстоўвае або называе сябе. Або з пункту гледжання C, функцыя з'яўляецца recursive-- функцыю пад назвай Foo з'яўляецца рэкурсіўнай, калі Foo, дзесьці ў яго зыходным кодзе, выклікае сама функцыя Foo. І гэта дрэнна, калі ўсё Foo-небудзь робіць гэта называць сябе зноў і зноў. Гэта нармальна, калі Foo ў канчатковым выніку спыняецца, як гэта робіць сартаванне зліццём, кажучы, пачакай, Калі гэтая праблема супер Невялікі, напрыклад, ці я знайшла таго, якога я шукаю, проста вярнуць. Ня рэкурсіўна, ня цыклічна называць сябе зноў. І так давайце зірнем на як гэта можа на самай справе працуюць. Так што я збіраюся ісці наперад і адкрытым да двух прыкладах зыходнага кода тут. Адзін з якіх называюць сігма 0. І гэта зусім не рэкурсіўная, але давайце Погляд на тое, што гэтая праграма робіць. Я распранулі ўсе каментары ад яго, але ўсё зыходнага кода на CS50-х Сайт мае каментары, калі вы хачу, каб прачытаць гэта пазней. І давайце зробім пару разважнасці правярае тут. Такім чынам, у верхняй часткі гэтага кода, у нас ёсць ўключаць CS50.h. Што гэта рабіць? Чаму гэта тут? Ва ўмовах разумныя непрафесіянала. Што ён робіць? Так. АЎДЫТОРЫЯ: Так што функцыя GetInt працуе. Дэвід Дж малая: Так што функцыя GetInt працуе. З-за гэтага ўнутры Файл, CS50.h, што мы ўбачым у хуткім часе ў тэрміны яго зыходны код, мае кучу функцый declared-- GetInt, GetString, і куча others-- і калі мы на самай справе ёсць, што Уключыць лінію, кампілятар Clang ня будзе ведаць, што ён існуе. І ж самае тычыцца лініі два, дзе INT вызначаецца Printf, якая з'яўляецца функцыяй мы працягваць выкарыстоўваць зусім няшмат. Цяпер, чацвёртая радок, здаецца, трохі Funky таму што гэта проста адзін лайнер. Гэта не мае кропку з коскі, ня кучаравыя брекеты, няма кода ўнутры яго. Але тое, што мы называем зрабіў гэтая рэч у мінулым тыдні? Так. Такім чынам, прататып. І чаму ў нас ёсць Прататып, які, здаецца, каб быць крыху залішнім як правіла, таму, што мы звычайна паглядзець функцыю яшчэ раз пазней у файле, ці не так? Дык чаму ж мы have-- вы проста чухаць галаву, але я вазьму яго. Так. АЎДЫТОРЫЯ: [неразборліва] Функцыя пасля асноўнай. Дэвід Дж малая: Дакладна. Так што кампілятар ведае, што вы у канчатковым рахунку вызначаюць або ажыццяўляць што функцыя пасля асноўнай, па-відаць. Так Clang і найбольш кампілятары роду нямы і яны будуць ведаць толькі тое, што вы кажаце ім. І калі вы хочаце выкарыстоўваць функцыя называецца сігма, Вам лепш вучыць кампілятар што яна існуе ў загадзя. Цяпер, галоўны сама, нават хоць гэта куча ліній, даволі знаёмыя, мы спадзяемся, у цяперашні час. Гэта значыць рабіць падчас цыкла чыя мэта ў жыцці тут, відаць, каб атрымаць цэлае станоўчае лік ад карыстальніка. І проста трымаць прыставаць да яго або яе, пакуль яны не супрацоўнічаюць. Затым у радку 16 у мяне ёсць цікавы выклік. IntAnswer. Які на левай руцэ бок дае мне Int якія могуць store-- называецца Answer-- які збіраецца захоўваць, па-відаць, вяртаецца значэнне сігма. Так сігма гэта проста адвольным, але значнае імя што я даў, каб функцыі чыя мэта ў жыцці ўзяць адзін argument-- мы будзем называць яго N ў гэтым case-- і проста ўзяць суму ад гэтага ліку плюс кожны станоўчае лік, што гэта менш, чым гэта. Так што, калі я праходжу ў ліку 2 да сігма, я хачу, каб дадаць 2 плюс 1 плюс 0-- ня 0-- так, што дае мне 3. Калі я праходжу ў 3 сігма, я хачу, каб ёсць 3 плюс 2 плюс 1, што дае мне 6. І гэтак далей. Так гэта толькі дадае да ўсё лік менш або роўны яму. Цяпер, тут я толькі збіраюся раздрукаваць адказ. Так як хуткая праверка на дурня, давайце зрабіць сігма 0-- кропка слэш сігма 0-- і дазвольце мне ўвесці 2. І я сапраўды атрымаць 3. Дазвольце мне ўвесці 3. Я сапраўды атрымаеце 6. І калі хто-небудзь можа зрабіць матэматыку хутка, калі я 50, што я збіраюся атрымаць? АЎДЫТОРЫЯ: [неразборліва]. Дэвід Дж малая: Ну, няма. Але 1275, які даволі блізка. Так што гэта вынік таго, 50 плюс 49 плюс 48 плюс 47 плюс 46 усё, аж да 1. Так што ўсё сігма робіць. Але давайце паглядзім, як мы рэалізаваны цяпер. Так тут з'яўляецца сама функцыя. І гэта, падобна, не нічога агульнага з рэкурсіі яшчэ. На самай справе, мы выкарыстоўваючы старая тэхніка школы. Я ініцыялізацыі зменнай называецца суму да нуля, то ў мяне ёсць foreloop тут, і я абвясціўшы Int назвай Я, мяркуючы яго роўным 1-- хоць я мог ўсталяваць яго роўным нуля, але так як я раблю даданне, хто клапоціцца, калі гэта нуль або адзін. Гэта адбываецца не мае ніякага эфекту. Так што я ітэрацыі да таго часу, як я гэта менш або роўны м, што з'яўляецца аргументам, які быў прыняты ў. А потым я проста трымаць павялічваючы І. і разуменне завесы ўсё, што я раблю робіць суму плюс роўная I. І гэта наўмысным. Я не хачу рабіць, у гэтым так, як сумы плюс плюс. Я хачу, каб на самой справе дадаць бягучае значэнне I якія становіцца ўсё больш і больш і больш у праточнай падлік. А потым я вярнуся суму. І так адказ атрымлівае значэнне сумы. І тады я раздрукаваць яго. Так ёсць магчымасць тут, хоць, накшталт спрашчэння гэты код канцэптуальна і выгляд ўдару аднаго гэта розум у тэрмінах Прастата, нават калі гэта патрабуецца час, каб разабрацца з зразумець, чаму гэта з'яўляецца магутным у гэтых невялікіх прыкладаў. Вось сігма одно-- так Другая версія гэтага кода. Усе наверсе ідэнтычны так што ж гісторыя ставіцца, як і раней. Але цяпер давайце паглядзім на Рэалізацыя сігма, якія Я скараціўся да толькі гэтыя lines-- чатыры радкі кода, на самай справе, плюс некаторыя фігурныя дужкі і прабелы. Але што я раблю? Калі т менш або роўная нуля, мне трэба, каб выгляд апрацоўкі што супер просты выпадак. І калі вы перадаць мне нуль ці нічога негатыў, які з'яўляецца проста дзіўна, Я проста хачу, каб адвольна але паслядоўна вяртаць нуль. Я не хачу гэтую рэч да трапіць у нейкай дзіўнай бясконцасць цыкл з-за адмоўнага значэння. Так што я проста кажу, што калі вы дасце мне нуля або менш, я вяртаюся да нуля. Але гэта добра, таму што гэта што адной старонкі тэлефоннай кнігі што засталося. Я адкусваючы вельмі канкрэтную праблему і не называючы нешта рэкурсіўна. Але ў радку 31, то я, здаецца, робяць? Дужкі проста трымаць рэчы, спадзяюся, трохі ясней. Але ўсё, што я раблю, я вяртанне M-- ўсе Вы ўручаліся me-- плюс Значэнне M-- прабачце, плюс значэнне сігма М мінус 1. Такім чынам, што ж гэта значыць? Калі вы дасце мне нумар 3 у якасці ўваходных, адказ, які я хачу, каб атрымаць, у канчатковым рахунку 6, таму што 3 плюс 2 плюс 1 дае мне 6. Але як я магу думаць аб як гэты код працуе? У першы раз я называю сігма і я праходжу ў значэнне 3, гэта, як кажуць на кавалку паперы, вось значэнне 3 і я быў прыняты ў якасці сігма гэта. 3, відавочна, не менш, чым 0, так стан КАЛІ не ўжываецца. Астатнія. Так што мне рабіць? Я хачу, каб вярнуцца м, што з'яўляецца 3, плюс сігма мінус 1 м. Такім чынам, дазвольце мне адсочваць гэта. Я збіраюся паставіць гэта ліст паперы ўніз. І тое, што значэнне, каб быць ясна, я збіраюся прайсці у сігма ў гэтай кропцы ў гісторыі? Які нумар? 2, дакладна? 3 мінус 2 Студзень. Так што я проста трэба трохі кавалак паперы тут. Так што цяпер сігма выклікаўся зноў. І я свядома паклаў гэта ўніз, таму што гэта накшталт як паўзу што версія гісторыі таму што цяпер я засяроджаны па сігнале ад мінус 1 м. Так м быў 3, м мінус студзені 2. Дык вось 2, што я быў прыняты. 2, відавочна, не менш 0, так што справа не прымяняюцца. Інакш я вярнуся м, што гэта рэч, плюс сігма якому кошту? Так што, калі сігма 1-- таму з'яўляецца м цяпер 2 SO 2 мінус 1 студзень. Так што зараз у мяне ёсць толькі значэнне 1. Я перадаю толькі нумар 1 да функцыі sigma-- ці сам here-- так 1, відавочна, не менш за нуль, да гэтага часу не прымяняюцца. Інакш вяртанне 1 плюс сігма што? 0. Такім чынам, дазвольце мне проста памятаеце, што. Я вярнуся да гэтага пазней. Цяпер я збіраюся ісці наперад і йота ўніз нумарам 0, таму што гэта мой аргумент або параметр. Я прайшоў шэраг 0 і, нарэшце, гэты працэс проста паўтараючы сабе аб'яву млоснасці зусім спыніць, таму што тое, што я адразу рабіць, калі я бачу гэтую 0? Я вяртаюся да нуля. Так што зараз у вас ёсць, каб пераматаць гісторыю. Калі я цяпер ідуць назад у часе, тое, што было самым апошнім, што Я зрабіў, калі б вы былі ў літаральным сэнсе перамоткі відэа? Я збіраюся забраць апошняе 1, і гэта дае мне 1 плюс 0 роўна 1. Калі я буду перамоткі гісторыя, што збіраецца даць мне 2 плюс гэта працуе значэнне, якое роўна 1. Дык вось 3. А потым я збіраюся трымаць перамотваць. Калі я ўпершыню паклаў лік 3-- так 3 плюс 3 дае мне 6. А цяпер, калі вы пераматаная відэа аж да гэтага моманту, гэта было вельмі Я спытаў першае пытанне. Калі прайшло 3, што сігма 3? Гэта сапраўды 6, сума усе гэтыя кавалачкі паперы. Так што, калі патрабуецца некаторы час, каб абгарнуць ваш розум вакол, гэта нармальна. Але ўлічыце, што гэта little-- яго быў вельмі наўмысным, што я складзеныя гэтыя лікі адзін на аднаго. Гэта накшталт як якія маюць memory-- запіс часу, як скруббер ў відэа, што я магу сапраўды назад ст. І мы збіраемся вярнуцца да што метафара толькі няшмат. Але спачатку, аказваецца, што ёсць шмат вундэркіндаў і смешных людзей, Я думаю, на Google. Хтосьці, хто вельмі добра трошкі ўвазе падышоўшы на імгненне і дапамагчы мне шукаць нешта? Вельмі, вельмі нізкі ключ. Хтосьці, хто ніколі не Перад прыдумаць, мабыць. ДОБРА. Да? Давай. Ідзем ўніз. Ваша імя? СЭМ: Сэм. Дэвід Дж малая: Сэм, давай ўніз. Гэта тое ж самае. Вельмі прыемна. Эй. Прыходзьце. Так што мне трэба, каб ты, калі Вы маглі б, Сэм, вось Google. Вы можаце шукаць тэрмін рэкурсіі? Не сапсаваць. А цяпер let's-- так. Націсніце ОК, што. Лепш націсніце што. Ах, атрымаць яго. Няма? ДОБРА. Так давайце зробім пару іншых. Не так шмат, звязаныя акадэмічна тут, але вы альбо шукалі Google для анаграмы? СЭМ: Не. Дэвід Дж малая: ОК. Пошук анаграмы замест рэкурсіі. Як наконт крыва. Вы калі-небудзь шукалі крыва? Цяпер, гэты трохі цяжка бачыць, але мы спадзяемся, everything's-- ОК. Гэта толькі ты і я атрымліваю асалоду ад гэтым. ДОБРА. Такім чынам, нарэшце, гэта one's-- гэта крыху крыва. Цяпер зрабіць бочку. Выдатна. Добра. Вялікі дзякуй Сэму. Тут вы ідзяце. Дзякуючы. Так што ж адбываецца на ўсяго з гэтых дурных прыкладаў? Так на самой справе, пад капотам Мільёны Google, радкоў кода па-відаць, некалькі дурное, калі Ўмовы, якія па сутнасці праверкі, калі карыстальнік мае набралі ў гэтай фразе, зрабіць што-то, што, верагодна, узяў нетрывіяльная колькасць часу ажыццявіць толькі пацешна у гэтым шляху. Але гэта ўсё, што кіпіць да пад капотам. Але, вядома, Рэкурсія больш з geekier прыклад сярод тых асаблівых хітрасцяў. І, вядома, ёсць іншыя там а таксама, што мы, магчыма, нават не выявіў толькі пакуль. Так зірніце, або разгледзець Цяпер наступная праграма, і, вядома, захапіць любы з іх на выхад. Я збіраюся ісці наперад і адкрыць праграму, якая збіраюся паспрабаваць памяняць два значэння. Але перш чым мы туды, давайце зробім гэта. Ці можам мы атрымаць яшчэ адзін Праца на грамадскіх пачатках, я думаю? Хочаце стаць валанцёрам? Няма? Давай до. Давай до. Добра. Так ваша імя чаго? Ларэн: Ларэн. Дэвід Дж малая: Ларэн. Прыходзьце на уверх, Ларэн. Так Ларэн быць выклік тут наступным чынам. Вельмі прыемна. Так Ларэн тут ёсць перад яе двума пустымі кубкамі. І ў нас ёсць некаторыя аранжавы сок і трохі малака і мы збіраемся пайсці наперад і рабіць наступнае. Мы проста збіраемся, каб запоўніць гэты. Праз некалькі унцый малака сюды і давайце запоўніць невялікую апельсінавы сок тут. І наадварот ўсіх гэтыя гледачы, памяняць месцамі два значэння гэтых кубкаў. Пастаўце апельсінавы сок у кубак малака і малако ў кубак апельсінавага соку. Як бы вы гэта зрабіць, калі вы былі ў дадому і мелі доступ да іншых паставак? Ларэн: Пакладзеце яго ў іншую кубак. Дэвід Дж малая: ОК. Такім чынам, давайце часова Пераменная, калі мы зробім гэта. І ісці наперад сёння, а ажыццявіць Такую ж працэдуру замены. Так, добра. Мы змясцілі OJ у часовае Пераменная, малако ў зменнай OJ, і ў цяперашні час часовая пераменная ў зменную малака. ДОБРА. Так вельмі добра зроблена да гэтага часу. Так што атрымліваецца, што out-- правесці думаў на імгненне. Тут проста вырадак гэта крыху, гэта будзе адпаведная З-код што мы проста рэалізуецца. У нас было два ўваходу, а і б, абодва якія мы проста скажам, для прастаты INT гадоў. І звярніце ўвагу, тут, калі я хачу памяняць значэння двух зменных А і В, мы сапраўды патрэбны пасярэднік, А часовая пераменная, часовае кубкі, у якой заліваюць адно з значэнняў так што ў нас ёсць запаўняльнік для яго. Але затым код у дакладнасці а Ларэн тут рэалізаваныя. Цяпер, толькі, каб атрымаць трохі вар'ятам, аказваецца што вы можаце зрабіць гэта без часовая пераменная. Каб зрабіць гэта правільна, хоць, мы збіраемся каб падмануць з некаторымі хіміі. У нас ёсць некаторыя дадатковыя кубкі тут. Такім чынам, бліжэй за ўсё, што выглядае як малако і ваду perhaps-- ці малака і OJ-- гэта ў нас ёсць некаторыя вада, так што мы будзем запаўняць гэта адно уверх з некалькі унцый чыстай вады. Гэта, верагодна, занадта шмат. Так. Гэта, безумоўна, занадта шмат. Трымаеце на адной сек. А зараз у нас ёсць нафта, якая, як я ўспамінаю ад сярэдняй школы хіміі класа, мы спадзяемся, гэта не змешваецца з вадой. Але гэта свайго роду выгляд выглядае, як малако і OJ. Так што цяпер, без выкарыстання часовая пераменная, Вы можаце памяняць гэтыя два значэння? Так алею ідзе ў кубак вады, вада ідзе ў кубак алею. Ларэн: Няма іншыя кубкі? Дэвід Дж малая: Ніякія іншыя кубкі. І я на самой справе не адчуў гэта перш, чым у гэтым годзе так што я не ведаю, калі гэта будзе на самай справе працуюць хімічна. Гэта не павінна было здарыцца. Гэта працуе? Добра. Так падзелу? Добра. Зараз мы атрымалі, каб атрымаць вады ў іншы кубку. Smarter канцэнтратары хімія мог верагодна, зрабіць гэта лепш за мяне. Lauren: вады на дне. Дэвід Дж малая: The water--, што было што ключ у апошні раз мы зрабілі гэта. Вы павінны зрабіць гэта ў правільным парадку. Так. That's-- ОК. Так што цяпер у нас ёсць два кубкі алею. ДОБРА. Гэта нармальна. Але калі гэта хімічна працаваў, чым i-- Ларэн: Гэта вада. Дэвід Дж малая: Гэта ў асноўным вада. Добра. Але гэта ўсё той жа шклянку, як раней. Так заліць it-- паспрабаваць там. ДОБРА. Гэта добрае выкарыстанне часу класа сёння. ДОБРА. Так што цяпер we-- прыемна. Накшталт таго. Добра. Так вельмі добра. Дзякуй Ларэн. Вельмі добра зроблена. Так што проста падарваць вашыя розумы, і гэта, мабыць, што-то гуляць з, калі вам падабаецца ў CS50 ID, Вы можаце, на самай справе, памяняць дзве зменныя без выкарыстання часовага цэлы лік. І гэта адпаведны код С. І калі вы памятаеце з мінулага Серада, мы ўвялі, калі коратка, некаторыя новыя аператары ў С і робіць хто ўспомніць, што маленькі моркву сімвал, што мала трохкутнай Сімвал з клавіятуры ўяўляе? Што пабітавае аператар? АЎДЫТОРЫЯ: EXOR. Дэвід Дж малая: EXOR. Эксклюзіўны Або. Так што, калі вы хочаце, проста для задавальнення на дадому, каб даць і б два адвольных такія каштоўнасці, як любы eight-- і I будзе выбраць восем бітнае значэнне. Калі вы зробіце гэта з 32 біт, Вы вельмі хутка надакучае. Але проста даць восем біт Значэнне гэта ўсё, адзін ці два, і даць б аналагічнай кошту. А потым, выкарыстоўваючы вызначэнне з XOR з мінулага сераду, прымяняць гэтую патроху, кожны з гэтыя восем бітаў у кожнай з А і В, а затым зрабіць яго менавіта за гэтым кодам. І гэта не тое, што няправільна Вы бачыце тут на экране. Гэта сапраўды зводзіцца трох аперацый XOR і нейкім чароўным а і б абмяняюцца пазіцыі без страты інфармацыі. Такім чынам, нафту і вада трук з'яўляецца Бліжэйшы рэальны свет ўвасабленне Я мог думаць аб тым, што, каб імітаваць. Але, безумоўна, гэта прасцей выкарыстоўваць часовую зменную, як у гэтым выпадку тут. І гэта таксама магчымасць сказаць, таксама такая мікра аптымізацыі, у якасці камп'ютэрнага вучонага хацеў бы сказаць, у той час як пацешна выхваляцца аб тым, як вы зрабілі гэта без як абмен з дадатковай зменнай, гэта яшчэ не ўсё, што пераканаўча. Таму што, каб захаваць 32 біт, як у выпадку фактычнага Int, гэта не ўсё, што пераканаўчых у сістэме, дзе вы маглі б выкарыстоўваць дзясяткі мегабайт ці нават больш, напрыклад памяці ў гэтыя дні. І на самай справе, калі мы атрымліваем на больш позні пастаўленай задачы і вы рэалізуеце загавор праверкі, і вы будзеце быць аспрэчаныя, каб зрабіць гэта з гэта як маленькая аператыўная памяць і толькі Час, як можна на computer-- вас яшчэ ёсць тыдзень, каб рэалізаваць it-- вы have-- вы будзеце выклік, каб мінімізаваць гэтыя рэсурсы. І гэта на самай справе толькі Выпадак гэты семестр дзе вы будзеце заахвочваць галіцца ад нават лепшых прадукцыйнасці варта інакш. Так што-як мы можам убачыць іх у кодзе? Дазвольце мне ісці наперад з прадпрыемствам і адкрыць прыклад што наўмысна называюць Няма своп, таму што гэта не на самай справе памяняць зменныя як вы на самой справе маглі б чакаць. Такім чынам, давайце зірнем. Вось праграма, якая не мае CS50 Бібліятэка адбываецца, проста стандартны ўвод / выснова. Цяпер у нас ёсць прататып для падпампоўкі наверсе, які толькі азначае, што ён павінен быць вызначаны пазней. А вось галоўны. Я адвольна прызначаныя х і у, адпаведна, адным значэння і два толькі таму, што яны маленькія і лёгка, каб думаць. А потым я проста ёсць куча printfs дзе ў мяне ёсць просты тэст. х 1 і ў з'яўляецца 2 меркавана што гэтыя printfs скажу. Так што няма магіі да гэтага часу. Тады я збіраюся сцвярджаць з друкаваць выразнасці, абмен кропка кропка кропка. Я збіраюся патэлефанаваць своп Функцыя, праходзячы па х і у. І давайце выкажам здагадку, што зараз своп ажыццяўляецца дакладна як гэта было некаторы час таму з часовай зменнай. І так я сцвярджаю, смела, месцамі. х цяпер гэта і зараз у гэтага. Але файл, вядома, не называецца Няма своп. Такім чынам, давайце на самай справе паглядзець, што адбываецца. Калі я не кампіляцыі ня своп, а затым зрабіць ./noswap, х 1, у 2. Падпампоўка месцамі. х роўны 1, у 2. Так што на самай справе, здаецца, нават недахопы хоць swap-- давайце пракруціць ўніз now-- рэалізуецца менавіта ў адпаведнасці з Код я прапанаваў некаторы час таму. Такім чынам, мы не збіраемся, каб атрымаць фантазіі з XOR рэчы на ​​дадзены момант. Гэта таксама павінна працаваць як з малаком і OJ, але гэта, здаецца, не працуе. Так давайце зробім гэта зноў. Можа быць, я проста не працуе правільна. Так што давайце не працаваць Няма своп зноў. Можа быць, я-- няма. Так што гэта проста не працуе. Так давайце зробім невялікі праверку наяўнасці свядомасці. Дазвольце мне ісці наперад тут, у своп і проста дадаць, пачакайце хвіліну, а ёсць% I / N і давайце убудова у значэнні а. Таму што я сапраўды хачу каб убачыць, што адбываецца. І на самай справе, гэта тэхніка адладкі што вы маглі б выкарыстоўваць у офіс гадзіны ці ва ўжо дома, падобна першай палове Дана Відэа Armendariz ў PSET3 дзе мы ўвялі друку Def, як рэкамендуемы метад, па меншай меры, для простых выпадкаў. Дазвольце мне ісці наперад і працаваць зрабіць няма замены зноў, ./noswap. Цікава. Так заўважыць, што, здаецца, каб быць праўдай. х 1, у 2, але гэта 2, калі У 1. Так гэтыя двое нейкім чынам памяняліся але х і ў не атрымліваюць месцамі. Такім чынам, каб было ясна, што адбываецца ёсць, тут у мяне ёсць х і ў і тыя лакальныя зменныя ў Асноўная сфера, я перадаю ў х і ў памяняць. Цяпер, своп, як асобнай функцыі, бясплатна патэлефанаваць свае аргументы або яго параметры усё, што ён хоча. Foo або бар або х ці ў або А ці В. Проста каб зразумець, што яны не супадае з х і ў па сабе, Я сказаў і б. Але мы маглі б назваць іх, што мы хочам. І так, падобна, Своп прайшло x-- АКА a-- і гэта перадаецца y-- AKA б. Нейкім чынам гэтыя тры лініі абмен менавіта тыя каштоўнасці, як гэта зрабіў Ларэн з малаком і OJ. Але калі мы раздрукаваць каштоўнасці, а і б сапраўды памяняць, але і х у няма ніякіх зменаў у іх. Нагадаем, што х і ў тут. Такім чынам, мы можам бачыць гэта з дапамогай іншая тэхніка, а таксама. І гэта таксама тэхніка убудаваныя ў задачы ўсталяваць тры. Давайце ісці наперад і рабіць гэта ў CS50 ID, калі вы яшчэ гэтага не зрабілі. На бакавой боку мы прама ёсць гэтую ўкладку Debugger. І калі вы адкрыць гэта, ёсць некаторыя таемныя звесткі што кінуў на вас першапачаткова. Але давайце дражніць гэта акрамя вельмі хутка. Такім чынам, адна, вы бачыце лакальныя зменныя. Аказваецца, што будаваць у CS50 IDE, і шмат асяроддзяў праграмавання больш Як правіла, гэта адладчык. Інструмент, які дазваляе наглядна ўбачыць тое, што адбываецца ўнутры вашай праграмы без неабходнасці звяртацца да дадання printfs і кампіляцыі і запуску і даданне Printf-х і кампіляцыі і бег, які ўжо ў непрацоўны час ці дома, верагодна, становіцца даволі стомным. Дык вось, у імгненне, мы збіраюся бачыць у рэжыме рэальнага часу значэння нашых лакальных зменных. Мы таксама збіраемся быць у стане ўсталяваць тое, што называецца супыну, якія ёсць магчымасці ў маёй праграме, каб прыпыніць выкананне ў пэўнай радку кода што мне цікава, а. Дакладна? Гэтыя праграмы працуюць у секунду. Гэта свайго роду добры для нас павольных людзей каб мець магчымасць зрабіць паўзу, скарыстацца момантам, см што адбываецца вакол пэўная радок кода без ўзворвання праграмы праз яго і сканчаючы цалкам. Такім чынам, кропкі супыну збіраецца дазволіць нам перапынак і паўза ў пэўнай кропцы. Стэк выклікаў гэта мудрагелісты спосаб кажучы, што ў цяперашні час функцыі называюць у цяперашні час. Галоўная заўсёды выклікаецца першым. Але калі Асноўны называе Функцыя называецца своп, мы на самай справе адбываецца, каб убачыць гэта Вежа функцый, якія былі называецца ў зваротным храналагічным парадку. Такім чынам, давайце паглядзім, што. Я збіраюся, каб паменшыць. Я збіраюся вярнуцца да маіх кодам. І толькі таму, што я хачу, быць педантычным тут, Я збіраюся ісці наперад і націсніце толькі з левага боку лініі пяці. І, што стварае чырвоную кропку. І звярніце ўвагу, на правай баку што адладчык ведае, эй, Я проста сказаў, што кропкі супыну noswap.c лініі пяць, спецыяльна на гэтай радкі кода. Так адладчык ведае, што я прасілі ў наступны раз Я бягу мая праграма яго паўзу выкананне там, а не проста працуе ўсё гэта вельмі хутка. Так што цяпер я збіраюся націснуць на Debug Кнопка на самым версе IDE і што збіраецца рабіць наступнае. Гэта збіраецца адкрыць першапачаткова некалькі страшна гледзячы другі тэрмінал window-- выдаленай адладкі з правесці такое і such-- і мы вернемся да таго, што Усё гэта азначае, што ў хуткім часе. Але, што важна цяпер з'яўляецца тое, што, што чырвоная кропка трапіў, адладчык наўмысна спыніўся execution-- Ня на гэтай лініі як такой, а на першым лініі фактычнага кода ў гэтай функцыі. І вось чаму лінія знаходзіцца сем Цяпер вылучаныя жоўтым колерам. А цяпер давайце зірнем на правай баку. Падобна на тое, па змаўчанні, дастаткова добра, х мае значэнне, які? 0. І ў мае значэнне, які? Нуль. І гэта можна чакаць у тым сэнсе, што х і y--, што жоўты line-- мае яшчэ не выкананы. Так х не павінна мець значэнне 1. Гэта можа мець любое іншае значэнне, так званы смецце значэнне. І нам пашанцавала ў тым, што гэта нуля ў гэтай кропцы, па сутнасці. Так што цяпер ёсць толькі некалькі Кнопкі мы павінны клапаціцца аб пры адладцы такім чынам. Звярніце ўвагу, тут мы маем кнопку прайгравання. І калі мы будзем гуляць або націсніце рэзюмэ, гэта проста збіраецца запусціць праз астатняя частка праграмы або да таго часу, пакуль парад яшчэ адну кропку супыну. Але я не ўсталяваў любой іншай супыну, дык гэта проста збіраецца запусціць да канца. Гэта выгляд паражэнняў Мэта калупацца. Так замест гэтага, я клапачуся пра Гэтыя значкі справа. І калі я навядзіце курсор мышы на іх, як вы павінны таксама, Вы ўбачыце маленькія tips-- падказкі. Гэта адзін пераступіць. Зараз гэта не значыць, пропуск наступная радок кода. Гэта проста азначае, выканаць яго і перайсці да наступнай, перайсці да наступнай, перайсці да наступнага. Іншымі словамі, з дапамогай што кнопка, я магу хадзіць праз мой код адзін крок за адзін раз. Лінія за лініяй, у літаральным сэнсе. Цяпер справа што ёсць яшчэ адзін што мы ўбачым у хвіліну. Гэта так званы Крок у іконе, што гэта збіраецца дазволіць мне апусканне ў іншую функцыю. Але давайце паглядзім гэта ў імгненне. Так што я збіраюся націснуць пераступіць. А цяпер звярніце ўвагу, як я націсніце гэтая кнопка ў верхнім правым куце, трымаць вочы прыкладна пад мясцовай Зменныя і бачыць тое, што адбываецца з х. х цяпер 1, паколькі жоўтая лінія ў цяперашні час выконваецца ўжо і мы пераехалі на лініі 8. І праз хвіліну ў варта спадзявацца, стане 2. Цяпер, што цікава нічога адбываецца няшмат. Усё гэта з'яўляецца Printf. І звярніце ўвагу, у маёй сярэдняй тэрмінала вокны, я бачу выхад друку DEF. І зараз у мяне ёсць, каб зрабіць Рашэнне праграміста. Я магу пераступіць гэтую лінію Код, выкананне яго, але не атрымліваць цікава, што ўнутры. Ці я магу на самой справе крок у гэтым і ісці ўнутры самой Swap. Так давайце зробім апошняга. Дазвольце мне ісці наперад і націсніце ня Step Over, але Step Into. Заўважце, усё раптам змены вокны каб вылучыць першы радок кода ў своп. Гэта лінія 21. А цяпер, што выгляд фанкі, што, калі вы паглядзіце сюды, як і чакалася, коскі б 1 і 2, адпаведна. Чаму тэмпература 32,767? Нагадваючы, што тэмп, гэтак жа, як пустая кубак імгненне таму, абвешчаны тут, на лініі 21. Чаму 32,000- Я маю на ўвазе, чаму гэта проста некаторыя дзіўныя значэнне? Да? АЎДЫТОРЫЯ: Гэта не ініцыялізаваны. Дэвід Дж малая: Гэта ня быў ініцыялізаваны. Такім чынам, наш кампутар заўсёды мае фізічную памяць. Гэта заўсёды мае фізічную памяць. І заўсёды ёсць Зеро і адзін знаходзіцца ў там, праўда? Таму што мы, выкарыстоўваючы нашы кампутар на працягу ўсяго дня, Вы карыстаецеся IDE CS50 або серверы на працягу ўсяго дня. Так што АЗП альбо мае некалькі нулёў або хто-небудзь ці якім-небудзь нулі і адзінкі. Незалежна ад таго, ці ня вы іх выкарыстання. Вы не можаце проста пусты прасторы, дзе вы хочаце біт. Яны альбо нулі і адзінкі. Так што атрымліваецца, што тэмп, таму што мы не ініцыялізаваны яшчэ, у нас ёсць гэтыя 32 біта, але яны ўжо не ініцыялізаваны любым вядомым значэнняў. Таму, што б яны былі найбольш у апошні час выкарыстоўваецца for-- тых 32 bits-- мы проста бачым артэфакты некаторых папярэдняя выкарыстанне гэтых канкрэтных 32 біт. Як толькі я націскаю Step Over, хоць, уф, тэмпература будзе атрымаць значэнне 1. І калі я зраблю гэта зноў, а з'яўляецца будзе дадзена значэнне 2 а затым б збіраецца прысвойваюць значэнне 1. І так, што ў цяперашні час добра на гэтая кропка ў гісторыі з'яўляецца тое, што адладчык паказваючы мне, супер павольна у сваім уласным тэмпе, тое, што стан своп. Але звярніце ўвагу, у верхняй тут, апавяшчэння што стэк выклікаў сапраўды мае два пласта да яго. Цяпер той, які, як падкрэсліў Абмен, калі я націскаю на Галоўнае замест звярніце ўвагу, як змяніць лакальныя зменныя таму што распрацоўшчык можа проста скакаць і пайсці ў любой іншай вобласці. Таму, нават калі мы робім усё гэта працаваць і правільна замены А і В, калі я іду туды і назад паміж своп дзе а роўна 2 і б роўна 1 і Асноўны, Галоўная мае пацярпелі наогул? Няма. Так што вынас тут? Ну, атрымліваецца, што любы час Вы выклікаеце функцыю як своп, і вы перадаеце яго аргументы, тое, што вы перадаеце ў функцыю падпампоўкі У гэтым выпадку з'яўляецца копіяй з тых аргументаў. Так што, калі х і ў кожны адпаведна 32 біта, тое, што Своп атрымліваць у два новых мясцовых пераменныя або аргументы, завецца і У-, але тыя, з'яўляюцца адвольнымі names-- але мадэль нулёў і тыя, ўнутры А і У выстраіліся павінна быць ідэнтычная х і ў але яны не з'яўляюцца Тое ж самае, як х і у. Гэта як калі б Асноўнае мае на сваёй частцы папера лік 1 і 2 для х і у, а затым, калі ён перадае, што ліст паперы, каб своп, Абмен вельмі хутка атрымлівае уласны ручка, запісвае 1 і 2 па сваёй лісце паперы, рукі назад арыгінальны ху да асноўнага а затым робіць свой уласны што з а і Ь. І зараз гэта супер важна, таму што гэта мае нетрывіяльныя наступствы за фактычна пісаць правільны код таму што, здавалася б, мы не можам памяняць дзве зменныя. Я напісаў правільную функцыю падпампоўкі. Мы ажыццявілі гэта з Ларэн, як правільны функцыя падпампоўкі на самай справе, але не па-відаць, ні адно з гэтых пытанні, калі вы не можаце на самой справе памяняць два значэння пастаянна. Такім чынам, мы павінны яшчэ адзін спосаб на самой справе атрымаць на гэта, і мы павінны быць у стане на самай справе вырашыць гэтую праблему. І атрымліваецца out-- і мы прыйдзем вярнуцца да гэтай канкрэтнай карціны Перад long-- гэта адзін са спосабаў, што Вы маглі б зрабіць памяць кампутара. Гэта проста прастакутнік. Вы можаце зрабіць гэта любы рознымі спосабамі, але гэта зручна маляваць яго як прастакутнік па наступнай прычыне. Мы збіраемся пачаць сёння і за казаць аб так званай стэк. І стэк проста кавалак з RAM-- кавалак memory-- што функцыі маюць доступ , Калі яны называюць. А так атрымліваецца, што на У самым нізе гэтай чаркі дзе ўсе лакальныя зменныя ў асноўных і орг С і орг V і ўсё такое збіраюцца пайсці па змаўчанні. І калі Майне называе некаторыя іншыя функцыі, як абмен, добра, Абмен збіраецца атрымаць яшчэ пласт памяць над ім. І так проста, каб даць вам хуткі беглы карціна гэтая, калі я іду па here-- і дазвольце мне люстэрка гэта на накладныя, як well-- што на самой справе ў мяне ёсць, калі мы клапоцімся толькі пра Дно гэтай карціны зараз, з'яўляецца тое, што, калі я запускаю праграму і галоўны выклікаецца, Галоўная даецца кавалак Аператыўная памяць у маім кампутары, які у ніжняй частцы гэтай так званай стэк. І я збіраюся зрабіць гэта наўмысна ў выглядзе квадрата. Так як 32 біт або чатыры байта. І калі гэта асноўная функцыя мае пераменная называецца х са значэннем 1 і мае зменную у са значэннем 2, гэта як прымаць гэты кавалачак памяці, Галоўная дадзена аперацыйнай Сістэма і дзялення яго так, што першы лакальная пераменная ідзе тут, другі ідзе тут, і гэта ўсё. Калі Галоўная заклікае падпампоўка, своп атрымлівае свой уласны кавалачак памяці што мы будзем маляваць, як гэта ад аперацыйнай сістэмы, і гэта будзе мець свае ўласныя лакальныя зменныя на аснове на нашым рэалізацыі раней з мясцовымі зменных а і б, што першапачаткова атрымаць значэння 1 і 2. Але тады, як толькі Своп код выконвае, і Ларэн сапраўды змяняе месцамі OJ і малако, што адбываецца? Ну, гэта 2 у 1 становіцца, гэта 1 становіцца 2, і, дарэчы, ёсць пераменная тэмпература, якая з'яўляецца выкарыстоўвалі гэтую ўвесь час, што ў выніку сыходзіць. Але гэта не мае значэння, колькі працы вы У гэтай лініі of-- у гэтай прасторы памяці, х і ў з'яўляюцца цалкам некранутым. Такім чынам, мы павінны нейкім чынам даючы Абмен і функцыі, як гэта Сакрэт доступу, калі хочаце, каб Функцыі like-- памяці як х і у. Такім чынам, давайце зірнем на прыклад, які дапамагае нам убачыць тое, што было адбываецца ўвесь гэты час. Я збіраюся ісці наперад і адкрыць Параўнаць Zero. І я збіраюся зачыніць наш адладчык, я збіраюся каб закрыць гэтую страшную гледзячы паведамленне толькі што кажа, пачакай хвілінку, Вы знаходзіцеся ў сярэдняй адладкі. Я збіраюся хаваць гэтую ўкладку тут проста вярнуцца да прастаты. Так што не хвалюйцеся, калі GDB забіты. Гэта проста азначае, што праграма мае было кінуць, наўмысна ў гэтым выпадку, па мне. А цяпер Параўнаць нуля гэта робіць. Я выкарыстоўваю CS50 Бібліятэка ў стандартным I / O. Я атрымаў асноўную функцыю, што спачатку кажа, што нешта сказаць, і атрымлівае радок. Тады кажа гэта зноў і атрымлівае іншую радок. І заўважце, што гэтыя два радкі называюцца S і T, адпаведна. А цяпер гэтая праграма, параўнанне Нуль, яго мэта ў жыцці, ён павінен сказаць мне, я тыпу тое ж самае? І таму я збіраюся назад у тыдзень адзін. Я выкарыстоўваю свой роўны роўнага аператара якая з'яўляецца аператарам якасці. Ня аператар прысвойвання, аператар роўнасці. Я проста параўноўваючы з і т. Такім чынам, давайце на самай справе ісці наперад і рабіць гэта. І я збіраюся ісці наперад і зрабіць параўнанне Zero. Я збіраюся зрабіць ./comparezero. І я збіраюся пайсці наперад і нешта сказаць як, давайце рабіць маме ў ніжнім рэгістры а як наконт мамы ў верхнім рэгістры. І, вядома, я друкую розныя рэчы. Добра. Гэта варта было чакаць. Давайце запусціць яго зноў. Абодва разы зрабіць ніжні рэгістр, ніжні рэгістр. Гэта выглядае супер ідэнтычныя для мяне. Enter. ДОБРА. Можа быць, гэта проста дзіўна, таму што гэта не падабаецца мой граматыкі. Так давайце зробім капіталу MOM, Сталіца MOM, ідэнтычныя. Розныя рэчы. Дык чаму ж гэта? Ну, што на самой справе адбываецца на пад капотам тут? Такім чынам, давайце вернемся на працягу тут на імгненне і разгледзець, што GetString на самай справе робіць. Калі вы тэлефануеце GetString, што гэта функцыя, якую мы самі пісалі і гэта неяк атрымлівае паслядоўнасць знакаў ад карыстальніка. І давайце выкажам здагадку, што першы Час я называю GetString, што дае мне кавалак памяці, які выглядае, як гэта. І калі я набраў у ніжнім рэгістры м-о-m-- і тое, што ідзе пасьля яго? Проста хуткая праверка здаровае. Зваротная касая рыса нуля. Мы ведаем, што. І памятайце, што мы гулялі вакол з імем Zamila ў і куча іншых імёнаў калі Роб быў тут шукаеце на тое, што адбываецца ўнутры памяці. Так што гісторыя сапраўды такі ж. Гэта тое, што GetString вяртаецца да мяне. Цяпер, мой код хвіліну таму захоўвацца вяртаецца значэнне GetString ў зменнай называецца с. І тады ў другі раз я назваў яго, ён захоўваў яго ў зменнай называецца т. Так што, калі я іду сюды, мне трэба звярнуць на гэта мясцовы переменная-- і я, як правіла збіраецца намаляваць радок як просто-- мы будзем называюць яго S-- як невялікі плошчы тут. А цяпер, як робіць somehow-- мама перайсці ўнутры гэтага пераменнага х? Ну, мы павінны вярнуцца да першапачатковых прынцыпам тут. Што на самой справе вяртання GetString? Так што атрымліваецца, што M-O-M Зваротная касая рыса нуля, і любы лік іншых радкоў у памяці, як Zamila і Роб або Эндзі, або любыя іншыя, , Вядома, у нашым Аператыўная памяць або памяць кампутара. І ваша памяць мае like-- ў вас ёсць гігабайт аператыўнай памяці, два гігабайта аператыўнай памяці, або мільярд, або два мільярды байт, ці, можа быць, нават больш у гэтыя дні. Такім чынам, давайце выкажам здагадку, для сённяшніх мэтаў, што гэта не мае значэння, як мы нумар ім, але мы можам нумар кожны з тых, мільярд або два мільярды або чатыры мільярды байт. І давайце проста сказаць, што заўгодна гэта першы ўкус, па-другое прыкус, трэці, чацвёрты. Я наўмысна не выкарыстоўваю нуль для сёння, але мы вернемся да гэтага. Такім чынам, іншымі словамі, калі гэта Самы першы раз, калі я з дапамогай праграмы, Я проста шанцуе, і першы ўкус на месцы аднаго потым два потым тры, чым чатыры. І, калі я не малюнак, нумар скрыні два мільярды б спосаб тут. Так што вы думаеце, то, GetString фактычна вяртае? Гэта не вяртанне М-О-М зваротны слэш нулявы такой, таму што гэта відавочна ня будзе ўпісвацца ў акно, што я намаляваў. Так што яшчэ можа на самай справе GetString вяртацца ўсе гэтыя тыдні? Адказ на дошка дзе-то тут. Вы не можаце змясціць М-О-М зваротны слэш нулявы, так, што можа мець сэнс, а? Калі вы павінны былі быць супер разумным, паклаўшы на так званай інжынернай капелюшы, Што б вы маглі вярнуцца? Што найменшую колькасць інфармацыі Вы маглі б вярнуцца, што б яшчэ дазваляюць знайсці M-O-M ў памяці? Да? АЎДЫТОРЫЯ: Адно. Дэвід Дж малая: Адно. І чаму адзін? АЎДЫТОРЫЯ: Таму што скажа Вы куды ісці [неразборліва]. Дэвід Дж малая: Дакладна. Я проста хачу, каб вярнуць адрас радкі, якія я атрымаў. Адрас у гэты выпадак месца адным. Так што на самай справе захоўваецца ў S-- і кожная пераменная радок, такім чынам, far-- толькі было адрас гэтага радка. Між тым, калі я называю GetString другі раз, і я ўвядзіце ў літаральным сэнсе той жа thing-- М-О-М з lowercase-- M-O-М і яшчэ адзін знак нуля, і цяпер, можа быць, мая праграма-х працуе ўжо на працягу некаторага часу, так, можа быць, гэта 10, гэта размяшчэнне 11, гэта 12, гэта 13. Кампутары, якія выкарыстоўваюць некаторыя іншыя памяці па якой прычыне. Што цяпер ідзе ў маю секунду пераменная ў маёй праграме т? 10. Дакладна. І таму, калі мы глядзім на Зыходны код гэтай праграмы дзе я проста спрабую параўнаць два значэння, гэта S роўная роўная т, што відавочнае чалавека адказ? Проста няма, таму што 1 ня роўна 10. І так тут, ляжыць магчымасць для нас на самай справе проста вярнуцца, зноў жа, у першую прынцыпы і думаць, добра, што адбываецца пад капотам? Мы гаворым пра біты і байты і памяць, але гэта на самай справе карысна, каб зразумець таму што, калі вы тэлефануеце GetString, нават калі мы думаем, што гэта з вяртанне M-O-м ці радок маму або Эндзі, або Zamila або і да т.п., тэхнічна гэта проста вяртанне адрас гэтага кавалка памяці. Але гэта нармальна. Таму што, як я ведаю, дзе радок заканчваецца? Калі я толькі даў пачатак? Ну, зваротны слеш нуль, праўда? Проста ў лінейным часу я магу раздрукаваць з друкам выразнасці M-O-М. І як толькі я бачу зваротны слэш нуля, я не хвалюе, дзе я пачаў, Я ўжо ведаю, няяўна дзе мне трэба, каб скончыць. І таму сёння адзначае beginning-- і дазвольце мне зрабіць гэта рэзка, таму што мы пайшоў праз шмат непрыемнасцяў атрымаць іх тут навучанне wheels-- так што сёння навучальныя колы пачынаюць адарвацца і мы раскрываем у меры: [Апладысменты] Гэта было добра варта паездка на мэта ў гэтую раніцу, так? Так now-- ёсць, атрымліваецца з, няма такой рэчы, як радка. Радок не існуе. Гэта сінонім, што мы мелі ўнутры бібліятэкі CS50. З гэтага часу мы збіраемся пачаць называць з і т не радкі, але знакавыя зоркі. І сімвал зоркі мы будзем дражніць адзін ад аднаго, перш чым доўгі. Але гэта ёсць, што нават калі мы будзем працягваць выкарыстоўваючы GetString зараз, тэхнічна я павінен быць кажучы сЬаг зорку і голец зорку. І атрымліваецца, што гэта за зорка будзе пазначаць нешта называецца паказальнікам або адрас. І на самай справе, тізер за тое, што ляжыць наперадзе гэта 20 другі кліп ад нашага сябар Нік Parlante ў Стэнфардзе які, некаторы час таму, выдаткаваць смешнае колькасць часу, як лепш я магу сказаць у яго кухня або яго склеп, робіць claymation ўвядзення ў свет персанаж па імі Бинки, з якімі мы будзем быць уведзеныя ў наступны раз паказальнікаў. Дык вось прагляд таго, што павінна прыйсці. [Прайграванне відэа] Эй, Бинки. Прачніся. Гэта час для паказальніка задавальнення. -Што Гэта? Даведайцеся аб паказальнікаў? О, станоўчы герой. [КАНЕЦ ПРАГЛЯДУ] Дэвід Дж малая: І на гэтай ноце, мы будзем бачыць Вас у сераду. Добра. Хто танчыць? Давай. Хто танчыць? Вы хочаце, каб я, каб ён пачаў? Я атрымаю гэта пачалося. Woooo! Ларэн: Салодкі фантазіі Майсей.