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 за фальсификацию 11 миллионов автомобилей в помочь ему победить тесты выбросов. 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 2. 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 2. 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 Войти. 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 >> Лорен: Сладкий фантазии Моисей.