[RIPRODUZIONE DI BRANI MUSICALI] DOUG LLOYD: Va bene. Lavorare con singolo variabili è piuttosto divertente. Ma cosa succede se si vuole lavorare con un sacco di variabili, ma noi non vogliamo avere un gruppo di nomi diversi che volano intorno il nostro codice? In questo caso, gli array sono andando a venire in veramente utile. Gli array sono un dato davvero fondamentale Struttura per qualsiasi linguaggio di programmazione che si intende utilizzare. E sono molto, molto utile, In particolare, come vedremo, in CS 50. Usiamo gli array di tenere valori dello stesso tipo di dati a locazioni di memoria contigue. Vale a dire, è un modo che possiamo raggruppare un gruppo di interi insieme a memoria o un gruppo di personaggi o galleggianti in memoria davvero ravvicinati e lavoro con loro senza dover dare ogni un suo proprio nome unico, che può ottenere ingombrante dopo un po 'di tempo. Ora, un modo per analogize array è quello di pensare al vostro alberino locale carica per un secondo. Così passo dalla programmazione e basta chiudere gli occhi e visualizzare nella vostra mente il vostro ufficio postale locale. Solitamente, in più alberino uffici, c'è una grande banca a caselle postali sul muro. Un array è un blocco gigante di memoria contigua, allo stesso modo che una e-mail banca nel vostro ufficio postale è un grande spazio sulla parete dell'ufficio postale. Gli array sono stati partizionati in piccolo, identicamente blocchi di dimensioni di spazio, ciascuno dei quali è chiamato un elemento, in allo stesso modo che la parete del post ufficio è stato partizionato in piccolo, identicamente blocchi di dimensioni di spazio, che noi chiamiamo una casella postale. Ciascun elemento della matrice può memorizzare una certa quantità di dati, proprio come ogni casella postale è in grado per contenere una certa quantità di posta. Quali possono essere memorizzati in ogni elemento di l'array è variabili degli stessi dati tipo, come int o char, semplicemente come nella vostra casella postale, si può andare bene solo le cose di tipo analogo, quali lettere o piccoli pacchi. Infine, si può accedere a ogni elemento di la matrice direttamente in base al numero di indice, così come possiamo accedere al nostro ufficio postale box conoscendo il suo numero di casella vocale. Si spera, che l'analogia ti aiuta a ottenere la testa intorno all'idea tra array in analogia a qualcos'altro che siete probabilmente già familiarità. In C, gli elementi di un array sono indicizzato a partire da 0, non da 1. E questo è molto importante. E in effetti, questo è il motivo per cui, in CS 50, e perché gli informatici frequentemente conterà da 0, è a causa della matrice di C indicizzazione, che inizia sempre a 0. Quindi, se un array consiste di n elementi, il primo elemento di tale matrice è situato in corrispondenza dell'indice 0, e l'ultimo elemento dell'array si trova nella posizione di indice n meno 1. Anche in questo caso, se ci sono n elementi nel nostro matrice, l'ultimo indice è n meno 1. Quindi, se il nostro array ha 50 elementi, i primo elemento si trova in corrispondenza dell'indice 0, e l'ultimo elemento si trova a 49 dell'indice. Purtroppo, o per fortuna, a seconda della prospettiva, C è molto indulgente qui. Non ti impedirà di uscire dai limiti della propria matrice. Si potrebbe accedere al meno 3 elemento dell'array o l'elemento 59a dell'array, se la matrice ha solo 50 elementi. Essa non si fermerà il vostro programma da compilazione, ma in fase di esecuzione, si potrebbe incontrare un segmentation fault temuto se si inizia a accedere alla memoria cioè al di fuori dei limiti di ciò che lei ha chiesto il vostro programma per darvi. Quindi state attenti. Che cosa fa di un array dichiarazione simile? Come facciamo a codifichiamo un array in esistenza come codifichiamo qualsiasi altra variabile? Ci sono tre parti ad un array declaration-- un tipo, un nome, e una dimensione. Questo è molto simile a un dichiarazione di variabile, che è solo un tipo e un nome, l'elemento di dimensioni essere il caso particolare di un array, perché stiamo ottenendo un po 'di loro allo stesso tempo. Così il tipo è che tipo di variabile vuole ogni elemento della matrice di essere. Non voglio che un array di interi? Poi, il tipo di dati dovrebbe essere int. Vuoi che sia un serie di doppie o galleggianti? Tipo di dati dovrebbe essere doppia o galleggiare. Il nome è quello che desidera chiamare l'array. Che cosa si desidera denominare questo gigante banca di numeri interi o galleggianti o caratteri o doppie, o qualsiasi altra cosa hai? Che cosa si voglia chiamare? Piuttosto auto esplicativo. Infine, le dimensioni, che va all'interno di parentesi quadre, è quanti elementi si farebbe come l'array per contenere. Quanti interi vuoi? Quanti galleggianti vuoi? Così, per esempio, int voti degli studenti 40. Questo dichiara un array chiamato Student gradi, che consiste di 40 numeri interi. Piuttosto auto esplicativo, spero. Ecco un altro esempio. Prezzi del menu doppie 8. Questo crea un array chiamato Menu a prezzo fisso, che consiste di spazio in memoria per otto doppie. Se si pensa di ogni elemento di una matrice di tipo-tipo di dati, così, per esempio, un singolo elemento di un array di tipo int, allo stesso modo si potrebbe pensare a qualsiasi altra variabile di tipo int, tutte le operazioni noti che discusso in precedenza nelle operazioni il video avrà un senso. Così qui, potremmo dichiarare un array di booleani chiamati Truthtable, che consiste di spazio per 10 booleani. E poi, proprio come potremmo assegnare un valore a qualsiasi altra variabile di tipo Booleano, potremmo dire qualcosa come Truthtable parentesi quadra 2, che è come indichiamo, quale elemento della tabella di verità? Il terzo elemento del tabella di verità, perché ricordate, contiamo da 0. Ecco, questo è il modo in cui viene indicato il terzo elemento della tabella di verità. Truthtable 2 è uguale a falso, proprio come potremmo declare-- o potremmo cedere, anzi, qualsiasi Variabile di tipo booleano di essere falso. Possiamo anche usarlo in condizioni. if (truthtable 7 == true), vale a dire, se l'ottavo elemento di Truthtable è vero, forse si vuole stampare un messaggio per l'utente, printf ("TRUE! n") ;. Questo ci induce a dire Truthtable 10 è uguale a vero, giusto? Beh, posso, ma è abbastanza pericoloso, perché ricordate, abbiamo un array di 10 booleani. Così il più alto indice che il compilatore ci ha dato è 9. Questo programma verrà compilato, ma se qualcosa in memoria esiste dove ci sarebbe aspettano Truthtable 10 per andare, potremmo subire un segmentation fault. Noi potrebbe farla franca, ma in generale, abbastanza pericoloso. Quindi quello che sto facendo qui è C legale, ma non necessariamente la migliore mossa. Ora, quando si dichiara e inizializzare un array contemporaneamente, c'è in realtà una bella sintassi speciale che si possono utilizzare per riempire l'array con i suoi valori di partenza. Si può ottenere ingombrante per dichiarare un array di dimensioni 100, e poi devo dire, elemento 0 è uguale a questo; Elemento 1 è uguale a questo; elemento 2 è uguale a quello. Qual è il punto, giusto? Se si tratta di un piccolo array, si potrebbe fare qualcosa di simile. Bool truthtable 3 è uguale aperto parentesi graffa e quindi virgola separare la lista di elementi che si desidera inserire nella matrice. Quindi chiudere riccio brace e virgola. Questo crea una serie di tre dimensioni chiamato Truthtable, con elementi falso, vero, e vero. Ed infatti, l'istanziazione sintassi che ho qui è esattamente lo stesso di fare il sintassi singolo elemento sotto. Questi due modi di codifica sarebbe produrre la stessa matrice. Allo stesso modo, si potrebbe iterare su tutti gli elementi di un array usando un ciclo, che, Infatti, è fortemente consigliata at-home esercizio. Come si fa a creare un array di 100 numeri interi, dove ogni elemento dell'array è proprio indice? Così, per esempio, abbiamo una gamma di 100 interi, e nel primo elemento, vogliamo mettere 0. Nel secondo elemento, vogliamo mettere 1. Nel terzo elemento, vogliamo mettere 2; e così via e così via. Questo è davvero un buon at-home esercizio per farlo. Qui, non sembra come troppo è cambiato. Meno di notare che tra il parentesi quadre, questa volta, In realtà ho omesso il numero. Se si sta utilizzando questo molto istanziazione speciale sintassi per creare un array, in realtà non lo fanno necessario per indicare la dimensione dell'array anticipo. Il compilatore è abbastanza intelligente a sapere che in realtà vuole un array di dimensione 3, perché si mette tre elementi alla destra del segno uguale. Se tu avessi messo quattro, avrebbe dato una tabella di verità di dimensioni quattro; e così via e così via. Gli array non sono limitati ad un unico dimensione, che è piuttosto fresco. Si può effettivamente avere come molti prescrittori laterali come si desidera. Così, per esempio, se si desidera creare una scheda per il gioco Battleship, il quale, Se avete mai giocato, è un gioco che è giocato con pioli sul 10 per 10 griglia, è possibile creare un array come questo. Si potrebbe dire Bool corazzata parentesi quadra 10 chiuso square Parentesi quadra staffa 10 chiusa parentesi quadra. E poi, si può scegliere di interpretare questo nella vostra mente come 10 da 10 griglia di celle. Ora, infatti, nella memoria, lo fa davvero solo rimanere un elemento 100, unico array bidimensionale. E questo, infatti, va per se avere tre dimensioni o quattro o cinque. E 'davvero solo fa moltiplicare tutti i indices-- o tutte le dimensioni specifiers-- insieme, e basta avere un unidimensionale array di dimensioni. Ma in termini di organizzazione e di visualizzazione e percezione umana, può essere molto più facile lavorare con una griglia se stai lavorando su un gioco come Tic-tac-toe o Battleship, o qualcosa di simile. E 'una grande astrazione, invece di avere pensare a un Tic-tac-toe bordo come una linea di nove quadrati o una scheda di Battleship come una linea di 100 quadrati. A 10 da 10 griglia o tre per tre griglia è probabilmente molto più facile da percepire. Ora, qualcosa di veramente importante sugli array. Siamo in grado di trattare ogni individuo elemento dell'array come variabile. Abbiamo visto che in precedenza quando stavamo assegnando il valore True per certi booleani o testarli in condizionali. Ma non possiamo trattare tutto a loro volta array come variabili. Non possiamo, per esempio, assegnare un array ad un altro array utilizzando l'assegnazione operatore. Non è C. legale Se vogliamo, per quanto example-- avremmo fatto in questo esempio sarebbe copiare un array in un altro. Se vogliamo fare questo, abbiamo in realtà necessario utilizzare un ciclo per copiare ogni singolo elemento alla volta. So che è un po 'di tempo. Così, per esempio, se avessimo questi coppia di linee di codice, sarebbe questo lavoro? Beh, no, non sarebbe, giusto? Perché noi stiamo cercando per assegnare cibo per bar. Che non sta andando a lavorare, perché è un array, e abbiamo appena descritto che questo non è legale C. Invece, se vogliamo copiare il contenuto di cibo in bar, che è ciò che stiamo cercando di fare qui, avremmo bisogno di una sintassi del genere. Abbiamo un ciclo for che va da J è uguale a 0 fino a 5, e incrementiamo J su ogni iterazione il ciclo e gli elementi assegnare genere. Ciò si tradurrebbe in bar anche essendo uno, due, tre, quattro, cinque, ma dobbiamo farlo in questo molto modo lento elemento per elemento, anziché semplicemente copiare l'intero array. In altri programmi lingue, quelle più moderne, è possibile, infatti, fare proprio che equivale semplice sintassi. Ma C, purtroppo, siamo non ha permesso di farlo. Ora, c'è un altro cosa che voglio citare sugli array che può essere un po ' po 'complicato la prima volta che si lavorare con loro. Abbiamo discusso in un video su scope delle variabili, che la maggior parte delle variabili in C, quando si chiama loro funzioni, sono passati per valore. Ti ricordi che cosa significa di passare qualcosa per valore? Significa che stiamo facendo una copia del variabile che viene passata in. La funzione callee, la funzione che sta ricevendo la variabile, non ottiene la variabile stessa. Ottiene il suo locale copia di esso per lavorare con. Array, naturalmente, fanno non seguire questa regola. Piuttosto, ciò che noi chiamiamo questo è il passaggio per riferimento. Il chiamato in realtà non riceve l'array. Non riceve la sua copia locale di esso. E se ci pensate esso, questo ha un senso. Se gli array sono molto grandi, è prende così tanto tempo e fatica per fare una copia di una serie di 100 o 1.000 o 10.000 elementi, che non vale la pena di funzione per ricevere una copia di esso, fare un certo lavoro con esso, e poi solo essere fatto con la copia; non ha bisogno di avere appeso più in giro. Perché gli array sono alcuni voluminosi e ingombranti, ci passiamo per riferimento. Abbiamo appena Confidiamo che la funzione a, non rompere nulla. In modo che effettivamente ottenere la matrice. Non ottiene la propria copia locale di esso. Che cosa significa questo, poi, quando il chiamato manipola elementi dell'array? Che succede? Per ora, ci ignoreremo sul perché esattamente questo accade, perché gli array sono passati per riferimento e tutto il resto è passato per valore. Ma vi prometto, ci sarà tornare e vi darà la risposta a questo in un video successiva. Qui è un altro esercizio per voi prima di concludere le cose su array. Il mucchio di codice qui, che è non particolarmente buono stile, solo Farò che caveat. Non ci sono commenti qui, che è piuttosto male modulo. Ma è solo perché volevo essere in grado di adattare tutto sullo schermo. Nella parte superiore, si può vedere che ho due dichiarazioni di funzione per matrice set e impostare int. Set matrice prende apparentemente un array di quattro interi come il suo ingresso. E insieme int prende apparentemente un singolo intero come input. Ma entrambi non hanno un output. L'uscita, il ritorno tipo, di ognuno è nullo. In principale, abbiamo un paio di linee di codice. Noi dichiariamo una variabile intera chiamato A e assegnare il valore 10. Noi dichiariamo un array di quattro interi chiamato B e assegnare gli elementi 0, 1, 2 e 3, rispettivamente. Poi, abbiamo una chiamata per impostare int e un appello per impostare array. Le definizioni di matrice set e set int è basso, in basso. E così, di nuovo, vi chiedo la domanda. Che cosa viene stampato qui alla fine del Main? C'è una col stampa. sono stampare due interi. Sto stampare il contenuto di A e il contenuto di B piazza staffa 0. Mettere in pausa il video qui e prendere un minuto. Riuscite a capire cosa questo funzione di stampa alla fine? Speriamo che, se vi ricordate la distinzione tra passaggio per valore e il passaggio per riferimento, questo problema non era troppo difficile per voi. E la risposta si farebbe ho trovato è questa. Se non siete veramente sicuri come a perché questo è il caso, prendere un secondo, tornare indietro, rivedere quello che ero solo discutere di passaggio di array per riferimento, rispetto passando altre variabili per valore, e, si spera, farà un po 'più senso. Sono Doug Lloyd, e questo è CS50.