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