DAVID MALAN: Va bene. Quindi questo è CS50, e questo è ora dell'inizio tre settimane. Quindi, fino ad ora, abbiamo stata la scrittura di programmi in C quello sguardo un po ' qualcosa di simile a questo qui. Quindi abbiamo un paio di tagliente comprende in alto. Abbiamo int, principale, vuoto, e poi qualcosa da fare nel mezzo, qualche pezzo di codice all'interno di tale funzione. Ma fondamentale è stato il fatto che stiamo dicendo nulla qui. Quindi nulla, tutto questo tempo, specifica che questo programma, quando eseguito, può essere eseguito solo tramite il suo nome. Non è possibile digitare qualsiasi altra parola o numeri dopo il nome del programma quando eseguirlo. Così, per esempio, se il programma fosse compilato in un file chiamato ciao, si potrebbe fare ./ciao, ma che è esso. L'unico modo che si potrebbe fornire input a questo programma è chiamando una funzione. Ad esempio, quale funzione abbiamo avuto usando finora per ottenere input da parte dell'utente? PUBBLICO: Get stringa. DAVID MALAN: Per ottenere stringa, o ottenere int, o avete visto gli altri, anche se non li avete ancora utilizzato, come ottenere lungo, lungo e simili. Ma supponiamo che in realtà vuole iniziare scrivere programmi che sono poco più versatile, e, francamente, un po 'di più come i comandi che hai stato sempre, si spera, un po 'abituato. Come cd spazio Dropbox. Questo, naturalmente, cambiamenti la directory, supponendo sei in casa di John Harvard directory, la cartella Dropbox. Nel frattempo, un comando come questo crea una nuova directory denominata pset2, come si potrebbe avere già o sarà presto per il problema di impostare due. Fare Ciao, naturalmente, è un comando che costruisce un programma chiamato ciao da un file chiamato ciao dot c. E in ciascuno di questi casi, ora, abbiamo avuto fornire un argomento sul cosiddetto riga di comando, il prompt lampeggiante, in modo che make sa cosa costruire, e così che mkdir sa cosa cartella per creare, e in modo che conosce cd dove si vuole andare. Ma fino ad ora, noi continuiamo a dire quella principale, la funzione di default, ha un'espressione vuoto all'interno di queste parentesi, il che significa che non può prendere alcun argomento. Quindi a partire da oggi, quello che stiamo andando a fare è, stiamo andando per iniziare sostenere cose come questa, anche. Infatti, in questo caso, che si non tipicamente digitare manualmente, Rendere ha fatto questo per noi, non ci sono uno ma uno, due, tre ulteriori stringhe dopo il programma del nome clang. Quindi, come possiamo raggiungere questo obiettivo? Ebbene, a partire da oggi, nei casi in cui vogliamo di fornire un contributo attraverso il cosiddetta riga di comando, stiamo per iniziare ad aggiungere ecco che cosa è in yellow-- sostituendo vuoto con int argc virgola stringa argv parentesi aperta parentesi quadra chiusa. Ora questo è interessante per un paio di motivi. Uno, sta andando a farci scrivere programmi che sono un po 'più dinamico. Ma, più convincente, sta andando ad aprire ora una conversazione da cosa array può davvero essere utilizzato, per quanto una stringa è realmente sotto il cofano, fino alla prossima settimana quando cominceremo immersioni in ancora più profonda di come la macchina è facendo tutto questo lavoro roba. Ma per ora, andiamo a disegnare, forse, una foto. Quando si scrive un programma con il principale dichiarata in questo modo, tale che principale prende due argomenti, un int e- che tipo di dati è il secondo argomento? PUBBLICO: Array. DAVID MALAN: Array. Così sembra a prima vista come se fosse un stringa, ma notare le parentesi quadre. Ricordiamo l'ultima volta abbiamo introdotto la nozione di un array. E array usano parentesi quadre in un paio di contesti. È possibile utilizzare la piazza staffe di andare in un array e ottenere un particolare elemento, come Staffa di 0 o 1 o staffa staffa 2. Ma abbiamo visto, se brevemente, la settimana scorsa che anche voi utilizzare queste parentesi quadre a dichiarare la dimensione di un array, se si conosce in anticipo quante int o quante stringhe o quello che in realtà vogliono. Così si scopre là di un terzo contesto qui che non ha numero interno delle parentesi quadre. Quando si specifica, come ho fatto qui, il nome di qualcosa come argv, che è solo un modo elegante di dicendo argomento vettore, che è un altro modo di fantasia dicendo una serie di argomenti, Staffa di aprire chiudere staffa appena significa che non si fa necessariamente sapere in anticipo quanto grande l'array sta per essere, ma si sa che sta per essere un array. Quindi, se non si conosce la numero non mettere in là, Staffa per aprire chiudere staffa significa che argv non è una stringa, ma un array di stringhe. Quindi sintatticamente, se ripensare la scorsa settimana, è molto simile a dire qualcosa come int età staffa aperto, e poi qualcosa in seguito. Così che cosa questo assomiglia? Facciamo in realtà fare un disegno. Così, quando si esegue questo programma con principale avendo due argomenti definiti all'interno di queste parentesi, si in sostanza, avere almeno due pezzi di memoria consegnato a voi sotto la cappa. Uno, come ti attira come questo rettangolo, sta per essere chiamati argc. E proprio come un breve riepilogo, qual è il tipo di dati di argc? Quindi è un int. Così un numero sta per andare a turno argc-- che sta per numero di argomenti. Nel frattempo, ho disegnato argv come un array. E io non lo so quanto tempo ci sarà, quindi per scopi di oggi dot dot dot. Si potrebbe ottenere di una certa lunghezza. Ma ho immaginato qui almeno quattro rettangoli. Così argv un pezzo di memoria che memorizza stringa stringa stringa dot dot dot, e argc è solo un pezzo di memoria per un numero intero. Così ora, cerchiamo di essere un po 'più preciso. Se, quando ho stringhe in questo array, chiamato argv, voglio arrivare a loro individualmente, proprio come la scorsa settimana, stiamo andando a utilizzare la notazione come staffa argv 0 per ottenere la prima cosa che un array. Staffa argv 1 per ottenere il seconda cosa, e così via. La chiave qui è che siamo ancora 0 indexed-- stiamo ancora contando da 0. Così ora cerchiamo di realtà mettere qualcosa in questo. Se dovessi compilare un programma chiamato ciao da un file chiamato ciao punto c, e poi ho eseguito quel programma con il puntino tagliare ciao, quello che fa il mio computer, il mio computer portatile, simile sotto il cofano il momento corro dot tagliare ciao e premere Invio? Beh, questo è forse quello che potremmo definire come il contenuto del tuo computer memoria, o memoria RAM-- Random Access. In altre parole, il computer, in qualche modo per voi magicamente, mette il numero 1 in argc, AKA argcount, e mette letteralmente la stringa ./ciao in staffa argv 0. Non ne ho idea, francamente, che cosa è in staffa argv 1 o 2 o 3, perché se l'utente non ha digitato nulla oltre ./ciao, stiamo andando a supporre che questi sono valori di immondizia più probabili, per così dire. Quei blocchi di memoria esiste, ma non sta a noi a guardarli, perché l'argcount è solo uno. Ora, intanto, se io scrivi eseguire un altro programma, cd, che è più propriamente un comando, nel vostro lampeggiante spazio cd prompt-- Dropbox-- quando corro che, di fatto, quando viene eseguito il programma cd, argc, all'interno della memoria del computer, è per il più più breve secondo il numero 2. E poi argv staffa o ha cd, staffa argv 1 ha Dropbox, e poi naturalmente il comando completa, così tutti questa memoria in sostanza, se ne va e è utilizzato per qualcos'altro. Ed è per questo che dico solo una frazione di secondo. Nel frattempo, se facciamo mkdir pset2, il quadro è quasi la stessa, ma con diverse stringhe all'interno argv. Se faccio clang dash ciao ciao dot c, stessa idea. Più roba è compilato per argv e argc, naturalmente, è 4. Quindi, in altre parole, anche se questo array potrebbe essere dot dot dot, di alcuni lunghezza variabile, per così dire, si sa sempre dove alla fine di esso è, perché argc sta per dirti a che punto si deve fermare guardando elementi in argv. Potete guardare solo alle quattro in totale in questo caso. Quindi cerchiamo di ora un'occhiata a, forse, un semplice programma. Uno che dice solo ciao a qualcuno come Zamyla. Quindi io rivendico ho intenzione di scrivere un programma in un momento attraverso il quale ho potuto fare ./ciao spazio Zamyla, e poi voglio il mio programma per stampare qualcosa super-semplice come "ciao, Zamyla." Ora, in passato abbiamo usato getString. Quindi, in passato, anche se siete nuovi alla programmazione, probabilità sono si potrebbe improvvisare una programma che utilizza getString e quindi utilizza printf per dire ciao a Zamyla. Ma non usare getString questa volta. Lasciatemi invece vado in appliant e non includono standard di I O dot h. Lasciatemi includo anche CS50 dot h. Ora int main, e ora sono non andare a fare nulla oggi. Invece, ho intenzione di fare int argc stringa argv parentesi aperta parentesi quadra chiusa, Non specificando un numero. Ed ora ecco la mia cosiddetta a fare. Quello che ho intenzione di fare adesso è, io sono intenzione di fare un po 'di un atto di fede, Ho intenzione di assumere che l'utente del intenzione di usare questo programma correttamente, e sto semplicemente andando a fare printf ciao, sn%. Quindi niente di nuovo lì. Ma voglio ora mettere qualunque parola tipi di utente dopo il nome del programma. Quindi se faccio ./ciao spazio Zamyla, ho vogliono in qualche modo l'accesso a livello di programmazione tra virgolette "Zamyla." così ho può andare nel mio ragionamento vettore, il mio array di stringhe, e se il comando, ancora una volta, era ./ciao spazio Zamyla, che numero voglio mettere in argv qui? PUBBLICO: 1. DAVID MALAN: 1, perché Staffa 0 risulta sta per essere il il nome del programma, come abbiamo visto. Quindi staffa 1 è la prima parola che io, l'utente ha digitato. Ho intenzione di andare avanti e salvare questo. Ho intenzione di andare nella mia cartella dove ho messo questo file. Ho intenzione di fare fare ciao 3. OK di Comp IO. ./ciao Zamyla Invio. Che cosa ho fatto di sbagliato? Sono stato colto di sorpresa me stesso per un attimo lì. Che cosa ho fatto di sbagliato? PUBBLICO: Nome. DAVID MALAN: Il file del in realtà chiamato hello3.c. E l'ho fatto solo per coerenza, perché abbiamo hello.c avuto di in passato nel codice linea. Quindi cerchiamo di fissare questo ./ciao Staffa cruscotto 3 Zamyla. Invio. E ora abbiamo ciao, Zamyla. Nel frattempo, posso cambiare questo essere Rob, o davvero qualsiasi altra parola. Ma consideriamo un caso d'angolo. Che cosa potreste aspettarvi accadrà se Non digitare il nome di qualcuno a tutti? PUBBLICO: Errore. DAVID MALAN: Un errore di qualche tipo, forse. Vediamo. Invio. Null. Così printf sia effettivamente un po protettiva di noi qui, e letteralmente stampa paren aperte nullo, ma le cose ancora peggiori possono accadere. E proprio per dimostrare qualcosa che assolutamente non dovrebbe fare, andiamo in qui e iniziare a frugare. Giusto? Se so che l'immagine nel la memoria è essenzialmente questo, Staffa argv 1 ha Zamyla, argv Staffa 0 ha ./ciao, o ./ciao-3. Che cosa è in fascia 2? Quindi posso rispondere mettere in discussione me stesso, giusto? Posso solo cambiare l'1 a 2. Ora posso ricompilare ciao 3, ./hello3 Facciamo ingrandire e premere Invio. Ops. Nessun segno di citazione. Interessante. Ecco, questo è tipo di fresco a vedere cos'altro è qui. Quindi, che cosa è all'interno del mio computer portatile? Salviamo con staffa 3. Fai hello3, ./ciao-3. Curioso. E ora veniamo davvero bold-- 50. Ecco, questo è davvero immersione profonda nella memoria del mio computer. 50 indici in. Quindi, fare ciao 3 ./ciao-3. Curioso. Va bene, ora sono solo intenzione di ottenere sconsiderate. Andiamo a 5.000. Bene. Quindi lasciatemi ricompilazione. Fai hello3, ./ciao-3. Ok. Ora alcuni di voi, ci potrebbe essere una lampadina andare fuori. Quanti di voi avete visto questo messaggio prima? Ok. Allora, perché? Odds are-- e c'è diverso cose che possono causare questo, e chiaramente sei in buona company-- abbiamo chiaramente causato ciò che si chiama un segmentation fault. E lunga storia breve per oggi, io hanno toccato un segmento di memoria che non avrei dovuto. Quando un segmento significa solo un pezzo di memoria che non avrei dovuto. Ora il computer garantisce che se io eseguire ./helloZamyla che posso toccare argv essere staffa 0 e argv staffa 1. Ma argc è il valore 2, che significa che sono solo allowed-- è una sorta di onore system-- al tatto Staffa 0 e la staffa 1. Se vado oltre, c'è assolutamente intenzione di essere lì la memoria. La mia RAM esiste fisicamente nel computer. Ma chi sa che cosa c'è? Anzi, sto correndo multipla programmi in una sola volta. Potrei ho seen-- se non fossi In questo modo il appliant ma sul mio Mac o PC-- potrei avere visto il contenuto di una e-mail. Ho potuto vedere un istante messaggio che ho recentemente inviato. Tutto ciò che potrebbe essere persistente intorno a memoria avrebbero potuto essere letta mediante questa arbitraria notazione parentesi quadra. O, ancora peggio, si potrebbe avere trovato una delle mie password che avevo recentemente digitato, che un programma era memorizzato in modo per autenticare me, e poi solo tipo di lasciato nella RAM fino a quando ho smesso di quel programma. Ed in effetti, questo è uno dei il pericolo e uno dei poteri di usare un linguaggio come C Avete accesso illimitato a tutti i contenuti di memoria di un programma, e quali cattivi può anche fare in quelle di casi, soprattutto quando si arrivare alla programmazione web verso la fine del semestre, faremo rivisitare questo topic-- è curiosare, potenzialmente, di qualcuno computer memoria e trovare tali cose curiose come abbiamo visto lì. O peggio ancora, le password che si o lei può utilizzare per fare cose cattive. Quindi chiaramente che non avrei dovuto fare questo, perché le cose strane cominciano ad accadere. In effetti, questo è un programma di crash. Questo sarebbe l'equivalente di Mac OS o Windows una finestra di programma appena scomparsa. Si è verificato un errore imprevisto. Nell'ambiente della riga di comando vediamo qualcosa di simile. Ma è per questo, è che io sono semplicemente toccando memoria che non appartiene a me. Quindi cerchiamo di difendere contro questo un po 'in modo diverso cercando in questo programma. Quindi, di nuovo, lo scheletro che abbiamo visto earlier-- e ho evidenziato questa volta int. E tutto questo tempo principale ha infatti restituito un valore. Anche se nella maggior parte della nostra lezione esempi non abbiamo mai usato una volta restituire nulla in principale. Abbiamo appena scriviamo printf vicino parentesi graffa e questo è tutto. Ma gratuitamente, ciò che il compilatore sta facendo per te, efficace, sta tornando 0 per voi. Attiva fuori-- ed è un po ' counterintuitive-- che 0 è buono. Ciò non significa falso di per sé. 0 è buono, ed ogni non-0 valore, il mondo ha deciso, può significare un errore. Quindi, se hai mai incasinato qualcosa sul vostro computer, o di un programma è appena morto su di voi e hai ottenuto qualche finestra erronea sul vostro schermo, errore che dice negativo 49 o errore 23-- alcuni value-- apparentemente arbitraria che è perché un programmatore è hard-coded un valore negativo come 49 o positivo 23 per rappresentare qualsiasi numero, oserei dire, di 4 miliardi di cose possibili che potrebbe andare storto in un programma. Così come potrei prendere vantaggio di questo me stesso? Beh, mi permetta di aprire un programma che ho scritto in anticipo, e curiosare on-line chiamato ciao 4. Ed è quasi identico, salvo che la sua ha un po 'di controllo degli errori. In questo caso, ho ancora una volta dichiarato principale come prendere due argomenti, ma questa volta, sulla linea 17, avviso Sto facendo un po 'di un controllo di integrità. Sto facendo in modo che argc è uguale uguale a 2. Perché se lo è, che significa che posso tranquillamente toccare non solo la staffa 0, ma la staffa 1. E vado avanti e stampare, in questo caso, Zamyla o Rob o qualunque parola che ho digitato fuori. E ora solo per ottenere un po 'più corretta, Ho intenzione di tornare in modo esplicito 0 a significare tutto bene. Niente di male è accaduto. Ma, per convenzione, ho intenzione di ritorno 1, o francamente any-0 non valore, se qualcosa è andato storto. Ora l'utente non sta per davvero notare cosa sta succedendo. Infatti se vado in questa directory, noi lo zoom avanti e facciamo ciao 4, ./ciao-4 Zamyla si comporta come mi aspetto. Ma se invece non digitare nulla, nulla sembra accadere, ma non va in crash. E se io invece faccio qualcosa come Rob è un procuratore in condivisione Thayer-- informazioni arbitrarie. Ma notate, argv 1, 2, 3, 4, e 5 dovrebbe ora esistono in memoria. Anche questo, non quello che è il mio programma prevede, perché ho controllato se argc è uguale uguale a 2 o meno. Così ora sto difendendo contro questo. Ora, come un a parte, abbiamo la programmer-- o meglio abbiamo la users-- mai vedere che 0 o 1, ma utilizzando una strumento chiamato debugger, o altri strumenti, come vedremo prima lungo, è il programmatore può effettivamente vedere che cosa potrebbe essere andando male all'interno del vostro programma. Quindi, tutte le domande su argc? Già. PUBBLICO: Ho visto dove non hanno avuto il carattere, [incomprensibile] appena detto stringa stella d, come carattere asterisco virgola. Sono equivalenti qui? DAVID MALAN: Sono. Quindi la domanda è, avete di tanto in tanto visto programmi come questo che non lo fanno dire staffa stringa argv ma invece dire qualcosa come char staffa stella argv. E c'è anche altro varianti che si potrebbe vedere. Essi sono infatti equivalenti. Per ora, abbiamo questi tipo di ruote di formazione sul sotto forma di stringa nel CS50 biblioteca, ma in poco più di una settimana o giù di lì che andremo a rimuovere tale ostruzione del tutto e in realtà guardare a ciò che il carattere e la stella sono, e come quelli che si riferiscono a memoria rappresentazione più in generale. Quindi torneremo a questo. Altre domande sul nostro argv o argc? Già. PUBBLICO: Perché è di ritorno un errore [incomprensibile]? DAVID MALAN: Perché lo ha fatto restituisce un errore only-- oh! Nel caso precedente, quando abbiamo sono stati futzing in giro con la memoria, perché solo restituire un errore quando ho davvero digitato un numero grande? Risposta breve è, siamo appena stati fortunati. In generale, un computer alloca la memoria in blocchi, e mi ha dato una grossa fetta abbastanza che Ho visto via, senza essere notato, della staffa toccare 2, staffa 3, staffa 50, ma appena spingevo la mia fortuna, sono andato al di là del confini del blocco di memoria il sistema operativo mi aveva dato. E questo è quando si giro di vite e ha detto, no. Errore di segmentazione. Già. PUBBLICO: Come funziona il computer conoscere il valore di argc? DAVID MALAN: Come funziona il computer di conoscere il valore di argc? Quando si esegue un programma, quel programma, dalla natura del prompt lampeggiante, viene consegnato l'array di parole che sono state digitate al prompt, che era digitato al prompt. E così è la vostra operativo sistema che essenzialmente popola gli argomenti principali di per voi. Ecco, questo è uno dei servizi che si ottiene, una sorta di segreto sotto la cappa di un sistema operativo. Altre domande? Già. PUBBLICO: Cosa core dump significa? DAVID MALAN: Cosa core dump significa? Quindi questa è una buona domanda. E mi permetta di tornare in questa directory qui. E si noterà che Ho un nuovo file lì. Si chiama infatti nucleo, ed è in realtà di solito un file di dimensioni decenti. Questo è essenzialmente uno snapshot di il contenuto della memoria del mio programma o RAM quando si è schiantato. E questo sarà utile, potenzialmente, diagnostico, una volta che si parla in un futuro lezione e la sezione sul debug, perché si può effettivamente fare la equivalente di una autopsia digitale su quel file per aiutare a capire quello che hai fatto di sbagliato nel vostro programma. Già. PUBBLICO: È argc un comando in in sé, o si può chiamarlo qualcosa? DAVID MALAN: Bella domanda. È argc un comando in sé, o si può chiamarlo qualcosa? Non è sicuramente un comando. E 'semplicemente una variabile di nome o il nome di un argomento, e così assolutamente noi potrebbe chiamare questo foo, potremmo chiamare questo bar, che tendono ad essere il go-to le parole che un computer scienziato va. Ma, per convenzione, usiamo argc e argv. Ma questo è solo un essere umano convenzione, niente di più. Bene. Così risulta, sono stato raccontando un po 'di un lie-- bianco e francamente, in futuro, si vedrà stiamo dicendo altre bugie bianche. Ma per ora, stiamo andando a buccia indietro uno di questi. In questo caso qui quando ho già correva un programma come ./ciao o ./ciao-3 Zamyla, abbiamo avuto il contenuto del mio memoria del computer guardando approssimativamente come questo. Ma ricordare che cosa è una stringa. Quello che abbiamo detto una settimana fa che cosa un stringa è in realtà sotto il cofano? PUBBLICO: Array di caratteri. DAVID MALAN: E 'un array di caratteri, giusto? Così potremmo avere un array di corde, ma, a sua volta, una stringa è un array di caratteri. Quindi, se voglio davvero essere anale quando traggo questa immagine, Dovrei davvero essere disegnando un po 'più simile a questo, per cui in ciascuno di questi indici della mia matrice argv, vi è esso stesso una stringa intera che si trova in un array. E ora la bugia bianca stiamo dicendo oggi è che l'immagine non lo fa guardare piuttosto come questo. In effetti, le piazzette sono tipicamente al di fuori dei grandi rettangoli Là. Ma torneremo a che tra non molto. Ma questo è ./ciao backslash 0, che essendo il carattere speciale che delimita la fine di una stringa, e abbiamo un altro dopo Il nome di Zamyla. Che cosa significa questo? Beh, lasciatemi andare avanti e aprire altri due esempi che sono disponibili online. Uno si chiama argv1.c e l'altro è argv2. E 'un programma super-semplice che è diverso da programmi precedenti a che ora sto usando argc e argv qui. E ora sto integrando con un ciclo for in linea 18, da i = 0 su un massimo di argc. E quello che sto andando a fare con questa riga di codice qui? In inglese. Questo, ovviamente, dimostra l'uso di argc. Ma in inglese, cosa fa che fare se ho eseguito questo programma? Sì? PUBBLICO: E 'intenzione di stampare il schermo tutte le volte che vuoi. DAVID MALAN: Esattamente. Quindi, qualsiasi parole I digitare al prompt, è andando a rigurgitare loro a me uno per riga. Quindi cerchiamo di andare avanti e fare questo. Lasciami andare nel mio elenco e fare fare ./argv1 argv1. Ed ora, cerchiamo di mantenere le cose semplici. Cerchiamo di fare nulla in un primo momento. Lo ha fatto stampare una cosa, e questo è infatti il ​​nome del programma, perché è nella fascia 0. Se io ora dico foo, sta andando a fare quei due, e se dico foo bar, è andare a dire queste tre cose. Ora che è un po 'interessante, forse. Ma ricordare che argv è un array di stringhe, ma una stringa è un array di caratteri, in modo che possiamo prendere le cose su una tacca e applicare tale base logica e rendere il codice che sembra un po 'più criptico, è vero. Ma avendo un nidificato loop, qualcosa di simile a quello che si potrebbe ricordare da Mario, per esempio, se l'avete fatto in questo modo. Così ora notato sulla linea 19, sono nuovamente l'iterazione sulle mie argomentazioni, da 0 a un massimo di argc. E ora in linea 21-- sono prendendo a prestito un trucco da ultimo week-- Sto controllando che cosa è il lunghezza della staffa argv i. Sto memorizzare la risposta n. E poi sto integrando da j su fino an, dove j è inizializzato a 0. Così, convenzione per il conteggio. Una volta che hai usato i, se si dispone di un ciclo nidificato, non è possibile utilizzare i nuovo, altrimenti si clobber, potenzialmente, il valore al di fuori del ciclo interno. Così sto usando j per convenzione. Potremmo usare k. Se si dispone di più di k, probabilmente avere troppo nidificazione, in genere. Ma ora, notare il mio printf linea è leggermente diversa. Non sto stampando% s, io sono stampa% c, che, naturalmente, è un segnaposto per un carattere. E ora notare questa sintassi. Nuovo. Non abbiamo visto prima. Ma logicamente, questo significa solo ottenere la stringa esimo in argv e ottenere il j-esimo che cosa? PUBBLICO: Carattere. DAVID MALAN: personaggio in quella stringa. Quindi, utilizzando le parentesi quadre seguito da parentesi quadre, questa è la prima immersione in stringhe di argv, e poi la seconda parentesi quadre con j è immergersi nei personaggi di quella particolare stringa in argv. E poi, per buona misura, Sto stampa di una nuova linea qui. Così ora lasciami andare avanti e aprire una finestra leggermente più grande in modo che possiamo vedere in azione. Lasciami andare in quella cartella. E ora che fare rendere argv-2-- whoops-- fare argv-2, ./argv 2. Invio. Ed è un po 'difficile leggere verticale, ma questo è effettivamente il nome del programma, seguito da una riga vuota. Ora vorrei andare avanti e fare foo. Allo stesso modo difficile da leggere, ma è infatti la stampa di un carattere per riga. E se lo faccio bar, è ora la stampa di quelli riga per riga. Così il takeaway qui non è tanto che, wow, guarda questa pulito nuovo trucco dove è possibile ottenere il contenuto dei caratteri specifici di un array, ma piuttosto come stiamo prendendo questi di base idee come l'indicizzazione in una matrice, e poi indicizzazione in un matrice che era in quella matrice, e solo applicando le stesse idee a esempi un po 'più sofisticati. Ma le basi in realtà non hanno cambiato, anche dalla scorsa settimana. Ora, questa è una sorta di tempestiva, in quanto, ricordare, in settimana lo zero abbiamo giocato con una rubrica come questa. E anche se questo è, ovviamente, parti fisiche della carta, è possibile tipo di pensare una rubrica come una matrice. Certo, se si dovesse reimplementare questi pezzi questi pezzi di carta in un computer, probabilmente si dovrebbe usare qualcosa come un array per memorizzare tutti coloro nomi e numeri dalla A tutta la strada attraverso Z. Quindi questo è bello, perché ci consente una opportunità, forse, considerare come si potrebbe effettivamente realizzare qualcosa di simile. Come con una serie di porte qui. Quindi, se ho could-- abbiamo bisogno di una volontario per venire in su. Vediamo. Un volto sconosciuto, forse, volto sconosciuto, forse. Come circa in arancione? Qui. Camicia arancione, vieni su. Andiamo avanti ora e spostare queste porte verso il lato, spostare questi fuori strada per un momento. Come ti chiami? AJAY: DAVID MALAN: Ajay. David. Piacere di conoscerti. Bene. Così abbiamo dietro questi sei porte digitalmente sul screen-- o, piuttosto, sette porte sul screen-- un sacco di numeri. E io ti ho detto niente in advance-- d'accordo? AJAY: Niente in anticipo. DAVID MALAN: Tutto quello che voglio che tu faccia ora è quello di trovare per me, e per noi, in realtà, il numero 50, un passo alla volta. AJAY: Numero 50? DAVID MALAN: il numero 50. E si può rivelare ciò che è dietro a ciascuna di queste porte semplicemente toccando con un dito. Accidenti. [Risate] [Applausi] Molto ben fatto. Ok. Abbiamo un bel regalo premio per te qui. La vostra scelta di film che discusso la scorsa settimana. AJAY: Oh, uomo. Oh, non ho mai visto Balle spaziali. DAVID MALAN: Balle spaziali. Bene. Quindi tenere su un solo attimo. How-- facciamo questo un moment-- insegnabile come hai fatto a trovare il numero 50? AJAY: ho scelto a caso. DAVID MALAN: Così si scelse in modo casuale e ottenuto fortunato. AJAY: Sì. DAVID MALAN: OK. Eccellente. Così ora, non aveva ottenuto fortunato, che altro sarebbe potuto accadere dietro queste porte? Quindi, se vado avanti e rivelare questi numeri qui, che in realtà sono in ordine casuale. E la migliore che si potrebbe avere fatto, francamente, è da, in ultima analisi, nel caso peggiore, tutti loro controllo. Così avete ottenuto super-fortunato, che Non è quello che noi chiameremmo un algoritmo. Sì, complimenti. Ma ora let's-- umorismo me, se potessi. Andiamo a questa scheda qui. E qui sono i numeri in modo chiaro quello che sembra essere un ordine casuale, ed erano. Ma ora se io invece reclamo che dietro a queste porte sono numeri che vengono ordinati. L'obiettivo ora è quello di anche noi trovare il numero 50. Ma farlo algoritmicamente, e ci dicono come si sta andando su di esso. E se lo trovate, si mantiene il filmato. Tu non lo trovi, ti danno indietro. AJAY: Così sto andando a controllare le estremità primo luogo, per determinare se there's-- [Risate e applausi] DAVID MALAN: Qui si va. Diamo un'occhiata a uno dei predecessori di Ajay, Sean, che non era così fortunato. OK, così il vostro compito qui, Sean, è il seguente. Ho nascosto dietro questi porte il numero sette, ma nascosto in alcune di queste porte come pure sono altri numeri non negativi. E il vostro obiettivo è quello di pensare a questo riga superiore di numeri come solo un array. Siamo solo una sequenza di pezzi di carta con i numeri dietro di loro. E il vostro obiettivo è, utilizzando solo la parte superiore array di qui, mi troverete il numero sette. E stiamo andando poi a criticare come si fa a farlo. Dove siamo il numero sette, per favore. No. 5, 19, 13. Non è una domanda trabocchetto. 1. A questo punto il tuo punteggio non è molto bene, così si potrebbe anche andare avanti. 3. Vai avanti. Francamente, non posso fare a meno di chiedermi cosa stai ancora pensando. SEAN: Posso prendere da solo la riga superiore. DAVID MALAN: solo la riga superiore. Quindi hai tre di sinistra. Quindi mi troverete 7. [PUBBLICO GRIDA SUGGERIMENTI] Quindi, sia di quelli erano incredibili per ragioni molto diverse. Quindi questo è dove siamo lasciato fuori un momento fa, e l'intuizione chiave qui fu queste porte avevano numeri dietro di loro che sono stati ordinati, l'ideale da asporto per le quali è che si potrebbe fare fondamentalmente meglio in questo secondo example-- e, anzi, che è stato Sean primo tentativo con numeri casuali altrettanto before-- ma appena in quanto questi numeri sono ordinati, proprio come la rubrica telefonica, cosa si può ovviamente fare? Oppure, come si può sfruttare questa conoscenza? Già. PUBBLICO: Si va a metà strada [incomprensibile]. DAVID MALAN: Già. Esattamente. Così l'istinto iniziale di Ajay era per controllare le estremità, come ricordo, e poi noi una sorta di finale Nell'esempio rapidamente. Ma se abbiamo iniziato a fare questo più metodicamente lungo queste linee, ma a partire forse nel mezzo, perché sono ordinati, appena sveliamo la numero 16, abbiamo quindi know-- e facciamo esattamente che-- noi quindi sapere che il 50, nel caso di oggi, ha avuto modo di essere di destra. Quindi, proprio come in settimana zero quando abbiamo strappato la rubrica a metà e gettò la metà del problema di distanza, stessa idea qui. Possiamo gettare questo mezzo del problema di distanza. E probabilmente quello che potrebbe fare algoritmicamente, una volta che sai che il 50 deve essere a destra, se è ovunque, è provare lì, in mezzo delle porte rimanenti. Naturalmente, 50 è maggiore a 42, in modo che possiamo gettare questo rimanente trimestre del problema di distanza, e, infine, identificare qualcosa come 50. Ma proprio come con il rubrica, questi numeri sono stati dati a noi già in modo ordinato, che ci lascia con la domanda, come si fa ottenere le cose in ordine ordinati? E, francamente, a quale costo? E 'una cosa di essere consegnato la rubrica telefonica e poi impressionare i vostri amici, trovando un numero di telefono molto velocemente, giusto? Strappare 32 pagine di trovare un persona su 4 miliardi di pagine, abbiamo detto era un esempio estremo. Ma quanto tempo ci è voluto Verizon per ordinare quel libro telefono? Quanto tempo ci vuole per ordinare questi sette numeri? Questa è una domanda che abbiamo finora completamente ignorato. Quindi cerchiamo di rispondere a questa domanda adesso. E siamo tutti fuori di film ora, ma abbiamo alcune palle di stress. Se, per esempio, otto volontari non mi dispiacerebbe unirsi a noi qui? Andiamo avanti e fare, come su voi quattro, tre di voi qui? Ottenere alcuni volti nuovi. E il quattro di voi là? E now-- cerchiamo di non pregiudizi qui-- e numero otto qui alla fine. Andiamo su. Bene. Così che cosa abbiamo qui per ognuno di voi è un numero. Se vuoi andare avanti, prendere questo numero. Come ti chiami? ARTIE: Artie. DAVID MALAN: Artie, va bene. Tu sei il numero 1. AMIN: Amin. DAVID MALAN: Amin. David. Tu sei il numero 2. E andare avanti, come io consegno i fogli di carta, allineare stessi di fronte alla musica si trova nello stesso ordine come lassù. ANDY: Ciao, Andy. DAVID MALAN: Andy, è bello vederti. Numero 3. JACOB: Jacob. DAVID MALAN: Jacob, il numero 4. Benvenuto a bordo. GRANT: Grant. DAVID MALAN: Grant. Numero 5. Alanna: Alanna. DAVID MALAN: Alanna, numero 6. FRANCES: Frances. DAVID MALAN: Frances, numero 7. E? RACHEL: Rachel. DAVID MALAN: Rachel, numero 8. Bene. Vai avanti e ottenere voi stessi in questo ordine. Mi permetta di mettere un residuo leggio sul posto. Dove hai bisogno di uno stand? Ok. Vai avanti e appena messo i numeri dove il pubblico può vedere loro su, il leggio rivolto verso l'esterno. E si spera, il nostro primo controllo di integrità qui-- 4, 2, 6. Oh-oh. Apetta un minuto. Non abbiamo un 8. Ho bisogno di sfrattare dalla l'esempio in qualche modo. No. No, va bene. Vediamo. Possiamo farlo. Stand-by. Ci andiamo. Corretto. Bene. Così, ora abbiamo 8, 1, 3 7, 5. Ok. Eccellente. Quindi la domanda è a portata di mano, a quali costi, e con quale metodo, possiamo realmente possiamo ordinare questi numeri qui in modo che possiamo genere di lavorare a ritroso, in ultima analisi, e decide-- è davvero impressionante, è davvero efficace, che posso dividere e conquistare una rubrica telefonica? E 'davvero efficace che Posso dividere e conquistare quei pezzi digitali di carta sul tavolo, se magari sta andando a costarci un fortuna in tempo o cicli di energia o di CPU per ottenere effettivamente i nostri dati in qualche modo ordinato? Quindi cerchiamo di fare quella domanda. Quindi prima di tutto, questi numeri sono in quasi ordine casuale, e ho intenzione di proporre un algoritmo, o un processo da cui possiamo ordinare queste persone. Ho intenzione di avvicinarsi questa bella ingenuamente. E ho intenzione di riconoscere che è una specie di molto per me per avvolgere la mia mente intorno al dati interi set in una sola volta. Ma sai cosa? Io vado a fare qualche molto semplici correzioni marginali. 4 e 2 sono fuori uso, se l' obiettivo è quello di andare da 1 su un massimo di 8. Allora sai cosa? Ho intenzione di avere voi ragazzi scambiano, se si passa fisicamente posizioni e i vostri pezzi di carta. Ora 4 e 6, questi sono in ordine. Ho intenzione di lasciare quelle essere. 6 e 8, quelli sono in ordine. Andando a lasciare stare. 8 and1, fuori uso. Se voi due non mi dispiacerebbe scambiare. Ora 8 e 3, se voi ragazzi poteste scambiare. 8 e 7, se voi ragazzi poteste scambiare. E 8 e 5, se voi ragazzi poteste scambiare. Ora, sto fatto? No, ovviamente non. Ma ho fatto il situazione migliore, giusto? Qual era ancora il vostro nome, numero 8? RACHEL: Rachel. DAVID MALAN: Così Rachel ha efficacemente bolle up abbastanza lontano, fino alla fine il mio array di numeri qui. E così che il problema è di tipo risolto. Ora, chiaramente, 2 deve ancora spostare un po ', e 4 e 6 e 1. Ma mi sembra di aver ottenuto un po 'più vicino alla soluzione. Quindi cerchiamo di applicare questo stesso nuovo euristica ingenuo. 2 e 4, OK. 4 e 6, OK. 6 e 1, mm-mm. Facciamo swap. 6 e 3, mm-mm. Facciamo swap. 6 e 7 è OK. 7 e 5, no. Facciamo swap. E ora 7 e 8. E che cosa c'è di nuovo il tuo nome? FRANCES: Frances. DAVID MALAN: Frances. Così ora Frances è ancora in una migliore posizione, perché ora 7 e 8 sono bolle correttamente fino alla cima. Quindi, 2 e 4, OK. 4 e 1, scambio di let. 4 e 3, di scambio di let. 4 e 6, tu sei OK. 6 e 5, di scambio di let. E ora quei ragazzi sono buoni. Ci siamo quasi. 2 e 1, in ordine, in modo da scambiare. E ora lasciatemi fare un controllo di integrità. 2 e 3, 3 e 4, 4 e 5, 5 e 6, 6 e 7, 8. OK, così abbiamo finito. Ma a quale costo ha fatto io ordinare questi numeri qui? Beh, quanti passi ho fatto potenzialmente prendere durante l'ordinamento queste persone? Bene, torneremo a questa domanda. Ma, francamente, se hai un po 'annoiato, che è tipo di rivelare in che questo non era forse l'algoritmo più efficiente. E in effetti, francamente, io sto sudando tanto più camminare avanti e indietro. Che non si sentiva particolarmente efficiente. Quindi cerchiamo di provare qualcosa di diverso. Se voi ragazzi potrebbe ripristinare voi stessi a questi otto valori. Buon lavoro. Diamo uno sguardo digitale, solo per un attimo prima di provare qualcosa di diverso, a quello che è appena accaduto. Quassù, stai per vedere un visualizzazione di questi otto uomini per cui blu e rosso barre rappresentano i numeri. Il più alto la barra, il più grande è il numero. Più breve è il bar, il più piccolo è il numero. E che cosa si sta andando a vedere è in ordine casuale più di otto. Stai andando a vedere queste barre sempre ordinati dallo stesso algoritmo, o una serie di istruzioni, che chiameremo d'ora in poi bubble sort. Così notare, ogni secondo o giù di lì, due bar si accendano in rosso, vengono confrontati da computer. E poi se il grande bar e la piccolo bar sono fuori uso, essi vengono scambiati per me. Ora questo è incredibilmente noioso a guardare questo, certamente, per molto tempo, a meno di notare l' takeaway-- grandi barre che si spostano a destra, piccoli bar si spostano verso sinistra. Cerchiamo di interrompere questo processo e accelerare questo di essere molto più veloce, in modo che possiamo ottenere un senso alto livello di ciò che, in effetti, il Bubble sort sta facendo. Infatti, è gorgogliare fino al lato destro della lista, o la matrice, le barre più grandi. E viceversa, i piccoli bar sono ribollimento loro strada verso sinistra, anche se ad un ritmo più veloce di quanto abbiamo fatto in precedenza. Quindi, più difficile da vedere con gli esseri umani, ma visivamente questo è davvero quello che stava accadendo. Ma proviamo un fondamentalmente approccio diverso ora. Proviamo un diverso algoritmo con cui abbiamo voi ragazzi iniziano in questi originale posizioni, che era presente ordinanza qui. E andiamo avanti ora. E ho intenzione di fare qualcosa ancora più semplice, giusto? Col senno di poi, lo scambio di nuovo a coppie e di nuovo, quasi un po 'intelligente. Cerchiamo di fare le cose ancora più ingenuamente, dove se voglio ordinare queste persone, vorrei solo continuare a cercare per l'elemento più piccolo. Così adesso, 4 è il numero più piccolo che abbia mai visto. Io vado a ricordare che. No, 2 è meglio, e ricordate che. 1 è ancora più piccolo. 3, 7, 5. Ok. Tra-- cosa c'è di nuovo il tuo nome? ARTIE: Artie. DAVID MALAN: Artie. Così, Artie, andare avanti. Io vado a tirare fuori dalla linea. Se potessi tornare qui. E ho bisogno di fare spazio per lui. Abbiamo un punto di decisione qui. Come possiamo fare spazio per Artie qui all'inizio cui numero 1 appartiene? PUBBLICO: Shift. DAVID MALAN: OK, abbiamo potrebbe spostare tutti. Ma proporre una ottimizzazione. Che si sente un po 'fastidioso per me di chiedere quattro persone per spostare fino in fondo. Che altro potevo fare? PUBBLICO: li Interruttore. DAVID MALAN: li Interruttore. E che cosa c'è di nuovo il tuo nome? JACOB: Jacob. DAVID MALAN: Jacob, spostare. Molto più efficiente solo per avere Luoghi di swap Giacobbe con Artie, al contrario di forzatura tutti e quattro di queste persone, vi ringrazio molto, a loro posizione corretta. Cosa c'è di bello su Artie ora, lui è nella sua posizione corretta. Facciamolo di nuovo. 2, che è il più piccolo numero che ho visto. 3, 7, 5. Ok. 2 è sicuramente il più piccolo. Non hanno a che fare qualsiasi lavoro. Facciamolo di nuovo. 6. Più piccolo? 8. Nope. 4? Ooh. Permettetemi di ricordare 4. 3. Permettetemi di ricordare 3. 7, 5. Il più piccolo numero ho visto su questo passaggio è 3. Se vuoi vieni fuori. Dove stiamo andando a mettere voi? E qual è il tuo nome? Alanna: Alanna. DAVID MALAN: Alanna, siamo andando ad avere per sfrattare. Ma questo è più efficiente, per scambiare semplicemente due persone, di avere più persone effettivamente eludere sopra. Ora facciamolo di nuovo. Io vado a selezionare 4, in modo da venire in avanti. E chi sta per trasferirsi? Numero 8, naturalmente. Se ora trovo il numero 5, vieni fuori. Numero 8 sta per ottenere sfrattati di nuovo. Ora sto andando a trovare il numero 6 in luogo. 7 in posizione. 8 in posizione. Quello che abbiamo appena fatto ora è qualcosa chiamato ordinamento per selezione, e se visualizziamo questo, è andare a sentire un po 'diverso. Andiamo avanti e da questo menù qui, questo visualization-- cambiamo questo a-- dai, Firefox. Cambiamo questo tipo di selezione. E cerchiamo di accelerarlo come prima, e avviare la visualizzazione ora. E questo algoritmo ha un diverso sentire ad esso. Su ogni iterazione, francamente, è ancora più semplice. Sto solo selezionando l'elemento più piccolo. Ora, francamente, ho avuto un po 'di fortuna che tempo, in quanto ordinati super-veloce. Gli elementi erano casuali. Non è, come vedremo alla fine vedere, fondamentalmente più veloce. Ma vediamo una terza ed ultima avvicinare qui come per quello che sta succedendo. Quindi cerchiamo di andare avanti e si reimposta ragazzi un'ultima volta di essere in questo ordine qui. E ora, ho intenzione di essere un po 'più intelligente, solo per completare i nostri algoritmi. Ho intenzione di fare questo. Ho intenzione di non andare avanti e indietro così tanto. Francamente, sono stanco di tutto questo movimento. Sto solo andando a prendere quello che sto dato all'inizio della lista, e ho intenzione di ordinare che lì per lì. Così eccoci qui. Numero 4. Ho intenzione di inserire il numero 4 in un elenco ordinato. Fatto. Io rivendico ora, e solo per fare questo più chiaro, questa parte della mia lista è ordinata. E 'una specie di sinistro stupido, ma anzi 4 è ordinata in un elenco di dimensione uno. Ora, io vado a prendere il numero 2. Numero 2 ora sto andando a inserire nel posto giusto. Così dove 2 appartiene? Ovviamente, qui. Quindi, andare avanti e tornare indietro, se potessi. E perché non voi ragazzi basta prendere la tua musica è con te questa volta. E diamo forza inserisci tu nell'inizio della lista. Quindi un po 'di lavoro. Ho dovuto spostare Giacobbe intorno, e qual è il tuo nome? AMIN: Amin. DAVID MALAN: Amin. Ma almeno io non sono andato avanti e indietro. Sto solo prendendo le cose come vado. Sto solo inserendoli nel posto giusto. 6, questo è in realtà abbastanza semplice. Facciamo si inserisce là, se si volevo solo passare un po 'sopra. Numero 8, anche abbastanza facile. Proprio laggiù. Accidenti. Numero 1 non possiamo solo scambiare con Amin qui, perché quello che sta succedendo a sconvolgere l'ordine. Quindi dobbiamo essere un po 'più intelligente. Così, Artie, se potessi eseguire il backup per un momento. Andiamo avanti ed innestare ora, a differenza dei nostri algoritmi precedenti, per fare spazio a Artie proprio qui all'inizio. Così, alla fine della giornata, io sono una specie di fare quello che volevo evitare prima. E così il mio algoritmo è una sorta di invertiti, intellettualmente, da quello che era in origine. Sto solo facendo lo spostamento in un punto diverso. Ora sono a 3. Oh, accidenti. Dobbiamo fare ancora più lavoro. Quindi cerchiamo di spingere fuori. Passiamo 8, 6, 4-- oh oh-- e 3 sta per andare proprio lì. Così a lievi risparmi almeno questa volta. 7, non troppo lavoro da fare. Quindi, se si desidera pop indietro, ti permette di inserire. E, infine, 5, se si voglia di pop indietro, abbiamo necessario spostare voi, voi, si, fino alle cinque è a posto. Così ora di vedere questo in un alto livello grafico, facciamolo questo algoritmo visualizzazione una volta in più. Quindi questo chiameremo insertion sort. Faremo altrettanto veloce, e iniziare qui. E, anche, ha una sensazione diversa. E 'una sorta di migliorare e meglio, ma non è mai perfetto fino a quando vado in e liscia in quelle lacune. Perché, ancora una volta, sto solo prendendo ciò che Mi viene dato da sinistra a destra. Quindi non ho avuto così fortunato che tutto era perfetto. Ecco perché abbiamo avuto questi piccoli mispositions che fissa nel tempo. Quindi tutti questi algoritmi sembrano funzionare a ritmi leggermente diverse. In realtà, che diresti è il migliore o il più veloce finora? Bubble sort, il primo? Selezione tipo, il secondo? Ordina inserimento, la terza? Ho sentito alcuni tipi di selezione. Altri pensieri? Così si scopre che tutti questi algoritmi sono fondamentalmente altrettanto efficiente come ogni other-- o, al contrario, proprio come inefficiente come ogni altro, perché possiamo fare fondamentalmente meglio di tutti e tre di questi algoritmi. E questo è un po 'una bugia bianca, troppo. quando dico il più efficiente o come inefficiente, questo è, almeno per super-grandi valori di n. Quando abbiamo solo otto persone qui, o forse 50 o giù di barre sullo schermo, sarete assolutamente notato differenze tra questi tre algoritmi. Ma come n, il numero di persone, o il numero di numeri, o il numero di persone nel telefono libro, o il numero di pagine web nel database di Google diventa sempre più grande, vedremo che tutte e tre queste algoritmi sono in realtà piuttosto scarsa. E possiamo fare fondamentalmente meglio di così. Diamo uno sguardo, infine, a ciò che questi algoritmi potrebbero suonare come nel contesto di pochi altri nonché attraverso questo Visualizzazione qui che ci introdurrà a un certo numero di algoritmi. Andiamo avanti e si congratulano qui i nostri partecipanti, i quali si sono ordinate molto bene. Se vuoi fare un regalo d'addio. È possibile mantenere i numeri pure. E quello che vedrete, o meglio sentire, ora, è che, come abbiamo messo i suoni a ciascuno di questi bar e associarlo con il software, diversa frequenza del suono, si può avvolgere la vostra mente più audioly attorno a ciò che ciascuna di queste cose assomigliare. Il primo dei quali è insertion sort [TONI] Questo è il bubble sort. [TONI] Selezione tipo. [TONI] Qualcosa chiamato merge sort. [TONI] Tipo Gnome. [TONI] Questo è tutto per CS50. Ci vediamo il Mercoledì. NARRATORE: E ora, "Deep Pensieri, "di Daven Farnham. Perché è un ciclo for? Perché non fare di meglio? Mi piacerebbe fare un ciclo di cinque. [Risate]