[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ò. 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ò. Lo dirò. -Sapevo che avrebbe funzionato. Va bene, a me. -La combinazione è uno. -One. -One. -Due. -Due. -Due. -Tre -Tre. -Tre. -Quattro. -Quattro. -Quattro. -Five -Cinque. -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. 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. 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.