>> [За възпроизвеждане на музика]
Дъг LLOYD: Добре.
Обработка с единичен променливи е доста забавно.
Но какво, ако искаме да работим с много променливи,
но ние не искаме да имаме куп различни имена, плаващ около нашата код?
В този случай, масиви са ще дойде в много удобен.
Масивите са наистина фундаментални данни структура за всеки програмен език
че ще използвате.
И те са много, много полезно, особено, както ще видим, в CS 50.
>> Ние използваме масиви за провеждане стойности от същия тип данни
при съседни места в паметта.
Така да се каже, че това е така, че ние да групирате
куп числа заедно в памет или един куп герои
или плува в паметта наистина близо един до друг и да работят
с тях, без да се налага да даде на всеки един свой уникален наименование, което може да
получите тромава след известно време.
>> Сега, един от начините за подобен съм масиви е да се мисли за местната пощенска
офис за секунда.
Така крачка от програмиране и просто затворете очи
и визуализирайте в ума си с местния пощенски клон.
Обикновено, в повечето пост офиси, има голяма банка
на пощенски кутии на стената.
>> Масивът е гигантска блок на непрекъсната памет,
по същия начин, по пощата банка в пощата си офис
е голям пространство на стена от пощенската служба.
Масивите са разделени в малък, идентичен по размер блокове от пространството,
всеки от които се нарича елемент, в по същия начин, че стената на гредата
офис е бил разделен на малки, идентичен по размер блокове от пространството,
което ние наричаме на пощенска кутия.
Всеки елемент на масива могат съхранява определено количество информация,
точно както всяка пощенска кутия е в състояние за провеждане на определена сума на поща.
>> Това, което може да се съхранява във всеки елемент на масива е променливи на същите тези данни
тип, като инт или Чар, просто като във вашата пощенска кутия,
може да се побере само неща от подобен тип,
като букви или малки опаковки.
На последно място, ние можем да получите достъп до всеки елемент от масива директно от цифров индекс,
точно както можем да имаме достъп пост нашия офис боксира като знаят неговия номер на пощенска кутия.
Надяваме се, че аналогия ви помага да стигнете главата си
около идеята на масиви от analogizing към нещо друго
че вие ​​сте най-вероятно вече е запознат с.
>> В C, елементите на масив са индексира започва от 0, а не от 1.
И това е наистина важно.
И в действителност, това е защо ние, в CS 50, И защо компютърни учени често
ще се брои от 0, е поради масив C е
индексиране, които винаги започва при 0.
Така че, ако масив се състои от наш елементи, първият елемент на този масив
се намира в индекс 0, и последният елемент на масива
се намира в индекса п минус 1.
Отново, ако има наш елементи в нашата масив, последната индекса е п минус 1.
>> Така че, ако нашата масив има 50 елемента, на Първият елемент е разположен в индекс 0,
и последния елемент се намира на индекс 49.
За съжаление или за щастие, в зависимост от вашата гледна точка,
C е много снизходителен тук.
Това няма да ви попречи да се Ще извън границите на масива.
Можете да получите достъп до минус 3 елемент на масива
или 59-ия елемент на масива, ако вашият масив има само 50 елементи.
Тя няма да спре програмата си от съставяне, но по време на изпълнение,
може да срещнете по- страховитите сегментацията на вина
ако започнете да получите достъп до паметта , което е извън пределите на това, което
те попитах си програма, за да ви дам.
Така че бъдете внимателни.
>> Какво означава масив декларация изглежда?
Как да се кодират масив в съществуването като ние кодира всяка друга променлива?
Има три части към масив declaration-- вид, име,
и размер.
Това е много подобен на променлива декларация, която
е само един вид и име, елемента размер е
специалния случай на масив, защото ние сме все един куп от тях
по същото време.
>> Така че видът е какъв вид променлива ви Искам всеки елемент на масива да бъде.
Да го искат към масив от цели числа?
След това, вашия тип данни трябва да е инт.
Искате ли да бъде масив от двойки или плувки?
Тип на данните трябва да бъде двойно или поплавък.
Името е това, което искате да се обадите на вашия масив.
Какво искаш да назове тази гигантска банка от цели числа или поплавъци или символа
или удвоява, или каквото имате?
Какво искаш да го наречем?
Pretty самостоятелно обяснителен.
>> Накрая, размер, който отива вътре в квадратни скоби,
е колко елемента бихте като вашия масив да съдържа.
Колко числа искаш?
Колко плувки искаш?
>> Така например, Int студентски класове 40.
Това декларира масив наречена Student класове, които се състои от 40 числа.
Pretty самостоятелно обяснителен, надявам се.
Ето още един пример.
Двойни цени менюто 8.
Това създава масив, наречен Меню цени, които се състои
на стая в памет на осем двойки.
>> Ако мислите, че на всеки елемент на масив от тип данни тип,
така например, един елемент на масив от тип INT, същия начин ви
ще мисля за друг променлива от тип INT,
всички познати операции, които ние вече е обсъдено в експлоатационното
видео ще има смисъл.
Така че тук, можем да декларираме масив от Булев тип наречени Truthtable,
който се състои от стая в продължение на 10 Булев тип.
>> И тогава, точно както бихме могли просто да присвоите стойност на всяка друга променлива от типа
Булева, бихме могли да кажем нещо като Truthtable квадратна скоба
2, което е как можем да посочи, кой елемент от таблицата на истината?
Третият елемент от истината маса, защото не забравяйте,
ние сме се брои от 0.
Така че това е начина, по който да обозначава на Третият елемент от таблицата на истината.
Truthtable 2 е равно на невярна, точно както бихме могли да declare--
или бихме могли да зададете по-скоро, всеки Булева променлива тип, че е невярна.
>> Можем също така да го използвате в условия.
ако (truthtable 7 == вярно), която е да се каже,
ако осмия елемент на Truthtable е вярно,
може би ще искате да отпечатате съобщение на потребителя, ФОРМАТ ("п TRUE!") ;.
Това ни кара да се каже Truthtable 10 се равнява вярно, нали?
Е, мога, но това е доста опасна, защото не забравяйте,
имаме масив от 10 Булев тип.
Така най-високата индекс че съставител е дал ни е 9.
>> Тази програма ще се съберат, но ако нещо друго в паметта
е налице, когато бихме очакваме Truthtable 10 да отида,
бихме могли да страдат вина сегментация. Ние може да се размине с нея, но като цяло,
доста опасно.
Така че това, което правя тук е юридическо C, но не е задължително най-добрият ход.
Сега, когато се декларират и инициализира масив едновременно,
всъщност има доста специален синтаксис, че сте
може да се използва за запълване на масива с неговите изходни стойности.
Той може да получи до тромави декларира масив с размер 100,
и след това трябва да се каже, елемент 0 се равнява на това; елемент 1 е равно на това;
елемент 2 е равно на това.
Какъв е смисълът, нали?
>> Ако това е малък масив, вие може да направи нещо подобно.
Булев truthtable 3 равнява отворена фигурна скоба и след това със запетая
отделяне на списъка на елементи че искате да поставите в масива.
След това затворете фигурна скоба и запетая.
Това създава масив от размер на три нарича Truthtable,
с елементи невярна, вярно, и вярно.
И всъщност, инстанциирането синтаксис имам тук е
точно същата, както прави отделен елемент синтаксис долу.
Тези два начина за кодиране те помагат произведе точно същия масив.
>> По същия начин, можем да превъртите над всички елементи
на масив, използвайки линия, която, в Всъщност е много силно препоръчително
в дома упражнение.
Как да се създаде масив 100 числа, където
всеки елемент на масива е индексът й?
Така например, ние имаме масив от 100 числа, и в първия елемент,
ние искаме да се сложи 0.
Във втория елемент, ние искаме да се сложи 1.
В третия елемент, ние искаме да се сложи 2; и така нататък, и така нататък.
Това е един наистина добър в дома упражнения да правя това.
>> Ето, че не изглежда като твърде много се е променила.
Но забележете, че по средата на квадратни скоби, този път,
Аз бях всъщност пропуснати номера.
Ако използвате този много специална инстанция
синтаксис, за да се създаде масив, вие всъщност не го правят
Трябва да се посочи размера на масива предварително.
Компилаторът е достатъчно умен, да се знае, че всъщност
Искам масив с размер 3, защото ще ви постави три елемента
вдясно от знака за равенство.
Ако беше турил четири, тя ще има ти дал една маса истината с размер четири;
и така нататък, и така нататък.
>> Масивите не се ограничават до единична измерение, което е много готино.
Вие действително може да има колкото се може повече странични спецификатори, както желаете.
Така например, ако искате да създадете дъска за игра линеен кораб, който,
ако някога е играл, е една игра, която е Играе се с клечки за 10 от 10 мрежа,
бихте могли да се създаде масив по този начин.
Може да се каже BOOL боен кораб квадратна скоба 10
затворен квадрат скоба квадратна скоба 10 е затворен квадрат скоба.
>> И след това, можете да изберете да тълкува това в ума си като 10
от 10 мрежа от клетки.
Сега, в действителност, в памет, тя всъщност прави само
остават 100 елемент, единична мерен масив.
И това, всъщност, се отнася и за вас, ако има три измерения или четири или пет.
Тя наистина само се размножават всички от indices--
или всички от размера specifiers-- заедно,
а ти просто се едномерен масив от този размер.
>> Но по отношение на организацията и визуализация и човешкото възприятие,
тя може да бъде много по-лесно да работи с мрежа
ако работите на игра като Tic-так-палеца или Battleship,
или нещо такова.
Това е чудесен абстракция, вместо да се налага
да се мисли за по-Tic-так-палеца борда като линия на девет
квадрати или на борда Battleship като линия от 100 квадрата.
A 10 от 10 мрежа или три от три решетка е вероятно
много по-лесно да се възприемат.
>> Сега, нещо наистина важно за масиви.
Ние може да лекува всеки отделен елемент на масива като променлива.
Видяхме, че по-рано когато бяхме възлагане
стойността True до определени Булев тип или тестването им в условни.
Но ние не можем да се отнасяме към цялата самите масиви като променливи.
Ние не може, например, да назначи един тип масив на друг масив, използвайки заданието
оператор.
Това не е юридическо C.
>> Ако искаме да, за това, което example-- ние ще се прави с това, че например
ще бъде да копирате един масив в друг.
Ако искаме да направим това, ние всъщност трябва да се използва една линия, за да копирате
всеки отделен елемент, един по един.
Знам, че е малко по-времеемко.
>> Така например, ако имахме тези двойка на реда код, би тази работа?
Е, не, това не искаше, нали?
Тъй като ние се опитваме да възложи на храна бар.
Това няма да работи, защото това е масив,
и ние току-що описах че това не е юридическо C.
>> Вместо това, ако искаме да копирате съдържанието на храните
в бар, който е това, което ние се опитваме да направим тук,
ние ще трябва синтаксис, подобен на този.
Ние имаме за линия, която отива от J е равно на 0 до 5,
и ние увеличаваме J на ​​всяка итерация на примката и да се определят елементите, като тази.
Това би довело до бар също че е един, два, три, четири, пет,
но ние трябва да го направя това много бавен елемент-по-елемент начин,
вместо само с копиране на цялата решетка.
В друго програмиране езици, по-модерни такива,
можете да всъщност направи точно че просто се равнява на синтаксис.
Но C, за съжаление, ние сме Не е разрешено да се направи това.
>> Сега, има един друг нещо, което искам да спомена,
за масиви, че може да е малко доста труден първи път сте
работят с тях.
Обсъдихме във видео за променлив характер,
че повечето променливи в C, когато ви се обаждат ги във функции, са преминали по стойност.
Спомняте ли си какво означава това да премине нещо по стойност?
Това означава, че ние сме прави копие на променлива, която е да се прехвърлят инча
Функцията callee, функцията която е получател на променливата,
не се получи самата променлива.
Той получава своя собствена локална копие от него да се работи.
>> Масивите, разбира се, да направя не следват това правило.
По-скоро, това, което ние наричаме това преминава справка.
The callee всъщност не получава масива.
Тя не получи своята собствено локално копие от него.
И ако мислите, че за то, това има смисъл.
Ако масиви са наистина големи, то отнема толкова много време и усилия
да направите копие на масив от 100 или 1000 или 10000 елементи,
, че не си струва за функционират, за да получи копие от него,
се направят някои работи с него, а след това просто да се направи с копието;
тя не трябва да има тя навърта наоколо вече.
>> Защото масиви са някои обемисти и тромава,
ние просто ги предава чрез препратка.
Ние просто се надявам, че функцията да, не се счупи нещо.
Така че тя не се получи в действителност масива.
Тя не получи своя собствена местна копие от него.
>> И така, какво означава това, След това, когато callee
манипулира елементи на масива?
Какво става?
За сега, ние ще замаже над защо точно тази
се случва, защо масиви се предава чрез връзка
и всичко останало, се предава по стойност.
Но аз ви обещавам, ние ще се върне и ще ви даде отговора
на това в по-късен видео.
>> Ето още едно упражнение за вас преди да приключи нещата на масиви.
Гроздът на код тук, това е не е особено добър стил,
Просто аз ще направя, че протест.
Има още няма коментари тук, което е доста лоша форма.
Но това е само защото съм искал да бъда могат да се поберат всичко на екрана.
>> В горната част, можете да видите, че имам две функционални декларации за набор масив
и задайте инт.
Set масив очевидно отнема масив от четири числа, като своя принос.
И набор инт очевидно отнема едно цяло число, както е нейното въвеждане.
Но и двете от тях не разполагат с мощност.
Продукцията, връщането написали, на всяка една е невалидна.
В Main, имаме Няколко реда код.
Декларираме на целочислена променлива наречен A и го присвоява стойност 10.
Ние заявяваме, масив от четири числа наречена B и задайте елементите на 0, 1,
, 2 и 3 съответно.
След това, ние имаме покана да зададете INT и призив да се създаде масив.
Определенията на набор масив и набор инт са по-долу, на дъното.
>> И така, отново, аз ви задам въпроса.
Какво получава разпечатани тук в края на Main?
Има една разпечатка цв. Аз съм разпечатване на две цели числа.
Аз съм отпечатване на съдържанието на A и съдържанието на B квадратна скоба 0.
Пауза на видео тук и да отнеме минута.
Може ли да разбера какво е това функция ще се отпечата в края?
Надяваме се, ако си припомним разграничение между преминаване по стойност
и минава за справка, това проблем не е твърде трудно за вас.
И отговорът бихте открих е това.
Ако не сте напълно сигурни, че да защо това е така, да вземе втория,
се върна, да преразгледа това, което аз бях просто обсъждане за преминаване масиви
за справка, в сравнение с преминаване други променливи по стойност,
и да се надяваме, че ще направи малко повече разум.
>> Аз съм Дъг Лойд, и това е CS50.