Дејвид Џ MALAN: Ова е CS50 и ова е почеток на четири недели. И, момче, е во Фолксваген проблеми на сите, бидејќи на софтвер. Дозволете ни да ги погледне. [Видео репродукција] -Cars, Најумен карактери во Брзи и бесни филмови. Оваа недела германскиот производител на автомобили Фолксваген се нашла во средината на скандал од потенцијално криминална пропорции. -Volkswagen Се подготвуваат за милијарди во парични казни, можни кривични пријави за нејзините директори, како компанијата се извини за местење на 11 милиони автомобили помогне да го победи тестови емисиите. Последица на било какви дизел модели беа дизајниран со софистициран софтвер дека користеле информации вклучувајќи ги положбата на возилото и возилото забрза за да се утврди дека автомобилот е подложени на тестирање на емисиите. Под кои околности, моторот ќе се намали токсични гасови. Но на автомобилот биле лажирани да бајпас дека кога беше се вози. Емисии зголеми од 10 до 40 пати над прифатливите нивоа ЕПА. [END репродукција] Дејвид Џ MALAN: Значи, да се погледнете овој и да се види точно како оваа би можеле да се имплементираат и како тоа може да влијае толку многу автомобили се допаѓа ова. Па во мојата рака тука се печат објави дека е издадена од EPA-- заштита на животната средина Агенцијата за заштита кои е регулаторна агенција на САД дека справува со еколошките проблеми, а потоа и на реалните Официјално порака што беше испрати на Фолксваген пред само неколку дена. Па на ЕПА пишува и објавува сега јавно, софистициран софтвер алгоритам на одредени Возила Фолксваген детектира кога возилото е во процес на тестирање официјална емисии и се врти со полно емисии Контроли за само за време на тестот. На ефикасноста на овие возила загадувањето уреди за контрола на емисиите е во голема мера намалена за време на сите нормално возење ситуации. Ова резултира со автомобили кои ги исполнуваат стандарди во лабораторија или тестирање станица, но за време на нормална работа емитуваат азот oxides-- или NOx-- на до 40 пати на стандардот. Софтверот произведен од страна на Фолксваген е цитат unquote, уред за управување, како што е дефинирано од страна на Чиста Воздух во САД. Тие одат за да се каже дека ЕПА и друга агенција откри поразот уред софтвер по независна анализа од истражувачите на Западот Универзитетот во Вирџинија. Загадувањето на NOx придонесува за азот диоксид, земјата на ниво на озон, и фини честички. Изложеност на овие загадувачи се поврзува со широк спектар на сериозни здравствени ефекти, вклучувајќи и зголемување на астма напади и други респираторни болести кои може да биде доволно сериозна за да испрати луѓе во болница. Изложеност на озон и честички, исто така, се поврзани со предвремено смрт поради респираторна сродни или кардиоваскуларни поврзани ефекти. Деца, стари лица, лица со претходно постоечка болест на респираторниот систем се особено изложени на ризик за здравствени ефекти на овие загадувачи. Доволно е да се каже, тоа е прилично сериозен. И ајде да одат за да се прочита само уште еден извадок а потоа ние ќе ги разгледаме во основните импликации на ова во контекст на еден автомобил. Поточно, Фолксваген произведена и инсталирана софтвер во т.н. електронска контрола module-- или ECM-- на овие возила кои насети кога возилото бил тестиран за усогласеност со стандардите за емисија ЕПА. Врз основа на различни влезови вклучувајќи положбата на воланот за возило брзина, време на траењето на моторот работа, и барометарскиот притисок, овие влезови токму следи параметрите на постапката за федерални тест кој се користи за тестирање на издувните гасови за сертификација ЕПА цели. Во текот на тестирањето емисија ЕПА, софтвер возилата СКМ трчаше софтвер која го произведе резултати во согласност емисиите. На сите други времиња, на СКМ возилото софтвер трчаше посебен пат калибрација која ја намали на ефикасноста на целокупниот систем за контрола на издувните гасови, посебно на селективна каталитичка намалување на NOx Посно trap-- што ќе видиме за во еден момент. Како резултат на тоа, емисиите на NOx зголемена за фактор од 10 до 40 пати погоре во согласност нивото на ЕПА во зависност од видот на диск циклус. Значи она што е ова навистина значи, и на изворниот код на водењето на софтвер на Фолксваген не има уште не е јавно објавено, е во тоа што, ефикасно, овој еквивалент е таму некаде во внатрешноста на кодот на Volkswagen. Ако се тестираат, и ако на автомобилот детектира одредени фактори на животната средина како на воланот позиција или движењето или недостаток од него на автомобилот или било кој број на други фактори кои се во моментов се претпоставуваше да се биде дел од оваа формула, тие едноставно го вклучите Целосна контрола на емисиите. Со други зборови, тие ќе започнат испуштаат помалку од загадувачите. На друго место, во секоја друга ситуација кога не е откриен, како да бидат во лабораторија, тие едноставно не. И за да можете да се поедностави овој во повеќе бетон pseudocode со нешто како ова. Ако тркалата се вртат, но волан не е, сугестивна дека автомобилот е на некои вид на ротирачки цилиндар но во некој вид на магацин се тестира, тогаш се однесуваат како на ЕПА ќе ви се допаѓаат. Инаку не. Па ајде да ги разгледаме на кратко видео кое се погледне во какви се импликациите се од ова всушност механички. [Видео репродукција] -Last Петок ЕПА објави дека околу Автомобили Фолксваген Ауди направени помеѓу 2009 и оваа година беа користење т.н. уред за управување да се добие околу законите емисии со цел да се задржи на воздухот е чист. Но што значи тоа точно? Па, модерни автомобили имаат десетици на компјутери во нив. А некои од оние компјутери помогне координираат функциите на моторот за оптимално ефикасност, а што си сигурен дека таму не е премногу ѓубре излегува од ауспухот. Тие сум всушност се работи на овој начин за неколку децении. Во суштина, секој дел на моторот модерен автомобил има сензор или контролор на него, и овие компјутери читате во податоци на илјадници пати во секунда прилагодувања одлуки како и односот на гориво во воздух што се случува во цилиндрите. Овие мамење Фолксваген и Ауди модели се дизели, и дизел мотори имаат еден повеќе навистина важно компјутер контролирани параметри, која е износот на несогорени гориво случува во издувните гасови. Сега тоа звучи лошо. Не звучи како вие би сакале ненагорено гориво одат во издувните гасови. Но, во случај на дизел, имаш нешто нарекува NOx стапица која е уред кој апсорбира и замки за азотни оксиди кои се загадувачи кои би да не бидат во атмосферата. И ефектот на таа стапица на NOx е зајакната со недогорени гориво. Па за уред за управување е посебна програма во внатрешноста на овие компјутери кои може да го направи тоа изгледа автомобилот ги задоволува емисија стандарди, дури и кога тоа не го прави тоа. Фолксваген имаше проблем во свои раце. Дизел моторите беа познати за добивање на голема економија на горивото, но на NOx стапица работи само и кога се користи повеќе гориво. Па автомобилот ќе се открие, со користење на овој уред за управување, кога беше добивање на емисии тест, тоа ќе го користат повеќе гориво, направи стапица работата на NOx и, емисиите ќе биде во ред. Но, тогаш ќе се добие на патот, уредот одвраќа, ти си гори помалку гориво но сте ставање колку што е 40 пати повеќе загадувачки супстанции во атмосферата. Но, како што е грижам не автомобилот знаат дека тоа беше се тестираат за усогласеност емисии? ЕПА вели дека тоа е еден софистициран систем кој се проверуваат работите како и положбата на воланот, брзина, колку долго моторот беше вклучено, па дури и на атмосферскиот притисок. Со други зборови, имаше нема начин тоа било ненамерно поради тоа што софтверот е дизајниран многу внимателно да се открие тест официјална емисиите. Тоа е некои прилично сериозна измама и тоа е Зошто Фолксваген е во како сериозна неволја. Всушност, нивниот извршен директор, Мартин Винтеркорн, само да се повлече од функцијата. Значи она што се случува следно? Па, ако сте еден од половина милион дизел Jettas, Битлси, Golfs, Passats, или Ауди A3s остварува, добрата вест е дека вашиот автомобил се уште е безбедно да се вози. Вие не мора да го стави настрана додека Фолксваген издава потсетиме. Но во одреден момент тие се веројатно нема да имаат да го ажурирате софтверот во вашиот автомобил. Кога тоа се случи можеби ќе добиете помалку милји на резервоарот. Адвокати веќе се подготвуваат се за класа акција тужби така сопственици би можеле да се плати во одреден момент во иднина. Но, тоа не се случува да се се случи во скоро време. [END репродукција] Дејвид Џ MALAN: Значи ова всушност покренува интересна поголема слика прашање како да му верувате. Нели? Секој од нас има iPhone-или андроидите или нешто во нашите џебови, најверојатно, овие денови, или лап-топ компјутери на нашата круга, кои се водење на софтвер, направена од страна на Apple и Microsoft и гроздовете на други компании. Но, како да знаеме дека она што овие софтверски производи се прави е всушност она што овие компании велат дека тие го прават? На пример, кој е да се се каже дека секој што го времето направи телефонски повик на вашиот iPhone или Андроид телефон или слично, дека тој телефонски број, исто така, не е се поставени на серверот некои компанијата бидејќи на некои програма сте напишано, без разлика дали е за работа самиот систем како iOS или Андроид, или затоа што сте ги преземале некои трети лица стан дека некако е слушање на сето она што го пишувате во или сè што ти си, всушност изјава. Како да знаете дека, кога вие момци се работи ѕвекот или да направите за да ги собере вашиот сопствен софтвер во CS50, како го прават свој кадар кој CS50 е, по пат на библиотеката CS50, не било најавување секој стринг некогаш сте добиле или секоја педа некогаш сте го добиле? Па, ти секако би можело да се погледне на изворниот код за нешто како на CS50 библиотека, вие може да се погледне на изворниот код за Linux оперативниот систем работи на CS50 ИРО. Но неверојатно презентација беше вратено во 1984 година во добивањето на наградата Тјуринг со многу познати компјутерски научник познат as-- именуван Кен Томпсон кој добиено награда Тјуринг која е вид на компјутерски науки е Нобеловата награда, ако сакате, за својата работа на еден оперативниот систем наречен Unix, кој е многу сличен во духот на она што ние ги користиме која е Линукс. А прашањето што побара во неговата говор, во суштина за утврдување на рамка за години и години на дискусија за доверба и сигурност, беше ова. До кој степен треба еден довербата на изјава дека program-- парче на software-- е слободен на тројански коњи? Можеби тоа е повеќе важно да му верувате на луѓето кои ја пишувале софтвер. И всушност, ние сме поврзани да се зборува дека тој даде кога прифаќање на оваа награда во 80-те на веб-сајтот е CS50 под страница Предавања за денес. Затоа што она што ќе видите е дека тој, всушност дава прилично едноставен пример за тоа како дури и компајлер како ѕвекот или што компајлери други се користат во минатото, што ако е вграден во компајлерот ние самите себе се користи е малку ако состојба која суштински се вели дека, ако забележите дека овој код е користење функцијата GetString или GetInt функција, оди напред и да внесете задната врата или тројански коњ таква што таа програма сега има некои нули и оние кои го прават нешто злонамерно. Сеча на сите ваши тастатурата, качувањето дека податоците до одреден сервер, или навистина ништо. И што Кен Томпсон продолжува да се направи во својот говор е да се покаже дека дури и ако имате пристап до изворниот код на компајлерот дека злонамерно може да се прави ова, тоа не е важно, бидејќи има оваа кокошка и јајце реалноста на минатото многу години при компајлери се користат за да се собере. Со други зборови, на враќање, кога некој го има напишано првите компајлерот. И потоа, во секое време тие го ажурира компајлер со промена на изворниот код, додавање на можности и го рекомпајлирање за луѓе како нас да се користи, и, тие се со користење на стариот верзија на компајлерот да ги собере на нови верзија на компајлерот. И ако го погледнете во разговор што го даде, ќе видите дека поради на таа кружност, вие всушност може да има грешки или Тројански коњи вградени во софтвер ние сме со користење. Па дури и ако се погледне на изворниот код за тие програми, тоа дури и не може да биде очигледна поради тоа што е, всушност, измама во некои постари верзии на компајлер кој оттогаш е инјектирање закана во нашиот софтвер. Што е само да се каже, навистина не може и не треба доверба софтвер се извршува на нашите лаптопи или телефони или било кој број на места. И всушност, подоцна, во овој семестар, кога да почнеме да зборуваме за веб програмирање а всушност се започне изградба веб апликации самите себеси, ние ќе разговараме за овие закани и други. Сега, може да се прашуваат и забележав дека имало малечки Дарт Вејдер во клипови што На работ покажуваше таму во врска со Фолксваген. Ако никогаш не сум видел, јас сме мислеле дека треба да го олеснат расположението, бидејќи ова е за сите многу депресивно и застрашувачки. Одам да се погледне назад на Супер Боул 2011 кога комерцијална страна Volkswagen-- и ова речиси ги прави допадливи again-- емитувана за прв пат на телевизија. Тоа е вториот клип 60 што мислам дека ќе уживате. [Видео репродукција] [Музика - тема од "Војна на ѕвездите"] [Куче лае] [Автомобилот започнува] [END репродукција] Дејвид Џ MALAN: Да. Јас бев само проверка. Дека автомобилот е на листата на прекршоци. Во ред. Значи ние се погледне во некои pseudocode пред некој миг. И тука е поголем програмка на pseudocode код дека ние сме виделе неколку пати досега. И ајде да ја користите оваа можност сега да се воведе нов програмирање техника која ние го сторивме види алгоритамски минатата недела, кога ние погледна спојат вид. Но, ајде да го формализира и да видиме како ние би можеле да го користат во вистински код, и тогаш ние ќе треба да го користите овој техника по патот повеќето најверојатно ќе се реши некои други проблеми. Значи, ова беше една од првите програми ние некогаш напишал, иако во pseudocode код. И она што оваа програма ни овозможи да се направи се разбира беше да се најде Мајк Смит во телефонот книга. И известување особено линии осум и 11 кои имаа оваа изјава на Go To. И всушност, одредени јазици, Ц меѓу нив, всушност немаат изјава дека е буквално оди на тоа што ви овозможува да Скокни на одредена линија. Тоа е генерално се намуртен врз, бидејќи тоа може да биде многу лесно да се злоупотребува и можете да започнете вашиот скокање програма за сите над местото, за разлика на користење на вид на логика и контрола на протокот дека ние сме се користи досега само со јамки и услови и слично. Но, ние може да се поедностави овој алгоритам во pseudocode код како што следува. Наместо ова итеративен или looping пристап каде што ги чуваме и да се вратам назад и назад да се редат три, зошто да не се само вид на залог и повеќе генерално, истакнуваат во согласност седум и 10, само замени овие две пара на линии со, друго ако е порано Смит во книгата ние ќе пребарувате за Мајк во левата половина од книгата. Друго ако Смит е подоцна во текот на книга, барај за Мајк во право половина од книгата. И ќе забележите дека веќе на кружност. Нели? Јас сум во потрага за Мајк во на телефонот книга и потоа Јас конечно погоди можеби линија седум или можеби линија 10 и мојата настава за себе е пребарување Мајк во половина од именикот. Па, како да барам Мајк? Јас сум во средината на во потрага за Мајк, зошто Дали сте вид на испраќање на мене во круг? Но, тоа е во ред затоа што она што е случува на големината на проблемот, како што е напишано од алинеја 7 и 10? Ние не сме само велејќи пребарување Мајк, барај за Мајк. Ние сме посебно велејќи дека она што? Побарајте го во левата половина од десната половина која е ефективно половина од големината на проблемот. Така, тоа е во ред, дека ние сме вид на ангажирање во оваа кружност, овој кружен аргумент, бидејќи барем сме прави проблем помала и помала. И на крајот ние ќе треба да се постигне дека т.н. база случај кога имаме само една страница left-- како нашите волонтери последната седмица did-- имавме една страница лево и од тогаш ние не мора да продолжи со барањето Мајк Смит затоа што тој е или на оваа страница или тој не е. Па како можеме да се спроведе оваа идеја, тоа вид на кружност во вистинскиот код? Па, ние да потпора техника и тоа е општо позната како рекурзија. И што сум го видел ова во pseudocode за спојување вид минатата недела. Потсетиме дека ова е pseudocode за спојување вид. Тоа е веројатно дури и поедноставно од меур или избор или вметнување вид само во однос на едноставноста со кои можете да го изразиме. Но тоа е затоа ние сме вид на кружно велејќи, бараат нешто од пребарувањето за тоа повторно. Но, ние сме во потрага или на левата половина или десната половина а потоа на крајот ние сме спојување во овој случај. Но тука, исто така, со овие две вид линии, се што повторно има ова Идејата на рекурзија. И конкретно што значи тоа, во контекст на алгоритам, е дека алгоритам е рекурзивен ако користи или се нарекува себеси. Или во однос на C, функцијата е recursive-- функција наречена foo е рекурзивен ако foo, некаде во неговиот изворен код, повикува функцијата себе foo. И тоа е лошо ако сите foo некогаш не е да се нарече себеси повторно и повторно. Тоа е во ред, ако foo на крајот ќе престане, како што не спојат вид, со зборовите, почекајте една минута, Ако овој проблем е супер мали, на пример, или го најдов кого сум барате, само се вратат. Не рекурзивно, не циклично се нарекуваат себе си повторно. И па ајде да ги разгледаме во како ова може да всушност работат. Па јас ќе одам да се оди напред и отворени две изворниот код примери овде. Од кои една се вика сигма 0. И тоа не е на сите рекурзивен, но ајде да ги разгледаме во она што оваа програма го прави тоа. Сум отстранила сите коментари од неа, но сите на изворниот код на CS50 е веб-сајтот има коментари ако сакаат да се чита преку тоа се повторно подоцна. И ајде да се направи неколку на разумност проверува тука. Така на врвот на овој законик, имаме вклучуваат cs50.h. Што значи тоа да се направи? Зошто е тука? Во однос на Едноставен разумни. Што да направам? Је. ПУБЛИКАТА: Значи дека GetInt функција работи. Дејвид Џ MALAN: Така што функцијата GetInt работи. Затоа што во внатрешноста на оваа датотека, cs50.h, која ќе видиме пред долго време во однос на својот код има еден куп функции declared-- GetInt, GetString, и еден куп на others-- и ако ние всушност треба, кои вклучуваат линија, компајлерот ѕвекот не е ќе знаат дека тоа постои. А истото важи и за линија две каде int е дефинирана printf, која е функција ние ги користите доста. Сега, алинеја четири изгледа малку фанки затоа што тоа е само еден лагер. Тоа е се здобија со запирка, не кадрава протези, без код во него. Но, она што ние го нарекуваме оваа работа во изминатите недели? Је. Па прототип. И зошто имаме прототип кој се чини да се биде малку излишни обично затоа што ние обично види повторно на функцијата подоцна во текот на датотека, нели? Па зошто have-- ти си само си ја почеша главата, но јас ќе го земам. Је. ПУБЛИКАТА: [Беззвучен] функција после главното. Дејвид Џ MALAN: Токму така. Така што на компајлерот ќе се знае на крајот ќе го дефинира или да се имплементира таа функција по главната, се претпоставува. Па ѕвекот и повеќето компајлери се вид на нем и така промените ќе се знае што ќе им каже. И ако сакате да го користите функција наречена сигма, подобро да ги учат на компајлерот дека таа постои во однапред. Сега, главната себе, дури и и покрај тоа што е еден куп на линии, е прилично запознаен надевам дека до сега. Тоа доби направите додека јамка чија цел во животот тука очигледно е да се добие позитивен цел број од страна на корисникот. И само да го задржи Здодевните или неа се додека не соработуваат. Потоа, во линија 16 Морам интересна повик. IntAnswer. Што се од левата страна страна ми дава инт која може да се нарекува store-- Answer-- која се случува да се сместат, очигледно, повратната вредност на странци. Па сигма е само произволни, но значајно име дека јас сум со оглед на функција чија цел во животот е да се земе еден argument-- ние ќе го наречеме N во овој case-- и само да се земе збирот на тој број, плус секој позитивен број, кој е помали од него. Значи, ако јас го помине на бројот 2 до Сигма, сакам да додадам 2 плус 1 плус 0-- не 0-- така што ми дава 3. Ако поминувам во 3 до сигма, сакам да 3 плус 2 плус 1, што ми дава 6. И така натаму. Па тоа само додава до сите броеви помалку од или еднакво на тоа. Сега, овде јас сум само ќе да се печати од одговорот. Па како брза проверка разумност, ајде направи сигма 0-- точка црта сигма 0-- и дозволете ми да напишете во 2. И јас навистина се добие 3. Дозволете ми да напишете во 3. Јас навистина се добие 6. И ако секој може да го направите математика брзо, ако го направам 50 што сум јас ќе добијам? ПУБЛИКАТА: [Беззвучен]. Дејвид Џ MALAN: Добро, не. Но 1.275 што е прилично блиску. Значи ова е резултат на вршење на 50 плус 49 плус 48 плус 47 плус 46 на целиот пат до 1. Значи тоа е сите сигма прави. Но, ајде да видиме како ние сме спроведува тоа сега. Па овде е самата функција. И ова не чини да се има нешто да се прави со рекурзија уште. Всушност, ние сме со користење на стара техника училиште. Јас сум иницијализацијата променлива наречена Вкупно еден на нула, тогаш имам foreloop тука, и јас сум со прогласување на инт наречен Јас, поставување тоа еднаква на 1-- иако би можел да го поставите тоа еднаква на нула, но бидејќи јас го правам тоа, кој се грижи ако тоа е нула или еден. Тоа се случува да имаат ефект. Па јас сум процесирањето толку долго како што е помалку од или еднакво на m, кои е аргумент кој беше донесен во. А потоа јас само задржи ја зголемува I. А увид од циклусот Сите правам прави сума плус еднаква I. А тоа е намерно. Не сакам да се направи, во овој случај, како и сума плус плус. Сакам да всушност додадете сегашната вредност на јас која држи добивање на поголеми и поголеми и поголеми на водењето картонче. А потоа ќе се вратам сума. И така одговор добива сума на вредност. И јас тогаш го испечатите. Па има можност тука, Но, да се вид на поедноставување овој код концептуално и видот на ударот е една ум во однос на едноставност и покрај тоа што ги зема некое време да се најде решение на разбереме зошто ова е моќна во овие мали примери. Еве сигма one-- па Втората верзија на овој законик. Се до врвот е идентичен така Истата приказна се однесува како и досега. А сега да ги погледнеме на имплементација на странци кои Сум намалено сведува на само овие lines-- четири линии на код, навистина, плус некои големи загради и белиот простор. Но, она што правам јас? Ако m е помалку од или еднакво на нула, јас треба да се справи со вид на тоа супер едноставен случај. И ако ме предаде нула или ништо негативни, која е само чудно, Јас сум само ќе се произволно но постојано се врати нула. Не сакам оваа работа да се добие во некои чудни бесконечна јамка, бидејќи на негативна вредност. Па јас сум само велејќи, ако ми дадеш нула или помалку, јас ќе се врати нула. Но, тоа е добро, бидејќи тоа е дека една страница од книгата на телефонот што е лево. Јас сум надвор гризе многу специфичен проблем и не повикува нешто рекурзивно. Но, во линија 31, што ми се чини дека да се прави? Заградите се само одржување нешта, се надевам, малку појасни. Но сите го правам е јас сум враќајќи m-- што и ви рака me-- плус вредноста на m-- ми е, плус вредноста на сигма на m минус 1. Па што значи тоа? Ако ми дадеш бројот 3 како влез, одговорот сакам да се добие на крајот е 6, бидејќи 3 плус 2 плус 1 мене 6 дава. Но како да се размислува за како овој код е вклучен? Прв пат ќе се јавам сигма и јас да го положат во вредност 3, тоа е како да кажеш на парче хартија, тука е вредност 3 и јас сум бил донесен ова како странци. 3 очигледно не е помал од 0, така на состојба, ако не се применува. На други не. Па што да правам? Сакам да се вратам метри, што е 3, плус сигма од m минус 1. Значи, дозволете ми да ги пратите на тоа. Одам да се стави ова парче хартија надолу. И она што вредност, да биде јасно, сум јас требаше да помине во сигма во овој момент во приказната? Што број? 2, нели? 3 минус 1 е 2. Па јас само треба малку остатоци од хартија тука. Па сега Сигма е да се јавив. И јас сум намерно стави ова долу, бидејќи тоа е вид на како откажеш која верзија на приказната затоа сега сум фокусиран на сигнал на m минус 1. Така беше 3 м, м минус 1 е 2. Па тука е 2 дека јас сум бил донесен. 2, очигледно не е помал од 0, така што случајот не се применува. На друго место ќе се вратам метри, што е ова работа, плус сигма од она што вредност? Па ако сигма од 1-- затоа што m е во моментов, па 2 2 1 минус е 1. Па сега имам само вредност 1. Јас сум поминува само бројот 1 до функцијата sigma-- или јас така here-- 1 не е очигледно помал од нула, се уште не се применува. Друго враќање 1 плус сигма на што? 0. Значи, дозволете ми само се сеќавам дека. Јас ќе се вратам на тоа подоцна. Сега ќе одам да се оди напред и да ни трошка одредување на бројот 0, бидејќи тоа е мојот аргумент или параметар. Јас сум донесен бројот 0 и на крај на овој процес само се повторувам реклама nauseum престанува затоа што можам веднаш да се направи еднаш ова гледам 0? Се враќам нула. Па сега ќе мора да ја премотам касетата на приказната. Ако јас сега се врати назад во времето, она што беше најновата нешто Јас не ако сте биле буквално премотување видео? Одам да ги собереш на најновите 1 и тоа ми дава 1 плус 0 е 1. Ако јас се задржи враќање наназад на Приказната, кој ќе ми даде 2 плус ова работи вредност, што е 1. Значи тоа е 3. А потоа јас ќе одам да се задржи премотување. Кога јас прв пат се спушти на бројот 3-- така 3 плус 3 ми дава 6. И сега, ако сте ја собра видео до овој момент, ова е многу Првото прашање прашав. Кога поминаа 3, она што е сигма од 3? Тоа е навистина 6, збирот на сите овие парчиња хартија. Значи, ако тоа е потребно малку време за да се заврши вашата глава околу себе, тоа е во ред. Но, сметаат дека тоа е тоа little-- беше многу намерно дека јас местеше овие броеви на врвот на секоја друга. Тоа е вид на како да има memory-- рекорд во времето, како чистач во видео, дека јас навистина може да ја премотам касетата во. И ние ќе треба да се врати за да таа метафора за само малку. Но, прво, тоа се покажува дека има многу видливо и смешни луѓе, Претпоставувам, во Google. Би некој кој е многу добар во Googling умот доаѓа за само еден миг и да ми помогне да бараат нешто? Многу, многу ниско клуч. Некој кој никогаш не е излезе пред, можеби. ВО РЕД. Да? Ајде. Ајде надолу. Како се викаш? Сем: Сем. Дејвид Џ MALAN: Сем, ајде долу. Ова е исто. Мило ми е што те запознав. Еј. Дојди. Така што сите што треба да направите, ако можете да, Сем, тука е Google. Може да ви бара зборот рекурзија? Не ја расипам. И сега let's-- је. Кликнете ОК за тоа. Подобро кликнете на тоа. Ахх, да го добие. Не? ВО РЕД. Значи, да се направи неколку други. Не толку многу сродни академски тука, но мора да некогаш претрес на Google за анаграм? Сем: Не Дејвид Џ MALAN: Во ред. Пребарај за анаграм наместо рекурзија. Како за накриво. Кога барав за накриво некогаш? Сега, ова ми е малку тешко да се види, но се надевам everything's-- ОК. Тоа е само ти и јас ужива ова. ВО РЕД. Значи, конечно, ова one's-- тоа е малку накриво. Сега се направи буре ролна. Прекрасно. Во ред. Голема благодарност на Сем. Еве ти. Благодарам. Значи она што се случува во сите од овие смешни примери? Значи, навистина, под хаубата на Милиони линии на кодот на Google очигледно е малку глупо ако услови кои се во суштина проверка, ако корисникот има внесе во оваа фраза, направи нешто што веројатно се nontrivial на износот на време да се спроведе само за да биде смешен во овој начин. Но, тоа е се што врие надолу до под хауба. Но, се разбира, рекурзија е повеќе од geekier пример меѓу оние специјални трикови. И сигурно има други таму како и дека ние можеби не се ни само уште откриени. Па погледнете, или сметаат дека сега на следната програма, и, секако, го имате било какви од овие на вашиот начин за излез. Одам да се оди напред и да отвори една програма која е ќе се обидат да се разменуваат две вредности. Но, пред да одиме таму, да го направите тоа. Би можеле да добиеме уште еден волонтер, мислам? Дали сакате да волонтирате? Не? Качи. Качи. Во ред. Па вашето име е она? Лорен: Лорен. Дејвид Џ MALAN: Лорен. Качи, Лорен. Па Лорен е да се биде доведен овде како што следува. Мило ми е што те запознав. Лорен така тука има пред на нејзините две празни чаши. И ние имаме некои од портокал сок и млеко и ние ќе треба да се оди напред и да го направите следново. Ние сме само ќе се објектите. Пред неколку унци на млеко над тука и нека е пополни малку сок од портокал овде. И пред сите овие членови на публиката, разменуваат со две вредности на овие чаши. Стави на сок од портокал во чаша млеко и во млеко во чаша сок од портокал. Како ќе го направите ова, ако сте биле во дома и имаат пристап до други резерви? Лорен: Стави ја во друга чаша. Дејвид Џ MALAN: Во ред. Па ајде да имаат привремена променлива, ако ние ќе. Сега и да оди напред и да се спроведе истата постапка Замена на. Многу добро. Ние се стави во ОВ привременото променлива, млеко во променлива ОВ, а сега на привремена променлива во варијабилни млекото. ВО РЕД. Па многу добро направено досега. Значи излегува out-- сметаат дека смета дека за само еден миг. Тука, само да го geek малку, ова ќе биде соодветните C код дека ние само спроведува. Имавме два елемента, a и b, и двете од која ние само ќе кажам за едноставност се int е. И ќе забележите дека овде, ако сакате да се разменуваат вредностите на две променливи, a и b, ние навистина треба еден посредник, односно привремена променлива, привремено чаша, во кои се става една од вредностите така што ние имаме случаеви за тоа. Но, тогаш на кодот е точно како Лорен тука имплементирани. Сега, само за да се добие малку полуда, Излегува дека можете да го направите тоа без привремена променлива. За да го направите ова правилно, сепак, ние ќе мора да лажеш со некои хемија. Имаме некои екстра чаши тука. Па најблиску нешто што изгледа како млеко и вода perhaps-- или млеко и OJ-- е имаме некои вода, па ние ќе се пополни оваа една до со неколку унци на чиста вода. Тоа е веројатно премногу. Је. Тоа е дефинитивно премногу. Се одржи на една секунда. И сега имаме нафта, која, како што се сеќавам од средно училиште хемија класа, се надевам дека тоа не се меша со вода. Но тој вид на вид на изгледа како млеко и ОВ. Па сега, без користење на привремена променлива, може да ви се разменуваат овие две вредности? Па масла оди во чаша вода, вода оди во чаша масло. Лорен: Нема други чаши? Дејвид Џ MALAN: Нема други чаши. И јас не сум, всушност, тестираат ова пред оваа година па јас не знам дали тоа ќе всушност работат хемиски. Дека не требаше да се случи. Дали функционира? Во ред. Па одделување? Добро. Сега ние мора да се добие вода во друга чаша. Попаметни хемија концентратори можев веројатно се направи ова подобро од мене. Лорен: Водата е на дното. Дејвид Џ MALAN: На water-- тоа беше што е клучен за последен пат ние го сторивме тоа. Што треба да го направи тоа во вистинската цел. Је. Во ред е. Така, сега имаме две чаши масло. ВО РЕД. Во ред е. Но хемиски ако ова работел отколку I-- Лорен: Ова е вода. Дејвид Џ MALAN: Тоа е претежно вода. Во ред. Но, тоа е сепак иста чаша како порано. Па се прелива it-- ја обидат таму. ВО РЕД. Ова е добар користење на класа време денес. ВО РЕД. Па сега we-- убаво. На некој начин. Во ред. Така многу добар. Ви благодариме на Лорен. Многу добро направено. Па само на удар вашиот ум, и ова е можеби нешто да се игра со ако сакате во CS50 проект, можете да се, всушност, се разменуваат две променливи без користење на привремена цел број. И ова е соодветната C код. И ако се сеќавате од минатата Среда, воведовме, ако за кратко, некои нови оператори во C. И дали некој се потсетиме што малку морков Симболот е, дека малку триаголен Симболот од тастатура претставува? Што bitwise оператор? ПУБЛИКАТА: EXOR. Дејвид Џ MALAN: EXOR. Ексклузивни или. Значи, ако сакате, само за забава на дома, да се даде и б два произволни вредности, како и секој eight-- и јас би ја одбрале осум малку вредност на. Ако го направите ова со 32 бити, можете многу брзо ќе се досадуваат. Но само даде осум малку вредност што е што, една или две, и даде б слична вредност. А потоа со помош на дефиницијата на XOR од минатата среда, примени тоа малку од малку, секој од оние осум битови во секоја од a и b, а потоа го направите токму по овој код. И тоа не е она што неточни ќе видите тука на екранот. Тоа навистина се сведува до три операции XOR и некако магично a и б ќе разменат ставови без губење на било каква информација. Така, трикот масло и вода е Најблиску реалниот свет инкарнација Ми паѓаше на ум дека за да го имитираат. Но, тоа е сигурно полесно да користете привремена променлива, како во овој случај тука. И тоа исто така е можност да се каже, исто така, овој вид на микро оптимизација, како компјутерски инженер би рекол, додека вид на забава да се фали за тоа како ти го направи тоа без како Замена со екстра променлива, тоа не е сè што релевантни. Затоа што за да се спаси 32 бита, како во случај на вистински int, и не е толку привлечна на систем, каде што Можете да користите десетици мегабајти или дури и повеќе, како сеќавање на овие денови. И всушност, кога ќе го добиеме за подоцна проблемот сет и ќе ги спроведе правопис Проверка и ќе се соочат со предизвикот да го стори тоа со тоа што малку RAM и малку време што е можно за ви computer-- уште имаат една недела за да се имплементира it-- ќе have-- ќе бидете соочат со предизвикот да се минимизираат овие ресурси. И тоа е навистина единствениот причинат овој семестар каде што ќе бидат охрабрени да се бричи исклучи дури и најдобрата претстава трошоци на друг начин. Па what-- како можеме да видите ова во вистинскиот код? Дозволете ми да оди напред сега и да се отвори еден пример која намерно се нарекува Не Трампа, бидејќи не ја всушност се разменуваат со променливи како вие всушност може да се очекува. Па ајде да ги разгледаме. Еве една програма која нема CS50 Библиотеката се случува, само стандард на I / O. Сега имаме прототип за swap до врвот кој само значи тоа е мора да бидат дефинирани подоцна. И тука е главниот. I произволно доделен x и y, соодветно, на една вредности и две само затоа што тие се мали и лесно да се размислува за. И тогаш јас само имаат еден куп на printfs каде што имам разумност провери. x е 1 и y е 2 е веројатно printfs оние што ќе каже. Па нема магија досега. Тогаш јас ќе одам да се тврди со печати дефиниција, Замена точка точка точка. Одам да се јавите на swap функција, кој поминува во x и y. И да претпоставиме дека сега за сега своп се спроведува точно како што беше пред еден миг со привремена променлива. И така јас се тврди смело, заменети. Х сега е ова и y сега е тоа. Но на датотеката, се разбира, се нарекува не разменуваат. Значи, да се види она што всушност се случува. Ако јас ги собере не разменуваат и потоа направи ./noswap, x е 1, y е 2. Замена заменети. x е 1, y е 2. Па тоа всушност се чини дека дури и со недостатоци иако swap-- ајде дојдете долу now-- се реализира токму според код им предложив пред еден миг. Па ние не се случува да се фенси со XOR работи за сега. Ова, исто така, треба да работат само како и со млекото и ОВ, но тоа не чини да се работи. Па ајде да го направите ова повторно. Можеби и јас само не беше тоа трчање право. Значи, да се кандидира не разменуваат повторно. Можеби I-- бр. Па тоа не е работа. Значи, да се направи малку разумност провери. Дозволете ми да оди напред тука во Трампа и едноставно додадете, почекајте една минута, a е% i / n и ајде plug-in-на вредноста на. Затоа што навистина го сакате да видам што се случува. И навистина, ова е техника дебагирање кои можеби ќе биде со користење на работното време или дома веќе, слично на првата половина на Дан Видео Armendariz во PSET3 назначено со тоа, воведовме како дефиниција за печатење препорачана техника, барем за едноставни случаи. Дозволете ми да оди напред и да ја стартувате направи повторно не разменуваат, ./noswap. Интересно. Па се забележи она што се чини дека е вистина. x е 1, y е 2, но а е 2 кога b е 1. Па тие две некако доби заменети но x и y не се добива заменети. Значи да биде јасно, што се случува е, тука имам x и y а тоа се локалните променливи во ПРЕДМЕТ НА ОСНОВНИТЕ, јас сум се поминува во x и y да се разменуваат. Сега, за размена, како посебна функција, е слободно да се јавите своите аргументи или нејзините параметри ништо не ја сака. Foo или бар или x или y или a или b. Само да појаснам дека тие се не е идентична со x и y, сама по себе, Сум рече a и b. Но ние би можеле да ги наречеме нешто што сакаме. И така што изгледа како своп се донесе x-- АКА a-- и тоа е се пренесува y-- АКА б. Некако овие три линии се Замена на оние вредности што точно како Лорен направив со млекото и ОВ. Но, кога ќе се печати вредностите, a и b се навистина трампа но x и y немаат промена на нив. Потсетиме дека x и y се до тука. Па може да се види тоа преку друга техника, како и. И тоа исто така е техника вградени во проблемот постави три. Ајде да одиме напред и да го направите тоа во CS50 проект, ако веќе не сте. На страна ние десната рака имаат ова јазиче грешки. И ако го отворите ова горе, има некои таинствени информации кој првично се фрлени во вас. Но, ајде да се закачам оваа разлика вистински пост. Значи еден, ќе видите локални променливи. Излезе дека се изгради во CS50 IDE, и многу програмски околини повеќе генерално, е дебагерот. А алатка која ви овозможува да ја видите визуелно она што се случува во внатрешноста на вашата програма без да се прибегне кон додавање printfs и составувањето и водење и додавање на printf и подготвување и работи, кои се веќе во работното време или дома, веројатно добивање прилично досадни. Па еве, во само еден миг, ние сме ќе да ја видите во реално време вредностите на нашите локални променливи. Ние сме, исто така, ќе бидат во можност да го поставите како што се нарекува пресечни точки кои можности во мојата програма за да го паузирате извршување на одредена линија на кодот дека јас сум љубопитен за. Нели? Овие програми работат во дел од секундата. Тоа е вид на убаво за нас побавно луѓето за да може да застане, да се земе еден миг, видете она што се случува околу одредена линија на кодот без орање на програмата низ него, а по завршувањето целост. Па поминувања ќе ни овозможи да се скрши и пауза во одреден момент. Повик оџакот е фенси начин велејќи дека она што функции се во моментов доведена во моментот. Главните е секогаш се нарекува прв план. Но, ако главната нарекува функција наречена Трампа, ние сме всушност ќе се види овој кула на функции кои се наречен во обратен хронолошки редослед. Значи, да се види тоа. Одам да одзумирате. Одам да се вратам во мојата код. И само затоа што сакам да бидат педантни тука, Одам да се оди напред и да кликнете само од лево на линија пет. И дека создава црвена точка. И известување на десна страна кои дебагерот знае, еј, Јас само рече дека точка на прекин на noswap.c линија пет, посебно во оваа линија код. Па дебагерот знае дека јас Побаравте дека следниот пат Трчам мојата програма тоа пауза извршување таму, а не само водење на целата работа супер брзо. Па сега јас ќе одам да кликнете на грешки копчето во самиот врв на ИРО и што се случува да го направите следново. Тоа се случува да се отвори на почетокот малку страшно бараат вториот терминал window-- далечински дебагирање од домаќин, како и such-- и ние ќе се вратам на она што сето она што значи пред долго. Но она што е важно за сега е дека таа црвена точка беше погодена, дебагерот намерно паузира execution-- не се на таа линија, сама по себе, но на првиот линија на реалните код во таа функција. А тоа е зошто линија седум е сега се осветлени во жолто. А сега, ајде да ги разгледаме на десната страна. Се чини дека, по правило, доволно убаво, x има она што вредност? 0. И y го има она што вредност? Нула. А тоа е да се очекува, во смисла што x и y-- дека жолта line-- има уште не е извршена. Па x не треба да има вредност 1. Тоа би можело да имаат и сите други вредности, т.н. вредност ѓубре. И добивме среќа по тоа што е нула во овој момент, во суштина. Па сега има само неколку копчиња ние треба да се грижиме за кога дебагирање на овој начин. Забележи овде, имаме копчето Play. И ако играме или притиснете продолжи, тоа е само случува да се кандидира преку остатокот на програмата или додека таа хитови друга точка на прекин. Но, јас не сум во собата било која друга поминувања па тоа е само случува да се кандидира до крајот. Кој вид на порази Целта на ѕиркаа наоколу. Па наместо тоа, јас се грижат за овие икони на правото. И ако ми лебдат над нив, како што треба да е премногу, ќе видите малку tips-- алатка совети. Ова е да се оддалечува. Сега тоа не значи прескокнување следниве линија код. Тоа само значи дека ја изврши и се движи кон следниот, се движи кон следниот, се движи кон следниот. Со други зборови, преку тоа копче, да чекорам преку мојата код еден чекор во исто време. Ред по ред, буквално. Сега, на правото на тоа, има уште еден што ќе видиме во само еден миг. Ова е т.н. Чекор во иконата, кој е ќе ми овозможи нурне во друга функција. Но, да видиме ова во само еден миг. Па јас ќе одам да кликнете да се оддалечува. И сега се забележи, како кликнувам ова копче во горниот десен агол, задржи околу очите под локална Променливи и да видиме што се случува со х. Х сега е 1 затоа што жолта линија сега егзекутирани и ние сме се преселиле на линија 8. И во само еден миг y се надевам дека треба да станат 2. Сега, ништо не се толку интересни се случува за малку. Сето ова е е printf. И известување, во моето средно терминал прозорец, гледам излез на печати дефиниција. И сега јас треба да се направи одлука како програмер. Јас може да се повлече во текот на оваа линија код, извршување на тоа, но не добивање љубопитен за она што е внатре. Или, всушност, можам да влезете во него и да си одат во внатрешноста на самиот Swap. Значи, да се направи на вторите. Дозволете ми да оди напред и да кликнете не прејдеш но влезете во. Известување, одеднаш промените на прозорецот да се потенцира на првата линија код во Swap. Тоа е линија 21. И сега, што е вид на фанки е тоа што, ако погледнете овде, како што се очекуваше, запирка b е 1 и 2, соодветно. Зошто е temp 32.767? Потсетувајќи дека Temp, слично како празната чаша пред еден миг, е прогласена тука на линија 21. Зошто 32,000- мислам, зошто е тоа само се некои чудни вредност? Да? ПУБЛИКАТА: Тоа не е иницијализиран. Дејвид Џ MALAN: Тоа е не била иницијализирана. Значи нашиот компјутер секогаш има физичка меморија. Тоа секогаш има физички RAM меморија. И секогаш е нула а еден е таму, нели? Затоа што ние сме за користење на нашата компјутер по цел ден, сте со користење на CS50 ИРО или серверите на целиот ден. Така што RAM меморија или има некои нули или некој е или некои нули и единици. Без разлика дали или не сте ги користите. Вие не може само да има празно места каде што сакате бита. Тие се или нули и единици. Значи излегува дека Temp, бидејќи ние не сме го иницијализира уште, имаме тие 32 бита, но тие не го иницијализиран на секоја позната вредности. Така што и тие биле најмногу неодамна користи for-- кои 32 bits-- ние сме само гледањето на артефакти од некои при користење на тие одредени 32 бита. Веднаш штом ќе кликнете прејдеш иако, Phew, Temp се случува да се добие вредност 1. И ако јас го направи тоа повторно, а да биде ќе биде со оглед на вредноста 2 а потоа ќе б да се даде вредност 1. И така што е убаво сега во овој момент во приказната е дека дебагерот е ми покажува, супер бавно во мојата свој темпо, што состојбата на Трампа е. Но информации на врвот тука, огласот што магацинот на повикот, всушност, има два слоја на него. Сега оној кој е потенциран како Swap, ако јас кликнете на Main, наместо тоа, информации како на локални променливи промени бидејќи инвеститорот може само хоп наоколу и да оди во било различен обем. Па и покрај тоа што го правиш сето ова работа и правилно Замена А и Б, ако одам напред и назад меѓу Трампа каде што а е 2 и b е 1 и главни, има Главни засегнати на сите? Бр Значи она што е готова брза тука? Па, излегува дека секое време ќе се јавите на функција како Трампа, а ти помине тоа аргументи, што што го поминува со функцијата на Трампа во овој случај е копија на тие аргументи. Па ако x и y се секое соодветно 32 бита, што Трампа е добивање е на две нови локални променливи, или аргументи, нарекува и b-- но оние кои се произволни names-- но моделот на нули и оние внатре од a и b се построи да биде идентична со x и y но тие не се истото како x и y. Тоа е како да Главна има на парче хартија бројот 1 и 2 за x и y, и тогаш кога се рацете кои парче хартија да се разменуваат, Swap многу брзо се добива сопствени пенкало, пишува долу 1 и 2 на свој лист хартија, рацете се врати на оригиналниот xy до главната а потоа прави свој работа со a и b. А сега ова е супер важно, бидејќи ова има импликации nontrivial за всушност пишување точниот код затоа што тоа ќе изгледа не можеме да се разменуваат две променливи. Имам напишано точната функција Swap. Ние сме го спроведува со Лорен како правилна функција трампа во реалноста, но очигледно ништо од тоа прашања, ако не, всушност може разменуваат со две вредности трајно. Па ние треба на друг начин за да всушност се на ова, и ние треба да бидат во можност да всушност се реши овој проблем. И излегува out--, ќе дојдеме назад во овој конкретен слика пред long-- ова е еден начин на кој може да се подготви меморијата на вашиот компјутер. Тоа е само еден правоаголник. Вие би можеле да ја извлечат број на начини, но тоа е погодно да го нацрта тоа како правоаголник од следнава причина. Ние ќе треба да почнете денес и пошироко Станува збор за т.н. оџак. И на магацинот е само парче на RAM-- парче memory-- која функционира имаат пристап до кога ќе бидат повикани. И така, се покажа дека во на самото дно на оваа оџакот е местото каде што сите локални променливи Главно е org и Ц и org V и сите тие работи се случува да одам по дифолт. И ако Главни повикува на некои други функции како Трампа, добро, Трампа ќе добие уште една слој на меморија до над неа. И така само за да ви даде брз површно слика на ова, ако одам над here-- и дозволете ми да се огледало на оваа надземни како well-- она ​​што навистина го имам, ако ние само се грижат за дното на оваа слика, за сега, е дека кога ќе ја стартувате програмата и главните добива нарекува, Главните е дадено парче RAM меморија во мојот компјутер, кој е на дното на оваа т.н. оџак. А јас ќе одам да го нацрта намерно како квадрат. Па тоа е како 32 бита или четири бајти. И ако оваа главна функција има променлива наречена x со вредност од 1 и има променлива наречена y со вредноста на 2, тоа е како и преземање на оваа треска на меморија, која Главните е дадено од страна на оперативниот систем и поделба, така што првата локална променлива оди овде, вториот оди овде, и тоа е тоа. Кога главната повикува Трампа, Трампа добива свој парче меморија дека ние ќе подготви се допаѓа ова од оперативниот систем, и тоа се случува да има врз основа на сопствените локални променливи на нашата имплементација порано со локални променливи на и б, која првично се добијат вредностите 1 и 2. Но, тогаш, штом кодот на Трампа извршува, и Лорен, всушност, врши размена на ОВ и млеко, што се случува? Па, ова 2 станува 1, овој 1 станува 2, и, патем, таму е Temp променлива и тоа е се користат, кои цело време додека на крајот си оди. Но, тоа не е важно колку многу работа да се направи во оваа линија of-- во овој мемориски простор, x и y се целосно недопрена. Значи ние треба некој начин да им Swap и функции како што е тоа Тајната пристап, ако сакате, да се функции like-- до меморија како x и y. Па ајде да ги разгледаме во пример кој помага ни да се види точно она што било се случува цело време. Одам да се оди напред и ќе отвори Споредба нула. А јас ќе одам да се затвори нашите дебагерот, јас ќе одам да се затвори ова страшно бараат порака на само вели, почекајте една минута, ти си во средината дебагирање. Одам да се скрие овој таб тука само за да се вратиш на едноставност. Па не се грижи ако GDB е убиен. Тоа само значи дека програмата има се откажат, намерно во овој случај, од мене. И сега Споредба Нулта прави ова. Јас сум со користење на CS50 библиотека во стандардот I / O. Јас имам таа прва главна функција вели, да каже нешто, и добива низа. Тогаш тоа вели повторно и здобиваат со уште една низа. И ќе забележите дека овие две жици се нарекува s и t, соодветно. А сега оваа програма, Споредба Нула, неговата цел во животот, што би требало да ми каже, никако не можев да напишете истото? И така јас сум да се вратам една недела. Јас сум користење на мојот еднаков еднаков оператор која е оператор на квалитет. Не операторот на задачата, операторот на еднаквост. Јас сум само споредување s и t. Значи, да се, всушност, оди напред и да го направите тоа. А јас ќе одам да се оди напред и да се направи споредба нула. Одам да се направи ./comparezero. А јас ќе одам да се оди напред и да каже нешто како, ајде да направиме мајка со мали букви И како за мајка во големи букви. И се разбира јас напишете различни нешта. Во ред. Тоа е да се очекува. Ајде да се кандидира повторно. Двата пати направи мали букви, мали букви. Дека изгледа супер идентичен со мене. Влезе. ВО РЕД. Можеби тоа е само чудно, бидејќи тој не го вкусот на мојот граматиката. Значи, да се направи капитал мама, капитал мама, идентични. Различни нешта. Значи, зошто е тоа така? Па, она што всушност се случува на под хаубата тука? Значи, да се врати во текот тука за само еден миг и сметаат дека она GetString е всушност прави. Кога ќе се јавите GetString, тоа е функција што самите себе, пишува и тоа некако добива низа од карактери од корисникот. И да претпоставиме дека првиот време јас го нарекувам GetString, што ми дава на парче меморија што изгледа вака. И ако јас ја внеле во сите мали букви м-о-m-- и она што се случува после тоа? Само еден брз разумност провери. Обратна коса црта нула. Ние знаеме дека. И да се потсетиме дека игравме околу со името Zamila е и еден куп други имиња кога Роб беше тука во потрага во она што се случува во внатрешноста на меморија. Така што приказната е иста. Тоа е она што GetString се враќа во мене. Сега, мојот код момент пред чуваат повратната вредност на GetString во променлива наречена s. А потоа и по втор пат го нарекуваат, тоа што се чуваат во променлива наречена т. Значи, ако јас одам во текот тука, ми треба да се подготви оваа локална variable-- и јас сум генерално ќе подготви низа како just-- ние ќе го нарекуваат s-- како малиот плоштад тука. И сега, како го прави somehow-- мајка оди во внатрешноста на оваа променлива е? Па, ние треба да се вратиме прво принципи. Што е, всушност, се враќаат GetString? Значи излегува дека М-О-М обратна коса црта нула, и било кој број на други низи во меморијата како Zamila и Роб или Енди или било кој други, се разбира во нашата RAM меморија или мемориската компјутер. И вашата RAM меморија има like-- имате свирка на RAM меморија, две свирки на RAM меморија, или една милијарда или две милијарди бајти, или можеби дури и повеќе, овие денови. Значи, да се претпостави, за денешните потреби, дека тоа не е важно како ќе се број нив, но ние може да ја изброи секој на оние милијарди или две милијарди или четири милијарди бајти. И ајде да се произволно да се каже дека ова е првиот залак, вториот залак, трето, четврто. Јас намерно не сум со користење нула за денес, но ние ќе се вратам на тоа. Значи со други зборови, ако ова е Уште првиот пат јас сум со користење на програмата, Јас сум само добивање на среќа и првиот залак е на локација еден од два потоа три од четири. И ако јас се чуваат цртеж, на PO Сандаче две милијарди ќе биде начин да се овде. Па што мислите, а потоа, GetString всушност се враќа? Тоа не е да се врати на М-О-М обратна коса црта нула, сама по себе, бидејќи тоа јасно не ќе се вклопат во полето што сум ги извлечат. Па што друго би можеле getstring всушност да се врати на сите овие недели? Одговорот е на одборот тука некаде. Вие не може да се вклопат М-О-М обратна коса црта нула, така што може да има смисла, наместо? Ако требаше да биде супер умен, ставајќи на т.н. инженеринг шапка, што би можело да се врати? Што не е во најмалку износот на информации може да се врати што би уште да те најдат М-О-М во меморијата? Да? ПУБЛИКАТА: Еден. Дејвид Џ MALAN: Еден. И зошто некој? ПУБЛИКАТА: Поради тоа што ќе му каже каде што можете да одат [Беззвучен]. Дејвид Џ MALAN: Токму така. Јас сум само се случува да се врати на адресата на стрингот што сум го добил. Адреса во овој случај е една локација. Значи она што навистина се складира во s-- и секој стринг променлива со тоа far-- штотуку беше на адресата на таа низа. Во меѓувреме, ако ќе се јавам Getstring по втор пат и јас напишете во буквално исти thing-- M-O-M со lowercase-- M-O-M и уште една обратна коса црта нула, а сега можеби мојата програма се работи за некое време, па можеби и ова е 10, ова е 11-локација, ова е 12, ова е 13. На компјутери со користење на некој друг меморија од која било причина. Она што сега се случува во моето второ променлива во програмата мојот Т? 10. Токму така. И така, кога ќе погледнеме во Изворниот код на оваа програма каде што јас едноставно се обидува да се споредуваат две вредности, е е еднаков еднаков на Т, што е очигледните човечки одговор? Само нема, бидејќи 1 не е еднакво на 10. И така тука лежи една можност за нас навистина само да се вратиме, пак, првиот принципи и да се размислува за, добро, она што се случува под хаубата? Ние сме биле зборува за битови и бајти и меморијата, но тоа е всушност корисно да се разбере затоа што кога ќе се јавите GetString, и покрај тоа што ние мислиме за тоа е враќајќи М-О-М или стринг мајка или Енди или Zamila или слично, технички тоа е само враќање на адресата на таа парче меморија. Но, тоа е во ред. Бидејќи како да знам каде што низа завршува? Ако сум само дадена на почетокот? Па, обратна коса црта нула, нели? Само во линеарно време можам испечатите со печати дефиниција М-О-М. И штом ќе видам обратна коса црта нула, не ми е грижа каде што почнав, Јас веќе знам имплицитно каде што треба да се стави крај. И така денес одбележува beginning-- и дозволете ми да го направите ова, бидејќи ние драматично помина низ многу проблеми добијат овие тука обука wheels-- па денес обука тркала почнат да падне и да ги откриваме во least-- [Аплауз] Тоа беше добро вреди патување да Целна ова утро, да? Па now-- постои, тоа се покажува надвор, постои такво нешто како стринг. Стринг не постои. Е синоним што имавме во внатрешноста на библиотеката CS50. Отсега натаму, ние ќе треба да почне повикувајќи s и t нема жици, но знак ѕвездите. И знак ѕвезда ние ќе одгатнат пред долго. Но, тоа е да се каже, дека дури и ако продолжиме користење GetString, за сега, технички јас треба биде велејќи знак ѕвезда и знак ѕвезда. И излегува дека она ѕвезда се случува да се означуваат нешто наречен покажувач или адреса. И всушност, закачка за она што се наоѓа напред е ова 20 вториот клип од нашите другар Ник Parlante на Стенфорд кој пред извесно време, поминуваат смешна сума на времето, како најдобро можам да кажам во неговата кујна или неговиот подрум, прават claymation воведување на светот ликот наречен Binky со кои ќе биде воведен следниот пат да покажувачи. Значи тука е преглед на она што е да дојде. [Видео репродукција] -Hey, Binky. Разбуди се. Тоа е време за покажувачот забава. -Што е тоа? Учат за покажувачи? Ох, стрина. [END репродукција] Дејвид Џ MALAN: И на тој белешка, Ние ќе се видиме во средата. Во ред. Кој е танцување? Ајде. Кој е танцување? Сакаш да се добие што и започна? Ќе добие што и започна. Woooo! Лорен: Слатка фенси Мојсеј.