[Powered by Google Translate] DAVID J. MALAN: Va bene.
Questo è CS50, e questa è la fine della settimana due.
Se vi aspettate di avere fame in questo periodo di domani, sappiamo che stiamo andando
di convocare un piccolo gruppo domani, Giovedi, 1:15 PM.
C'è questo URL qui se vuoi RSVP.
Lo spazio è limitato, quindi ti prego di perdonare se il modulo è riempito per il momento si
compili questo.
Un altro URL però che possa essere di interesse è questo.
>> Quindi, in quasi un mese di tempo, il corso sta per essere messa a disposizione
tanto più in generale tramite edx, attraverso la quale la gente su Internet sarà
in grado di seguire, partecipare al corso abbastanza attivamente, in effetti.
Saranno utilizzando il CS50 e CS50 Appliance discutere e la maggior parte del
svariati strumenti software che già hanno utilizzato questo semestre.
E una delle iniziative vorremmo assumere come un esperimento di quest'anno
è quello di vedere quanto siamo in grado di tradurre i contenuti in altre parlato e
lingue scritte.
Quindi, se si potrebbe avere un interesse a partecipare a questo progetto, in base al quale
ci fornirà trascrizioni inglese e sottotitoli per il suo corso
lezioni e pantaloncini e seminari e sezioni e simili -
se si parla fluentemente o scrivere correntemente un'altra lingua, avremmo
l'amore di impegnarsi in questo progetto, per cui si prende uno o più dei
video, traducendoli in una lingua che si conosce abbastanza bene.
Per dare un senso di interfaccia, c'è questo web-based interfaccia utente
che useremo che creerà essenzialmente un utente come questo.
Questo mi stava insegnando un po 'di Halloween fa.
E sul lato destro c'è in nero accanto a queste indicazioni temporali,
vedrai le varie cose che sono uscite dalla mia bocca quel giorno.
E poi sotto, sarete in grado di tradurre in qualche altra lingua.
Esattamente la mappatura tra, in questo caso, inglese
e, diciamo, spagnolo.
Quindi è in realtà una molto user-friendly strumento.
È possibile tornare indietro e avanti veloce molto rapidamente con le scorciatoie da tastiera.
Quindi, se volete prendere parte a questo esperimento e sono le tue parole
visto e letto da potenzialmente migliaia di persone là fuori, per favore mi sento
liberi di partecipare.
>> Ora, una parola sul gattino da Lunedi, perché abbiamo inviato una troppo
messaggio di paura.
Si rendono conto che, come suggerisce l'orario di ufficio e, come suggeriscono le sezioni, il
progettazione del corso è molto di aver studenti collaborazione e
parlando di lavorare con set di problemi e problemi insieme.
E in realtà la linea è in fondo a, ancora una volta, il lavoro che in ultima analisi,
dovrebbe presentare dovrebbe essere il proprio.
E così è, in tutta onestà - in orario di ufficio, è del tutto normale -
è del tutto prevedibile, anche - di essere in chat con un po 'di
amici accanto a voi.
Se lui o lei è alle prese con qualche argomento, e siete come, oh, ben
di darvi un assaggio di qualche linea di codice che ho scritto.
Va bene.
Succede.
E questo è molto favorevole, credo che, con il processo di apprendimento.
Dove la linea, di nuovo, si è attraversato quando la testa è una sorta di inclinato sopra
qui per i secondi troppi o minuti che in realtà per avere solo
stata un'occasione di sblocco per il tuo amico.
E certamente, quando le cose si scambiate via e-mail e Dropbox e
simili, vi è anche la linea.
Quindi, con tutti i mezzi, sentirsi a proprio agio e si sentono incoraggiati a chattare con gli amici
e compagni di classe circa i pset e altro ancora.
E proprio rendersi conto che ciò che in ultima analisi, presenta in realtà dovrebbe essere il
prodotto della vostra creazione e non qualcun altro.
>> Quindi, nella stessa vena di creature coccolone, si potrebbe
conoscenza di questo ragazzo qui.
Quindi questo è un film terribilmente formaggio da anni fa.
Qualcuno qui visto Balle spaziali?
Bene.
Quindi, un buon numero qui.
Quindi questo è il nostro modo meravigliosamente accademico di introdurre oggi in ultima analisi
il concetto di crittografia.
E così uno dei problemi di dominio specifici per pset 2, che verrà
domani sera tardi, è quello di tuffarsi nel mondo della crittografia, che
è l'arte di crittografia o cifratura dei dati.
E questo si riferisce in ultima analisi, al mondo della sicurezza.
>> Ora di sicurezza per la maggior parte ci si presenta sotto forma di meccanismi piuttosto banali.
Tutti noi abbiamo nomi utente e password.
E tutti noi abbiamo nomi utente e le password molto male, molto probabilmente.
Se la password è la stessa su più siti web, che probabilmente non è
l'idea migliore, come vedremo verso la fine del semestre.
Se la password è scritto su un post-it - non è uno scherzo - sul
monitor, anche questo non è necessariamente il miglior design, ma piuttosto una comune
fenomeno.
E se non si sta usando la crittografia per crittografare le password, sono
particolarmente vulnerabili.
Quindi, se pensi di essere super intelligente da avere una parola nascosta
documentare qualche parte sul vostro disco rigido che ha tutte le password, ma
si trova in una cartella che non si sta andando a guardare dentro, anche questo non è molto
meccanismo sicuro.
E allora cosa pset 2 introdurrà è questa arte di crittografia e
scrambling informazioni in modo che cose come le password sono
tanto più sicura.
Al fine di motivare il problema del mondo reale con una molto non nel mondo reale
scenario, lasciate che vi presenti a uno dei nostri video preferiti qui da questa
film, Balle spaziali.
>> [RIPRODUZIONE VIDEO]
-Casco, è demonio, cosa sta succedendo?
Cosa stai facendo a mia figlia?
-Mi permetta di introdurre il chirurgo plastico brillante giovane, il dottor Philip
Schlotkin, il più grande uomo di lavoro naso in tutta la
universo e Beverly Hills.
-Vostra Altezza.
Nose-lavoro?
Non capisco.
Ha già avuto il naso.
E 'stato un dolce 16 presenti.
-No, non è quello che pensi.
E 'molto, molto peggio.
Se non mi dai la combinazione della protezione dell'aria, il dottor Schlotkin sarà
dare tua figlia il naso vecchio.
-No!
Dove l'hai preso?
-Va bene.
Lo dirò.
-No, papà, no.
Non devi.
-Hai ragione, mia cara.
Mi mancherà il naso nuovo.
Ma non voglio dire loro la combinazione non importa quale.
-Molto bene.
Dr. Schlotkin, fai del tuo peggio.
-Il piacere è mio.
-No!
Aspetta, aspetta.
Lo dirò.
-Sapevo che avrebbe funzionato.
Va bene, a me.
-La combinazione è uno.
-One.
-Due.
-Tre
-Tre.
-Quattro.
-Five
-Cinque.
-Quindi, la combinazione è uno, due, tre, quattro, cinque.
Questa è la più stupida combinazione che abbia mai sentito in vita mia.
Questo è il genere di cose un idiota avrebbe sul suo bagaglio.
-Grazie, Vostra Altezza.
-Che cosa hai fatto?
-Ho spento il muro.
-No, non l'hai fatto.
Si spense il film intero.
-Devo aver premuto il tasto sbagliato.
-Beh, è ​​rimesso in.
Mettere il filmato su.
-Sì, signore.
Sì, signore.
-Andiamo, Erna.
Vieni, Gretchen.
Naturalmente sai che avrai ancora per la fatturazione per questo.
-Beh, ha funzionato?
Dov'e 'la porta?
-Ha funzionato, signore.
Abbiamo la combinazione.
-Grande.
Ora possiamo prendere ogni ultimo respiro di aria fresca dal pianeta Druidia.
Qual è la combinazione?
-Uno, due, tre, quattro, cinque.
-Uno, due, tre, quattro, cinque?
-Sì.
-E 'incredibile.
Ho la stessa combinazione sul mio bagaglio.
Preparare Spaceball 1 per partenza immediata.
-Sì, signore.
-E cambiare la combinazione sul mio bagaglio.
-Ahi!
[END RIPRODUZIONE VIDEO]
>> DAVID J. MALAN: Un film incredibile si dovrebbe ora vedere tutti.
Quindi il contesto è che con i dati insicuri viene un'opportunità per
cifrare e ad esso scramble.
E così questo, per esempio, è un esempio di un messaggio crittografato.
Questo in realtà dice qualcosa in inglese.
Ma non è chiaramente del tutto evidente.
E torneremo al punto di oggi a prendere in giro a parte ciò che questo segreto
messaggio qui è.
Ma nel mondo reale dei computer, le cose non sembra nemmeno che potrebbero
essere frasi in inglese.
Per esempio, questo è quello che si potrebbe trovare su un Linux standard o Mac o
Unix in un file che è stato un tempo chiamato il file delle password.
Al giorno d'oggi, è stato spostato in altri luoghi.
Ma se si guarda al posto giusto su un sistema, si vedrà non solo la vostra
nome utente o quella di altre persone nel sistema, ma vedrete un
versione crittografata della propria password.
In effetti, la cripta parola ci suggerisce che la roba che segue è crittografato.
E questa serie di lettere apparentemente casuali e caratteri e numeri e
così via, possono essere decifrati solo generalmente conoscendo un segreto -
una parola segreta, un numero segreto.
E così in effetti, l'arte della crittografia in ultima analisi si riduce a fidarsi di alcuni
ordinare e conoscere qualcosa che qualcun altro non lo fa.
Di seguito verrà illustrato in dettaglio un po 'di più oggi e in pset a venire.
>> Ed ora una parola sul passaggio / sicuro.
Quindi, in particolare, come alcuni di voi hanno tuffò pset 1, l 'apparecchio, e
un mondo nuovo per lei, si rese conto che frustrazioni e
difficoltà di confusione e solo tecnico sono da aspettarsi.
Specialmente con l'pset prima, dove c'è solo così tanto nuovo, solo per
familiarità con ls e cd e tutti questi comandi arcani in un ambiente nuovo.
E che è separato dal materiale reale e la programmazione stessa.
Quindi rendersi conto, anche, che ci sono certamente ore di ufficio che esistono come
la struttura di supporto.
Sezioni iniziare il prossimo Domenica.
Ma la cosa più importante, se ti senti solo che questo non è il
mondo per voi, si rende conto che in realtà si limita a prendere tempo.
E se non fosse per l'occasione anni fa per me di prendere una classe
pass / fail, onestamente, non avrei mai nemmeno messo piede in classe.
E si può cambiare questo fino, diciamo, il Lunedi quinto corso.
Quindi, se siete sul bordo ora, si rendono conto che invece di testa in un altro
acque del tutto, non certamente in considerazione il solo cambio di pass / fail.
Anche in questo caso, non c'è davvero questa cultura qui a Harvard di prendere le cose
pass / fail dato che tutti vuole davvero raggiungere o otterrebbe.
Ma, francamente, questo è un modo meraviglioso di provare qualcosa che potrebbe non
essere familiare a voi.
E si finisce per fare nella maggior parte dei casi abbastanza bene, forse
molto per la vostra sorpresa.
E in termini più concreti, quello che penso pass / fail generalmente fa,
tanto più che si potrebbe avere sperimentato con pset 0, se hai messo
in 10 ore, 15 ore, 25 ore in alcuni pset - e tu sei solo battere
la testa contro il muro,
e sta diventando sempre eccellente a tarda notte,
ma hai preso la pset come il 90% della strada,
sai che proprio non riesco a capire una cosa -
pass / fail prende davvero il bordo al largo di una classe come questa, in cui è possibile ordinare
tranquillamente dire di bene, lo so che non è perfetto.
Ma ho lavorato il culo su questo.
Sono abbastanza contento di dove è finito.
E in grado di soddisfare le aspettative di pass / fail.
Quindi non tenere a mente.
>> Bene.
Così quelli di voi che hanno lottato per utilizzare la Harvard University Wi-Fi sapere
che c'è un SSID CS50, una connessione Wi-Fi che si girano
potrebbe avere più fortuna per.
E 'un po' ironico che la password per questo - se si desidera provare
il collegamento a questo per una migliore velocità e farci sapere se si tratta di niente di meglio -
è uno, due, tre, quattro, cinque, tutta la strada fino a otto perché otto è
più sicuro di cinque.
Quindi, se avete bisogno di password Wi-Fi, la connessione a CS50 wireless qui.
Uno, due, tre, quattro, cinque, sei, sette, otto.
E messaggi il CS50 Discutere se avete ancora problemi di connettività intermittente,
e ti faremo i poteri che sanno essere per questo spazio.
>> Bene.
Quindi un teaser rapida, soprattutto per quelli di voi che sono ragazzi o ragazze fan
di tutte le cose di Apple.
Quello che ho riesumato da qualche anno fa era questo file qui, ilock.c, solo per
tipo di rendere più concreto e più complesse alcune delle C più fondamentale
programmi che abbiamo scritto.
Così ho aperto questo file, ilock.c.
E 'disponibile nella pagina lezioni per oggi.
Sulla sinistra, si vede un lungo elenco di funzioni.
Quindi il tizio che ha scritto questo ha scritto un sacco di funzioni,
più appena principale.
Ha usato un sacco di librerie qui.
E se si parte scorrere, di cosa si tratta in realtà è l'esatto
in primo luogo, io credo, crack per l'iPhone originale.
Quando si voleva per il jailbreak di iPhone originale, il che significa che untether
da AT & T e in realtà installare un software speciale su di esso e fare le cose
che Apple non voleva che la gente da fare -
Beh, qualcuno ha avuto il tempo di capire esattamente come si può sfruttare
difetti del software, errori, bug nel software di Apple.
E così è nato ilock.c.
Che se è stato compilato su un computer e installato su un iPhone che
è stato collegato al computer tramite, per esempio, un cavo USB, questo darebbe
privilegi di amministratore o di root sul vostro iPhone e ti permette di fare più o meno
quello che vuoi.
>> E così c'è stato questo gatto affascinante e topo tra Apple e
il resto del mondo, in particolare in quanto, come molte aziende, cercano di bloccare
le loro cose in modo che si può fare solo con essa ciò che intendono.
Ma grazie a gente come questa e la loro comprensione di basso livello
i dettagli e, in questo caso, di programmazione C e un sacco di costrutti familiari
che abbiamo iniziato a giocare con, si è in grado di sfruttare davvero il
hardware in modo si vede in forma e non necessariamente una qualche entità aziendale.
Così, per esempio, non ho idea di che cosa tutto questo sta facendo.
Ma GetVersion sembra abbastanza semplice.
E sembra che questa è una funzione che questa persona ha scritto.
Prendete un po 'tipo di numero intero come argomento, non restituisce nulla, ma
sembra loop con un ciclo for qui e una condizione if, se la condizione,
rottura, e si riferisce in qualche modo i numeri di versione.
Se scorrere verso il basso -
anche se molte di queste parole chiave stanno per essere nuovo, e c'è una
bel po 'di funzioni in qui non abbiamo mai visto e forse non mai vedere oltre
corso del semestre -
alla fine della giornata, segue le stesse regole e la logica che ci sono già stati
gioca con finora.
Quindi questo è di gran lunga troppo vecchio per risolvere i vostri iPhone o 3s 4s 5s o poco, in questi giorni,
ma so che è tutto molto derivato da questo mondo che abbiamo
si tuffò.
>> Quindi diamo un'occhiata a un esempio po 'più semplice.
Questo, solo per ottenere riscaldato con qualche sintassi e anche alcuni altri dati
tipo che abbiamo parlato, ma non hanno davvero visto in C. Quindi questo è un
file chiamato positive1.c.
E per i commenti in alto, ciò richiede solo che un utente di fornire un
numero positivo.
Quindi è un esempio di un ciclo do-while, che è bello per l'utente interattivo
programmi in cui è necessario indicare all'utente di fare qualcosa.
E se non collaborano, è urlare contro di loro o rifiutare il loro ingresso.
Caso in questione, ho intenzione di fare le linee 19 a 24 a condizione che l'utente ha
Non mi ha dato un numero positivo.
Ora questo dettaglio qui sulla linea 18, perché dichiaro n sopra tutto questo
costrutto loop al contrario di proprio accanto alla linea 22 dove ho
in realtà la cura per ottenere n?
Si '?
[Incomprensibile]
>> DAVID J. MALAN: Sì, così la questione del campo di applicazione.
E in termini profani, cosa portata riferisce?
Si '?
[Incomprensibile]
DAVID J. MALAN: Si può parlare un po 'più forte?
SPEAKER 1: Dove è possibile accedere a una particolare variabile.
DAVID J. MALAN: Perfect.
Dove è possibile accedere a una particolare variabile.
E, in generale, la regola pratica finora è stato che la portata di alcune
variabile è definita dalle parentesi graffe più recenti che avete visto.
E così, in questo caso, se ho fatto l'errore di dichiarare n sulla linea 22,
quella linea avrebbe funzionato.
Vorrei avere un int, e io la metterei in quella variabile n in linea 22.
Ma quale riga di codice che ora non hanno alcuna idea di cosa sto parlando?
Quindi 25, e si scopre 24, nonché, in quanto in questo caso, non rientra
delle parentesi graffe.
Quindi, solo un po 'di una seccatura, ma molto facilmente risolto limitandosi a dichiarare
l'esterno variabile della funzione stessa.
>> Ora vedremo più tardi di oggi, si può fare un passo avanti.
E si potrebbe anche ottenere un po 'pigro -
e questo non è da raccomandare, in generale -
ma si potrebbe anche ottenere pigro e mettere una variabile globale, per così dire, non
all'interno di una funzione, non all'interno di un ciclo, ma nel file stesso, fuori
di tutte le funzioni che hai scritto, come ho fatto qui sulla linea 15.
Ma questo è generalmente malvista.
Ma realizzare questa è una soluzione a volte ad altri problemi, come vedremo
finalmente vedere.
Quindi, per ora, ci lasciamo così.
Ma vediamo se siamo in grado di riscrivere questo solo per iniziare a esprimere noi stessi un
po 'diverso.
>> Quindi questo programma, tanto per essere chiari, è positive1.
Lasciami andare avanti qui e nella mia finestra di terminale fare positive1, Invio.
Compila, va bene.
Io vado a correre positive1, premete Invio.
Esigo che tu mi dia un numero intero positivo.
Dirò -1.
Non ha funzionato.
0, 99, che sembra funzionare.
Forse non la prova più rigorosa.
Ma almeno è un controllo di integrità bello che siamo sulla strada giusta.
Così ora lasciami andare avanti e aprire la versione due di questo.
E ciò che è diverso già?
Essa attua la stessa cosa.
Ma ciò che salta fuori il più chiaramente diverso questa volta?
Gia ', quindi questo bool in verde.
Gedit è evidenziata in verde questa parola chiave conosciuto come bool,
che è un tipo di dati.
Non viene integrato in tutte le versioni di C. È necessario includere un
specifica libreria.
Nel nostro caso, ho inserito il CS50 biblioteca in modo che si
hanno accesso a bool.
Ma in linea 18, ci sembra di avere un valore booleano che qui chiamano grati.
Così ho potuto chiamare questo nulla.
Ma ho chiamato grato solo per tipo di trasmettere un significato semantico.
Quindi inizialmente sulla linea 18, non sono evidentemente grato perché il
Valore booleano grato è inizializzato a false nella riga 18.
E poi sembra che quello che ho fatto nelle linee da 21 a 23 è che ho appena
tipo di riscritto la mia logica.
Quindi non funzionalmente diversi.
Ma in linea 22 ora, verificare se l'int l'utente ha fornito è maggiore di
0, allora ho semplicemente cambiare il valore di grato a true.
E perché dovrei farlo?
Perché in linea 25, a quanto pare, ho intenzione di verificare una condizione.
Fate questo ciclo while è falsa grati.
>> Quindi vi propongo questo come alternativa alla versione uno perché è almeno un
po 'più intuitivo, forse.
E 'un po' più a terra in lingua inglese.
Quindi, eseguire le seguenti operazioni mentre non si è grati o mentre grato è falso.
E anche questa volta, mi pare non si cura di ricordare ciò che l'utente ha digitato
perché nel bando non c'è n variabile.
Quindi, in realtà, io -
una piccola bugia bianca lì.
Punto di vista funzionale, il programma è un po 'diversa una volta che andare a fondo di
perché non mi ricordo che cosa è n.
Ma ho voluto dimostrare anche qui che, anche se abbiamo visto e GetInt
GetString utilizzato sul lato destro di un segno uguale finora in modo che
ricordiamo il valore, tecnicamente, non è strettamente necessario.
Se per qualsiasi motivo non solo la cura per salvare il valore, si vuole solo
per controllare il valore, si noti che possiamo semplicemente scrivere questo come GetInt aperto
parentesi, parentesi vicino.
Tale funzione sta per restituire un valore, come abbiamo detto.
E 'intenzione di dare indietro un int.
E quindi se mentalmente pensa che ciò accada, quando digito nel 99, GetInt
restituisce il numero 99.
E così concettualmente, è come se il mio codice erano in realtà questo.
Quindi, se il 99 è effettivamente maggiore di 0, quindi grato diventa vero.
Poi linea 25 si rende conto ooh, abbiamo finito, perché ora sono grato.
E in linea 26, diciamo semplicemente, ringrazia per il numero intero positivo, qualunque cosa
capitato di essere.
>> Ora facciamo una leggera zucchero sintattico qui, per così dire.
Vediamo se riusciamo a ripulire questa linea 25 con la terza e ultima variazione
in positive3.
Quindi, nota la differenza solo ora è quello che riga di codice?
Gia ', quindi 25.
E non abbiamo veramente visto questo trucco ancora.
Ma abbiamo fatto vedere il punto esclamativo il Lunedi, il che denota che cosa?
Quindi non, o negazione.
Così ha un valore booleano e capovolgere il suo valore.
Vero diventa falso.
False diventa vero.
Quindi questo, vorrei proporre, è anche un po 'più intuitivo di un modo di
la scrittura del codice, perché ho ancora inizializzare grato a false.
Ho ancora effettuare le seguenti operazioni.
Ho impostato grato a true quando sarà il momento.
Ma ora si può davvero solo tradurre questo codice verbalmente da sinistra a destra,
mentre non grata.
Perché bang, o un punto esclamativo, denota la nozione di non, così, mentre
non grata.
>> Quindi, di nuovo, non abbiamo introdotto nuovi concetti di per sé.
Abbiamo parlato di valori booleani indietro quando abbiamo giocato con Scratch.
Ma conto ora possiamo solo iniziare a scrivere il nostro codice in
molti modi diversi.
Quindi, soprattutto in pset1, se siete una sorta di fatica a capire il modo di
scrivere qualche programma, le vincite sono siete fortunati perché non ci sarà alcuna
numero di soluzioni che possono accadere al momento.
Per esempio, questo è solo per tre anche il più semplice dei programmi.
Bene.
E ora ricordo il Lunedi, abbiamo lasciato su questa nota con valori di ritorno.
Così, per la prima volta, abbiamo scritto un programma che non solo principale,
ma ha anche una sua funzione personalizzata che ho scritto qui.
Quindi, in linea da 31 a 34, ho implementato una funzione cubo.
Non è complessa.
E 'solo a volte a volte a, in questo caso.
Ma ciò che è importante a questo proposito è che sto prendendo l'input sotto forma di un e
Sto tornando uscita sotto forma di volte a volte a.
>> Così ora ho la possibilità, proprio come facevo con printf da solo, per chiamare
questa funzione chiamando la funzione cubo.
E la funzione cubo richiede un input.
E la funzione cubo restituisce un output.
E così al contrario, printf appena fatto qualcosa.
Essa non ha restituito tutto ciò che abbiamo a cuore - anche se, come
a parte, lo fa restituire un valore.
Basta generalmente ignorarlo.
Printf appena fatto qualcosa.
Esso aveva un effetto collaterale di stampa sulla schermata.
Al contrario qui, abbiamo la funzione di cubo, che
restituisce effettivamente qualcosa.
>> Quindi questo è in genere -
per chi ha familiarità con questo, è una idea abbastanza semplice.
Ma per coloro che hanno meno familiarità con l'idea di passare in input e ottenere
uscite posteriori, proviamo solo semplice qualcosa di super.
C'è qualcuno che sta comodo in arrivo sul palco per breve tempo?
Devi stare bene con una macchina fotografica su di te, pure.
Gia '.
Ok, come ti chiami?
KEN: Ken.
DAVID J. MALAN: Ken.
Va bene, Ken.
Vieni su.
Quindi Ken sarà una funzione della specie qui.
E andiamo avanti e farlo.
Prendiamo un po 'di fantasia.
Lieto di vederla.
Benvenuti al centro della scena.
Bene.
Che ha colpito questo pulsante qui.
Bene.
Così qui avete una lavagna moderna.
E quello che sono è la funzione principale, per esempio.
E non ho un iPad in mano.
Non mi ricordo come - beh, in realtà, non si può dire che.
Io in realtà non hanno una buona scrittura.
E così dunque, voglio di stampare qualcosa sullo schermo per me.
>> Così sto è il programma principale.
E io sto per avere voi dite questo, scrivendo nel mio pollo e graffi
quindi si passa un ingresso.
Così come stupido se questo esercizio è, il concetto di funzioni e chiamare un
funzione e restituire una funzione davvero si riduce a questo.
Sono principale.
Ho appena scritto printf ("qualcosa") sullo schermo.
Sono in esecuzione di questo programma.
E non appena printf viene chiamato, ci vuole un argomento - o un parametro,
a volte -
tra virgolette.
Ecco questo argomento.
Lo sto passando a Ken.
Ora è una scatola nera scritto un certo numero di anni fa, che a quanto pare
solo sa come stampare le cose sullo schermo.
>> Quindi, eseguire.
Non è male.
Quindi, molto buono.
Così ora Ken è fatto in esecuzione.
Ha bisogno di darmi nulla in cambio?
Quindi non che abbiamo visto finora.
Anche in questo caso, printf in effetti restituisce un numero.
Ma stiamo andando a ignorare che per il momento, perché non l'abbiamo mai usato.
Ecco, questo è esso per Ken.
E così ora principale torna per l'esecuzione -
principale prende il controllo del programma di nuovo perché quella riga di codice,
printf, è fatto in esecuzione.
E si va il nostro modo di esecuzione qualunque altre linee ci sono.
>> Bene.
Ora proviamo un esempio leggermente diverso.
E questa volta qui, si deve prima cancellare la schermata qui.
E questa volta, faremo la funzione di cubatura.
Ma questa volta, mi aspetto un valore di uscita.
Quindi cerchiamo di andare avanti e farlo.
Così ora ho una riga di codice che dice che x = cubo (x).
Quindi in realtà let's -
la riga di codice, richiamo, simile a questa.
x = cubo (x).
Così come è questo di andare a lavorare?
Quindi cerchiamo di andare avanti e dare uno schermo bianco di nuovo.
E sto per scrivere ora verso il basso il valore di x, che in questo momento
il tempo sembra essere, diciamo, 2, per mantenere le cose semplici.
Così ho scritto su un pezzo di carta il valore di 2,
che è il mio valore x.
L'ho mano a Ken.
KEN: E ho appena scrivere la risposta?
DAVID J. MALAN: Sì, facciamo solo scrivere la risposta.
Va bene.
E ora deve restituire qualcosa.
So -
perfetto.
Segue Nizza.
>> Così ora mi porge nuovamente il valore di 8, in questo caso.
E cosa devo fare con esso?
Beh, in realtà, vediamo.
Ottieni questo diritto.
Cosa devo fare con esso?
Ora sto andando a prendere questo valore e in realtà conservare in quelle
stessi bit in memoria.
Ma notate, io sono una specie di lottare qui.
Sono un po 'confuso perché dove ho effettivamente scrivere il valore di x?
Perché quello che ho appena fatto è fisicamente Ken mano un pezzo di carta
che ha il valore 2, che era x.
E in effetti, questo è esattamente ciò che accade.
Così si scopre che quando si chiama una funzione, e si passa in una discussione
come "ciao mondo" o si passa in una discussione come 2, in generale, si è
passando in una copia di tale argomento.
E così come ho scritto il numero 2 qui e la porse a Ken, che deve
significa che ho ancora una copia del valore 2 da qualche parte.
Perché in effetti, ora che ho ottenuto di nuovo il valore 8, ho bisogno di tornare in
RAM ed effettivamente scrivere 8, dove una volta ho avuto il numero 2.
>> Quindi visivamente ricordare questo concetto di passaggio in letteralmente
una copia del valore.
Ken fa la sua cosa, mi porge indietro qualcosa - in questo caso,
un valore come 8.
E poi devo fare qualcosa con quel valore, se io
vogliono mantenere in giro.
Quindi, tutto questo sarà fin troppo familiare in breve tempo.
Grazie mille per questa demo qui, Ken.
Bene.
Molto ben fatto.
Quindi cerchiamo di vedere come in ultima analisi, che si riferisce ad alcune delle funzioni
da visita che abbiamo fatto qui.
Permettetemi quindi di andare avanti e ci riportano l'esempio cubatura qui.
E notare che, se vogliamo iniziare effettivamente l'assunzione di questo ulteriore, stiamo andando
di essere consapevole del fatto che il numero x che viene passato
qui è diverso da quello che è effettivamente passato alla funzione.
Quindi, di nuovo, il passato per copia sta per diventare molto
germano in un attimo.
>> Quindi diamo un'occhiata a qualcosa che non tutto funziona bene ancora.
Ho intenzione di andare avanti e aprire un terzo esempio buggy, che
è viziata dalla natura.
E si chiama buggy3, e implementa una funzione di scambio.
Quindi qui abbiamo una funzione principale che è x e y arbitrariamente inizializzato a
1 e 2, rispettivamente.
Potremmo usare GetInt, ma abbiamo solo bisogno di un semplice esercizio.
Quindi è difficile codificato come 1 e 2.
In linee 21 e 22, che apparentemente stampare x ed y, uno per riga.
Poi, sulla linea 23, sostengo che sto scambiando questi valori, punti, puntini, puntini.
Mi pare chiamare una funzione in linea 24 chiamata di swap
che accetta due argomenti.
E 'del tutto legittimo per le funzioni di prendere due argomenti.
Abbiamo visto printf lo fanno già.
Quindi scambio prende apparentemente x e y.
E come suggerisce il nome, mi auguro che sta andando a
scambiare questi due valori.
Allora io sostengo sulla linea 25, scambiati.
E io ristampare x e y sotto l'ipotesi che
hanno infatti state scambiate.
Ma se in realtà ho eseguito questo programma -
vorrei aprire una finestra di terminale.
Permettetemi buggy3.
Come suggerisce il nome, questo non sta andando a finire bene.
Perché quando premere Invio, si noti che x è 1.
y è 2.
E ancora alla fine del programma, sono ancora, infatti, lo stesso.
>> Quindi, basata sulla dimostrazione poco fa con Ken, cosa sta realmente succedendo?
Bene, vediamo di tuffarsi in questa funzione di scambio.
E 'super breve.
Sono solo poche righe di codice lungo.
Ma qual è il problema fondamentale basato sulla storia semplice che racconta
qui con Ken?
Perché è rotto di swap?
[Incomprensibile]
Esattamente.
Quindi stiamo memorizzazione su una copia non, la variabile stessa.
In altre parole, scambio apparentemente prende due argomenti, un int.
Ed è arbitrariamente chiamato a e b.
E qui, ho passato in x ed y, che sono rispettivamente 1 e 2.
Ma non sto letteralmente passando x.
Non sto letteralmente passando y.
Sto passando una copia di x e una copia di y.
E 'come quasi come se è stato copiato e incollato in scambiare i valori che
si desidera manipolare effettivamente.
Quindi, se questo è il caso, quando io, il programma, avviare l'esecuzione
linea 35, poi 36 -
quando arrivo a riga 37, a questo punto della storia, qual è il valore di un?
A questo punto della storia, riga 37, che è il valore di a questo punto?
Così dovrebbe essere solo 1.
Giusto?
Poiché x è stato passato come primo argomento.
E questa funzione è sufficiente arbitrariamente sta chiamando il suo primo argomento, a.
Allo stesso modo è y, il secondo argomento.
Ed è solo arbitrariamente chiamando il b secondo argomento.
>> Ora, questa dicotomia è in realtà abbastanza semplice spiegato.
Pensateci.
Nessuno di noi ha incontrato la persona che ha scritto printf.
Quindi sicuramente, lui o lei non ha idea di quello che le nostre variabili 30 anni dopo si sta
di essere chiamato.
Quindi ci deve essere una distinzione tra ciò che voi chiamate le variabili in
funzioni che stai scrivendo e ciò che chiamate variabili in funzioni siete
chiamata o utilizzando.
In altre parole, ho scritto le mie variabili come x e y.
Ma se qualcun altro aveva scritto la funzione di scambio, lui o lei certamente
non so quello che i miei variabili stanno per essere chiamati.
Così si rendono conto che questo è il motivo che ha questa dualità di nomi.
Tecnicamente, potrei fare questo per caso.
Ma sarebbe ancora passata in tante copie.
Sarebbe solo una pura coincidenza esteticamente se la persona che ha scritto
di swap aveva usato gli stessi nomi.
>> Bene.
Quindi, a questo punto della storia, riga 37, a è 1.
b è 2.
E ora procedere per scambiarle.
Prima di tutto, vorrei effettivamente fare questo molto più semplicemente.
Non so che cosa quelle tre righe di codice sono state facendo.
Vorrei solo fare questo.
b ottiene un.
ottiene un b.
Fatto.
Perché è rotto, logico?
È un po 'la cosa intuitiva, giusto?
Così diventa un b.
E diventa un b.
Ma il problema è che, non appena la linea 37 viene eseguito, qual è la
valore di a e b?
Lo stesso, 1.
Poiché tu hai rovinati, per così dire, hai cambiato b corrisponderanno a.
Quindi una volta che la linea 37 viene eseguito, che è grande.
Si dispone ora di due copie del numero 1 all'interno di questa funzione.
Quindi quando si dice in linea 38, un b si, beh, sei una specie di vite.
Perché sei solo assegnando 1 a 1.
Hai perso il tipo di valore che si interessava.
>> Quindi, nella versione originale di questo, nota quello che ho fatto.
Ho invece avuto una terza riga di codice che si presentava così.
Dichiaro una variabile temporanea - tmp è un nome molto comune
per una variabile temporanea.
Si tratta di un int, perché deve corrispondere a ciò che voglio fare una copia di.
Devo conservare una copia di un interno di tmp. Quindi una volta che la linea 37 è stato eseguito,
il valore di a è -
sanity rapido check -
1.
Il valore di b è 2.
E il valore di tmp è anche 1.
Così ora eseguo linea 38.
Quindi, una volta eseguita la linea 38, assume un valore di b.
E b era 2.
Quindi un ora 2.
Quindi, a questo punto della storia, è un 2, b è 2,
e tmp è 1.
Così ora logicamente, possiamo solo valore di tmp plop in b.
E abbiamo finito.
>> Così abbiamo risolto il problema.
Purtroppo, quando si esegue il programma in questa forma, in realtà non scambiare
tutti i valori.
Ma per essere chiari, perché?
Ho risolto il problema logico da un momento fa.
Ma ancora una volta, se si esegue il programma, x e y restano invariati per la fine del
esecuzione del programma.
[Incomprensibile]
DAVID J. MALAN: Quindi non sono tornati nulla.
Ecco, questo è vero.
Ma si scopre c'è un po 'un problema qui, perché fino ad ora, il
unica cosa che siamo stati in grado di tornare è una cosa.
E questa è una limitazione di C. È possibile tornare veramente un valore,
in questo caso, sono un po 'bloccato qui
perché ho potuto restituire il nuovo valore di x oppure avrei potuto restituire il
nuovo valore di y.
Ma voglio che sia indietro.
Quindi ritorno non è la soluzione più semplice qui.
Ma il problema è fondamentalmente il motivo?
Cosa abbiamo scambiato?
ae b.
Ma a e b sono copie di x e y, il che significa che abbiamo appena fatto tutto questo
lavoro - come abbiamo appena trascorso tre minuti parlando dello swap
funzione e tutte e tre queste variabili.
E questo è grande, perfettamente corretto in isolamento.
Ma un e ambito di applicazione b è solo in queste righe qui.
Quindi, proprio come un ciclo for, se si dichiara un intero i all'interno di
loop - allo stesso modo, se si sta dentro dichiara a e b di una funzione che
che hai scritto, sono validi solo all'interno di tale funzione.
Il che significa che non appena swap viene fatto in esecuzione e si va dalla linea 24 a
linea 25, X e Y non sono state cambiate.
Hai appena sprecato un sacco di tempo scambiare copie di variabili.
>> Così si scopre che la soluzione a questo è in realtà non ovvio.
Non è del tutto sufficiente per restituire i valori, perché possiamo
solo restituire un valore.
E davvero si vuole fare swap sia x e y al tempo stesso.
Quindi stiamo andando a tornare a questo.
Ma per ora, si rende conto che il problema deriva fondamentalmente dal fatto
che a e b sono copie.
E sono nel loro spazio proprio.
Bene, cerchiamo di risolvere questo problema in qualche modo.
Vorrei in realtà scorrere di nuovo qui e di aprire, diciamo, una quarta variante
di questo, buggy4.
E che dire di questo?
Si tratta di un problema simile ma più semplice da guardare prima di prendere una pugnalata a
risolverlo.
Questo programma si chiama incremento.
E a quanto pare inizializza un numero intero x a 1 in linea 18.
Ho poi l'affermazione X è 1.
Ho poi un'indicazione di incremento, punto, punto, punto.
Ho quindi chiamare incremento.
Ma poi nelle linee 22 e 23, io sostengo che è stato incrementato.
Io sostengo x ora è quello che è, 2 presumibilmente.
>> Ma questo programma è bacato.
Qual è il problema?
Si '?
[Incomprensibile]
DAVID J. MALAN: Esattamente.
Quindi x è stata dichiarata, ovviamente, sulla linea 18.
Questo è all'interno delle parentesi graffe principale.
Quindi la risposta semplice è che, beh, x esiste qui.
Non esiste in linea 32.
Quindi questo programma in realtà non sarà nemmeno la compilazione.
Il compilatore, quando provare a compilare questo codice, sta per urlare contro di me
su alcuni identificatore non dichiarato o qualcosa in tal senso.
Infatti, proviamo.
Questo è fare buggy4.
Eccolo.
L'uso di x identificatore non dichiarato in linea 32.
E in realtà, cerchiamo di essere più esplicito qui oggi, in modo che questo sia utile per
orario di ufficio e in casa.
Si noti che è un po 'criptico scritto.
Ma il fatto che Clang ha urlato contro di noi, dicendo:
buggy4.c: 32:5, è effettivamente utile.
Significa che l'errore è sulla linea 32 alla posizione del carattere cinque.
Quindi uno, due, tre, quattro, cinque.
Questo è, infatti, dove il problema è.
E anche da tenere a mente in orario d'ufficio, a casa, sono fortunato qui.
Ho un errore.
E 'intenzione di essere relativamente facile da risolvere.
Ma se si ottiene uno schermo pieno di messaggi di errore travolgente, ancora una volta,
si rendono conto che quello in basso potrebbe essere solo sintomatico di
quelli più in alto.
Quindi, sempre inseguire i bug dal basso in alto.
Perché ci potrebbe essere solo una margherita-catena di effetti che ti sta suggerendo
hanno problemi più di quanto effettivamente fare.
>> Quindi, come possiamo risolvere questo problema se il mio obiettivo è quello di incrementare x?
Che cos'è?
Va bene.
Così possiamo fare x globale.
Prendiamo la scorciatoia che ho avvertito in precedenza.
Ma diamine, abbiamo solo bisogno di una soluzione rapida.
Quindi, diciamo solo che x int qui.
Che fa x globale.
Così ora principale ha accesso ad esso.
E incremento ha accesso ad esso.
E così mi permetta di andare avanti e compilare questo ora.
Fai buggy4, Invio.
Sembra da compilare al momento.
Corriamo buggy4, e sembra funzionare davvero.
Ora, questa è una di queste cose -
fai come ti dico, non come faccio io, come ho appena fatto qui.
Perché, in generale, i nostri programmi stanno andando ottenere molto più interessante e
molto più a lungo.
E se la soluzione ai problemi della vita è solo ah, mettere tutti i
variabili nella parte superiore del file, molto velocemente fare programmi ottenere
terribilmente difficile da gestire.
Diventa sempre più difficile pensare a nuovi nomi delle variabili.
Diventa sempre più difficile capire quale variabile sta facendo cosa.
>> E quindi, in generale, questa non è una buona soluzione.
Quindi cerchiamo di farlo meglio.
Non vogliamo usare una variabile globale qui.
Voglio incrementare x.
Così ho potuto, ovviamente -
alla fine della giornata, è una specie di una storia stupida, perché abbiamo appena farlo.
Ma se io non lo sapevo che l'operatore, o non mi è stato permesso di
modificarlo in main sé, in quale altro modo avrei potuto implementare Ken qui, questa
tempo non per cubo, ma per incrementare?
Come faccio a cambiare questa cosa qui?
Gia '.
[Incomprensibile]
DAVID J. MALAN: Ok, bene.
Allora perché non mi passa a x?
E poi invece di tornare, perche 'non mi basta fare ritorno x + 1?
Ora, un paio di cose devono cambiare qui.
Sono sulla strada giusta.
Che altro ho bisogno di modificare?
Qualcun altro.
Si '?
[Incomprensibile]
DAVID J. MALAN: ho bisogno di cambiare il tipo di ritorno di incremento
perché non è nulla.
Void non significa nulla è da restituire.
Ma chiaramente, ora lo è.
Quindi, questo deve cambiare a int per essere coerente con ciò che
In realtà sto ritornando.
>> Ora ci sia ancora qualcosa buggy qui.
Si '?
[Incomprensibile]
DAVID J. MALAN: Così ho bisogno di incrementare x?
[Incomprensibile]
DAVID J. MALAN: Ah, quindi ho bisogno di passare x.
Quindi ho bisogno di fare questo qui.
Quindi il prototipo, devo cambiare questo qui.
Quindi questo deve diventare un int.
Questo deve diventare -
hmm.
Mi hanno fatto un bug qui.
Si può correggere prima.
Che cosa avrebbe dovuto in realtà essere?
Quindi è avuto modo di essere un qualcosa di int.
Potrebbe essere x.
Ma francamente, se si inizia a chiamare tutti i tuoi x variabili, sta andando per ottenere
sempre meno chiaro che cosa si tratta.
Così facciamo solo arbitrariamente scegliere una diversa convenzione di denominazione per il mio
funzioni di supporto, le funzioni che sto scrivendo.
Lo chiameremo a.
Oppure si può chiamare - chiamiamola even_number per essere ancora più esplicito.
Allora devo restituire ciò che il numero è più 1.
E ora devo cambiare una cosa qui e una
altra cosa qui.
Che cosa devo cambiare sulla linea 21 prima?
Devo assegnarlo a x.
Quindi non posso chiamare x incremento.
Ho bisogno di ricordare la risposta modificando il valore di x il
sinistra.
E anche se x ora è a sinistra e destra, che è totalmente bene perché
destra viene eseguito in primo luogo allora si lasciò cadere nella sinistra
mano cosa, x in questo caso.
E poi, infine, si tratta di una soluzione semplice ora.
Questo dovrebbe corrispondere solo ciò che è in basso.
Numero int.
>> Bene.
Quindi un sacco di modifiche per una funzione davvero stupida.
Ma rappresentante di cose che dovremo sempre più vogliamo fare.
Quindi, fare buggy4.
Ho fatto un casino da qualche parte.
Oh mio Dio.
Cinque errori, come, un bambino di sei-line del programma.
Allora, cosa c'è che non va sulla linea 18, il carattere 5?
Bene.
Quindi devo dichiarare questo int.
Bene.
Quindi cerchiamo di vedere, un sacco di altri errori.
Oh mio dio.
19, 18, 21.
Ma ancora una volta, facciamo solo cancellare lo schermo -
Controllo L qui - e re-run Clang.
Così cinque problemi in realtà è solo per quello.
Così ora corriamo buggy4, Invio.
Whew.
x è stato incrementato correttamente.
>> Bene.
Hai domande su come incrementare i numeri?
Si '?
SPEAKER 2: Perché è che si può cambiare solo x al numero nella variabile
il nome e ti so cosa vuoi dire?
DAVID J. MALAN: Bella domanda.
Come è possibile che io possa cambiare solo x al numero e il programma saprà
immediatamente?
Quindi, di nuovo, pensare ad esso come questa astrazione.
Quindi, se ho am main e Ken è incrementale, francamente, non mi interessa
ciò che Ken chiama il suo iPad.
Non mi interessa quello che lui chiama tutto ciò che ha a che fare con la sua attuazione
di questa funzionalità.
Quindi questo è un dettaglio di implementazione che io, principale, non
devono preoccuparsi.
E così semplicemente cambiando costantemente all'interno della funzione, numero qui
e il numero di qui, è tutto quello che vuole tanto tempo come ho ricompilare.
E 'un po' come se ci pensate - molti di noi, quelli di voi con conducente
licenze che ho guidato, o se hai anche guidato in una macchina -
la maggior parte di noi non hanno idea di come funziona una macchina sotto la cappa.
E letteralmente, se si apre il cofano, la maggior parte di noi - me compreso -
non stanno andando per sapere esattamente cosa stiamo guardando.
Un po 'come si potrebbe sentire con roba come questo adesso.
Ma in realtà non hanno di prendersi cura come la macchina funziona.
Non c'è bisogno di importa di quello che tutte le aste e pistoni e cavi all'interno di
la macchina sta effettivamente facendo.
>> Quindi, qualcosa di simile a quello che voi chiamate il pistone non ha importanza
qui in questo caso.
Stessa idea.
Si '?
[Incomprensibile]
DAVID J. MALAN: Se ci fossero più usi del momento variabile xa fa,
si, il programmatore, dovrebbe cambiare ovunque.
Oppure si potrebbe letteralmente fare file, Menu, quindi Trova / Sostituisci,
qualcosa del genere.
Ma si sta andando ad avere per fare le modifiche da soli.
Bisogna essere coerenti.
[Incomprensibile]
DAVID J. MALAN: un ordine particolare come qui?
Se questo era un altro numero int?
Gia '.
Quindi, al fine conta quando si chiama la funzione.
Quindi, se fossi chiamato Rilancio qui con qualcosa qualcosa di virgola,
c'è una corrispondenza diretta.
La prima variabile, come si chiama, è una copia della prima
argomento qui.
Siamo spiacenti, questo non dovrebbe essere una parentesi.
Le linee argomento secondo fino con il secondo.
>> Quindi l'ordine, sì, le cose.
Bene.
Scusate ho preso una lunga strada per arrivarci.
Altre domande?
Bene.
Quindi cerchiamo di vedere se non si può dipingere un quadro di ciò che sta realmente accadendo
qui sotto il cofano, per così dire.
Quindi questo è un rettangolo che potrebbe rappresentare la memoria del computer.
Quindi, anche se non avete idea di come funziona la memoria RAM o come funziona, almeno
si supponga di avere grappoli di esso in questi giorni.
Hai megabyte di esso.
Hai gigabyte di esso.
E sappiamo da zero settimana che un byte è proprio quello?
8 bit.
Giusto, quindi 8 zeri e di uno.
Quindi, se il vostro computer dispone di un giga di RAM, due giga di RAM in questi giorni, si dispone di un
o 2 miliardi di miliardi di byte di memoria, o di circa 8 miliardi di dollari o 16 miliardi
bit, all'interno del computer.
Ora, a differenza del piccolo esempio Woolly Willy, non è particelle magnetiche
tipicamente più.
Sempre più spesso, nei computer portatili, almeno, è unità a stato solido, SSD, che
solo non hanno parti in movimento.
E 'tutto elettronico.
E 'tutta l'energia elettrica sulla base.
Quindi penso, però, di questo rettangolo come solo rappresenta il uno o due
gigabyte di memoria che avete.
>> Quindi è un pezzo di memoria.
Ora il mondo dell'informatica è sorta di pezzi partizionati off di
memoria per fare cose diverse.
Così, per esempio, se questa è la RAM del computer - come suggerito dal
rettangolo là - scopre che per convenzione, nella parte superiore della RAM, in modo da
di parlare, è in genere quello che si chiama un segmento di testo.
Queste sono le zero e uno che hai compilato.
Così, quando abbiamo guardato sotto il cofano a ciò che a.out è, tutto
gli zeri e quelli -
quando si esegue un programma, questi zero e uno sono caricati dal vostro hard
unità in qualcosa chiamato RAM.
E nella RAM, vengono messe in alto.
Ora invece, si dispone di altre cose.
Dati inizializzati, dati non inizializzati.
Questi due andane di memoria fare riferimento a variabili globali, che
non si usano spesso.
Ma a volte se lo fai, finiscono anche lassù.
Poi c'è un po 'di altre cose.
Le variabili d'ambiente, che non passano molto tempo su.
Ma poi due cose importanti che tornerà nel corso di questo
semestre, stack e heap.
>> Così la maggior parte della memoria del computer è riservato durante l'esecuzione di un programma per
qualcosa chiamato la pila e qualcosa chiamato l'heap.
E non stiamo andando a parlare del mucchio oggi, ma ci sarà
parlare della pila.
E la pila è destinata a evocare la visuale di come la sala da pranzo
vassoi dei pasti in Mather Casa, o dovunque vi capita di essere, dove il
sala da pranzo personale pulirli ogni giorno.
Li pila di sopra del piano in su.
E allo stesso modo in memoria, c'è questa idea di mettere qualcosa su un
pila, mettere qualcosa su una pila, mettere qualcosa su una pila.
E che cosa si intende con questo?
Bene, vediamo di ingrandire solo la metà inferiore di questa immagine, computer
RAM, di proporre quanto segue.
Si scopre che quando si esegue un programma come a.out o ciao, a prescindere
il programma è che hai scritto,
ancora una volta, questi zero e uno sono caricati dal disco rigido - che è
conservazione a lungo termine, vi rimane anche quando si tira la spina -
caricato nella RAM.
RAM è più veloce di hard disk.
E 'più piccolo hard disk.
Ma è dove programmi in diretta mentre li stai eseguendo.
>> Così si fa doppio clic su un programma su un Mac o un PC - è caricato dal
disco rigido in RAM.
Non appena viene caricata in RAM, le zero e uno vada al top modo, l'
cosiddetto segmento di testo.
Ma non appena il programma viene avviato effettivamente in esecuzione, il principale
funzione viene chiamata.
E principale, come abbiamo visto, ha spesso variabili locali.
E ha interi e stringhe e caratteri e simili.
Così, se il programma che hai scritto o il programma che avete
doppio clic utilizzato alcune variabili all'interno del principale, finiscono al
fondo alla pila di memoria, per così dire.
Ora più concretamente, che cosa significa questo in realtà significa?
Questo significa solo che se stavamo per numerare le cose -
se dovessimo andare al numero dei byte di RAM nel computer, si noti che
questo potrebbe essere pari a zero il numero di byte.
Questo potrebbe essere il numero di byte uno, due, tre, quattro, cinque, sei, tutti
la strada fino a come -
2000000000 sarebbe fin lassù in cima.
In altre parole, quando si parla di RAM o memoria in termini di byte,
significa semplicemente che qualcuno ha deciso cosa numerare ciascuna delle
quei pezzi di memoria.
>> Così, quando avete bisogno di 32 bit per un int, o avete bisogno di 8 bit per un char, se
vanno a finire nella memoria?
Beh concettualmente, hanno appena finiscono in fondo a questo
cosa chiamata stack.
Ma ciò che è interessante ora è quando chiama una funzione principale.
Supponiamo che una funzione chiamata foo, solo un nome arbitrario.
Ciò che accade è principale è in fondo a questa pila di memoria.
Foo ora è messo in cima principale in memoria.
Quindi tutte le variabili locali che foo è finire sorta di concettualmente sopra
quelli in principale.
Se foo chiama un'altra funzione chiamata bar, le variabili finiscono qui.
Se la barra chiama qualcosa d'altro, qui, qui, qui.
Così che cosa è interessante l'esecuzione di un programma è che, come si chiamano le funzioni,
e come tali funzioni chiamare le funzioni, e come tali funzioni chiamare funzioni,
si costruisce questa pila di funzioni in memoria.
E solo una volta restituisce una funzione si fa a iniziare a ricevere che la memoria indietro.
Quindi, uno dei modi più semplici per l'esecuzione di memoria in un programma per computer è quello di
scrivere funzioni che non restituiscono.
>> Così, per esempio, cerchiamo di dimostrare tanto con un
programma creato appositamente per buggy.
Lasciatemi andare avanti e non # include int main (void).
E ho intenzione di fare, mentre (2> 1), che probabilmente non potrà mai
cambiare su di noi.
E lasciatemi andare avanti ora e fare printf.
A dire il vero, che sta per essere meno visivamente interessante.
Facciamolo.
Per int (i = 0; i> 0).
Facciamo in modo che questo errore, i + +.
E non printf qui.
Vediamo in pratica quello che predicava.
Facciamo un metodo qui.
Void coro, e diremo int i.
E poi ho intenzione di dire, printf -
oh, cerchiamo di renderlo più interessante.
Facciamo in realtà non stampa nulla.
Diciamo solo fare questo.
Chorus (i).
>> Bene.
Quindi questo è bacato perché perché?
Sto facendo questo come vado perché il programma non fa niente
di interesse.
Ma questo non è l'obiettivo.
L'obiettivo è quello di scrivere un programma la cui funzione principale fa che cosa, a quanto pare?
Chiama se stessa.
E in realtà, non abbiamo bisogno del ciclo.
Facciamo anche semplificare questo proprio per non perdere di vista la realtà
bug fondamentale.
Chiamate principali coro a cantare qualche coro.
Poi ho fatto qualcosa di stupido, e avevo chiamata coro coro perché davo per scontato
qualcun altro stava per attuarlo forse.
E ora questo non sta andando per compilare ancora.
Ho bisogno di fare ciò?
Ho bisogno del prototipo, ricorda.
Quindi ho bisogno di avere qui coro void (int i);.
>> Così ora, se vado qui -
in realtà, cerchiamo di utilizzare la finestra più grande.
Andiamo avanti e fare coro.
L'uso di dichiarante identificato i.
Oh, che era stupido.
Non abbiamo bisogno l'argomento.
Diciamo solo fare questo.
Avremmo voluto iniziato in questo modo.
Sarebbe stato un programma molto più facile da scrivere.
Quindi c'è.
Ora andiamo verso la mia finestra di terminale, eseguire di nuovo Clang.
E qui andiamo.
E 'stato veramente veloce.
Che cosa realmente è successo, però?
Bene, ora mi aggiungere la riga di stampa, in modo che possiamo vedere.
Quindi lasciatemi dire printf, diciamo, io sono qui.
Ok, nessuna variabile, lasceremo così.
Vorrei ri-eseguire make.
Permettetemi di re-run coro.
E dai.
Continua ad andare.
Per inciso, perché non è ancora caduto?
L'errore di segmentazione successo super veloce prima.
[Incomprensibile]
DAVID J. MALAN: Esattamente.
Quindi ci vuole tempo per stampare.
Ci vuole solo più lavoro da parte del computer.
E non lo è.
Segmentazione guasto.
>> Quindi, notare quanto i programmi veloci correre.
Se non si sta stampando nulla, super veloce.
Ma abbiamo ancora ottenuto questo errore di segmentazione, perché quello che stava accadendo?
Beh, se si pensa a come la memoria del computer è disposto, questo
sembra essere principale.
Ma qui -
facciamo solo chiamare questo coro, e chiama questo coro.
E ora se lo faccio mia estetica a destra, questo è solo andare a dire coro,
coro, coro, coro, coro, coro, coro, fino alla nausea.
E alla fine, che cosa succederà?
Se il quadro è letteralmente questo, che accade solo concettualmente?
I sovraccarichi di stack del mucchio.
O peggio, basta invaso tutto, compreso il segmento di testo, che è
gli zeri e quelli che rappresentano il vostro programma.
In breve, questo è solo super, male super.
Giusto?
Il vostro programma è fuori controllo.
Stai usando la memoria modo più di quanto previsto tutto per colpa di una stupida
errore, in questo caso.
O in questo caso, una funzione molto deliberatamente fatto stesso chiamante.
Ora, questo non è affatto male.
Le funzioni che si definiscono in realtà ha un grande potere
quando lo si utilizza correttamente.
Non l'ho usato correttamente qui.
>> Quindi questo non è affatto male.
Ma il fatto che non ho mai fatto smettere di chiamare me è un fondamentale
qui la debolezza di questo programma.
Allora, dove stiamo andando con tutto questo?
Ebbene, che cosa sta realmente accadendo?
Quando chiamo la funzione di incremento, come stavamo facendo in questi esempi,
Ho un valore come 1 che mi passa trovi
Passo in una copia del numero uno.
Quindi, si verifica quanto segue.
Quindi cerchiamo di andare in esempio incremento.
E questo ragazzo proprio qui.
Quindi, ecco quello che succede.
Quando ho chiamato incremento, e passo in x, pittoricamente ciò che è
succedendo qui è questa -
se ho il valore di 1 memorizzati qui, e io in realtà chiamare incremento, che
ora si chiama coro -
sì, che mi ha gettato via qui.
Quindi cerchiamo di chiamare questo incremento.
E noi non sappiamo che cosa questa funzione successiva sarà.
Quindi, quello che succede è qui da qualche parte in main, ho un pezzo di
memoria che memorizza il numero 1.
Quando chiamo incremento, sto utilizzando un altro pezzo di memoria, ma ora mi
la copia di 1.
Quando ho incrementare tale valore, questo diventa 2 - orribilmente scritto sul
schermata qui.
Ma allora, che cosa succede non appena ritorni di incremento?
Questa memoria appena viene restituito al sistema operativo, il che significa che tutte le
che hai fatto è nulla di utile.
Quello che in origine era contenuto nella principale è ancora effettivamente.
>> Allora, dove stiamo andando con questo?
Bene, si scopre che nella memoria si dispone di questa back to back sequenza di
byte che si può mettere roba trovi
E si scopre che abbiamo già visto qualcosa che consiste nel mettere
cose back to back to back to back.
Che cosa è una stringa, in base a una settimana e ora due settimane?
Quindi è solo un insieme di caratteri.
Così si scopre, proprio come si può mettere i numeri in memoria, allo stesso modo è possibile
mettere i caratteri in memoria.
E una volta che si inizia personaggi mettendo in memoria back to back per tornare al
indietro, si scopre che con la più semplice delle cose come un ciclo for o
un ciclo while, possiamo iterare -
da sinistra a destra sopra i caratteri di una stringa -
e iniziare a massaggiare in caratteri completamente diversi.
A potrebbe diventare B. B potrebbe diventare C. So che in ultima analisi, si può prendere un
Frase in inglese che rende effettivamente senso e convertire ciascuno di questi
lettere, una alla volta a piedi attraverso la memoria del nostro computer a sinistra per
diritto per crittografare effettivamente.
>> Quindi cerchiamo di prendere la nostra pausa di cinque minuti qui, e quando torneremo, faremo
avviare questo processo di scrambling informazioni.
>> Bene.
Quindi, prima di immergersi per qualche crypto e queste cose chiamate matrici, lasciatemi
pausa per tutte le domande, perché mi sento come se davvero sorta di confusa alcuni dei
questi argomenti.
Quindi cerchiamo di correggerla se possiamo.
Così abbiamo appena parlato di valori di ritorno.
Abbiamo parlato di argomenti.
E abbiamo parlato di questo concetto, che vedremo tornare nelle prossime settimane
venire, di vedere la memoria come un insieme di questi impilati
vassoi, per così dire.
Dal basso in alto, in modo tale che ogni vassoio che viene messa in pila rappresenta
una funzione che è attualmente in fase di chiamata.
Hai ancora domande?
Così come su - mi permetta di provare facendo una domanda.
Continuo a rovinare, ma ora E'- you've visto tutti il ​​viso del ragazzo.
Così torneremo a questo.
>> Permettetemi quindi di fare una domanda qui.
Vorrei semplificare questo torna a quello che era prima che alcuni dei nostri precedenti Q & A.
E il fatto che abbia incremento parentesi aperta, int numero, chiuso
parentesi.
Che cosa significa il numero int rappresenta?
[Incomprensibile]
DAVID J. MALAN: Un argomento.
Va bene, ma che cosa è un argomento?
[Incomprensibile]
DAVID J. MALAN: Scusa, che cos'è?
SPEAKER 3: Qualcosa si passa trovi
DAVID J. MALAN: Okay.
Quindi qualcosa che si passa trovi
E più in generale, è solo l'ingresso.
Se si sta scrivendo una funzione e lo scopo che la funzione nella vita è quello di fare
qualcosa di un po 'diverso ogni volta che lo si utilizza, quindi l'unico modo per
che accada realmente sembrerebbe fornire con ingresso in modo che
può fare qualcosa di diverso con il medesimo ogni volta.
>> Quindi è necessario specificare due cose quando una funzione richiede ingressi.
È necessario specificare il nome che si vuole dare a quella di ingresso, per puro
proprio comodo in modo che è possibile fare riferimento ad esso nella funzione che si
te sta scrivendo, come ho fatto qui in linea 32.
Ma è anche necessario specificarne il tipo, perché C è un linguaggio di programmazione
che richiede solo
che se si vuole una variabile, è necessario dire al computer cosa
tipo di dati si tratta,
in gran parte in modo che sappia quanti bit
assegnare per tale variabile.
Perché potrebbe essere sei -
mi dispiace, non saranno sei.
Esso può essere 16.
Può essere 8.
Esso può essere di 32, anche 64.
Ma il computer ha bisogno di sapere.
Ora la int sul lato sinistro rappresenta ciò, invece?
[Incomprensibile]
DAVID J. MALAN: Che cos'è?
[Incomprensibile]
David J. MALAN: Il tipo di funzione e, più specificamente, la
tipo di sua produzione.
Giusto.
Così che la cosa in parentesi rappresenta il suo ingresso, se presente, la
cosa da sinistra rappresenta la sua uscita.
E in questo caso, a quanto pare incremento restituisce un int.
E così int è il tipo restituito da questa funzione.
>> Che cosa significa per il ritorno?
Letteralmente, si utilizza la parola chiave return.
E poi se quello che stanno tornando a destra della parola chiave è un
numero intero, allora quello è effettivamente coerente con ciò che abbiamo promesso.
Non si poteva fare qualcosa di simile -
ciao, mondo -
perché questa è una stringa.
Ovviamente non è un numero intero.
Così, in breve, il peso è davvero su di noi, il programmatore, per essere precisi come
a quello che stiamo tornando e poi effettivamente fare per restituirlo.
E poi per fare un po 'più chiaro il contesto -
eccolo di nuovo.
Il contesto -
grande sorpresa in arrivo un attimo.
Il contesto qui è ora che la memoria del computer è, ancora una volta, un
gigabyte, due gigabyte, a prescindere.
Forse è più.
Forse è meno.
Ma il computer lo vede come avere diverse sezioni.
Qualcosa va laggiù.
Qualcos'altro va lassù.
Cose diverse va al centro.
E oggi, dobbiamo solo iniziare a raccontare questa storia.
>> Ma torneremo a questo nel corso del tempo.
Per ora, l'unico pezzo di memoria che veramente interessa è il segmento di testo
perché questo rappresenta solo gli zeri e quelli
Clang che ha emesso.
Così, quando si esegue un comando a tastiera come a.out, o si fa doppio
fare clic su un'icona in Mac OS o Windows, il programma viene caricato dal disco
guidare in RAM.
Ed è plopped nella parte superiore della RAM del computer, per così dire.
Ora invece, come il programma si avvia e principale viene chiamato in
programma che hai scritto o il programma di Microsoft o Apple ha scritto, nulla della sua
variabili locali finiscono laggiù in fondo alla memoria del computer.
Ma se chiama un'altra funzione principale che si dispone di variabili o
argomenti, finiscono sopra di esso.
E se tale funzione chiama qualcosa, finiscono sopra di esso,
sopra di esso, sopra di esso.
E solo una volta una funzione avviene eseguendo fa la pila di vassoi, così
di parlare, iniziare a ottenere sempre più in basso.
E questo è quello che poi, in poche parole, spiega perché, quando si chiama cubo -
o si chiama incremento -
si sta passando a una copia del valore.
E che cosa significa pittoricamente è che si sta letteralmente scrivendo la
numero 1 in un'altra parte della memoria, che cambia 1 a 2, in caso di
incremento -
o ad un 8, nel caso di cubo -
e poi gettare via che la memoria non appena l'incremento o il cubo
funzione ritorna.
>> Domanda.
[Incomprensibile]
DAVID J. MALAN: Dove - sono memorizzate le variabili globali in quello che è
attualmente chiamato i dati inizializzati o dati non inizializzati.
La differenza è, se si dispone di una variabile globale, e si assegna
immediatamente un valore con il segno di uguale, finisce in alto là.
E se hai appena detto int x punto e virgola senza alcun valore, si finisce un po '
più basso in RAM semplicemente per convenzione.
Altre domande.
Bene.
>> Quindi questa immagine tornerà, come abbiamo più più potente con quello che possiamo fare
con il computer.
Ma per ora, diamo una breve introduzione alla crittografia, un tipo specifico di
crittografia che non risolve tutti i problemi del mondo, ma non risolve
alcuni di essi.
In questo caso qui, abbiamo qualcosa che si chiama crittografia a chiave segreta.
E crittografia a chiave segreta, come suggerisce il nome, deriva la sua sicurezza
da un segreto.
Così, per esempio, se sei di nuovo in grado di scuola e si sta passando un
piccola lettera d'amore segreta con il ragazzo o la ragazza che si sta schiacciando il - se si
voleva passare che attraverso il pubblico, probabilmente non avrebbe scritto
una nota in inglese o qualunque sia la vostra lingua madre è, anzi, è
potrebbe cifrare.
Oppure si potrebbe semplicemente inviare un messaggio di testo in questi giorni.
Ma si potrebbe effettivamente passare una nota in tutta la classe.
E per farlo in modo sicuro, in modo che i tuoi amici e l'insegnante
Non so quello che stai scrivendo, si potrebbe trovare una abbastanza semplice
algoritmo -
giovane anche se si potrebbe essere -
solo a rimescolare le parole.
Così, invece di scrivere A, è possibile scrivere B. Invece di B, è possibile scrivere
C. Invece di C, è possibile scrivere D, e così via.
Oppure si potrebbe trovare una traduzione più sofisticato di lettere
alle lettere diverse.
Ma il fermo è il ragazzo o la ragazza a cui si sta inviando questa nota deve
sapere qualcosa.
Che è ciò che, ovviamente?
Come, che cosa il vostro segreto.
Come, che cosa è che la mappatura tra il nome e B e Cs e Ds?
È solo l'aggiunta di uno, per così dire, a ciascuna delle lettere per passare da
A a B, da B a C?
E 'più complesso di quello?
Quindi tu e il tuo amore hanno bisogno di avere questa informazioni segrete.
Ma c'è una specie di cattura-22 qui.
Se questa è la prima volta che si sta inviando questa lettera d'amore attraverso il
classe, come è quel ragazzo o ragazza andando a conoscere quale sia il segreto è ancora?
Così chiave segreta di crittografia non risolve tutti i problemi del mondo.
E c'è in realtà un rapporto che torneremo al verso
semestre end.
>> Allo stesso modo, non hanno nessuna di noi probabilmente mai inviato un -
Analogamente, non più di noi conoscono qualcuno che funziona, per esempio, a
Amazon.com.
Eppure, molti di noi hanno probabilmente comprato roba su Amazon.com.
E ci è stato insegnato di ritenere che queste e-commerce
transazioni sono sicure.
Giusto?
L'URL dice probabilmente https.
C'è forse un icon lucchetto da qualche parte.
C'è qualche tipo di crittografia proteggere i dati della carta di credito
tra te e Amazon.com.
Eppure, se la crittografia implica conoscere qualche segreto, ma non mi
conosco nessuno su Amazon, e di certo non ho organizzato nessun tipo di
segreto con qualcuno su Amazon, come è il mio computer o il mio browser facendo questo?
Ebbene, risulta ci sono altri tipi di crittografia complessivamente in grado di risolvere
tale problema.
Ma per oggi, ci concentreremo sul semplice, in cui è possibile organizzare in
avanzare di conoscere qualche segreto, come più 1 o qualche corrispondenza tra As e breakfast.
>> E il processo di crittografia comporta generalmente questo.
Hai un po 'di testo, illustrato qui a sinistra.
Lo si esegue attraverso un qualche tipo di algoritmo o procedura
per la crittografia.
Forse questo è solo A diventa B, B diventa C e poi si finisce con
criptare testo.
Nel frattempo, una volta che il tuo amore riceve la nota segreta, lui o lei deve poi
decifrare generalmente le inversioni di algoritmo in modo da ottenere
eseguire il testo in chiaro.
Ora ci sono incarnazioni fisiche di questo.
Per esempio, questo è un piccolo anello decodificatore segreto.
E questo è un anello, nel senso che ci sono due quadranti qui.
Alla periferia al di fuori di questa cosa, ci sono le lettere dalla A alla Z,
anche se sono in ordine casuale.
E al suo interno, c'è in realtà alcuni numeri, in modo tale che con questo
anello, è possibile tipo di ruotare l'esterno ma non l'interno in modo da allineare
numeri con le lettere.
E nella clip che state per vedere - alcuni dei quali si può avere visto 24/7
tutto il periodo di Natale da un film intitolato Una storia di Natale.
Vedrai che Ralphie piccolo era così ansioso di capire cosa orfanella
Messaggio segreto di Annie era a lui che era stata comunicata, credo, nel
forma di messaggi numerici su una scatola di serie.
E si doveva accumulare tutte le carte piccole che è venuto
nella scatola di cereali.
Si doveva spedirle trovi
Si doveva tornare sul ring segreto decoder, in modo da poter finalmente capire
che cosa è la mappatura tra lettere e numeri,
o lettere e lettere.
Quindi vi do questa breve clip da Una storia di Natale per motivare pset 2 e
la nostra discussione, in un momento, di array.
Quindi qui abbiamo Ralphie.
>> [RIPRODUZIONE VIDEO]
-Sia noto a tutti quanti che Ralph Parker è nominato
membro del Little Orphan Annie Circolo Segreto e il diritto di tutti
gli onori ei benefici che si verificano ad esso.
-Firmato, Little Orphan Annie.
Controfirmata, Pierre Andre!
In inchiostro!
Onori e benefici, già all'età di nove anni.
Dai, andiamo avanti con lui.
Non ho bisogno di tutto ciò che il jazz sui contrabbandieri e pirati.
-Ascolta domani sera per concludere l'avventura di The Black
Pirate Ship.
Ora è il momento per il messaggio segreto di Annie per voi membri
del Circolo Segreto.
Ricordate, i bambini, solo i membri del Circolo Segreto di Annie in grado di decodificare
Messaggio segreto di Annie.
Ricordate, Annie dipende da te.
Impostare le pin a B2.
Ecco il messaggio.
12, 11 -
-Sono nel mio incontro primo segreto.
-14, 11, 18, 16 -
-Pierre era in questa sera grande voce.
Potrei dire che il messaggio di questa sera è stato davvero importante.
-3, 25.
Questo è un messaggio da Annie se stessa.
Ricordate, non dirlo a nessuno.
-90 Secondi dopo, io sono in camera solo nella casa dove un bambino di nove anni
poteva sedersi nel rispetto della privacy e decodifica.
Aha, B. sono andato a quello successivo.
E. La prima parola è essere.
S. Veniva più facile ora.
U.
-Oh, andiamo, Ralphie.
Devo andare.
-I'Ll subito verso il basso, ma.
-Gee whiz.
-T, O. Accertarsi di.
Assicurarsi di che cosa?
Qual è stato Little Orphan Annie cercando di dire?
Assicurarsi di che cosa?
-Ralphie!
Randy ha avuto modo di andare.
Vi prego di venire fuori?
-Va bene, ma.
Vengo subito fuori.
-Mi è stato sempre vicino ora.
La tensione era terribile.
Che cosa è stato?
Il destino del pianeta può in bilico.
-Ralphie!
Randy deve andare.
-I'Ll subito fuori, per gridare forte.
-Accidenti, quasi.
Le mie dita volavano.
La mia mente era una trappola d'acciaio.
Ogni poro vibrato.
Era quasi chiaro.
Sì, sì, sì, sì.
-Assicurati di bere il tuo Ovomaltina.
Ovomaltina?
Uno spot scadente?
Figlio di una cagna.
[END RIPRODUZIONE VIDEO]
>> DAVID J. MALAN: Così ci abbiamo crittografia.
Così come in un computer si può fare per l'attuazione o
rappresentare le cose come questa?
Bene, abbiamo bisogno di un modo di esprimere se stessi un po 'più flessibile rispetto
le variabili finora hanno permesso.
Abbiamo avuto int.
Abbiamo avuto caratteri.
Abbiamo avuto float e double e pochi altri.
Ma questi sono i singoli pezzi di memoria che in realtà non ci permettono di
esprimere le cose come le parole e le frasi e frasi.
In effetti, abbiamo chiamato tali stringhe cose.
Ma abbiamo promesso che questo è davvero solo una semplificazione nella CS50
libreria che stiamo intenzione di staccare.
>> E così cominciamo a farlo qui.
Lasciatemi andare avanti e aprire un file -
tutti questi file sono disponibili come al solito on-line -
array.c chiamato per risolvere un problema non correlato alle stringhe, ma che dipinge un
figura qui di come si potrebbe usare qualcosa chiamato un array.
Un array è un tipo di dati.
E 'un tipo di variabile, in qualche modo, che dispone di più tipi di dati più piccoli
all'interno di esso back to back to back to back.
Così, per esempio, se vogliamo scrivere un piccolo programma che ti dà il tuo
quiz media per un corso come 50 che ha due quiz, si potrebbe molto facilmente
scrivere questo programma - basato anche su alcuni dei materiali della scorsa settimana -
utilizzando GetInt e una coppia di variabili.
Int quiz1, int quiz2, ed è abbastanza semplice.
E 'forse da 10, 20 righe di codice, max, di attuare un programma che chiede il
utente per due punteggi di quiz e poi calcola la loro media con l'aggiunta di loro
insieme, dividendo per due, e quindi la stampa dei risultati.
Si potrebbe probabilmente fare abbastanza facilmente che ora, dopo
un certo numero di minuti.
>> Ma il problema è che supporre che il 50 aveva tre o quattro quiz.
Supponiamo di voler utilizzare lo stesso programma per una classe che aveva
quiz settimanale.
Pensate a una classe che ha quiz settimanale.
Se c'è come 16 o in modo da settimane in un semestre, ora si dispone di 16 variabili -
quiz1 int, int quiz2, quiz3 int, int quiz4.
Non appena si inizia a vedere questa ridondanza, il copia e incolla
del codice, si dovrebbe iniziare a farvi piacerebbe che ci fosse un modo migliore.
E per fortuna, a causa di array, che ci sia.
Allora, facciamo questo.
In primo luogo, permettetemi di presentarvi una cosa molto semplice che non abbiamo usato finora,
ma lo vedrete tanto in tanto nel codice.
Questo è ciò che generalmente chiamato una costante.
Quindi è una costante, nel senso che non è mai tale valore cambia.
La convenzione umana durante la creazione di una costante è quello di utilizzare tutto il capitale
lettere, solo in modo che si distingue sul serio nel codice.
E la parola chiave speciale che si utilizza è in C # define.
Quindi, se si dice # define, poi uno spazio, quindi la parola che si desidera utilizzare per
la costante di nome, e quindi il valore della costante.
Quindi avviso, questo è diverso da assegnare qualcosa a una variabile.
Non c'è segno di uguale.
Non c'è punto e virgola.
Questo è ciò che è noto come una direttiva del preprocessore, ma più in
un'altra volta.
>> Per ora, questo crea un valore immutabile chiamato QUIZ il cui effettivo
valore numerico è 2.
Quindi, ovunque compaia QUIZZES, quiz, quiz in questo file, che è
solo il numero 2.
Ora, se guardo principale ora, vediamo come funziona.
In un primo momento, sembra un po 'criptico.
Ma è tutta roba da una settimana.
Chiedi l'utente per i gradi.
Come possiamo fare questo?
Beh, in linea 22 -
questo è davvero la parte succosa -
Dichiaro un galleggiante, ma non solo un galleggiante unico.
Sto dichiarando, anzi, una serie di valori in virgola mobile.
Tale variabile sta per essere chiamato gradi, come implicito qui.
Ma l'unico pezzo di nuova sintassi allora sono queste parentesi quadre, il fatto
che ho detto voti float e poi parentesi aperta e poi un numero.
Notate, se questa è una costante, questa è proprio come abbiamo fatto questo.
Questo significa calcolatore ehi, dammi due galleggianti, e cerchiamo di chiamare collettivamente
loro gradi.
Questo è in contrasto con un processo molto più noioso come questo.
Float grade1, galleggiare grade2, e così via.
Quindi un array ci permette di attuare questa idea, ma molto meno disordinato, in
modo tale che si può scrivere una linea di codice invece di, diciamo, 16 per un 16
settimana semestre.
Quindi non volevo a livello di codice 2, perché se si pensa di questo ora
logicamente - supponiamo che il prossimo anno CS50 cambia di 3 quiz invece.
E ho avuto il numero 2 qui.
Ho avuto il numero 2 qui.
Diventa molto noioso e molto facile da vite e cambiare accidentalmente
un valore a 3 e perdere un altro valore di 2.
Quindi ho intenzione di astratto invece questa distanza e usare questa costante che, come il suo
nome stesso, non cambia mai.
E ora, non importa se abbiamo diversi quiz quest'anno o il prossimo, io
basta cambiare in un posto, qui in alto.
>> Ecco, questo è tutto costante.
Nel frattempo, la nuova funzionalità concettuale è quella di una matrice.
Così le parentesi quadre mi danno questo molti carri allegorici e mi consente di blocco
li chiamano gradi qui.
Così ora vediamo che cosa ho intenzione di fare.
Qui nella riga 24 è l'inizio di un ciclo.
Questo è davvero niente di speciale.
E 'solo con quiz al posto di un hard-coded numero.
Ma non c'è nulla di diverso ci intellettualmente dalla settimana scorsa.
Questo è solo printf.
So printf ("numero d quiz% di% d"), perché voglio solo stampare darmi quiz
numero uno dei due e poi due di due.
Quindi questa è puramente una cosa estetica.
Ma la parte interessante è ora in linea 27.
Per riempire una delle due segnaposto con virgola mobile
valore, di nuovo utilizzare le parentesi quadre.
In questo caso, sto usando io, perché questo ciclo for è iniziata con i pari
quale valore, a quanto pare?
0.
>> Così la prima iterazione del ciclo, è come se mi
ha scritto questo nel codice.
Ma sulla seconda iterazione di questo ciclo, è come se mi
ha scritto questo nel mio codice.
Ma il fatto che sto usando una variabile è perfetto, perché, come dice il nome
suggerisce, è variando il suo valore ad ogni iterazione.
Così sto compilando questa matrice un punto alla volta.
Che cosa significa questo array assomiglia?
Beh, il motivo per cui ho disegnato questo rettangolo super semplice sullo schermo qui
prima era per questo motivo.
Un array è solo un pezzo di memoria seguito da un altro pezzo di memoria,
seguito da un altro pezzo di memoria, e così via.
Quindi, se la mia matrice è di dimensione 2, in questo caso qui, tutto quello che avrebbe fatto da
digitando il mio punteggio quiz, come qui.
Ho ottenuto 100 su questo.
E poi ho avuto un 99 su questo.
Allora questa memoria potrebbe anche non essere usato perché ho solo chiesto al
computer per un array di dimensione 2.
Queste piazze sono ancora lì.
Giusto?
Hai ancora due gigabyte di RAM, anche se sei solo
chiedendo due galleggianti.
Così l'idea che sta dietro gli array è che il computer richiede solo un pezzo di memoria
e ripartisce poi pezzi più piccoli back to back to back to back.
E così questo è tutto un array è.
Si tratta di un pezzo di memoria adiacente, all'interno della quale si possono mettere le cose.
>> Ora, questo accade per fare poi basta un po 'di aritmetica noioso.
Se scorrere verso il basso qui, questo è dove ho poi scorrere l'array.
Io vengo con la somma di tutti i valori della matrice.
E poi usare la funzione da queste parti per fare effettivamente il
somma divisa per quiz.
Ma permettetemi di salutare la mia mano in quella come una sorta di aritmetica sufficiente per ora.
Ma tutto quello che sta facendo per me, in ultima analisi, sta calcolando una media.
Quindi prima quiz più secondo quiz, diviso 2, e quindi la stampa
fuori come un int.
>> Ma andiamo ora transizione verso un esempio diverso chiamato stringa1,
che dipinge un quadro simile, ma con le stringhe.
Lasciatemi andare avanti e semplificare questo solo per un momento.
E perdona il rientro per ora.
Del bando nella riga 19 di questo esempio, ho una stringa dall'utente.
Ma notate quello che sto facendo in prossima linee 22 in poi.
In realtà sto iterando da i fino a - e questo è un nuovo trucco -
strlen, stringa di lunghezza.
Questa è una funzione che viene fornito con C che, se si passa una stringa, racconta
il numero di caratteri in quella stringa.
Questo è tutto.
Il fatto che è strlen invece di lunghezza della stringa è solo perché è
più succinta.
30 anni fa, la gente amava scrivere le cose nel modo più succinto possibile.
Così abbiamo mantenuto tale convenzione qui.
i + + significa solo incrementare i in ogni iterazione.
E ora notare questo, che è davvero interessante.
Quindi, alla riga 24, dico computer, dammi un personaggio, otto
bit, e lo chiamano c.
Ma che cosa è questo sul lato destro dicendo?
In inglese, che cosa rappresenta?
[Incomprensibile]
DAVID J. MALAN: Esattamente.
Dammi il primo carattere della matrice.
O, più generalmente, dammi l'i-esimo carattere nella matrice.
E rendo conto che è importante ora che, come gli informatici, siamo in realtà
contare da 0.
Tu non hanno il potere ora per iniziare a fare questo.
Ora ti devi comportare in linea con le aspettative del computer e
contare da zero, perché [0] sta per essere il primo
carattere in una stringa.
[1] sta per essere il secondo.
[2] sarà il terzo, e così via.
Quindi questo programma, se lo compila - questo è, ancora una volta, stringa1.
>> Quindi, fare stringa1.
E ora corro stringa1 nella mia finestra di terminale.
E 'in attesa di input, così ho intenzione di scrivere, per esempio, David.
Invio.
E ora la stampa DAVID tutto su linee diverse, perché
notare quello che sto facendo.
Sto stampando un carattere alla volta.
Ora, noi non entreremo nei dettagli oggi su questo.
Ma ho cancellato poco fa questo controllo qui.
Si scopre che se l'utente si comporta male, contraddittorio, o semplicemente
confuso, si può effettivamente non riescono a dare una stringa di una certa lunghezza.
Se si preme il tasto sbagliato sulla tastiera, si potrebbe dare
nessuna stringa a tutti.
Oppure, se si è dannoso, si potrebbe tentare di incollare merita una gigabyte di un
saggio per riempire questa stringa.
E se il computer esaurisce la memoria, si scopre che stiamo andando
per tornare questo valore speciale chiamato null.
Quindi, per ora, è sufficiente sapere che c'è questo valore speciale chiamato nulla che
ci permetterà di controllare quando siamo fuori della memoria, tra le altre cose.
>> Ma se apro adesso stringa2, si noti una differenza qui.
Si noti una differenza qui con stringa2.
Con stringa2, questo ciclo for è un po 'diverso.
Mi permette di cancellare i valori null in modo che si possa parlare di quelli un'altra volta.
Ma cosa c'è di diverso il ciclo for questa volta?
E posso tornare all'esempio precedente.
Ecco, questo è la versione due.
Questa è la versione uno.
Uno, due, uno due.
Quindi la chiamata strlen è dove?
E 'nella prima parte del ciclo for.
Ogni pensiero sul motivo per cui sto facendo questo?
Gia '.
[Incomprensibile]
DAVID J. MALAN: Quindi non chiamare la funzione ogni volta.
Esattamente.
Ricordiamo da cicli for che sono super semplice una volta che si ordina di
capire che questo è l'inizializzazione, l'
condizione, e l'aggiornamento.
Il problema è che la condizione si verifica su ogni
iterazione del ciclo.
E così, in questo esempio qui, ciò che è male per il fatto
che questa è la mia condizione?
Stai chiamando strlen ancora e ancora e ancora.
Ma una volta che ho digitato DAVID, la lunghezza di tale stringa è cinque.
E non cambierà ad ogni iterazione del ciclo perché il
stringa è ancora D-A-V-I-D. Quindi questo è un accenno a quello che sta per diventare un
idea sempre più importante conosciuta come una decisione di progettazione, in cui - solo che non
rendere il computer a fare lavoro inutile.
>> Ora, come in anteprima di pset 2, pset 2 in edizione standard è
andando a sfidare di implementare effettivamente un certo numero di cifre, un po 'di
numero di algoritmi di crittografia, in modo che è possibile crittografare e decrittografare
messaggi segreti, molto simile al Ralphie lì decodificato.
Nell'edizione hacker di pset 2, abbiamo intenzione di andare un po 'oltre.
Stiamo andando a portata di mano è un file da un sistema informatico che contiene un vero
intero gruppo di nomi utente e password criptate reali, e la sfida
per l'edizione pirata sta per essere quello di rompere le password e la figura
cosa crittografia o quale segreto è stato utilizzato per in realtà
generare le password.
E abbiamo intenzione di farlo utilizzando una nuova funzionalità di C che io darò
è solo una demo di, noto come argomenti della riga di comando.
>> Così si scopre, come alcuni di voi avranno visto in sezione o nei libri di testo,
principale non sempre deve essere vuoto tra parentesi.
Si scopre che principale può anche essere scritto in questo modo, con due argomenti,
argc e argv, dove argc è il numero di parole che si digita dopo
il nome del programma sulla riga di comando.
E argv sono le parole reali.
E come le parentesi quadre ci suggeriscono, argv è apparentemente un array.
E 'intenzione di essere una stringa dopo una stringa dopo una stringa in memoria.
Quindi quello che sta andando ad essere in grado di fare, a partire da pset 2, è
qualcosa di simile.
Se faccio argv1, che è un esempio torneremo a il Lunedi, ed eseguire
si, si noti che non sembra di fare nulla ancora.
Essa si limita a stampare il suo nome.
Ma se io dico addio di classe, si noti che il programma scorre apparentemente
su ciascuna delle parole che sono state digitate al prompt.
E i mezzi con cui si avrà accesso alle parole che l'utente ha
digitato al prompt è cambiando principale, a partire da questo fine settimana, da int
main () a int main (argc, argv).
E così nascerà argomenti della riga di comando.
E una volta che si ottiene veramente sofisticata di questo, sarete in grado di scrivere
programmi davvero trippy, come questa qui, che va al di là
alcune delle funzionalità che abbiamo fatto fino ad ora, ma tutti abbastanza potente.
>> Così lasceremo questo con questo sullo schermo.
E ci vedremo il Lunedi.