1 00:00:00,000 --> 00:00:10,550 2 00:00:10,550 --> 00:00:14,050 >> DAVID J. MALAN: Questo è CS50 e questo è l'inizio della quarta settimana. 3 00:00:14,050 --> 00:00:18,630 E, ragazzo, è Volkswagen difficoltà a tutto a causa di software. 4 00:00:18,630 --> 00:00:20,264 Diamo uno sguardo. 5 00:00:20,264 --> 00:00:20,930 [RIPRODUZIONE VIDEO] 6 00:00:20,930 --> 00:00:25,560 Posti macchina, i personaggi più intelligenti nei film Fast and Furious. 7 00:00:25,560 --> 00:00:29,100 Questa settimana automobilistica tedesca Volkswagen si è trovata 8 00:00:29,100 --> 00:00:32,490 nel bel mezzo di uno scandalo di proporzioni potenzialmente criminali. 9 00:00:32,490 --> 00:00:36,060 >> -Volkswagen Sta preparando per miliardi in multe, possibili accuse penali 10 00:00:36,060 --> 00:00:38,560 per i suoi dirigenti, come l'azienda si scusa 11 00:00:38,560 --> 00:00:41,840 per rigging 11 milioni di automobili a aiutarla a battere le prove di emissione. 12 00:00:41,840 --> 00:00:44,950 >> Modelli diesel -Certain erano progettato con sofisticati software 13 00:00:44,950 --> 00:00:48,440 che le informazioni utilizzati, compresa la posizione del volante e del veicolo 14 00:00:48,440 --> 00:00:51,870 la velocità per determinare la macchina era in fase di test delle emissioni. 15 00:00:51,870 --> 00:00:55,650 In base a tale circostanza, il motore ridurrebbe le emissioni tossiche. 16 00:00:55,650 --> 00:00:59,070 Ma la macchina è stato truccato a bypass che quando veniva spinto. 17 00:00:59,070 --> 00:01:03,320 Le emissioni sono aumentate da 10 a 40 volte superiori ai livelli di EPA accettabili. 18 00:01:03,320 --> 00:01:04,280 >> [FINE RIPRODUZIONE] 19 00:01:04,280 --> 00:01:05,220 >> DAVID J. MALAN: Quindi cerchiamo di guarda questo 20 00:01:05,220 --> 00:01:07,250 e vedere esattamente come questo potrebbe essere attuato 21 00:01:07,250 --> 00:01:09,680 e come questo potrebbe influenzare così tante vetture come questo. 22 00:01:09,680 --> 00:01:12,840 Così in mano ecco il comunicato comunicato che è stato rilasciato dal EPA-- 23 00:01:12,840 --> 00:01:14,620 Ambientale Protection Agency che 24 00:01:14,620 --> 00:01:18,032 è l'agenzia di regolamentazione degli Stati Uniti che gestisce le preoccupazioni ambientali, 25 00:01:18,032 --> 00:01:19,740 e poi l'attuale note legali che era 26 00:01:19,740 --> 00:01:22,420 inviare Volkswagen solo pochi giorni fa. 27 00:01:22,420 --> 00:01:26,530 >> Così scrive l'EPA, e rivela ora pubblicamente, un sofisticato software 28 00:01:26,530 --> 00:01:29,390 algoritmo su determinati Veicoli Volkswagen rileva 29 00:01:29,390 --> 00:01:32,630 quando la macchina è in fase di le prove sulle emissioni ufficiali 30 00:01:32,630 --> 00:01:36,505 e trasforma le emissioni pieni controlla soltanto durante la prova. 31 00:01:36,505 --> 00:01:38,380 L'efficacia di Questi veicoli inquinamento 32 00:01:38,380 --> 00:01:43,260 dispositivi di controllo delle emissioni è notevolmente ridotto durante tutto guida normale 33 00:01:43,260 --> 00:01:44,320 situazioni. 34 00:01:44,320 --> 00:01:48,190 Ciò si traduce in macchine che soddisfano la standard in laboratorio o test 35 00:01:48,190 --> 00:01:52,790 ferroviaria, ma durante il normale funzionamento emettere oxides-- azoto o NOx-- 36 00:01:52,790 --> 00:01:54,950 fino a 40 volte la norma. 37 00:01:54,950 --> 00:01:58,220 Il software prodotto da Volkswagen è un dispositivo tra virgolette, la sconfitta, 38 00:01:58,220 --> 00:02:00,650 come definito dalla Clean Air Act negli Stati Uniti. 39 00:02:00,650 --> 00:02:03,410 >> Continuano a dire che l'EPA e un'altra agenzia 40 00:02:03,410 --> 00:02:07,020 scoperto il dispositivo sconfitta software dopo un'analisi indipendente 41 00:02:07,020 --> 00:02:09,660 da ricercatori a West Virginia University. 42 00:02:09,660 --> 00:02:14,160 Inquinamento NOx contribuisce il biossido di azoto, ozono troposferico, 43 00:02:14,160 --> 00:02:15,700 e polveri sottili. 44 00:02:15,700 --> 00:02:18,090 L'esposizione a questi inquinanti è stato collegato 45 00:02:18,090 --> 00:02:20,870 con una vasta gamma di effetti gravi per la salute, 46 00:02:20,870 --> 00:02:23,637 compresa una maggiore asma attacchi e altri respiratoria 47 00:02:23,637 --> 00:02:26,470 malattie che possono essere abbastanza gravi per inviare le persone in ospedale. 48 00:02:26,470 --> 00:02:28,660 L'esposizione all'ozono e particolato ha anche 49 00:02:28,660 --> 00:02:31,960 stata associata con premature morte a causa di respiratorie correlate 50 00:02:31,960 --> 00:02:35,690 o cardiovascolare effetti correlati. 51 00:02:35,690 --> 00:02:38,940 I bambini, gli anziani, le persone con malattia respiratoria preesistente 52 00:02:38,940 --> 00:02:42,840 sono particolarmente a rischio di effetti sulla salute di queste sostanze inquinanti. 53 00:02:42,840 --> 00:02:45,056 >> Basti per dire, è abbastanza grave. 54 00:02:45,056 --> 00:02:46,930 E andiamo avanti a leggere solo un altro stralcio 55 00:02:46,930 --> 00:02:49,370 e poi daremo uno sguardo a le implicazioni sottostanti 56 00:02:49,370 --> 00:02:50,920 di ciò nel contesto di una macchina. 57 00:02:50,920 --> 00:02:53,730 In particolare, la Volkswagen prodotto e installato 58 00:02:53,730 --> 00:02:56,210 software nel cosiddetto controllo elettronico 59 00:02:56,210 --> 00:02:59,320 module-- o ECM-- di questi veicoli che intuivano 60 00:02:59,320 --> 00:03:03,580 quando il veicolo è stato testato per la conformità alle norme sulle emissioni EPA. 61 00:03:03,580 --> 00:03:07,510 Sulla base di diversi ingressi, tra cui il posizione del volante, veicolo 62 00:03:07,510 --> 00:03:11,280 velocità, la durata del motore di operazione, e la pressione barometrica, 63 00:03:11,280 --> 00:03:13,720 questi ingressi precisamente monitorati i parametri 64 00:03:13,720 --> 00:03:17,600 della procedura di prova utilizzato per federale prove di emissione per la certificazione EPA 65 00:03:17,600 --> 00:03:18,400 scopi. 66 00:03:18,400 --> 00:03:21,850 >> Durante il test delle emissioni di EPA, il software veicoli ECM 67 00:03:21,850 --> 00:03:25,060 corse software che ha prodotto Risultati delle emissioni conformi. 68 00:03:25,060 --> 00:03:28,340 In tutti gli altri casi, la software ECM veicolo 69 00:03:28,340 --> 00:03:31,090 correva una strada distinta taratura che ha ridotto 70 00:03:31,090 --> 00:03:34,360 l'efficacia del sistema di controllo delle emissioni in generale, 71 00:03:34,360 --> 00:03:37,864 specificamente il catalitica selettiva riduzione del NOx magra trap-- 72 00:03:37,864 --> 00:03:39,280 che vedremo su in un attimo. 73 00:03:39,280 --> 00:03:43,040 Come risultato, le emissioni di NOx aumentato di un fattore di 10 a 40 volte 74 00:03:43,040 --> 00:03:47,450 al di sopra dei livelli di conformità EPA a seconda del tipo di ciclo di guida. 75 00:03:47,450 --> 00:03:50,800 >> Così che cosa questo significa veramente, e la codice sorgente per il software in esecuzione 76 00:03:50,800 --> 00:03:53,190 sulle Volkswagen di non ha ancora rese pubbliche, 77 00:03:53,190 --> 00:03:56,460 è che, effettivamente, questo equivalente c'è da qualche parte dentro 78 00:03:56,460 --> 00:03:57,830 di codice di Volkswagen. 79 00:03:57,830 --> 00:04:02,200 Se siete messi alla prova, e se l'auto rileva alcuni fattori ambientali 80 00:04:02,200 --> 00:04:04,330 come il volante posizione o il movimento 81 00:04:04,330 --> 00:04:06,710 o la mancanza della macchina o qualsiasi numero di altri fattori 82 00:04:06,710 --> 00:04:09,940 che sono attualmente ipotizzarono di far parte di questa formula, 83 00:04:09,940 --> 00:04:12,370 semplicemente accendere controllo delle emissioni completi. 84 00:04:12,370 --> 00:04:15,670 In altre parole, cominciano emettono meno degli inquinanti. 85 00:04:15,670 --> 00:04:18,769 >> Altrimenti, in ogni altra situazione quando non è rilevato come 86 00:04:18,769 --> 00:04:20,790 in laboratorio, solo che non lo fanno. 87 00:04:20,790 --> 00:04:24,320 E così si può semplificare questo in più pseudocodice calcestruzzo con qualcosa 88 00:04:24,320 --> 00:04:24,820 Come questo. 89 00:04:24,820 --> 00:04:27,810 Se le ruote stanno girando, ma la volante non è, suggestiva 90 00:04:27,810 --> 00:04:30,060 che la vettura è in qualche tipo di cilindro rotante 91 00:04:30,060 --> 00:04:32,550 ma in qualche tipo di magazzino in fase di test, 92 00:04:32,550 --> 00:04:36,070 poi comportarsi come il EPA vorrebbe che. 93 00:04:36,070 --> 00:04:37,960 In caso contrario, non lo fanno. 94 00:04:37,960 --> 00:04:40,420 Quindi, diamo uno sguardo in un breve video che 95 00:04:40,420 --> 00:04:45,391 prende in esame quali siano le implicazioni sono di questo in realtà meccanicamente. 96 00:04:45,391 --> 00:04:48,620 >> [RIPRODUZIONE VIDEO] 97 00:04:48,620 --> 00:04:52,800 >> -last Venerdì l'EPA ha annunciato che alcuni Auto Volkswagen Audi realizzati tra il 2009 98 00:04:52,800 --> 00:04:55,840 e quest'anno usavano un cosiddetto impianto di manipolazione 99 00:04:55,840 --> 00:04:59,060 per aggirare leggi di emissioni progettata per mantenere l'aria pulita. 100 00:04:59,060 --> 00:05:01,700 Ma che cosa significa esattamente? 101 00:05:01,700 --> 00:05:04,666 >> Beh, auto moderne hanno dozzine di computer al loro interno. 102 00:05:04,666 --> 00:05:07,040 E alcuni di questi computer contribuire a coordinare le funzioni 103 00:05:07,040 --> 00:05:09,590 del motore per ottimale prestazioni badando 104 00:05:09,590 --> 00:05:12,340 non c'è troppo immondizia che esce dal tubo di scarico. 105 00:05:12,340 --> 00:05:15,170 Hanno in realtà lavorato in questo modo da diversi decenni. 106 00:05:15,170 --> 00:05:17,380 In sostanza, ogni parte di motore di una vettura moderna 107 00:05:17,380 --> 00:05:20,080 dispone di un sensore o un controller su di esso, e questi computer 108 00:05:20,080 --> 00:05:23,460 sono la lettura dei dati di migliaia di volte al secondo le regolazioni per la preparazione 109 00:05:23,460 --> 00:05:26,220 come il rapporto tra carburante e aria che sta andando nei cilindri. 110 00:05:26,220 --> 00:05:28,730 >> Questi barare Volkswagen e modelli di Audi sono diesel, 111 00:05:28,730 --> 00:05:30,890 e diesel hanno un altro veramente importante del computer 112 00:05:30,890 --> 00:05:34,030 parametri controllati, che è la quantità di carburante incombusto andare 113 00:05:34,030 --> 00:05:35,200 nello scarico. 114 00:05:35,200 --> 00:05:36,310 Ora che suona male. 115 00:05:36,310 --> 00:05:39,642 Non sembra che si vorrebbe carburante incombusto andare nello scarico. 116 00:05:39,642 --> 00:05:41,600 Ma nel caso di un diesel, hai qualcosa 117 00:05:41,600 --> 00:05:46,110 chiamato una trappola di NOx, che è un dispositivo che assorbe e trappole per gli ossidi di azoto 118 00:05:46,110 --> 00:05:48,880 che sono sostanze inquinanti che avrebbe altrimenti andare in atmosfera. 119 00:05:48,880 --> 00:05:53,040 E l'effetto di quella trappola NOx si arricchisce di carburante incombusto. 120 00:05:53,040 --> 00:05:56,650 Così un impianto di manipolazione è un programma speciale all'interno di questi computer che può rendere 121 00:05:56,650 --> 00:05:59,527 apparire come la macchina incontra emissioni norme anche quando non è così. 122 00:05:59,527 --> 00:06:01,110 Volkswagen ha avuto un problema sulle sue mani. 123 00:06:01,110 --> 00:06:04,050 I suoi motori diesel erano noti per ottenere grande economia di carburante, 124 00:06:04,050 --> 00:06:07,510 ma la trappola NOx funziona bene solo quando si utilizza più carburante. 125 00:06:07,510 --> 00:06:10,460 Quindi la vettura sarebbe rilevare, utilizzo di questo impianto di manipolazione, 126 00:06:10,460 --> 00:06:13,870 quando si stava facendo un emissioni Test, sarebbe utilizzare più combustibile, 127 00:06:13,870 --> 00:06:16,830 fare bene il lavoro trappola NOx, emissioni andrebbe bene. 128 00:06:16,830 --> 00:06:21,130 Ma poi si arriva sulla strada, il dispositivo si spegne, si sta bruciando meno combustibile 129 00:06:21,130 --> 00:06:24,256 ma avete deciso di mettere fino a 40 volte più inquinanti in atmosfera. 130 00:06:24,256 --> 00:06:26,130 Ma come cavolo ha fatto la macchina sapere che era 131 00:06:26,130 --> 00:06:27,720 in fase di test per la conformità delle emissioni? 132 00:06:27,720 --> 00:06:30,590 L'EPA dice che era un sofisticato sistema che controllò le cose 133 00:06:30,590 --> 00:06:34,090 come posizione del volante, velocità, quanto tempo il motore era acceso, 134 00:06:34,090 --> 00:06:35,507 e anche la pressione atmosferica. 135 00:06:35,507 --> 00:06:37,673 In altre parole, non vi era nessun modo questo è stato accidentale 136 00:06:37,673 --> 00:06:40,260 perché il software è stato progettata con molta attenzione per rilevare 137 00:06:40,260 --> 00:06:41,630 un test ufficiale delle emissioni. 138 00:06:41,630 --> 00:06:43,588 Ecco alcuni piuttosto gravi inganno e che è 139 00:06:43,588 --> 00:06:45,420 perché Volkswagen è in tale guaio serio. 140 00:06:45,420 --> 00:06:48,600 Infatti, la loro CEO, Martin Winterkorn, appena dimesso. 141 00:06:48,600 --> 00:06:49,820 >> Allora, cosa succede dopo? 142 00:06:49,820 --> 00:06:53,900 Beh, se sei uno dei mezzo milione Jettas diesel, Beatles, Golfs, Passat, 143 00:06:53,900 --> 00:06:56,220 o Audi A3s effettuata, La buona notizia è è 144 00:06:56,220 --> 00:06:57,886 che l'auto è ancora sicuro da guidare. 145 00:06:57,886 --> 00:07:00,510 Non dovete mettere via fino a quando la Volkswagen emette un richiamo. 146 00:07:00,510 --> 00:07:02,509 Ma a un certo punto sono probabilmente andando ad avere 147 00:07:02,509 --> 00:07:04,230 per aggiornare il software all'interno della vostra auto. 148 00:07:04,230 --> 00:07:06,927 Quando ciò accade si potrebbe ottenere un minor numero di miglia per serbatoio. 149 00:07:06,927 --> 00:07:09,260 Gli avvocati sono già attrezzando per cause class action 150 00:07:09,260 --> 00:07:12,500 così i proprietari potrebbero ottenere compensata ad un certo punto in futuro. 151 00:07:12,500 --> 00:07:15,832 Ma questo non sta andando accadere in qualunque momento presto. 152 00:07:15,832 --> 00:07:16,711 >> [FINE RIPRODUZIONE] 153 00:07:16,711 --> 00:07:19,960 DAVID J. MALAN: Quindi questo in realtà solleva un interessante maggiore domanda immagine 154 00:07:19,960 --> 00:07:20,660 da fiducia. 155 00:07:20,660 --> 00:07:21,160 Destra? 156 00:07:21,160 --> 00:07:24,300 Tutti noi avere iPhone o androidi o qualcosa nelle nostre tasche più probabile 157 00:07:24,300 --> 00:07:26,500 in questi giorni, o computer portatili sui nostri giri che sono 158 00:07:26,500 --> 00:07:28,510 il software in esecuzione fatta da Apple e Microsoft 159 00:07:28,510 --> 00:07:30,710 e grappoli di altre società. 160 00:07:30,710 --> 00:07:34,240 Ma come facciamo a sapere che ciò che questi prodotti software stanno facendo 161 00:07:34,240 --> 00:07:37,680 è in realtà ciò che questi aziende dicono che stanno facendo? 162 00:07:37,680 --> 00:07:39,610 >> Per esempio, chi può dire che ogni volta che si 163 00:07:39,610 --> 00:07:42,200 fare una telefonata sul tuo iPhone o telefono Android o simili, 164 00:07:42,200 --> 00:07:45,650 che quel numero di telefono non è anche essere caricato sul server alcune società di 165 00:07:45,650 --> 00:07:48,399 a causa di qualche programma che avete scritto, se è il funzionamento 166 00:07:48,399 --> 00:07:51,070 stesso sistema come iOS o Android, o perché hai scaricato 167 00:07:51,070 --> 00:07:53,880 una terza parte app che in qualche modo è in ascolto 168 00:07:53,880 --> 00:07:57,120 per tutto quello che stai digitando o tutto ciò che si sta effettivamente dicendo. 169 00:07:57,120 --> 00:07:59,500 Come fai a sapere che, quando voi ragazzi sono in esecuzione Clang 170 00:07:59,500 --> 00:08:02,590 o Crea per compilare il proprio software in CS50, come 171 00:08:02,590 --> 00:08:06,080 Sei il proprietario di personale che di CS50, a titolo di biblioteca CS50, 172 00:08:06,080 --> 00:08:08,690 Non è stata la registrazione ogni stringa che sia mai capitata 173 00:08:08,690 --> 00:08:10,276 o tutto e per tutto che tu abbia mai ottenuto? 174 00:08:10,276 --> 00:08:12,900 Beh, si potrebbe certamente guardare il codice sorgente per qualcosa 175 00:08:12,900 --> 00:08:15,233 come la biblioteca CS50, si poteva guardare il codice sorgente 176 00:08:15,233 --> 00:08:18,170 per il sistema operativo Linux in esecuzione su CS50 IDE. 177 00:08:18,170 --> 00:08:23,090 Ma una sorprendente presentazione è stato dato nel 1984 178 00:08:23,090 --> 00:08:26,730 in ricezione del Turing Award da un molto famoso scienziato computer noto 179 00:08:26,730 --> 00:08:29,750 as-- di nome Ken Thompson, che ha ricevuto il Premio Turing che 180 00:08:29,750 --> 00:08:33,500 è una sorta di informatica di Premio Nobel, se si vuole, 181 00:08:33,500 --> 00:08:35,309 per il suo lavoro su un sistema operativo chiamato 182 00:08:35,309 --> 00:08:39,039 Unix, che è molto simile a spirito a quello che usiamo, che è Linux. 183 00:08:39,039 --> 00:08:41,960 E la domanda ha chiesto nella sua discorso di accettazione, essenzialmente 184 00:08:41,960 --> 00:08:44,910 che stabilisce il quadro per anni e anni di discussione 185 00:08:44,910 --> 00:08:46,970 di fiducia e sicurezza, è stata questa. 186 00:08:46,970 --> 00:08:50,410 Fino a che punto si dovrebbe fiducia un affermazione che un program-- un pezzo 187 00:08:50,410 --> 00:08:53,010 di software-- è libero di cavalli di Troia? 188 00:08:53,010 --> 00:08:56,500 Forse è più importante avere fiducia chi ha scritto il software. 189 00:08:56,500 --> 00:08:58,650 >> E infatti, abbiamo legati per il discorso che lui 190 00:08:58,650 --> 00:09:02,400 dato che l'accettazione di questo premio negli anni '80 sul sito web del CS50 191 00:09:02,400 --> 00:09:04,030 sotto la pagina di lezioni per oggi. 192 00:09:04,030 --> 00:09:06,071 Perché quello che vedrete è che in realtà dà 193 00:09:06,071 --> 00:09:09,430 abbastanza semplice esempio di come anche un compilatore Clang come o qualsiasi altra cosa 194 00:09:09,430 --> 00:09:13,950 compilatori altri hanno utilizzato in passato, cosa se incorporato nel compilatore noi 195 00:09:13,950 --> 00:09:18,190 noi stanno usando è un po 'se condizione che dice in sostanza, 196 00:09:18,190 --> 00:09:22,360 se si nota che questo codice utilizza la funzione GetString o GetInt 197 00:09:22,360 --> 00:09:26,600 la funzione, andare avanti e inserire una porta sul retro o un cavallo di Troia 198 00:09:26,600 --> 00:09:29,340 tale che tale programma ora ha degli zeri 199 00:09:29,340 --> 00:09:30,930 e quelli che fanno qualcosa di dannoso. 200 00:09:30,930 --> 00:09:33,080 Registrazione tutti i tuoi battiture, caricamento che i dati 201 00:09:33,080 --> 00:09:35,100 ad un server, o realmente nulla. 202 00:09:35,100 --> 00:09:37,290 >> E che Ken Thompson continua a fare nel suo discorso 203 00:09:37,290 --> 00:09:40,580 è quello di dimostrare che anche se si ha accesso alla fonte 204 00:09:40,580 --> 00:09:43,794 codice di un compilatore che maliziosamente potrebbe fare questo, 205 00:09:43,794 --> 00:09:46,210 non importa perché c'è questo uovo e la gallina 206 00:09:46,210 --> 00:09:49,500 realtà del passato molti anni in base alle quali i compilatori 207 00:09:49,500 --> 00:09:51,960 sono utilizzati per compilare stessi. 208 00:09:51,960 --> 00:09:55,440 In altre parole, quando qualcuno ritorno doveva aver scritto il primo compilatore. 209 00:09:55,440 --> 00:09:59,060 E da allora in poi, ogni volta che ho aggiornato un compilatore cambiando il suo codice sorgente, 210 00:09:59,060 --> 00:10:02,020 l'aggiunta di funzionalità e ricompilata per chi come noi da usare, bene, 211 00:10:02,020 --> 00:10:04,270 che stanno utilizzando il vecchio versione del compilatore 212 00:10:04,270 --> 00:10:06,370 per compilare la nuova versione del compilatore. 213 00:10:06,370 --> 00:10:08,370 E se si dà un'occhiata al discorso che ha dato, 214 00:10:08,370 --> 00:10:10,970 vedrai che a causa di quella circolarità, 215 00:10:10,970 --> 00:10:14,330 si può effettivamente avere bug o Cavalli di Troia incorporati nel software 216 00:10:14,330 --> 00:10:14,990 stiamo usando. 217 00:10:14,990 --> 00:10:18,010 E anche se si guarda al codice sorgente per questi programmi, 218 00:10:18,010 --> 00:10:21,550 potrebbe anche non essere evidente perché l'inganno è in realtà 219 00:10:21,550 --> 00:10:24,710 in qualche versione precedente di un compilatore che da allora è stato 220 00:10:24,710 --> 00:10:27,340 iniettare la minaccia nel nostro software. 221 00:10:27,340 --> 00:10:29,740 >> Che è solo per dire, abbiamo davvero non può e non deve 222 00:10:29,740 --> 00:10:32,939 software fiducia in esecuzione sul nostro computer portatili o telefoni o qualsiasi numero di posti. 223 00:10:32,939 --> 00:10:36,230 E infatti, più avanti in questo semestre, quando cominciamo a parlare di programmazione web 224 00:10:36,230 --> 00:10:38,521 ed effettivamente iniziare a costruire applicazioni web noi stessi, 225 00:10:38,521 --> 00:10:40,285 parleremo di questi minacce e altri. 226 00:10:40,285 --> 00:10:43,410 Ora, si potrebbe essere chiesto e ho notato che c'era un piccolo piccolo Darth 227 00:10:43,410 --> 00:10:45,842 Vader nei clip che The Verge mostrava lì 228 00:10:45,842 --> 00:10:47,550 su Volkswagen. Se non hai mai visto, io 229 00:10:47,550 --> 00:10:49,190 pensato che dovrebbe alleggerire lo stato d'animo perché questo è tutto 230 00:10:49,190 --> 00:10:50,780 molto deprimente e spaventoso. 231 00:10:50,780 --> 00:10:52,910 Io vado a guardare indietro al Super Bowl 2011 232 00:10:52,910 --> 00:10:55,300 quando uno spot da Volkswagen-- e questo 233 00:10:55,300 --> 00:10:59,620 quasi li rende simpatici again-- trasmesso per la prima volta in TV. 234 00:10:59,620 --> 00:11:04,039 E 'la seconda clip 60 Penso che godrete. 235 00:11:04,039 --> 00:11:04,705 [RIPRODUZIONE VIDEO] 236 00:11:04,705 --> 00:11:08,198 [MUSICA - TEMA "STAR WARS"] 237 00:11:08,198 --> 00:11:35,643 238 00:11:35,643 --> 00:11:38,138 [Cane abbaia] 239 00:11:38,138 --> 00:11:50,114 240 00:11:50,114 --> 00:11:53,607 [Automobile si avvia] 241 00:11:53,607 --> 00:12:04,086 242 00:12:04,086 --> 00:12:05,955 [FINE RIPRODUZIONE] 243 00:12:05,955 --> 00:12:06,830 DAVID J. MALAN: Sì. 244 00:12:06,830 --> 00:12:07,663 Stavo solo controllando. 245 00:12:07,663 --> 00:12:11,360 Quella macchina è sulla lista delle violazioni. 246 00:12:11,360 --> 00:12:12,000 Tutto ok. 247 00:12:12,000 --> 00:12:14,040 Quindi guardiamo un po ' pseudocodice un momento fa. 248 00:12:14,040 --> 00:12:15,380 Ed ecco un grande frammento di codice pseudocodice 249 00:12:15,380 --> 00:12:16,921 che abbiamo visto un paio di volte finora. 250 00:12:16,921 --> 00:12:19,970 E usiamo questa è un'opportunità ora per introdurre una nuova programmazione 251 00:12:19,970 --> 00:12:23,776 tecnica che abbiamo fatto vedi algoritmicamente 252 00:12:23,776 --> 00:12:25,400 la settimana scorsa quando abbiamo guardato merge sort. 253 00:12:25,400 --> 00:12:28,270 Ma andiamo formalizzare e vediamo come potremmo usarlo in codice vero e proprio, 254 00:12:28,270 --> 00:12:30,350 e poi abbiamo intenzione di utilizzare questo tecnica lungo la strada più 255 00:12:30,350 --> 00:12:32,000 in grado di risolvere alcuni altri problemi. 256 00:12:32,000 --> 00:12:35,790 >> Quindi questo è stato uno dei primi programmi che mai scritto, anche se in codice pseudocodice. 257 00:12:35,790 --> 00:12:37,790 E quello che questo programma ci ha permesso di fare rotta 258 00:12:37,790 --> 00:12:41,510 era quello di trovare Mike Smith in una rubrica telefonica. 259 00:12:41,510 --> 00:12:46,216 E notare in particolare le linee otto e 11 che ha avuto questa affermazione Vai a. 260 00:12:46,216 --> 00:12:48,090 Ed infatti, alcuni lingue, C tra loro, 261 00:12:48,090 --> 00:12:50,006 in realtà hanno un dichiarazione che è letteralmente 262 00:12:50,006 --> 00:12:52,710 andare che permette di passare a una linea specifica. 263 00:12:52,710 --> 00:12:55,470 E 'generalmente malvista perché può essere facilmente abusato 264 00:12:55,470 --> 00:12:58,490 e si può iniziare a saltare la vostra programma di tutto il luogo in contrapposizione 265 00:12:58,490 --> 00:13:00,690 per utilizzare il tipo di logica e il flusso di controllo 266 00:13:00,690 --> 00:13:04,000 che abbiamo usato finora solo con loop e le condizioni e simili. 267 00:13:04,000 --> 00:13:08,660 >> Ma possiamo semplificare questo algoritmo in pseudocodice codice come segue. 268 00:13:08,660 --> 00:13:11,250 Invece di questo iterativo o approccio looping 269 00:13:11,250 --> 00:13:14,160 dove continuiamo a tornare e indietro e torna alla linea a tre, 270 00:13:14,160 --> 00:13:18,300 perché non solo tipo di Punt e più generalmente dire in linea di sette e 10, 271 00:13:18,300 --> 00:13:20,570 basta sostituire quei due coppie di linee con, 272 00:13:20,570 --> 00:13:22,810 altrimenti se Smith è anteriore nel libro faremo 273 00:13:22,810 --> 00:13:25,110 cercare Mike nel la metà sinistra del libro. 274 00:13:25,110 --> 00:13:28,560 Altrimenti se Smith è più avanti nel libro, cercare Mike nella giusta 275 00:13:28,560 --> 00:13:29,540 metà del libro. 276 00:13:29,540 --> 00:13:31,180 E notare già la circolarità. 277 00:13:31,180 --> 00:13:31,680 Destra? 278 00:13:31,680 --> 00:13:34,250 Sto cercando Mike in la rubrica telefonica e poi 279 00:13:34,250 --> 00:13:37,090 Alla fine ho colpito forse Linea sette o forse la linea 10 280 00:13:37,090 --> 00:13:41,089 e la mia istruzione a me stesso è la ricerca per Mike a metà della rubrica. 281 00:13:41,089 --> 00:13:42,380 Beh, come faccio a cercare Mike? 282 00:13:42,380 --> 00:13:44,213 Sono nel bel mezzo di la ricerca di Mike, perché 283 00:13:44,213 --> 00:13:45,860 stai sorta di mandarmi in un cerchio? 284 00:13:45,860 --> 00:13:49,590 Ma va bene, perché ciò che è accade alle dimensioni del problema, 285 00:13:49,590 --> 00:13:52,630 come scritto in linea 7 e 10? 286 00:13:52,630 --> 00:13:54,989 Non stiamo solo dicendo di ricerca per Mike, la ricerca di Mike. 287 00:13:54,989 --> 00:13:56,280 Stiamo specificamente dicendo che cosa? 288 00:13:56,280 --> 00:13:58,694 289 00:13:58,694 --> 00:14:01,610 Cerca per lui nella metà sinistra di la metà destra che è effettivamente 290 00:14:01,610 --> 00:14:03,440 metà delle dimensioni del problema. 291 00:14:03,440 --> 00:14:07,170 Quindi è bene che siamo tipo di impegnarsi in questa circolarità, 292 00:14:07,170 --> 00:14:09,180 questo argomento circolare, perché almeno siamo 293 00:14:09,180 --> 00:14:11,090 rendendo il problema più piccolo. 294 00:14:11,090 --> 00:14:14,220 E alla fine abbiamo intenzione di raggiungere che cosiddetto caso base dove 295 00:14:14,220 --> 00:14:16,780 abbiamo solo una pagina a sinistra- come il nostro volontario la settimana scorsa 296 00:14:16,780 --> 00:14:18,684 did-- abbiamo avuto una sola pagina a sinistra e poi non lo facciamo 297 00:14:18,684 --> 00:14:21,600 devono continuare a cercare Mike Smith perché è sia su quella pagina 298 00:14:21,600 --> 00:14:23,080 o non lo è. 299 00:14:23,080 --> 00:14:27,480 >> Quindi, come possiamo implementare questa idea, questo sorta di circolarità in codice vero e proprio? 300 00:14:27,480 --> 00:14:31,030 Beh, siamo in grado di sfruttare una tecnica che è generalmente conosciuto come la ricorsione. 301 00:14:31,030 --> 00:14:33,960 E abbiamo visto questo in pseudocodice per merge sort la settimana scorsa. 302 00:14:33,960 --> 00:14:37,190 Ricordiamo che questo è stato il pseudocodice per merge sort. 303 00:14:37,190 --> 00:14:40,560 E 'forse ancora più semplice di bolla o selezione o insertion sort 304 00:14:40,560 --> 00:14:43,310 solo in termini di semplicità con cui è possibile esprimere. 305 00:14:43,310 --> 00:14:46,750 >> Ma questo è perché noi siamo una sorta di circolare 306 00:14:46,750 --> 00:14:51,350 dicendo, cercare qualcosa la ricerca di nuovo. 307 00:14:51,350 --> 00:14:53,960 Ma stiamo cercando sia su la metà sinistra o quella destra 308 00:14:53,960 --> 00:14:56,070 e poi alla fine siamo fondendo in questo caso. 309 00:14:56,070 --> 00:14:58,520 Ma anche qui, con quelle due righe di ordinamento, 310 00:14:58,520 --> 00:15:01,320 abbiamo ancora una volta abbiamo questo idea di ricorsione. 311 00:15:01,320 --> 00:15:05,350 E concretamente cosa significa, nel contesto di un algoritmo, 312 00:15:05,350 --> 00:15:10,880 è che un algoritmo è ricorsiva se usa o si chiama. 313 00:15:10,880 --> 00:15:14,330 >> Oppure in termini di C, una funzione è recursive-- una funzione chiamata 314 00:15:14,330 --> 00:15:18,510 pippo è ricorsiva se foo, da qualche parte nel suo codice sorgente, 315 00:15:18,510 --> 00:15:21,250 chiama la funzione foo sé. 316 00:15:21,250 --> 00:15:25,790 E questo è male se tutto foo fa mai è chiamarsi ancora e ancora. 317 00:15:25,790 --> 00:15:30,600 Va bene se foo finalmente si arresta, come fa merge sort, dicendo, aspetta un minuto, 318 00:15:30,600 --> 00:15:32,980 se questo problema è super piccolo, per esempio, 319 00:15:32,980 --> 00:15:35,840 o l'ho trovato chi mi cercando, appena di ritorno. 320 00:15:35,840 --> 00:15:41,000 Non in modo ricorsivo, non lo fanno chiamare ciclicamente di nuovo me stesso. 321 00:15:41,000 --> 00:15:44,200 >> E così diamo un'occhiata a come questo potrebbe effettivamente funzionare. 322 00:15:44,200 --> 00:15:48,430 Quindi ho intenzione di andare avanti e aperto due esempi di codice sorgente qui. 323 00:15:48,430 --> 00:15:50,321 Uno dei quali è chiamato sigma 0. 324 00:15:50,321 --> 00:15:52,320 E questo non è affatto ricorsiva, ma prendiamo 325 00:15:52,320 --> 00:15:53,694 uno sguardo a ciò che questo programma fa. 326 00:15:53,694 --> 00:15:55,737 Ho spogliato fuori tutto commenti da essa, ma tutto 327 00:15:55,737 --> 00:15:58,070 del codice sorgente sul CS50 di sito ha commenti se 328 00:15:58,070 --> 00:15:59,570 consiglia di leggere attraverso di essa più tardi. 329 00:15:59,570 --> 00:16:02,010 E facciamo un paio di sanità mentale controlla qui. 330 00:16:02,010 --> 00:16:06,640 >> Così nella parte superiore di questo codice, abbiamo includere CS50.h. 331 00:16:06,640 --> 00:16:07,650 Cosa fa questo? 332 00:16:07,650 --> 00:16:08,990 Perché è qui? 333 00:16:08,990 --> 00:16:11,740 In termini ragionevoli del laico. 334 00:16:11,740 --> 00:16:12,424 Che cosa fa? 335 00:16:12,424 --> 00:16:12,858 Già. 336 00:16:12,858 --> 00:16:14,160 >> PUBBLICO: In modo che la funzione GetInt funziona. 337 00:16:14,160 --> 00:16:16,243 >> DAVID J. MALAN: In modo che la funzione GetInt funziona. 338 00:16:16,243 --> 00:16:18,115 Poiché all'interno di questo file CS50.h, che 339 00:16:18,115 --> 00:16:20,950 vedremo tra non molto in termini di codice sorgente, 340 00:16:20,950 --> 00:16:23,270 ha un sacco di funzioni declared-- GetInt, GetString, 341 00:16:23,270 --> 00:16:26,950 e un po 'di meno e others-- in realtà abbiamo che includono la linea, 342 00:16:26,950 --> 00:16:29,320 il compilatore Clang non è andando a sapere che esiste. 343 00:16:29,320 --> 00:16:32,400 E vale per la linea stessa due dove è definita int 344 00:16:32,400 --> 00:16:35,101 printf, che è una funzione continuiamo con un bel po '. 345 00:16:35,101 --> 00:16:37,850 Ora, la linea a quattro sembra un po 'funky perché è solo un uno di linea. 346 00:16:37,850 --> 00:16:41,570 E 'ottenuto un punto e virgola, non riccio bretelle, nessun codice all'interno di esso. 347 00:16:41,570 --> 00:16:44,640 Ma quello che facevamo noi chiamiamo questa cosa in settimane passato? 348 00:16:44,640 --> 00:16:45,140 Già. 349 00:16:45,140 --> 00:16:46,060 Quindi un prototipo. 350 00:16:46,060 --> 00:16:48,390 E perché abbiamo un prototipo che sembra 351 00:16:48,390 --> 00:16:51,050 per essere un po 'ridondante in genere perché noi di solito 352 00:16:51,050 --> 00:16:53,474 rivedere la funzione più avanti nel file, giusto? 353 00:16:53,474 --> 00:16:56,390 Quindi perché abbiamo have-- sei solo grattarsi la testa, ma la prendo. 354 00:16:56,390 --> 00:16:57,302 Già. 355 00:16:57,302 --> 00:17:00,000 >> PUBBLICO: [incomprensibile] la funzione dopo la principale. 356 00:17:00,000 --> 00:17:01,000 DAVID J. MALAN: Esattamente. 357 00:17:01,000 --> 00:17:04,089 In modo che il compilatore ti conosce finirà per definire o attuare 358 00:17:04,089 --> 00:17:06,579 tale funzione dopo principale, presumibilmente. 359 00:17:06,579 --> 00:17:08,462 Così Clang e più compilatori sono una specie di muto 360 00:17:08,462 --> 00:17:10,510 e sapranno solo che cosa dite loro. 361 00:17:10,510 --> 00:17:12,569 E se si desidera utilizzare una funzione chiamata sigma, 362 00:17:12,569 --> 00:17:15,710 è meglio insegnare il compilatore che esiste in anticipo. 363 00:17:15,710 --> 00:17:17,970 >> Ora, si principale, anche se si tratta di una serie di linee, 364 00:17:17,970 --> 00:17:19,839 è abbastanza familiare si spera ormai. 365 00:17:19,839 --> 00:17:21,942 Ha un do while il cui scopo nella vita 366 00:17:21,942 --> 00:17:24,400 qui a quanto pare è quello di ottenere un intero positivo da parte dell'utente. 367 00:17:24,400 --> 00:17:27,349 E proprio tenerlo pestering o lei fino a che non collaborano. 368 00:17:27,349 --> 00:17:30,670 Poi, in linea 16 ho una chiamata interessante. 369 00:17:30,670 --> 00:17:31,570 IntAnswer. 370 00:17:31,570 --> 00:17:33,710 Quale sulla mano sinistra lato mi dà un Int 371 00:17:33,710 --> 00:17:36,650 che può store-- chiamato Answer-- che sta per archiviare, a quanto pare, 372 00:17:36,650 --> 00:17:39,090 il valore di ritorno di sigma. 373 00:17:39,090 --> 00:17:41,840 Quindi sigma è solo un nome arbitrario ma significativo 374 00:17:41,840 --> 00:17:44,500 che ho dato ad una funzione il cui scopo nella vita 375 00:17:44,500 --> 00:17:47,680 è quello di prendere un argument-- che chiameremo N in questa case-- 376 00:17:47,680 --> 00:17:52,280 e solo per prendere la somma di quel numero più ogni numero positivo che è 377 00:17:52,280 --> 00:17:53,200 più piccolo di esso. 378 00:17:53,200 --> 00:17:58,140 >> Quindi, se mi passate il numero 2 a Sigma, voglio aggiungere 2 più 1 379 00:17:58,140 --> 00:18:00,240 più 0-- non 0-- in modo che dà me 3. 380 00:18:00,240 --> 00:18:05,320 Se mi passa a 3 a sigma, voglio hanno 3 più 2 più 1, che mi dà 6. 381 00:18:05,320 --> 00:18:05,900 E così via. 382 00:18:05,900 --> 00:18:09,750 Quindi aggiunge solo su tutto il numeri inferiori o uguali ad esso. 383 00:18:09,750 --> 00:18:12,040 >> Ora, qui sto solo andando per stampare la risposta. 384 00:18:12,040 --> 00:18:17,330 Così come un controllo di integrità rapido, diamo fare sigma 0-- puntino barra sigma 0-- 385 00:18:17,330 --> 00:18:18,690 e fammi scriv dentro 2. 386 00:18:18,690 --> 00:18:19,960 E ho davvero ottenere 3. 387 00:18:19,960 --> 00:18:21,240 Lasciatemi scriv dentro 3. 388 00:18:21,240 --> 00:18:22,860 Io davvero ottenere 6. 389 00:18:22,860 --> 00:18:27,636 E se qualcuno può fare la matematica in fretta, se faccio 50 cosa devo arrivare? 390 00:18:27,636 --> 00:18:29,839 >> PUBBLICO: [incomprensibile]. 391 00:18:29,839 --> 00:18:30,880 DAVID J. MALAN: Beh, no. 392 00:18:30,880 --> 00:18:33,340 Ma 1.275 che è abbastanza vicino. 393 00:18:33,340 --> 00:18:38,850 Quindi questo è il risultato di fare 50 più 49, più 48, più 47, più 46 394 00:18:38,850 --> 00:18:40,349 tutta la strada fino a 1. 395 00:18:40,349 --> 00:18:41,390 Quindi questo è tutto sigma fa. 396 00:18:41,390 --> 00:18:43,350 Ma vediamo come siamo attuato ora. 397 00:18:43,350 --> 00:18:45,790 Così qui è la funzione stessa. 398 00:18:45,790 --> 00:18:49,000 E questo non sembra avere nulla a che fare con la ricorsione ancora. 399 00:18:49,000 --> 00:18:51,070 In realtà, stiamo usando un vecchia tecnica della scuola. 400 00:18:51,070 --> 00:18:56,680 Sto inizializzazione di una variabile chiamata sum a zero, poi ho un foreloop qui, 401 00:18:56,680 --> 00:19:00,790 e sto dichiarando un Int chiamato Io, l'impostazione uguale a 1-- 402 00:19:00,790 --> 00:19:04,080 anche se ho potuto impostare uguale a zero, ma dal momento che sto facendo, inoltre, 403 00:19:04,080 --> 00:19:05,340 chi se ne frega se è zero o uno. 404 00:19:05,340 --> 00:19:06,660 Sta andando ad avere alcun effetto. 405 00:19:06,660 --> 00:19:10,110 >> Così sto iterazione fino a quando mi è minore o uguale a m, che 406 00:19:10,110 --> 00:19:11,671 è l'argomento che è stato passato in. 407 00:19:11,671 --> 00:19:13,670 E poi ho appena mantenere incrementando I. E insight 408 00:19:13,670 --> 00:19:20,010 del ciclo tutto sto facendo sta facendo somma più uguale I. E questo è intenzionale. 409 00:19:20,010 --> 00:19:22,326 Io non voglio fare, in questo caso, come somma plus plus. 410 00:19:22,326 --> 00:19:24,790 Voglio aggiungere realmente il valore corrente di I 411 00:19:24,790 --> 00:19:28,190 che mantiene sempre più grande e più grande per il conteggio in esecuzione. 412 00:19:28,190 --> 00:19:30,210 >> E poi torno somma. 413 00:19:30,210 --> 00:19:33,850 E così risposta ottiene la somma del valore. 414 00:19:33,850 --> 00:19:35,282 E poi ho stamparlo. 415 00:19:35,282 --> 00:19:37,740 Quindi c'è la possibilità qui, però, di tipo di semplificare 416 00:19:37,740 --> 00:19:41,260 questo codice concettualmente e il tipo di colpo uno è 417 00:19:41,260 --> 00:19:43,250 mente in termini di semplicità anche se 418 00:19:43,250 --> 00:19:45,700 vuole un po 'di ordinare di capire perché questo 419 00:19:45,700 --> 00:19:47,330 è potente in questi piccoli esempi. 420 00:19:47,330 --> 00:19:50,380 Ecco quindi il sigma-tra-- seconda versione di questo codice. 421 00:19:50,380 --> 00:19:55,290 Tutto sulla cima è identica così che stessa storia vale come prima. 422 00:19:55,290 --> 00:19:59,220 Ma ora diamo un'occhiata al implementazione di Sigma che 423 00:19:59,220 --> 00:20:05,040 Ho ridotto a solo questi lines-- quattro righe di codice, in realtà, 424 00:20:05,040 --> 00:20:06,980 più alcune parentesi graffe e lo spazio bianco. 425 00:20:06,980 --> 00:20:07,930 >> Ma cosa sto facendo? 426 00:20:07,930 --> 00:20:11,050 Se m è inferiore o uguale a pari a zero, ho bisogno di gestire tipo di 427 00:20:11,050 --> 00:20:12,490 che super semplice caso. 428 00:20:12,490 --> 00:20:15,450 E se mano mi zero o niente negativo che è proprio strano, 429 00:20:15,450 --> 00:20:17,909 Sto solo andando a arbitrariamente ma costantemente restituire zero. 430 00:20:17,909 --> 00:20:20,200 Non voglio che questa cosa a entrare in alcuni infinito strano 431 00:20:20,200 --> 00:20:21,810 ciclo a causa di un valore negativo. 432 00:20:21,810 --> 00:20:25,070 Così sto solo dicendo, se mi dai zero o meno, sto tornando a zero. 433 00:20:25,070 --> 00:20:28,220 >> Ma questo è un bene perché è quella singola pagina della rubrica 434 00:20:28,220 --> 00:20:28,790 ciò che è rimasto. 435 00:20:28,790 --> 00:20:32,660 Sto morde fuori un problema molto specifico e non chiamare qualcosa in modo ricorsivo. 436 00:20:32,660 --> 00:20:36,580 Ma in linea di 31, cosa Non mi sembra di fare? 437 00:20:36,580 --> 00:20:39,780 Le parentesi sono solo mantenendo le cose, si spera, un po 'più chiaro. 438 00:20:39,780 --> 00:20:42,110 Ma tutto quello che sto facendo è che sono ritorno M-- qualunque 439 00:20:42,110 --> 00:20:45,790 di consegnare me-- più il valore della M-- dispiace, 440 00:20:45,790 --> 00:20:49,052 più il valore di sigma di meno 1 m. 441 00:20:49,052 --> 00:20:50,010 Che cosa significa questo? 442 00:20:50,010 --> 00:20:53,965 Se mi dai il numero 3 come input, la risposta che voglio ottenere in ultima analisi, 443 00:20:53,965 --> 00:20:57,307 è 6 perché 3 più 2 più 1 mi dà 6. 444 00:20:57,307 --> 00:20:59,390 Ma come faccio a pensare come questo codice viene eseguito? 445 00:20:59,390 --> 00:21:03,070 La prima volta che io chiamo sigma e passo nel valore 3, 446 00:21:03,070 --> 00:21:07,960 che è come dire su un pezzo di carta, ecco il valore 3 447 00:21:07,960 --> 00:21:09,920 e sono stato superato questo come sigma. 448 00:21:09,920 --> 00:21:13,090 3 è ovviamente non inferiore a 0 così la condizione IF non si applica. 449 00:21:13,090 --> 00:21:14,020 L'altro fa. 450 00:21:14,020 --> 00:21:14,990 Quindi cosa devo fare? 451 00:21:14,990 --> 00:21:19,902 Voglio tornare m, che è 3, più sigma di m meno 1. 452 00:21:19,902 --> 00:21:21,110 Così mi permetta di tenere traccia di questo. 453 00:21:21,110 --> 00:21:22,710 Ho intenzione di mettere questo pezzo di carta giù. 454 00:21:22,710 --> 00:21:24,668 E che valore, per essere chiaro, sto andando a passare 455 00:21:24,668 --> 00:21:26,540 in sigma a questo punto della storia? 456 00:21:26,540 --> 00:21:28,080 Che numero? 457 00:21:28,080 --> 00:21:28,610 2, giusto? 458 00:21:28,610 --> 00:21:29,670 3 meno 1 è 2. 459 00:21:29,670 --> 00:21:32,000 Così ho solo bisogno di un po ' pezzo di carta qui. 460 00:21:32,000 --> 00:21:33,931 Così ora Sigma si sta chiamato di nuovo. 461 00:21:33,931 --> 00:21:35,930 E ho volutamente messo questo in giù perché è 462 00:21:35,930 --> 00:21:38,070 un po 'come mettere in pausa che versione della storia 463 00:21:38,070 --> 00:21:40,720 perché ora sono concentrato al segnale di meno 1 m. 464 00:21:40,720 --> 00:21:42,660 Così era m 3, m è meno 1 2. 465 00:21:42,660 --> 00:21:45,110 Così qui è 2 che ho passato. 466 00:21:45,110 --> 00:21:48,510 2 è ovviamente non inferiore 0 in modo che caso non si applica. 467 00:21:48,510 --> 00:21:53,445 Altrimenti torno m, che è questo cosa, più sigma di quale valore? 468 00:21:53,445 --> 00:21:56,160 469 00:21:56,160 --> 00:21:59,650 Quindi, se sigma di 1-- perché m è in questo momento così 2 2 meno 1 è 1. 470 00:21:59,650 --> 00:22:01,950 Così ora ho solo il valore 1. 471 00:22:01,950 --> 00:22:04,810 Sto passando solo il numero 1 alla funzione sigma-- 472 00:22:04,810 --> 00:22:09,120 o me qui-- così 1 non è ovviamente meno di zero, ancora non si applica. 473 00:22:09,120 --> 00:22:12,970 >> Ritorno Else 1 più sigma di che cosa? 474 00:22:12,970 --> 00:22:13,470 0. 475 00:22:13,470 --> 00:22:14,678 Quindi lasciatemi solo ricordo. 476 00:22:14,678 --> 00:22:15,920 Tornerò più avanti. 477 00:22:15,920 --> 00:22:18,060 Ora ho intenzione di andare avanti e jot giù il numero 0 perché è 478 00:22:18,060 --> 00:22:19,470 il mio argomento o parametro. 479 00:22:19,470 --> 00:22:22,400 Sto superato il numero 0 e infine questo processo 480 00:22:22,400 --> 00:22:25,760 di appena ripetermi annuncio fino alla nausea cessa perché ciò che 481 00:22:25,760 --> 00:22:28,820 devo subito fare una volta che vedo questo 0? 482 00:22:28,820 --> 00:22:29,790 Torno a zero. 483 00:22:29,790 --> 00:22:31,790 Così ora si deve riavvolgere la storia. 484 00:22:31,790 --> 00:22:34,430 >> Se ora vado a ritroso nel tempo, qual è stata la cosa più recente 485 00:22:34,430 --> 00:22:36,670 Ho fatto se si fosse letteralmente riavvolgere un video? 486 00:22:36,670 --> 00:22:41,630 Io vado a prendere il più recente 1 e che mi dà più 1 0 è 1. 487 00:22:41,630 --> 00:22:44,100 Se tengo il riavvolgimento del storia, che sta per darmi 488 00:22:44,100 --> 00:22:46,880 2 più questo valore in esecuzione, che è 1. 489 00:22:46,880 --> 00:22:47,789 Ecco, questo è 3. 490 00:22:47,789 --> 00:22:49,330 E poi ho intenzione di continuare a riavvolgimento. 491 00:22:49,330 --> 00:22:54,220 Quando ho messo giù il numero 3-- così 3 più 3 mi dà 6. 492 00:22:54,220 --> 00:22:57,272 >> E ora, se hai riavvolto il video fino a questo punto, 493 00:22:57,272 --> 00:22:58,980 questo era il molto prima domanda ho chiesto. 494 00:22:58,980 --> 00:23:01,450 Quando viene passato 3, qual è sigma di 3? 495 00:23:01,450 --> 00:23:04,204 È infatti 6, la somma di tutti questi pezzi di carta. 496 00:23:04,204 --> 00:23:07,120 Quindi, se questo richiede un po 'di tempo per avvolgere la mente intorno, va bene. 497 00:23:07,120 --> 00:23:10,700 Ma si consideri che era un little-- esso era molto intenzionale che impilati 498 00:23:10,700 --> 00:23:12,990 questi numeri sopra l'altro. 499 00:23:12,990 --> 00:23:17,440 E 'un po' come avere un memory-- un record nel tempo, 500 00:23:17,440 --> 00:23:19,940 come uno scrubber in un video, che io possa davvero tornare indietro in. 501 00:23:19,940 --> 00:23:24,350 E abbiamo intenzione di tornare a che la metafora in appena un po '. 502 00:23:24,350 --> 00:23:28,240 >> Ma prima, si scopre che non c'è un sacco di geek e persone divertenti, 503 00:23:28,240 --> 00:23:29,614 Credo che, a Google. 504 00:23:29,614 --> 00:23:31,530 Sarebbe qualcuno che è molto bravo a mente Googling 505 00:23:31,530 --> 00:23:34,270 fino a venire per un momento e aiutami ricerca di qualcosa? 506 00:23:34,270 --> 00:23:35,650 Molto chiave, molto basso. 507 00:23:35,650 --> 00:23:37,870 Qualcuno che non è mai venire prima, forse. 508 00:23:37,870 --> 00:23:38,370 OK. 509 00:23:38,370 --> 00:23:39,030 Sì? 510 00:23:39,030 --> 00:23:39,530 Avanti. 511 00:23:39,530 --> 00:23:41,410 Vieni giù. 512 00:23:41,410 --> 00:23:42,183 Come ti chiami? 513 00:23:42,183 --> 00:23:42,870 >> SAM: Sam. 514 00:23:42,870 --> 00:23:44,290 >> DAVID J. MALAN: Sam, vieni giù. 515 00:23:44,290 --> 00:23:45,320 Questo è lo stesso. 516 00:23:45,320 --> 00:23:46,280 Felice di conoscerti. 517 00:23:46,280 --> 00:23:46,780 Ciao. 518 00:23:46,780 --> 00:23:47,580 Vieni su. 519 00:23:47,580 --> 00:23:51,290 Quindi tutto quello che devi fare, se si potrebbe, Sam, ecco Google. 520 00:23:51,290 --> 00:23:53,240 Si può cercare il termine ricorsione? 521 00:23:53,240 --> 00:23:55,770 522 00:23:55,770 --> 00:23:56,270 Non rovinare. 523 00:23:56,270 --> 00:23:59,940 524 00:23:59,940 --> 00:24:00,970 >> E ora let's-- sì. 525 00:24:00,970 --> 00:24:03,380 OK Fare clic su questo. 526 00:24:03,380 --> 00:24:04,315 Meglio fare clic su tale. 527 00:24:04,315 --> 00:24:07,020 528 00:24:07,020 --> 00:24:08,020 Ahh, ottenerlo. 529 00:24:08,020 --> 00:24:08,520 No? 530 00:24:08,520 --> 00:24:09,050 OK. 531 00:24:09,050 --> 00:24:10,430 Allora, facciamo un paio di altri. 532 00:24:10,430 --> 00:24:12,830 Non tanto correlate accademicamente qui, ma hai 533 00:24:12,830 --> 00:24:14,520 mai cercato di Google per anagramma? 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 anagramma invece di ricorsione. 537 00:24:17,186 --> 00:24:22,540 538 00:24:22,540 --> 00:24:23,790 Che ne dite di traverso. 539 00:24:23,790 --> 00:24:25,515 Hai mai cercato di traverso? 540 00:24:25,515 --> 00:24:29,260 541 00:24:29,260 --> 00:24:32,692 Ora, questo è un po 'difficile da vedere, ma si spera everything's-- OK. 542 00:24:32,692 --> 00:24:34,150 E 'solo io e te godere di questo. 543 00:24:34,150 --> 00:24:34,690 OK. 544 00:24:34,690 --> 00:24:38,950 >> Così alla fine, questo one's-- è un po 'di traverso. 545 00:24:38,950 --> 00:24:40,810 Ora fare un barrel roll. 546 00:24:40,810 --> 00:24:44,460 547 00:24:44,460 --> 00:24:45,310 Meraviglioso. 548 00:24:45,310 --> 00:24:45,910 Tutto ok. 549 00:24:45,910 --> 00:24:47,110 Grazie di cuore a Sam. 550 00:24:47,110 --> 00:24:49,416 Ecco qui. 551 00:24:49,416 --> 00:24:50,400 Grazie. 552 00:24:50,400 --> 00:24:52,807 >> Allora, cosa sta succedendo in tutta la di questi esempi stupidi? 553 00:24:52,807 --> 00:24:55,640 Quindi, in realtà, sotto il cofano della Milioni di Google di righe di codice 554 00:24:55,640 --> 00:24:58,860 a quanto pare è un qualche sciocco IF condizioni che sono essenzialmente 555 00:24:58,860 --> 00:25:01,160 controllare se l'utente ha digitato in questa frase, 556 00:25:01,160 --> 00:25:03,760 fare qualcosa che probabilmente ha preso una quantità non banale di tempo 557 00:25:03,760 --> 00:25:06,080 di implementare solo a essere divertente in questo modo. 558 00:25:06,080 --> 00:25:08,430 Ma questo è tutto si riduce fino a sotto la cappa. 559 00:25:08,430 --> 00:25:11,570 Ma, naturalmente, la ricorsione è più del geekier 560 00:25:11,570 --> 00:25:13,880 esempio tra quei trucchi speciali. 561 00:25:13,880 --> 00:25:16,880 E sicuramente ci sono altri là fuori così che noi forse abbiamo nemmeno 562 00:25:16,880 --> 00:25:18,230 scoperto ancora. 563 00:25:18,230 --> 00:25:22,830 >> Quindi uno sguardo, o prendere in considerazione ora il seguente programma, 564 00:25:22,830 --> 00:25:24,830 e certamente afferrare qualsiasi di questi sulla vostra uscita. 565 00:25:24,830 --> 00:25:28,820 Ho intenzione di andare avanti e aprire un programma che è 566 00:25:28,820 --> 00:25:30,920 andando a provare a sostituire due valori. 567 00:25:30,920 --> 00:25:33,210 Ma prima di andare lì, facciamo questo. 568 00:25:33,210 --> 00:25:38,500 Potremmo ottenere un altro volontario, penso? 569 00:25:38,500 --> 00:25:40,480 Vuoi fare volontariato? 570 00:25:40,480 --> 00:25:40,980 No? 571 00:25:40,980 --> 00:25:41,890 Vieni su. 572 00:25:41,890 --> 00:25:42,390 Vieni su. 573 00:25:42,390 --> 00:25:42,890 Tutto ok. 574 00:25:42,890 --> 00:25:44,136 Così il vostro nome è quello che? 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 Vieni su, Lauren. 578 00:25:46,890 --> 00:25:50,140 Così Lauren è essere sfidato qui di seguito. 579 00:25:50,140 --> 00:25:52,310 Felice di conoscerti. 580 00:25:52,310 --> 00:25:55,730 Così Lauren qui ha di fronte dei suoi due tazze vuote. 581 00:25:55,730 --> 00:25:57,570 E abbiamo un po 'di colore arancione succhi di frutta e latte 582 00:25:57,570 --> 00:26:00,301 e abbiamo intenzione di andare avanti e fare quanto segue. 583 00:26:00,301 --> 00:26:01,550 Stiamo solo andando a riempire questo. 584 00:26:01,550 --> 00:26:07,840 A poche once di latte qui e cerchiamo di riempire un po 'di succo d'arancia qui. 585 00:26:07,840 --> 00:26:11,475 >> E davanti tutti questi membri del pubblico, 586 00:26:11,475 --> 00:26:13,550 scambiare i due valori di queste tazze. 587 00:26:13,550 --> 00:26:16,970 Mettete il succo d'arancia in tazza di latte e il latte nella tazza succo d'arancia. 588 00:26:16,970 --> 00:26:22,380 589 00:26:22,380 --> 00:26:26,150 Come si esegue questa operazione se foste a casa e aveva accesso ad altre forniture? 590 00:26:26,150 --> 00:26:27,400 LAUREN: Mettere in un'altra tazza. 591 00:26:27,400 --> 00:26:28,191 DAVID J. MALAN: OK. 592 00:26:28,191 --> 00:26:31,940 Quindi cerchiamo di avere una temporanea variabile, se ci sarà. 593 00:26:31,940 --> 00:26:35,871 E andare avanti ora e realizzare la stessa procedura swapping. 594 00:26:35,871 --> 00:26:36,370 Così buono. 595 00:26:36,370 --> 00:26:41,490 Abbiamo messo GU in temporanea variabili, il latte nella variabile GU, 596 00:26:41,490 --> 00:26:44,481 e ora la variabile temporanea nella variabile latte. 597 00:26:44,481 --> 00:26:44,980 OK. 598 00:26:44,980 --> 00:26:48,740 Quindi molto ben fatto finora. 599 00:26:48,740 --> 00:26:50,990 Così si scopre fuori-- ritenere che pensato per un momento. 600 00:26:50,990 --> 00:26:54,479 Qui, a geek solo su un po ', questo sarebbe il corrispondente codice C 601 00:26:54,479 --> 00:26:55,520 che abbiamo appena implementato. 602 00:26:55,520 --> 00:26:58,650 Avevamo due ingressi, a e b, entrambi che ci limiteremo a dire che per semplicità sono 603 00:26:58,650 --> 00:26:59,260 int di. 604 00:26:59,260 --> 00:27:02,780 E notare qui, se voglio scambiare i valori di due variabili, a e b, 605 00:27:02,780 --> 00:27:06,890 abbiamo davvero bisogno di un intermediario, un variabile temporanea, una tazza temporanea, 606 00:27:06,890 --> 00:27:10,830 in cui il getto uno dei valori in modo da avere un segnaposto per esso. 607 00:27:10,830 --> 00:27:13,480 Ma allora il codice è esattamente come Lauren qui attuata. 608 00:27:13,480 --> 00:27:15,500 >> Ora, solo per ottenere un poco più pazzo, si rivela 609 00:27:15,500 --> 00:27:20,930 che si può fare questo senza una variabile temporanea. 610 00:27:20,930 --> 00:27:24,870 Per farlo correttamente, però, stiamo andando avere a barare con un po 'di chimica. 611 00:27:24,870 --> 00:27:26,380 Abbiamo alcune coppe in più qui. 612 00:27:26,380 --> 00:27:29,600 Quindi la cosa più vicina che sembra come latte e acqua perhaps-- 613 00:27:29,600 --> 00:27:34,090 o latte e OJ-- è che abbiamo un po ' acqua, quindi dovremo riempire questo uno 614 00:27:34,090 --> 00:27:36,486 con poche once di acqua limpida. 615 00:27:36,486 --> 00:27:38,332 Questo è probabilmente troppo. 616 00:27:38,332 --> 00:27:38,832 Già. 617 00:27:38,832 --> 00:27:39,934 Questo è decisamente troppo. 618 00:27:39,934 --> 00:27:40,600 Aspetta un secondo. 619 00:27:40,600 --> 00:27:43,520 620 00:27:43,520 --> 00:27:48,420 >> E ora abbiamo il petrolio, che, se ben ricordo da metà classe chimica della scuola, 621 00:27:48,420 --> 00:27:49,990 speriamo che non si mescola con l'acqua. 622 00:27:49,990 --> 00:27:53,650 Ma che tipo di tipo di si presenta come il latte e succo d'arancia. 623 00:27:53,650 --> 00:27:55,760 Così ora, senza l'utilizzo di una variabile temporanea, 624 00:27:55,760 --> 00:27:59,260 potete scambiare questi due valori? 625 00:27:59,260 --> 00:28:03,884 Così oli va nella tazza d'acqua, l'acqua entra nella tazza di olio. 626 00:28:03,884 --> 00:28:04,800 LAUREN: No altre coppe? 627 00:28:04,800 --> 00:28:05,940 DAVID J. MALAN: No altre coppe. 628 00:28:05,940 --> 00:28:07,860 E io non ho in realtà testato questo prima di quest'anno 629 00:28:07,860 --> 00:28:10,110 quindi non so se questo sarà effettivamente lavorare chimicamente. 630 00:28:10,110 --> 00:28:16,130 631 00:28:16,130 --> 00:28:18,650 Questo non doveva succedere. 632 00:28:18,650 --> 00:28:19,761 Funziona? 633 00:28:19,761 --> 00:28:20,260 Tutto ok. 634 00:28:20,260 --> 00:28:20,990 Così la separazione? 635 00:28:20,990 --> 00:28:21,490 Bene. 636 00:28:21,490 --> 00:28:24,714 Ora siamo arrivati ​​a ottenere il acqua nella tazza altra. 637 00:28:24,714 --> 00:28:27,630 Smarter concentratori chimica potrebbe probabilmente fare meglio di me. 638 00:28:27,630 --> 00:28:28,510 >> LAUREN: L'acqua è sul fondo. 639 00:28:28,510 --> 00:28:31,910 >> DAVID J. MALAN: Il water-- che era qual è fondamentale l'ultima volta che abbiamo fatto questo. 640 00:28:31,910 --> 00:28:33,950 Devi farlo nel giusto ordine. 641 00:28:33,950 --> 00:28:34,450 Già. 642 00:28:34,450 --> 00:28:35,270 Va bene. 643 00:28:35,270 --> 00:28:37,290 Così ora abbiamo due tazze di olio. 644 00:28:37,290 --> 00:28:37,790 OK. 645 00:28:37,790 --> 00:28:38,510 Va bene. 646 00:28:38,510 --> 00:28:40,110 Ma chimicamente se questo ha funzionato di I-- 647 00:28:40,110 --> 00:28:41,200 >> LAUREN: Questa è l'acqua. 648 00:28:41,200 --> 00:28:41,930 >> DAVID J. MALAN: Questo è per lo più di acqua. 649 00:28:41,930 --> 00:28:42,430 Tutto ok. 650 00:28:42,430 --> 00:28:44,210 Ma è ancora la stessa tazza di prima. 651 00:28:44,210 --> 00:28:47,570 Quindi versare it-- provare laggiù. 652 00:28:47,570 --> 00:28:49,300 OK. 653 00:28:49,300 --> 00:28:51,010 Questo è un buon uso del tempo classe oggi. 654 00:28:51,010 --> 00:28:51,510 OK. 655 00:28:51,510 --> 00:28:53,890 Così ora we-- bello. 656 00:28:53,890 --> 00:28:55,460 Una specie di. 657 00:28:55,460 --> 00:28:55,960 Tutto ok. 658 00:28:55,960 --> 00:28:56,690 Quindi molto buono. 659 00:28:56,690 --> 00:29:00,006 Grazie a Lauren. 660 00:29:00,006 --> 00:29:01,950 Molto ben fatto. 661 00:29:01,950 --> 00:29:04,570 >> Quindi, solo a soffiare le vostre menti, e questo è forse qualcosa 662 00:29:04,570 --> 00:29:08,660 giocare con se ti piace in ID CS50, è possibile, infatti, scambiare due variabili 663 00:29:08,660 --> 00:29:11,470 senza utilizzare un numero intero temporanea. 664 00:29:11,470 --> 00:29:13,060 E questo è il corrispondente codice C. 665 00:29:13,060 --> 00:29:16,110 E se vi ricordate da ultimo Mercoledì, abbiamo introdotto, se per breve tempo, 666 00:29:16,110 --> 00:29:19,720 alcuni nuovi operatori C. E lo fa chiunque ricordare ciò che la piccola carota 667 00:29:19,720 --> 00:29:23,660 simbolo, quel piccolo triangolare simbolo dalla tastiera rappresenta? 668 00:29:23,660 --> 00:29:26,003 Cosa bit per bit operatore? 669 00:29:26,003 --> 00:29:26,770 >> PUBBLICO: EXOR. 670 00:29:26,770 --> 00:29:27,645 >> DAVID J. MALAN: EXOR. 671 00:29:27,645 --> 00:29:28,560 OR esclusivo. 672 00:29:28,560 --> 00:29:32,920 Quindi, se volete, solo per divertimento a a casa, per dare a e b due arbitrario 673 00:29:32,920 --> 00:29:36,072 valori come qualsiasi eight-- e io avrebbe scelto un valore di otto bit. 674 00:29:36,072 --> 00:29:38,530 Se si esegue questa operazione con 32 bit, avrai molto rapidamente annoiarsi. 675 00:29:38,530 --> 00:29:42,150 Ma basta dare un po 'di otto una valore che è indipendentemente, uno o due, 676 00:29:42,150 --> 00:29:43,790 e dare un valore simile b. 677 00:29:43,790 --> 00:29:46,810 E poi utilizzando la definizione di XOR dal Mercoledì scorso, 678 00:29:46,810 --> 00:29:52,560 applicare tale a poco a poco, ciascuno dei questi otto bit in ciascuna di ae b, 679 00:29:52,560 --> 00:29:54,980 e poi fare esattamente per questo codice. 680 00:29:54,980 --> 00:29:58,170 E non è quello errato vedete qui sullo schermo. 681 00:29:58,170 --> 00:30:02,100 Esso infatti si riduce a tre operazioni XOR 682 00:30:02,100 --> 00:30:05,910 e in qualche modo magicamente un e b scambieranno le posizioni 683 00:30:05,910 --> 00:30:08,010 senza perdere alcuna informazione. 684 00:30:08,010 --> 00:30:11,580 >> Quindi il trucco olio e l'acqua è la vicino incarnazione mondo reale 685 00:30:11,580 --> 00:30:12,980 Potrei pensare di imitare quello. 686 00:30:12,980 --> 00:30:15,950 Ma è sicuramente più facile utilizzare una variabile temporanea, 687 00:30:15,950 --> 00:30:16,920 come in questo caso qui. 688 00:30:16,920 --> 00:30:21,190 E anche questo è un'opportunità dire, Anche questo tipo di micro ottimizzazione, 689 00:30:21,190 --> 00:30:23,590 come un informatico direbbe, mentre una specie di divertimento 690 00:30:23,590 --> 00:30:27,060 di cui vantarsi come hai fatto questo senza come scambiare con una variabile in più, 691 00:30:27,060 --> 00:30:28,640 non è tutto ciò che convincente. 692 00:30:28,640 --> 00:30:31,619 Poiché per salvare 32 bit, come nel caso di un int reale, 693 00:30:31,619 --> 00:30:33,410 non è poi così avvincente su un sistema in cui 694 00:30:33,410 --> 00:30:36,722 si potrebbero utilizzare decine di megabyte o ancora di più tale memoria in questi giorni. 695 00:30:36,722 --> 00:30:38,680 Ed infatti, quando otteniamo a un set problema più tardi 696 00:30:38,680 --> 00:30:41,010 e implementare ortografico correttore e avrete 697 00:30:41,010 --> 00:30:43,550 essere sfidato a farlo con questo il meno RAM e poco 698 00:30:43,550 --> 00:30:46,820 tempo possibile sulla computer-- ancora 699 00:30:46,820 --> 00:30:50,160 una settimana per attuare it-- ti have-- sarete 700 00:30:50,160 --> 00:30:51,799 sfidato per ridurre al minimo tali risorse. 701 00:30:51,799 --> 00:30:53,840 E questo è davvero l'unico occasion questo semestre 702 00:30:53,840 --> 00:30:57,940 dove sarete incoraggiati a radersi fuori anche le migliori prestazioni 703 00:30:57,940 --> 00:30:59,340 costa altrimenti. 704 00:30:59,340 --> 00:31:02,200 >> Quindi, come possiamo Cosa-- vedere questo in codice vero e proprio? 705 00:31:02,200 --> 00:31:04,530 Lasciami andare avanti ora e di aprire un esempio 706 00:31:04,530 --> 00:31:07,700 che deliberatamente si chiama No Swap perché non lo fa 707 00:31:07,700 --> 00:31:10,670 infatti scambiare le variabili mentre in realtà si potrebbe aspettare. 708 00:31:10,670 --> 00:31:12,260 Quindi, diamo uno sguardo. 709 00:31:12,260 --> 00:31:17,050 Ecco un programma che non ha CS50 biblioteca in corso, I / O solo standard. 710 00:31:17,050 --> 00:31:19,560 Ora abbiamo un prototipo per lo swap sulla parte superiore che ha appena 711 00:31:19,560 --> 00:31:21,540 significa che è ottenuto da definire in seguito. 712 00:31:21,540 --> 00:31:22,550 Ed ecco principale. 713 00:31:22,550 --> 00:31:26,000 >> I arbitrariamente assegnato xey, rispettivamente, i valori uno e due 714 00:31:26,000 --> 00:31:28,590 solo perché sono piccoli e facile da pensare. 715 00:31:28,590 --> 00:31:32,280 E allora non mi resta che un mucchio di printfs dove ho un controllo di integrità. x è 1 716 00:31:32,280 --> 00:31:35,110 ey 2 è presumibilmente che cosa quelle printfs diranno. 717 00:31:35,110 --> 00:31:36,530 Quindi nessuna magia finora. 718 00:31:36,530 --> 00:31:40,100 >> Poi ho intenzione di rivendicare con stampare def, scambiando dot dot dot. 719 00:31:40,100 --> 00:31:43,730 Io vado a chiamare lo swap funzione, passando x ed y. 720 00:31:43,730 --> 00:31:47,350 E supponiamo per ora che swap è implementato esattamente 721 00:31:47,350 --> 00:31:49,930 come è stato un momento fa con una variabile temporanea. 722 00:31:49,930 --> 00:31:52,670 E così io sostengo arditamente, scambiato. 723 00:31:52,670 --> 00:31:55,429 x è ora presente ed y è ora che. 724 00:31:55,429 --> 00:31:57,220 Ma il file, ovviamente, si chiama No Swap. 725 00:31:57,220 --> 00:31:58,678 Quindi cerchiamo di realtà vediamo cosa succede. 726 00:31:58,678 --> 00:32:04,450 Se compilo non swap e poi do ./noswap, x è 1, y è 2. 727 00:32:04,450 --> 00:32:05,770 Scambiare scambiati. 728 00:32:05,770 --> 00:32:07,200 x è 1, y è 2. 729 00:32:07,200 --> 00:32:11,980 Così sembra in realtà essere viziato anche anche se swap-- facciamo scorrere verso il basso now-- 730 00:32:11,980 --> 00:32:16,542 è implementato esattamente per la codice che ho proposto un momento fa. 731 00:32:16,542 --> 00:32:19,000 Quindi non stiamo andando per ottenere l'immaginazione con la roba XOR per ora. 732 00:32:19,000 --> 00:32:21,890 Anche questo dovrebbe funzionare come con il latte e succo d'arancia, 733 00:32:21,890 --> 00:32:25,820 ma non sembra funzionare. 734 00:32:25,820 --> 00:32:27,180 >> Quindi cerchiamo di farlo di nuovo. 735 00:32:27,180 --> 00:32:29,310 Forse sono io che non correvo nel modo giusto. 736 00:32:29,310 --> 00:32:32,010 Così corriamo di nuovo No Swap. 737 00:32:32,010 --> 00:32:32,900 Forse I-- no. 738 00:32:32,900 --> 00:32:34,400 Quindi è solo non funziona. 739 00:32:34,400 --> 00:32:36,060 Allora, facciamo un po 'di controllo di integrità. 740 00:32:36,060 --> 00:32:39,690 Lasciami andare avanti qui in Swap e basta aggiungere, aspetta un minuto, 741 00:32:39,690 --> 00:32:43,856 una è% i / n e facciamo plug-in del valore di una. 742 00:32:43,856 --> 00:32:45,730 Perché voglio davvero per vedere cosa sta succedendo. 743 00:32:45,730 --> 00:32:47,570 E in effetti, questo è una tecnica di debug 744 00:32:47,570 --> 00:32:50,028 che si potrebbero utilizzare in orari d'ufficio o in casa, già 745 00:32:50,028 --> 00:32:53,560 simile al primo semestre del Dan Il video di Armendariz in PSET3 746 00:32:53,560 --> 00:32:56,870 in cui abbiamo introdotto stampa def come una tecnica raccomandata, almeno 747 00:32:56,870 --> 00:32:58,080 per i casi semplici. 748 00:32:58,080 --> 00:33:01,720 Lasciami andare avanti e correre fare ancora una volta non di swap, ./noswap. 749 00:33:01,720 --> 00:33:04,370 750 00:33:04,370 --> 00:33:05,840 >> Interessante. 751 00:33:05,840 --> 00:33:11,670 Quindi notare ciò che sembra essere vero. X è 1, y è 2, ma a è 2 quando b è 1. 752 00:33:11,670 --> 00:33:16,790 Così quei due in qualche modo preso scambiati ma xey non sono sempre scambiate. 753 00:33:16,790 --> 00:33:21,090 Quindi, per essere chiari, quello che sta succedendo è, qui ho xey 754 00:33:21,090 --> 00:33:25,380 e questi sono variabili locali nel campo di applicazione principale, sto passando in X e Y 755 00:33:25,380 --> 00:33:26,170 scambiare. 756 00:33:26,170 --> 00:33:29,080 Ora, scambio, come una funzione separata, è libero di chiamare i suoi argomenti 757 00:33:29,080 --> 00:33:30,590 o la sua parametri tutto ciò che vuole. 758 00:33:30,590 --> 00:33:33,280 Foo o bar o X o Y o ao b. 759 00:33:33,280 --> 00:33:36,870 Giusto per chiarire che sono non identico xey per sé, 760 00:33:36,870 --> 00:33:38,020 Ho detto a e b. 761 00:33:38,020 --> 00:33:40,040 Ma potremmo chiamarli tutto ciò che vogliamo. 762 00:33:40,040 --> 00:33:43,960 >> E così sembra di swap viene passato 763 00:33:43,960 --> 00:33:48,980 x-- AKA a-- ed è essere passato y-- AKA b. 764 00:33:48,980 --> 00:33:51,900 In qualche modo queste tre linee sono scambiando esattamente quei valori 765 00:33:51,900 --> 00:33:53,510 come ha fatto Lauren con il latte e succo d'arancia. 766 00:33:53,510 --> 00:33:56,010 Ma quando stampiamo i valori, e un b 767 00:33:56,010 --> 00:34:01,340 sono infatti scambiare ma xe y hanno nessun cambiamento ad essi. 768 00:34:01,340 --> 00:34:03,150 Ricordiamo che xey sono quassù. 769 00:34:03,150 --> 00:34:05,320 >> Così possiamo vedere questo via un'altra tecnica pure. 770 00:34:05,320 --> 00:34:08,110 E anche questa è una tecnica incorporato nel problema impostare tre. 771 00:34:08,110 --> 00:34:10,780 Andiamo avanti e fare questo a CS50 ID se non l'hai già. 772 00:34:10,780 --> 00:34:13,730 Sulla mano destra lato noi avere questa scheda Debugger. 773 00:34:13,730 --> 00:34:16,159 E se si apre questo in su, ci sono alcune informazioni arcane 774 00:34:16,159 --> 00:34:17,530 che è gettato a voi inizialmente. 775 00:34:17,530 --> 00:34:19,310 Ma cerchiamo di prendere in giro questo pezzi molto velocemente. 776 00:34:19,310 --> 00:34:21,620 >> Quindi uno, si vede variabili locali. 777 00:34:21,620 --> 00:34:26,230 Risulta che costruire in CS50 IDE, e un sacco di ambienti di programmazione più 778 00:34:26,230 --> 00:34:28,060 in generale, è un debugger. 779 00:34:28,060 --> 00:34:31,340 Uno strumento che consente di vedere visivamente cosa sta succedendo all'interno del vostro programma 780 00:34:31,340 --> 00:34:34,380 senza dover ricorrere all'aggiunta printfs e compilazione e l'esecuzione 781 00:34:34,380 --> 00:34:37,588 e l'aggiunta di printf e la compilazione e in esecuzione, che già, in orario di ufficio 782 00:34:37,588 --> 00:34:40,070 o la casa, è probabilmente sempre piuttosto noioso. 783 00:34:40,070 --> 00:34:43,090 >> Così qui, in un momento, siamo andando a vedere in tempo reale 784 00:34:43,090 --> 00:34:44,760 i valori delle nostre variabili locali. 785 00:34:44,760 --> 00:34:47,880 Stiamo anche andando a essere in grado di impostare quelli che vengono chiamati i punti di interruzione che 786 00:34:47,880 --> 00:34:52,570 sono opportunità nel mio programma per mettere in pausa esecuzione ad una specifica linea di codice 787 00:34:52,570 --> 00:34:53,710 che mi incuriosisce. 788 00:34:53,710 --> 00:34:54,210 Destra? 789 00:34:54,210 --> 00:34:55,969 Questi programmi eseguiti in una frazione di secondo. 790 00:34:55,969 --> 00:35:00,450 È un po 'bello per noi esseri umani più lenti per essere in grado di mettere in pausa, prendere un momento, vedere 791 00:35:00,450 --> 00:35:02,380 quello che sta succedendo intorno a una certa linea di codice 792 00:35:02,380 --> 00:35:05,050 senza il programma aratura attraverso di essa e la finitura del tutto. 793 00:35:05,050 --> 00:35:08,510 Così un punti di interruzione intenzione di permettere a noi rompere e pausa a un certo punto. 794 00:35:08,510 --> 00:35:12,990 >> Chiamata stack è un modo elegante per dire quali funzioni sono attualmente 795 00:35:12,990 --> 00:35:14,140 essere chiamati in questo momento. 796 00:35:14,140 --> 00:35:15,370 Principale è sempre chiamato prima. 797 00:35:15,370 --> 00:35:17,230 Ma se chiama principale a funzione chiamata Swap, 798 00:35:17,230 --> 00:35:20,470 realmente stiamo andando a vedere questo torre di funzioni che sono stati 799 00:35:20,470 --> 00:35:22,400 chiamato in ordine cronologico inverso. 800 00:35:22,400 --> 00:35:23,310 Quindi cerchiamo di vedere quello. 801 00:35:23,310 --> 00:35:24,327 >> Ho intenzione di ridurre. 802 00:35:24,327 --> 00:35:25,660 Ho intenzione di tornare al mio codice. 803 00:35:25,660 --> 00:35:27,540 E proprio perché voglio essere pedanti qui, 804 00:35:27,540 --> 00:35:31,100 Ho intenzione di andare avanti e fare clic appena a sinistra della linea di cinque. 805 00:35:31,100 --> 00:35:32,830 E che crea un punto rosso. 806 00:35:32,830 --> 00:35:36,200 E notare sul lato destro della strada che il debugger sa, hey, 807 00:35:36,200 --> 00:35:41,020 Ho appena detto un punto di interruzione noswap.c linea a cinque, in particolare 808 00:35:41,020 --> 00:35:42,480 in questa linea di codice. 809 00:35:42,480 --> 00:35:45,090 Così il debugger sa che io hanno chiesto che la prossima volta 810 00:35:45,090 --> 00:35:48,530 Ho eseguito il mio programma è di pausa esecuzione lì piuttosto che solo 811 00:35:48,530 --> 00:35:50,390 l'esecuzione del tutto super veloce. 812 00:35:50,390 --> 00:35:53,889 >> Così ora ho intenzione di fare clic sul debug pulsante nella parte superiore della IDE 813 00:35:53,889 --> 00:35:55,430 e che sta andando a fare quanto segue. 814 00:35:55,430 --> 00:36:00,680 E 'intenzione di aprire un po' inizialmente spaventoso secondo terminale cercando window-- 815 00:36:00,680 --> 00:36:02,679 debug remoto da ospitare tale e such-- 816 00:36:02,679 --> 00:36:04,970 e torneremo a quello che tutto questo significa che tra non molto. 817 00:36:04,970 --> 00:36:09,020 Ma ciò che è importante per la società è che quel puntino rosso è stato colpito, 818 00:36:09,020 --> 00:36:11,735 il debugger ha deliberatamente pausa execution-- 819 00:36:11,735 --> 00:36:15,560 non su quella linea per sé, ma sulla prima linea di codice effettivo in tale funzione. 820 00:36:15,560 --> 00:36:18,040 Ed è per questo che la linea sette è ora evidenziato in giallo. 821 00:36:18,040 --> 00:36:20,550 >> E ora diamo un'occhiata sul lato destro. 822 00:36:20,550 --> 00:36:27,300 Sembra che, per impostazione predefinita, abbastanza bene, x ha quale valore? 823 00:36:27,300 --> 00:36:27,860 0. 824 00:36:27,860 --> 00:36:29,750 E y ha che valore? 825 00:36:29,750 --> 00:36:30,410 Zero. 826 00:36:30,410 --> 00:36:35,540 E questo è da aspettarselo in senso che x e y-- che line-- gialla ha 827 00:36:35,540 --> 00:36:36,770 non ancora eseguita. 828 00:36:36,770 --> 00:36:38,510 Quindi x non dovrebbero avere il valore 1. 829 00:36:38,510 --> 00:36:41,470 Si può avere qualsiasi altro valore, un cosiddetto valore spazzatura. 830 00:36:41,470 --> 00:36:44,320 E siamo stati fortunati in quanto è zero in questo punto, essenzialmente. 831 00:36:44,320 --> 00:36:46,400 >> Così ora c'è solo pochi pulsanti abbiamo bisogno di cure 832 00:36:46,400 --> 00:36:48,100 circa durante il debug in questo modo. 833 00:36:48,100 --> 00:36:49,970 Notate qui, abbiamo un pulsante Play. 834 00:36:49,970 --> 00:36:51,877 E se giochiamo o colpire riprendere, questo è solo 835 00:36:51,877 --> 00:36:53,710 andando a correre attraverso il resto del programma 836 00:36:53,710 --> 00:36:55,300 o fino a quando non colpisce un altro punto di interruzione. 837 00:36:55,300 --> 00:36:56,910 Ma io non ho impostato nessun altro punti di interruzione quindi è solo 838 00:36:56,910 --> 00:36:58,118 andare a correre fino alla fine. 839 00:36:58,118 --> 00:37:00,280 Questo tipo di sconfitte le scopo di rovistando. 840 00:37:00,280 --> 00:37:03,290 >> Così, invece, mi interessa queste icone a destra. 841 00:37:03,290 --> 00:37:05,360 E se mi passa il mouse sopra loro, come si dovrebbe troppo, 842 00:37:05,360 --> 00:37:07,450 vedrete piccoli consigli strumento tips--. 843 00:37:07,450 --> 00:37:09,020 Questo è un passo sopra. 844 00:37:09,020 --> 00:37:11,290 Ora questo non significa saltare la seguente riga di codice. 845 00:37:11,290 --> 00:37:14,840 Ciò significa che solo eseguirlo e passare alla successiva, passare al successivo, 846 00:37:14,840 --> 00:37:15,580 passare alla successiva. 847 00:37:15,580 --> 00:37:17,610 In altre parole, tramite quel tasto, posso camminare 848 00:37:17,610 --> 00:37:20,390 attraverso il mio codice di un passo alla volta. 849 00:37:20,390 --> 00:37:21,914 Riga per riga, letteralmente. 850 00:37:21,914 --> 00:37:23,830 Ora, il diritto di che, ce n'è un altro 851 00:37:23,830 --> 00:37:25,163 che vedremo in un attimo. 852 00:37:25,163 --> 00:37:27,820 Questo è il cosiddetto Step Into icona che è 853 00:37:27,820 --> 00:37:30,300 andando a me consentire immersioni in un'altra funzione. 854 00:37:30,300 --> 00:37:31,800 Ma vediamo questo in un attimo. 855 00:37:31,800 --> 00:37:33,280 Quindi ho intenzione di fare clic su scavalcare. 856 00:37:33,280 --> 00:37:35,820 Ed ora notare, come clicco questo tasto in alto a destra, 857 00:37:35,820 --> 00:37:41,260 tenere gli occhi più o meno sotto locale Variabili e vedere cosa succede a x. 858 00:37:41,260 --> 00:37:44,115 x è ora 1 perché la linea gialla è ora eseguito 859 00:37:44,115 --> 00:37:45,840 e ci siamo spostati alla linea 8. 860 00:37:45,840 --> 00:37:49,840 E in un attimo y dovrebbe speriamo che diventi 2. 861 00:37:49,840 --> 00:37:52,330 >> Ora, nulla che interessante avviene per un po '. 862 00:37:52,330 --> 00:37:53,390 Tutto questo è è printf. 863 00:37:53,390 --> 00:37:58,010 E notare, a mio terminale secondario finestra, vedo l'output di stampa def. 864 00:37:58,010 --> 00:38:01,080 E ora devo fare una decisione come il programmatore. 865 00:38:01,080 --> 00:38:04,360 Posso scavalcare questa linea di codice, eseguendolo ma non 866 00:38:04,360 --> 00:38:06,220 ottenere curioso di sapere cosa c'è dentro. 867 00:38:06,220 --> 00:38:11,130 O posso davvero un passo in esso e andare dentro di sé Swap. 868 00:38:11,130 --> 00:38:12,340 Allora, facciamo il secondo. 869 00:38:12,340 --> 00:38:15,550 >> Lasciami andare avanti e fare clic Non Step Over ma Step Into. 870 00:38:15,550 --> 00:38:17,300 Avviso, tutto ad un tratto finestra cambia 871 00:38:17,300 --> 00:38:19,330 per evidenziare la prima riga di codice nel Swap. 872 00:38:19,330 --> 00:38:20,710 Questa è la linea 21. 873 00:38:20,710 --> 00:38:25,220 E ora, che una specie di funky è che, se si guarda qui, come previsto, 874 00:38:25,220 --> 00:38:29,720 una virgola b è 1 e 2, rispettivamente. 875 00:38:29,720 --> 00:38:33,840 Perché temperatura 32.767? 876 00:38:33,840 --> 00:38:36,560 Ricordando che temperatura, molto simile la tazza vuota un momento fa, 877 00:38:36,560 --> 00:38:38,980 è dichiarato qui sulla linea 21. 878 00:38:38,980 --> 00:38:43,390 Perché 32,000- Voglio dire, perché è solo qualche valore strano? 879 00:38:43,390 --> 00:38:43,890 Sì? 880 00:38:43,890 --> 00:38:45,190 >> PUBBLICO: Non è inizializzato. 881 00:38:45,190 --> 00:38:46,940 >> DAVID J. MALAN: E ' non è stato inizializzato. 882 00:38:46,940 --> 00:38:49,370 Così il nostro computer sempre ha memoria fisica. 883 00:38:49,370 --> 00:38:50,544 Ha sempre RAM fisica. 884 00:38:50,544 --> 00:38:52,710 E c'è sempre Zero e uno è in là, giusto? 885 00:38:52,710 --> 00:38:54,626 Perché stiamo usando il nostro computer di tutto il giorno, 886 00:38:54,626 --> 00:38:57,210 si sta utilizzando il CS50 IDE oi server per tutto il giorno. 887 00:38:57,210 --> 00:39:01,159 In modo che la RAM o ha alcuni zeri o qualcuno di alcuni o di zero e uno. 888 00:39:01,159 --> 00:39:02,950 Non importa se o non si sta usando loro. 889 00:39:02,950 --> 00:39:05,270 Non si può semplicemente avere in bianco spazi in cui si desidera bit. 890 00:39:05,270 --> 00:39:06,850 Sono sia zero e uno. 891 00:39:06,850 --> 00:39:09,610 >> Così si scopre che temperatura, perché non abbiamo ancora inizializzato esso, 892 00:39:09,610 --> 00:39:14,580 abbiamo quelle a 32 bit, ma non ho stato inizializzato per i valori noti. 893 00:39:14,580 --> 00:39:18,110 Quindi, qualsiasi fossero più recentemente utilizzato for-- quelle 32 bits-- 894 00:39:18,110 --> 00:39:23,000 stiamo solo vedendo i manufatti di alcune precedente uso di quei particolari 32 895 00:39:23,000 --> 00:39:23,500 bits. 896 00:39:23,500 --> 00:39:27,780 Appena clicco Step Over, però, uff, temperatura sta per ottenere il valore 1. 897 00:39:27,780 --> 00:39:31,600 E se lo faccio di nuovo, una è sta per essere dato il valore 2 898 00:39:31,600 --> 00:39:33,830 e poi b sta per essere dato il valore 1. 899 00:39:33,830 --> 00:39:36,390 >> E così ciò che è bello ora questo punto della storia 900 00:39:36,390 --> 00:39:39,750 è che il debugger è mostrandomi, super lentamente 901 00:39:39,750 --> 00:39:42,640 al mio ritmo, cosa lo stato di Swap è. 902 00:39:42,640 --> 00:39:47,490 Ma bando ai vertici qui, avviso che lo stack di chiamate in realtà 903 00:39:47,490 --> 00:39:49,180 ha due strati ad esso. 904 00:39:49,180 --> 00:39:53,240 Ora quello che è evidenziata come Swap, se clicco su Main invece, 905 00:39:53,240 --> 00:39:57,100 notate come le variabili locali cambiano perché lo sviluppatore può solo salire 906 00:39:57,100 --> 00:39:59,740 intorno e andare in qualsiasi ambito diverso. 907 00:39:59,740 --> 00:40:04,070 Così, anche se stiamo facendo tutto questo lavorare e scambiando correttamente a e b, 908 00:40:04,070 --> 00:40:09,080 se vado avanti e indietro tra Swap dove a è 2 e b è 1 e principale, 909 00:40:09,080 --> 00:40:11,851 è principale stato colpito a tutti? 910 00:40:11,851 --> 00:40:12,350 No. 911 00:40:12,350 --> 00:40:13,930 Allora qual è il takeaway qui? 912 00:40:13,930 --> 00:40:18,200 Beh, si scopre che in qualsiasi momento si chiama una funzione come swap, 913 00:40:18,200 --> 00:40:21,600 e si passa argomenti, cosa si sta passando alla funzione Swap 914 00:40:21,600 --> 00:40:24,730 in questo caso è una copia di tali argomenti. 915 00:40:24,730 --> 00:40:28,620 Quindi, se X e Y sono ciascuno rispettivamente 32 bit, ciò che sta ottenendo Swap 916 00:40:28,620 --> 00:40:30,760 è due nuovi locali variabili, o argomenti, 917 00:40:30,760 --> 00:40:34,380 chiamato e b-- ma questi sono arbitrari names-- ma il modello di zeri 918 00:40:34,380 --> 00:40:39,520 e quelli all'interno di A e B sono fila per essere identico a x e y 919 00:40:39,520 --> 00:40:42,610 ma non sono la stessa cosa xe y. 920 00:40:42,610 --> 00:40:46,880 >> È come se ha principale sul suo pezzo di carta il numero 1 e 2 per x ed y, 921 00:40:46,880 --> 00:40:49,260 e poi quando mani pezzo di carta per Swap, 922 00:40:49,260 --> 00:40:51,970 Swap diventa molto rapidamente la propria penna, scrive 923 00:40:51,970 --> 00:40:56,240 1 e 2 sul proprio foglio di carta, mani indietro il xy originale principale 924 00:40:56,240 --> 00:40:58,790 e poi fa il suo cosa con ae b. 925 00:40:58,790 --> 00:41:01,940 E questo è importante perché ora super- questo ha implicazioni non banali 926 00:41:01,940 --> 00:41:06,260 per in realtà la scrittura di codice corretto perché sembrerebbe non possiamo scambiare 927 00:41:06,260 --> 00:41:07,500 due variabili. 928 00:41:07,500 --> 00:41:09,150 >> Ho scritto una funzione Swap corretto. 929 00:41:09,150 --> 00:41:12,770 Abbiamo implementato con Lauren come una funzione swap corretta in realtà, 930 00:41:12,770 --> 00:41:16,700 ma a quanto pare niente di tutto ciò cose se non si può effettivamente 931 00:41:16,700 --> 00:41:19,530 scambiare due valori in modo permanente. 932 00:41:19,530 --> 00:41:21,970 Quindi abbiamo bisogno di un altro modo per arrivare realmente a questo, 933 00:41:21,970 --> 00:41:24,472 e dobbiamo essere in grado di effettivamente risolvere questo problema. 934 00:41:24,472 --> 00:41:27,180 E si scopre fuori-- e verremo di nuovo a questo particolare immagine 935 00:41:27,180 --> 00:41:30,500 prima long-- questo è un modo che si potrebbe richiamare la memoria del computer. 936 00:41:30,500 --> 00:41:31,460 E 'solo un rettangolo. 937 00:41:31,460 --> 00:41:32,960 Si potrebbe disegnare qualsiasi numero di modi, ma è 938 00:41:32,960 --> 00:41:35,740 conveniente per disegnare come rettangolo per il seguente motivo. 939 00:41:35,740 --> 00:41:40,040 >> Stiamo per iniziare oggi e oltre parlando del cosiddetto stack. 940 00:41:40,040 --> 00:41:43,870 E la pila è solo un pezzo di RAM-- un pezzo di memory-- 941 00:41:43,870 --> 00:41:47,100 che le funzioni hanno accesso quando si chiamano. 942 00:41:47,100 --> 00:41:49,800 E così si scopre che a il fondo di questo stack 943 00:41:49,800 --> 00:41:53,590 è dove tutte le variabili locali di principali org e C e org V e tutta quella roba 944 00:41:53,590 --> 00:41:56,950 stanno per andare in default. E se Principale chiama qualche altra funzione come Swap, 945 00:41:56,950 --> 00:42:00,330 bene, Swap sta per ottenere un altro strato di memoria fino sopra di esso. 946 00:42:00,330 --> 00:42:04,490 >> E così, proprio per darvi un rapido superficiale foto di questo, se vado su qui-- 947 00:42:04,490 --> 00:42:09,450 e lasciami rispecchio questo sul overhead well-- quello che realmente ho, 948 00:42:09,450 --> 00:42:12,100 se ci preoccupiamo soltanto del fondo dell'immagine, per ora, 949 00:42:12,100 --> 00:42:15,070 è che quando ho eseguito un programma e principale viene chiamato, 950 00:42:15,070 --> 00:42:18,330 Principale è dato un pezzo di RAM nel mio computer che è 951 00:42:18,330 --> 00:42:20,060 in fondo a questo cosiddetto stack. 952 00:42:20,060 --> 00:42:22,143 E ho intenzione di disegnarlo deliberatamente come un quadrato. 953 00:42:22,143 --> 00:42:24,540 Quindi è come 32 bit o quattro byte. 954 00:42:24,540 --> 00:42:28,790 E se questa funzione principale ha un variabile chiamata x per un valore di 1 955 00:42:28,790 --> 00:42:32,626 e ha una variabile denominata y con il valore di 2, che è 956 00:42:32,626 --> 00:42:35,750 come prendere questo frammento di memoria che Principale è stata proposta dal operativa 957 00:42:35,750 --> 00:42:38,850 Sistema e dividendolo in modo che la prima variabile locale va qui, 958 00:42:38,850 --> 00:42:40,930 il secondo va qui, e questo è tutto. 959 00:42:40,930 --> 00:42:45,590 >> Quando chiama principale Swap, Swap ottiene la propria fetta di memoria 960 00:42:45,590 --> 00:42:48,280 che noi disegniamo come questo dal sistema operativo, 961 00:42:48,280 --> 00:42:50,820 e sta andando ad avere la sua proprie variabili locali basato 962 00:42:50,820 --> 00:42:53,825 sulla nostra implementazione precedente con variabili locali un 963 00:42:53,825 --> 00:42:58,010 e b che inizialmente ottenere i valori 1 e 2. 964 00:42:58,010 --> 00:43:00,450 Ma poi, non appena il codice viene eseguito Swap, 965 00:43:00,450 --> 00:43:03,760 e Lauren scambia in realtà il OJ e latte, che cosa sta succedendo? 966 00:43:03,760 --> 00:43:09,030 Ebbene, questo 2 sta diventando un 1, questo 1 sta diventando un 2, e, tra l'altro, 967 00:43:09,030 --> 00:43:13,360 vi è una variabile temporanea che viene usato che per tutto il tempo che alla fine 968 00:43:13,360 --> 00:43:14,470 Va via. 969 00:43:14,470 --> 00:43:16,720 Ma non ha importanza la quantità di lavoro che fate 970 00:43:16,720 --> 00:43:22,160 in questa linea di-- in questo spazio di memoria, xey sono completamente intatta. 971 00:43:22,160 --> 00:43:26,320 >> Quindi abbiamo bisogno di un modo per dare Swap e funziona come esso 972 00:43:26,320 --> 00:43:32,640 accesso segreto, se si vuole, a funzioni like-- di memoria come x ed y. 973 00:43:32,640 --> 00:43:35,110 Quindi, diamo uno sguardo a un esempio che aiuta 974 00:43:35,110 --> 00:43:38,220 di vedere esattamente ciò che è stato succede tutto questo tempo. 975 00:43:38,220 --> 00:43:40,284 Ho intenzione di andare avanti e di aprire Confronta Zero. 976 00:43:40,284 --> 00:43:42,200 E ho intenzione di chiudere il nostro debugger, vado 977 00:43:42,200 --> 00:43:44,360 per chiudere questo messaggio paura cercando il solo dice, aspetta un minuto, 978 00:43:44,360 --> 00:43:45,800 sei nel mezzo di debug. 979 00:43:45,800 --> 00:43:48,383 Io vado a nascondere questa scheda qui solo per tornare alla semplicità. 980 00:43:48,383 --> 00:43:50,160 Quindi non preoccupatevi se GDB viene ucciso. 981 00:43:50,160 --> 00:43:53,910 Questo significa solo che il programma ha stato smettere, deliberatamente in questo caso, 982 00:43:53,910 --> 00:43:54,820 da me. 983 00:43:54,820 --> 00:43:57,700 >> E ora Confronta Zero fa questo. 984 00:43:57,700 --> 00:44:00,110 Sto utilizzando il CS50 libreria in I / O standard. 985 00:44:00,110 --> 00:44:04,319 Ho una funzione principale che prima dice, dire qualcosa, e ottiene una stringa. 986 00:44:04,319 --> 00:44:06,110 Poi dice ancora e ottiene un'altra stringa. 987 00:44:06,110 --> 00:44:09,910 E notare che queste due stringhe sono chiamati s e t rispettivamente. 988 00:44:09,910 --> 00:44:12,910 E ora questo programma, Confronta Zero, il suo scopo nella vita, 989 00:44:12,910 --> 00:44:15,470 si suppone a dirmi, ho digitare la stessa cosa? 990 00:44:15,470 --> 00:44:16,910 E così ho intenzione di nuovo in settimana uno. 991 00:44:16,910 --> 00:44:19,950 Sto utilizzando il mio operatore uguale uguale che è l'operatore qualità. 992 00:44:19,950 --> 00:44:22,220 Non l'operatore di assegnazione, l'operatore di uguaglianza. 993 00:44:22,220 --> 00:44:23,890 Sto solo paragonando s e t. 994 00:44:23,890 --> 00:44:27,470 >> Quindi cerchiamo di realmente andare avanti e fare questo. 995 00:44:27,470 --> 00:44:32,680 E ho intenzione di andare avanti e fare Confronta Zero. 996 00:44:32,680 --> 00:44:35,110 Ho intenzione di fare ./comparezero. 997 00:44:35,110 --> 00:44:37,150 E ho intenzione di andare avanti e dire qualcosa 998 00:44:37,150 --> 00:44:43,450 come, facciamo mamma in minuscolo E per quanto riguarda la mamma in maiuscolo. 999 00:44:43,450 --> 00:44:45,034 E, naturalmente, si digita cose diverse. 1000 00:44:45,034 --> 00:44:45,533 Tutto ok. 1001 00:44:45,533 --> 00:44:46,570 Questo è da aspettarselo. 1002 00:44:46,570 --> 00:44:47,640 >> Corriamo ancora. 1003 00:44:47,640 --> 00:44:49,740 Entrambe le volte fanno in minuscolo, minuscolo. 1004 00:44:49,740 --> 00:44:51,490 Che sembra eccellente identico a me. 1005 00:44:51,490 --> 00:44:52,930 Invio. 1006 00:44:52,930 --> 00:44:53,430 OK. 1007 00:44:53,430 --> 00:44:55,804 Forse è solo strano perché non è gradire la mia grammatica. 1008 00:44:55,804 --> 00:44:59,930 Allora, facciamo un MOM del capitale, capitale MOM, identici. 1009 00:44:59,930 --> 00:45:01,490 Cose differenti. 1010 00:45:01,490 --> 00:45:03,907 >> Allora perché? 1011 00:45:03,907 --> 00:45:06,240 Ebbene, che cosa sta realmente succedendo in sotto la cappa qui? 1012 00:45:06,240 --> 00:45:08,180 Quindi cerchiamo di andare indietro sopra qui solo per un attimo 1013 00:45:08,180 --> 00:45:10,910 e considerare ciò che GetString è in realtà facendo. 1014 00:45:10,910 --> 00:45:13,385 Quando si chiama GetString, questa è una funzione che abbiamo 1015 00:45:13,385 --> 00:45:16,510 noi scritto e in qualche modo ottiene un sequenza di caratteri da parte dell'utente. 1016 00:45:16,510 --> 00:45:20,280 E supponiamo che il primo volta che chiamo GetString, che mi dà 1017 00:45:20,280 --> 00:45:21,930 un pezzo di memoria che assomiglia a questo. 1018 00:45:21,930 --> 00:45:26,990 E se ho digitato tutto minuscolo m-o-M-- e cosa succede dopo? 1019 00:45:26,990 --> 00:45:28,840 Solo un controllo di integrità rapido. 1020 00:45:28,840 --> 00:45:29,780 >> Pari a zero backslash. 1021 00:45:29,780 --> 00:45:30,510 Lo sappiamo. 1022 00:45:30,510 --> 00:45:32,784 E ricordiamo che abbiamo giocato in giro con il nome di Zamila 1023 00:45:32,784 --> 00:45:34,950 e un sacco di altri nomi quando Rob è stato qui in cerca 1024 00:45:34,950 --> 00:45:36,280 a quello che sta succedendo all'interno della memoria. 1025 00:45:36,280 --> 00:45:37,780 In modo che la storia è esattamente la stessa. 1026 00:45:37,780 --> 00:45:40,160 Questo è ciò che GetString sta tornando a me. 1027 00:45:40,160 --> 00:45:44,780 Ora, il mio codice un attimo fa memorizzata il valore di ritorno di GetString 1028 00:45:44,780 --> 00:45:47,510 in una variabile denominata s. 1029 00:45:47,510 --> 00:45:51,390 E poi la seconda volta che la chiamava, è conservato in una variabile chiamata t. 1030 00:45:51,390 --> 00:45:55,070 >> Quindi, se vado qui, ho bisogno per disegnare questo variable-- locale 1031 00:45:55,070 --> 00:45:59,610 e sto in generale andando a disegnare una stringa come solo-- faremo 1032 00:45:59,610 --> 00:46:02,360 chiamare S-- come una piazzetta qui. 1033 00:46:02,360 --> 00:46:09,760 E ora, come fa la mamma somehow-- andare all'interno di questo s variabile? 1034 00:46:09,760 --> 00:46:12,010 Beh, abbiamo bisogno di tornare indietro per primi principi qui. 1035 00:46:12,010 --> 00:46:15,660 Che cosa è realmente GetString tornando? 1036 00:46:15,660 --> 00:46:19,030 >> Così si scopre che M-O-M backslash zero e un numero qualsiasi 1037 00:46:19,030 --> 00:46:22,364 di altre stringhe in memoria come Zamila e Rob o Andy e tutti gli altri, 1038 00:46:22,364 --> 00:46:24,280 sono naturalmente nel nostro RAM del computer o della memoria. 1039 00:46:24,280 --> 00:46:27,760 E la RAM ha like-- avete un giga di RAM, due concerti di RAM, 1040 00:46:27,760 --> 00:46:30,860 o un miliardo o due miliardi di byte, o forse anche di più in questi giorni. 1041 00:46:30,860 --> 00:46:34,070 Quindi supponiamo, per finalità di oggi, che non importa il modo in cui annoveriamo 1042 00:46:34,070 --> 00:46:36,640 loro, ma siamo in grado di numerare ogni di quelli miliardo o due miliardi 1043 00:46:36,640 --> 00:46:37,880 o quattro miliardi di byte. 1044 00:46:37,880 --> 00:46:42,240 >> E diciamo solo arbitrariamente dire che questo è il primo morso, secondo morso, 1045 00:46:42,240 --> 00:46:43,380 terzo, quarto. 1046 00:46:43,380 --> 00:46:46,570 Non sto usando deliberatamente zero oggi, ma ci torneremo a questo. 1047 00:46:46,570 --> 00:46:49,570 Quindi, in altre parole, se questo è il molto prima volta che sto utilizzando il programma, 1048 00:46:49,570 --> 00:46:52,715 Sto solo avere fortuna e il primo morso è in posizione uno poi due 1049 00:46:52,715 --> 00:46:53,590 poi tre a quattro. 1050 00:46:53,590 --> 00:46:57,430 E se ho continuato a disegnare, numero di casella due miliardi sarebbero fin qui. 1051 00:46:57,430 --> 00:47:02,200 >> Allora, cosa ne pensi, poi, GetString ritorna in realtà? 1052 00:47:02,200 --> 00:47:06,010 Non è il ritorno M-O-M backslash nulla di per sé, perché questo chiaramente 1053 00:47:06,010 --> 00:47:08,180 non si adatta nella casella che ho disegnato. 1054 00:47:08,180 --> 00:47:11,210 Quindi, che cosa potrebbe realmente GetString Ritorneremo tutte queste settimane? 1055 00:47:11,210 --> 00:47:14,410 1056 00:47:14,410 --> 00:47:16,820 La risposta è sul bordo qui da qualche parte. 1057 00:47:16,820 --> 00:47:20,390 Non si può andare bene M-O-M backslash a zero, così quello che potrebbe avere un senso, invece? 1058 00:47:20,390 --> 00:47:23,424 Se dovessi essere super intelligente, mettendo il cosiddetto cappello engineering, 1059 00:47:23,424 --> 00:47:24,340 quello che si potrebbe tornare? 1060 00:47:24,340 --> 00:47:27,340 Qual è la quantità minima di informazioni si potrebbe tornare che sarebbe ancora 1061 00:47:27,340 --> 00:47:30,610 consentono di trovare M-O-M in memoria? 1062 00:47:30,610 --> 00:47:31,270 Sì? 1063 00:47:31,270 --> 00:47:31,950 >> PUBBLICO: Uno. 1064 00:47:31,950 --> 00:47:32,200 >> DAVID J. MALAN: One. 1065 00:47:32,200 --> 00:47:33,021 E perché uno? 1066 00:47:33,021 --> 00:47:35,520 PUBBLICO: Perché avrebbe detto dove andare [incomprensibile]. 1067 00:47:35,520 --> 00:47:38,391 1068 00:47:38,391 --> 00:47:39,390 DAVID J. MALAN: Esattamente. 1069 00:47:39,390 --> 00:47:44,300 Sto solo andando a restituire l'indirizzo della stringa che ho ottenuto. 1070 00:47:44,300 --> 00:47:46,570 L'indirizzo in questo caso è la posizione uno. 1071 00:47:46,570 --> 00:47:51,280 Quindi, ciò che realmente viene memorizzato in S-- e ogni variabile stringa così far-- 1072 00:47:51,280 --> 00:47:53,430 è appena stato indirizzo di tale stringa. 1073 00:47:53,430 --> 00:47:57,840 >> Nel frattempo, se io chiamo GetString una seconda volta e mi 1074 00:47:57,840 --> 00:48:03,300 digitare letteralmente la stessa cosa-- M-O-M con lowercase-- M-O-M 1075 00:48:03,300 --> 00:48:06,200 e un altro backslash pari a zero, e ora forse il mio programma di 1076 00:48:06,200 --> 00:48:09,820 stato in esecuzione per qualche tempo così forse questo è 10, questa è la posizione 11, questo è 12, 1077 00:48:09,820 --> 00:48:10,700 questo è 13. 1078 00:48:10,700 --> 00:48:13,590 I computer che utilizzano un altro memoria per qualsiasi motivo. 1079 00:48:13,590 --> 00:48:18,172 Ciò che ora va nel mio secondo variabile nel mio programma t? 1080 00:48:18,172 --> 00:48:19,390 10. 1081 00:48:19,390 --> 00:48:20,050 Esattamente. 1082 00:48:20,050 --> 00:48:23,910 >> E così quando guardiamo la il codice sorgente di questo programma 1083 00:48:23,910 --> 00:48:26,550 dove sto semplicemente cercando per confrontare i due valori, 1084 00:48:26,550 --> 00:48:32,180 è s uguale uguale a t, ciò che è la risposta umana ovvia? 1085 00:48:32,180 --> 00:48:34,890 Proprio no, perché uno non è uguale a 10. 1086 00:48:34,890 --> 00:48:36,861 E così qui sta un opportunità per noi davvero 1087 00:48:36,861 --> 00:48:39,610 di andare solo indietro per, ancora una volta, prima principi e pensare, beh, 1088 00:48:39,610 --> 00:48:41,110 cosa sta succedendo sotto il cofano? 1089 00:48:41,110 --> 00:48:43,240 Abbiamo parlato bit e byte e la memoria, 1090 00:48:43,240 --> 00:48:46,820 ma in realtà è utile per capire perché quando si chiama GetString, 1091 00:48:46,820 --> 00:48:50,280 anche se pensiamo che è tornando M-O-M o stringa di mamma 1092 00:48:50,280 --> 00:48:53,120 o Andy o Zamila o simili, tecnicamente 1093 00:48:53,120 --> 00:48:55,510 è solo restituendo l'indirizzo di quel pezzo di memoria. 1094 00:48:55,510 --> 00:48:56,910 >> Ma va bene. 1095 00:48:56,910 --> 00:49:00,570 Perché come faccio a sapere dove la stringa finisce? 1096 00:49:00,570 --> 00:49:03,840 Se mi sono dato solo l'inizio? 1097 00:49:03,840 --> 00:49:05,380 Beh, il backslash a zero, giusto? 1098 00:49:05,380 --> 00:49:08,800 Appena in tempo lineare che posso stampare con la stampa def M-O-M. 1099 00:49:08,800 --> 00:49:11,820 E non appena vedo backslash pari a zero, non mi importa dove ho iniziato, 1100 00:49:11,820 --> 00:49:14,950 So già implicitamente dove ho bisogno di finire. 1101 00:49:14,950 --> 00:49:18,700 >> E così oggi ricorre il beginning-- e mi permetta di fare questo in modo drammatico perché noi 1102 00:49:18,700 --> 00:49:21,800 ha attraversato un sacco di problemi a ottenere questi qui formazione wheels-- 1103 00:49:21,800 --> 00:49:29,840 così oggi le ruote di formazione iniziano per venire fuori e ci rivelano almeno: 1104 00:49:29,840 --> 00:49:31,373 >> [Applausi] 1105 00:49:31,373 --> 00:49:33,220 1106 00:49:33,220 --> 00:49:36,160 >> Questo è stato ben vale il viaggio a Target questa mattina, sì? 1107 00:49:36,160 --> 00:49:39,600 Così now-- c'è, si trasforma fuori, una cosa come stringa. 1108 00:49:39,600 --> 00:49:41,140 Stringa non esiste. 1109 00:49:41,140 --> 00:49:43,760 E 'un sinonimo che abbiamo avuto all'interno della biblioteca CS50. 1110 00:49:43,760 --> 00:49:48,660 D'ora in poi, stiamo per iniziare a chiamare s e t non stringhe ma char stelle. 1111 00:49:48,660 --> 00:49:51,180 E la stella char faremo prendere in giro a parte in breve tempo. 1112 00:49:51,180 --> 00:49:53,510 Ma questo per dire, che, anche se continuiamo 1113 00:49:53,510 --> 00:49:56,180 utilizzando GetString per ora, tecnicamente dovrei 1114 00:49:56,180 --> 00:49:59,010 essere dicendo char e char stella stella. 1115 00:49:59,010 --> 00:50:01,720 >> E si scopre che cosa stella sta per denotare qualcosa 1116 00:50:01,720 --> 00:50:04,340 chiamato un puntatore o un indirizzo. 1117 00:50:04,340 --> 00:50:06,110 E infatti, un teaser per quello che ci aspetta 1118 00:50:06,110 --> 00:50:09,760 è questa seconda clip 20 dal nostro amico Nick Parlante a Stanford 1119 00:50:09,760 --> 00:50:12,927 che, qualche tempo fa, spendere una quantità ridicola di tempo, 1120 00:50:12,927 --> 00:50:15,010 come meglio posso dire a suo cucina o la sua cantina, 1121 00:50:15,010 --> 00:50:17,140 rendendo claymation conoscere il mondo 1122 00:50:17,140 --> 00:50:20,010 un personaggio di nome Binky con i quali ci sarà 1123 00:50:20,010 --> 00:50:22,010 introdurre la prossima volta a puntatori. 1124 00:50:22,010 --> 00:50:24,588 Così qui è un'anteprima di quello che verrà. 1125 00:50:24,588 --> 00:50:26,370 >> [RIPRODUZIONE VIDEO] 1126 00:50:26,370 --> 00:50:27,510 >> Ehi, Binky. 1127 00:50:27,510 --> 00:50:28,260 Svegliare. 1128 00:50:28,260 --> 00:50:30,672 E 'il momento per l'indicatore del divertimento. 1129 00:50:30,672 --> 00:50:31,616 >> -Che cos'è? 1130 00:50:31,616 --> 00:50:33,032 Ulteriori informazioni su puntatori? 1131 00:50:33,032 --> 00:50:34,450 Oh, Goody. 1132 00:50:34,450 --> 00:50:35,431 >> [FINE RIPRODUZIONE] 1133 00:50:35,431 --> 00:50:38,055 DAVID J. MALAN: E su questa nota, ci vediamo il Mercoledì. 1134 00:50:38,055 --> 00:50:47,590 1135 00:50:47,590 --> 00:50:48,090 Tutto ok. 1136 00:50:48,090 --> 00:50:48,740 Chi è la danza? 1137 00:50:48,740 --> 00:50:49,240 Avanti. 1138 00:50:49,240 --> 00:50:50,330 Chi è la danza? 1139 00:50:50,330 --> 00:50:51,820 Vuoi che farla partire? 1140 00:50:51,820 --> 00:50:53,770 Prendo ha cominciato. 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: fantasia dolce Mosè.