>> [Грає музика]
ДАГ 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.