[REPRODUCCIÓ DE MÚSICA] DOUG LLOYD: D'acord. Treballar amb una sola les variables és bastant divertit. Però el que si volem treballar amb una gran quantitat de variables, però no vull tenir un munt de diferents noms volant al voltant nostre codi? En aquest cas, les matrius són vindrà en molt pràctic. Les matrius són una dada realment fonamental estructura per a qualsevol llenguatge de programació que utilitzarà. I són molt, molt útil, sobretot, com veurem, en el CS 50. Utilitzem matrius per mantenir valors del mateix tipus de dades en ubicacions de memòria contigües. És a dir, és una de manera que podem agrupar un munt de nombres enters junts en memòria o un grup de caràcters o sura en la memòria de veritat tancar junts i treballar amb ells sense haver de donar a cada d'un nom propi, únic, que pot tornar-se un problema després d'una estona. Ara, una manera d'analogia entre matrius és pensar en el seu pal local el càrrec per un segon. Així que pas lluny de la programació i tanca els ulls i visualitzar en la seva ment seva oficina de correus local. En general, en la majoria de post oficines, hi ha un gran banc a apartats de correus a la paret. Una matriu és un bloc gegant de memòria contigua, de la mateixa manera que un correu electrònic banc a la seva oficina de correus és un gran espai al paret de l'oficina de correus. Les matrius s'han dividit en petites, idènticament blocs de mida de l'espai, cadascun dels quals es diu un element, en de la mateixa manera que la paret del lloc l'oficina s'ha dividit en petites, idènticament blocs de mida de l'espai, que anomenem un apartat de correus. Cada element de la matriu pot emmagatzemar una certa quantitat de dades, així com cada apartat de correus és capaç per mantenir una certa quantitat de correu. Què pot ser emmagatzemat en cada element de la matriu és variables de les mateixes dades tipus, tal com int o char, simplement com en la seva casella de correu, només es pot encaixar coses d'un tipus similar, com ara cartes o paquets petits. Finalment, podem accedir a cada element de la la matriu directament per nombre d'índex, de la mateixa manera que podem accedir a la nostra oficina de correus boxejar per conèixer un número de correu. Esperem que l'analogia l'ajuda a obtenir el cap entorn de la idea de matrius per analogies a una altra cosa que són, probablement, ja familiaritzats. En C, els elements d'una matriu són indexades a partir de 0, no des d'1. I això és realment important. I de fet, és per això que, en el CS 50, i per què els informàtics freqüents comptarà a partir de 0, és causa de la gran varietat de C indexació, que sempre comença en 0. Així que si una sèrie es compon de n elements, el primer element d'aquesta matriu es troba en l'índex 0, i l'últim element de la matriu es troba en l'índex n mínim 1. Un cop més, si hi ha n elements en la nostra matriu, l'últim índex és n almenys 1. Així que si la nostra matriu té 50 elements, els primer element es troba en l'índex 0, i l'últim element es troba en l'índex 49. Desafortunadament, o afortunadament, depenent de la seva perspectiva, C és molt indulgent aquí. No li impedirà sortir dels límits de la matriu. Vostè podria tenir accés almenys 3 element de la matriu o l'element 59 de la matriu, si el seu array només compta amb 50 elements. No aturarà el seu programa de compilar, però en temps d'execució, pot trobar-se amb un fallada de segmentació temuda si vostè comença a accedir a la memòria que està fora dels límits del que que va demanar el seu programa per donar-li. Així que vés amb compte. Què fa un array declaració sembla? Com codificar una matriu en existència com codifiquem qualsevol altra variable? Hi ha tres parts en una matriu declaration-- un tipus, un nom, i una mida. Això és molt similar a una declaració de variables, que és només un tipus i un nom, sent l'element de mida el cas especial d'una matriu, perquè estem rebent un munt d'ells al mateix temps. Així que el tipus és quin tipus de variable que vol cada element de la matriu sigui. No vull que una matriu d'enters? Llavors, el tipus de dades ha de ser int. Vols que sigui un sèrie de dobles o flotadors? El tipus de dades ha de ser el doble o surar. El nom és el que vol cridar a la seva matriu. Què vols per nomenar aquest gegant banc de nombres sencers o flotadors o caràcters o dobles, o el que vostè té? Què vols dir-? Explica per si mateix bonic. Finalment, la mida, que va dins claudàtors, és el nombre d'elements que ho faria com la matriu per contenir. Quants nombres enters és el que vols? Quantes carrosses és el que vols? Així, per exemple, int qualificacions dels estudiants 40. Això declara una matriu anomenada Estudiant qualificacions, que consta de 40 nombres enters. Explica per si mateix bonic, espero. Heus aquí un altre exemple. Preus del menú dobles agost. Això crea una matriu anomenada Els preus del menú, que consisteix espai a la memòria durant vuit dobles. Si vostè pensa en cada element d'una matriu de tipus de tipus de dades, Així, per exemple, un únic element de una matriu de tipus int, de la mateixa manera que pensaria en qualsevol altre variable de tipus int, totes les operacions familiars que ens discutit prèviament en les Operacions vídeo tindrà sentit. Així que aquí, podríem declarar una matriu de booleans anomenats Truthtable, que consisteix en peces per a 10 Booleans. I llavors, igual que vam poder assignar un valor a qualsevol altra variable de tipus Boole, podríem dir alguna cosa com Truthtable claudàtor 2, que és la forma indicada, quin element de la taula de veritat? El tercer element de la taula de veritat, perquè recordin, estem explicant des de 0. Així que aquesta és la forma en què indiquem el tercer element de la taula de veritat. Truthtable 2 és igual a falsa, de la mateixa manera que podríem declare-- o podríem cedir, més aviat, qualsevol Variable de tipus booleà és fals. També podem utilitzar-lo en condicions. si (truthtable 7 == true), és a dir, si el vuitè element de Truthtable és cert, potser volem imprimir un missatge per a l'usuari, printf ("TRUE! n");. Això ens fa dir Truthtable 10 és igual a la veritable, no? Bé, jo puc, però és bastant perillós, perquè recordin, tenim un arranjament de 10 Booleans. Així que el major índex que el compilador ens ha donat és de 9. Aquest programa es compilarà, però si alguna cosa més en la memòria existeix on ens faria esperar Truthtable 10 per a anar-hi, podríem patir una fallada de segmentació. Nosaltres podria sortir-se amb la seva, però en general, bastant perillós. Així que el que estic fent aquí és C jurídica, però no necessàriament la millor jugada. Ara, quan es declara i inicialitzar una matriu de forma simultània, hi ha realment una bonica sintaxi especial que pot utilitzar per omplir la matriu amb els seus valors inicials. Es pot aconseguir molest declarar una matriu de mida 100, i després he de dir, l'element 0 és igual a això; element 1 és igual a això; element 2 és igual que. Què és el punt, no? Si es tracta d'una petita matriu, podria fer alguna cosa com això. Bool truthtable 3 és igual oberta claudàtor i després coma separar la llista d'elements que vostè vol posar en la matriu. A continuació, tanca coma claudàtor. Això crea una gran varietat de mida de tres anomenats Truthtable, amb elements falsos, veritable i cert. I de fet, la creació d'instàncies sintaxi que tinc aquí és exactament el mateix que fer la sintaxi element individual a continuació. Aquestes dues formes de codificació faria produir la mateixa gamma exacta. De la mateixa manera, podríem iterar sobretot dels elements d'una matriu mitjançant un bucle, que, al seu De fet, és un molt fortament recomanat a casa d'exercicis. Com es crea una matriu de 100 nombres enters, on cada element de la matriu és el seu índex? Així, per exemple, tenim una gamma de 100 nombres enters, i en el primer element, volem posar 0. En el segon element, volem posar 1. En el tercer element, volem posar 2; i així successivament i així successivament. Aquesta és una molt bona a casa d'exercicis per fer això. Aquí, no es veu com també ha canviat molt. Però cal notar que entre el claudàtors, aquesta vegada, De fet, he omès el nombre. Si utilitzeu aquest mateix instanciació especial sintaxi per crear una matriu, que en realitat no ho fa cal indicar la mida de la matriu per endavant. El compilador és prou intel·ligent saber que en realitat volen una matriu de mida 3, perquè vostè posa tres elements a la dreta del signe igual. Si posar quatre, tindria que donada una taula de veritat de la mida de quatre; i així successivament i així successivament. Les matrius no estan restringides a un sol dimensió, que està molt bé. En realitat pot tenir fins especificadors secundaris com vulgui. Així per exemple, si voleu crear un tauler per al joc cuirassat, que, si alguna vegada jugat, és un joc que és jugat amb clavilles en el 10 per 10 reixeta, podria crear una sèrie com aquesta. Es podria dir Bool cuirassat claudàtor 10 quadrat tancat claudàtor suport de 10 tanca claudàtors. I després, es pot optar per interpretar això en la seva ment com un 10 per 10 reixeta de cel·les. Ara, de fet, en la memòria, el que realment fa justament sent un element 100, dimensional única. I això, de fet, va per si tenir tres dimensions o quatre o cinc. En realitat, només fa multiplicar tota la indices-- o la totalitat de la mida specifiers-- junts, i que acaba d'obtenir un unidimensional array d'aquesta mida. Però en termes d'organització i la visualització i la percepció humana, pot ser molt més fàcil per treballar amb una quadrícula si vostè està treballant en un joc com Tic-tac-dit del peu o del cuirassat, o alguna cosa per l'estil. És una gran abstracció, en lloc de tenir pensar en un Tic-tac-toe tauler com una línia de nou anys quadrats o un tauler cuirassat com una línia de 100 places. Un 10 per 10 de reixeta o de tres A les tres de la reixeta és, probablement, molt més fàcil de percebre. Ara, alguna cosa realment important sobre les matrius. Podem tractar a cada individu element de la matriu com una variable. Vam veure que abans quan estàvem assignant el valor Fidel a certs booleans o posar-les a prova en els condicionals. Però no podem tractar tot arrays si mateixos com a variables. No podem, per exemple, assignar una matriu a una altra matriu mitjançant l'assignació operador. No és C. legal Si volem, per exemple-- el estaríem fent en aquest exemple seria copiar una matriu en una altra. Si volem fer, que en realitat necessitarà utilitzar un bucle per copiar cada element individual d'una en una. Sé que és una mica lent. Així, per exemple, si tinguéssim aquest parell de línies de codi, funcionaria això? Bé, no, no ho faria, no? Com que estem tractant per assignar els aliments a la barra. Això no va a treballar, perquè és una matriu, i que acabem de descriure que això no és legal C. En canvi, si volem copiar el contingut dels aliments a la barra, que és el que que estem tractant de fer aquí, necessitaríem una sintaxi com aquesta. Tenim un bucle for que va de J és igual a 0 fins a 5, i incrementem J en cada iteració de el llaç i elements d'assignar l'estil. Això resultaria en bar també ser un, dos, tres, quatre, cinc, però ho hem de fer aquesta mateixa manera lenta element per element, en lloc de amb només la còpia de tota la matriu. En una altra programació idiomes, les més modernes, pot, de fet, fer just així de simple és igual a la sintaxi. Però C, per desgràcia, estem no se'ls permet fer això. Ara, hi ha una altra cosa que vull esmentar sobre les matrius que poden ser una mica mica complicat la primera vegada que treballar amb ells. Hem discutit en un vídeo sobre l'abast variable que la majoria de les variables en C, quan es diu en funcions, es passen per valor. Te'n recordes del que significa per passar una mica de valor? Significa que estem fent una còpia de la variable que està sent aprovada en. La funció destinatari de la trucada, la funció de això està rebent la variable, no rep la mateixa variable. Aconsegueix el seu propi local, còpia de la mateixa per treballar. Matrius, per descomptat, ho fan No seguir aquesta regla. Més aviat, el que anomenem present es passa per referència. El destinatari de la trucada realitat Rep la matriu. No rep el seu pròpia còpia local de la mateixa. I si ho penses ell, això té sentit. Si les matrius són realment gran, pren molt de temps i esforç per fer una còpia d'una sèrie de 100 o 1.000 o 10.000 elements, que no val la pena per a un funcionar per rebre una còpia de la mateixa, fer un treball amb ell, i després només es pot fer amb la còpia; no necessita tenir que donant voltes més. A causa de que les matrius són alguns voluminós i molest, acabem de passar per referència. Només confiem que la funció que, no trencar res. Així es posa de fet la matriu. No pot ser la seva pròpia còpia local de la mateixa. Llavors, què vol dir això, llavors, quan el destinatari de la trucada manipula elements de la matriu? Què passa? Per ara, anem a glossem sobre què exactament això succeeix, per què matrius es passen per referència i tota la resta es passa per valor. Però et prometo, ho farem retornar i li donarà la resposta a això en un vídeo més tard. Heus aquí un exercici més per a vostè abans d'acabar les coses en matrius. El paquet de programes aquí, això és no particularment bon estil, simplement vaig a fer aquesta advertència. Cap comentari per aquí, que és bastant dolenta forma. Però és només perquè jo volia ser capaç d'adaptar-se a tot a la pantalla. A la part superior, es pot veure que tinc dues declaracions de funcions per a la matriu de conjunts i establir int. Setembre varietat aparentment pren una matriu de quatre sencers com la seva entrada. I conjunt int aparentment presa un sol sencer com la seva entrada. Però dos d'ells no tenen una sortida. La sortida, el retorn escrigui, de cada un és nul·la. En principal, tenim una parell de línies de codi. Declarem una variable sencera denominat A i assignar-li el valor 10. Declarem una matriu de quatre sencers anomenat B i assignar els elements 0, 1, 2, i 3, respectivament. Llavors, tenim una crida a establir int i una crida per establir matriu. Les definicions de la matriu de conjunts i el conjunt de int estan allà baix, a la part inferior. I així, un cop més, li demano a la pregunta. El que s'imprimeix aquí al final de Main? Hi ha una col impressió. Estic impressió de dos enters. Estic imprimir el contingut d'i el contingut de B quadrat suport de 0. Pausa el vídeo aquí i prendre un minut. Pots imaginar el que això funció imprimirà al final? Esperem que, si vostè recorda la distinció entre passar per valor i que passa per referència, aquesta problema no era massa difícil per a tu. I la resposta que ho faria he trobat és això. Si vostè no està realment segur pel que fa a ¿Per què aquest és el cas, prendre un segon, tornar, reviso el que jo era només discutir sobre passar arrays per referència, que passa davant altres variables de valor, i és d'esperar, que farà una mica més de sentit. Sóc Doug Lloyd, i això és CS50.