>> [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]