DAVID J MALAN: Tutti a destra, quindi questo è CS50. E questo è chiaramente un Venerdì. E questa è la fine della prima settimana. Così si può ricordare che avevamo lasciato, l'ultima volta, con un cliffhanger di sorta. Per cui esponiamo questa menzogna, che non importa quello che hanno insegnato in crescita up, 1 diviso 10 non è, in Infatti, 0.1 o 0.100 o 0.10000. In realtà, se si compila questo programma, come abbiamo fatto ieri, con, fare imprecisioni, e poi fare punti, slash, imprecisioni, abbiamo appreso che questo è ciò che è 1 diviso 10 è in realtà. Quindi questo non è davvero il caso. Ma questo non fa accenno a un certo fondamentale limitazione dei computer. E infatti, tra la cose che stanno andando a fare oggi è dare un'occhiata a perché di questo dato successo, quali implicazioni questo ha, come l'umanità non è riuscita di cogliere questo in alcuni molto grave situations-- il risultato del quale è stato abbastanza tragico e expensive-- e anche dare un'occhiata a come si può effettivamente difendere contro questi tipi di limitazioni. Così intuitivamente, forse, perché è 1 diviso per 10, secondo il mio computer qui, non solo 1/10, 0.10? Già. Cosa ne pensi? Membro del pubblico: La radice è diverso? DAVID J MALAN: La cosa è? Oh, la radice è diverso? Quindi non del tutto. In realtà è più fondamentale per l'hardware. Altri pensieri? Già. Membro del pubblico: Si rappresentare i numeri in modo diverso? DAVID J MALAN: Quindi they-- destra. Essi rappresentano i numeri in modo diverso. Impreciso, a quanto pare. In modo che è-- Bene, diversamente da quanto? O da chi? Da noi? Membro del pubblico: Sì. Non usano la virgola sistema per [incomprensibile]. DAVID J MALAN: OK. Quindi, in un certo senso, non lo fanno utilizzare il sistema decimale. Sotto il cofano, tutto è, infatti, binario, e questo è relativo, appunto. Ma è ancora un semplice spiegazione di quello. Già. Membro del pubblico: Si hanno solo tanti bit. Essi possono memorizzare solo fino a un certo misura, come con i decimali. DAVID J MALAN: Sì. Questo è ciò che sta realmente arrivare a questo. Si scopre che i computer tipicamente, sarà sempre solo utilizzare una quantità limitata di informazioni per rappresentare qualcosa. Destra? Dopo tutto, abbiamo solo una fissa quantità di spazio su disco rigido. Abbiamo solo un importo fisso di RAM, o la memoria del computer. E se avete solo un importo fisso di qualcosa, sicuramente non si può effettivamente contare all'infinito o un qualsiasi numero che si desidera. Si, un po ', bisogna scegliere quale intervallo di valori che si vuole sostenere. E così, ad esempio, una settimana o due fa, quando abbiamo parlato di ASCII, e abbiamo parlato di 8 bit, o un byte, per così dire, il maggior numero potremmo rappresentare con 8 bit era quello? 255. E possiamo rappresentare 256 valori totali ma non se spendiamo uno di loro su 0-- Bene, ma se ci trascorrere uno di loro su 0, poi il maggior numero è, naturalmente, 255. Così si scopre, che questo è il caso, in questo contesto. Abbiamo iniziato a parlare, l'ultima volta, su numeri in virgola mobile, che sono diverse da numeri interi, in che hanno un punto decimale e, si spera, alcuni numeri dopo che, ma sono troppo. Un computer è solo tipicamente andando di utilizzare 32 bit, forse 64 bit per rappresentare un valore in virgola mobile. Così, anche se siamo cresciuti apprendimento della matematica e conoscere che si può assolutamente avere un numero infinito di numeri dopo la virgola, non se si dispone di memoria finita. Si, un po ', è necessario arrotondare, o scegliere quali numeri che stanno andando a rappresentare. E così si può pensare, in un certo senso, questo è il computer più vicino approssimazione al valore che 1/10 si può ottenere, con solo 32 o giù di lì bit. E non è solo 1/10. Ad esempio, se cambio questo a 1/3, che riteniamo sia ancora più semplice. Quindi 1 diviso per 3. Permettetemi di salvare il file. Lasciami andare avanti e ricompilarlo. E lasciatemi nuovamente eseguirlo. Anche in questo caso, a quanto pare, un terzo non è 0.3 e quindi un numero infinito di 3 di da allora in poi. Hai questo imprecisione alla fine. Così noi esseri umani siano corrette, e che cosa si è appreso è, infatti, corretto, ma stiamo urtando contro alcune limitazioni. E quello che ho pensato faremmo oggi, si comincia cercando in, francamente, il tragiche conseguenze di questo a volte, quando l'umanità non abbastanza implementare per questa realtà e queste limitazioni. E vedremo una serie di vignette dalla History Channel che prende uno sguardo a come le cose sono andate male. E 'lunga circa 8 minuti, e ci torneremo dopo questo e dare un'occhiata a esattamente che altro può andare storto. Se potessimo abbassare il lights-- [RIPRODUZIONE VIDEO] -Computers, Tutti abbiamo imparato ad accettare i problemi spesso frustranti che andare con loro. Bugs, virus e software glitch sono piccoli prezzi a pagare per la comodità. Ma in alta tecnologia e ad alta velocità applicazioni del programma spaziale militare e, il più piccolo problema può essere ingrandita nel disastro. Il 4 giugno del 1996, gli scienziati preparati per lanciare un razzo Ariane 5 senza equipaggio. Trasportava scientifico 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. -E Circa 30 secondi in il volo, in primo luogo qualcosa notato non andava. Che gli ugelli sono stati 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. A Sicurezza Range Officer con tremende budella preme il pulsante, 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 prese collocare causa di un difetto incorporato nel software del razzo. -Il Problema sul Ariane era che non era un numero che richiedeva 64 bit per esprimere, e voleva convertire per un numero a 16 bit. Si presume che il numero non è mai sta per essere molto grande, che la maggior parte di tali cifre in il numero a 64 bit erano 0 di. Si sbagliavano. -La Incapacità di uno programma software per accettare il tipo di numero generato dal un altro era alla base del fallimento. Lo sviluppo del software era diventato un parte molto costosa delle nuove tecnologie. L'Ariane 4 razzo era stato molto successo, tanto del software creato per era anche utilizzato sulla Ariane 5. -Il Problema di fondo era che il Ariane 5 è stato più veloce, accelerato velocemente. E il software non ha avuto spiega che cosa. -La Distruzione del razzo è stato un grande disastro finanziario, tutto a causa di un errore di software minuto. Ma questo non era il primo problemi di conversione dei dati in tempo aveva afflitto moderna tecnologia dei razzi. -In 1991 con l'avvio della prima guerra del Golfo, il missile Patriot sperimentato un simile tipo di problema numero di conversione. Come risultato, 28 persone, 28 soldati americani sono stati uccisi e circa Altri 100 feriti, quando il Patriot, che avrebbe dovuto per la protezione contro Scuds arrivo, omesso di sparare un missile. -Quando Iraq invase il Kuwait e l'America Desert Storm lanciato all'inizio del 1991, Batterie di missili Patriot sono stati schierati per proteggere l'Arabia Saudita e Israele da attacchi missilistici iracheni Scud. La Patriot è una degli Stati Uniti, a medio raggio terra-aria del sistema prodotto dalla società Raytheon. -La Dimensione del intercettore Patriot, in sé, è di circa, lungo circa 20 piedi. E pesa circa 2000 chili. E porta una testata di about-- Penso che sia più o meno 150 libbre. E la testata, in sé, è un alto esplosivo, che ha frammenti intorno ad esso. L'involucro della testata è progettato per agire come pallettoni. -Le Missili sono trasportato, 4 per contenitore, e sono trasportati da un semirimorchio. -Il Sistema missilistico contro Patriot risale almeno 20 anni. È stato originariamente progettato come missilistico di difesa aerea di abbattere gli aerei nemici. Nella prima guerra del Golfo, quando quella guerra è arrivato, l'esercito ha voluto usarlo per abbattere Scud, non aerei. La Forza iracheno non era tanto di un problema, ma l'esercito era preoccupato per Scud. E così hanno cercato di aggiornare il Patriot. -Intercepting Un nemico missile viaggia a mach cinque stava per 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. -Che È successo, è il Scud che stavano arrivando in, erano instabili, sono stati dondolavano. La ragione di questo, era gli iracheni, al fine per ottenere 600 chilometri fuori una gamma missile 300 km, ha preso peso fuori dalla testata anteriore e fatto la testata più leggero. Così ora, il Patriot sta cercando di venire al scud, e la maggior parte del tempo, la stragrande maggioranza della tempo, sarebbe solo volare dal scud. -Una Volta i gestori del sistema Patriot ha realizzato il Patriot mancato il suo obiettivo, hanno fatto esplodere testata del Patriot, al fine di evitare eventuali perdite se esso è stato permesso di cadere a terra. -Che Era quello che la maggior parte la gente ha visto, quei grandi palle di fuoco nel cielo, e frainteso come intercettazioni di testate Scud. Sebbene nella notte cieli, Patriots apparso per essere con successo distruggendo Scud, a Dhahran, ci potrebbe essere nessun errore sulle sue prestazioni. Lì, il sistema radar del Patriot perso le tracce di un Scud in arrivo, e mai lanciato, a causa di un difetto software. Era gli israeliani che per primo ha scoperto che quanto 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 di Dhahran, gli israeliani segnalato per il Dipartimento della Difesa, che il sistema perdeva tempo, che dopo circa 8 ore di funzionamento, hanno notato che il sistema era diventando decisamente meno accurata. Il Dipartimento della Difesa ha risposto raccontando tutte le batterie Patriot di non lasciare il sistema per molto tempo. Non hanno mai detto quello che da molto tempo è stato. 8 ore? 10 ore? 1000 ore? Nessuno sapeva. -la Batteria Patriot di stanza presso la caserma a Dhahran, e la sua viziata interna orologio, era stato su più di 100 ore la notte del 25 febbraio. -E Monitorati tempo con una precisione di circa 1/10 di secondo. Ora 1/10 di secondo è un numero interessante perché non può essere espresso in binario, esattamente. Il che significa, non può essere espressa, appunto, in qualsiasi moderno computer digitale. E 'difficile da credere, ma utilizzare questo come esempio. Prendiamo il numero, 1/3. 1/3 non possono essere espresse in decimale, esattamente. 1/3 è 0.333 in corso per l'infinito. Non c'è modo di farlo, con precisione assoluta, in decimale. E 'esattamente lo stesso tipo di problema che è accaduto nel Patriot. Più a lungo il sistema ha funzionato, il peggio l'errore tempo è diventato. -Dopo 100 ore di funzionamento, l'errore in tempo era solo circa 1/3 di secondo. Ma in termini di targeting per un missile viaggia a mach 5, si è tradotto in un inseguimento Errore di oltre 600 metri. Sarebbe un errore fatale per i soldati a Dhahran. -Che Cosa è successo, è un lancio Scud era rilevato dai satelliti di allarme rapido, e di nuovo che la Scud era arrivando nella loro direzione generale. Non sapevano dove venisse. -Era Ora 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 davvero traccia la posizione del Scud e poi prevedere dove probabilmente sarebbe, la volta successiva, la radar inviato un impulso. Che è stato chiamato il cancello gamma. -Poi, Una volta che il Patriot decide abbastanza tempo ha passato a tornare indietro e controllare il prossimo posizione per questo oggetto rilevato, risale. Così, quando si tornò al sbagliato posto, poi vede nessun oggetto e decide che non c'era oggetto, si trattava di un falso rilevamento, e scende in pista. Il Scud entrata scomparso dallo schermo radar, ei secondi più tardi, sbattuto nella fortezza. Il Scud ha ucciso 28 e fu l'ultima uno sparato durante la prima guerra del Golfo. Tragicamente, il software aggiornato arrivati ​​a Dhahran il giorno seguente. Il difetto del software aveva stato, chiusura fisso un capitolo nella travagliata la storia del missile Patriot. [FINE RIPRODUZIONE] DAVID J MALAN: quindi dovremo dare un'occhiata a alcune limitazioni simili in appena un po '. Ma prima, andiamo transizione ad alcuni è FYI. Così tra-- questo fine settimana, ci sarà sezioni eccellenti, che hanno lo scopo di soppiantare sezioni regolari, che avvierà una settimana da qui. Date un'occhiata al sito web del CS50 Per ulteriori informazioni su quelli. Inoltre saranno filmate e in streaming vivere per coloro che non possono partecipare. Problema 1 è impostato sulla sito web già del corso, e daremo uno sguardo a che in appena un po '. E le ore di ufficio troppo, avrà collocare questo Lunedi al Giovedi. Quindi questa è stata la più canonica programma abbiamo guardato l'ultima volta. E 'come il più semplice programma è possibile scrivere in C, e anche questo è un po 'di un'affermazione audace. Destra? Perché ci sono un sacco di apparente complessità di questo. Quindi, diamo un rapido sguardo a ciò che alcuni di questi elementi erano e poi cercare di fornire un modello mentale di come questi semplice dei programmi Lavoriamo, e poi inizieremo guardare le cose sempre più complesso. Così questa linea qui, ha sottolineato oggi, in giallo, quello che abbiamo detto, l'ultima volta, che questo fa per noi? Qual è lo scopo serve? Chiunque da più indietro? Già. Membro del pubblico: [incomprensibile] DAVID J MALAN: Good. Così si dà l'accesso ai comandi, o facciamo li chiamano funzioni, che qualcuno altro ha scritto, che vengono dichiarati, per così dire, in un altro file. Quindi vedremo esattamente ciò che un file .h è contro un file .c, alla fine. Ma per ora, è sufficiente sapere printf che, per esempio, è tra le funzioni che sono state dichiarato in qualche altro file, da qualche parte altro sul disco fisso del nube che ci permette di accedere printf e usiamo senza dover reinventare che ruota noi stessi. Nel frattempo, principale. Qual è stato l'analogo di principale, la settimana scorsa? Già. Membro del pubblico: Bandiera verde viene cliccato. DAVID J MALAN: Sì. Scratch, quando la bandiera verde cliccato. E 'come il pezzo del puzzle che prende il via le cose. E così allo stesso modo, ha fatto il mondo deciso alcuni anni fa che in C, e un mucchio di altre lingue, se si vuole scrivere un programma, la tua prima funzione deve essere chiamato, principale. E deve apparire così. Ma ci torneremo, un'altra volta, a quello che, int, e, vuoto, significa in questo contesto. Per ora, le parentesi graffe sono gentili di come forma di puzzle di Scratch che incapsula alcune numero di linee. E tra le linee qui, è questa qui. printf è una funzione in cui scopo la vita è per stampare una stringa formattata. E per formattato, vi intendo può inserire valori segnaposto, ed è possibile specificare il numero di decimali punti, quanti numeri da stampare dopo un punto decimale e simili. E printf, naturalmente, prende uno o più argomenti o parametri, altrimenti noto, più semplicemente, come ingressi. Così printf, come un sacco di funzioni, prende input. E questi ingressi sono abbracciati dai due parentesi qui. E all'interno di queste è un ingresso. Si tratta di una stringa, come l'abbiamo chiamato, che è solo una sequenza di caratteri, come una parola o una frase o un intero saggio anche, tra doppi apici. Ed è quello che sta per influenzare il comportamento di printf perché, naturalmente, è solo una funzione di stampa generica. Non è intenzione di sapere che cosa per la stampa, a meno che non gli si dice. E poi, un po 'minuzie. Cosa abbiamo detto questo strano sequenza di simboli è? Già. Membro del pubblico: Nuova linea. DAVID J MALAN: Nuova linea. Così si scopre, non si può semplicemente colpire, entrare, quando si scrive il programma. In generale, il compilatore sta per arrivare un po 'confuso su quello che vuoi dire. Piuttosto, si deve letteralmente dire, dammi una nuova linea di qui. E così / n è ciò che generalmente chiamare un carattere di escape. Così n, per la nuova linea. E il compilatore sa che quando vede / n, dovrebbe effettivamente indurre il computer, in definitiva, o printf, in questo caso, per stampare un nuovo reale la linea, come colpire la, entrare, sulla tastiera. E, infine, che cosa ha fatto che diciamo questo pezzo di sintassi è per? Cosa rappresenta? Già. Membro del pubblico: [incomprensibile] DAVID J MALAN: E 'solo la fine della linea. E 'la fine dell'istruzione. E rendersi conto che non lo facciamo metterli ovunque. Noi certamente non li mettiamo alle estremità di ogni linea. Ad esempio, non c'è nessuno sulla prima linea, non c'è nessuno sulla linea con, principale, non c'è nessuno dopo le parentesi graffe, ma potrai iniziare a vedere e ottenere familiarità con cui viene chiamato per. Ed è quasi sempre dopo una funzione chiamare o una dichiarazione, qualche azione che si sta effettivamente prendendo. E sapere adesso, soprattutto se tra quelli meno confortevole, questi sono i tipi di cose stupide che si finirà per sbattere accidentalmente la testa contro il muro sopra. Perché sarete logicamente fiducioso in qualche problema hai risolto per un problema set, e il dannato appena non compilare o addirittura correre. E così spesso, nella fase iniziale, sta andando a essere, perché vi siete persi una parentesi, o ti sei perso un punto e virgola. E quindi basta essere consapevoli di questo tipo di cose, e cercare di non avere frustrato da loro, perché fa molto rapidamente questo diventare vecchio cappello. Ma è molto facile da ottenere frustrati presto, come risultato. Così ora, diamo uno sguardo a come questa linea è in realtà di lavoro e poi guardare un po ' uno più complicato. Così abbiamo qui, la capacità di disegnare sullo schermo. E supponiamo che questo è il mio schermo del computer, ma sto scrivendo il, ciao del programma, e non ho implementato, printf. Qualcun altro ha implementato, printf. Chi volesse pretendere di hanno attuato, printf? Se possiamo? Va bene, come ti chiami? STUDENTE 1: [? Copal. ?] DAVID J MALAN: Copal, andiamo su. Vieni su. Tutto ok. Così abbiamo, qui, alcune etichette nome, dato che faremo un piccolo gioco di questo. E chiameremo voi, printf. E se volete venire qui, quello che ho appena disegnato sullo schermo, è abbastanza semplice, ci sono io, questo. Va bene, allora, ciao il mio nome è, printf, se volete mettere che su. Tutto ok. E se si può andare Stand da schermo del computer come se si è la funzione che è venuto con questo sistema di computer. E il vostro scopo nella vita è stampare in realtà qualcosa. Ma proprio come il programma che appena avuto sullo schermo, qui, stiamo andando ad avere per effettivamente dare qualche input. E così, se il mio ingresso, qui, è a quanto pare, ciò che è passato a printf, cerchiamo di tipo di beffe in su come questo. Ho intenzione di scrivere letteralmente un pezzo di carta, "ciao, mondo" backslash N. E per essere chiari, cosa Ho appena disegnato su questo pezzo di carta, assomiglia a questo. Così, quando ho eseguito questo programma, e questo linea gialla di codice viene eseguito, è come se io, il programma ciao, sto consegnando alcuni input via a una funzione che qualcun altro ha scritto. E se si, con il dito, potrebbe in realtà, con il dito, disegnare sullo schermo qualunque è vi è stato consegnato, l'effetto, in ultima analisi, è quello vedere esattamente che, sullo schermo. E un caso piccolo angolo qui. E bene, non dobbiamo vedere la, nuova linea, a questo punto. Non sarebbe corretto per voi disegnare esplicitamente il ritorno a capo. Ma se abbiamo continuato a scrivere parole sulla schermo, si finirebbe sotto quella. Quindi vi ringrazio molto, ma bastone in giro qui solo per un momento. Ora abbiamo bisogno di un altro volontario, se potessimo, che sta andando ad avere bisogno di giocare il ruolo di-- E 'solo le persone in orchestra adesso. Come about-- OK. Giusto qui. Vieni su. Come ti chiami? STUDENTE 2: [? Ivay. ?] DAVID J MALAN: Siamo spiacenti? STUDENTE 2: [? Ivay. ?] DAVID J MALAN: Ethan, andiamo su. No? Ho ricevuto che sbagliato, anche dopo aver detto che due volte? Vieni su. E 'difficile sentire qui. OK. E mi dispiace, come ti chiami? STUDENTE 2: [? Ivay. ?] [? DAVID J MALAN: Ivay. ?] OK. Per ora, se non mente, si sta getString. STUDENTE 2: OK. Cool. DAVID J MALAN: Quindi, se volete di stare qui solo per un momento, diamo un'occhiata a un po ' altro programma complesso, che ora ha tre linee di codice. Così abbiamo, una, affermare il proprio nome utilizzando printf; due, una chiamata a GetString, seguita da un'assegnazione di un variabile chiamata, stringa s, o chiamato s; e poi un'altra chiamata a, printf, ma questa volta con due ingressi. Stato così abbiamo già fatto il tuo nome, o meglio, ci siamo già fatto una chiamata printf. Quindi ho intenzione di scrivere, il vostro nome. E così, quello che ho intenzione di passare, printf, in un momento, è semplicemente, questo. Quindi, se si vuole andare avanti e disegnare questo sullo schermo, questo è il vostro input ora. Tutto ok. E dimenticare corda, ora abbiamo la nostra linea di codice qui. Quindi, in, GetString, abbiamo bisogno di in realtà chiamata, GetString. Così il vostro scopo nella vita è quello di andare a piedi fuori nell'orchestra, se si potesse, e ottenere il nome di qualcuno. Ma cerchiamo di darvi qualcosa per metterlo su. Se si vuole, andare avanti e ottenere una stringa, ottenere il nome di qualcuno in quel pezzo di carta, se potessi. Tutto ok. E vedremo, in un momento, il cui nome che stiamo ottenendo. Nel frattempo, quello che ho intenzione di hanno pronto, è un pezzo di carta, in cui, io vado per memorizzare qualunque valore che è che GetString sta tornando a me, Io, essendo una variabile stringa chiamata, s. Tutto ok. Allora, cosa hai qui? Nik. Tutto ok. Così abbiamo il nome di Nik qui. Quindi questo è ciò che letteralmente è stato restituito a me, per così dire, da GetString. Io, ora, sto andando a eseguire il lato sinistro di tale espressione, dove ho semplicemente annotare, per finalità di oggi, Nik. Così ora, ho una variabile chiamato, s, memorizzare il nome di Nik. Ho già consegnato a printf, un argomento precedente. Ma nella nostra terza e ultima riga codice, in realtà ho dovuto printf mano qualcosa di un po different-- "ciao,% s" backslash n. E così l'ultima riga vado per send-- l'ultima cosa di cui sono intenzione di scrivere fin d'ora, è questo. Quindi le due righe di codice, o piuttosto l'ultima riga di codice, chiede due inputs-- uno, questo, e due, questo. Quindi, se la nostra funzione printf possono ora prendere questi come input, mi permetta di cancellare lo schermo per voi. In realtà no, si può andare avanti. Lo lasciamo, dal momento che è sullo stesso programma. Dovremmo vedere, ciao, Nik. Tutto ok. Quindi questo è stato un bel po ' cerchi di saltare attraverso, appena di scrivere, di indicare la vostra nome, e, ciao, Nik. Ma questa semplice idea di messaggio che passa, passaggio di ingresso e uscita di ricezione, è esattamente il modello che stiamo andando ad avere anche per le funzioni più complesse. Quindi grazie mille a tutti e due. Abbiamo una bella sforzo palla qui per voi. E grazie al nostro GetString e volontari printf simili. Grazie. Tutto ok. Grazie a tutti e due. Così abbiamo parlato finora, per lo più sulle stringhe. E si scopre che in realtà può C capire alcuni tipi di dati diversi. Infatti, prendiamo uno sguardo a questi qui. Così C, e un sacco di lingue, capire le cose chiamati caratteri. Un char è generalmente un singolo byte o otto bit. E rappresenta un singolo carattere, come la lettera A, o capitale lettera A, o la lettera minuscola A, oppure un punto esclamativo, o qualsiasi carattere che è possibile digitare su la tastiera, e talvolta anche di più. Ci capita anche di vedere carri. Un galleggiante è, generalmente, un Valore bit a 32, o quattro byte perché ancora una volta, un byte è otto bit. Quindi un galleggiante è un valore in virgola mobile, qualcosa con un punto decimale. E in effetti, questo è ciò che il film è stato parlando su quando parlavano galleggiante valori del punto, un numero fisso di bit viene utilizzato per rappresentare un numero reale. Ma c'è anche cose chiamate doppie. Questi esistono in Java, se hai preso APCS, e una doppia, come il nome per fortuna suggerisce, è due volte più grande come un galleggiante. E 'ancora un numero reale, ha solo più bit con cui essere sempre più precisa, o per memorizzare i numeri ancora più grandi. int è facile. Ne abbiamo parlato l'ultima volta. E 'solo un numero intero. Ed è in genere 32 bit, o quattro byte. E così, se avete, vediamo ora, 32 bits-- e lo abbiamo fatto in settimana 0, mai così briefly-- se avete 32 bit, che cosa è il più grande numero si può rappresentare come un intero? Prendere o lasciare? E 'come 4 miliardi, e che è solo se siamo che rappresenta solo numeri positivi. Se si dispone di 32 bit, e si desidera rappresentare numeri negativi pure, il vostro range è, essenzialmente, negativo 2 miliardi di positivo 2 miliardi. Ma in generale, inizieremo a 0 arrivare fino a 4 miliardi. Non è necessario sapere con precisione, ma possiamo vedere questo, infatti, se solo aprire un po 'calcolatrice, qui. Posso fare 2 il 32, e questo è esattamente quanto è grande, quanti valori si può rappresentare, con 32 bit. Ed è circa 4 miliardi di euro. Quindi noi continueremo a vedere quel numero in alcuni posti diversi. Ma se avete bisogno di più numeri di quello, si scopre là del qualcosa chiamato un lungo lungo. E una lunga lunga è generalmente 64 bit, che significa che è un ordine di grandezza ancora più grande di un int. Quindi non posso nemmeno pronunciare il più grande numero che si può rappresentare, ma è decisamente più grande. Ora, come un a parte, storicamente, se un int è 32 bit, e un lungo tempo è di 64 bit, come grande è un lungo, non da molto tempo? Si potrebbe pensare che sia più di un int ma forse meno lungo di un lungo lungo, ma in realtà dipende. E così si scopre uno delle frustrazioni troppo, con la scrittura di codice su alcuni sistemi, è che non tutti questi tipi di dati avere valori predeterminati. A volte è questo molte bit. A volte è che molti bit. Quindi dovete realmente sapere, a volte, l'hardware si sta eseguendo il software su. Per fortuna, altre lingue e altri tipi di dati che ora esistono, permetterà di essere più preciso. Beh, abbiamo visto corda, e abbiamo visto bool, troppo, ma si scopre quelli venire solo con la libreria CS50. Così coloro che non sono costruiti in C. Quelli invece, entrare in quel file chiamato CS50.h, che faremo alla fine buccia indietro gli strati di. Ma per ora, sono solo tipi di dati aggiuntivi. Un bool è un vero o falso, e un stringa è una sequenza di caratteri, come una parola. Ora printf, abbiamo visto, ha segnaposto,% s è uno. E si potrebbe essere in grado, ad oggi, dedurre da questi esempi, come si potrebbe avere un segnaposto per diversi tipi di dati. Ad esempio, prendere una supposizione, se ha voluto stampare un singolo carattere con printf, il segnaposto è probabilmente% c. E se si desidera stampare un intero con il segnaposto,% i. % lld è un lungo valore decimale lungo, ma molto lungo, in modo che le mappe a questo. E poi% f per il galleggiamento valore del punto o per una doppia, così a volte stanno ri-usato in contesti diversi. Quindi staremo a vedere e utilizzare alcuni di quelli nel tempo. E printf e altre funzioni anche sequenze di escape supporto degli altri, e talvolta, questi sono necessari. Così backslash n è una nuova linea. Backslash t, fa chiunque vuole prendere una pugnalata? Membro del pubblico: Tab. DAVID J MALAN: Tab. Quindi, se si vuole realmente per stampare una scheda, non un numero fisso di spazi ma una vera carattere di tabulazione, non colpire il vostro, scheda, tasto sulla tastiera, in generale, che effettivamente fare backslash t. Backslash virgolette, perché mai dovrei volerlo? Destra? Perché non posso semplicemente digitare una doppio apice sulla mia tastiera? Membro del pubblico: Perché, altrimenti, è andando a pensare che sia la fine di come il vostro stampa [? testo. ?] DAVID J MALAN: Esattamente. Ricordate, con la nostra esempi printf, quando passavano a printf in ingresso, sulla sinistra della stringa di input e sulla destra di tale ingresso primavera, naturalmente, era una doppia citazione. Se il tuo ingresso ha una doppia citazione nel mezzo di quello, il computer potrebbe potenzialmente confondersi, come ad, fa questo virgolette appartengono in mezzo? Appartiene con la sinistra? Appartiene con quella giusta? E così, se si vuole fare super chiaro, si fa backslash virgolette, in modo che sia sfuggito, per così dire, e non è conflated per qualcos'altro. E c'è qualche altro qui, r backslash, singoli apici, 0, che potremmo vedere nel corso del tempo, pure. E ora, per quanto riguarda le funzioni? Così le azioni che possiamo prendere finora in questa lingua, C, beh, abbiamo visto, printf, naturalmente, e tutti gli altri sullo schermo, qui, che useremo per la solo prime settimane del corso, venire quando la biblioteca CS50. E fanno molto più facile, in C, per effettivamente ottenere l'input dell'utente. Risulta che in C, e francamente in poche lingue, si tratta di un vero e proprio dolore al collo per fare qualcosa di semplice, come richiedono all'utente per tastiera, per il suo ingresso. E così queste funzioni rendono più facile. E ha anche l'errore la verifica in tutto, in modo che, quando si ricordare il Mercoledì, abbiamo visto il, riprovare, avvertimento, quando non ha collaborato, e ho digitato una parola, invece di un numero? Abbiamo fatto il lavoro pesante in anticipo su per assicurarsi che l'utente collabora. Ma questi sono solo di formazione ruote che alla fine, e rapidamente, decollare. Quindi, per ricapitolare, poi, diamo un rapido sguardo, proprio come abbiamo fatto con Scratch, a alcuni costrutti canonici in C. Questo ha lo scopo di, specie di, essere un rapido giro, proprio in modo da avere un riferimento e che avete visto le cose in un primo momento. Ma poi vedremo codifica attuale utilizzare alcuni di questi blocchi. Così simile a Scratch, quando avevamo dichiarazioni come, dire o, attendere, in C, noi abbiamo funzioni, nonché, come printf. Se vogliamo esprimere una condizione in C, è simile, nello spirito, a quel pezzo di puzzle che sembrava come questo in Scratch. Ma invece, abbiamo letteralmente basta scrivere, se. E poi, tra parentesi, abbiamo messo una condizione, se tale condizione è quello che faremo chiamare, di nuovo, una espressione booleana. E ancora una volta, questo è una sorta di pseudocodice. E, infatti, il // è un commento. E 'solo parole in inglese per me stesso. Ma questo è il generale struttura di un, se, condizione. Ma vedremo calcestruzzo esempi in un attimo. Se si desidera avere un forchetta a due vie in mezzo alla strada, proprio come abbiamo fatto con il nostro volontario Mercoledì, si può avere un, altra cosa se. E se si vuole avere un terzo ed condizione finale, o una situazione di default, si può avere solo un blocco else, lì. E allo stesso modo, con espressioni booleane, si può, e, insieme. E abbiamo visto il Mercoledì, che non è un singolo commerciale, è due, per ragioni di livello inferiore che avremo finalmente vedere e giocare con. O-ing cose insieme è 2 barre verticali. Su una tastiera americana, questo è generalmente una chiave con il tasto Shift sopra il vostro tasto Invio o il tasto Return. Poi c'è queste cose che useremo forse una o due volte. Essi sono funzionalmente equivalenti a cosa si può fare con una, se, altrimenti se, else if altro, costruire, ma si chiamano un interruttore. Sembrano molto diverso, ma ti vedere in alcune del nostro codice di distribuzione, per un futuro insieme problema, molto probabilmente, che a volte è solo una più bella modo di esprimere una intera mazzo di condizioni, senza avere un sacco di parentesi graffe e un sacco di parentesi e indentazione. Ma ci danno più potere che abbiamo già. E adesso loop. E questo, vedremo a poco più lentamente. Ma poi, inizieremo ad usare questi, soprattutto per chi ha già familiarità. Questo è il modo canonico, se incredibilmente modo arcano, di scrivere un ciclo in C. Ora un ciclo in Scratch è stato abbastanza semplice. Hai una, per sempre, blocco. Hai una, ripetere, blocco con solo un numero che dovete digitare. E con il, per ciclo, si può implementare sia di quelle idee, ma è un po 'più tecnico. Ma francamente, è anche relativamente semplice. Una volta che conosci l'ordine di le operazioni, letteralmente sono solo andando a collegare i valori e dire al computer cosa fare. Quindi, ecco un esempio. Questo è un anello che, piuttosto semplicemente, conta da un numero fino attraverso un altro. E semplicemente guardando a lui, anche se si dispone nessuna esperienza precedente con questo linguaggio, quale numero Non probabilmente iniziare il conteggio a? OK, 0. E sto indovinando che è perché voi vediamo che c'è un int e un i, che è una variabile. E 'inizializzato a 0. E poi, sembra che stiamo passando printf, un valore. E, in effetti, ho fatto un piccolo errore di battitura qui. Ma questo è facilmente risolto. Permettetemi di aggiungere, ho qui. Ora abbiamo printf benessere superato tale valore segnaposto. E quello che sta succedendo a contare fino in fondo? PUBBLICO: 50. 50. 49. DAVID J MALAN: 49. Così 50, a prima vista, sembra giusto. Ma che, a quanto pare, sta per essere la nostra condizione che manteniamo il controllo. E stiamo andando a fermare una volta Non ho più è inferiore a 50. Quindi questo ciclo, al contrario, deve esecuzione, fino a quando i è inferiore a 50. Ma appena diventa 50, o 51, o peggio, si dovrebbe smettere automaticamente. Tutto ok. Quindi, ciò che effettivamente accade qui? Quindi questo è l'ordine di le operazioni per un ciclo. Uno, si ha la cosiddetta inizializzazione. Questo pezzo evidenziata in giallo di codice viene eseguito prima, e ha l'effetto che, per Mercoledì, probabilmente immaginate. Si crea una variabile denominata i e negozi in quella variabile il valore 0. Così i è 0 a questo punto della storia. La prossima cosa che accade in questo costrutto, è che la condizione viene verificata. Così posso controllare subito, Sono io meno di 50? E naturalmente, la risposta per ora è, sicuramente, sì. Sì, perché i è 0, e questo è sicuramente inferiore a 50. Allora che cosa succede, è che questo riga di codice viene eseguito. Ed infatti, se c'è più righe di codice in quelle parentesi graffe, tutti vengono eseguiti uno dopo l'altro. E in effetti qui, è a quanto pare, per stampare il numero di i, che sta per essere 0, e poi 1, e quindi 2. Ma perché? Perché di venire incrementato? Ebbene, la quarta cosa che che succede è che questa sintassi viene eseguito, dopo il punto e virgola. i ++ è un modo veloce per dire; prendere il valore di i, e aggiungere 1 ad esso; e poi la prossima volta, aggiungere 1 ad esso; e la prossima volta, aggiungere 1 ad esso. Quindi, se continuiamo, cosa succederà prossimo è che non ho intenzione di inizializzare i mai più. Se ho continuato inizializzazione i per 0, questo esempio non finisse mai perché vorrei essere bloccato a 0. Ma ciò che sta per accadere è che la condizione sarà controllato, la riga di codice otterrà eseguito, l'i si incrementerà, condizione sarà verificata, codice otterrà eseguito. E continuava ancora andare in bicicletta, e ancora, e ancora, fino a quando i ++ induce un valore di 50. La condizione poi dice, 50 è meno di 50? La risposta, ovviamente, è no, e così l'intero codice interrompe l'esecuzione. E se avete più il codice sullo schermo in basso, questo è quello che succede dopo. E salta fuori di queste parentesi graffe e continua a stampare più dopo. Così uno scherzo ora, dal foxtrot, che avrete forse ora capire. E 'sempre divertente. E 'come le risatine tipo di percolato, e poi ti rendi conto che non dovrebbe essere ridere di umorismo come questo. Ma c'è qualche asporto qui, pedagogicamente, troppo. Così si scopre che sono manca un pezzo della sintassi, o di perdere un foxtrot pezzo di sintassi qui. Quello che manca, che abbiamo avuto in ogni altro esempio, finora? Ritorno, è lì, così che è un'altra cosa, che torneremo a non molto. Ciò che manca, però? Già. Membro del pubblico: il inizializzazione del [incomprensibile]. DAVID J MALAN: OK. Quindi sì. Quindi, in realtà, questo è-- Bene, e conteggio viene inizializzato in alto, o meglio, ha dichiarato in alto. Quindi questo è un altro modo di farlo. Ma non in una sola riga è valida però. Che ne dite qui? Membro del pubblico: E 'le parentesi graffe? DAVID J MALAN: Sì. Così le parentesi graffe sono mancanti. Ma questo codice, voglio dire, a loro credito, è in realtà, sintatticamente valido. Si scopre, non è necessario bisogno delle parentesi graffe se si dispone di una sola riga di codice che si desidera eseguire all'interno del ciclo. Ora siamo sempre, in classe e in tutto il nostro codice di distribuzione, includere le parentesi graffe comunque, solo per amor di chiarezza. Ma rendersi conto che nei libri di testo ed esempi on-line, si può benissimo vedere ricci ganci manca qualche volta. E va bene, se quello che si sono rientrato e destinati è solo una singola linea di codice, e non più righe di codice, potenzialmente. Tutto ok. Così relativo alla questione della l'imprecisione, è una questione di troppo pieno, nel senso che, in modo simile, non interi hanno limiti a loro proprio come i valori in virgola mobile? Nel mondo una virgola mobile valori, non può che essere così preciso, dopo di che, talvolta cose brutte possono accadere, ed i nostri programmi possono essere buggy e l'errore. Ora anche con numeri interi, si può incorrere in problemi. Ora un numero intero non ha un punto decimale o numeri dopo di esso. E 'solo un numero naturale, di solito. Quindi, cosa potrebbe andare male con un int? Se sto usando un int a conteggio, cosa potrebbe andare male? Sembra molto più semplice. Già. Membro del pubblico: se il numero diventa [incomprensibile] DAVID J MALAN: Sì. Che cosa succede se si contano così in alto, che si non può esprimere che veramente grande numero. Destra? Ad un certo punto, si sta andando di superare i limiti di un valore a 32 bit o un valore a 64 bit. Ora di nuovo, io non sono sicuro di come pronunciare un valore a 64 bit, ma so che con un intero a 32 bit, il valore più grande può essere, se è solo positivo valori, è circa 4 miliardi di euro. Quindi, se provo a contare fino a 5 miliardi, qualcosa sta per accadere. Ma vediamo che cosa, infatti, può accadere. Nel mondo di intero troppopieno, dove, in un certo senso, tracimare la capacità di un integer, cosa potrebbe accadere? Quindi, ecco un numero binario, si tratta di un ritorno al passato a 0. E 'tutto di 1, ei segnaposti ci sono potenze di 2, quindi questo è binario. Quindi questi sono 8, 1 bit sullo schermo. E se vi ricordate o rapidamente fate i conti, quale valore viene rappresentato qui con questi otto 1 bit? 255. E anche se non fosse abbastanza sicuro della matematica, si potrebbe fare fuori. O si può solo tipo della ragione attraverso di essa, aspetta un attimo, se sono che rappresenta un valore a 8 bit, e ho 256 valori possibili, ma la prima delle quali è 0, So solo che il più grande sta per essere 255, e questo è ciò che questo potrebbe essere. Quindi supponiamo che io cerco di aggiungere 1 a questo valore. Cosa faresti in grado la scuola quando si aggiunge un 1, e in realtà non adatta perché si deve portare il 1? Che cosa è questo numero che va di diventare quando si aggiunge 1? E 'intenzione di diventare 0. Destra? Perché se hai avuto più bits-- e io sarò cercare di, tipo di, digitarlo fuori qui-- se avessimo più bit, quello che abbiamo potrebbe fare qui è aggiungere l'1, e poi ci piacerebbe ottenere questo. Ops. Avremmo un 1 po 'tutto il senso qui. Ma se questo è un finita valore, è solo 8 bit, e questo è predeterminato dal computer, 1 che è effettivamente non c'è. E 'solo tipo di cade da un dirupo. E quindi se si aggiunge 1 a 255, cosa valore si ottiene in apparenza? 0. E così i numeri accidentalmente, e forse, involontariamente, finiscono per avvolgere intorno come questo. Che cosa può essere l'implicazione di questo? Beh, ci sono un paio di cose diverse. Così uno si finisce per guardare come 0, involontariamente, ma è possibile tipo di vedere, anche nel mondo reale, nel bene e nel male, manifestazioni di questa idea di un limite. Per esempio, qualcuno di voi che hanno mai giocato Lego Star Wars, qualcuno capita di sapere il numero massimo di monete è possibile raccogliere in Lego Star Wars? Prendete una supposizione basata su domande leader di oggi. È più grande di 256 o 255. E '4 miliardi. Così si scopre, e ci sono alcune people-- alcuni googling confermato scorso notte-- hanno ottenuto 4 miliardi di monete d'oro, o roba del genere, in Lego Star Wars. Anche se a quanto pare, non c'è un modo per ingannare il gioco, c'è un bug o funzionalità, che consente di solo accumulare un sacco di punti. Ma il più grande possibile del valore, secondo a questa schermata di qualcuno che trovato on-line, è davvero, 4 miliardi. Ora perché? E 'precisamente 4.000 milioni, probabilmente perché qualcuno ha deciso, che stava scrivendo questo gioco, che potevano fare 4 miliardi, qualcosa, qualcosa, qualcosa, come il valore ho messo su con la calcolatrice precedente, ma è solo un po 'più pulito per l'uomo a dire il numero massimo di coins-- o borchie, come lo chiamano them-- che può raccogliere è di 4 miliardi. E così, perché è questo? Come è il gioco LEGO l'attuazione del contatore che è tenere traccia del numero di monete che hai? Stanno usando che cosa? Membro del pubblico: Si ferma contando dopo 4 miliardi. DAVID J MALAN: Si ferma contando dopo 4 miliardi, il che significa che può dedurre, come programmatore, che probabilmente sono utilizzando un numero intero a 32 bit. Come il programmatore letteralmente appena digitato, int, nel suo codice, e questo è il tipo di variabile che che stanno usando per memorizzare il codice di qualcuno. Quindi ci sono altre manifestazioni di questi tipi di limiti. Quindi non ho giocato a questo game-- e stavo leggendo sulla storia per confermare come much-- ma nel versione originale di civiltà, dove ti pare interagire con ogni altri e può fare la guerra o la pace, Gandhi doveva essere uno dei i personaggi più tranquille, come ho comprenderla, nella prima versione di Civilization. Ed infatti, su una scala da 1 a 10, la sua aggressività era solo un 1. Così mai così leggermente aggressivo, a quanto pare. Ma a un certo punto, è possibile a quanto pare installare la democrazia nel vostro geografia. E se si installa la democrazia nella vostra versione del gioco, allora il tuo livello di aggressività va giù. E 'una buona cosa. Le persone sono più tranquillo evidentemente, in tale situazione. Ma a quanto pare, qualcuno ha fatto non hanno una, se, condizione nella versione originale del codice. Così livello di aggressività di Gandhi è passato da positivo 1, meno 2, a negativo 1, ma il gioco non lo fa capire i numeri negativi. Che cosa è accaduto è stato l'aggressione di Gandhi livello è passato da 1, a 0, a negativo 1, che ha avuto l'effetto di avvolgendo intorno ad essere il personaggio più aggressivo nel gioco, ad un valore di 255, su una scala da 1 a 10. E da allora, ci sono stati più incarnazioni di questo gioco, e hanno mantenuto come una sorta di uovo di Pasqua, che Gandhi è apparentemente così terribilmente aggressivo. Ma era il risultato di un molto semplice errore di programmazione in tale versione molto precoce del gioco. Ora più inquietante, più recentemente, il Boeing 787 è stato documentato come avere un bug, non il tipo di dispositivo si particolarmente desidera avere un bug. E i sintomi, che leggerò Qui, da un articolo on-line, era questo, un modello 787 aeroplano che è stato alimentato continuamente per 248 giorni può perdere tutto corrente alternata, AC, alimentazione elettrica, a causa le unità di controllo del generatore, GCUs, simultaneamente andare in modalità fail-safe. Quindi questo è stato un avvertimento emesso quando è stato scoperto il problema. Questa condizione è causata da un contatore software, interno al GCUs, così un numero intero o una variabile, che la volontà di overflow dopo 248 giorni di potenza continua. Boeing è in fase di lo sviluppo di un aggiornamento software che GCU porrà rimedio alla condizione di non sicurezza. Tanto come il missile scenario, in cui hanno avuto un qualche tipo di variabile che contava, e contando, e contare, ma a poco a poco straripante i confini della sua capacità, allo stesso modo ha fatto il maledetto aereo avere un overflow variabile dopo il tempo di esecuzione. E quindi il modo tongue-in-cheek di lavorare intorno a questo problema è quello di allineare, riavvio, il vostro aereo ogni 247 giorni, in modo che la memoria venga asciugò e la variabile torna a 0. Ma realizzare, questo è molto grande incarnazione del software, ma soprattutto perché abbiamo sentito parlare di Apple sistemi operativi andando in auto, e automobili auto-guida da parte di Google, e qualsiasi numero di incarnazioni del software nella nostra vita quotidiana, TV e orologi, e altro ancora, realizzare erano circondati da software, ognuno dei quali è scritto da noi umani. E come saremo tutti presto scopriremo, è molto facile e molto tipico di fare errori durante la scrittura del software. E se non li cattura, alcune cose cattive possono accadere. Ora a volte, un po ' cose divertenti possono accadere, o almeno qualche volta siamo sapere di aspettare qualche cattiveria. Così 0 diviso per 0, di grado la scuola, è generalmente una cosa negativa. E 'indefinito. E si scopre fuori-- e vediamo se il mio microfono può raccogliere questa up-- che Apple avuto qualche divertimento con questo di recente. Così ho un iPhone qui. Io vado a parlare con Siri e chiederle di darmi la risposta a 0 diviso per 0. Che cosa è 0 diviso per 0? SIRI: Immaginate di avere 0 biscotti, e li dividono equamente tra 0 amici. Quanti biscotti fa ogni persona ottenere? Vedi? Non ha senso. E Cookie Monster è triste che non vi sono biscotti. E tu sei triste che non hai amici. DAVID J MALAN: È un po 'antipatico. Quindi questo è ciò che è stato appena detto lì. E 'indeterminata, non è definito, e in effetti, molti linguaggi di programmazione o, in realtà, compilatori rilevare quando, in un programma, cercare di dividere 0 per 0. Più divertente di questo, però, è che a quanto pare, Cookie Monster è su Twitter in questi giorni. Ed egli rispose a questo, con questo, che è assolutamente adorabile. Ma diamo un rapido sguardo a un paio di altri costrutti, e poi mettere un po 'di questo codice da utilizzare, in buoni modi. Così si scopre, oltre cicli for, c'è qualcosa chiamato un ciclo while, che un aspetto diverso e si realizza un po 'e differently-- avremo finalmente vediamo examples-- ma in un certo senso, è più semplice perché non consente di inizializzare e aggiornare nel limite del ciclo. È ancora possibile attuarla. Così si può fare le stesse identiche cose con un ciclo while, come con un ciclo for, ma la sintassi, ultimately-- come vedremo alla fine see-- sta per essere diverso. C'è anche un ciclo Do While, che è in realtà un po 'diverso, in che mentre un ciclo for e un ciclo while sempre controllare la loro condizione prima, se leggete questo top cosa a fondo, che tipo di sembra che stia per controllare la propria condizione ultima, perché è veramente l'ultima riga di codice. E in effetti, che sta per essere utile in alcuni programmi che scriviamo, se si vuole fare qualcosa ciecamente e, infine, controllare le condizioni. Questo non è necessariamente una cosa negativa. Se vogliamo delle variabili, si può fare in un paio di modi diversi. E abbiamo visto nel Foxtrot cartone animato, un modo di fare, dove si dichiara la variabile, come int contatore e virgola, e poi magari la prossima later-- la linea, forse 10 linee later-- effettivamente inizializzato. Quindi queste 2 righe di codice dichiarare una variabile di tipo int e chiamarlo contatore, quindi dà me abbastanza bit per contenere un int. E poi alla fine, mette il valore 0 in quella variabile. Organizza i di 0 e 1 in un modello, che conosciamo dalla settimana scorsa, rappresenta il numero che conosciamo come 0. O francamente, si può fare questo molto più brevemente, proprio come questo. Ora abbiamo anche la capacità di richiamare le funzioni. E infatti, ecco una linea 2 programma o un estratto di esso, che ci permette di realtà scrivere del codice che ottiene una stringa dal user-- molto come il nostro volontario un momento ago-- memorizzando il risultato in una variabile denominata nome, e then-- molto simile con il nostro volontario con stampe printf-- fuori quei valori passando due argomenti, il stringa, seguita dalla variabile chiamato, nome, stesso. Quindi, diamo uno sguardo, prima di torniamo a Mario lì, un paio di ora, esempi di questo. Ho intenzione di andare avanti e aperto fino, diciamo, la funzione-0.c. E come sempre, questo codice è disponibile sul sito web del corso, in modo da poter giocare insieme a a casa e guardare in un secondo momento. Ma ecco il programma nel suo essenza, dalla linea 17 al 22. Il programma principale è dove il programma è sempre sta per iniziare. Questo programma, a quanto pare, sta andando per stampare il vostro nome, colon. Sta andando poi a chiamare GetString, proprio come abbiamo fatto con i nostri volontari. Poi, questo è interessante, sta andando a chiamare PrintName. Si scopre, per tutto questo tempo, ci sembra essere una funzione chiamata PrintName. Che stampa il nome di qualcuno. Non abbiamo avuto bisogno di usare printf da ieri, c'è PrintName. Ma questo è fuorviante perché non lo fa PrintName venire con C. La gente non ha fatto inventarlo circa 40 o 50 anni fa, L'ho fatto, invece. E infatti, se ho scorrere ulteriormente verso il basso, avviso come posso scrivere il mio funzioni in C. avremo finalmente spiegare perché continuiamo a dire, vuoto, in alcuni punti, ma per oggi, andiamo basta guardare il nome. Sulla linea 24, se si vuole creare la propria funzione, letteralmente scrive il il nome della funzione. Ho scelto PrintName. Tra parentesi, è quindi specificare quali tipi di ingressi, e quanti voi vuole questa funzione per prendere. In questo caso, voglio prendere 1 variabile chiamata, nome, e sta andando ad essere di tipo, stringa, quindi sta andando essere una sequenza di caratteri. E poi, questo program-- molto simile a Scratch, si può avere di puzzle personalizzati pieces-- sta per avere questo comportamento personalizzato. Sta andando a chiamare printf passando, ciao, segnaposto, e poi sta andando a collegare in ciò che l'utente chiamato. Quindi questo è un esempio di ciò che uno scienziato informatico sarebbe astrazione chiamata o funzionale decomposizione, che sono solo modi di fantasia di saying-- è se vi piace questa idea di alto livello, come voglio funzionalità che Stampe nome di qualcuno, assolutamente si può letteralmente scrivere printf e poi passare gli argomenti che si desidera, e il programma funzionerà, come ha da Mercoledì. Ma si può iniziare a astrarre la nozione di stampa di un nome. Si può dare un nome, come PrintName, e questo è questa idea di stratificazione a partire dalla settimana 0. D'ora in poi, io e te non devo sapere o interessa come PrintName è implementato. Si utilizza printf, forse non, chissà che cosa usa? A chi importa? Ora sto parlando qui, invece di quaggiù. E in effetti, come i nostri programmi ottengono più avanzato e sofisticato, stiamo andando a continuare a prendere per scontato che esistono più bassi pezzi del puzzle di livello. Perché noi li scrivevamo o qualcun altro ha fatto, così poter poi costruire su di essi. Diamo uno sguardo a questo variante funzionare uno. Quindi questo è un po 'più advanced, ma risulta che nella biblioteca di CS50, c'è solo una funzione di GetInt. Non pensavamo che, anni fa, a implementare una funzione GetPositiveInt. E questo è un po 'fastidioso, perché se voi ragazzi stanno scrivendo un programma in cui si vuole ottenere un positivo intero da parte dell'utente, si può assolutamente utilizzare GetInt. E si può assolutamente controllare con la condizione e forse un ciclo se tale int è maggiore di 0 e urlare a l'utente se lui o lei non dà un numero positivo. Ma costruiamo questo Blocco noi stessi, una, pezzo Scratch personalizzato, se si vuole. Ho intenzione di avere un programma qui che alla fine, io vogliono essere in grado di chiamare GetPositiveInt, e voglio essere in grado di stampare qualsiasi cosa che int è. Ma questo è astratto via ora. E 'stato appena dato un alto livello nome che dice quello che fa, che è meraviglioso perché è molto intuitivo ora da leggere. E se lo faccio importa cosa c'è sotto il cofano, mi permetta di scorrere verso il basso. Ed è un po 'intimidatorio all'inizio, specialmente se questo è il primo programma, ma diamo uno sguardo. Non ho più sto dicendo, vuoto, perché si scopre funzioni, molto simile GetString, può restituire un valore per me. Essi non solo hanno per stampare su schermo, si può effettivamente mano me qualcosa di nuovo. E mentre prima PrintName, Non avevo bisogno di nulla in cambio. Avevo bisogno l'effetto collaterale di qualcosa che mostra sullo schermo, ma non ho bisogno di un uomo a darmi qualcosa in cambio. Qui, con GetPositiveInt, come con GetInt, Voglio essere consegnato qualcosa in cambio. Così sto dicendo che non, vuoto, sulla linea 23, ma int, che dice, questa funzione che sto scrivendo, chiamato GetPositiveInt sta per mi restituire un numero intero, non nulla, non nulle. Nel frattempo, sta andando a prendere nessuna ingressi, così ho, tipo di, invertito esso. Non sto dando GetPositiveInt qualsiasi Ingresso, voglio che mi dia la sua uscita. E allora che cosa succede ora? Quindi, ecco come posso dichiarare una variabile. Ho fatto al di fuori del ciclo, per motivi ci vediamo alla fine, ma questo dà solo me 32 bit chiamato, n, e ho predeterminare loro di memorizzare numeri interi. Ed ecco che, mentre fanno costrutto, ed è per questo è utile. Letteralmente fare questo, mentre n è inferiore a 1. Quindi vediamo cosa succede. A stampare, per favore dammi un int positivo. Allora ottengo un int, utilizzando CS50 di funzionare e memorizzato in n. E poi, che riga di codice probabilmente viene eseguito il prossimo, logico? Quale linea numero? Sì, così 31. Non si sa fino a quando hai questo stato detto o sorta di inferire che, ma questo è vero. Va verso il basso e poi continua a ripetersi. Quindi, se ho digitato per esempio, il numero negativo 1, è n meno di 1 negativo? Già. Poiché negativo 1 è inferiore a 1. Quindi, che cosa dovrebbe accadere? Ho intenzione di fare questo mentre n è minore di 1, così ho intenzione di tornare alla linea 28. E ogni tempo-- e corriamo questo-- fare Funzione 1 a compilarlo, e ora dot funzione 1 tagliare. Se scriv negativo 1, è intenzione di continuare a inveire contro di me fino a quando collaboro perché ogni dei miei ingressi è inferiore a 1 e se è mentre meno di 1, Ho intenzione di continuare a fare questo. Se ho finalmente dato un numero come 50, per fortuna, si dice, grazie per il 50. Perché? Perché appena n non è inferiore a 1, mi fermo sempre bloccato in questo ciclo, e questa nuova parola chiave oggi, ritorno, letteralmente lo fa. Così ho appena implementato, in un senso, l'equivalente di GetString, dove sto restituendo a chi mi sta usando, un certo valore. Essa non deve essere una stringa, è un int. Quindi, un semplice, rapido ad esempio, ma ce la faremo presto vedere alcuni più sofisticati versioni ancora. In realtà, diamo uno sguardo ad un uno numerico, che si chiama return.c. E questo è in realtà un po 'più semplice. Quindi lo scopo di questo programma in life-- cerchiamo di compilare ed eseguirlo, così fare ritorno, dot barra, avviso return-- il programma cubi semplicemente il valore 2. E 'abbastanza stupido, è difficile codice, non ci vuole nessun input, ma lo fa dimostrare un'altra funzione che ho scritto io. Così qui, ho dichiarato un variabile, chiamato x, di tipo int, pari al numero 2, del tutto arbitraria. Questo è solo un po 'di stampa soffice. Dice x ora, tale e tale, cubatura dot dot dot. E la magia è apparentemente in linea 21. Sto chiamando una funzione chiamata, cubo, Sto consegnando un foglio di carta con il numero 2 scritto su di esso, e quale valore, matematicamente, voglio uscirne? Proprio come un controllo di integrità? 8. Destra? Che voglio 2 Cubed indietro, 2 a la potenza di 3, 8 così indietro. Allora, dove sta cubo implementato? Beh, avviso è implementato qui. E proprio come prima, logicamente, anche se la sintassi è probabilmente molto nuovo per molti di voi, Voglio questa funzione a portata di mano mi riporta un foglio di carta con un int su di esso. Così ho un int, il nome è arbitrario, ma convenientemente chiamato cubo. L'ingresso ad esso, è di n tipo integer, così che è come posso passare nel numero 2 su un foglio di carta. E poi si scopre C supporti matematica, in modo da non dovete xe per i tempi, è sufficiente utilizzare l'asterisco per la moltiplicazione. E questo restituisce n volte n volte n, che è semplicemente un valore al cubo. Allora, dove stiamo andando con tutto questo? Questo è sicuramente un vorticoso giro, tranquilli, che in sezioni Super e nel problem set 1, sarete camminato attraverso tutto ciò tanto più. E nel problema set 1, faremo transizione dal mondo grafica di Scratch a qualcosa di più della riga di comando in C. Ma ci ispiriamo da questo gioco qui da ieri, in cui utilizzando C e l'edizione standard del p set ti implementare piramide di Mario. E nell'edizione degli hacker della p set, se lo desiderano ad eleggere, si implementare un po 'di più sfidando piramide con due picchi. Potrai anche implementare un algoritmo, un algoritmo greedy. Si scopre là del una logica interessante dietro il processo di in esecuzione della stazione di un cassiere e in realtà consegna qualcuno cambiamento indietro. C'è un algoritmo che è abbastanza semplice, che si potrebbe anche cogliere intuitivamente la prima volta che leggete it-- rendendosi conto che è quello che ho sempre fatto in qualsiasi momento ho dato a qualcuno un po ' soldi back-- che permette di sempre minimizzare il numero di Note di carta o monete metalliche che si sta restituendo all'utente. E questo, naturalmente, è interessante perché se si va a CVS o roba del genere, non si vuole essere consegnato un sacco di quelli o un intero gruppo di centesimi. Si desidera che il minor numero monete, probabilmente, possibile. Infine, potrai anche essere sfidati a dilettarsi con il mondo d'acqua ed effettivamente ottenere un apprezzamento per una mappatura tra i tassi di flusso, di come, l'acqua in una doccia, quanta acqua viene utilizzata. E l'allusione in esso, sarà questa clip qui, che finiremo avanti per soli 60 secondi, che dipinge un quadro di docce a basso flusso. [RIPRODUZIONE VIDEO] -Tutto ok. Ho tutto qui. Ho ottenuto il ciclone Serie F, Hydra, Jetflow, Stoccolma Supersteam, è il nome. -E Cosa mi consiglia? -Cosa stai cercando? Uomo-Power. Energia. -Come Silkwood. -Che È per le radiazioni. -Giusto. -Ora Che cosa è questo? -Che È la Commando 450. Io non vendo quello. -Ma Questo è quello che vogliamo. Si tratta di un commando di 450. -No Mi credono. E 'utilizzato solo nel circo. E 'per gli elefanti. -Ti Pagare nulla. -Cosa Di Jerry? -Non Poteva sopportarlo. E 'delicato. O si. [FINE RIPRODUZIONE] DAVID J MALAN: Va bene. Questo se per CS50. Ci vediamo la prossima settimana. SPEAKER 1: [? Scully?], [? Ian,?] per quanto riguarda questo progetto outro, cosa hai ragazzi trovare? SPEAKER 2: Beh, abbiamo dato una varietà di pensiero, e pensiamo che il modo migliore a-- SPEAKER 3: Posso? SPEAKER 2: Sì. Con tutti i mezzi, in realtà. SPEAKER 3: Quindi penso possiamo riassumere la nostra idea per le outros con uno word-- nulla. DAVID J MALAN: Niente? SPEAKER 3: Niente. DAVID J MALAN: Che cosa vuol dire? SPEAKER 3: I outros sono per nulla. SPEAKER 2: Beh, voglio dire, in filosofia, Voglio dire, niente è sempre qualcosa. SPEAKER 1: Così what's-- qual è la premessa? SPEAKER 3: Quindi è come la vita. OK. Cosa hai fatto oggi? DAVID J MALAN: mi sono alzato, aveva prima colazione, ed è venuto a lavorare. SPEAKER 3: Questo è un outro. SPEAKER 2: Ma, voglio dire, non dovrebbe è successo qualcosa a lui su the-- SPEAKER 3: No, no, no, no. Non accade nulla. SPEAKER 1: Allora, perché stiamo guardando? SPEAKER 3: Perché si tratta di un outro per CS50. DAVID J MALAN: Non ancora.