1 00:00:00,000 --> 00:00:00,940 2 00:00:00,940 --> 00:00:05,440 >> [GIOCO MUSICA] 3 00:00:05,440 --> 00:00:11,577 4 00:00:11,577 --> 00:00:12,660 DAVID J. MALAN: Va bene. 5 00:00:12,660 --> 00:00:15,590 Questo è CS50, e questo è l'inizio della seconda settimana. 6 00:00:15,590 --> 00:00:19,120 Quindi cominciamo oggi con un bug. 7 00:00:19,120 --> 00:00:20,974 Un bug, naturalmente, è un errore in un programma, 8 00:00:20,974 --> 00:00:22,890 e si otterrà molto familiarità con questo concetto 9 00:00:22,890 --> 00:00:26,050 se non hai mai programmato prima. pset0 e ora pset1. 10 00:00:26,050 --> 00:00:29,280 Ma consideriamo qualcosa un po 'semplice a prima. 11 00:00:29,280 --> 00:00:32,189 Questo programma qui che ho gettato insieme in anticipo, 12 00:00:32,189 --> 00:00:37,280 e io sostengo che questo dovrebbe stampare 10 stelle sullo schermo utilizzando printf, 13 00:00:37,280 --> 00:00:41,020 ma è apparentemente buggy in qualche modo. 14 00:00:41,020 --> 00:00:45,370 >> Dato che le specifiche che si deve stampare 10 stelle, 15 00:00:45,370 --> 00:00:50,230 ma non è così a quanto pare, ciò che vuoi rivendicare è il bug? 16 00:00:50,230 --> 00:00:52,004 Sì? 17 00:00:52,004 --> 00:00:54,420 Quindi è un off da un errore, e che cosa vuoi dire con questo? 18 00:00:54,420 --> 00:01:00,991 19 00:01:00,991 --> 00:01:01,490 Ok. 20 00:01:01,490 --> 00:01:09,820 21 00:01:09,820 --> 00:01:10,410 Eccellente. 22 00:01:10,410 --> 00:01:13,930 Così abbiamo specificato un valore pari a zero per iniziare i, 23 00:01:13,930 --> 00:01:18,399 e abbiamo specificato un valore n di 10, ma abbiamo usato minore o uguale a. 24 00:01:18,399 --> 00:01:21,190 E la ragione che si tratta di due caratteri e non solo un simbolo, 25 00:01:21,190 --> 00:01:22,630 come in un libro di matematica, è che non avete 26 00:01:22,630 --> 00:01:24,880 un modo di esprimere il un equivalente carattere. 27 00:01:24,880 --> 00:01:28,450 >> Quindi questo significa meno, ma se si inizia a contare da zero, 28 00:01:28,450 --> 00:01:31,690 ma si conta tutta la strada attraverso e pari a 10, 29 00:01:31,690 --> 00:01:34,170 sei ovviamente andare a conta 11 cose in totale. 30 00:01:34,170 --> 00:01:35,900 E così si sta andando a stampare 11 stelle. 31 00:01:35,900 --> 00:01:37,990 Così che cosa potrebbe essere una correzione per questo? 32 00:01:37,990 --> 00:01:39,970 Sì? 33 00:01:39,970 --> 00:01:43,980 >> Quindi basta regolare il meno o uguale a essere appena inferiore, 34 00:01:43,980 --> 00:01:46,250 e c'è, io rivendico, forse un'altra soluzione, anche. 35 00:01:46,250 --> 00:01:47,210 Che altro si potrebbe fare? 36 00:01:47,210 --> 00:01:48,590 Sì? 37 00:01:48,590 --> 00:01:53,660 >> Così inizia pari a 1, e lasciare la minore o uguale a. 38 00:01:53,660 --> 00:01:56,187 E francamente vorrei rivendicare che per un umano tipico, 39 00:01:56,187 --> 00:01:57,770 questo è probabilmente più semplice. 40 00:01:57,770 --> 00:02:00,280 Inizia il conteggio a 1 e contare fino a 10. 41 00:02:00,280 --> 00:02:01,690 In sostanza fai quello che vuoi dire. 42 00:02:01,690 --> 00:02:04,010 >> Ma la realtà è in programmazione, come abbiamo visto, 43 00:02:04,010 --> 00:02:07,598 informatici e programmatori in genere non iniziare il conteggio da zero. 44 00:02:07,598 --> 00:02:09,389 E così va bene una volta ci si abitua ad esso. 45 00:02:09,389 --> 00:02:12,640 La tua condizione generale essere qualcosa di simile a meno. 46 00:02:12,640 --> 00:02:14,910 Così semplicemente una logica errore che potremmo ora 47 00:02:14,910 --> 00:02:17,990 fissare e infine ricompilare questo e ottenere solo 10. 48 00:02:17,990 --> 00:02:19,610 >> Beh, che ne dici di questo bug qui? 49 00:02:19,610 --> 00:02:24,200 Qui, ancora una volta, ho affermare che ho un obiettivo di stampa di 10 stars-- 50 00:02:24,200 --> 00:02:28,140 uno per riga questa volta, ma non è così. 51 00:02:28,140 --> 00:02:30,940 Prima vi proponiamo quello la correzione è, che cosa fa questo 52 00:02:30,940 --> 00:02:34,640 stampare visivamente se dovessi compilare ed eseguire questo programma ne pensi? 53 00:02:34,640 --> 00:02:35,140 Sì? 54 00:02:35,140 --> 00:02:38,360 55 00:02:38,360 --> 00:02:38,860 >> Stella. 56 00:02:38,860 --> 00:02:41,690 Così tutte le stelle sul stessa linea è quello che ho sentito, 57 00:02:41,690 --> 00:02:43,391 e poi il carattere di nuova riga. 58 00:02:43,391 --> 00:02:44,140 Quindi proviamo questo. 59 00:02:44,140 --> 00:02:48,710 Quindi, fare buggy-1, immettere, e vedo il comando clang 60 00:02:48,710 --> 00:02:50,090 di cui abbiamo parlato l'ultima volta. 61 00:02:50,090 --> 00:02:55,180 ./buggy-1, e infatti vedo tutte le 10 stelle sulla stessa linea, anche se rivendico 62 00:02:55,180 --> 00:02:58,690 nella mia specifica solo un commento in cima il codice che ho intenzione di fare uno per 63 00:02:58,690 --> 00:02:59,230 linea. 64 00:02:59,230 --> 00:03:00,580 Ma questo sembra giusto. 65 00:03:00,580 --> 00:03:04,620 >> Ora la linea 15 sembra come se fossi la stampa di una stella, e poi la linea 16 66 00:03:04,620 --> 00:03:06,620 sembra come se fossi di stampa un carattere di nuova riga, 67 00:03:06,620 --> 00:03:09,560 e sono entrambi rientrati in modo Sono all'interno del loop chiaramente. 68 00:03:09,560 --> 00:03:13,610 Quindi non dovrei fare stelle, nuovo linea, stella, nuova linea, stella, nuova linea? 69 00:03:13,610 --> 00:03:14,110 Sì? 70 00:03:14,110 --> 00:03:18,430 71 00:03:18,430 --> 00:03:21,240 >> Sì, a differenza di un linguaggio come Python, se si ha familiarità, 72 00:03:21,240 --> 00:03:23,540 rientro non lo fa materia al computer. 73 00:03:23,540 --> 00:03:25,280 Importa solo per l'umano. 74 00:03:25,280 --> 00:03:29,860 Così le linee mentre qui ho inventato 15 e 16-- che sembra bello, 75 00:03:29,860 --> 00:03:31,330 ma il computer non si preoccupa. 76 00:03:31,330 --> 00:03:34,640 Il computer si preoccupa in realtà avendo parentesi graffe 77 00:03:34,640 --> 00:03:36,310 attorno a queste righe di codice. 78 00:03:36,310 --> 00:03:39,520 >> Così che è clear-- proprio come in Scratch-- che quelle due righe di codice 79 00:03:39,520 --> 00:03:40,450 dovrebbe essere eseguito. 80 00:03:40,450 --> 00:03:44,390 Come uno di quelli Scratch puzzle giallo pezzi ancora e ancora e ancora. 81 00:03:44,390 --> 00:03:50,920 >> Così ora re-run se questo program-- ./buggy-2-- Hm. 82 00:03:50,920 --> 00:03:51,770 Ho un errore adesso. 83 00:03:51,770 --> 00:03:54,212 Quello che ho dimenticato di fare? 84 00:03:54,212 --> 00:03:55,420 Sì, così non ho compilarlo. 85 00:03:55,420 --> 00:03:56,740 Quindi, fare buggy-2. 86 00:03:56,740 --> 00:03:59,840 Nessun file perché non l'ho fatto in realtà compilare la seconda versione. 87 00:03:59,840 --> 00:04:04,860 Così ora interessante sommerso non variable-- 2. 88 00:04:04,860 --> 00:04:05,510 Stiamo facendo 1. 89 00:04:05,510 --> 00:04:11,050 Fai buggy-1-- ./buggy-1-- e ora ciascuno di essi è sulla stessa linea. 90 00:04:11,050 --> 00:04:13,880 >> Ora c'è un'eccezione alla questa affermazione presunta mio 91 00:04:13,880 --> 00:04:15,520 che avete bisogno di queste parentesi graffe. 92 00:04:15,520 --> 00:04:20,160 Quando è in realtà OK-- se avete notato in sezione o textbooks-- 93 00:04:20,160 --> 00:04:22,130 di omettere le parentesi graffe? 94 00:04:22,130 --> 00:04:22,630 Sì? 95 00:04:22,630 --> 00:04:26,290 96 00:04:26,290 --> 00:04:26,870 >> Esattamente. 97 00:04:26,870 --> 00:04:28,940 Quando c'è solo un riga di codice che si 98 00:04:28,940 --> 00:04:32,830 vuole associare al ciclo come nel nostro primo esempio. 99 00:04:32,830 --> 00:04:36,380 E 'perfettamente legittimo di omettere le parentesi graffe 100 00:04:36,380 --> 00:04:40,310 proprio come una sorta di convenienza dal compilatore a voi. 101 00:04:40,310 --> 00:04:40,810 Sì? 102 00:04:40,810 --> 00:04:43,347 103 00:04:43,347 --> 00:04:43,930 Buona domanda. 104 00:04:43,930 --> 00:04:45,500 Sarebbe essere considerato un errore di stile? 105 00:04:45,500 --> 00:04:49,340 Vorremmo promote-- come in CS50 guida di stile, l'URL per la quale 106 00:04:49,340 --> 00:04:51,926 è in pset1-- che sempre utilizzare le parentesi graffe. 107 00:04:51,926 --> 00:04:53,550 Certo, se siete nuovi alla programmazione. 108 00:04:53,550 --> 00:04:56,800 La realtà è che non siamo intenzione di proibire voi 109 00:04:56,800 --> 00:04:58,680 dal fare queste convenienze. 110 00:04:58,680 --> 00:05:00,846 Ma se si sta solo ricevendo in altalena delle cose, 111 00:05:00,846 --> 00:05:04,020 assolutamente basta usare sempre il riccio bretelle fino ad ottenere il blocco di esso. 112 00:05:04,020 --> 00:05:04,640 Buona domanda. 113 00:05:04,640 --> 00:05:05,320 >> Bene. 114 00:05:05,320 --> 00:05:07,660 In modo che poi era un bug. 115 00:05:07,660 --> 00:05:09,190 Almeno in qualcosa di abbastanza semplice. 116 00:05:09,190 --> 00:05:11,260 Eppure si potrebbe pensare questo è abbastanza rudimentale, giusto? 117 00:05:11,260 --> 00:05:13,635 Questa è una specie della prima settimana di guardare alla lingua 118 00:05:13,635 --> 00:05:14,890 come, vedere i tuoi errori in esso. 119 00:05:14,890 --> 00:05:17,250 Ma la realtà si tratta effettivamente rappresentativo 120 00:05:17,250 --> 00:05:20,310 di alcuni problemi piuttosto spaventose che possono sorgere nel mondo reale. 121 00:05:20,310 --> 00:05:23,530 >> Così alcuni di voi potrebbero ricordare se si seguono notizie di tecnologia, 122 00:05:23,530 --> 00:05:25,740 o forse addirittura catturato vento di questo nel mese di febbraio 123 00:05:25,740 --> 00:05:29,434 di questo anno passato che Apple aveva fatto un po 'di un errore in entrambi iOS, 124 00:05:29,434 --> 00:05:31,350 il sistema operativo i loro telefoni, e anche 125 00:05:31,350 --> 00:05:34,220 Mac OS, il sistema operativo sui loro desktop e laptop. 126 00:05:34,220 --> 00:05:36,480 E hai visto titoli come questo. 127 00:05:36,480 --> 00:05:41,120 E da allora in poi, Apple promesso di risolvere questo bug, 128 00:05:41,120 --> 00:05:45,950 e molto rapidamente ha fatto risolvere il problema in iOS, ma poi alla fine risolto in Mac OS 129 00:05:45,950 --> 00:05:46,810 pure. 130 00:05:46,810 --> 00:05:50,370 >> Ora, nessuno di questi titoli da soli davvero rivelare ciò che il problema di fondo era, 131 00:05:50,370 --> 00:05:55,640 ma il bug è stato infine ridotto a un bug in SSL, Secure Sockets Layer. 132 00:05:55,640 --> 00:05:57,390 E per farla breve, questo è il software 133 00:05:57,390 --> 00:06:01,030 che il nostro browser e altre software utilizzato per fare che cosa? 134 00:06:01,030 --> 00:06:04,090 135 00:06:04,090 --> 00:06:06,860 >> Se ho detto che SSL è coinvolti, ogni volta che si 136 00:06:06,860 --> 00:06:13,920 visitare un URL che inizia con HTTPS, Che poi potrebbe essere correlato a SSL? 137 00:06:13,920 --> 00:06:14,580 Crittografia. 138 00:06:14,580 --> 00:06:16,470 Quindi parleremo questo nei prossimi giorni. 139 00:06:16,470 --> 00:06:18,750 Crittografia, l'arte di scrambling informazioni. 140 00:06:18,750 --> 00:06:22,200 >> Ma per farla breve, Apple qualche tempo fa aveva fatto un errore 141 00:06:22,200 --> 00:06:25,970 nella loro attuazione della SSL, il software che implementa definitiva 142 00:06:25,970 --> 00:06:30,120 URL come HTTPS o max connessioni anche lì. 143 00:06:30,120 --> 00:06:32,850 Il cui risultato è che il connessioni potrebbe potenzialmente 144 00:06:32,850 --> 00:06:33,920 essere intercettati. 145 00:06:33,920 --> 00:06:37,130 E le connessioni erano non necessariamente cifrato 146 00:06:37,130 --> 00:06:40,350 se avete avuto qualche cattivo ragazzo in mezzo voi e il sito di destinazione che 147 00:06:40,350 --> 00:06:42,170 ha saputo approfittare di questo. 148 00:06:42,170 --> 00:06:45,090 >> Ora Apple ha in definitiva una correzione per questo, infine, 149 00:06:45,090 --> 00:06:46,920 e la descrizione della loro correzione era questo. 150 00:06:46,920 --> 00:06:49,878 Trasporto sicuro non è riuscito a confermare l'autenticità della connessione. 151 00:06:49,878 --> 00:06:52,920 Il problema è stato risolto ripristino mancanti passi di validazione. 152 00:06:52,920 --> 00:06:57,250 >> Quindi questo è un lato ondulato spiegazione semplicemente per dire che abbiamo avvitato. 153 00:06:57,250 --> 00:07:00,920 Vi è letteralmente una riga di codice che era bacato 154 00:07:00,920 --> 00:07:05,130 nella loro attuazione della SSL, e se si va online e la ricerca di questo 155 00:07:05,130 --> 00:07:07,210 si può effettivamente trovare il codice sorgente originale. 156 00:07:07,210 --> 00:07:11,960 Per esempio, questo è un colpo di schermo solo una porzione di un gran lima, 157 00:07:11,960 --> 00:07:15,965 ma questa è una funzione apparentemente chiamato SSL verificare segno server di scambio di chiavi. 158 00:07:15,965 --> 00:07:17,840 E ci vuole un po 'di argomenti e gli ingressi. 159 00:07:17,840 --> 00:07:20,298 E non stiamo andando a concentrarsi troppo sul minuzie là, 160 00:07:20,298 --> 00:07:24,390 ma se ci si concentra sul codice interno di quella più in alto function-- facciamo 161 00:07:24,390 --> 00:07:25,590 zoomare su quella. 162 00:07:25,590 --> 00:07:28,140 Si potrebbe già sospettare ciò che l'errore potrebbe 163 00:07:28,140 --> 00:07:31,230 essere anche se non avete idea in ultima analisi, ciò che si sta guardando. 164 00:07:31,230 --> 00:07:35,924 C'è una specie di anomalia qui, che è ciò? 165 00:07:35,924 --> 00:07:38,940 >> Sì, non mi piace molto lo sguardo di due goto fallisce. 166 00:07:38,940 --> 00:07:42,060 Francamente, io non so davvero cosa goto sicuro mezzo, ma avendo due di essi 167 00:07:42,060 --> 00:07:42,810 back to back. 168 00:07:42,810 --> 00:07:45,290 Questo solo tipo di mi strofina intellettualmente nel modo sbagliato, 169 00:07:45,290 --> 00:07:48,910 e anzi, se focalizziamo l'attenzione sulla solo quelle linee, questo è C. 170 00:07:48,910 --> 00:07:52,220 >> Così un sacco di codice di Apple è a sua volta scritto in C, 171 00:07:52,220 --> 00:07:55,780 e questo a quanto pare è davvero equivalent-- 172 00:07:55,780 --> 00:07:59,060 non a quella bella indentazione versione, ma se si riconosce il fatto 173 00:07:59,060 --> 00:08:02,560 che non ci sono parentesi graffe, che cosa Apple ha davvero scritto era il codice che sembra 174 00:08:02,560 --> 00:08:03,540 come questo. 175 00:08:03,540 --> 00:08:07,080 Così ho ingrandito e ho appena fissato il rientro in senso 176 00:08:07,080 --> 00:08:10,690 che se non ci sono parentesi graffe, che secondo goto non riescono che è in giallo 177 00:08:10,690 --> 00:08:12,500 sta per eseguire qualunque cosa. 178 00:08:12,500 --> 00:08:15,540 Non è associato con se la condizione di sopra di esso. 179 00:08:15,540 --> 00:08:19,590 >> Quindi, anche di nuovo, se non del tutto capire che cosa questo potrebbe 180 00:08:19,590 --> 00:08:23,230 essere facendo, sapere che ognuno di questi conditions-- ognuna di queste linee 181 00:08:23,230 --> 00:08:26,180 è un passo molto importante nel processo di controllo 182 00:08:26,180 --> 00:08:28,350 se i dati sono in realtà crittografata. 183 00:08:28,350 --> 00:08:31,710 Così saltando uno di questi passi, non l'idea migliore. 184 00:08:31,710 --> 00:08:34,840 >> Ma perché abbiamo questa secondo goto fallire in giallo, 185 00:08:34,840 --> 00:08:36,840 e perché una volta che abbiamo sorta di esteticamente 186 00:08:36,840 --> 00:08:40,480 spostarlo verso sinistra dove logicamente è al momento, ciò 187 00:08:40,480 --> 00:08:43,230 significa questo per la linea di codice riportato di seguito, che secondo goto 188 00:08:43,230 --> 00:08:46,480 riesce pensereste? 189 00:08:46,480 --> 00:08:48,860 Sta andando sempre essere saltati. 190 00:08:48,860 --> 00:08:52,100 Così goto sono generalmente disapprovate per ragioni che non sarà davvero andare in, 191 00:08:52,100 --> 00:08:54,940 e anzi in CS50 noi non tendiamo per insegnare questa dichiarazione goto, 192 00:08:54,940 --> 00:08:58,130 ma si può pensare di goto non nel senso andare salto 193 00:08:58,130 --> 00:08:59,600 a qualche altra parte del codice. 194 00:08:59,600 --> 00:09:03,120 >> In altre parole, saltare questa ultima riga del tutto, 195 00:09:03,120 --> 00:09:07,420 e così il risultato di questo stupido semplice errore che era solo 196 00:09:07,420 --> 00:09:10,330 A seguito di probabilmente qualcuno copiando e incollando uno di troppo 197 00:09:10,330 --> 00:09:14,150 molte volte era che l'intero sicurezza di iOS e Mac OS 198 00:09:14,150 --> 00:09:18,240 era vulnerabile alle intercettazioni da cattivi per un bel po 'di tempo. 199 00:09:18,240 --> 00:09:19,940 Fino a quando Apple ha finalmente risolto questo. 200 00:09:19,940 --> 00:09:23,100 >> Ora, se alcuni di voi sono in realtà esecuzione di vecchie versioni di iOS o Mac OS, 201 00:09:23,100 --> 00:09:27,250 si può andare a gotofail.com cui è un sito che qualcuno ha istituito 202 00:09:27,250 --> 00:09:29,190 determinare essenzialmente programmazione 203 00:09:29,190 --> 00:09:30,980 se il computer è ancora vulnerabile. 204 00:09:30,980 --> 00:09:33,600 E francamente, se lo è, è probabilmente una buona idea 205 00:09:33,600 --> 00:09:36,870 per aggiornare il telefono o il vostro Mac a questo punto. 206 00:09:36,870 --> 00:09:40,120 Ma lì, proprio testamento a quanto un apprezzamento di questi livello inferiore 207 00:09:40,120 --> 00:09:42,400 dettagli e abbastanza idee semplici può davvero 208 00:09:42,400 --> 00:09:44,590 tradursi in decisioni e problemi che 209 00:09:44,590 --> 00:09:47,320 affected-- in questo case-- milioni di persone. 210 00:09:47,320 --> 00:09:49,107 >> Ora una parola per l'amministrazione. 211 00:09:49,107 --> 00:09:50,690 Sezione inizierà il prossimo Domenica. 212 00:09:50,690 --> 00:09:53,360 Riceverai una e-mail da parte del fine settimana sulla sezione, a questo punto 213 00:09:53,360 --> 00:09:55,290 il processo di resezione inizierà se avete 214 00:09:55,290 --> 00:09:56,998 capito ora avete alcuni nuovi conflitti. 215 00:09:56,998 --> 00:10:00,180 Quindi questo accade ogni anno, e abbiamo ospiterà nei giorni a venire. 216 00:10:00,180 --> 00:10:02,430 >> Ufficio hours-- fanno tenere d' occhio su questo programma qui. 217 00:10:02,430 --> 00:10:05,100 Cambia un po 'di questa settimana, in particolare il tempo di inizio 218 00:10:05,100 --> 00:10:08,180 e la posizione, in modo da consultare che prima di partire per l'orario di ufficio 219 00:10:08,180 --> 00:10:09,520 una delle prossime quattro notti. 220 00:10:09,520 --> 00:10:12,680 Ed ora una parola sulla valutazione, in particolare per quanto ci si immerge in un problema 221 00:10:12,680 --> 00:10:14,350 stabilisce uno e oltre. 222 00:10:14,350 --> 00:10:17,070 >> Così per la specifica, questi sono generalmente 223 00:10:17,070 --> 00:10:20,360 gli assi lungo i quali valutiamo il vostro lavoro. 224 00:10:20,360 --> 00:10:23,170 Ambito di applicazione si riferisce a ciò che misura i vostri attrezzi di codice 225 00:10:23,170 --> 00:10:25,690 le caratteristiche richieste dalla nostra specificazione. 226 00:10:25,690 --> 00:10:28,290 In altre parole, quanto di un calcio da fermo ha fatto si mordono fuori. 227 00:10:28,290 --> 00:10:30,440 Hai fatto un terzo di esso, una metà di esso, 100% di esso. 228 00:10:30,440 --> 00:10:33,000 Anche se non è corretto, quanto hai tentare? 229 00:10:33,000 --> 00:10:35,290 Così che cattura il livello di sforzo e l'importo 230 00:10:35,290 --> 00:10:38,260 a cui si po 'fuori problemi problema di set. 231 00:10:38,260 --> 00:10:40,690 >> Correctness-- questo, per In che misura, è il codice 232 00:10:40,690 --> 00:10:43,150 coerente con la nostra specifiche e privo di bug. 233 00:10:43,150 --> 00:10:44,770 Così funziona correttamente? 234 00:10:44,770 --> 00:10:48,700 Se diamo qualche input, lo fa ci danno l'output che ci aspettiamo? 235 00:10:48,700 --> 00:10:52,570 Design-- ora questo è il primo di quelli particolarmente qualitativi, 236 00:10:52,570 --> 00:10:56,180 o quelli che richiedono il giudizio umano. 237 00:10:56,180 --> 00:10:59,690 E in effetti, questo è il motivo per cui abbiamo uno staff di tanti compagni di insegnamento e corso 238 00:10:59,690 --> 00:11:00,350 assistenti. 239 00:11:00,350 --> 00:11:03,480 Fino a che punto è il tuo codice scritto bene? 240 00:11:03,480 --> 00:11:05,810 >> E anche questo è un molto valutazione qualitativa 241 00:11:05,810 --> 00:11:09,100 che lavorerà con voi su bidirezionale nelle settimane a venire. 242 00:11:09,100 --> 00:11:12,060 Così che, quando non si ottiene solo i punteggi numerici, ma anche 243 00:11:12,060 --> 00:11:16,682 a partiture scritte, o feedback digitato, o commenti scritti in parole inglesi. 244 00:11:16,682 --> 00:11:19,640 Questo è quello che useremo a guidare verso realtà scrivere codice migliore. 245 00:11:19,640 --> 00:11:23,320 E in conferenza e la sezione, cercheremo al punto fuori-- più spesso can-- 246 00:11:23,320 --> 00:11:26,420 ciò che rende un programma non solo corretta e funzionalmente buona, 247 00:11:26,420 --> 00:11:28,200 ma anche ben progettato. 248 00:11:28,200 --> 00:11:31,850 Il più efficiente che potrebbe essere, o anche il più bello possibile. 249 00:11:31,850 --> 00:11:33,100 >> Il che ci porta a stile. 250 00:11:33,100 --> 00:11:36,876 Style in ultima analisi, è un giudizio estetico. 251 00:11:36,876 --> 00:11:38,750 Avete scelto bene nomi per le variabili? 252 00:11:38,750 --> 00:11:40,330 Hai frastagliata correttamente il codice? 253 00:11:40,330 --> 00:11:44,010 Ha un bell'aspetto, e, quindi, è facile per un altro essere umano 254 00:11:44,010 --> 00:11:46,550 per leggere il vostro rispettivo della sua correttezza. 255 00:11:46,550 --> 00:11:50,300 >> Ora, in generale per il programma, segniamo queste cose su una scala a cinque punti. 256 00:11:50,300 --> 00:11:53,640 E mi permetta di ribadire il punto che un tre è davvero buono. 257 00:11:53,640 --> 00:11:55,550 Molto rapidamente fare la gente iniziare a fare l'aritmetica. 258 00:11:55,550 --> 00:11:58,133 Quando ottengono un tre su cinque su di correttezza per qualche pset 259 00:11:58,133 --> 00:12:02,040 e pensano accidenti, ho intenzione al 60% che è essenzialmente una D o E. 260 00:12:02,040 --> 00:12:03,980 >> Non è questo il modo in cui pensare a questi numeri. 261 00:12:03,980 --> 00:12:06,880 A tre è davvero buono, e quello che abbiamo generalmente si aspettano all'inizio 262 00:12:06,880 --> 00:12:09,820 del termine è che se stai ricevendo un mucchio di three's-- forse un paio 263 00:12:09,820 --> 00:12:12,540 di fiere, un paio di fours-- o un paio di gruppi di due, un paio di fours-- 264 00:12:12,540 --> 00:12:13,748 questo è un buon punto di partenza. 265 00:12:13,748 --> 00:12:16,320 E finché vediamo un traiettoria verso l'alto nel corso del tempo, 266 00:12:16,320 --> 00:12:18,540 sei in un posto particolarmente buono. 267 00:12:18,540 --> 00:12:20,752 >> La formula che usiamo per cose di peso è essenzialmente 268 00:12:20,752 --> 00:12:22,710 questo per il programma, il che significa solo che noi 269 00:12:22,710 --> 00:12:24,750 dare più peso alla correttezza. 270 00:12:24,750 --> 00:12:27,930 Perché è molto spesso correttezza che prende la maggior parte del tempo. 271 00:12:27,930 --> 00:12:28,760 Fidati di me adesso. 272 00:12:28,760 --> 00:12:31,190 Si find-- almeno in una pset-- che si 273 00:12:31,190 --> 00:12:36,790 spendere il 90% del vostro tempo lavorare il 10% del problema. 274 00:12:36,790 --> 00:12:39,320 >> E tutto funziona sorta di tranne che per uno o due bug, 275 00:12:39,320 --> 00:12:41,570 e questi sono i bug che tenervi a tarda notte. 276 00:12:41,570 --> 00:12:43,380 Questi sono quelli che sorta di fuga voi. 277 00:12:43,380 --> 00:12:45,560 Ma dopo aver dormito su di esso, o partecipare a orari di ufficio 278 00:12:45,560 --> 00:12:48,844 o domande on-line, è quando si arriva a questo obiettivo il 100%, 279 00:12:48,844 --> 00:12:50,760 ed è per questo che il peso correttezza di più. 280 00:12:50,760 --> 00:12:54,102 Progettare un po 'meno, e lo stile un po 'meno di quello. 281 00:12:54,102 --> 00:12:56,060 Ma tieni in stile mind-- è forse il più facile 282 00:12:56,060 --> 00:12:58,890 di questi a mordere come da guida di stile. 283 00:12:58,890 --> 00:13:01,580 >> E ora, una più grave nota sull'onestà accademico. 284 00:13:01,580 --> 00:13:05,000 CS50 ha la sfortunata distinzione di essendo il più grande produttore di Ad Consiglio 285 00:13:05,000 --> 00:13:07,330 casi quasi ogni anno storicamente. 286 00:13:07,330 --> 00:13:11,012 Questo non è perché gli studenti barare in CS50 qualsiasi più di qualsiasi altra classe, 287 00:13:11,012 --> 00:13:13,720 ma a causa della natura del lavoro, il fatto che è elettronico, 288 00:13:13,720 --> 00:13:16,636 il fatto che cerchiamo, e il fatto che siamo scienziati informatici, 289 00:13:16,636 --> 00:13:20,570 Posso dire che siamo purtroppo molto bravi ad individuare esso. 290 00:13:20,570 --> 00:13:22,710 >> Che cosa significa questo in termini reali? 291 00:13:22,710 --> 00:13:24,820 Così, per il programma, La filosofia del corso 292 00:13:24,820 --> 00:13:28,090 davvero non ridursi a essere ragionevole. 293 00:13:28,090 --> 00:13:31,684 C'è questa linea di demarcazione tra fare il proprio lavoro sul proprio 294 00:13:31,684 --> 00:13:34,100 e ottenere un po 'di aiuto ragionevole da un amico, 295 00:13:34,100 --> 00:13:38,020 e addirittura di fare il lavoro per il vostro amico, o l'invio di lui o lei il tuo codice 296 00:13:38,020 --> 00:13:41,080 in modo che lui o lei può semplicemente prendere o prendere in prestito fuori a destra. 297 00:13:41,080 --> 00:13:43,580 E che attraversa la linea di che abbiamo trascinati nella classe. 298 00:13:43,580 --> 00:13:45,410 >> Vedere, il programma in ultima analisi, per le linee 299 00:13:45,410 --> 00:13:48,209 che ci avviciniamo ad essere ragionevole e il comportamento irragionevole, 300 00:13:48,209 --> 00:13:50,000 ma lo fa davvero ebollizione giù all'essenza 301 00:13:50,000 --> 00:13:53,980 del vostro lavoro bisogno di essere il vostro proprio alla fine. 302 00:13:53,980 --> 00:13:56,230 Ora, con quello detto, c'è un euristico. 303 00:13:56,230 --> 00:13:58,980 Perché, come si potrebbe imagine-- dalle ore di ufficio e la grafica 304 00:13:58,980 --> 00:14:01,060 e il video che abbiamo dimostrato così far-- CS50 305 00:14:01,060 --> 00:14:04,530 è infatti destinato a essere il più collaborativo e come cooperativa e sociale come 306 00:14:04,530 --> 00:14:06,450 possibile. 307 00:14:06,450 --> 00:14:08,570 Come collaborativo come è rigoroso. 308 00:14:08,570 --> 00:14:11,314 >> Ma con questo detto, l'euristica, come si vedrà nel programma, 309 00:14:11,314 --> 00:14:12,980 è che quando hai qualche problema. 310 00:14:12,980 --> 00:14:16,470 Hai qualche bug nel codice che si non può risolvere, è ragionevole per voi 311 00:14:16,470 --> 00:14:18,039 per mostrare il vostro codice a qualcun altro. 312 00:14:18,039 --> 00:14:21,080 Un amico anche nella classe, un amico seduto accanto a voi in orario d'ufficio, 313 00:14:21,080 --> 00:14:22,680 o un membro del personale. 314 00:14:22,680 --> 00:14:25,810 Ma essi non possono mostrare il loro codice a voi. 315 00:14:25,810 --> 00:14:27,710 >> In altre parole, un risposta al vostro interrogo 316 00:14:27,710 --> 00:14:29,940 Ho bisogno help-- è non oh, ecco il mio codice. 317 00:14:29,940 --> 00:14:32,440 Date un'occhiata a questo e dedurre da come volete. 318 00:14:32,440 --> 00:14:34,580 Ora, naturalmente, non c'è un modo chiaramente al gioco 319 00:14:34,580 --> 00:14:37,760 questo sistema in cui vi mostrerò il mio codice prima di avere una domanda. 320 00:14:37,760 --> 00:14:40,150 Tu mi mostri il tuo codice prima di avere una domanda. 321 00:14:40,150 --> 00:14:45,870 Ma rivedere il programma per la dettagli più fini di cui questa linea è. 322 00:14:45,870 --> 00:14:50,606 >> Basta dipingere ora il quadro e condividere nel modo più trasparente possibile 323 00:14:50,606 --> 00:14:53,480 dove ci troviamo negli ultimi anni, questo è il numero di casi annuncio di società 324 00:14:53,480 --> 00:14:56,260 che CS50 ha avuto oltre degli ultimi sette anni. 325 00:14:56,260 --> 00:14:58,717 Con 14 casi di questo più recente caduta. 326 00:14:58,717 --> 00:15:01,300 Per quanto riguarda gli studenti coinvolti, era 20 alcuni studenti dispari 327 00:15:01,300 --> 00:15:02,490 questo autunno scorso. 328 00:15:02,490 --> 00:15:05,670 Ci fu un picco di 33 studenti di alcuni anni fa. 329 00:15:05,670 --> 00:15:08,830 Molti dei quali sono purtroppo non è più qui nel campus. 330 00:15:08,830 --> 00:15:13,100 >> Gli studenti coinvolti in percentuale del classe è storicamente spaziato dal 0% 331 00:15:13,100 --> 00:15:17,300 al 5,3%, che è solo per dire questo è ogni anno una sfida. 332 00:15:17,300 --> 00:15:20,390 E verso quel fine, che cosa che vogliamo fare è trasmettere una 333 00:15:20,390 --> 00:15:24,310 che abbiamo appena dd-- FYI-- confrontare a una equità per gli studenti che 334 00:15:24,310 --> 00:15:26,520 sono seguendo la linea di conseguenza. 335 00:15:26,520 --> 00:15:29,620 Facciamo confrontare tutti gli attuali osservazioni nei confronti di tutte le missioni del passato 336 00:15:29,620 --> 00:15:30,840 degli ultimi anni. 337 00:15:30,840 --> 00:15:33,620 >> Sappiamo anche come Google in giro e trovare repository di codice 338 00:15:33,620 --> 00:15:36,360 on-line, forum di discussione online, siti di lavoro online. 339 00:15:36,360 --> 00:15:41,580 Se uno studente può trovare, possiamo sicuramente trovare tanto quanto noi purtroppo facciamo. 340 00:15:41,580 --> 00:15:45,330 Quindi, quello che vedrete nel programma anche se è questa clausola rimpianto. 341 00:15:45,330 --> 00:15:47,500 Posso certamente apprezzare, e tutti noi ha 342 00:15:47,500 --> 00:15:50,870 personale dopo aver fatto il corso come questa, o questa stessa uno nel tempo, 343 00:15:50,870 --> 00:15:53,997 certamente sa cosa vuol dire quando la vita si mette di mezzo quando si ha 344 00:15:53,997 --> 00:15:56,080 una notte tarda deadline-- non solo in questa classe, 345 00:15:56,080 --> 00:15:58,660 ma another-- Quando sei completamente esausto, stressato, 346 00:15:58,660 --> 00:16:00,659 avere un numero eccessivo di altre cose da fare. 347 00:16:00,659 --> 00:16:03,660 Potrai fare ad un certo punto in vita certamente un male, forse in ritardo 348 00:16:03,660 --> 00:16:04,620 decisione notte. 349 00:16:04,620 --> 00:16:06,520 >> Così per il programma, c'è questa clausola, 350 00:16:06,520 --> 00:16:10,629 tale che se entro 72 ore dalla qualche decisione sbagliata, si possiede fino a che 351 00:16:10,629 --> 00:16:12,670 e raggiungere me e uno dei capi del corso 352 00:16:12,670 --> 00:16:14,300 e avremo una conversazione. 353 00:16:14,300 --> 00:16:16,220 Tratteremo le cose internamente nella speranza 354 00:16:16,220 --> 00:16:18,770 essi possano divenire più di un momento didattico o lezione di vita, 355 00:16:18,770 --> 00:16:22,120 e non qualcosa con ramificazioni particolarmente drastiche 356 00:16:22,120 --> 00:16:24,570 come si può vedere nelle tabelle qui. 357 00:16:24,570 --> 00:16:26,540 >> Quindi questo è un tono molto serio. 358 00:16:26,540 --> 00:16:29,960 Fermiamoci per pochi secondi per rompere la tensione. 359 00:16:29,960 --> 00:16:34,442 >> [GIOCO MUSICA] 360 00:16:34,442 --> 00:17:17,768 361 00:17:17,768 --> 00:17:20,250 >> DAVID J. MALAN: Va bene, così come è stato che per un Segue? 362 00:17:20,250 --> 00:17:22,059 Per gli argomenti principali di oggi. 363 00:17:22,059 --> 00:17:23,859 Il primo dei quali è astrazione. 364 00:17:23,859 --> 00:17:26,900 Un altro dei quali sta per essere rappresentazione dei dati, che francamente 365 00:17:26,900 --> 00:17:31,640 è un modo davvero secco di dire come possiamo andare circa risolvere i problemi e di pensare 366 00:17:31,640 --> 00:17:33,250 di risolvere i problemi? 367 00:17:33,250 --> 00:17:37,285 Così hai visto in Scratch, e hai visto forse già in pset1 con C 368 00:17:37,285 --> 00:17:39,930 che non solo è possibile utilizzare funzioni, come printf, 369 00:17:39,930 --> 00:17:42,770 che altre persone a anni passati ha scritto per voi. 370 00:17:42,770 --> 00:17:45,340 È inoltre possibile scrivere le proprie funzioni. 371 00:17:45,340 --> 00:17:48,440 >> E anche se non si potrebbe avere fatto in C, e francamente in pset1 372 00:17:48,440 --> 00:17:51,866 non si ha realmente bisogno di scrivere il vostro propria funzione perché il problem-- 373 00:17:51,866 --> 00:17:53,990 mentre forse scoraggiante a prima glance-- vedrete 374 00:17:53,990 --> 00:17:57,910 in ultima analisi può essere risolto con non tutti che molte righe di codice. 375 00:17:57,910 --> 00:18:01,140 Ma detto questo, in termini di scrivere la propria funzione, 376 00:18:01,140 --> 00:18:03,570 rendersi conto che C dà te questa capacità. 377 00:18:03,570 --> 00:18:06,940 >> Ho intenzione di andare nel codice sorgente di oggi, che è disponibile già on-line, 378 00:18:06,940 --> 00:18:10,900 e ho intenzione di andare avanti e aperto un programma chiamato funzione 0.C, 379 00:18:10,900 --> 00:18:14,620 ed in funzione di zero vedremo un paio di cose. 380 00:18:14,620 --> 00:18:19,160 In prime righe 18 attraverso 23 è la mia funzione principale. 381 00:18:19,160 --> 00:18:22,414 E ora che stiamo cominciando a leggere codice che non stiamo scrivendo al volo, 382 00:18:22,414 --> 00:18:25,080 ma invece ho scritto in anticipo o che in un problema di imposta 383 00:18:25,080 --> 00:18:27,910 potrebbe ricevere avendo stato scritto in anticipo. 384 00:18:27,910 --> 00:18:30,040 Un buon modo per iniziare leggendo il codice di qualcun altro 385 00:18:30,040 --> 00:18:31,400 è cercare la funzione principale. 386 00:18:31,400 --> 00:18:34,420 Capire dove quella voce punto è quello di eseguire il programma, 387 00:18:34,420 --> 00:18:36,580 e poi seguire logicamente da lì. 388 00:18:36,580 --> 00:18:40,190 >> Quindi questo programma apparentemente stampe il vostro nome seguito da due punti. 389 00:18:40,190 --> 00:18:42,490 Utilizziamo quindi GetString dalla libreria CS50 390 00:18:42,490 --> 00:18:46,050 per ottenere una stringa, o una parola o una frase dall'utente sulla tastiera. 391 00:18:46,050 --> 00:18:48,390 E poi c'è questo cosa PrintName qui--. 392 00:18:48,390 --> 00:18:51,420 >> Ora PrintName non è un funzione che viene fornito con C. 393 00:18:51,420 --> 00:18:52,970 Non è in io.h. di serie 394 00:18:52,970 --> 00:18:55,570 Non è in CS50.h. 395 00:18:55,570 --> 00:18:57,880 E 'piuttosto nello stesso file. 396 00:18:57,880 --> 00:19:01,000 Notate se ho scorrere verso il basso una linea bit-- 25 a 27-- 397 00:19:01,000 --> 00:19:05,330 è solo un bel modo di commentare il codice utilizzando le stelle e le barre. 398 00:19:05,330 --> 00:19:07,320 Questo è un multi-linea commento, e questo è solo 399 00:19:07,320 --> 00:19:10,570 la mia descrizione in blu di che cosa fa questa funzione. 400 00:19:10,570 --> 00:19:14,530 >> Perché in linee 28 e 31, Ho scritto un super semplice funzione 401 00:19:14,530 --> 00:19:16,280 il cui nome è PrintName. 402 00:19:16,280 --> 00:19:19,560 Prende quanti argomenti diresti? 403 00:19:19,560 --> 00:19:25,120 Così un argument-- perché c'è una argomento elencato all'interno delle parentesi. 404 00:19:25,120 --> 00:19:27,000 Il tipo di cui è String. 405 00:19:27,000 --> 00:19:30,240 Il che vale a dire PrintName è come questa scatola nera 406 00:19:30,240 --> 00:19:32,910 o una funzione che prende in ingresso una stringa. 407 00:19:32,910 --> 00:19:35,730 >> E il nome di quel String convenientemente saranno Nome. 408 00:19:35,730 --> 00:19:37,840 Non è, non N, ma il nome. 409 00:19:37,840 --> 00:19:41,090 Così che cosa PrintName fare? 410 00:19:41,090 --> 00:19:42,210 E 'bello semplice. 411 00:19:42,210 --> 00:19:45,390 Proprio come una riga di codice per la printf, ma a quanto pare 412 00:19:45,390 --> 00:19:47,950 stampe out "Ciao," così e così. 413 00:19:47,950 --> 00:19:50,070 Qualora il così e così proviene dal ragionamento. 414 00:19:50,070 --> 00:19:52,300 >> Ora, questo non è un enorme innovazione qui. 415 00:19:52,300 --> 00:19:56,710 Davvero, ho preso un programma che potrebbe essere stato scritto con una sola riga di codice 416 00:19:56,710 --> 00:20:00,190 mettendo questo qui, e cambiato a qualcosa 417 00:20:00,190 --> 00:20:04,920 che coinvolge circa sei o sette anni o giù di lì righe di codice fino in fondo qui. 418 00:20:04,920 --> 00:20:08,190 >> Ma è la pratica di un principio noto come astrazione. 419 00:20:08,190 --> 00:20:12,550 Tipo di incapsulare all'interno di un nuovo funzione che ha un nome, e meglio 420 00:20:12,550 --> 00:20:14,590 eppure quel nome letteralmente dice quello che fa. 421 00:20:14,590 --> 00:20:16,880 Voglio dire printf-- che non è particolarmente descrittivo. 422 00:20:16,880 --> 00:20:18,932 Se voglio creare un pezzo di puzzle, o se io 423 00:20:18,932 --> 00:20:21,140 voler creare una funzione che stampa il nome di qualcuno, 424 00:20:21,140 --> 00:20:23,230 la bellezza di fare questo è che posso effettivamente 425 00:20:23,230 --> 00:20:27,170 dare quella funzione un nome che descrive ciò che fa. 426 00:20:27,170 --> 00:20:29,844 >> Ora prende in ingresso che Ho arbitrariamente chiamato nome, 427 00:20:29,844 --> 00:20:32,760 ma anche questo è meravigliosamente descrittivo invece di essere un po 'più 428 00:20:32,760 --> 00:20:36,140 generico come S. E nulla, per ora, significa solo 429 00:20:36,140 --> 00:20:38,330 che questa funzione non lo fa Mi restituire nulla. 430 00:20:38,330 --> 00:20:41,127 Non è come GetString che letteralmente mi porge indietro una stringa 431 00:20:41,127 --> 00:20:43,960 come abbiamo fatto con i pezzi di carta con i tuoi compagni di classe la scorsa settimana, 432 00:20:43,960 --> 00:20:45,990 ma ha solo un effetto collaterale. 433 00:20:45,990 --> 00:20:48,080 Esso stampa qualcosa sullo schermo. 434 00:20:48,080 --> 00:20:53,880 >> Così, alla fine della giornata, se facciamo in funzione-0, ./function-0, 435 00:20:53,880 --> 00:20:55,450 vedremo che chiede il mio nome. 436 00:20:55,450 --> 00:20:58,150 Digito David, e tipi fuori il mio nome. 437 00:20:58,150 --> 00:21:01,080 Se lo faccio di nuovo con Rob, sta andando a dire "Ciao, Rob." 438 00:21:01,080 --> 00:21:04,280 Quindi una semplice idea, ma forse estrapolare da questo mentalmente 439 00:21:04,280 --> 00:21:06,750 che, come i programmi ottengono un po 'più complicato, 440 00:21:06,750 --> 00:21:10,290 e volete scrivere un pezzo di codice e chiamata code-- Invoke 441 00:21:10,290 --> 00:21:13,270 che code-- da alcuni descrittivo nome come PrintName, 442 00:21:13,270 --> 00:21:15,600 C fa ci permettersi questa capacità. 443 00:21:15,600 --> 00:21:17,660 >> Ecco un altro semplice esempio. 444 00:21:17,660 --> 00:21:22,940 Ad esempio, se apro una presentare da oggi chiamato return.c, 445 00:21:22,940 --> 00:21:24,270 accorgo di quello che ho fatto qui. 446 00:21:24,270 --> 00:21:26,330 La maggior parte di questa funzione principale è printf. 447 00:21:26,330 --> 00:21:30,360 Ho arbitrariamente inizializzare un variabile chiamata x il numero 2. 448 00:21:30,360 --> 00:21:34,110 Ho quindi stampare fuori "x è ora % I "passando il valore di x. 449 00:21:34,110 --> 00:21:35,500 Quindi sto solo dicendo quello che è. 450 00:21:35,500 --> 00:21:37,208 >> Ora sono appena audacemente sostenendo con printf. 451 00:21:37,208 --> 00:21:42,050 Sto cubatura che il valore x, e io sono farlo chiamando una funzione 452 00:21:42,050 --> 00:21:45,590 chiamato cubo di passaggio in x come argomento, 453 00:21:45,590 --> 00:21:49,300 e quindi salvare l'output nella variabile stessa, x. 454 00:21:49,300 --> 00:21:51,340 Così sto sovrascrivere il valore di x. 455 00:21:51,340 --> 00:21:53,380 Sto ignorando l' valore di x con qualsiasi 456 00:21:53,380 --> 00:21:56,510 il risultato della chiamata questa funzione cubo è. 457 00:21:56,510 --> 00:21:59,530 E poi ho appena stampare alcune roba birichino qui a dire quello che ho fatto. 458 00:21:59,530 --> 00:22:01,600 >> Allora, qual è allora il cubo? 459 00:22:01,600 --> 00:22:03,510 Notate ciò che è fondamentalmente diverso qui. 460 00:22:03,510 --> 00:22:05,540 Ho dato la funzione un nome come prima. 461 00:22:05,540 --> 00:22:08,270 Ho specificato un nome per un argomento. 462 00:22:08,270 --> 00:22:11,650 Questa volta si chiama n al posto del nome, ma ho potuto chiamare tutto quello che voglio. 463 00:22:11,650 --> 00:22:12,650 Ma questo è diverso. 464 00:22:12,650 --> 00:22:14,080 Questa cosa a sinistra. 465 00:22:14,080 --> 00:22:16,290 In precedenza era cosa parola chiave? 466 00:22:16,290 --> 00:22:16,870 Ragazzi. 467 00:22:16,870 --> 00:22:18,580 Ora è ovviamente int. 468 00:22:18,580 --> 00:22:20,630 >> Così che cosa è forse il take away? 469 00:22:20,630 --> 00:22:24,090 Considerando che significa vuoto sorta di nulla, e che era il caso. 470 00:22:24,090 --> 00:22:25,970 PrintName restituito nulla. 471 00:22:25,970 --> 00:22:27,942 Lo ha fatto qualcosa, ma non mi ha mano indietro 472 00:22:27,942 --> 00:22:30,650 qualcosa che ho potuto mettere in lato sinistro di un segno di uguale 473 00:22:30,650 --> 00:22:32,460 come ho fatto qui sulla linea 22. 474 00:22:32,460 --> 00:22:36,780 >> Quindi, se io dico in sulla linea 30, che cosa è che, probabilmente, implica 475 00:22:36,780 --> 00:22:38,610 su ciò che cube fa per me? 476 00:22:38,610 --> 00:22:41,110 Sì? 477 00:22:41,110 --> 00:22:42,310 Restituisce un numero intero. 478 00:22:42,310 --> 00:22:44,590 Così mi porge indietro, per esempio, un pezzo di carta 479 00:22:44,590 --> 00:22:46,580 su cui ha scritto la risposta. 480 00:22:46,580 --> 00:22:50,130 2 cubetti, o 3 cubetti, o 4 cubed-- qualunque cosa ho passato in, 481 00:22:50,130 --> 00:22:51,540 e come ho implementare questo? 482 00:22:51,540 --> 00:22:54,810 Beh, basta n volte n volte n è come potrei cubo un valore. 483 00:22:54,810 --> 00:22:57,110 Quindi, di nuovo, super semplice idea, ma dimostrativo 484 00:22:57,110 --> 00:23:00,100 ora come possiamo scrivere funzioni che in realtà ci aveva indietro 485 00:23:00,100 --> 00:23:02,380 valori che potrebbero essere di interesse. 486 00:23:02,380 --> 00:23:05,740 >> Vediamo un ultimo esempio qui chiamato funzione one. 487 00:23:05,740 --> 00:23:08,530 In questo esempio, si inizia per ottenere più convincente. 488 00:23:08,530 --> 00:23:12,400 Quindi in funzione di uno, questo Avviso program-- definitiva 489 00:23:12,400 --> 00:23:14,920 chiama una funzione chiamata GetPositiveInt. 490 00:23:14,920 --> 00:23:17,800 GetPositiveInt non è un funzione nella libreria CS50, 491 00:23:17,800 --> 00:23:20,400 ma abbiamo deciso che vorrebbe di esistere. 492 00:23:20,400 --> 00:23:24,550 >> Quindi, se scorriamo più avanti nel file, Noto come sono andato circa l'attuazione 493 00:23:24,550 --> 00:23:26,560 ottenere int positivo, e io dire che è più convincente 494 00:23:26,560 --> 00:23:28,992 perché questo è un decente numero di linee di codice. 495 00:23:28,992 --> 00:23:30,700 Non è solo una stupida piccolo programma giocattolo. 496 00:23:30,700 --> 00:23:33,870 In realtà ha qualche controllo degli errori e fare qualcosa di più utile. 497 00:23:33,870 --> 00:23:38,470 >> Quindi, se non avete visto il walkthrough video che abbiamo incorporati in pset1, 498 00:23:38,470 --> 00:23:42,350 sa che questo è un tipo di ciclo in C, simile nello spirito 499 00:23:42,350 --> 00:23:44,270 per i tipi di cose Scratch può fare. 500 00:23:44,270 --> 00:23:46,320 E fare dice fare questo. 501 00:23:46,320 --> 00:23:47,500 Stampa questo fuori. 502 00:23:47,500 --> 00:23:51,860 Poi andare avanti e ottenere n-- ottenere un int e conservarla in n, 503 00:23:51,860 --> 00:23:55,760 e continuare a fare questo ancora e ancora e nuovamente finché n è minore di uno. 504 00:23:55,760 --> 00:23:58,720 >> Così n sta per essere meno di un solo se l'umano non sta cooperando. 505 00:23:58,720 --> 00:24:01,980 Se lui o lei sta scrivendo a 0 o -1 o -50, 506 00:24:01,980 --> 00:24:04,790 questo ciclo sta per mantenere eseguire più e più volte. 507 00:24:04,790 --> 00:24:07,549 E infine notato, ho semplicemente restituire il valore. 508 00:24:07,549 --> 00:24:09,590 Così ora abbiamo una funzione che sarebbe stato bello 509 00:24:09,590 --> 00:24:14,040 se CS50 attuerebbe in CS50.h e CS50.c per te, 510 00:24:14,040 --> 00:24:16,520 ma qui possiamo ora implementare questo noi stessi. 511 00:24:16,520 --> 00:24:19,230 >> Ma due commenti su alcuni dettagli importanti. 512 00:24:19,230 --> 00:24:24,390 Tra-- perché ho dichiaro int n, pensi che, sulla linea 29 513 00:24:24,390 --> 00:24:27,139 invece di fare questo qui, che è 514 00:24:27,139 --> 00:24:28,930 più coerente con quello che abbiamo fatto la scorsa settimana? 515 00:24:28,930 --> 00:24:29,430 Sì? 516 00:24:29,430 --> 00:24:34,485 517 00:24:34,485 --> 00:24:35,110 Un buon pensiero. 518 00:24:35,110 --> 00:24:37,080 Quindi, se dovessimo mettere qui, è come se noi 519 00:24:37,080 --> 00:24:39,110 mantenere dichiarando ancora e ancora. 520 00:24:39,110 --> 00:24:42,000 Che in sé e per sé è non problematico, di per sé, 521 00:24:42,000 --> 00:24:43,940 perché abbiamo solo bisogno il valore di una volta e poi 522 00:24:43,940 --> 00:24:45,330 stiamo andando a ottenere un nuovo uno comunque. 523 00:24:45,330 --> 00:24:45,940 Ma un buon pensiero. 524 00:24:45,940 --> 00:24:46,440 Sì? 525 00:24:46,440 --> 00:24:52,770 526 00:24:52,770 --> 00:24:53,330 >> Chiudi. 527 00:24:53,330 --> 00:24:59,030 Quindi perché ho dichiarato n su linea 29 al di fuori del ciclo, 528 00:24:59,030 --> 00:25:01,390 è accessibile in tutta questa intera funzione. 529 00:25:01,390 --> 00:25:05,400 Non le altre funzioni, perché n è ancora all'interno di questi ricci 530 00:25:05,400 --> 00:25:06,470 bretelle qui. 531 00:25:06,470 --> 00:25:07,940 So-- sicuro. 532 00:25:07,940 --> 00:25:12,430 533 00:25:12,430 --> 00:25:12,940 >> Esattamente. 534 00:25:12,940 --> 00:25:14,356 Quindi questo è ancora di più per il punto. 535 00:25:14,356 --> 00:25:18,600 Se invece dichiarato n proprio qui sulla linea 32, 536 00:25:18,600 --> 00:25:22,340 è problematico perché congettura dove altro ho bisogno di accedervi? 537 00:25:22,340 --> 00:25:25,620 Nella riga 34, e la semplice regola empirica è 538 00:25:25,620 --> 00:25:30,060 che è possibile utilizzare solo una variabile all'interno dei più recenti parentesi graffe 539 00:25:30,060 --> 00:25:31,420 in cui è dichiarato. 540 00:25:31,420 --> 00:25:35,230 >> Purtroppo, la linea 34 è una linea troppo tardi, 541 00:25:35,230 --> 00:25:38,560 perché ho già chiuso la parentesi graffa sulla linea 33 542 00:25:38,560 --> 00:25:41,220 che corrisponde al parentesi graffa sulla linea 30. 543 00:25:41,220 --> 00:25:44,180 E quindi questo è un modo di dire che questa variabile int è ambito, 544 00:25:44,180 --> 00:25:46,970 per così dire, a solo all'interno di quelle parentesi graffe. 545 00:25:46,970 --> 00:25:48,910 Semplicemente non esiste al di fuori di essi. 546 00:25:48,910 --> 00:25:51,580 >> Quindi, in effetti, se faccio questo sbagliato, mi permetta di salvare il codice 547 00:25:51,580 --> 00:25:53,530 come è-- erroneamente scritto. 548 00:25:53,530 --> 00:25:57,990 Lasciami andare avanti e fanno funzione-1, e l'errore notice--. 549 00:25:57,990 --> 00:26:03,502 L'uso del sommerso identificatore n sulla linea 35, che è proprio qui. 550 00:26:03,502 --> 00:26:05,210 E se noi Scroll Up ulteriormente, un altro. 551 00:26:05,210 --> 00:26:08,750 L'uso di sommerso identificatore n on line 34. 552 00:26:08,750 --> 00:26:11,200 >> Quindi il compilatore, Clang, sta notando che solo 553 00:26:11,200 --> 00:26:13,720 non esiste, anche se chiaramente è lì visivamente. 554 00:26:13,720 --> 00:26:16,090 Così un semplice correzione sta dichiarando lì. 555 00:26:16,090 --> 00:26:18,790 >> Ora vorrei scorrere fino a all'inizio del file. 556 00:26:18,790 --> 00:26:21,080 Che cosa salta fuori a voi come essendo un po 'diverso 557 00:26:21,080 --> 00:26:23,070 dalla roba abbiamo guardato la settimana scorsa? 558 00:26:23,070 --> 00:26:26,990 Non solo mi hanno nome, non solo fare Ho alcuni forte intende cima, 559 00:26:26,990 --> 00:26:29,340 Ho qualcosa che sono chiamando un prototipo. 560 00:26:29,340 --> 00:26:36,100 Ora che sembra terribilmente simile a quello che abbiamo appena visto un momento fa sulla linea 27. 561 00:26:36,100 --> 00:26:39,230 >> Quindi cerchiamo di dedurre da un diverso messaggio di errore perché ho fatto questo. 562 00:26:39,230 --> 00:26:42,050 Lasciami andare avanti e eliminare queste righe lì. 563 00:26:42,050 --> 00:26:44,240 E così non sappiamo nulla prototipo. 564 00:26:44,240 --> 00:26:45,430 Remake questo file. 565 00:26:45,430 --> 00:26:46,890 Effettuare una funzione. 566 00:26:46,890 --> 00:26:48,090 E ora, accidenti, quattro errori. 567 00:26:48,090 --> 00:26:50,220 Facciamo scorrere fino alla prima. 568 00:26:50,220 --> 00:26:55,070 >> Dichiarazione implicita di funzione ottenere int positivo è valido in C99. 569 00:26:55,070 --> 00:26:57,780 C99 significa solo 1999 versione del linguaggio 570 00:26:57,780 --> 00:26:59,710 C, che è quello che stiamo effettivamente usando. 571 00:26:59,710 --> 00:27:01,050 Che cosa significa questo? 572 00:27:01,050 --> 00:27:05,250 Beh C-- e più specificamente C compilers-- sono programmi abbastanza stupidi. 573 00:27:05,250 --> 00:27:07,420 Sanno solo ciò che hai detto loro, e questo è 574 00:27:07,420 --> 00:27:08,960 in realtà tematica della scorsa settimana. 575 00:27:08,960 --> 00:27:12,910 >> Il problema è che se vado sull'implementazione nome qui, 576 00:27:12,910 --> 00:27:17,640 e chiamo una funzione chiamata GetPositiveInt qui sulla linea 20, 577 00:27:17,640 --> 00:27:22,520 tale funzione non tecnicamente non esistere fino a quando il compilatore vede linea 27. 578 00:27:22,520 --> 00:27:25,450 Purtroppo, il compilatore è fare le cose in alto, in basso, a sinistra, a destra, 579 00:27:25,450 --> 00:27:29,580 così perché non ha visto la implementazione di GetPositiveInt, 580 00:27:29,580 --> 00:27:32,400 ma si vede voi cercando usarlo qui, 581 00:27:32,400 --> 00:27:35,810 è solo andare a bail-- urlare a con un errore message-- forse 582 00:27:35,810 --> 00:27:38,440 criptico, e in realtà non compilare il file. 583 00:27:38,440 --> 00:27:41,940 >> Così un cosiddetto prototipo up qui è certamente ridondante. 584 00:27:41,940 --> 00:27:47,870 Letteralmente, sono andato qui e ho copiato e incollato questo, e l'ho messo qui. 585 00:27:47,870 --> 00:27:51,020 Void sarebbe più corretto, quindi dovremo letteralmente copia e incolla questa volta. 586 00:27:51,020 --> 00:27:52,854 Ho letteralmente copiato e incollato esso. 587 00:27:52,854 --> 00:27:54,270 In realtà proprio come come una briciola di pane. 588 00:27:54,270 --> 00:27:56,260 >> Un piccolo indizio per il compilatore. 589 00:27:56,260 --> 00:27:58,860 Non so che cosa questo fa ancora, ma sto promettendo a voi 590 00:27:58,860 --> 00:28:00,260 che esisterà casualmente. 591 00:28:00,260 --> 00:28:04,010 Ed è per questo che questo line-- in linea 16-- termina con un punto e virgola. 592 00:28:04,010 --> 00:28:05,486 E 'superfluo alla progettazione. 593 00:28:05,486 --> 00:28:05,986 Sì? 594 00:28:05,986 --> 00:28:11,340 595 00:28:11,340 --> 00:28:14,360 >> Se non si collega la vostra biblioteca a the-- oh, bella domanda. 596 00:28:14,360 --> 00:28:17,350 Sharp include inclusioni di file di intestazione. 597 00:28:17,350 --> 00:28:20,040 Necessità di essere-- dovrebbe quasi essere sempre al top 598 00:28:20,040 --> 00:28:23,270 del file per un similar-- per esattamente la stessa ragione, sì. 599 00:28:23,270 --> 00:28:26,430 Perché nella norma io.h è letteralmente una linea 600 00:28:26,430 --> 00:28:30,560 risultati simili, ma con la parola printf, e con i suoi argomenti e il tipo restituito. 601 00:28:30,560 --> 00:28:33,310 E così facendo tagliente includono up qui, quello che stai facendo letteralmente 602 00:28:33,310 --> 00:28:36,380 sta copiando e incollando il contenuto qualcun altro ha scritto sulla parte superiore. 603 00:28:36,380 --> 00:28:39,660 In tal modo cluing il codice per il fatto che esistono tali funzioni. 604 00:28:39,660 --> 00:28:40,160 Sì? 605 00:28:40,160 --> 00:28:47,520 606 00:28:47,520 --> 00:28:48,260 >> Assolutamente. 607 00:28:48,260 --> 00:28:51,690 Così un molto intelligente e corretta soluzione sarebbe, sai una cosa? 608 00:28:51,690 --> 00:28:53,760 Io non so quello che un prototipo è, ma so 609 00:28:53,760 --> 00:28:56,390 se capisco che C è solo muto e ripensa cima a fondo. 610 00:28:56,390 --> 00:28:57,820 Bene diamo ciò che vuole. 611 00:28:57,820 --> 00:29:01,650 Tagliamo quel codice, incollarlo su top, e ora spingere principale in basso. 612 00:29:01,650 --> 00:29:03,470 Anche questo risolverebbe il problema. 613 00:29:03,470 --> 00:29:07,409 >> Ma si potrebbe facilmente venire con uno scenario in cui la necessità di chiamare B, 614 00:29:07,409 --> 00:29:10,075 e magari B richiama ad A. Questo è qualcosa che si chiama ricorsione, 615 00:29:10,075 --> 00:29:11,370 e torneremo a questo. 616 00:29:11,370 --> 00:29:13,911 E può o non può essere un buon cosa, ma si può sicuramente 617 00:29:13,911 --> 00:29:15,110 rompere questa soluzione. 618 00:29:15,110 --> 00:29:17,690 >> E inoltre, vorrei rivendicare stilisticamente, 619 00:29:17,690 --> 00:29:20,760 soprattutto quando i vostri programmi diventare questo lungo e così a lungo, 620 00:29:20,760 --> 00:29:23,064 è solo super conveniente mettere principale in cima 621 00:29:23,064 --> 00:29:25,730 perché è la cosa più programmatori stanno andando a preoccuparsi. 622 00:29:25,730 --> 00:29:28,150 E quindi è un po 'più pulito, probabilmente, a farlo nel modo 623 00:29:28,150 --> 00:29:30,380 Originariamente ho fatto con un prototipo anche 624 00:29:30,380 --> 00:29:33,396 anche se sembra un po ' ridondante a prima vista. 625 00:29:33,396 --> 00:29:33,895 Sì? 626 00:29:33,895 --> 00:29:36,472 627 00:29:36,472 --> 00:29:37,680 Siamo spiacenti, si può dire che più forte? 628 00:29:37,680 --> 00:29:45,650 629 00:29:45,650 --> 00:29:49,580 >> Se si cambia la posizione del l'attuazione e il prototipo? 630 00:29:49,580 --> 00:29:51,270 Quindi questa è una buona domanda. 631 00:29:51,270 --> 00:29:53,780 Se si ri-dichiarare questo in giù qui, vediamo cosa succede. 632 00:29:53,780 --> 00:29:55,530 Quindi, se ho messo questo giù qui, stai dicendo. 633 00:29:55,530 --> 00:29:57,860 634 00:29:57,860 --> 00:29:58,360 Oh, mi dispiace. 635 00:29:58,360 --> 00:29:58,859 Louder? 636 00:29:58,859 --> 00:30:02,000 637 00:30:02,000 --> 00:30:04,011 Ancora più forte. 638 00:30:04,011 --> 00:30:04,760 Oh, buona domanda. 639 00:30:04,760 --> 00:30:05,860 Sarebbe invalidare la funzione? 640 00:30:05,860 --> 00:30:08,901 Sai, dopo tutti questi anni, ho hanno mai messo un prototipo in seguito. 641 00:30:08,901 --> 00:30:13,810 Allora, facciamo fare la funzione-1 dopo aver fatto questo. 642 00:30:13,810 --> 00:30:15,279 >> [Borbottando] 643 00:30:15,279 --> 00:30:16,320 DAVID J. MALAN: Oh, aspetta. 644 00:30:16,320 --> 00:30:17,944 Dobbiamo ancora mettere tutto sulla parte superiore. 645 00:30:17,944 --> 00:30:21,400 Allora, facciamo questo qui, se sono comprendere correttamente la tua domanda. 646 00:30:21,400 --> 00:30:24,700 Sto mettendo tutto, compreso il prototipo sopra principale, 647 00:30:24,700 --> 00:30:28,180 ma sto mettendo il prototipo sotto l'attuazione. 648 00:30:28,180 --> 00:30:33,190 >> Quindi se faccio uno, sto diventando indietro un error-- inutilizzato variabile n. 649 00:30:33,190 --> 00:30:37,280 650 00:30:37,280 --> 00:30:37,860 Oh, lì. 651 00:30:37,860 --> 00:30:38,360 Grazie. 652 00:30:38,360 --> 00:30:39,430 Vediamo, ci liberiamo di questa. 653 00:30:39,430 --> 00:30:41,304 Questo è un bug diverso, quindi cerchiamo di ignorare che. 654 00:30:41,304 --> 00:30:43,910 Facciamo davvero rifare rapidamente questo. 655 00:30:43,910 --> 00:30:48,100 >> OK, quindi non argomentazione dati utilizzato per formato String 656 00:30:48,100 --> 00:30:52,310 n-- oh, ecco perché Ho cambiato a questi qui. 657 00:30:52,310 --> 00:30:55,885 Va bene, sappiamo quale sia la risposta sta andando a-- tutto bene, qui andiamo. 658 00:30:55,885 --> 00:31:00,560 Ah, grazie per il positivo. 659 00:31:00,560 --> 00:31:03,430 Va bene, io risolverà questo codice after-- ignorare questo particolare bug 660 00:31:03,430 --> 00:31:08,300 poiché questo era-- funziona è la risposta. 661 00:31:08,300 --> 00:31:11,560 >> Quindi non sovrascrive quello che hai appena fatto. 662 00:31:11,560 --> 00:31:14,800 Ho il sospetto che il compilatore è scritto in modo tale 663 00:31:14,800 --> 00:31:18,420 che ignora il tuo prototipo perché il corpo, per così dire, 664 00:31:18,420 --> 00:31:20,922 della funzione ha già stato attuato più in alto. 665 00:31:20,922 --> 00:31:23,380 Avrei dovuto consultare realtà il manuale del compilatore 666 00:31:23,380 --> 00:31:26,171 per capire se c'è qualche altra implicitamente, ma a prima vista 667 00:31:26,171 --> 00:31:29,290 solo provando e sperimentando, non sembra esserci alcun impatto. 668 00:31:29,290 --> 00:31:30,730 Buona domanda. 669 00:31:30,730 --> 00:31:33,660 >> Quindi cerchiamo di andare avanti adesso, muovendo lontano da effetti collaterali che 670 00:31:33,660 --> 00:31:36,660 sono funzioni che fanno qualcosa di simile visivamente sullo schermo con printf, 671 00:31:36,660 --> 00:31:38,090 ma non restituiscono un valore. 672 00:31:38,090 --> 00:31:41,550 E funzioni che sono di ritorno valori come abbiamo appena visto alcuni. 673 00:31:41,550 --> 00:31:45,350 Abbiamo già visto questa nozione di portata, e vedremo questo nuovo e di nuovo. 674 00:31:45,350 --> 00:31:47,210 Ma per ora, di nuovo, utilizzare la regola del pollice 675 00:31:47,210 --> 00:31:51,410 che una variabile può essere utilizzata solo all'interno della più recente apertura 676 00:31:51,410 --> 00:31:54,350 e parentesi graffe chiuse come abbiamo vide in quel particolare esempio. 677 00:31:54,350 --> 00:31:56,910 >> E come lei ha sottolineato, c'è un ability-- 678 00:31:56,910 --> 00:32:00,040 si potrebbe risolvere alcuni di questi problemi mettendo una variabile globale 679 00:32:00,040 --> 00:32:01,290 in cima di un file. 680 00:32:01,290 --> 00:32:03,630 Ma in quasi tutti i casi vorremmo disapprovare che, 681 00:32:03,630 --> 00:32:06,170 e anzi nemmeno andare in questa soluzione per ora. 682 00:32:06,170 --> 00:32:09,890 Quindi per ora, l'asporto è che variabili hanno questa nozione di portata. 683 00:32:09,890 --> 00:32:13,430 >> Ma ora diamo un'occhiata a un altro via secca effettivamente cercando 684 00:32:13,430 --> 00:32:15,810 a un certo piuttosto interessante dettagli di implementazione. 685 00:32:15,810 --> 00:32:17,810 Come possiamo rappresentare le informazioni. 686 00:32:17,810 --> 00:32:20,370 E abbiamo già esaminato questo nella prima settimana di classe. 687 00:32:20,370 --> 00:32:23,320 Guardando binari, e ricordare a noi stessi di decimali. 688 00:32:23,320 --> 00:32:28,310 >> Ma ricorderete dalla scorsa settimana che C ha diversi tipi di dati e grappoli più, 689 00:32:28,310 --> 00:32:30,600 ma quelli più utili per ora potrebbe essere questi. 690 00:32:30,600 --> 00:32:36,030 Un char, o carattere, il che accade di essere un byte, o otto bit totale. 691 00:32:36,030 --> 00:32:40,060 E questo è per dire che la dimensione di un char è un solo byte. 692 00:32:40,060 --> 00:32:45,370 Un byte è otto bit, quindi questo significa che possiamo rappresentare il numero di caratteri. 693 00:32:45,370 --> 00:32:47,320 Quante lettere o simboli sulla tastiera 694 00:32:47,320 --> 00:32:49,210 se abbiamo un byte o otto bit. 695 00:32:49,210 --> 00:32:51,546 Ripensate alla settimana a zero. 696 00:32:51,546 --> 00:32:53,420 Se si dispone di otto bit, quanti valori totali 697 00:32:53,420 --> 00:32:55,503 si può rappresentare con modelli di zero e uno? 698 00:32:55,503 --> 00:32:58,170 699 00:32:58,170 --> 00:33:00,260 Tra-- più di questo. 700 00:33:00,260 --> 00:33:03,490 Quindi, 256 in totale, se si iniziare il conteggio da zero. 701 00:33:03,490 --> 00:33:07,120 Quindi, se avete otto bits-- quindi se avuto le nostre lampadine binari qui di nuovo, 702 00:33:07,120 --> 00:33:12,180 potremmo trasformare quelle lampadine su e si spegne in uno qualsiasi dei 256 modelli unici. 703 00:33:12,180 --> 00:33:13,640 >> Ora, questo è un po 'problematico. 704 00:33:13,640 --> 00:33:16,857 Non tanto per l'inglese e lingue romanze, ma certamente 705 00:33:16,857 --> 00:33:19,190 quando si introduce, per esempio, lingue asiatiche, che 706 00:33:19,190 --> 00:33:22,580 sono di gran lunga più simboli che come 26 lettere dell'alfabeto. 707 00:33:22,580 --> 00:33:24,390 Abbiamo effettivamente aver bisogno più di un byte. 708 00:33:24,390 --> 00:33:28,240 E per fortuna in ultimi anni ha società 709 00:33:28,240 --> 00:33:31,040 altri standard adottati che utilizzano più di un byte per carica. 710 00:33:31,040 --> 00:33:34,210 >> Ma per ora in C, il valore predefinito è solo un byte o otto bit. 711 00:33:34,210 --> 00:33:38,195 Un numero intero, nel frattempo, è di quattro byte, altrimenti noto come 32 bit. 712 00:33:38,195 --> 00:33:41,320 Il che significa che cosa è il più grande possibile numero possiamo rappresentare con un int 713 00:33:41,320 --> 00:33:41,820 a quanto pare? 714 00:33:41,820 --> 00:33:44,426 715 00:33:44,426 --> 00:33:45,050 Con un miliardo. 716 00:33:45,050 --> 00:33:46,760 Quindi è quattro miliardi di dare o prendere. 717 00:33:46,760 --> 00:33:49,840 2 alla potenza 32th, se non si assumono alcuna numeri negativi 718 00:33:49,840 --> 00:33:52,530 e basta usare tutti positivi numeri, si tratta di quattro miliardi 719 00:33:52,530 --> 00:33:53,730 dare o prendere possibilità. 720 00:33:53,730 --> 00:33:57,890 Un galleggiante, invece, è un tipo diverso del tipo di dati in C. E 'ancora un numero, 721 00:33:57,890 --> 00:33:58,990 ma è un numero reale. 722 00:33:58,990 --> 00:34:00,660 Qualcosa con un punto decimale. 723 00:34:00,660 --> 00:34:03,000 E si scopre che C utilizza anche quattro byte 724 00:34:03,000 --> 00:34:05,340 per rappresentare valori in virgola mobile. 725 00:34:05,340 --> 00:34:09,420 >> Purtroppo quanti galleggiante valori dei punti ci sono nel mondo? 726 00:34:09,420 --> 00:34:11,582 Quanti numeri reali ci sono? 727 00:34:11,582 --> 00:34:13,540 C'è un infinito numero, e per questo 728 00:34:13,540 --> 00:34:15,164 c'è un numero infinito di interi. 729 00:34:15,164 --> 00:34:18,070 Quindi siamo già tipo di scavare noi stessi un buco qui. 730 00:34:18,070 --> 00:34:21,780 Per cui a quanto pare in computers-- a meno programmi scritti in C su them-- 731 00:34:21,780 --> 00:34:24,110 può contare solo su quanto quattro miliardi di prendere o lasciare, 732 00:34:24,110 --> 00:34:26,260 e valori in virgola mobile può solo apparentemente 733 00:34:26,260 --> 00:34:28,330 avere una certa quantità finita di precisione. 734 00:34:28,330 --> 00:34:30,810 Solo così tante cifre dopo il loro punto decimale. 735 00:34:30,810 --> 00:34:32,822 >> Perché, ovviamente, se hai solo 32 bit, 736 00:34:32,822 --> 00:34:36,030 Non so come faremo ad andare su rappresentando reale numbers-- probabilmente 737 00:34:36,030 --> 00:34:37,409 con diversi tipi di modelli. 738 00:34:37,409 --> 00:34:40,030 Ma c'è sicuramente finita numero di tali modelli, 739 00:34:40,030 --> 00:34:41,830 ecco, anche questo è problematico. 740 00:34:41,830 --> 00:34:43,710 >> Ora siamo in grado di evitare un po 'il problema. 741 00:34:43,710 --> 00:34:45,710 Se non si utilizza un galleggiante, si potrebbe usare un doppio 742 00:34:45,710 --> 00:34:50,230 in C, che ti dà otto byte, che è modo più modelli possibili di zeri 743 00:34:50,230 --> 00:34:50,730 e quelli. 744 00:34:50,730 --> 00:34:55,199 Ma è ancora finita, che sta ad essere problematico se si scrive software 745 00:34:55,199 --> 00:34:57,670 per la grafica o per la fantasia formule matematiche. 746 00:34:57,670 --> 00:35:00,410 Così si potrebbe effettivamente desidera a contare più grande di questo. 747 00:35:00,410 --> 00:35:05,640 Un named-- lunga long-- stupidamente è anche otto byte, o 64 bit, 748 00:35:05,640 --> 00:35:10,260 e questo è il doppio del tempo come un int, ed è un valore intero lungo. 749 00:35:10,260 --> 00:35:15,655 >> Fun fact-- se un int è di quattro byte, Quanto dura un lungo in C tipicamente? 750 00:35:15,655 --> 00:35:18,290 751 00:35:18,290 --> 00:35:21,560 Inoltre quattro byte, ma un lunga lunga è di otto byte, 752 00:35:21,560 --> 00:35:23,050 e questo è per ragioni storiche. 753 00:35:23,050 --> 00:35:26,450 >> Ma il takeaway ora è solo che i dati ha 754 00:35:26,450 --> 00:35:29,625 di essere rappresentati in un computer-- che è un dispositivo fisico con l'elettricità, 755 00:35:29,625 --> 00:35:32,190 è generalmente di guida questi zeri e ones-- 756 00:35:32,190 --> 00:35:34,320 con quantità limitate di precisione. 757 00:35:34,320 --> 00:35:35,620 Allora qual è il problema allora? 758 00:35:35,620 --> 00:35:37,480 >> Beh, c'è un problema di integer overflow. 759 00:35:37,480 --> 00:35:39,780 Non solo in C, ma in computer in generale. 760 00:35:39,780 --> 00:35:42,590 Per esempio, se questo è un byte vale un bit-- 761 00:35:42,590 --> 00:35:45,120 quindi se questo è di otto bit-- tutto di cui sono il numero uno. 762 00:35:45,120 --> 00:35:47,300 Che numero è questo che rappresenta se assumiamo 763 00:35:47,300 --> 00:35:50,730 si tratta di tutti i valori positivi in ​​binario? 764 00:35:50,730 --> 00:35:54,410 >> 255, e non è 256, perché zero è il numero più basso. 765 00:35:54,410 --> 00:35:56,760 Quindi 255 è il più alto uno, ma il problema 766 00:35:56,760 --> 00:36:00,330 è Suppongo che volevo incrementare questa variabile che 767 00:36:00,330 --> 00:36:04,030 utilizza otto bit in totale se voglio incrementarlo. 768 00:36:04,030 --> 00:36:07,160 >> Beh, non appena aggiungo un uno a tutti questi, 769 00:36:07,160 --> 00:36:10,500 si può forse immaginare visually-- solo come portare l'uno utilizzando decimals-- 770 00:36:10,500 --> 00:36:12,300 qualcosa che sta andando a scorrere verso sinistra. 771 00:36:12,300 --> 00:36:15,590 E in effetti, se aggiungo il numero uno di questo, ciò che accade in binario 772 00:36:15,590 --> 00:36:17,670 è che trabocca di nuovo a zero. 773 00:36:17,670 --> 00:36:21,730 >> Quindi, se solo non use-- un int, ma un singolo byte per contare numeri interi 774 00:36:21,730 --> 00:36:27,170 in un programma, da default-- appena si arriva a 250, 251, 252, 253, 254, 775 00:36:27,170 --> 00:36:32,710 255-- 0 viene dopo 255, che non quello che è probabilmente 776 00:36:32,710 --> 00:36:34,790 un utente sta per aspettarsi. 777 00:36:34,790 --> 00:36:39,620 >> Ora, nel frattempo in virgola mobile mondo, anche voi avete un problema simile. 778 00:36:39,620 --> 00:36:42,670 Non tanto con la più grande number-- anche se questo è ancora un problema. 779 00:36:42,670 --> 00:36:45,360 Ma con la quantità di precisione che si può rappresentare. 780 00:36:45,360 --> 00:36:49,490 Quindi diamo un'occhiata a questo esempio anche qui da code-- fonte di oggi 781 00:36:49,490 --> 00:36:52,070 float-0.c. 782 00:36:52,070 --> 00:36:54,280 >> E notate che è un super semplice programma che 783 00:36:54,280 --> 00:36:56,580 dovrebbe apparentemente stampare che valore? 784 00:36:56,580 --> 00:37:00,777 785 00:37:00,777 --> 00:37:04,110 Cosa scommettere che questo sta per stampare anche se c'è un po 'di nuova sintassi 786 00:37:04,110 --> 00:37:05,540 qui? 787 00:37:05,540 --> 00:37:06,700 Così si spera 0.1. 788 00:37:06,700 --> 00:37:10,000 Quindi l'equivalente di un decimo perché sto facendo 1 diviso per 10. 789 00:37:10,000 --> 00:37:12,430 Sto memorizzare la risposta in una variabile denominata f. 790 00:37:12,430 --> 00:37:15,850 Tale variabile è di tipo float, che è una parola chiave ho appena proposto esistito. 791 00:37:15,850 --> 00:37:18,910 >> Noi non abbiamo visto prima, ma questo è una specie di un modo pulito di printf 792 00:37:18,910 --> 00:37:22,110 per specificare quante cifre si voglio vedere dopo un punto decimale. 793 00:37:22,110 --> 00:37:25,020 Quindi questa notazione significa semplicemente che qui è un segnaposto. 794 00:37:25,020 --> 00:37:27,900 E 'per un virgola mobile valore, e oh, a proposito, 795 00:37:27,900 --> 00:37:31,389 mostrare con il punto decimale con un numero dopo il punto decimale. 796 00:37:31,389 --> 00:37:33,180 Ecco, questo è il numero di cifre significative, 797 00:37:33,180 --> 00:37:34,650 per così dire, che si potrebbe desiderare. 798 00:37:34,650 --> 00:37:40,450 >> Quindi lasciami andare avanti e fare rendere float-0, ./float-0, 799 00:37:40,450 --> 00:37:46,660 e apparentemente 1 diviso 10 è 0,0. 800 00:37:46,660 --> 00:37:47,760 Ora, perché è questo? 801 00:37:47,760 --> 00:37:51,380 >> Bene ancora una volta, il computer sta prendendo me letteralmente, e ho scritto 1 802 00:37:51,380 --> 00:37:56,680 e ho scritto 10, e prendere una congettura che cosa è il tipo di dati assunta per quei due 803 00:37:56,680 --> 00:37:58,440 valori? 804 00:37:58,440 --> 00:38:00,970 Un int, è tecnicamente qualcosa di un po 'diverso. 805 00:38:00,970 --> 00:38:04,150 È tipicamente un lungo, ma è in ultima analisi, un valore integrale. 806 00:38:04,150 --> 00:38:06,030 Non è un valore in virgola mobile. 807 00:38:06,030 --> 00:38:09,456 >> Il che vale a dire che se questo è un int e questo è un int, 808 00:38:09,456 --> 00:38:11,830 il problema è che il computer non ha la capacità 809 00:38:11,830 --> 00:38:13,680 per archiviare anche questo punto decimale. 810 00:38:13,680 --> 00:38:16,430 Così, quando si fa 1 diviso da 10 utilizzando numeri interi 811 00:38:16,430 --> 00:38:20,950 sia per il numeratore e il denominatore, la risposta dovrebbe essere 0.1. 812 00:38:20,950 --> 00:38:24,930 Ma il computer-- perché quelli sono integers-- 813 00:38:24,930 --> 00:38:27,430 non sa cosa fare con il 0.1. 814 00:38:27,430 --> 00:38:30,010 >> Così che cosa sta chiaramente facendo? 815 00:38:30,010 --> 00:38:33,120 E 'solo buttare via, e quello che sto vedendo in ultima analisi, 816 00:38:33,120 --> 00:38:38,830 0.0 è solo perché ho insistito che printf mi mostra un punto decimale. 817 00:38:38,830 --> 00:38:41,740 Ma il problema è che se si dividere un numero intero da un numero intero, 818 00:38:41,740 --> 00:38:44,347 si get-- per definizione di C-- un numero intero. 819 00:38:44,347 --> 00:38:46,680 E non sta andando a fare qualcosa di bello e conveniente 820 00:38:46,680 --> 00:38:49,040 come intorno ad esso fino alla più vicino verso l'alto o verso il basso. 821 00:38:49,040 --> 00:38:51,860 Sta andando per troncare tutto dopo il decimale. 822 00:38:51,860 --> 00:38:54,030 >> Quindi, solo intuitivamente, ciò che è probabilmente una correzione? 823 00:38:54,030 --> 00:38:55,351 Qual è la soluzione più semplice qui? 824 00:38:55,351 --> 00:38:55,850 Sì? 825 00:38:55,850 --> 00:39:00,570 826 00:39:00,570 --> 00:39:01,100 Esattamente. 827 00:39:01,100 --> 00:39:04,200 Perché non solo trattiamo questi come floating efficacemente valori a virgola 828 00:39:04,200 --> 00:39:05,860 trasformandoli in galleggianti o doppie. 829 00:39:05,860 --> 00:39:10,500 E ora se lo faccio fare carri-0, o se compilo carri-1, 830 00:39:10,500 --> 00:39:12,570 che è identico a ciò che è stato appena proposto. 831 00:39:12,570 --> 00:39:16,400 E ora che faccio carri-0, ora ho il mio 0.1. 832 00:39:16,400 --> 00:39:17,234 >> Ora, questo è incredibile. 833 00:39:17,234 --> 00:39:19,441 Ma ora ho intenzione di fare qualcosa di un po 'diverso. 834 00:39:19,441 --> 00:39:22,280 Sono curioso di vedere ciò che è veramente succedendo sotto il cofano, 835 00:39:22,280 --> 00:39:26,050 e ho intenzione di stampare questa out a 28 cifre decimali. 836 00:39:26,050 --> 00:39:29,730 Voglio vedere davvero 0.1000-- un infinite-- 837 00:39:29,730 --> 00:39:32,710 [Incomprensibile] 27 zeri dopo che 0.1. 838 00:39:32,710 --> 00:39:34,740 >> Beh, vediamo se questo è quello che davvero ottengo. 839 00:39:34,740 --> 00:39:39,430 Fai carri-0 stesso file. 840 00:39:39,430 --> 00:39:41,150 ./floats-0. 841 00:39:41,150 --> 00:39:44,380 Andiamo ingrandire sulla risposta drammatica. 842 00:39:44,380 --> 00:39:49,980 Per tutto questo tempo, hai pensato 1 diviso per 10 è del 10%, o 0,1. 843 00:39:49,980 --> 00:39:50,810 Non è. 844 00:39:50,810 --> 00:39:53,210 Almeno quanto l' computer in questione. 845 00:39:53,210 --> 00:39:57,060 >> Ora why-- OK, questo è completo lie 1 diviso 10 è 0,1. 846 00:39:57,060 --> 00:39:59,710 Ma why-- che non è oggi l'asporto. 847 00:39:59,710 --> 00:40:04,010 Allora perché non pensare al computer, a differenza di tutti noi nella stanza, 848 00:40:04,010 --> 00:40:06,870 che 1 diviso per 10 è in realtà che il valore pazzo? 849 00:40:06,870 --> 00:40:10,620 Qual è il computer facendo quanto pare? 850 00:40:10,620 --> 00:40:12,490 Che cos'è? 851 00:40:12,490 --> 00:40:13,785 >> Non è troppo pieno, di per sé. 852 00:40:13,785 --> 00:40:15,910 Overflow è in genere quando si avvolge intorno ad un valore. 853 00:40:15,910 --> 00:40:18,970 E 'questione di imprecisione in un valore in virgola mobile 854 00:40:18,970 --> 00:40:22,220 dove hai solo 32 o forse anche 64 bit. 855 00:40:22,220 --> 00:40:25,230 Ma se c'è un infinito numero di beni numbers-- 856 00:40:25,230 --> 00:40:27,940 numeri con punti decimali e numeri thereafter-- sicuramente 857 00:40:27,940 --> 00:40:29,380 non è possibile rappresentare tutti loro. 858 00:40:29,380 --> 00:40:32,870 Così il computer ha dato noi la corrispondenza più vicina 859 00:40:32,870 --> 00:40:37,090 il valore può rappresentare utilizzando tale molti bit di valore Io in realtà voglio, 860 00:40:37,090 --> 00:40:38,690 che è 0,1. 861 00:40:38,690 --> 00:40:40,685 >> Purtroppo, se si iniziare a fare la matematica, o si 862 00:40:40,685 --> 00:40:44,360 avviare coinvolgendo questi tipi di galleggianti valori in punti in importante programs-- 863 00:40:44,360 --> 00:40:46,770 software finanziario, nulla software-- militare 864 00:40:46,770 --> 00:40:49,090 dove la percezione è probabilmente abbastanza importante. 865 00:40:49,090 --> 00:40:51,520 E si comincia ad aggiungere numeri come questo, e inizio 866 00:40:51,520 --> 00:40:54,050 esecuzione che il software con davvero grandi ingressi 867 00:40:54,050 --> 00:40:56,890 o per un sacco di ore o lotti di giorni o un sacco di anni, 868 00:40:56,890 --> 00:41:01,060 questi piccoli piccoli errori sicuramente può aggiungere nel tempo. 869 00:41:01,060 --> 00:41:04,252 >> Ora, come un a parte, se hai mai visto Superman 3 o Office Space 870 00:41:04,252 --> 00:41:05,960 e si potrebbe ricordare come quei ragazzi rubato 871 00:41:05,960 --> 00:41:08,668 un sacco di soldi dal proprio computer utilizzando i valori in virgola mobile 872 00:41:08,668 --> 00:41:11,290 e sommando il piccolo resti, si spera che film 873 00:41:11,290 --> 00:41:12,390 ora ha più senso. 874 00:41:12,390 --> 00:41:14,930 Questo è ciò che erano alludendo in quel film. 875 00:41:14,930 --> 00:41:16,710 Il fatto che la maggior le aziende non sarebbero 876 00:41:16,710 --> 00:41:18,600 dopo un certo numero di cifre decimali, 877 00:41:18,600 --> 00:41:20,009 ma quelli sono frazioni di centesimi. 878 00:41:20,009 --> 00:41:22,550 Quindi iniziare ad aggiungere in su, si inizia a fare un sacco di soldi 879 00:41:22,550 --> 00:41:23,424 nel vostro conto in banca. 880 00:41:23,424 --> 00:41:25,160 Ecco, questo è Office Space spiegato. 881 00:41:25,160 --> 00:41:28,220 >> Ora, purtroppo, al di là Office Space, ci 882 00:41:28,220 --> 00:41:31,794 sono alcuni legittimamente preoccupante e impatti significativi 883 00:41:31,794 --> 00:41:33,710 di questi tipi di decisioni di progettazione sottostanti, 884 00:41:33,710 --> 00:41:35,990 e in effetti una delle ragioni usiamo C nel corso 885 00:41:35,990 --> 00:41:39,640 è così che realmente avete questa terra up comprensione di come funzionano i computer, 886 00:41:39,640 --> 00:41:42,440 come il software funziona, e non fare dare nulla per scontato. 887 00:41:42,440 --> 00:41:45,820 >> E infatti purtroppo, anche con che la comprensione fondamentale, 888 00:41:45,820 --> 00:41:47,370 noi esseri umani facciamo degli errori. 889 00:41:47,370 --> 00:41:51,310 E quello che ho pensato di condividere è questo video otto minuti qui preso 890 00:41:51,310 --> 00:41:56,980 da un episodio di Modern Marvels, che è uno spettacolo educativo su come funzionano le cose 891 00:41:56,980 --> 00:42:00,370 che dipinge due immagini di quando un uso improprio 892 00:42:00,370 --> 00:42:02,540 e comprensione valori a virgola mobile 893 00:42:02,540 --> 00:42:05,610 portato ad alcune significative risultati sfortunati. 894 00:42:05,610 --> 00:42:06,363 Diamo uno sguardo. 895 00:42:06,363 --> 00:42:07,029 [RIPRODUZIONE VIDEO] 896 00:42:07,029 --> 00:42:11,290 -Abbiamo Ora tornare alla "Ingegneria Disastri "a Modern Marvels. 897 00:42:11,290 --> 00:42:12,940 Computer. 898 00:42:12,940 --> 00:42:15,580 Abbiamo tutti arrivati ​​ad accettare la problemi spesso frustranti che 899 00:42:15,580 --> 00:42:20,960 ottenuto con them-- bug, virus, e glitches-- software per i piccoli prezzi 900 00:42:20,960 --> 00:42:23,100 a pagare per la comodità. 901 00:42:23,100 --> 00:42:27,770 Ma in alta tecnologia e ad alta velocità applicazioni programmi spaziali militari e, 902 00:42:27,770 --> 00:42:32,780 il più piccolo problema può essere ingrandita in disastro. 903 00:42:32,780 --> 00:42:38,880 >> Il 4 giugno del 1996, gli scienziati preparati per lanciare un senza pilota razzo Ariane 5. 904 00:42:38,880 --> 00:42:41,190 Si stava trasportando scientifica satelliti progettati 905 00:42:41,190 --> 00:42:44,570 stabilire precise modalità Interagisce campo magnetico della Terra 906 00:42:44,570 --> 00:42:47,380 con venti solari. 907 00:42:47,380 --> 00:42:50,580 Il razzo è stato costruito per l'Agenzia spaziale europea, 908 00:42:50,580 --> 00:42:54,400 e sollevato dal suo stabilimento sulla costa della Guyana francese. 909 00:42:54,400 --> 00:42:57,520 >> -At Circa 37 secondi dall'inizio il volo, in primo luogo 910 00:42:57,520 --> 00:42:59,070 qualcosa notato stava andando male. 911 00:42:59,070 --> 00:43:02,240 Che gli ugelli sono orientabili in un modo che davvero non dovrebbe. 912 00:43:02,240 --> 00:43:06,550 Circa 40 secondi dall'inizio del volo, chiaramente il veicolo era in difficoltà, 913 00:43:06,550 --> 00:43:08,820 e che quando hanno fatto la decisione di distruggerla. 914 00:43:08,820 --> 00:43:12,370 Il responsabile della sicurezza gamma, con enormi budella, premuto il pulsante 915 00:43:12,370 --> 00:43:18,030 e fatto saltare in aria il razzo prima che potesse diventare un pericolo per la sicurezza pubblica. 916 00:43:18,030 --> 00:43:21,010 >> -Questo Era la fanciulla viaggio di Ariane 5, 917 00:43:21,010 --> 00:43:23,920 e la sua distruzione ha preso posizionare a causa del difetto 918 00:43:23,920 --> 00:43:25,932 incorporato nel software del razzo. 919 00:43:25,932 --> 00:43:27,640 -Il Problema sul Ariane era che ci 920 00:43:27,640 --> 00:43:30,500 è un numero che ha richiesto 64 bit per esprimere, 921 00:43:30,500 --> 00:43:33,560 e volevano convertire ad un numero di 16 bit. 922 00:43:33,560 --> 00:43:36,820 Si presume che il numero non è mai stata intenzione di essere molto grande. 923 00:43:36,820 --> 00:43:40,940 Che la maggior parte di queste cifre in il numero a 64 bit erano zeri. 924 00:43:40,940 --> 00:43:42,450 Si sbagliavano. 925 00:43:42,450 --> 00:43:45,000 >> -La Incapacità di una programma software per accettare 926 00:43:45,000 --> 00:43:49,460 il tipo di numero generato da un altro era alla radice del fallimento. 927 00:43:49,460 --> 00:43:54,260 Lo sviluppo del software era diventato un parte molto costosa delle nuove tecnologie. 928 00:43:54,260 --> 00:43:57,060 Il razzo Ariane 4 ha avuto molto successo. 929 00:43:57,060 --> 00:44:01,600 Quindi gran parte del software realizzato per è stato utilizzato anche nel Ariane 5. 930 00:44:01,600 --> 00:44:04,790 >> -Il Problema di fondo era che l'Ariane 5. 931 00:44:04,790 --> 00:44:11,200 È stato faster-- accelerato più veloce, e il software non ha rappresentato per questo. 932 00:44:11,200 --> 00:44:14,910 >> -La Distruzione del razzo è stato un enorme disastro finanziario. 933 00:44:14,910 --> 00:44:18,630 Tutto a causa di un errore software minuto. 934 00:44:18,630 --> 00:44:21,160 Ma questa non era la prima problemi di conversione dei dati in tempo 935 00:44:21,160 --> 00:44:24,770 aveva afflitto moderna tecnologia dei razzi. 936 00:44:24,770 --> 00:44:28,020 >> -In 1991 con l'inizio della prima guerra del Golfo, 937 00:44:28,020 --> 00:44:30,540 il missile Patriot sperimentato un genere simile 938 00:44:30,540 --> 00:44:32,465 di un problema numero conversione. 939 00:44:32,465 --> 00:44:36,760 E come risultato 28 people-- 28 Soldiers-- americani sono stati uccisi, 940 00:44:36,760 --> 00:44:39,010 e circa un centinaio di altri feriti. 941 00:44:39,010 --> 00:44:42,830 Quando il Patriot, che avrebbe dovuto per la protezione contro Scud in arrivo, 942 00:44:42,830 --> 00:44:45,780 non è riuscito a sparare un missile. 943 00:44:45,780 --> 00:44:51,610 >> -Quando Iraq invase il Kuwait, e in America Desert Storm lanciato all'inizio del 1991, 944 00:44:51,610 --> 00:44:55,720 Batterie di missili Patriot sono state dispiegate per proteggere l'Arabia Saudita e Israele 945 00:44:55,720 --> 00:44:59,180 da attacchi missilistici iracheni Scud. 946 00:44:59,180 --> 00:45:03,080 Il Patriot è un medio raggio USA superficie-aria del sistema 947 00:45:03,080 --> 00:45:06,530 prodotto dalla società Raytheon. 948 00:45:06,530 --> 00:45:09,500 >> -La Dimensione del Patriot interceptor itself-- 949 00:45:09,500 --> 00:45:14,705 è lungo circa circa 20 metri, e pesa circa 2.000 chili. 950 00:45:14,705 --> 00:45:19,090 E porta una testata di circa, Penso che sia circa 150 libbre. 951 00:45:19,090 --> 00:45:23,880 E la testata è di per sé un alto esplosivo, che 952 00:45:23,880 --> 00:45:26,700 ha frammenti intorno a lui. 953 00:45:26,700 --> 00:45:31,630 Così la carcassa è testata progettato per agire come un pallettoni. 954 00:45:31,630 --> 00:45:34,040 >> -Le Missili vengono effettuate quattro per container, 955 00:45:34,040 --> 00:45:37,170 e sono trasportati da un semirimorchio. 956 00:45:37,170 --> 00:45:44,880 >> -Il Sistema Patriot anti-missile risale ad almeno 20 anni. 957 00:45:44,880 --> 00:45:48,380 È stato originariamente progettato come una difesa missile aria 958 00:45:48,380 --> 00:45:50,810 di abbattere gli aerei nemici. 959 00:45:50,810 --> 00:45:54,410 Nella prima guerra del Golfo quando quella guerra è venuto su, 960 00:45:54,410 --> 00:45:59,650 l'esercito voleva usarlo per abbattere Scud, non aerei. 961 00:45:59,650 --> 00:46:03,580 L'Air Force irachena era non tanto di un problema, 962 00:46:03,580 --> 00:46:06,590 ma l'esercito era preoccupato per Scud. 963 00:46:06,590 --> 00:46:10,120 E così hanno cercato di aggiornare il Patriot. 964 00:46:10,120 --> 00:46:12,740 >> -Intercepting Un nemico missile che viaggia a Mach 5 965 00:46:12,740 --> 00:46:15,670 stava per essere abbastanza impegnativo. 966 00:46:15,670 --> 00:46:18,440 Ma quando il Patriot è stato ricoverato in servizio, 967 00:46:18,440 --> 00:46:22,580 l'esercito non era a conoscenza di una modifica iracheno che 968 00:46:22,580 --> 00:46:25,880 fatto i loro scudi quasi impossibile da esso. 969 00:46:25,880 --> 00:46:30,690 >> -Che Che è successo è che gli Scud stavano arrivando in stati instabili. 970 00:46:30,690 --> 00:46:32,000 Erano traballante. 971 00:46:32,000 --> 00:46:37,210 La ragione di questo è stato il Iraqis-- al fine di ottenere 600 chilometri fuori 972 00:46:37,210 --> 00:46:41,680 di una gamma missile-- 300 chilometri preso peso su testata anteriore, 973 00:46:41,680 --> 00:46:43,340 e fatta la testata più leggero. 974 00:46:43,340 --> 00:46:48,490 Così ora il Patriot sta cercando di venire al Scud, e la maggior parte della tempo-- 975 00:46:48,490 --> 00:46:52,880 la stragrande maggioranza della tempo-- sarebbe solo volare dal Scud. 976 00:46:52,880 --> 00:46:57,120 >> -Una Volta i gestori del sistema Patriot realizzato il Patriot mancato il suo obiettivo, 977 00:46:57,120 --> 00:47:01,630 hanno fatto esplodere testata del Patriot al fine di evitare possibili perdite se esso 978 00:47:01,630 --> 00:47:04,440 è stato permesso di cadere a terra. 979 00:47:04,440 --> 00:47:08,700 >> -Che Era quello che la maggior parte delle persone ha visto come grandi palle di fuoco nel cielo, 980 00:47:08,700 --> 00:47:14,180 e frainteso come intercettazioni di testate Scud. 981 00:47:14,180 --> 00:47:18,020 >> -Anche Nei cieli notturni, Patriots sembrava essere distrutto con successo 982 00:47:18,020 --> 00:47:23,280 Scud, a Dhahran ci potrebbe essere Non commettere errori sulle sue prestazioni. 983 00:47:23,280 --> 00:47:27,930 C'è il sistema radar del Patriot perso le tracce di una Scud in arrivo 984 00:47:27,930 --> 00:47:30,260 e mai lanciato dovuta ad un difetto del software. 985 00:47:30,260 --> 00:47:34,060 986 00:47:34,060 --> 00:47:38,880 >> Era gli israeliani che per primo ha scoperto che il più il sistema era acceso, 987 00:47:38,880 --> 00:47:41,130 maggiore è il tempo di discrepanza è diventato. 988 00:47:41,130 --> 00:47:44,770 A causa di un orologio incorporato nel computer del sistema. 989 00:47:44,770 --> 00:47:48,190 >> -Circa Due settimane prima la tragedia in Dhahran, 990 00:47:48,190 --> 00:47:50,720 gli israeliani riferito a il Dipartimento della Difesa 991 00:47:50,720 --> 00:47:52,410 che il sistema stava perdendo tempo. 992 00:47:52,410 --> 00:47:54,410 Dopo circa otto ore di corsa, hanno notato 993 00:47:54,410 --> 00:47:57,690 che il sistema di divenire notevolmente meno accurato. 994 00:47:57,690 --> 00:48:01,850 Il Dipartimento della Difesa ha risposto raccontando tutte le batterie Patriot 995 00:48:01,850 --> 00:48:04,800 di non lasciare i sistemi per lungo tempo. 996 00:48:04,800 --> 00:48:06,980 Non hanno mai detto quello che un tempo era. 997 00:48:06,980 --> 00:48:09,140 8 ore, 10 ore, mille ore. 998 00:48:09,140 --> 00:48:11,300 Nessuno lo sapeva. 999 00:48:11,300 --> 00:48:13,320 >> -Il Batteria Patriot di stanza presso la caserma 1000 00:48:13,320 --> 00:48:18,310 a Dhahran e la sua viziata interna orologio è arrivata al oltre 100 ore 1001 00:48:18,310 --> 00:48:21,520 la notte del 25 febbraio. 1002 00:48:21,520 --> 00:48:25,792 >> -It Cingolato tempo con una precisione di circa un decimo di secondo. 1003 00:48:25,792 --> 00:48:27,950 Ora un decimo di secondo è un numero interessante 1004 00:48:27,950 --> 00:48:31,850 perché non può essere espresso in binario esattamente, che 1005 00:48:31,850 --> 00:48:36,500 significa che non può essere espressa esattamente in qualsiasi moderno computer digitale. 1006 00:48:36,500 --> 00:48:41,070 E 'difficile da credere, ma utilizzare questo come un esempio. 1007 00:48:41,070 --> 00:48:43,420 >> Prendiamo il numero di un terzo. 1008 00:48:43,420 --> 00:48:47,330 Un terzo non può essere espresso in decimali esattamente. 1009 00:48:47,330 --> 00:48:52,060 Un terzo è 0.333 in corso per l'infinito. 1010 00:48:52,060 --> 00:48:56,420 Non c'è modo di farlo con precisione assoluta in un decimale. 1011 00:48:56,420 --> 00:48:59,530 Questo è esattamente il tipo di problema quello che è successo nel Patriot. 1012 00:48:59,530 --> 00:49:04,040 Più lungo è il sistema ha funzionato, il peggio l'errore di tempo è diventato. 1013 00:49:04,040 --> 00:49:08,840 >> -Dopo 100 ore di funzionamento, il errore nel tempo era solo circa un terzo 1014 00:49:08,840 --> 00:49:10,440 di un secondo. 1015 00:49:10,440 --> 00:49:14,150 Ma in termini di mira un missili che viaggiano a Mach 5, 1016 00:49:14,150 --> 00:49:18,560 si è tradotto in un inseguimento errore di oltre 600 metri. 1017 00:49:18,560 --> 00:49:21,870 Sarebbe un errore fatale per i soldati a Dhahran. 1018 00:49:21,870 --> 00:49:28,455 >> -Che Che è accaduto è un lancio Scud era rilevato da satelliti di allarme, 1019 00:49:28,455 --> 00:49:32,710 e sapevano che stava arrivando un Scud nella loro direzione generale. 1020 00:49:32,710 --> 00:49:35,150 Non sapevano dove venisse. 1021 00:49:35,150 --> 00:49:38,210 Ora era fino al radar componente del sistema Patriot 1022 00:49:38,210 --> 00:49:43,150 difendendo Dhahran per individuare e mantenere traccia del missile nemico in arrivo. 1023 00:49:43,150 --> 00:49:44,561 >> -Il Radar era molto intelligente. 1024 00:49:44,561 --> 00:49:46,560 Sarebbe in realtà traccia la posizione del Scud 1025 00:49:46,560 --> 00:49:48,930 e poi prevedere dove probabilmente sarebbe 1026 00:49:48,930 --> 00:49:51,380 al successivo radar inviato un impulso. 1027 00:49:51,380 --> 00:49:53,040 Che è stato chiamato il cancello gamma. 1028 00:49:53,040 --> 00:49:57,620 >> -Poi Una volta che il Patriot decide il tempo ha 1029 00:49:57,620 --> 00:50:02,400 passata di tornare indietro e controllare il successivo posizione per questo oggetto rilevato 1030 00:50:02,400 --> 00:50:03,550 va indietro. 1031 00:50:03,550 --> 00:50:07,820 Così, quando si tornò al sbagliata posto, poi vede alcun oggetto. 1032 00:50:07,820 --> 00:50:10,360 E decide che non vi era alcun oggetto. 1033 00:50:10,360 --> 00:50:13,630 Che ci fosse un rilevamento falso e si scende in pista. 1034 00:50:13,630 --> 00:50:16,970 >> -Il Scud in arrivo scomparso dallo schermo radar, 1035 00:50:16,970 --> 00:50:20,200 e pochi secondi più tardi, sbattuto in caserma. 1036 00:50:20,200 --> 00:50:22,570 La Scud ha ucciso 28. 1037 00:50:22,570 --> 00:50:26,110 E 'stato l'ultimo licenziato durante la prima guerra del Golfo. 1038 00:50:26,110 --> 00:50:31,920 Tragicamente, il software aggiornato arrivato all'alba del giorno seguente. 1039 00:50:31,920 --> 00:50:34,870 Il difetto software aveva stato, chiusura fisso 1040 00:50:34,870 --> 00:50:39,150 un capitolo nella travagliata storia del missile Patriot. 1041 00:50:39,150 --> 00:50:40,030 >> [FINE RIPRODUZIONE VIDEO] 1042 00:50:40,030 --> 00:50:41,488 >> DAVID J. MALAN: Questo è tutto per CS50. 1043 00:50:41,488 --> 00:50:42,820 Ci vediamo il Mercoledì. 1044 00:50:42,820 --> 00:50:46,420 1045 00:50:46,420 --> 00:50:50,370 >> [GIOCO MUSICA] 1046 00:50:50,370 --> 00:54:23,446