1 00:00:00,000 --> 00:00:10,550 2 00:00:10,550 --> 00:00:14,050 >> Девід Дж Малан: Це CS50 і це початок тижня чотири. 3 00:00:14,050 --> 00:00:18,630 І, хлопчик, Volkswagen в Біда все через програмного забезпечення. 4 00:00:18,630 --> 00:00:20,264 Давайте поглянемо. 5 00:00:20,264 --> 00:00:20,930 [ВІДТВОРЕННЯ ВІДЕО] 6 00:00:20,930 --> 00:00:25,560 -автомобілі, Найрозумніші персонажі в Форсаж фільмів. 7 00:00:25,560 --> 00:00:29,100 На цьому тижні німецький автовиробник Volkswagen виявився 8 00:00:29,100 --> 00:00:32,490 в середині скандалу потенційно кримінальні масштаби. 9 00:00:32,490 --> 00:00:36,060 >> -Volkswagen Готується мільярди штрафів, можливі кримінальні звинувачення 10 00:00:36,060 --> 00:00:38,560 для її керівників, а Компанія приносить свої вибачення 11 00:00:38,560 --> 00:00:41,840 за фальсифікацію 11000000 автомобілів в допомогти йому перемогти тести викидів. 12 00:00:41,840 --> 00:00:44,950 >> -Certain Дизельні моделі були розроблений з складне програмне забезпечення 13 00:00:44,950 --> 00:00:48,440 що б інформація в тому числі положення керма і автомобіль 14 00:00:48,440 --> 00:00:51,870 прискорити, щоб визначити, що автомобіль був проходить тестування викидів. 15 00:00:51,870 --> 00:00:55,650 Під цією обставиною, двигун дозволить знизити викиди токсичних речовин. 16 00:00:55,650 --> 00:00:59,070 Але машина була оснащена обійти що, коли він був женуть. 17 00:00:59,070 --> 00:01:03,320 Викиди збільшилися від 10 до 40 разів вище допустимих рівнів EPA. 18 00:01:03,320 --> 00:01:04,280 >> [КІНЕЦЬ ПЕРЕГЛЯДУ] 19 00:01:04,280 --> 00:01:05,220 >> Девід Дж Малан: Так давайте погляньте на це 20 00:01:05,220 --> 00:01:07,250 і подивитися, як саме це може бути реалізована 21 00:01:07,250 --> 00:01:09,680 і як це може вплинути на так багато машин, як це. 22 00:01:09,680 --> 00:01:12,840 Таким чином, в моїй руці ось прес- реліз, який був випущений в EPA-- 23 00:01:12,840 --> 00:01:14,620 Екологічний Агентство з охорони, які 24 00:01:14,620 --> 00:01:18,032 це регулюючий орган США, що ручки екологічних проблем, 25 00:01:18,032 --> 00:01:19,740 і потім фактичний офіційне повідомлення, що було 26 00:01:19,740 --> 00:01:22,420 відправити Volkswagen всього кілька днів тому. 27 00:01:22,420 --> 00:01:26,530 >> Таким чином, з охорони навколишнього середовища, пише, і в даний час розкриває публічно, складні програмне забезпечення 28 00:01:26,530 --> 00:01:29,390 Алгоритм на деяких Автомобілі Volkswagen виявляє 29 00:01:29,390 --> 00:01:32,630 коли автомобіль проходить Тестування офіційні викиди 30 00:01:32,630 --> 00:01:36,505 і перетворюється повні викидів контролює тільки під час тесту. 31 00:01:36,505 --> 00:01:38,380 Ефективність Ці транспортні засоби забруднення 32 00:01:38,380 --> 00:01:43,260 Пристрої управління викиди сильно знижується у всіх нормальних водіння 33 00:01:43,260 --> 00:01:44,320 ситуації. 34 00:01:44,320 --> 00:01:48,190 Це призводить в автомобілях, що задовольняє як Стандарти в лабораторії тестування або 35 00:01:48,190 --> 00:01:52,790 станція, але під час нормальної роботи випромінюють oxides-- азоту або NOx-- 36 00:01:52,790 --> 00:01:54,950 зі швидкістю до 40 разів стандарт. 37 00:01:54,950 --> 00:01:58,220 Програмне забезпечення виробництва Volkswagen цитата кінець цитати, поразка пристрої, 38 00:01:58,220 --> 00:02:00,650 як визначено чистого Закон Повітря в США. 39 00:02:00,650 --> 00:02:03,410 >> Вони йдуть на кажуть, що з охорони навколишнього середовища і інше агентство 40 00:02:03,410 --> 00:02:07,020 розкрили поразку пристрої Програмне забезпечення після незалежного аналізу 41 00:02:07,020 --> 00:02:09,660 дослідниками Заходу Університет Вірджинії. 42 00:02:09,660 --> 00:02:14,160 Забруднення NOx сприяє діоксид азоту, приземного озону, 43 00:02:14,160 --> 00:02:15,700 і дрібних частинок справу. 44 00:02:15,700 --> 00:02:18,090 Вплив цих забруднювачі була пов'язана 45 00:02:18,090 --> 00:02:20,870 з широким діапазоном серйозні наслідки для здоров'я, 46 00:02:20,870 --> 00:02:23,637 в тому числі підвищеної астми атаки та інші респіраторні 47 00:02:23,637 --> 00:02:26,470 хвороби, які можуть бути досить серйозними, відправити людей до лікарні. 48 00:02:26,470 --> 00:02:28,660 Вплив озону і твердих частинок також має 49 00:02:28,660 --> 00:02:31,960 були пов'язані з передчасним смерть через дихання, пов'язані 50 00:02:31,960 --> 00:02:35,690 або серцево-судинних ефектів. 51 00:02:35,690 --> 00:02:38,940 Діти, літні люди, люди з існували раніше респіраторні захворювання 52 00:02:38,940 --> 00:02:42,840 особливо схильні до ризику наслідки для здоров'я цих забруднювачів. 53 00:02:42,840 --> 00:02:45,056 >> Досить сказати, це досить серйозно. 54 00:02:45,056 --> 00:02:46,930 І давайте на читати ще один уривок 55 00:02:46,930 --> 00:02:49,370 і тоді ми будемо дивитися на основні наслідки 56 00:02:49,370 --> 00:02:50,920 це в контексті машині. 57 00:02:50,920 --> 00:02:53,730 Зокрема, Volkswagen виготовлені і встановлені 58 00:02:53,730 --> 00:02:56,210 Програмне забезпечення в так званий електронне управління 59 00:02:56,210 --> 00:02:59,320 module-- або ECM-- з ці транспортні засоби, які зондування 60 00:02:59,320 --> 00:03:03,580 коли транспортний засіб був випробуваний для дотримання норм викидів EPA. 61 00:03:03,580 --> 00:03:07,510 Грунтуючись на різних входів у тому числі Положення рульового колеса, автомобіль 62 00:03:07,510 --> 00:03:11,280 Швидкість, тривалість двигуна експлуатація та барометричного тиску, 63 00:03:11,280 --> 00:03:13,720 ці входи точно відслідковуються параметри 64 00:03:13,720 --> 00:03:17,600 федерального процедури випробування, використовуваного для Тестування викидів для сертифікації EPA 65 00:03:17,600 --> 00:03:18,400 цілей. 66 00:03:18,400 --> 00:03:21,850 >> Під час тестування викидів ЕРА, програмне забезпечення транспортних засобів ECM 67 00:03:21,850 --> 00:03:25,060 побіг програмне забезпечення, яке виробляється Результати сумісні викидів. 68 00:03:25,060 --> 00:03:28,340 На всіх інших випадках, автомобіль ECM програмне забезпечення 69 00:03:28,340 --> 00:03:31,090 побіг окремий дорогу Калібрування що знизило 70 00:03:31,090 --> 00:03:34,360 Ефективність роботи Загальна система контролю за викидами, 71 00:03:34,360 --> 00:03:37,864 зокрема, селективного каталітичного зниження NOx Lean trap-- 72 00:03:37,864 --> 00:03:39,280 який ми побачимо через мить. 73 00:03:39,280 --> 00:03:43,040 В результаті, викиди NOx збільшена з коефіцієнтом 10 до 40 разів 74 00:03:43,040 --> 00:03:47,450 вище рівня, відповідних EPA Залежно від типу приводу циклу. 75 00:03:47,450 --> 00:03:50,800 >> Так що ж це насправді означає, і Вихідний код програмного забезпечення працюючому 76 00:03:50,800 --> 00:03:53,190 на Volkswagen має не ще були публічно розкриті, 77 00:03:53,190 --> 00:03:56,460 є те, що, фактично, це еквівалентно десь там всередині 78 00:03:56,460 --> 00:03:57,830 коду Фольксвагена. 79 00:03:57,830 --> 00:04:02,200 Якщо ви проходять випробування, і якщо автомобіль виявляє певні екологічні фактори 80 00:04:02,200 --> 00:04:04,330 як рульове колесо положення або рух 81 00:04:04,330 --> 00:04:06,710 або її відсутність в машині або будь-яку кількість інших факторів 82 00:04:06,710 --> 00:04:09,940 які в даний час гіпотеза щоб бути частиною цієї формули, 83 00:04:09,940 --> 00:04:12,370 вони просто включите Повний контроль викидів. 84 00:04:12,370 --> 00:04:15,670 Іншими словами, вони починають випромінюючі менше забруднюючих речовин. 85 00:04:15,670 --> 00:04:18,769 >> В іншому випадку, в будь-який інший ситуації коли він не виявлений як 86 00:04:18,769 --> 00:04:20,790 в лабораторії, вони просто не роблять. 87 00:04:20,790 --> 00:04:24,320 І так можна спростити це в більш бетон псевдокод з чимось 88 00:04:24,320 --> 00:04:24,820 подобається це. 89 00:04:24,820 --> 00:04:27,810 Якщо колеса повертаються, але кермо немає, наводить на думку 90 00:04:27,810 --> 00:04:30,060 що автомобіль знаходиться на деякі вид обертового циліндра 91 00:04:30,060 --> 00:04:32,550 але в якійсь склад проходять випробування, 92 00:04:32,550 --> 00:04:36,070 те, як поводяться EPA хочу, щоб ви. 93 00:04:36,070 --> 00:04:37,960 В іншому випадку немає. 94 00:04:37,960 --> 00:04:40,420 Отже, давайте поглянемо на короткому відео, 95 00:04:40,420 --> 00:04:45,391 дивиться на те, що наслідки мають це насправді механічно. 96 00:04:45,391 --> 00:04:48,620 >> [ВІДТВОРЕННЯ ВІДЕО] 97 00:04:48,620 --> 00:04:52,800 >> -за П'ятницю з охорони навколишнього середовища оголосило, що деякі Автомобілі Volkswagen Audi між 2009 98 00:04:52,800 --> 00:04:55,840 і в цьому році були за допомогою так званий поразку пристрій 99 00:04:55,840 --> 00:04:59,060 щоб обійти закони викидів призначений для підтримки чистоти повітря. 100 00:04:59,060 --> 00:05:01,700 Але що це означає? 101 00:05:01,700 --> 00:05:04,666 >> Ну, сучасні автомобілі мають десятки комп'ютерів всередині них. 102 00:05:04,666 --> 00:05:07,040 І деякі з цих комп'ютерів допомогти координувати функції 103 00:05:07,040 --> 00:05:09,590 двигуна для оптимальної продуктивність, переконавшись, 104 00:05:09,590 --> 00:05:12,340 що є не надто багато сміття виходить з вихлопної труби. 105 00:05:12,340 --> 00:05:15,170 Вони насправді працює Таким чином протягом декількох десятиліть. 106 00:05:15,170 --> 00:05:17,380 В принципі, кожна частина двигуна сучасного автомобіля 107 00:05:17,380 --> 00:05:20,080 має датчик або контролер на ньому, і ці комп'ютери 108 00:05:20,080 --> 00:05:23,460 читають в даних тисячі раз в секунду коригування чаю 109 00:05:23,460 --> 00:05:26,220 як відношення палива до повітря що відбувається в циліндри. 110 00:05:26,220 --> 00:05:28,730 >> Вони обманюють Volkswagen і Audi моделей дизелів, 111 00:05:28,730 --> 00:05:30,890 і дизелі мають ще один дійсно важлива комп'ютерна 112 00:05:30,890 --> 00:05:34,030 контрольовані параметри, що є кількість незгорілого палива відбувається 113 00:05:34,030 --> 00:05:35,200 в вихлоп. 114 00:05:35,200 --> 00:05:36,310 Тепер це звучить погано. 115 00:05:36,310 --> 00:05:39,642 Не звучить, як ви хотіли б, незгорілого палива відбувається в вихлоп. 116 00:05:39,642 --> 00:05:41,600 Але у разі включення дизель, у вас є що 117 00:05:41,600 --> 00:05:46,110 називаються пастка NOx, який є пристроєм, який поглинає і пастки для оксидів азоту 118 00:05:46,110 --> 00:05:48,880 що забруднюючі речовини, які в іншому випадку перейти в атмосферу. 119 00:05:48,880 --> 00:05:53,040 І ефект від цього NOx пастку посилюється з незгорілого палива. 120 00:05:53,040 --> 00:05:56,650 Таким чином, поразка пристрій є спеціальна програма всередині цих комп'ютерів, які можуть зробити це 121 00:05:56,650 --> 00:05:59,527 виглядати автомобіль відповідає випромінювання стандарти, навіть якщо він цього не робить. 122 00:05:59,527 --> 00:06:01,110 Volkswagen були проблеми на своїх руках. 123 00:06:01,110 --> 00:06:04,050 Його дизельні двигуни були відомі для отримання велику економію палива, 124 00:06:04,050 --> 00:06:07,510 але пастка NOx добре працює тільки коли більше палива використовується. 125 00:06:07,510 --> 00:06:10,460 Таким чином, автомобіль буде виявити, за допомогою цього пристрою поразку, 126 00:06:10,460 --> 00:06:13,870 коли він був отримувати викиди Тест, він буде використовувати більше палива, 127 00:06:13,870 --> 00:06:16,830 зробити пастки роботу NOx також, викиди буде в порядку. 128 00:06:16,830 --> 00:06:21,130 Але тоді ви отримаєте на дорозі, пристрій вимикається, ви спалювання меншої кількості палива 129 00:06:21,130 --> 00:06:24,256 але ви покладете стільки, скільки 40 раз більше забруднюючих речовин в атмосферу. 130 00:06:24,256 --> 00:06:26,130 Але як, чорт візьми автомобіль знаю, що це було 131 00:06:26,130 --> 00:06:27,720 випробовується на відповідність викидів? 132 00:06:27,720 --> 00:06:30,590 ЕРА каже, що це був складний система, яка перевіряється речі 133 00:06:30,590 --> 00:06:34,090 як керма, Швидкість, як довго двигун був включений, 134 00:06:34,090 --> 00:06:35,507 і навіть атмосферний тиск. 135 00:06:35,507 --> 00:06:37,673 Іншими словами, було немає спосіб це не було випадковим 136 00:06:37,673 --> 00:06:40,260 тому що програмне забезпечення було призначений дуже ретельно, щоб виявити 137 00:06:40,260 --> 00:06:41,630 офіційний сажотруса. 138 00:06:41,630 --> 00:06:43,588 Ось деякі досить серйозні обман і це 139 00:06:43,588 --> 00:06:45,420 чому Volkswagen в такі серйозні неприємності. 140 00:06:45,420 --> 00:06:48,600 Насправді, їх генеральний директор, Мартін Вінтеркорн, тільки зійшов. 141 00:06:48,600 --> 00:06:49,820 >> Так що ж відбувається далі? 142 00:06:49,820 --> 00:06:53,900 Ну, якщо ви один з півтора мільйонів дизельні Jettas, Бітлз, Гольфи, Пасати, 143 00:06:53,900 --> 00:06:56,220 або Audi A3s здійснюється, хороші новини є 144 00:06:56,220 --> 00:06:57,886 що ваш автомобіль як і раніше безпечно їздити. 145 00:06:57,886 --> 00:07:00,510 Ви не повинні покласти його геть до Volkswagen не видає відгук. 146 00:07:00,510 --> 00:07:02,509 Але в якийсь момент вони ймовірно, доведеться 147 00:07:02,509 --> 00:07:04,230 оновити програмне забезпечення всередині вашого автомобіля. 148 00:07:04,230 --> 00:07:06,927 Коли це станеться, ви могли б отримувати менше миль в баку. 149 00:07:06,927 --> 00:07:09,260 Адвокати вже готується на позовів 150 00:07:09,260 --> 00:07:12,500 Таким чином, власники, можливо, отримати компенсацію в якийсь момент в майбутньому. 151 00:07:12,500 --> 00:07:15,832 Але це не збирається відбудеться найближчим часом. 152 00:07:15,832 --> 00:07:16,711 >> [КІНЕЦЬ ПЕРЕГЛЯДУ] 153 00:07:16,711 --> 00:07:19,960 Девід Дж Малан: Так це насправді піднімає цікава картина питання більше 154 00:07:19,960 --> 00:07:20,660 а довіряти. 155 00:07:20,660 --> 00:07:21,160 Вірно? 156 00:07:21,160 --> 00:07:24,300 У всіх нас є айфонів або Андроїд або щось у наших кишенях, швидше за все, 157 00:07:24,300 --> 00:07:26,500 в ці дні, або ноутбуки на наших колінах, які 158 00:07:26,500 --> 00:07:28,510 працює програмне забезпечення зробив Яблуком і Microsoft 159 00:07:28,510 --> 00:07:30,710 і грона інших компаній. 160 00:07:30,710 --> 00:07:34,240 Але як ми знаємо, що те, що Ці програмні продукти роблять 161 00:07:34,240 --> 00:07:37,680 насправді, що це компанії говорять, що вони роблять? 162 00:07:37,680 --> 00:07:39,610 >> Наприклад, хто повинен сказати, що кожен раз, коли ви 163 00:07:39,610 --> 00:07:42,200 зробити телефонний дзвінок на ваш iPhone або Android-телефон або т.п., 164 00:07:42,200 --> 00:07:45,650 що це номер телефону теж не завантажується на сервер якої-небудь компанії 165 00:07:45,650 --> 00:07:48,399 через деякі програмі ви маєте написав, будь то операційна 166 00:07:48,399 --> 00:07:51,070 Сама система, як прошивкою або Android, або тому, що ви завантажили 167 00:07:51,070 --> 00:07:53,880 деякі програми третіх сторін щось слухає 168 00:07:53,880 --> 00:07:57,120 щоб всі ви друкуєте або все, що ви насправді говорять. 169 00:07:57,120 --> 00:07:59,500 Як ви знаєте, що, коли ви, хлопці, працюєте Clang 170 00:07:59,500 --> 00:08:02,590 або зробити, щоб скомпілювати власне програмне забезпечення в CS50, як 171 00:08:02,590 --> 00:08:06,080 У вас є персонал, який CS50, в шляхом бібліотеці CS50, 172 00:08:06,080 --> 00:08:08,690 не було входу кожен рядок, яку ви коли-небудь отримували 173 00:08:08,690 --> 00:08:10,276 або кожен дюйм ви коли-небудь отримували? 174 00:08:10,276 --> 00:08:12,900 Ну, ви, безумовно, може виглядати у вихідному коді щось 175 00:08:12,900 --> 00:08:15,233 як бібліотеки CS50, ви міг дивитися на вихідний код 176 00:08:15,233 --> 00:08:18,170 для операційної системи Linux працює на CS50 IDE. 177 00:08:18,170 --> 00:08:23,090 Але дивна вистава було дано в 1984 році 178 00:08:23,090 --> 00:08:26,730 в отриманні премії Тьюринга на а дуже відомий учений відомий 179 00:08:26,730 --> 00:08:29,750 as-- імені Кен Томпсон, який отримав премію Тьюринга, яка 180 00:08:29,750 --> 00:08:33,500 є свого роду комп'ютер Науки Нобелівська премія, якщо хочете, 181 00:08:33,500 --> 00:08:35,309 за роботу по Операційна система називається 182 00:08:35,309 --> 00:08:39,039 Unix, який дуже схожий на дух, що ми використовуємо, який є Linux. 183 00:08:39,039 --> 00:08:41,960 І питання запитав він його прийняття мова, по суті, 184 00:08:41,960 --> 00:08:44,910 встановлює рамки для роки і роки обговорення 185 00:08:44,910 --> 00:08:46,970 про довіру і безпеку, це було. 186 00:08:46,970 --> 00:08:50,410 Якою мірою одним довіряти Твердження, що program-- шматок 187 00:08:50,410 --> 00:08:53,010 з software-- безкоштовно троянських коней? 188 00:08:53,010 --> 00:08:56,500 Може бути, це більш важливо довіряти люди, які написали програмне забезпечення. 189 00:08:56,500 --> 00:08:58,650 >> І справді, ми пов'язані до розмови, що він 190 00:08:58,650 --> 00:09:02,400 дав, приймаючи цю нагороду в 80-х на сайті CS50 в 191 00:09:02,400 --> 00:09:04,030 під стр лекції на сьогоднішній день. 192 00:09:04,030 --> 00:09:06,071 Тому що те, що ви побачите є те, що він насправді дає 193 00:09:06,071 --> 00:09:09,430 досить простий приклад того, як навіть компілятор Clang, як або що 194 00:09:09,430 --> 00:09:13,950 компілятори інші, які використовуються в минулому, що, якщо вбудовані в компілятора 195 00:09:13,950 --> 00:09:18,190 самі використовуєте мало, якщо стан, який по суті говорить, 196 00:09:18,190 --> 00:09:22,360 якщо ви помітили, що цей код використовує функція GetString або GetInt 197 00:09:22,360 --> 00:09:26,600 Функція, йти вперед і вставте задні двері або троянський кінь 198 00:09:26,600 --> 00:09:29,340 наприклад, що ця програма в даний час має деякі нулі 199 00:09:29,340 --> 00:09:30,930 і ті, які роблять щось шкідливе. 200 00:09:30,930 --> 00:09:33,080 Вхід всі ваші натиснення клавіш, завантаження цих даних 201 00:09:33,080 --> 00:09:35,100 в якийсь сервер, або дійсно що-небудь. 202 00:09:35,100 --> 00:09:37,290 >> І те, що Кен Томпсон йде на зробити в бесіді 203 00:09:37,290 --> 00:09:40,580 щоб продемонструвати, що навіть якщо у вас є доступ до джерела 204 00:09:40,580 --> 00:09:43,794 код компілятора, який злісно може робити це, 205 00:09:43,794 --> 00:09:46,210 це не має значення, тому що Тобто ця курка і яйце 206 00:09:46,210 --> 00:09:49,500 Реальність минулому багато років в результаті чого укладачі 207 00:09:49,500 --> 00:09:51,960 використовуються для компіляції самих себе. 208 00:09:51,960 --> 00:09:55,440 Іншими словами, шлях назад, коли хтось довелося б написати перший компілятор. 209 00:09:55,440 --> 00:09:59,060 І після цього, в будь-який час вони оновлюються компілятор, змінивши початковий код, 210 00:09:59,060 --> 00:10:02,020 додаючи нові можливості та перекомпіляції для людей на зразок нас, щоб використовувати, ну, 211 00:10:02,020 --> 00:10:04,270 вони використовують старий версія компілятором 212 00:10:04,270 --> 00:10:06,370 зібрати новий версія компілятора. 213 00:10:06,370 --> 00:10:08,370 І якщо ви подивитеся на розмови, що він дав, 214 00:10:08,370 --> 00:10:10,970 ви побачите, що через цієї округлості, 215 00:10:10,970 --> 00:10:14,330 Ви можете насправді мають помилки або Троянські коні вбудований в програмне забезпечення 216 00:10:14,330 --> 00:10:14,990 ми використовуємо. 217 00:10:14,990 --> 00:10:18,010 І навіть якщо ви подивіться на Вихідний код для цих програм, 218 00:10:18,010 --> 00:10:21,550 вона не може бути навіть видно бо обман насправді 219 00:10:21,550 --> 00:10:24,710 в якійсь старій версії компілятор, який з тих пір був 220 00:10:24,710 --> 00:10:27,340 ін'єкційних загрозу в нашому програмному забезпеченні. 221 00:10:27,340 --> 00:10:29,740 >> Які тільки говорити, що ми дійсно не може і не повинен 222 00:10:29,740 --> 00:10:32,939 довіру програмне забезпечення працює на наших ноутбуках або телефони або будь-яку кількість місць. 223 00:10:32,939 --> 00:10:36,230 І справді, пізніше в цьому семестрі, коли ми починаємо говорити про веб-програмуванні 224 00:10:36,230 --> 00:10:38,521 а насправді почати будувати веб-додатки, самостійно виходити 225 00:10:38,521 --> 00:10:40,285 ми поговоримо про них загрози та ін. 226 00:10:40,285 --> 00:10:43,410 Тепер ви, напевно, задавалися і зауважив, що було крихітне Дарт 227 00:10:43,410 --> 00:10:45,842 Вейдер в кліпах, що Грань показував там 228 00:10:45,842 --> 00:10:47,550 про Volkswagen. Якщо Ви ніколи не бачили, я 229 00:10:47,550 --> 00:10:49,190 думав, що ми повинні полегшити настрій, тому що це все 230 00:10:49,190 --> 00:10:50,780 дуже пригнічує і лякає. 231 00:10:50,780 --> 00:10:52,910 Я збираюся озиратися назад на Super Bowl 2011 232 00:10:52,910 --> 00:10:55,300 коли комерційна по Volkswagen-- і це 233 00:10:55,300 --> 00:10:59,620 майже робить їх симпатичним again-- ефір вперше на телебаченні. 234 00:10:59,620 --> 00:11:04,039 Це другий зажим 60 Я думаю, що ви будете насолоджуватися. 235 00:11:04,039 --> 00:11:04,705 [ВІДТВОРЕННЯ ВІДЕО] 236 00:11:04,705 --> 00:11:08,198 [МУЗИКА - тема з "Зоряних воєн"] 237 00:11:08,198 --> 00:11:35,643 238 00:11:35,643 --> 00:11:38,138 [Собака гавкає] 239 00:11:38,138 --> 00:11:50,114 240 00:11:50,114 --> 00:11:53,607 [Машина починає] 241 00:11:53,607 --> 00:12:04,086 242 00:12:04,086 --> 00:12:05,955 [КІНЕЦЬ ПЕРЕГЛЯДУ] 243 00:12:05,955 --> 00:12:06,830 Девід Дж Малан: Так. 244 00:12:06,830 --> 00:12:07,663 Я просто перевіряв. 245 00:12:07,663 --> 00:12:11,360 Цей автомобіль знаходиться в списку порушень. 246 00:12:11,360 --> 00:12:12,000 Добре. 247 00:12:12,000 --> 00:12:14,040 Таким чином, ми розглянемо деякі Псевдокод хвилину тому. 248 00:12:14,040 --> 00:12:15,380 А ось більше фрагмент псевдокоду коду 249 00:12:15,380 --> 00:12:16,921 що ми бачили кілька разів досі. 250 00:12:16,921 --> 00:12:19,970 І давайте використовувати це можливість Тепер, щоб ввести нові програми 251 00:12:19,970 --> 00:12:23,776 метод, який ми зробили см алгоритмічно 252 00:12:23,776 --> 00:12:25,400 минулого тижня, коли ми дивилися на сортування злиттям. 253 00:12:25,400 --> 00:12:28,270 Але давайте формалізувати його і подивитися, як ми могли б використовувати його в реальний код, 254 00:12:28,270 --> 00:12:30,350 а потім ми збираємося використовувати це Техніка по дорозі найбільш 255 00:12:30,350 --> 00:12:32,000 ймовірно, щоб вирішити певні інші проблеми. 256 00:12:32,000 --> 00:12:35,790 >> Так що це був один з перших програм, які ми небудь писав, хоча і в псевдокоду коду. 257 00:12:35,790 --> 00:12:37,790 І те, що ця програма дозволило нам зробити курс 258 00:12:37,790 --> 00:12:41,510 було знайти Mike Smith в телефонній книзі. 259 00:12:41,510 --> 00:12:46,216 І зверніть увагу, зокрема ліній восьмій і 11, які були цю заяву Go To. 260 00:12:46,216 --> 00:12:48,090 І справді, деякі мови, С серед них, 261 00:12:48,090 --> 00:12:50,006 насправді є Твердження, що буквально 262 00:12:50,006 --> 00:12:52,710 перейти до того, що дозволяє перейти до певної рядку. 263 00:12:52,710 --> 00:12:55,470 Це правило, з несхваленням, оскільки це може бути дуже легко зловживати 264 00:12:55,470 --> 00:12:58,490 і ви можете почати стрибати вашого Програма всюди, на відміну 265 00:12:58,490 --> 00:13:00,690 до використання такої логіка і потік управління 266 00:13:00,690 --> 00:13:04,000 що ми використовували досі тільки з Петлі і умови тощо. 267 00:13:04,000 --> 00:13:08,660 >> Але ми можемо спростити цей алгоритм в псевдокоду коду наступним чином. 268 00:13:08,660 --> 00:13:11,250 Замість цього ітеративного або цикл підхід 269 00:13:11,250 --> 00:13:14,160 де ми весь час повертаюся і назад і повернутися до лінії зо три, 270 00:13:14,160 --> 00:13:18,300 чому ми не просто вид Пунт і більше як правило, говорять, відповідно сім і 10, 271 00:13:18,300 --> 00:13:20,570 просто замінити ці два пар ліній с, 272 00:13:20,570 --> 00:13:22,810 інакше, якщо Сміт раніше в книзі ми будемо 273 00:13:22,810 --> 00:13:25,110 шукати Майка в ліва половина книги. 274 00:13:25,110 --> 00:13:28,560 Інакше, якщо Сміт пізніше в Книга, пошук Майка в праві 275 00:13:28,560 --> 00:13:29,540 половина книги. 276 00:13:29,540 --> 00:13:31,180 І зауважте, вже округлості. 277 00:13:31,180 --> 00:13:31,680 Вірно? 278 00:13:31,680 --> 00:13:34,250 Я шукаю Майка в телефонна книга, а потім 279 00:13:34,250 --> 00:13:37,090 Зрештою я потрапив, може бути, Лінія сім чи, може бути рядок 10 280 00:13:37,090 --> 00:13:41,089 і моя інструкція собі це пошук Майка в половині телефонній книзі. 281 00:13:41,089 --> 00:13:42,380 Ну, як мені знайти Майка? 282 00:13:42,380 --> 00:13:44,213 Я в середині пошук Майка, чому 283 00:13:44,213 --> 00:13:45,860 ви зразок відправки мене в коло? 284 00:13:45,860 --> 00:13:49,590 Але це нормально, тому що те, що відбувається з розміром проблеми, 285 00:13:49,590 --> 00:13:52,630 як написано в рядку 7 і 10? 286 00:13:52,630 --> 00:13:54,989 Ми не просто говорю пошуку Майка, шукати Майка. 287 00:13:54,989 --> 00:13:56,280 Ми спеціально кажу, що? 288 00:13:56,280 --> 00:13:58,694 289 00:13:58,694 --> 00:14:01,610 Пошук для нього в лівій половині права половина якого ефективно 290 00:14:01,610 --> 00:14:03,440 половина розмір проблеми. 291 00:14:03,440 --> 00:14:07,170 Так що це нормально, що ми начебто Беручи участь в цьому округлості, 292 00:14:07,170 --> 00:14:09,180 це порочне коло, бо, принаймні, ми 293 00:14:09,180 --> 00:14:11,090 що робить проблему все менше і менше. 294 00:14:11,090 --> 00:14:14,220 І врешті-решт ми збираємося досягти що так звана база випадок, коли 295 00:14:14,220 --> 00:14:16,780 у нас є тільки одна сторінка left-- як наш волонтер минулого тижня 296 00:14:16,780 --> 00:14:18,684 did-- ми мали одну сторінку наліво, а потім ми не 297 00:14:18,684 --> 00:14:21,600 повинні продовжувати шукати Майк Сміт бо він або на цій сторінці 298 00:14:21,600 --> 00:14:23,080 або він не є. 299 00:14:23,080 --> 00:14:27,480 >> Так як ми можемо реалізувати цю ідею, це Сортувати округлості в реальний код? 300 00:14:27,480 --> 00:14:31,030 Ну, ми можемо використовувати метод який зазвичай називають рекурсією. 301 00:14:31,030 --> 00:14:33,960 І ми бачили це в псевдокод для сортування злиттям минулого тижня. 302 00:14:33,960 --> 00:14:37,190 Нагадаємо, що це був псевдокод для сортування злиттям. 303 00:14:37,190 --> 00:14:40,560 Це можливо навіть простіше, ніж міхур вибір або вставки роду 304 00:14:40,560 --> 00:14:43,310 тільки з точки зору простоти за допомогою якого можна виразити це. 305 00:14:43,310 --> 00:14:46,750 >> Але це тому, що Ми начебто кругової 306 00:14:46,750 --> 00:14:51,350 кажучи, шукати щось шукаючи його знову. 307 00:14:51,350 --> 00:14:53,960 Але ми шукаємо або на ліва половина або права половина 308 00:14:53,960 --> 00:14:56,070 і потім в кінцевому рахунку ми злиття в цьому випадку. 309 00:14:56,070 --> 00:14:58,520 Але тут, також, з ці два сортування лінії, 310 00:14:58,520 --> 00:15:01,320 ж ми знову це Ідея рекурсії. 311 00:15:01,320 --> 00:15:05,350 І конкретно це означає, що, в контексті алгоритму, 312 00:15:05,350 --> 00:15:10,880 є те, що алгоритм є рекурсивним якщо він використовує або називає себе. 313 00:15:10,880 --> 00:15:14,330 >> Або з погляду C, функція є recursive-- функцію під назвою 314 00:15:14,330 --> 00:15:18,510 Foo є рекурсивної, якщо Foo, десь в його вихідному коді, 315 00:15:18,510 --> 00:15:21,250 викликає сама функція Foo. 316 00:15:21,250 --> 00:15:25,790 І це погано, якщо все Foo-небудь робить це називати себе знову і знову. 317 00:15:25,790 --> 00:15:30,600 Це нормально, якщо Foo зрештою зупиняється, як це робить сортування злиттям, кажучи, постривай, 318 00:15:30,600 --> 00:15:32,980 Якщо ця проблема супер Невеликий, наприклад, 319 00:15:32,980 --> 00:15:35,840 або я знайшла того, якого я шукаю, просто повернути. 320 00:15:35,840 --> 00:15:41,000 Чи не рекурсивно, що не циклічно називати себе знову. 321 00:15:41,000 --> 00:15:44,200 >> І так давайте поглянемо на як це може насправді працюють. 322 00:15:44,200 --> 00:15:48,430 Так що я збираюся йти вперед і відкритим до двох прикладах вихідного коду тут. 323 00:15:48,430 --> 00:15:50,321 Один з яких називають сигма 0. 324 00:15:50,321 --> 00:15:52,320 І це зовсім не рекурсивна, але давайте 325 00:15:52,320 --> 00:15:53,694 Погляд на те, що ця програма робить. 326 00:15:53,694 --> 00:15:55,737 Я розділи всі коментарі від нього, але все 327 00:15:55,737 --> 00:15:58,070 вихідного коду на CS50-х Сайт має коментарі, якщо ви 328 00:15:58,070 --> 00:15:59,570 хочу, щоб прочитати це пізніше. 329 00:15:59,570 --> 00:16:02,010 І давайте зробимо пару розсудливості перевіряє тут. 330 00:16:02,010 --> 00:16:06,640 >> Таким чином, у верхній частині цього коду, у нас є включати CS50.h. 331 00:16:06,640 --> 00:16:07,650 Що це робити? 332 00:16:07,650 --> 00:16:08,990 Чому це тут? 333 00:16:08,990 --> 00:16:11,740 В умовах розумні непрофесіонала. 334 00:16:11,740 --> 00:16:12,424 Що це робить? 335 00:16:12,424 --> 00:16:12,858 Так. 336 00:16:12,858 --> 00:16:14,160 >> АУДИТОРІЯ: Так що функція GetInt працює. 337 00:16:14,160 --> 00:16:16,243 >> Девід Дж Малан: Так що функція GetInt працює. 338 00:16:16,243 --> 00:16:18,115 Через це всередині Файл, CS50.h, що 339 00:16:18,115 --> 00:16:20,950 ми побачимо незабаром в терміни його вихідний код, 340 00:16:20,950 --> 00:16:23,270 має купу функцій declared-- GetInt, GetString, 341 00:16:23,270 --> 00:16:26,950 і купа others-- і якщо ми насправді є, що Включити лінію, 342 00:16:26,950 --> 00:16:29,320 компілятор Clang НЕ знатиме, що він існує. 343 00:16:29,320 --> 00:16:32,400 І ж саме стосується лінії два, де INT визначається 344 00:16:32,400 --> 00:16:35,101 Printf, яка є функцією ми продовжувати використовувати зовсім небагато. 345 00:16:35,101 --> 00:16:37,850 Тепер, четвертий рядок, здається, трохи Funky тому що це просто один лайнер. 346 00:16:37,850 --> 00:16:41,570 Це не має крапку з комою, що не кучеряве брекети, немає коду всередині нього. 347 00:16:41,570 --> 00:16:44,640 Але те, що ми називаємо зробив ця річ в минулому тижні? 348 00:16:44,640 --> 00:16:45,140 Так. 349 00:16:45,140 --> 00:16:46,060 Таким чином, прототип. 350 00:16:46,060 --> 00:16:48,390 І чому у нас є Прототип, який, здається, 351 00:16:48,390 --> 00:16:51,050 щоб бути трохи зайвим як правило, тому, що ми зазвичай 352 00:16:51,050 --> 00:16:53,474 подивитися функцію ще раз пізніше у файлі, чи не так? 353 00:16:53,474 --> 00:16:56,390 Так чому ж ми have-- ви просто чесати голову, але я візьму його. 354 00:16:56,390 --> 00:16:57,302 Так. 355 00:16:57,302 --> 00:17:00,000 >> АУДИТОРІЯ: [нерозбірливо] Функція після основної. 356 00:17:00,000 --> 00:17:01,000 Девід Дж Малан: Точно. 357 00:17:01,000 --> 00:17:04,089 Так що компілятор знає, що ви в кінцевому рахунку визначають або здійснювати 358 00:17:04,089 --> 00:17:06,579 що функція після основної, мабуть. 359 00:17:06,579 --> 00:17:08,462 Так Clang і найбільш компілятори роду німий 360 00:17:08,462 --> 00:17:10,510 і вони будуть знати тільки те, що ви говорите ім. 361 00:17:10,510 --> 00:17:12,569 І якщо ви хочете використовувати функція називається сигма, 362 00:17:12,569 --> 00:17:15,710 Вам краще вчити компілятор що вона існує в заздалегідь. 363 00:17:15,710 --> 00:17:17,970 >> Тепер, головний сама, навіть хоча це купа ліній, 364 00:17:17,970 --> 00:17:19,839 досить знайомі, ми сподіваємося, в даний час. 365 00:17:19,839 --> 00:17:21,942 Це є робити під час циклу чия мета в житті 366 00:17:21,942 --> 00:17:24,400 тут, мабуть, щоб отримати ціле позитивне число від користувача. 367 00:17:24,400 --> 00:17:27,349 І просто тримати приставати до нього або її, поки вони не співпрацюють. 368 00:17:27,349 --> 00:17:30,670 Потім у рядку 16 у мене є цікавий виклик. 369 00:17:30,670 --> 00:17:31,570 IntAnswer. 370 00:17:31,570 --> 00:17:33,710 Який на лівій руці сторона дає мені Int 371 00:17:33,710 --> 00:17:36,650 які можуть store-- називається Answer-- який збирається зберігати, мабуть, 372 00:17:36,650 --> 00:17:39,090 повертається значення сигма. 373 00:17:39,090 --> 00:17:41,840 Так сигма це просто довільним, але значуще ім'я 374 00:17:41,840 --> 00:17:44,500 що я дав, щоб функції чия мета в житті 375 00:17:44,500 --> 00:17:47,680 взяти один argument-- ми будемо називати його N в цьому case-- 376 00:17:47,680 --> 00:17:52,280 і просто взяти суму від цього числа плюс кожен позитивне число, що це 377 00:17:52,280 --> 00:17:53,200 менше, ніж це. 378 00:17:53,200 --> 00:17:58,140 >> Так що, якщо я проходжу числі 2 до сигма, я хочу, щоб додати 2 плюс 1 379 00:17:58,140 --> 00:18:00,240 плюс 0-- НЕ 0-- так, що дає мені 3. 380 00:18:00,240 --> 00:18:05,320 Якщо я проходжу 3 сигма, я хочу, щоб є 3 плюс 2 плюс 1, що дає мені 6. 381 00:18:05,320 --> 00:18:05,900 І так далі. 382 00:18:05,900 --> 00:18:09,750 Так це тільки додає до все число менше або дорівнює йому. 383 00:18:09,750 --> 00:18:12,040 >> Наразі, тут я тільки збираюся роздрукувати відповідь. 384 00:18:12,040 --> 00:18:17,330 Так як швидка перевірка на дурня, давайте зробити сигма 0-- точка слеш сигма 0-- 385 00:18:17,330 --> 00:18:18,690 і дозвольте мені ввести 2. 386 00:18:18,690 --> 00:18:19,960 І я дійсно отримати 3. 387 00:18:19,960 --> 00:18:21,240 Дозвольте мені ввести 3. 388 00:18:21,240 --> 00:18:22,860 Я дійсно отримаєте 6. 389 00:18:22,860 --> 00:18:27,636 І якщо хто-небудь може зробити математику швидко, якщо я 50, що я збираюся отримати? 390 00:18:27,636 --> 00:18:29,839 >> АУДИТОРІЯ: [нерозбірливо]. 391 00:18:29,839 --> 00:18:30,880 Девід Дж Малан: Ну, немає. 392 00:18:30,880 --> 00:18:33,340 Але 1275, який досить близько. 393 00:18:33,340 --> 00:18:38,850 Так що це результат того, 50 плюс 49 плюс 48 плюс 47 плюс 46 394 00:18:38,850 --> 00:18:40,349 все, аж до 1. 395 00:18:40,349 --> 00:18:41,390 Так що все сигма робить. 396 00:18:41,390 --> 00:18:43,350 Але давайте подивимося, як ми реалізовані зараз. 397 00:18:43,350 --> 00:18:45,790 Так тут є сама функція. 398 00:18:45,790 --> 00:18:49,000 І це, схоже, не нічого спільного з рекурсії ще. 399 00:18:49,000 --> 00:18:51,070 Насправді, ми використовуючи стара техніка школи. 400 00:18:51,070 --> 00:18:56,680 Я ініціалізації змінної називається суму до нуля, то у мене є foreloop тут, 401 00:18:56,680 --> 00:19:00,790 і я оголосивши Int назвою Я, вважаючи його рівним 1-- 402 00:19:00,790 --> 00:19:04,080 хоча я міг встановити його рівним нулю, але так як я роблю додавання, 403 00:19:04,080 --> 00:19:05,340 хто піклується, якщо це нуль або один. 404 00:19:05,340 --> 00:19:06,660 Це відбувається не має ніякого ефекту. 405 00:19:06,660 --> 00:19:10,110 >> Так що я ітерації до тих пір, як я це менше або дорівнює м, що 406 00:19:10,110 --> 00:19:11,671 є аргументом, який був прийнятий в. 407 00:19:11,671 --> 00:19:13,670 А потім я просто тримати збільшуючи І. і розуміння 408 00:19:13,670 --> 00:19:20,010 петлі все, що я роблю робить суму плюс дорівнює I. І це навмисним. 409 00:19:20,010 --> 00:19:22,326 Я не хочу робити, в цьому так, як суми плюс плюс. 410 00:19:22,326 --> 00:19:24,790 Я хочу, щоб насправді додати поточне значення I 411 00:19:24,790 --> 00:19:28,190 які стає все більше і більше і більше в проточній підрахунок. 412 00:19:28,190 --> 00:19:30,210 >> А потім я повернуся суму. 413 00:19:30,210 --> 00:19:33,850 І так відповідь отримує значення суми. 414 00:19:33,850 --> 00:19:35,282 І тоді я роздрукувати його. 415 00:19:35,282 --> 00:19:37,740 Так є можливість тут, хоча, начебто спрощення 416 00:19:37,740 --> 00:19:41,260 цей код концептуально і вид удару одного це 417 00:19:41,260 --> 00:19:43,250 розум в термінах Простота, навіть якщо це 418 00:19:43,250 --> 00:19:45,700 потрібен час, щоб розібратися з зрозуміти, чому це 419 00:19:45,700 --> 00:19:47,330 є потужним в цих невеликих прикладів. 420 00:19:47,330 --> 00:19:50,380 Ось сигма одно-- так Друга версія цього коду. 421 00:19:50,380 --> 00:19:55,290 Всі нагорі ідентичний так що ж історія відноситься, як і колись. 422 00:19:55,290 --> 00:19:59,220 Але тепер давайте подивимося на Реалізація сигма, які 423 00:19:59,220 --> 00:20:05,040 Я скоротився до тільки ці lines-- чотири рядки коду, насправді, 424 00:20:05,040 --> 00:20:06,980 плюс деякі фігурні дужки і пропуски. 425 00:20:06,980 --> 00:20:07,930 >> Але що я роблю? 426 00:20:07,930 --> 00:20:11,050 Якщо т менше або дорівнює нулю, мені потрібно, щоб вид обробки 427 00:20:11,050 --> 00:20:12,490 що супер простий випадок. 428 00:20:12,490 --> 00:20:15,450 І якщо ви передати мені нуль або нічого негатив, який є просто дивно, 429 00:20:15,450 --> 00:20:17,909 Я просто хочу, щоб довільно але послідовно повертати нуль. 430 00:20:17,909 --> 00:20:20,200 Я не хочу цю річ до потрапити в якійсь дивній нескінченність 431 00:20:20,200 --> 00:20:21,810 цикл через від'ємного значення. 432 00:20:21,810 --> 00:20:25,070 Так що я просто кажу, що якщо ви дасте мені нулю або менше, я повертаюся до нуля. 433 00:20:25,070 --> 00:20:28,220 >> Але це добре, тому що це що однієї сторінки телефонної книги 434 00:20:28,220 --> 00:20:28,790 що залишилося. 435 00:20:28,790 --> 00:20:32,660 Я відкушуючи дуже конкретну проблему і не називаючи щось рекурсивно. 436 00:20:32,660 --> 00:20:36,580 Але в рядку 31, то я, здається, роблять? 437 00:20:36,580 --> 00:20:39,780 Дужки просто тримати речі, сподіваюся, трохи ясніше. 438 00:20:39,780 --> 00:20:42,110 Але все, що я роблю, я повернення M-- все 439 00:20:42,110 --> 00:20:45,790 Ви вручаєте me-- плюс Значення M-- вибачте, 440 00:20:45,790 --> 00:20:49,052 плюс значення сигма М мінус 1. 441 00:20:49,052 --> 00:20:50,010 Отже, що ж це означає? 442 00:20:50,010 --> 00:20:53,965 Якщо ви дасте мені номер 3 в якості вхідних, відповідь, яку я хочу, щоб отримати, в кінцевому рахунку 443 00:20:53,965 --> 00:20:57,307 6, бо 3 плюс 2 плюс 1 дає мені 6. 444 00:20:57,307 --> 00:20:59,390 Але як я можу думати про як цей код працює? 445 00:20:59,390 --> 00:21:03,070 У перший раз я називаю сигма і я проходжу в значення 3, 446 00:21:03,070 --> 00:21:07,960 це, як кажуть на шматку паперу, от значення 3 447 00:21:07,960 --> 00:21:09,920 і я був прийнятий як сигма це. 448 00:21:09,920 --> 00:21:13,090 3, очевидно, не менше, ніж 0, так стан ЯКЩО не застосовується. 449 00:21:13,090 --> 00:21:14,020 Решта. 450 00:21:14,020 --> 00:21:14,990 Так що мені робити? 451 00:21:14,990 --> 00:21:19,902 Я хочу, щоб повернутися м, що є 3, плюс сигма мінус 1 м. 452 00:21:19,902 --> 00:21:21,110 Отже, дозвольте мені відстежувати це. 453 00:21:21,110 --> 00:21:22,710 Я збираюся поставити це аркуш паперу вниз. 454 00:21:22,710 --> 00:21:24,668 І те, що значення, щоб бути ясно, я збираюся пройти 455 00:21:24,668 --> 00:21:26,540 в сигма в цій точці в історії? 456 00:21:26,540 --> 00:21:28,080 Який номер? 457 00:21:28,080 --> 00:21:28,610 2, вірно? 458 00:21:28,610 --> 00:21:29,670 3 мінус 1 лютого. 459 00:21:29,670 --> 00:21:32,000 Так що я просто потрібно трохи клаптик паперу тут. 460 00:21:32,000 --> 00:21:33,931 Так що тепер сигма викликався знову. 461 00:21:33,931 --> 00:21:35,930 І я свідомо поклав це вниз, тому що це 462 00:21:35,930 --> 00:21:38,070 ніби як паузу що версія історії 463 00:21:38,070 --> 00:21:40,720 тому що тепер я зосереджений по сигналу від мінус 1 м. 464 00:21:40,720 --> 00:21:42,660 Так му був 3, м мінус 1 лютого. 465 00:21:42,660 --> 00:21:45,110 Так от 2, що я був прийнятий. 466 00:21:45,110 --> 00:21:48,510 2, очевидно, не менш 0, так що справа не застосовуються. 467 00:21:48,510 --> 00:21:53,445 Інакше я повернуся м, що це річ, плюс сигма якою вартістю? 468 00:21:53,445 --> 00:21:56,160 469 00:21:56,160 --> 00:21:59,650 Так що, якщо сигма 1-- тому є м зараз 2 SO 2 мінус 1 1. 470 00:21:59,650 --> 00:22:01,950 Так що тепер у мене є тільки значення 1. 471 00:22:01,950 --> 00:22:04,810 Я переказую тільки номер 1 до функції sigma-- 472 00:22:04,810 --> 00:22:09,120 або сам here-- так 1, очевидно, не менше нуля, досі не застосовуються. 473 00:22:09,120 --> 00:22:12,970 >> Інакше повернення 1 плюс сигма що? 474 00:22:12,970 --> 00:22:13,470 0. 475 00:22:13,470 --> 00:22:14,678 Отже, дозвольте мені просто пам'ятайте, що. 476 00:22:14,678 --> 00:22:15,920 Я повернуся до цього пізніше. 477 00:22:15,920 --> 00:22:18,060 Тепер я збираюся йти вперед і йота вниз номером 0, тому що це 478 00:22:18,060 --> 00:22:19,470 мій аргумент або параметр. 479 00:22:19,470 --> 00:22:22,400 Я пройшов ряд 0 і, нарешті, цей процес 480 00:22:22,400 --> 00:22:25,760 просто повторюючи собі оголошення нудоти зовсім припинити, тому що те, що 481 00:22:25,760 --> 00:22:28,820 я відразу робити, коли я бачу цю 0? 482 00:22:28,820 --> 00:22:29,790 Я повертаюся до нуля. 483 00:22:29,790 --> 00:22:31,790 Так що тепер у вас є, щоб перемотати історію. 484 00:22:31,790 --> 00:22:34,430 >> Якщо я тепер йдуть назад у часі, те, що було самим останнім, що 485 00:22:34,430 --> 00:22:36,670 Я зробив, якщо б ви були в буквальному сенсі перемотування відео? 486 00:22:36,670 --> 00:22:41,630 Я збираюся забрати останнім 1, і це дає мені 1 плюс 0 одно 1. 487 00:22:41,630 --> 00:22:44,100 Якщо я буду перемотування історія, що збирається дати мені 488 00:22:44,100 --> 00:22:46,880 2 плюс це працює значення, яке дорівнює 1. 489 00:22:46,880 --> 00:22:47,789 Так от 3. 490 00:22:47,789 --> 00:22:49,330 А потім я збираюся тримати перемотувати. 491 00:22:49,330 --> 00:22:54,220 Коли я вперше поклав число 3-- так 3 плюс 3 дає мені 6. 492 00:22:54,220 --> 00:22:57,272 >> А тепер, якщо ви перемотана відео аж до цього моменту, 493 00:22:57,272 --> 00:22:58,980 це було дуже Я запитав перше питання. 494 00:22:58,980 --> 00:23:01,450 Коли пройшло 3, що сигма 3? 495 00:23:01,450 --> 00:23:04,204 Це дійсно 6, сума всі ці шматочки паперу. 496 00:23:04,204 --> 00:23:07,120 Так що, якщо потрібен якийсь час, щоб обернути ваш розум навколо, це нормально. 497 00:23:07,120 --> 00:23:10,700 Але врахуйте, що це little-- нього був дуже навмисним, що я складені 498 00:23:10,700 --> 00:23:12,990 ці числа один на одного. 499 00:23:12,990 --> 00:23:17,440 Це ніби як мають memory-- запис часу, 500 00:23:17,440 --> 00:23:19,940 як скрубер у відео, що я можу дійсно назад в. 501 00:23:19,940 --> 00:23:24,350 І ми збираємося повернутися до що метафора тільки трохи. 502 00:23:24,350 --> 00:23:28,240 >> Але спочатку, виявляється, що є багато вундеркіндів і смішних людей, 503 00:23:28,240 --> 00:23:29,614 Я думаю, на Google. 504 00:23:29,614 --> 00:23:31,530 Хтось, хто дуже добре погуглити увазі 505 00:23:31,530 --> 00:23:34,270 підійшовши на мить і допомогти мені шукати щось? 506 00:23:34,270 --> 00:23:35,650 Дуже, дуже низький ключ. 507 00:23:35,650 --> 00:23:37,870 Хтось, хто ніколи не Перед придумати, мабуть. 508 00:23:37,870 --> 00:23:38,370 ДОБРЕ. 509 00:23:38,370 --> 00:23:39,030 Так? 510 00:23:39,030 --> 00:23:39,530 Давай. 511 00:23:39,530 --> 00:23:41,410 Йдемо вниз. 512 00:23:41,410 --> 00:23:42,183 Як вас звати? 513 00:23:42,183 --> 00:23:42,870 >> СЕМ: Сем. 514 00:23:42,870 --> 00:23:44,290 >> Девід Дж Малан: Сем, давай вниз. 515 00:23:44,290 --> 00:23:45,320 Це те ж саме. 516 00:23:45,320 --> 00:23:46,280 Приємно познайомитись. 517 00:23:46,280 --> 00:23:46,780 Ей. 518 00:23:46,780 --> 00:23:47,580 Приходь. 519 00:23:47,580 --> 00:23:51,290 Так що мені потрібно, щоб ти, якщо Ви могли б, Сем, ось Google. 520 00:23:51,290 --> 00:23:53,240 Ви можете шукати термін рекурсії? 521 00:23:53,240 --> 00:23:55,770 522 00:23:55,770 --> 00:23:56,270 Не зіпсувати. 523 00:23:56,270 --> 00:23:59,940 524 00:23:59,940 --> 00:24:00,970 >> А тепер let's-- так. 525 00:24:00,970 --> 00:24:03,380 Натисніть ОК, що. 526 00:24:03,380 --> 00:24:04,315 Краще натисніть що. 527 00:24:04,315 --> 00:24:07,020 528 00:24:07,020 --> 00:24:08,020 Ах, отримати його. 529 00:24:08,020 --> 00:24:08,520 Немає? 530 00:24:08,520 --> 00:24:09,050 ДОБРЕ. 531 00:24:09,050 --> 00:24:10,430 Так давайте зробимо пару інших. 532 00:24:10,430 --> 00:24:12,830 Не так багато, пов'язані академічно тут, але ви 533 00:24:12,830 --> 00:24:14,520 небудь шукали Google для анаграми? 534 00:24:14,520 --> 00:24:15,280 >> СЕМ: Ні. 535 00:24:15,280 --> 00:24:15,520 >> Девід Дж Малан: ОК. 536 00:24:15,520 --> 00:24:17,186 Пошук анаграми замість рекурсії. 537 00:24:17,186 --> 00:24:22,540 538 00:24:22,540 --> 00:24:23,790 Як щодо криво. 539 00:24:23,790 --> 00:24:25,515 Ви коли-небудь шукали криво? 540 00:24:25,515 --> 00:24:29,260 541 00:24:29,260 --> 00:24:32,692 Тепер, цей трохи важко бачити, але ми сподіваємося, everything's-- ОК. 542 00:24:32,692 --> 00:24:34,150 Це тільки ти і я насолоджуюся цим. 543 00:24:34,150 --> 00:24:34,690 ДОБРЕ. 544 00:24:34,690 --> 00:24:38,950 >> Отже, нарешті, це one's-- це трохи криво. 545 00:24:38,950 --> 00:24:40,810 Тепер зробити бочку. 546 00:24:40,810 --> 00:24:44,460 547 00:24:44,460 --> 00:24:45,310 Чудово. 548 00:24:45,310 --> 00:24:45,910 Добре. 549 00:24:45,910 --> 00:24:47,110 Велике спасибі Сему. 550 00:24:47,110 --> 00:24:49,416 Тут ви йдете. 551 00:24:49,416 --> 00:24:50,400 Дякую. 552 00:24:50,400 --> 00:24:52,807 >> Так що ж відбувається на всього з цих дурних прикладів? 553 00:24:52,807 --> 00:24:55,640 Так насправді, під капотом Мільйони Google, рядків коду 554 00:24:55,640 --> 00:24:58,860 мабуть, дещо безглуздо, якщо Умови, які по суті 555 00:24:58,860 --> 00:25:01,160 перевірки, якщо користувач має набрали в цій фразі, 556 00:25:01,160 --> 00:25:03,760 зробити щось, що, ймовірно, взяв нетривіальна кількість часу 557 00:25:03,760 --> 00:25:06,080 здійснити тільки забавно в цьому шляху. 558 00:25:06,080 --> 00:25:08,430 Але це все, що кипить до під капотом. 559 00:25:08,430 --> 00:25:11,570 Але, звичайно, рекурсія більше з geekier 560 00:25:11,570 --> 00:25:13,880 приклад серед тих особливих хитрощів. 561 00:25:13,880 --> 00:25:16,880 І, звичайно, є інші там а також, що ми, можливо, навіть не 562 00:25:16,880 --> 00:25:18,230 виявив тільки поки. 563 00:25:18,230 --> 00:25:22,830 >> Так погляньте, або розглянути Тепер наступна програма, 564 00:25:22,830 --> 00:25:24,830 і, звичайно, захопити будь з них на вихід. 565 00:25:24,830 --> 00:25:28,820 Я збираюся йти вперед і відкрити програму, яка 566 00:25:28,820 --> 00:25:30,920 збираюся спробувати поміняти два значення. 567 00:25:30,920 --> 00:25:33,210 Але перш ніж ми туди, давайте зробимо це. 568 00:25:33,210 --> 00:25:38,500 Чи можемо ми отримати ще один Робота на громадських засадах, я думаю? 569 00:25:38,500 --> 00:25:40,480 Хочете стати волонтером? 570 00:25:40,480 --> 00:25:40,980 Немає? 571 00:25:40,980 --> 00:25:41,890 Давай до. 572 00:25:41,890 --> 00:25:42,390 Давай до. 573 00:25:42,390 --> 00:25:42,890 Добре. 574 00:25:42,890 --> 00:25:44,136 Так ваше ім'я чого? 575 00:25:44,136 --> 00:25:44,810 >> Лорен: Лорен. 576 00:25:44,810 --> 00:25:45,768 >> Девід Дж Малан: Лорен. 577 00:25:45,768 --> 00:25:46,890 Приходьте на вгору, Лорен. 578 00:25:46,890 --> 00:25:50,140 Так Лорен бути виклик тут наступним чином. 579 00:25:50,140 --> 00:25:52,310 Приємно познайомитись. 580 00:25:52,310 --> 00:25:55,730 Так Лорен тут є перед її двома порожніми чашками. 581 00:25:55,730 --> 00:25:57,570 І у нас є деякі помаранчевий сік і трохи молока 582 00:25:57,570 --> 00:26:00,301 і ми збираємося піти вперед і робити наступне. 583 00:26:00,301 --> 00:26:01,550 Ми просто збираємося, щоб заповнити цей. 584 00:26:01,550 --> 00:26:07,840 Через кілька унцій молока сюди і давайте заповнити невелику апельсиновий сік тут. 585 00:26:07,840 --> 00:26:11,475 >> І навпроти всіх ці глядачі, 586 00:26:11,475 --> 00:26:13,550 поміняти місцями два значення цих чашок. 587 00:26:13,550 --> 00:26:16,970 Поставте апельсиновий сік в чашку молока і молоко в чашку апельсинового соку. 588 00:26:16,970 --> 00:26:22,380 589 00:26:22,380 --> 00:26:26,150 Як би ви це зробити, якщо ви були в додому і мали доступ до інших поставок? 590 00:26:26,150 --> 00:26:27,400 Лорен: Покладіть його в іншу чашку. 591 00:26:27,400 --> 00:26:28,191 Девід Дж Малан: ОК. 592 00:26:28,191 --> 00:26:31,940 Отже, давайте тимчасово Мінлива, якщо ми зробимо це. 593 00:26:31,940 --> 00:26:35,871 І йти вперед сьогодні, а здійснити Таку ж процедуру заміни. 594 00:26:35,871 --> 00:26:36,370 Так добре. 595 00:26:36,370 --> 00:26:41,490 Ми помістили OJ у тимчасове Мінлива, молоко у змінній OJ, 596 00:26:41,490 --> 00:26:44,481 і в даний час тимчасова змінна в змінну молока. 597 00:26:44,481 --> 00:26:44,980 ДОБРЕ. 598 00:26:44,980 --> 00:26:48,740 Так дуже добре зроблено досі. 599 00:26:48,740 --> 00:26:50,990 Так що виходить, що out-- провести думав на мить. 600 00:26:50,990 --> 00:26:54,479 Тут просто виродок це небагато, це буде відповідна С-код 601 00:26:54,479 --> 00:26:55,520 що ми просто реалізується. 602 00:26:55,520 --> 00:26:58,650 У нас було два входи, а і б, обидва які ми просто скажемо, для простоти 603 00:26:58,650 --> 00:26:59,260 INT років. 604 00:26:59,260 --> 00:27:02,780 І зверніть увагу, тут, якщо я хочу поміняти значення двох змінних А і В, 605 00:27:02,780 --> 00:27:06,890 ми дійсно потрібен посередник, А тимчасова змінна, тимчасове чашки, 606 00:27:06,890 --> 00:27:10,830 в якій заливають одне із значень так що у нас є заповнювач для нього. 607 00:27:10,830 --> 00:27:13,480 Але потім код в точності а Лорен тут реалізовані. 608 00:27:13,480 --> 00:27:15,500 >> Тепер, тільки, щоб отримати трохи божевільним, виявляється 609 00:27:15,500 --> 00:27:20,930 що ви можете зробити це без тимчасова змінна. 610 00:27:20,930 --> 00:27:24,870 Щоб зробити це правильно, хоча, ми збираємося щоб обдурити з деякими хімії. 611 00:27:24,870 --> 00:27:26,380 У нас є деякі додаткові чашки тут. 612 00:27:26,380 --> 00:27:29,600 Таким чином, найближче, що виглядає як молоко і воду perhaps-- 613 00:27:29,600 --> 00:27:34,090 або молока і OJ-- це у нас є деякі вода, так що ми будемо заповнювати це одне вгору 614 00:27:34,090 --> 00:27:36,486 з дещо унцій чистої води. 615 00:27:36,486 --> 00:27:38,332 Це, ймовірно, занадто багато. 616 00:27:38,332 --> 00:27:38,832 Так. 617 00:27:38,832 --> 00:27:39,934 Це, безумовно, занадто багато. 618 00:27:39,934 --> 00:27:40,600 Тримайте на одній сек. 619 00:27:40,600 --> 00:27:43,520 620 00:27:43,520 --> 00:27:48,420 >> А тепер у нас є нафта, яка, як я згадую від середньої школи хімії класу, 621 00:27:48,420 --> 00:27:49,990 ми сподіваємося, це не змішується з водою. 622 00:27:49,990 --> 00:27:53,650 Але це свого роду вид виглядає, як молоко і OJ. 623 00:27:53,650 --> 00:27:55,760 Так що тепер, без використання тимчасова змінна, 624 00:27:55,760 --> 00:27:59,260 Ви можете поміняти ці два значення? 625 00:27:59,260 --> 00:28:03,884 Так масла йде в чашку води, вода йде в чашку масла. 626 00:28:03,884 --> 00:28:04,800 Лорен: Ні інші чашки? 627 00:28:04,800 --> 00:28:05,940 Девід Дж Малан: Ніякі інші чашки. 628 00:28:05,940 --> 00:28:07,860 І я насправді не випробував це перш, ніж цього року 629 00:28:07,860 --> 00:28:10,110 так що я не знаю, якщо це буде насправді працюють хімічно. 630 00:28:10,110 --> 00:28:16,130 631 00:28:16,130 --> 00:28:18,650 Це не повинно було трапитися. 632 00:28:18,650 --> 00:28:19,761 Це працює? 633 00:28:19,761 --> 00:28:20,260 Добре. 634 00:28:20,260 --> 00:28:20,990 Так поділу? 635 00:28:20,990 --> 00:28:21,490 Добре. 636 00:28:21,490 --> 00:28:24,714 Тепер ми отримали, щоб отримати води в іншій чашці. 637 00:28:24,714 --> 00:28:27,630 Smarter концентратори хімія міг ймовірно, зробити це краще за мене. 638 00:28:27,630 --> 00:28:28,510 >> Lauren: води на дні. 639 00:28:28,510 --> 00:28:31,910 >> Девід Дж Малан: The water--, що було що ключ востаннє ми зробили це. 640 00:28:31,910 --> 00:28:33,950 Ви повинні зробити це в правильному порядку. 641 00:28:33,950 --> 00:28:34,450 Так. 642 00:28:34,450 --> 00:28:35,270 Все добре. 643 00:28:35,270 --> 00:28:37,290 Так що тепер у нас є дві чашки масла. 644 00:28:37,290 --> 00:28:37,790 ДОБРЕ. 645 00:28:37,790 --> 00:28:38,510 Все добре. 646 00:28:38,510 --> 00:28:40,110 Але якщо це хімічно працював, ніж i-- 647 00:28:40,110 --> 00:28:41,200 >> Лорен: Це вода. 648 00:28:41,200 --> 00:28:41,930 >> Девід Дж Малан: Це в основному вода. 649 00:28:41,930 --> 00:28:42,430 Добре. 650 00:28:42,430 --> 00:28:44,210 Але це все той же стакан, як раніше. 651 00:28:44,210 --> 00:28:47,570 Так залити it-- спробувати там. 652 00:28:47,570 --> 00:28:49,300 ДОБРЕ. 653 00:28:49,300 --> 00:28:51,010 Це добре використання часу класу сьогодні. 654 00:28:51,010 --> 00:28:51,510 ДОБРЕ. 655 00:28:51,510 --> 00:28:53,890 Так що тепер we-- приємно. 656 00:28:53,890 --> 00:28:55,460 Різновид. 657 00:28:55,460 --> 00:28:55,960 Добре. 658 00:28:55,960 --> 00:28:56,690 Так дуже добре. 659 00:28:56,690 --> 00:29:00,006 Спасибі Лорен. 660 00:29:00,006 --> 00:29:01,950 Дуже добре зроблено. 661 00:29:01,950 --> 00:29:04,570 >> Так що просто підірвати ваші уми, і це, мабуть, щось 662 00:29:04,570 --> 00:29:08,660 грати з, якщо вам подобається в CS50 ID, Ви можете, насправді, поміняти дві змінні 663 00:29:08,660 --> 00:29:11,470 без використання тимчасового ціле число. 664 00:29:11,470 --> 00:29:13,060 І це відповідний код С. 665 00:29:13,060 --> 00:29:16,110 І якщо ви пам'ятаєте з минулого Середа, ми ввели, якщо коротко, 666 00:29:16,110 --> 00:29:19,720 деякі нові оператори в С і робить хто згадати, що маленька морква 667 00:29:19,720 --> 00:29:23,660 символ, що мало трикутної Символ з клавіатури представляє? 668 00:29:23,660 --> 00:29:26,003 Що побітове оператор? 669 00:29:26,003 --> 00:29:26,770 >> АУДИТОРІЯ: EXOR. 670 00:29:26,770 --> 00:29:27,645 >> Девід Дж Малан: EXOR. 671 00:29:27,645 --> 00:29:28,560 Ексклюзивний Або. 672 00:29:28,560 --> 00:29:32,920 Так що, якщо ви хочете, просто для задоволення на додому, щоб дати і б дві довільних 673 00:29:32,920 --> 00:29:36,072 такі цінності, як будь eight-- і I буде вибрати восьмій бітове значення. 674 00:29:36,072 --> 00:29:38,530 Якщо ви зробите це з 32 біт, Ви дуже швидко набридає. 675 00:29:38,530 --> 00:29:42,150 Але просто дати вісім біт Значення це все, один або два, 676 00:29:42,150 --> 00:29:43,790 і дати б аналогічної вартості. 677 00:29:43,790 --> 00:29:46,810 А потім, використовуючи визначення з XOR з минулого середу, 678 00:29:46,810 --> 00:29:52,560 застосовувати цю потроху, кожен з ці вісім бітів в кожній з А і В, 679 00:29:52,560 --> 00:29:54,980 а потім зробити його саме за цим кодом. 680 00:29:54,980 --> 00:29:58,170 І це не те, що неправильно Ви бачите тут на екрані. 681 00:29:58,170 --> 00:30:02,100 Це дійсно зводиться трьох операцій XOR 682 00:30:02,100 --> 00:30:05,910 і якимось чарівним а і б обміняються позиції 683 00:30:05,910 --> 00:30:08,010 без втрати інформації. 684 00:30:08,010 --> 00:30:11,580 >> Таким чином, нафта і вода трюк є Найближчий реальний світ втілення 685 00:30:11,580 --> 00:30:12,980 Я міг думати про те, що, щоб імітувати. 686 00:30:12,980 --> 00:30:15,950 Але, безумовно, це простіше використовувати тимчасову змінну, 687 00:30:15,950 --> 00:30:16,920 як в цьому випадку тут. 688 00:30:16,920 --> 00:30:21,190 І це теж можливість сказати, теж така мікро оптимізації, 689 00:30:21,190 --> 00:30:23,590 в якості комп'ютерного вченого хотів би сказати, в той час як забавно 690 00:30:23,590 --> 00:30:27,060 хвалитися про те, як ви зробили це без як обмін з додатковою змінної, 691 00:30:27,060 --> 00:30:28,640 це ще не все, що переконливо. 692 00:30:28,640 --> 00:30:31,619 Тому що, щоб зберегти 32 біт, як в разі фактичного Int, 693 00:30:31,619 --> 00:30:33,410 це не все, що переконливих в системі, де 694 00:30:33,410 --> 00:30:36,722 ви могли б використовувати десятки мегабайт або навіть більше, наприклад пам'яті в ці дні. 695 00:30:36,722 --> 00:30:38,680 І справді, коли ми отримуємо на більш пізній поставленого завдання 696 00:30:38,680 --> 00:30:41,010 і ви реалізуєте заклинання перевірки, і ви будете 697 00:30:41,010 --> 00:30:43,550 бути оскаржені, щоб зробити це з це як маленька оперативна пам'ять і лише 698 00:30:43,550 --> 00:30:46,820 Час, як можна на computer-- вас ще 699 00:30:46,820 --> 00:30:50,160 є тиждень, щоб реалізувати it-- ви have-- ви будете 700 00:30:50,160 --> 00:30:51,799 виклик, щоб мінімізувати ці ресурси. 701 00:30:51,799 --> 00:30:53,840 І це насправді тільки Випадок цей семестр 702 00:30:53,840 --> 00:30:57,940 де ви будете заохочувати голитися від навіть кращих продуктивності 703 00:30:57,940 --> 00:30:59,340 стоїть інакше. 704 00:30:59,340 --> 00:31:02,200 >> Так что-- як ми можемо побачити їх в коді? 705 00:31:02,200 --> 00:31:04,530 Дозвольте мені йти вперед з підприємством і відкрити приклад 706 00:31:04,530 --> 00:31:07,700 що навмисно називають Немає своп, тому що це не 707 00:31:07,700 --> 00:31:10,670 насправді поміняти змінні як ви насправді могли б очікувати. 708 00:31:10,670 --> 00:31:12,260 Отже, давайте поглянемо. 709 00:31:12,260 --> 00:31:17,050 Ось програма, яка не має CS50 Бібліотека відбувається, просто стандартний ввід / вивід. 710 00:31:17,050 --> 00:31:19,560 Тепер у нас є прототип для підкачки нагорі, який тільки 711 00:31:19,560 --> 00:31:21,540 означає, що він повинен бути визначений пізніше. 712 00:31:21,540 --> 00:31:22,550 А ось головний. 713 00:31:22,550 --> 00:31:26,000 >> Я довільно призначені х і у, відповідно, одним значення і два 714 00:31:26,000 --> 00:31:28,590 тільки тому, що вони маленькі і легко, щоб думати. 715 00:31:28,590 --> 00:31:32,280 А потім я просто є купа printfs де у мене є простий тест. х 1 716 00:31:32,280 --> 00:31:35,110 і у є 2 імовірно що ці printfs скажу. 717 00:31:35,110 --> 00:31:36,530 Так що немає магії досі. 718 00:31:36,530 --> 00:31:40,100 >> Тоді я збираюся стверджувати з друкувати чіткості, обмін точка точка точка. 719 00:31:40,100 --> 00:31:43,730 Я збираюсь подзвонити своп Функція, проходячи по х та у. 720 00:31:43,730 --> 00:31:47,350 І давайте припустимо, що зараз своп здійснюється точно 721 00:31:47,350 --> 00:31:49,930 як це було деякий час назад з тимчасовою змінної. 722 00:31:49,930 --> 00:31:52,670 І так я стверджую, сміливо, місцями. 723 00:31:52,670 --> 00:31:55,429 х тепер це і тепер у цього. 724 00:31:55,429 --> 00:31:57,220 Але файл, звичайно, не називається Немає своп. 725 00:31:57,220 --> 00:31:58,678 Отже, давайте насправді подивитися, що відбувається. 726 00:31:58,678 --> 00:32:04,450 Якщо я не компіляції НЕ своп, а потім зробити ./noswap, х 1, у 2. 727 00:32:04,450 --> 00:32:05,770 Підкачка місцями. 728 00:32:05,770 --> 00:32:07,200 х дорівнює 1, у 2. 729 00:32:07,200 --> 00:32:11,980 Так що насправді, здається, навіть недоліки хоча swap-- давайте перейдіть вниз now-- 730 00:32:11,980 --> 00:32:16,542 реалізується саме відповідно до Код я запропонував деякий час назад. 731 00:32:16,542 --> 00:32:19,000 Таким чином, ми не збираємося, щоб отримати фантазії з XOR речі на даний момент. 732 00:32:19,000 --> 00:32:21,890 Це теж має працювати як з молоком і OJ, 733 00:32:21,890 --> 00:32:25,820 але це, здається, не працює. 734 00:32:25,820 --> 00:32:27,180 >> Так давайте зробимо це знову. 735 00:32:27,180 --> 00:32:29,310 Може бути, я просто не працює правильно. 736 00:32:29,310 --> 00:32:32,010 Отож не працювати Немає своп знову. 737 00:32:32,010 --> 00:32:32,900 Може бути, я-- немає. 738 00:32:32,900 --> 00:32:34,400 Так що це просто не працює. 739 00:32:34,400 --> 00:32:36,060 Так давайте зробимо невеликий перевірку осудності. 740 00:32:36,060 --> 00:32:39,690 Дозвольте мені йти вперед тут, в своп і просто додати, зачекайте хвилину, 741 00:32:39,690 --> 00:32:43,856 а є% I / N і давайте плагін в значенні а. 742 00:32:43,856 --> 00:32:45,730 Тому що я дійсно хочу щоб побачити, що відбувається. 743 00:32:45,730 --> 00:32:47,570 І справді, це техніка налагодження 744 00:32:47,570 --> 00:32:50,028 що ви могли б використовувати в офіс години або в уже вдома, 745 00:32:50,028 --> 00:32:53,560 те саме першій половині Дана Відео Armendariz в PSET3 746 00:32:53,560 --> 00:32:56,870 де ми ввели друку Def, як рекомендований метод, принаймні, 747 00:32:56,870 --> 00:32:58,080 для простих випадків. 748 00:32:58,080 --> 00:33:01,720 Дозвольте мені йти вперед і працювати зробити немає заміни знову, ./noswap. 749 00:33:01,720 --> 00:33:04,370 750 00:33:04,370 --> 00:33:05,840 >> Цікаво. 751 00:33:05,840 --> 00:33:11,670 Так зауважити, що, здається, щоб бути правдою. х 1, у 2, але це 2, коли В 1. 752 00:33:11,670 --> 00:33:16,790 Так ці двоє якимось чином помінялися але х і у не отримують місцями. 753 00:33:16,790 --> 00:33:21,090 Таким чином, щоб було ясно, що відбувається Тобто, тут у мене є х і у 754 00:33:21,090 --> 00:33:25,380 і ті локальні змінні в Основна сфера, я передаю в х і у 755 00:33:25,380 --> 00:33:26,170 поміняти. 756 00:33:26,170 --> 00:33:29,080 Тепер, своп, як окремої функції, безкоштовно зателефонувати свої аргументи 757 00:33:29,080 --> 00:33:30,590 або його параметри все, що він хоче. 758 00:33:30,590 --> 00:33:33,280 Foo або бар або х або у або А або В. 759 00:33:33,280 --> 00:33:36,870 Просто щоб зрозуміти, що вони не збігається з х і у по собі, 760 00:33:36,870 --> 00:33:38,020 Я сказав і б. 761 00:33:38,020 --> 00:33:40,040 Але ми могли б назвати їх, що ми хочемо. 762 00:33:40,040 --> 00:33:43,960 >> І так, схоже, Своп пройшло 763 00:33:43,960 --> 00:33:48,980 x-- АКА a-- і це передається y-- AKA б. 764 00:33:48,980 --> 00:33:51,900 Якимось чином ці три лінії обмін саме ті цінності, 765 00:33:51,900 --> 00:33:53,510 як це зробив Лорен з молоком і OJ. 766 00:33:53,510 --> 00:33:56,010 Але коли ми роздрукувати цінності, а і б 767 00:33:56,010 --> 00:34:01,340 дійсно поміняти, але і х у немає ніяких змін в них. 768 00:34:01,340 --> 00:34:03,150 Нагадаємо, що х і у тут. 769 00:34:03,150 --> 00:34:05,320 >> Таким чином, ми можемо бачити це з допомогою інша техніка, а також. 770 00:34:05,320 --> 00:34:08,110 І це теж техніка вбудовані в задачі встановити зо три. 771 00:34:08,110 --> 00:34:10,780 Давайте йти вперед і робити це в CS50 ID, якщо ви ще цього не зробили. 772 00:34:10,780 --> 00:34:13,730 На бічній боку ми прямо їсти цю вкладку Debugger. 773 00:34:13,730 --> 00:34:16,159 І якщо ви відкрити це, є деякі таємні відомості 774 00:34:16,159 --> 00:34:17,530 що кинув на вас спочатку. 775 00:34:17,530 --> 00:34:19,310 Але давайте дражнити це крім дуже швидко. 776 00:34:19,310 --> 00:34:21,620 >> Таким чином, одна, ви бачите локальні змінні. 777 00:34:21,620 --> 00:34:26,230 Виявляється, що будувати в CS50 IDE, і багато середовищ програмування більш 778 00:34:26,230 --> 00:34:28,060 Як правило, це відладчик. 779 00:34:28,060 --> 00:34:31,340 Інструмент, який дозволяє наочно побачити те, що відбувається всередині вашої програми 780 00:34:31,340 --> 00:34:34,380 без необхідності вдаватися до додавання printfs і компіляції і запуску 781 00:34:34,380 --> 00:34:37,588 і додавання Printf-х і компіляції і біг, який вже в неробочий час 782 00:34:37,588 --> 00:34:40,070 або будинку, ймовірно, стає досить виснажливим. 783 00:34:40,070 --> 00:34:43,090 >> Так от, в мить, ми збираюся бачити в режимі реального часу 784 00:34:43,090 --> 00:34:44,760 значення наших локальних змінних. 785 00:34:44,760 --> 00:34:47,880 Ми також збираємося бути в змозі встановити те, що називається зупину, які 786 00:34:47,880 --> 00:34:52,570 є можливості в моїй програмі, щоб призупинити виконання в певному рядку коду 787 00:34:52,570 --> 00:34:53,710 що мені цікаво, о. 788 00:34:53,710 --> 00:34:54,210 Вірно? 789 00:34:54,210 --> 00:34:55,969 Ці програми працюють в секунду. 790 00:34:55,969 --> 00:35:00,450 Це свого роду хороший для нас повільних людей щоб мати можливість зробити паузу, скористатися моментом, см 791 00:35:00,450 --> 00:35:02,380 що відбувається навколо певна рядок коду 792 00:35:02,380 --> 00:35:05,050 без оранки програми через нього і закінчуючи повністю. 793 00:35:05,050 --> 00:35:08,510 Таким чином, точки зупину збирається дозволити нам перерву і пауза в певній точці. 794 00:35:08,510 --> 00:35:12,990 >> Стек викликів це химерний спосіб кажучи, що в даний час функції 795 00:35:12,990 --> 00:35:14,140 називають в даний час. 796 00:35:14,140 --> 00:35:15,370 Головна завжди викликається перший. 797 00:35:15,370 --> 00:35:17,230 Але якщо Основний називає Функція називається своп, 798 00:35:17,230 --> 00:35:20,470 ми насправді відбувається, щоб побачити це Вежа функцій, які були 799 00:35:20,470 --> 00:35:22,400 називається у зворотному хронологічному порядку. 800 00:35:22,400 --> 00:35:23,310 Отже, давайте подивимося, що. 801 00:35:23,310 --> 00:35:24,327 >> Я збираюся, щоб зменшити. 802 00:35:24,327 --> 00:35:25,660 Я збираюся повернутися до моїх кодом. 803 00:35:25,660 --> 00:35:27,540 І тільки тому, що я хочу, бути педантичним тут, 804 00:35:27,540 --> 00:35:31,100 Я збираюся йти вперед і натисніть тільки з лівого боку лінії п'яти. 805 00:35:31,100 --> 00:35:32,830 І, що створює червону крапку. 806 00:35:32,830 --> 00:35:36,200 І зверніть увагу, на правій стороні що відладчик знає, гей, 807 00:35:36,200 --> 00:35:41,020 Я просто сказав, що точки зупину noswap.c лінії п'ять, спеціально 808 00:35:41,020 --> 00:35:42,480 на цього рядка коду. 809 00:35:42,480 --> 00:35:45,090 Так відладчик знає, що я просили наступного разу 810 00:35:45,090 --> 00:35:48,530 Я біжу моя програма його паузу виконання там, а не просто 811 00:35:48,530 --> 00:35:50,390 працює все це дуже швидко. 812 00:35:50,390 --> 00:35:53,889 >> Так що тепер я збираюся натиснути на Debug Кнопка на самому верху IDE 813 00:35:53,889 --> 00:35:55,430 і що збирається робити наступне. 814 00:35:55,430 --> 00:36:00,680 Це збирається відкрити спочатку кілька страшно дивлячись другий термінал window-- 815 00:36:00,680 --> 00:36:02,679 віддаленої налагодження з провести таке і such-- 816 00:36:02,679 --> 00:36:04,970 і ми повернемося до того, що Все це означає, що незабаром. 817 00:36:04,970 --> 00:36:09,020 Але, що важливо зараз є те, що, що червона точка потрапив, 818 00:36:09,020 --> 00:36:11,735 відладчик навмисне зупинився execution-- 819 00:36:11,735 --> 00:36:15,560 Не на цій лінії як такої, а на першому лінії фактичного коду в цій функції. 820 00:36:15,560 --> 00:36:18,040 І ось чому лінія знаходиться сім Тепер виділені жовтим цвітом. 821 00:36:18,040 --> 00:36:20,550 >> А тепер давайте поглянемо на правій стороні. 822 00:36:20,550 --> 00:36:27,300 Схоже, за замовчуванням, досить добре, х має значення, який? 823 00:36:27,300 --> 00:36:27,860 0. 824 00:36:27,860 --> 00:36:29,750 І у має значення, який? 825 00:36:29,750 --> 00:36:30,410 Нуль. 826 00:36:30,410 --> 00:36:35,540 І це можна очікувати в тому сенсі, що х і y--, що жовтий line-- має 827 00:36:35,540 --> 00:36:36,770 ще не виконані. 828 00:36:36,770 --> 00:36:38,510 Так х не повинна мати значення 1. 829 00:36:38,510 --> 00:36:41,470 Це може мати будь-яке інше значення, так званий сміття значення. 830 00:36:41,470 --> 00:36:44,320 І нам пощастило в тому, що це нулю в цій точці, по суті. 831 00:36:44,320 --> 00:36:46,400 >> Так що тепер є тільки кілька Кнопки ми повинні дбати 832 00:36:46,400 --> 00:36:48,100 про при налагодженні таким чином. 833 00:36:48,100 --> 00:36:49,970 Зверніть увагу, тут ми маємо кнопку відтворення. 834 00:36:49,970 --> 00:36:51,877 І якщо ми будемо грати або натисніть резюме, це просто 835 00:36:51,877 --> 00:36:53,710 збирається запустити через інша частина програми 836 00:36:53,710 --> 00:36:55,300 або до тих пір, поки парад ще одну точку зупину. 837 00:36:55,300 --> 00:36:56,910 Але я не встановив будь-який інший зупину, так це просто 838 00:36:56,910 --> 00:36:58,118 збирається запустити до кінця. 839 00:36:58,118 --> 00:37:00,280 Це вид поразок Мета колупатися. 840 00:37:00,280 --> 00:37:03,290 >> Так замість цього, я дбаю про Ці значки праворуч. 841 00:37:03,290 --> 00:37:05,360 І якщо я наведіть курсор миші на їх, як ви повинні теж, 842 00:37:05,360 --> 00:37:07,450 Ви побачите маленькі tips-- підказки. 843 00:37:07,450 --> 00:37:09,020 Це один переступити. 844 00:37:09,020 --> 00:37:11,290 Тепер це не означає, пропуск наступний рядок коду. 845 00:37:11,290 --> 00:37:14,840 Це просто означає, виконати його і перейти до наступної, перейти до наступної, 846 00:37:14,840 --> 00:37:15,580 перейти до наступного. 847 00:37:15,580 --> 00:37:17,610 Іншими словами, за допомогою що кнопка, я можу ходити 848 00:37:17,610 --> 00:37:20,390 через мій код один крок за один раз. 849 00:37:20,390 --> 00:37:21,914 Лінія за лінією, в буквальному сенсі. 850 00:37:21,914 --> 00:37:23,830 Тепер праворуч що є ще один 851 00:37:23,830 --> 00:37:25,163 що ми побачимо на хвилину. 852 00:37:25,163 --> 00:37:27,820 Це так званий Крок в іконі, що це 853 00:37:27,820 --> 00:37:30,300 збирається дозволити мені занурення в іншу функцію. 854 00:37:30,300 --> 00:37:31,800 Але давайте подивимося це в мить. 855 00:37:31,800 --> 00:37:33,280 Так що я збираюся натиснути переступити. 856 00:37:33,280 --> 00:37:35,820 А тепер зверніть увагу, як я натисніть ця кнопка у верхньому правому куті, 857 00:37:35,820 --> 00:37:41,260 тримати очі приблизно під місцевою Змінні і бачити те, що відбувається з х. 858 00:37:41,260 --> 00:37:44,115 х тепер 1, оскільки жовта лінія в даний час виконується вже 859 00:37:44,115 --> 00:37:45,840 і ми переїхали на лінії 8. 860 00:37:45,840 --> 00:37:49,840 І через хвилину у слід сподіватися, стане 2. 861 00:37:49,840 --> 00:37:52,330 >> Тепер, що цікаво нічого відбувається небагато. 862 00:37:52,330 --> 00:37:53,390 Все це є Printf. 863 00:37:53,390 --> 00:37:58,010 І зверніть увагу, в моїй середньої терміналу вікна, я бачу вихід друку DEF. 864 00:37:58,010 --> 00:38:01,080 І тепер у мене є, щоб зробити Рішення програміста. 865 00:38:01,080 --> 00:38:04,360 Я можу переступити цю лінію Код, виконання його, але не 866 00:38:04,360 --> 00:38:06,220 отримувати цікаво, що всередині. 867 00:38:06,220 --> 00:38:11,130 Або я можу насправді крок у цьому і йти всередині самої Swap. 868 00:38:11,130 --> 00:38:12,340 Так давайте зробимо останнього. 869 00:38:12,340 --> 00:38:15,550 >> Дозвольте мені йти вперед і натисніть НЕ Step Over, але Step Into. 870 00:38:15,550 --> 00:38:17,300 Зауважте, всі раптом зміни вікна 871 00:38:17,300 --> 00:38:19,330 щоб виділити перший рядок коду в своп. 872 00:38:19,330 --> 00:38:20,710 Це лінія 21. 873 00:38:20,710 --> 00:38:25,220 А тепер, що вид фанки, що, якщо ви подивіться сюди, як і очікувалося, 874 00:38:25,220 --> 00:38:29,720 коми б 1 і 2, відповідно. 875 00:38:29,720 --> 00:38:33,840 Чому температура 32,767? 876 00:38:33,840 --> 00:38:36,560 Нагадуючи, що темп, так само, як порожня чашка мить тому, 877 00:38:36,560 --> 00:38:38,980 оголошений тут, на лінії 21. 878 00:38:38,980 --> 00:38:43,390 Чому 32,000- Я маю на увазі, чому це просто деякі дивні значення? 879 00:38:43,390 --> 00:38:43,890 Так? 880 00:38:43,890 --> 00:38:45,190 >> АУДИТОРІЯ: Це не инициализирован. 881 00:38:45,190 --> 00:38:46,940 >> Девід Дж Малан: Це ні инициализирован. 882 00:38:46,940 --> 00:38:49,370 Таким чином, наш комп'ютер завжди має фізичну пам'ять. 883 00:38:49,370 --> 00:38:50,544 Це завжди має фізичну пам'ять. 884 00:38:50,544 --> 00:38:52,710 І завжди є Зеро і один знаходиться в там, вірно? 885 00:38:52,710 --> 00:38:54,626 Тому що ми, використовуючи наші комп'ютер протягом усього дня, 886 00:38:54,626 --> 00:38:57,210 Ви використовуєте IDE CS50 або сервери протягом усього дня. 887 00:38:57,210 --> 00:39:01,159 Так що ОЗУ або має декілька нулів або хтось або яким-небудь нулі і одиниці. 888 00:39:01,159 --> 00:39:02,950 Незалежно від того, чи чи не ви їх використання. 889 00:39:02,950 --> 00:39:05,270 Ви не можете просто порожній простору, де ви хочете біт. 890 00:39:05,270 --> 00:39:06,850 Вони або нулі і одиниці. 891 00:39:06,850 --> 00:39:09,610 >> Так що виходить, що темп, тому що ми не инициализирован ще, 892 00:39:09,610 --> 00:39:14,580 у нас є ці 32 біта, але вони вже не инициализирован будь-яким відомим значенням. 893 00:39:14,580 --> 00:39:18,110 Тому, що б вони були найбільш останнім часом використовується for-- тих 32 bits-- 894 00:39:18,110 --> 00:39:23,000 ми просто бачимо артефакти деяких попередня використання цих конкретних 32 895 00:39:23,000 --> 00:39:23,500 біт. 896 00:39:23,500 --> 00:39:27,780 Як тільки я натискаю Step Over, хоча, уф, температура буде отримати значення 1. 897 00:39:27,780 --> 00:39:31,600 І якщо я зроблю це знову, а є буде дано значення 2 898 00:39:31,600 --> 00:39:33,830 а потім б збирається привласнюють значення 1. 899 00:39:33,830 --> 00:39:36,390 >> І так, що в даний час добре на ця точка в історії 900 00:39:36,390 --> 00:39:39,750 є те, що відладчик показуючи мені, супер повільно 901 00:39:39,750 --> 00:39:42,640 в своєму власному темпі, те, що стан своп. 902 00:39:42,640 --> 00:39:47,490 Але зверніть увагу, у верхній тут, повідомлення що стек викликів дійсно 903 00:39:47,490 --> 00:39:49,180 має два шари до нього. 904 00:39:49,180 --> 00:39:53,240 Тепер той, який, як підкреслив Обмін, якщо я натискаю на Головне замість 905 00:39:53,240 --> 00:39:57,100 зверніть увагу, як змінити локальні змінні бо розробник може просто стрибати 906 00:39:57,100 --> 00:39:59,740 і піти в будь-який інший області. 907 00:39:59,740 --> 00:40:04,070 Тому, навіть якщо ми робимо все це працювати і правильно заміни А і В, 908 00:40:04,070 --> 00:40:09,080 якщо я йду туди і назад між своп де а одно 2 і б одно 1 і Основний, 909 00:40:09,080 --> 00:40:11,851 Головна має постраждали взагалі? 910 00:40:11,851 --> 00:40:12,350 Немає. 911 00:40:12,350 --> 00:40:13,930 Так що винос тут? 912 00:40:13,930 --> 00:40:18,200 Ну, виходить, що будь-який час Ви викликаєте функцію як своп, 913 00:40:18,200 --> 00:40:21,600 і ви передаєте його аргументи, те, що ви передаєте у функцію підкачки 914 00:40:21,600 --> 00:40:24,730 У цьому випадку є копією з тих аргументів. 915 00:40:24,730 --> 00:40:28,620 Так що, якщо х і у кожен відповідно 32 біта, те, що Своп отримувати 916 00:40:28,620 --> 00:40:30,760 в два нових місцевих змінні чи аргументи, 917 00:40:30,760 --> 00:40:34,380 називається і В-, але ті, є довільними names-- але модель нулів 918 00:40:34,380 --> 00:40:39,520 і ті, всередині А і В вишикувалися повинна бути ідентична х і у 919 00:40:39,520 --> 00:40:42,610 але вони не є Те ж саме, як х і у. 920 00:40:42,610 --> 00:40:46,880 >> Це як якщо б Основне має на своїй частині папір число 1 і 2 для х і у, 921 00:40:46,880 --> 00:40:49,260 а потім, коли він передає, що аркуш паперу, щоб своп, 922 00:40:49,260 --> 00:40:51,970 Обмін дуже швидко отримує власний ручка, записує 923 00:40:51,970 --> 00:40:56,240 1 і 2 за своєю аркуші паперу, руки назад оригінальний ху до основного 924 00:40:56,240 --> 00:40:58,790 а потім робить свій власний що з а й Ь. 925 00:40:58,790 --> 00:41:01,940 І тепер це супер важливо, тому що це має нетривіальні наслідки 926 00:41:01,940 --> 00:41:06,260 за фактично писати правильний код тому що, здавалося б, ми не можемо поміняти 927 00:41:06,260 --> 00:41:07,500 дві змінні. 928 00:41:07,500 --> 00:41:09,150 >> Я написав правильну функцію підкачки. 929 00:41:09,150 --> 00:41:12,770 Ми здійснили це з Лорен, як правильний функція підкачки насправді, 930 00:41:12,770 --> 00:41:16,700 але не очевидно, жодне з цих питання, якщо ви не можете насправді 931 00:41:16,700 --> 00:41:19,530 поміняти два значення постійно. 932 00:41:19,530 --> 00:41:21,970 Таким чином, ми повинні ще один спосіб насправді отримати на це, 933 00:41:21,970 --> 00:41:24,472 і ми повинні бути в змозі насправді вирішити цю проблему. 934 00:41:24,472 --> 00:41:27,180 І виходить out-- і ми прийдемо повернутися до цієї конкретної картини 935 00:41:27,180 --> 00:41:30,500 Перед long-- це один із способів, що Ви могли б зробити пам'ять комп'ютера. 936 00:41:30,500 --> 00:41:31,460 Це просто прямокутник. 937 00:41:31,460 --> 00:41:32,960 Ви можете зробити це будь різними способами, але це 938 00:41:32,960 --> 00:41:35,740 зручно малювати його як прямокутник з наступної причини. 939 00:41:35,740 --> 00:41:40,040 >> Ми збираємося почати сьогодні і за говорити про так звану стек. 940 00:41:40,040 --> 00:41:43,870 І стек просто шматок з RAM-- шматок memory-- 941 00:41:43,870 --> 00:41:47,100 що функції мають доступ , Коли вони називають. 942 00:41:47,100 --> 00:41:49,800 А так виходить, що на У самому низу цієї стопки 943 00:41:49,800 --> 00:41:53,590 де всі локальні змінні в основних і орг С і орг V і все таке 944 00:41:53,590 --> 00:41:56,950 збираються піти за замовчуванням. І якщо Майні називає деякі інші функції, як обмін, 945 00:41:56,950 --> 00:42:00,330 добре, Обмін збирається отримати ще шар пам'ять над ним. 946 00:42:00,330 --> 00:42:04,490 >> І так просто, щоб дати вам швидкий побіжний картина ця, якщо я йду по here-- 947 00:42:04,490 --> 00:42:09,450 і дозвольте мені дзеркало це на накладні, як well-- що насправді у мене є, 948 00:42:09,450 --> 00:42:12,100 якщо ми дбаємо тільки про Дно цієї картини зараз, 949 00:42:12,100 --> 00:42:15,070 є те, що, коли я запускаю програму і головний викликається, 950 00:42:15,070 --> 00:42:18,330 Головна дається шматок Оперативна пам'ять в моєму комп'ютері, який 951 00:42:18,330 --> 00:42:20,060 в нижній частині цієї так званої стек. 952 00:42:20,060 --> 00:42:22,143 І я збираюся зробити це навмисно у вигляді квадрата. 953 00:42:22,143 --> 00:42:24,540 Так як 32 біт або чотири байти. 954 00:42:24,540 --> 00:42:28,790 І якщо це основна функція має змінна називається х зі значенням 1 955 00:42:28,790 --> 00:42:32,626 і має змінну у зі значенням 2, це 956 00:42:32,626 --> 00:42:35,750 як приймати цей шматочок пам'яті, Головна дано операційної 957 00:42:35,750 --> 00:42:38,850 Система і ділення його так, що перший локальна змінна йде тут, 958 00:42:38,850 --> 00:42:40,930 другий іде тут, і це все. 959 00:42:40,930 --> 00:42:45,590 >> Коли Головна закликає підкачка, своп отримує свій власний шматочок пам'яті 960 00:42:45,590 --> 00:42:48,280 що ми будемо малювати, як це від операційної системи, 961 00:42:48,280 --> 00:42:50,820 і це буде мати свої власні локальні змінні на основі 962 00:42:50,820 --> 00:42:53,825 на нашому реалізації раніше з місцевими змінних а 963 00:42:53,825 --> 00:42:58,010 і б, що спочатку отримати значення 1 і 2. 964 00:42:58,010 --> 00:43:00,450 Але тоді, як тільки Своп код виконує, 965 00:43:00,450 --> 00:43:03,760 і Лорен дійсно міняє місцями OJ і молоко, що відбувається? 966 00:43:03,760 --> 00:43:09,030 Ну, це 2 в 1 стає, це 1 стає 2, і, до речі, 967 00:43:09,030 --> 00:43:13,360 є змінна температура, яка є використовували цю весь час, що в підсумку 968 00:43:13,360 --> 00:43:14,470 йде геть. 969 00:43:14,470 --> 00:43:16,720 Але це не має значення, скільки роботи ви 970 00:43:16,720 --> 00:43:22,160 У цій лінії of-- в цьому просторі пам'яті, х і у є повністю недоторканим. 971 00:43:22,160 --> 00:43:26,320 >> Таким чином, ми повинні якимось чином даючи Обмін і функції, як це 972 00:43:26,320 --> 00:43:32,640 Секрет доступу, якщо хочете, щоб Функції like-- пам'яті як х і у. 973 00:43:32,640 --> 00:43:35,110 Отже, давайте поглянемо на приклад, який допомагає 974 00:43:35,110 --> 00:43:38,220 нам побачити те, що було відбувається весь цей час. 975 00:43:38,220 --> 00:43:40,284 Я збираюся йти вперед і відкрити Порівняти Zero. 976 00:43:40,284 --> 00:43:42,200 І я збираюся закрити наш відладчик, я збираюся 977 00:43:42,200 --> 00:43:44,360 щоб закрити цю страшну дивлячись повідомлення тільки що говорить, почекай хвилинку, 978 00:43:44,360 --> 00:43:45,800 Ви знаходитесь в середній налагодження. 979 00:43:45,800 --> 00:43:48,383 Я збираюся приховувати цю вкладку тут просто повернутися до простоти. 980 00:43:48,383 --> 00:43:50,160 Так що не хвилюйтеся, якщо GDB убитий. 981 00:43:50,160 --> 00:43:53,910 Це просто означає, що програма має було кинути, умисно у цьому випадку, 982 00:43:53,910 --> 00:43:54,820 мною. 983 00:43:54,820 --> 00:43:57,700 >> А тепер Порівняти нуля це робить. 984 00:43:57,700 --> 00:44:00,110 Я використовую CS50 Бібліотека в стандартному I / O. 985 00:44:00,110 --> 00:44:04,319 Я отримав основну функцію, що спочатку говорить, щось сказати, і отримує рядок. 986 00:44:04,319 --> 00:44:06,110 Тоді каже це знову і отримує інший рядок. 987 00:44:06,110 --> 00:44:09,910 І зауважте, що ці два рядки називаються S і T, відповідно. 988 00:44:09,910 --> 00:44:12,910 А тепер ця програма, порівняння Нуль, його мета в житті, 989 00:44:12,910 --> 00:44:15,470 він повинен сказати мені, я типу те ж саме? 990 00:44:15,470 --> 00:44:16,910 І тому я збираюся назад в тиждень один. 991 00:44:16,910 --> 00:44:19,950 Я використовую свій рівний рівного оператора яка є оператором якості. 992 00:44:19,950 --> 00:44:22,220 Чи не оператор присвоювання, оператор рівності. 993 00:44:22,220 --> 00:44:23,890 Я просто порівнюючи з і т. 994 00:44:23,890 --> 00:44:27,470 >> Отже, давайте насправді йти вперед і робити це. 995 00:44:27,470 --> 00:44:32,680 І я збираюся йти вперед і зробити порівняння Zero. 996 00:44:32,680 --> 00:44:35,110 Я збираюся зробити ./comparezero. 997 00:44:35,110 --> 00:44:37,150 І я збираюся піти вперед і щось сказати 998 00:44:37,150 --> 00:44:43,450 як, давайте робити мамі в нижньому регістрі а як щодо мами у верхньому регістрі. 999 00:44:43,450 --> 00:44:45,034 І, звичайно, я друкую різні речі. 1000 00:44:45,034 --> 00:44:45,533 Добре. 1001 00:44:45,533 --> 00:44:46,570 Це слід було очікувати. 1002 00:44:46,570 --> 00:44:47,640 >> Давайте запустити його знову. 1003 00:44:47,640 --> 00:44:49,740 Обидва рази зробити нижній регістр, нижній регістр. 1004 00:44:49,740 --> 00:44:51,490 Це виглядає супер ідентичні для мене. 1005 00:44:51,490 --> 00:44:52,930 Enter. 1006 00:44:52,930 --> 00:44:53,430 ДОБРЕ. 1007 00:44:53,430 --> 00:44:55,804 Може бути, це просто дивно, тому що це не подобається мій граматики. 1008 00:44:55,804 --> 00:44:59,930 Так давайте зробимо капіталу MOM, Столиця MOM, ідентичні. 1009 00:44:59,930 --> 00:45:01,490 Різні речі. 1010 00:45:01,490 --> 00:45:03,907 >> Так чому ж це? 1011 00:45:03,907 --> 00:45:06,240 Ну, що насправді відбувається на під капотом тут? 1012 00:45:06,240 --> 00:45:08,180 Отже, давайте повернемося протягом тут на мить 1013 00:45:08,180 --> 00:45:10,910 і розглянути, що GetString насправді робить. 1014 00:45:10,910 --> 00:45:13,385 Коли ви телефонуєте GetString, що це функція, яку ми 1015 00:45:13,385 --> 00:45:16,510 самі писали і це якось отримує послідовність символів від користувача. 1016 00:45:16,510 --> 00:45:20,280 І давайте припустимо, що перший Час я називаю GetString, що дає мені 1017 00:45:20,280 --> 00:45:21,930 шматок пам'яті, який виглядає, як це. 1018 00:45:21,930 --> 00:45:26,990 І якщо я набрав в нижньому регістрі м-о-m-- і те, що йде після нього? 1019 00:45:26,990 --> 00:45:28,840 Просто швидка перевірка розсудливість. 1020 00:45:28,840 --> 00:45:29,780 >> Обернена коса риска нулю. 1021 00:45:29,780 --> 00:45:30,510 Ми знаємо, що. 1022 00:45:30,510 --> 00:45:32,784 І пам'ятайте, що ми грали навколо з ім'ям Zamila в 1023 00:45:32,784 --> 00:45:34,950 і купа інших імен коли Роб був тут шукаєте 1024 00:45:34,950 --> 00:45:36,280 на те, що відбувається всередині пам'яті. 1025 00:45:36,280 --> 00:45:37,780 Так що історія точно такий же. 1026 00:45:37,780 --> 00:45:40,160 Це те, що GetString повертається до мене. 1027 00:45:40,160 --> 00:45:44,780 Тепер, мій код хвилину тому зберігатися повертається значення GetString 1028 00:45:44,780 --> 00:45:47,510 у змінній називається с. 1029 00:45:47,510 --> 00:45:51,390 І тоді вдруге я назвав його, він зберігав його в змінній називається т. 1030 00:45:51,390 --> 00:45:55,070 >> Так що, якщо я йду сюди, мені потрібно звернути на це місцевий переменная-- 1031 00:45:55,070 --> 00:45:59,610 і я, як правило збирається намалювати рядок як просто-- ми будемо 1032 00:45:59,610 --> 00:46:02,360 називають його S-- як невеликій площі тут. 1033 00:46:02,360 --> 00:46:09,760 А тепер, як робить somehow-- мама перейти всередині цього змінного х? 1034 00:46:09,760 --> 00:46:12,010 Ну, ми повинні повернутися до початкових принципів тут. 1035 00:46:12,010 --> 00:46:15,660 Що насправді повернення GetString? 1036 00:46:15,660 --> 00:46:19,030 >> Так що виходить, що M-O-M Обернена коса риска нулю, і будь-яке число 1037 00:46:19,030 --> 00:46:22,364 інших рядків у пам'яті, як Zamila і Роб або Енді, або будь-які інші, 1038 00:46:22,364 --> 00:46:24,280 , Звичайно, в нашому Оперативна пам'ять або пам'ять комп'ютера. 1039 00:46:24,280 --> 00:46:27,760 І ваша пам'ять має like-- у вас є гігабайт оперативної пам'яті, два гігабайти оперативної пам'яті, 1040 00:46:27,760 --> 00:46:30,860 або мільярд, або два мільярди байт, або, може бути, навіть більше в ці дні. 1041 00:46:30,860 --> 00:46:34,070 Отже, давайте припустимо, для сьогоднішніх цілей, що це не має значення, як ми номер 1042 00:46:34,070 --> 00:46:36,640 їм, але ми можемо номер кожен з тих, мільярд чи два мільярди 1043 00:46:36,640 --> 00:46:37,880 або чотири мільярди байт. 1044 00:46:37,880 --> 00:46:42,240 >> І давайте просто сказати, що завгодно це перший укус, по-друге прикус, 1045 00:46:42,240 --> 00:46:43,380 третій, четвертий. 1046 00:46:43,380 --> 00:46:46,570 Я навмисно не використовую нуль для сьогодні, але ми повернемося до цього. 1047 00:46:46,570 --> 00:46:49,570 Отже, іншими словами, якщо це Самий перший раз, коли я за допомогою програми, 1048 00:46:49,570 --> 00:46:52,715 Я просто щастить, і перший укус на місці одного потім два 1049 00:46:52,715 --> 00:46:53,590 потім три, ніж чотири. 1050 00:46:53,590 --> 00:46:57,430 І, якщо я не малюнок, номер ящика два мільярди би спосіб тут. 1051 00:46:57,430 --> 00:47:02,200 >> Так що ви думаєте, то, GetString фактично повертає? 1052 00:47:02,200 --> 00:47:06,010 Це не повернення М-О-М зворотну косу риску нульовий такої, тому що це явно 1053 00:47:06,010 --> 00:47:08,180 не вписуватиметься у вікно, що я намалював. 1054 00:47:08,180 --> 00:47:11,210 Так що ще може насправді GetString повертатися всі ці тижні? 1055 00:47:11,210 --> 00:47:14,410 1056 00:47:14,410 --> 00:47:16,820 Відповідь на дошка десь тут. 1057 00:47:16,820 --> 00:47:20,390 Ви не можете помістити М-О-М зворотну косу риску нульовий, так, що може мати сенс, а? 1058 00:47:20,390 --> 00:47:23,424 Якщо ви повинні були бути супер розумним, поклавши на так званій інженерної капелюсі, 1059 00:47:23,424 --> 00:47:24,340 Що б ви могли повернутися? 1060 00:47:24,340 --> 00:47:27,340 Що найменша кількість інформації Ви могли б повернутися, що б ще 1061 00:47:27,340 --> 00:47:30,610 дозволяють знайти M-O-M в пам'яті? 1062 00:47:30,610 --> 00:47:31,270 Так? 1063 00:47:31,270 --> 00:47:31,950 >> АУДИТОРІЯ: Одне. 1064 00:47:31,950 --> 00:47:32,200 >> Девід Дж Малан: Одне. 1065 00:47:32,200 --> 00:47:33,021 І чому один? 1066 00:47:33,021 --> 00:47:35,520 АУДИТОРІЯ: Тому що скаже Ви куди йти [нерозбірливо]. 1067 00:47:35,520 --> 00:47:38,391 1068 00:47:38,391 --> 00:47:39,390 Девід Дж Малан: Точно. 1069 00:47:39,390 --> 00:47:44,300 Я просто хочу, щоб повернути адреса рядки, які я отримав. 1070 00:47:44,300 --> 00:47:46,570 Адреса в цей випадок місце одним. 1071 00:47:46,570 --> 00:47:51,280 Так що насправді зберігається в S-- і кожна змінна рядок, таким чином, far-- 1072 00:47:51,280 --> 00:47:53,430 тільки було адреса цього рядка. 1073 00:47:53,430 --> 00:47:57,840 >> Між тим, якщо я називаю GetString вдруге, і я 1074 00:47:57,840 --> 00:48:03,300 введіть в буквальному сенсі той же thing-- М-О-М з lowercase-- M-O-М 1075 00:48:03,300 --> 00:48:06,200 і ще один знак нулю, і тепер, можливо, моя програма-х 1076 00:48:06,200 --> 00:48:09,820 працює вже протягом деякого часу, так, може бути, це 10, це розташування 11, це 12, 1077 00:48:09,820 --> 00:48:10,700 це 13. 1078 00:48:10,700 --> 00:48:13,590 Комп'ютери, які використовують деякі інші пам'яті з якої причини. 1079 00:48:13,590 --> 00:48:18,172 Що зараз йде в мою секунду змінна в моїй програмі т? 1080 00:48:18,172 --> 00:48:19,390 10. 1081 00:48:19,390 --> 00:48:20,050 Точно. 1082 00:48:20,050 --> 00:48:23,910 >> І тому, коли ми дивимося на Вихідний код цієї програми 1083 00:48:23,910 --> 00:48:26,550 де я просто намагаюся порівняти два значення, 1084 00:48:26,550 --> 00:48:32,180 це S дорівнює дорівнює т, що очевидне людини відповідь? 1085 00:48:32,180 --> 00:48:34,890 Просто немає, тому що 1 не дорівнює 10. 1086 00:48:34,890 --> 00:48:36,861 І так тут, лежить можливість для нас насправді 1087 00:48:36,861 --> 00:48:39,610 просто повернутися, знову ж, в першу принципи і думати, добре, 1088 00:48:39,610 --> 00:48:41,110 що відбувається під капотом? 1089 00:48:41,110 --> 00:48:43,240 Ми говоримо про біти і байти і пам'ять, 1090 00:48:43,240 --> 00:48:46,820 але це насправді корисно, щоб зрозуміти тому що, коли ви телефонуєте GetString, 1091 00:48:46,820 --> 00:48:50,280 навіть якщо ми думаємо, що це через повернення M-O-м або рядок маму 1092 00:48:50,280 --> 00:48:53,120 або Енді, або Zamila або і т.п., технічно 1093 00:48:53,120 --> 00:48:55,510 це просто повернення адреса цього шматка пам'яті. 1094 00:48:55,510 --> 00:48:56,910 >> Але це нормально. 1095 00:48:56,910 --> 00:49:00,570 Тому що, як я знаю, де рядок закінчується? 1096 00:49:00,570 --> 00:49:03,840 Якщо я тільки дав початок? 1097 00:49:03,840 --> 00:49:05,380 Ну, зворотний слеш нуль, вірно? 1098 00:49:05,380 --> 00:49:08,800 Просто в лінійному часу я можу роздрукувати з печаткою чіткості M-O-М. 1099 00:49:08,800 --> 00:49:11,820 І як тільки я бачу зворотну косу риску нулю, я не хвилює, де я почав, 1100 00:49:11,820 --> 00:49:14,950 Я вже знаю, неявно де мені потрібно, щоб закінчити. 1101 00:49:14,950 --> 00:49:18,700 >> І тому сьогодні відзначає beginning-- і дозвольте мені зробити це різко, тому що ми 1102 00:49:18,700 --> 00:49:21,800 пішов через багато неприємностей отримати їх тут навчання wheels-- 1103 00:49:21,800 --> 00:49:29,840 так що сьогодні навчальні колеса починають відірватися і ми розкриваємо в міру: 1104 00:49:29,840 --> 00:49:31,373 >> [Оплески] 1105 00:49:31,373 --> 00:49:33,220 1106 00:49:33,220 --> 00:49:36,160 >> Це було добре коштує поїздка на ціль в цей ранок, так? 1107 00:49:36,160 --> 00:49:39,600 Так now-- Тобто, виходить з, немає такої речі, як рядки. 1108 00:49:39,600 --> 00:49:41,140 Рядок не існує. 1109 00:49:41,140 --> 00:49:43,760 Це синонім, що ми мали всередині бібліотеки CS50. 1110 00:49:43,760 --> 00:49:48,660 Відтепер ми збираємося почати називати с і т не рядки, але символьні зірки. 1111 00:49:48,660 --> 00:49:51,180 І символ зірки ми будемо дражнити один від одного, перш ніж довгий. 1112 00:49:51,180 --> 00:49:53,510 Але це є, що навіть якщо ми будемо продовжувати 1113 00:49:53,510 --> 00:49:56,180 використовуючи GetString зараз, технічно я повинен 1114 00:49:56,180 --> 00:49:59,010 бути кажучи сЬаг зірку і голець зірку. 1115 00:49:59,010 --> 00:50:01,720 >> І виходить, що це за зірка позначатиме щось 1116 00:50:01,720 --> 00:50:04,340 називається покажчиком або адресу. 1117 00:50:04,340 --> 00:50:06,110 І справді, тизер за те, що лежить попереду 1118 00:50:06,110 --> 00:50:09,760 це 20 другий кліп від нашого друг Нік Parlante в Стенфорді 1119 00:50:09,760 --> 00:50:12,927 який, деякий час тому, витратити смішне кількість часу, 1120 00:50:12,927 --> 00:50:15,010 як краще я можу сказати на його кухня або його підвал, 1121 00:50:15,010 --> 00:50:17,140 робить claymation введення в світ 1122 00:50:17,140 --> 00:50:20,010 персонаж на ім'я Бінки, з якими ми будемо 1123 00:50:20,010 --> 00:50:22,010 бути введені в наступний раз покажчиків. 1124 00:50:22,010 --> 00:50:24,588 Так от перегляд того, що має прийти. 1125 00:50:24,588 --> 00:50:26,370 >> [ВІДТВОРЕННЯ ВІДЕО] 1126 00:50:26,370 --> 00:50:27,510 >> Гей, Бінки. 1127 00:50:27,510 --> 00:50:28,260 Прокидайся. 1128 00:50:28,260 --> 00:50:30,672 Це час для покажчика задоволення. 1129 00:50:30,672 --> 00:50:31,616 >> -Що це? 1130 00:50:31,616 --> 00:50:33,032 Дізнайтеся про покажчиків? 1131 00:50:33,032 --> 00:50:34,450 О, позитивний герой. 1132 00:50:34,450 --> 00:50:35,431 >> [КІНЕЦЬ ПЕРЕГЛЯДУ] 1133 00:50:35,431 --> 00:50:38,055 Девід Дж Малан: І на цій ноті, ми будемо бачити Вас в середу. 1134 00:50:38,055 --> 00:50:47,590 1135 00:50:47,590 --> 00:50:48,090 Добре. 1136 00:50:48,090 --> 00:50:48,740 Хто танцює? 1137 00:50:48,740 --> 00:50:49,240 Давай. 1138 00:50:49,240 --> 00:50:50,330 Хто танцює? 1139 00:50:50,330 --> 00:50:51,820 Ви хочете, щоб я, щоб він почав? 1140 00:50:51,820 --> 00:50:53,770 Я отримаю це почалося. 1141 00:50:53,770 --> 00:50:54,270 Woooo! 1142 00:50:54,270 --> 00:51:04,070 1143 00:51:04,070 --> 00:51:07,580 >> Лорен: Солодкий фантазії Мойсей.