>> [MUSIC JOC]
DOUG LLOYD: Bine.
Lucrul cu un singur variabile este destul de distractiv.
Dar dacă vrem să lucreze cu o mulțime de variabile,
dar nu vrem să avem o grămadă de nume diferite care zboară în jurul codul nostru?
În acest caz, sunt matrice să vină în foarte la îndemână.
Arrays sunt un adevărat fundamental de date Structura pentru orice limbaj de programare
pe care le va folosi.
Și sunt foarte, foarte util, în special, după cum vom vedea, în CS 50.
>> Noi folosim matrice de a deține Valorile de același tip de date
la locații de memorie contigue.
Asta este de a spune, este un încât putem grup
o grămadă de numere întregi împreună în memorie sau o grămadă de personaje
sau plutește în memorie într-adevăr aproape împreună și de muncă
cu ei fără a fi nevoie pentru a da fiecare un nume propriu unic, care poate
obține greoaie după puțin timp.
>> Acum, un mod de a analogii matrice este să se gândească la postarea dvs. locală
birou pentru o secundă.
Deci, pas departe de programare și doar închide ochii
și vizualiza în mintea ta oficiul poștal local.
De obicei, în cele mai multe post- birouri, exista o mare bancă
o căsuțele poștale pe perete.
>> O matrice este un bloc uriaș de memorie contiguă,
același mod în care un e-mail banca în oficiul poștal
este un spațiu mare de pe perete de oficiul poștal.
Arrays au fost împărțit în mici, identic blocuri de dimensiuni de spațiu,
fiecare dintre care este numit un element, în același mod în care peretele de post
birou a fost împărțit în mici, identic blocuri de dimensiuni de spațiu,
pe care o numim o căsuță poștală.
Fiecare element al tabloului poate stoca o anumită cantitate de date,
la fel cum fiecare cutie poștală este capabil să dețină o anumită cantitate de e-mail.
>> Ce pot fi stocate în fiecare element al matrice este variabile de același date
tip, cum ar fi Int sau char, pur și simplu ca în caseta de posta,
puteți potrivi numai lucruri de un tip similar,
cum ar fi scrisori sau pachete mici.
În cele din urmă, putem accesa fiecare element al matrice direct de numărul de index,
la fel cum putem accesa sediul nostru posta caseta prin cunoașterea numărul căsuței poștale.
Sperăm că, că analogie vă ajută să obțineți cap
în jurul ideii de matrice de analogie cu altceva
că vă sunt, probabil deja familiarizați cu.
>> În C, elementele unei matrice sunt indexate începând de la 0, nu de la 1.
Și acest lucru este foarte important.
Și, de fapt, de aceea, în CS 50, Și de ce oamenii de stiinta de calculator frecvent
va conta la 0, este din cauza matrice C a
indexare, care începe întotdeauna de la 0.
Deci, în cazul în care o serie format din n elemente, primul element de care matrice
este situat la indexul 0, și ultimul element de matrice
este situat la indexul n minus 1.
Din nou, în cazul în care nu există n elemente în nostru matrice, ultima indicele este n minus 1.
>> Deci, dacă oferta noastră dispune de 50 elemente, primul element este situat la indexul 0,
și ultimul element este situat la indexul 49.
Din păcate, sau din fericire, în funcție de perspectiva dumneavoastră,
C este foarte indulgent aici.
Nu te va împiedica să merge în afara limitelor de matrice dumneavoastră.
Ai putea accesa minus 3 element de matrice dvs.
sau elementul 59 de matrice dvs., dacă matrice are numai 50 de elemente.
Acesta nu se va opri programul de la compilarea, dar la momentul execuției,
s-ar putea întâlni o eroare de segmentare temut
dacă începeți să acceseze memoria care este în afara limitele a ceea ce
ai cerut programul pentru a vă oferi.
Deci, nu fi atent.
>> Ce face o serie declarație arata ca?
Cum putem cod o serie în existență ca și cum am codul oricare altă variabilă?
Există trei părți la o serie declaration-- un tip, un nume,
și o dimensiune.
Acest lucru este foarte similar cu un declarație variabilă, care
este doar un tip și un nume, elementul dimensiune fiind
în cazul special pentru o matrice, pentru că suntem obtinerea o mulțime de ele
in acelasi timp.
>> Deci tipul este ce fel de variabilă doresc fiecare element al tabloului de a fi.
-L vreau la o serie de numere întregi?
Apoi, tipul de date ar trebui să fie Int.
Vrei sa fie o serie de camere duble sau flotoare?
Tipul de date ar trebui să fie de două ori sau float.
Numele este ceea ce doriți să o apelați matrice dumneavoastră.
Ce vrei să numească acest gigant bancă de întregi sau flotoare sau caractere
sau duble, sau orice ai?
Ce vrei să-i spunem?
Explicativ auto Destul de.
>> În cele din urmă, dimensiunea, care merge în interiorul paranteze pătrate,
este cât de multe elemente v-ar ca matrice pentru a conține.
Câte numere întregi vrei?
Câte flotoare vrei?
>> Deci, de exemplu, int clasele studenți 40.
Aceasta declară un tablou numit Student clasele, care constă din 40 de numere întregi.
Destul de sine explicativ, sper.
Iată un alt exemplu.
Prețurile meniu Double 8.
Acest lucru creează o matrice numit Preturi meniu, care constă
de cameră în memorie timp de opt camere duble.
>> Dacă credeți că de fiecare element de o serie de tip de tip de date,
așa de exemplu, un singur element de o serie de tip int, la fel cum
s-ar gândi de orice alt variabila de tip int,
toate operațiile familiare pe care le discutat anterior în manualul operațional
video va avea sens.
Deci, aici, am putea declara un tablou de Booleans numite Truthtable,
care constă din camerei timp de 10 Booleans.
>> Și apoi, la fel ca am putea atribui doar o valoare la orice alt variabila de tip
Boolean, am putea spune ceva ca Truthtable suport pătrat
2, care este modul în care arată, care element al tabelului de adevăr?
Cea de a treia element al tabel de adevăr, pentru că amintiți-vă,
suntem de numărare de la 0.
Deci, asta e modul în care ne indica al treilea element din tabelul de adevăr.
Truthtable 2 este egal cu false, la fel ca am putea declare--
sau am putea atribui, mai degrabă, orice Variabila de tip boolean a fi false.
>> Putem, de asemenea, folosi în condiții.
dacă (truthtable 7 == true), care este de a spune,
în cazul în care elementul a opta de Truthtable este adevărat,
poate că doriți să imprimați un mesaj pentru utilizator, printf ("True! n") ;.
Care ne face să spunem Truthtable 10 este egal cu adevărat, nu?
Ei bine, eu pot, dar e destul de periculos, pentru că amintiți-vă,
avem o serie de 10 Booleans.
Deci cel mai mare indice că compilator ne-a dat este de 9.
>> Acest program va compila, dar dacă altceva în memorie
există în cazul în care ne-ar așteaptă Truthtable 10 pentru a merge,
am putea suferi o eroare de segmentare. Noi s-ar putea să scape cu ea, dar, în general,
destul de periculos.
Deci, ceea ce fac aici este C legal, dar nu neapărat cea mai frumoasă fază.
Acum, când declara și inițializa o serie simultan,
există de fapt o destul de sintaxă specială pe care le
pot utiliza pentru a umple matrice cu valorile sale de pornire.
Se poate ajunge la greoaie declara o serie de dimensiuni 100,
și apoi trebuie să spun, elementul 0 este egal cu acest lucru; Element 1 este egal cu acest lucru;
Element 2 este egală cu cea.
Ce rost, nu?
>> Daca este o matrice mici, ar putea face ceva de genul asta.
Bool truthtable 3 este egal deschis bretele cret si apoi virgulă
separa lista elementelor pe care doriți să pună în matrice.
Apoi închideți cret virgulă bretele.
Aceasta creează o serie de Dimensiunea trei numit Truthtable,
cu elemente false, adevărat, și adevărat.
Și, de fapt, instanțierea sintaxa am aici este
exact la fel ca face următoarele sintaxă individ element de mai jos.
Aceste două moduri de codificare ar produce același matrice exact.
>> În mod similar, am putea repeta peste toate elementele
unui tablou folosind o buclă, care, în De fapt, este un foarte recomandat
at-home exercițiu.
Cum vă creați un array 100 numere întregi, unde
fiecare element al tabloului este indexul său?
Deci, de exemplu, avem o gamă de 100 numere întregi, iar în primul element,
vrem să 0.
În al doilea element, vrem să pună 1.
În al treilea element, ne-o dorim pentru a pune 2; și așa mai departe și așa mai departe.
Asta e un foarte bun at-home exercițiu pentru a face acest lucru.
>> Aici, nu arata ca prea mult sa schimbat.
Dar observați că între cele paranteze drepte, de data aceasta,
Am omis de fapt numărul.
Dacă utilizați acest lucru foarte instanțierea special
sintaxa pentru a crea un matrice, de fapt nu
trebuie să indicați dimensiunea de matrice prealabil.
Compilatorul este destul de inteligent să știi că tu de fapt
doresc o serie de dimensiuni 3, pentru că ai pus trei elemente
în partea dreaptă a semnului egal.
Dacă ai fi pus patru, aceasta ar trebui dat un tabel de adevăr de mărimea patru;
și așa mai departe și așa mai departe.
>> Array nu sunt limitate la un singur dimensiune, care este destul de rece.
Puteți avea, de fapt cât mai multe specificatori laterale după cum doriți.
Deci, de exemplu, în cazul în care doriți să creați un consiliu de joc Battleship, care,
dacă ai jucat vreodata, este un joc care este a jucat cu cuie pe 10 cu 10 de rețea,
ai putea crea un tablou de genul asta.
Ai putea spune Bool Battleship pătrat suport 10
pătrat închis suport pătrat Suport 10 închis suport pătrat.
>> Și apoi, puteți alege să interpreta acest lucru în minte ca un 10
prin 10 grila de celule.
Acum, de fapt, în memorie, într-adevăr nu doar
rămâne un element 100, matrice dimensionale singur.
Și aceasta, în fapt, este valabil și pentru tine dacă au trei dimensiuni sau patru sau cinci.
Este într-adevăr doar nu multiplica toate indices--
sau toate dimensiunile specifiers-- împreună,
și doar veți obține un one-dimensional matrice de această mărime.
>> Dar, în ceea ce privește organizarea și vizualizare și percepția umană,
aceasta poate fi mult mai ușor de a lucra cu o grilă
dacă sunteți de lucru pe un joc ca Tic-tac-toe sau Battleship,
sau asa ceva.
Este o mare abstracție, în loc de a avea
să se gândească la un Tic-tac-toe bord ca o linie de nouă
pătrate sau un consiliu de Battleship ca o linie de 100 de pătrate.
A 10 cu 10 grilă sau trei de trei grila este, probabil,
mult mai ușor de a percepe.
>> Acum, ceva cu adevarat importante despre tablouri.
Putem trata fiecare individ Element de matrice ca o variabilă.
Am văzut că mai devreme atunci când am fost atribuirea
valoarea Adevărat la anumite Booleans sau testarea acestora în conditionale.
Dar nu putem trata întreaga se Arrays ca variabile.
Nu putem, de exemplu, atribui o matrice la un alt array folosind atribuirea
operatorul.
Nu e legal C.
>> Dacă vrem să, pentru example-- ce ne-ar face în acest exemplu
ar fi de a copia un tablou în alta.
Dacă vrem să facem acest lucru, ne-am de fapt, necesitatea de a utiliza o buclă pentru a copia peste
fiecare element individual la un moment dat.
Știu că e un pic consumatoare de timp.
>> Deci, de exemplu, dacă am avea aceste cuplu de linii de cod, ar acest lucru?
Ei bine, nu, nu ar fi, nu?
Pentru că noi încercăm pentru a atribui produselor alimentare la bar.
Asta nu va merge, pentru că este o matrice,
și ne-am descris că nu e legal C.
>> În schimb, dacă vrem să copiați conținutul de produse alimentare
în bar, care este ceea ce noi încercăm să facem aici,
am avea nevoie de o sintaxă ca aceasta.
Avem o pentru buclă care merge din J este egal cu 0 până la 5,
și ne-am incrementa J pe fiecare iterație a bucla și elementele Atribuirea de genul asta.
Acest lucru ar duce la bar, de asemenea, fiind unul, doi, trei, patru, cinci,
dar trebuie să o facă foarte acest lent mod element cu element
în loc de doar prin copierea întreaga rețea.
În altă ordine de programare limbi, cele mai moderne,
puteți, de fapt, nu doar, simplu este egal cu sintaxa.
Dar, C, din păcate, suntem nu au voie să faci asta.
>> Acum, există un alt lucru pe care vreau să menționez
despre matrice, care poate fi un pic pic dificil prima dată te
lucra cu ei.
Am discutat într-un video despre domeniul de aplicare variabil,
că cele mai multe variabile în C, atunci când apelați le în funcții, sunt transmise de valoare.
Îți amintești ce înseamnă să treacă ceva de valoare?
Înseamnă facem o copie a variabilă care este fiind trecut în.
Funcția apelat, funcția care este primit variabila,
nu se variabila în sine.
Ea devine propriul său nivel local copie a acestuia de a lucra cu.
>> Arrays, desigur, nu nu urmeze această regulă.
Mai degrabă, ceea ce noi numim acest trece prin referință.
Callee de fapt va primi matrice.
Ea nu primește sale copie locală proprie a acestuia.
Și dacă te gândești la ea, acest lucru are sens.
Dacă matrice sunt foarte mari, aceasta nevoie de atât de mult timp și efort
pentru a face o copie de o serie de 100 sau 1000 sau 10.000 de elemente,
că nu merită pentru un funcționează pentru a primi o copie a acestuia,
face unele de lucru cu el, și apoi doar să fie făcut cu copia;
nu are nevoie să aibă o mai agățat în jurul.
>> Deoarece matrice sunt unele voluminoase și greoaie,
am doar le trece prin referire.
Tocmai am încredere că funcția la, nu rupe nimic.
Deci, se ajunge, de fapt, matrice.
Ea nu se propria copie locală a acestuia.
>> Deci, ce înseamnă acest lucru, apoi, când callee
manipulează elemente ale șirului?
Ce se întâmplă?
Pentru moment, vom luciu peste ce exact acest
se întâmplă, de ce tablouri sunt transmise prin referință
și orice altceva este trecut prin valoare.
Dar îți promit, vom întoarce și vă va oferi răspunsul
la acest într-un video mai târziu.
>> Iată un exercițiu mai mult pentru tine înainte de a ne încheia lucrurile pe tablouri.
Buchet de cod aici, asta e nu deosebit de stil bun,
doar voi face asta avertisment.
Nu există nici un comentariu aici, care este forma destul de rău.
Dar e numai pentru că am vrut să fie capabil pentru a se potrivi totul pe ecran.
>> În partea de sus, puteți vedea că am două declarații de funcții pentru set matrice
și a stabilit Int.
Set tablou aparent are o serie de patru numere întregi ca intrarea sa.
Și set Int aparent ia un singur număr întreg ca intrare sa.
Dar ambele dintre ele nu au o putere.
Ieșirea, revenirea tip, de fiecare dintre ele este nulă.
În principal, avem o câteva linii de cod.
Declaram o variabila integer numit A și atribuie valoarea 10.
Declaram o serie de patru numere întregi numit B și atribuiți elementelor 0, 1,
2, și 3, respectiv.
Apoi, avem un apel pentru a seta int și un apel pentru a seta matrice.
Definițiile set matrice și set Int sunt jos, în partea de jos.
>> Și astfel, din nou, vă pun întrebarea.
Ce se imprimate aici, la sfârșitul principal?
Există un col imprimare. Sunt imprimarea două numere întregi.
Sunt imprimarea conținutul A și conținutul B suport pătrat 0.
Întrerupe videoclipul aici și să ia un minut.
Poate îți dai seama ce acest Funcția va imprima la sfârșitul?
Sperăm că, dacă amintesc distincție între trecere de valoare
și care trece prin referință, această problemă nu a fost prea complicat pentru tine.
Și răspunsul ați au găsit asta.
Dacă nu sunteți sigur cu privire la de ce acesta este cazul, să ia un al doilea,
du-te înapoi, revizuirea ceea ce am fost doar discuta despre trecerea tablouri
de referință, față de care trece alte variabile de valoare,
și sperăm, se va face un pic mai mult sens.
>> Sunt Doug Lloyd, iar acest lucru este CS50.