1 00:00:00,000 --> 00:00:10,550 2 00:00:10,550 --> 00:00:14,050 >> DAVID J. Malan: Това е 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 -Cars, Най-умните героите в Бързи и яростни филмите. 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 >> [END PLAYBACK] 19 00:01:04,280 --> 00:01:05,220 >> DAVID J. Malan: Така че нека да разгледаме този 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 както са определени от Clean Закон Air в САЩ. 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 от изследователи в West Университет на Вирджиния. 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 >> По време на изпитването за емисии на EPA, Софтуерът на превозни средства 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 специално селективна каталитична намаляване на NОx с ниска концентрация 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 по-горе, съответстващи на нивата на СИП в зависимост от вида на кола цикъл. 75 00:03:47,450 --> 00:03:50,800 >> И така, какво всъщност означава и изходния код на протичане софтуер 76 00:03:50,800 --> 00:03:53,190 на Фолксваген не разполага все още не са публично оповестени, 77 00:03:53,190 --> 00:03:56,460 е, че ефективно, този еквивалент е там някъде вътре 78 00:03:56,460 --> 00:03:57,830 на код на Volkswagen. 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 >> Else, във всяка друга ситуация когато не е констатирано, че са 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 >> -Last Петък СИП обяви, че някои Автомобили 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 В действителност, тяхната CEO, Martin Винтеркорн, просто се оттегли от поста. 141 00:06:48,600 --> 00:06:49,820 >> И така, какво се случва след това? 142 00:06:49,820 --> 00:06:53,900 Е, ако вие сте един от половината милиона дизелови Jettas, Beatles, Golfs, Passats, 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 >> [END PLAYBACK] 153 00:07:16,711 --> 00:07:19,960 DAVID J. Malan: Така че това всъщност повдига интересен голяма картина въпрос 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 Всички ние имаме Iphones или андроидите или нещо в джобовете ни най-вероятно 157 00:07:24,300 --> 00:07:26,500 тези дни, или лаптопи на нашите обиколки, които са 158 00:07:26,500 --> 00:07:28,510 използвате софтуера, изработен от Apple и 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 Самата система като IOS или 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 Откъде знаеш, че когато вие се изпълняват звън 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 сравнително прост пример за това как дори компилатор като звън или каквото 194 00:09:09,430 --> 00:09:13,950 компилатори други са използвани в миналото, ами ако вградена в съставител WE 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 >> И какво Ken Thompson продължава да се направи в речта си 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 Сега, може би сте се чудеха и забелязах че е имало съвсем мъничко Darth 227 00:10:43,410 --> 00:10:45,842 Vader в клиповете, които The Verge се показва там 228 00:10:45,842 --> 00:10:47,550 за Volkswagen. Ако никога не сте виждали, I 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 [MUSIC - ТЕМА ОТ "Междузвездни войни"] 237 00:11:08,198 --> 00:11:35,643 238 00:11:35,643 --> 00:11:38,138 [DOG лае] 239 00:11:38,138 --> 00:11:50,114 240 00:11:50,114 --> 00:11:53,607 [CAR ЗАПОЧВА] 241 00:11:53,607 --> 00:12:04,086 242 00:12:04,086 --> 00:12:05,955 [END PLAYBACK] 243 00:12:05,955 --> 00:12:06,830 DAVID J. Malan: Да. 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 бе да се намери Майк Смит в телефонния указател. 259 00:12:41,510 --> 00:12:46,216 И забележи по-специално линии осем и 11, които имаше това изявление Go To. 260 00:12:46,216 --> 00:12:48,090 И в действителност, някои езици, C между тях, 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 търси за Mike в лявата половина на книгата. 274 00:13:25,110 --> 00:13:28,560 Иначе, ако Смит е по-късно през книга, търсене на Mike в дясно 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 Търся за Mike в телефонния указател и след това 279 00:13:34,250 --> 00:13:37,090 Аз в крайна сметка може би хит Онлайн седем или може би линия 10 280 00:13:37,090 --> 00:13:41,089 и моята инструкция за себе си е търсене за Mike в половината от телефонния указател. 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 Трябва да продължавам да търся за Mike Smith защото той е или на тази страница 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 нарича функция на Mt. самия. 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 Един от които се нарича Sigma 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 >> DAVID J. Malan: Така че функцията 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 съставител звън не е Ще знаете, че тя съществува. 343 00:16:29,320 --> 00:16:32,400 И същото важи и за линия където две INT се определя 344 00:16:32,400 --> 00:16:35,101 ФОРМАТ, което е функция ние продължаваме да се използва доста малко. 345 00:16:35,101 --> 00:16:37,850 Сега, четвърти ред изглежда малко фънки защото това е просто една подложка. 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 DAVID J. Malan: Точно така. 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 Така звън и най- компилатори са вид неми 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 DAVID J. Malan: Ами, не. 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 И тогава аз просто продължавай Увеличаването I. А прозрение 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 Ето сигма one-- така че втора версия на този код. 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 Ако m е по-малко от или равно на нула, аз трябва да се справят с вид 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, както и на сигма m минус 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 Така че m е 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 Else I върне м, което е това нещо, плюс сигма на каква стойност? 468 00:21:53,445 --> 00:21:56,160 469 00:21:56,160 --> 00:21:59,650 Така че, ако сигма на 1-- защото m е точно сега, така 2 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-- така един очевидно не е по-малко от нула, все още не се прилага. 473 00:22:09,120 --> 00:22:12,970 >> Else завръщането 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 от само себе си, повтаряйки обява nauseum престава, защото това, което 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 плюс 1 е 0. 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 Бихте някой, който е много добър в Googling ума 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 >> SAM: Сам. 514 00:23:42,870 --> 00:23:44,290 >> DAVID J. Malan: Сам, хайде надолу. 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 OK Кликнете това. 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 >> SAM: No. 535 00:24:15,280 --> 00:24:15,520 >> DAVID J. Malan: OK. 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-- OK. 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 Wonderful. 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 очевидно е малко глупаво IF условия, които са по същество 555 00:24:58,860 --> 00:25:01,160 проверка дали потребителят трябва въвели в тази фраза, 556 00:25:01,160 --> 00:25:03,760 направи нещо, което най-вероятно се а nontrivial период от време 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 >> LAUREN: Lauren. 576 00:25:44,810 --> 00:25:45,768 >> DAVID J. Malan: Lauren. 577 00:25:45,768 --> 00:25:46,890 Хайде нагоре, Лорън. 578 00:25:46,890 --> 00:25:50,140 Така Lauren се е справи тук, както следва. 579 00:25:50,140 --> 00:25:52,310 Приятно ми е. 580 00:25:52,310 --> 00:25:55,730 Така че тук има Lauren пред на нейните две празни чаши. 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 LAUREN: Сложете го в още една чаша. 591 00:26:27,400 --> 00:26:28,191 DAVID J. Malan: OK. 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 временната променлива, мляко в променливата ОВ, 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 Тук, просто да го Geek нагоре малко, това ще бъде съответната С код 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 инт му. 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 Но след това, че кодът е точно като Lauren тук приложени. 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 Но това вид вид изглежда като мляко и ОВ. 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 LAUREN: Никакви други чаши? 627 00:28:04,800 --> 00:28:05,940 DAVID J. Malan: Никакви други чаши. 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 Good. 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 >> DAVID J. Malan: 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 >> LAUREN: Това е вода. 648 00:28:41,200 --> 00:28:41,930 >> DAVID J. Malan: Това е най-вече вода. 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 Благодаря ви за Lauren. 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 И това е съответният C код. 665 00:29:13,060 --> 00:29:16,110 И ако си спомняте от миналата Сряда, ние въведохме, ако за кратко, 666 00:29:16,110 --> 00:29:19,720 някои нови оператори в C. И прави Някой припомни какво малката моркова 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 >> DAVID J. Malan: EXOR. 671 00:29:27,645 --> 00:29:28,560 Exclusive Or. 672 00:29:28,560 --> 00:29:32,920 Така че, ако искате, просто за забавление в у дома, за да се получи и б две произволно 673 00:29:32,920 --> 00:29:36,072 ценности като всеки eight-- и аз ще избере осем битова стойност. 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 бита, като в случай на действително междинно съединение, 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 се изправят пред предизвикателството да направят това с това най-малко RAM и по-малко 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 >> Така че как можем да what-- виж това в действителния код? 705 00:31:02,200 --> 00:31:04,530 Позволете ми давай сега и да се отворят за пример 706 00:31:04,530 --> 00:31:07,700 че умишлено се нарича Не Swap, защото това не е така 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 библиотека става, просто стандартна I / O. 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 >> I произволно определен х и у, съответно, този, ценности и двамата 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 и Y е 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 Но файла, разбира се, се нарича Не Swap. 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 Това също трябва да работи като с млякото и ОВ, 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 Така че нека да тичам Не Swap отново. 737 00:32:32,010 --> 00:32:32,900 Може би I-- не. 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 Позволете ми давай тук, в Swap и просто да добавите, чакай малко, 741 00:32:39,690 --> 00:32:43,856 а е аз% / п и нека плъг-ин на стойността на един. 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 близък до първата половина на Dan Видео Armendariz в PSET3 746 00:32:53,560 --> 00:32:56,870 където ние въведохме печат дефиниция като препоръчителна техника, най-малко 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, Y е 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-- AKA A-- и това е да се прехвърлят y-- AKA б. 764 00:33:48,980 --> 00:33:51,900 Някак си тези три линии са смяна на тези ценности точно 765 00:33:51,900 --> 00:33:53,510 като Lauren направих с млякото и ОВ. 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 и добавяне ФОРМАТ и съставяне и бягане, които вече са в работно време 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 >> Call стак е един луксозен начин на казвайки какви функции са в момента 795 00:35:12,990 --> 00:35:14,140 се нарича в момента. 796 00:35:14,140 --> 00:35:15,370 Main винаги се нарича първото. 797 00:35:15,370 --> 00:35:17,230 Но ако Main нарича функция, наречена Swap, 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 >> Така че сега аз отивам да кликнете за отстраняване на грешки бутон на самия връх на 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 държи грубо очите си под Local Променливи и да видим какво се случва с х. 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 Всичко това е е ФОРМАТ. 863 00:37:53,390 --> 00:37:58,010 И забележи, по мое вторично терминал прозорец, виждам изхода на печат деф. 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 Или всъщност мога да стъпи в него и влезе вътре на самия суап. 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 за да маркирате първата ред код в Swap. 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 Защо е темп 32767? 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 >> DAVID J. Malan: Това е не е инициализиран. 882 00:38:46,940 --> 00:38:49,370 Така нашия компютър винаги има физическа памет. 883 00:38:49,370 --> 00:38:50,544 Тя винаги има физическа RAM. 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 сте с помощта на CS50 IDE или сървърите през целия ден. 887 00:38:57,210 --> 00:39:01,159 Така, че RAM или има някои нули или някой или някои нули и единици. 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 в моето собствено темпо, това, което състоянието на Swap е. 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 Сега този, който се изтъква като Swap, ако кликнете върху Main вместо това, 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 ако отида напред и назад между Swap където а е 2 и б е 1 и Майн, 909 00:40:09,080 --> 00:40:11,851 е Main били засегнати изобщо? 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 Е, оказва се, че по всяко време ти се обадя функция като Swap, 913 00:40:18,200 --> 00:40:21,600 и ти мине доводите, какво което преминава към функцията Swap 914 00:40:21,600 --> 00:40:24,730 в този случай е копие на тези доводи. 915 00:40:24,730 --> 00:40:28,620 Така че, ако х и у са всеки съответно 32 бита, това, което става все по-Swap 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 >> Това е така, сякаш Main има на своята част от хартия броят 1 и 2 за х и у, 921 00:40:46,880 --> 00:40:49,260 и след това, когато тя ръце, които парче хартия, за да се размени, 922 00:40:49,260 --> 00:40:51,970 Swap много бързо получава собствена химикалка, написва 923 00:40:51,970 --> 00:40:56,240 1 и 2 по себе си лист хартия, ръцете назад оригиналния XY да Main 924 00:40:56,240 --> 00:40:58,790 и след това прави своя нещо с а и б. 925 00:40:58,790 --> 00:41:01,940 И сега това е супер важно, защото това има последици nontrivial 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 >> Написал съм вярна функция Swap. 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 е мястото, където всички локални променливи Основни му и орг C и орг V и всички тези неща 944 00:41:53,590 --> 00:41:56,950 Ще отида по подразбиране. И ако Main призовава някаква друга функция като Swap, 945 00:41:56,950 --> 00:42:00,330 добре, Swap ще се получи друг слой от паметта до над него. 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 Main е дадено парче RAM в компютъра ми, че е 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 като приемате това късче памет, която Main е дадено от операционната 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 >> Когато Main призовава Swap, Swap получава собствен дял от паметта 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 Но след това, веднага след като кода за Swap изпълнява, 965 00:43:00,450 --> 00:43:03,760 и Lauren всъщност суапове ОВ и мляко, което се случва? 966 00:43:03,760 --> 00:43:09,030 Е, този 2 се превръща в едно, това 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 >> Така че ние трябва по някакъв начин да даде Swap и функции като него 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 Отивам да се продължи напред и да се отворят Сравни нула. 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 и Т, съответно. 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 И аз ще отида напред и да направи сравнение на нула. 996 00:44:32,680 --> 00:44:35,110 Отивам да направя ./comparezero. 997 00:44:35,110 --> 00:44:37,150 И аз ще отида напред и да каже нещо 998 00:44:37,150 --> 00:44:43,450 харесват, нека да направим майка с малки букви и какво ще кажеш за майка с главни букви. 999 00:44:43,450 --> 00:44:45,034 И, разбира се объркат различни неща. 1000 00:44:45,034 --> 00:44:45,533 Всичко е наред. 1001 00:44:45,533 --> 00:44:46,570 Това е да се очаква. 1002 00:44:46,570 --> 00:44:47,640 >> Нека да го стартирате отново. 1003 00:44:47,640 --> 00:44:49,740 И двата пъти правят малки букви, малки букви. 1004 00:44:49,740 --> 00:44:51,490 Това изглежда супер идентичен с мен. 1005 00:44:51,490 --> 00:44:52,930 Enter. 1006 00:44:52,930 --> 00:44:53,430 ДОБРЕ. 1007 00:44:53,430 --> 00:44:55,804 Може би това е просто странно, защото това не е хареса ми граматиката. 1008 00:44:55,804 --> 00:44:59,930 Така че нека да се направи капитал MOM, капитали MOM, идентични. 1009 00:44:59,930 --> 00:45:01,490 Различни неща. 1010 00:45:01,490 --> 00:45:03,907 >> Така че, защо е това? 1011 00:45:03,907 --> 00:45:06,240 Е, какво всъщност ще за под предния капак тук? 1012 00:45:06,240 --> 00:45:08,180 Така че нека да се върнем отново тук само за миг 1013 00:45:08,180 --> 00:45:10,910 и помислете какво GetString е всъщност прави. 1014 00:45:10,910 --> 00:45:13,385 Когато се обадите GetString, това е функция ние 1015 00:45:13,385 --> 00:45:16,510 се пише и то някак си получава последователност от символи от страна на потребителя. 1016 00:45:16,510 --> 00:45:20,280 И нека приемем, че първият време аз наричам GetString, че ми дава 1017 00:45:20,280 --> 00:45:21,930 парче от паметта, който изглежда така. 1018 00:45:21,930 --> 00:45:26,990 И ако аз напечатани във всички малки букви м-о-m-- и какво се случва след това? 1019 00:45:26,990 --> 00:45:28,840 Само един бърз чек здрав разум. 1020 00:45:28,840 --> 00:45:29,780 >> Обратно наклонена черта нула. 1021 00:45:29,780 --> 00:45:30,510 Ние знаем, че. 1022 00:45:30,510 --> 00:45:32,784 И припомни, че играхме наоколо с името на Zamila 1023 00:45:32,784 --> 00:45:34,950 и куп други имена когато Роб беше тук търсите 1024 00:45:34,950 --> 00:45:36,280 в това, което се случва вътре в паметта. 1025 00:45:36,280 --> 00:45:37,780 Така че тази история е точно същото. 1026 00:45:37,780 --> 00:45:40,160 Това е, което GetString се връща към мен. 1027 00:45:40,160 --> 00:45:44,780 Сега, моя код преди малко се съхранява стойността връщане на GetString 1028 00:45:44,780 --> 00:45:47,510 в променлива S. 1029 00:45:47,510 --> 00:45:51,390 И след това втори път аз го нарича, то тя се съхранява в променлива т. 1030 00:45:51,390 --> 00:45:55,070 >> Така че ако отида тук, имам нужда да изготви този местен variable-- 1031 00:45:55,070 --> 00:45:59,610 и аз съм като цяло ще изготвят низ като just-- пускаме 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 са, разбира се, в нашата RAM или памет на компютъра. 1039 00:46:24,280 --> 00:46:27,760 И вашата RAM има like-- имате концерт на RAM, две участия на RAM, 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 Това не е връщане M-O-M наклонена черта нулата само по себе си, защото това очевидно 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 Вие не може да се побере M-O-M наклонена черта нула, И така, какво може да има смисъл, а? 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 >> АУДИТОРИЯ: One. 1064 00:47:31,950 --> 00:47:32,200 >> DAVID J. Malan: One. 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 DAVID J. Malan: Точно така. 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-- М-O-M с lowercase-- М-О-М 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 е е равно равно на тон, което е очевидния човешки отговор? 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-M или низ майка 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-M. 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 така че днес джанти за обучение започват да влезе и ние разкрие най least-- 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 String не съществува. 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 за сега, технически I следва 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 секунди клип от нашата приятел Nick 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 герой на име Binky, с които ние ще 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 >> -Hey, Binky. 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 >> [END PLAYBACK] 1133 00:50:35,431 --> 00:50:38,055 DAVID J. Malan: И на тази бележка, ние ще се видим в сряда. 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 >> LAUREN: Sweet фантазия Мойсей.