DAVID J. Malan: Това е CS50 и Това е началото на четири седмици. И, момче, е Volkswagen в беда всички, защото на софтуер. Нека да разгледаме. [Възпроизвеждане на видео] -Cars, Най-умните героите в Бързи и яростни филмите. Тази седмица германския автомобилопроизводител Volkswagen се озова в средата на скандал на потенциално престъпни пропорции. -Volkswagen Се подготвят за милиарди в глоби, възможни наказателни такси със своите ръководители, като компанията се извинява за манипулиране на 11 милиона автомобила до му помогне да победи изпитвания за емисии. -Certain Дизеловите модели са проектирани с усъвършенстван софтуер че използваната информация, включително позиция на кормилното управление и превозното средство ускори, за да се определи колата е подложени на изпитване на емисиите. По силата на това обстоятелство, двигателят ще намали вредните емисии. Но колата е нагласено да байпас че когато се се задвижва. Емисиите се увеличили 10 до 40 пъти над допустимите нива на EPA. [END PLAYBACK] DAVID J. Malan: Така че нека да разгледаме този и да видим как точно това могат да бъдат приложени и как това може да се отрази толкова много коли по този начин. Така че в ръката ми тук са пресата освобождаване, която е издадена от EPA-- по околната среда Агенцията за защита, които е регулаторната агенция на САЩ, че дръжки загрижеността за околната среда, и след това действителното правна информация, че е бил изпрати на Volkswagen само преди няколко дни. Така че СИП пише, и разкрива сега публично, а усъвършенстван софтуер алгоритъм на определена Автомобили Volkswagen засича когато колата е в процес на тестване официалните емисии и се превръща пълните емисии контролира само по време на изпитването. Ефективността на тези превозни средства на замърсяването устройствата за контрол на емисиите, е значително намалено по време на цялата нормално шофиране ситуации. Това води до по автомобили, които отговарят на стандарти в лабораторията или изпитване станция, но по време на нормална работа излъчват азот oxides-- или NOx-- със скорост до 40 пъти по стандарта. Софтуерът, произведени от Volkswagen е цитат цитата, коригиращо устройство, както са определени от Clean Закон Air в САЩ. Те продължават да се каже, че СИП и друга агенция разкрила поражение устройството софтуер след независим анализ от изследователи в West Университет на Вирджиния. NOx допринася за замърсяване азотен диоксид, на приземния озон, и фини прахови частици. Излагането на тези замърсители са свързани с широка гама от сериозни последици за здравето, включително повишена астма атаки и други респираторни заболявания, които могат да бъдат достатъчно сериозни да изпраща хора в болницата. Излагането на озон и прахови частици има също е свързана с преждевременно смърт поради дихателна отнасящ или сърдечно-съдови ефекти свързани. Деца, възрастни хора, хора с съществуващо респираторно заболяване са особено изложени на риск последици за здравето на тези замърсители. Достатъчно е да се каже, че е доста сериозна. И нека да отидем, за да прочетете само още един откъс и след това ние ще се погледнете в свързаните с тях последици на това в контекста на кола. Конкретно, Volkswagen изработват и монтират софтуер в така наречения електронен контрол module-- или ECM-- на тези превозни средства, които усетиха когато превозното средство е бил тестван за спазване на стандартите за емисии EPA. Въз основа на различни входове включително позицията на волана, превозно средство скорост, продължителността на двигателя операция, и барометричното налягане, Именно тези входове карането на параметрите на процедурата за федерална тест, използван за изпитване на емисиите за сертифициране EPA цели. По време на изпитването за емисии на EPA, Софтуерът на превозни средства ECM завтече софтуер, който произвежда резултати, съответстващи на емисиите. По всяко друго време, на ECM превозно средство софтуер завтече отделна пътна калибриране, която намалява ефективността на цялостна система за контрол на емисиите, специално селективна каталитична намаляване на NОx с ниска концентрация trap-- които ще видим в един миг. В резултат на това емисиите на NOx увеличава с коефициент от 10 до 40 пъти по-горе, съответстващи на нивата на СИП в зависимост от вида на кола цикъл. И така, какво всъщност означава и изходния код на протичане софтуер на Фолксваген не разполага все още не са публично оповестени, е, че ефективно, този еквивалент е там някъде вътре на код на Volkswagen. Ако в момента се тества, и ако колата разпознава някои фактори на околната среда като волана позиция или движението или липса на такова от колата или всякакъв брой други фактори Предполага се, че в момента да бъде част от тази формула, те просто включете Пълен контрол на емисиите. С други думи, те започват излъчващи по-малко от замърсителите. Else, във всяка друга ситуация когато не е констатирано, че са в лабораторията, те просто не го правят. И така, можете да опрости това в по- бетон Псевдокод с нещо като този. Ако колелата се обръщат но волан, не е, предполагащи че колата е на някой вид въртящ се цилиндър но в някакъв вид склад, което се изпитва, след това се държат като EPA бихте искали да. В противен случай не го правят. Така че нека да погледнем най-кратък видеоклип, който се погледнете какви последствията са от тази действително механично. [Възпроизвеждане на видео] -Last Петък СИП обяви, че някои Автомобили Volkswagen Audi, направени между 2009 и тази година бяха използвайки така нареченото устройство за управление за да се придвижва закони за емисиите предназначени да пазят въздуха чист. Но какво означава това точно? Е, съвременни автомобили имат десетки на компютри вътре в тях. А някои от тези компютри помогне за координиране на функциите на двигателя за оптимална производителност, като внимавате че не е прекалено много отпадъци излиза от ауспуха. Те са били действително работи по този начин в продължение на няколко десетилетия. По принцип, всяка част на двигателя модерна кола има сензор или контролер върху него, и тези компютри четете в данните хиляди пъти в секунда корекции за приготвяне като съотношението на гориво във въздуха което се случва в цилиндрите. Те изневерява Volkswagen и Audi модели са дизели, и дизелови двигатели имат един по- Наистина е важно компютър контролирани параметри, което е размерът на неизгоряло гориво ще в отработените газове. Сега това звучи зле. Не звучи като теб ще искате неизгоряло гориво навлиза в отработените газове. Но в случай на дизел, имате нещо нарича NOx уловител, който е устройство, което абсорбира и капани за азотни оксиди които са замърсители, които биха в противен случай отидете в атмосферата. И резултатът от това NOx уловител е увеличено с неизгоряло гориво. Така поражение устройство е специална програма вътре в тези компютри, които могат да го направят изглежда като колата отговаря на емисии стандарти, дори когато това не е така. Volkswagen имал проблем на ръцете си. Нейните дизелови двигатели са известни за получаване на голяма икономия на гориво, но NOx капана работи само добре когато се използва повече гориво. Така че колата ще се открие, използването на този коригиращо устройство, когато тя е била получаване на емисиите тестове, че ще използва повече гориво, направи капан работата на NOx добре, емисии ще се оправи. Но след това можете да получите по пътя, устройството се изключва, което гори по-малко гориво но сте пускането толкова, колкото 40 пъти повече замърсители в атмосферата. Но как, по дяволите, е направил колата знам, че това е се изпитва за съответствие на емисиите? СИП казва, че това е сложна система, която проверява неща като положението на волана, скорост, колко време двигателят е било включено, и дори атмосферното налягане. С други думи, не е Няма начин това е било случайно защото софтуерът е проектирани много внимателно да се открие тест официалния емисии. Това е доста сериозна част измама и това е Защо Volkswagen е в такива сериозни неприятности. В действителност, тяхната CEO, Martin Винтеркорн, просто се оттегли от поста. И така, какво се случва след това? Е, ако вие сте един от половината милиона дизелови Jettas, Beatles, Golfs, Passats, или Audi A3s извършва, Добрата новина е, е че колата ти е все още безопасен за шофиране. Вие не трябва да го направи докато Volkswagen издава изземване. Но в един момент те са Вероятно ще се наложи да актуализирате софтуера в колата ти. Когато това се случи може би получавате по-малко мили в резервоара. Адвокати вече подготвят за колективните искове така собствениците могат да се компенсират в някакъв момент в бъдеще. Но това няма да да се случи в скоро време. [END PLAYBACK] DAVID J. Malan: Така че това всъщност повдига интересен голяма картина въпрос че да се доверите. Нали така? Всички ние имаме Iphones или андроидите или нещо в джобовете ни най-вероятно тези дни, или лаптопи на нашите обиколки, които са използвате софтуера, изработен от Apple и Microsoft и букети от други фирми. Но как ние знаем, че това, което тези софтуерни продукти са прави е всъщност това, което те фирми казват, че те са прави? Например, кой е се каже, че всеки път, вие се обадя по телефона на вашия iPhone или Android телефон или други подобни, че този телефонен номер също не е се качил на сървъра някаква фирма защото на някои програма сте писмено, независимо дали това е оперативната Самата система като IOS или Android, или защото сте изтеглили някоя трета страна ап че по някакъв начин се слуша към всичко, което въвеждате в или всичко, което всъщност казва. Откъде знаеш, че когато вие се изпълняват звън или Направи да компилирате собствен софтуер в CS50, как правиш собствен персонал, който е CS50, по пътя на библиотеката CS50, не е било сеч всеки низ някога сте придобили или всеки инч някога сте придобили? Е, вие със сигурност може да изглежда изходния код за нещо като библиотеката CS50, вие може да разгледате на изходния код за Linux операционна система тичане на CS50 IDE. Но едно невероятно представяне е върната през 1984 г. в получаване на наградата Тюринг от много известен компютърен специалист, известен as-- на име Кен Томпсън, който получи наградата Тюринг, която е нещо като компютърни науки в Нобелова награда, ако щете, за работата си върху операционна система, наречена Unix, който е много подобен на духа на това, което ние използваме, което е Linux. И въпросът попита той си приемане реч, по същество за определяне на рамката за години и години на дискусия за доверие и сигурност, беше това. До каква степен следва една тръст изявление, че program-- парче на software-- е свободен от троянски коне? Може би това е по-важно да се доверите хората, които пишат софтуера. И в действителност, ние сме свързани към разговора, че той даде, когато приема тази награда през 80-те на уебсайта на CS50 по страницата Лекции за днес. Защото това, което ще видите е, че той всъщност дава сравнително прост пример за това как дори компилатор като звън или каквото компилатори други са използвани в миналото, ами ако вградена в съставител WE себе използвате, е малко, ако състояние, което по същество казва, ако забележите, че този код е използването функцията GetString или GetInt функция, давай напред и поставете задна врата или троянски кон така че програмата Сега има някои нули и такива, които правят нещо злонамерено. Влизане всичките си клавиши, качването, че данните до известна сървъра, или наистина нещо. И какво Ken Thompson продължава да се направи в речта си е да се покаже, че дори Вие имате достъп до източника код на компилатор, че злонамерено може да се прави това, това няма значение, защото има това пиле и яйца реалността на миналото много години, при която компилатори се използва, за да се съберат. С други думи, обратния път, когато някой бе да съм написал първата компилатора. И след това, всеки път, когато те обновихме компилатор чрез промяна на изходния код, добавяне на функции и да го прекомпилирате за хора като нас да се използват, както и, те използват старите версия на компилатора за съставяне на новото версия на компилатора. И ако погледнем в разговор, че е дал, ще видите, че поради на тази цикличност, всъщност може да има грешки или Троянски коне, вградени в софтуера ние използваме. И дори ако се вгледате в изходния код за тези програми, тя дори може да не е очевидно, защото заблуда е всъщност в някои стара версия на компилатор, че откакто е била инжектиране на заплахата в нашия софтуер. Което е само да се каже, ние наистина не може и не трябва да доверие софтуер, работещ на нашите лаптопи или телефони или произволен брой места. И всъщност, по-късно през този семестър, когато ние започнем да говорим за уеб програмиране и действително да започне изграждането на уеб приложения себе си, ние ще говорим за тях заплахи и др. Сега, може би сте се чудеха и забелязах че е имало съвсем мъничко Darth Vader в клиповете, които The Verge се показва там за Volkswagen. Ако никога не сте виждали, I помислих, че трябва да се облекчи настроение, защото това е всичко, много потискащо и страшно. Отивам да гледам назад в Super Bowl 2011 когато една търговска чрез Volkswagen-- и това почти ги прави привлекателен again-- излъчен за първи път по телевизията. Това е вторият клип 60 Мисля, че ще се радвате. [Възпроизвеждане на видео] [MUSIC - ТЕМА ОТ "Междузвездни войни"] [DOG лае] [CAR ЗАПОЧВА] [END PLAYBACK] DAVID J. Malan: Да. Аз просто проверка. Това кола е включен в списъка на нарушенията. Всичко е наред. Така че ние разгледаме някои Псевдокод преди малко. И тук е по-голяма откъс от Псевдокод код които сме виждали няколко пъти досега. И нека използваме това е възможност сега, за да се въведе нов програмен техника, която ние направихме виж алгоритмично миналата седмица, когато погледна към сливане на сортиране. Но нека си го формализира и да видим как бихме могли да го използват в действителния код, и след това отиваме да използвате тази техника за определяне на пътя най- вероятно за решаване на някои други проблеми. Така че това е една от първите програми ние някога е написал, макар и в Псевдокод код. И това, което тази програма ни позволи да направим курс бе да се намери Майк Смит в телефонния указател. И забележи по-специално линии осем и 11, които имаше това изявление Go To. И в действителност, някои езици, C между тях, всъщност да имам удостоверение, че е буквално отидете, която ви позволява да скочи до определена линия. Това е като цяло гледат накриво, защото той може да бъде много лесно се злоупотребява и можете да започнете да скача си програма по цялото място, за разлика за използване вид логика и контрол на потока че ние сме използвали до този момент само с електрически вериги и условия и други подобни. Но ние можем да опрости този алгоритъм в Псевдокод код, както следва. Вместо това итеративен или примка подход където ние продължаваме да се върна и назад и обратно да се подредят три, защо не просто вид шута и повече обикновено казват в съответствие седем и 10, Просто заменете чифта линии с, иначе, ако Смит е по-рано в книгата ние ще търси за Mike в лявата половина на книгата. Иначе, ако Смит е по-късно през книга, търсене на Mike в дясно половината от книгата. И забележи вече кръглостта. Нали така? Търся за Mike в телефонния указател и след това Аз в крайна сметка може би хит Онлайн седем или може би линия 10 и моята инструкция за себе си е търсене за Mike в половината от телефонния указател. Е, как да търся Майк? Аз съм в средата на търсите Майк, защо са ви нещо ме изпраща в кръг? Но това е ОК, защото това, което е случва на размера на проблема, както е написано в съответствие 7 и 10? Ние не сме просто казвам търсене за Майк, търсене на Майк. Ние изрично казва, какво от това? Търсене за него в лявата половина на дясната половина, което е ефективно половината от размера на проблема. Така че това е ОК, че ние сме вид ангажиране в тази цикличност, това кръгово аргумент, защото най-малко сме вземане на проблема по-малки и по-малки. И в крайна сметка ние ще достигне че така наречената база случай, когато имаме само една страница left-- като наш доброволец миналата седмица did-- имахме една страница ляво и след това не го правим Трябва да продължавам да търся за Mike Smith защото той е или на тази страница или той не е. И така, как можем да приложим тази идея, тази сортиране на цикличност в действителния код? Е, ние можем да използваме техника която е известна като рекурсия. И ние сме виждали това в Псевдокод за сортиране чрез сливане на миналата седмица. Припомнете си, че това е най- Псевдокод за сортиране чрез сливане. Това е може би още по-лесно, отколкото балон или селекция или вкарване на сортиране само по отношение на простотата с която можете да го изразя. Но това е, защото ние сме нещо като кръгово казвайки, потърсете нещо чрез търсене на нея отново. Но ние сме търсите или на лявата половина или дясната половина и след това евентуално сме сливане в този случай. Но тук, също с тези две линии за сортиране, Те видяхме отново имам този Идеята на рекурсия. И конкретно какво означава това, в контекста на алгоритъм, е алгоритъм е рекурсивен ако използва или нарича себе си. Или по отношение на C, функция е recursive-- функция, наречена Foo е рекурсивен, ако Foo, някъде в изходен код, нарича функция на Mt. самия. И това е лошо, ако всичко Foo някога прави е да нарича себе си отново и отново. Това е ОК, ако Foo в крайна сметка спира, както прави сортиране чрез сливане, като казва, чакай малко, ако този проблем е супер малка, например, или го намерих когото съм търсите, просто се върнете. Не рекурсивно, не го правят циклично се нарека отново. И така, нека да разгледаме най- как това би могло действително работят. Така че аз ще отида напред и отворена до два източника код примери тук. Един от които се нарича Sigma 0. И това не е никак рекурсивно, но нека да а вижте какво прави тази програма. Аз бях лишен от всичко коментари от него, но всички на изходния код на CS50 е уебсайт има коментари, ако сте искате да прочетете през него отново по-късно. И нека да направим няколко на разсъдъка проверява тук. Така че в горната част на този кодекс, имаме включва CS50.h. Какво значи това правя? Защо е тук? От гледна точка на лаик разумно. Какво прави? Да. АУДИТОРИЯ: Така че GetInt функция работи. DAVID J. Malan: Така че функцията GetInt работи. Защото вътре в този файл, CS50.h, които ще видим след дълго в отношение на изходния код, има куп функции declared-- GetInt, GetString, и куп others-- и освен ние всъщност имаме, че Включи линия, съставител звън не е Ще знаете, че тя съществува. И същото важи и за линия където две INT се определя ФОРМАТ, което е функция ние продължаваме да се използва доста малко. Сега, четвърти ред изглежда малко фънки защото това е просто една подложка. Тя има точка и запетая, не къдрава скоби, няма код вътре в него. Но това, което е направил, което наричаме това нещо в миналото седмици? Да. Така прототип. И защо ние имаме прототип, който изглежда да бъде малко съкратени обикновено, защото ние обикновено видим отново функцията късно във файла, нали? Така че защо ние have-- ти си просто надраскване главата си, но аз ще го взема. Да. АУДИТОРИЯ: [недоловим] функция след основното. DAVID J. Malan: Точно така. Така, че компилаторът ви познава в крайна сметка ще определи или да приложи тази функция, след като основният, най-вероятно. Така звън и най- компилатори са вид неми и те само ще знаете какво да им кажа. И ако искате да използвате функция, наречена сигма, по-добре да научи компилатор че той съществува предварително. Сега основната себе си, дори и че това е един куп линии, е доста запознат с надежда от сега. Той има една линия, докато не се прави чиято цел в живота Тук очевидно е да се получи положително цяло число от потребителя. И просто да го тормози или нея, докато те си сътрудничат. След това в ред 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 какво ще получите? АУДИТОРИЯ: [недоловим]. DAVID J. Malan: Ами, не. Но 1275, което е доста близо. Така че това е в резултат на това 50 плюс 49 плюс 48 плюс 47 плюс 46 по целия път надолу до 1. Така че това е всичко, сигма прави. Но нека видим как ние сме тя изпълнява в момента. Така че тук е самата функция. И това не изглежда да има нищо общо с рекурсия, все още. В действителност, ние сме с помощта на стара техника училище. Аз съм инициализиране променлива, наречена сума на до нула, а след това имам foreloop тук, и аз съм обявяване на Int нарича Аз, като определя това, равна на 1-- макар че може да го настроите, равна на нула, но тъй като аз правя допълнение, на кой му пука, ако това е нула или едно. Това ще има ефект. Така че аз съм итерации, докато аз се по-малко от или равно на М, което е аргументът, че е приет инча И тогава аз просто продължавай Увеличаването I. А прозрение на цикъла всичко, което правя прави сума плюс равнява I. А това е умишлено. Аз не искам да правя, в това случай, като сума плюс плюс. Искам да всъщност добавите текущата стойност на I която продължава да става все по-голяма и по-голяма и по-голяма за текуща сметка. И тогава аз се върне сума. И така отговор получава сумата на стойността. И тогава аз го разпечатате. Така че има възможност тук, все пак, някак да се опрости този код концептуално и вида на издухвам си интересуваме от гледна точка на простота, въпреки че Отнема известно време, за да сортирате на оценяваме защо това е силен в тези малки примери. Ето сигма one-- така че втора версия на този код. Всичко до върха е идентичен, така същата тази история се отнася както преди. Но сега нека да погледнем на прилагане на сигма който Аз бях сведено само до тях lines-- четири реда код, наистина, плюс някои фигурни скоби и бяло пространство. Но това, което правя аз? Ако m е по-малко от или равно на нула, аз трябва да се справят с вид че супер прост случай. И ако ме предаде нула или нищо отрицателна, което е просто странно, Аз съм просто ще произволно но последователно се върне нула. Аз не искам това нещо да получите в някаква странна безкрайна линия, защото на отрицателна стойност. Така че аз съм просто казвам, ако ми дадеш нула или по-малко, аз съм връщане нула. Но това е добре, защото това е че една страница на телефонния указател , което е останало. Аз съм отхапваща много специфичен проблем и да не се поставят нещо рекурсивно. Но в съответствие 31, това, което мога да изглежда да се прави? Скобките са само водене неща, да се надяваме, малко по-ясни. Но всичко, което правя е, че съм връщане m-- каквото те предаде me-- плюс стойност на m-- съжалявам, плюс стойността на сигма т минус 1. И така, какво означава това? Ако ми дадеш номера 3 като вход, отговорът Аз искам да отида в крайна сметка е 6, защото 3 плюс 2 плюс 1 ми дава 6. Но как мога да си помисля как този код се изпълнява? Първият път, когато се обадите сигма и аз минавам в стойността 3, това е като да кажеш на парче хартия, тук е стойността 3 и аз съм бил преминал това като сигма. 3 е очевидно не по-малко от 0, така състоянието АКО не се прилага. В друг не знае. И така, какво да правя? Искам да се върна м, което е 3, както и на сигма m минус 1. Така че нека да следите за това. Отивам да се сложи това парче хартия надолу. И каква стойност, да бъде ясно, аз ще мине в сигма в този момент в историята? Какъв номер? 2, нали? 3 минус 1 е 2. Така че аз просто се нуждаят от малко остатъци от хартия тук. Така че сега сигма е парирани отново. И аз умишлено сложи това, защото това е нещо като пауза тази версия на историята защото сега съм фокусиран на сигнал на М минус 1. Така че m е 3, т минус 1 е 2. Така че тук е 2, че съм бил приет. 2 е очевидно не по-малко от 0, така че това дело, не се прилага. Else I върне м, което е това нещо, плюс сигма на каква стойност? Така че, ако сигма на 1-- защото m е точно сега, така 2 2 минус 1 е 1. Така че сега имам само стойността 1. Аз съм просто преминаване на броя 1 с функция sigma-- или себе here-- така един очевидно не е по-малко от нула, все още не се прилага. Else завръщането 1 плюс сигма на какво? 0. Така че нека просто не забравяйте, че. Ще се върнем към това по-късно. Сега аз ще отида напред и йота определяне на броя 0, защото това е моята теза или параметър. Аз съм преминал брой 0 и накрая този процес от само себе си, повтаряйки обява nauseum престава, защото това, което мога веднага направи веднъж Виждам това 0? Връщам нула. Така че сега ще трябва да се върнем назад историята. Ако аз сега се върнете назад във времето, това, което е най-новото нещо Направих ако сте били буквално пренавиване видео? Отивам да вземете най-новите 1 и това ми дава 1 плюс 1 е 0. Ако аз държа пренавиване на история, която се случва да ми дадете 2 плюс това движение стойност, която е 1. Така че това е 3. И тогава аз ще се запази пренавиване. Когато за първи път постави броя 3-- така 3 плюс 3 ми дава 6. И сега, ако сте се пренавива видео до този момент, това е самото Първият въпрос, попитах аз. Когато премина 3, какво е сигма на 3? Това е наистина 6, сумата от всички тези парчета хартия. Така че, ако това отнема малко време, за да увийте ума си наоколо, това е добре. Но помисли, че това е тя little-- Беше много съзнателно, че аз стак тези номера на началото на всяка друга. Това е вид на нещо като memory-- рекорд във времето, като скрубер във видео, че аз наистина могат да се върнем назад инча И ние ще се върнем към че метафората в съвсем малко. Но първо, се оказва, че има много отрепки и забавни хора, Предполагам, в Google. Бихте някой, който е много добър в Googling ума идва само за миг и да ми помогне да потърсите нещо? Много, много нисък ключ. Някой, който никога не е излезе преди, може би. ДОБРЕ. Да? Хайде. Хайде надолу. Как се казваш? SAM: Сам. DAVID J. Malan: Сам, хайде надолу. Това е същото. Приятно ми е. Хей. Ела. Така че всичко, което трябва да направиш, ако бихте могли, Сам, ето Google. Можете ли да потърсите думата рекурсията? Не се развали. И сега let's-- да. OK Кликнете това. По-добре, кликнете върху него. Ааа, да го получи. Не? ДОБРЕ. Така че нека да направим няколко други. Не толкова свързаната академично тук, но трябва някога търсене Google за анаграма? SAM: No. DAVID J. Malan: OK. Търсене за анаграма вместо рекурсия. Какво ще кажете за накриво. Вие търсихте някога за накриво? Сега, това е малко трудно да се виж но се надяваме everything's-- OK. Това е само ти и аз ползващи този. ДОБРЕ. Така че в крайна сметка, това one's-- това е малко накриво. Сега правя един барел преобръщане. Wonderful. Всичко е наред. Голямо благодаря на Сам. Заповядай. Благодаря. Така че това, което се случва във всички от тези глупави примери? Така че наистина, под капака на Милиони реда код на Google очевидно е малко глупаво IF условия, които са по същество проверка дали потребителят трябва въвели в тази фраза, направи нещо, което най-вероятно се а nontrivial период от време да прилагат само за да да бъде забавен по този начин. Но това е всичко, тя се свежда надолу, за да се под предния капак. Но, разбира се, рекурсия е повече от geekier Например сред тези специални трикове. И със сигурност има други там както и, че ние може би дори не са просто все още открити. Така че да разгледаме, или да обмислят Сега следната програма, и със сигурност вземете някоя от тях по пътя си. Отивам да вървим напред и да отваряне на програма, която е Ще се опитам да размените две стойности. Но преди да отида там, нека да направим това. Можем ли да се получи един по- доброволец, мисля? Бихте ли искали да работи като доброволец? Не? Хайде нагоре. Хайде нагоре. Всичко е наред. Така че вашето име е това? LAUREN: Lauren. DAVID J. Malan: Lauren. Хайде нагоре, Лорън. Така Lauren се е справи тук, както следва. Приятно ми е. Така че тук има Lauren пред на нейните две празни чаши. И ние имаме някои оранжево сок и малко прясно мляко и ние ще тръгнем напред и да направите следното. Ние просто ще се запълни тази. Няколко унции мляко тук и нека запълнят малко портокалов сок тук. И пред всички тези членове на аудиторията, разменете две стойности на тези чаши. Сложете портокаловия сок в чашата с мляко и млякото в чашата на портокалов сок. Как ще направите това, ако сте били най- дом и е имал достъп до други консумативи? LAUREN: Сложете го в още една чаша. DAVID J. Malan: OK. Така че нека да има временно променлива, ако ние ще. И давай сега и прилагане тази процедура на дискове. Толкова добър. Ние сме поставени в OJ временната променлива, мляко в променливата ОВ, и сега временната променлива в променливата на мляко. ДОБРЕ. Така че много добре направено досега. Така се оказва, че out-- задръжте мислеше само за миг. Тук, просто да го Geek нагоре малко, това ще бъде съответната С код че ние просто изпълнява. Имахме два входа, а и б, като и двете които ние просто ще кажа, за простота са инт му. И забележи тук, ако искам да сменяте стойностите на две променливи, а и б, ние наистина се нуждаем от посредник, а временна променлива, временно чаша, в който на застиване една от стойностите така че да имаме контейнер за него. Но след това, че кодът е точно като Lauren тук приложени. Сега, само за да се получи Малко по-луд, оказва се, че можете да направите това, без да временна променлива. За да направите това правилно, все пак, отиваме да се наложи да мамят с някои химия. Ние имаме някои допълнителни чаши тук. Така че най-близкото нещо, което изглежда като мляко и вода perhaps-- или мляко и OJ-- е имаме някаква вода, така че ние ще се запълни тази напред с няколко унции чиста вода. Това е може би прекалено много. Да. Това определено твърде много. Чакай една секунда. И сега имаме масло, което, доколкото си спомням от средното училище по химия, се надяваме, че не се смесва с вода. Но това вид вид изглежда като мляко и ОВ. Така че сега, без да се използва временна променлива, може ли да сменяте тези две стойности? Така масла отива в чашата за вода, вода отива в чашата масло. LAUREN: Никакви други чаши? DAVID J. Malan: Никакви други чаши. И аз не съм всъщност тестван преди това тази година така че аз не знам дали това ще действително работят химически. Това не трябваше да се случва. Дали това работи? Всичко е наред. Така отделяне? Good. Сега ние трябва да получите вода в другата чаша. Smarter химия концентратори могъл Вероятно направите това по-добре от мен. LAUREN: Водата е на дъното. DAVID J. Malan: The water--, че е това, което е ключово за последен път сме направили това. Вие трябва да го направя в правилния ред. Да. Това е добре. Така че сега ние имаме две чаши масло. ДОБРЕ. Това е добре. Но ако това е работил химически, отколкото I-- LAUREN: Това е вода. DAVID J. Malan: Това е най-вече вода. Всичко е наред. Но това е все същата чаша, както преди. Така се изсипва it-- го пробвам там. ДОБРЕ. Това е едно добро използване на времето клас днес. ДОБРЕ. Така че сега we-- хубаво. Нещо като. Всичко е наред. Така че много добре. Благодаря ви за Lauren. Много добре направено. Така че просто да взривят вашите умове, и това е може би нещо да играе с, ако искате в CS50 ID, можете да, всъщност, суап две променливи без да се използват временно число. И това е съответният C код. И ако си спомняте от миналата Сряда, ние въведохме, ако за кратко, някои нови оператори в C. И прави Някой припомни какво малката моркова символ е, че малко триъгълно символ от клавиатурата представлява? Какво побитови оператора? АУДИТОРИЯ: EXOR. DAVID J. Malan: EXOR. Exclusive Or. Така че, ако искате, просто за забавление в у дома, за да се получи и б две произволно ценности като всеки eight-- и аз ще избере осем битова стойност. Ако направите това с 32 бита, вие много бързо ще се отегчиш. Но просто даде осем битов стойност, която е независимо, едно или две, и да даде б подобна стойност. И след това с помощта на определението от XOR от миналата сряда, прилага, че малко по малко, всеки от тези осем бита във всяка от А и В, и след това да го направя точно на този код. И това не е това, което неправилно можете да видите тук на екрана. Тя наистина се свежда три операции XOR и някак си магически а и б ще обменят позиции без да се губи никаква информация. Така че този трик масло и вода е Най-близкото реалния свят въплъщение Аз можех да мисля за да имитира това. Но това е със сигурност по-лесно да използвате временна променлива, като в този случай тук. И това също е една възможност кажа, също, този вид на микро оптимизация, като компютърен специалист бих казал, докато вид на шега да се хваля за това как си направил това без като размяна с допълнително променлива, това не е всичко, което непреодолими. Защото, за да спаси 32 бита, като в случай на действително междинно съединение, не е всичко, което непреодолими на система, при която възможно е да използвате десетки мегабайта или дори повече, като памет тези дни. И всъщност, когато стигнем за по-късна проблем набор и ти приложи заклинание проверка и ще се изправят пред предизвикателството да направят това с това най-малко RAM и по-малко време е възможно по- можете computer-- още имаме една седмица за изпълнение it-- ще have-- вие ще бъдете справи с минимизиране на тези ресурси. И това е наистина единствената Поводът този семестър където ще бъдат насърчавани да се обръсне изключва, дори най-добрите характеристики струва друго. Така че как можем да what-- виж това в действителния код? Позволете ми давай сега и да се отворят за пример че умишлено се нарича Не Swap, защото това не е така Всъщност сменяте променливите както всъщност може да се очаква. Така че нека да разгледаме. Ето една програма, която не разполага с CS50 библиотека става, просто стандартна I / O. Сега имаме прототип за суап до върха, който току-що означава, че има да се дефинира по-късно. И тук е основната. I произволно определен х и у, съответно, този, ценности и двамата Просто защото те са малки и лесно да си помисля. И тогава аз просто има куп printfs където имам чек здрав разум. х е 1 и Y е 2 е вероятно какви са тези printfs ще кажат. Така че няма магическа до този момент. След това аз ще се регистрирайте с отпечатате дефиниция, смяна точка точка точка. Отивам да се обадя на суапа функция, която преминава в х и у. И нека приемем, че за сега суап се изпълнява точно както е било преди малко с временна променлива. И така, аз твърдя смело, разменят. х сега е това и у сега е, че. Но файла, разбира се, се нарича Не Swap. Така че нека да видим какво се случва в действителност. Ако аз не се съставят за размяна и след това направя ./noswap, х е 1, у е 2. Смяна разменят. х е 1, у е 2. Така че това всъщност изглежда се опорочено още макар swap-- нека да превъртите надолу now-- се изпълнява точно според Код предложих преди малко. Така че ние няма да получите фантазия с XOR неща за сега. Това също трябва да работи като с млякото и ОВ, но тя не изглежда да работи. Така че нека да направим това отново. Може би аз просто не беше го използвате правилно. Така че нека да тичам Не Swap отново. Може би I-- не. Така че просто не работи. Така че нека да направя малко проверка здрав разум. Позволете ми давай тук, в Swap и просто да добавите, чакай малко, а е аз% / п и нека плъг-ин на стойността на един. Защото аз наистина искам за да види какво се случва. И наистина, това е техника за отстраняване на грешки че може да се използва по работно време или в къщи вече, близък до първата половина на Dan Видео Armendariz в PSET3 където ние въведохме печат дефиниция като препоръчителна техника, най-малко за прости случаи. Нека да вървим напред и да тичам направи отново не суап, ./noswap. Интересно. Така че забележите това, което изглежда да е истина. х е 1, Y е 2, а е 2, когато В е 1. Така че тези две някак си разменят но х и у не получават разменят. Така че да е ясно, какво се случва е, тук имам х и у и тези, които са променливи в местните обхват на главната, аз съм преминаване в х и у да сменяте. Сега, суап, като отделна функция, е свободен да се обадите на своите доводи или неговото параметри нещо го иска. Foo или бар или х или у или или б. Просто за да стане ясно, че те са не идентичен на х и у по себе си, Аз съм казвал а и б. Но бихме могли да ги наречем нещо, което искаме. И така тя изглежда като суап се предава x-- AKA A-- и това е да се прехвърлят y-- AKA б. Някак си тези три линии са смяна на тези ценности точно като Lauren направих с млякото и ОВ. Но когато ние разпечатате на ценности, а и б са наистина сменяте но х и ш има никаква промяна към тях. Припомнете си, че х и у са тук. Така че ние можем да видим тази процедура друга техника, както и. И това също е техника вградени в проблем зададете три. Да вървим напред и да направите това в CS50 ID, ако не сте го направили. От страна ще дясна ръка получите този раздел Debugger. И ако отворите тази линия, има някаква тайнствена информация че идва насреща ви първоначално. Но нека да дразни този апарт наистина бързо. Така един, виждате локални променливи. Оказва се, че се изгради в CS50 IDE, и много програмни среди повече Обикновено е за корекция на грешки. Инструмент, който ви позволява да видите визуално какво се случва вътре в програмата си без да се налага да се прибегне до добавяне printfs и съставяне и тичане и добавяне ФОРМАТ и съставяне и бягане, които вече са в работно време или у дома, е вероятно получаване доста досаден. Така че тук, в един момент, ние сме Ще да видите в реално време стойностите на местните ни променливи. Ние също така ще бъде в състояние да определи което се нарича точки на прекъсване, което възможности в моята програма за пауза изпълнение в определен ред код че аз съм любопитен за. Нали така? Тези програми се изпълняват за част от секундата. Това е вид на хубаво за нас, по-бавни хора да бъде в състояние да спре, отделете малко време, вижте това, което се случва около определен ред код без оран на програмата през него и се завърши напълно. Така на точки на прекъсване ще ни позволи да пробие и пауза в определен момент. Call стак е един луксозен начин на казвайки какви функции са в момента се нарича в момента. Main винаги се нарича първото. Но ако Main нарича функция, наречена Swap, ние всъщност ще видите това кула от функции, които са били наречена в обратен хронологичен ред. Така че нека да видим това. Отивам да се отдалечите. Отивам да се върна в моя код. И точно защото искам да бъде педантичен тук, Отивам да вървим напред и да кликнете само от лявата страна на линията пет. И това създава червена точка. И забележи върху отдясно че дебъгер знае, хей, Току-що каза, точка на прекъсване на noswap.c линия пет, специално в този ред код. Така дебъгер знае, че аз са поискали, че следващия път Аз тичам програмата си, тя пауза изпълнение там, а не само използвате цялото нещо супер бързо. Така че сега аз отивам да кликнете за отстраняване на грешки бутон на самия връх на IDE и че ще ходи да направите следното. Това ще открие първоначално донякъде страшно търси втори терминал window-- дистанционно отстраняване на грешки от домакин на такъв и such-- и ние ще се върнем към това, което всичко това означава, че не след дълго. Но това, което е важно за сега е, че тази червена точка е бил ударен, дебъгер умишлено замълча execution-- не на тази линия само по себе си, но на първия линия на действителния код на тази функция. И затова линия седем е Сега оцветена в жълто. А сега нека да разгледаме в дясната страна. Тя изглежда като, по подразбиране, достатъчно добре, х има каква стойност? 0. И у съответства каква стойност? Нула. И това е да се очаква, в смисъл, че х и y-- че жълто line-- има Все още не се изпълнява. Така че х не трябва да имат стойност 1. Тя може да има друга стойност, така наречената стойност боклук. И ние имаме късмет с това, че това е нула в този момент, по същество. Така че сега има само няколко бутони, ние трябва да се грижим за отстраняване на грешки, когато по този начин. Забележете, тук имаме един бутон игра. И ако ние играем или удари възобнови, това е просто Ще преминете през останалата част от програмата или докато не намери друг прекъсване. Но аз не съм избран друг Граничните стойности, така че това е просто ще продължи до края. Този вид поражения на целта на дълго обикаляне. Така че вместо това, което ме интересува тези икони в дясно. И ако аз мишката върху тях, както трябва също ще видите малки tips-- подсказките. Това е една стъпка над. Сега това не означава пропускане следния ред код. Това просто означава, че той изпълнява и преминете към следващия, преминете към следващия, преминете към следващия. С други думи, чрез този бутон, може и да ходя чрез моя код една стъпка в даден момент. Ред по ред, буквално. Сега, в дясно от че има и друг един че ние ще видим в един момент. Това е така наречената Стъпка в икона, която е ще ми даде възможност за гмуркане в друга функция. Но нека видим това в един момент. Така че аз отивам да кликнете прекрача. И сега забележи, като кликна този бутон в горния десен ъгъл, държи грубо очите си под Local Променливи и да видим какво се случва с х. х сега е 1, тъй като на жълта линия вече е изпълнена и ние сме се премества на линия 8. И в един момент у трябва да се надяваме да стане 2. Сега, нищо, че интересно се случва за малко. Всичко това е е ФОРМАТ. И забележи, по мое вторично терминал прозорец, виждам изхода на печат деф. И сега ще трябва да се направи решение като програмист. Мога да прекрача тази линия на код, изпълняващ нея, но не получаване любопитни за какво има вътре. Или всъщност мога да стъпи в него и влезе вътре на самия суап. Така че нека да направим последната. Нека да вървим напред и да кликнете Не Step Over но Step Into. Известие, всички изведнъж Промените на прозорците за да маркирате първата ред код в Swap. Това е линия 21. И сега, какво е вид фънки е, че, ако погледнете тук, както се очаква, запетая б е 1 и 2, съответно. Защо е темп 32767? Припомняйки, че темп, който много прилича празната чаша преди малко, е обявен тук на линия 21. Защо 32,000- Искам да кажа, защо е тя просто някаква странна качество? Да? АУДИТОРИЯ: Това не е инициализиран. DAVID J. Malan: Това е не е инициализиран. Така нашия компютър винаги има физическа памет. Тя винаги има физическа RAM. И винаги има нула в и един е там, нали? Тъй като ние използваме нашия компютъра по цял ден, сте с помощта на CS50 IDE или сървърите през целия ден. Така, че RAM или има някои нули или някой или някои нули и единици. Без значение дали Не можете да започнете да ги използвате. Не може просто да има празно пространства, където искате бита. Те или са нули и единици. Така се оказва, че температурата, защото ние не сме го инициализира, все още, имаме тези 32 бита, но те не съм инициализиран на всички известни стойности. Така че каквото те бяха най- Наскоро използва for-- тези 32 bits-- ние просто се виждат артефакти на някои предишна употреба на тези, специално 32 бита. Веднага след като кликнете Step Over обаче, Пфу, температура ще се получи стойността 1. И ако аз го направя отново, а е Ще бъде дадена стойност 2 и след това б ще се дава стойността 1. И така, какво е хубаво сега в този момент в историята е, че е дебъгер ми показва, супер бавно в моето собствено темпо, това, което състоянието на Swap е. Но забележете в горната тук, известие че стека повикване всъщност има два слоя до него. Сега този, който се изтъква като Swap, ако кликнете върху Main вместо това, забележете как местните променливи се променят защото предприемачът може просто хоп се и отидете в някой различен обхват. Така че, въпреки че правим всичко това работи правилно и смяна а и б, ако отида напред и назад между Swap където а е 2 и б е 1 и Майн, е Main били засегнати изобщо? Не. Така че това, което е храна за вкъщи тук? Е, оказва се, че по всяко време ти се обадя функция като Swap, и ти мине доводите, какво което преминава към функцията Swap в този случай е копие на тези доводи. Така че, ако х и у са всеки съответно 32 бита, това, което става все по-Swap е два нови местно променливи или аргументи, нарича и В-, но тези, които са произволно names-- но моделът на нулите и такива във вътрешността на а и б са наредени да бъде идентичен на х и у Но те не са на едно и също нещо като х и у. Това е така, сякаш Main има на своята част от хартия броят 1 и 2 за х и у, и след това, когато тя ръце, които парче хартия, за да се размени, Swap много бързо получава собствена химикалка, написва 1 и 2 по себе си лист хартия, ръцете назад оригиналния XY да Main и след това прави своя нещо с а и б. И сега това е супер важно, защото това има последици nontrivial за действително написването правилния код защото тя ще изглежда не можем да разменим две променливи. Написал съм вярна функция Swap. Ние сме го реализира с Лорън като правилна функция суап в действителност, но очевидно, че никой от въпроси, ако не можеш действително суап две стойности за постоянно. Така че ние трябва по друг начин да се получи в действителност по това, и ние трябва да сме в състояние да всъщност се реши този проблем. И се оказва out-- и ние ще дойдем обратно към този конкретен картина преди long-- това е един от начините, че може да се направи на паметта на компютъра. Това е просто един правоъгълник. Можете да го направи всеки различни начини, но това е удобно да го направи като правоъгълник, поради следната причина. Отиваме да започне днес и отвъд Говорим за т.нар стека. И стека е просто парче на RAM-- парче memory-- че функции имат достъп да, когато те се наричат. И така се оказва, че най- на самото дъно на този стак е мястото, където всички локални променливи Основни му и орг C и орг V и всички тези неща Ще отида по подразбиране. И ако Main призовава някаква друга функция като Swap, добре, Swap ще се получи друг слой от паметта до над него. И така, само за да ви дам един бърз бегъл картина на това, ако аз отида here-- и нека да отразява това на режийни като well-- това, което наистина имам, ако ние само се грижи за дъното на тази снимка, за сега, е, че когато пуснете програма и Главна получава нарича, Main е дадено парче RAM в компютъра ми, че е в долната част на тази така наречена стек. И аз отивам да го изготви умишлено като квадрат. Така че това е като 32 бита или четири байта. И ако тази основна функция има променлива, наречена х на стойност 1 и има променлива ш със стойността на 2, това е като приемате това късче памет, която Main е дадено от операционната система и тя се раздели така, че първата локална променлива отива тук, вторият се поставя тук, и това е всичко. Когато Main призовава Swap, Swap получава собствен дял от паметта че ще направи като този от операционната система, и то се случва да има свой Собствени локални променливи на нашия изпълнението рано с местните променливи и б че първоначално получите стойностите 1 и 2. Но след това, веднага след като кода за Swap изпълнява, и Lauren всъщност суапове ОВ и мляко, което се случва? Е, този 2 се превръща в едно, това 1 се превръща в 2, и, между другото, има температура променлива, която е в използвана, че целият път, че в крайна сметка отива. Но това няма значение колко много работа, което правите в този ред of-- в това пространство в паметта, х и у са напълно недокоснати. Така че ние трябва по някакъв начин да даде Swap и функции като него тайна достъп, ако щете, да функции like-- в паметта като х и у. Така че нека да разгледаме най- един пример, който помага да видим какво точно е било по- случва целия този път. Отивам да се продължи напред и да се отворят Сравни нула. И аз отивам да затворите нашата дебъгер, аз отивам да закрие тази страшна търси съобщение на просто казва, чакай малко, вие сте в средата отстраняване на грешки. Отивам да се скрие този раздел тук само за да се върнем към простотата. Така че не се притеснявайте, ако GDB е убит. Това просто означава, че програмата има са се откажат, умишлено в този случай, от мен. И сега Сравни Нула прави това. Аз съм с помощта на CS50 библиотека в стандартната I / O. Имам че първата основна функция казва, да кажа нещо, и получава низ. След това го казва отново и получава друг низ. И забележи, че тези две струни се наричат ​​S и Т, съответно. И сега тази програма, направете сравнение Нула, неговата цел в живота, това е трябвало да ми каже, съм написали едно и също нещо? И така, аз се връщам до една седмица. Аз съм с моя равно равно оператор която е оператор на качеството. Не е оператор за присвояване, операторът на половете. Аз съм просто сравнявайки ите и т. Така че нека всъщност вървим напред и да направим това. И аз ще отида напред и да направи сравнение на нула. Отивам да направя ./comparezero. И аз ще отида напред и да каже нещо харесват, нека да направим майка с малки букви и какво ще кажеш за майка с главни букви. И, разбира се объркат различни неща. Всичко е наред. Това е да се очаква. Нека да го стартирате отново. И двата пъти правят малки букви, малки букви. Това изглежда супер идентичен с мен. Enter. ДОБРЕ. Може би това е просто странно, защото това не е хареса ми граматиката. Така че нека да се направи капитал MOM, капитали MOM, идентични. Различни неща. Така че, защо е това? Е, какво всъщност ще за под предния капак тук? Така че нека да се върнем отново тук само за миг и помислете какво GetString е всъщност прави. Когато се обадите GetString, това е функция ние се пише и то някак си получава последователност от символи от страна на потребителя. И нека приемем, че първият време аз наричам GetString, че ми дава парче от паметта, който изглежда така. И ако аз напечатани във всички малки букви м-о-m-- и какво се случва след това? Само един бърз чек здрав разум. Обратно наклонена черта нула. Ние знаем, че. И припомни, че играхме наоколо с името на Zamila и куп други имена когато Роб беше тук търсите в това, което се случва вътре в паметта. Така че тази история е точно същото. Това е, което GetString се връща към мен. Сега, моя код преди малко се съхранява стойността връщане на GetString в променлива S. И след това втори път аз го нарича, то тя се съхранява в променлива т. Така че ако отида тук, имам нужда да изготви този местен variable-- и аз съм като цяло ще изготвят низ като just-- пускаме го наричат ​​s-- като малък площад тук. И сега, somehow-- как майка влезем вътре на тази променлива е? Е, ние трябва да се върнем до първите принципи тук. Какво е GetString всъщност връщане? Така се оказва, че M-O-M наклонена черта нула, и произволен брой на други низове в паметта като Zamila и Роб или Анди или някакви други, са, разбира се, в нашата RAM или памет на компютъра. И вашата RAM има like-- имате концерт на RAM, две участия на RAM, или един милиард или два милиарда байта, или може би дори повече в наши дни. Така че нека да приемем, за днешните цели, че няма значение как сме номер тях, но ние можем да изброи всеки на тези, които милиарда или два милиарда или четири милиарда байта. И нека просто кажем, че произволно това е първата хапка, втора хапка, трети, четвърти. Аз умишлено не съм с нула за днес, но ще се върнем към това. С други думи, ако това е първи път, аз съм с помощта на програмата, Аз съм само за да се късметлия и първият захапка е на място при един след две След това три от четири. И ако аз продължавах рисуване, номера на клетката два милиарда ще бъде начин тук. И така, какво мислиш, а след това, GetString всъщност се връща? Това не е връщане M-O-M наклонена черта нулата само по себе си, защото това очевидно няма да се побере в кутията, която съм изготвен. И така, какво друго да GetString всъщност се връщат отново всички тези седмици? Отговорът е на борда някъде тук. Вие не може да се побере M-O-M наклонена черта нула, И така, какво може да има смисъл, а? Ако трябваше да бъде супер умен, извеждайки на т.нар инженеринг шапка, какво би могло да се върнете? Какво е най-малко количество информация, бихте могли да се върне, че все пак ще ви позволи да намерите M-O-M в паметта? Да? АУДИТОРИЯ: One. DAVID J. Malan: One. И защо един? АУДИТОРИЯ: Защото това ще кажа вие къде да отида [недоловим]. DAVID J. Malan: Точно така. Аз съм просто ще се върне на адреса на низа, че аз съм намерила. Адресът в тази случай е място един. Така че това, което наистина се съхраняват в s-- и всеки низ променлива този начин far-- току-що е бил адрес на тази струна. В същото време, ако аз наричам GetString втори път и аз напишете буквално една и съща thing-- М-O-M с lowercase-- М-О-М и друга наклонена черта нула, и сега може би ми програмата се провежда в продължение на известно време, така че може би това 10 е, това е място 11, това е 12, това е 13. Компютрите, използващи някои други памет, независимо от причината. Какво сега отива в моята втора променлива в програмата ми тон? 10. Точно. И така, когато се вгледаме в изходния код на тази програма когато аз съм просто се опитва за сравнение на две стойности, е е равно равно на тон, което е очевидния човешки отговор? Просто не защото 1 не е равно на 10. И така тук се крие възможност за нас наистина просто да се върнем към, отново, първо принципи и мислим за това, добре, какво се случва под капака на двигателя? Ние сме били говорим за битове и байтове и паметта, но всъщност е полезно да се разбере защото, когато ти се обадя GetString, въпреки че ние мислим за това е връщане на M-O-M или низ майка или Анди или Zamila или подобни, технически това е просто връщане на адрес на това парче от паметта. Но това е ОК. Защото откъде да знам където низ завършва? Ако аз съм само даде началото? Е, наклонената черта нула, нали? Само в линейното време, което мога разпечатате с щампа деф M-O-M. И веднага след като виждам, наклонена черта нула, не ми пука, когато започнах, Аз вече знам имплицитно когато имам нужда да се сложи край. И така, днес се навършват beginning-- и позволете ми да направя това драматично, защото ние премина през много неприятности да получите тези тук обучение wheels-- така че днес джанти за обучение започват да влезе и ние разкрие най least-- [Аплодисменти] Това беше добре си струва пътуването Целева тази сутрин, нали? Така now-- съществува, тя се превръща вън, няма такова нещо като низ. String не съществува. Това е синоним, че сме имали вътрешността на библиотеката CS50. Отсега нататък, ние ще започнем наричайки ите и т не струни, но Чар звезди. И Чар звезда пускаме дразни освен след дълго. Но това е да се каже, че дори и ако продължим използвайки GetString за сега, технически I следва се казва Чар звезда и Чар звезда. И се оказва, че това, което те ще означаваме е нещо нарича указател или адрес. И всъщност, закачка за това, което предстои е това 20 секунди клип от нашата приятел Nick Parlante в Станфорд който преди доста време, прекарват смешна сума от време, като най-добрият мога да кажа в неговата кухня или мазето си, вземане claymation въвеждане на света герой на име Binky, с които ние ще да се въведе следващия път да указатели. Така че тук е преглед на какво ще стане. [Възпроизвеждане на видео] -Hey, Binky. Събудете се. Това е време, за показалеца забавно. -Какво е това? Научете повече за указатели? О, лакомство. [END PLAYBACK] DAVID J. Malan: И на тази бележка, ние ще се видим в сряда. Всичко е наред. Кой е танци? Хайде. Кой е танци? Искаш ли да се е започнало? Аз ще взема да го започна. Woooo! LAUREN: Sweet фантазия Мойсей.