[Glazbom] Doug LLOYD: U redu. Rad s jednom varijable je prilično zabavno. No što ako želimo raditi s puno varijabli, ali ne želimo imati hrpu različita imena lete oko našeg koda? U ovom slučaju, su nizovi će doći u jako zgodan. Nizovi su jako bitni podaci Struktura za bilo kojeg programskog jezika kako ćete koristiti. I oni su jako, jako korisno, Posebno, kako ćemo vidjeti, u CS 50. Mi koristimo polja držati vrijednosti istog tipa podataka na susjedne memorijskim mjestima. To je za reći, to je način na koji možemo skupina hrpa brojeva zajedno memorije ili hrpa znakova ili lebdi u memoriji stvarno zatvoriti zajedno i rade ih bez da svaki jedan vlastiti jedinstveni naziv, koji se mogu dobiti nezgrapan nakon malo vremena. Sada, jedan od načina da analogize polja je razmišljati o vašem lokalnom poštom Ured za sekundu. Dakle, korak dalje od programiranja i samo zatvoriti oči i zamišljati u vašem umu poštanskom uredu. Obično, u većini poštom uredi, postoji velika banka pošta kutija na zidu. Niz je div blok memorijskog, isti način na koji mail banka u vašem pošti je veliki prostor Zid pošti. Nizovi su podijeljen u male, jednako veličine blokova prostora, od kojih je svaki naziva element u isti način na koji zid post Ured je podijeljen u male, jednako veličine blokova prostora, što mi nazivamo poštanski pretinac. Svaki element polja može pohraniti određenu količinu podataka, baš kao što je svaki pošta okvir je u mogućnosti držati određenu količinu pošte. Ono što se može pohraniti u svakom elementu Niz je varijable iste podatke tipa, kao što su int ili char, samo kao što je u vašoj poštanski ured broj, možete samo stati stvari sličnog tipa, kao što su slova ili male pakete. Na kraju, možemo pristupiti svaki element Niz izravno indeksa broj, baš kao što možemo pristupiti naš pošta okvir znajući svoj broj spremnika. Nadam se, da je analogija pomaže vam dobiti svoju glavu oko ideje polja strane analogizing nešto drugo da ste vjerojatno već upoznati s. U C, a elementi su niz indeksiraju počevši od 0, a ne od 1.. A to je jako važno. A u stvari, to je razlog zašto smo, u CS 50, I zašto računalni znanstvenici često će brojati od 0, je jer od C u nizu indeksiranje, što uvijek počinje na 0. Dakle, ako niz sastoji od n elemenata, Prvi element tog polja nalazi se na indeks 0, i posljednji element niza Nalazi se u indeks n minus 1. Opet, ako postoji n elemenata u našem polje, posljednji indeks n minus 1. Dakle, ako je naš niz ima 50 elemenata, Prvi element se nalazi na indeks 0, a posljednji element Nalazi se na indeks 49. Nažalost, ili na sreću, ovisno o perspektivi, C je vrlo blag ovdje. To neće spriječiti ide izvan granica svoje polje. Ti bi mogao pristupiti minus 3 element vašeg polja ili 59. element vaše polje, ako je vaš polje ima samo 50 elemenata. To neće zaustaviti svoj program iz sastavljanje, ali u vrijeme izvođenja, možete naići zastrašujuća segmentacije kvara ako počnete pristupiti memorije to je izvan granica onoga što si tražio svoj program za dati. Dakle, ne budite oprezni. Što niz Deklaracija izgledati? Kako ćemo kodirati niz u postojanju kao što smo kodirati bilo koji drugi varijablu? Postoje tri dijela na niz declaration-- tip, ime, i veličinu. To je vrlo sličan varijabla izjava, koje je samo jedna vrsta i naziv, element veličina se Poseban slučaj za niz, jer smo uzimajući hrpa njih u isto vrijeme. Dakle, tip je kakav si varijable Želite svaki element niza se. Nemojte ga žele niz brojeva? Zatim, tvoj tip podaci trebaju biti int. Želite li to biti Niz parovima ili kola? Vrsta podataka treba biti dvostruko ili plutaju. Ime je ono što želite nazvati svoju lepezu. Što želite nazvati taj gigant banka brojeva ili plovaka ili znakova ili u parovima, ili što god imate? Što želite to nazvati? Prilično samo sebi. Konačno, veličina, koja ide unutar uglatih zagrada, je koliko elemenata što bi kao što je vaša polje sadrži. Koliko integers želiš? Koliko pluta želiš? Tako, na primjer, int ocjena studenata 40. To izjavljuje niz pod nazivom Studentski razreda, koji se sastoji od 40 brojeva. Prilično samo sebi, nadam se. Evo još jedan primjer. Dupli Cijene izbornika 8. To stvara niz pod nazivom Cijene izbornika, koji se sastoji prostora u memoriji za osam parova. Ako mislite da je svaki element od niza tipa podataka tipa, Tako na primjer, jedan element niz tipa int je ti isti način će misliti bilo koji drugi varijabla tipa int, sve poznate operacije koje mi prethodno objašnjeno u Operativnom Video će smisla. Dakle ovdje smo mogli proglasiti niz od logičke izraze zove Truthtable, koji se sastoji od prostora za 10 logičke izraze. A onda, baš kao i mi samo mogli dodijeliti vrijednost na bilo koji drugi varijable tipa Boolean, mogli bismo reći nešto kao Truthtable uglata zagrada 2, što je, kako smo naznačili, koji element tablice istina? Treći element Istina stol, jer zapamtite, Brojimo od 0. Dakle, to je kako smo označavaju Treći element tablice istine. Truthtable 2 jednako lažna, baš kao što smo mogli declare-- ili bismo mogli dodijeliti, a svaka Booleova tip varijabla biti lažna. Također možete ga koristiti u uvjetima. ako (truthtable 7 == istina), što će reći, ako osmog elementa od Truthtable je istina, Možda želimo ispisati poruku korisniku, printf ("istina! n") ;. To uzrokuje nam reći Truthtable 10 jednako istinito, zar ne? Pa, ja mogu, ali to je prilično opasno, jer ne zaboravite, imamo niz od 10 logičke izraze. Dakle, najveći indeks da prevodilac dao nam je 9. Ovaj program će se sastaviti, ali ako je nešto drugo u memoriji postoji kada bismo Očekujemo Truthtable 10 ići, možemo trpjeti grešku segmentiranja. Mi može dobiti daleko s njom, ali u cjelini, prilično opasno. Dakle, ono što ja radim ovdje je pravna C, ali ne nužno najbolji potez. Sada, kada se proglasiti i inicijalizirati niz istovremeno, tu je zapravo prilično Posebna sintaksa koja vas mogu koristiti za napuniti niz s početnim vrijednostima. Ona može doći nespretno proglasiti niz veličine 100, a onda moram reći, elementom 0 jednako to; Element 1 jednak ovo; Element 2 jednak. Što je točka, zar ne? Ako je mala niz, što mogao učiniti nešto poput ovoga. Bool truthtable 3 jednaka otvorenom kovrčava braće, a potom zarez odvojiti popis elemenata koje želite staviti u nizu. Zatim zatvorite kovrčavu Brace zarezom. To stvara niz Veličina tri naziva Truthtable, s elementima lažno, istinito i točno. A u stvari, oprimjerenja sintaksa Imam ovdje točno isto kao i radiš pojedinačni element sintakse u nastavku. Ova dva načina kodiranja bi proizvesti isti niz. Isto tako, mogli bismo ponoviti nad svim elementima od niza pomoću petlje, koja je, u Činjenica je vrlo preporučljivo at-home vježbe. Kako ste stvorili niz 100 brojeva, u kojima svaki element niza je njegov indeks? Tako, na primjer, imamo niz od 100 cijeli brojevi, a na prvom elementu, želimo staviti 0. U drugom elementu, želimo staviti 1. U trećem elementu, želimo staviti 2; i tako dalje i tako dalje. To je stvarno dobar at-home vježbe za to. Evo, to ne izgleda kao što se previše promijenio. Ali primijetite da između uglatim zagradama, ovaj put, Ja sam zapravo izostaviti broj. Ako koristite ovaj vrlo Posebno utjelovljenje Sintaksa za stvaranje niz, što zapravo ne potrebno je ukazati na veličinu od niza unaprijed. Prevodilac je dovoljno pametan znati da ti zapravo Želite niz veličina 3, jer ste stavili tri elementa na desnoj strani znaka jednakosti. Ako je stavio četiri, to bi vam dati istinu tablicu veličine četiri; i tako dalje i tako dalje. Nizovi nisu ograničene na jedan dimenzija, što je prilično cool. Vi zapravo možete imati što više bočni Tehničke kao što želite. Tako na primjer, ako želite stvoriti odbor za igru ​​Battleship, koji je, Ako ste ikad igrali, je igra koja je igrao s klinovima na 10 do 10 rešetki, možete stvoriti niz ovako. Moglo bi se reći bool bojni uglata zagrada 10 zatvorena uglata zagrada kvadrat Nosač 10 zatvorena uglata zagrada. A onda, možete odabrati tumače u vašem umu kao 10 10 rešetki stanica. Sada je, zapravo, u sjećanju, to stvarno ne samo ostati 100 elementa, Jedan trodimenzionalni niz. A to, u stvari, vrijedi i za vas, ako ima tri dimenzije ili četiri ili pet. To zapravo samo znači pomnožite sve indices-- ili sve veličine specifiers-- zajedno, a vi samo dobiti jednodimenzionalna niz te veličine. No, u smislu organizacije i vizualizacija i ljudska percepcija, to može biti puno lakše za rad s mrežom ako radite na igri kao Tic-Tac-nožni prst ili Battleship, ili nešto slično. To je velika apstrakcija, umjesto razmišljati o Tic-Tac-nožni prst odbora kao liniju devet kvadrata ili bojnog broda odbora kao linija od 100 kvadrata. 10 10 rešetki ili tri s tri mreže je vjerojatno puno više lako uočiti. Sada, nešto stvarno važno o polja. Možemo liječiti svaki pojedinac element polja kao varijablu. Vidjeli smo da je ranije kad smo bili dodjeljivanje vrijednost True na određene logičke izraze ili ih testira na uvjetne. No, ne možemo liječiti cijelu Nizovi se kao varijable. Mi ne možemo, na primjer, dodijeliti jednu lepezu na drugi niz pomoću zadatka operater. To nije pravna C Ako želimo, jer ono example-- mi bi trebali raditi u toj primjer da bi se kopirali jedan niz u drugi. Ako želimo učiniti, mi zapravo morate koristiti petlju za kopiranje više svaki pojedinačni element jedan po jedan. Znam da je malo vremena. Tako na primjer, ako smo imali ove par linija koda, zar ovo radi? Pa, ne, to ne bi, zar ne? Jer mi pokušavamo dodijeliti hranu bara. To ne ide na posao, jer je niz, a mi samo opisao da to nije pravni C Umjesto toga, ako želimo kopirati sadržaj hrane u baru, što je ono mi pokušavamo učiniti ovdje, što će trebati sintaksu ovako. Imamo za petlju koja ide od J jednak 0 do 5, a mi povećajte J na svakom iteraciju petlje i dodijeliti elemente kao što je to. To bi dovelo do bara i kao jedan, dva, tri, četiri, pet, ali moramo ga to vrlo sporo elementa po elementu način, umjesto samo po kopiranje cijeli niz. U drugoj programiranje jezika, više moderni oni, možete, u stvari, ne samo tako jednostavno jednako sintaksu. Ali C, na žalost, mi smo Ne smiju to učiniti. Sada, postoji još jedan Ono što želim napomenuti O polja koja može biti malo malo zeznuto kada ste prvi put raditi s njima. Razgovarali smo u video o promjenjivim opsegom, da većina varijabli u C, kada poziv ih u funkcijama, donosi vrijednost. Sjećate li se što to znači proći nešto po vrijednosti? To znači da smo izradu kopije od varijabla koja je se prošlo u. Pozivani funkcija, funkcija koji je primio varijablu, ne dobiti samu varijablu. Ona dobiva vlastitu lokalnu Kopija to raditi. Nizovi, naravno, ne ne slijede ovo pravilo. Umjesto toga, ono što mi nazivamo prolazi kao referenca. Pozivani zapravo ne dobivaju niz. Ona ne prima njegova vlastiti lokalnu kopiju od njega. A ako mislite o tome da, to ima smisla. Ako polja su stvarno velike, to potrebno toliko vremena i truda napraviti kopiju niz 100 ili 1000 ili 10.000 elementi, da to nije vrijedno toga za funkcionirati dobiti kopiju od njega, napraviti neki posao s njim, a zatim samo biti učinjeno s kopijom; ne moraju imati to vješanje oko više. Budući da su neki nizovi glomazan i težak, samo smo ih proći kao referenca. Upravo smo povjerenje tu funkciju da, ne razbiti ništa. Dakle, to zapravo ne dobiti niz. To ne bi svoju lokalnu kopiju. Dakle, što to znači, onda, kad pozivani manipulira elemente niza? Što se događa? Za sada ćemo prijeći više zašto baš ta se događa, zašto polja donosi reference i sve ostalo što je prošao po vrijednosti. Ali obećajem ti, mi ćemo vratiti i dati vam odgovor za to u kasnijim videa. Evo još jedna vježba za vas Prije nego što smo završiti stvari na polja. Hrpa kod ovdje, to je nije osobito dobar stil, Samo ću učiniti da upozorenje. Nema komentara ovdje, što je prilično loša forma. Ali to je samo zato što sam htjela biti mogućnosti da stane sve na zaslonu. Na vrhu, možete vidjeti da imam dvije funkcije deklaracije za set niz i postaviti int. Postavi niz očito traje niz četiri brojeva kao inputa. I set int navodno traje jedan cijeli broj kao svoj ulaz. Ali obojica nemaju izlaz. Izlaz, povrat tipa, svaki je nevažeće. U glavnom, imamo par linija koda. Mi proglasiti cjelobrojna varijabla naziva i dodijeliti mu vrijednost 10. Izjavljujemo niz od četiri brojeva naziva B i dodijeliti elemente 0, 1, 2 i 3, redom. Zatim, imamo poziv za postavljanje int i poziv na postavljanje niza. Definicije set polja i set int su dolje, na dnu. I tako, opet, ti postaviti pitanje. Što dobiva ispisati Ovdje na kraju Main? Postoji ispis col. Ja sam ispis dva prirodna broja. Ja sam ispis sadržaj i Sadržaj B uglata zagrada 0. Pauza video ovdje i uzeti minutu. Možete li shvatiti što je to funkcija će ispisati na kraju? Nadam se, ako podsjetiti Razlika između prolazu vrijednost i prolazu reference, ova Problem nije bio previše lukav za vas. A odgovor što bi Našao je to. Ako niste baš siguran da Zašto je to slučaj, uzeti drugi, vratiti, pregledati što sam bio samo raspravlja o prolazu polja referencom, u odnosu prolazi ostale varijable po vrijednosti, i nadamo se, da ćete napraviti malo više smisla. Ja sam Doug Lloyd, a to je CS50.