[Powered by Google Translate] Хајде да причамо о низовима.
Па зашто би смо икада желе да користе низове?
Па рецимо да имате програм који треба да складиштите 5 ИД студената.
То можда делује разумно да имају 5 одвојене променљиве.
Из разлога ћемо видети у мало, ми ћемо почети бројање од 0.
Променљиве ћемо имати биће инт ид0, инт ид1, и тако даље.
Свака логика желимо да изведете на студентском ИД ће морати да се копирали и налепили
за сваки од ових студентских личних карата.
Ако желимо да проверите које студенти се деси да буде у ЦС50,
прво ћете морати да проверите да ли ид0 представља студента у току.
Онда да ураде исто за следећи студента, ми ћемо морати да копирате и налепите код за ид0
и замените сва појављивања ид0 са ид1 и тако даље за ИД2, 3 и 4.
>> Чим чујете да треба да копирате и налепите,
требало би да почнете да размишљате да постоји боље решење.
Сада шта ако схватите да не треба 5 ИД студената већ 7?
Морате да се вратите у своју изворни код и додајте у ИД5, један ид6,
копирате и налепите логику за проверу да ли су ИД припадају класи за ове 2 нове личне карте.
Нема ничег повезује све ове личне карте, па не постоји начин да питате
Програм се то уради за личне карте 0 до 6 година.
Па сада сте схватили да имате 100 студената ИД.
То почиње да изгледа мање од идеалне морати да прогласи посебно сваки од ових докумената,
копирате и налепите сваку логику тих нових личних карата.
Али можда смо одлучни, и то радимо за све 100 студената.
Али, шта ако не знате колико студената има заправо?
Постоји само неколико н студенти и ваш програм мора да пита корисника шта то је н.
Ух ох. Ово неће да ради веома добро.
Ваш програм ради само за неке константе броја студената.
>> Решавање свих ових проблема је лепота низова.
Дакле, шта је низ?
У неким програмским језицима низ типа може бити у стању да уради нешто више,
али овде ћемо се фокусирати на основне податке низа структура баш као што ћете видети у Ц.
Низ је само велики блок меморије. То је то.
Када кажемо да имамо низ од 10 целих бројева, то само значи да имамо неку блокаду
меморије која је довољно велика да држи 10 одвојене бројеве.
Под претпоставком да је цео 4 бајта, што значи да низ од 10 целих
је континуирано блок 40 бајтова у меморији.
Чак и када користите мултидимензионалне низове, које нећемо ићи на ту,
то је још увек само велики блок меморије.
Вишедимензионални нотација је само погодност.
Ако имате 3 од 3 мултидимензионалног низа целих бројева,
онда се ваш програм ће заиста само третирати као велики блок од 36 бајта.
Укупан број целих бројева је 3 пута 3, а сваки заузима цео 4 бајта.
>> Хајде да погледамо основни пример.
Овде можемо видети 2 различите начине декларисању низова.
Мораћемо да коментарише 1 од њих се за програм у циљу прикупљања
јер смо прогласити к пута.
Ми ћемо да погледамо неке од разлика између ових 2 врсте изјава у мало.
Оба ова линија прогласи низ величине Н,
где смо се дефинишу # Н као 10.
Управо смо могли тако лако су тражили корисника за позитиван цео број
и користе ту цео као број елемената у нашем низу.
Као пред наш пример студентску карту, то је нешто као проглашења 10 потпуно одвојена
имагинарне варијабли; к0, к1, к2, и тако све до кн-1.
Игнорисање линије где смо прогласи низ, приметићете средњој загради нетакнут
унутра за петљи.
Када пишемо нешто попут к [3], који ћу читати као носач к 3,
можете мислити о томе као тражећи имагинарног Кс3.
Обратите пажњу него са низом величине Н, то значи да је број унутар заграда,
који ћемо назвати индекса, може бити било шта од 0 до Н-1,
што је укупно Н индекса.
>> Да размислите о томе како то заправо функционише
запамтите да је низ је велики блок меморије.
Под претпоставком да је цео 4 бајта, цео низ к 40 бајта блок меморије.
Тако к0 односи на првих 4 бајта у блоку.
Кс [1] се односи на наредних 4 бајта и тако даље.
То значи да је почетак к је све програм икада треба да пратите.
Ако желите да користите Кс [400], а затим програм зна да је то еквивалент
на само 1.600 бајта након почетка к.
Одакле добијамо 1.600 бајта из? То је само 400 пута 4 бајта по цео број.
>> Пре него што наставимо даље, то је веома важно да се схвати да у Ц
не постоји примена индекса који користимо у низу.
Наш велики блок је само 10 целих дуго, али ништа неће викати на нас, ако пишемо к [20]
или чак к [-5].
Индекс не мора ни да буде број.
То може бити било произвољно израз.
У програму користимо променљиву сам из петље за то индекс у низу.
Ово је веома чест образац, петље од И = 0 до дужине низа,
А онда сам користи као индекс за низа.
На овај начин можете ефикасно петље преко целог низа,
и можете да доделите сваком месту у низу или користити га за неке калкулације.
>> У прво за петљу, ја почиње од 0,
и тако ће доделити 0 место у низу, вредност 0 пута 2.
Онда сам корацима, а ми доделили прву позицију у низу вредност 1 пута 2.
Онда сам опет повећава и тако даље до издвајамо позиционирати Н-1 у низу
вредност Н-1 пута 2.
Зато смо направили низ са првих 10 бројева чак.
Можда уједначава би било мало боље име за променљиву од к,
али да би дао нешто далеко.
Други за петљу онда само штампа вредности које смо већ налазе унутар низа.
>> Да покушајте да покренете програм са оба типа низа декларација
и погледајте на излазу програма.
Колико видимо, програм се понаша на исти начин за обе врсте декларација.
Хајде да се погледамо шта се дешава ако променимо прву петљу да не заустави на Н
већ кажу 10.000.
Пут након краја низа.
Упс. Можда сте видели ово раније.
Сегментација грешка значи да је ваш програм је отказао.
Можете да видите ово када додирнете области меморије не би требало да се додирују.
Овде се додирују 10.000 места изван почетка к,
што очигледно је место у меморији не би требало да буде дирљиво.
Дакле, већина нас вероватно не би случајно ставио 10.000 уместо Н,
али шта ако урадимо нешто суптилнији попут кажу писања мање или једнако Н
у за петље услов за разлику од мање од Н.
Запамтите да низ има само индекса од 0 до н-1,
што значи да је индекс Н је након краја низа.
Програм можда није пада у овом случају, али то је још увек грешка.
У ствари, ова грешка је тако чест да има свој назив,
искључити 1 грешке.
>> То је то за основе.
Па шта су главне разлике између 2 врсте низа декларација?
Једна од разлика је место где велики блок меморије иде.
У првој изјави, коју ћу назвати носач-арраи тип,
мада то никако не значи конвенционалну име,
она ће ићи на стек.
Док у секунди, што ћу назвати показивач низа-тип, то ће ићи на гомили.
То значи да када функција врати, носач низ ће аутоматски бити деаллоцатед,
а како ви Изричито да позовете бесплатно на курсор низу
иначе имате меморијску цури.
Поред тога, носач низ заправо није променљива.
Ово је важно. То је само симбол.
Можете мислити о томе као константа која компајлер бира за вас.
То значи да не можемо да урадимо нешто слично к + + са конзоле типа,
мада ово је савршено важећа са показивача типа.
>> Показивач тип је променљива.
За курсор типа, имамо 2 одвојене блокове меморије.
Варијабла к је сама чува у стеку, а само један показивач,
али је велики блок меморије је ускладиштена на гомиле.
Променљива к на стек само складишти адресу
великог блока меморије на гомили.
Једна импликација овога је са величином оператера.
Ако тражите од величине носача низа, то ће вам дати величину великог блока меморије,
нешто као 40 бајтова,
али ако питате за величину показивача типа низа,
то ће вам дати величину променљиве самог к, који је на апарату је вероватно само 4 бајта.
Користећи показивач-низа типа, немогуће је директно питати за
величина великог блока меморије.
Ово није обично много ограничења, јер смо веома ретко желе величину
од великих блок меморије, и обично може да израчуна ако је то потребно.
>> Коначно, носач низ дешава да нам пружи пречице за иницијализацију низ.
Хајде да видимо како бисмо могли написати првих 10 целих бројева чак помоћу пречица инитилизатион.
Са показивач низа, не постоји начин да то урадите пречицу овако.
Ово је само увод у оно што можете да урадите са низовима.
Они показују се у скоро сваком програму пишете.
Надам се да сада можете видети бољи начин раде студентски ИДС пример
од почетка видео снимка.
>> Моје име је Роб Бовден, а ово је ЦС50.