>> [Музички]
Даг LLOYD: Во ред.
Работа со еден променливи е прилично забавно.
Но, што ако сакаме да работиме со голем број на променливи,
но ние не сакаме да се има еден куп различни имиња летаат наоколу нашиот код?
Во овој случај, низи се случува да дојде во навистина корисна.
Низи се навистина основните податоци структура за било кој програмски јазик
дека ќе го искористите.
И тие се навистина, навистина корисни, особено, како што ќе видиме, во CS 50.
>> Ние ги користиме за да се одржи низи вредности на истиот тип на податоци
на соседни мемориски локации.
Така да се каже, тоа е начин на кој можеме да се група
еден куп на цели броеви заедно во меморија или еден куп на карактери
или лебди во меморија навистина затвори заедно и да работат
со нив, без да им даде на секој еден свој уникатен име, кое може да
се незгодни по извесно време.
>> Сега, еден начин да се analogize низи е да размислите за вашата локална пост
канцеларија за една секунда.
Па чекор подалеку од програмирање и само да ги затворите очите
и да се визуелизира во вашиот ум вашиот локален поштата.
Обично, во повеќето пост канцеларии, има голема банка
пошта кутии на ѕидот.
>> Низа е гигант блок на соседни меморија,
на ист начин како што пошта банка во пост вашата канцеларија
е голем простор на ѕид на поштата.
Низи се подели на мали, идентична големина блокови на просторот,
секој од нив е наречен елемент, во на ист начин дека ѕидот на пост
канцеларија е поделен во мали, идентична големина блокови на просторот,
што ние го нарекуваме сандаче.
Секој елемент од низата може чување на одредена количина на податоци,
исто како што секој пост фах е во состојба да држат определен износ на пошта.
>> Што може да се чуваат во секој елемент од низата е променливи на истите податоци
тип, како што се int или да се усвити, само како и во вашиот пост фах,
може да се вклопуваат само работи од сличен тип,
како што се писма или мали пакувања.
И на крај, ние може да пристапите до секој елемент од низата директно од индекс број,
исто како што ние може да пристапите до пост нашата канцеларија кутија со знаејќи нејзиниот број поштенско сандаче.
Се надевам, дека аналогија Ви помага да стигнете главата
околу идејата за низи од analogizing на нешто друго
дека вие сте веројатно веќе запознаени со тоа.
>> Во C, елементите на низата се индексирани почнувајќи од 0, а не од 1.
И ова е навистина важно.
И всушност, тоа е причината зошто ние, во CS 50, и зошто компјутерски научници често
ќе се смета од 0, е поради низа С
индексирање, која секогаш започнува од 0.
Па ако низа се состои од n елементи, на првиот елемент на таа низа
се наоѓа на индекс 0, и последниот елемент на низата
се наоѓа на индексот n минус 1.
Повторно, ако има n елементи во нашата низа, последниот индекс е n 1 минус.
>> Значи, ако нашата низа има 50 елементи, првиот елемент се наоѓа на индекс 0,
а последниот елемент се наоѓа на индексот 49.
За жал, или за среќа, зависност од вашата перспектива,
Ц е многу поблага тука.
Тоа нема да ве спречи од оди надвор од границите на својата низа.
Можете да пристапите до минус 3 елемент на својата низа
или 59-тиот елемент на својата низа, ако вашиот низа има само 50 елементи.
Тоа нема да запре својата програма од составувањето, но во рок време,
можете да се судрите на Страшната сегментација вина
ако почнете да се пристап до меморијата која е надвор од границите на она што
те праша својата програма да ви даде.
Па бидете внимателни.
>> Што значи низа декларација изгледа?
Како ние да се кодира низа во постоење како што се кодира било која друга променлива?
Постојат три дела во низа declaration-- тип, име,
и големина.
Ова е многу сличен на променлива декларација, која
е само еден тип и име, елементот големина се
посебен случај за низа, затоа што се добива еден куп од нив
во исто време.
>> Значи типот е каков вид на променлива вас сакаме секој елемент од низата да биде.
Го сакаат во низа на цели броеви?
Тогаш, вашиот тип на податоци треба да биде цел број.
Дали сакате тоа да биде Низа на двојки или пловки?
Вид на податоци треба да биде двојно или плови.
Името е она што сакате да се јавите на вашиот низа.
Што сакате да го именува овој гигант банката од цели броеви или пловки или знаци
или двојки, или што и да имате?
Што сакате да го наречеме?
Прилично само објаснување.
>> И на крај, големина, која оди внатрешноста на загради,
е колку елементи што би како вашиот низа да содржи.
Колку броеви сакаш?
Колку плови сакаш?
>> Така на пример, int студент оценки 40.
Ова изјавува низа наречен Студентски оценки, кој се состои од 40 цели броеви.
Прилично само објаснување, се надевам.
Еве уште еден пример.
Цените двојно мени 8.
Ова создава низа наречен Цените на менито, која се состои
простор во меморијата за осум двојки.
>> Ако мислите дека на секој елемент од низа на податоци тип-тип,
па на пример, еден елемент на низа на int тип, исто ви пат
ќе мисли на сите други променлива од тип int,
сите познати операции кои ги дискутирано претходно во работењето
видео ќе има смисла.
Па еве, ние би можеле да се изјаснат за низа на Booleans наречен Truthtable,
кој се состои од простор за 10 Booleans.
>> А потоа, исто како и ние може само да му ја додели вредност на било која друга променлива од тип
Логичка, ние би можеле да се каже нешто како Truthtable квадратни заградата
2, кој е како да се покаже, кој елемент на маса за вистината?
Третиот елемент на таблица на вистинитост, затоа што се сеќавам,
ние сме сметано од 0.
Па тоа е како ние се укаже на Третиот елемент на таблицата на вистинитост.
Truthtable 2 еднаква на лажни, исто како што ние би можеле да declare--
или би можеле да му ја додели, туку било Булова променлива тип како неточно.
>> Ние, исто така, можат да го користат во услови.
ако (truthtable 7 == точно), а тоа е да се каже,
ако осмиот елемент на Truthtable е точно,
можеби и ние сакаме да се печати порака на корисникот, printf ("n е вистина!") ;.
Која ни предизвикува да се каже Truthtable 10 е еднакво на вистина, нели?
Па, можам да, но тоа е прилично опасно, затоа што се сеќавам,
имаме низа од 10 Booleans.
Така највисок индекс дека компајлерот има дадено ни е 9.
>> Оваа програма ќе се собере, но ако нешто друго во меморијата
таму каде ние би Очекуваме Truthtable 10 да одат,
ние би можеле да страдаат дефект на сегментација. Ние може да се извлечеш со тоа, но во целина,
доста опасни.
Значи она што го правам тука е правен Ц, но не значи дека најдобар потег.
Сега, кога ќе се изјасни и да иницијализира низа истовремено,
има всушност е прилично специјална синтакса кои ви
можат да го користат за да се наполни салата на низа со почетна вредност.
Тоа може да се незгодни да прогласи низа на големината 100,
а потоа мора да се каже, елемент 0 еднаква со ова; елементи 1 е еднаков со ова;
елемент 2 еднаква на тоа.
Што е поентата, нели?
>> Ако тоа е мал низа, вие може да се направи нешто како ова.
Bool truthtable 3 дава отворена кадрава голема заграда и потоа запирка
разделиме листа на елементи што сакате да го стави во низа.
Потоа затворете кадрава заграда запирка.
Ова создава низа големина три наречен Truthtable,
со елементи лажно, тоа е вистина, и вистина.
И всушност, примерна синтакса имам тука е
иста како прават поединечни елемент синтаксата подолу.
Овие два начини на кодирање би произведуваат иста низа.
>> Слично на тоа, ние може да iterate во текот на сите елементи
на низа со користење на јамка, која, всушност, е многу препорачливо
дома вежбање.
Како да се создаде низа од 100 цели броеви, каде што
секој елемент од низата е неговиот индекс?
Така на пример, имаме низа од 100 цели броеви, и во првиот елемент,
ние сакаме да се стави 0.
Во вториот елемент, ние сакаме да се стави 1.
Во третиот елемент, сакаме да се стави 2; и така натаму и така натаму.
Тоа е навистина добра at-home вежба за да го направите тоа.
>> Еве, тоа не изгледа како премногу не се сменило.
Не се забележи дека меѓу квадратни загради, овој пат,
Јас сум всушност испушташе број.
Ако користите овој многу посебна примерна
синтакса за да се создаде низа, вие всушност не
се потребни за да се покаже на големината на низата претходно.
Компајлерот е доволно паметни да се знае дека вие всушност
сакате низа на големината 3, бидејќи се стави три елементи
на правото на знакот за еднакво.
Ако го стави четири, тоа ќе мора ви дава време маса вистината на големината четири;
и така натаму и така натаму.
>> Низи не се ограничени на еден димензија, која е прилично кул.
Ти всушност може да има колку страна назначувачи како сакате.
Така на пример, ако сакате да се создаде одбор за игра Линеен, кои,
Ако некогаш сте се игра, е игра која е игра со штипки на 10 од 10 мрежа,
можете да се создаде низа вака.
Може да се каже bool линеен квадратни заградата 10
затворена заграда квадратни плоштад Држач 10 затворени квадратни заграда.
>> И тогаш, можете да изберете да протолкува ова во вашиот ум како на 10
10 мрежа на ќелии.
Сега, всушност, во меморијата, тоа навистина само
остануваат 100 елементи, една димензионална низа.
А тоа, всушност, оди ако имаат три димензии или четири или пет.
Тоа е навистина само се множат сите indices--
или сите на големината specifiers-- заедно,
и можете само да се добие едно-димензионална Низа на таа големина.
>> Но во однос на организацијата и визуелизација и човечката перцепција,
тоа може да биде многу полесно да работат со решетка
ако си работат на игра како Tic-tac-пети или линеен,
или нешто слично.
Тоа е голема апстракција, наместо да се има
да се размислува за Tic-tac-пети одбор како линија на девет
плоштади или одбор линеен како линија на 100 квадрати.
А 10 од 10 решетка или три од страна на три мрежа е веројатно
многу повеќе лесно да се согледа.
>> Сега, нешто навистина важни за низи.
Ние можеме да се однесуваат едни кон поединецот елемент од низата како променлива.
Видовме дека порано кога бевме доделување
вредноста Точно на одредени Booleans или да ги тестира во conditionals.
Но, ние не може да се третираат целиот самите низи како променливи.
Не можеме да се, на пример, да додели една низа во друга низа користите задачата
оператор.
Тоа не е законски Ц.
>> Ако сакаме да се, за она што example-- ние ќе се прави во тој пример
ќе биде да го копирате една низа во друг.
Ако сакаме да го сториме тоа, всушност, треба да се користи телефонска линија за да го копирате во текот
секој поединечен елемент едно по едно време.
Знам дека е малку време.
>> Така на пример, ако имавме овие неколку линии на код, би оваа работа?
Па, не, тоа не би, нели?
Бидејќи ние се обидуваме да му ја додели на храна бар.
Тоа не се случува да се работи, затоа што тоа е низа,
а ние само што е опишано дека тоа не е законски Ц.
>> Наместо тоа, ако сакаме да копирате содржината на храна
во бар, што е она што ние се обидуваме да го направите тука,
ние ќе треба синтакса се допаѓа ова.
Имаме за телефонска линија што оди од J е еднаков на 0 до 5,
и ние прираст Ј на секоја итерација јамка и доделите елементи како што.
Ова ќе резултира со бар, исто така, да се биде еден, два, три, четири, пет,
но ние треба да го направи тоа многу бавно елемент по елемент начин,
наместо само со копирање на целата низа.
Во други програмски јазици, повеќе современи,
можете да се, всушност, го прават токму тоа е толку едноставно еднаква на синтаксата.
Но C, за жал, ние сме не е дозволено да го стори тоа.
>> Сега, има една друга нешто што сакам да споменам
за низи што може да биде малку малку незгодно прв пат ќе се
работат со нив.
Разговаравме во видео за опсег на променливите,
дека повеќето варијабли во C, кога ќе се јавите нив во функции, се донесени од страна вредност.
Се сеќаваш ли што значи тоа да помине нешто од вредност?
Тоа значи дека ние сме прави копија од променлива и тоа е се проследени во.
Функцијата callee, функцијата што е добивањето на променливата,
не добие самата променлива.
Тоа добива своја локална копија од него да се работи со.
>> Низи, се разбира, го направи не го следат ова правило.
Напротив, она што ние го нарекуваме овој Минува по референца.
На callee всушност го прима низа.
Не добие своите сопствена локална копија од него.
И ако мислите дека за тоа, ова има смисла.
Ако низи се навистина големи, таа потребно толку многу време и напор
да се направи копија од низа на 100 или 1000 или 10.000 елементи,
дека тоа не е достоен за тоа за функција за да добие копија од него,
направи некои работи со неа, а потоа само да се направи со копија;
тоа не треба да се има што виси околу повеќе.
>> Бидејќи низи се некои обемна и тежок,
ние само да ги помине со повикување.
Ние само се надеваме дека функцијата да, не се скрши нешто.
Па тоа не се всушност низа.
Тоа не добие своја локална копија од него.
>> Па што значи тоа, Потоа, кога callee
манипулира со елементи на низата?
Што се случува?
За сега, ние ќе притајуваат повеќе зошто токму овој
се случува, зошто низи се пренесуваат по референца
и се друго е донесен од вредност.
Но јас ви ветувам, ние ќе врати и да ви даде одговор
со ова во некоја подоцнежна видео.
>> Еве уште една вежба за вас пред да ги заврши работите на низи.
Куп на код овде, тоа е не е особено добар стил,
само јас ќе се направи тоа протест.
Нема коментари во тука, што е прилично лоша форма.
Но, тоа е само затоа што сакав да биде способен да одговара на се што е на екранот.
>> На врвот, можете да видите дека имам со две функции декларации за сет низа
и го постави Инт.
Сет низа очигледно зема низа од четири броеви како свој придонес.
И сет int очигледно зема еден цел број како свој придонес.
Но, и двете од нив немаат излез.
На излез, на враќање тип, на секој од нив е неважечки.
Во главната, имаме неколку линии на код.
Изјавуваме целобројна променлива нарекува и да се додели вредност 10.
Изјавуваме низа од четири броеви наречен Б и го додели на елементи 0, 1,
, 2 и 3, соодветно.
Тогаш, имаме повик за поставена int и повик да се постави низа.
Дефинициите на сет низа и сет int се долу, на дното.
>> И така, повторно, јас ќе се постави прашањето.
Што добива испечати тука на крајот на главната?
Има еден отпечатоците COL. Јас сум печатење на два цели броја.
Јас сум во печатење на содржината на една и содржината на Б квадратни заградата 0.
Паузирате видеото тука и да се земе една минута.
Може ќе дознаам што е ова функција ќе се печати на крајот?
Се надеваме дека, ако се потсетиме на Разликата помеѓу поминува вредност
и поминува со упатување, овој Проблемот не е премногу слабо за вас.
А одговорот што би откривме е ова.
Ако не сте сосема сигурни како да се зошто тоа е случај, да ги преземе и втор,
врати се назад, да видиш што сум бил само разговара за полагање низи
со упатување, наспроти полагање други променливи од вредност,
и се надевам дека тоа ќе се направи малку повеќе смисла.
>> Јас сум Даг Лојд, и ова е CS50.