[Гуляе музыка] Даг Lloyd: Добра. Праца з адным зменныя даволі весела. Але што, калі мы хочам працаваць з вялікай колькасцю зменных, але мы не хочам, каб мець кучу розныя імёны лётаць вакол нашага кода? У гэтым выпадку масівы прыйдзе ў вельмі зручна. Масівы сапраўды фундаментальная дадзеныя структура любога мовы праграмавання што вы будзеце выкарыстоўваць. І яны сапраўды, сапраўды карысна, У прыватнасці, як мы ўбачым, у CS 50. Мы выкарыстоўваем масівы для захоўвання Значэння дадзеных аднаго тыпу ў сумежных ячэйках памяці. Гэта значыць, гэта так, што мы можам група куча цэлых разам памяці або куча персанажаў або плавае ў памяці сапраўды зачыніць разам і праца з імі без даць кожнаму адным сваё ўнікальнае імя, якое можа атрымаць грувасткім праз некаторы час. Цяпер, адзін з спосабаў аналогію масівы гэта думаць аб вашым мясцовым паведамленні офіс на секунду. Так крок ад праграмавання і проста заплюшчыць вочы і візуалізаваць у розуме ваш мясцовы паштамт. Як правіла, у большасці пост офісы, ёсць буйны банк а паштовыя скрыні на сцяне. Масіў ўяўляе сабой гіганцкі блок бесперапыннай памяці, гэтак жа, як паштовы банк у Вашым паштовым аддзяленні вялікая прастора на сцены паштамта. Масівы былі падзеленыя на невялікія, аднолькавага памеру блокі прасторы, кожны з якіх называецца элементам, у гэтак жа, як сцены паста офіс была падзелена на дробныя, аднолькавага памеру блокі прасторы, што мы называем PO скрынку. Кожны элемент масіва можа захоўваць пэўную колькасць дадзеных, як кожны паштовую скрыню можа правесці пэўную колькасць пошце. Што можна захоўваць у кожным элеменце масіў зменных і тых жа дадзеных тып, напрыклад, Int або паўкокс, усяго як у вашым скрыні паштовым аддзяленні, Вы можаце ўставіць толькі рэчы падобнага тыпу, такія як лісты або невялікіх ўпакоўках. Нарэшце, мы можам атрымаць доступ да кожнага элементу масіў непасрэдна па нумары індэкса, як мы можам атрымаць доступ да нашых паштовае аддзяленне скрынка, ведаючы яго нумар паштовай скрыні. Спадзяюся, што аналогія дапамагае вам атрымаць вашу галаву вакол ідэі масіваў па аналогію з чымсьці яшчэ што вы, верагодна, ўжо знаёмыя. У C, элементы масіва з'яўляюцца індэксуецца, пачынаючы з 0, а не ад 1. І гэта сапраўды важна. І на самай справе, гэта, чаму мы, у CS 50, і чаму навукоўцы-кампутарнікі часта будзе лічыць ад 0, таму масіва C у індэксацыя, якая заўсёды пачынаецца з 0. Такім чынам, калі масіў складаецца з п элементаў, першы элемент гэтага масіву знаходзіцца па індэксе 0, і апошні элемент масіва знаходзіцца ў індэксам п мінус 1. Зноў жа, калі ёсць п элементаў у нашых Масіў, апошні індэкс п мінус 1. Так што, калі наш масіў мае 50 элементаў, у Першы элемент размешчаны па індэксе 0, і апошні элемент знаходзіцца ў індэксе 49. На жаль, ці на шчасце, у залежнасці ад вашага пункту гледжання, З вельмі мяккімі тут. Гэта не перашкодзіць вам выходзячы за межы свайго масіва. Вы можаце атрымаць доступ да мінус 3 элемент вашага масіва ці 59-элемент вашага масіва, калі ваш масіў мае толькі 50 элементаў. Гэта не спыніць сваю праграму з кампіляцыі, але падчас выканання, Вы можаце сутыкнуцца з Страшны памылкі сегментацыі калі вы пачынаеце атрымаць доступ да памяці што знаходзіцца па-за межамі таго, што Вы спыталі вашу праграму, каб даць вам. Так што будзьце асцярожныя. Што робіць масіў Заяву выглядае? Як мы закадаваць масіва ў існаванні як мы код любой іншай зменнай? Ёсць тры часткі ў масіў declaration-- тып, імя, і памер. Гэта вельмі падобны на Аб'яву зменнай, якая гэта проста тып і імя, элемент Памер быўшы асаблівы выпадак для масіва, таму што мы атрымліваем кучу з іх у той жа час. Такім чынам, тып, які зменнай, хачу, каб кожны элемент масіва будзе. Вы хочаце, каб гэта масіў цэлых лікаў? Затым ваш тып дадзеных павінен быць Int. Хочаце, каб гэта было масіў падвойваецца або паплаўкі? Тып дадзеных павінен быць двайны або плаваць. Гэтае імя, што вы хачу звярнуць вашу масіў. Што вы хочаце, каб назваць гэтага гіганта банк цэлых лікаў або плавае або сімвалаў або двухмесныя, ці ўсё, што ў вас? Што вы хочаце назваць гэта? Даволі тлумачэнняў. Нарэшце, памер, які ідзе ўнутры квадратных дужак, як многія элементы, якія вы б як ваш масіў ўтрымлівае. Колькі лікаў вы хочаце? Колькі плыве вы хочаце? Так, напрыклад, INT ацэнкі студэнтаў 40. Гэта аб'яўляе масіў з імем Студэнт гатунку, які складаецца з 40 цэлых лікаў. Даволі тлумачэнняў, я спадзяюся. Вось яшчэ адзін прыклад. Падвойныя цэны меню 8. Гэта стварае масіў з імем Цэны меню, якое складаецца пакоя ў памяці восем дубляў. Калі вы думаеце пра кожнага элеменце масіва тыпу дадзеных тыпу, Так, напрыклад, адзін элемент масіў тыпу INT, гэтак жа, як вам будзе думаць аб любой іншай пераменная тыпу Int, ўсе звыклыя аперацыі, якія мы абмяркоўвалася раней у аперацыях відэа будзе мець сэнс. Дык вось, мы маглі б аб'явіць масіў лагічных значэнняў званыя Truthtable, якая складаецца з пакоя для 10 Booleans. А потым, як мы маглі б проста прысвоіць значэнне ў любой іншай зменнай тыпу Лагічнае, мы маглі б сказаць што-то як Truthtable квадратных дужках 2, які з'яўляецца, як мы паказваем, які элемент табліцы праўдзівасці? Трэці элемент з Табліца праўдзівасці, таму што памятаеце, мы разлічваем ад 0. Дык вось, як мы пазначыць Трэці элемент табліцы праўдзівасці. Truthtable 2 раўняецца хлусня, гэтак жа, як мы маглі б declare-- ці мы маглі б прызначыць, а любая Лагічны тып зменнай, каб быць ілжывым. Мы можам таксама выкарыстоўваць яго ў умовах. калі (== 7 truthtable праўдзіва), які павінен сказаць, калі восьмы элемент з Truthtable праўда, можа быць, мы хочам, каб надрукаваць паведамленне карыстачу, Е ("ПРАЎДА! N");. Гэта прымушае нас казаць Truthtable 10 роўная праўда, ці не так? Ну, я магу, але гэта даволі небяспечна, таму што памятаеце, у нас ёсць масіў з 10 булева. Такім чынам, высокі паказчык, што кампілятар даў нам 9. Гэтая праграма кампілюецца, але калі нешта яшчэ ў памяці існуе там, дзе мы б чакаць Truthtable 10 ісці, мы маглі б пацярпець памылку сегментацыі. Мы можа сысці з ім, але ў цэлым, вельмі небяспечна. Так, што я раблю тут прававой З, але не абавязкова лепшы ход. Зараз, калі вы аб'яўляеце і ініцыялізаваць масіў адначасова, там на самой справе даволі спецыяльны сінтаксіс, што вам можна выкарыстоўваць для запаўнення масіва з яго пачатковымі значэннямі. Ён можа атрымаць грувасткім абвясціць масіў памерам 100, а затым павінен сказаць, элемент 0 роўны гэтаму; элемент 1 роўны гэтаму; элемент 2 роўная, што. Які сэнс, праўда? Калі гэта невялікі масіў, вы маглі б зрабіць нешта накшталт гэтага. Bool truthtable 3 роўная адкрыты фігурная дужка, а затым коска аддзяліць спіс элементаў што вы хочаце, каб пакласці ў масіве. Затым зачыніце фігурная дужка коскі. Гэта стварае масіў Памер тры называецца Truthtable, з элементамі ілжывай, праўда, і праўда. І на самай справе, канкрэтызацыя Сінтаксіс ў мяне вось сапраўды гэтак жа, як рабіць тое індывідуальны сінтаксіс элемента ніжэй. Гэтыя два спосабу кадавання будзе вырабляць той жа масіў. Сапраўды гэтак жа мы маглі прайсціся па ўсіх элементах масіва, выкарыстоўваючы цыкл, які, у сутнасці, з'яўляецца вельмі настойліва рэкамендуецца на хаце практыкаванні. Як стварыць масіў 100 цэлых лікаў, дзе кожны элемент масіва з'яўляецца яго індэкс? Так, напрыклад, у нас ёсць масіў з 100 цэлыя лікі, а ў першым элеменце, мы хочам, каб пакласці 0. У другой элемент, мы хочам, каб пакласці 1. У трэцім элеменце, мы хочам пакласці 2; і гэтак далей, і гэтак далей. Гэта сапраўды добра на хаце практыкаванні, каб зрабіць гэта. Тут гэта не выглядае як занадта шмат што змянілася. Але звярніце ўвагу, што ў паміж квадратныя дужкі, на гэты раз, Я на самой справе апусціць нумар. Калі вы выкарыстоўваеце гэта вельмі спецыяльны асобніка Сінтаксіс стварыць Масіў, вы на самой справе не неабходна ўказаць памер масіва загадзя. Кампілятар досыць разумны, каб ведаць, што вы сапраўды хачу масіў памеру 3, таму што вы паклалі тры элемента справа ад знака роўнасці. Калі вы паставілі чатыры, гэта было б даў вам табліцу праўдзівасці памеру чатыры; і гэтак далей, і гэтак далей. Масівы не абмяжоўваюцца адной вымярэнне, якое з'яўляецца даволі халаднавата. Вы на самой справе можа мець як многія бакавыя спецификаторы, як вы хочаце. Так, напрыклад, калі вы хочаце стварыць дошка для гульні Марскі бой, які, калі вы калі-небудзь гуляў, гэта гульня, якая з'яўляецца гуляў з калкамі на 10 на 10 сетку, Вы маглі б стварыць масіў як гэта. Можна сказаць, Bool лінкор квадратная дужка 10 закрытая дужка квадратная Кранштэйны 10 зачынены квадратную дужку. І потым, вы можаце выбраць інтэрпрэтаваць гэта на ўвазе, як у 10 10 сеткі вочак. Цяпер, на самай справе, у памяці, гэта сапраўды проста застаюцца 100 элемент, адзін аднамерны масіў. І гэта, на самай справе, ідзе, калі вы ёсць тры вымярэння ці чатыры ці пяць. Гэта сапраўды проста не размнажаюцца усе indices-- ці ўсе памеры specifiers-- разам, і вы проста атрымаеце аднамернай Масіў памеру. Але з пункту гледжання арганізацыі і візуалізацыі і чалавечага ўспрымання, гэта можа быць нашмат прасцей, працаваць з сеткай калі вы працуеце на гульні як гульня ў крыжыкі-нулікі або лінкор, ці нешта падобнае. Гэта выдатны абстракцыя, замест таго, думаць пра Tic-Tac-Toe дошка ў лініі дзевяці квадраты або дошка Браняносец як лінія 100 квадратаў. 10 Кастрычнік сетцы або трох на тры сеткі, верагодна, шмат лягчэй ўспрымаць. Цяпер, што-то сапраўды Важна пра масівах. Мы можам ставіцца адзін ад прыватных асоб элемент масіва ў якасці зменнай. Мы бачылі, што раней калі мы былі прысваення значэнне Праўда некаторым Booleans або іх тэставання ва ўмоўных. Але мы не можам ставіцца да суцэльныя масівы сябе зменных. Мы не можам, напрыклад, прысвоіць адзін масіў ў іншы масіў, выкарыстоўваючы прызначэнне аператарам. Гэта не юрыдычнае С. Калі мы хочам, каб для example--, што мы будзе рабіць у гэтым прыкладзе будзе скапіяваць адзін масіў у іншы. Калі мы хочам, каб гэта зрабіць, мы на самай справе трэба выкарыстоўваць цыкл скапіяваць кожны асобны элемент па адным. Я ведаю, гэта крыху часу. Так, напрыклад, калі б мы мелі гэтыя некалькі радкоў кода, гэта будзе працаваць? Ну, не, гэта не так, праўда? Таму што мы спрабуем прызначыць ежу бар. Гэта не будзе працаваць, таму што гэта масіў, і мы толькі што апісалі што гэта не законна С. Замест гэтага, калі мы хочам, каб скапіяваць змесціва ежы у радку, што і мы спрабуем зрабіць тут, мы павінны былі б сінтаксіс накшталт гэтага. У нас ёсць цыкл, які ідзе ад J роўная 0 да 5, і мы павялічваем J на ​​кожнай ітэрацыі цыкл і прызначыць элементы, такія як, што. Гэта прывядзе да радка і які з'яўляецца адным, двума, трыма, чатырма, пяццю, але мы павінны зрабіць гэта гэты вельмі павольна элемент-па-элемента чынам, а, проста капіраванне ўвесь масіў. У іншых праграм мовы, больш сучасных, Вы можаце, на самай справе, рабіць толькі што проста роўная сінтаксіс. Але С, на жаль, мы Не дапускаецца, каб зрабіць гэта. Зараз, ёсць яшчэ адна што я хачу сказаць, аб масівах, якія могуць быць трохі крыху больш складана ў першы раз вам працаваць з імі. Мы абмеркавалі ў відэа аб бачнасці зменных, што большасць зменных ў C, калі Вы называеце іх функцый, якія перадаюцца па значэнні. Вы памятаеце, што гэта значыць, каб перадаць што-то па кошту? Гэта азначае, што мы робім копію Пераменная, якая перадаецца ў. Функцыя выклікаецца функцыя які атрымлівае зменную, ня атрымаць саму зменную. Ён атрымлівае свае мясцовыя Копія гэтага працаваць. Масівы, вядома, зрабіць не прытрымлівацца гэтага правіла. Хутчэй за ўсё, тое, што мы называем гэта праходзіць па спасылцы. Падпраграма самай справе зусім атрымаць масіў. Гэта не атрымаць яго ўласную лакальную копію з яго. І калі вы думаеце пра гэта, у гэтым ёсць сэнс. Калі масівы сапраўды вялікім, яго займае так шмат часу і намаганняў, каб зрабіць копію масіва 100 ці 1000 або 10000 элементаў, што гэта не варта для функцыянаваць, каб атрымаць копію з яго, зрабіць некаторую працу з ім, а затым проста зрабіць копію; не павінны мець гэта вісіць вакол больш. Паколькі масівы з'яўляюцца аднымі грувасткім і грувасткай, мы проста перадаваць іх па спасылцы. Мы проста давяраць гэтую функцыю каб, нічога не зламаць. Так гэта на самай справе атрымаць масіў. Гэта не атрымаць сваю ўласную лакальную копію. Так што гэта азначае, Затым, калі выкліканы абанент маніпулюе элементы масіва? Што адбываецца? У цяперашні час, мы будзем замоўчваць над тым, чаму менавіта гэты Бывае, чаму масівы перадаюцца па спасылцы а ўсё астатняе перадаецца па значэнні. Але я абяцаю вам, мы будзем вярнуцца і даць вам адказ да гэтага ў больш позняй відэа. Вось яшчэ адно практыкаванне для вас перш, чым мы абгарнуць рэчы на ​​масівах. Пучок кода тут, гэта ня асабліва добры стыль, проста я зраблю што перасцярога. Там няма каментарыяў тут, які з'яўляецца даволі дрэннай форме. Але гэта толькі таму, што я хацеў быць ў стане адпавядаць усё на экране. У верхняй частцы, вы можаце ўбачыць, што ў мяне ёсць дзве дэкларацыі функцыі для зададзенага масіва і ўсталяваць Int. Набор масіў, па-відаць прымае масіў з чатырох цэлых лікаў у якасці ўваходных дадзеных. І, мабыць, набор INT прымае адно цэлае лік у якасці свайго ўкладу. Але абодва яны не маюць выхаду. Выхад, вяртанне увядзіце, сябар адзін несапраўднымі. У галоўным, у нас ёсць пару радкоў кода. Мы аб'яўляем цэлалікавых зменную завецца і прызначыць ёй значэнне 10. Мы заяўляем, масіў з чатырох лікаў У завецца і прызначыць элементы 0, 1, 2 і 3, адпаведна. Затым, у нас ёсць званок, каб усталяваць INT і заклік усталяваць масіў. Вызначэння мноства масіва і набору INT ўніз ніжэй, на дне. І так, зноў жа, я прашу вас пытанне. Што атрымлівае раздрукаваць Тут у канцы асноўнага? Там гэта раздрукоўка кольк. Я друк з двух цэлых лікаў. Я раздрукоўкі змесціва і змесціва B квадратныя дужкі. 0 Паўза відэа тут і заняць хвіліну. Ці можаце вы высветліць, што гэта Функцыя друку ў канцы? Спадзяюся, калі вы ўзгадаць Адрозненне паміж перадача па значэнні і перадача па спасылцы, гэта Праблема была не занадта складана для вас. І адказ вы б знайшлі гэта. Калі вы не зусім ўпэўнены, каб чаму гэта так, узяць другі, вярнуцца, разгледзець тое, што я быў проста абмеркавання аб перадачы масіваў ў якасці спасылкі, у параўнанні з якая праходзіць іншыя зменныя па значэнні, і, спадзяюся, гэта зробіць трохі больш сэнсу. Я Дуг Лойд, і гэта CS50.