[GIOCO MUSICA] DAVID J. MALAN: Va bene. Questo è CS50, e questo è l'inizio della seconda settimana. Quindi cominciamo oggi con un bug. Un bug, naturalmente, è un errore in un programma, e si otterrà molto familiarità con questo concetto se non hai mai programmato prima. pset0 e ora pset1. Ma consideriamo qualcosa un po 'semplice a prima. Questo programma qui che ho gettato insieme in anticipo, e io sostengo che questo dovrebbe stampare 10 stelle sullo schermo utilizzando printf, ma è apparentemente buggy in qualche modo. Dato che le specifiche che si deve stampare 10 stelle, ma non è così a quanto pare, ciò che vuoi rivendicare è il bug? Sì? Quindi è un off da un errore, e che cosa vuoi dire con questo? Ok. Eccellente. Così abbiamo specificato un valore pari a zero per iniziare i, e abbiamo specificato un valore n di 10, ma abbiamo usato minore o uguale a. E la ragione che si tratta di due caratteri e non solo un simbolo, come in un libro di matematica, è che non avete un modo di esprimere il un equivalente carattere. Quindi questo significa meno, ma se si inizia a contare da zero, ma si conta tutta la strada attraverso e pari a 10, sei ovviamente andare a conta 11 cose in totale. E così si sta andando a stampare 11 stelle. Così che cosa potrebbe essere una correzione per questo? Sì? Quindi basta regolare il meno o uguale a essere appena inferiore, e c'è, io rivendico, forse un'altra soluzione, anche. Che altro si potrebbe fare? Sì? Così inizia pari a 1, e lasciare la minore o uguale a. E francamente vorrei rivendicare che per un umano tipico, questo è probabilmente più semplice. Inizia il conteggio a 1 e contare fino a 10. In sostanza fai quello che vuoi dire. Ma la realtà è in programmazione, come abbiamo visto, informatici e programmatori in genere non iniziare il conteggio da zero. E così va bene una volta ci si abitua ad esso. La tua condizione generale essere qualcosa di simile a meno. Così semplicemente una logica errore che potremmo ora fissare e infine ricompilare questo e ottenere solo 10. Beh, che ne dici di questo bug qui? Qui, ancora una volta, ho affermare che ho un obiettivo di stampa di 10 stars-- uno per riga questa volta, ma non è così. Prima vi proponiamo quello la correzione è, che cosa fa questo stampare visivamente se dovessi compilare ed eseguire questo programma ne pensi? Sì? Stella. Così tutte le stelle sul stessa linea è quello che ho sentito, e poi il carattere di nuova riga. Quindi proviamo questo. Quindi, fare buggy-1, immettere, e vedo il comando clang di cui abbiamo parlato l'ultima volta. ./buggy-1, e infatti vedo tutte le 10 stelle sulla stessa linea, anche se rivendico nella mia specifica solo un commento in cima il codice che ho intenzione di fare uno per linea. Ma questo sembra giusto. Ora la linea 15 sembra come se fossi la stampa di una stella, e poi la linea 16 sembra come se fossi di stampa un carattere di nuova riga, e sono entrambi rientrati in modo Sono all'interno del loop chiaramente. Quindi non dovrei fare stelle, nuovo linea, stella, nuova linea, stella, nuova linea? Sì? Sì, a differenza di un linguaggio come Python, se si ha familiarità, rientro non lo fa materia al computer. Importa solo per l'umano. Così le linee mentre qui ho inventato 15 e 16-- che sembra bello, ma il computer non si preoccupa. Il computer si preoccupa in realtà avendo parentesi graffe attorno a queste righe di codice. Così che è clear-- proprio come in Scratch-- che quelle due righe di codice dovrebbe essere eseguito. Come uno di quelli Scratch puzzle giallo pezzi ancora e ancora e ancora. Così ora re-run se questo program-- ./buggy-2-- Hm. Ho un errore adesso. Quello che ho dimenticato di fare? Sì, così non ho compilarlo. Quindi, fare buggy-2. Nessun file perché non l'ho fatto in realtà compilare la seconda versione. Così ora interessante sommerso non variable-- 2. Stiamo facendo 1. Fai buggy-1-- ./buggy-1-- e ora ciascuno di essi è sulla stessa linea. Ora c'è un'eccezione alla questa affermazione presunta mio che avete bisogno di queste parentesi graffe. Quando è in realtà OK-- se avete notato in sezione o textbooks-- di omettere le parentesi graffe? Sì? Esattamente. Quando c'è solo un riga di codice che si vuole associare al ciclo come nel nostro primo esempio. E 'perfettamente legittimo di omettere le parentesi graffe proprio come una sorta di convenienza dal compilatore a voi. Sì? Buona domanda. Sarebbe essere considerato un errore di stile? Vorremmo promote-- come in CS50 guida di stile, l'URL per la quale è in pset1-- che sempre utilizzare le parentesi graffe. Certo, se siete nuovi alla programmazione. La realtà è che non siamo intenzione di proibire voi dal fare queste convenienze. Ma se si sta solo ricevendo in altalena delle cose, assolutamente basta usare sempre il riccio bretelle fino ad ottenere il blocco di esso. Buona domanda. Bene. In modo che poi era un bug. Almeno in qualcosa di abbastanza semplice. Eppure si potrebbe pensare questo è abbastanza rudimentale, giusto? Questa è una specie della prima settimana di guardare alla lingua come, vedere i tuoi errori in esso. Ma la realtà si tratta effettivamente rappresentativo di alcuni problemi piuttosto spaventose che possono sorgere nel mondo reale. Così alcuni di voi potrebbero ricordare se si seguono notizie di tecnologia, o forse addirittura catturato vento di questo nel mese di febbraio di questo anno passato che Apple aveva fatto un po 'di un errore in entrambi iOS, il sistema operativo i loro telefoni, e anche Mac OS, il sistema operativo sui loro desktop e laptop. E hai visto titoli come questo. E da allora in poi, Apple promesso di risolvere questo bug, e molto rapidamente ha fatto risolvere il problema in iOS, ma poi alla fine risolto in Mac OS pure. Ora, nessuno di questi titoli da soli davvero rivelare ciò che il problema di fondo era, ma il bug è stato infine ridotto a un bug in SSL, Secure Sockets Layer. E per farla breve, questo è il software che il nostro browser e altre software utilizzato per fare che cosa? Se ho detto che SSL è coinvolti, ogni volta che si visitare un URL che inizia con HTTPS, Che poi potrebbe essere correlato a SSL? Crittografia. Quindi parleremo questo nei prossimi giorni. Crittografia, l'arte di scrambling informazioni. Ma per farla breve, Apple qualche tempo fa aveva fatto un errore nella loro attuazione della SSL, il software che implementa definitiva URL come HTTPS o max connessioni anche lì. Il cui risultato è che il connessioni potrebbe potenzialmente essere intercettati. E le connessioni erano non necessariamente cifrato se avete avuto qualche cattivo ragazzo in mezzo voi e il sito di destinazione che ha saputo approfittare di questo. Ora Apple ha in definitiva una correzione per questo, infine, e la descrizione della loro correzione era questo. Trasporto sicuro non è riuscito a confermare l'autenticità della connessione. Il problema è stato risolto ripristino mancanti passi di validazione. Quindi questo è un lato ondulato spiegazione semplicemente per dire che abbiamo avvitato. Vi è letteralmente una riga di codice che era bacato nella loro attuazione della SSL, e se si va online e la ricerca di questo si può effettivamente trovare il codice sorgente originale. Per esempio, questo è un colpo di schermo solo una porzione di un gran lima, ma questa è una funzione apparentemente chiamato SSL verificare segno server di scambio di chiavi. E ci vuole un po 'di argomenti e gli ingressi. E non stiamo andando a concentrarsi troppo sul minuzie là, ma se ci si concentra sul codice interno di quella più in alto function-- facciamo zoomare su quella. Si potrebbe già sospettare ciò che l'errore potrebbe essere anche se non avete idea in ultima analisi, ciò che si sta guardando. C'è una specie di anomalia qui, che è ciò? Sì, non mi piace molto lo sguardo di due goto fallisce. Francamente, io non so davvero cosa goto sicuro mezzo, ma avendo due di essi back to back. Questo solo tipo di mi strofina intellettualmente nel modo sbagliato, e anzi, se focalizziamo l'attenzione sulla solo quelle linee, questo è C. Così un sacco di codice di Apple è a sua volta scritto in C, e questo a quanto pare è davvero equivalent-- non a quella bella indentazione versione, ma se si riconosce il fatto che non ci sono parentesi graffe, che cosa Apple ha davvero scritto era il codice che sembra come questo. Così ho ingrandito e ho appena fissato il rientro in senso che se non ci sono parentesi graffe, che secondo goto non riescono che è in giallo sta per eseguire qualunque cosa. Non è associato con se la condizione di sopra di esso. Quindi, anche di nuovo, se non del tutto capire che cosa questo potrebbe essere facendo, sapere che ognuno di questi conditions-- ognuna di queste linee è un passo molto importante nel processo di controllo se i dati sono in realtà crittografata. Così saltando uno di questi passi, non l'idea migliore. Ma perché abbiamo questa secondo goto fallire in giallo, e perché una volta che abbiamo sorta di esteticamente spostarlo verso sinistra dove logicamente è al momento, ciò significa questo per la linea di codice riportato di seguito, che secondo goto riesce pensereste? Sta andando sempre essere saltati. Così goto sono generalmente disapprovate per ragioni che non sarà davvero andare in, e anzi in CS50 noi non tendiamo per insegnare questa dichiarazione goto, ma si può pensare di goto non nel senso andare salto a qualche altra parte del codice. In altre parole, saltare questa ultima riga del tutto, e così il risultato di questo stupido semplice errore che era solo A seguito di probabilmente qualcuno copiando e incollando uno di troppo molte volte era che l'intero sicurezza di iOS e Mac OS era vulnerabile alle intercettazioni da cattivi per un bel po 'di tempo. Fino a quando Apple ha finalmente risolto questo. Ora, se alcuni di voi sono in realtà esecuzione di vecchie versioni di iOS o Mac OS, si può andare a gotofail.com cui è un sito che qualcuno ha istituito determinare essenzialmente programmazione se il computer è ancora vulnerabile. E francamente, se lo è, è probabilmente una buona idea per aggiornare il telefono o il vostro Mac a questo punto. Ma lì, proprio testamento a quanto un apprezzamento di questi livello inferiore dettagli e abbastanza idee semplici può davvero tradursi in decisioni e problemi che affected-- in questo case-- milioni di persone. Ora una parola per l'amministrazione. Sezione inizierà il prossimo Domenica. Riceverai una e-mail da parte del fine settimana sulla sezione, a questo punto il processo di resezione inizierà se avete capito ora avete alcuni nuovi conflitti. Quindi questo accade ogni anno, e abbiamo ospiterà nei giorni a venire. Ufficio hours-- fanno tenere d' occhio su questo programma qui. Cambia un po 'di questa settimana, in particolare il tempo di inizio e la posizione, in modo da consultare che prima di partire per l'orario di ufficio una delle prossime quattro notti. Ed ora una parola sulla valutazione, in particolare per quanto ci si immerge in un problema stabilisce uno e oltre. Così per la specifica, questi sono generalmente gli assi lungo i quali valutiamo il vostro lavoro. Ambito di applicazione si riferisce a ciò che misura i vostri attrezzi di codice le caratteristiche richieste dalla nostra specificazione. In altre parole, quanto di un calcio da fermo ha fatto si mordono fuori. Hai fatto un terzo di esso, una metà di esso, 100% di esso. Anche se non è corretto, quanto hai tentare? Così che cattura il livello di sforzo e l'importo a cui si po 'fuori problemi problema di set. Correctness-- questo, per In che misura, è il codice coerente con la nostra specifiche e privo di bug. Così funziona correttamente? Se diamo qualche input, lo fa ci danno l'output che ci aspettiamo? Design-- ora questo è il primo di quelli particolarmente qualitativi, o quelli che richiedono il giudizio umano. E in effetti, questo è il motivo per cui abbiamo uno staff di tanti compagni di insegnamento e corso assistenti. Fino a che punto è il tuo codice scritto bene? E anche questo è un molto valutazione qualitativa che lavorerà con voi su bidirezionale nelle settimane a venire. Così che, quando non si ottiene solo i punteggi numerici, ma anche a partiture scritte, o feedback digitato, o commenti scritti in parole inglesi. Questo è quello che useremo a guidare verso realtà scrivere codice migliore. E in conferenza e la sezione, cercheremo al punto fuori-- più spesso can-- ciò che rende un programma non solo corretta e funzionalmente buona, ma anche ben progettato. Il più efficiente che potrebbe essere, o anche il più bello possibile. Il che ci porta a stile. Style in ultima analisi, è un giudizio estetico. Avete scelto bene nomi per le variabili? Hai frastagliata correttamente il codice? Ha un bell'aspetto, e, quindi, è facile per un altro essere umano per leggere il vostro rispettivo della sua correttezza. Ora, in generale per il programma, segniamo queste cose su una scala a cinque punti. E mi permetta di ribadire il punto che un tre è davvero buono. Molto rapidamente fare la gente iniziare a fare l'aritmetica. Quando ottengono un tre su cinque su di correttezza per qualche pset e pensano accidenti, ho intenzione al 60% che è essenzialmente una D o E. Non è questo il modo in cui pensare a questi numeri. A tre è davvero buono, e quello che abbiamo generalmente si aspettano all'inizio del termine è che se stai ricevendo un mucchio di three's-- forse un paio di fiere, un paio di fours-- o un paio di gruppi di due, un paio di fours-- questo è un buon punto di partenza. E finché vediamo un traiettoria verso l'alto nel corso del tempo, sei in un posto particolarmente buono. La formula che usiamo per cose di peso è essenzialmente questo per il programma, il che significa solo che noi dare più peso alla correttezza. Perché è molto spesso correttezza che prende la maggior parte del tempo. Fidati di me adesso. Si find-- almeno in una pset-- che si spendere il 90% del vostro tempo lavorare il 10% del problema. E tutto funziona sorta di tranne che per uno o due bug, e questi sono i bug che tenervi a tarda notte. Questi sono quelli che sorta di fuga voi. Ma dopo aver dormito su di esso, o partecipare a orari di ufficio o domande on-line, è quando si arriva a questo obiettivo il 100%, ed è per questo che il peso correttezza di più. Progettare un po 'meno, e lo stile un po 'meno di quello. Ma tieni in stile mind-- è forse il più facile di questi a mordere come da guida di stile. E ora, una più grave nota sull'onestà accademico. CS50 ha la sfortunata distinzione di essendo il più grande produttore di Ad Consiglio casi quasi ogni anno storicamente. Questo non è perché gli studenti barare in CS50 qualsiasi più di qualsiasi altra classe, ma a causa della natura del lavoro, il fatto che è elettronico, il fatto che cerchiamo, e il fatto che siamo scienziati informatici, Posso dire che siamo purtroppo molto bravi ad individuare esso. Che cosa significa questo in termini reali? Così, per il programma, La filosofia del corso davvero non ridursi a essere ragionevole. C'è questa linea di demarcazione tra fare il proprio lavoro sul proprio e ottenere un po 'di aiuto ragionevole da un amico, e addirittura di fare il lavoro per il vostro amico, o l'invio di lui o lei il tuo codice in modo che lui o lei può semplicemente prendere o prendere in prestito fuori a destra. E che attraversa la linea di che abbiamo trascinati nella classe. Vedere, il programma in ultima analisi, per le linee che ci avviciniamo ad essere ragionevole e il comportamento irragionevole, ma lo fa davvero ebollizione giù all'essenza del vostro lavoro bisogno di essere il vostro proprio alla fine. Ora, con quello detto, c'è un euristico. Perché, come si potrebbe imagine-- dalle ore di ufficio e la grafica e il video che abbiamo dimostrato così far-- CS50 è infatti destinato a essere il più collaborativo e come cooperativa e sociale come possibile. Come collaborativo come è rigoroso. Ma con questo detto, l'euristica, come si vedrà nel programma, è che quando hai qualche problema. Hai qualche bug nel codice che si non può risolvere, è ragionevole per voi per mostrare il vostro codice a qualcun altro. Un amico anche nella classe, un amico seduto accanto a voi in orario d'ufficio, o un membro del personale. Ma essi non possono mostrare il loro codice a voi. In altre parole, un risposta al vostro interrogo Ho bisogno help-- è non oh, ecco il mio codice. Date un'occhiata a questo e dedurre da come volete. Ora, naturalmente, non c'è un modo chiaramente al gioco questo sistema in cui vi mostrerò il mio codice prima di avere una domanda. Tu mi mostri il tuo codice prima di avere una domanda. Ma rivedere il programma per la dettagli più fini di cui questa linea è. Basta dipingere ora il quadro e condividere nel modo più trasparente possibile dove ci troviamo negli ultimi anni, questo è il numero di casi annuncio di società che CS50 ha avuto oltre degli ultimi sette anni. Con 14 casi di questo più recente caduta. Per quanto riguarda gli studenti coinvolti, era 20 alcuni studenti dispari questo autunno scorso. Ci fu un picco di 33 studenti di alcuni anni fa. Molti dei quali sono purtroppo non è più qui nel campus. Gli studenti coinvolti in percentuale del classe è storicamente spaziato dal 0% al 5,3%, che è solo per dire questo è ogni anno una sfida. E verso quel fine, che cosa che vogliamo fare è trasmettere una che abbiamo appena dd-- FYI-- confrontare a una equità per gli studenti che sono seguendo la linea di conseguenza. Facciamo confrontare tutti gli attuali osservazioni nei confronti di tutte le missioni del passato degli ultimi anni. Sappiamo anche come Google in giro e trovare repository di codice on-line, forum di discussione online, siti di lavoro online. Se uno studente può trovare, possiamo sicuramente trovare tanto quanto noi purtroppo facciamo. Quindi, quello che vedrete nel programma anche se è questa clausola rimpianto. Posso certamente apprezzare, e tutti noi ha personale dopo aver fatto il corso come questa, o questa stessa uno nel tempo, certamente sa cosa vuol dire quando la vita si mette di mezzo quando si ha una notte tarda deadline-- non solo in questa classe, ma another-- Quando sei completamente esausto, stressato, avere un numero eccessivo di altre cose da fare. Potrai fare ad un certo punto in vita certamente un male, forse in ritardo decisione notte. Così per il programma, c'è questa clausola, tale che se entro 72 ore dalla qualche decisione sbagliata, si possiede fino a che e raggiungere me e uno dei capi del corso e avremo una conversazione. Tratteremo le cose internamente nella speranza essi possano divenire più di un momento didattico o lezione di vita, e non qualcosa con ramificazioni particolarmente drastiche come si può vedere nelle tabelle qui. Quindi questo è un tono molto serio. Fermiamoci per pochi secondi per rompere la tensione. [GIOCO MUSICA] DAVID J. MALAN: Va bene, così come è stato che per un Segue? Per gli argomenti principali di oggi. Il primo dei quali è astrazione. Un altro dei quali sta per essere rappresentazione dei dati, che francamente è un modo davvero secco di dire come possiamo andare circa risolvere i problemi e di pensare di risolvere i problemi? Così hai visto in Scratch, e hai visto forse già in pset1 con C che non solo è possibile utilizzare funzioni, come printf, che altre persone a anni passati ha scritto per voi. È inoltre possibile scrivere le proprie funzioni. E anche se non si potrebbe avere fatto in C, e francamente in pset1 non si ha realmente bisogno di scrivere il vostro propria funzione perché il problem-- mentre forse scoraggiante a prima glance-- vedrete in ultima analisi può essere risolto con non tutti che molte righe di codice. Ma detto questo, in termini di scrivere la propria funzione, rendersi conto che C dà te questa capacità. Ho intenzione di andare nel codice sorgente di oggi, che è disponibile già on-line, e ho intenzione di andare avanti e aperto un programma chiamato funzione 0.C, ed in funzione di zero vedremo un paio di cose. In prime righe 18 attraverso 23 è la mia funzione principale. E ora che stiamo cominciando a leggere codice che non stiamo scrivendo al volo, ma invece ho scritto in anticipo o che in un problema di imposta potrebbe ricevere avendo stato scritto in anticipo. Un buon modo per iniziare leggendo il codice di qualcun altro è cercare la funzione principale. Capire dove quella voce punto è quello di eseguire il programma, e poi seguire logicamente da lì. Quindi questo programma apparentemente stampe il vostro nome seguito da due punti. Utilizziamo quindi GetString dalla libreria CS50 per ottenere una stringa, o una parola o una frase dall'utente sulla tastiera. E poi c'è questo cosa PrintName qui--. Ora PrintName non è un funzione che viene fornito con C. Non è in io.h. di serie Non è in CS50.h. E 'piuttosto nello stesso file. Notate se ho scorrere verso il basso una linea bit-- 25 a 27-- è solo un bel modo di commentare il codice utilizzando le stelle e le barre. Questo è un multi-linea commento, e questo è solo la mia descrizione in blu di che cosa fa questa funzione. Perché in linee 28 e 31, Ho scritto un super semplice funzione il cui nome è PrintName. Prende quanti argomenti diresti? Così un argument-- perché c'è una argomento elencato all'interno delle parentesi. Il tipo di cui è String. Il che vale a dire PrintName è come questa scatola nera o una funzione che prende in ingresso una stringa. E il nome di quel String convenientemente saranno Nome. Non è, non N, ma il nome. Così che cosa PrintName fare? E 'bello semplice. Proprio come una riga di codice per la printf, ma a quanto pare stampe out "Ciao," così e così. Qualora il così e così proviene dal ragionamento. Ora, questo non è un enorme innovazione qui. Davvero, ho preso un programma che potrebbe essere stato scritto con una sola riga di codice mettendo questo qui, e cambiato a qualcosa che coinvolge circa sei o sette anni o giù di lì righe di codice fino in fondo qui. Ma è la pratica di un principio noto come astrazione. Tipo di incapsulare all'interno di un nuovo funzione che ha un nome, e meglio eppure quel nome letteralmente dice quello che fa. Voglio dire printf-- che non è particolarmente descrittivo. Se voglio creare un pezzo di puzzle, o se io voler creare una funzione che stampa il nome di qualcuno, la bellezza di fare questo è che posso effettivamente dare quella funzione un nome che descrive ciò che fa. Ora prende in ingresso che Ho arbitrariamente chiamato nome, ma anche questo è meravigliosamente descrittivo invece di essere un po 'più generico come S. E nulla, per ora, significa solo che questa funzione non lo fa Mi restituire nulla. Non è come GetString che letteralmente mi porge indietro una stringa come abbiamo fatto con i pezzi di carta con i tuoi compagni di classe la scorsa settimana, ma ha solo un effetto collaterale. Esso stampa qualcosa sullo schermo. Così, alla fine della giornata, se facciamo in funzione-0, ./function-0, vedremo che chiede il mio nome. Digito David, e tipi fuori il mio nome. Se lo faccio di nuovo con Rob, sta andando a dire "Ciao, Rob." Quindi una semplice idea, ma forse estrapolare da questo mentalmente che, come i programmi ottengono un po 'più complicato, e volete scrivere un pezzo di codice e chiamata code-- Invoke che code-- da alcuni descrittivo nome come PrintName, C fa ci permettersi questa capacità. Ecco un altro semplice esempio. Ad esempio, se apro una presentare da oggi chiamato return.c, accorgo di quello che ho fatto qui. La maggior parte di questa funzione principale è printf. Ho arbitrariamente inizializzare un variabile chiamata x il numero 2. Ho quindi stampare fuori "x è ora % I "passando il valore di x. Quindi sto solo dicendo quello che è. Ora sono appena audacemente sostenendo con printf. Sto cubatura che il valore x, e io sono farlo chiamando una funzione chiamato cubo di passaggio in x come argomento, e quindi salvare l'output nella variabile stessa, x. Così sto sovrascrivere il valore di x. Sto ignorando l' valore di x con qualsiasi il risultato della chiamata questa funzione cubo è. E poi ho appena stampare alcune roba birichino qui a dire quello che ho fatto. Allora, qual è allora il cubo? Notate ciò che è fondamentalmente diverso qui. Ho dato la funzione un nome come prima. Ho specificato un nome per un argomento. Questa volta si chiama n al posto del nome, ma ho potuto chiamare tutto quello che voglio. Ma questo è diverso. Questa cosa a sinistra. In precedenza era cosa parola chiave? Ragazzi. Ora è ovviamente int. Così che cosa è forse il take away? Considerando che significa vuoto sorta di nulla, e che era il caso. PrintName restituito nulla. Lo ha fatto qualcosa, ma non mi ha mano indietro qualcosa che ho potuto mettere in lato sinistro di un segno di uguale come ho fatto qui sulla linea 22. Quindi, se io dico in sulla linea 30, che cosa è che, probabilmente, implica su ciò che cube fa per me? Sì? Restituisce un numero intero. Così mi porge indietro, per esempio, un pezzo di carta su cui ha scritto la risposta. 2 cubetti, o 3 cubetti, o 4 cubed-- qualunque cosa ho passato in, e come ho implementare questo? Beh, basta n volte n volte n è come potrei cubo un valore. Quindi, di nuovo, super semplice idea, ma dimostrativo ora come possiamo scrivere funzioni che in realtà ci aveva indietro valori che potrebbero essere di interesse. Vediamo un ultimo esempio qui chiamato funzione one. In questo esempio, si inizia per ottenere più convincente. Quindi in funzione di uno, questo Avviso program-- definitiva chiama una funzione chiamata GetPositiveInt. GetPositiveInt non è un funzione nella libreria CS50, ma abbiamo deciso che vorrebbe di esistere. Quindi, se scorriamo più avanti nel file, Noto come sono andato circa l'attuazione ottenere int positivo, e io dire che è più convincente perché questo è un decente numero di linee di codice. Non è solo una stupida piccolo programma giocattolo. In realtà ha qualche controllo degli errori e fare qualcosa di più utile. Quindi, se non avete visto il walkthrough video che abbiamo incorporati in pset1, sa che questo è un tipo di ciclo in C, simile nello spirito per i tipi di cose Scratch può fare. E fare dice fare questo. Stampa questo fuori. Poi andare avanti e ottenere n-- ottenere un int e conservarla in n, e continuare a fare questo ancora e ancora e nuovamente finché n è minore di uno. Così n sta per essere meno di un solo se l'umano non sta cooperando. Se lui o lei sta scrivendo a 0 o -1 o -50, questo ciclo sta per mantenere eseguire più e più volte. E infine notato, ho semplicemente restituire il valore. Così ora abbiamo una funzione che sarebbe stato bello se CS50 attuerebbe in CS50.h e CS50.c per te, ma qui possiamo ora implementare questo noi stessi. Ma due commenti su alcuni dettagli importanti. Tra-- perché ho dichiaro int n, pensi che, sulla linea 29 invece di fare questo qui, che è più coerente con quello che abbiamo fatto la scorsa settimana? Sì? Un buon pensiero. Quindi, se dovessimo mettere qui, è come se noi mantenere dichiarando ancora e ancora. Che in sé e per sé è non problematico, di per sé, perché abbiamo solo bisogno il valore di una volta e poi stiamo andando a ottenere un nuovo uno comunque. Ma un buon pensiero. Sì? Chiudi. Quindi perché ho dichiarato n su linea 29 al di fuori del ciclo, è accessibile in tutta questa intera funzione. Non le altre funzioni, perché n è ancora all'interno di questi ricci bretelle qui. So-- sicuro. Esattamente. Quindi questo è ancora di più per il punto. Se invece dichiarato n proprio qui sulla linea 32, è problematico perché congettura dove altro ho bisogno di accedervi? Nella riga 34, e la semplice regola empirica è che è possibile utilizzare solo una variabile all'interno dei più recenti parentesi graffe in cui è dichiarato. Purtroppo, la linea 34 è una linea troppo tardi, perché ho già chiuso la parentesi graffa sulla linea 33 che corrisponde al parentesi graffa sulla linea 30. E quindi questo è un modo di dire che questa variabile int è ambito, per così dire, a solo all'interno di quelle parentesi graffe. Semplicemente non esiste al di fuori di essi. Quindi, in effetti, se faccio questo sbagliato, mi permetta di salvare il codice come è-- erroneamente scritto. Lasciami andare avanti e fanno funzione-1, e l'errore notice--. L'uso del sommerso identificatore n sulla linea 35, che è proprio qui. E se noi Scroll Up ulteriormente, un altro. L'uso di sommerso identificatore n on line 34. Quindi il compilatore, Clang, sta notando che solo non esiste, anche se chiaramente è lì visivamente. Così un semplice correzione sta dichiarando lì. Ora vorrei scorrere fino a all'inizio del file. Che cosa salta fuori a voi come essendo un po 'diverso dalla roba abbiamo guardato la settimana scorsa? Non solo mi hanno nome, non solo fare Ho alcuni forte intende cima, Ho qualcosa che sono chiamando un prototipo. Ora che sembra terribilmente simile a quello che abbiamo appena visto un momento fa sulla linea 27. Quindi cerchiamo di dedurre da un diverso messaggio di errore perché ho fatto questo. Lasciami andare avanti e eliminare queste righe lì. E così non sappiamo nulla prototipo. Remake questo file. Effettuare una funzione. E ora, accidenti, quattro errori. Facciamo scorrere fino alla prima. Dichiarazione implicita di funzione ottenere int positivo è valido in C99. C99 significa solo 1999 versione del linguaggio C, che è quello che stiamo effettivamente usando. Che cosa significa questo? Beh C-- e più specificamente C compilers-- sono programmi abbastanza stupidi. Sanno solo ciò che hai detto loro, e questo è in realtà tematica della scorsa settimana. Il problema è che se vado sull'implementazione nome qui, e chiamo una funzione chiamata GetPositiveInt qui sulla linea 20, tale funzione non tecnicamente non esistere fino a quando il compilatore vede linea 27. Purtroppo, il compilatore è fare le cose in alto, in basso, a sinistra, a destra, così perché non ha visto la implementazione di GetPositiveInt, ma si vede voi cercando usarlo qui, è solo andare a bail-- urlare a con un errore message-- forse criptico, e in realtà non compilare il file. Così un cosiddetto prototipo up qui è certamente ridondante. Letteralmente, sono andato qui e ho copiato e incollato questo, e l'ho messo qui. Void sarebbe più corretto, quindi dovremo letteralmente copia e incolla questa volta. Ho letteralmente copiato e incollato esso. In realtà proprio come come una briciola di pane. Un piccolo indizio per il compilatore. Non so che cosa questo fa ancora, ma sto promettendo a voi che esisterà casualmente. Ed è per questo che questo line-- in linea 16-- termina con un punto e virgola. E 'superfluo alla progettazione. Sì? Se non si collega la vostra biblioteca a the-- oh, bella domanda. Sharp include inclusioni di file di intestazione. Necessità di essere-- dovrebbe quasi essere sempre al top del file per un similar-- per esattamente la stessa ragione, sì. Perché nella norma io.h è letteralmente una linea risultati simili, ma con la parola printf, e con i suoi argomenti e il tipo restituito. E così facendo tagliente includono up qui, quello che stai facendo letteralmente sta copiando e incollando il contenuto qualcun altro ha scritto sulla parte superiore. In tal modo cluing il codice per il fatto che esistono tali funzioni. Sì? Assolutamente. Così un molto intelligente e corretta soluzione sarebbe, sai una cosa? Io non so quello che un prototipo è, ma so se capisco che C è solo muto e ripensa cima a fondo. Bene diamo ciò che vuole. Tagliamo quel codice, incollarlo su top, e ora spingere principale in basso. Anche questo risolverebbe il problema. Ma si potrebbe facilmente venire con uno scenario in cui la necessità di chiamare B, e magari B richiama ad A. Questo è qualcosa che si chiama ricorsione, e torneremo a questo. E può o non può essere un buon cosa, ma si può sicuramente rompere questa soluzione. E inoltre, vorrei rivendicare stilisticamente, soprattutto quando i vostri programmi diventare questo lungo e così a lungo, è solo super conveniente mettere principale in cima perché è la cosa più programmatori stanno andando a preoccuparsi. E quindi è un po 'più pulito, probabilmente, a farlo nel modo Originariamente ho fatto con un prototipo anche anche se sembra un po ' ridondante a prima vista. Sì? Siamo spiacenti, si può dire che più forte? Se si cambia la posizione del l'attuazione e il prototipo? Quindi questa è una buona domanda. Se si ri-dichiarare questo in giù qui, vediamo cosa succede. Quindi, se ho messo questo giù qui, stai dicendo. Oh, mi dispiace. Louder? Ancora più forte. Oh, buona domanda. Sarebbe invalidare la funzione? Sai, dopo tutti questi anni, ho hanno mai messo un prototipo in seguito. Allora, facciamo fare la funzione-1 dopo aver fatto questo. [Borbottando] DAVID J. MALAN: Oh, aspetta. Dobbiamo ancora mettere tutto sulla parte superiore. Allora, facciamo questo qui, se sono comprendere correttamente la tua domanda. Sto mettendo tutto, compreso il prototipo sopra principale, ma sto mettendo il prototipo sotto l'attuazione. Quindi se faccio uno, sto diventando indietro un error-- inutilizzato variabile n. Oh, lì. Grazie. Vediamo, ci liberiamo di questa. Questo è un bug diverso, quindi cerchiamo di ignorare che. Facciamo davvero rifare rapidamente questo. OK, quindi non argomentazione dati utilizzato per formato String n-- oh, ecco perché Ho cambiato a questi qui. Va bene, sappiamo quale sia la risposta sta andando a-- tutto bene, qui andiamo. Ah, grazie per il positivo. Va bene, io risolverà questo codice after-- ignorare questo particolare bug poiché questo era-- funziona è la risposta. Quindi non sovrascrive quello che hai appena fatto. Ho il sospetto che il compilatore è scritto in modo tale che ignora il tuo prototipo perché il corpo, per così dire, della funzione ha già stato attuato più in alto. Avrei dovuto consultare realtà il manuale del compilatore per capire se c'è qualche altra implicitamente, ma a prima vista solo provando e sperimentando, non sembra esserci alcun impatto. Buona domanda. Quindi cerchiamo di andare avanti adesso, muovendo lontano da effetti collaterali che sono funzioni che fanno qualcosa di simile visivamente sullo schermo con printf, ma non restituiscono un valore. E funzioni che sono di ritorno valori come abbiamo appena visto alcuni. Abbiamo già visto questa nozione di portata, e vedremo questo nuovo e di nuovo. Ma per ora, di nuovo, utilizzare la regola del pollice che una variabile può essere utilizzata solo all'interno della più recente apertura e parentesi graffe chiuse come abbiamo vide in quel particolare esempio. E come lei ha sottolineato, c'è un ability-- si potrebbe risolvere alcuni di questi problemi mettendo una variabile globale in cima di un file. Ma in quasi tutti i casi vorremmo disapprovare che, e anzi nemmeno andare in questa soluzione per ora. Quindi per ora, l'asporto è che variabili hanno questa nozione di portata. Ma ora diamo un'occhiata a un altro via secca effettivamente cercando a un certo piuttosto interessante dettagli di implementazione. Come possiamo rappresentare le informazioni. E abbiamo già esaminato questo nella prima settimana di classe. Guardando binari, e ricordare a noi stessi di decimali. Ma ricorderete dalla scorsa settimana che C ha diversi tipi di dati e grappoli più, ma quelli più utili per ora potrebbe essere questi. Un char, o carattere, il che accade di essere un byte, o otto bit totale. E questo è per dire che la dimensione di un char è un solo byte. Un byte è otto bit, quindi questo significa che possiamo rappresentare il numero di caratteri. Quante lettere o simboli sulla tastiera se abbiamo un byte o otto bit. Ripensate alla settimana a zero. Se si dispone di otto bit, quanti valori totali si può rappresentare con modelli di zero e uno? Tra-- più di questo. Quindi, 256 in totale, se si iniziare il conteggio da zero. Quindi, se avete otto bits-- quindi se avuto le nostre lampadine binari qui di nuovo, potremmo trasformare quelle lampadine su e si spegne in uno qualsiasi dei 256 modelli unici. Ora, questo è un po 'problematico. Non tanto per l'inglese e lingue romanze, ma certamente quando si introduce, per esempio, lingue asiatiche, che sono di gran lunga più simboli che come 26 lettere dell'alfabeto. Abbiamo effettivamente aver bisogno più di un byte. E per fortuna in ultimi anni ha società altri standard adottati che utilizzano più di un byte per carica. Ma per ora in C, il valore predefinito è solo un byte o otto bit. Un numero intero, nel frattempo, è di quattro byte, altrimenti noto come 32 bit. Il che significa che cosa è il più grande possibile numero possiamo rappresentare con un int a quanto pare? Con un miliardo. Quindi è quattro miliardi di dare o prendere. 2 alla potenza 32th, se non si assumono alcuna numeri negativi e basta usare tutti positivi numeri, si tratta di quattro miliardi dare o prendere possibilità. Un galleggiante, invece, è un tipo diverso del tipo di dati in C. E 'ancora un numero, ma è un numero reale. Qualcosa con un punto decimale. E si scopre che C utilizza anche quattro byte per rappresentare valori in virgola mobile. Purtroppo quanti galleggiante valori dei punti ci sono nel mondo? Quanti numeri reali ci sono? C'è un infinito numero, e per questo c'è un numero infinito di interi. Quindi siamo già tipo di scavare noi stessi un buco qui. Per cui a quanto pare in computers-- a meno programmi scritti in C su them-- può contare solo su quanto quattro miliardi di prendere o lasciare, e valori in virgola mobile può solo apparentemente avere una certa quantità finita di precisione. Solo così tante cifre dopo il loro punto decimale. Perché, ovviamente, se hai solo 32 bit, Non so come faremo ad andare su rappresentando reale numbers-- probabilmente con diversi tipi di modelli. Ma c'è sicuramente finita numero di tali modelli, ecco, anche questo è problematico. Ora siamo in grado di evitare un po 'il problema. Se non si utilizza un galleggiante, si potrebbe usare un doppio in C, che ti dà otto byte, che è modo più modelli possibili di zeri e quelli. Ma è ancora finita, che sta ad essere problematico se si scrive software per la grafica o per la fantasia formule matematiche. Così si potrebbe effettivamente desidera a contare più grande di questo. Un named-- lunga long-- stupidamente è anche otto byte, o 64 bit, e questo è il doppio del tempo come un int, ed è un valore intero lungo. Fun fact-- se un int è di quattro byte, Quanto dura un lungo in C tipicamente? Inoltre quattro byte, ma un lunga lunga è di otto byte, e questo è per ragioni storiche. Ma il takeaway ora è solo che i dati ha di essere rappresentati in un computer-- che è un dispositivo fisico con l'elettricità, è generalmente di guida questi zeri e ones-- con quantità limitate di precisione. Allora qual è il problema allora? Beh, c'è un problema di integer overflow. Non solo in C, ma in computer in generale. Per esempio, se questo è un byte vale un bit-- quindi se questo è di otto bit-- tutto di cui sono il numero uno. Che numero è questo che rappresenta se assumiamo si tratta di tutti i valori positivi in ​​binario? 255, e non è 256, perché zero è il numero più basso. Quindi 255 è il più alto uno, ma il problema è Suppongo che volevo incrementare questa variabile che utilizza otto bit in totale se voglio incrementarlo. Beh, non appena aggiungo un uno a tutti questi, si può forse immaginare visually-- solo come portare l'uno utilizzando decimals-- qualcosa che sta andando a scorrere verso sinistra. E in effetti, se aggiungo il numero uno di questo, ciò che accade in binario è che trabocca di nuovo a zero. Quindi, se solo non use-- un int, ma un singolo byte per contare numeri interi in un programma, da default-- appena si arriva a 250, 251, 252, 253, 254, 255-- 0 viene dopo 255, che non quello che è probabilmente un utente sta per aspettarsi. Ora, nel frattempo in virgola mobile mondo, anche voi avete un problema simile. Non tanto con la più grande number-- anche se questo è ancora un problema. Ma con la quantità di precisione che si può rappresentare. Quindi diamo un'occhiata a questo esempio anche qui da code-- fonte di oggi float-0.c. E notate che è un super semplice programma che dovrebbe apparentemente stampare che valore? Cosa scommettere che questo sta per stampare anche se c'è un po 'di nuova sintassi qui? Così si spera 0.1. Quindi l'equivalente di un decimo perché sto facendo 1 diviso per 10. Sto memorizzare la risposta in una variabile denominata f. Tale variabile è di tipo float, che è una parola chiave ho appena proposto esistito. Noi non abbiamo visto prima, ma questo è una specie di un modo pulito di printf per specificare quante cifre si voglio vedere dopo un punto decimale. Quindi questa notazione significa semplicemente che qui è un segnaposto. E 'per un virgola mobile valore, e oh, a proposito, mostrare con il punto decimale con un numero dopo il punto decimale. Ecco, questo è il numero di cifre significative, per così dire, che si potrebbe desiderare. Quindi lasciami andare avanti e fare rendere float-0, ./float-0, e apparentemente 1 diviso 10 è 0,0. Ora, perché è questo? Bene ancora una volta, il computer sta prendendo me letteralmente, e ho scritto 1 e ho scritto 10, e prendere una congettura che cosa è il tipo di dati assunta per quei due valori? Un int, è tecnicamente qualcosa di un po 'diverso. È tipicamente un lungo, ma è in ultima analisi, un valore integrale. Non è un valore in virgola mobile. Il che vale a dire che se questo è un int e questo è un int, il problema è che il computer non ha la capacità per archiviare anche questo punto decimale. Così, quando si fa 1 diviso da 10 utilizzando numeri interi sia per il numeratore e il denominatore, la risposta dovrebbe essere 0.1. Ma il computer-- perché quelli sono integers-- non sa cosa fare con il 0.1. Così che cosa sta chiaramente facendo? E 'solo buttare via, e quello che sto vedendo in ultima analisi, 0.0 è solo perché ho insistito che printf mi mostra un punto decimale. Ma il problema è che se si dividere un numero intero da un numero intero, si get-- per definizione di C-- un numero intero. E non sta andando a fare qualcosa di bello e conveniente come intorno ad esso fino alla più vicino verso l'alto o verso il basso. Sta andando per troncare tutto dopo il decimale. Quindi, solo intuitivamente, ciò che è probabilmente una correzione? Qual è la soluzione più semplice qui? Sì? Esattamente. Perché non solo trattiamo questi come floating efficacemente valori a virgola trasformandoli in galleggianti o doppie. E ora se lo faccio fare carri-0, o se compilo carri-1, che è identico a ciò che è stato appena proposto. E ora che faccio carri-0, ora ho il mio 0.1. Ora, questo è incredibile. Ma ora ho intenzione di fare qualcosa di un po 'diverso. Sono curioso di vedere ciò che è veramente succedendo sotto il cofano, e ho intenzione di stampare questa out a 28 cifre decimali. Voglio vedere davvero 0.1000-- un infinite-- [Incomprensibile] 27 zeri dopo che 0.1. Beh, vediamo se questo è quello che davvero ottengo. Fai carri-0 stesso file. ./floats-0. Andiamo ingrandire sulla risposta drammatica. Per tutto questo tempo, hai pensato 1 diviso per 10 è del 10%, o 0,1. Non è. Almeno quanto l' computer in questione. Ora why-- OK, questo è completo lie 1 diviso 10 è 0,1. Ma why-- che non è oggi l'asporto. Allora perché non pensare al computer, a differenza di tutti noi nella stanza, che 1 diviso per 10 è in realtà che il valore pazzo? Qual è il computer facendo quanto pare? Che cos'è? Non è troppo pieno, di per sé. Overflow è in genere quando si avvolge intorno ad un valore. E 'questione di imprecisione in un valore in virgola mobile dove hai solo 32 o forse anche 64 bit. Ma se c'è un infinito numero di beni numbers-- numeri con punti decimali e numeri thereafter-- sicuramente non è possibile rappresentare tutti loro. Così il computer ha dato noi la corrispondenza più vicina il valore può rappresentare utilizzando tale molti bit di valore Io in realtà voglio, che è 0,1. Purtroppo, se si iniziare a fare la matematica, o si avviare coinvolgendo questi tipi di galleggianti valori in punti in importante programs-- software finanziario, nulla software-- militare dove la percezione è probabilmente abbastanza importante. E si comincia ad aggiungere numeri come questo, e inizio esecuzione che il software con davvero grandi ingressi o per un sacco di ore o lotti di giorni o un sacco di anni, questi piccoli piccoli errori sicuramente può aggiungere nel tempo. Ora, come un a parte, se hai mai visto Superman 3 o Office Space e si potrebbe ricordare come quei ragazzi rubato un sacco di soldi dal proprio computer utilizzando i valori in virgola mobile e sommando il piccolo resti, si spera che film ora ha più senso. Questo è ciò che erano alludendo in quel film. Il fatto che la maggior le aziende non sarebbero dopo un certo numero di cifre decimali, ma quelli sono frazioni di centesimi. Quindi iniziare ad aggiungere in su, si inizia a fare un sacco di soldi nel vostro conto in banca. Ecco, questo è Office Space spiegato. Ora, purtroppo, al di là Office Space, ci sono alcuni legittimamente preoccupante e impatti significativi di questi tipi di decisioni di progettazione sottostanti, e in effetti una delle ragioni usiamo C nel corso è così che realmente avete questa terra up comprensione di come funzionano i computer, come il software funziona, e non fare dare nulla per scontato. E infatti purtroppo, anche con che la comprensione fondamentale, noi esseri umani facciamo degli errori. E quello che ho pensato di condividere è questo video otto minuti qui preso da un episodio di Modern Marvels, che è uno spettacolo educativo su come funzionano le cose che dipinge due immagini di quando un uso improprio e comprensione valori a virgola mobile portato ad alcune significative risultati sfortunati. Diamo uno sguardo. [RIPRODUZIONE VIDEO] -Abbiamo Ora tornare alla "Ingegneria Disastri "a Modern Marvels. Computer. Abbiamo tutti arrivati ​​ad accettare la problemi spesso frustranti che ottenuto con them-- bug, virus, e glitches-- software per i piccoli prezzi a pagare per la comodità. Ma in alta tecnologia e ad alta velocità applicazioni programmi spaziali militari e, il più piccolo problema può essere ingrandita in disastro. Il 4 giugno del 1996, gli scienziati preparati per lanciare un senza pilota razzo Ariane 5. Si stava trasportando scientifica satelliti progettati stabilire precise modalità Interagisce campo magnetico della Terra con venti solari. Il razzo è stato costruito per l'Agenzia spaziale europea, e sollevato dal suo stabilimento sulla costa della Guyana francese. -At Circa 37 secondi dall'inizio il volo, in primo luogo qualcosa notato stava andando male. Che gli ugelli sono orientabili in un modo che davvero non dovrebbe. Circa 40 secondi dall'inizio del volo, chiaramente il veicolo era in difficoltà, e che quando hanno fatto la decisione di distruggerla. Il responsabile della sicurezza gamma, con enormi budella, premuto il pulsante e fatto saltare in aria il razzo prima che potesse diventare un pericolo per la sicurezza pubblica. -Questo Era la fanciulla viaggio di Ariane 5, e la sua distruzione ha preso posizionare a causa del difetto incorporato nel software del razzo. -Il Problema sul Ariane era che ci è un numero che ha richiesto 64 bit per esprimere, e volevano convertire ad un numero di 16 bit. Si presume che il numero non è mai stata intenzione di essere molto grande. Che la maggior parte di queste cifre in il numero a 64 bit erano zeri. Si sbagliavano. -La Incapacità di una programma software per accettare il tipo di numero generato da un altro era alla radice del fallimento. Lo sviluppo del software era diventato un parte molto costosa delle nuove tecnologie. Il razzo Ariane 4 ha avuto molto successo. Quindi gran parte del software realizzato per è stato utilizzato anche nel Ariane 5. -Il Problema di fondo era che l'Ariane 5. È stato faster-- accelerato più veloce, e il software non ha rappresentato per questo. -La Distruzione del razzo è stato un enorme disastro finanziario. Tutto a causa di un errore software minuto. Ma questa non era la prima problemi di conversione dei dati in tempo aveva afflitto moderna tecnologia dei razzi. -In 1991 con l'inizio della prima guerra del Golfo, il missile Patriot sperimentato un genere simile di un problema numero conversione. E come risultato 28 people-- 28 Soldiers-- americani sono stati uccisi, e circa un centinaio di altri feriti. Quando il Patriot, che avrebbe dovuto per la protezione contro Scud in arrivo, non è riuscito a sparare un missile. -Quando Iraq invase il Kuwait, e in America Desert Storm lanciato all'inizio del 1991, Batterie di missili Patriot sono state dispiegate per proteggere l'Arabia Saudita e Israele da attacchi missilistici iracheni Scud. Il Patriot è un medio raggio USA superficie-aria del sistema prodotto dalla società Raytheon. -La Dimensione del Patriot interceptor itself-- è lungo circa circa 20 metri, e pesa circa 2.000 chili. E porta una testata di circa, Penso che sia circa 150 libbre. E la testata è di per sé un alto esplosivo, che ha frammenti intorno a lui. Così la carcassa è testata progettato per agire come un pallettoni. -Le Missili vengono effettuate quattro per container, e sono trasportati da un semirimorchio. -Il Sistema Patriot anti-missile risale ad almeno 20 anni. È stato originariamente progettato come una difesa missile aria di abbattere gli aerei nemici. Nella prima guerra del Golfo quando quella guerra è venuto su, l'esercito voleva usarlo per abbattere Scud, non aerei. L'Air Force irachena era non tanto di un problema, ma l'esercito era preoccupato per Scud. E così hanno cercato di aggiornare il Patriot. -Intercepting Un nemico missile che viaggia a Mach 5 stava per essere abbastanza impegnativo. Ma quando il Patriot è stato ricoverato in servizio, l'esercito non era a conoscenza di una modifica iracheno che fatto i loro scudi quasi impossibile da esso. -Che Che è successo è che gli Scud stavano arrivando in stati instabili. Erano traballante. La ragione di questo è stato il Iraqis-- al fine di ottenere 600 chilometri fuori di una gamma missile-- 300 chilometri preso peso su testata anteriore, e fatta la testata più leggero. Così ora il Patriot sta cercando di venire al Scud, e la maggior parte della tempo-- la stragrande maggioranza della tempo-- sarebbe solo volare dal Scud. -Una Volta i gestori del sistema Patriot realizzato il Patriot mancato il suo obiettivo, hanno fatto esplodere testata del Patriot al fine di evitare possibili perdite se esso è stato permesso di cadere a terra. -Che Era quello che la maggior parte delle persone ha visto come grandi palle di fuoco nel cielo, e frainteso come intercettazioni di testate Scud. -Anche Nei cieli notturni, Patriots sembrava essere distrutto con successo Scud, a Dhahran ci potrebbe essere Non commettere errori sulle sue prestazioni. C'è il sistema radar del Patriot perso le tracce di una Scud in arrivo e mai lanciato dovuta ad un difetto del software. Era gli israeliani che per primo ha scoperto che il più il sistema era acceso, maggiore è il tempo di discrepanza è diventato. A causa di un orologio incorporato nel computer del sistema. -Circa Due settimane prima la tragedia in Dhahran, gli israeliani riferito a il Dipartimento della Difesa che il sistema stava perdendo tempo. Dopo circa otto ore di corsa, hanno notato che il sistema di divenire notevolmente meno accurato. Il Dipartimento della Difesa ha risposto raccontando tutte le batterie Patriot di non lasciare i sistemi per lungo tempo. Non hanno mai detto quello che un tempo era. 8 ore, 10 ore, mille ore. Nessuno lo sapeva. -Il Batteria Patriot di stanza presso la caserma a Dhahran e la sua viziata interna orologio è arrivata al oltre 100 ore la notte del 25 febbraio. -It Cingolato tempo con una precisione di circa un decimo di secondo. Ora un decimo di secondo è un numero interessante perché non può essere espresso in binario esattamente, che significa che non può essere espressa esattamente in qualsiasi moderno computer digitale. E 'difficile da credere, ma utilizzare questo come un esempio. Prendiamo il numero di un terzo. Un terzo non può essere espresso in decimali esattamente. Un terzo è 0.333 in corso per l'infinito. Non c'è modo di farlo con precisione assoluta in un decimale. Questo è esattamente il tipo di problema quello che è successo nel Patriot. Più lungo è il sistema ha funzionato, il peggio l'errore di tempo è diventato. -Dopo 100 ore di funzionamento, il errore nel tempo era solo circa un terzo di un secondo. Ma in termini di mira un missili che viaggiano a Mach 5, si è tradotto in un inseguimento errore di oltre 600 metri. Sarebbe un errore fatale per i soldati a Dhahran. -Che Che è accaduto è un lancio Scud era rilevato da satelliti di allarme, e sapevano che stava arrivando un Scud nella loro direzione generale. Non sapevano dove venisse. Ora era fino al radar componente del sistema Patriot difendendo Dhahran per individuare e mantenere traccia del missile nemico in arrivo. -Il Radar era molto intelligente. Sarebbe in realtà traccia la posizione del Scud e poi prevedere dove probabilmente sarebbe al successivo radar inviato un impulso. Che è stato chiamato il cancello gamma. -Poi Una volta che il Patriot decide il tempo ha passata di tornare indietro e controllare il successivo posizione per questo oggetto rilevato va indietro. Così, quando si tornò al sbagliata posto, poi vede alcun oggetto. E decide che non vi era alcun oggetto. Che ci fosse un rilevamento falso e si scende in pista. -Il Scud in arrivo scomparso dallo schermo radar, e pochi secondi più tardi, sbattuto in caserma. La Scud ha ucciso 28. E 'stato l'ultimo licenziato durante la prima guerra del Golfo. Tragicamente, il software aggiornato arrivato all'alba del giorno seguente. Il difetto software aveva stato, chiusura fisso un capitolo nella travagliata storia del missile Patriot. [FINE RIPRODUZIONE VIDEO] DAVID J. MALAN: Questo è tutto per CS50. Ci vediamo il Mercoledì. [GIOCO MUSICA]