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