[RIPRODUZIONE DI BRANI MUSICALI] DAVID MALAN: Va bene. Questo è CS50, e questo è la fine della settimana 2. Mi dispiace, non ho potuto essere lì con voi oggi, ma siete in buone mani. Permettetemi di presentarvi Di CS50 proprio Rob Bowden. ROB BOWDEN: E, naturalmente, poi dobbiamo prendere in giro il fatto che ci ha inviato una verticale video e mostrare questo. [RIPRODUZIONE VIDEO] [RIPRODUZIONE DI BRANI MUSICALI] [PASSI] -Questo Video non ha fatto deve guardare in questo modo. E avrebbe potuto essere evitata. Dire di no a video verticali. Video -Verticale accadere quando si tenere la fotocamera nel modo sbagliato. Il tuo video finirà per assomigliare merda. - [GRUNT] -Ci Sono sempre più persone dipendenti per la realizzazione di video verticali ogni giorno. Non è crepa o niente, ma è ancora davvero male. Ci sono due diversi tipi di persone che sono affette da VVS. Il primo gruppo tratta la video sparano come immagini. Non significano alcun danno. Semplicemente non capiscono che mentre è possibile trasformare una foto, non si può trasformare in realtà un video. [CRASH] - [MONKEY SUONI] -Il Altro gruppo è la gente che non danno un [BLEEP]. Sindrome di video -Verticale è pericoloso. Le immagini in movimento hanno sempre orizzontale. I televisori sono orizzontali. Gli schermi di computer sono orizzontali. Gli occhi della gente sono orizzontali. Noi non siamo costruiti per guardare i video verticali. -Amo Video verticali. -Nessuno Prende cura di te. -Se Di questo problema lasciato incontrollato, anche tu inizierà mostrando quattro video in una volta solo per risparmiare larghezza di banda. Video verticali -Letterboxed sarebbe la dimensione di un francobollo. -E Si diffonderà in tutto il mondo. Schermi cinematografici hanno sempre orizzontale. Se i video verticali diventano , cinema accettate dovrà essere alto e magro. -E Tutti i cinema sarebbero devono ottenere demolita e ricostruita. E nel momento in cui sono stati ricostruiti, Mila Kunis sarebbe vecchia e brutta. -Birds Si crash in loro e morire. Ll del `tutto get rigido colli da guardare. -E Nessuno sedere prima fila mai più. -George Lucas riedizione stella Guerre again-- l'edizione magro. -Io Non è mai stato veramente in grado di dire la storia che volevo raccontare. Questa è stata una grande occasione per me di sperimentare una nuova tecnologia. -Sei un idiota. -Ogni Volta che un dispositivo mobile è utilizzato per registrare video, la tentazione è lì. Dì semplicemente di no. Dire di no a George Lucas. Dire di no a vecchio Mila Kunis. Dire di no a video verticali. -E Se vedete qualcuno farlo, dire, "tu non stai girando tale diritto manichino!" [RIPRODUZIONE DI BRANI MUSICALI] [FINE RIPRODUZIONE] [Applausi] [AUDIO OUT] ROB BOWDEN: --simple forma di crittografia, che è fondamentalmente la crittografia e la decrittografia dei messaggi segreti. Quindi qui abbiamo una molto semplice giocattolo. E l'idea è l'anello esterno ruota intorno all'anello interno. E si può vedere, forse se lo zoom in, che-- è difficile da vedere. Ma, come, il numero di 1-- bene, che si muoveva. Il numero 1 associa alla lettera X, il numero 2 mappe alla lettera J. Incredibilmente difficile non saltare in avanti. Lettera 2 mappe da J. Numero 3 mappe del D. So con questo anello si può dare qualcuno un messaggio 1, 2, 3. Per qualche ragione voglio dire loro XJD. Ma si può dare loro qualche messaggio di numeri, e fintanto che hanno questo anello, essi può decifrare quello che stai cercando di dire. Così si può avere visto questo particolare esempio della crittografia prima se tutto il periodo natalizio hai guardato Una storia di Natale. Se non avete mai visto prima, poi basta accendere TBS a letteralmente in qualsiasi momento alla vigilia di Natale, perché hanno appena mostrano back to back to back to back to back l'intera giornata. E il video rilevante è questo. [RIPRODUZIONE VIDEO] -Essere Noto a tutti quanti che Ralph Parker è presente nominato membro del Piccolo Orphan Annie Secret Circle e ha diritto a tutti gli onori e benefici che si verificano ad essa. Firmato Little Orphan Annie. Controfirmato Pierre Andre in inchiostro! Onori e benefici già all'età di nove anni! [URLA DA RADIO] -Avanti. Andiamo avanti con lui. Non ho bisogno di tutto ciò che il jazz su contrabbandieri e pirati. Ascoltami domani sera con l'avventura conclusiva della nave pirata nero. Ora, è il momento per Messaggio segreto di Annie per voi i membri del Secret Circle. Ricordate figli, solo i membri di di Annie Secret Circle in grado di decodificare il messaggio segreto di Annie. Ricordate, Annie dipende da te. Impostare i perni per B2. Ecco il messaggio. 12. 11. 2. -Io Sono nel mio primo incontro segreto. -25. 14. 11. 18. 16. Oh, Pierre è in grande stasera voce. Potrei dire che stasera messaggio è stato davvero importante. -3. 25. Questo è un messaggio da Annie se stessa. Ricordate, non dirlo a nessuno. Secondi -Cinque più tardi, io sono l'unico a stanza della casa dove un ragazzo di nove anni potrebbe sedersi nel rispetto della privacy e decodifica. Aha! B! Sono andato al prossimo. E. La prima parola è "essere". S. Veniva più facile ora. U. 25. Ecco R. -Dai, Ralphie! Devo andare! -Ti Essere proprio giù, Ma! Caspita. T. O. "Assicurarsi di" - essere sicuri di che cosa? Qual è stato Little Orphan Annie cercando di dire? Assicurati di che cosa? -Randy Ha avuto modo di andare! Vi prego di venire fuori? -Tutti Destra, mamma! Torno fuori! Mi è stato sempre più vicino ora. La tensione era terribile. Cos'era? Il destino del pianeta può in bilico! -Ralphie, Randy deve andare! -Ti Essere giusto fuori, per gridare forte! Quasi lì! Le mie dita volavano. La mia mente era una trappola d'acciaio. Ogni poro vibrava. Era quasi chiaro! Sì. Sì. Sì. Sì. Assicuratevi di bere il vostro Ovaltine. Ovaltine? Uno spot scadente? Figlio di puttana. [FINE RIPRODUZIONE] ROB BOWDEN: Allora è così che Ovaltine riferisce alla crittografia. Fondamentalmente CS50 appena pubblicizzato Ovaltine, così abbiamo potuto una commerciale scadente per Ovaltine. Tutto ok. Così ora attuale informatica. Ricordate il Lunedi abbiamo lasciato immersione profonda in stringhe. Così avevamo a che fare con la stringa "Zamyla." E siamo stati riconoscendo il fatto che siamo in grado di trattare "Zamyla" come una sequenza di caratteri. E ricordate che abbiamo imparato la notazione staffa. Quindi, se questo fosse conservato in una stringa "s", quindi se abbiamo detto s staffa 0, che sarebbe indicare la Z maiuscola lettera E se dicessimo staffa s 1, che indicherebbe il primo a minuscola, e così via fino a staffa s 5, che indicherebbe l'ultimo a. Ora ricordare che la la lunghezza di questa stringa è di 6, ma gli indici nella stringa sono Da 0 a 5, Z attraverso che durano una. Così questo ora si inserisce in un quadro più ampio della memoria del computer, la RAM. Così qualche programma che si sta eseguendo il computer ha bisogno di ricordare Zamyla trattenuti nella memoria. Così posso avere un volontario? Si per favore. E come ti chiami? DEAN: Dean. ROB BOWDEN: Dean? Piacere di conoscerti, Dean. Allora vieni qui, e stiamo andando ad avere di disegnare sulla nostra bella disposizione elegante di memoria. Ora mi piace pensare di memoria come una lunga striscia di byte, ma solo per scopi di visualizzazione faremo solo che da sinistra a destra, dall'alto verso il basso. ok? Quindi ho intenzione di mostrare una program-- Getstrings.c. E così tutto questo programma è facendo sta chiedendo quattro corde dall'utente con GetString e poi la stampa qualunque cosa che prima stringa inserita è stato. Stiamo ignorando due a quattro. OK. Così qui now-- quando Ho s1 richiesta. Dunque tu sei il computer. E si implementa GetString. Quindi si richiede una stringa da me, e dico, ok, Dean. Dare la stringa "Dean". Quindi, da qualche parte nella memoria bisogno di ricordare "Dean". Quindi scrivere in memoria da qualche parte. Perfetto. OK. Così ora abbiamo s2. E S2 sarà una richiesta di GetString. Quindi ho intenzione di inserire una stringa. Ho intenzione di inserire "Hannah". Quindi immettere "Hannah" da qualche parte nella memoria. Già. A-H. OK, ora s3. E sarà un altro chiedere di GetString. E così ora inserire "Maria". Tutto ok. E poi c'è un ultimo richiesta di GetString, s4. Quindi, io non lo so. Come su andiamo con antidisestablishmentarianism. Quindi immetterlo in memoria. Già. Quindi basta fare "Rob". OK. Così ora explain-- perché ha fatto si lascia questi spazi? Perché hai questo vuoto spazio qui, qui, e qui? Sì. Così notare quando vado stampare s1-- quindi se che mentre sta funzionando "Hannah" proprio accanto a "Dean," come facciamo a sapere quando la stringa "Dean" chiude? Così la stampa del s1 stringa può avere appena stampato "DeanHannahMariaRob" se non ha alcun indizio di quando "Dean" si conclude effettivamente. Tutto ok. Così nella memoria del nostro modo di realtà rappresentare questo fine di una stringa è con backslash zero. Quindi questo spazio è esattamente quello che volevamo. Dovrebbe essere una barra rovesciata zero. Questo sarà un backslash pari a zero, e questo sarà un backslash pari a zero. E si può avere un premio favoloso per essere un volontario perfetto. Prendete una palla di stress! OK. Quindi questo carattere di backslash zero è come si indica la fine di una stringa. E 'come quando un determinato programma vuole stampare una stringa, è how-- ricordiamo che abbiamo imparato la funzione strlen la settimana scorsa? Lunghezza della stringa? E 'come lunghezza della stringa è in grado di determinare per quanto tempo una stringa è. Mantiene solo iterare sui caratteri fino a trovare la backslash carattere zero. Quindi la cosa importante da realizzare circa il carattere backslash di zero si è rappresentato da parte di tutti gli zeri nei bit. Quindi si noti che questo è diverso dal carattere zero. Così il carattere zero, se ti ricordi nell'esempio che ha dato alla fine di conferenza dove i personaggi mappa a-- come mappe capitale A a 65. Minuscola mappe per 97. Minuscole b sarebbe 98. Così il numero 0 mappe a-- non lo faccio conoscere la parte superiore della mia testa. 44 o 45. Da qualche parte in quella regione. Così il personaggio 0 è un numero reale. Ma lo zero backslash mappe per tutti i bit a zero. Quindi c'è una differenza tra backslash lo zero, che chiameremo il terminatore null. C'è una distinzione tra backslash zero e il carattere zero. Tutto ok. Così parla un po 'di più sulle stringhe. Allora che vediamo qui è così sarebbe disposto in memoria. Quindi questa idea di stringhe come una sequenza di modo che il computer characters-- ufficiale termine sciency per la sequenza è un array. Quindi noi chiameremmo una stringa un array di caratteri. E ci sono in realtà altri dati tipi che possiamo fare gli array fuori. Quindi, per motivare questo, guardare un esempio. Lo chiameremo ages0.c io sarò copia e incolla il nostro modello. OK. Quindi, in questo programma di quello che abbiamo voglio fare è prendere l'età di tre studenti del corso. Così sappiamo che la int age-- e ora ho intenzione di dire 0. Così si potrebbe desiderare di dire age1, ma per scopi vedremo molto presto, Dirò int age0 uguale GetInt. Così la stessa chiamata a GetInt che abbiamo usato io non capita di essere la richiesta dicendo: "dammi l'età." Ma appena lo richiede. E age1 uguale GetInt. E int Age2 uguale GetInt. Così, ancora una volta, tre studenti, ma in ultima analisi, gli indici variabili sono age0 attraverso Age2. OK. Quindi questo programma farà tutto ciò che vogliamo con age0, age1, e Age2, ma questo programma alla fine funziona per tre studenti. OK. Così ora che cosa se voglio quattro studenti? Beh, ho intenzione di tornare indietro nel mio codice, modificare il commento, e ora abbiamo un int Age3 uguale GetInt. OK. Allora, chi vede il problema qui? Qual è il problema con questo tipo di impostazione? Già. Già. Così stiamo creando un variabile per ogni studente. Ora che funziona, ma in ultima analisi, quello che se io ora Dico, "Voglio prendere l'età di otto studenti o 16 studenti oi comunque molti studenti di le centinaia di studenti in CS50 o le migliaia di studenti del campus o i miliardi di persone nel mondo? Quindi alla fine questo non è sostenibile. Ogni volta che vedi la copia e incollare il codice come questo, si dovrebbe sentire in generale che vi è un modo migliore. Quindi questo è dove introduciamo una dichiarazione di matrice. Così, quando si dichiara un array, questo è ciò che il formato generale è andare a guardare come. Stiamo andando a dire il tipo. e poi andremo a dare il nome di quella matrice, proprio come noi definiamo un dato variabile. E poi finalmente stiamo utilizzando di nuovo questa notazione staffa ma in un contesto diverso da come lo usavamo in precedenza. Ecco quindi questo sembra un normale dichiarazione di variabile che abbiamo visto. Così abbiamo visto int x virgola prima. Bene, ora potremmo vedere qualcosa come int x staffe 5. E questa idea di mettere in Programma GetInt che have-- in modo che possiamo implementare questo nello stesso modo. Diciamo che in CS tendiamo ad usare n come il numero di qualcosa. Quindi qui stiamo andando a memorizzare quattro studenti. Ed ora possiamo dire int età staffa non n-- abbastanza get it yet-- per dichiarare un array di quattro studenti. Così come questo apparirà in memoria sarà simile a questo. Eliminare questo. E stiamo andando ad avere da qualche parte in memory-- metterò questo lassù. Così qualche parte in memoria. Uno due tre quattro. Abbiamo quattro interi di fila per questo array di quattro interi. Quindi, attualmente, qual è la dimensioni di una di queste caselle? Già. E 'quattro byte. È 32 bit. Così ora questo è diverso dalla matrice che ha visto in precedenza, l'array di caratteri. In una stringa ogni scatola era un solo byte, perché un carattere è solo byte. Ma con una serie di numeri interi, ogni scatola deve essere di quattro byte in ordine per adattare un intero intero. Quindi questo è quello che una serie di quattro interi sarà simile. E poi di nuovo codice. Ora vogliamo realmente negozio interi in tale matrice. Così ora questo è molto, molto, molto modello comune che ad un certo punto diventare memoria muscolare. Così int i è uguale a 0. i meno di n. i plus plus. Fascia di età i è uguale a GetInt. Quindi questo ciclo for, questo formato, si dovrebbe ottenere molto abituati. Quindi questo è il modo in cui sarà generalmente iterare su quasi qualsiasi array. Ora notare questo tipo di spiega perché dall'inizio non abbiamo avuto per i cicli di andare per int i è uguale a 1, i minore o uguale a 10. Il motivo è che a partire dal pari a zero rende questo lavoro bene con gli array. Così gli array indicizzati sono pari a zero. Se questa matrice è di lunghezza 4, gli indici vanno da 0 a 3. Così, attraverso la prima iterazione di questo ciclo for stiamo andando a essere la creazione età Staffa 0 pari ad una chiamata a GetInt. Quindi, qualsiasi Mi è capitato per inserire la tastiera. Nel secondo passaggio, siamo impostazione age1 pari a GetInt. Terzo passaggio, Age2. Ultimo passaggio Age3. Quindi, se nel primo passaggio del ciclo Entro il numero 4 sulla tastiera, poi ci inseriamo un 4 qui. Se al secondo passaggio inserisco 50, metteremo un 50 qui. Il terzo passo potrei inserire negativo 1, negativo 1, e poi finalmente se entro 0-- e ora ricordare che questo era indice di tre. Dopo che noi loop back, i è andare da incrementare a 4. Non ho più è minore di n, che è 4. E noi spezziamo fuori dal giro. Quindi, che cosa sarebbe di sbagliato in questo? [Incomprensibile]? PUBBLICO: [incomprensibile] Sì. Così l'array ha solo quattro posti, il che significa che gli indici da 0 a 3. Quindi, se questo fosse il caso, vorrei assumere il valore di 4 ad un certo punto. fascia di età 4 sarà la creazione qualunque cosa accada di essere qui per quello che ho da dire, digitare 6. Che sarà l'impostazione di questo a 6. Ma noi non sappiamo cosa sia finita qui. Questo non è memoria che abbiamo avuto accesso a. Quindi, se vi ricordate da la lezione precedente, stava stampando i valori di Zamyla e a un certo punto ha colpito questa segmentazione colpa. Quindi, si sarà probabilmente vedendo molti difetti di segmentazione, come si attuare alcuni dei set di problemi. Ma questo è uno dei modi in cui si può incontrare una segmentazione colpa, quando si avvia l'accesso memoria in modi che non si dovrebbe essere. Quindi non abbiamo avuto accesso a questa posizione e questo è un bug. Quindi questo è meglio. Ora c'è ancora un piccolo problema con questo codice. E questo è in fondo che siamo ancora bloccato a quattro studenti. Ora, se voglio usare otto studenti, OK. Non è un grosso problema. Posso andare in, cambiare il commentare, e cambiare n. Ora, questo funzionerà con otto studenti. Se compilo questo ed eseguire questo, mostrerà me-- esso richiederà interi per otto studenti e sarà solo di lavoro. Ma è tutt'altro che ideale per necessità di ricompilare il programma ogni volta Voglio cambiare il numero di studenti che voglio entrare nei secoli per. Così il miglioramento finale sulla questo, come vedremo qui-- siamo andando a chiedere il numero di persone. Qui abbiamo un numero delle persone nelle camere o qualsiasi età delle persone nella stanza. Ma stiamo andando a chiedere il numero di di persone nella stanza da parte dell'utente. Quindi questa è la stessa esatta do-while ciclo che abbiamo visto prima. E 'la stessa identica do-while che si possono essere attuazione sul problema insieme. Quindi, fintanto che sono immissione di un n inferiore a 1, quindi ci deve essere a almeno una persona nella stanza. Finché sono immissione di un n inferiore a 1, allora stiamo andando a continuare a chiedere di nuovo. Si prega di inserire il numero di persone nella stanza. Ora, una volta che abbiamo il numero di persone nel camera-- così potrei entrare in quella lì sono 200 persone in questa stanza. Poi qui stiamo andando a venire e dichiarare un array di dimensione 200. Stiamo dichiarando array che è abbastanza grande per contenere 200 secoli. Scendendo, è il ciclo for che otterrete molto abituati. Così l'iterazione di questa matrice, assegnando ad ogni posizione in tale matrice un numero intero, e quindi in ultima analisi qui siamo solo ottenere un esempio di iterare su tale matrice, non assegnare i valori, ma per accedere ai valori. Quindi, qui vediamo che siamo hanno da dire, un anno da oggi, persona% i sarà% i anni, dove il primo% i è i più 1. Così i è questa variabile indice. E il secondo% i è intenzione di essere il valore memorizzato nella matrice epoche più 1. Quindi questo più 1 è solo perché siamo saying-- questo più 1, età i più 1. Questo più 1 è solo perché siamo dicendo: un anno da oggi la persona sarà questo vecchio. Allora, perché è questo che più 1? Perché abbiamo un più 1 lì? Già. Sì. Quindi ricorda array sono pari a zero indicizzati. Quindi, se noi stampiamo questo per qualcuno di leggere solo l'uscita, allora probabilmente vogliono vedere qualcosa come persona, persona il numero uno, sarà di 20 anni. Numero due sarà di 15 anni. Non Preferisco vedere persona numero zero è di 15 anni. Così compilazione di questo e solo vedere cosa sembra like-- Crea un pò di spazio. Fai età compilazioni. Esecuzione di età. Vediamo numero di persone nella stanza. Quindi io dico ci sono tre persone in camera. Età di persona il numero uno, diciamo 15, 20, 25. Ed ora mi dico tra un anno ora saranno 16, 21, 26. Vediamo che questo funziona con un n non è uguale a 3. Quindi, se io dico numero di persone che è 5, uno, due, tre, due, uno, fra un anno essi saranno due, tre, quattro, tre, due anni. Così ho potuto altrettanto facilmente essere n essere 10.000. Ora sarò seduto qui per un bel una durante l'immissione le età, ma questo funziona. Così ora in memoria da qualche parte ci avere un array di dimensione 10.000, così alla fine 40.000 bytes, perché ci sono quattro byte per ciascuno di tali numeri interi. Quindi c'è una serie di Dimensioni 10.000 dove possiamo memorizzare le età di quelle 10.000 persone. Tutto ok. Domande su tutto questo? Già. Che cosa succede se ti ha dato un numero negativo? Vediamo cosa succede. Quindi, in questo particolare numero case-- di persone nella stanza, quello negativo. Essa ha respinto tale, perché qui ci capita essere la manipolazione del fatto che, se n è meno di quello che stiamo andando a chiedere di nuovo. Se si tenta di dichiarare un array di dimensione negativa, generalmente non funziona. Così proviamo. Ignoriamo qualunque valore che di ingresso per n e dire le età int negativo. Vediamo se si compila anche. Non sono sicuro. No. Quindi età è dichiarata come array con una dimensione negativa. Così in anticipo si riconosce una matrice non può essere di dimensioni negativo e respinge. Ora, se noi non gestiamo questo ciclo do-while correttamente, se non siamo registrati se n è minore di 1-- diciamo che solo non ha avuto questo a tutti e invece abbiamo appena afferrare un intero. Non importa quale che sia intero, dichiariamo un array di quelle dimensioni. Quindi il compilatore non può forse lamentarsi ora. Se compilo questo-- quindi non può lamentarsi, perché non può sapere che sono andando ad inserire un numero negativo, che potrebbe non essere valido. Per tutto quello che sa, potrei inserire un numero positivo, che è perfettamente valido. Quindi immagino che se entro negativo 1 persone nella stanza, Segmentation Fault. Va bene allora. Quindi aggiungiamo questo nuovo solo tenere quello che era in origine. Quindi, fare le età. Ora, se voglio provare una negativo age-- quindi cerchiamo di dicono che ci sono cinque persone nella stanza. Età di persona il numero uno è negativo 4, tre persone è zero, persona sulle tre ruote OK. Così qui, tra un anno, il numero di persone uno sarà negativo 3 anni. Quindi probabilmente non ha senso. Ma questo è solo perché guardando il codice che stiamo facendo tutto sta richiedendo GetInt. Ora, se avessimo avuto la Funzione GetPositiveInt o avevamo fatto semplicemente questo sorta di stesso ciclo while laggiù, allora questo avrebbe funzionato perfettamente bene. Ma in questo particolare caso, proprio non ci siamo capita di essere la gestione dei valori negativi. Tutte le altre domande su array? OK. Così ora abbiamo visto array. E stiamo andando ad avere bisogno di utilizzare questo per gli argomenti della riga di comando. Così nel problema impostare two-- So che molti di voi potrebbe ancora essere al lavoro sul set problema uno, ma il problema impostare due sta arrivando. Nel problema impostare due, si sta andando a necessario avere a che fare con le stringhe, array, e gli argomenti della riga di comando. Ma quali sono gli argomenti della riga di comando? Ora, si può vedere qui un piccolo teaser per esattamente ciò che è andando ad accadere. Vediamo int main, argc inc, Staffe corda argv. Quindi, prima cerchiamo di interpretare cosa che sta cercando di dire. Ora ok. Così, alla riga di comando si dovrebbe essere abituarsi ad alcuni di questi comandi ora, e probabilmente avete eseguito cd nel terminale prima. Quindi, se diciamo cd pset1, si sa che che dovrebbe essere la modifica nella directory pset1. Ora nota che non hai mai scritto un programma come questo prima. Ogni programma che hai scritto, si dovrebbe eseguire, per esempio, Dot tagliare Mario, dot taglio su avidi, e poi potrebbe richiedere per l'input. Ora, questo non è quello che cambia directory fa. Quando si esegue cd, non poi dire, che directory vuoi cd in? Invece, basta dire, cd pset1, e si va solo nella directory pset1. Così allo stesso modo abbiamo altri esempi. fare ciao. Quando si esegue fare, non poi dire, quale programma ti piacerebbe fare? Basta dire, al riga di comando fanno ciao. Move è un altro esempio. Questo ci stiamo muovendo il mario.c archiviare su una directory. Così ora sappiamo con questo esempio siamo davvero passando due argomenti. C'è mario.c come primo argomento, e punto punto è il secondo argomento. E poi, quando si esegue fate, voi vedere che il comando davvero lunga line-- tale comando davvero lunga stampato nella riga di comando. In modo che questo lungo command-- è solo una breve parte di esso, ma ora abbiamo tre argomenti della riga di comando. Dot precipitare a zero, ciao, e hello.c. Quindi questi sono da riga di comando argomenti, argomenti che si sta passando al riga di comando in modo che non deve essere richiesto quando si esegue il programma. Sarebbe frustrante se quando è stato eseguito Clang ha detto, "OK, che program-- che lima stai compilazione? Ciao C. Che cosa faresti bandiere inserisci? dash o. Cosa ti piacerebbe il file di essere chiamato? Ciao. No, basta eseguire clang dash o ciao hello.c. Quindi, guardando indietro a questo. Ora argc argc-- è i conteggi argomento. E 'il numero di riga di comando argomenti inseriti nella riga di comando. Beh, tecnicamente argv-- la V sta per il vettore, il che significa fondamentalmente array. Ma si può ignorarlo. Argv-- abbiamo corda argv, così parentesi corda argv. Quindi questa è un'altra forma di parentesi, non avete mai visto prima. Staffa in modo che abbiamo visto notazione quando abbiamo detto, come, stringa s è uguale Zamyla. s staffa 0 accede alla Z. carattere Abbiamo visto anche le staffe quando abbiamo detto int età staffa 5. Che ha dichiarato un array di dimensioni 5. Così qui è una versione del staffe noi non hanno mai visto prima. Quindi questo tipo di corda che argv sarebbe del tutto familiare che sarebbe solo una stringa. Ora le parentesi indicano che questo è un array. Così staffe corda argv mezzi che argv è un array di stringhe. Ora tecnicamente una stringa è un array di caratteri. Quindi, questo è ora un array di un array di caratteri. Ma è molto più facile da pensare questo come solo un array di stringhe. Allora, perché potrebbero le staffe essere vuoto? Come, perché non possiamo dire, Staffa 5, staffa n? Già. Già. Non sappiamo quanti ingressi ci saranno. Quindi, se guardiamo l'esempio clang, diciamo Clang trattino o ciao hello.c. In questo caso particolare, ci capita essere tre argomenti della riga di comando. E così la brackets-- vedremo in un secondo non sarebbe tre. Tecnicamente sarebbe quattro. Ma le staffe, avremmo per esempio, ci sono tre. Ma ora, se abbiamo guardato mossa mario.c dot dot, le staffe vorremmo mettere due in loro. E ci sono un sacco di comandi che avere un numero variabile di riga di comando argomenti. Allora, cosa questa versione del notazione di parentesi indica è che argv è un array di stringhe. Ma noi non sappiamo quanti stringhe sono in tale matrice. E come facciamo poi sappiamo come molte stringhe sono nella matrice? Questo è il punto argc. argc ci dice quanto tempo è argv. Quindi l'ultima cosa da tenere a mente è che, tecnicamente, il comando stesso conta come uno degli argomenti della riga di comando. Così cd pset1, ci sono due argomenti della riga di comando. Il programma in sé, cd, e poi la parte tesi reale di esso, pset1. Qualsiasi programma che hai scritto finora ha avuto un puntino riga di comando argument-- tagliare Mario. Questo è l'unico argomento della riga di comando. Così ora guardando clang dash o ciao hello.c. Allora, qual è argc? 4. Così argc è 4. Clang, così argv staffa 0 è clang. Staffa argv 1 è dash 0. Staffa argv 2 è ciao, e Staffa argv 3 è hello.c. Ok, quindi domande su questo, e poi ci vedere alcuni esempi programmatiche. OK. Quindi daremo uno sguardo a hello3.c. Quindi questo dovrebbe essere familiare da uno dei primi esempi c abbiamo avuto dove ci sarebbe solo dire, ciao mondo, ma ora è più generale. Quindi qui stiamo dicendo ciao % s backslash n staffa argv 1. Notice-- così fino a questo punto, si tratta di ciò che il mio file di modello ha guardato come. Ho avuto int main (void), e quindi vorrei fare qualcosa nella funzione principale. Ora, invece, una volta che iniziare a trattare con gli argomenti della riga di comando, abbiamo bisogno di affermare un diversa forma di principale. Così guardando hello3 di nuovo, la principale sta di prendere due argomenti now-- int argc, il numero di argomenti della riga di comando, e la stringa argv parentesi, l'attuale stringhe inserite nella riga di comando. Quindi ho intenzione di cambiare la situazione modello per riflettere questo fatto. Ora ogni volta che si scrive un programma, se non lo fai devono intraprendere alcuna riga di comando argomenti, allora basta usare int main (void). Ma ora, quando si sta scrivendo programmi di argomenti della riga di comando, che hai intenzione di fare per il problema set two-- ora che si sta eseguendo programmi che devono prendere gli argomenti della riga di comando, è necessario avere principale di questa forma. Quindi qui-- questo è il grande utilizzo dell'argomento della riga di comando. Così la stampa argv 1. OK quindi cerchiamo di compilazione ed eseguire questo programma. Fai hello3. Compila. Dot taglio su hello3. E diciamo, "Rob". Ciao Rob. Se dico, "ciao Maria," ciao Maria. Ciao Maria. Hannah dice ancora, "ciao Maria, "perché non sono di fare qualsiasi cosa con il nostro argv 2. Argv 2 ora sarebbe "Hannah". Argc sarebbe 3. Che cosa succede se ho fatto questo? Quindi ciao nullo. Ha accennato brevemente sul fatto che, tecnicamente, GetString potrebbe restituire null, ma staremo a ottenere un molto più in quello che è in realtà nullo. Ma prendere come una questione di fatto che non è generalmente male. Abbiamo fatto qualcosa di sbagliato se è la stampa "ciao nullo." E il motivo per cui abbiamo fatto qualcosa che non va è-- bene, quando mi sono imbattuto puntino barra hello3, argc era 1. Così che indica la lunghezza di argv era 1. Se un array è di lunghezza 1, l'unico indice valido è zero. Ed ecco argv 1 è al di fuori la gamma di questa matrice. E 'stato simile a prima, quando ho provato memorizzare 6 all'esterno dell'estremità della matrice. Così sto cercando di accedere a qualcosa al di fuori dei conti argv, e stiamo ottenendo nulla. Così una versione migliore di questo, un miglioramento, sta controllando in modo esplicito argc. Quindi, se argc è uguale a 2, questo significa che abbiamo corso qualcosa di simile a puntino barra hello3 Rob. E stamperà "ciao Rob." Se argc non è uguale 2, allora è solo andare di ignorare ciò che si mette presso l'argomento della riga di comando come argomenti della riga di comando. Oppure, se non avete messo non del tutto, è solo andando a ignorare che e dire, "ciao te." Quindi compilazione di questo. Fai hello4. E correndo hello4. L'esecuzione in questo modo, quello che dovrebbe essere stampato? "Ciao tu". Ciao voi. Che dire hello4 Rob? "Ciao Rob." E, infine, ciao Rob Maria è solo "ciao You" di nuovo, perché non hai realmente immesso qualcosa che si aspettava. Hai inserito più nomi quello che poteva gestire, quindi è solo impostazione predefinita: il ciao voi comportamento. Così domande su questo? O gli argomenti della riga di comando? OK, allora dare un'occhiata a un altro paio di esempi di utilizzo da riga di comando arguments-- primo abbiamo argv trattino 1 punto c. Così i commenti dare via ciò che questo programma dovrebbe fare. Ma bando now-- questo ciclo for, questo corrisponde al modello esatto Dicevo prima. Siamo appena capita di essere utilizzando argc anziché n. Ora argc è davvero il n. E 'la lunghezza dell'array argv. Così sono iterare su il argv matrice printf-ing ogni valore argv. Quindi, se faccio questo. Fai argv 1. Si compila. Dot taglio su argv 1. Solo in esecuzione questo, stampe punteggiano barra argv 1 dal momento che era l'unica linea di comando argument-- il nome del programma. Ci sarà sempre almeno: argc non può essere inferiore a uno, dal momento che ci sarà sempre almeno essere il nome del programma da eseguire. Così argv 1 Rob stamperà argv 1 e poi sulla nuova linea "Rob". Così nella prima iterazione di questo ciclo, i è 0. Argv 0 è il nome del programma. Dot taglio su argv 1. E poi argv 1 è il mio primo argomento della riga di comando, che è Rob. A questo punto, siamo uguali a argc. Rompiamo fuori dal giro e abbiamo finito. Quindi questo lavoro per un arbitrario numero di argomenti della riga di comando. Notate la stampa argv 0, argv 1, argv 2, argv 3, argv 4. E non c'è argv 5. argc è pari a 5. Così a argc-- a i è uguale a 5, rompiamo fuori dal giro. OK. Così domande su che prima di noi guardare un esempio più complesso? Così argv 2. Tutto ok. Quindi stiamo ancora la stampa gli argomenti della riga di comando. Ma ora noti che ci sono una annidata ciclo for. Allora, cosa sta facendo questo? Quindi il primo ciclo sta facendo esattamente quello che ha fatto prima. Stiamo ancora looping sopra ogni argomento della riga di comando, ma ora questa seconda loop-- abbiamo anche visto qualcosa di simile prima. Quando è stato iterazione su Zamyla stampando Z-A-M-Y-L-A. Quindi questo secondo ciclo di int j uguale 0, n uguale strlen della staffa argv i. Quindi cerchiamo di pensare per prima the-- camminiamo attraverso. Pensiamo ciò che il computer sarebbe fare se ho eseguito questo programma come solo dot tagliare argv trattino 2. Quindi, se ho eseguito questo codice, poi argc sta per essere uguale a 1. E stringa argv-- c'è solo sta per essere un indice in argv, e che sta per essere uguale a dot tagliare argv 2-- il nome del programma. OK, ora mi è uguale a 0, i meno 1, i plus plus per int j è uguale a 0, n uguale strlen della staffa argv 0, quindi in la prima iterazione di questo ciclo. argv Staffa 0 è barra puntino argv 2. Allora, qual è la lunghezza della stringa? Beh, dot tagliare A-R-G-V tratto 2. Così strlen di che sarà di 8. Così j è uguale a 0, n è uguale a 8. Finché j è minore di 8, j ++. E con questo abbiamo intenzione di essere la stampa di un singolo carattere, che è argv staffa i staffa j. Quindi l'unica i è zero. Abbiamo ancora un solo argomento della riga di comando. In tale prima iterazione del ciclo for, siamo sta per essere la stampa Staffa argv 0 0 staffa. E poi j sta per incrementare. E stiamo andando a stampa Staffa argv 0 staffa 1. E poi argv staffa 0 staffa 2. Quindi questo è il nostro primo incontro di array multidimensionali. Ricordo in precedenza che ho detto che argv è tecnicamente un array di array di caratteri. Così qui se ho detto qualcosa di simile stringa s è uguale a staffa argv i, e poi ho detto, s j staffa, questo sarebbe realizzare la stessa cosa. Ora, avete staffa j visto s prima. Questo è solo accedere al j-esimo carattere di questa stringa. Quindi, con questo, stiamo ottenendo il carattere j-esimo del argv i-esimo. Così che cosa dovrebbe in ultima analisi questo uscita? Fai argv 2. Si compila. Dot taglio su argv 2. "Rob Maria Hannah," e ci dà un certo spazio. Così vediamo che questa è in uscita puntino su una riga separata e barra su una riga e sulla propria riga. E 'la stampa di ogni carattere individuale di ogni argomento della riga di comando. E poi tra di loro, a causa di questa nuova linea stiamo stampando qui, in tra di loro che sarà stampare una nuova linea. Quindi questo è simile il priore trattino argv 1, che stampa ogni argomento della riga di comando, ma ora stiamo stampa gli argomenti della riga di comando e poi iterazione attraverso ogni carattere di ogni argomento della riga di comando per ottenere questo risultato. ok? Così domande su questo? Una cosa da notare è che da riga di comando arguments-- in modo che siano separati da spazi come si sarebbe naturalmente aspetta che siano. Quindi una stringa può avere spazi in esso. Non è super importante, ma se io voleva che il terzo argomento della riga di comando di avere uno spazio in esso, allora io potrebbe dire qualcosa di simile. ok? Così questo ora ha ancora solo tre da riga di comando ben arguments-- 4. Dot taglio su argv tratto 2, Rob, Maria, e Hannah Bloomberg. OK. Domande su questo? Non c'è niente di speciale circa il carattere di spazio. Succede solo essere che il da riga di comando considera il carattere di spazio come come separare ciascun argomento. Tutto ok. Allora insieme Problema two-- si sta andando ad essere guardando la crittografia a chiave segreta. Quindi, simile a quell'esempio abbiamo visto da Una storia di Natale, si sta andando ad essere l'attuazione di alcune algoritmi che, dato un messaggio, si sta andando ad essere in grado per cifrare il messaggio che solo qualcuno con quel segreto chiave, con quell'anello decoder, dovrebbe essere in grado di decifrare. In modo che sia l'edizione standard. Si sta andando ad essere attuare due differenti versioni. Se vi capita di dare un'occhiata presso l'hacker edition-- ora, stiamo andando a dare una stringa come questo, che rappresenta una password crittografata. Così il vostro obiettivo è quello di capire ciò che la password è decifrato. Ora, questo è in realtà come le password sono memorizzati in un sacco di computer, e memorizza solo questo stringa casuale di caratteri. Dovete capire come ottenere da questa stringa casuale di caratteri a ciò che la password originale è stato. E finalmente, dopo questo set problema, si dovrebbe essere in grado di capire ciò che questo significa. Così si imparerà a decifrare questo tipo di stringa casuale. Allo stesso modo, se vi ricordate di settimana 0, si potrebbe avere visto questo URL. E si dovrebbe essere in grado di decifrare questo alla fine. Potrebbe non essere felici quando si decifrare e fare clic sul link. Tutto ok. Questo è tutto per oggi. Così vediamo la prossima settimana! [RIPRODUZIONE MUSICA ELETTRONICA]