[Powered by Google Translate] DAVID J. MALAN: Va bene, questo è CS50, e questo è il inizio della seconda settimana. Grazie. Cominciamo qui con una telefonata. Sto per chiamare 617-BUG-CS50. CS50: Questo è CS50. Per Ragazzo Shuttle, premere 1. Per ricominciare, premere 9. DAVID J. MALAN: Così ha detto per Boy Shuttle, premere 1. Quindi stiamo andando a premere 1. CS50: Qual è la tua origine? Per i quad, premere 1. Mather, premere 2. Boylston, premere 3. Lamont, premere 4. Mem Hall, premere 5. Per ricominciare, premere 0. DAVID J. MALAN: Ci premere 1 per il quad. CS50: navetta successiva lascia in questo preciso istante alle ore 1:10, e poi a 1:20, 1:30, 1:40 PM. Questo è CS50. DAVID J. MALAN: Quindi questa è la voce del CS50. Ed è un esempio dei tipi di progetti definitivi, per esempio, si può mordere via verso alla fine del semestre. Ad esempio, che shuttleboy.cs50.net esiste - in realtà un progetto che ho scritto dopo aver preso CS51 quando ero uno studente universitario. E l'ispirazione qui era allora, tutto quello che avevo era gli stampati orari degli autobus navetta, e non c'era nozione di guardare le cose on-line. E così una sorta di colomba in un fine settimana, versato attraverso il stampato il calendario, e lo ha portato a un programma per computer. Al momento, il programma informatico successo da scrivere in C. E in realtà ha funzionato da Boy Shuttle digitando in un lampeggiante chiederà come abbiamo fatto finora. Ma nel corso degli anni, si è evoluto in un istante messaggistica bot. Si è evoluto più recentemente in questo sito web, in un SMS-based, così come in questa voce strumento basato. E questo è quello di suggerire il genere di cose che si possono fare per voi stessi entro la fine del semestre. Per esempio, c'è la versione SMS di Boy Shuttle accade operare come segue. Se, sul tuo telefono cellulare, si invia un messaggio di testo a 41.411 e quindi inviare il sboy simbolo speciale, per Boy Shuttle, seguito da A e B, dove A è una origine e B è un destinazione - per esempio, Boylston Spazio Quad - ciò che si dovrebbe tornare nel giro di pochi secondi è un testo messaggio da Boy Shuttle vi dico esattamente quando il prossimi navette sono pochi, da quel punto Un andare in quella punto B. E questo è un esempio più generale di ciò che è noto come utilizzando un API. Così, per esempio, questo qui è solo shuttleboy.cs50.net, il attuale web-based incarnazione di questo. Ma i dati che sottolinea le applicazioni questo e altri che CS50 ha sviluppato tutti esposti a tutti qui nella forma di API, interfacce di programmazione delle applicazioni. E questo è solo un modo elegante per dire che la gente ci piace il Internet e altri hanno speso un po 'di tempo la creazione di Il software che è possibile utilizzare, al fine di catturare i dati da noi e quindi creare le proprie applicazioni sulla parte superiore di tale insieme di dati. Così, per esempio, questa pagina Ragazzo navetta API qui, che sembra essere nel manuale CS50, essenzialmente documenti come si può fare per chiedere CS50 server per i dati. Per esempio, se si ha familiarità con i file CSV, comma valori separati, questi sono solo una sorta di veloce e sporco Excel come file. Così si può chiedere Boy navetta per tutti i dati su tutte le le case e le loro coordinate GPS, e si otterrà indietro, essenzialmente, un foglio di calcolo come quello che è possibile leggere in un programma di tua scelta e poi generare i risultati, come Boy navetta stessa capita di fare. Per i più familiari, rappresentazioni più moderne dati includono JSON, JavaScript Object Notation. Qualcosa tornerà a verso di sé alla fine del semestre. Ma ancora una volta, questa è solo una delle tante di API proprio di CS50. E la cosa interessante è ora, in questi giorni, Facebook e Twitter e Google e praticamente ogni sito web popolare fuori non ha una sorta di API, che significa che se si legge il documentazione sul loro sito, ti iscrivi per un account, è possibile quindi iniziare a scrivere software in cima qualsiasi strumento o dati che società ci fornisce. E così uno dei nostri compagni di insegnamento di un paio di anni fa ha scritto una versione per Mac di questo. Così al link intitolato Mac qui in alto a sinistra, si può effettivamente scaricare un widget per Mac OS che gira sul proprio Mac per fare il stesso tipo di cose. Quindi è tutta una questione di costruire in cima al set di dati come questi. Ma più in che verso la fine del semestre. Quindi cerchiamo di immergersi in rapido reale di un bug, solo per tipo di ottenere cose riscaldato fino ad oggi, e ripenso su alcune delle cose che abbiamo visto la scorsa settimana. In particolare, vorrei andare avanti e tirare su, diciamo, questo esempio qui. Buggy1.c, questo è disponibile sul sito web del corso, se lo piace scaricarlo e curiosare intorno a voi. Ma andiamo ingrandire in questo programma abbastanza breve, e solo un super-veloce riassunto di alcune delle componenti di base che davvero stanno per iniziare solo prendendo per scontato. Così la roba blu, nelle linee da 1 a 9, sono solo softball domande. Quindi questi sono solo commenti. Essi non hanno alcun significato funzionale. Ma sono i commenti, nel senso che sono le note Io, l'uomo, fatto a me stesso in modo che in conferenza e dopo lezione, posso effettivamente ricordare quello che questo programma fa senza dover leggere riga per riga e ricreando la storia nella mia mente. Inoltre, se questo programma mano a qualcun altro, come te, molto più chiaro a voi, a causa di commenti come questo, quello che il programma sta in realtà facendo, o almeno quello che il programma si suppone di fare. O se non è corretto è un altro paio di maniche. Ora, in C, con commenti su più righe, ricordare che, in linea uno è qui il simbolo magico, / *. Significa qui l'inizio di un commento. E nient'altro ha importanza fino a raggiungere la fine di terminazione, che è * /, il contrario. Quindi il fatto che io ho 80-alcune stelle dispari qui da da sinistra a destra è in realtà solo un dettaglio estetico. Non ha un significato funzionale. Ora, come su linea 11? Che cosa significa questo in parole povere? Che cos'è? PUBBLICO: include lo standard. DAVID J. MALAN: OK, bene. Quindi include la libreria stdio.h. Che cosa vuol dire? Ebbene, all'interno di quel file, stdio.h, sono un sacco di funzione dichiarazioni - vale a dire, il codice che qualcun altro ha scritto. E un perfetto esempio di una funzione che è dichiarata in stdio.h è - preferito che ormai? Quindi printf, uno dei più comuni da usare, certamente presto, da quella libreria è lì. Se escludo che riga di codice, Clang sta per urlare a me qualcosa ricorrendo a un simbolo non dichiarato. Qualcosa di sommerso è probabilmente la parola chiave, perché non abbiamo informato il compilatore quello che sembra printf come se non includono quella linea. E più giù sulla Terra, in realtà, ciò che sta dicendo è la linea aprire quel file, stdio.h, ovunque sia sul quella del server disco rigido o dal disco rigido dell'apparecchio, e copia-incolla è proprio lì nel mio file, senza la mia dover farlo manualmente. Ora, una volta scendiamo qui per principale, non molto inizieremo prendere in giro a parte ciò che int e ciò che è nulla. Ma per ora, diamo un'occhiata a tre linee nel raggio di 15 a 17. Questo qui rivendicare come buggy. Linea 7 nei miei commenti dice "dovrebbe stampare 10 asterischi ma non. "Perché non stampare, infatti, 10 stelle del genere? PUBBLICO: [incomprensibile]. DAVID J. MALAN: Esattamente. Quindi notare che stiamo cominciando a contare da 0. E questo è in realtà una convenzione nella programmazione e informatica più in generale, iniziando a contare da 0 al posto di 1. E questo davvero deriva proprio dal fatto che, per esempio, quando abbiamo avuto otto persone sul palco, quando nessuno è stato alzare la mano, erano tutti gli zeri in modo efficace. E quindi è solo una specie di convenzione computer in modo, pertanto, iniziare a contare da 0. Se questo è il numero più basso è possibile rappresentare in formato binario. Quindi qui abbiamo iniziato l'inizializzazione i per 0. Abbiamo impostato i uguale a 0. Ma poi ho fatto questo errore qui, dicendo che i è minore o pari a 10. Ma se si pensa che attraverso, se mi metto a 0 e poi vado fino a 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, sto andando stampare le 11 stelle allo schermo, perché ho salito a e pari a 10. Quindi, la soluzione semplice: ecco allora che cosa? PUBBLICO: [incomprensibile]. DAVID J. MALAN: Basta cambiare a meno. Se si vuole veramente, si potrebbe fare questo. Ma in generale, che è visto di buon occhio. E così inizia a contare da 0 è solo qualcosa che deve in genere abituarsi. Ora, che dire di questo costrutto tutto in sé e per sé? Secondo questa linea, 15 demarks un ciclo for. Così, per non è una funzione. E 'solo una dichiarazione. E 'un costrutto di ciclo, come abbiamo visto in Scratch. E ha tre parti. Si noti che vi è la prima parte di sinistra della virgola. C'è la parte centrale tra i due punti e virgola. E poi c'è la parte della mano destra a destra della virgola secondi. Ora, il primo di questi fa cosa? PUBBLICO: [incomprensibile]. DAVID J. MALAN: Laggiù? Si '? PUBBLICO: inizializzazione. DAVID J. MALAN: Inizializzazione. Che cosa significa questo? Abbiamo dichiarato una variabile denominata i. E 'di tipo int, perché ho specificato int i. E io ho l'inizializzazione al valore 0. Così che cosa sta davvero dicendo? E 'effettivamente dire al computer hey, dammi abbastanza memoria, RAM sufficiente, per adattarsi a un numero, e quindi inserire il numero 0 in quel pezzo di RAM. E per inciso, quanto grande è un int in genere, almeno all'interno dell'apparecchio? PUBBLICO: 32 bit. DAVID J. MALAN: 32 bit. Questo significa che mi danno 32 bit, altrimenti noto come 4 byte, e mettere il valore 0 in essa, che è abbastanza facile perché Significa solo impostare tutti i bit a 0. Così ora, la seconda parte qui è la condizione. E la condizione, come suggerisce il nome, è quello che viene controllato ancora e ancora e ancora come se è vero o falso. Quindi questo è solo per dire che fare le seguenti righe di codice - vale a dire la linea 16, perché questo è l'unico rientrato sotto - fintanto che i è inferiore a 10. E dopo ogni iterazione attraverso questo ciclo, fare il incremento, che in questo caso è i + +. Ora, non deve essere i + +. Potrebbe essere i -. Ma se ho fatto questo, quello che sta succedendo il comportamento di essere di questo programma? PUBBLICO: E 'intenzione di essere un ciclo infinito. DAVID J. MALAN: E 'intenzione di essere una specie di loop infinito, a meno che non siamo fortunati negativo dopo 2 miliardi o giù di lì. Forse le cose si avvolgono intorno, giusto per natura del finito numero di bit che sono assegnate per un int. Ma è certamente andando a scorrere molto più di 10 e certamente più di 11 volte qui. Ed ora, per inciso, si rendono conto che i + + e i - sono in realtà solo zucchero sintattico. E 'solo notazione abbreviata per quello che è un po' più esplicitamente scritto come segue: i = i + 1. Che è identico a i + +. E 'solo un po' sembra più bello da dire i + +. E 'più concisa, più leggibile. E così maggior parte della gente che, invece. Ma questo è funzionalmente identica alla quello che abbiamo appena visto. Così, in breve, la soluzione rapida qui è solo per dire scorrere i da 0 fino a meno di 10. E poi ci giunga 10 stelle. Quindi cerchiamo di provare questo. Permettetemi di aprire il terminale nella parte inferiore. Lasciami andare nella directory che si è dentro E ho intenzione di compilarlo manualmente con Clang per ora. E ho intenzione di compilare questo come buggy1.c, Invio. E ora buggy1, perché non c'è nessun file o directory buggy1 chiamato? PUBBLICO: [incomprensibile]. DAVID J. MALAN: Già. Quindi in realtà è chiamato a.out. Quindi ricordo se eseguite soltanto Clang, dove Clang è il compilatore, e non si specifica il nome che si desidera dare al vostro programma, sta andando per difetto ad a.out. Così infatti se faccio ls - oops. E io didn't - nero-bianco e numero alcune delle avete dovuto affrontare è stato risolto. Ma lasciatemi fare questo. Ci abbiamo a.out sulla sinistra lì. Quindi dobbiamo correre invece di a.out buggy1. Permettetemi quindi di andare avanti e farlo. . / A.out, Invio. E a quanto pare non ha fatto che cosa? PUBBLICO: Salva. DAVID J. MALAN: Salva il mio file. In modo che si risolve facilmente colpendo S di controllo, o di andare a File, Salva, come nella maggior parte dei programmi. Lasciami andare qui, cancellare lo schermo, eseguire di nuovo. E c'è ancora un bug. Quindi quello che sta succedendo - PUBBLICO: Non hai compilato. DAVID J. MALAN: Ah, bene. Io non l'ho compilato. Come un idiota, sto guardando il codice per vedere cosa c'è che non va. Così buggy1.c clang, ora a.out. E phew, salvato. Quindi sembra un po 'brutto perché non c'è nuova linea ovunque nel programma. Ma ancora una volta, questo è solo un dettaglio estetico. E almeno se contiamo quelli fuori, dovremmo ora vedere 10 stelle del genere. Beh, che dire di questo secondo warm-up esempio? Quindi, in buggy2, sostengo che questa versione, anche, provvederà a stampare 10 stelle, una per riga. Così questa volta, ho un carattere di nuova riga, solo per fare cose un po 'più bella. Ma invece ciò che ottengo è questo. Quindi vorrei fare buggy2.c clang, Invio. Ora è di nuovo chiamato a.out. Invio. Vedo solo una nuova linea, solo l'ultima riga nuova muove la mia richiesta alla riga successiva. E ancora chiaramente ho la stampa *, quindi una nuova linea, *, Poi una nuova linea. Ma qual è il problema qui? Si '? PUBBLICO: [incomprensibile]. DAVID J. MALAN: Esattamente. Quindi, a differenza di altri linguaggi, come Python, dove il rientro realtà ha significato funzionale, in una linguaggio come il C - come vedremo, PHP, JavaScript - il rientro è in realtà solo a beneficio degli umani. Quindi il fatto che ho rientrato linea 16 e 17 sembra grande, ma non ha alcun significato funzionale qui. Se voglio entrambe le linee da eseguire come parte del per ciclo, allora devo racchiuderli tra parentesi graffe in questo modo. Si può solo tagliare l'angolo e omettere le parentesi graffe se qual e 'il caso? PUBBLICO: Solo una riga. DAVID J. MALAN: Solo una riga. Ecco, questo è solo una sorta di una sorta di piacevole dettaglio la sintassi in modo che non perdete tempo a scrivere tre linee, due delle quali sono parentesi graffe, solo per scrivere una sola riga di codice. Ma se si hanno due o più linee, si davvero bisogno di fare questo. Così ora lasciami salvare questo. Lasciatemi andare avanti e rieseguire Clang. Allora lascia che eseguire nuovamente a.out, e ora li faccio uno per riga. Ora, a.out è di nuovo genere di un nome stupido per un programma. Come posso dire Clang realmente darmi un nome di file che è più facile da usare, come buggy2 stessa? Un po 'più chiaro? PUBBLICO: [incomprensibile]. DAVID J. MALAN: OK, in modo che possa effettivamente prendere il molto facile collegamento e scrivere semplicemente fare buggy2. Non si specifica. C, in questo caso, e premere Invio. E ciò che rende non fa altro che compila buggy2.c per me da Clang chiedendo di farlo. In particolare, lo chiama Clang, viene eseguito utilizzando Clang modo più argomenti della riga di comando o interruttori di quello che in realtà bisogno. Col tempo, torneremo a quello che tutti questi vari criptiche espressioni sillabazione mezzi. Ma per ora, che sono solo io risparmio la fatica di dover ricordare e dover digitare su tutti coloro varie espressioni separate da un trattino. E il lato positivo di esso è in ultima analisi, che ora ho buggy2. Se voglio fare questa operazione manualmente, però, mi può invece fare questo - clang-o buggy2 e poi buggy2.c. E che allo stesso modo mi dà un file chiamato buggy2. Così, in breve, è il compilatore Clang. Fare è solo un facile strumento che useremo più e più, perché inizia appena a semplificare le cose per noi. E torniamo 0, infine. Per ora, solo perché, ma inizieremo a prendere in giro quella parte oggi e il Mercoledì. Hai domande su tutto questo? Si '? PUBBLICO: [incomprensibile] ls tra virgolette lì? DAVID J. MALAN: OK. Quando ho digitato ls tra virgolette, che mi stava facendo un po 'di magia dietro le quinte per correggere un bug. Ho dimenticato, come abbiamo detto a molti di voi sul forum di discussione, da fare - lo faremo ora - sudo yum-y update appliance50. Ops, che questo è scritto giusto. Quindi l'apparecchio è come un sistema operativo. E 'in esecuzione il sistema operativo chiamato Fedora. Ed ora a causa della mia connessione a Internet lenta, ho davvero incasinato. Quindi esegue sudo yum update, come vi abbiamo detto di fare in set di problema, in sostanza, come in esecuzione degli aggiornamenti automatici in Mac OS o Windows. E il motivo di questa esecuzione all'inizio stesso della set problema è perché quando abbiamo creato la macchina, ho incasinato, e per sbaglio ho fatto tutti i programmi guardare nero su uno schermo nero, ed è per questo che non li stai vedendo per impostazione predefinita. Ma l'ultima versione dell'apparecchio risolve il problema. E io che durante le vacanze di risolvere una volta che ho Internet connettività. Così le virgolette solo nasconde il mio errore, con molta discrezione, a quanto pare. Altre domande? Sì? PUBBLICO: Dove fa viene? [Incomprensibile] DAVID J. MALAN: Bella domanda. Da dove fa viene? Si tratta di un programma Linux che esiste da molti anni, a lungo prima CS50. E viene fornito con un sistema operativo come Fedora. Non viene dalla libreria CS50. In realtà, le uniche cose che vengono dalla libreria CS50 fino ad ora, che abbiamo visto, sono GetString, GetInt, tutti Prendi quelle funzioni, e la stringa parola, e in una certa misura, la parola bool. Ma ci prendono in giro che, a parte quando ci immergiamo nella CS50 apparecchio stesso. Quindi sì, ancora una domanda qui. PUBBLICO: Quando hai detto e poi fare buggy, come fa il computer a sapere [incomprensibile]? DAVID J. MALAN: Bella domanda. Quindi, quando si fanno solo correre o fare buggy1 buggy2, come fa sapere? Quindi per impostazione predefinita, se si digita make buggy1, fare per un look file chiamato buggy1.c. E poi esegue i comandi appropriati clang, sovrapponendosi quindi il file di output predefinito chiamato a.out. Infatti, se guardiamo a quello che fanno, che cosa - cerchiamo di uscire da questo. Se guardiamo a quello che fanno è stato effettivamente facendo, fare buggy2, è già aggiornato. Permettetemi quindi di rimuovere il comando rm, il programma che ho scritto prima. Digitando Y-E-S per confermare che voglio rimuoverlo. Se ora fanno fare, notare che in questa linea molto lunga, c'è questa cosa qui l'ultima volta,-o buggy2. Tutto marca sta facendo sta passando tale argomento, per così dire, a Clang, in modo che non c'è bisogno di scrivere io stesso. Va bene, quindi un paio di rapida amministrativa annunci. Così, per sezioni, che iniziò ufficialmente il prossimo Domenica, ti vuole sempre portare, se ne hai uno, un computer portatile. Se non si dispone di un computer portatile, non entrare in contatto con me cadere una email. E faremo capire un flusso di lavoro. Che in genere si trova nella sezione è che sono parte concettuale, parte hands-on. Ci specifico utilizzare la sezione di domande, una parte della della settimana impostato problema, a piedi attraverso alcuni dei materiale concettuale da lezione. E questo è tutto nel set problema attuale. E faremo anche tuffarsi in alcune attività pratiche, a volte dei quali sarà necessario presentare, a volte di che non lo faranno. Per esempio, questa prima settimana, sono da intendersi come un esercizio di riscaldamento. E vi accorgerete che questi problemi sono in realtà solo questo. Sono destinate ad essere abbastanza piccole, ma non necessariamente programmi banali da scrivere, che non sono necessariamente buone opportunità interessanti in sé e per sé, ma sono a pratica con la sintassi, con nuove funzioni, nel comfort di un sezione in cui si dispone di alcuni dei tuoi compagni di classe presenti come così come il vostro TF. E cosa faremo nel corso del tempo è utilizzare uno strumento chiamato CS50 Spaces, per cui invece di utilizzare il CS50 Appliance, avrai invece andare a una pagina Web in un browser, in cui sarete in grado scrivere il codice in una finestra del browser durante il taglio. E poi se si opta, il tuo compagno di insegnamento può quindi mostrare qualunque cosa tu stai digitando sullo schermo nel tuo browser finestra fino al fronte della classe, se anonima o pubblicamente, in modo che lui o lei può poi a piedi fino in fondo tuoi compagni di classe quello che hai fatto bene, quello che non ha fatto bene. E ancora, vi assicuriamo tutto questo può essere ben anonimi. Ma sarà una bella occasione per molto di più interattività che qualcosa di simile conferenza consente. Nel frattempo, avremo queste cose come super sezioni, che sono facoltativi, ma sono aperti a tutti in la classe, in modo che si può fare questo più collettivamente per impostare un problema. Ecco il programma. Questo è anche pubblicato sul sito di cs50.net. Si noti che ci sarà un hacker-specifica uno domani pomeriggio. E noi filmare uno oggi e uno domani e postare quelle on-line entro 24 ore. Quindi non se non si può fare qualsiasi di questi tempi, di cui preoccuparsi. E ancora, il programma non è in linea a cs50.net. In termini di sezionamento stesso, dovreste aver ottenuto un e-mail che richiede di andare alla homepage del corso per trovare la tua sezione. Se la vita è cambiata e hai bisogno di cambiare la sezione, non è un problema. Torna lo stesso URL, cs50.net/section, singolare, e potrai compilare il modulo simile in modo da poter poi ci danno le vostre preferenze. E noi seguirà entro la fine della settimana per quello che possiamo ospitare. La scorsa settimana, ricordiamo che abbiamo proposto con CS50 discutere, il corso di strumento di discussione, nella lezione. Così abbiamo avuto 40 domande che sono state poste e ha risposto durante la lezione. Così sembrava funzionare bene, quindi dovremo continuare cercando di fare questo. Se, durante la lezione, non ti sento tranquillo raccolta la tua mano, non è un problema. Vai a cs50.net/discuss, postare lì, e uno del nostro insegnamento borsisti o rispondere elettronica o aumentare la loro mano a vostro nome anonimo per chiedere, a seconda sulla natura della domanda. E in termini di feedback, in generale pset sarà restituito entro una settimana. Perché ci vuole un po 'di tempo per le sezioni per ottenere equilibrio, il primo pset, 0 e 1, sarà un po ' ritardato le cose stabilirsi. Ma rimanete sintonizzati per che nelle settimane a venire. Va bene, allora mi permetta di mettere il mio grave voce solo per un momento. Quindi questo è in realtà un clima interessante essere avendo questa discussione, quello con tutte le altre cose in corso il campus ad esso correlati. Ma CS50 ha certamente avuto la sua storia di questo particolare argomento, in quanto ogni anno, questo corso, per molti anni, ad-Boards circa il 3% della classe. Quest'anno più recente, 2011, Ad-CS50 Imbarcato 35 studenti. Questo non è, credo, a causa della mancanza di chiarezza. Rendetevi conto che nel programma del corso, c'è una pagina di spiegazione di dove le linee sono. Tale affermazione si ripete in ognuno dei problema pone in prima pagina. Così ho detto questo oggi davvero solo per fare persone ben consapevoli. E abbiamo provato cose diverse. E quello che ho pensato che avremmo oggi è solo un momento per effettivamente un'occhiata ad alcuni dei casi passati che hanno creato. Piuttosto che tenere questi segreti come piccoli sporchi, in realtà sottolineare ciò che gli studenti hanno fatto e come abbiamo rilevato e davvero quello che la motivazione generale è per pur avendo questa conversazione. Quindi, con questo detto, la linea è essenzialmente questo - secondo il programma, sei il benvenuto, si consiglia, a parlare con i compagni di classe. Questo è l'intero scopo di avere questi collaborativo orari d'ufficio in Annenberg e persone incoraggianti per il finale del progetto di lavorare insieme. Ma la linea è tracciata, quando arriva il momento di scrivere effettivamente la soluzione finale. Parlando in inglese, tutto bene, parlando in pseudo codice, tutto bene. Emailing un compagno di classe tua pset, permettendo loro di guardare oltre lo schermo come le mani continuare a digitare, sulla linea pure. Non guardare al programma per le linee particolari. Ma solo per dipingere un quadro di come questo è, purtroppo, un realtà, si rendono conto che ci sono siti web là fuori che disporre di soluzioni di questa classe e molte altre classi. Il fatto che tu o circa il 3% di voi sanno che questo esiste significa che noi sappiamo che esiste. Il fatto che ci sono siti come questo, dove si può pagare qualcuno per fare effettivamente le serie di problemi - questo è stato un caso reale che è venuto l'anno scorso. Si tratta di un sito web chiamato odesk.com. E Tim era il nome della persona che è stata qui la pubblicazione sul questo sito web e chiesto a qualcuno di fare il suo pset 7 questo caso particolare. Beh, è ​​molto odesk.com Google-in grado, e anche noi siamo molto bravo a usare Google. Anche qui, ci sono siti - e questo è piuttosto atroce, francamente. [Risate] DAVID J. MALAN: La cosa divertente di questo sito è che se di leggere la pagina Informazioni su, che parlano della loro impresa cliente cultura e come servizio è il loro numero uno priorità, per assicurarsi che le assegnazioni ottenere trasformato in in tempo. Ma in tutta serietà, ancora una volta, il fatto che questi siti esistono, ci rendiamo conto, anche, sono consapevoli del questi tipi di siti. E per dare un senso di ciò che costituisce questo genere prende, noi in genere non hanno grandi scandali in cui le persone stanno collaborando su qualsiasi tipo di scala, ma piuttosto sono queste a tarda notte momenti di debolezza, in cui si hanno così molto da fare, e '04:00, sei esausto, e si pensare a te stesso, beh, vorrei solo dare un'occhiata al mio compagno di stanza o il codice del mio amico o simili. E le manifestazioni di questo, purtroppo, coinvolgono gli studenti Un qualcosa di presentazione come questa e B sommettersi Studente qualcosa di simile, che certamente, in un computer classe di scienze, è molto facile per gli informatici per rilevare con il software. Questo è un altro paradigma comune, dove avete una sorta di lavorato al fianco di qualcuno, magari parlando in Inglese, bene, pseudocodice. Ma poi arriva il momento di presentare in realtà, e le pset solo ottenere scambiati tramite e-mail o Dropbox o simili. Ma nel tentativo di rendere meno evidente che questo è quanto è successo, allora questo è ciò che è presentato. Anche questo, non inciampare ben scritti pezzi di software come dobbiamo rilevare effettivamente questo tipo di cose. E infatti quello che facciamo è un software che mette a confronto tutti i run di quest'anno osservazioni nei confronti di tutti, l'anno scorso osservazioni, contro tutto ciò che abbiamo trovato sulla Internet, contro ogni sito di posti di lavoro là fuori. E 'tutto molto automatizzato. E così lo facciamo davvero in grande correttezza il 97% che stanno dando buoni risultati il ​​culo fuori in questo e in altri classi e mettendo in tutto questo sforzo in modo che il lavoro in ultima analisi, è presentare loro. E posso andare avanti per secoli. Queste sono solo una manciata di casi dello scorso anno. Alcuni studenti ha presentato questi file in modo identico per pset 2, pset 3, pset 4, pset 5, pset 6, pset 9. In questo caso, questo era quiz 0 e in anno, dove due studenti ha presentato identico questa frase tra le tante gli altri, "La richiesta del tipo -" punto, punto, punto. Quindi, anche in una classe di 600 abbiamo rilevare questo presentato il quiz. Così, in breve, questo - francamente, io odio avere questo tipo di conversazione - ma questo è davvero uno sforzo deliberato quest'anno per cercare di ridurre tale numero. Perché anche se diciamo che questo tipo di cose ogni anno, credo che la realtà di aver soffermato su di esso per pochi Ancora secondi del solito e in realtà solo sottolineando che ciò che può sembrare, eh, non è un grosso problema, almeno ripensare a questo particolare momento, sia in equità di voi stessi e ai vostri compagni di classe qui. Quindi, se avete qualsiasi domanda per quanto riguarda dove la linea è, per favore, entrare in contatto con me personalmente. Ma la risposta è sempre, completamente sottolineato in last minute, denaro in un giorno di ritardo. Oppure, se si tratta di una questione di non avere giorni di ritardo, onestamente, mi e-mail personale. Ci inventeremo qualcosa. Si prega di non mettere il vostro tempo qui a Harvard a rischio. Ora, ho pensato che dovrebbe alleggerire l'atmosfera, così ho incluso questo come la diapositiva successiva. [Risate] DAVID J. MALAN: Questo sito è stato grande. Io in realtà sono un po 'distratto. C'e 'questo. E poi questo era incredibile. Ok, quindi pensare a quel gattino a tarda notte al momento della tali decisioni. Va bene, roba così torna più divertente e meno gravi, come condizioni. Va bene, così abbiamo parlato brevemente di questi. Questo è qualcosa che probabilmente è abbastanza familiare da il mondo di Scratch. E nel mondo di Scratch, abbiamo questa necessità a volte di vai a fare le forche in mezzo alla strada. O fare questo o quello o questa cosa qui. E quando si vuole fare questo, possiamo usare, in C ora, questo se else. E poi qui abbiamo espressioni booleane. Per esempio, le espressioni booleane qui, possiamo o insieme, nel senso che abbiamo questa condizione OR tale condizione. Possiamo e insieme, nel senso che vogliamo verificare questa condizione e questa condizione. E qui abbiamo una istruzione switch ora, che non è così sintatticamente simile a questo tipo di condizioni, ma ci permette di fare l'equivalente di if, else if, else if, else se, e simili mediante semplice enumerazione caso per caso da caso per caso. Così abbiamo visto quelle ultima volta. E poi abbiamo iniziato toccando le cose come i cicli. Abbiamo visto uno di questi solo un momento fa. Ma ci sono questi altri costrutti di loop. Per esempio, questo qui. Così, mentre (condizione), fare questa cosa ancora e ancora. Quindi, fondamentalmente, quello che sembra essere diverso tra questa per il ciclo e questo ciclo while qui? Questo per ciclo e questo ciclo while. Si '? Che cos'è? PUBBLICO: [incomprensibile]. DAVID J. MALAN: Good. Quindi, mentre nella condizione del ciclo di, c'è chiaramente più sintassi. C'è questa inizializzazione, c'è questo aggiornamento. In un ciclo while, c'è solo questa condizione. Così sembra che sia un po 'di rispetto verso il basso rispetto al per ciclo, il che significa che se vogliamo avere variabili e vogliamo Incremento di avere, in realtà abbiamo a fare questa cosa noi stessi. Permettetemi quindi di andare avanti e aprire gedit. Vorrei passare alla macchina. E facciamo solo fare un esempio piccolo e veloce che distingue una di queste dall'altra. E nella parte posteriore della mia mente qui, devo dire una cosa. In particolare mi ha fatto il nome Tim. Tim era in realtà qualcuno che uno studente ha cercato di trovare da fare i compiti per loro. Non avevamo Tim in quella particolare sezione. Quindi rendersi conto, perché io non rivelato uno studente, non era uno studente. E 'stata una persona a caso su Internet fare le cose per delega dello scorso anno. Così scopriamo che, anche. Quindi, in questo caso qui, lasciami andare avanti e aprire un nuovo file. File, Nuovo. Questo mi dà una scheda qui. Lasciatemi andare avanti e salvarlo come loop.c. Lasciami andare e fare clic su Salva. E poi qui, andiamo avanti e iniziare a scrivere # Include. Fammi Immagine Ora faremo int main (void). Ora lasciami andare avanti e fare for (int i = 0; i < oh, 10, i + +). E adesso ho intenzione di andare avanti e fare stampare la stella che mi fatto in precedenza. E poi alla fine di questo programma, stiamo solo andando a stampare una nuova linea, così che la mia richiesta non guardare tutto disordinato. restituire 0. Sembra sintatticamente corretto? Fino ad ora. Quindi cerchiamo di vedere. Permettetemi quindi di eseguire lo zoom indietro, andate nella mia finestra di terminale. E lasciatemi andare avanti ed eseguire loop, perché ho chiamato questo cosa loop.c. Quindi, fare loop. Sembra compilare OK. Vorrei correre ad anello, e ora Invio. E sembra aver stampato 10 stelle. Così facciamo solo convertire ad un ciclo while e vedere che cosa i tipi di problemi che inciampare. Così, invece di questo, lasciami andare qui e dire quando i è inferiore a 10 - mi permetta di ottenere liberarsi del ciclo for. OK, quindi abbiamo un paio di problemi già. Quindi la condizione è la stessa, ma mi manca, ovviamente, la inizializzazione. Mi manca l'Incremento. Che cosa si deve probabilmente il compilatore mi dice quando cerco di compilare questo programma? Si '? PUBBLICO: [incomprensibile]. DAVID J. MALAN: Good. Quindi sta per dire una cosa del genere non dichiarato - in questo caso, variabile i. E in effetti, l'uso di identificatore non dichiarato i. E così questo è in contrasto con linguaggi come PHP e Python e Ruby, con la quale alcuni di voi potrebbero avere familiarità, dove si può solo tipo di avvio utilizzando variabili volenti o nolenti e non devono preoccuparsi di dichiararle sempre in modo esplicito. In C e in linguaggi come Java e C + +, devi essere Super esplicito. E se volete una variabile chiamata i, devi dirmi che tipo di variabile è. Quindi stiamo andando ad avere per risolvere il problema nel modo seguente. Ho intenzione di andare qui e digitare int i, quindi, Ho dichiarato una variabile denominata i. Ora, ho saltato un passo. Ho, ovviamente, non è inizializzata, ma vediamo se che a almeno Clang marche smettere di lamentarsi. Quindi fammi rifare questo programma. Va bene, ora è solo lamentarsi per un motivo diverso. "La variabile 'i' viene inizializzato quando viene utilizzato qui." Va bene, allora che è abbastanza esplicito. Inizializzato significa semplicemente impostandolo uguale a un valore. E non abbiamo fatto, per cui vorrei provare è uguale a 0. Ora proviamo di nuovo e ri-eseguire Clang. Compilato questa volta. E sto per eseguirlo. Ma grande vecchio ciclo infinito, perché ho fatto la inizializzazione, ho fatto la condizione, ma non ho mai fatto qualsiasi tipo di Incremento. Allora, come posso fare il Incremento? Be ', in un ciclo while, ci si sente come ho intenzione di avere farlo all'interno del loop, perché molto simile al primo settimana facendo esempi di costrutti iterativi, come con le calze e con l'auto-conteggio, abbiamo dovuto fare qualcosa che alla fine, come tornare alla riga successiva. Cosa succede se andare avanti e fare questo i + + qui? Non dobbiamo nemmeno compilare questo. Catch me già. Cosa c'è di sbagliato? PUBBLICO: [incomprensibile]. DAVID J. MALAN: Quindi sicuramente non int. Sono io. E le parentesi graffe, come prima, rientro non è sufficiente. Così ora ho questo costrutto. Così, mentre i è inferiore a 10, stampare una stella, poi ho incrementare. E il modo in cui un po 'di opere ciclo è che non appena si preme il inferiore del ciclo, che in questo caso si presenta come linea 10, che sta per tornare in linea 6, a questo punto il condizione sarà verificato ancora. E se i è ancora inferiore a 10, faremo le linee 8 e poi 9, poi ci ha colpito 10, e tornare a 6, ancora una volta e ancora e ancora e ancora, finché i è inferiore a 10. Quindi cerchiamo di ri-eseguire make qui. Ok, abbiamo compilato bene. Permettetemi di re-run loop. E ora sembra effettivamente funzionare. Quindi, vantaggi e svantaggi qui? Beh, finora non c'è in realtà un insieme di plo - così carino. Va bene, che era un - ah, che è stato un incidente. Va bene, torniamo al ciclo for. Così, per cicli sono belli perché sono super esplicito. E anche se sono un po 'goffo di scrivere, è molto potente e ti permette di fare cose contemporaneamente. Mentre loop non sembrano avere una quantità enorme di giusto valore ancora, perché ci si sente come ci resta che lavorare di più. Dobbiamo mettere l'inizializzazione qui, il aggiornare qui, e dobbiamo ricordare di fare tutto questo. Così vedremo nel tempo che i cicli, mentre in realtà prestano si a solo diversi contesti, diversi dati strutture come liste e tabelle hash, le cose ci arriveremo di metà semestre. Ma per ora, so che c'è questo terzo tipo conosciuto come un do- ciclo while. E abbiamo visto brevemente. E questo potrebbe essere utile super con pset 1. Ogni volta che si vuole fare qualcosa e poi verificare se l'utente ha collaborato, e se non l'hanno fatto, di nuovo, un do- ciclo while si presta a questo tipo di logica. Poiché l'ordine da cima a fondo qui suggerisce, non significa letteralmente fare questo. E farlo ancora e ancora, cosa potrebbe essere? Forse significa GetInt chiamando o GetString e poi controllando il valore della GetInt o GetString e poi urla presso l'utente, se non hanno cooperato, chiedendo loro ancora e ancora e ancora. Dove si vuole fare qualcosa una volta, quindi controllare alcune condizioni. Quindi cerchiamo di provare questo. Vorrei cambiare questa realtà ora a un ciclo do-while. E ho intenzione di andare avanti e procedere nel modo seguente. Quindi, effettuare le seguenti operazioni. Facciamo int i = GetInt (), ma si deve prima informare l'utente cosa fare. Quindi, un po 'diverso questa volta. "Dammi un int". Quindi userò printf per questo. E adesso ho intenzione di andare qui, e ho intenzione di fare questo mentre i è, diciamo, più grande di - vediamo, i è, diciamo, inferiore a 0, o i è maggiore di 10. In altre parole, voglio un numero da 1 a 9, basta arbitrariamente. Quindi sto usando una espressione booleana combinato qui per assicurarsi che i è minore di 0 o maggiore di 10, in cui caso farò questo ciclo di nuovo qui. Quindi, di nuovo, fare questo - quando i è minore di 0 o i è maggiore di 10. Così ora andiamo avanti e fare una volta che abbiamo fatto. Diciamo solo fare un rapido controllo sanità mentale. printf ("Grazie, i è% d", i). Quindi questo semplice programma chiede all'utente di un int, fa in modo che sia all'interno di alcuni range da 1 a 9, e poi ringrazia l'utente, ricordando loro quello che hanno appena digitato, così come un controllo di integrità po '. Ma vediamo se questo funziona come previsto. Lasciami andare a testa in giù qui e ri-eseguire make loop. Hmm. "L'uso di identificatore non dichiarato 'i'". Che strano. Pensavo che deliberato che. Stesso sintomo ma codice diverso. Si '? PUBBLICO: [incomprensibile] all'interno dei due, dobbiamo [Incomprensibile]. DAVID J. MALAN: Esattamente. Quindi questo in realtà ci porta ad un argomento noto come campo di applicazione. Si scopre che C, ancora una volta, ci vuole davvero alla lettera. E se si fa qualcosa come questo, dove si dichiara un int e poi assegnare un valore, ma si che all'interno di un coppia di parentesi graffe, che C non fa altro che presuppone che si vogliono solo i 32 bit noti come i per esistere all'interno della nell'ambito di tali parentesi graffe, nel contesto delle linee di Da 6 a 9. Così i è dichiarata, e gli viene assegnato un valore in linea 8, ma non appena si arriva al di fuori di linea 9 sotto la parentesi graffa, i non è più in campo di applicazione, per così dire. S-C-O-P-E. Non è più nel giusto contesto. Così ora non ci sono i, quindi è come se non avesse nemmeno dichiarato affatto. Così che cosa è una soluzione allora per una cosa del genere, se il ragione è che i è dichiarata all'interno delle parentesi graffe, che è apparentemente male? Qui? PUBBLICO: [incomprensibile]. DAVID J. MALAN: Già. Così possiamo inizializzarlo fuori. Permettetemi quindi di andare avanti ed eliminare le parti dichiarazione con la quale A specificare il tipo, e lasciate fare a me qui. Quindi, in linea 5, che ora dice: "Dammi un int." Chiamatela i. Si noti che in linea 9, non voglio farlo, perché io già i 32 bit. Non voglio chiedere al computer per un diversi bit 32. Voglio usare quegli stessi 32 bit. E adesso perché mi è dichiarato nella riga 5, è ancora legit utilizzare in linea 11 e la linea 12. Quindi vorrei provare a ricompilare questo e vedere se smette di urlare Clang. fare loop. Così ora è "dichiarazione implicita di funzione 'GetInt' non è valido in C99. "Che cosa è questo? Si '? PUBBLICO: [incomprensibile]. DAVID J. MALAN: Già. Quindi, ora che sto effettivamente utilizzando GetInt, questo non è qualcosa che viene fornito solo con C. Questo viene da CS50. Quindi abbiamo bisogno di questo qui. E lasciami tornare al prompt di giù qui e rieseguire fare. Ok, finalmente. Ora abbiamo risolto questo e l'altro errore. Permettetemi ora di correre ad anello e vedere cosa succede. "Dammi un int." Darò 11. Darò -1. Darò foo. Darò 5. E ora funziona davvero. Ma la richiesta cambiato per un motivo qui. Perché dire ripetere una di queste volte, ma mi danno un int le altre tre volte? Perché è che il comportamento diverso? PUBBLICO: Ha dato una stringa. DAVID J. MALAN: Scusa? PUBBLICO: Hai dato una stringa. DAVID J. MALAN: Già. Così abbiamo dato una stringa in questo terzo tentativo, quando ho scritto foo. Foo è una stringa. Non è ovviamente un int. E il modo in cui ha implementato GetInt CS50 è che noi non controllare se qualcosa è minore di 0 o maggiore di 10 per voi, perché come si fa a sapere in anticipo che tipo di int vuoi? Ma possiamo minimamente controllare per voi, l'utente ha almeno digitare un numero intero? E se non lo facessero, gridiamo a l'utente digitando "retry" su lo schermo. Così ora abbiamo un programma che è il ciclo. Va bene. Ora, quale di questi è una sorta di costrutto migliore? Quindi questo è dove le cose cominciano a farsi un po 'disordinato, il fatto che si deve ricordare di dichiarare una variabile qui se si desidera utilizzare all'interno di alcune parentesi graffe e al di fuori. Ma anche se questo sembra un po 'criptico in un primo momento colpo d'occhio, solo ancora una volta, ricordare la semplice logica. Per poter utilizzare qualsiasi cosa in C, che si tratti di una funzione o si tratta di una variabile, è necessario includere, se si tratta di una funzione di in qualche biblioteca, o avete bisogno di dichiararla. Ma ora è necessario prestare attenzione in più del fatto che si sta dichiarando nel campo a destra. Non lo stai mettendo troppo stretto all'interno delle parentesi. Quindi lasciate che effettivamente il rollback. Se torniamo al nostro esempio di prima, e me ne vado per tornare a int, int i = 0; i <10, i + +, e io do stelle printf, come questo, e poi paren vicino, e ora printf i è ora - secondo la stessa logica, che cosa accadrà quando si tenta di compilare questo programma? PUBBLICO: identificatore non valido. DAVID J. MALAN: Quindi è un altro identificatore valido, identificatore non dichiarato. Ora, la ragione è un po 'diverso. Non c'è ovviamente nessuna parentesi graffa qui, ma lo stesso idea, la stessa storia del campo di applicazione si applica. Se sono state dichiarate una variabile come i all'interno di una per il ciclo, anche se non esplicitamente scritto il riccio bretelle, pensare a loro mentalmente ancora essere lì, in cui caso i è valida solo all'interno del ciclo for. Non è valida una volta arrivati ​​alla riga successiva, che in questo caso è ora 10. Quindi, solo alcune questioni di portata e simili. Va bene, qualche domanda? Va bene, quindi questo è una specie di piccolo programma banale, stampa solo piccole stelle. Ma vediamo se vi ricordate questa canzone qui. Questa è una canzone incredibilmente fastidioso i bambini cantavano su lo scuolabus e simili. Ma cosa bella è che ha questa ciclicità, per cui si tratta di "99 bottiglie di birra sul muro, 99 bottiglie di birra. Prendete una, passala intorno, 98 bottiglie di birra sul muro. "E poi la canzone ripete il 97, poi 96, poi 95, poi 94, tutta la strada fino a 0 se effettivamente ottenuto che molto sul bus. Quindi questo è un bel programma per ordinare di attrezzo, perché il mio Dio, se si può solo perseguire questo obiettivo con pochi righe di codice, è possibile sputare il testo intero del presente canzone abbastanza rapidamente. Ma lungo la strada, possiamo cominciare a prendere in giro ora a parte un po 'di di questi costrutti di base di loop e ora anche introdurre funzioni che noi stessi scrivere, restituire valori che si passa in giro. Ma in primo luogo, perché non andare avanti e prendere il nostro cinque minuti rompere qui? E quando torniamo, noi cantare questa canzone. Va bene, allora siamo tornati. E quando dico noi ora cantare questa canzone, voglio dire livello di programmazione, non verbalmente. Quindi qui abbiamo beer1.c, che è una implementazione di questo particolare canzone. E tanto per essere chiari, per chi non conosce quello che questa cosa assomiglia, lasciami andare avanti e fare beer1, Invio. Ora vorrei correre beer1, e quello che vedremo - quante bottiglie di birra ci saranno? Io digitare 99, come dice la canzone. Invio. E ora se noi scorrere - oops - se scorrere tutto questo, vedremo che questo ha effettivamente cantare tutta la canzone. Aspetta un attimo. La mia barra di scorrimento è un po 'incasinato. Usiamo la finestra più grande. Così beer1, 99, ci siamo. Ecco quindi l'intero brano, cantato molto più velocemente dal computer che avrebbe potuto essere da noi. Quindi notare, però, la natura ciclica qui. Si dice 99, poi 99, poi "prendere uno giù, passare intorno ", quindi 98. E ora lo ripete ancora e ancora. Quindi, questo è in realtà una perfetta opportunità per un qualche tipo di looping costruire. Si noti che io sono una specie di taglio di un angolo qui. Si noti che sto dicendo "98 bottiglie di birra sul muro, 97 bottiglie di birra sul muro, "e che era proprio così che quando si arriva a uno bottiglie di birra, non ho preoccuparsi della grammatica inglese. Ma possiamo anche risolvere questo problema con un po 'di se condizione, forse. Se questo numero è singolare, andare avanti e dire "bottiglia", altrimenti se è plurale, ad esempio "bottiglie". Ma per ora, sto tagliando completamente l'angolo. Quindi cerchiamo di vedere quello che abbiamo qui. Così abbiamo alcuni commenti in alto. Sono compresi questi due biblioteche, come siamo stati comunemente. E ora lasciami scorrere fino alla prima attuali linee di codice. Linea 17 prende il via principale. Linea 21 e 20 è il numero di bottiglie di birra ci saranno? E poi io chiamo GetInt. E ora ho un po 'di un controllo di integrità. Quindi questa è una convenzione che faremo ora iniziare l'adozione di più rigoroso verificare l'input dell'utente. A volte proprio non si desidera richiedere di nuovo e ancora e ancora. Se l'utente viti e non collabora, bene. Chiudere e semplicemente non trattare con loro. E quindi questo è quello che sto facendo qui. Se n è minore di 1, sto solo andando a gridare l'utente, "Mi dispiace, che non ha senso." E poi ho intenzione di arbitrariamente restituire 1. Quindi, di nuovo, questo è solo una convenzione per abituarsi. Per il momento, fidatevi. Ma fino ad ora, abbiamo sempre restituendo 0, perché abbiamo detto restituendo 0 indica che cosa? PUBBLICO: il successo. DAVID J. MALAN: Successo, questo è tutto. Quindi, ora che stiamo finalmente iniziando a pensare non successi - in altre parole, casi angolo, condizioni di errore - ora ho una scorta infinita, o almeno quattro miliardi di cose che possono andare male nei miei programmi. E posso iniziare ad assegnare loro i singoli numeri. Ora, in genere è sufficiente per restituire solo qualcosa di diverso da 0. Quindi stiamo andando a tornare semplicemente 1 per ora. Ma il motivo per il ritorno 1 è che non appena si torna 1, indovinate cosa succede al resto del programma? Si ferma. Tutto qui. Quindi il fatto che sto tornando 1 è efficace cortocircuitando esecuzione di questo programma in modo che niente sotto la linea 27 sarà continuare l'esecuzione. Appena torna principali, che è. Va bene, quindi se l'utente non cooperare e si raggiunge la linea 30 poiché avevano scritto in un numero legittimo, qui è la mia l'attuazione di questa canzone. Così ho stampare un carattere di nuova riga, solo per estetica. Ora ho un ciclo for. E notate che sto facendo le cose in un po ' di una direzione diversa. Non c'è bisogno di fare a meno, non devo fare + +. Posso invece dire inizializzare una variabile i, impostarlo uguale a n, il numero l'utente ha digitato, quindi effettuare le seguenti operazioni, in modo da fino a quando i è maggiore di 0, allora i - una volta che hai finito di una iterazione di questo ciclo. Così possiamo contare verso il basso con un ciclo for come bene. Ora, questa è la settimana più o meno uno roba adesso, con printf. So di stampa "d% bottiglie di birra sul muro." Stampa "% d bottiglie di birra. "Stampa" Prendete una, passala in giro. " "% D bottiglie di birra sul muro." Quindi è ancora d%, ma notare che l'argomento di printf sta cambiando. Dopo la virgola, io ho, perché voglio dire 99. Dopo questa virgola, io ho, perché voglio dire 99. Dopo questa virgola, io ho - 1, perché voglio dire 98 in questa prima iterazione, e così via. Ed ora qui, devo solo qualche battuta stupida. E poi linea 42, mi restituisce 0 per convenzione, a significare che va tutto bene. E se ho preso una cantonata? Che cosa potrebbe un errore comune qui essere? Beh, e se per sbaglio ho detto bene, io voglio contare fino a 0, voglio 0 bottiglie di birra sul muro? Allora io dico, i è maggiore o uguale a 0. Che cosa sarà il sintomo che ora vedere se ricompilare beer1 ed eseguirlo? PUBBLICO: Negativo. DAVID J. MALAN: Sì, è andra 'negativo. Questo è un off-by-one error, incredibilmente errore comune a fare. Andiamo in realtà tornare alla finestra di terminale e farlo qui, in modo che possiamo vedere più alla volta. Invio, 99 bottiglie di birra. Chiudi, ma siamo andati sempre leggermente troppo. Abbiamo cantato la canzone troppo in basso, in modo tale che ora ha colpito il numero negativo. Quindi non va a buon fine. Va bene, in modo che possiamo facilmente risolvere che, tornando al modo di una volta. Ma quali sono alcune opportunità ora miglioramento? Beh, lasciatemi aprire beer2.c e scorrere verso il basso qui e prendere un guardate questa versione. Qual è la prima cosa che salta fuori a voi come diverso in questa versione qui? PUBBLICO: [incomprensibile]. DAVID J. MALAN: Sì, così non sono più io, perché mi venne in Mi sai una cosa, sto chiedendo all'utente di n, e poi sono impostando i uguale a n, e poi ho i cambiando, ma non sono mai toccare di nuovo n. Quindi, cosa diavolo è stato il punto di voi allocare altri 32 bit ho chiamato solo in modo che io possa avere una variabile diversa? Quindi, in questo caso, una sorta di riconosciuto che inutili un design. E ora sto per dire, mentre n è maggiore di 0, andare avanti e stampare la stessa canzone, passando un n per printf come secondo argomento, e n - 1 come secondo argomento qui. E poi ad ogni iterazione di questo ciclo, andare avanti e basta n decrementare stessa. Ora, funzionalmente, il programma sta per essere identici. Se digito 99, n inizia alle 99. I decremento, decremento, diminuzione, decremento. Io vado a prendere tutta la strada fino a "Una bottiglia di birra il muro, una bottiglia di birra. Prendete una, passala intorno. 0 bottiglie di birra sul muro. "La fine, perché ho fatto ottenere la condizione corretta. È maggiore di 0. Non ho fatto questo errore. Così che è meglio, la versione o quella versione due? Ho sentito un sacco di mormorazioni per due. Perché due? Che cos'è? PUBBLICO: [incomprensibile]. DAVID J. MALAN: Oh, va bene. Così non si va al di sotto di 0, ma ricorda, in versione uno, il originale versione corretta non è andato al di sotto di 0 indifferente. Quindi ricorda che questa è la versione corretta. Quindi cerchiamo di almeno confrontare le due versioni corrette. Che cosa è un argomento a favore della versione due che sono, mmm, meglio? Si '? PUBBLICO: Utilizza meno spazio. DAVID J. MALAN: Okay, in modo che utilizza meno spazio, giusto? Considerando che una versione usata 32 bit per n, e poi un altro 32 bit per i. Versione due utilizza solo 32 bit per n, in modo che sembra essere un vantaggio. Altri pensieri? Qualcuno ha voglia di argomentare a favore di uno? Si '? PUBBLICO: Devi usare riga di codice per n -. DAVID J. MALAN: Va bene, certo. Ecco, questo è giusto. Quindi questo giusto, almeno per me - Voglio dire, questo si sente in realtà un po 'disordinato, il fatto che Non posso ordinare di incapsulare tutto il mio in una logica bella linea, il ciclo for, il ciclo for può. Ecco, io tipo di dover virare su questo n - alla fine del ciclo, perché è logicamente necessario. Ma che tipo di me strofina nel modo sbagliato, proprio perché sembra separata dalla logica di qui, anche se, ancora una volta, è necessario. Altri pensieri? Si '? PUBBLICO: [incomprensibile]. DAVID J. MALAN: Già. Così che cosa se, invece, alla fine della canzone, ha voluto stampare di nuovo il nome della canzone? Mi piace "Grazie per aver giocato 99 bottiglie di birra", o qualcosa del genere sciocco come questo? Ma il punto è, che chiedeva di poter accedere al valore originale. Il fatto che hai mutato o modificato in ogni n iterazione e quindi hanno distrutto il suo valore originale significa che non si può fare che alla fine. Ora, forse, è evidente che non si vuole fare che in questo programma. Quindi, chi se ne frega? Ma questo è un punto molto valido. E ad essere onesti, non c'è davvero nessuno proprio rispondere qui. Sono entrambi ugualmente corrette. Potrei essere convinto in entrambi i modi. Devo dire che, in generale, è un buon principio se si ha chiesto l'utente un certo valore e si è memorizzato in una variabile come n, solo una sorta di in linea di principio, è probabilmente una buona tenere che circa. E tutti i dati che si desidera mutare ancora e ancora, solo dare una copia di tale variabile, solo così che si hanno accesso all'originale. Si stanno spendendo 32 bit in più, ma la realtà è questa computer è, come, due gigabyte di RAM in questi giorni, e stiamo cavilli su 32 bit? Davvero non è un grosso problema. E anche su questo dispositivo qui, con un mezzo un concerto o di un gigabyte di RAM, 32 bit contro i 64 bit, non è un grosso problema. Certamente oggi, sta andando essere il modo sopraffatti dalla dimensione del programma stesso, che sta per essere diverse centinaia di kilobyte, se non pochi megabyte, in questi giorni. Preoccupazioni così ragionevole, una risposta giusta. Ma almeno questi sono i pensieri che dovrebbero contribuire alla passare attraverso la vostra mente? Perché in pset 0, anche se abbiamo davvero solo previsto correttezza, o almeno rinuncia vari bug che si potrebbe avere incontrato, come andare avanti, il design è sarà un altro aspetto fondamentale, sia di scrittura del codice e anche la nostra valutazione di codice. E così almeno dare pensato di cose come questa. E solo perché qualcosa funziona non significa che sia buono, non significa che è ben progettato. E questa è una delle cose che i compagni di insegnamento e di serie di problemi ci aiuterà a prendere in giro una parte nel corso del tempo. Beh, che dire, diciamo, questa versione qui? Vorrei fare qualcosa di un po 'sexy qui in un attimo. Prima di tutto lasciatemi sbarazzarsi di questo. E ora cerchiamo di risolvere il problema grammaticale. Quindi, in questa versione, voglio correggere la grammatica in modo che, piuttosto che dire s tra parentesi, come "bottiglia" o "bottiglie" - Io non voglio tagliare l'angolo - Voglio anche stampare in modo dinamico le "bottiglie" parola o "biberon", usando così questi segnaposto% s oggi. Quindi ho bisogno di controllare in modo condizionale qual è il valore di i. E se è 1, che voglio dire "bottiglia", e se si tratta di qualcosa altra cosa, voglio dire "bottiglie". Quindi cerchiamo di fare questo. Quindi, se i == 1, allora lasciatemi andare avanti e dichiarare - Ho bisogno di una stringa, per cui vorrei fare stringa s1, perché è la prima stringa che mi interessa in questo momento. Sto per dire "bottiglia". E poi, vediamo, stringa s2 - e ti spiego dove sto andando in un momento - "Bottiglie". Quindi ricordare che, in questa canzone, occorre essere in grado di stampare le cose, due parole diverse potenzialmente. Quindi, se guardiamo indietro qui, si noti che, quando si arriva a questo esempio qui ", due bottiglie di birra sul muro, due bottiglie di birra, prendere uno verso il basso, passa in giro ", voglio questa quarta riga per dire ora "una bottiglia di birra sul muro ". Così ho bisogno di decidere, voglio dire" bottiglie "o "Bottiglia"? Quindi ho intenzione di dire arbitrariamente, va bene, Ho intenzione di dichiarare una variabile chiamata ora s1, stringa uno, che sta per arrivare collegato qui e anche qui, perché quelle parole sono sempre identici, proprio a causa del natura del brano. E ho intenzione di chiamare s2 qualunque parola che voglio infine appaiono qui. Ora, letteralmente, 99 volte su 100, sta andando essere il stessa in entrambi i casi, perché 3 è plurale, 2 è plurale, 4 è plurale. Ma in questo caso angolo, dove si arriva a 2 e poi 1, o ancora 1 e poi 0, ho bisogno di questa logica. Quindi devo passare un po 'di tempo nel mio codice ottenere tale diritto. Quindi, se faccio questo, se i == 1, allora s1 posto uguale a "bottiglia" e s2 pari a "bottiglie", perché questo sarà per 1 bottiglia, e questo sarà 0 per bottiglie. E questo qui, che questo rappresenta? Giusto per essere chiari. Questo è solo un commento. Quindi il fatto che si può avere commenti a riga singola che si intende posso commentare il tuo codice come questo, ma un altro comune paradigma, anche, è che se si dispone di un super-breve frase che vuoi mettere se stessi ed è solo più leggibile per mettere è proprio alla fine della riga di codice, è possibile assolutamente fare una cosa del genere. Così ora che cosa se faccio questo? Altrimenti se i non è uguale a 1. Quindi è uguale a scoppio - punto esclamativo è conosciuto come "bang". Così botto = 1. Quindi, se i non è uguale a 1, cosa che invece voglio fare? Beh, la prima parola che voglio essere ciò? Così stringa 1 dovrebbe essere "bottiglie" per bottiglie plurali, e allora questo sarà plurale "bottiglie", così, per ora. E vedremo se questo diventa effettivamente ci dove vogliamo andare. Così ora se scorrere verso il basso qui, si noti che sto collegando Non solo io, ma s1. Sto collegando i e s1. E poi qui, sono meno 1, che è la stessa prima, ma s2. In altre parole, voglio che la parola inglese per cambiare in base su questa logica. Ora, ci sono già alcuni problemi in questo codice. Che cosa è rotto già fuori dalla porta qui? Si '? PUBBLICO: [incomprensibile]. DAVID J. MALAN: Esattamente. Così ho già violato la lezione di portata. Così ho dichiarato s1 e s2, ma l'ho fatto all'interno di parentesi graffe, il che significa, sì, questo codice funziona fino fino a riga 42, ma appena mi ha colpito linea 43, indovinate un po 'no non esiste più? Beh, indovinate un po 'non è più a portata - non s1 o s2. Quindi dobbiamo risolvere questo problema. Così mi permette di cancellare le dichiarazioni. E lascio i nomi delle variabili e cancellare questo qui ed eliminare questo qui. E in che linee devo davvero dichiarare queste cose? PUBBLICO: [incomprensibile]. DAVID J. MALAN: Sì, quindi probabilmente proprio qui, 33-ish. Così stringa s1 e poi stringa s2. E si scopre, posso farlo. Se si dichiara due variabili dello stesso tipo, si può effettivamente utilizzare solo una virgola e farlo in C. Tutti a destra, così ora ho due variabili - s1 e s2. Li sto assegnando i valori in questi condizioni qui, o qui. E poi io li sto usando in basso. Come bene è questo ora di andare a lavorare? Beh, è ​​ancora un po 'buggy, ma cerchiamo di vedere almeno quanto abbiamo ottenuto. Permettetemi quindi di andare avanti e fare beer3. E `la beer3? Sì, questo è beer3. E ora lasciatemi andare avanti ed eseguire beer3. 399 99. Possiamo probabilmente saltare la maggior parte di loro. E qui, guarda un po '. "Una bottiglia di birra sul muro, una bottiglia di birra, prendere uno giù, passare intorno, 0 bottiglie di birra sul muro. " Ma sto attirando la vostra attenzione solo la metà della soluzione. Tipo di fatto un casino qui. Così sembra che i casi d'angolo sorgono quando i è uguale a quello che due valori? PUBBLICO: 2, 1. David J. MALAN: 2 e 1. Non è 1 e non 1. E 'davvero solo queste ultime due strofe di questa canzone. Quindi cosa devo invece voglio fare? Così mi sembra di aver preso il caso in cui se i è == a 1, allora la prima parola è "bottiglia", ma la seconda parola è "bottiglie". Ma qui, voglio cambiare questo sia == 2. E se questo è il caso, che cosa voglio l' prima parola di essere? PUBBLICO: "bottiglie". DAVID J. MALAN: "Bottiglie", così per due bottiglie. E poi questa parola qui dovrebbe essere - PUBBLICO: "Bottiglia". DAVID J. MALAN: "Bottiglia", singolare. Va bene, cerchiamo di diminuire, torna qui, ri-eseguire make, re-run beer3, digitare 99 di nuovo. Okay, "Segmentation fault (core dumped)". Che cosa ho fatto di male? PUBBLICO: Non si dispone di un valore di [incomprensibile]. DAVID J. MALAN: Ah, ottimo punto. Va bene, allora cosa c'è di sbagliato? Quindi errore di segmentazione, e stiamo effettivamente andando a vedere questo bel paio di volte in futuro, deliberatamente. Ma per ora, cosa significa questo in realtà significa? Un errore di segmentazione quasi sempre significa che si deve in qualche modo ha cercato di accedere alla memoria, RAM nel computer, che non si è proprietari, che non hanno effettivamente chiesto alla sistema operativo per. Quindi, in questo caso, notare quello che ho fatto, che è viziata nella mia logica. Ho assegnato s1 e s2 un valore se i è uguale a 1. Ho anche fatto che, se i è uguale a 2. Ma non l'ho fatto nel numero infinito di altri possibilità - in particolare, 3 o 4 o dot, dot, dot, 99. Quindi una correzione per questo potrebbe essere solo andiamo hanno una condizione else. E lasciami andare qui e dire s1 è uguale a - che cosa dovrebbe essere qui? PUBBLICO: [incomprensibile]. DAVID J. MALAN: "Bottiglie", perché nel caso comune, è proprio la stessa cosa. Quindi è uguale a citazione, fine citazione, "bottiglie". Quindi, per il plurale bottiglie, e poi qui, per bottiglie plurali. Bene, ora lasciatemi tornare alla mia finestra di terminale, ricompilazione, ri-correre. 99. Whew. E facciamo un rapido controllo sanità mentale. Tecnicamente, si vorrebbe leggere tutti questi per assicurarsi siano corrette, ma diamo un'occhiata a meno i colpevoli noti. 3 bottiglie, 2 bottiglie, 2 bottiglie, 1 bottiglia, 1 bottiglia, 0 bottiglie. Ci sembra di aver risolto almeno per ora. Ma il fermo è che ciò che un pasticcio terribile dio questo è solo per risolvere uno stupido di un carattere particolare grammaticale. Quindi c'è una specie di ragione che ho tagliato questo angolo prima, perché è solo completamente fastidioso dover scrivere questo codice molto. Ma si scopre che ci sono modi un po 'più eleganti di esprime esattamente la stessa cosa. E possiamo farlo in questo modo. Vorrei lasciare questo sullo schermo per un momento e introdurre qualcosa di noto come un operatore ternario. Questa è una specie di one-liner che è solo lo scopo di rendere il nostro vive un po 'più sexy, come promesso. E ho intenzione di fare questo nel modo seguente. Dammi una stringa chiamata s1, e lasciami assegnare come segue. (I == 1)? "Bottiglia", "bottiglie" altrimenti. String s2 gets (i == 2)? "Bottiglia", "bottiglie" altrimenti. Allora, qual è allora la differenza? Queste due righe di codice, sostengo, può sostituire tutto questo casino. Così io lo chiamo un casino, proprio perché tipo di strofina me il modo sbagliato che sia tante righe di codice. Non male. Non è cattivo design. Come, questo è perfettamente corretto e perfettamente soddisfacente. Ma la codifica diventa noioso se si deve esprimere se stessi in modo accidenti specificamente ancora e ancora e ancora con un semplice scenario come questo. Quindi C ha alcuni tasti di scelta rapida, come questo. Quindi questa sostanza sta dicendo dichiarare una stringa chiamata s1 e assegnare sia questo valore o questo valore se i è == - scusate, dovrei dire più chiaramente. Dichiarare una variabile s1, si assegna il valore se questo è vero. In caso contrario, assegnare questo valore. In altre parole, questa è una sorta di una riga modo dicendo che se altro che fare un incarico lungo la strada. Quindi, se i è 1, poi andare avanti e chiamare questo "bottiglia". E allora questo altro, lo chiamano "bottiglie". Nel frattempo, s2, l' seconda parola che abbiamo bisogno di definire, se i è uguale a 2, faremo impostato s2 a "bottiglia". In caso contrario, impostarlo su "bottiglie". E che cosa questo significa che ora è che posso passare attraverso questa ed eliminare tutti le righe di codice. E quando dico, un po 'ridicolo, che questo è ora più sexy, è sexy in una sorta di senso stilistico. Il fatto che funzionalmente, questo codice è in realtà sta per fare la stessa cosa. E anche se potrebbe apparire un po 'criptico in un primo momento sguardo, perché non ho visto questo costrutto prima, mi piacerebbe sostengono che è in ultima analisi, sarà molto di più leggibile e molto più facile per noi esseri umani per ordinare di capire, perché ora si può solo leggere il codice tutto su una riga. E 'ancora simile nello spirito a un caso, in cui questo è il condizione e allora questo è quello che c'è dentro il se e il è quello che c'è dentro l'altro. Ma possiamo farlo solo molto più elegante. E se ora tornare al mio terminale, dopo aver cancellato tutti di queste linee e li ha sostituiti con solo quei due, ricompilare, re-run bottiglie di birra con 99, si noti che la mia grammatica è, infatti, ancora corretta. Quindi, di nuovo, qualcosa per iniziare. 2 bottiglie di birra, 1 bottiglia di birra. Guarda a destra. Gia '. Quindi non abbiamo una soluzione molto più succinta. Quindi anche questo, come si ottiene più a suo agio con la C, non necessariamente con il pset primo o addirittura secondo, ma si rendono conto che questi costrutti può permetterci di fare cose mai più elegante. Ora facciamo un'altra cosa qui. Lasciatemi andare avanti e aprire return1.c. Ora iniziamo a risolvere un altro problema in un modo che ci permette di scrivere codice più sofisticato. Quindi, ecco un semplice programmino il cui scopo nella vita è quello di incrementare i valori. E in realtà, facciamo un passo indietro. Vorrei farlo manualmente. Lasciami fare includere e int main (void). E fammi chiamare questo increment.c. E che cosa voglio fare? Ho intenzione di andare avanti e dire qualcosa del tipo - potremo chiamare i numeri lo stesso - x int. Quindi x int ottiene 2; printf x è% d, nuova linea, x. Così sto scrivendo in fretta, ma una sorta di roba familiare ora. Poi ho intenzione di fare x + +. Poi ho intenzione di stampare la frase stessa. E poi ho intenzione di restituire 0 solo per uscire dal programma. Va bene, quindi questo è un programma che incrementi di un numero. E 'prima di andare a inizializzare qualcosa a 2, e poi è intenzione di incrementarlo e stamparlo di nuovo. Quindi cerchiamo di eseguire incremento, programma incredibilmente semplice. Ma supponiamo ora che voglio cubo il valore, in modo da fare qualcosa di un po 'arbitraria. E io in realtà voglio fare x ottiene il cubo di esso. Così ho potuto usare quello che ha chiamato la funzione pow, ma non lo faccio davvero sapere dove si trova ancora. Quindi ho intenzione di farlo alla vecchia maniera. x volte che questo è uguale a x volte x volte x. Così sto elevando al cubo il valore, moltiplicandolo per se stesso ancora una volta e ancora e ancora, in modo da ottenere il potere di 3 in questo caso. Così ora i numeri che dovrei stampare dovrebbe essere, come vedremo qui - fanno incremento, quindi in realtà non è davvero incrementare più, ma lasceremo il nome da solo - 2 e poi 8. Ora, abbiamo l'inizio di una opportunità per la raffinatezza qui, per cui questa cosa cubatura di moltiplicare un numero di per sé per sé per sé si sente come questo potrebbe essere solo utile avere in funzione, proprio come qualcuno ha deciso anni fa - sai, tipo di utile se uno di noi si siede printf e scrive in modo che il resto del mondo può essere utilizzato, perché non ci sediamo e scrivere una funzione chiamata cubo che fa questo cubatura per noi, così non abbiamo manualmente attuare il concetto di cubatura valori qui? Quindi, un esempio semplice, ma andiamo avanti e utilizzare questo è come un opportunità di scrivere la nostra funzione. Quindi fino ad ora, abbiamo usato solo principale, e abbiamo usato altri funzioni delle persone, ma non hanno scritto la nostra. Quindi qui si va. Ho intenzione di andare avanti e scrivere una funzione chiamata cubo. E ho intenzione di farlo prendere un ingresso. Quindi il suo contributo sta per essere un numero intero. E che cosa sta andando a fare? E 'intenzione di dichiarare uscita int = ingresso tempi di ingresso tempi di ingresso. E poi sta andando a restituire l'output. E poi devo essere specifico momento. Questa funzione sta per restituire un int. Ecco allora come si sarebbe scrivere funzioni personalizzate. Per prima cosa decidere ciò che è il nome del tuo funzione sarà. E, in generale, qualcosa di esplicativo è buono, quindi mi chiamano cubo. Poi è necessario specificare che cosa sta per tornare, che cosa è la sua uscita sarà. E non abbiamo opzioni che molti ancora. Int, char, float, bool, string. Per ora, ho intenzione di attaccare con un int, perché lo voglio per restituire un numero intero. Poi si deve specificare quali sono i suoi ingressi, se presenti, sono. E se cubo prende un argomento, prende qualcosa tra parentesi, si deve dare tale argomento un nome in modo che si può chiamare qualcosa come si sta implementando o scrivendo questa funzione, e bisogna dargli un tipo, che in questo caso sta per essere int. Così, in breve, il cubo è una funzione che prende un numero intero come input e restituisce un intero come output. Allora che cosa fare con questo ingresso? Beh, in linea 14, dichiaro un'uscita variabile chiamata, e io assegnarle il valore, Ingresso volte orari di ingresso. E poi torno uscita. Allora, come faccio a usare questo, allora? Che cosa devo cambiare questi personaggi evidenziati on line 7 da, cosa ne pensi? PUBBLICO: [incomprensibile]. DAVID J. MALAN: Sì, così cubo di x. Quindi x è una variabile, il che significa che contiene un valore. Fortunatamente, è di tipo integer. E poiché x è un int, che significa che può passare in cubo. E anche se sto ignorando il valore di x con il valore di x cubo, come è avvenuto fino ad ora, ogni volta che si hanno segno uguale e una riga di codice, la roba a destra viene eseguito e poi viene assegnato al valore a sinistra. Quindi, l'ordine delle operazioni è come noi ci auguriamo. Così fa questo lavoro? Beh, fammi scendere qui. Vorrei aprire la mia finestra di terminale. Vorrei fanno incremento, Invio. "Dichiarazione implicita di 'cubo' funzione non è valida in C99. "Per inciso, C99 si riferisce al linguaggio C come era definito nel 1999, che era un aggiornamento rispetto alla versione da 1989, che è un aggiornamento rispetto all'originale. Ecco, questo è tutto ciò che i mezzi. Che cosa vuol dire che "la dichiarazione implicita di 'cubo' funzione non è valida? "E 'proprio qui. E 'proprio lì, in linea 12. PUBBLICO: [incomprensibile]. DAVID J. MALAN: Che cos'è? PUBBLICO: Non è prima. DAVID J. MALAN: Non è prima. Quindi questa è la cosa. C è una specie di stupido, o compilatori C sono un po 'stupido. Hanno davvero solo fare quello che dicono loro di fare. E loro, in particolare, solo leggere il codice in alto verso il basso, sinistra a destra. Quindi, se il compilatore, Clang, sta leggendo il codice, la linea 1, capisce come farlo. Oh, ecco che arriva principale. Ok, fammi andare avanti e dichiarare una variabile x. Vorrei stampare qualcosa. La linea 7, cosa diavolo è cubo? Non è dichiarata in stdio.h. Non viene con C. non ho idea di cosa fare. E così Clang bails giusto e si chiude con questo messaggio di errore. Così siamo in grado di risolvere questo problema in un paio di modi. Siamo in grado di insegnare ciò che Clang cubo è semplicemente spostando dove il dichiarazione. Così ho tagliato e incollato in cima principale. Ora si rendono conto che solo perché principale non è più in primo luogo, è comunque eseguito per impostazione predefinita. Principale è principale. E 'il nome della funzione di default. Non importa dove è in un file. Ma almeno ora Clang ha visto cubo prima di usarlo. Quindi cerchiamo di vedere se Clang è più felice ora. Fai incremento, è stato compilato questa volta. Vorrei correre incremento. E in effetti, sembra funzionare. Ora, si può trovare con scenari in cui alla fine non è possibile mettere ogni funzione di sopra di ogni altra funzione. Ti trovi in ​​difficoltà in questo ciclo infinito, in realtà, dove questo ragazzo vuole essere qui, ma questo ragazzo ha bisogno di essere lì. In modo che non sempre funziona. Quindi per fortuna, C ha una soluzione più elegante. Ho intenzione di mettere questo dov'era, solo perché mi preferisce, per una questione di principio, che la principale sempre nella parte superiore, perché è solo bello vedere quello che questo programma avviene per impostazione predefinita. E che cosa ho intenzione di fare qui è dichiarare quello che si chiama un prototipo. Ho intenzione di ri-dichiarare la mia funzione cubo letteralmente copia e incolla. In realtà, non è letteralmente. Così letteralmente copia e incolla linea 15 sopra la linea 6. Non importa quale linea questo finisce in. Capita di essere sulla linea 4. Ma deve essere per prima principale. Ma notare la differenza. Linea 4 finisce con un punto e virgola, il che significa ehi, Clang, prendere la mia parola che esiste una funzione chiamato cubo che prende un int e restituisce un int. Ma non ho intenzione di dirvi cosa si tratta ancora. E pensa che io prometto di dirvi alla fine. E in effetti, ora va bene che questo è al di sotto. Quindi questo è generalmente migliore, perché poi in cima il file, si può semplicemente snocciolare, fuoco rapido, una linea ciascuno, quali sono i nomi delle funzioni sono, quale sia il loro ingressi sono, quali sono le loro uscite sono. E per essere più chiaro, ingresso generalmente significa argomento o parametro, sinonimi. Uscita significa valore di ritorno, che cosa fa mano verso di me. Quindi, in questo caso di specie, il cubo è stato dichiarato in alto, ma definito, altrimenti noto come attuato, in basso. Così ora torniamo qui e ritornare al. Così ora lasciami andare avanti ed eseguire di fare, eseguire di nuovo incremento. Ed ora sembra funzionare bene. Così ora siamo in grado di andare avanti e scomporre qualcosa di simile al birra esempio in questa quarta versione. Permettetemi quindi di scorrere verso il basso qui. E notate che ho preso questo tipo di lezione a cuore in questo momento. Il fatto che stavo cantando la stessa strofa di nuovo e ancora e ancora, la linea stesso coro nella canzone, si sentiva piace perché non faccio fattore che fuori in una funzione? E in effetti, questo dovrebbe essere uno dei motivi. Oltre al fatto che qualcun altro al mondo potrebbe desiderare di utilizzare una funzione cubo - questo è un buon motivo per fattore qualcosa e scrivi il tuo propria funzione personalizzata - se c'è un pezzo di codice in un programma che fa solo senso concettuale, che tipo di vuole dare un nome - come in questo caso, coro - allora si può scrivere allo stesso modo che, come una funzione separata. Non c'è bisogno di scrivere tutto in main se solo si sente più pulito per separare fuori e dargli un nome. Quindi, in questo caso qui, si noti che ho un commento in cima questa funzione, che canta solo circa il numeri specificati di bottiglie. Si noti qui che non ho bisogno di chiamare questi cose di ingresso e uscita. In realtà, questa volta ho appena chiamato il mio b ingresso per bottiglia. E notare qui, nulla suggerisce che cosa? Questo coro - PUBBLICO: Non restituirlo. DAVID J. MALAN: non restituisce un valore. E in effetti, le funzioni non è necessario restituire i valori. Hanno appena può fare qualcosa. Essi possono avere i cosiddetti effetti collaterali, che in questo caso è solo un mucchio di stampa sullo schermo. Quindi notare che questo codice qui, ho letteralmente appena rubato l'esempio precedente. L'unica differenza è invece di usare i come mio variabile, ora sto usando b come la mia variabile. Così ho b qui, ho b qui, ho b meno 1 qui. Ma il codice è esattamente lo stesso. Ma solo per mostrarvi ora come possiamo usare questo, lasciami andare avanti e cambia in realtà si tratta di un ciclo for. for (int i = n, i> n, i -). Così ho rubato che dal nostro esempio precedente. In precedenza, è in linea 37 che avrei iniziato cantare questa canzone fastidioso. Ma invece, sto solo andando a call now coro di i. Fatto. Così ora in ogni iterazione di questo ciclo, io chiamo questo altro funzione, coro, che mi è capitato di scrivere. Non è stato scritto da qualcun altro anni fa. Ma coro, nel frattempo, utilizza printf per la stampa queste quattro linee. Ma il fatto che sto chiamando coro più e più volte in una ciclo vuol dire che ho intenzione di ottenere, alla fine, la esatto stessa canzone, come ho finora. Così, in breve, ora se mi guardo indietro al mio codice, anche se funzionalmente questo è equivalente, notare che è di partenza per ottenere ancora più leggibile. Io non so esattamente come GetInt è implementato. Francamente, io non so come coro è implementato. Ma non mi importa. Non mi interessa, perché ora posso sorta di, come un essere umano, leggere tale da cima a fondo. E perché le funzioni sono denominati in base a quello che do, il mio codice è sempre leggibile. E come i nostri programmi ottenere molto più complesso - entro la fine del semestre, è scriverò centinaia di linee di codice in linguaggi come PHP e Javascript e simili - vi accorgerete che è molto più facile che per tenere traccia di quello che hai fatto. E quando si inizia a collaborare con gli amici o partner o colleghi, sarete in grado di scrivere molto di più massicci programmi di iniziare l'allenamento di base questi nei moduli. Quindi, con questo detto, perché non si parla di un giorno? E ci vedremo il Mercoledì. [Applausi]