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