ДАВИД Малан: Добро, добро нам дошли. Ово је ЦС50. Ово је почетак недеље седам. Дакле, то је доста времена, па сам мислио да ћемо узети вихор турнеју где смо стао и где смо сада идемо. Дакле, ово што се овде може имати изазвало неке Ангст на први поглед. Али, надамо се, поцињете да привикнете на шта ово означава овде - звезда представља показивач, који је само оно што, у смислу више лаике? Тако да је адреса. Тако да је адреса нешто у меморији. И ми смо почели да одлепите слојева Пре пар недеља, ствари као што су ГетСтринг и друге такве функције Све ово време су враћају адресе ствари у меморији, као адресу првог знака у неки редослед. Тако смо оспособили валгринд, који Ви ћете почети да користите за овај проблем сет, посебно за следећи Проблем подесити. И валгринд ли шта за нас? Она проверава мемори леакс, и то такође проверава за злоупотребу меморије. То може, уз извесну вероватноћу, открије да ли Ваш код ће сећање на додир да једноставно не треба. Дакле, не мора да цури, али ако превазилазе границе неких низ, а ви у ствари покренути валгринд и да подстакне понашање док валгринд ради у вашем програму је ради у њему, добићете поруке као што је овај - "неважећи писање величине 4 ", који, сећате неколико недеља је значило да сам случајно имао као на једну инт предалеко изван граница низа. И тако величине 4 значи овде величину од тог инт. Дакле, узмите уверавање у чињеници да валгринд је излаз, формат тога, је изнурујуће. Заиста је тешко видети кроз неред за занимљиве информације. Дакле, оно што смо овде урадили је само извод неке од неколико више занимљивих линија. Али схватите да 80% од валгринд је излаз ће бити мало дистракција. Само потражите обрасце попут ових - неважећи реду, погрешно прочитано, 40 бајтова и неки број блокова су дефинитивно изгубио, кључне речи као што то. А оно што ћете видети, надамо се неки врста трагом онога што функционише грешка је у ствари унутра У том случају овде, у шта линија мој број је очигледно грешка? 26 у датотеку под називом мемори.ц, што је Пример смо играли са тада. Тако да вероватно није у маллоц. Вероватно је био у мом коду уместо. Тако да ћемо видети поново и опет не задуго. Дакле сцанф, то појавило у Неколико форми до сада. Видели смо ссцанф кратко. То је било нешто више да рони у у вашој припреме за квиз. А шта је заправо сцанф ЦС50 Библиотека је била испод коришћењем хауба за неко време, како би да се унос од корисника. На пример, ако се помери за ЦС50 апарата овде, дозволите ми да отворим Пример је данас да се зове сцанф-0.ц И то је супер једноставна. То је само неколико линија кода. Али то показује колико заиста Затамњена је радио све ово време. У овом програму овде, у линији 16 , Обавештење да сам прогласи инт. Дакле, нема ништа магично показивачи, Управо тамо, инт. Онда је у реду 17, ја подстакне упутство за број, молим вас. Онда се, крајем 18., ја користим сцанф овде. И ја наведено, нешто као инт, да ја очекујем цитат Крај цитата процент и. Па посто И, наравно, означава инт. Али, обратите пажњу шта други Аргумент да је сцанф. Како бисте описали други Аргумент иза зареза? Шта је то? То је адреса к. Дакле, ово је корисно, јер се пружање сцанф са адресом к, шта да оснажи ту функцију да радим? Не само тамо, него и шта? Направите промену у њему. Зато можете да идем тамо, то је нека врста као мапа на локацији у меморији. И докле год обезбеди сцанф, или свака функција са таквом карте, те Функција може да иде тамо, а не само погледати на вредности, али такође може да промените ту вредност, што је корисно ако сврха у животу да је сцанф скенирање унос од корисника, посебно са тастатуре. И Ф означава форматиран, баш као принтф, Ф означава форматиран стринг који желите да одштампате. Дакле укратко, ова линија 18 једноставно каже, покушајте да прочитате цео број од корисника да тастатура и чувајте га унутра од к, у шта год да се деси адреса к живе у. И онда на крају, линија 19 само каже, хвала за инт, у овом случају. Па да иде напред и да то. Тако да сцанф 0. Дозволите ми да иде напред и зумирати Идем и покренути ово са тачкице сласх сцанф 0. Број, молим те? 50. Хвала на 50.. Дакле, то је прилично једноставно. Сада оно што се не ради? То не ради гомилу за проверавање грешака. На пример, ако не сарађују, и ја не упишете у низу, али Уместо да напишем нешто као "здраво" то је некако чудно. И тако једна од ствари ЦС50 Библиотека је радио за нас за неке Време је да репромптинг и репромптинг. Ретри фраза опозив у цс50.ц, и то је разлог што Затамњена у ЦС50 библиотека је заправо цео гомила линија дугих, јер смо провере за глупе ствари као што је овај. Да ли корисник не дају нам, у ствари, инт? Да ли је он или она нам даје нешто као абецедном писму? Ако је тако, желимо да се открију и да виче на њих. Али, ствари постају још интересантније у овом следећем примеру. Ако одем у сцанф-1.ц, што је један Оно што је суштински променило у ово следећи пример? Ја користим цхар *, наравно, уместо инт. Дакле, ово је интересантно, јер цхар *, сећам, је заправо само Иста ствар као стринг. Тако се чини да можда ово је супер једноставна имплементација ГетСтринг. Али сам огуљен назад озонски на ЦС50 библиотеке, тако да сам сада зове овај цхар *. Па да видимо где, ако било где, смо погријешили. Линија 17 - Ја опет кажем, молим вас дајте ми нешто, у овом случају, ниска. И онда у следећем реду, ја зовем сцанф, опет, дајући јој Код формата, али овај пут с одсто. И онда овај пут, ја сам дајући му бафер. Сада обратите пажњу, ја не користим амперсанд. Али зашто је то вероватно у реду овде? Јер оно што је бафер већ? Већ је показивач. Већ је адреса. И нека је та реч "збуни", нека ме само зову а, на пример, за једноставност. Али ја сам га звао, јер у бафер опште, у програмирању, ако имате комад меморије, што је стварно ниска само се, можда га зову тампон. То је место за складиштење информација. Слично ствари као што су ИоуТубе, када они баферовање, да тако кажем, да само значи да је преузимање бита из Интернет и њихово складиштење у локална низ, локални комад меморије тако да можете да га гледате касније без то прескакање или виси на Ви током репродукције. Дакле, постоји проблем овде ипак, зато ја кажем сцанф, очекују стринг од корисника. Ево адреса меморију. Стави ту серију тамо. Зашто је то граница дати нас проблем, иако? Шта је то? Да ли могу да приступе тај део меморије? Знате, ја не знам. Пошто је бафер је иницијализована на било шта? Не баш. И то је оно што зовем смеће вредности, који није формално реч. То само значи да немамо појма шта бита унутар су четири бајта која Одвојили сам као бафер. Нисам звао маллоц. Дефинитивно сам не зове ГетСтринг. Дакле, ко зна шта је заправо унутар тампон? А ипак говори сцанф слепо, иди тамо и стави шта год корисник откуца. Дакле, оно што је вероватно да ће изазвати у нашем коду ако га покренути? Вероватно сегфаулт. Можда не, али вероватно сегфаулт. А ја кажем можда, јер понекад не ти, понекад не добијете сегфаулт. Понекад једноставно посрећи, али ипак ће бити грешка у нашем програму. Дакле, дозволите ми да иде напред и то саставити. Ја ћу да урадим то стара школа начин. Дакле звека црта 0, сцанф-1, сцанф-1.ц, Ентер. Упс, сувише стара школа. Да видимо. Где сам? О, цхар * бафер. Ох, хвала вам - Саве, у реду - веома стара школа. Добро, то је било док. Дакле, управо сам сачували датотеку након што је привремено променити малопре. И сада сам га саставио ручно са јека. А сада ћу да наставим и покрените `сцанф '1, Ентер. Стринг молим. Ја ћу уписати "Здраво." А сада, ево где је, искрено, иф да је мало досадан. Неће ваљда да сегфаулт у овом случају. Принтф је мало посебан, јер то је тако супер обично користи да принтф суштини се ради нам услугу и реализације, то није валидан показивач. Дозволите ми да преузме на себе само да одштампате у загради нулл, чак иако то није нужно оно што ми сами очекивали. Тако да стварно не могу лако изазвати сегфаулт са овим, али јасно је да то није понашање сам желео. Дакле, оно што је једноставно решење? Па, у сцанф-2, дозволите ми да предложи Уместо да само додељивања цхар *, дозволите ми да будем мало паметнији ово, и дозволите ми да издвоји бафер као низ од 16 карактера. Тако да можете да урадите на неколико начина. Ја апсолутно могу користити маллоц. Али да се вратим на недељу две када Само ми је требало гомилу карактера. То је само низ. Па да, уместо редефинисати бафер да се низ од 16 карактера. И сада, када сам прошао у бафер - и то је нешто што ми нисмо говорити о у недељу две - али можете третирати као низ иако је адреса. Технички, као што смо видели, они су мало другачије. Али сцанф неће сметати ако га прође име низа, јер оно Цланг ће учинити за нас је суштински третирају име тог низа као адресу комад 16 бајтова. Дакле, то је боље. То значи да сада могу да се надам урадите следеће. Дозволите ми да умањите за тренутак и праве `сцанф '2, приредила реду. Сада да ли има косу црту сцанф-2. Стринг молим. "Здраво." И чинило се да овај пут. Али, неко може да предложи сценарио у којој се не може даље радити? Да? Нешто дуже од 16 знакова. А у ствари, можемо бити мало прецизнији. Нешто више од 15 карактера, јер стварно треба имати на уму да нам је потребно да обрнуту косу црту нула имплицитно на крају стринга, који је поред сцанф обично брине о нама. Па пусти ме да радим нешто слично - понекад ми само можемо остави га тако. У реду, тако да смо сада индукован сегментација наша кривица. Зашто? Зато што сам откуцао у више од 15 карактера, и тако смо заправо дотакао сећање да сам у ствари не би требало да има. Дакле, оно што је заиста решење овде? Па, шта ако нам је потребан дужи низ? Па, можда би се 32 бајта. Па, шта ако то није довољно? Како око 64 бајта? Шта ако то није довољно? Како око 128 или 200 бајтова? Оно што је заиста решење овде у општем случају, ако не знамо у унапред шта ће корисник за куцање? То је само нека врста велики бол у дупе, да будем искрен, због чега ЦС50 библиотека има неколико десетина редова код које заједно спроводе ГетСтринг стринг на начин који ми не радимо морају да знају унапред шта Корисник ће да куцате. Посебно, ако се осврнете на цс50.ц од пре две недеље, видећете да ГетСтринг заправо ради Не користите сцанф на овај начин. Уместо тога, он чита један карактер у исто време. Јер једна лепа ствар у вези читање једног знака је можемо гарантује се да увек има најмање један знак. Ја само могу да изјављујем знак, а затим да ови заиста малим корацима да само чита један карактер у на Време са тастатуре. И онда, шта ћете видети ГетСтринг да ли је сваки пут када понестане, кажу, 16 бајта меморије, користи маллоц, или његов рођак, да додијели више меморије, копирање стари меморија у нови, а затим пузећи заједно, све један по један карактер време, а када се испостави да је од комад меморије, то баца, хвата већи комад меморије, копира старе у нове, и понавља. И то је заиста бол да се заиста спроведе нешто тако једноставно као добијање информација од корисника. Дакле, можете да користите сцанф. Можете да користите друге сличне функције. И много уџбеника и на мрежи примери раде, али су сви осетљива на проблеме као што је овај. И на крају, узимајући сегфаулт је некако досадно. То није добро за корисника. Али, у најгорем случају, шта то фундаментално стави свој кода у опасности? Нека врста напада, потенцијално. Разговарали смо о једном таквом нападу - преливања штос. Али у целини, ако вам је дозвољено да преливања бафера, као што смо урадили Пре пар недеља, са само писање више од "здраво" на стек, ви заиста може да преузме, потенцијално, рачунар, или барем добити у податке који не припада теби. Дакле укратко, то је разлог зашто смо те обуке фелне. Али сада, почињемо да их скинем, као наши програми више не треба, обавезно, унос од корисника. Али, у случају проблема сет шест, Ваш унос ће доћи из огроман речник фајл са неким 150 ак хиљаду речи. Тако нећете морати да бринете о произвољно уноса корисника. Ми ћемо вам дати неке претпоставке о том фајлу. Сва питања о показивачи или сцанф или корисник уноси уопште? У реду, па онда брзо поглед на један пратећи тему од пре две недеље. И то је тај појам струцт. Није да - овај појам ну, што је било шта? Шта струцт уради за нас? Дефине - жао? Дефинишите променљиву врсту. Тако некако. Ми у ствари комбинујући две теме. Дакле, са типедеф, подсетити да можемо прогласи неку врсту наше, као синоним, као и за низ цхар *. Али, користите и типедеф струцт, можемо створе заиста сопствене структуре података. На пример, ако се вратимо у гедит овде само за тренутак, а ја идем напред и уради тако нешто, пусти ме спаси ово као, рецимо, струцтс.ц привремено, ја ћу да иде напред и укључују стандардио.х, тап_п празнина. И онда овде, претпоставимо да желим да напишете програм који чува више студената из више куће, на пример. Дакле, то је као регистрариал База неке врсте. Дакле, ако ми треба име једног ученика, ја Можда нешто као цхар * име, и ја ћу учинити нешто као - у ствари, хајде да користите библиотеку ЦС50 само за тренутак да би ово мало једноставније, тако да можемо да позајмимо оне десетине линија кода. И нека је само нека буде једноставно. Ми ћемо наставити да га ниска, и сада ГетСтринг. Тако да ја сада тврдим да сам чувају име неког студента, и дом неки ученик, једноставно користите променљиве као што смо урадили и у једној недељи. Али, претпоставимо да ја сада желим да подржи више студената. У реду, тако да су моји инстинкти су да раде стринг Наме2, добија ГетСтринг, Стринг хоусе2 добија ГетСтринг. А онда наш трећи ученик, Хајде да урадимо НАМЕ3 ГетСтринг. У реду, тако да је ово надам упечатљива ви као глупо, јер овај процес заиста никада иде до краја, и само ће се изгледа да мој код горе и горе и горе. Али, ми смо решили ово превише у две недеље. Оно што је био наш релативно чисто решење када смо имали више променљиве Исти тип података који су сви повезани, али нисмо желели да овај страшан неред од наведених варијабли слично? Шта смо уместо тога? Тако да мислим да сам чуо неколико места. Имали смо низ. Ако желите више инстанци нешто, зашто не чисти све ово горе и само да кажем, дајте ми звао низ имена? А за сада, тешко 3 Цоде. А онда ми још низ зове куће, и нека ме за сада тешко код 3. И ја сам очистио масовно неред који сам створио. Сада, ја сам и даље фиксирана 3, али чак и 3 може доћи из динамички корисник, или аргв, или као. Дакле, ово је већ чистији. Али оно што је досадно о томе је да Сада, иако је име некако фундаментално повезани са студент кућа - то је студент који заиста Желим да представља - Сада имам два потеза које су паралелне у смислу да су они исте величине и имена конзола 0 вјероватно мапе до кућа конзоле 0, и имена носач 1 мапе до куће носач 1. Другим речима, да живи у студентски та кућа, и то други ученик живи у тој другој кући. Али, сигурно то може бити уради још више чисто. Па, то може, у ствари. И дозволите ми да иде напред и отвори струцтс.х горе, а ви ћете погледајте овде ову идеју. Обратите пажњу да сам користио типедеф, као и ти алудирао на тренутак пре објаснимо своје сопствени тип података. Али ја такође користим ову другу кључну реч зове струцт који ми даје нови структура података. И то структура података тврдим иде да имају две ствари унутар то - се зове стринг име, и стринг зове кућа. И име ја ћу да дам Ова структура података ће да се зове студент. Могао бих то назвао ништа што желим, али то чине семантички смисла за мене у мом уму. Па сад, ако ја отворим бољу верзију програма сам почела да пишем тамо, да дођите до врха. А ту је и још неке линије кода овде, али дозволите ми да се фокусирају на на један тренутак. Ја сам изјавио константну такозване ученике фиксирана и 3 за сада. Али сада, приметите како чист мој број почиње да се. У 22. реду, ја изјављујем низ ученика. И приметите да је ученик очигледно Сада тип података. Јер на врху ове датотеке, приметити Ја сам укључен тај хеадер фајл да сам се извукао пре само тренутак. И то заглавље датотеке једноставно имао Ова дефиниција студента. Па сад, ја сам створио своје сопствене прилагођене податке типа да су аутори Ц година пре не мисле унапред. Али, нема проблема. Ја могу то направити сам. Дакле, ово је низ зове студената, сваки чији чланови је студент структура. И желим три таква у низу. И сад, шта је остатак овог програма уради? Требало ми је нешто мало произвољно. Дакле, од 24 па надаље на мрежи, Ја итерате од 0 до 3. Ја онда питати корисника за студентска име. И онда ја користим ГетСтринг као и пре. Онда тражим кућу студента, и ја користим ГетСтринг као и пре. Обратите пажњу - нешто ново део синтаксе - Не могу још увек да се индекс и-тог студента, али како могу добити на специфичне податке поља унутар структуре попунити? Па, шта је очигледно Нови део синтаксе? То је само тачка оператера. Не смо заиста видели раније. Видели сте га у пет псет ако сте кренуо је већ са битмап датотеке. Али само значи тачка унутар ове струцт или више поља, дају тачку име, или ми дот кућу. То значи да уђемо у струцт и да те поједине области. Шта остатак овог програма раде? Није све то секси. Обратите пажњу да сам итерацију од 0 до 3 поново, и ја једноставно створити енглески фраза као што је то и то и на такав таква кућа, пролази у дот име из и-ти ученик и њихове кућа, као добро. И онда на крају, сада ћемо почети да се анални о томе, сада када смо упознати са оним што маллоц и друге функције су радио све ово време. Зашто морам да се ослободим и име и кућа, иако сам није позвао маллоц? ГетСтринг урадио. И то је прљава мала тајна за неколико недеља, али је ГетСтринг је цурење меморије у целом Ставите све семестар до сада. И коначно ће валгранд открије ово нама. Али, то није велика ствар, јер ја знам да ја једноставно можете бесплатно име и кућа, иако технички, да бити супер, супер сигуран, ја би требало да буде радиш неке грешке проверу овде. Који су ваши инстинкти ти? Шта треба да се провере пре него што сам ослободио оно што је стринг, ака који цхар *? Стварно би требало да провере да ли ученици заграда и тачка име не једнак нулл. Онда ће бити у реду да само напред и без да показивач, а исте или друге као један. Ако ученици носач сам тачка кућа није једнак нулл, ово сада ће заштитити против угла предмету у коме ГетСтринг враћа нешто нулл. И ми смо видели малопре, иф ће заштитити нас овде тако само каже нулл, који ће да изгледа чудно. Али бар неће сегфаулт, као што смо видели. Па, пусти ме да радим овде још једну ствар. Структуре-0 је врста глупог програма зато сам унесете све ове податке, а затим Изгубио је када се програм заврши. Али, дозволите ми да иде напред и урадите то. Дозволите ми да терминала прозор мало већи. Дозволите ми да Структуре-1, који је нова верзија ове. Ја ћу повећати мало. А сада допустите да радим тачку Структуре сласх-1. Име ученика - Дејвид Матхер, хајде да Роб Киркланд, Хајде да урадимо Лаурен Леверетт. Оно што је интересантно сада је обавештење - а ја само знам јер Написао сам програм - постоји фајл сада на мој тренутни директоријум зове студентс.цсв. Неки од вас су можда видели ово у стварном свету. Шта је ЦСВ датотека? Вредности раздвојене зарезима. То је нешто као сиромашан човек је верзија Екцел фајл. То сто редова и колона које можете да отворите у програму као што је Екцел, или бројеви на Мац. И ако ја отворим овај фајл овде на гедит, Обавештење - и бројеви нису ту. То само говори гедит ја бројеви редова. Обавештење на првој линији ово датотека је Дејвид и Матхер. Следећа линија је Роб зарез Киркланд. И трећа линија је Лорен запета Леверет. Па шта сам ја створио? Сада сам написао Ц програм ефикасно може генерисати табела који се може отворити у Програм као Екцел. Није све то убедљив сет података, али ако имате много веће комаде подаци које заиста желе да манипулишу и да графиконе и свиђа, ово је можда једна начин да се створи те податке. Штавише, ЦСВс заправо супер заједнички само за складиштење података једноставних - Иахоо Финанце, на пример, ако се акција на берзи преко њиховог такозваног АПИ, бесплатан сервис који вам омогућава да добити текуће до-до датума-залиха квоте за предузећа, они дају податке назад у супер једноставан ЦСВ формату. Дакле, како смо то урадили? Па приметити, већина овај програм је скоро исти. Али приметио овде, а не штампање студенти оут, на линији 35 па надаље, ја тврдим да ја штедим студенти на диск, тако да сачувате датотеку. Дакле, приметио сам проглашења филе * - Сада, ово је нека врста аномалије у Ц. Из било ког разлога, филе је све капе, што није као и већина других типова података у Ц. Али, то је уграђен тип података, ФИЛЕ *. И ја изјављујући показивач на датотеку, је како можете да мислите о томе. фопен значи отворену датотеку. Које датотеке желите да отворите? Желим да отворите датотеку која ћу произвољно позив студентс.цсв. Могу да зовем шта год пожелим. А онда се погодити. Шта други аргумент фопен вероватно да значи? Право, в за отписа, могао бити р за читање. Има за Приложена ако желите да додате редове, а не препише целу ствар. Али ја само желим да направите ову датотеку једном, па ћу искористити цитат Ункуоте ж. И знам да само од тога да читају документација, односно мушкарац страница. Ако фајл није нулл - другим речима, ако ништа пошло наопако - дозволите ми прелазили преко студенти од 0 до 3. Запазите сада нешто икада тако нешто другачије око 41 линија овде. То није инт. То је за датотеку иф принтф. Дакле, то ће писати да поднесе. Које фајл? Онај чији показивач ви одредите као први аргумент. Онда смо навели низ формата. Затим одредите шта стринг желимо да укључите први одсто с, и онда још променљива или а други одсто. Онда затворите датотеку са фцлосе. Онда сам ослободио меморију као и раније, мада Требало би да се вратим у и додају неке провере за нулл. И то је то. фопен, иф, фцлосе ми даје Могућност креирања текстуалне датотеке. Сада ћете видети у проблем сету пет, који укључује слике, коју ћемо користити бинарне датотеке уместо. Али у основи, идеја је иста, иако су функције ћете види се мало другачије. Дакле вихор турнеје, али ћете добити све превише упознат са датотеком И/О-- улаз и излаз - са пет псет. И било каква питања о почетне основе овде? Да? Шта ако покушате да ослободи без вредности? Верујем да, уколико је стечен бесплатно мало више разумљив, можете да потенцијално сегфаулт. Доношење нулл то је лоше, јер не Верујем смета слободно да проверите за вас, јер потенцијално би се отпад времена за то да се уради за сви у свету. Добро питање, мада. У реду, тако да ова врста постаје да занимљива тема. Тема скупа проблема пет је форензика. Барем је то део од проблема сета. Форензичари се генерално односи на опоравак од информација које могу или не може бити избрисан намерно. И тако сам мислио да ти брз укус онога што се стварно дешава на свим овог пута испод хауба вашег рачунара. На пример, ако сте унутра имате вашег ваш лаптоп или десктоп рачунар хард диск, то је или механички уређај који заправо врти - постоје ствари које се зову кружне плоче који изгледају баш као што сам Управо је на екрану овде, мада ово је све стара школа. То је три-и-по-инчни хард диск. И три и по инча односи на са те ствари када га инсталирате у рачунару. Многи од вас у свој лаптоп сада има ССД диск или ССД-ова, који немају покретних делова. Они су више као РАМ-а мање као ови механички уређаји. Али, идеје су увек исти, сигурно када се односе до пет сет проблема. А ако мислите о сада хард диск представља као круг, који Ја ћу извући овако овде. Када креирате датотеку на рачунару, да ли је ССД, или у овом случају, старији школа хард диск, фајл који се састоји од више бита. Рецимо да је то 0 и 1, гомила 0с и 1с. Дакле, ово је мој цео хард диск. Ово је очигледно прилично велики фајл. И то се користи до 0 и 1с на то део физичког тањиру. Па, шта је то физички део? Па, испоставило се да на хард диску, бар овог типа, ту је ови ситним магнетне честице. И они су у суштини и север па соутх стубови њима, да ако окренути један од оних магнетних честица На овај начин, може се рећи да је то представља 1. И ако је наопако на југ северу, могло би се рећи да је то представља 0. Дакле, у стварном физичком свету, то је како си могао да представља нешто у бинарни стање 0 и 1. Дакле, то је све фајл. Постоји читава гомила магнетних честице које су им на овај начин или На овај начин, стварајући обрасце од 1с и 0с. Али, испоставило се да када сте сачували датотеку, неке информације се чувају одвојено. Дакле, ово је мало сто, директоријум, да тако кажем. И ја ћу ово зовем име колоне, а Зваћу ову локацију колоне. И ја ћу да кажем, претпоставимо ово је моја биографија. Мој ресуме.доц се чува на локација, рецимо 123. Увек идем за тај број. Али, довољно је рећи да је баш као и у РАМ-у, можете узети хард диск То је гигабите или 200 гигабајта или терабајта, а можете број свих бајтова. Можете да број свих комаде 8 бита. Дакле, ми ћемо рећи да је ово је 123 локација. Дакле, овај директоријум унутар мог пословања Систем се сећа да је мој резиме је на 123 месту. Али постаје интересантно када избришете датотеку. Тако на пример - и на срећу, већина света има ухваћен на то - шта се дешава када превлачења датотеке на вашем Мац ОС Трасх или је Виндовс Рецицле Бин? Која је сврха тога? Очигледно је да се отараси датотеке, али шта чин превлачењем падају у ваш отпад или ваше Рецицле Бин радите на рачунару? Апсолутно ништа, заиста. То је баш као фолдер. То је посебан фолдер, да будемо сигурни. Али да ли то заиста обрисати фајл? Па, не, јер су неки од вас вероватно био бих, дођавола, ниси Мислим да се то уради. Дакле, два пута кликните Смеће или Рецицле Бин. Ви сте око упери и си се опоравила фајл тек превлачењем одатле. Па јасно, то није нужно брисање. Ок, ти си паметнији од тога. Ви знате да само га то води у Смеће или отпатке не значи ви пражњења отпада. Дакле одете до менија, а ви кажете Испразни отпад или Испразни корпу за отпатке. Шта се онда дешава? Да, тако да се брише више. Али, све што се дешава је то. Рачунар заборавља где ресуме.доц је. Али, оно што се није променило је очигледно на слици? У бита, 0 и 1с да тврдим су на лицу неког физичког аспекта хардвер. Они су још увек тамо. То је само рачунар има заборавили шта су. Дакле, то је у суштини ослобођен датотеке бита, тако да се могу поново користити. Али не док не направите више датотека, и више фајлова, а више датотека ће пробабилистички, оне 1с и 0с, те магнетне честице, се поново користити, наопако или десна страна горе, на друге датотеке, 0 и 1с. Дакле, имате овај прозор времена. А то није ни предвидљиво дужина, стварно. То зависи од величине чврстог диск и колико фајлова имате и колико брзо можете направити нове. Али, ту је тај прозор времена током што да фајл је и даље савршено надокнадив. Дакле, ако сте икада користите програме као што су МцАфее Нортон или да покуша да се опорави података, сви они раде покушава да опоравак ове такозване именика на схвати где је ваша датотека. А понекад и Нортон ће рећи, фајл је 93% надокнадив. Па, шта то значи? То само значи да је неко други фајл случајно завршио користећи, рецимо, ови тонови из на оригинал. Дакле, шта је заправо укључен у опоравак података? Па, ако немате нешто Нортон унапред инсталиран на рачунару, најбоље што можете да урадите је понекад погледати на цео хард диск у потрази за обрасци бита. А једна од тема скупа проблема пет је да ћете претрагу еквивалент хард диска, форензички слика Цомпацт Фласх картице од дигитални фотоапарат, тражећи 0с 1с и то обично, са високим вероватноћа, представљају почетак ЈПЕГ слике. И ви можете да се опорави од те слике претпостављајући, ако видим овај образац бита на слици, са форензичким велика вероватноћа, да означава почетак ЈПЕГ. И ако видим опет исти образац, који вероватно означава почетак други ЈПЕГ, а други ЈПЕГ, ЈПЕГ и други. А ово је типично како спасавање података ће радити. Шта је лепо у вези ЈПЕГ је иако формат сам по себи нешто комплекс, почетак сваког таквог фајл је заправо прилично препознатљив и једноставна, као што ћете видети, ако не већ смо. Па хајде да погледамо ближе испод аспиратор као тачно оно што је било дешава, а шта је то 1с и 0с су, да вам мало више од контекст за овај посебан изазов. [ВИДЕО РЕПРОДУКЦИЈА] -Где је ваш рачунар складишти највише њених сталних података. Да бисте то урадили, путује подаци из РАМ заједно са софтвером сигнале који говоре хард диск како да сачувате те податке. Чврсти диск кола преводити ти сигнали у напону флуктуације. Ово, заузврат, контролише хард диск је покретних делова, неки од неколико покретни делови остали у савремени рачунар. Неки од сигнала контролише мотор која се врти металном кошуљицом плоче. Ваши подаци се чувају у ствари на овим плочама. Остали сигнали крећу читање / писање главе за читање или податке на плочама. Ова машина тако прецизно да људски коса није могао ни да прође између главе и предење плоча. Ипак, све то сјајно ради на брзинама. [ЕНД ВИДЕО РЕПРОДУКЦИЈА] ДАВИД Малан: Зумирање мало дубље сада на оно што је заправо на тим плочама. [ВИДЕО РЕПРОДУКЦИЈА] -Хајде да погледамо шта смо Видела успорено. Када кратак импулс струје послат на читање / писање глави, ако окреће на малом електромагнетних за делић секунде. Магнет ствара поље, које мења поларитет мали, мали дел од металних честица које сваки слој платтер површину. Образац низ тих сићушних, оптужен-уп подручја на диску представља један мало података у бинарни број система који користе рачунари. Сада, ако је струја се шаље у једном правцу преко читања / уписивања, област је поларизована у једном смеру. Ако струја се шаље у супротном смеру, поларизација је обрнута. Како сте добили податке са хард диска? Само обрнут процес. Дакле, то су честице на диску да се струја у читање / писање глава креће. Ставите заједно милионе ових намагнетисане сегментима, а имате датотеку. Сада, комада један фајл може бити разбацани диска плоче, несто као неред радова на вашем столу. Дакле, специјални додатни фајл бележи где је све. Зар не желиш да имаш тако нешто? [ЕНД ВИДЕО РЕПРОДУКЦИЈА] Малан ДАВИД: У реду, вероватно не. Па колико вас момци Одрастао сам са овим? У реду, тако да је све мање и мање Руке сваке године. Али драго ми је да си бар упознати са њима, јер је то и наш демо књига, нажалост, умиру веома спору смрт овде блискости. Али, то је оно што сам, барем, још средње школе, користи користи за прављење резервних копија. И то је било невероватно, јер сте могао да сачувате 1,4 мегабајта на овај диск. И то је верзија високе густине, као што је приказано на ХД, који има што значи пре ХД данашњих видео. Стандардни густина је 800 килобајта. А пре тога, било је 400-килобајт дискова. А пре тога, било је 5 и 1/4 инча, који су заиста флоппи, и мало шири и виши од ових ствари овде. Али, ви у ствари можете видети такозвани флоппи аспект ових дискова. И функционално, они заправо прилично сличан хард дискова на барем овај тип. Опет, ССД-ови у новијим рачунарима функционишу мало другачије. Али ако померите тај мали метални језичак, можете заправо видети мало колачић, или тањира. То није метал као што је ова. Ово је у ствари неки јефтинији пластични материјал. И можете да га некако мрдање. А ти си само Искрено обрисати неке број битова или магнетних честица из овог диска. Дакле срећу, нема ништа на њему. Ако је ствар на путу - и покривају очи и они из свог комшију - можете некако повуците ово Цео плашт пукла. Али, ту је мало пролеће, па се свесни да је својим очима. Дакле, сада имате заиста дискету. И оно што је изузетно о овоме је да у колико је то малих репрезентација већи хард диск, ове ствари су супер, супер једноставно. Ако уштините дно томе, сада када да метал ствар је искључен, и пилинг их отворили, све је ту је два комада осећао и тзв дискете са комадом метала са унутрашње стране. Ту долази половина мог диска садржај. Оде још пола њих. Али, то је све што је предење унутар рачунара у прошла. И опет, да стави ово у перспективи, колики је већина ваших хард дискове ових дана? 500 гигабајта, терабајта, можда у десктоп рачунар, 2 терабајта, 3 терабајта, 4 терабајта, зар не? Ово је један мегабајт, узми или остави, који не може да стане ни типичан МП3 висе не ових дана, као и неке сличан музички фајл. Дакле, мало сувенир за вас данас, и такође да помогне у контекст шта ћемо бити узимајући здраво за готово сада у проблему сет пет. Дакле, то су твоје задржати. Дакле, дозволите ми да транзиција у којој ће бити трошење следећи псет као добро. Дакле, сада смо поставили за ову страницу - ох, неколико саопштења брзо. Овог петка, ако желите да се придружите ЦС50 за ручак, идите на уобичајеном месту, цс50.нет/рсвп. И коначно пројекат - па по градиву, ми смо послали Завршни пројекат спецификација већ. Схватите да то не значи то је због нарочито ускоро. Је постављен је, заиста, само да би се ви размишљате о томе. И заиста, супер значајан проценат од вас ће се решавању завршних пројеката на материјал који смо нису ни стигли до у класи, али ће се већ следеће недеље. Запазите, међутим, да спецификације позива за неколико различитих компоненти Завршни рад. Прво, за неколико недеља, је унапред предлог, прилично повремени маил на Ваша ТФ да му кажем, или шта сте размишљања о вашем пројекту, са без обавеза. Предлог ће бити ваш посебно посвећеност, говорећи, овде, то је оно што Волео бих да радим за мој пројекат. Шта ти мислиш? Превелика? Премали? Да ли је руковање? И видите спецификацију за више детаља. Неколико недеља након што је статус Извештај, који је сличан повремене емаил на вашем ТФ да кажем колико далеко сте у свој коначни имплементацију пројекта, затим ЦС50 Хацкатхон којој свако је позвао, која ће бити догађај од 8:00 једне вечери до 7:00 АМ следећег јутра. Пица, као што сам поменуо да у недељу нула, Вил се служи у 9:00 часова, Кинеска храна у 1:00 АМ. А ако си још увек будна у 5:00 ПМ, Водимо вас на ихоп за доручак. Дакле Хацкатхон је један од више незаборавне искуства у класи. Тада је због имплементације, и онда климатску ЦС50 сајам. Више детаља о свим овим у недељама које долазе. Али да се вратимо на нешто Олд Сцхоол - опет, низ. Дакле, низ је било лепо, јер се решава Проблеми као што смо видели само Малочас са студентским структурама постаје мало ван контроле ако се желе да имају један ученик, студент, две Студент три, ученик дот дот дот, неки произвољан број студената. Дакле низова, пре неколико недеља, извршила препад на и решава све наше проблеме не од знајући унапред колико ствари неке врсте ми можда желели. И видели смо да нам помогне Структуре даље организовати наш код и држати концептуално сличних варијабли, као што су Име и кућа, заједно, тако да смо може третирати их као једну целину, унутар којих има мање комаде. Али низови имају неке недостатке. Који су неки од недостатака Наишли смо са низовима до сада? Шта је то? Фиксна величина - па иако можда бити у могућности да издвоји за меморију низ, када знате колико студената имате, колико карактера имате од стране корисника, када сте додељени низ, ви сте некако фарба себе у ћошак. Зато што не можете да уметнете нове елементе у средини низа. Не можете да уметнете више елемената на крају низа. Стварно, морате да прибегавају стварању Цео нови низ, као што смо разговарали, копирање старог у ново. И опет, то је главобоља која ГетСтринг бави за вас. Али, опет, не могу ни да убаците нешто у средини низа Ако стопа није у потпуности испуњен. На пример, ако је овај низ овде од величине Само шест има пет ствари у њему, Па, могао би само Тацк нешто на крају. Али шта ако желите да убаците нешто у средини низ, иако је то можда пет од шест ствари у њему? Па, шта смо радили када смо имали све наших људских волонтера на бини у недеља прошлост? Ако бисмо хтели да ставе некога овде, било ови људи како да преместите ову начин, или ти људи како да се креће ово начин, а то је скупо. Померања људи унутар Низ завршио сабирањем и трошкова нам време, па многи наши н на квадрат ради убацивања пута као врсте, за пример, у најгорем случају. Дакле, низови су велики, али морате да зна унапред колико желите. Па добро, ево решења. Ако ја не знам унапред колико студенти Можда имам, а једном сам знам Ја одлучујем, мада, ја сам заглављен са тим велики број студената, зашто не бих увек издвајају дупло више простора као што сам могао да ми треба? Зар то није разумно решење? Реално, ја не мислим да смо Требаће више од 50 слота у низу за средње величине класе, па хајде да се заокружи. Ја ћу направити 100 слота у мом низу, само тако да дефинитивно може добити број студената очекујем да бити у некој средње величине класе. Па зашто не само заокружују и доделити више меморије, обично, за низ него што мислите да ће вам бити потребно? Шта је ово једноставно Пусхбацк на ту идеју? Ви само губимо памћење. Буквално сваки програм онда написала можда се користи дупло више меморије и вам заиста треба. И то баш не изгледа као нарочито елегантно решење. Осим тога, то је само смањује вероватноћа проблема. Ако вам се деси да имате популарну ток један семестар и имате 101 студената, програм је још увек фундаментално суочава се са истим питањем. Дакле срећу, постоји решење за Овај оглас сви наши проблеми, у виду структуре података које су сложенији од оних Видели смо до сада. Овај, ја тврдим, је повезана листа. Ово је списак бројева - 9, 17, 22, 26, и 34 - који су повезани путем онога што сам нацртао као стрелице. Другим речима, ако желим да представља низ, што сам могао нешто овако. И ја ћу то ставити на графоскоп за који тренутак. Сам могао да урадим - Добро, у реду. Станд би. Нови рачунар овде, јасно - У реду. Дакле, ако сам те бројеве у низу - 9, 17, 22, 26, 24 - Није нужно да скала. У реду, па овде је мој ред - ох ми год. У реду, па ево мој низ. О мој Боже. [Смех] ДАВИД Малан: претварам. То је превише напора да се вратим и то поправити, тако да - 26. Дакле, имамо овај низ 9, 17, 22, 26, и 34.. За оне од вас може да види Непријатно сам направио грешку, то је то. Дакле, ја тврдим да је то веома ефикасно решење. Ја сам издвојила онолико интс као Треба - један, два, три, четири, пет, или шест - а ја сам онда чувају бројеве унутар овог низа. Али претпостављам, онда, ја желим да убаците вредност као што је број 8? Па, где то иде? Рецимо да желите да убаците број 20 као. Па, где то иде? Негде у средини, или број 35 мора да иде негде на крају. Али, ја сам све више простора. И то је основни изазов низова то су решење. Тврдио сам малопре, ГетСтринг решава овај проблем. Ако желите да унесете број шесту у овом низу, што је најмање један решење можете ослонити на сигурно, баш као и ми са ГетСтринг? Шта је то? Па, да га је већи лакше рећи него учинити. Не можемо нужно направити низ већи, али шта да радимо? Направите нови низ, који је већи од величине 6, или можда величина 10, ако желимо да се испред ствари, а затим копирате стари у нови низ, а затим ослободи старог низ. Али, шта је време извршавања Сада тог процеса? То је велика О од н, јер копирање ће те коштати неке јединице времена, тако да није толико идеално, ако морамо да доделити нови низ, који ће да троши дупло више меморија привремено. Копирање старо у ново - Мислим, то је само главобоља, која је, опет, зашто смо написали ГетСтринг за вас. Дакле, оно што бисмо могли учинити уместо тога? Па, шта ако је наша структура података заправо има рупе у њему? Претпоставимо да се опустите свој циљ да суседне комади меморије, где 9 је одмах до 17, што је одмах до 22, и тако даље. А претпостављам да може да буде 9 овде у РАМ-а, а 17 се овде преко у РАМ, и 22 могу се овде преко у РАМ. Другим речима, не треба их чак и враћа се назад више. Морам само да некако уденути конац у иглу кроз сваки од ових бројева, или сваки ових чворова, као што ћемо назвати правоугаоници као што сам их извући, до се како да дођете до последње такав чвор из првог. Дакле, шта је програмирање изгради Видели смо недавно са којима сам може да спроведе тај нит, или нацртао овде, са којима могу спровођење тих стрелице? Дакле показивачи, зар не? Ако не издвајају само инт, али чвор - и по чвор, само мислим контејнер. И визуелно, мислим правоугаоник. Дакле, очигледно је потребно чвор да садржи две вредности - сама инт, а затим је и чињеница доња половина правоугаоника, довољно простора за инт. Дакле, само напред размишљам овде, колика је ово чвор, ово контејнер у питању? Колико бајтова за инт? Вероватно 4, ако је то исто као и обично. А онда колико бајтова за показивача? 4.. Дакле, контејнер, или ово чвор, је ће бити 8-бајтова структура. Ох, и то је срећна случајност да Управо смо увели овај појам струцт, или Ц структура. Зато тврдим да ја желим да се корак ка ово софистициранији имплементација листе бројева, повезана листа бројева, морам да урадим мало више размишљања унапред и прогласи не само цео број, већ Структ да ћу звати, конвенционално овде, чвор. Могли бисмо то назвати шта год хоћемо, али чвор ће бити тематски у много од ствари почнемо гледа сада. Унутар тог чвора је инт н. И онда то синтакса, мало чудно на први поглед - струцт ноде * следећи. Па сликовито, шта је то? То је доња половина правоугаоник који смо видели Пре само тренутак. Али зашто то говорим струцт ноде * за разлику од само чвор *? Јер ако је показивач указује на други чвор, то је само адреса чвора. То је у складу са оним што смо разговарали о показивача до сада. Али зашто, ако ја тврдим је ова структура зове чвор, морам да кажем струцт чвор унутра? Тачно. То је нека врста глупе реалности Ц. Типедеф, да тако кажемо, још није догодило. Ц је супер буквално. Она чита ваш код врха до доња, лева на десно. И док не погоди тај зарез на крајњој линији, погодите шта не постоји као тип података? Ноде, цитат завршити цитат чвор. Али због опсирнији Декларација сам на првој линији - типедеф струцт чвор - зато што је први, пре витичасте заграде, то је нешто као претходно образовање Цланг то, знате шта, дај ми струцт зове струцт чвор. Искрено, не волим називајући ствари струцт чвор, чвор струцт све током мог кода. Али ја ћу га користити само једном, само унутра, тако да ја могу ефикасно створи неку врсту кружне референце, не показивач за себе по себи, већ показивач на другу идентичан тип. Тако испада да је структура података Овако, постоји неколико операције које могу бити од интереса за нас. Можда желите да уметнете у листу као што је овај. Можда желите да избришете из листе као што је овај. Можда желите да претражите листу за вредности, или уопште, Траверсе. И померајте је само фенси начин рекавши старт на лево и померите све пут десно. И запазите, чак и са ово мало више софистицирана структура података, да ја предлажем да можемо да позајмимо мало идеје у последње две недеље и имплементира функцију која се зове тражи овако. То ће вратити тачно или лажна, указује, да или не, Н је на листи. Њен други аргумент је показивач на самој листи, па показивач на чвор. Све ћу да урадите је прогласити привремена променљива. Ми ћемо га звати птр По конвенцији, за показивач. И ја га доделити једнака почетак листе. Запазите сада петљу вхиле. Све док показивач није једнак нулл, идем да проверим. Да ли је показивач стрелица н једнак н који је усвојен? И сачекајте минут - нови комад синтаксе. Шта је стрела одједном? Да? Тачно. Дакле, док је пре неколико минута, користили смо дот нотација за приступ нешто унутар једне структуре попунити, уколико променљива нисте је Структ сама, али показивач на структуру, Срећом, део синтаксе да коначно има интуитивни осећај. Стрелица означава да прати показивач, попут наше стреле обично значе сликовито, и идите на Поље података изнутра. Дакле, стрелица је иста ствар као тачка, али користите га када имате показивач. Дакле, само да резимирам онда, ако н поље унутар структуре попунити назива показивач једнако једнако н, ретурн. Иначе, ова линија овде - показивач једнако показивач следећи. Дакле, шта се то ради, обавештење, ако је Ја тренутно указујући на струцт који садржи 9, а 9 није број Тражим - Претпостављам да гледам за н једнак 50 - Идем да ажурирате свој привремени показивач да не укаже на овом чвору више, али показивач стрелицу поред, који ће ме ставити овде. Сада, схватио је вихор увод. У среду, ми заправо ћемо урадити са неким људима и са још неким Код спорије. Али схватите, ми сада правимо наше податке структуре сложенији, тако да наши алгоритми могу добити ефикаснији, који ће бити услов за псет шест, када се учита у, опет, они 150.000 речи, али је потребно да то учини ефикасно, и идеално, створити програм који ради за наши корисници нису у линеарно, не у Н на квадрат, али у константа време, у идеалу. Видимо се у среду. СПИКЕР: На следећем ЦС50, Давид заборавља свој основни случај. ДАВИД Малан: И тако сте послали текстуалне поруке са Ц. Шта - [Разним текстуалним ПОРУКА ОБАВЕШТЕЊЕ СОУНДС]