[Powered by Google Translate] DAVID J. MALAN: Va bene, questo è CS50 e questo è il fine della settimana 1, così carte sono in studio e il numero totale di compagni di classe che avete quest'anno è 745. E siamo così entusiasti di avere così tanti di voi nel corso questo semestre, ma anche se questo corso è così grande, rendersi conto che si tratta di queste cose come pranzi di venerdì, come orari di ufficio, di 15 persone, sezioni e così via che devono realmente per creare questa più intima ambiente. Quindi, anche se si può raccogliere una o due volte alla settimana, qui in Sanders, sa che gran parte della vostra esperienza in questo corso sarà molto essere hands-on sul fianco dei tuoi compagni di classe e il personale docente. Quindi qui si va, Autunno 2012. Quindi ricordare che l'ultima volta abbiamo finito con una nota di imprecisione, parlando della rappresentazione dei numeri. E abbiamo guardato uno dei fallimenti che è successo, nel mondo reale, quando si trattava di malintesi funzionamento dei computer. Bene, oggi ci rivisitare un'altra di quelle idee così come continuare la nostra discussione del cliente CS50 e C e che cosa significa veramente da programmare. Ma prima, solo un paio di annunci vortice. Sezioni iniziare questa Domenica, e la prima settimana è sempre un po 'di un rapido avvio, perché abbiamo appena ricevuto in i moduli di sezione. Stiamo facendo la stessa cosa, ora, con i compagni di insegnamento, ora di conoscere i loro programmi, quindi stiamo puntando, da Sabato mattina, per seguire con voi con la vostra sezione assegnazione e TF. Rendetevi conto che inizieranno il giorno seguente, Domenica o Lunedi o Martedì. E poi ci ospiterà cambiamenti di sezione che si presentano nei giorni a venire. Orario di ricevimento, nel frattempo, sono, ancora una volta, questa sera, 08:00 a 11, in Annenberg, così come domani sera. Anche se il set di problemi sono generalmente dovute il giovedì a mezzogiorno, rende conto di avere fino a cinque giorni di ritardo a spendere, quindi sulla disponibilità di orari di ufficio il giovedì se si contanti in uno di quei giorni di ritardo e, quindi, presentare qualcosa il Venerdì. Mi permetto di suggerire che Scratch è tra i più divertente, tra le più bassi set problema chiave. E vorrei appendere su quei giorni di ritardo, strategicamente, basta per la fine del semestre in cui la vita comincia a mettersi in cammino con le elezioni di medio termine e altre classi. Set Problema 1, nel frattempo, sarebbe stato pubblicato sul suo corso la sito web di questo Venerdì, come sarà al passo del corso attraverso il video, che sarà girato alle 02:30 il Venerdì e poi pubblicato online il giorno successivo. Quindi abbiamo finito il Lunedi. Voglio - in realtà, una nota qui. Poiché le classi - perché Sanders non esattamente prestano stessa al casual Q & A avanti e indietro terribilmente bene, siamo intenzione di provare qualcosa di un po 'di novità di quest'anno, in base al quale se non stai bene alzando la mano o semplicemente preferisce non alzare la mano in una stanza come questa, stiamo andando ad avere alcuni dei compagni di insegnamento e CA cs50.net/discuss equipaggio durante la lezione. Quindi, se avete una domanda, perché ero completamente chiaro su qualcosa o siete curiosi di sapere un po 'di argomento, prova a pubblicare lì. Tagga la foto con una etichetta di conferenza, e noi faremo del nostro meglio oggi e la prossima settimana - we'll provare questo fuori - di mettere in campo la formato elettronico, on-line, o se ci si sente come dovremmo davvero affrontare in massa, uno dei compagni di insegnamento o CA sarà alzare la mano e chiedere anonimo a vostro nome. Quindi dovremo dare a questo una prova e vedere come funziona. Ma, con tutti i mezzi, continuerà a sollevare le mani, come si desidera. Così l'ultima volta ci ha rivelato che il 10% o un decimo non è, in Infatti, 0.1, come vi è stato insegnato molti anni fa. E ', infatti, un valore come questo. Ma non è del tutto vero, giusto? Non ci resta che questo vincolo nel computer per cui, se si hanno solo una quantità limitata di memoria, RAM, o più in particolare bit, beh, c'è solo un numero finito di cose che si possono rappresentare. Per esempio, se abbiamo il numero zero, e noi vogliamo rappresentano in binario, con otto bit, dove un po ', di nuovo, è uno zero o uno, potremmo rappresentarlo come 00000000. E questo è un po 'inutilmente prolisso. Proprio come nel sistema decimale nel mondo reale, in generale, se si vuole scrivere il numero 123, si gli esseri umani probabilmente non scrivere 00000123, anche se, funzionale, che è esattamente lo stesso numero. Ci basta semplicemente inserire zeri iniziali, per così dire. In binario, siamo in grado di fare lo stesso. Binario e zero, zero e binario è solo zero. Hai solo bisogno di un po 'sola. Ma ancora una volta, l'unità di misura più comune in tutto il mondo di computing è byte, otto bit. Solo perché un po ', abbastanza inutile. Otto bit, non è terribilmente utile, ma almeno è più utile di una singola unità di misura. Quindi, con otto bit, ci rappresentano in genere binario. Quindi qui abbiamo i numeri zero, uno, due, e poi, come Nate ha fatto nel nostro video Mercoledì scorso, possiamo continuare contare fino a sette, a otto. E poi se si usa bit sempre di più, si può contare fino a infinito. Ma se si ha solo un numero finito di questi bit, così come il caso in qualsiasi sistema informatico, o addirittura missili sistema, beh, in realtà è solo un quantità finita di precisione. Quindi, se si vuole rappresentare il numero come 0.1, bene, la computer deve scegliere. E se si ha solo un numero finito di numeri che può rappresentare, può avvicinarsi a 0,1 per voi, ma non può necessariamente dare esattamente il valore che si desidera. E questo è solo una delle sfide di computer, sotto il cofano, per fortuna. Mentre ci muoviamo più nel semestre, questi livello inferiore dettagli diventano molto meno interessante, ma certamente la applicazione di queste idee possono avere un mondo molto reale ramificazioni. Uno è un po 'divertente. Quanti di voi hanno visto la sorprendente Office Space film? Se non lo avete, che è il tuo non ufficiale compiti a casa per la settimana. Ma in Office Space, i compagni in quel film prende vantaggio proprio questa idea, ma in realtà rubato da un altro film che si potrebbe avere visto, anche anni prima. Quindi lasciate che vi dia qualche secondo di questo trailer questo film incredibile e questo è molto accademicamente rilevante. [Riproduzione del filmato] In realtà sto promosso. Posso programmare un virus che cattura che luogo fuori alla grande. Beh, come funziona? Ogni volta che c'è una transazione bancaria in cui l'interesse è computerizzata, ci sono migliaia al giorno, il computer finisce con queste frazioni di centesimo. Ma io non ho intenzione di fare qualcosa di illegale. Illegale? Samir, questa è l'America. Devi giuro su Dio. Se nessuno sa di questo, ma noi, va bene? Nessun membro della famiglia, non fidanzate, nessuno. [Incomprensibile]. Non ti preoccupare, amico, non lo dirò a nessuno neanche. [Film si conclude] Va bene, quindi forse ho trovato questo film meglio di molti altri persone qui, ma in ogni caso, il virus che erano cercando di creare - e nei film, ogni volta che chiamerei qualcosa di un virus, non è generalmente in realtà un virus. E 'solo un programma che qualcuno ha scritto di fare qualcosa. E in questo caso, i ragazzi stavano cercando di scrivere un programma che hanno approfittato della loro società denominata Innotech di informatica del sistema, cioè se i computer, anche, anche quando tratta di soldi, non può necessariamente rappresentano denaro proprio. Quindi, anche se si potrebbe avere 0,10 dollari nel tuo conto in banca, 0.10, beh, il computer potrebbe effettivamente pensare di avere questo molti centesimi nel tuo conto in banca. E così quello che questi ragazzi sono stati che aspirano a fare - e che rubato l'idea, viene fuori da Superman III, dove Richard Pryor fatto la stessa cosa - erano essenzialmente scrivere programmi che aspirano a prendere tutte le finali i numeri, tutti i piccoli, minuscoli, minuscole frazioni di penny, e sottraendo quelli fuori in modo che gli umani appena pensiero, oh, è solo 0,10 dollari là, ma tutti coloro numeri finali alla fine tornano. Quindi, una splendida idea e ritorto contro esilarante in quel film particolare. Ma nel mondo reale, anche, ci sono molto più preoccupante implicazioni di questo genere di cose. E uno dei motivi per tuffarsi nel campo di computer la scienza è, ancora una volta, la sua applicabilità non al ingegneria scienze da solo, ma solo per altri campi. Quindi questo è un aspetto meno spensierato a ciò che può andare storto, ma è anche piuttosto l'apertura degli occhi, credo, quando si tratta di capire esattamente come onnipresente tecnologie come computer e di programmazione o in questi giorni, sotto forma di software. Quindi questo clip successiva si tratta solo di sei minuti, continua dove avevamo lasciato l'ultima volta, ma ci permette di guardare un po ' più in profondità, quali di questi problemi uno. Vorrei passare direttamente al punto in cui avevamo lasciato, che era proprio qui. E noi abbiamo una parte due di due, per circa sei minuti qui. [PLAY MOVIE] Afflitto moderna tecnologia missilistica. Nel 1991, con l'inizio della prima guerra del Golfo, il Patriot missile sperimentato un simile tipo di numero di conversione problema. E come risultato, 20 persone, 20 soldati americani, sono stati uccisi e circa 100 feriti, quando il Patriot, che avrebbe dovuto per la protezione contro Scud arrivo, non è riuscito a sparare un missile. Quando l'Iraq invase il Kuwait e l'America ha lanciato un deserto Tempesta all'inizio del 1991, batterie di missili Patriot sono stati distribuito per proteggere l'Arabia Saudita e Israele dalla iracheno Scud missile attacchi. Il Patriot è un medio raggio statunitense superficie-aria sistema, prodotto dalla società Raytheon. La dimensione del intercettore Patriot stesso, si tratta di circa 20 metri di lunghezza e pesa circa 2.000 chili. E porta una testata di circa - penso che sia o meno 150 libbre. E la stessa testata è un esplosivo che ha frammenti intorno ad esso. L'involucro della testata è progettato per agire come pallettoni. I missili vengono effettuate quattro per ogni contenitore e sono trasportato da un semirimorchio. Il sistema antimissile Patriot risale almeno al 20 anni. È stato originariamente progettato come una difesa contro i missili aria abbattere aerei nemici, nella prima guerra del Golfo. Quando la guerra è arrivato, l'esercito voleva usarla per sparare giù Scud, non aerei. L'Air Force irachena non era tanto di un problema, ma l'esercito era preoccupato per Scud. E così hanno cercato di aggiornare il Patriot. Intercettare un missile nemico viaggia a MACH 5 andava essere abbastanza impegnativo. Ma quando il Patriot è stato ricoverato in servizio, l'Esercito non era a conoscenza di una modifica iracheno che hanno fatto la loro Scud quasi impossibile da colpire. Quello che è successo è la Scud che erano arrivando erano instabili. Erano oscillazione. La ragione di questo è stata la iracheni, al fine di ottenere 600 chilometri su un missile serie 300 chilometri, ha preso peso dalla testata anteriore e fatta la testata accendino. Così ora il Patriot sta cercando di venire a Scud, e la maggior parte il tempo, la stragrande maggioranza del tempo, sarebbe solo volo da parte Scud. Una volta che i gestori del sistema Patriot realizzato il Patriot mancato il suo obiettivo, hanno fatto esplodere la testata Patriot. Per evitare possibili perdite, si è permesso di cadere a terra. Questo è ciò che la maggior parte delle persone hanno visto, come palle di fuoco grande nel cielo, e incompreso come intercetta di testate Scud. Anche se, nel cielo notturno, Patriots sembrava essere Scud successo distrutte, a Dhahran, non ci poteva essere errore sulle sue prestazioni. Lì, sistema radar del Patriot perso le tracce di un in arrivo Scud e mai lanciato a causa ad un difetto del software. Era gli israeliani che per primo ha scoperto che più a lungo il sistema era, maggiore è la differenza di tempo è diventato, a causa di un orologio incorporato nel computer del sistema. Circa due settimane prima della tragedia a Dhahran, la Israeliani segnalato al Dipartimento della Difesa che il sistema è stato perdere tempo. Dopo circa otto ore di corsa, hanno notato che il sistema è stato sempre sensibilmente meno accurato. Il Dipartimento della Difesa ha risposto raccontando tutti le batterie Patriot non lasciare i sistemi per un tempo lungo. Non hanno mai detto quello che un tempo era - 8 ore, 10 ore, 1000 ore. Nessuno lo sapeva. La batteria Patriot di stanza presso la caserma di Dhahran e il suo orologio interno difettoso era stato in oltre 100 ore la notte del 25 febbraio. Si rintracciato tempo con una precisione di circa un decimo di secondo. Ora un decimo di secondo è un numero interessante perché non può essere espresso in binario, esattamente, il che significa non può essere espressa esattamente in qualsiasi moderno computer digitale. E 'difficile da credere. Ma utilizzare questo come esempio. Prendiamo il numero di un terzo. Un terzo non può essere espresso in decimale, esattamente. Un terzo è 0,333 in corso per l'infinito. Non c'è modo di farlo con assoluta precisione in decimale. Questo è esattamente lo stesso tipo di problema che è successo nel il Patriot. Più lungo è il sistema ha, peggio il tempo è diventato l'errore. Dopo 100 ore di funzionamento, l'errore nel tempo solo circa un terzo di secondo. Ma in termini di targeting per un missile che viaggia a MACH 5, si è tradotto in un errore di inseguimento di oltre 600 metri. Sarebbe un errore fatale per i soldati a Dhahran. Quello che è successo è un lancio Scud è stato rilevato da preallarme satelliti e sapevano che stava arrivando la Scud nel loro direzione generale. Non sapevano da dove venisse. E 'stato ora alla componente radar del Patriot sistema, difendendo Dhahran, per individuare e tenere traccia della nemico missile in arrivo. Il radar era molto intelligente. Si sarebbe effettivamente monitorare la posizione della Scud e poi prevedere dove probabilmente sarebbe stata la prossima volta che il radar inviato un impulso fuori. Questo è stato chiamato il cancello gamma. Poi, una volta che il Patriot decide è passato abbastanza tempo per andare sostenere e controllare la posizione successiva di questo detected oggetto, va indietro. Così, quando è tornato al posto sbagliato, allora non lo vede oggetto, e decide che non vi era alcun oggetto. E 'stato un falso rilevamento e lascia cadere la pista. L'arrivo Scud scompare dallo schermo radar. E pochi secondi dopo, lo sbatté in caserma. La Scud uccisi 28 e fu l'ultimo licenziato durante la prima guerra del Golfo. Tragicamente, il software aggiornato arrivati ​​a Dhahran il giorno seguente. E il difetto del software era stato fissato, la chiusura di un capitolo la tormentata storia del missile Patriot. PATRIOT è in realtà l'acronimo di "Tracking Phased Array Intercettazione di Target ". Va bene, quindi un risultato molto più dolorosa di non del tutto comprensione di questo mondo. E l'asporto, in realtà, dal film è che la soluzione c'era riavviare il sistema di difesa missilistica ogni tanto un po '. E così ancora una volta, uno degli obiettivi di questo corso, di certo su scala più modesta di queste applicazioni, è tutti davvero aperto gli occhi a esattamente come si va su macchine per la produzione fare quello che vuoi fare e come si va a fare che correttamente, mentre lungo la strada facendo bene, elegantemente, e così via. E così oggi, cerchiamo di immergersi in un po 'di più di questo, ma in modo da non andare troppo veloce, in particolare per quelli meno confortevole, ma anche in modo da poter mantenere l'interesse di quelli più comodo, diciamo solo iniziare rapidamente con un po ' di riassunto di alcune di queste idee. E ancora, chiedere di distanza, sia di persona o on-line, se si dispone di domande in modo che possiamo tenere tutti sulla stessa pagina. Così il CS50 Appliance, passo indietro, è quello che, con parole tue? Va bene se non avete idea di ciò che queste parole possono essere ancora. [Incomprensibile] Ok, quindi una interfaccia universale per - che tutti possiamo condividere. Assolutamente. Così potremmo, per esempio, vi dirà di andare a un po 'di sito web, scaricare il software per Mac OS. Scarica il software per Windows, configurare in qua e di là. Ma la realtà è poi ci si imbatte in innumerevoli tecniche sostegno problemi. E anche in questi giorni, molto di ciò che è stato fatto lato server, nel mondo dei computer, specialmente quando si tratta di sviluppo web e applicativi web based, è in realtà molto spesso fatto su computer Unix o Linux, a differenza di Mac o PC Windows. Quindi, tra i pregi, poi, di utilizzare questa cosa chiamata CS50 Appliance è avremo tutti lo stesso ambiente. Così tutti sono sulla stessa pagina, non importa quale hardware è venuto a campus con ma sarà anche dilettarsi esattamente l'ambiente stesso che userete verso semestre end sia per lo sviluppo web, così come nella futuro per applicazioni reali loro. Quindi più concretamente, Appliance CS50 è un pezzo privo di software che consente di eseguire un altro sistema operativo, Linux, in questo caso, sul proprio computer, in una finestra. Ora non si può semplicemente scaricare l'apparecchio. Hai bisogno di un programma con cui giocare o eseguire l'apparecchio. E quel pezzo di software è generalmente noto come hypervisor. Hypervisor si presentano sotto forma di prodotti come VMware, Virtual Box, Parallels. Tutti i tipi di aziende a fare software, sia libero e commerciale, allo stesso modo. Quello che vedrete nel Problema Set 1 sono riportate le istruzioni su come ottenere il software gratuito con il quale eseguire il Appliance CS50. E una volta che lo fai, avrai, in una finestra sul vostro Mac o PC, un ambiente desktop che sembra abbastanza come questo, dove ha un menu di avvio, come cosa in in basso a sinistra. Ha una cartella Home o Home directory, in alto a sinistra lì, un bidone della spazzatura, e così via. Quindi dovremo prendere in giro a parte i dettagli necessari come andiamo. Ma ora cominciamo a tuffarsi in C. Quindi C è questo linguaggio di programmazione, simile nello spirito alla Gratta e Vinci, ma molto meno grafica, ma per ironia della sorte, di gran lunga più potente una volta che ottenete esperti con esso. Quindi, in C, abbiamo scrivere programmi per la scrittura del codice sorgente, che è questo inglese sintassi simile, simile alle calze dimostrazione che abbiamo fatto l'ultima volta che ti permette di esprimersi con precisione, se arcanamente, al computer. Quindi, che tipo di software del prodotto ne hai veramente bisogno di scrivere programmi in un linguaggio come il C, sulla base delle nostre conversazione il Lunedi? [Incomprensibile] OK, avete solo bisogno di un editor di testo. Non è necessario alcun software speciale di per sé, per scrivere programmi. Hai solo bisogno di un editor di testo come Blocco note di Windows, TextEdit su Mac, o qualcosa che si chiama gedit, nel mondo della Linux, che useremo qui. E questo è tutto, per scrivere i programmi. Ma la scrittura è solo metà dell'equazione. È quindi necessario per farli funzionare. Ma per eseguire programmi - non è possibile eseguire il codice sorgente. È invece fare quello che a prima? Gia '. DAVID J. MALAN: è necessario compilarlo. E qualcun altro, la compilazione del codice sorgente significa - [Incomprensibile] DAVID J. MALAN: Esattamente. Tradurre a zero e uno. Per tutti noi, in questi giorni, i computer che dispongono di CPU, quasi totalità dei quali sono realizzati da una società chiamata Intel, e Intel Inside, questo significa che c'è dentro il vostro cervello di computer, noto come la CPU. E una delle cose che fa è che il cervello, lo sa come capire i modelli di zero e uno. Sa quale schema di bit rappresenta, inoltre, che cosa modello rappresenta sottrazioni, quale schema di bit rappresentano la stampa, e creando un suono udibile. Così, in breve, la CPU, accoppiato con il sistema operativo, che è un pezzo di software che gira in cima alla CPU, per così dire. Insieme, questi due pezzi sapere come eseguire i programmi che noi umani scrivere. Quindi, se vado in Appliance CS50 qui, ho bisogno di aprire un editor di testo e posso accedere a questa in un paio di modi. Mi può andare al menu, Programmazione, e poi posso selezionare - No, non quel menu. Posso andare a Accessori / gedit qui per aprire il il mio editor di testo piccolo. O più semplicemente, posso fare clic su questa piccola icona in basso a mano sinistra. E ora ho questo ambiente qui. E 'piuttosto ricorda un semplice editor di testo, con solo uno o due differenze. Nella parte superiore, in cui il cursore lampeggia ora, è qui Posso iniziare a scrivere il mio codice. In fondo è questa cosa chiamata la finestra del terminale. E che tipo di cose che si può fare in questo cosiddetta finestra di terminale? [Incomprensibile] Ok, quindi mi eseguire i comandi. E alcuni dei comandi che correvano il Lunedi erano un po ' criptici in un primo momento, ma per la lista ls, cd per change directory, rm, per rimuovere. Quindi è una specie di vecchia scuola mezzo di navigazione vostra computer, utilizzando solo la tastiera e comandi testuali, e non, in generale, utilizzando un mouse. Ma staremo a vedere, in breve tempo, questa realtà ci dà un potenza poco più piccola e una precisione più con cui esprimerci. E poi qui a sinistra, stiamo solo andando a vedere, come si avvia il software di scrittura, un breve riassunto della programma che abbiamo scritto in alto a sinistra. Ma vedremo di nuovo in breve tempo. Quindi cerchiamo di fare qualcosa di abbastanza semplice qui. Permettetemi innanzitutto di andare avanti e andare su File, Salva, e io sono solo andando a cliccare su jharvard qui, sopra a sinistra, e jharvard è, ancora una volta, il nome della cartella per la mia casa, il mio file personali, io, attualmente in fase di John Harvard, come tutti voi sarà presto John Harvard in questo ambiente. Ha questa home directory, i miei documenti e così via, che voglio salvare, ora, questo file trovi Quindi ho intenzione di chiamarlo hello.c. Poi ho intenzione di andare avanti e fare clic su Salva, e ora quello che ho qui è una scheda chiamato hello.c, così come un altro tipo di editor. Così ora lasciami andare avanti e iniziare a scrivere un programma. int main (void). E poi ho fatto l'ultima volta, printf, formattato per la stampa, ("Ciao, mondo!" ). Quasi completo. Ma mi manca un paio di dettagli. Ciò che manca da questo programma che ho davvero bisogno di per compilare effettivamente? Gia '. [Incomprensibile]? DAVID J. MALAN: Sì, quindi ho bisogno di comprende la norma I / O library. Quindi questo ha bisogno di andare al di sopra principale, quindi sono solo andando a fare un po 'spazio per lì. E ho intenzione di fare # include. E notare le parentesi angolari lì. E per inciso, gedit è un utente poco cordiale, se a volte un po 'di confusione, nel senso che cerca di aiutare il vostro occhi notare ciò che si allinea con quello. Quindi il fatto che il mio cursore si trova proprio accanto a questo angolo staffa, si noti come è evidenziando l'altro ad angolo Staffa di più questo. E questo è solo per attirare la mia attenzione sul fatto che hanno simmetria. E la simmetria nella programmazione è generalmente una buona cosa. Allo stesso modo, se sposto il mio cursore alla fine, si noti come la le parentesi graffe in fila per dimostrare che, sì, ho aperto uno e una chiusa, per così dire. Va bene, e posso fare un'altra cosa. Non è strettamente necessario, ma buone pratiche, a dire restituire 0. E 0 ritorno fa che cosa per noi qui? O significa che cosa? [Incomprensibile] DAVID J. MALAN: Ma non c'è niente di sbagliato. E francamente è difficile per la maggior parte ad andare male in un programmare questo breve. Quindi sono solo essere super esplicito che tutto va bene. Io, l'umano, quando si esegue il programma, sarà probabilmente mai vedere che 0. In genere, questi numeri che vengono restituiti dal principale solo allevare i loro teste per gli esseri umani, quando qualcosa va storto. E si ottiene un po 'pop up di errore di sistema dicendo: uno, due, tre, o qualunque sia il numero era che è stato effettivamente restituito. Quindi, qualsiasi altra cosa di sbagliato in questo? [Incomprensibile] DAVID J. MALAN: Quindi questo non è tanto un errore funzionale ma una estetica. Probabilmente dovrei mettere in un carattere di nuova riga lì al fine di questa stringa in modo che in realtà spostare il cursore la riga successiva, e il programma sembra solo un po 'più bella. Così ora lasciami andare verso la mia finestra di terminale e, Save money E questa cosa qui, si chiama prompt. E 'solo che mi ricorda chi sono, jharvard @ apparecchio, dove apparecchio è il nome del computer sono in. In parentesi è questo tilde, il simbolo di scarabocchio, che rappresenta ciò? PUBBLICO: Home directory. DAVID J. MALAN: Home directory. Ecco, questo è solo una notazione abbreviata per dire ci si trova in la cartella personale in cui tutti i file andare per impostazione predefinita. Quindi, adesso, qui, posso digitare ls per la lista. E l'unica cosa che vedo qui in questo momento è hello.c. E questo è un bene perché ho scritto questo. Permettetemi quindi di andare avanti e fanno ciao. E notate non sto digitando make hello.c. Invece, sto solo scrivendo il nome di base del file, ciao. E fare, come abbiamo visto il Lunedi, sarà solo dedurre che voglio il file. c. Così ora che ho scritto fanno ciao. Ora vedo questo comando piuttosto lungo e continuerà vedendo questo ancora e ancora. Ma per essere chiari, clang, la parola che appena apparso, questo è il compilatore vero e proprio. Fare è solo un programma di utilità di generazione. E 'solo un programma più user friendly che mi salva, in lungo periodo, di dover digitare fuori incredibilmente noioso a lungo comandi come quello. Quindi, è possibile eseguire manualmente Clang. È possibile digitare tutto questo manualmente. Appena diventa molto noioso. E, per questo è solo un programma che semplifica la nostra vita e esegue i comandi più complessi per noi. Va bene, quindi ora quale file devo avere nella mia directory corrente? Non solo hello.c, ma anche ciao. Quindi, se voglio correre ciao, ricordo che io dico dot barra, dove i mezzi dot andare nella cartella corrente, ovunque tu sono, e quindi eseguire il programma chiamato ciao, e anzi, ora, Ho ciao mondo. Va bene, eventuali questioni relative al flusso di lavoro o la sintassi di quello che abbiamo appena fatto? Va bene, quindi cerchiamo di prendere le cose su una tacca di nuovo. Quindi questo è stato deludente per scrivere solo un programma che solo dice sempre ciao, mondo. Quindi abbiamo cambiato, il Lunedi, per dire, ciao, David. E 'un po' più personale, ma altrettanto difficile codificato come il prima versione. Quindi non è poi così avvincente. Ma esiste, in C, funzioni certamente oltre stampa, le funzioni che consentono di ottenere l'input dell'utente. E il modo in cui abbiamo fatto questo, l'altro giorno, è stato il seguente. Prima di stampare effettivamente qualcosa, ho preso qualcosa dall'utente. Quindi lasciatemi farlo di nuovo. String s, dove s è solo un nome arbitrario, qui, per un stringa, è uguale a GetString. Quindi, ciò che è stato GetString? E 'ovviamente diventa una stringa, in base al suo nome. Ma quello che è, più tecnicamente? Si tratta di una funzione. Quindi è una funzione che non viene fornito con C di per sé. CS50 personale scritto questo. E così di utilizzare questo, non si può certo includere stdio.h, È inoltre necessario comprendere che cosa? Gia '. Così cs50.h, che è solo un file che abbiamo scritto qualche anno fa. Abbiamo installato sull'apparecchio per voi a fianco tutti i file standard. E così in queste prime settimane della classe, useremo questo solo per semplificare il processo di fare molto di base cose come input dell'utente ottenere. Perché, come vedremo tra un paio di settimane, l'input dell'utente entrare in un linguaggio come il C è in realtà sorprendentemente complesso, in particolare perché non si conosce in anticipo, di solito, come tanta roba che l'utente sta per digitare trovi E quando non si conosce la quantità di dati da aspettarsi, non si sapere quanta memoria allocare. E se in realtà hanno un utente contraddittorio che sta cercando di incidere nel vostro sistema, crash il computer, beh, in genere il primo metodo di attacco è, proprio come ho fatto in Lunedi, digitare una sequenza lunga serie di caratteri casuali, premere Invio, e vedere che cosa si rompe. Perché in generale, se si rompe un programma, che allude a una falla di sicurezza, potenzialmente. Si allude certamente a voi, il programmatore, dopo aver fatto un errore, ma più pericolosamente, si potrebbe avere fatto un relativi alla sicurezza errore, e in generale vedremo che è così che le macchine sono compromessi fino ad oggi, sia nel mondo del web e programmi al riga di comando, in questo modo. Bene. Quindi la stringa s è uguale a GetString. Quindi, ora più concretamente, che cosa fa la linea 6 fare qui? Quindi la funzione di destra si stringa, prende il numero di argomenti? Va bene. Così nessuno. Un po 'di sanità mentale controllare. Un argomento, di nuovo, è solo un input ad una funzione di modificare il suo comportamento di default in qualche modo. Ma in questo caso, non voglio alterare il comportamento di GetString. Volevo solo per ottenere una stringa. Così ho messo nulla nelle parentesi, e poi ho messo un virgola demarking fine della riga di codice. Ora, il segno di uguale non significa uguale, di per sé. Significa assegnazione, il che significa mettere qualunque ottiene emesso sul lato destro all'interno di ciò che è sulla sinistra. Quindi, sulla sinistra, diciamo che hanno dichiarato una stringa denominata s. E più in particolare, abbiamo assegnato la memoria interna del che metteremo i bit che rappresenta una sequenza di caratteri. Ma per oggi, abbiamo stanziato o dichiarata una stringa. Bene. Così ora una volta che ho fatto questo, voglio collegare il valore di s non, il valore di David. Quindi questo è sbagliato perché? Quindi questo è solo letteralmente il hardcoded s. E 'per dire "ciao, s," che non è quello che voglio. Così posso fare questo. Il segno di percentuale è un segnaposto, ma ora ho bisogno di passare in stampa un secondo argomento. Ricordiamo che gli argomenti a funzioni sono separati da virgole, così la prossima virgola qui ho messo dopo la lettera s. E in questo contesto oggi, s è la variabile, e printf, alla ricezione di questi due ingressi - la stringa sulla sinistra e il nome della variabile s destra - sarà collegare il secondo nel primo per noi, e basta stampare una stringa contenente bella bella qualunque cosa sia che abbiamo digitato trovi Quindi cerchiamo di provare questo. Andando di andare avanti e lo zoom indietro, indietro alla mia finestra di terminale. Zoom in fondo qui. Digitare nuovamente fare ciao. Clang sembra essere stato eseguire nuovamente. Io vado a digitare. / Ciao, Invio. Nulla sembra accadere ancora, ma è a questo prompt che io possa scrivere qualcosa di simile a Nate, Enter, e ora abbiamo Ciao, Nate. E posso farlo di nuovo con Rob, e così via. Quindi spero che ora questo programma si comporta come intendo. Ora, non tutto ciò che facile da usare. Non ho idea di quello che è stato si aspettava da me. Quindi possiamo certamente pulire questo un po '. Torniamo qui, e invece di immersioni e chiede all'utente una stringa, lasciatemi in modo esplicito il uso quello che mi aspetto. So printf ("Inserire una stringa:" ); Quindi nessuna variabile qui. Non ci sono segni di percentuale. Proprio la semplice frase inglese. Lasciami andare a fondo ed eseguire di nuovo qui il mio programma. Ma nulla sembra essere cambiato. Perché? Devo ricompilarlo. Quindi errore facile da commettere. Ma si deve salvare non solo il file, ma ricompilare il programma. E così se ho ri-eseguire make ciao, ora corre Clang. Ora posso correre. / Ciao. E ora vedo "Inserire una stringa:". Va bene. Ora è un po 'più user-friendly. Nate, Invio, ciao, Nate. Bene, proviamo di nuovo e cominciare a pensare sui casi d'angolo. Quindi, proprio come in Scratch, si incoraggia o sono in corso incoraggiato nelle specifiche di pensare tipo di cosa potrebbe andare male se non si prevede di tutto ciò che l'utente può fare. Bugs, quindi, potrebbe derivarne. Quindi, immettere una stringa - che cosa è un caso d'angolo qui? Cos'è uno scenario che io, il programmatore, potrebbe non avere previsto? Gia '. Va bene. Che importa se digito un numero come questo? Bene. Così funziona ancora. Fa Gramatically non ha senso. Ma almeno il programma funziona. Cosa c'è di un altro caso d'angolo? Qualcosa che non mi aspettavo. Si '? Va bene. Così abbiamo potuto fare qualcosa di simile a un numero molto, molto grande. Quindi cerchiamo di farlo qui. Fammi lo zoom indietro per un secondo, fammi evidenziare. Non è possibile copiare e incollare qui. Bene. Quindi non è possibile copiare e incollare in questa finestra di terminale, quindi ci basta simulare. Vorrei diminuire, sta per avvolgere. Non ho intenzione di fare questo per troppo tempo, perché non lo farà effettivamente rompere in questo programma. Ma potrebbe. Invio. Ma non fu così. Bene. Ma è un caso vero e proprio angolo. E l'unico motivo per cui si comportava correttamente, in modo da parlare, perché il CS50 GetString funzione è in realtà progettato sotto il cofano, come vedremo tra qualche settimana, assegnare automaticamente RAM sempre più, sempre più memoria dal sistema operativo, quando si realizza, wow, hai davvero scritto in qualcosa di piuttosto lungo. Ora, questo è un po 'una bugia. Se abbiamo effettivamente messo in pausa per un bel po 'e ho digitato qualcosa come 5 miliardi di caratteri sulla tastiera qui, o davvero colpito copia-incolla di un bel po ', noi molto probabilmente potrebbe causare il crash del programma. Solo un po 'più difficile da simulare che con un numero finito quantità di tempo. Cosa c'è di un altro caso d'angolo si potrebbe provare? Si '? Gia '. Allora perché non rispondiamo nulla? Così abbiamo fatto prendere un po 'di azione, perché altrimenti il programma sta andando a stare lì tutto il giorno a lampeggiare. Ma se mi limito a premere Invio - OK, ora, sembra ancora sbagliato. Non in crash, ma forse c'è ora la possibilità di avviare l'attuazione di un programma più rigoroso che verifichi effettivamente. E se la stringa, la frase, la parola che ho digitato ha lunghezza 0, beh, forse dovrei urlare al utente, o digli o lei a inserire una stringa di nuovo, in modo che abbiamo effettivamente ottenere quello che sembra un comportamento corretto e non solo controllo completo da parte mia. Domanda sul retro? Numero decimale. Così abbiamo potuto provare anche questo. 1,10000005. Sembra che sta per funzionare realmente bene. E che in realtà ci si aspetta. Anche se si potrebbe aver digitato quel numero lì, o un più grande numero in precedenza, si rende conto che quando si sta digitando utente ingresso e stiamo usando la funzione GetString, non importa se quello che sto scrivendo si presenta come un numero. Ricordiamo che secondo ASCII, tutto sul vostro tastiera ha un valore numerico che può essere associata a una carattere, un char. Quindi, in questo caso, anche se potrei digitare un numero, il computer sta a pensarci bene, per così dire, come una stringa - qualcosa che assomiglia a un numero, ma è in realtà non è un numero. Ma che in realtà è un segue perfetta, perché ora possiamo effettivamente transizione a programmi di scrittura che utilizzare altri tipi di dati. Quindi, oltre ad utilizzare i caratteri, o meglio, oltre ad utilizzare le stringhe, conto che abbiamo altri tipi di dati in C e in altre lingue. Un char, come suggerisce il nome, è solo un singolo carattere. Un galleggiante è un valore in virgola mobile, e questo è solo una fantasia modo di dire un numero reale - qualcosa che ha un decimale punto con alcuni numeri a sinistra e / oa destra. Un int è un intero, che è solo un numero come 123. E ora più interessante sono cose come doppio. Che cosa si dice una doppia era l'ultima volta? E '64, a destra. Così, mentre in genere un galleggiante è a 32 bit - quindi è questo lungo nella memoria, si utilizza 32 zero e uno a rappresentano valori - una doppia è letteralmente il doppio di quello che significa che è possibile rappresentare numeri più grandi, o è possibile rappresentare i numeri più precisi. Così si può avere più numeri dopo la virgola, ma come ha detto il tizio nel video, anche qualcosa di semplice concettualmente come 1/3 non può essere rappresentato da un proprio computer, perché alla fine si esaurisce di bit, e quindi si può fare solo .33333333 tante volte, a questo punto non resta che dire che sono fuori della rappresentazione spazio, devo chiamare solo un giorno e rappresentarla un po 'impreciso così. E un lungo lungo - nome stupido, ma è perché c'è un tipo di dati conosciuto come un lungo in C che è guarda caso spesso 32 bit, proprio come un int è 32 bit, ma un lungo tempo è in genere 64 bit. Quindi significa che per te può rappresentare più grande numeri di questo. Bene. Quindi, se si vuole realmente iniziare a rappresentare le cose, abbiamo Potrebbe essere necessario più tipi sofisticati, e è per questo che abbiamo stringa. Così nella libreria CS50, che file chiamato cs50.h, abbiamo effettivamente dichiarato un tipo di dati, per così dire, chiamato stringa, stringa ma in realtà non esiste. Si tratta, ancora una volta, uno di questi strati che andremo a buccia indietro in una settimana o due e buttarla via, e in realtà guardare sotto il cofano a ciò che una stringa è in realtà, e come è rappresentato. Stiamo anche andando a guardare i valori booleani. Così quello che era un bool nel contesto di Scratch? E 'vero o falso. Quindi è solo un valore vero o falso, acceso o spento, 1 o 0, comunque lo si voglia vedere il mondo. Quindi in C, grazie alla libreria CS50, che a sua volta comprende un'altra libreria sotto la cappa, abbiamo l'accesso a un tipo di dati che si chiama bool, che sarà letteralmente ci permettono di assegnare i valori true o false a cose in un programma. Quindi cerchiamo di andare avanti qui e scrivere un piccolo programma che fa qualcosa di implicare un numero, invece. Quindi fammi tornare alla Appliance CS50, lasciami andare avanti e creare un nuovo file chiamato qui - diciamo solo che qualcosa di semplice, come math.c. Bene. Ed ora andate fino alla cima del mio programma, sono intenzione di fare il solito - # Include, in modo che posso usare printf, int main (void) - torneremo a, alla fine, che cosa significa int qui, che qui significa nulla, ma per il momento, è sufficiente sapere che è necessario avviare programmi di questo tipo. Ora ho intenzione di andare avanti e dire qualcosa di un po 'di diverso - printf ("Dammi un numero:" ). Poi ho intenzione di fare int n = GetInt, perché E 'venuto fuori GetInt è un'altra funzione nella libreria CS50 oltre GetString. E adesso ho intenzione di fare qualcosa di stupido, come "grazie per il% d ", per intero decimale, e poi virgola n, e poi tornare 0. Quindi, di nuovo, restituire 0 non ha nulla a che fare con il numero sono chiede all'utente. Significa solo alla fine che tutti, probabilmente, sta bene. Quindi fammi scendere nella finestra del terminale qui. Vorrei digitare rendere la matematica, entrare. E qualcosa che non va. Fare la matematica non ha funzionato. Ecco il primo dei nostri messaggi di errore. Perché? Un enigmatico, ma - Gia '. Così cs50.h. Quindi, di nuovo, soprattutto nella fase iniziale, potrai scrivere la tua prima programma per pset 1 in sezioni, in orario di ufficio, e francamente, sarà schiacciante a volte ciò che queste cose sono in realtà dicendo. Ma vi renderete conto ben presto cominciano a cadere in segmenti in cui questo significa che hai lasciato fuori uno del # include all'inizio del file. E Clang, il compilatore, vi informa di questo dicendo, piuttosto fantasiosamente, dichiarazione implicita di GetInt funzione non è valida. Bene. Che cosa vuol dire? Significa solo che hai dichiarato in modo implicito in GetInt senso che non si è esplicitamente dichiarato. Per dichiarare esplicitamente int, si deve insegnare Clang che esiste. E la soluzione molto semplice che è quello di insegnare dal tra cui questo altro file, cs50.h, a la parte superiore del file. Perché letteralmente, ciò che fa è # include racconta Clang più o meno di andare a cercare il file denominato cs50.h, copia, incollarlo automaticamente nella parte superiore del mio programma per me, e poi convertire il codice sorgente di zero e uno. Ma questo sarebbe ovviamente molto noioso se noi umani ha avuto andare copiare e incollare questi file di grandi dimensioni per tutto il tempo, così # include fa proprio tutto ciò che automaticamente senza infangando il mio codice con qualcun altro biblioteca. E una libreria è solo un altro file che contiene funzioni e altre cose che qualcun altro ha scritto, che siamo leva per il nostro bene. Bene. Proviamo di nuovo. Fare matematica. Invio. Buona. In modo che sembra aver funzionato. Quindi lasciate che ora eseguire la matematica,. / Matematica. Inserisci mi dà un numero, 123. Grazie per la 123. Ora proviamo un altro caso d'angolo. Una stringa è piuttosto generosa, perché un stringa può essere qualsiasi cosa. Può sembrare numeri, simile a personaggi, guarda come le parole. Ma un int è un int. Così ora se io sono l'utente difficile, e sta dicendo: "Dammi un numero, "cosa succede se cerco di fare qualcosa di simile a 0,1? Beh, e 'un numero, ed è coerente con la grammatica che ho usato qui, ma sotto il cofano, io sono di Naturalmente usando la funzione GetInt. Quindi cerchiamo di vedere cosa succede. Invio, riprovare. Bene. Permettetemi di essere difficile e basta premere di nuovo Invio. Enter, Invio. Così ora sembra che GetInt è un po 'più potente di GetString. Noi, il personale, attuata in modo tale che se notiamo non ci hanno dato un int - e un int è un numero decimale zeri, quelli contenenti, due, tre, quattro, cinque, sei, sette, otto, o nove. E questo è tutto. Nessun punto decimale, senza caratteri, senza segni di punteggiatura. Sembra che dobbiamo collaborare. Quindi, mi permetta di provare quattro, cinque, sei, e che mi passa attraverso. Quindi, veramente, di essere anale qui, forse dovrei dire "Dammi un intero "per trasmettere all'utente esattamente quello che intendo. Ora pensiamo sotto la cappa. Non stiamo andando a guardare il modo in cui è implementato cs50.h oggi, quella libreria. Ma se si continua a dire riprovare, riprovare, riprovare, cosa di programmazione costruire sto usando presumibilmente sotto la cappa di attuare tale? Quindi, solo un ciclo, giusto? Una delle idee più semplici che abbiamo visto su Scratch. The Forever costruire, la ripetizione costruire. Presumibilmente, in questo programma, sotto la cappa, anche anche se è scritto in C e non zero, che sta facendo qualcosa chiamato equivalente per sempre se l'utente non ha digitato un numero intero, ad esempio riprovare, riprovare, riprovare, riprovare, così poi finalmente, quando otteniamo un numero intero, allora si uscire di quel ciclo. Quindi, quali altri funzioni che usiamo qui in biblioteca CS50 è? Ebbene, specie di quelli ovvi, almeno sulla base del tipi di dati che noi sappiamo esistere. Abbiamo implementato GetString, GetInt, ma in tutto il prime settimane del termine, è anche possibile utilizzare getFloat e GetDouble e GetLongLong per ottenere con precisione il i tipi di dati che si desidera. Poiché il dettaglio chiave qui è che a differenza di alcune lingue, come Python e Ruby, in cui non si devono necessariamente dichiarare il tipo di dati di una variabile - non è per dire al computer che tipo di roba si sta andando a mettere nella variabile - in C, devi essere sempre così precisi. Quindi, se volete una variabile chiamata n, un pezzo di memoria che in questo caso risulta essere di 32 bit per convenzione, si dire al computer che questi bit sono andando a memorizzare un numero - Non un personaggio, non una stringa, non un float. E questo risolve il problema che effettivamente incontrato la settimana scorsa. Se stiamo usando gli zeri e numeri di quelli di rappresentare non solo numeri, ma come e B e C, come nel mondo è un computer di andare a sapere che questo modello di bit effettivamente rappresenta il numero 65, al contrario di rappresentare la lettera A, che per coincidenza, secondo ASCII, ricordiamo, era equivalente a 65? Quindi questi tipi di dati forniscono un contesto al computer, in modo da che sa se questi bit deve essere interpretato come un int o come una stringa. Tutte le domande, quindi, su questo? Si '? DAVID J. MALAN: Bella domanda. Se prendiamo in stdio.h, salviamo il file - lasciami andare verso la finestra del terminale ed eseguire rendere la matematica, zoom ed entrare - ora ho un errore diverso, perché sono implicitamente dichiarando quale funzione ora? Printf. Così ora ho creato un nuovo problema, la cui soluzione è essenzialmente la stessa. Ho bisogno di mettere quella posteriore. PUBBLICO: [incomprensibile] DAVID J. MALAN: Oh. Quindi, se prendo fuori - Ok, si '. Quindi, se tolgo l'inclusione standard di I / O biblioteca up qui, e poi stai dicendo che se mi libero di printf, ottenere liberarsi di printf? Sì. Questo dovrebbe funzionare, perché non sono più con qualsiasi - whoops. Ho solo prendere il sole? Oh, va bene. Questo non funziona a causa di un nuovo errore che abbiamo appena introdotto. E questo è un po 'più evidente. Qual è il problema? Inutilizzati variabile n. Quindi questo errore è il risultato del nostro configurato il apparecchio particolarmente pedante, a gridare veramente a per ogni errore possibile, anche se è una specie di un non-fatale errore come questo - è davvero un grande affrontare che ha stanziato un int, mettere un numero in esso, e poi solo non ha fatto nulla con esso? Quindi funzionalmente, no. Questo non sta andando a rompere il programma. E 'solo un po' stupido, no? Non vi è alcun valore per aver chiesto per quel numero, memorizzato in una variabile, se non hai mai intenzione di fare nulla con esso, se stampare o salvare. Quindi, in questo caso, Clang è riconoscere tanto, e sta dicendo non utilizzati variabile n. Così siamo in grado di risolvere questo problema, se si vuole veramente. Ma ancora una volta, questa non è una buona programmazione ora. Così ho potuto fare questo - scendere qui, vorrei cancellare lo schermo, rendere la matematica. Che funziona. Ora posso eseguire il mio programma di matematica, riceve l'input - bene, che è stato male. Riceve l'input, e questo è tutto ciò che fa, in questo caso. Quindi, in realtà, proviamo un altro caso d'angolo che abbiamo non pensare prima. In questo caso - qui, torniamo a quello che è un po 'più user-friendly. Torniamo qui e correre di nuovo rendere la matematica. Ops, che cosa ho fatto di sbagliato? Devo ripristinare ulteriormente. Va bene. Ora siamo di nuovo in stato originale, in cui tutti si spera bene. E ora se corro la matematica, 123 sembra funzionare. Ma questo non è davvero una prova efficace, per dire basta va bene, che funziona. 789, che funziona. Tempo di presentare. Perche 'c'e' casi particolari altri qui. Una stringa in realtà non ci danno molti problemi digitando in un bel po 'di personaggi. Ma cosa succede se scrivo in questo? Colpire il numero 1 un bel po ', molto di qui - va bene, si sta facendo un po 'noioso, quindi ho intenzione di si fermano qui, e ho intenzione di premere Invio. Che diavolo e 'successo? Quindi questo può effettivamente essere spiegato. Così ha fatto la prenda binario? Un buon pensiero, ma no, non è il fatto che ci sono voluti in formato binario, perché in effetti, che era solo una specie di coincidenza. Siamo in grado di farlo di nuovo. Quindi non c'è 2 nel sistema binario, che è probabilmente sufficiente comunque. Invio. In modo che non era il problema. Che altro? Esattamente. Così ripenso a quello che è in realtà un int. Si tratta di 32 bit che collettivamente vengono interpretati come numero. Se si dispone di 32 bit, questo significa che ciascuno dei bit può essere uno 0 o un 1., 0 o 1 Questo significa che ci sono due possibilità per questo bit, due possibilità per questo, due possibilità per questo po '- in modo che sia 2 volte 2 volte - così che è 2 potenza 32 è il numero totale di permutazioni di zero e uno, se si hanno 32 segnaposto, zeri o quelli, di fronte a voi. Quindi, se ho 2 al 32, matematicamente, che cosa? Quindi è molto. Sono le 4 miliardi di euro, prendere o lasciare. E 4 miliardi non sembra essere ciò che è stato stampato qui. In realtà, questo sembra più vicino a 2 miliardi. Ma questa non è una coincidenza. Il fatto che il computer ha mal interpretato il mio numero enorme, la mia sequenza enorme di quelli e poi la mia sequenza enorme di due a due, a circa 2 miliardi di euro, è spiegato in che modo? C'è un limite al int. C'è un certamente un valore massimo che è possibile rappresentare. Ma di solito è 4 miliardi, giusto? Se 2 a 32 è di circa 4 miliardi di euro, che sembra che è il più grande numero. Quindi non un resto, ma un buon pensiero. I numeri negativi. Quindi, se avete 4000000000 cose possibili che potete rappresentare con queste varie permutazioni di 32 0 e 1s, beh, è ​​ovvio che noi umani potrebbe desiderare di rappresentano non solo i numeri interi positivi ma interi negativi. E in effetti, questa è l'ipotesi che C fa. Quindi, con 32 bit, è possibile rappresentare circa il negativo 2 miliardi di tutta la strada fino a positivo 2 miliardi. E così in questo caso, quello che stiamo vedendo in realtà è solo ai margini della capacità del nostro intero, e abbiamo, quindi di parlare, traboccava un numero intero. Abbiamo cercato di stipare più bit in esso che si adatti. Così il risultato finale è che hanno essenzialmente tutti i 1 bit. Abbiamo girato tutti i nostri pezzi in poi, abbiamo cercato di rappresentare il maggior numero possibile, ma non è chiaro quasi abbastanza grande per rappresentare le due cose che ho appena scritto trovi Si '? PUBBLICO: [incomprensibile] DAVID J. MALAN: Bella domanda. Perché non possiamo solo rappresentare che negativo firmare solo come un personaggio? Così abbiamo assolutamente possibile, e si potrebbe quindi salvare un bit supplementare. Ma si sta ancora andando ad avere per rappresentare il trattino e che sta andando a costare almeno qualcosa, presumibilmente un po '. Quindi sì, potremmo avere 32 bit utilizzati per il nostro numero, ma ora abbiamo bisogno di un altro po 'usata per il nostro cruscotto simbolo, il segno meno. Così ora abbiamo 33 valori di bit, che potremmo fare, ma è non è solo il modo in cui è fatto. Abbiamo fatto una sentenza anni fa chiamata, 32 bit è una sorta di unità di misura qui. Così abbiamo intenzione di utilizzare uno di questi bit efficacemente rappresentano negatività, e 31 bit per rappresentare il numero. Altre domande? Bene. Questo è un sacco. Perché non andare avanti e prendere la nostra pausa di cinque minuti qui? Bene. Quindi, di nuovo, di non sopravvalutare le applicazioni matematiche della programmazione, facciamo solo strappate questo un esempio prima di entrare in altri costrutti, proprio perché illustrerà alcuni punti comuni inciampo su alcuni dei le nozioni di base quando si tratta di programmi di scrittura. In questo caso, facendo espressioni aritmetiche che hanno qualche rilevanza interessante alla sintassi. Quindi questo è solo una formula con la quale siamo in grado di convertire temperature da Fahrenheit a Celsius. Se non mi ricordo, questo è solo la formula. Quindi, se si collega in Fahrenheit valore di 32 gradi, che è congelamento, che sta per essere 32 meno 32 è 0, e, infatti, 0 in Celsius è anche il congelamento. Così la sanità mentale rapido controllo c'è - questa è la formula familiare. Lasciami andare verso l'apparecchio, però, e iniziare a la scrittura di un programma chiamato, come, f2c, "Fahrenheit a Celsius punto c ". E in cima qui, ho intenzione iniziare con # include stdio.h, e ho intenzione di fare int main (void), e ancora una volta, torneremo in futuro su ciò che significa int ci sono e che nulla significa che c'è. E ora lasciami andare avanti e realizzare un programma che essenzialmente fa questa conversione per noi. Così printf, diciamo, temperatura in gradi Fahrenheit. E poi mi lasci andare avanti e ottenere il valore da parte dell'utente. Che tipo di valore devo ottenere da parte dell'utente, se voglio loro di darmi una temperatura in gradi Fahrenheit? Si '? Che cosa proponete? Gia '. Così galleggiante sembra abbastanza ragionevole. Abbiamo, ancora una volta, solo alcune opzioni che che abbiamo visto finora. Abbiamo cose come char, double, float, int, long long, bool, string. Quindi di questi, galleggiante si sente abbastanza ragionevole. Potremmo usare una doppia, a destra, perché se vogliamo davvero rappresentano la temperatura di un umano - 98,60000 - potremmo usare 64 bit per farlo, ma ci si sente come eccessivo per la temperatura. Così facciamo solo andare con galleggiante. Ora ho bisogno di una variabile. Giusto per semplificare le cose, ho intenzione di chiamare f, ma potrebbe semplicemente come giustamente chiamano temperatura, ma è o bene. Così float f = getFloat. Appena ho ora hanno deciso di utilizzare getFloat, però, mi bisogno di fare una rettifica. Gia '. Quindi abbiamo bisogno di includere # , altrimenti il ​​compilatore è andando a urlare contro di noi. Ora che ho un galleggiante, lasciami andare avanti e fare il conversione. Quindi, prima, mi permetto anche di prendere l'abitudine qui di commentando il mio codice. Quindi, di nuovo, un commento è solo una notazione per l'umano che è non parte del programma per sé, ma uno, aiuta capire quello che hai fatto la mattina dopo, o la prossima mese, aiuta il vostro compagno di insegnamento capire quello che hai fatto o quello che si intende fare, quindi è prassi generalmente molto buono. Ogni poche righe di codice, scrivere un commento a te o del tuo collega. Così qui, ho intenzione di dire: "Chiedi a utente per la temperatura." Non deve essere una frase completa, solo una breve frase. Ma l'idea che sta dietro commentando in C è che ognuno di vostra commenti si dovrebbe potenziare - o, diciamo, un TF o un collega - di scremare il programma e sapere esattamente ciò che fa, non tanto la lettura del codice, ma leggendo i commenti, che dovrebbe essere succinta e chiara. Va bene, quindi ora lasciami andare avanti e dire: "Spese Fahrenheit a Celsius. "Così ho intenzione di andare avanti e fare, diciamo, float c. Terremo Celsius come un valore in virgola mobile. E mi permetta di prendere una pugnalata a questo. La formula è, di nuovo, qui. Come 5 / F 9 volte meno 32. Allora, facciamo questo. Quindi 5 diviso 9, meno - oops, ho già incasinato. Times. Quindi 5/9 volte F meno 32. Quindi F meno 32, punto e virgola. Ed ora, qui, ho intenzione di andare avanti e dire, stampare risultato. E questa parte è facile. Printf. Come posso fare per stampare questa? Beh, potrei dire "Questo numero in gradi Celsius è% f \ n", solo per alcune estetica. E poi che valore voglio inserire qui come di printf secondo argomento? Va bene. Quindi c. Quindi dovremo iniziare con questo e poi basta restituire 0. Anche in questo caso, non ha nulla a che fare con la matematica. Significa solo che tutto va bene. Ora, questo è corretto, questo programma? Bene. Così ho fatto degli errori. Anche se non avete idea di cosa sia la programmazione, è possibile ordinare di back inferire a quello che la scuola elementare errori qui potrebbe essere. Che uno dei primi? PUBBLICO: [incomprensibile] DAVID J. MALAN: Già. Quindi ci manca parentesi. E 'stato deliberato che ho fatto parentesi nel keynote scorrere qui, perché c'è in realtà questa nozione di ordine delle operazioni, o di precedenza, in base al quale alcune operazioni - moltiplicazione - hanno una maggiore vincolante, hanno la precedenza, che le cose come addizione o sottrazione. Così abbiamo fatto questo per anni solo per chiarire esattamente quale operazione matematica dovrebbe essere fatto prima. Quindi dovrei probabilmente imitare esattamente questo. In caso contrario, il computer è probabilmente intenzione di provare a fare qualcosa di simile a dividere 5 di 9, quindi moltiplicare F, quindi sottrarre 32 dal tutto. Il che non è, infatti, quello che vogliamo fare. Quindi cerchiamo di parentesi. Lasciatemi aggiungere le mie parentesi qui, parentesi qui. Mettiamo questo qui. Ecco, ho appena notato un altro errore che ho fatto lungo la strada. Si '? PUBBLICO: [incomprensibile] DAVID J. MALAN: Ah. Buona. Quindi, in realtà hanno la stesso numero intero problema di prima divisione. Io che correggere, vediamo cosa è il sintomo. Ma stiamo andando ad avere per correggere un altro errore qui. Si '? PUBBLICO: [incomprensibile] DAVID J. MALAN: sì. Quindi, stupido errore che ho fatto, ma incredibilmente importante. Il computer non ha intenzione di girare solo un occhio e lasciare usarmi F maiuscola, quando ho dichiarato la variabile come una f minuscola qui, in linea 8. Quindi ho bisogno di correggere in linea 11 mio di capitalizzazione, che un Poco fa è stato un F maiuscola per errore. Che dire qui? Se questo dovesse essere in minuscolo, come bene? Dovrebbe essere, ma questa è una coincidenza. Che f% non ha nulla a che fare con la variabile. Quindi, solo per essere super chiaro qui, lasciami andare avanti e rinominare questo, brevemente "la temperatura." Vorrei rinominare questa "temperatura". Che io non rinominare questo. Perché, ancora una volta, f% significa a livello globale, "valore in virgola mobile." Non ha nulla a che fare con la mia variabile. Ma "temperatura" in tutto il posto è un po 'prolisso, così ho intenzione di tornare al mio minuscolo s "f". Ora, lasciatemi andare avanti fino alla mia finestra qui. Fai f2c - che è stato, ancora una volta, il nome arbitrario che ha dato a questo file. Sembra aver compilato. Vorrei correre f2c. Invio. Temperatura in gradi Fahrenheit - facciamo facile. 32. OK, correggere. Ma, se io ora fare 212 per ebollizione - maledetto. Bene. Quindi, chiaramente non correggere, se il TF prova almeno due valori. Allora qual è il problema? Beh, è ​​già messo il dito su ciò che il problema è. Ma perché è così? Fino qui, quando sto facendo i conti su 5 diviso 9. Quindi concettualmente, che è perfettamente corretto. Totalmente in linea con la formula. Ma i computer solo fare esattamente quello che dire loro di fare. E quello che sta effettivamente dire al computer: ecco dividere il numero intero 5 dal numero intero 9 e mi danno il risultato. Il problema è, però, quando si fa la divisione utilizzando i dati tipi, l'uscita è lo stesso tipo di dati come ingressi. E così se i due ingressi sono entrambi interi, l'uscita va per essere un int. E così 5 diviso 9 è qualcosa di punto. Ma qual è il numero intero più vicino al punto qualcosa? Quindi, in realtà è 0. Così come abbiamo discusso il Lunedi, tutto dopo la virgola punto viene troncato. E 'appena si butta via. Quindi questo è un errore completo, perché potrei anche semplicemente moltiplicare tutto da 0 qui. Ora, posso risolvere questo problema in un paio di modi. Potrei farlo. 5,0 diviso per 9,0. Tecnicamente, non ho nemmeno bisogno di farlo. Si è sufficiente per fare solo uno dei numeri di un galleggiante - o doppio - mettendo il punto decimale qui. Perché quello che succede ora è quando si divide un numero intero di un galleggiante, o un doppio, il computer sta per realizzare oh, uno di quelli è più precisa. Vorrei peccare per eccesso di dare una più precisione rispetto desiderato. Così sarà convertire il risultato - verrà restituito il risultato come valore in virgola mobile come bene. In modo che avrebbe funzionato. Questo potrebbe funzionare. E c'è un altro meccanismo che vedremo in Più in dettaglio la prossima settimana. Si può effettivamente, come il programmatore, dire al computer per il trattamento in realtà un tipo di dati se si trattasse di un altro. Così ho potuto effettivamente fare questo. Tra parentesi, posso dire una cosa del genere (float), aperto parentesi, parentesi vicino. E questo è ciò che si chiama "fusione". Di nuovo, più su questo la prossima settimana. Ma questo è solo il modo di raccontare programmatico il computer, si 'lo so 9 è un numero intero o un lungo. Io so che non è un valore in virgola mobile. Ma trattare come tale in ogni caso. Quindi, per lanciare un tipo di dati significa convertire da uno all'altro. Francamente, questo è solo un po 'brutta, quindi mi propongo di andare tornare alla proposta originale di una semplice conversione queste cose a valori in virgola mobile manualmente. Perché ora è solo super chiaro cosa sta succedendo, e non è tutto ciò che distrae. Quindi cerchiamo di ora tornare nella mia finestra di terminale. Fai f2c. Lasciami andare avanti ed eseguire questo. E, per inciso, ci si annoia a digitare i seguenti comandi più e più volte, rendersi conto che i computer, come Linux qui, tendono ad essere piuttosto intelligente. E se mi ha colpito in alto, siamo in grado di passare attraverso la mia intera storia della comandi, su e giù. Quindi, in questo caso qui, posso solo andare fino a eseguire make f2c. Sto essere sgridato, perché ho appena fatto un secondo fa. E 'già aggiornata. Così ora posso correre f2c nuovo. Proviamo 32 Fahrenheit. Ora proviamo 212 Fahrenheit. Uff. Sembra funzionare. Ora, questo è buono, ma ci si sente un po 'arbitrario che Sto mostrando sei numeri dopo il punto decimale. Giusto? Se sei la persona meteo in TV, sei una specie di doofus se stai leggendo la temperatura questo grado di precisione. Quindi cerchiamo di semplificare questo. Quindi cerchiamo di andare in realtà qui, al mio printf. E sì, io voglio stare a galla. Ma voglio specificare ora la precisione. E ho intenzione di essere un po 'succinta. Sto per dire, dammi un punto dopo il punto decimale. Quindi, piuttosto che dire% f, ho intenzione di dire% .1 f. E questo significa solo darmi una posizione dopo la virgola. Bene. Proviamo di nuovo. Vorrei eseguire nuovamente dopo la compilazione. E ora mi digitare 32, e torno a valore più succinta. E posso digitare, ora, 212, e ricevere una più sintetica valore pure. E ci sono altre cose che puoi fare con printf. Si può effettivamente specificare la larghezza del numero dovrebbe essere. Se si desidera avere imbottitura su di esso, in modo da poter allineare a destra o left-align tutti i numeri o cercare di cose centro. Quindi conto che ci sono piccoli trucchi che si possono fare lì. Ma hanno appena riducono a codici di formato, come abbiamo lì. Quindi, in termini di questa questione di precedenza. Questa è una tabella molto noioso passare attraverso metodicamente. Ma si rendono conto che gli autori di C hanno creato il regole che specificano quale gli operatori hanno una maggiore precedenza, il potere più vincolante, di altri. Così, mentre nella scuola elementare, in genere sapeva che era moltiplicazione e divisione, quindi addizione e sottrazione, poi un po 'di altre cose. In un mondo di programmazione, c'è una molto lungo elenco di cose. E questo non è qualcosa che vale la pena memorizzare ora. Ti abituarsi ad esso in breve tempo. Ma proprio come in grado di scuola, parentesi generalmente risolvere le questioni di precedenza, rendendo chiaro super per la computer e umana sia quello destinato. Quindi, considerare questo solo un piccolo foglio trucco c'è. Ma la maggior parte di quei dettagli che non si arriva a per qualche tempo. Bene. Ora, cerchiamo di costruire e allontanarsi da questi poco stupido esempi matematici. Usano ancora i fondamenti stessi, ma si inizia esprimerci un po 'più simile a Scratch. Quindi, in Scratch, abbiamo avuto queste espressioni booleane. E in inglese, una espressione booleana è che cosa? Vero o falso. E 'qualcosa che restituisce true o false. 1 o 0. Acceso o spento. Qualunque cosa si voglia chiamare. Ora in Scratch, i pezzi del puzzle si presentava così. E questa è la combinazione, sul fondo lì, di tre puzzle di pezzi. Una congiunzione - qualcosa che è vuoto e vuoto. E poi due espressioni booleane all'interno di esso. Così si può annidare le espressioni booleane per ottenere più complicato espressioni booleane. Per esempio, se si tratta di Sabato, ed è bello tempo, quindi uscire. O qualcosa del genere arbitrario. Così si può unire espressioni booleane per trovare una valore di verità più grande, la cui risposta si basa su quelli più piccoli. Ora, in C, per fortuna, questa mappatura è in realtà piuttosto semplice. Parentesi contribuire a rendere le cose chiaro qui. && È ciò che significa "e". Ecco, questo è il modo stiamo andando a convertire i blocchi da zero a C. E per le condizioni che abbiamo visto in Scratch, sulla mano sinistra parte c'è, posso impilare in modo simile in C. Se x è minore di y, poi fare questo. Altrimenti se x è maggiore di y, poi fare questo. Altrimenti logicamente devono essere uguali, così dicono che sono uguali. Così possiamo ora iniziare a costruire queste cose. Allora, facciamo un esempio. Permettetemi di aprire un file che è sul sito web del corso che Ho scritto in anticipo. Questo si chiama nonswitch.c. E vedremo perché in un attimo. Quindi, in questo file - nonswitch.c-- prima rendersi conto che ci sono un sacco di commenti in cima. Questo è solo spiegando il nome del file, cosa fa, e così via. E dimostra quanto pare l'utilizzo di Boolean AND-ing - congiungere due espressioni. Vediamo quindi come funziona questo programma. Io sono i miei due file, cs50.h e stdio.h. Se scorrere verso il basso, ora, per il programma, è un po 'più a lungo di quanto abbiamo scritto prima, ma abbastanza leggibile. Così ho stampato per l'utente, sulla linea 18, "Dammi un numero intero compreso tra 1 e 10." Così che è proprio lì. Ora ho il numero intero. Ma si rendono conto che GetInt - piuttosto semplice. E 'solo andando ottenere un int. E 'intenzione di garantire che lo fa arrivare un int e non un stringa o un galleggiante. Ma non ha intenzione di fare qualsiasi tipo di controllo di confine. Non sta andando a filtrare i numeri per essere tra un certo range. Quindi dobbiamo realizzare che noi stessi. Quindi, proprio come in Scratch, dove ho potuto fare una congiunzione di due espressioni, posso farlo in C come segue. Se n è maggiore o uguale a 1, e n è minore e o uguale a 3, sto per molto arbitrariamente decreto che numero sia un numero piccolo. Solo per il gusto di una dichiarazione. Altrimenti, se n è compreso tra 4 e 6, print "Hai scelto un mezzo numero. "Altrimenti, se n è compreso tra 7 e 10, print" Hai scelto un gran numero. "else print" Si sceglie un numero non valido. " Perché logicamente, che segue, se abbiamo esaurito la nostra gamma. Quindi rendo conto che questo non è proprio il modo in cui scrivere o superiore pari ad una classe di matematica. Giusto? Di solito lo rappresentiamo così, con la linea di sotto di essa. Ma non c'è una chiave del genere sulla mia tastiera. Così il simbolo in C per esprimere maggiore o è pari a due caratteri, e il simbolo per meno di o è uguale a due caratteri pure. Bene. Quindi, se ho eseguito questo programma, si può intuire che cosa è intenzione di fare. Se vado avanti e fare nonswitch, Invio. E quindi eseguire nonswitch. Dammi un numero compreso tra 1 e 10. Ho intenzione di dare 11. Ho scelto un numero non valido. Fammi provare il numero 3. Ho scelto un piccolo numero. Quindi abbastanza semplice lì. Che cosa devo fare per modificare il comportamento di questo programma e fare qualcosa di un po 'diverso, invece? Lasciatemi andare avanti e dire questo. Vorrei sbarazzarsi di tutto questo. E lasciatemi dire if (n == 42). E poi ho intenzione di andare avanti e dire: print "Hai scelto la risposta giusta. "Altrimenti andremo a andare avanti e dire: printf ("Hai scelto la risposta errata "). Okay. Solo perché. Ora, alcuni punti che possiamo fare qui. Uno, non ho digitare il simbolo che si potrebbe pensare è il più ragionevole. Quando ho voglia di controllare l'uguaglianza, scopre che non si utilizza il segno di uguale. È invece utilizzare il segno di uguale uguale. E perché potrebbe essere che, solo intuitivamente? Gia '. PUBBLICO: [incomprensibile] DAVID J. MALAN: Corretto. Il segno di uguale è già utilizzato per l'assegnazione. Qualcuno non ha davvero riflettere. E così ora, quando si tratta di test di uguaglianza, dobbiamo essere più espliciti, e dire uguale uguale. Un errore molto comune è quello di fare questo. E, se in orario di ufficio o settimane a volte prossimo o nel prossime due settimane si fa una cosa del genere e poi lotta con esso per 10, 20 minuti cercando di capire ciò che il bug è maledetto, si rende conto che tu sei uno di quelli persone che hanno fatto questo errore. Quindi, super facile da fare. Ma l'obiettivo è ora quello di scongiurare questo errore. Ciò potrebbe valutare, perché ciò che è davvero dicendo? Se n diventa 42. Così il popolo verbo usare, verbalmente, per esprimere la nozione di assegnazione è "si". Quindi, se n diventa 42. Quindi questo significa assegnare 42 a n. Ora ho un'espressione booleana tra parentesi, all'interno di tale condizione, il cui valore è 42. Giusto? Perché se lo si valuta dall'interno verso l'esterno, il totale risposta, ora, è 42. Quindi, se ho fatto la domanda, "se (42)," ciò che è che davvero dicendo? Beh, espressioni booleane può essere solo vero o falso. 1 o 0. Acceso o spento. Così ci sembra di avere un caso d'angolo qui, per cui tutto ad un improvvisa, sto dicendo "se (42)". Questo non è un valore booleano. Quindi, ciò che i computer fanno, però, è sostanzialmente equipara tutto ciò che non è 0 viene interpretato per essere vero. 1. On. Sono tutti funzionalmente equivalente. Solo il valore 0, o la parola chiave falsa, come faremo finalmente vedere, è in realtà falso. Quindi "se (42)" sarebbe effettivamente vero, perché è non-zero. Quindi, per essere più precisi qui, un valore booleano è veramente così molto vero o falso, ma per questo caso, se è 0 o non-zero. Quindi, false o non false. E che ci permette di comprendere ancora più possibilità nel l'espressione tra parentesi. Quindi abbiamo bisogno di, sempre con tanta cura, dire questo - if (n == 42). Semplicemente perché abbiamo bisogno di specificare un test di uguaglianza, Non un'assegnazione di un valore. Che altro la pena di notare qui? Le parentesi graffe non sono effettivamente necessarie. Li ho fatto solo per essere nit-schizzinosi qui. Ma quando si ha una condizione che ha una sola linea di codice, come vantaggio, i programmatori non hanno bisogno di usare le parentesi graffe. Basta solo trattino, per ragioni estetiche, e quindi scrivere la riga di codice. Solo quando si vuole scrivere due righe di codice - per esempio, else printf ("Ciao!"). Se si vuole fare che, questo è rotto. È possibile far rientrare tutto quello che volete, ma il fatto che si ha scritto due righe di codice senza usare le parentesi graffe significa che questo programma non eseguite correttamente o potrebbe nemmeno compila correttamente. Quindi, per ora, a dire il vero, credo che la migliore abitudine è solo utilizzare le parentesi graffe, e troverete che fanno super chiaro quello che sta succedendo. Inoltre, per inciso - soprattutto se siete tra coloro che fanno uso di i libri consigliati o le risorse on-line - si rendono conto che c'è questa nozione di stile in programmazione. E alcune persone preferiscono mettere le parentesi graffa qui su una linea. Alcune persone preferiscono fare cose ridicole, come metterle qui. Non c'è una risposta sbagliata quando si tratta di stile, ma questo è sbagliato. Ma alcune persone lo fanno. [Risate] DAVID J. MALAN: Così Lo dico ora, semplicemente perché, come si leggere su cose in libri o on-line, si sta andando ad ottenere messaggi diversi da diversi insegnanti e diversi autori. E proprio conto che, funzionalmente, sono generalmente equivalente, ma essere coerenti. Quindi, in questo caso, ci standardizzare il riccio bretelle in fila qui a sinistra. Bene. Quindi cerchiamo di andare avanti e ora eseguire questo, e vedere cosa succede con questo programma. Fai nonswitch. Quindi eseguire nonswitch. Dammi un intero compreso tra 0 e - in modo che non è rilevante più, ma io sono solo per dire arbitrariamente 42. E ho scelto la risposta giusta. Bene, ora, andiamo a prendere questo in realtà in una direzione diversa. Sembra che vi sia qualche altra sintassi abbiamo può utilizzare in un programma. Ecco un nuovo pezzo di sintassi che è funzionalmente lo stesso, ma solo introduce un altro modo di esprimere se stessi. Quindi questo è quello che è chiamato "switch". E un istruzione switch funziona come segue. Ci vuole, tra parentesi, un valore che si desidera "Switch" a. Si desidera comportarsi in modo diverso in base al suo valore. Quindi questo significa interruttore sul valore di n. E che cosa significa? Beh, se n è 1 o 2 o 3, andare avanti e stampare "Tu raccolse un gran numero "e poi rompersi. La ragione per la rottura è che il modo C funziona come appena si trova un caso che corrisponde, si avvia l'esecuzione tutto il codice sottostante. Quindi, se ho una riga di codice, come faccio io qui sulla linea 27, si viene eseguito. Se posso aggiungere un'altra linea qui, viene eseguito. Un'altra linea qui, viene eseguito. Il programma si arresta solo l'esecuzione di ciò che è al di sotto del istruzione case applicabile quando ho esplicitamente dire "rompere". Così non va. Destra, in questo caso, come risultato. Caso 4 o 5 o 6, analogamente, sta per stampare un messaggio. In questo caso, il numero medio. Interruzione. Caso 7, 8, 9, 10, sta andando a stampare "Hai scelto un grande numero. "Break. E poi c'è letteralmente una parola chiave chiamato "default" che è efficace come il "else" costruire. Quindi nuova sintassi, ma intellettualmente, niente qui di nuovo. E 'proprio come il Gratta e Vinci. Se, altrimenti se, else if, una sorta di blocco. Ecco, questo è la versione attiva di questo programma. Ma nota che abbiamo fatto con i numeri qui. Permettetemi di aprire una seconda versione, solo per mostrare qualcosa di un po 'più concreto. Quindi qui abbiamo invece gradi. Si scopre che è possibile utilizzare opzioni non solo su numeri interi, ma su caratteri. Non in tutti i tipi di dati, ma almeno su caratteri. Ecco, si potrebbe fare qualcosa di simile se il valore di C che l'utente ha digitato, nella riga 19, utilizzando la funzione GetChar, è maiuscola o minuscola a, diciamo la interpretano come un grado, e dire hanno scelto un grado eccellente. E giù lungo l'istruzione switch, abbiamo altre casi di "B" s e "C" s, e così via. Ma ora completare un'altra cosa. E ancora, un po 'volando attraverso alcuni di questi esempi. Ma è davvero così che possiamo applicare, ora - o in realtà, basta tradurre ora - a C. Permettetemi quindi di andare avanti e farlo. Sto per aprire un nuovo file. E ho intenzione di fare include . E poi ho intenzione di fare int main (void). Vorrei salvare il file come un loop.c. Proprio come un esempio. E ho intenzione di andare avanti e procedere nel modo seguente. Voglio scrivere un programma molto noioso. Così 10. Facciamolo. 9. Bene. Non appena si inizia a fare questo in programmazione, si è probabilmente facendo qualcosa di sbagliato. Ma inizieremo comunque. Oops. Questo è effettivamente sbagliato. 7. 6. 5. 4. Nulla succederà quando arriveremo a 0. 3. 2. 1. Va bene. 0. Elimina. Bene. Quindi restituire 0. Quindi questo programma è ovviamente intenzione di fare ciò che molto dice noiosamente sta andando a fare. E 'intenzione di stampare tutti coloro valori, dall'alto verso il basso. Quindi lasciate che fanno fare loop. E poi - whoops. Fai loop. Ero nella directory sbagliata. E adesso lasciatemi correre loop. Invio. Woohoo. Very nice. Nizza, programma lungo. Va bene, ma adesso cerchiamo di farlo meglio. Proprio come in Scratch, quando hai iniziato con un ciclo costruire, invece di copiare e incollare tutto il pezzi del puzzle, mi permetta di introdurre questa cosa. Quindi, in C, ci sono vari costrutti di loop, uno dei quali assomiglia a questo. Un ciclo "for" ha tre cose, separati da due punti e virgola. E poi, all'interno del corpo del ciclo, per così dire - l' all'interno roba delle parentesi graffe - siamo in grado di fare qualcosa di nuovo e di nuovo. Quindi quello che ho qui sullo schermo, si tratta di letteralmente un commento. Il / / qui significa arriva un commento. Questo non è il codice. Questo è solo descrizione in inglese, per me, l'umano. Inizializzazioni Quindi, le condizioni, e gli aggiornamenti. Bene, vediamo come funziona. Questo mi permette di riscrivere il programma come segue. Per - Così ecco che arriva mio ciclo - INT - ecco che arriva una variabile chiamata "i" - viene inizializzato a 10. Quindi c'è la mia inizializzazione. Io voglio fare questo ciclo fino a quando "i" è maggiore o uguale a 0. E su ogni iterazione di questo ciclo, voglio fare i -. Così abbiamo visto + + il Lunedi. - È l'opposto. E diminuisce il valore di 1. All'interno di questo ciclo, voglio fare effettivamente qualcosa. Quindi ho intenzione di dire qualcosa di simile a printf. Non voglio che a dire il 10 adesso, perché questo è ovviamente solo intenzione di stampare lo stesso valore. Che cosa desidera stampare, invece, probabilmente? Gia '. Così "i". Così% d, i. Quindi ho intenzione di rubare una di quelle idee da prima - questa sostituzione per i codici di formato - e poi qui, in fondo, tornerò 0, solo per buona misura. Ma ora, ho un programma più sintetica. Sono solo poche righe, e non circa 10 o 11 linee. Lasciatemi andare alla mia richiesta qui. Remake loop. Eseguire di nuovo loop. E sembra essere la stessa. Ora, il programma non è più interessante. Ma ora posso scrivere una cosa del genere. Posso cambiare questo a 100. Posso quindi ricompilare il mio programma. E poi posso eseguire nuovamente il mio programma. E ora si va super-veloce sui computer di oggi. Ma ci ho - e in realtà, il mio buffer di scrollback non anche andare così lontano. Ecco fatto. Così ci abbiamo tutto 100. Ma è facile commettere errori qui. Che cosa sarà il comportamento previsto se accidentalmente farlo? Così ci si sente come infinito. Quindi cerchiamo di vedere se il computer si comporta. Permettetemi quindi di andare avanti e fare loop. E lasciate che l'esecuzione del ciclo. Quindi, torniamo a quello di un attimo. Lasceremo che corrono. Perché quello che dovremmo contare fino a, minimo? Probabilmente almeno 2 miliardi di euro, se abbiamo il numero di bit, e stiamo usando valori positivi. Quindi cerchiamo di tornare qui. Oltre a questi tipi di cicli, abbiamo quelli che vengono chiamati mentre loop. Così, proprio come in Scratch, hai avuto sempre blocchi, e hai avuto blocchi ripetizione. Allo stesso modo, in C, è sufficiente altri modi di esprimere se stessi. In modo da avere questa nozione di un ciclo while che permette di esprimere se stessi un po 'diverso. E poi hai qualcosa chiamato un ciclo do-while, che opera in modo leggermente diverso pure. E noi provvederemo a prendere in giro questi pezzi nel corso del tempo. Ma diamo uno sguardo a questo ultimo qui. Se andiamo in - ancora in esecuzione. E 'piuttosto infinita. Permettetemi quindi di andare in positivo, e mostrare come si può effettivamente governare input dell'utente un po 'più efficace. Si tratta di un programma piuttosto breve. E qui abbiamo, in principale, un int n dichiarazione. Allora dammi una variabile denominata n. Ora, io dico letteralmente "Fare". E poi ho aperto ricci brace, vicino parentesi graffa. E poi notare, subito dopo, si dice mentre n è minore di 1. Quindi notare che queste linee - 19-24 - comporre collettivamente un ciclo do-while. E ancora, non nuova sintassi, una nuova idea. E 'solo un altro modo di looping, sintatticamente. Che cosa significa questo? Effettuare le seguenti operazioni mentre n è minore di 1. Allora, cosa voglio fare? Esigo che tu mi dia un numero intero positivo. Poi io in realtà cercare di ottenere un numero intero da parte dell'utente. Ma in termini di ordine delle operazioni qui, perché l' finché la condizione è qui, io poi andare a controllare, è n meno di 1? Supponiamo che l'utente - dopo essere stato richiesto in questo modo - tipi il valore 0. Questa condizione sarà vero o falso? Beh, in realtà sta per essere vero. Poiché n è 0, e 0 è minore di 1. Che cosa implica? Fallo di nuovo. Fallo di nuovo. Fallo di nuovo. Solo una volta che la condizione restituisce false. Se digito 42. Ebbene no, 42 non è minore di 1. Pertanto questo loop è fatto esecuzione. E così a quel punto, il programma dirà, grazie per il 42, in questo caso. Ora che avete questo modo di esprimere se stessi - Non dobbiamo aspettare che questo alla fine. Sta andando a prendere un po 'di tempo. To be continued la prossima volta, forse. Ma ora, si ha la possibilità di spera di comprendere un po 'di umorismo geek. Apologies. Questo non è rappresentativo dell 'umorismo in computer science mondo, ma è carino. Fine [RIDE] Andiamo su questa nota. E ci vedremo il Lunedi. [Applausi]