1 00:00:00,000 --> 00:00:10,550 2 00:00:10,550 --> 00:00:14,050 >> DAVID J. Malan: Aquest és CS50 i aquest és el començament de la setmana quatre. 3 00:00:14,050 --> 00:00:18,630 I, noi, és Volkswagen a problemes tot per culpa de programari. 4 00:00:18,630 --> 00:00:20,264 Fem una ullada. 5 00:00:20,264 --> 00:00:20,930 [REPRODUCCIÓ DE VÍDEO] 6 00:00:20,930 --> 00:00:25,560 -Cars, Els personatges més intel·ligents en les pel·lícules de Ràpid i Furiós. 7 00:00:25,560 --> 00:00:29,100 Aquesta setmana fabricant d'automòbils alemany Volkswagen va trobar 8 00:00:29,100 --> 00:00:32,490 enmig d'un escàndol de proporcions potencialment criminals. 9 00:00:32,490 --> 00:00:36,060 >> -Volkswagen Es prepara per a milers de milions en multes, possibles càrrecs criminals 10 00:00:36,060 --> 00:00:38,560 per als seus executius, com la companyia es disculpa 11 00:00:38,560 --> 00:00:41,840 per a la manipulació dels 11 milions de cotxes a l' ajudar-la a vèncer les proves d'emissions. 12 00:00:41,840 --> 00:00:44,950 >> Models dièsel -Certs eren dissenyat amb un sofisticat programari 13 00:00:44,950 --> 00:00:48,440 que la informació utilitzada incloent el posició de la direcció i el vehicle 14 00:00:48,440 --> 00:00:51,870 accelerar per determinar el cotxe era sotmetre a les proves d'emissions. 15 00:00:51,870 --> 00:00:55,650 Sota aquesta circumstància, el motor reduiria les emissions tòxiques. 16 00:00:55,650 --> 00:00:59,070 Però el cotxe va ser manipulada a pont que quan s'estava sent conduït. 17 00:00:59,070 --> 00:01:03,320 Les emissions van augmentar de 10 a 40 vegades per sobre dels nivells d'EPA acceptables. 18 00:01:03,320 --> 00:01:04,280 >> [FI DE REPRODUCCIÓ] 19 00:01:04,280 --> 00:01:05,220 >> DAVID J. Malan: Així que anem a fer una ullada a aquest 20 00:01:05,220 --> 00:01:07,250 i veure exactament com això podria ser implementat 21 00:01:07,250 --> 00:01:09,680 i com això podria afectar tants cotxes com aquest. 22 00:01:09,680 --> 00:01:12,840 Així que en la meva mà aquí són la premsa llançament que va ser emesa per la EPA-- 23 00:01:12,840 --> 00:01:14,620 el Medi Ambient Agència de Protecció qual 24 00:01:14,620 --> 00:01:18,032 és l'agència reguladora nord-americana que maneja les preocupacions ambientals, 25 00:01:18,032 --> 00:01:19,740 i després el real avís legal que era 26 00:01:19,740 --> 00:01:22,420 enviar a Volkswagen fa tot just uns dies. 27 00:01:22,420 --> 00:01:26,530 >> Així que l'EPA escriu, i revela ara públicament, un programari sofisticat 28 00:01:26,530 --> 00:01:29,390 algoritme en certa Vehicles Volkswagen detecta 29 00:01:29,390 --> 00:01:32,630 quan el cotxe està en proves d'emissions oficials 30 00:01:32,630 --> 00:01:36,505 i converteix les emissions complets controla només durant la prova. 31 00:01:36,505 --> 00:01:38,380 L'eficàcia de aquests vehicles contaminació 32 00:01:38,380 --> 00:01:43,260 dispositius de control d'emissions és enormement reduït durant tota la conducció normal 33 00:01:43,260 --> 00:01:44,320 situacions. 34 00:01:44,320 --> 00:01:48,190 Això es tradueix en cotxes que compleixen amb la estàndards en el laboratori o proves 35 00:01:48,190 --> 00:01:52,790 estació, però durant el funcionament normal emetre oxides-- nitrogen o NOx-- 36 00:01:52,790 --> 00:01:54,950 de fins a 40 vegades la norma. 37 00:01:54,950 --> 00:01:58,220 El programari produït per Volkswagen és un dispositiu de final de la cita cita, derrota, 38 00:01:58,220 --> 00:02:00,650 tal com es defineix pel Clean Llei d'Aire als EUA .. 39 00:02:00,650 --> 00:02:03,410 >> Ells diran que l'EPA i altra agència 40 00:02:03,410 --> 00:02:07,020 descobert el dispositiu manipulador programari després d'una anàlisi independent 41 00:02:07,020 --> 00:02:09,660 per investigadors de West Universitat de Virgínia. 42 00:02:09,660 --> 00:02:14,160 NOx contribueix a la contaminació el diòxid de nitrogen, ozó troposfèric, 43 00:02:14,160 --> 00:02:15,700 i les partícules fines. 44 00:02:15,700 --> 00:02:18,090 L'exposició a aquests contaminants s'ha relacionat 45 00:02:18,090 --> 00:02:20,870 amb una àmplia gamma de efectes greus de salut, 46 00:02:20,870 --> 00:02:23,637 incloent augment de l'asma atacs i altres respiratòria 47 00:02:23,637 --> 00:02:26,470 malalties que poden ser prou greus enviar a la gent a l'hospital. 48 00:02:26,470 --> 00:02:28,660 L'exposició a ozó i matèria en partícules té també 49 00:02:28,660 --> 00:02:31,960 s'ha associat amb prematura mort per respiratòria relacionada 50 00:02:31,960 --> 00:02:35,690 o cardiovascular efectes relacionats. 51 00:02:35,690 --> 00:02:38,940 Els nens, els ancians, les persones amb malaltia respiratòria preexistent 52 00:02:38,940 --> 00:02:42,840 estan particularment en risc d' efectes en la salut d'aquests contaminants. 53 00:02:42,840 --> 00:02:45,056 >> Només cal dir, és molt greu. 54 00:02:45,056 --> 00:02:46,930 I llegirem només un extracte més 55 00:02:46,930 --> 00:02:49,370 i després anem a fer una ullada a les implicacions subjacents 56 00:02:49,370 --> 00:02:50,920 d'això en el context d'un cotxe. 57 00:02:50,920 --> 00:02:53,730 En concret, Volkswagen fabricat i instal·lat 58 00:02:53,730 --> 00:02:56,210 programari en l'anomenada control electrònic 59 00:02:56,210 --> 00:02:59,320 module-- o ECM-- de aquests vehicles que detectats 60 00:02:59,320 --> 00:03:03,580 quan el vehicle s'està provant per el compliment de les normes d'emissió de l'EPA. 61 00:03:03,580 --> 00:03:07,510 Sobre la base de diverses entrades, inclòs el posició de la roda de direcció, vehicle 62 00:03:07,510 --> 00:03:11,280 velocitat, la durada del motor de operació, i la pressió baromètrica, 63 00:03:11,280 --> 00:03:13,720 aquests inputs precisament seguit dels paràmetres 64 00:03:13,720 --> 00:03:17,600 del procediment d'assaig utilitzat per federal les proves d'emissions per a la certificació de l'EPA 65 00:03:17,600 --> 00:03:18,400 propòsits. 66 00:03:18,400 --> 00:03:21,850 >> Durant les proves d'emissions de l'EPA, el programari vehicles ECM 67 00:03:21,850 --> 00:03:25,060 córrer programari que va produir resultats d'emissions compatibles. 68 00:03:25,060 --> 00:03:28,340 La resta del temps, el programari ECM vehicle 69 00:03:28,340 --> 00:03:31,090 córrer un camí separat calibratge que va reduir 70 00:03:31,090 --> 00:03:34,360 l'eficàcia de la sistema global de control d'emissions, 71 00:03:34,360 --> 00:03:37,864 específicament el catalítica selectiva reducció del NOx magra trap-- 72 00:03:37,864 --> 00:03:39,280 que ja ho veurem en un moment. 73 00:03:39,280 --> 00:03:43,040 Com a resultat, les emissions de NOx augmentat per un factor de 10 a 40 vegades 74 00:03:43,040 --> 00:03:47,450 per sobre dels nivells compatibles amb l'EPA depenent del tipus de cicle de conducció. 75 00:03:47,450 --> 00:03:50,800 >> Així que el que això realment significa, i la codi font per al programari de funcionament 76 00:03:50,800 --> 00:03:53,190 en el Volkswagen que no té però, donat a conèixer públicament, 77 00:03:53,190 --> 00:03:56,460 és que, efectivament, aquest equivalent és en algun lloc a l'interior 78 00:03:56,460 --> 00:03:57,830 del codi de Volkswagen. 79 00:03:57,830 --> 00:04:02,200 Si vostè està sent provat, i si el cotxe detecta certs factors ambientals 80 00:04:02,200 --> 00:04:04,330 de la mateixa manera que el volant posició o el moviment 81 00:04:04,330 --> 00:04:06,710 o manca d'ella del cotxe o qualsevol nombre d'altres factors 82 00:04:06,710 --> 00:04:09,940 que són la hipòtesi actualment a ser part d'aquesta fórmula, 83 00:04:09,940 --> 00:04:12,370 simplement s'encenen controlar les emissions completes. 84 00:04:12,370 --> 00:04:15,670 En altres paraules, comencen emetent menys dels contaminants. 85 00:04:15,670 --> 00:04:18,769 >> Altrament, en tots els altres situació quan no es detecta com 86 00:04:18,769 --> 00:04:20,790 al laboratori, simplement no ho fan. 87 00:04:20,790 --> 00:04:24,320 I així es pot simplificar això en més pseudocodi de formigó amb una mica 88 00:04:24,320 --> 00:04:24,820 així. 89 00:04:24,820 --> 00:04:27,810 Si les rodes estan donant volta però el volant no és, suggerent 90 00:04:27,810 --> 00:04:30,060 que el cotxe està en algun tipus de cilindre giratori 91 00:04:30,060 --> 00:04:32,550 però en algun tipus de magatzem està provant, 92 00:04:32,550 --> 00:04:36,070 a continuació, es comporten com el EPA li agradaria que vostè. 93 00:04:36,070 --> 00:04:37,960 En cas contrari no. 94 00:04:37,960 --> 00:04:40,420 Així que anem a fer una ullada en un curt vídeo que 95 00:04:40,420 --> 00:04:45,391 fes un cop d'ull al que les implicacions són d'aquest fet mecànicament. 96 00:04:45,391 --> 00:04:48,620 >> [REPRODUCCIÓ DE VÍDEO] 97 00:04:48,620 --> 00:04:52,800 >> -Darrera Divendres l'EPA va anunciar que alguns Actuacions Volkswagen Audi van fer entre 2009 98 00:04:52,800 --> 00:04:55,840 i aquest any estaven usant un dispositiu anomenat derrota 99 00:04:55,840 --> 00:04:59,060 moure per les lleis d'emissions dissenyada per mantenir l'aire net. 100 00:04:59,060 --> 00:05:01,700 Però, què vol dir això exactament? 101 00:05:01,700 --> 00:05:04,666 >> Bé, els cotxes moderns tenen dotzenes dels ordinadors dins d'ells. 102 00:05:04,666 --> 00:05:07,040 I alguns d'aquests equips ajudar a coordinar les funcions 103 00:05:07,040 --> 00:05:09,590 del motor per a una òptima el rendiment mentre s'assegura 104 00:05:09,590 --> 00:05:12,340 que no hi ha massa escombraries que surt del tub d'escapament. 105 00:05:12,340 --> 00:05:15,170 Ells realment han estat treballant d'aquesta manera des de fa dècades. 106 00:05:15,170 --> 00:05:17,380 Bàsicament, cada part del motor d'un cotxe modern 107 00:05:17,380 --> 00:05:20,080 té un sensor o controlador en ella, i aquestes ordinadors 108 00:05:20,080 --> 00:05:23,460 estan llegint en les dades de milers de vegades per segon per preparar ajustos 109 00:05:23,460 --> 00:05:26,220 de la mateixa manera que la proporció de combustible a l'aire això va en els cilindres. 110 00:05:26,220 --> 00:05:28,730 >> Aquests Volkswagen engany i models d'Audi són els motors dièsel, 111 00:05:28,730 --> 00:05:30,890 i els dièsel tenen una més realment important equip 112 00:05:30,890 --> 00:05:34,030 paràmetres controlats, que és la quantitat de combustible no cremat anar 113 00:05:34,030 --> 00:05:35,200 en la fuita. 114 00:05:35,200 --> 00:05:36,310 Ara que sona malament. 115 00:05:36,310 --> 00:05:39,642 No sona com vostè vol combustible no cremat d'entrar al tub d'escapament. 116 00:05:39,642 --> 00:05:41,600 Però en el cas d'una dièsel, vostè té alguna cosa 117 00:05:41,600 --> 00:05:46,110 anomenat un parany de NOx que és un dispositiu que absorbeix i trampes per als òxids de nitrogen 118 00:05:46,110 --> 00:05:48,880 que són contaminants que faria en cas contrari anar a l'atmosfera. 119 00:05:48,880 --> 00:05:53,040 I l'efecte d'aquest parany de NOx es veu reforçada amb el combustible sense cremar. 120 00:05:53,040 --> 00:05:56,650 Així que un dispositiu manipulador és un programa especial dins d'aquests equips que poden fer que sigui 121 00:05:56,650 --> 00:05:59,527 veurà com el cotxe compleix amb les emissions normes fins i tot quan no ho fa. 122 00:05:59,527 --> 00:06:01,110 Volkswagen tenia un problema a les mans. 123 00:06:01,110 --> 00:06:04,050 Els seus motors dièsel eren coneguts per aconseguir un gran estalvi de combustible, 124 00:06:04,050 --> 00:06:07,510 però el parany de NOx només funciona bé quan s'està utilitzant més combustible. 125 00:06:07,510 --> 00:06:10,460 Així que el cotxe seria detectar, l'ús d'aquest dispositiu de la derrota, 126 00:06:10,460 --> 00:06:13,870 quan s'estava fent una de les emissions prova, seria utilitzar més combustible, 127 00:06:13,870 --> 00:06:16,830 fer bé la feina trampa de NOx, emissions estarien bé. 128 00:06:16,830 --> 00:06:21,130 Però llavors vostè aconsegueix en el camí, el dispositiu s'apaga, vostè està cremant menys combustible 129 00:06:21,130 --> 00:06:24,256 però vostè està posant tant com 40 vegades més contaminants a l'atmosfera. 130 00:06:24,256 --> 00:06:26,130 Però, com ho va fer diables el cotxe sap que era 131 00:06:26,130 --> 00:06:27,720 s'està provant per al compliment de les emissions? 132 00:06:27,720 --> 00:06:30,590 L'EPA diu que va ser un sofisticat sistema que comprova coses 133 00:06:30,590 --> 00:06:34,090 com la posició del volant, la velocitat, el temps que el motor estava encès, 134 00:06:34,090 --> 00:06:35,507 i fins i tot la pressió atmosfèrica. 135 00:06:35,507 --> 00:06:37,673 En altres paraules, hi va haver cap manera això va ser accidental 136 00:06:37,673 --> 00:06:40,260 perquè el programari va ser dissenyat amb molta cura per detectar 137 00:06:40,260 --> 00:06:41,630 una prova oficial d'emissions. 138 00:06:41,630 --> 00:06:43,588 Això és una cosa de molt seriós engany i això és 139 00:06:43,588 --> 00:06:45,420 ¿Per Volkswagen està en tals seriosos problemes. 140 00:06:45,420 --> 00:06:48,600 De fet, el seu conseller delegat, Martin Winterkorn, simplement va renunciar. 141 00:06:48,600 --> 00:06:49,820 >> Llavors, què passa després? 142 00:06:49,820 --> 00:06:53,900 Bé, si ets un dels milions de mitjana Jetta dièsel, Beatles, Golfs, Passat, 143 00:06:53,900 --> 00:06:56,220 o Audi A3S efectua, La bona notícia és és 144 00:06:56,220 --> 00:06:57,886 que el seu cotxe està encara segur per conduir. 145 00:06:57,886 --> 00:07:00,510 No ha de deixar-ho de banda fins que Volkswagen emet un recés. 146 00:07:00,510 --> 00:07:02,509 Però en algun moment són probablement va a tenir 147 00:07:02,509 --> 00:07:04,230 per actualitzar el programari dins del seu cotxe. 148 00:07:04,230 --> 00:07:06,927 Quan això passa vostè pot ser tenir menys milles per tanc. 149 00:07:06,927 --> 00:07:09,260 Els advocats ja estan preparant per demandes col·lectives 150 00:07:09,260 --> 00:07:12,500 el que els propietaris podrien quedar compensat en algun moment en el futur. 151 00:07:12,500 --> 00:07:15,832 Però això no va a succeir en el curt termini. 152 00:07:15,832 --> 00:07:16,711 >> [FI DE REPRODUCCIÓ] 153 00:07:16,711 --> 00:07:19,960 DAVID J. Malan: Així que això planteja en realitat una interessant qüestió d'imatge més gran 154 00:07:19,960 --> 00:07:20,660 pel que fa a la confiança. 155 00:07:20,660 --> 00:07:21,160 Oi? 156 00:07:21,160 --> 00:07:24,300 Tots nosaltres tenen iPhones o Androids o alguna cosa en les nostres butxaques més probable 157 00:07:24,300 --> 00:07:26,500 aquests dies, o portàtils en els nostres llargs que són 158 00:07:26,500 --> 00:07:28,510 programari que s'executa fet per Apple i Microsoft 159 00:07:28,510 --> 00:07:30,710 i raïms d'altres empreses. 160 00:07:30,710 --> 00:07:34,240 Però, com sabem que el que aquests productes de programari estan fent 161 00:07:34,240 --> 00:07:37,680 és en realitat el que aquests companyies diuen que estan fent? 162 00:07:37,680 --> 00:07:39,610 >> Per exemple, qui pot dir que cada vegada que 163 00:07:39,610 --> 00:07:42,200 fer una trucada al seu iPhone o telèfon Android o similars, 164 00:07:42,200 --> 00:07:45,650 que aquest número de telèfon tampoc és sent pujat al servidor d'alguna empresa 165 00:07:45,650 --> 00:07:48,399 a causa d'algun programa que tens escrit, si es tracta de l'operació 166 00:07:48,399 --> 00:07:51,070 sistema en si com iOS o Android, o perquè vostè ha descarregat 167 00:07:51,070 --> 00:07:53,880 alguna aplicació de tercers que d'alguna manera és escoltar 168 00:07:53,880 --> 00:07:57,120 a tot el que estàs escrivint en o tot el que en realitat estàs dient. 169 00:07:57,120 --> 00:07:59,500 Com saps que, quan es vostès estan executant Clang 170 00:07:59,500 --> 00:08:02,590 O Fer compilar el programari propi a CS50, com 171 00:08:02,590 --> 00:08:06,080 ¿Et el mateix personal que CS50, per mitjà de la biblioteca CS50, 172 00:08:06,080 --> 00:08:08,690 No ha estat la tala cada cadena que mai ha arribat 173 00:08:08,690 --> 00:08:10,276 o cada polzada que has aconseguit? 174 00:08:10,276 --> 00:08:12,900 Bé, certament es podria mirar en el codi font d'alguna cosa 175 00:08:12,900 --> 00:08:15,233 com la biblioteca CS50, que podria mirar el codi font 176 00:08:15,233 --> 00:08:18,170 per al sistema operatiu Linux que s'executa en IDE CS50. 177 00:08:18,170 --> 00:08:23,090 Però una presentació increïble se li va donar el 1984 178 00:08:23,090 --> 00:08:26,730 a la recepció del Premi Turing per un informàtic molt famós conegut 179 00:08:26,730 --> 00:08:29,750 com-- anomenat Ken Thompson, qui va rebre el Premi Turing, que 180 00:08:29,750 --> 00:08:33,500 és una espècie de ciència d'equip Premi Nobel, si es vol, 181 00:08:33,500 --> 00:08:35,309 pel seu treball en un sistema operatiu anomenat 182 00:08:35,309 --> 00:08:39,039 Unix, que és molt similar a esperit per al que utilitzem, que és Linux. 183 00:08:39,039 --> 00:08:41,960 I la pregunta que li va fer al seu discurs d'acceptació, en essència 184 00:08:41,960 --> 00:08:44,910 pel qual es fixa el marc per a anys i anys de discussió 185 00:08:44,910 --> 00:08:46,970 sobre la confiança i la seguretat, era això. 186 00:08:46,970 --> 00:08:50,410 ¿Fins a quin punt si un la confiança d'un declaració que un program-- una peça 187 00:08:50,410 --> 00:08:53,010 de software-- està lliure dels cavalls de Troia? 188 00:08:53,010 --> 00:08:56,500 Potser és més important confiar la gent que va escriure el programari. 189 00:08:56,500 --> 00:08:58,650 >> I, de fet, ens hem vinculat a la xerrada que ell 190 00:08:58,650 --> 00:09:02,400 va donar al acceptar aquest premi en els anys 80 en el lloc web del CS50 191 00:09:02,400 --> 00:09:04,030 a la pàgina de Conferències per avui. 192 00:09:04,030 --> 00:09:06,071 Perquè el que veuràs és que en realitat li dóna 193 00:09:06,071 --> 00:09:09,430 bastant simple exemple de com fins i tot un compilador com Clang o el que sigui 194 00:09:09,430 --> 00:09:13,950 compiladors altres han utilitzat en el passat, ¿I si s'incrusta en el qual el compilador 195 00:09:13,950 --> 00:09:18,190 nosaltres estan utilitzant és una mica si condició que essencialment diu, 196 00:09:18,190 --> 00:09:22,360 si vostè nota que el codi està utilitzant la funció GetString o la getInt 197 00:09:22,360 --> 00:09:26,600 funció, endavant i inseriu una porta del darrere o un cavall de Troia 198 00:09:26,600 --> 00:09:29,340 de tal manera que aquest programa ara compta amb alguns zeros 199 00:09:29,340 --> 00:09:30,930 i els que ho fan alguna cosa maliciós. 200 00:09:30,930 --> 00:09:33,080 Registre de la totalitat del seu pulsacions de teclat, càrrega de les dades 201 00:09:33,080 --> 00:09:35,100 a algun servidor, o realment qualsevol cosa. 202 00:09:35,100 --> 00:09:37,290 >> I el que Ken Thompson va fer en la seva xerrada 203 00:09:37,290 --> 00:09:40,580 és demostrar que, fins i tot si vostè té accés a la font 204 00:09:40,580 --> 00:09:43,794 codi d'un compilador que maliciosament podria estar fent això, 205 00:09:43,794 --> 00:09:46,210 no importa perquè hi ha aquest ou i la gallina 206 00:09:46,210 --> 00:09:49,500 realitat del passat que molts anys mitjançant el qual els compiladors 207 00:09:49,500 --> 00:09:51,960 s'utilitzen per compilar ells mateixos. 208 00:09:51,960 --> 00:09:55,440 En altres paraules, camí de tornada quan algú havia d'haver escrit el primer compilador. 209 00:09:55,440 --> 00:09:59,060 I a partir de llavors, cada vegada que he actualitzat un compilador canviant el seu codi font, 210 00:09:59,060 --> 00:10:02,020 l'addició de característiques i recompilarla per a gent com nosaltres a utilitzar, així, 211 00:10:02,020 --> 00:10:04,270 que estan usant la vella versió del compilador 212 00:10:04,270 --> 00:10:06,370 per compilar el nou versió del compilador. 213 00:10:06,370 --> 00:10:08,370 I si vostè fes un cop d'ull en la xerrada que ha donat, 214 00:10:08,370 --> 00:10:10,970 veuràs que ja que la circularitat, 215 00:10:10,970 --> 00:10:14,330 en realitat es pot tenir errors o Troians incorporats en el programari 216 00:10:14,330 --> 00:10:14,990 estem utilitzant. 217 00:10:14,990 --> 00:10:18,010 I fins i tot si ens fixem en la codi font dels programes, 218 00:10:18,010 --> 00:10:21,550 ni tan sols podria ser evident pel fet que l'engany és en realitat 219 00:10:21,550 --> 00:10:24,710 d'alguna versió anterior d'un compilador que des de llavors ha estat 220 00:10:24,710 --> 00:10:27,340 la injecció de l'amenaça al nostre programari. 221 00:10:27,340 --> 00:10:29,740 >> La qual cosa és només per dir, que realment no pot i no ha 222 00:10:29,740 --> 00:10:32,939 confiar en el programari que s'executa en els nostres ordinadors portàtils o telèfons o qualsevol nombre de llocs. 223 00:10:32,939 --> 00:10:36,230 I, de fet, més endavant en aquest semestre quan vam començar a parlar de la programació web 224 00:10:36,230 --> 00:10:38,521 i en realitat començar a construir aplicacions web nosaltres mateixos, 225 00:10:38,521 --> 00:10:40,285 parlarem d'aquests amenaces i altres. 226 00:10:40,285 --> 00:10:43,410 Ara, és possible que s'hagi preguntat i es va adonar que hi havia un diminut Darth 227 00:10:43,410 --> 00:10:45,842 Vader en els clips que The Verge mostrava allà 228 00:10:45,842 --> 00:10:47,550 sobre Volkswagen. Si que mai has vist, em 229 00:10:47,550 --> 00:10:49,190 pensem que hauria alleugerir l'estat d'ànim, perquè això és tot 230 00:10:49,190 --> 00:10:50,780 molt depriment i alarmant. 231 00:10:50,780 --> 00:10:52,910 Vaig a mirar cap enrere en el Super Bowl 2011 232 00:10:52,910 --> 00:10:55,300 quan un comercial per Volkswagen-- i això 233 00:10:55,300 --> 00:10:59,620 gairebé els fa agradables nou-- sortir a l'aire per primera vegada a la televisió. 234 00:10:59,620 --> 00:11:04,039 És el segon clip 60 que crec que vostè gaudirà. 235 00:11:04,039 --> 00:11:04,705 [REPRODUCCIÓ DE VÍDEO] 236 00:11:04,705 --> 00:11:08,198 [MÚSICA - TEMA DE "STAR WARS"] 237 00:11:08,198 --> 00:11:35,643 238 00:11:35,643 --> 00:11:38,138 [Gos borda] 239 00:11:38,138 --> 00:11:50,114 240 00:11:50,114 --> 00:11:53,607 [CAR COMENÇA] 241 00:11:53,607 --> 00:12:04,086 242 00:12:04,086 --> 00:12:05,955 [FI DE REPRODUCCIÓ] 243 00:12:05,955 --> 00:12:06,830 DAVID J. Malan: Sí. 244 00:12:06,830 --> 00:12:07,663 Només estava revisant. 245 00:12:07,663 --> 00:12:11,360 Aquest cotxe està en la llista de violacions. 246 00:12:11,360 --> 00:12:12,000 Tot bé. 247 00:12:12,000 --> 00:12:14,040 Així que ens fixem en alguns Pseudocodi fa un moment. 248 00:12:14,040 --> 00:12:15,380 I aquí hi ha una més gran fragment de codi pseudocodi 249 00:12:15,380 --> 00:12:16,921 que hem vist un parell de vegades fins ara. 250 00:12:16,921 --> 00:12:19,970 I farem servir aquesta és una oportunitat ara per introduir una nova programació 251 00:12:19,970 --> 00:12:23,776 tècnica que vam fer veure algorítmicament 252 00:12:23,776 --> 00:12:25,400 la setmana passada quan mirem fusió tipus. 253 00:12:25,400 --> 00:12:28,270 Però anem a formalitzar-lo i veure com podríem utilitzar-lo en codi real, 254 00:12:28,270 --> 00:12:30,350 i després utilitzarem aquest tècnica pel camí més 255 00:12:30,350 --> 00:12:32,000 probabilitats de resoldre altres problemes. 256 00:12:32,000 --> 00:12:35,790 >> Així que aquest va ser un dels primers programes que mai va escriure, tot i que de Codi pseudocodi. 257 00:12:35,790 --> 00:12:37,790 I el que aquest programa ens va permetre fer curs 258 00:12:37,790 --> 00:12:41,510 era trobar Mike Smith en una guia telefònica. 259 00:12:41,510 --> 00:12:46,216 I compte, en particular, les línies de vuit i 11, que tenia aquesta declaració a Vés a. 260 00:12:46,216 --> 00:12:48,090 I de fet, certa idiomes, C entre ells, 261 00:12:48,090 --> 00:12:50,006 en realitat tenen un declaració que és, literalment, 262 00:12:50,006 --> 00:12:52,710 anar a que li permet saltar a una línia específica. 263 00:12:52,710 --> 00:12:55,470 És generalment mal vist perquè que es pot abusar fàcilment 264 00:12:55,470 --> 00:12:58,490 i vostè pot començar a saltar de la seva programa per tot el lloc en oposició 265 00:12:58,490 --> 00:13:00,690 l'ús de la classe de la lògica i el flux de control 266 00:13:00,690 --> 00:13:04,000 que hem utilitzat fins ara amb només bucles i condicions i similars. 267 00:13:04,000 --> 00:13:08,660 >> Però podem simplificar aquest algoritme en el codi de pseudocodi de la següent manera. 268 00:13:08,660 --> 00:13:11,250 En lloc d'aquesta iteratiu o bucle enfocament 269 00:13:11,250 --> 00:13:14,160 on sempre tornem i d'anada i tornada a la línia de tres, 270 00:13:14,160 --> 00:13:18,300 ¿Per què no només tipus de Punt i més en general, diuen en línia de set i 10, 271 00:13:18,300 --> 00:13:20,570 només cal substituir aquests dos parells de línies amb, 272 00:13:20,570 --> 00:13:22,810 més si Smith és anterior en el llibre que anem a 273 00:13:22,810 --> 00:13:25,110 buscar Mike en el mitjana esquerra del llibre. 274 00:13:25,110 --> 00:13:28,560 Perquè si Smith és més tard en el llibre, buscar Mike a la dreta 275 00:13:28,560 --> 00:13:29,540 la meitat del llibre. 276 00:13:29,540 --> 00:13:31,180 I ja notar la circularitat. 277 00:13:31,180 --> 00:13:31,680 Oi? 278 00:13:31,680 --> 00:13:34,250 Estic a la recerca de Mike en la guia telefònica i després 279 00:13:34,250 --> 00:13:37,090 Finalment em vaig enganxar potser línia de set o potser la línia 10 280 00:13:37,090 --> 00:13:41,089 i el meu instrucció per a mi és la recerca Mike en la meitat de la guia telefònica. 281 00:13:41,089 --> 00:13:42,380 Bé, com puc cercar Mike? 282 00:13:42,380 --> 00:13:44,213 Sóc al mig de la recerca de Mike, per què 283 00:13:44,213 --> 00:13:45,860 estàs sort que m'envia en un cercle? 284 00:13:45,860 --> 00:13:49,590 Però això està bé perquè el que és succeint a la grandària del problema, 285 00:13:49,590 --> 00:13:52,630 com està escrit en la línia 7 i 10? 286 00:13:52,630 --> 00:13:54,989 No només estem dient recerca per Mike, buscar Mike. 287 00:13:54,989 --> 00:13:56,280 Estem dient específicament què? 288 00:13:56,280 --> 00:13:58,694 289 00:13:58,694 --> 00:14:01,610 Cercar per ell en la meitat esquerra de la meitat dreta que és efectivament 290 00:14:01,610 --> 00:14:03,440 la meitat de la mida del problema. 291 00:14:03,440 --> 00:14:07,170 Així que està bé que estem tipus de participar en aquesta circularitat, 292 00:14:07,170 --> 00:14:09,180 aquest argument circular, perquè almenys estem 293 00:14:09,180 --> 00:14:11,090 fent que el problema més i més petita. 294 00:14:11,090 --> 00:14:14,220 I, finalment, arribarem que l'anomenat cas base, on 295 00:14:14,220 --> 00:14:16,780 tenim una sola pàgina esquerra- com el nostre voluntari la setmana passada 296 00:14:16,780 --> 00:14:18,684 did-- teníem una pàgina l'esquerra i després no ho fem 297 00:14:18,684 --> 00:14:21,600 ha de seguir buscant Mike Smith perquè està bé en aquesta pàgina 298 00:14:21,600 --> 00:14:23,080 o no ho és. 299 00:14:23,080 --> 00:14:27,480 >> Llavors, com podem posar en pràctica aquesta idea, aquest mena de circularitat en el codi real? 300 00:14:27,480 --> 00:14:31,030 Bé, podem aprofitar una tècnica això és generalment coneguda com recursivitat. 301 00:14:31,030 --> 00:14:33,960 I hem vist això en el pseudocodi per l'ordenament per barreja la setmana passada. 302 00:14:33,960 --> 00:14:37,190 Recordem que aquest va ser el pseudocodi per a l'ordenament per barreja. 303 00:14:37,190 --> 00:14:40,560 Es podria dir que és encara més simple que bombolla o la selecció o l'ordenació per inserció 304 00:14:40,560 --> 00:14:43,310 només en termes de la simplicitat amb el que pot expressar-ho. 305 00:14:43,310 --> 00:14:46,750 >> Però això és perquè estem espècie de circular 306 00:14:46,750 --> 00:14:51,350 dient: buscar alguna cosa mitjançant la recerca de nou. 307 00:14:51,350 --> 00:14:53,960 Però estem buscant, ja sigui en la meitat esquerra o la meitat dreta 308 00:14:53,960 --> 00:14:56,070 i després, eventualment estem la fusió en aquest cas. 309 00:14:56,070 --> 00:14:58,520 Però aquí, també, amb aquestes dues línies de classificació, 310 00:14:58,520 --> 00:15:01,320 ens tornem a tenir present idea de recursivitat. 311 00:15:01,320 --> 00:15:05,350 I concretament el que això significa, en el context d'un algoritme, 312 00:15:05,350 --> 00:15:10,880 és que un algorisme és recursiu si s'utilitza o es fa dir. 313 00:15:10,880 --> 00:15:14,330 >> O en termes de C, una funció és recursive-- una funció anomenada 314 00:15:14,330 --> 00:15:18,510 foo és recursiu si foo, en algun lloc del seu codi font, 315 00:15:18,510 --> 00:15:21,250 crida a la pròpia funció foo. 316 00:15:21,250 --> 00:15:25,790 I això és dolent si tot foo alguna vegada ho fa és cridar a si mateix una i altra vegada. 317 00:15:25,790 --> 00:15:30,600 Està bé si foo s'atura el temps, igual que ordenament per barreja, en dir, espera un minut, 318 00:15:30,600 --> 00:15:32,980 si aquest problema és super petita, per exemple, 319 00:15:32,980 --> 00:15:35,840 o el vaig trobar qui sóc buscant, simplement tornar. 320 00:15:35,840 --> 00:15:41,000 No de forma recursiva, no ho facis cíclicament nou cridar-me. 321 00:15:41,000 --> 00:15:44,200 >> I així anem a fer una ullada a com això podria funcionar. 322 00:15:44,200 --> 00:15:48,430 Així que vaig a seguir endavant i obert dos exemples de codi font aquí. 323 00:15:48,430 --> 00:15:50,321 Una d'elles es diu sigma 0. 324 00:15:50,321 --> 00:15:52,320 I això no és en absolut recursiu, però tirem 325 00:15:52,320 --> 00:15:53,694 Un cop d'ull al que fa aquest programa. 326 00:15:53,694 --> 00:15:55,737 He despullat tota comentaris d'ella, però tots 327 00:15:55,737 --> 00:15:58,070 del codi font en CS50 de pàgina comentaris si 328 00:15:58,070 --> 00:15:59,570 voler llegir a través d'ell de nou més tard. 329 00:15:59,570 --> 00:16:02,010 I farem un parell de seny comprova aquí. 330 00:16:02,010 --> 00:16:06,640 >> Així que a la part superior d'aquest codi, que tenim són CS50.h. 331 00:16:06,640 --> 00:16:07,650 Què fa això? 332 00:16:07,650 --> 00:16:08,990 Per què aquí? 333 00:16:08,990 --> 00:16:11,740 En termes senzills raonable. 334 00:16:11,740 --> 00:16:12,424 Què fa això? 335 00:16:12,424 --> 00:16:12,858 Sí. 336 00:16:12,858 --> 00:16:14,160 >> AUDIÈNCIA: ¿Així que la funció getInt funciona. 337 00:16:14,160 --> 00:16:16,243 >> DAVID J. Malan: Perquè la funció getInt funciona. 338 00:16:16,243 --> 00:16:18,115 Perquè dins d'aquest arxiu, CS50.h, que 339 00:16:18,115 --> 00:16:20,950 veurem en poc temps en termes del seu codi font, 340 00:16:20,950 --> 00:16:23,270 té un munt de funcions declared-- getInt, GetString, 341 00:16:23,270 --> 00:16:26,950 i un munt de altres- i, llevat en realitat hem de Inclouen línia, 342 00:16:26,950 --> 00:16:29,320 el compilador no és Clang va a saber que existeix. 343 00:16:29,320 --> 00:16:32,400 I mateix passa amb la línia 2 on es defineix int 344 00:16:32,400 --> 00:16:35,101 printf, que és una funció seguim usant una mica. 345 00:16:35,101 --> 00:16:37,850 Ara, la línia de quatre sembla una mica estrany perquè és només un acudit. 346 00:16:37,850 --> 00:16:41,570 Té un punt i coma, sense arrissat claus, no hi ha codi dins d'ella. 347 00:16:41,570 --> 00:16:44,640 Però el que vam fer nosaltres anomenem aquesta cosa de setmana passat? 348 00:16:44,640 --> 00:16:45,140 Sí. 349 00:16:45,140 --> 00:16:46,060 Així, un prototip. 350 00:16:46,060 --> 00:16:48,390 ¿I per què tenim una prototip que sembla 351 00:16:48,390 --> 00:16:51,050 a ser una mica redundant normalment perquè normalment 352 00:16:51,050 --> 00:16:53,474 veure la funció de nou més endavant a l'arxiu, oi? 353 00:16:53,474 --> 00:16:56,390 Així que per què no ets més que tener-- gratant-se el cap, però vaig a prendre. 354 00:16:56,390 --> 00:16:57,302 Sí. 355 00:16:57,302 --> 00:17:00,000 >> AUDIÈNCIA: [inaudible] la funció després de la principal. 356 00:17:00,000 --> 00:17:01,000 DAVID J. Malan: Exactament. 357 00:17:01,000 --> 00:17:04,089 Perquè el compilador et coneix finalment va a definir o implementar 358 00:17:04,089 --> 00:17:06,579 després que la funció principal, presumiblement. 359 00:17:06,579 --> 00:17:08,462 Així Clang i la majoria compiladors són una mena de ximple 360 00:17:08,462 --> 00:17:10,510 i que només sabran el que els diguis. 361 00:17:10,510 --> 00:17:12,569 I si voleu utilitzar una funció anomenada sigma, 362 00:17:12,569 --> 00:17:15,710 vostè ensenya millor el compilador que hi ha per endavant. 363 00:17:15,710 --> 00:17:17,970 >> Ara, en si principal, fins i tot encara que és un munt de línies, 364 00:17:17,970 --> 00:17:19,839 és bastant familiaritzat amb sort per ara. 365 00:17:19,839 --> 00:17:21,942 Té un do while el propòsit en la vida 366 00:17:21,942 --> 00:17:24,400 aquí aparentment és aconseguir un enter positiu des de l'usuari. 367 00:17:24,400 --> 00:17:27,349 I just mantenir molestant o ella fins que cooperar. 368 00:17:27,349 --> 00:17:30,670 Després, en la línia 16 que tinc una trucada interessant. 369 00:17:30,670 --> 00:17:31,570 IntAnswer. 370 00:17:31,570 --> 00:17:33,710 Que a la mà esquerra costat em dóna un Int 371 00:17:33,710 --> 00:17:36,650 que pot almacén-- anomenada Answer-- que es va a emmagatzemar, pel que sembla, 372 00:17:36,650 --> 00:17:39,090 el valor de retorn de sigma. 373 00:17:39,090 --> 00:17:41,840 Així sigma és només una nom arbitrari però significatiu 374 00:17:41,840 --> 00:17:44,500 que jo he donat a una funció el propòsit en la vida 375 00:17:44,500 --> 00:17:47,680 és prendre 1 argument-- l'anomenarem N en aquest cas-- 376 00:17:47,680 --> 00:17:52,280 i acaba de prendre la suma d'aquest número més cada nombre positiu que és 377 00:17:52,280 --> 00:17:53,200 menor que ella. 378 00:17:53,200 --> 00:17:58,140 >> Així que si pas en el número 2 de sigma, vull afegir 2 més 1 379 00:17:58,140 --> 00:18:00,240 a més 0-- no 0-- manera que em dóna 3. 380 00:18:00,240 --> 00:18:05,320 Si pas de 3 a sigma, vull té 3 més 2 més 1, el que em dóna 6. 381 00:18:05,320 --> 00:18:05,900 I així successivament. 382 00:18:05,900 --> 00:18:09,750 Per tant, només es suma tot el nombres menors que o iguals a ell. 383 00:18:09,750 --> 00:18:12,040 >> Ara, aquí només vaig per imprimir la resposta. 384 00:18:12,040 --> 00:18:17,330 Així com una comprovació de validesa ràpida, anem a fer sigma 0-- sigma slash dot 0-- 385 00:18:17,330 --> 00:18:18,690 i m'ho dius a mi escric en 2. 386 00:18:18,690 --> 00:18:19,960 I de fet si 3. 387 00:18:19,960 --> 00:18:21,240 Permetin-me escric en 3. 388 00:18:21,240 --> 00:18:22,860 Jo a la veritat si 6. 389 00:18:22,860 --> 00:18:27,636 I si algú pot fer els càlculs ràpidament, si faig 50 ¿què vaig arribar? 390 00:18:27,636 --> 00:18:29,839 >> AUDIÈNCIA: [inaudible]. 391 00:18:29,839 --> 00:18:30,880 DAVID J. Malan: Bé, no. 392 00:18:30,880 --> 00:18:33,340 Però 1275 que està bastant a prop. 393 00:18:33,340 --> 00:18:38,850 Així que això és el resultat de fer 50 més 49, més 48, més 47, més 46 394 00:18:38,850 --> 00:18:40,349 fins al fons a 1. 395 00:18:40,349 --> 00:18:41,390 Així que això és tot sigma fa. 396 00:18:41,390 --> 00:18:43,350 Però anem a veure com hem implementat ara. 397 00:18:43,350 --> 00:18:45,790 Així que aquí és la pròpia funció. 398 00:18:45,790 --> 00:18:49,000 I això no sembla tenir res a veure amb la recursivitat encara. 399 00:18:49,000 --> 00:18:51,070 De fet, estem utilitzant un tècnica de la vella escola. 400 00:18:51,070 --> 00:18:56,680 Estic inicialitzar una variable anomenada suma a zero, llavors tinc una foreloop aquí, 401 00:18:56,680 --> 00:19:00,790 i estic declarant un Int anomenada I, fent-la igual a 1-- 402 00:19:00,790 --> 00:19:04,080 encara que podria posar-lo igual a zero, però des que estic fent, a més, 403 00:19:04,080 --> 00:19:05,340 a qui li importa si és zero o un. 404 00:19:05,340 --> 00:19:06,660 Es va a tenir cap efecte. 405 00:19:06,660 --> 00:19:10,110 >> Així que estic iteració sempre que I és menys d'o igual a m, que 406 00:19:10,110 --> 00:19:11,671 és l'argument que va ser aprovada en. 407 00:19:11,671 --> 00:19:13,670 I llavors jo segueixo incrementant I. I idea 408 00:19:13,670 --> 00:19:20,010 del bucle de tot el que estic fent és fer suma més iguals I. I això és deliberat. 409 00:19:20,010 --> 00:19:22,326 Jo no vull fer, en aquest cas, com a suma plus plus. 410 00:19:22,326 --> 00:19:24,790 Vull afegir realitat el valor actual de R 411 00:19:24,790 --> 00:19:28,190 que manté cada vegada més gran i més gran i més gran al compte en execució. 412 00:19:28,190 --> 00:19:30,210 >> I llavors torno suma. 413 00:19:30,210 --> 00:19:33,850 I així resposta obté la suma de valor. 414 00:19:33,850 --> 00:19:35,282 I després imprimir-lo. 415 00:19:35,282 --> 00:19:37,740 Així que hi ha una oportunitat aquí, però, per simplificar tipus de 416 00:19:37,740 --> 00:19:41,260 aquest codi conceptualment i el tipus de cop d'un 417 00:19:41,260 --> 00:19:43,250 ment en termes de la simplicitat tot i que 418 00:19:43,250 --> 00:19:45,700 pren un temps per ordenar d'apreciar per què aquest 419 00:19:45,700 --> 00:19:47,330 és de gran abast en aquests petits exemples. 420 00:19:47,330 --> 00:19:50,380 Aquí és així que la sigma un-- segona versió d'aquest codi. 421 00:19:50,380 --> 00:19:55,290 Tot fins la part superior és idèntica manera la mateixa història s'aplica com abans. 422 00:19:55,290 --> 00:19:59,220 Però ara anem a veure el aplicació de sigma que 423 00:19:59,220 --> 00:20:05,040 He reduït a només aquests lines-- quatre línies de codi, de veritat, 424 00:20:05,040 --> 00:20:06,980 a més d'algunes claus i espais en blanc. 425 00:20:06,980 --> 00:20:07,930 >> Però, què estic fent? 426 00:20:07,930 --> 00:20:11,050 Si m és menor o igual a zero, he de gestionar tipus de 427 00:20:11,050 --> 00:20:12,490 aquest cas super simple. 428 00:20:12,490 --> 00:20:15,450 I si vostè em lliuri zero o gens negativa que és simplement estrany, 429 00:20:15,450 --> 00:20:17,909 Jo només vaig a arbitràriament però consistentment tornar a zero. 430 00:20:17,909 --> 00:20:20,200 No vull que aquesta cosa entrar en alguns infinita rar 431 00:20:20,200 --> 00:20:21,810 bucle causa d'un valor negatiu. 432 00:20:21,810 --> 00:20:25,070 Així que estic dient, si em dones zero o menys, vaig a tornar a zero. 433 00:20:25,070 --> 00:20:28,220 >> Però això és bo, perquè això és que sola pàgina de la guia telefònica 434 00:20:28,220 --> 00:20:28,790 el que queda. 435 00:20:28,790 --> 00:20:32,660 Estic mossegant un problema molt específic i no cridar a alguna cosa de forma recursiva. 436 00:20:32,660 --> 00:20:36,580 Però en la línia 31, la qual cosa No em sembla que estic fent? 437 00:20:36,580 --> 00:20:39,780 Els parèntesis són només mantenen coses, amb sort, una mica més clar. 438 00:20:39,780 --> 00:20:42,110 Però tot el que estic fent és que sóc tornar M-- ho 439 00:20:42,110 --> 00:20:45,790 de lliurar mi-- més la valor de M-- ho sento, 440 00:20:45,790 --> 00:20:49,052 més el valor de sigma de m almenys 1. 441 00:20:49,052 --> 00:20:50,010 Llavors, què vol dir això? 442 00:20:50,010 --> 00:20:53,965 Si em dónes el número 3 com a entrada, la resposta que vull aconseguir en última instància, 443 00:20:53,965 --> 00:20:57,307 es 6 ia 3 més 2 més 1 juny em dóna. 444 00:20:57,307 --> 00:20:59,390 Però, com ho penso com s'està executant el codi? 445 00:20:59,390 --> 00:21:03,070 La primera vegada que jo dic sigma i pas en el valor 3, 446 00:21:03,070 --> 00:21:07,960 això és com dir que en una peça de paper, aquí hi ha el valor 3 447 00:21:07,960 --> 00:21:09,920 i m'han passat aquest com sigma. 448 00:21:09,920 --> 00:21:13,090 3 és, òbviament, no inferior a 0 pel la condició IF no s'aplica. 449 00:21:13,090 --> 00:21:14,020 El més ho fa. 450 00:21:14,020 --> 00:21:14,990 Llavors, què faig? 451 00:21:14,990 --> 00:21:19,902 Vull tornar m, que és 3, a més de sigma m almenys 1. 452 00:21:19,902 --> 00:21:21,110 Així que permetin-me un seguiment d'això. 453 00:21:21,110 --> 00:21:22,710 Vaig a posar això tros de paper cap avall. 454 00:21:22,710 --> 00:21:24,668 ¿I quin valor, per ser clar, vaig a passar 455 00:21:24,668 --> 00:21:26,540 en sigma en aquest punt de la història? 456 00:21:26,540 --> 00:21:28,080 Quin nombre? 457 00:21:28,080 --> 00:21:28,610 2, oi? 458 00:21:28,610 --> 00:21:29,670 3 menys 1 és 2. 459 00:21:29,670 --> 00:21:32,000 Així que només necessito una mica tros de paper aquí. 460 00:21:32,000 --> 00:21:33,931 Així que ara sigma s'està cridat de nou. 461 00:21:33,931 --> 00:21:35,930 I m'he posat deliberadament això baix perquè és 462 00:21:35,930 --> 00:21:38,070 una mena de pausa aquesta versió de la història 463 00:21:38,070 --> 00:21:40,720 perquè ara estic centrat en senyal de m almenys 1. 464 00:21:40,720 --> 00:21:42,660 Així que era m 3, m mínim 1 és 2. 465 00:21:42,660 --> 00:21:45,110 Així que aquí és 2, que he estat vaig passar. 466 00:21:45,110 --> 00:21:48,510 2 és, òbviament, no menys de 0 perquè el cas no s'aplica. 467 00:21:48,510 --> 00:21:53,445 Else torno m, que és això cosa, a més de sigma del que de valor? 468 00:21:53,445 --> 00:21:56,160 469 00:21:56,160 --> 00:21:59,650 Així que si sigma de 1-- perquè m és en aquest moment 2 per a 2 menys 1 es 1. 470 00:21:59,650 --> 00:22:01,950 Així que ara tinc només el valor 1. 471 00:22:01,950 --> 00:22:04,810 Estic passant simplement el nombre 1 a la funció sigma-- 472 00:22:04,810 --> 00:22:09,120 o jo mateix aquí-- manera 1 no és, òbviament, menor que zero, encara no s'aplica. 473 00:22:09,120 --> 00:22:12,970 >> Retorn Else 1 més sigma de què? 474 00:22:12,970 --> 00:22:13,470 0. 475 00:22:13,470 --> 00:22:14,678 Així que permetin-me record. 476 00:22:14,678 --> 00:22:15,920 Vaig a tornar a això més endavant. 477 00:22:15,920 --> 00:22:18,060 Ara vaig a seguir endavant i jota el nombre 0, perquè això és 478 00:22:18,060 --> 00:22:19,470 el meu argument o paràmetre. 479 00:22:19,470 --> 00:22:22,400 Estic vaig passar el nombre 0 i, finalment, aquest procés 480 00:22:22,400 --> 00:22:25,760 tot just de repetir-me anunci nauseum cessa perquè el 481 00:22:25,760 --> 00:22:28,820 Què faig una vegada que veig això 0? 482 00:22:28,820 --> 00:22:29,790 Torno zero. 483 00:22:29,790 --> 00:22:31,790 Així que ara vostè ha de rebobinar la història. 484 00:22:31,790 --> 00:22:34,430 >> Si ara vaig cap enrere en el temps, Què va ser el més recent 485 00:22:34,430 --> 00:22:36,670 Vaig fer si estigués literalment rebobinar un vídeo? 486 00:22:36,670 --> 00:22:41,630 Vaig a recollir el més recent 1 i això em dóna 1 més 0 es 1. 487 00:22:41,630 --> 00:22:44,100 Si segueixo rebobinat de la història, això em va donar 488 00:22:44,100 --> 00:22:46,880 2 plus aquest valor corrent, que és 1. 489 00:22:46,880 --> 00:22:47,789 Així que això és 3. 490 00:22:47,789 --> 00:22:49,330 I llavors jo seguiré rebobinat. 491 00:22:49,330 --> 00:22:54,220 La primera vegada que vaig posar el nombre 3-- mode 3 més 3 em fa 6. 492 00:22:54,220 --> 00:22:57,272 >> I ara, si ha rebobinat el vídeo fins a aquest punt, 493 00:22:57,272 --> 00:22:58,980 aquesta era la molt primera pregunta que vaig fer. 494 00:22:58,980 --> 00:23:01,450 Quan va passar 3, el que és de 3 sigma? 495 00:23:01,450 --> 00:23:04,204 És de fet 6, la suma de tots aquests trossos de paper. 496 00:23:04,204 --> 00:23:07,120 Així que si això pren una mica de temps per a embolicar la seva ment al voltant, això està bé. 497 00:23:07,120 --> 00:23:10,700 Però consideren que ser un poc-- que era molt deliberada que apili 498 00:23:10,700 --> 00:23:12,990 aquests números a la part superior d'un a l'altre. 499 00:23:12,990 --> 00:23:17,440 És una mica com tenir un memory-- un registre en el temps, 500 00:23:17,440 --> 00:23:19,940 com un depurador en un vídeo, que, efectivament, puc retrocedir en. 501 00:23:19,940 --> 00:23:24,350 I tornarem a aquesta metàfora en només una mica. 502 00:23:24,350 --> 00:23:28,240 >> Però primer, resulta que hi ha un munt de geeks i gent divertida, 503 00:23:28,240 --> 00:23:29,614 Suposo que, a Google. 504 00:23:29,614 --> 00:23:31,530 Tant de bo algú que és molt bo en la ment de buscar a Google 505 00:23:31,530 --> 00:23:34,270 pujant per un moment i ajudeu-me busco alguna cosa? 506 00:23:34,270 --> 00:23:35,650 Clau molt, molt baix. 507 00:23:35,650 --> 00:23:37,870 Algú que mai és arribar abans, potser. 508 00:23:37,870 --> 00:23:38,370 D'ACORD. 509 00:23:38,370 --> 00:23:39,030 Sí? 510 00:23:39,030 --> 00:23:39,530 Vine. 511 00:23:39,530 --> 00:23:41,410 Anem cap avall. 512 00:23:41,410 --> 00:23:42,183 Com et dius? 513 00:23:42,183 --> 00:23:42,870 >> SAM: Sam. 514 00:23:42,870 --> 00:23:44,290 >> DAVID J. Malan: Sam, anem cap avall. 515 00:23:44,290 --> 00:23:45,320 Aquest és el mateix. 516 00:23:45,320 --> 00:23:46,280 Encantat de conéixer-te. 517 00:23:46,280 --> 00:23:46,780 Hey. 518 00:23:46,780 --> 00:23:47,580 Anem una altra vegada. 519 00:23:47,580 --> 00:23:51,290 Així que tot el que necessito que facis, si vostè podria, Sam, aquí és Google. 520 00:23:51,290 --> 00:23:53,240 ¿Es pot buscar el terme recursivitat? 521 00:23:53,240 --> 00:23:55,770 522 00:23:55,770 --> 00:23:56,270 No ho espatllis. 523 00:23:56,270 --> 00:23:59,940 524 00:23:59,940 --> 00:24:00,970 >> I ara let's-- si. 525 00:24:00,970 --> 00:24:03,380 Acceptar Feu clic en això. 526 00:24:03,380 --> 00:24:04,315 Millor que faci clic. 527 00:24:04,315 --> 00:24:07,020 528 00:24:07,020 --> 00:24:08,020 Ah, ho aconsegueix. 529 00:24:08,020 --> 00:24:08,520 No? 530 00:24:08,520 --> 00:24:09,050 D'ACORD. 531 00:24:09,050 --> 00:24:10,430 Així que farem un parell dels altres. 532 00:24:10,430 --> 00:24:12,830 No tant relacionada acadèmicament aquí, però han de 533 00:24:12,830 --> 00:24:14,520 mai buscat a Google per anagrama? 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 Cerca d'anagrama en lloc de recursivitat. 537 00:24:17,186 --> 00:24:22,540 538 00:24:22,540 --> 00:24:23,790 Què et sembla torta. 539 00:24:23,790 --> 00:24:25,515 Alguna vegada has buscat torta? 540 00:24:25,515 --> 00:24:29,260 541 00:24:29,260 --> 00:24:32,692 Ara, aquest és una mica difícil de veure però espero everything's-- acord. 542 00:24:32,692 --> 00:24:34,150 És només tu i jo gaudint d'això. 543 00:24:34,150 --> 00:24:34,690 D'ACORD. 544 00:24:34,690 --> 00:24:38,950 >> Així que finalment, aquest one's-- que és una mica torta. 545 00:24:38,950 --> 00:24:40,810 Ara feu un rotllo de barril. 546 00:24:40,810 --> 00:24:44,460 547 00:24:44,460 --> 00:24:45,310 Meravellós. 548 00:24:45,310 --> 00:24:45,910 Tot bé. 549 00:24:45,910 --> 00:24:47,110 Moltíssimes gràcies a Sam. 550 00:24:47,110 --> 00:24:49,416 Aquí tens. 551 00:24:49,416 --> 00:24:50,400 Gràcies. 552 00:24:50,400 --> 00:24:52,807 >> Llavors, què està passant en tot d'aquests exemples tontos? 553 00:24:52,807 --> 00:24:55,640 Així que en realitat, sota de la caputxa de Milions de línies de codi de Google 554 00:24:55,640 --> 00:24:58,860 pel que sembla és una mica ximple SI condicions que són essencialment 555 00:24:58,860 --> 00:25:01,160 comprovar si l'usuari té escrit en aquesta frase, 556 00:25:01,160 --> 00:25:03,760 fer alguna cosa que probablement va tenir una quantitat no trivial de temps 557 00:25:03,760 --> 00:25:06,080 per posar en pràctica només per ser divertit d'aquesta manera. 558 00:25:06,080 --> 00:25:08,430 Però això és tot el que es redueix fins a sota de la campana. 559 00:25:08,430 --> 00:25:11,570 Però, per descomptat, la recursivitat és més dels més geeks 560 00:25:11,570 --> 00:25:13,880 exemple entre aquests trucs especials. 561 00:25:13,880 --> 00:25:16,880 I segur que hi ha altres per aquí així que potser ni tan sols hem 562 00:25:16,880 --> 00:25:18,230 descobert de moment. 563 00:25:18,230 --> 00:25:22,830 >> Així que mireu, o considerar Ara el següent programa, 564 00:25:22,830 --> 00:25:24,830 i certament agafar qualsevol d'aquests en la seva sortida. 565 00:25:24,830 --> 00:25:28,820 Vaig a seguir endavant i obrir un programa que és 566 00:25:28,820 --> 00:25:30,920 va a tractar d'intercanviar dos valors. 567 00:25:30,920 --> 00:25:33,210 Però abans d'anar-hi, farem això. 568 00:25:33,210 --> 00:25:38,500 Podríem aconseguir un més voluntari, que penso? 569 00:25:38,500 --> 00:25:40,480 Vols ser voluntari? 570 00:25:40,480 --> 00:25:40,980 No? 571 00:25:40,980 --> 00:25:41,890 Anem cap amunt. 572 00:25:41,890 --> 00:25:42,390 Anem cap amunt. 573 00:25:42,390 --> 00:25:42,890 Tot bé. 574 00:25:42,890 --> 00:25:44,136 Així que el seu nom és què? 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 Anem amunt, Lauren. 578 00:25:46,890 --> 00:25:50,140 Així que Lauren està sent desafiat aquí com segueix. 579 00:25:50,140 --> 00:25:52,310 Encantat de conéixer-te. 580 00:25:52,310 --> 00:25:55,730 Així Lauren aquí té davant de les seves dues tasses buides. 581 00:25:55,730 --> 00:25:57,570 I tenim alguns de taronja suc i llet 582 00:25:57,570 --> 00:26:00,301 i anirem endavant i fer el següent. 583 00:26:00,301 --> 00:26:01,550 Només anem a omplir aquest. 584 00:26:01,550 --> 00:26:07,840 Unes unces de llet per aquí i anem a omplir una mica de suc de taronja per aquí. 585 00:26:07,840 --> 00:26:11,475 >> I davant de tots aquests membres de l'audiència, 586 00:26:11,475 --> 00:26:13,550 intercanviar els dos valors d'aquestes tasses. 587 00:26:13,550 --> 00:26:16,970 Posar el suc de taronja en el got de llet i la llet a la tassa de suc de taronja. 588 00:26:16,970 --> 00:26:22,380 589 00:26:22,380 --> 00:26:26,150 Com es fa això si estigués en casa i tenia accés a altres materials? 590 00:26:26,150 --> 00:26:27,400 LAUREN: Posa-ho en una altra tassa. 591 00:26:27,400 --> 00:26:28,191 DAVID J. Malan: OK. 592 00:26:28,191 --> 00:26:31,940 Així que anem a fer una temporal variables, si ho farem. 593 00:26:31,940 --> 00:26:35,871 I seguir endavant ara i posar en pràctica aquest mateix procediment d'intercanvi. 594 00:26:35,871 --> 00:26:36,370 Molt bo. 595 00:26:36,370 --> 00:26:41,490 Hem posat DO al temporal variables, la llet en la variable DO, 596 00:26:41,490 --> 00:26:44,481 i ara la variable temporal en la variable llet. 597 00:26:44,481 --> 00:26:44,980 D'ACORD. 598 00:26:44,980 --> 00:26:48,740 Així que molt ben fet fins ara. 599 00:26:48,740 --> 00:26:50,990 Així que resulta fora-- sostenir que pensat per un moment. 600 00:26:50,990 --> 00:26:54,479 Aquí, només friki que una mica, aquest seria el codi C corresponent 601 00:26:54,479 --> 00:26:55,520 que simplement implementem. 602 00:26:55,520 --> 00:26:58,650 Teníem dues entrades, A i B, tots dos que només haurem de dir amb senzillesa són 603 00:26:58,650 --> 00:26:59,260 int de. 604 00:26:59,260 --> 00:27:02,780 I notar aquí, si vull canviar els valors de dues variables, a i b, 605 00:27:02,780 --> 00:27:06,890 que en veritat necessitem un intermediari, un variable temporal, una tassa temporal, 606 00:27:06,890 --> 00:27:10,830 en el qual l'abocament un dels valors per la qual cosa tenim un marcador de posició per a ell. 607 00:27:10,830 --> 00:27:13,480 Però llavors el codi és exactament com Lauren aquí implementat. 608 00:27:13,480 --> 00:27:15,500 >> Ara, només per obtenir una poc més boig, resulta 609 00:27:15,500 --> 00:27:20,930 que vostè pot fer això sense una variable temporal. 610 00:27:20,930 --> 00:27:24,870 Per fer això correctament, però, anem a haver de fer trampa amb una mica de química. 611 00:27:24,870 --> 00:27:26,380 Tenim algunes copes de més aquí. 612 00:27:26,380 --> 00:27:29,600 Així que la cosa més propera que es veu com la llet i l'aigua perhaps-- 613 00:27:29,600 --> 00:27:34,090 o llet i OJ-- és que tenim alguna aigua, de manera que anem a omplir aquest un 614 00:27:34,090 --> 00:27:36,486 amb unes quantes unces d'aigua clara. 615 00:27:36,486 --> 00:27:38,332 Això és probablement massa. 616 00:27:38,332 --> 00:27:38,832 Sí. 617 00:27:38,832 --> 00:27:39,934 Això és definitivament massa. 618 00:27:39,934 --> 00:27:40,600 Mantingui en un segon. 619 00:27:40,600 --> 00:27:43,520 620 00:27:43,520 --> 00:27:48,420 >> I ara tenim petroli, que, segons record de la classe de química de l'escola secundària, 621 00:27:48,420 --> 00:27:49,990 espero que no es barreja amb aigua. 622 00:27:49,990 --> 00:27:53,650 Però quin tipus de classe de s'assembla a la llet i suc de taronja. 623 00:27:53,650 --> 00:27:55,760 Així que ara, sense utilitzar una variable temporal, 624 00:27:55,760 --> 00:27:59,260 pots intercanviar aquests dos valors? 625 00:27:59,260 --> 00:28:03,884 Així olis entra a la tassa d'aigua, l'aigua entra a la tassa d'oli. 626 00:28:03,884 --> 00:28:04,800 LAUREN: No hi ha altres copes? 627 00:28:04,800 --> 00:28:05,940 DAVID J. Malan: No hi ha altres copes. 628 00:28:05,940 --> 00:28:07,860 I jo no he fet provat això abans d'aquest any 629 00:28:07,860 --> 00:28:10,110 així que no sé si això va a realment treballar químicament. 630 00:28:10,110 --> 00:28:16,130 631 00:28:16,130 --> 00:28:18,650 Això no havia de passar. 632 00:28:18,650 --> 00:28:19,761 Està funcionant? 633 00:28:19,761 --> 00:28:20,260 Tot bé. 634 00:28:20,260 --> 00:28:20,990 Així que separar? 635 00:28:20,990 --> 00:28:21,490 Bé. 636 00:28:21,490 --> 00:28:24,714 Ara arribem a obtenir la aigua a l'altra copa. 637 00:28:24,714 --> 00:28:27,630 Concentradors de química més intel·ligents possible probablement fer això millor que jo. 638 00:28:27,630 --> 00:28:28,510 >> LAUREN: L'aigua està a la part inferior. 639 00:28:28,510 --> 00:28:31,910 >> DAVID J. Malan: El aigua- que era el que és clau l'última vegada que vam fer això. 640 00:28:31,910 --> 00:28:33,950 Has de fer-ho en l'ordre correcte. 641 00:28:33,950 --> 00:28:34,450 Sí. 642 00:28:34,450 --> 00:28:35,270 Està bé. 643 00:28:35,270 --> 00:28:37,290 Així que ara tenim dues tasses d'oli. 644 00:28:37,290 --> 00:28:37,790 D'ACORD. 645 00:28:37,790 --> 00:28:38,510 Està bé. 646 00:28:38,510 --> 00:28:40,110 Però químicament si això va funcionar de jo-- 647 00:28:40,110 --> 00:28:41,200 >> LAUREN: Aquesta és l'aigua. 648 00:28:41,200 --> 00:28:41,930 >> DAVID J. Malan: Això és tot aigua. 649 00:28:41,930 --> 00:28:42,430 Tot bé. 650 00:28:42,430 --> 00:28:44,210 Però això segueix sent la mateixa copa que abans. 651 00:28:44,210 --> 00:28:47,570 Així aboqui it-- intentar allà. 652 00:28:47,570 --> 00:28:49,300 D'ACORD. 653 00:28:49,300 --> 00:28:51,010 Aquest és un bon ús del temps de classe avui. 654 00:28:51,010 --> 00:28:51,510 D'ACORD. 655 00:28:51,510 --> 00:28:53,890 Així que ara nosaltres-- agradable. 656 00:28:53,890 --> 00:28:55,460 Una mena de. 657 00:28:55,460 --> 00:28:55,960 Tot bé. 658 00:28:55,960 --> 00:28:56,690 Així que és molt bo. 659 00:28:56,690 --> 00:29:00,006 Gràcies a Lauren. 660 00:29:00,006 --> 00:29:01,950 Molt ben fet. 661 00:29:01,950 --> 00:29:04,570 >> Així que per fer esclatar les seves ments, i això és potser una mica 662 00:29:04,570 --> 00:29:08,660 jugar amb si t'agrada en I + D CS50, pot, de fet, intercanviar dues variables 663 00:29:08,660 --> 00:29:11,470 sense utilitzar un nombre enter temporal. 664 00:29:11,470 --> 00:29:13,060 I aquest és el codi C corresponent. 665 00:29:13,060 --> 00:29:16,110 I si et recordes de l'última Dimecres, hem introduït, encara que breument, 666 00:29:16,110 --> 00:29:19,720 alguns dels nous operadors en C. I ho fa Algú recorda el que la petita pastanaga 667 00:29:19,720 --> 00:29:23,660 símbol és, aquest petit triangular símbol des del teclat representa? 668 00:29:23,660 --> 00:29:26,003 Què operador de bits? 669 00:29:26,003 --> 00:29:26,770 >> AUDIÈNCIA: EXOR. 670 00:29:26,770 --> 00:29:27,645 >> DAVID J. Malan: EXOR. 671 00:29:27,645 --> 00:29:28,560 Exclusiva O. 672 00:29:28,560 --> 00:29:32,920 Així que si vols, només per diversió en casa, per donar a i b de dos arbitrària 673 00:29:32,920 --> 00:29:36,072 valors com qualsevol eight-- i jo triaria un valor de vuit bits. 674 00:29:36,072 --> 00:29:38,530 Si vostè fa això amb 32 bits, obtindrà molt ràpidament avorrit. 675 00:29:38,530 --> 00:29:42,150 Però acaba de donar una de vuit bits valor que és el que sigui, un o dos, 676 00:29:42,150 --> 00:29:43,790 i donar-li b un valor similar. 677 00:29:43,790 --> 00:29:46,810 I a continuació, utilitzant la definició de XOR des de dimecres passat, 678 00:29:46,810 --> 00:29:52,560 sol·licitar que a poc a poc, cadascun aquests vuit bits en cada un a i b, 679 00:29:52,560 --> 00:29:54,980 i després fer exactament per aquest codi. 680 00:29:54,980 --> 00:29:58,170 I no és el correcte que es veu aquí a la pantalla. 681 00:29:58,170 --> 00:30:02,100 En efecte, es redueix a tres operacions XOR 682 00:30:02,100 --> 00:30:05,910 i d'alguna manera màgicament a i b intercanviaran posicions 683 00:30:05,910 --> 00:30:08,010 sense perdre cap informació. 684 00:30:08,010 --> 00:30:11,580 >> Així que el truc oli i l'aigua és el més proper encarnació món real 685 00:30:11,580 --> 00:30:12,980 Es va acudir per imitar això. 686 00:30:12,980 --> 00:30:15,950 Però és segurament més fàcil utilitzar una variable temporal, 687 00:30:15,950 --> 00:30:16,920 com en aquest cas. 688 00:30:16,920 --> 00:30:21,190 I això també es diu una oportunitat, també, aquest tipus de micro optimització, 689 00:30:21,190 --> 00:30:23,590 com un científic de la computació diria, mentre que tipus de diversió 690 00:30:23,590 --> 00:30:27,060 presumir de com es va fer això sense com l'intercanvi amb una variable addicional, 691 00:30:27,060 --> 00:30:28,640 que no és tan convincent. 692 00:30:28,640 --> 00:30:31,619 A causa de estalviar 32 bits, com en el cas d'un int real, 693 00:30:31,619 --> 00:30:33,410 No és tot el que convincent en un sistema on 694 00:30:33,410 --> 00:30:36,722 vostè podria estar utilitzant desenes de megabytes o encara més com memòria aquests dies. 695 00:30:36,722 --> 00:30:38,680 I de fet, quan arribem a un conjunt de problemes més endavant 696 00:30:38,680 --> 00:30:41,010 i s'implementa encanteri corrector i vostè 697 00:30:41,010 --> 00:30:43,550 el repte de fer-ho amb això com a mínim RAM i tan poc 698 00:30:43,550 --> 00:30:46,820 temps possible en el que computer-- encara 699 00:30:46,820 --> 00:30:50,160 tenir una setmana per implementar it-- podràs tener-- podràs 700 00:30:50,160 --> 00:30:51,799 el repte de minimitzar aquests recursos. 701 00:30:51,799 --> 00:30:53,840 I això és realment l'única ocasionar aquest semestre 702 00:30:53,840 --> 00:30:57,940 on se l'anima a afaitar- fora fins i tot el millor rendiment 703 00:30:57,940 --> 00:30:59,340 costa el contrari. 704 00:30:59,340 --> 00:31:02,200 >> Així que-- com podem veure això en codi real? 705 00:31:02,200 --> 00:31:04,530 Déjame anar per davant ara i obrir un exemple 706 00:31:04,530 --> 00:31:07,700 que deliberadament es diu No swap, perquè no ho fa 707 00:31:07,700 --> 00:31:10,670 De fet canviar les variables com en realitat es podria esperar. 708 00:31:10,670 --> 00:31:12,260 Així que anem a fer una ullada. 709 00:31:12,260 --> 00:31:17,050 Heus aquí un programa que no té CS50 biblioteca passant, simplement estàndard d'E / S. 710 00:31:17,050 --> 00:31:19,560 Ara tenim un prototip per sobre de la tapa d'intercanvi que acaba de 711 00:31:19,560 --> 00:31:21,540 significa que ha de ser definit més endavant. 712 00:31:21,540 --> 00:31:22,550 I aquí és principal. 713 00:31:22,550 --> 00:31:26,000 >> Em van assignar arbitràriament x i y, respectivament, els valors d'un i dos 714 00:31:26,000 --> 00:31:28,590 només perquè són petites i fàcil de pensar. 715 00:31:28,590 --> 00:31:32,280 I llavors només tinc un munt de printfs on tinc una comprovació de validesa. x és 1 716 00:31:32,280 --> 00:31:35,110 ei és 2 és presumiblement el que aquests printfs diran. 717 00:31:35,110 --> 00:31:36,530 Així que no hi ha màgia fins al moment. 718 00:31:36,530 --> 00:31:40,100 >> Llavors em vaig a reclamar amb imprimir def, intercanviant dot dot dot. 719 00:31:40,100 --> 00:31:43,730 Vaig a trucar a la permuta funció, passant en x i y. 720 00:31:43,730 --> 00:31:47,350 I suposem per ara que intercanvi es du a terme exactament 721 00:31:47,350 --> 00:31:49,930 com ho era fa un moment amb una variable temporal. 722 00:31:49,930 --> 00:31:52,670 I pel que pretenc amb valentia, vaig canviar. 723 00:31:52,670 --> 00:31:55,429 x és ara això e i és ara que. 724 00:31:55,429 --> 00:31:57,220 Però l'arxiu, és clar, es diu n swap. 725 00:31:57,220 --> 00:31:58,678 Així que anem a veure realment el que succeeix. 726 00:31:58,678 --> 00:32:04,450 Si Va compilar sense swap i després fer ./noswap, x és 1, i és 2. 727 00:32:04,450 --> 00:32:05,770 Intercanvi de cases intercanviat. 728 00:32:05,770 --> 00:32:07,200 x és 1, i és 2. 729 00:32:07,200 --> 00:32:11,980 Així que en realitat sembla estar viciat fins i tot encara que swap-- anem a desplaçar-se cap avall ara-- 730 00:32:11,980 --> 00:32:16,542 s'implementa exactament per la codi que va proposar fa un moment. 731 00:32:16,542 --> 00:32:19,000 Així que no anem a aconseguir la suposició amb les coses XOR per ara. 732 00:32:19,000 --> 00:32:21,890 Això també hauria de funcionar igual que amb la llet i suc de taronja, 733 00:32:21,890 --> 00:32:25,820 però no sembla estar funcionant. 734 00:32:25,820 --> 00:32:27,180 >> Així que anem a fer això una altra vegada. 735 00:32:27,180 --> 00:32:29,310 Potser jo no estava corrent bé. 736 00:32:29,310 --> 00:32:32,010 Així que anem a córrer No Intercanviar nou. 737 00:32:32,010 --> 00:32:32,900 Potser jo-- no. 738 00:32:32,900 --> 00:32:34,400 Així que és simplement no funciona. 739 00:32:34,400 --> 00:32:36,060 Així que farem una mica de comprovació de validesa. 740 00:32:36,060 --> 00:32:39,690 Déjame anar per davant aquí a Intercanviar i acaba d'afegir, espera un minut, 741 00:32:39,690 --> 00:32:43,856 a és% i / n i anem plug-in el valor d'una. 742 00:32:43,856 --> 00:32:45,730 Perquè realment vull per veure el que està passant. 743 00:32:45,730 --> 00:32:47,570 I, en efecte, es tracta de una tècnica de depuració 744 00:32:47,570 --> 00:32:50,028 que vostè podria estar utilitzant en hores d'oficina oa casa ja, 745 00:32:50,028 --> 00:32:53,560 similar a la primera meitat de Dan Vídeo de Armendáriz en PSET3 746 00:32:53,560 --> 00:32:56,870 on vam introduir print def com una tècnica recomanada, almenys 747 00:32:56,870 --> 00:32:58,080 per als casos simples. 748 00:32:58,080 --> 00:33:01,720 Déjame anar endavant i corro fer sense intercanvi de nou, ./noswap. 749 00:33:01,720 --> 00:33:04,370 750 00:33:04,370 --> 00:33:05,840 >> Interessant. 751 00:33:05,840 --> 00:33:11,670 Així compte del que sembla ser cert. x és 1, i és 2, però a és 2 quan b és 1. 752 00:33:11,670 --> 00:33:16,790 Així que aquests dos d'alguna manera es van canviar però x i y no estan sent intercanviats. 753 00:33:16,790 --> 00:33:21,090 Així que per ser clars, el que està passant és, aquí tinc xii 754 00:33:21,090 --> 00:33:25,380 i aquestes són les variables locals en el abast de principal, estic passant x i y 755 00:33:25,380 --> 00:33:26,170 intercanviar. 756 00:33:26,170 --> 00:33:29,080 Ara, swap, com una funció separada, és lliure de cridar als seus arguments 757 00:33:29,080 --> 00:33:30,590 o la seva paràmetres del que vulgui. 758 00:33:30,590 --> 00:33:33,280 Foo o bar o XOY o aob. 759 00:33:33,280 --> 00:33:36,870 Només per deixar clar que ells són no idèntica a x i y per se, 760 00:33:36,870 --> 00:33:38,020 Ho he dit a i b. 761 00:33:38,020 --> 00:33:40,040 Però podríem anomenar el que vulguem. 762 00:33:40,040 --> 00:33:43,960 >> I pel que sembla s'està passant d'intercanvi 763 00:33:43,960 --> 00:33:48,980 x-- conegut com A-- i és es passa I- conegut com b. 764 00:33:48,980 --> 00:33:51,900 D'alguna manera, aquestes tres línies són el bescanvi d'aquests valors exactament 765 00:33:51,900 --> 00:33:53,510 com Lauren va fer amb la llet i suc de taronja. 766 00:33:53,510 --> 00:33:56,010 Però quan imprimim els valors, a i b 767 00:33:56,010 --> 00:34:01,340 són de fet canviar però xi I tenen cap canvi a ells. 768 00:34:01,340 --> 00:34:03,150 Recordem que x i y són aquí. 769 00:34:03,150 --> 00:34:05,320 >> Així que podem veure això a través de Una altra tècnica també. 770 00:34:05,320 --> 00:34:08,110 I això també és una tècnica incrustat en un problema establert tres. 771 00:34:08,110 --> 00:34:10,780 Seguirem endavant i fer això en CS50 Identificació si vostè no té ja. 772 00:34:10,780 --> 00:34:13,730 En el costat dret que tenir aquesta pestanya depurador. 773 00:34:13,730 --> 00:34:16,159 I si obre això, hi ha una mica d'informació arcana 774 00:34:16,159 --> 00:34:17,530 això és llançat en vostè al principi. 775 00:34:17,530 --> 00:34:19,310 Però anem a burlen d'això a part molt ràpid. 776 00:34:19,310 --> 00:34:21,620 >> Així que un, veure les variables locals. 777 00:34:21,620 --> 00:34:26,230 Resulta que construir a IDE CS50, i una gran quantitat d'entorns de programació més 778 00:34:26,230 --> 00:34:28,060 en general, és un depurador. 779 00:34:28,060 --> 00:34:31,340 Una eina que et permet veure visualment el que està passant dins del seu programa 780 00:34:31,340 --> 00:34:34,380 sense haver de recórrer a l'addició printfs i compilar i executar 781 00:34:34,380 --> 00:34:37,588 i l'addició de printf i compilar i córrer, que ja, en horari d'oficina 782 00:34:37,588 --> 00:34:40,070 oa la llar, és probable que fent bastant tediós. 783 00:34:40,070 --> 00:34:43,090 >> Així que aquí, en un moment, estem va a veure en temps real 784 00:34:43,090 --> 00:34:44,760 els valors de les nostres variables locals. 785 00:34:44,760 --> 00:34:47,880 També serem capaços d'establir els anomenats punts de ruptura que 786 00:34:47,880 --> 00:34:52,570 oportunitats en el meu programa per fer una pausa execució en una línia específica de codi 787 00:34:52,570 --> 00:34:53,710 que tinc curiositat per saber. 788 00:34:53,710 --> 00:34:54,210 Oi? 789 00:34:54,210 --> 00:34:55,969 Aquests programes s'executen en una fracció de segon. 790 00:34:55,969 --> 00:35:00,450 És una mica agradable per a nosaltres els éssers humans més lentes per ser capaç de fer una pausa, prendre un moment, consulteu 791 00:35:00,450 --> 00:35:02,380 el que està succeint al seu voltant una certa línia de codi 792 00:35:02,380 --> 00:35:05,050 sense l'arada programa a través d'ell i acabat del tot. 793 00:35:05,050 --> 00:35:08,510 Així que als punts de ruptura ens va a permetre trencar i fer una pausa en un punt determinat. 794 00:35:08,510 --> 00:35:12,990 >> Pila de trucades és una forma elegant de dient quines funcions són actualment 795 00:35:12,990 --> 00:35:14,140 sent cridat en el moment. 796 00:35:14,140 --> 00:35:15,370 Principal es diu sempre primer. 797 00:35:15,370 --> 00:35:17,230 Però si Principal diu funció anomenada swap, 798 00:35:17,230 --> 00:35:20,470 estem en realitat va a veure això Torre de les funcions que han estat 799 00:35:20,470 --> 00:35:22,400 crida en ordre cronològic invers. 800 00:35:22,400 --> 00:35:23,310 Així que anem a veure això. 801 00:35:23,310 --> 00:35:24,327 >> Me'n vaig a allunyar. 802 00:35:24,327 --> 00:35:25,660 Vaig a tornar al meu codi. 803 00:35:25,660 --> 00:35:27,540 I només perquè vull ser pedant aquí, 804 00:35:27,540 --> 00:35:31,100 Vaig a seguir endavant i feu clic just a l'esquerra de la línia cinc. 805 00:35:31,100 --> 00:35:32,830 I això crea un punt vermell. 806 00:35:32,830 --> 00:35:36,200 I noti en el costat dret que el depurador sap, bé, 807 00:35:36,200 --> 00:35:41,020 Que acabo de dir un punt d'interrupció en línia noswap.c 5, específicament 808 00:35:41,020 --> 00:35:42,480 en aquesta línia de codi. 809 00:35:42,480 --> 00:35:45,090 Així que el depurador sap que jo han sol·licitat que la propera vegada 810 00:35:45,090 --> 00:35:48,530 Tinc el meu programa es pausa execució no en lloc de només 811 00:35:48,530 --> 00:35:50,390 corrent tot super ràpid. 812 00:35:50,390 --> 00:35:53,889 >> Així que ara vaig a fer clic al Depurar botó a la part superior de l'IDE 813 00:35:53,889 --> 00:35:55,430 i això va a fer el següent. 814 00:35:55,430 --> 00:36:00,680 Es va a obrir un principi una mica por segon terminal mirant window-- 815 00:36:00,680 --> 00:36:02,679 depuració remota des acollir tal tal-- 816 00:36:02,679 --> 00:36:04,970 i anem a tornar al que tot el que significa en poc temps. 817 00:36:04,970 --> 00:36:09,020 Però el que és important, per ara és que aquest punt vermell va ser copejat, 818 00:36:09,020 --> 00:36:11,735 el depurador té deliberadament pausa execution-- 819 00:36:11,735 --> 00:36:15,560 no en aquesta línia en si, sinó en la primera línia de codi real en aquesta funció. 820 00:36:15,560 --> 00:36:18,040 I per això la línia 7 és ara ressaltat en groc. 821 00:36:18,040 --> 00:36:20,550 >> I ara anem a fer una ullada en el costat dret. 822 00:36:20,550 --> 00:36:27,300 Sembla que, per defecte, prou bé, x té el que de valor? 823 00:36:27,300 --> 00:36:27,860 0. 824 00:36:27,860 --> 00:36:29,750 E i té el que de valor? 825 00:36:29,750 --> 00:36:30,410 Zero. 826 00:36:30,410 --> 00:36:35,540 I això és d'esperar en el sentit que x i I- que line-- groga té 827 00:36:35,540 --> 00:36:36,770 encara no executat. 828 00:36:36,770 --> 00:36:38,510 Així que x no han de tenir el valor 1. 829 00:36:38,510 --> 00:36:41,470 Podria tenir qualsevol altre valor, un valor anomenat d'escombraries. 830 00:36:41,470 --> 00:36:44,320 I tenim la sort que és zero en aquest punt, essencialment. 831 00:36:44,320 --> 00:36:46,400 >> Així que ara només hi ha uns pocs botons hem de cuidar 832 00:36:46,400 --> 00:36:48,100 sobre l'depurar d'aquesta manera. 833 00:36:48,100 --> 00:36:49,970 Cal notar aquí, tenim un botó Reproduir. 834 00:36:49,970 --> 00:36:51,877 I si juguem o colpejar reprendre, això és només 835 00:36:51,877 --> 00:36:53,710 va executar a través de la resta del programa 836 00:36:53,710 --> 00:36:55,300 o fins que xoca amb un altre punt d'interrupció. 837 00:36:55,300 --> 00:36:56,910 Però jo no he posat cap altre punts de ruptura pel que és just 838 00:36:56,910 --> 00:36:58,118 va a córrer fins al final. 839 00:36:58,118 --> 00:37:00,280 Aquest tipus de derrotes les propòsit de furgar. 840 00:37:00,280 --> 00:37:03,290 >> Així que en comptes, m'importa aquestes icones a la dreta. 841 00:37:03,290 --> 00:37:05,360 I si hi ha sobre ells, com es deu també, 842 00:37:05,360 --> 00:37:07,450 veuràs petits consells eina tips--. 843 00:37:07,450 --> 00:37:09,020 Aquest és un pas més. 844 00:37:09,020 --> 00:37:11,290 Ara això no vol dir salt la següent línia de codi. 845 00:37:11,290 --> 00:37:14,840 Això només vol dir executar-lo i passar a la següent, passar a la següent, 846 00:37:14,840 --> 00:37:15,580 passar a la següent. 847 00:37:15,580 --> 00:37:17,610 En altres paraules, a través de aquest botó, puc caminar 848 00:37:17,610 --> 00:37:20,390 a través del meu codi d'un pas a la vegada. 849 00:37:20,390 --> 00:37:21,914 Línia per línia, literalment. 850 00:37:21,914 --> 00:37:23,830 Ara, a la dreta de això, hi ha un altre 851 00:37:23,830 --> 00:37:25,163 que veurem en un moment. 852 00:37:25,163 --> 00:37:27,820 Aquesta és l'anomenada Step Into icona que és 853 00:37:27,820 --> 00:37:30,300 em permetrà busseig en una altra funció. 854 00:37:30,300 --> 00:37:31,800 Però anem a veure això en un moment. 855 00:37:31,800 --> 00:37:33,280 Així que vaig a fer clic passar per sobre. 856 00:37:33,280 --> 00:37:35,820 I ara noti, com faig clic aquest botó a la part superior dreta, 857 00:37:35,820 --> 00:37:41,260 mantenir els ulls més o menys sota Local Variables i veure què passa amb x. 858 00:37:41,260 --> 00:37:44,115 x és ara 1 perquè el línia groga s'ha executat 859 00:37:44,115 --> 00:37:45,840 i ens hem traslladat a la línia 8. 860 00:37:45,840 --> 00:37:49,840 I en un moment i esperem que hauria de convertir-2. 861 00:37:49,840 --> 00:37:52,330 >> Ara, res tan interessant que passa per una mica. 862 00:37:52,330 --> 00:37:53,390 Tot això és és printf. 863 00:37:53,390 --> 00:37:58,010 I compte, al meu terminal secundària finestra, veig la sortida de definició d'impressió. 864 00:37:58,010 --> 00:38:01,080 I ara he de fer una decisió del programador. 865 00:38:01,080 --> 00:38:04,360 Puc passar per sobre d'aquesta línia de codi, executar-lo, però no 866 00:38:04,360 --> 00:38:06,220 aconseguir curiós sobre el que hi ha dins. 867 00:38:06,220 --> 00:38:11,130 O puc pas realment en ell i anar dins d'Intercanvi de si mateix. 868 00:38:11,130 --> 00:38:12,340 Així que anem a fer el segon. 869 00:38:12,340 --> 00:38:15,550 >> Déjame anar endavant i feu clic a No Step Over però Step Into. 870 00:38:15,550 --> 00:38:17,300 Avís, de sobte, els canvis en les finestres 871 00:38:17,300 --> 00:38:19,330 per ressaltar la primera línia de codi a Canvia. 872 00:38:19,330 --> 00:38:20,710 Aquesta és la línia 21. 873 00:38:20,710 --> 00:38:25,220 I ara, quina classe de covard és que, si es mira per aquí, com s'esperava, 874 00:38:25,220 --> 00:38:29,720 una coma b és 1 i 2, respectivament. 875 00:38:29,720 --> 00:38:33,840 Per què és temp 32767? 876 00:38:33,840 --> 00:38:36,560 Recordant que la temperatura, de la mateixa manera que la tassa buida fa un moment, 877 00:38:36,560 --> 00:38:38,980 es declara aquí a la línia 21. 878 00:38:38,980 --> 00:38:43,390 Per què 32.000 Vull dir, per què és només algun valor estrany? 879 00:38:43,390 --> 00:38:43,890 Sí? 880 00:38:43,890 --> 00:38:45,190 >> AUDIÈNCIA: No és inicialitzat. 881 00:38:45,190 --> 00:38:46,940 >> DAVID J. Malan: És No s'ha inicialitzat. 882 00:38:46,940 --> 00:38:49,370 Així que el nostre equip sempre té memòria física. 883 00:38:49,370 --> 00:38:50,544 Fins i tot de RAM física. 884 00:38:50,544 --> 00:38:52,710 I sempre de zero i un està aquí, oi? 885 00:38:52,710 --> 00:38:54,626 A causa de que estem fent servir la nostra ordinador tot el dia, 886 00:38:54,626 --> 00:38:57,210 utilitzeu el CS50 IDE o els servidors de tot el dia. 887 00:38:57,210 --> 00:39:01,159 Així que la memòria RAM o bé té alguns zeros o algú d'o alguns zeros i uns. 888 00:39:01,159 --> 00:39:02,950 No importa si és o no els estiguis utilitzant. 889 00:39:02,950 --> 00:39:05,270 No es pot tenir en blanc espais en què volen bits. 890 00:39:05,270 --> 00:39:06,850 Són ja sigui zeros i uns. 891 00:39:06,850 --> 00:39:09,610 >> Així resulta que la temperatura, ja que no hem inicialitzat encara, 892 00:39:09,610 --> 00:39:14,580 tenim aquests 32 bits, però no he ha inicialitzat als valors coneguts. 893 00:39:14,580 --> 00:39:18,110 Així que el que fossin més recentment utilitzat para-- els 32 bits-- 894 00:39:18,110 --> 00:39:23,000 només estem veient els artefactes d'alguns ús previ d'aquells particulars 32 895 00:39:23,000 --> 00:39:23,500 trossets. 896 00:39:23,500 --> 00:39:27,780 Tan aviat com faci clic a Pas a pas per això, uf, temperatura es posarà el valor 1. 897 00:39:27,780 --> 00:39:31,600 I si ho faig de nou, a és serà donat el valor 2 898 00:39:31,600 --> 00:39:33,830 i després b va a ser donat el valor 1. 899 00:39:33,830 --> 00:39:36,390 >> I així, el que és bo ara en aquest punt de la història 900 00:39:36,390 --> 00:39:39,750 és que el depurador és mostrant-me, super lenta 901 00:39:39,750 --> 00:39:42,640 al meu propi ritme, el que l'estat de Swap és. 902 00:39:42,640 --> 00:39:47,490 Però fixa't en la part superior aquí, previ avís que la pila de trucades en realitat 903 00:39:47,490 --> 00:39:49,180 té dues capes a la mateixa. 904 00:39:49,180 --> 00:39:53,240 Ara el que ha destacat com a Swap, si faig clic a Principal lloc, 905 00:39:53,240 --> 00:39:57,100 observi com canvien les variables locals pel fet que el desenvolupador pot simplement hop 906 00:39:57,100 --> 00:39:59,740 volta i entrar en qualsevol àmbit diferent. 907 00:39:59,740 --> 00:40:04,070 Així que tot i que estem fent tot això treballar i intercanviar correctament a i b, 908 00:40:04,070 --> 00:40:09,080 si vaig a anar i venir entre Permuta on a és 2 i b és 1 i Main, 909 00:40:09,080 --> 00:40:11,851 ha Principal vist afectada en absolut? 910 00:40:11,851 --> 00:40:12,350 No. 911 00:40:12,350 --> 00:40:13,930 Quina és el menjar per emportar en aquesta llista? 912 00:40:13,930 --> 00:40:18,200 Bé, resulta que qualsevol moment es diu a una funció com swap, 913 00:40:18,200 --> 00:40:21,600 i se li passa arguments, el que estàs passant a la funció swap 914 00:40:21,600 --> 00:40:24,730 en aquest cas és una còpia d'aquests arguments. 915 00:40:24,730 --> 00:40:28,620 Així que si x i i són cada un, respectivament 32 bits, el swap és aconseguir 916 00:40:28,620 --> 00:40:30,760 és dos nous locals variables o arguments, 917 00:40:30,760 --> 00:40:34,380 anomenat i B-- però aquells són arbitràries noms-- però el patró de zeros 918 00:40:34,380 --> 00:40:39,520 i estimats a l'interior de A i B són fila per ser idèntica a x i y 919 00:40:39,520 --> 00:40:42,610 però no són la el mateix que x i y. 920 00:40:42,610 --> 00:40:46,880 >> És com si té Principal en el seu tros de paper el número 1 i 2 per x i y, 921 00:40:46,880 --> 00:40:49,260 i després quan mans que tros de paper per a intercanvi, 922 00:40:49,260 --> 00:40:51,970 Intercanviar posa molt ràpidament seva pròpia ploma, escriu 923 00:40:51,970 --> 00:40:56,240 1 i 2 en el seu propi full de paper, mans enrere xi original Principal 924 00:40:56,240 --> 00:40:58,790 i després fa la seva pròpia cosa amb a i b. 925 00:40:58,790 --> 00:41:01,940 I ara això és super important perquè això té implicacions no trivials 926 00:41:01,940 --> 00:41:06,260 per realment escriure codi correcte perquè semblaria que no podem canviar 927 00:41:06,260 --> 00:41:07,500 dues variables. 928 00:41:07,500 --> 00:41:09,150 >> He escrit una funció Intercanviar correcta. 929 00:41:09,150 --> 00:41:12,770 Hem implementat amb Lauren com una funció d'intercanvi correcte en la realitat, 930 00:41:12,770 --> 00:41:16,700 però aparentment res d'això assumptes si no pot en realitat 931 00:41:16,700 --> 00:41:19,530 intercanviar dos valors de forma permanent. 932 00:41:19,530 --> 00:41:21,970 Així que tenim una altra manera per aconseguir realment en això, 933 00:41:21,970 --> 00:41:24,472 i hem de ser capaços de realment resoldre aquest problema. 934 00:41:24,472 --> 00:41:27,180 I resulta fora-- i ens vindrà tornar a aquesta imatge en particular 935 00:41:27,180 --> 00:41:30,500 abans long-- aquesta és una manera de que pot dibuixar la memòria de l'equip. 936 00:41:30,500 --> 00:41:31,460 És només un rectangle. 937 00:41:31,460 --> 00:41:32,960 Vostè podria dibuixar qualsevol nombre de maneres, però és 938 00:41:32,960 --> 00:41:35,740 convenient per a dibuixar com un rectangle per la següent raó. 939 00:41:35,740 --> 00:41:40,040 >> Anem a començar avui i més enllà parlant de l'anomenada pila. 940 00:41:40,040 --> 00:41:43,870 I la pila és només un tros d'RAM-- un tros de memory-- 941 00:41:43,870 --> 00:41:47,100 funcions que tenen accés quan se'ls crida. 942 00:41:47,100 --> 00:41:49,800 I així resulta que en la part inferior d'aquesta pila 943 00:41:49,800 --> 00:41:53,590 és on totes les variables locals de principals i org C i org V i totes aquestes coses 944 00:41:53,590 --> 00:41:56,950 es va a anar per defecte. I si Principal demana alguna altra funció com swap, 945 00:41:56,950 --> 00:42:00,330 així, Empassa va a aconseguir una altra capa de la memòria per sobre d'ella. 946 00:42:00,330 --> 00:42:04,490 >> I pel que acaba de donar-li una succinta ràpida foto d'això, si jo vaig aquí-- 947 00:42:04,490 --> 00:42:09,450 i vaig deixar la meva Mirall això en el les despeses generals com bé-- el que realment tinc, 948 00:42:09,450 --> 00:42:12,100 si ens preocupem només de la part inferior d'aquesta imatge, per ara, 949 00:42:12,100 --> 00:42:15,070 és que quan va executar un programa de i Main es diu, 950 00:42:15,070 --> 00:42:18,330 Principal se li dóna un tros de RAM en el meu equip que és 951 00:42:18,330 --> 00:42:20,060 a la part inferior d'aquesta anomenada pila. 952 00:42:20,060 --> 00:42:22,143 I jo vaig a dibuixar- deliberadament com un quadrat. 953 00:42:22,143 --> 00:42:24,540 Així que és com 32 bits o quatre bytes. 954 00:42:24,540 --> 00:42:28,790 I si aquesta funció principal té una variable anomenada x amb un valor d'1 955 00:42:28,790 --> 00:42:32,626 i té una variable anomenada i amb el valor de 2, que és 956 00:42:32,626 --> 00:42:35,750 com prendre aquesta estella de memòria que Principal ha estat proposada per l'operatiu 957 00:42:35,750 --> 00:42:38,850 sistema i dividint de manera que la primera variable local va aquí, 958 00:42:38,850 --> 00:42:40,930 el segon va aquí, i això és tot. 959 00:42:40,930 --> 00:42:45,590 >> Quan principal diu swap, Intercanviar obté el seu propi tros de la memòria 960 00:42:45,590 --> 00:42:48,280 que anem a dibuixar com aquest des del sistema operatiu, 961 00:42:48,280 --> 00:42:50,820 i que va a tenir la seva variables locals propis basats 962 00:42:50,820 --> 00:42:53,825 en la nostra aplicació anterior amb variables locals un 963 00:42:53,825 --> 00:42:58,010 i b que al principi obtenir els valors 1 i 2. 964 00:42:58,010 --> 00:43:00,450 Però llavors, tan aviat com sigui el codi de Swap executa, 965 00:43:00,450 --> 00:43:03,760 i Lauren realitat intercanvia el DO i la llet, el que està passant? 966 00:43:03,760 --> 00:43:09,030 Doncs bé, aquest 2 està convertint en un 1, aquest 1 està convertint en un 2, i, per cert, 967 00:43:09,030 --> 00:43:13,360 hi ha una variable temporal que està sent usat tot aquest temps que amb el temps 968 00:43:13,360 --> 00:43:14,470 desapareix. 969 00:43:14,470 --> 00:43:16,720 Però no importa la quantitat de treball que vostè fa 970 00:43:16,720 --> 00:43:22,160 en aquesta línia de-- en aquest espai de memòria, x i y són completament intacta. 971 00:43:22,160 --> 00:43:26,320 >> Així que necessitem alguna manera de donar Intercanviar i funciona com si 972 00:43:26,320 --> 00:43:32,640 accés secret, si es vol, a funcions com-- a la memòria com x i y. 973 00:43:32,640 --> 00:43:35,110 Així que donem una ullada a un exemple que ajuda 974 00:43:35,110 --> 00:43:38,220 a veure exactament el que ha estat passant tot aquest temps. 975 00:43:38,220 --> 00:43:40,284 Vaig a seguir endavant i obrir Comparar Zero. 976 00:43:40,284 --> 00:43:42,200 I jo vaig a tancar la nostra depurador, vaig 977 00:43:42,200 --> 00:43:44,360 per tancar aquest missatge a la recerca de por els justos diu, espera un minut, 978 00:43:44,360 --> 00:43:45,800 estàs en la depuració mitjana. 979 00:43:45,800 --> 00:43:48,383 Vaig a ocultar aquesta pestanya aquí només per tornar a la simplicitat. 980 00:43:48,383 --> 00:43:50,160 Així que no et preocupis si GDB és assassinat. 981 00:43:50,160 --> 00:43:53,910 Això només significa que el programa té estat deixar de fumar, deliberadament, en aquest cas, 982 00:43:53,910 --> 00:43:54,820 per mi. 983 00:43:54,820 --> 00:43:57,700 >> I ara Comparar Zero fa això. 984 00:43:57,700 --> 00:44:00,110 Estic usant el CS50 biblioteca d'E / S estàndard. 985 00:44:00,110 --> 00:44:04,319 Tinc una funció principal que primer diu, diuen alguna cosa, i obté una cadena. 986 00:44:04,319 --> 00:44:06,110 Després diu una i altra aconsegueix una altra cadena. 987 00:44:06,110 --> 00:44:09,910 I notar que aquestes dues cadenes es diuen s i t, respectivament. 988 00:44:09,910 --> 00:44:12,910 I ara aquest programa, Comparar Zero, el seu propòsit a la vida, 989 00:44:12,910 --> 00:44:15,470 se suposa que em diuen, ho escric el mateix? 990 00:44:15,470 --> 00:44:16,910 I així em vaig a tornar a la setmana un. 991 00:44:16,910 --> 00:44:19,950 Estic fent servir el meu operador d'igualtat iguals que és l'operador de la qualitat. 992 00:44:19,950 --> 00:44:22,220 No és l'operador d'assignació, l'operador d'igualtat. 993 00:44:22,220 --> 00:44:23,890 Només estic comparant s i t. 994 00:44:23,890 --> 00:44:27,470 >> Així que anem a realment seguir endavant i fer això. 995 00:44:27,470 --> 00:44:32,680 I vaig a seguir endavant i fer comparació Zero. 996 00:44:32,680 --> 00:44:35,110 Jo faré ./comparezero. 997 00:44:35,110 --> 00:44:37,150 I jo vaig a anar endavant i dir alguna cosa 998 00:44:37,150 --> 00:44:43,450 com, farem mare en minúscules i què hi ha de la mare en majúscules. 999 00:44:43,450 --> 00:44:45,034 I per descomptat que escric coses diferents. 1000 00:44:45,034 --> 00:44:45,533 Tot bé. 1001 00:44:45,533 --> 00:44:46,570 Això és d'esperar. 1002 00:44:46,570 --> 00:44:47,640 >> Anem a córrer de nou. 1003 00:44:47,640 --> 00:44:49,740 Les dues vegades ho fan en minúscula, minúscula. 1004 00:44:49,740 --> 00:44:51,490 Això es veu súper idèntica a mi. 1005 00:44:51,490 --> 00:44:52,930 Retorn. 1006 00:44:52,930 --> 00:44:53,430 D'ACORD. 1007 00:44:53,430 --> 00:44:55,804 Potser és només estrany perquè no està agradant la meva gramàtica. 1008 00:44:55,804 --> 00:44:59,930 Així que anem a fer un MOM de capital, capital de MOM, idèntics. 1009 00:44:59,930 --> 00:45:01,490 Diferents coses. 1010 00:45:01,490 --> 00:45:03,907 >> Llavors per què és això? 1011 00:45:03,907 --> 00:45:06,240 Bé, el que realment està passant de sota el capó aquí? 1012 00:45:06,240 --> 00:45:08,180 Així que anem a tornar més aquí per un moment 1013 00:45:08,180 --> 00:45:10,910 i considerar el GetString és en realitat fent. 1014 00:45:10,910 --> 00:45:13,385 Quan es diu a GetString, que és una funció que 1015 00:45:13,385 --> 00:45:16,510 ens va escriure i que arriba d'alguna manera una seqüència de caràcters de l'usuari. 1016 00:45:16,510 --> 00:45:20,280 I anem a suposar que la primera vegada que dic GetString, això em dóna 1017 00:45:20,280 --> 00:45:21,930 un tros de memòria que són aquestes. 1018 00:45:21,930 --> 00:45:26,990 I si he escrit en minúscules m-o-M-- i el que va després d'ell? 1019 00:45:26,990 --> 00:45:28,840 Només una comprovació de validesa ràpid. 1020 00:45:28,840 --> 00:45:29,780 >> Zero barra invertida. 1021 00:45:29,780 --> 00:45:30,510 Sabem això. 1022 00:45:30,510 --> 00:45:32,784 I recordem que vam jugar tot amb el nom de Zamila 1023 00:45:32,784 --> 00:45:34,950 i un munt d'altres noms quan Rob era aquí buscant 1024 00:45:34,950 --> 00:45:36,280 al que està passant dins de la memòria. 1025 00:45:36,280 --> 00:45:37,780 Així que la història és exactament la mateixa. 1026 00:45:37,780 --> 00:45:40,160 Això és el que GetString està tornant a mi. 1027 00:45:40,160 --> 00:45:44,780 Ara, el meu codi fa un moment emmagatzema el valor de retorn de GetString 1028 00:45:44,780 --> 00:45:47,510 en una variable anomenada s. 1029 00:45:47,510 --> 00:45:51,390 I llavors la segona vegada que em deia, s'emmagatzema en una variable anomenada t. 1030 00:45:51,390 --> 00:45:55,070 >> Així que si me'n vaig d'aquí, necessito per dibuixar aquest variable-- locals 1031 00:45:55,070 --> 00:45:59,610 i estic en general va a dibuixar una cadena com sol-- anem 1032 00:45:59,610 --> 00:46:02,360 anomenar S-- com una petita plaça aquí. 1033 00:46:02,360 --> 00:46:09,760 I ara, com somehow-- mare anar dins d'aquesta variable s? 1034 00:46:09,760 --> 00:46:12,010 Bé, hem de tornar als primers principis aquí. 1035 00:46:12,010 --> 00:46:15,660 Què està GetString realitat tornava? 1036 00:46:15,660 --> 00:46:19,030 >> Així resulta que M-O-M barra invertida zero, i qualsevol nombre 1037 00:46:19,030 --> 00:46:22,364 d'altres cadenes en memòria com Zamila i Rob o Andy o qualssevol altres, 1038 00:46:22,364 --> 00:46:24,280 són, per descomptat, en el nostre RAM o memòria d'ordinador. 1039 00:46:24,280 --> 00:46:27,760 I la memòria RAM té com-- tens una giga de RAM, dos gigues de RAM, 1040 00:46:27,760 --> 00:46:30,860 o mil milions o Dos mil milions de bytes, o potser encara més en aquests dies. 1041 00:46:30,860 --> 00:46:34,070 Així que anem a suposar, per als propòsits de l'actualitat, que no importa com numerem 1042 00:46:34,070 --> 00:46:36,640 ells, però podem numerar cada de dels mil milions o Dos mil milions de 1043 00:46:36,640 --> 00:46:37,880 o 4000000000 de bytes. 1044 00:46:37,880 --> 00:46:42,240 >> I diguem que arbitràriament que aquesta és la primera picada, mossegada segons, 1045 00:46:42,240 --> 00:46:43,380 tercer, quart. 1046 00:46:43,380 --> 00:46:46,570 Deliberadament no estic fent servir zero per avui, però anem a tornar a això. 1047 00:46:46,570 --> 00:46:49,570 Així, en altres paraules, si aquest és el primera vegada que estic fent servir el programa, 1048 00:46:49,570 --> 00:46:52,715 Només estic tenint sort i la primera mossegada és en la ubicació a una i després dos 1049 00:46:52,715 --> 00:46:53,590 després tres de quatre. 1050 00:46:53,590 --> 00:46:57,430 I si seguia dibuix, número de la caixa Dos mil milions seria fins aquí. 1051 00:46:57,430 --> 00:47:02,200 >> Llavors, què pensa vostè, llavors, GetString realitat torna? 1052 00:47:02,200 --> 00:47:06,010 No està tornant H-O-H barra invertida zero per se, ja que clarament 1053 00:47:06,010 --> 00:47:08,180 no caben a la caixa que he dibuixat. 1054 00:47:08,180 --> 00:47:11,210 Llavors, ¿què més podria GetString realitat Tornarem totes aquestes setmanes? 1055 00:47:11,210 --> 00:47:14,410 1056 00:47:14,410 --> 00:47:16,820 La resposta està en el tauler d'aquí a algun lloc. 1057 00:47:16,820 --> 00:47:20,390 No pot cabre H-O-H barra invertida zero, així que el que podria tenir sentit en el seu lloc? 1058 00:47:20,390 --> 00:47:23,424 Si hagués de ser super intel·ligent, posant en el denominat barret d'enginyeria, 1059 00:47:23,424 --> 00:47:24,340 ¿Què podries tornar? 1060 00:47:24,340 --> 00:47:27,340 Quina és la menor quantitat d'informació vostè podria tornar que faria encara 1061 00:47:27,340 --> 00:47:30,610 li permeten trobar M-O-M a la memòria? 1062 00:47:30,610 --> 00:47:31,270 Sí? 1063 00:47:31,270 --> 00:47:31,950 >> AUDIÈNCIA: Un. 1064 00:47:31,950 --> 00:47:32,200 >> DAVID J. Malan: One. 1065 00:47:32,200 --> 00:47:33,021 I per què un? 1066 00:47:33,021 --> 00:47:35,520 AUDIÈNCIA: Perquè seria dir-li a on vagis [inaudible]. 1067 00:47:35,520 --> 00:47:38,391 1068 00:47:38,391 --> 00:47:39,390 DAVID J. Malan: Exactament. 1069 00:47:39,390 --> 00:47:44,300 Jo només vaig a tornar la direcció de la cadena que he aconseguit. 1070 00:47:44,300 --> 00:47:46,570 La direcció d'aquesta cas és ubicació a un. 1071 00:47:46,570 --> 00:47:51,280 Així que el que realment està sent emmagatzemada en S-- i cada variable de cadena tant far-- 1072 00:47:51,280 --> 00:47:53,430 simplement ha estat el direcció d'aquesta cadena. 1073 00:47:53,430 --> 00:47:57,840 >> Mentrestant, si dic GetString una segona vegada i jo 1074 00:47:57,840 --> 00:48:03,300 escriure, literalment, la mateixa cosa-- M-O-M amb lowercase-- M-O-M 1075 00:48:03,300 --> 00:48:06,200 i una altra barra invertida zero, i ara potser el meu programa de 1076 00:48:06,200 --> 00:48:09,820 estat funcionant durant algun temps així que potser això és 10, això és la ubicació 11, és a dir 12, 1077 00:48:09,820 --> 00:48:10,700 això és 13. 1078 00:48:10,700 --> 00:48:13,590 Els equips que utilitzen algun altre memòria per qualsevol raó. 1079 00:48:13,590 --> 00:48:18,172 ¿I ara què passa en el meu segon variable en el meu programa de t? 1080 00:48:18,172 --> 00:48:19,390 10. 1081 00:48:19,390 --> 00:48:20,050 Exactament. 1082 00:48:20,050 --> 00:48:23,910 >> I així, quan ens fixem en la codi font d'aquest programa 1083 00:48:23,910 --> 00:48:26,550 on jo simplement estic tractant per comparar els dos valors, 1084 00:48:26,550 --> 00:48:32,180 és S igual igual at, quin és la resposta humana obvi? 1085 00:48:32,180 --> 00:48:34,890 Així que no, perquè 1 no és igual a 10. 1086 00:48:34,890 --> 00:48:36,861 I així, en aquest document es troba un oportunitat per a nosaltres de veritat 1087 00:48:36,861 --> 00:48:39,610 que només ha d'anar de nou a, de nou, primer principis i pensar, bé, 1088 00:48:39,610 --> 00:48:41,110 el que està passant sota de la campana? 1089 00:48:41,110 --> 00:48:43,240 Hem estat parlant sobre bits i bytes i la memòria, 1090 00:48:43,240 --> 00:48:46,820 però en realitat és útil per entendre perquè quan vostè diu GetString, 1091 00:48:46,820 --> 00:48:50,280 tot i que pensem que és tornar H-O-H o cadena mare 1092 00:48:50,280 --> 00:48:53,120 o Andy o Zamila o similars, tècnicament 1093 00:48:53,120 --> 00:48:55,510 és només tornar la direcció d'aquesta part de la memòria. 1094 00:48:55,510 --> 00:48:56,910 >> Però això està bé. 1095 00:48:56,910 --> 00:49:00,570 Perquè ¿com sé on acaba la cadena? 1096 00:49:00,570 --> 00:49:03,840 Si tan sols em donen el principi? 1097 00:49:03,840 --> 00:49:05,380 Bé, la barra invertida zero, no? 1098 00:49:05,380 --> 00:49:08,800 Just a temps lineal que pugui imprimir amb definició d'impressió M-O-M. 1099 00:49:08,800 --> 00:49:11,820 I tan aviat com veig barra invertida zero, no m'importa on vaig començar, 1100 00:49:11,820 --> 00:49:14,950 Ja sé implícitament on haig d'acabar. 1101 00:49:14,950 --> 00:49:18,700 >> I pel que avui es compleix el beginning-- i m'ho dius a mi fer això de forma espectacular perquè ens 1102 00:49:18,700 --> 00:49:21,800 passar per un munt de problemes per aconseguir aquests aquí entrenant wheels-- 1103 00:49:21,800 --> 00:49:29,840 pel que avui les rodes d'entrenament comencen a desprendre i ens revelen almenys: 1104 00:49:29,840 --> 00:49:31,373 >> [Aplaudiments] 1105 00:49:31,373 --> 00:49:33,220 1106 00:49:33,220 --> 00:49:36,160 >> Això va ser ben val la pena el viatge a Target aquest matí, no? 1107 00:49:36,160 --> 00:49:39,600 Així ara-- existeix, resulta terme, no hi ha tal cosa com una cadena. 1108 00:49:39,600 --> 00:49:41,140 Cadena no existeix. 1109 00:49:41,140 --> 00:49:43,760 És un sinònim que hem tingut a l'interior de la biblioteca CS50. 1110 00:49:43,760 --> 00:49:48,660 D'ara en endavant, anem a començar a cridar s i t no seqüències però estrelles Char. 1111 00:49:48,660 --> 00:49:51,180 I l'estrella carbó anem esmicolar poc temps. 1112 00:49:51,180 --> 00:49:53,510 Però això és a dir, que fins i tot si continuem 1113 00:49:53,510 --> 00:49:56,180 utilitzant GetString per ara, tècnicament que hauria 1114 00:49:56,180 --> 00:49:59,010 estar dient estrelles carbó i l'estrella de carbó. 1115 00:49:59,010 --> 00:50:01,720 >> I resulta que el que l'estrella significarà alguna cosa 1116 00:50:01,720 --> 00:50:04,340 anomenat un punter o una adreça. 1117 00:50:04,340 --> 00:50:06,110 I, de fet, un teaser per al que s'acosta 1118 00:50:06,110 --> 00:50:09,760 és aquest 20 segon clip de la nostra amic Nick Parlant a Stanford 1119 00:50:09,760 --> 00:50:12,927 que, fa força temps, passar una quantitat ridícula de temps, 1120 00:50:12,927 --> 00:50:15,010 el millor que puc dir en el seu cuina o al soterrani de casa seva, 1121 00:50:15,010 --> 00:50:17,140 fer animació amb plastilina introducció al món 1122 00:50:17,140 --> 00:50:20,010 un personatge anomenat Binky amb els quals va a 1123 00:50:20,010 --> 00:50:22,010 s'introduirà la propera vegada per als punters. 1124 00:50:22,010 --> 00:50:24,588 Així que aquí és un avançament del que està per venir. 1125 00:50:24,588 --> 00:50:26,370 >> [REPRODUCCIÓ DE VÍDEO] 1126 00:50:26,370 --> 00:50:27,510 >> -Escolta, Binky. 1127 00:50:27,510 --> 00:50:28,260 Desperta. 1128 00:50:28,260 --> 00:50:30,672 És temps per a la diversió punter. 1129 00:50:30,672 --> 00:50:31,616 >> -Què és això? 1130 00:50:31,616 --> 00:50:33,032 Assabenti dels punters? 1131 00:50:33,032 --> 00:50:34,450 Oh, llaminadura. 1132 00:50:34,450 --> 00:50:35,431 >> [FI DE REPRODUCCIÓ] 1133 00:50:35,431 --> 00:50:38,055 DAVID J. Malan: I en aquesta nota, ens veiem dimecres. 1134 00:50:38,055 --> 00:50:47,590 1135 00:50:47,590 --> 00:50:48,090 Tot bé. 1136 00:50:48,090 --> 00:50:48,740 Qui és el ball? 1137 00:50:48,740 --> 00:50:49,240 Vine. 1138 00:50:49,240 --> 00:50:50,330 Qui és el ball? 1139 00:50:50,330 --> 00:50:51,820 Vols que posar-lo en marxa? 1140 00:50:51,820 --> 00:50:53,770 Vaig a posar-lo en marxa. 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: luxe dolça Moisès.