[MUSIC PLAYING] DAVID J MALAN: Va bene, bentornato CS50. Questo è l'inizio di settimana due. Una parola da un nostro amici del campus - se siete interessati, possibilmente, sia ora o in un futuro periodo ancora, una volta più confortevole, insegnamento studenti delle scuole medie un po ' qualcosa di informatica, fare capo a tale URL. Essi sono in particolare bisogno in questo momento di insegnanti, in particolare se avete avuto qualche esposizione alla scienza informatica. Quindi ricorda che l'ultima volta, abbiamo introdotto alcuni tipi di dati in C, e si può avere iniziato per ottenere la vostra mani sporche con questi finora nel problema di impostare uno. E abbiamo avuto un char. Quindi, in termini un po 'tecnici, cosa è un char come lo conoscete oggi? Quindi è un personaggio, ma ti permette di essere più preciso ora. Cosa si intende per carattere o individuale char? Un carattere non numerico - quindi non necessariamente. Si scopre che i numeri pari, anche punteggiatura e lettere sono rappresentato con questi dati tipo conosciuto come un char. Quindi non è necessariamente alfabetico. Sì? Quindi è un carattere ASCII. Quindi, se si pensa di nuovo a settimana pari a zero, quando abbiamo avuto la nostra byte di volontari venire e sia tenere le mani in alto o non tutti, hanno rappresentato punte. Ma collettivamente come un gruppo di otto, rappresentavano un byte. E abbiamo introdotto la nozione di ASCII a quella conferenza, che semplicemente è una mapping tra i numeri e le lettere. E utilizza ASCII, come gli umani implicite, otto bit per rappresentare un carattere. Quindi, di conseguenza, se otto bit possono ogni ripresa su uno dei due valori - zero o una - Ciò significa che ci sono due possibilità per questa persona - zero o una - due per questa persona, due per questo persona, due per questo. Quindi, per un totale di due volte due volte due volte due volte due - così due l'ottavo in totale. Quindi c'è un numero totale di caratteri 256 possibile che si può rappresentare con otto bit. Ora, quelli di voi che parlano asiatico lingue potrebbe sapere che non c'è più personaggi del mondo che solo As e Bs e Cs e Ds. E infatti, ASCII non sufficiente per molte lingue del mondo. Ma più su che un'altra volta. Per ora, sappiate che in C, se si vuole per rappresentare una lettera, un pezzo di punteggiatura, o semplicemente qualcosa di carattere in natura, usiamo un char. Ed è un byte o otto bit. Che ne dici di un int? Beh, un int è un intero. Quanti bit, se vi ricordate, era un intero genere? Chiunque richiamo? Quindi è generalmente 32. In realtà dipende dal computer che si sta utilizzando. Ma nel dell'apparecchio ed in molti computer, è 32 bit o quattro byte - otto volte quattro. E int sono solo utilizzati per la memorizzazione numeri, sia negativi, positivo o zero. E se hai 32 bit e hai solo cura di numeri positivi, può chiunque baseball quanti possibili interi un computer può rappresentare da zero su up? Quindi sarebbe due al 32, che è di circa quattro miliardi. Così queste potenze di due stanno per essere temi ricorrenti in informatica. Come vedremo, sono abbastanza conveniente per lavorare con anche se non è abbastanza facile fare i conti nella propria testa. Così diremo circa quattro miliardi. Ora, un lungo tempo - è possibile tipo di congettura. E 'più di un int. Quanti bit? Quindi 64 bit o otto byte. Questo significa solo è possibile rappresentare anche numeri più grandi, più grande positivo o numeri negativi più grandi. E che dire di galleggiare? Questo è un punto mobile valore di 32 bit. Questo è solo un numero reale, qualcosa di con un punto decimale. Ma se invece bisogno di più posti dopo la virgola o si desidera rappresentare un numero più grande con alcune frazione dopo di esso, è possibile utilizzare un doppia, che è di 64 bit. Ma c'è un interessante da asporto qui. Quindi, se interi sono limitati da 32 bit e anche i lunghi lunghi sono limitati dal 64 bit, quella sorta di elemosina la domanda, cosa succede se si vuole realmente contare superiore a 4 miliardi di euro per un int? Beh, basta usare una lunga lunga. Ma cosa succede se si desidera contare superiore di due per il 64 °, prendere o lasciare? Ora, questo è un numero enorme. Ma alla fine, in realtà si potrebbe cura di questi tipi di valori, soprattutto se si utilizza un database e iniziando a raccogliere un sacco e un sacco di dati e l'assegnazione unica numeri a ogni pezzo di quei dati. Così abbiamo genere di un problema. E allo stesso modo, con virgola mobile valori - galleggianti o doppie - se hai soltanto un numero finito di bit, quanti numeri totali hai potuto possibilmente rappresentare? Beh, è ​​meno chiaro quando si coinvolgere un punto decimale. Ma è sicuramente finita. Se si dispone di un numero finito di bit, un numero finito di esseri umani, una finita numero di lampadine, sicuramente si può rappresentano solo un numero finito di valori in virgola mobile. Ma quanti numeri reali sono loro nel mondo? C'è un infinito. Ecco, questo è una specie di problema perché abbiamo non hanno una quantità infinita di memoria RAM o all'interno dei nostri computer. Quindi alcune cose difficili possono accadere. Quindi cerchiamo di andare avanti e provare per esprimere questa qui. Lasciami andare avanti e di aprire gedit. Ho intenzione di andare avanti e salvare un file chiamato "floats0.c" solo per essere coerente con un esempio che è disponibile on-line, se si desidera. E ho intenzione di andare avanti e definirla come segue - Ho intenzione di andare avanti e dire: int void main, come spesso facciamo. E poi in questo programma, ho intenzione di mi dichiaro un galleggiante, quindi un 32 bit variabile chiamata f, arbitrariamente. E poi ho intenzione di conservare in esso Non lo so, un decimo, quindi 0.1. Quindi ho intenzione di esprimere che come uno diviso per 10, che è perfettamente legittimo in C. E poi sulla seconda riga, ho semplicemente desiderare di stampare tale valore. Quindi ricordiamo che possiamo usare il familiare printf. Non vogliamo usare% i per un int. Vogliamo usare% f per un galleggiante. E poi ho intenzione di fare backslash n, vicino citazione, virgola, f, punto e virgola. Quindi, ecco il mio programma. C'è già un bug. Fa qualcuno per cui questa cliccato già far notare almeno un bug che ho fatto? Sì? Già. Ho dimenticato "# include" alla superiore, essi sintomo di cui se cerco di compilare questo sta andando essere che il compilatore sta per urlare contro di me, dicendo simbolo indefinito o qualcosa in tal senso. Non si capisce qualcosa come printf. Quindi ho intenzione di fare "# include ", Salvare il file. E ora è più in forma. Ma ho anche intenzione di puntare fuori uno nuovo dettaglio oggi. Oltre a specificare luogo titolari come%% f i% s, è possibile talvolta influenzare il comportamento di quel segnaposto. Ad esempio, nel caso di un galleggiante valore del punto, se voglio solo per visualizzare un decimale dopo la periodo, posso effettivamente fare 0.1f. Quindi, in altre parole, io separo la f e il segno di percentuale con la 0.1, basta raccontando printf, si potrebbe avere un intero gruppo di numeri dopo la virgola punto per me. Ma io voglio solo vedere uno di loro. Quindi ho intenzione di andare avanti ora e risparmia questo programma, andare nel mio terminale finestra, e ho intenzione di andare avanti e il tipo di rendere galleggiante 0, immettere. Vedo che la linea un po 'criptico che comincerà ad avere più senso, come abbiamo prendere in giro a parte questa settimana e la prossima. Ora ho intenzione di andare avanti ed eseguire galleggiante zero. E, accidenti. Quindi c'è un altro bug qui per qualche motivo. Sono abbastanza sicuro che un decimo, o uno diviso per 10, non è 0.0. Forse sto solo cercando non alle cifre sufficienti. Allora, perché non dico due 0,2 di vedere due decimali invece di uno solo. Torniamo alla mia finestra del terminale qui e ha colpito un paio di volte per vedere la mia storia. Non far galleggiare di nuovo a zero, e poi di nuovo. E ora entrare. E ora sono abbastanza sicuro che questo è sbagliato. E potrei fare tre e quattro, e sono probabilmente andando a continuare a vedere zeri. Allora, dove è il bug? Una divisa per 10 dovrebbe essere 0.1. Qualcuno vuole prendere una pugnalata a quello il problema fondamentale è? Sì? Sono entrambi numeri interi. E allora? Quindi, con una divisa per 10, che è quello che faccio in aritmetica. E ottengo 0.1. Già. E così è in effetti tale questione. Quando si prende un numero intero in un computer e lo si divide per un altro numero intero, il computer di default sta per si supponga di voler un numero intero. Il problema se, naturalmente, è 0.1 che non è un numero intero. Si tratta di un numero reale. E così quello che il computer fa da di default è solo butta via tutto dopo il punto decimale. Non arrotondare o giù di per sé. Semplicemente butta via tutto dopo il punto decimale. E ora che ha un senso. Perché ora siamo chiaramente sinistra con zero. Ma aspettate un minuto. Io non sto vedendo un int zero. In realtà sto vedendo 0.00. Allora, come faccio a conciliare questo momento? Se uno diviso per 10 è pari a zero, ma sono vedendo 0.00, dove sta diventando riconvertito in numero reale? Già. Esattamente. Quindi qui in linea cinque, quando in realtà ho negozio che 0.1, che è poi troncato a zero, all'interno di un galleggiante, che è effettivamente equivalente a riporlo non come un int, ma, anzi, come un galleggiante. Inoltre, sto quindi utilizzando printf per stampare esplicitamente il numero a due decimali anche se vi potrebbe in realtà non essere una qualsiasi. Quindi questo tipo di schifo, vero? A quanto pare non si può fare la matematica, almeno a questo livello di precisione, in un computer. Ma sicuramente c'è una soluzione. Qual è la soluzione più semplice che potrebbe forse fare, anche solo intuitivamente qui per risolvere questo problema? Sì? Girare i numeri interi in - sì. Anche se non sono abbastanza sicuro che cosa è realmente accadendo qui, se ha fondamentalmente a che fare con questi due essere interi, bene, perché non ho fare quel 10.0, rendendo questo 1.0, salvare il file. Torniamo verso il fondo e ricompilare. Permettetemi ora di eseguire di nuovo. E lì - ora, io ho la mia decima rappresentate come 0.10. D'accordo. Così che non è male. E vorrei sottolineare un altro modo avremmo potuto risolto questo. Lasciatemi effettivamente rotolare indietro nel tempo a quando abbiamo avuto questo come uno decimo un momento fa. E mi permetta di andare avanti e salvare nuovamente il file come un nome di file diverso, solo per avere un po 'di posto di blocco. Così che era la versione uno. E ora lasciami andare avanti e eseguire una versione più. Chiameremo questa versione due zero indicizzati. E ho intenzione di fare, invece questo - si sa che cosa? Aggiunta di punti a zero funziona in questo caso. Ma supponiamo che uno fosse una variabile. Supposto 10 erano una variabile. In altre parole, supponiamo che non potevo solo duro-codice 0,0 alla fine di questa espressione aritmetica. Beh, posso effettivamente fare qualcosa tra parentesi chiamato fusione. Posso lanciare quella numero intero da 10 a un galleggiante, e posso esprimere che uno intero in un galleggiare, come bene. Poi la matematica che sta per essere fatto effettivamente 1,0 diviso per 10,0, il cui risultato va in f come prima. Quindi, se ho ricompilare questo come rendere galleggianti 2, e ora galleggia 2, ottengo lo stesso rispondere, pure. Quindi questo è un esempio abbastanza artificioso, per risolvere questo problema introducendo colata. Ma in generale, la fusione sta per essere una cosa potente, particolarmente per problema impostare due nel giro di una settimana, quando che si desidera convertire un tipo di dati un'altra che alla fine della giornata sono rappresentati nello stesso modo. Alla fine della giornata, ogni singolo cosa di cui abbiamo parlato finora è solo interi sotto la cappa. Oppure, se è troppo di basso livello per te, sono solo numeri sotto la cappa. Anche i personaggi, ancora una volta, richiamano da settimana a zero, sono numeri sotto la cappa. Il che vuol dire, siamo in grado di conversione tra vari tipi di numeri se sono solo bit. Siamo in grado di convertire tra i numeri e le lettere se sono solo bit, e viceversa. E colata in questo modo è un meccanismo in programmazione che consente di forza cambiare un tipo di dati all'altro. Purtroppo, questo non è come semplice come avrei voluto. Ho intenzione di tornare in carri allegorici 1, che era il più semplice, più uno semplice con .0 Aggiunto a ciascuna. E proprio come un rapido aggiornamento, mi permetta di andare avanti e ricompilare questo, rendere galleggianti 2 - Siamo spiacenti, questo è fare i galleggianti 1. E adesso corriamo galleggianti 1. E in fondo, notare che ho davvero capito 0.1. Quindi, problema risolto. Ma non ancora. Ora sto andando a prendere un po 'curioso, e ho intenzione di tornare nella mia printf e dire, sai cosa? Vorrei confermare che questo è davvero un decimo. E ho intenzione di voler vedere questo a, diciamo, cinque cifre decimali. Non è un problema. Cambio il due a cinque, Ho ricompilare con make. Ho eseguire nuovamente come galleggia 1. Cercando piuttosto bene. I miei controlli di integrità potrebbe finire lì, ma Sto diventando un po 'più avventuroso. Ho intenzione di cambiare 0,5-0,10. Voglio vedere 10 cifre dopo il decimale. E ho intenzione di andare avanti e ricompilare questo e rieseguire galleggia 1. I tipi di rammarico dopo aver testato questa ulteriormente perché la mia matematica non è così Correggere più, a quanto pare. Ma aspettate un minuto, forse questo è solo un colpo di fortuna. Forse il computer agisce un po 'strano. Lasciatemi andare avanti e fare 20 punti decimali e rassicurare me stesso che io so come fare la matematica. Io so come programmare. Fai galleggianti 1, ricompilare e dannazione. Questo è davvero, davvero sempre lontano dal marchio. Così che cosa sta succedendo qui? Intuitivamente, in base alle nostre ipotesi precedenza circa la dimensione dei tipi di dati, ciò che deve accadere qui sotto il cofano? Sì? Esattamente. Se si desidera che questo molta precisione, e che è un diavolo di un sacco di precisione - 20 numeri dopo la virgola. Non si può forse rappresentare un numero arbitrario a meno che non si dispone di un numero arbitrario di bit. Ma non lo facciamo. Per un galleggiante, abbiamo solo 32 bit. Quindi se 32 bit possono essere permutati solo in un modo - proprio come i nostri uomini sul, palco mani su o giù - in un numero finito di modi, c'è solo un numero finito di numeri reali si possono rappresentare con quei bit. E così il computer alla fine sta andando ad avere per iniziare a tagliare gli angoli. Il computer può nascondere quei dettagli da noi per un po 'di tempo. Ma se cominciamo a frugare i numeri e guardando sempre più lontano alla trascinamento numeri in numero intero, allora iniziamo a vedere che è effettivamente approssimare la idea di un decimo. E così si scopre, tragicamente, non c'è un numero infinito di numeri noi non possiamo rappresentare con precisione in un calcolatore, almeno con una definita numero di bit, un finito quantità di RAM. Ora, purtroppo, questo a volte ha conseguenze reali. Se le persone non apprezzano molto questo o il tipo di danno per scontato il fatto che il loro computer sarà solo fare ciò che essi dicono di fare e non fare comprendere questi sottostante Dettagli rappresentanza - che, francamente, in alcune lingue sono nascosta dall'utente, contrariamente a C - alcune cose brutte possono accadere. E quello che ho pensato di fare è fare un passo indietro. E questo è circa video di otto minuti. E 'andato in onda qualche anno fa, e dà intuizioni in realtà ciò che può andare male quando si sotto-apprezzare questi tipi di dettagli nella molto fin troppo mondo reale. Se potessimo abbassare le luci per alcuni minuti. SPEAKER 1: Torniamo ora a ingegneria disastri su Modern Marvels. Computer - tutti abbiamo imparato ad accettare la problemi spesso frustranti che andare con loro. Bugs, virus e anomalie nel software sono piccoli prezzi da pagare per il convenienza. Ma in high-tech e ad alta velocità programma spaziale militare e applicazioni, il problema più piccolo può essere ingrandita in disastro. Il 4 giugno del 1996, gli scienziati disposti a lanciare un senza pilota razzo Ariane 5. Si stava trasportando satelliti scientifici atte a stabilire con precisione come campo magnetico terrestre interagisce con venti solari. Il razzo è stato costruito per l'Europa Agenzia spaziale e tolto dalla sua impianto sulla costa della Guiana francese. JACK GANSSLE: A circa 37 secondi in il volo, hanno notato prima qualcosa stava andando storto. 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 questo è quando hanno fatto una decisione di distruggerla. Il responsabile della sicurezza gamma, con budella tremende, preme il pulsante, fatto saltare in aria il razzo prima che potesse diventare un pericolo per la sicurezza pubblica. SPEAKER 1: Questo è stato il viaggio inaugurale di Ariane 5, e la sua distruzione ha avuto luogo a causa di un difetto incorporato nel software del razzo. JACK GANSSLE: Il problema sul Ariane era che c'era un numero che il termine di 64 bit di esprimere. E volevano convertire ad un numero a 16 bit. Si presume che il numero non è mai stato sarà molto grande, che la maggior parte queste cifre nel 64 bit numero erano zeri. Si sbagliavano. SPEAKER 1: L'incapacità di un software programma per accettare il tipo di numero generato da un altro stato alla radice del fallimento. Lo sviluppo del software era diventato molto costosa parte della nuova tecnologia. Il razzo Ariane 4, era stato molto successo, tanto del software creata per era anche utilizzato nel Ariane 5. PHILIP COYLE: Il problema di base è stato che l'Ariane 5 è stato più veloce, accelerato veloce. E il software non ha avuto rappresentato per questo. SPEAKER 1: La distruzione del razzo è stato un enorme disastro finanziario, tutto a causa di un errore di software minuto. Ma questa non era la prima volta i dati problemi di conversione avevano afflitto moderna tecnologia dei razzi. JACK GANSSLE: Nel 1991, con l'inizio della prima Guerra del Golfo, il Patriot missile vive una sorta simile di un problema di conversione numero. Come risultato, 28 soldati americani erano uccisi e circa 100 altri feriti quando il Patriot, che avrebbe dovuto per la protezione contro Scuds entranti, non è riuscito a sparare un missile. SPEAKER 1: Quando l'Iraq invase il Kuwait e L'America ha lanciato Desert Storm in All'inizio del 1991, batterie di missili Patriot sono stati dispiegati per proteggere l'Arabia Saudita e Israele da iracheni Scud attacchi missilistici. Il Patriot è un medio raggio US sistema superficie-aria prodotto da l'azienda Raytheon. THEODORE Postol: La dimensione del Patriot intercettore si è più o meno Lungo 20 piedi. E pesa circa 2000 chili. E porta una testata di circa - Penso che sia circa 150 chili. E la testata stessa è una alto esplosivo che ha frammenti intorno ad esso. L'involucro della testata è progettata di agire come pallettoni. SPEAKER 1: I missili vengono effettuate quattro per contenitore e vengono trasportati da un semirimorchio. PHILIP COYLE: The Patriot antimissile sistema torna a almeno 20 anni. È stato originariamente progettato come una difesa missile aria a abbattere aerei nemici. Nella prima guerra del Golfo, quando quella guerra è arrivato, l'esercito ha voluto usarlo di abbattere Scud, non di aeroplani. La forza aerea irachena non era tanto di un problema. Ma l'esercito era preoccupato per Scud. E così hanno cercato di aggiornare il Patriot. SPEAKER 1: Intercettare un missile nemico viaggia a mach cinque era andando ad essere abbastanza impegnativo. Ma quando il Patriot è stato ricoverato in servizio, l'esercito non era a conoscenza di un Modifica iracheno che ha fatto loro Scud quasi impossibile da colpire. THEODORE Postol: Che cosa è successo è il Scuds che erano in arrivo erano instabili. Erano vacillando. La ragione di questo è che gli iracheni, in Per ottenere 600 km su una Missile 300 chilometri di gamma, ha preso peso fuori dalla testata anteriore. Hanno fatto la testata più leggera. Così ora il Patriot sta cercando di venire al Scud. E la maggior parte del tempo, la stragrande maggioranza del tempo, sarebbe solo volare dal Scud. SPEAKER 1: Una volta che il sistema Patriot operatori realizzato il Patriot perdere il suo obiettivo, hanno fatto esplodere i Patriots testata per evitare possibili perdite se è stato consentito a cadere a terra. THEODORE Postol: Questo era ciò che più la gente ha visto come grandi palle di fuoco nel cielo e incompreso come intercetta di Scud testate. SPEAKER 1: Anche se in cielo notte Patriots sembrava essere successo distruggendo Scud, a Dhahran ci potrebbe essere errore circa la sua prestazioni. Lì, il sistema radar del Patriot perduto traccia di un Scud in entrata e mai avviato a causa di un difetto software. Era gli israeliani che per primo ha scoperto che il più il sistema era in, maggiore è il tempo di discrepanza divenne causa di un orologio incorporato nel computer del sistema. JACK GANSSLE: Circa due settimane prima della tragedia a Dhahran, gli israeliani segnalati al Dipartimento della Difesa che il sistema perdeva tempo. Dopo circa otto ore di funzionamento, hanno notato che il sistema è diventando notevolmente meno accurato. Il Dipartimento della Difesa ha risposto raccontando tutte le batterie Patriot per non lasciare i sistemi per molto tempo. Non hanno mai detto quello che un tempo era. Otto ore? 10 ore? 1000 ore? Nessuno lo sapeva. SPEAKER 1: La batteria di Patriot di stanza presso la caserma a Dhahran e il suo imperfetto orologio interno era stato su oltre 100 ore di notte di 25 febbraio. JACK GANSSLE: E 'il momento di un tracciato precisione di circa un decimo di secondo. Ora, un decimo di secondo è un numero interessante perché non può essere espresso in binario esattamente, il che significa esso non può essere espressa esattamente qualsiasi computer digitale moderno. E 'difficile da credere, ma utilizzare questo come esempio. Prendiamo il numero di un terzo. Un terzo non può essere espressa in decimale esattamente. Un terzo è 0.333 andando su di infinito. Non c'è modo di farlo con precisione assoluta in decimale. Questo è esattamente lo stesso tipo di problema quello che è successo nel Patriot. Più lungo è il sistema corse, la peggiore l'errore di tempo è diventato. SPEAKER 1: Dopo 100 ore di funzionamento, l'errore nel tempo è stato solo circa un terzo di secondo. Ma in termini di mira un missile viaggia a mach cinque, si è tradotto in un tracking error di oltre 600 metri. Sarebbe un errore fatale per i soldati a Dhahran. THEODORE Postol: Quello che è successo è un Scud lancio è stato rilevato da inizio satelliti di allarme. E sapevano che stava arrivando la Scud nella loro direzione generale. Non sapevano da dove venisse. SPEAKER 1: Era ora al radar componente del sistema Patriot difendendo Dhahran per individuare e mantenere traccia del missile nemico in arrivo. JACK GANSSLE: Il radar era molto intelligente. Sarebbe effettivamente tracciare la posizione il Scud e quindi prevedere dove probabilmente sarebbe la prossima volta il radar ha inviato un impulso di fuori. Che è stato chiamato il cancello di gamma. THEODORE Postol: Poi una volta che il Patriot decide è passato abbastanza tempo per andare indietro e controllare la posizione successiva per questo oggetto rilevato, si va indietro. Così, quando si tornò al sbagliata posto, poi vede nessun oggetto. E decide che non vi era nessun oggetto, era un falso rilevamento, e scende in pista. SPEAKER 1: Il Scud in arrivo scomparso da schermo radar, e secondi dopo lo sbatté in caserma. Il Scud ucciso 28 ed è stato l'ultimo sparato durante la prima guerra del Golfo. Tragicamente, il software aggiornato è arrivata a Dhahran il giorno seguente. Il difetto del software era stato fissato, chiusura di un capitolo nella travagliata storia del missile Patriot. Patriot è in realtà un acronimo per Phased Array tracking Intercettazione del target. DAVID J MALAN: Bene, quindi un fa riflettere, ad esempio, per essere sicuri. E per fortuna, si tratta di livello inferiore i bug non sono qualcosa che faremo in genere hanno di apprezzare, di certo non con alcuni dei nostri prima dei programmi. Piuttosto, la maggior parte dei bug che faremo incontro sarà di natura logica, sintattica in cui la natura codice non funziona bene. E tu lo sai abbastanza veloce. Ma soprattutto quando si arriva al fine del semestre, che sta per diventare sempre più di una possibilità di davvero riflettere sulla progettazione dei vostri programmi e le sottostanti rappresentazione anche lì dei dati. Per esempio, si introducono MySQL, che è un motore di database popolari che è possibile utilizzare con i siti web di memorizzare dati sul back-end. E si dovrà cominciare a decidere in la fine del semestre non solo ciò tipi di dati in questo senso da utilizzare ma esattamente il numero di bit da utilizzare, se non si desidera memorizzare le date come date e orari come i tempi, e anche cose come quanto grande volete il ID univoci per essere per, diciamo, gli utenti nel database. Infatti, se alcuni di voi hanno avuto Facebook rappresenta per un bel po 'di tempo, e si sa come ottenere l'accesso al tuo ID utente - che a volte appare nella vostra URL del profilo se non hai scelto un soprannome per l'URL, o se hai 'utilizzato Facebook Graph API, il a disposizione del pubblico API con cui si possono chiedere di Facebook per i dati grezzi - si può vedere che cosa il vostro ID numerico. E alcuni anni fa, Facebook essenzialmente dovuto cambiare da usare l'equivalente di int all'utilizzo lungo lungo, perché nel corso del tempo, come gli utenti vengono e andare a creare un sacco di account e conti falsi, anche loro molto facilmente sono stati in grado di esaurire qualcosa come un 4 miliardi di possibile valore come un int. Quindi più su quei tipi di problemi lungo la strada, pure. Va bene, così che era colata. Quello era imprecisione. Un paio di brevi annunci. Così sezioni iniziano ufficialmente il prossimo Domenica, Lunedi, Martedì. Sentirete via e-mail entro questa settimana come per il vostro incarico sezione. E potrai anche qui a quel punto come per cambiare la sezione se la tua calendario ora è cambiato o il vostro livello di comfort è cambiata. Nel frattempo P-set e uno degli hacker si sono dovuto questo Giovedi con la possibilità di prorogare tale termine per il specifiche al Venerdì in un modo tipico. Rendetevi conto che incluso con il problema Specifiche set sono le istruzioni su come utilizzare l'apparecchio CS50, fare, così come alcuni CS50 strumenti specifici come stile 50, che può fornire con retroazione dinamicamente sulla qualità del tuo stile di codice e anche controllare 50, che può fornire con feedback dinamico per il vostro la correttezza del codice. Perdoniamo che stiamo ancora aggiustando fuori alcuni intoppi con controllo 50. Alcuni dei tuoi compagni di classe che hanno iniziato la intorno 04:00 il Venerdì sera quando la spec è salito notato da allora alcuni bug che stiamo lavorando attraverso, e le scuse per tutti coloro che ha sperimentato frustrazioni inutili. La colpa è mia. Ma noi seguiremo sulla CS50 discutere quando che viene risolto. Così una parola sui punteggi stessi. Quindi sarà una settimana o due prima di iniziare a ottenere un feedback sul set problema perché voi non avete ancora un compagno di insegnamento. E anche allora, inizieremo a valutare il problema C imposta prima di tornare indietro e valutare graffio così che si ottiene più rilevanti feedback più velocemente. Ma, in generale, per il programma, CS50 insiemi di problemi vengono valutati lungo l' dopo quattro assi - campo di applicazione, la correttezza, il design e lo stile. Ambito di applicazione sta per essere un numero in genere tra zero e cinque che cattura la quantità di pezzo che si è staccato. In genere, si desidera che questo sia cinque. È almeno provato di tutto. E notate che è un fattore moltiplicativo facendo in modo che solo una parte del problema insieme non è la strategia migliore. Nel frattempo, più evidente è la importanza della correttezza - solo è il vostro programma corretto con rispettare le specifiche? Questo è ponderato volutamente più pesantemente rispetto agli altri due assi di una fattore tre perché riconosciamo che in genere si sta andando a trascorrere un molto più tempo a inseguire alcuni bug, ottenere il vostro codice funzioni, allora si sono i rientri e scegliendo appropriati nomi di variabili e le simile, pari sull'altra estremità dello spettro di stile. Questo non vuol dire che lo stile non è importante, e noi predichiamo sopra tempo sia in lezioni frontali e in sezioni. Stile riferisce all'estetica del codice. Avete scelto bene con nomi variabili che sono brevi, ma un po ' descrittivo? Il vostro codice indentato come si è visto in lezione e in modo coerente con stile 50? Infine è giusto disegno lì in mezzo. Il design è il più difficile quello di mettere un dito sul perché è molto più soggettiva. Ma è forse il più importante dei i tre assi in termini di pedagogia valore nel tempo e che questo sarà opportunità l'insegnamento del compagno di fornirvi un feedback qualitativo. Infatti, in CS50 anche se noi abbiamo queste formule e punteggi, alla fine del giorno questi sono molto deliberatamente molto piccoli secchi - valori in virgola tra zero e tre e zero e cinque. Noi non cerchiamo di tracciare linee molto grossolane tra le serie problematiche o tra studenti, ma piuttosto concentrarsi quanto più possiamo su qualitativa, longhand retroazione, sia dattiloscritta o verbale da il vostro particolare insegnamento compagni, si arriva a conoscere abbastanza bene. Ma in generale, quelli sono i pesi che i vari assi avranno. Nel frattempo, anche, vale la pena tenere in dispiace che non si deve presumere che un tre su cinque è un 60% e quindi circa fallendo. Tre è volutamente pensata per essere sorta di mezzo alla strada buona. Se stai ricevendo tre a tre al inizio del semestre, che è anzi vuole essere un buon posto per iniziare. Se stai ricevendo due, fiere, c'è sicuramente un po 'di lavoro a pagare un po' di più attenzione, per sfruttare delle sezioni e delle ore di ufficio. Se stai ricevendo quattro zampe e cinque, grande. Ma davvero, speriamo di vedere traiettorie tra gli studenti - molto individualizzato per ogni studente, ma a partire il semestre qui in una sorta di i due a tre serie, ma che termina qui in 4-5 gamma. Questo è quello che stiamo realmente cercando. E noi continuiamo a mente il delta che si esibiscono tra settimana zero e settimana 12 quando sto facendo gradi. Non importa a noi assolutamente come è giusto all'inizio se il vostro traiettoria è infatti verso l'alto e forte. Onestà Accademico - così mi permetta di mettere sul mio la voce più grave per un momento. Quindi, questo corso ha la particolarità di l'invio di più gli studenti di qualsiasi altra nella storia alla scheda annuncio, credo. Abbiamo sorta di conteggio perso in questo punto di quanto spesso questo accade. E questo non perché gli studenti in 50 sono più disonesti di loro compagni di classe altrove. Ma si rende conto anche che siamo molto buono a individuare questo genere di cose. E che è il vantaggio che un classe di informatica ha in che possiamo e facciamo confrontare tutti gli studenti problema di imposta a coppie contro ogni altre, non solo quest'anno ma tutti gli anni precedenti. Abbiamo la capacità, come gli studenti di la classe, di Google e di trovare il codice su siti come github e forum di discussione. Non ci sono assolutamente le soluzioni ai CS50 di p-imposta galleggianti intorno là. Ma se riesci a trovarli, siamo in grado di trovarli. E tutto questo è molto automatizzato e facile e triste per noi trovare. Ma voglio sottolineare, inoltre, che il politica onestà accademica del corso è molto vuole essere molto l'opposto di quello spirito. Infatti, quest'anno abbiamo riformulato le cose nel piano di studi per essere tale, dot punto punto, con più dettagli nel programma. Ma il tema generale del corso è davvero di essere ragionevole. Ci rendiamo conto che vi è una significativa quantità di pedagogico valore a collaborare, in qualche misura, con i compagni di classe, per cui si due o tre o più sei in piedi a un bordo bianco lavagna, in modo da parlare, le tue idee - scrivendo pseudocodice in immagini, Diagrammi che cosa dovrebbe essere, se Mario eri di scriverlo prima in pseudocodice. Quale dovrebbe essere l'algoritmo greedy - come dovrebbe comportarsi per problema di imposta uno? E così rendersi conto che il comportamento che noi incoraggiamo è molto molto lungo queste linee. E nel programma, vedrete un mucchio di proiettili sotto un categoria ragionevole e un non ragionevole categoria che ci aiuta aiutiamo di avvolgere la vostra mente intorno a dove noi traiamo quella linea. E, in generale, una regola empirica discreta è che se si sta lottando per risolvere alcuni bug e il tuo amico o un compagno di classe è seduto accanto a te, è ragionevole per voi di mostrare lui o lei il codice e dire, ehi, potete aiutare a capire cosa c'è di sbagliato qui? Noi in genere non abbracciamo il lato opposto. Non è una risposta corretta per il amico o un compagno di classe qui a dire, oh, basta guardare la mia e la figura fuori da questo. Questa è una sorta di irragionevole. Ma avere qualcun altro, un altro cervello, un altro paio di occhi guardano lo schermo o leggere il codice e dire, sei sicuro che vuoi di avere un ciclo qui? O siete sicuri di voler che punto e virgola qui? O oh, che messaggio di errore significa questo. Quelli sono molto ragionevole e comportamenti incoraggiato. I casi in cui stavo alludendo al prima bollire fino a quando gli studenti sono a tarda notte rendendo scarsa capacità di giudizio decisioni e emailing loro codice di qualcun altro o solo dicendo, qui, è in Dropbox o Googling a tarda notte. E quindi vorrei incoraggiare e prego, se non avete quelli inevitabile momenti di stress, si sta urtando contro la scadenza, non avete in ritardo giorno dal momento che è già Venerdì a quel punto, e-mail le teste del corso o me direttamente. Dire, ascoltare, sono al mio punto di rottura qui. Facciamo una conversazione e capirlo. Ricorrere al web o qualche altro non comportamento ragionevole non è mai la soluzione, e anche molti dei vostri compagni di classe non sono più qui su campus a causa di tale scarsa capacità di giudizio. Ma è molto facile da aggirare quella linea. Ed ecco un po 'di foto per allietare up da Reddit così che ora tutto sarà OK. Quindi un breve riepilogo, quindi, di dove avevamo lasciato. Così la scorsa settimana, ricordiamo che introduciamo condizioni, non nella Scratch ma in C questa volta. E c'era qualche nuova sintassi, ma davvero non nuove idee per se. Abbiamo avuto espressioni booleane che potremmo o insieme a due verticali barre o e massimo e di due e commerciali, dicendo che sia la sinistra e il diritto deve essere vero per questo da eseguire. Poi abbiamo avuto interruttori, che abbiamo guardato a breve, ma vi propongo sono davvero appena sintassi diversa per raggiungere l' stesso tipo di obiettivo se si sa in anticipo che cosa i vostri casi stanno per essere. Abbiamo preso in loop. Un ciclo for è forse il più comune, o almeno quello che la gente tipicamente raggiungere per istinto. Anche se sembra un po 'criptico, vedrete molti, molti esempi di questo In poco tempo, come avete già alla fine della scorsa settimana. Mentre cicli possono simile ottenere la stessa cosa. Ma se si vuole fare qualsiasi Incremento o aggiornamento di valori di variabili, si deve farlo più manualmente rispetto alla per il ciclo prima permette. E poi c'è il ciclo do-while, che ci permette di fare qualcosa di a almeno una volta, mentre qualcosa il resto è vero. E questo è particolarmente buono per programmi o per i giochi in cui si desidera per richiedere all'utente di qualcosa almeno una volta. E poi, se lui o lei non collabora, si potrebbe desiderare di farlo ancora e ancora. Con le variabili, nel frattempo, abbiamo avuto le linee di codice come questo, che potrebbe essere due linee. Si potrebbe dichiarare un int chiamato contatore, punto e virgola. Oppure si può semplicemente dichiarare e definirlo, per così dire. Dare un valore al tempo stesso. E poi, infine, abbiamo parlato sulle funzioni. E questo è stato un bel esempio in senso che illustra due tipi di funzioni. Uno è GetString (), che, di nuovo, Ottiene una stringa da parte dell'utente. Ma GetString () è una specie di interessante, misura in cui abbiamo usato, perché abbiamo sempre usato con qualcosa sul lato sinistro di un segno di uguale. Vale a dire che GetString () restituisce un valore. Si ritorna, ovviamente, di una stringa. E poi sul lato sinistro, che siamo semplicemente salvare quella stringa all'interno di un variabile chiamata nome. Questo è diverso, in un certo senso, da printf printf perché, almeno nel nostro utilizzo qui, non restituisce nulla. Per inciso, lo fa ritorno qualcosa. Noi semplicemente non importa quello che è. Ma ha ciò che è chiamato un effetto collaterale. E che cosa è che effetto collaterale in ogni caso che abbiamo visto fino ad ora? Cosa significa printf fare? Esso stampa qualcosa sullo schermo, display di testo o numeri o qualcosa sullo schermo. E questo è solo considerato un effetto collaterale perché non è davvero consegnando di nuovo a me. Non è una risposta all'interno di una scatola nera che posso poi raggiungere in e afferrare. E 'solo farlo da solo, tanto come Colton è stato collegato a questa scatola nera la scorsa settimana, e lui in qualche modo magicamente è stato disegnare sulla lavagna senza di me effettivamente coinvolti. Questo sarebbe un effetto collaterale. Ma se in realtà ho dovuto raggiungere nel qui e dire, oh, qui è la stringa da parte dell'utente, che avrebbe essere un valore di ritorno. E finora abbiamo usato solo le funzioni che altre persone hanno scritto. Ma possiamo davvero fare queste tipo di cose noi stessi. Quindi ho intenzione di andare in CS50 apparecchio nuovo. Permettetemi di chiudere la scheda che abbiamo aveva aperto un momento fa. E mi permetta di andare avanti e di creare un nuovo file. E ho intenzione di andare avanti e chiamare questo positive.c. Quindi voglio fare qualcosa con numeri positivi qui. Quindi ho intenzione di andare avanti e fare int - mi dispiace - # Include. Non facciamo lo stesso errore come prima. Int main (), aperto ricci parentesi, chiusa parentesi graffa. E ora voglio fare la seguente. Voglio scrivere un programma che insiste sul fatto che l'utente dà me un numero intero positivo. Quindi non vi è alcuna funzione GetPositiveInt nella biblioteca CS50. C'è solo GetInt (). Ma va bene così perché ho la costrutti con cui posso imporre un poco più vincolo su quel valore. Avrei potuto fare qualcosa di simile. Quindi, int n - e se si sta digitando lungo, basta rendersi conto Ho intenzione di tornare indietro e cambiare alcune cose in un momento - così int n equivale GetInt (). E che sta per mettere un int all'interno di n. E mi permetta di essere un più descrittivo. Permettetemi di dire una cosa del genere esigo che mi date un numero intero positivo. D'accordo. Quindi, solo un po 'di istruzioni. E ora che cosa posso fare? Beh, so già dalla mia semplice condizioni o rami, proprio come ho aveva in Scratch, potrei dire qualcosa come se n è minore o uguale a pari a zero, quindi voglio fare qualcosa piace, che non è positivo. E poi ho potuto fare - OK, ma voglio davvero ottenere che int. Così ho potuto salire qui e potrei genere copia di questa e trattino questo. E poi, OK. Quindi se n è minore o uguale a zero farlo. Ora, cosa succede se l'utente non collabora? Bene, allora io vado a prendere in prestito questo qui. E poi vado in qui e qui e qui. Quindi questo non è chiaramente la soluzione, giusto? Perché non c'è fine in vista. Se voglio chiedere che l'utente dà me un numero intero positivo, posso effettivamente ottenere l'int. Posso quindi verificare che int. Ma poi voglio controllare di nuovo e controllare di nuovo e controllare di nuovo. Così, ovviamente, che cosa è il migliore costruire da usare qui? Va bene, quindi una sorta di loop. Quindi ho intenzione di sbarazzarsi di quasi tutta questa. E voglio ottenere questo int almeno una volta. Quindi ho intenzione di dire che fare - e tornerò alla mentre in un attimo - ora, che fare? Io vado a fare int n ottiene GetInt (). OK. Così che è abbastanza buono. E ora quanto spesso fare Io voglio fare questo? Mettiamola la printf all'interno del loop così posso chiedere ancora e ancora, se necessario. E che cosa voglio questo mentre la condizione di fare? Voglio continuare a fare questo mentre ciò che è il caso? Già. N è minore o uguale a zero. Così già, abbiamo significativamente ripulito questo codice su. Abbiamo preso in prestito un semplice costrutto - il ciclo do-while. Ho rubato solo le linee più importanti di codice che ho iniziato la copia e incolla, che non era saggio. E così ora ho intenzione di incollare effettivamente qui dentro e basta farlo una volta. E ora che cosa voglio fare a alla fine di questo programma? Mi limiterò a dire qualcosa di semplice come, grazie per il - e Farò% i per int - backslash n, virgola, e quindi spina n, punto e virgola. D'accordo. Quindi vediamo cosa succede ora quando eseguo questo programma. Ho intenzione di andare avanti e facciamo in positivo. Dannazione. A pochi errori. Quindi, mi permetta di scorrere indietro fino alla prima. Non lavorare attraverso di loro indietro. Lavorare attraverso di loro dall'alto in basso per paura che a cascata e solo una cosa sia sbagliata. Dichiarazione implicita di funzione GetInt (). Già. Così non è stato sufficiente. I tipi di fatto lo stesso errore, ma un po 'diverso questa volta. Ho bisogno non solo di includere stdio.h ma anche cs50.h, che comprende la cosiddette dichiarazioni di ottenere int, che insegnare l'apparecchio, o insegna C quello GetInt () è. Così mi permetta di salvare nuovamente. Ho intenzione di ignorare gli altri errori perché sto andando a sperare che siano in qualche modo legati all'errore Ho già fissato. Quindi, mi permetta di andare avanti e ricompilare con fare positivo, Invio. Dannazione. Tre errori, ancora. Lasciate scorrere fino al primo. Inutilizzati n variabili. Noi non abbiamo visto questo prima. E anche questo è un po 'criptico. Questa è l'uscita del compilatore. E che quella linea evidenziata ci - positive.c :9:13 - sta dicendo che sta dicendo sulla linea dei nove positive.c, al 13 ° carattere, Colonna 13, è fatto questo errore. E in particolare, si sta dicendo Mi inutilizzato variabile n. Quindi cerchiamo di vedere - linea di nove. Sto utilizzando n, nel senso che Sto dando un valore. Ma quello che il compilatore non piace è che non mi sembra di utilizzarlo. Ma aspetta un attimo, io sto usando. In linea 11, lo sto usando qui. Ma se ho scorrere giù ulteriormente a positive.c :11 - così alla linea 11, carattere 12, la compilatore mi dice, uso di non dichiarato identificativo n. Significa così non dichiarati che ho non specificato come variabile con un tipo di dati. Ma aspettate un minuto. Ho fatto esattamente questo in linea di nove. Così qualcuno è davvero confuso qui. E 'o me o il compilatore perché in linea nove, ancora una volta, sto dichiarando un int n, e sto assegnando il valore di GetInt () ritorna. Poi sto usando la variabile n in linea 11 e controllando se il suo valore è minore o uguale a zero. Ma a quanto pare questo è cattivo e rotti perché? Dire di nuovo? Ah, devo dichiarare n prima entrare nel ciclo. Ma perché? Voglio dire, abbiamo appena proposto un po 'fa che va bene per dichiarare le variabili tutto su una riga e poi assegnare loro un certo valore. Una variabile globale - torniamo di questa idea in un attimo. Perché vuoi che metta essa all'esterno del ciclo? È. Esattamente. Quindi, anche se, in qualche modo controintuitivo, vorrei riassumere. Quando si dichiara n dentro del blocco fare lì - specificamente all'interno quelle parentesi graffe - che la variabile n è ciò che è chiamato un ambito - estranei al nostro sistema di punteggio nella naturalmente - ma ha una portata che è limitate alle parentesi graffe. In altre parole, in genere se si dichiara una variabile all'interno di un insieme di parentesi graffe, che la variabile esiste solo all'interno di queste parentesi graffe. Così da questa logica da solo, anche se Ho dichiarato n in linea nove, si scompare essenzialmente dal campo di applicazione, scompare dalla memoria, per così dire, per il momento mi ha colpito la linea 11. Perché la linea 11, purtroppo, è al di fuori di quelle parentesi graffe. Quindi io purtroppo non riesco a risolvere questo problema tornando a quello che ho fatto prima. Si potrebbe a prima fare questo. Ma quello che sei ora non facendo ciclicamente? Lei non è, ovviamente, ottenendo l'int ciclicamente. Così siamo in grado di lasciare il GetInt (), e noi dovrebbe lasciare la GetInt () all'interno ciclo perché è quello che vogliamo tormentare l'utente di nuovo e di nuovo. Ma lo fa basta andare fino alla linea, diciamo, sei. Int n, punto e virgola. Non dare un valore ancora perché non solo ancora bisogno di. Ma ora qui, gara - questa sarebbe un errore molto facile. Io non voglio nascondere il mio precedente dichiarazione di n. Voglio usare la n che in realtà esiste. E così ora nella riga 10, Assegno n a valore. Ma in linea di sei, dichiaro n. E così posso o non posso fare il utilizzarlo in linea 12 adesso? Posso perché tra cui ricci parentesi graffe è n dichiarata adesso? Quello qui sulla linea cinque. Per uno qui sulla linea 14. Quindi, se ora io lo zoom indietro, salvare il file, andare eseguire in e eseguire make positivo, compilato questa volta. Ecco, questo è già un progresso. Slash. . / Positivo, Enter. Esigo che mi date un numero intero positivo. Negativa 1. Negativo 2. Negativo 3. Zero. Uno. E grazie per quello che è ciò che è ora stampata. Fammi provare qualcosa di diverso, per curiosità. Mi viene detto di inserire un numero intero. Ma cosa succede se io invece digito in agnello? Quindi, è ora vedere un prompt diverso - riprovare. Ma da nessuna parte nel mio codice ho scritto riprovare. Allora, dove, presumibilmente, è questo tentativo prompt dei venendo da, diresti? Sì, da GetInt () stessa. Quindi, una delle cose che lo staff di CS50 fa per voi, almeno in questi primi settimane, è che abbiamo scritto una certa quantità di controllo di errore per garantire che, se si chiama GetInt (), vi sarà almeno tornare un int da parte dell'utente. Non si ottiene una stringa. Non si ottiene un char. Non si ottiene qualcosa un'altra cosa. Otterrete un int. Ora, potrebbe non essere positivo. Potrebbe non essere negativo. Non facciamo garanzie intorno a quello. Ma noi tormentare l'utente a riprovare, riprovare, riprovare fino a quando lui o lei in realtà collabora. Allo stesso modo, se faccio 1.23, questo non è un int. Ma se io digito, per esempio, 50, che mi dà un valore che volevo. D'accordo. Quindi, non è male. Tutte le domande su ciò che abbiamo appena fatto? Il takeaway chiave è, per essere chiari, non tanto il ciclo, che abbiamo visto prima anche se non abbiamo davvero usato, ma la questione del campo di applicazione, dove variabili possono essere possono essere utilizzati solo solo entro un certo ambito specificato. Bene, vorrei affrontare il suggerimento hai fatto prima, quella di una variabile globale. Per inciso, si scopre che un altro soluzione a questo problema, ma tipicamente una soluzione corretta o una soluzione mal progettato, è quello dichiarare la variabile come ciò che è chiamato una variabile globale. Ora, io sono una specie di violare la mia definizione di portata, perché ci sono nessuna parentesi graffa al vertice e la parte inferiore di un file. Ma l'implicazione di tale è che ora in linea a quattro, n è una variabile globale. E come dice il nome, è solo accessibile ovunque. Scratch ha in realtà questi. Se è stato utilizzato una variabile, si potrebbe ricordare si doveva scegliere se è per questo sprite o per tutti gli sprite. Beh, tutti gli sprite è solo il più chiaro modo di dire globale. Sì? Ah, bella domanda. Quindi, ricordare che nella prima versione del mio codice, quando non correttamente n dichiarati e definiti in linea nove - Ho dichiarato come una variabile e ho dato un valore con l'operatore di assegnazione - questo mi ha dato due errori. Uno, il fatto che n non è stato utilizzato, e due, che in linea 11 semplicemente non è stato dichiarato. Quindi, il primo non l'ho fatto indirizzo al momento. Non è strettamente un errore di dichiarare una variabile ma non usarlo. Ma una delle cose che abbiamo fatto in l'apparecchio CS50, volutamente, pedagogicamente è che abbiamo rimediato la aspettative del compilatore per rendere Assicurarsi che si sta facendo le cose non solo correttamente, ma in realtà correttamente. Perché se si sta dichiarando una variabile come n e mai usando oppure usando correttamente, allora che cosa sta facendo lì? Serve davvero inutile. Ed è molto facile con il tempo, se si non configurare il proprio computer in in questo modo, di avere solo codice che ha piccoli resti qui, resti lì. E poi, mesi dopo, si guarda indietro e siete come, perché è questa linea di codice di là? E se non c'è una buona ragione, non beneficiare voi oi vostri colleghi lungo la strada per avere a inciampare su di esso allora. Per inciso, in cui è che viene? Beh, ricordo che ogni volta che si compila programma, tutta questa roba è in fase di stampa. Così torneremo a questo. Ma ancora una volta, fare è un programma di utilità che automatizza il processo di compilazione da parte eseguendo il compilatore effettivo chiamato clang. Questa cosa, ci vediamo alla fine, ha a che fare con il debug di uno speciale programma chiamato il debugger. Questo ha a che fare con l'ottimizzazione codice - più su che in futuro. Std = c99 - questo significa solo utilizzare la versione del 1999 C. C è stato in giro ancora più lungo che, ma hanno fatto qualche bella variazioni 10 più anni fa. Ed ecco quelle rilevanti. Stiamo dicendo fare tutto ciò che in precedenza sarebbe stato un avvertimento un errore che impedisce l'allievo da compilare. E mezzi a parete fanno che per un tutta una serie di cose, non solo legato a variabili. E poi mi permetta di scorrimento per alla fine di questa riga. E anche questo, faremo alla fine tornare. Questo è ovviamente il nome di il file che sto compilando. Questo richiama il nome del file Sono uscita come nome del mio programma eseguibile. Questo-lcs50 significa solo usare il CS50 biblioteca, e gli eventuali zeri e uno che il personale ha scritto e compilato in precedenza quest'anno, integrare li nel mio programma. E qualcuno sa che cosa-lm è? E 'la libreria matematica, che è proprio lì anche se sei Non fare alcun matematica. E 'solo fornito automaticamente a noi da fare. Beh, mi permetta di fare un altro esempio qui aprendo un nuovo file. E mi permetta di salvare questo uno come string.c. Si scopre che, come si parla di dati Tipi di oggi, c'è ancora di più succedendo sotto il cofano di quanto abbiamo visto finora. Quindi lasciatemi rapidamente fare un rapido programma. Includi stdio.h. E mi salverò che. E sai, mi lasci non faccio il stesso errore di nuovo e di nuovo. Includi cs50.h. E mi permetta di andare avanti ora e fare int main (void). E ora voglio semplicemente fare un programma che fa questo - dichiarare una stringa chiamato s e ottenere una stringa dall'utente. E mi permetta di fare un po ' istruzioni qui - per favore mi dia una stringa - così l'utente sa che cosa fare. E poi qui di seguito questo, Voglio fare la seguente - per int i ottiene zero. Anche in questo caso, gli informatici in genere inizia a contare da zero, ma abbiamo potuto fare che uno se volevamo. Ora ho intenzione di fare i è inferiore della lunghezza della stringa di s. Così strlen - S-T-R-L-E-N - ancora una volta, è conciso perché è più facile al tipo, anche se è un po 'criptico. Questa è una funzione che non abbiamo usato prima, ma letteralmente vuol - tornare a me un numero che rappresenta la lunghezza della stringa che l'utente ha digitato. Se avevano scritto a ciao, sarebbe tornare cinque perché c'è cinque lettere in Ciao. Poi, a ogni iterazione questo ciclo, i plus plus. Quindi, di nuovo, uno standard costrutto anche se non siete abbastanza troppo comodo o familiarità con esso ancora. Ma ora in poi ogni iterazione di questo ciclo, accorgo di quello che ho intenzione di fare. Voglio andare avanti e stampare un singolo carattere - in modo% c backslash n su una nuova linea. E poi, sai cosa voglio fare? Qualunque sia la parola è che l'utente digita in, come ciao, voglio stampare H-E-L-L-O, un carattere per riga. In altre parole, voglio arrivare alla singoli caratteri in una stringa, cui finora una stringa ha appena stata una sequenza di caratteri. E si scopre che posso fare s, staffa, i, chiudere la parentesi, chiudo parentesi, punto e virgola. E io devo fare una cosa di più. E 'in un file chiamato string.h che strlen è dichiarato. Quindi, se voglio usare quella funzione, Ho bisogno di dire al compilatore, aspettare di usarlo. Ora vorrei andare avanti e fare il programma chiamato stringa. Dot, slash, stringa. Per favore mi dia una stringa. Io vado avanti e digita. Ciao, in tutte le protezioni, Invio. E ora accorgo che ho stampato questa un carattere dopo l'altro. Così il nuovo dettaglio qui è che una stringa, al termine della giornata, può essere accessibili tramite tale individuo caratteri introducendo la piazza notazione staffa. E questo perché una stringa sotto la cappa è infatti una sequenza di personaggi. Ma ciò che è pulito su di loro è nella RAM del computer - Mac, PC, qualunque esso sia - sono letteralmente back to back to back - H-E-L-L-O - a livello individuale, adiacente byte in memoria. Quindi, se si vuole arrivare al l'ottavo byte, che in questo ciclo sarebbe Staffa a zero, una staffa, staffa di due, Staffa di tre, quattro staffa - che di Zero indicizzati fino a cinque - che vi stampare H-E-L-L-O sulla propria riga. Ora, come un teaser, lascia che ti mostri il genere di cose che si finirà per essere grado di comprendere, almeno con un po 'stretto alla ricerca. Per uno, quello che abbiamo incluso in di oggi esempi, se vuoi, è in realtà uno dei primissimi evasioni per l'iPhone. Jailbreaking significa rottura del telefono in modo da poter effettivamente utilizzare su un vettore o installazione diversa il proprio software. E si noterà questo sembra completamente criptico, più probabile. Ma guarda questo. L'iPhone è stato apparentemente rotto con un ciclo for, una condizione if, un altro condizioni, un gruppo di funzioni noi non abbiamo visto. E di nuovo, non sarà in prima vista probabilmente capire come questo funziona. Ma tutto ciò che noi prendiamo sorta di per scontato nella nostra vita moderna effettivamente tende a ridurre anche a qualche di questi fondamenti che abbiamo passato guardando. Lasciami andare avanti e aprire uno altro programma, holloway.c. Quindi anche questo è qualcosa che si non dovrebbe davvero sapere. Ancora nessuno del personale o che potevo probabilmente questo numero, cercando in perché questo era il codice di qualcuno che è stata presentata a ciò che è storicamente conosciuta come offuscato C concorso, in cui si scrive un programma che compila ed esegue ma è così dannatamente criptico nessun essere umano può capire che cosa sta andando a fare fino a effettivamente eseguirlo. Quindi, in effetti, se si guarda a questo codice, vedo un interruttore. Vedo principale. Vedo queste parentesi quadre che implica qualche tipo di un array. Qualcuno ha voglia di indovinare che cosa questo programma in realtà fa se corro Holloway? Sì. OK. Ben fatto. Quindi solo il personale e non riesco a capire che cosa fanno queste cose. E ora, infine, mi permetta di andare avanti e di aprire un altro programma. Questo uno - ancora una volta, faremo il codice sorgente disponibile on-line - questo è solo genere di bello da guardare. Tutti hanno fatto è premere il barra spaziatrice un bel po '. Ma questo è codice reale. Quindi, se si pensa che è abbastanza, se noi effettivamente eseguire questo al prompt, alla fine si vedrà come siamo potrebbe fare cose come questa. Quindi vi lasciamo su questa nota e vediamo il Mercoledì. [MUSIC PLAYING] SPEAKER 2: Al prossimo CS50, il TFS in scena un ammutinamento. SPEAKER 3: Eccolo. Fatelo! [MUSIC PLAYING]