[Powered by Google Translate] [Недеља 4] [Давид Ј. Малан] [Универзитет Харвард] [Ово је ЦС50.] [ЦС50.ТВ] Добро, ово је ЦС50, и то је почетак седмице 4, и ово је један од најспоријих могућих сортирање алгоритама. Која је то што смо управо гледали тамо? То је балон врста, како би велики О (н ^ 2) + сума, и заиста ми нисмо једини у овом свету изгледа да зна шта мехур врста, или његов пут узастопно. Заиста, ово је био разговор са Ериц Сцхмидт на Гоогле и бивши сенатор Барак Обама пре само неколико година. Сада, сенаторе, овде си на Гоогле-у, и ја волим да мислим председништва као интервју за посао. Сада, тешко је добити посао као председника, а ти идеш кроз интензивну сада. Такође је тешко добити посао у Гоогле. Имамо питања и тражимо наше кандидате питања, и ово је један од Ларри Швимер. Ви мислите да се шалим? То је овде. Који је најефикаснији начин да сортирате милион 32-битне целе бројеве? [Смех] Добро Жао ми је >> Не, не, не, не.. Мислим да је балон врста би био погрешан пут. Хајде, ко му је рекао ово? Прошле недеље смо се сећам паузу од кода, бар на један дан, и почео фокусирајући се на неким вишим идејама и решавање проблема генерално у контексту претраживања и сортирања, а увели смо нешто што нисмо шамар ово име на претходну недељу, али Асимптотска нотација, Биг О, Биг Омега, и понекад Велики Тета нотација, а то су једноставно начини од описује време рада алгоритама, колико времена је потребно за алгоритма за покретање. И можда се сећате да сте говорили о трајању у смислу величине инпута, коју углавном називамо н, шта год да је проблем може бити, где је н број људи у соби, број страна у телефонском именику, а ми смо почели да пишу ствари као О (н ^ 2) или О (н) или О (н лог н) па чак и када је математика није баш ишло тако савршено и то је био н ² - н / 2 или нешто слично уместо тога би само баци неки од нижих реда условима, а мотивација је да ми заиста желимо врста објективан начин процене перформансе програма или перформансе алгоритама да на крају дана нема никакве везе, на пример, брзином рачунара данас. На пример, ако спроведе сортирање балон, или спроведе обједините сортирања или избор врсте на рачунару данашњем 2 ГХз рачунар, а ви га покренете, и то траје одређени број секунди, следеће године има 3 ГХз или 4 ГХз рачунар, а можда онда тврдите да је "Вау, мој алгоритам је сада дупло брже ", када у стварности то очигледно није случај. То је само хардвер је стечен брже, али рачунар није, па смо заиста желе да баце такве ствари Умношци од 2 или 3 мултипликатора када је у питању описивање колико брзо или споро како алгоритам је и стварно се фокусирамо од н или неки фактор истог, нека сила томе као у случају сорти из прошле недеље. И сећам да је уз помоћ стапања врсте ми смо били у стању да уради много боље од балон врсте и селекције сортирање па чак и постављање врста. Морамо до н лог н, а опет, Подсећамо да лог н генерално односи на нешто што расте спорије затим н, односно н лог н до сада је била добра јер је мање од н ². Али да постигне н лог н са стапања врстом шта је основна клица идеје које смо морали да искористе да смо и искористио назад у недељи 0? Како смо се позабаве проблемом сортирање паметно са стапања врсте? Шта је био кључни увид, можда? Свако уопште. Ок, хајде да се вратимо корак. Опишите врсту стапања у својим речима. Како то функционише? Ок, ми ћемо ред назад недеље 0. Ок, да. [Нечујан-студент] Ок, добро, тако да смо поделили низ бројева на 2 комада. Ми сортирана сваки од тих комада, а онда смо их спојили, и ми смо видели ову идеју пре узимања проблем који је ово велика и сецкање га у проблем да је ово велика или ово велико. Подсетимо пример телефонског именика. Подсетимо се само-бројања алгоритам из недеље пре, па споји некако је сажето у овом Псеудокод овде. Када сте дали н елемената, прво је то био разум провери. Ако је н <2 онда не ради ништа уопште јер ако н <2 онда је н очигледно 0 или 1, па ако је то било то 0 или 1 нема ништа да сортирате. Завршили сте. Ваша листа је већ тривијално сортирају. Али иначе ако имаш 2 или више елемената напред и поделите их на 2 половине, лево и десно. Сортирајте сваки од тих пола, а затим се стапа сортиране половине. Али проблем је у томе што на први поглед ово изгледа као да смо Пунтинг. Ово је кружна дефиниција да ако сам вас замолио да сортирате ове н елемената а ви ми кажете "У реду, у реду, ми ћемо сортирати те н / 2 и оне н / 2 елемената" онда моје следеће питање ће бити "Добро, како сте сортирали н / 2 елемената?" Али због структуре овог програма, јер је то основни случај, да тако кажем, овај посебан случај који каже ако је н одмах <неку фиксну вредност као 2 повратка. Не реагује са истом кружном одговор. Овај процес, то ће на крају завршити цицлицити. Ако сам вас "Сортирај ови елементи н", а ти кажеш: "Добро, сортирати ове Н / 2" онда кажете, "Добро, нека то н / 4, н / 8, н/16" на крају ћете поделити по великом броју довољно да ћете имати само 1 лево елемент, након чега можете да кажете, "Ево, овде је поредани један елемент." Онда сјај овог алгоритма овде је извести из чињенице да када имате све ове појединачно разврстаних листама, сви који су величине 1, који изгледа бескорисно, када почнете да их спајање и спајање их правите коначно као Роб учинио у видео коначно сортиране листе. Али ова идеја протеже далеко изван сортирање. Постоји та идеја уграђена у овај програм познат као рекурзије, Идеја којом сте програм и да реши неки проблем себе назвали, или стави у контекст програмских језика које су функције, и да би се решио проблем, функција се позива опет и опет и опет, али функција Не могу себе називаш бесконачно много пута. Коначно имате на дно напоље, да тако кажем, и имају неке тешко стање кодирану базу која каже У овом тренутку заустави називајући себе, тако да се цео процес коначно се у ствари престати. Шта то заправо значи, да рецурсе? Да видимо, да ли можемо да урадимо једноставан, тривијалан пример са, рецимо, 3 особе са мном овде на бини, ако неко је удобан. 1, хајде уп, 2 и 3. Ако 3 желе да дођу овде. Ако желите да стоје поред мене овде у реду, претпостављам да је проблем у руци веома тривијално избројати људи који су овде. Али искрено, ја сам уморан од свих ових бројања примера. Ово ће потрајати, 1, 2, и тачка, тачка, тачка. То ће трајати заувек. Радије бих само пунта овај проблем у потпуности уз помоћ-како се зовеш? Сара. >> Сара, у реду. Кели. >> Кели и? Вили >> Вили, Сара, Кели и Вили.. Сада сам поставио питање од стране некога колико људи су се на овој сцени, а ја немам појма. Ово је заиста дугачак списак, па уместо тога ћу да урадим овај трик. Ја ћу да питам особу поред мене да уради највећи део посла, а када она врши ради највећи део посла Ја ћу да урадим најмању могућу количину рада и само додати 1 на било њен одговор је, па идемо. Био сам питао колико је људи на сцени. Колико људи на сцени лево од вас? Лево од мене >> Добро,? Али не варају. То је добро, то је тачно, али ако желимо да наставимо ову логику претпоставимо да желите да на сличан пунта овај проблем лево од вас, па уместо одговора директно иду напред и само пребацују. Ох, како су многи људи са леве стране од мене? Колико људи са леве стране? 1. [Смех] Ок, па 0, па шта сад Вили учинио је си се вратио твој одговор у овом правцу каже 0. Сада, шта би требало да урадите >> 1. Ок, ти си 1, па кажете: "У реду, ја ћу да додам 1 шта год Вилли је бројање било ", па 1 + 0. Сада сте 1 тако да ваш одговор на десној страни је сада 1. >> И моја би 2. Добро, па узимаш претходни одговор 1, додајући минималну количину рада коју желите да урадите, што је +1. Ви сада имате 2, и онда предајте ми који вредност? 3, мислим, извини, 2. Добро. Па, имали смо 0 лево. Онда смо имали 1, а онда додамо 2, и сад си ми предаје број 2, па ја кажем, ок, +1, 3. Заиста Има 3 људи стајали поред мене на овој сцени, тако да смо могли да очигледно то урадили веома линеарно, веома у моди очигледне, али шта ми стварно радимо? Узели смо у почетку проблем величине 3. Затим смо га покварио на проблем величине 2, онда проблем величине 1, а затим коначно основни случај био заиста, ох, нема никог, на којој тачки Вили вратио ефикасно тешко кодирани одговор пар пута, а други је тада бубблед горе, бубблед горе, бубблед горе, а затим додавањем у овом једном додатном 1 Добили смо ову реализује основну идеју рекурзије. Сада, у овом случају то није стварно реши проблем било ефикасније онда смо видели до сада. Али размислите о алгоритмима смо урадили на сцени до сада. Ми смо имали 8 комада папира на табли, на видео када је Шон био у потрази за број 7, и шта је он заправо урадио? Па, он није урадио никакву завади па владај. Он није урадио никакву рекурзије. Уместо да само то урадио линеарну алгоритам. Али када смо увели идеју разврстаних бројева на позорници живети прошле недеље онда смо имали ту инстинкт иде у средини, на којој тачки смо имали мањи списак величине 4 или неки други списак величине 4, и онда смо имали исти проблем, па смо поновили, понавља, понавља. Другим речима, ми рецурсед. Хвала вам пуно на нашим волонтерима 3 овде за демонстрацију рекурзија са нама. Хајде да видимо, ако не можемо да то сада мало више бетона, решавању проблема који смо поново могли да ураде врло лако, али ћемо га користити као одскочну даску за спровођење овог основну идеју. Ако желим да израчуна сума од гомиле бројева, На пример, ако прође у броју 3, Желим да вам дам вредност СИГМА 3, тако да збир 3 + 2 + 1 + 0. Желим да се вратим на одговор 6, па ћемо имплементирати ову функцију Сигма, ово сума функције то, опет, води у улаз, а онда се враћа сума од тог броја свега скроз доле до 0. Могли би ово прилично једноставно, зар не? Могли бисмо то урадили са неком врстом петље структуре, па ћу ићи напред и да је то почело. Укључи стдио.х. Дозволите ми да се уђе у главни за рад са овде. Хајде да сачувате ово као сигма.ц. Онда ћу да идем овде, а ја ћу да прогласе инт н, и ја ћу да урадим следеће док корисник не сарађује. Док корисник није дао позитиван број пусти ме напред и подстиче их за н = ГетИнт, и пусти ме да им дам неке инструкције о томе шта треба да уради, па принтф ("Позитиван цео молимо"). Само нешто релативно једноставно овако, тако да када смо погодио линију 14 сада имамо позитиван цео број вероватно у н. Сада хајде да урадимо нешто са њим. Пусти ме напред и израчуна сума, тако инт збир = сигма (н). Сигма је само сума, тако да сам ја то писао у одгајивач начин. Само ћемо назвати ту сигма. То је сума, а сада ћу да одштампате резултат, принтф ("Збир је% д \ н", збир). А онда ћу вратити 0 за добру меру. Урадили смо све да овај програм захтева, осим занимљивог дела, а то је у ствари спроводи СИГМА функцију. Пусти ме да идем доле на дну, и дозволите ми да прогласи функцију сигма. Има да се променљиве која је типа цео број, и шта тип података желим да претпоставља се врати из Сигма? Инт, јер желим да моја очекивања одговара на линији 15. Овде пусти ме напред и остваре ово на прилично једноставан начин. Идемо напред и рећи инт сума = 0, а сада ћу морати да одем мало за петљу овде што ће рећи овако нешто, фор (инт и = 0; И <= број; и + +) сума + = и. А онда ћу вратити суму. Могао сам да спроводи ово у било ком броју различитих начина. Могао сам користио док петљу. Могао сам прескочио користите збир променљиве ако сам заиста желео да, али укратко, имамо само функцију да ако нисам глупан проглашава је збир 0. Онда понавља од 0 на горе кроз броју, и на свакој итерацији додаје да тренутни вредност збира а онда се враћа суму. Сада, овде је мало оптимизације. Ово је вероватно изгубљено корак, али тако да буде. То је у реду за сада. Ми смо барем што темељно и иде 0 скроз горе. Није тешко и прилично једноставан, али се испоставило да је са Сигма функцијом имамо исту прилику као што смо овде радили на сцени. На сцени смо управо избројао колико је људи било поред мене, али уместо тога, ако смо хтели да пребројите број 3 + 2 + 1 на доле до 0 смо могли слично пунта у функцији да сам уместо тога ћу описати као рекурзивно. Ево хајде да брзо разум проверите и уверите се да нисам глупан. Знам да постоји најмање једна ствар у овом програму да сам урадио праву. Када сам ударио ући ћу добити било какву виче на мене? Шта ћу ја да се драо на око? Да, заборавио сам прототип, па сам користећи функцију која се зове сигма на линији 15, али то није објављено све до линије 22, тако да сам најбољи проактивно идем овде и прогласи прототип, а ја ћу рећи инт Сигма (инт број), и то је то. Је реализован је на дну. Или још један начин на који сам могао да реши ово Могао преместите функцију тамо, што није лоше, али барем када су ваши програми почети да се дуго, искрено, Мислим да постоји нека вредност у увек има главни на врх тако да код читаоца може да отвори датотеку, а затим одмах видети шта програм ради без да тражи кроз њега у потрази за ту основну функцију. Идемо доле на мој прозор терминала овде, покушајте да направите сигма сигма, и ја сам зајебао овде. Имплицитна декларација функције ГетИнт значи да сам заборавио да урадим оно друго? [Нечујан-студент] Добро, тако је очигледно уобичајена грешка, па хајде да ставимо ово овде горе, цс50.х, а сада да се вратимо на мој прозор терминала. Ја ћу брисање екрана, а ја ћу направити репризу сигма. Изгледа да смо саставили. Дозволите ми да се сада води сигма. Ја ћу унети број 3, а ја нисам добио 6, тако да није ригорозна провера, али барем изгледа да раде на први поглед, али хајде да то рип апарт, и идемо заправо искористе идеју рекурзије, опет, на врло једноставан контексту, тако да у време неколико недеља када почнемо истраживање одгајивач структуре података од низова имамо још један алат у алата са којима се манипулисање тим структурама података, као што ћемо видети. Ово је итеративни приступ, петља заснован приступ. Дозволите ми да, уместо сада урадили. Дозволите ми да кажем да уместо збир броја доле до 0 је стварно иста ствар као број + сигма (број - 1). Другим речима, баш као на позорници сам пунтед свакој од људи поред мене, а они за узврат држали Пунтинг док смо коначно дотакла дно у Вили, који је морао да врати тешко кодирану одговор као 0. Ево сад смо се слично Пунтинг да Сигма исту функцију као што је првобитно назван, али овде је кључ увид је да ми не зове сигма идентично. Нећемо пролази у н. Ми јасно пролазите у броју - 1, тако нешто мањи проблем, нешто мањи проблем. Нажалост, ово није баш решење још увек, и пре него што смо поправити Шта може да се скаче се као очигледно на неки од вас пусти ме напред и реприза направити. Изгледа да се састави у реду. Дозволите ми да реприза сигма са 6. Упс, дозволите ми реприза сигма са 6. Видели смо то и раније, мада случајно последњи пут као добро. Зашто сам добио ову грешку шифровану сегментирања? Да. [Нечујан-студент] Нема основа случај, и још конкретније, шта се вероватно догодило? То је симптом онога понашање? Реци мало гласније. [Нечујан-студент] То је бесконачна петља ефикасно, а проблем са бесконачним петље када укључују рекурзија у овом случају, функција се зове, оно што се дешава сваки пут када позовете функцију? Па, мислим да вратите како смо изложио меморију рачунара. Ми смо рекли да постоји тај комад меморије назива стек који је на дну, и сваки пут када позовете функцију мало више меморије добија пут на овом такозваном стеку садржи локалне тој функцији је варијабле или параметре, па ако сигма позива Сигма Сигма позиве зове сигма  позива сигма одакле овој причи крај? Па, ускоро премашује укупан износ меморије коју имате на располагању рачунару. Ти превазишао сегмент који сте требали да остану у, и добили овај сегментирања грешку, језгро бачена, и шта значи језгро бачена је да сада имам фајл који се зове језгро који је фајл који садржи нуле и јединице да заправо ће у будућности бити дијагностички корисно. Ако није јасно да вам где је ваша грешка је ви у ствари можете да урадите мало форензичке анализе, да тако кажем, на овом фајлу језгра депоније, која је, опет, само гомила нула и јединица који у суштини представља стање вашег програма у меморији тренутак се срушио на овај начин. Решење је у томе што ми не можемо само слепо врати сигма, број + сигма на нешто мањем проблему. Морамо да овде имамо неку врсту основног случаја, и шта би требало да основни случај вероватно бити? [Нечујан-студент] Ок, док је број позитиван заправо треба да се врати ово, или другим речима, ако је број, рецимо, <= 0 да знате шта, ја ћу ићи напред и врати 0, слично као Вили урадио, а друго, ја ћу да наставим и врати ово, па није то много краће од итеративне верзије које смо шлагом, прво се користи за петље, али приметите да постоји ова врста елеганције до њега. Уместо да се врати неки број и обављање сав овај математику и додаје ствари са локалним варијаблама Ви уместо да кажете "ОК, ако је ово супер лако проблем као број <0, дозволите ми да одмах врати 0 ". Нећемо смета подржавају негативне бројеве, па ћу на хард код вредност 0. Али иначе, да спроведе ову идеју сабирања свих ових бројева заједно можете ефикасно узети мали залогај из проблема, слично као ми овде радили на сцени, онда пунта остатак проблема на следећу особу, али у овом случају следећа особа себе је. То је идентично имену функција. Само да прође мањи и мањи и мањи проблем сваки пут, и иако имамо овде није сасвим формализована ствари у коду то је управо оно што се дешава у недељу 0 са телефонском именику. То је управо оно што се дешава у последњих неколико недеља са Сеан и са нашим демонстрацијама потрази за бројеве. То је узимање проблем и дели га поново и поново. Другим речима, постоји начин да се сада превођења ово стваран свет конструкт, овај виши ниво конструкт од завади па владај, а нешто опет и опет у коду, тако да је ово нешто што ће поново видети током времена. Сада, као и на страну, ако сте нови у рекурзије треба барем сад схватам зашто је ово смешно. Ја идем на гоогле.цом, и ја ћу тражити неке савете и трикове о рекурзије, ентер. Реците особу поред вас, ако они нису смејали сада. Да ли сте мислили рекурзија? Да ли сте мислили-ах, тамо идемо. Ок, то је сада остало све. Мало Ускршње јаје уграђен негде тамо у Гоогле. Као на страну, један од линкова смо ставили на сајту наравно а за данас је управо то мрежа различитих сортирање алгоритама, неке од њих смо гледали прошле недеље, али оно што је лепо о овом визуализације као што покушате да заврши свој ум око разних ствари везаних за алгоритама Знам да можете врло лако сада почети са различитим типовима инпута. Улази све преокренути су инпути углавном поредани су инпути случајна и тако даље. Као што покушате да, поново, направити разлику између ових ствари у вашем уму схвате да је то УРЛ на сајту наравно је на предавања страници Можда вам разлог кроз неке од њих. Данас смо коначно добили да реше овај проблем из времена уназад, која је била да ова функција свап једноставно не ради, и шта је основни проблем са овим функцијом свап, циљ који је, опет, да се размењују вредности овде и овде тако да се то догоди? То није заправо раде. Зашто? Да. [Нечујан-студент] Тачно, објашњење за ову буггинесс једноставно је зато што када позовете функцију у Ц и те функције преузме аргументе, као и б овде, ви пролазите у копијама год вредност коју пружа на ту функцију. Ви не пружају изворним вриједностима себе, па смо видели у контексту буггиц, бугги3.ц, који изгледао мало овако нешто. Подсетимо се да смо имали кии иницијализује на 1 и 2, респективно. Затим штампа смо се шта су били. Тада сам тврдио да сам их замене позивајући замену за к, и. Али проблем је био да замене радио, али само у оквиру замене себе функционисати. Чим смо ударили линију 40 оних заменили вредности су бачене, па ништа у оригиналној функцији главни заправо променило, па ако размишљам онда о томе шта ово личи, у смислу нашег памћења ако је ово са леве стране одбора представља- а ја ћу се потрудити да сви виде ово-ако је ово са леве стране управног одбора представља, рецимо, своју меморију, а стек ће да расте на горе овај начин, и зовемо функцију као главни, а главни има 2 локалних променљивих, Кс и И, хајдемо описују их као к овде, па да опише то што и овде, и да ставимо у вредности 1 и 2, тако да је ово овде је главни, а када је главни назива своп функција оперативни систем даје замени функције, свој откос меморије на стек, свој кадар на стек, да тако кажем. Он такође издваја 32 бита за ове Интс. То се дешава да их назовем и б, али то је потпуно произвољна. Могао је да их зове шта год хоће, али шта се дешава када је главни позиви своп је то потребно ове 1, ставља копију тамо, ставља ту копију. Постоји још 1 локална променљива у свап, међутим, позвао шта >> Тмп. Тмп, па ћу себи дати још 32 бита овде, и шта сам урадио у овој функцији? Рекао сам инт тмп добија, тако да има 1, па сам то урадио када смо последњи пут играли са овим примером. Тада добија б, па је б 2, па сад ово постаје 2, и сада б добија температуру, тако да температура је 1, па сад б постаје ово. То је одлично. Успело је. Али онда, чим функција враћа своп је меморија ефективно нестаје, тако да се може поново користити од стране неке друге функције у будућности, и главни је очигледно потпуно непромењен. Потребан нам је начин фундаментално решавање овог проблема, а данас смо коначно ћемо имати начин да то урадите при можемо увести нешто што се зове показивач. Испоставило се да можемо решити овај проблем не пролази у копијама кии већ доношењем у шта, мислиш да свап функцију? Да, шта је са адресом? Нисмо баш причали о адресама у много детаља, али ако табла представља меморију мог рачунара свакако могли почети нумерисање на бајтове у мом РАМ и кажу да је ово бајт # 1, ово је бајт # 2, # 3 бајта, бајт # 4, бајт # ... 2 милијарде ако имам 2 гигабајта РАМ-а, тако да смо сигурно могли доћи до неког уског нумерације шеме за све појединачне бајта у меморији мог рачунара. Шта ако уместо када зовем своп него пролаз у копијама кии зашто не бих уместо проћи у обраћању к овде, адресу и овде, у суштини поштанска адреса од кии јер онда мењате, ако је он обавестио на адресу у меморији кии, затим свап, ако смо га тренирао мало, Он потенцијално могао да вози за ту адресу, да тако кажем, к, и промените број тамо, а затим вози на адресу и, промените ту број, чак и док не заправо добијају копије тих Самог вредности, па иако смо причали о томе као ГЛАВНИ меморија а ове као Свап меморија моћна и опасна део Ц је да свака функција тоуцх меморије било где у рачунару, и то је моћан у коју можете да урадите веома фенси ствари са компјутерским програмима у Ц. Ово је опасно, јер можете забрљати врло лако. У ствари, један од најчешћих начина за програме ових дана да буде експлоатисан ипак је за програмер не схватају да он или она дозвољавајући података да буде написан на локацији у меморији која није била намењена. На пример, он или она изјављује низ величине 10 али онда случајно покушава да стави 11 бајтова у том низу меморије, и почнете додиривања делова меморије која се више не важи. Само да контекстуални ово, неки од вас можда знају да софтвер често ће вас упитати за серијским бројевима или регистарских кључева, Пхотосхоп и Ворд и програми као што је овај. Постоји пукотина, као што неки од вас знају, на мрежи, где можете да покренете мали програм, и воила, нема више захтева за серијским бројем. Како се то ради? У многим случајевима ове ствари су једноставно проналажење у рачунарима текстуални сегменти у стварним рачунара нуле и јединице где је та функција у којој се тражи серијски број, и заменити тај простор, или док програм ради можете схватити где кључ заправо чувају помоћу нечега што се зове дебуггер, а можете црацк софтвера на тај начин. То не значи да је то наш циљ за наредних неколико дана, али је веома стварном свету последице. Тај се дешава да се укључе крађу софтвера, али такође постоји компромис читавих машина. У ствари, када сајтови ових дана су експлоатисане и угрожен и подаци процурели и лозинке су украдене ово веома често односи на лоше управљање нечијег сећања, или, у случају базе података, неуспех да се предвиди контрадикторно улаз, тако да више о томе у недељама које долазе, али за сада само увид у врсте штете које можете да урадите што није баш разумевање како ствари раде испод хаубе. Идемо о разумевању зашто је сломљен са алатом који ће постати све више и више користан као наши програми се сложенија. До сада, када сте имали грешку у свом програму како сте отишли ​​о његовом дебуггинг? Који су ваши технике су до сада, без обзира да ли учио од свог ТФ или само самоуки? [Студентски] принтф. Принтф, па принтф је вероватно био ваш пријатељ у да ако желите да видите шта се дешава унутар вашег програма само стави иф овде, иф овде, иф овде. Онда га покренете, и добићете гомилу ствари на екрану које можете да користите да бисте онда закључити шта се заправо дешава у реду у вашем програму. Принтф има тенденцију да буде веома моћна ствар, али то је врло ручни процес. Морате да ставите иф овде, иф овде, и ако га ставите унутар петље можете добити 100 линија оутпута који онда треба да прегледати. То није врло разумљив или интерактивни механизам за отклањање грешака програма, али срећом постоји алтернатива. Ту је програм, на пример, зове ГДБ, ГНУ Дебуггер, што је мало тајанствени у томе како да га користите. То је мало сложенији, али искрено, ово је једна од оних ствари где ако сте ставили у овој недељи и следећи екстра сат да разумеју нешто ГДБ то ће вам уштедети вероватно десетине сати на дуге стазе, па са тим, дозволите ми да вам дам један теасер како ово функционише. Ја сам у свом терминалу. Дозволите ми да иде напред и саставити овај програм, бугги3. То је већ до сада. Дозволите ми да га воде, као што смо урадили док леђа, и заиста, она је покварена. Али, зашто је ово? Можда сам се зезнуо свап функцију. Можда је и б. Нисам баш их креће исправно. Пусти ме само напред и урадите то. Уместо само трчите бугги3 пусти ме, уместо покренули ову ГДБ програма, и ја ћу га рећи да покренете бугги3, и ја ћу да се укључи аргумент командне линије,-ТУИ, и ми ћемо ставити то у будуће проблеме у спец да подсети. И сада ова црна и бела интерфејс појавио да, опет, је мало неодољив на први јер је све ово Информације о гаранцији овде доле, али барем нешто познато. У врху прозора је мој стварни број, и ако сам помицати овде пусти ме дођите до самог врха мом досијеу, и заиста, ту је бугги3.ц, а обавештење на дну овог прозора Имам тај гдб промпт. Ово није исто као мој нормалан Џон Харвард линији. Ово је брз то ће ми дозволити да контролишу ГДБ. ГДБ је дебагер. Дебуггер је програм који вам омогућава да прођем кроз извршење свог програма линију по линију по линију, Успут ради ништа желите да програм, чак позивају функције, или гледа, што је још важније, на вредностима разне варијабле. Идемо напред и урадите то. Идем да иде напред и откуцајте рок у ГДБ је брза, па приметити у доњем левом углу екрана сам откуцао покрећу, и ја сам ударио ентер, и шта је то урадио? То је буквално побегао мој програм, али нисам заправо видели колико иде овде јер ја нисам заправо рекао дебагер за паузу у одређеном тренутку. Само куцање серију покреће програм. Ја заправо не видим ништа. Ја не могу да манипулишу. Уместо тога пусти ме да радим ово. На овом ГДБ линији дозволите ми уместо откуцате паузу, ентер. То није оно што сам мислио да куцате. Идемо уместо упишите пауза главни. Другим речима, желим да подесите нешто што се зове преломна тачка, који је пригодно назван јер ће сломити или пауза извршење свог програма у том месту. Главни је име мог функције. Приметимо да ГДБ је прилично паметно. То схватио да је главни дешава отприлике почне на линији 18 од бугги3.ц, а онда примети овде у горњем левом углу б + је тик уз линију 18. То ме подсећа да сам поставио тачку прекида на линији 18. Овај пут, када куцам вожњу, ја ћу да водим програм до погоди ту тачку прекида, тако Програм ће паузирати за мене на линији 18. Идемо, трчи. Ништа изгледа да се деси, али обавештење на дну лево почиње програм бугги3, преломна тачка 1 у главни у бугги3.ц линији 18. Шта сад да радим? Приметила сам да почнете да куцате ствари попут штампе, Не принтф, принт к, а сада то је чудно. $ 1 је само радозналост, као што ћемо видети сваки пут када одштампате нешто добијете нову $ вредност. То је тако да можете да погледате назад на претходне вредности само у случају, али за сада шта штампа ми говори да вредност к у овом тренутку у причи је очигледно 134514032. Шта? Одакле да чак долазе? [Нечујан-студент] Заиста, то је оно што ћемо назвати вредност за смеће, а нисмо прицали о томе још, али разлог да покрене променљиве је очигледно да они имају неку вредност коју желите да имате. Али цака је подсетити да можете да декларишете променљиве као што сам урадио пре тренутак у мом примеру сигма без заправо дајући им вредност. Подсетимо шта сам урадио овде у Сигма. И прогласио н, али шта вредносни сам то дао? Нема, јер сам знао да ће у наредних неколико редова ГетИнт ће бринути о проблему стављања вредност унутар н. Али у овом тренутку у причи линије 11 и линија 12 и линија 13 и линија 14 током тих неколико линија која је вредност н? У Ц једноставно не знам. То генерално је неки смеће вредност, а неки потпуно случајан број који је преостао у суштини из неке претходне функције пошто је покренете, како ваш програм ради Подсећамо да функција добија функцију, функција, функцију. Сви ови рамови се стави на меморији, а затим те функције повратак, и баш као што сам предложио у гумицу њихова меморија поново користи на крају. Па, то је тако једноставно дешава да овај варијабилни к у овом програму Изгледа да садржи неку вредност као смеће 134514032 из неког претходног функције, а не онај који сам написао. То може бити нешто што долази ефикасно са оперативним системом, неке функције испод хаубе. Ок, то је у реду, али хајде да се сада прешли на следећи ред. Ако укуцамо "нект" у мојој ГДБ линији и ударио ентер, Приметићете да истицање потезе до линије 19, али логично импликација је да је линија 18 сада завршио извршавање, па ако опет откуцате "принт к" Сада треба да видите 1, и заиста, ја радим. Опет, $ ствари је начин ГДБ вас подсети шта историја отисака су да сте урадили. Сада пусти ме напред и штампају год, и заиста, и је неки луди вредност као добро, али ништа страшно, јер у складу 19 смо о томе да га доделите вредност 2, па ћу откуцати "нект" поново. И сада смо на принтф линији. Пусти ме да урадим принт к. Пусти ме да урадим принт год. Искрено, ја добијам мало уморан од штампања овога. Дозволите ми да уместо откуцајте "дисплаи Кс" и "И" дисплеј и сад сваки пут куцам команду у будућности Ја ћу бити подсетио шта је к и и, шта је к и и, шта је к и и. Могу, такође, као по страни, типа "Инфо локалаца". Инфо је посебна команда. Мештани значи да ми показује локалне променљиве. Само у случају да заборави или да је ово лудо, компликована функција да сам ја или неко други написао инфо мештани ће вам рећи шта су све локалне променљиве унутар ове локалне функције да би стало ако желите да око џаку. Сада, иф треба да изврши, па ћу ићи напред и само укуцајте "нект". Зато смо у овој средини нисмо заправо видимо извршава овде доле, али приметите да постаје мало унакаженог овде. Али приметите да је ту најважнији екран, тако да није савршен програм овде, али то је у реду, јер ја увек могу да џаку око помоћу отиска ако хоћу. Дозволите ми да се следеће откуца поново, а сада ево занимљив део. У овом тренутку у причи је и 2, и к је 1, како је предложио овде, и опет, Разлог је то аутоматски приказује сада јер сам користио команду дисплеј к и и екран, па чим сам упишите следећи у теорији кии би требало да постане замењен. Сада већ знамо да то неће бити случај, али ћемо видети у једном тренутку како можемо заронити дубље да схватим зашто је то истина. Даље, и нажалост, још увек је и 2 и к је увек 1, а ја могу да потврдим колико. Штампа к, принт год. Заиста, нема замене се заправо догодило, па кренимо овоме. Јасно своп је сломљен. Идемо уместо укуцавате "Рун". Дозволите ми да кажем да, желим да га поново из почетка, ентер. Сада сам назад на линији 18. Сада приметите к и и поново смеће вредности. Даље, следећи, следећи, следећи. Ако добијем досадно ја могу само да упишете н за следећи. Можете га скратили на најкраћи могући низа знакова. Замени је сада сломљен. Хајде да зароните у, тако да уместо да куцате следећи, Сада ћу да откуцате корак, тако да сам у одскочна ове функције тако да ја могу да прођем кроз њега, тако да сам ударио корак и онда ентер. Обратите пажњу да су наглашавајући скаче доле ниже у мом програму за линију 36. Сада шта су локалне променљиве? Инфо мештани. Ништа још увек зато што се нисам стигао до те линије, па идемо напред и рећи "нект". Сада ми се чини да имамо тмп, ТМП штампања. Смеће вредност, зар не? Мислим да је тако. Како би одштампали, штампање б, 1 и 2? У једном тренутку, чим сам упишите следећи поново тмп ће да преузме вредност 1, надамо се, јер тмп ће бити додељена вредност. Сада хајде да штампате, принт б, али сада штампају тмп, и то је заиста је 1. Дозволите ми да радимо. Дозволите ми да радимо. Завршио сам свап функцију. Ја сам још увек унутар њега у линији 40, па ћу штампање, принт б, и ја не брига шта тмп је. Изгледа своп је тачно када је у питању замене А и Б. Али ако сада упишете следећи, вратио скочи на линији 25, и наравно, ако сам тип у к и и штампе они су још увек непромењен, тако да не решите проблем. Али дијагностички сада, можда са овим програмом ГДБ смо бар ми стечен један корак ближе разумевању шта се дешава у реду, без легла наш код стављањем принтф овде, принтф овде, иф овде и затим га поново покренути и поново Покушавам да схватим шта се дешава у реду. Идем да иде напред и отказ од овога заједно са отказ. То ће онда рећи: "Куит уопште?" Да. Сада сам се вратио на моје нормалне линији, а ја сам урадио користећи ГДБ. Као на страну, не морате да користите ову-туи заставу. У ствари, ако га изоставите сте у суштини добили доњу половину екрана. Ако сам затим упишите пауза главни и покрените Још увек могу да водим програм, али шта ће учинити више текстуално Само ми покаже тренутну једне линије у једном тренутку. Тхе-туи, текстуални кориснички интерфејс, само ти показује више програма одједном, што је вероватно мало концепцијски лакше. Али заиста, могу само да се уради, нект, нект, и ја идем да видим једну линију у једном тренутку, и ако заиста желим да видим шта се дешава Ја могу да откуцате листу и видим гомилу суседних линија. Постоји видео снимак који смо се питали да ли гледају на проблем поставља 3 у којој Нејт покрива неке од замршеност ГДБ, и ово је једна од оних ствари, искрено, где су неки не-тривијалан проценат од вас никада неће додирнути ГДБ, а то ће бити лоша ствар јер буквално ћете завршити трошење више времена касније овог семестра јури низ грешака онда би, ако се стави у тој пола сата / сат ове недеље и поред учења да се удобно са ГДБ. Принтф је био твој пријатељ. ГДБ би сада требало да буде ваш пријатељ. Сва питања о ГДБ? И овде је кратка листа неких од најмоћнијих и корисне команде. Да. >> Ли можете да одштампате стринг? Да ли можете да одштампате стринг? Апсолутно. То не мора да буде само бројеви. Ако променљива с је ниска само укуцајте у штампи с. То ће вам показати шта је то ниска променљива. [Нечујан-студент] То ће вам дати адресу и саму стринг. То ће вам показати како. И још једна ствар, само зато што су добри да превише знају. Бацктраце и рам, дозволите ми да зароне у овај последњи пут, Исто тачан програм са ГДБ. Пусти ме само напред и покрените текстуални верзију корисничког интерфејса, бреак главни. Дозволите ми да иде напред и поново покрените. Овде сам. Сада ме пустите следећи, следећи, следећи, следећи, следећи, корак, унесите. А сада претпоставимо Сада сам у свап намерно, али ја сам као "Проклетство, шта је вредност од к?" Ја не могу да урадим к више. Ја не могу да урадим год јер ниси у обиму. Они нису у контекст, али нема проблема. Ја могу да упишете Бацктраце. То ми показује све функције које су извршене до овог тренутка. Обратите пажњу да је један на дну, главни, линије са Главни био на дну нашег слике овде. Чињеница да своп је изнад њега линија са свап буде изнад ње у меморији овде, и ако желим да се вратим у главни привремено могу да кажем "рам". Који број? Главни је рам # 1. Идем да иде напред и рећи "оквир 1". Сада сам се вратио у главни, а ја могу да штампају к, а ја могу да штампају год, али ја не могу да одштампате или б. Али могу да кажем: "У реду, чекај мало, где је своп." Пусти ме напред и рећи "рама 0". Сада сам тамо где желим да будем, а као страни, има других команди превише, као да сте стварно досадно куцање следећи, следећи, следећи, следећи, обично можете рећи ствари као што је "наредних 10", као и да ће корак кроз наредних 10 линија. Такође можете да пишете "настави" када се заиста доста стајања кроз њега. Наставите ће покренути ваш програм без прекида све док се не удари другог тачку прекида, да ли је у петљи или ниже у вашем програму. У овом случају ми смо наставили до краја, а програм изашао нормално. То је фенси начин, инфериорна процес. Само ваш програм изашли нормално. Више о томе у видеу и дебаговање седницама које долазе. То је много. Узмимо овде 5-минута паузе, и ми ћемо вратити са Структуре и фајлова. Ако сте заронио у псет овонедељном већ знаћете да користимо у дистрибутивном коду, изворни код који пружамо вам као полазну тачку, неке нове технике. Конкретно, увели смо овај нови кључну реч зове струцт, за структуре, тако да можемо креирати прилагођене променљиве врста. Ми такође увео појам филе И / О филе улаза и излаза, и то је тако да можемо спасити државу вашег верати одбора у датотеку на диску тако да су наставни момци и ја могу да разумем шта се дешава унутар вашег програма, без потребе да ручно играју десетине игара Сцрамбле. Можемо да урадимо то више аутоматедли. Ова идеја о струцт решава прилично убедљив проблем. Претпоставимо да желимо да спроведе неки програм некако води евиденцију података о студентима, и студенти могу имати, на пример, ИД, име и кућа на оваквом месту Харварду, тако да су 3 комада информација желимо да око задржати, па ћу ићи напред и почните да пишете овде мало програма, укључују стдио.х. Пусти ме да радим укључују цс50.х. И онда почнем главну функцију. Нећу гњавити са било аргумената командне линије, и овде желим да имам студента, па ћу да кажем Ученик има име, па ћу да кажем "име ниске". Онда ћу да кажем ученик има личну карту, тако инт ид, и студент има кућу, па сам и ја хтео да кажем "кућу струна". Онда ћу наредити ово мало чисто овако. Ок, сада имам 3 променљивих са којима се представљају ученика, тако да "студент". А сада желим да попуните ове вредности, па ћу ићи напред и рећи нешто слично "Ид = 123". Име ће добити Давида. Рецимо кућа ће добити Матхер, и онда ћу да урадим нешто самовољно попут принтф ("% с, чији ИД је% д, живи у% с. А сада, шта ја желим да прикључите овде, један за другим? Име, ид кућа; повратак 0. Ок, ако сам зезнуо негде овде Мислим да имамо прилично добар програм који чува једног ученика. Наравно, ово није све то интересантно. Шта ако желим да имам 2 ученике? То није велика ствар. Ја могу да подрже 2 особе. Дозволите ми да иде напред и истакните ово и иди доле, и ја могу да кажем "ид = 456" за некога попут Роб који живи у Киркланд. Ок, чекај, али ја не могу да позовем њих иста ствар, и изгледа као да ћу морати да копирате ово, па хајде да кажем да ће то бити Давидови променљиве, и пусти ме да неке примерке ове за Роб. Ми ћемо позвати ове Робов али то не иде на посао сада јер сам-чекај ме је промените ид1, име1 и хоусе1. Роб ће бити 2, 2. Морам да промени ово овде, овде, овде, овде, овде, овде. Чекај, шта је са Томијем? Хајде да то урадимо поново. Очигледно је да ли и даље мислите да је ово добар начин да се то уради, није, па цопи / пасте лоше. Али смо решили ово пре недељу дана. Оно што је била наша решење када смо хтели да имамо више инстанци истог типа података? [Студенти] низ. Низ, па ћу покушати да очисти ово. Дозволите ми да мало простора за себе на врху, и дозволите ми уместо урадили овде. Ми ћемо позвати те људе, и уместо тога ћу да кажем "инт личне карте", и ја ћу подржати 3 од нас за сада. Ја ћу да кажем "имена ниски," и ја ћу подржати 3 од нас, и онда ћу да кажем "куће ниски," и ја ћу подржати 3 од нас. Сада овде уместо Дејвид добија своје локалне променљиве можемо се ослободити од њих. То је добар осећај да смо ово чишћење. И онда могу да кажем Дејвид ће бити [0] и имена [0] и куће [0]. И онда Роб можемо слично може да сачува на ово. Ставимо ово овде, тако да ће бити произвољно идс [1]. Он ће бити имена [1], и онда на крају, куће [1]. Ипак мало досадан, а сада морам да схватим ово, па хајде да кажемо "имена [0], ид [0], куће [0] и идемо плурализе ово. ИДС, ИДС, ИДС. И опет, ја то радим, па опет, ја сам већ прибегава цопи / пасте опет, па шансе су ту постоји још једно решење. Вероватно може да очисти ово даље са петље или нешто слично, па укратко, то је мало боље, али и даље осећа као Ја прибегавања цопи / пасте, али чак и ово, ја тврдим, заправо није фундаментално право решење, јер шта ако се одлучимо понекад знаш шта? Ми заиста требало складиштење е-маил адресе за Давида и Роб и сви остали у овом програму. Такође, треба да сачувате телефонске бројеве. Такође, треба да сачувате бројеве за хитне случајеве контакт. Имамо све ове делове података које желимо да сачува, па како идете о радиш то? Ти прогласити још низ на врху, а затим ручно додате емаил адреса [0], емаил адреса [1] за Давида и Роб и тако даље. Али стварно постоји само претпоставка у основи овај дизајн да ја користи систем част да знате да [И] у сваком од неколико низова само тако се дешава да се односи на исто лице, тако [0] у ИДС је број 123, и ја ћу претпоставити да имена [0] је иста особа име и куће [0] је иста особа кућа и тако даље за све разних низова које сам ствара. Али приметите да нема основна веза међу тим 3 комада информација, ИД, име и кућу, иако ентитет покушавамо да модел у овом програму није низови. Низови су само ова програмска начин да то урадите. Оно што заиста желимо да моделира у нашем програму је особа као Давид, лице као Роб унутар којих или енцапсулатинг је име и ИД и кућа. Можемо некако изразим ову идеју енкапсулација при чему особа има ИД, име и кућу и не прибегавају стварно овај пијук којим смо управо верујем да је нешто носећег се односи на исте људске ентитета у свакој од ових различитих низова? Ми заправо можемо урадити. Дозволите ми да одем горе главни за сада, и дозволите ми да направим свој тип података за стварно први пут. Ми смо користили ову технику у Сцрамбле, али овде ћу да иде напред и створи тип података, и знате шта, ја ћу да га зову студент или лице, и ја ћу користити типедеф за дефинисање тип. Ја ћу да кажем да је ово структура, а онда структура ће бити типа ученика, рећи ћемо, иако је мало од сада за мене. Ми ћемо рећи "инт ид." Ми ћемо рећи "име ниске". Онда ћемо рећи "стринг кући" па сада на крају ових неколико линија кода Управо сам научио кланг да постоји Тип података, поред Интс, поред жице, поред дубл, поред сплавова. Од овог тренутка у временској линији 11, сада постоји нови тип података под називом студенти, и сада може да прогласи променљиву студентски где ја хоћу, па нека ми помицати овде доле на људе. Сада могу да се отарасим овога, и ја могу да се вратим доле Дејвиду овде, и за Давида ја заиста могу да кажем да је Давид, можемо буквално да име променљиве после мене, ће бити типа студента. Ово може изгледати мало чудно, али то није све што другачије од проглашења нешто као инт или гудачки или плута. Тако се дешава само да се зове студента сада, и ако хоћу да ставим нешто унутар ове структуре Ја сада треба да користите нови комад синтакси, али је прилично једноставан, давид.ид = 123, давид.наме = "Давид" у главном Д, и давид.хоусе = "Матхер" и сада могу да се отарасим ове ствари овде. ОБАВЕШТЕЊЕ сада смо редизајниран наш програм заиста много бољи начин у смислу да се сада наш програм одражава стварни свет. Постоји реалном свету појам лице или студента. Ево сада имамо Ц верзију особе или тачније студент. Унутар тог лица су ти битне карактеристике, ИД, име и кућу, па Роб суштини постаје иста ствар овде доле, тако ученик роб, а сада роб.ид = 456, роб.наме = "Роб". Чињеница да променљива се зове Роб је некако бесмислена. Могли смо га звали к или и или з. Ми само именован је Роб бити семантички конзистентан, али стварно име је унутар тог самог поља, тако да сада имам ово. То, такође, не осећа као најбољи дизајн у томе сам напорно сам кодираног Давида. Тешко сам кодирани Роб. А ја и даље морати да прибегне некој копији и налепите сваки пут желим нове променљиве. Штавише, морам да дам очигледно сваки од ових варијабли име, иако бих много радије описати ове променљиве  више уопштено као студенти. Сада можемо спојити идеје које су добро раде за нас и уместо тога кажу: "Знате шта, ми променљиву зове студената, и хајде да то буде од величине 3 ", тако да сада могу да рефине ово даље, отарасити ручно проглашене Дејвиду а ја уместо да кажем нешто студената [0] овде. И онда могу да кажем студената [0] овде, Студенти [0] овде, и тако даље, и ја могу да идем около и очисти то за Роб. Такође сам могао да одем сад мозда додајући петљу и коришћење ГетСтринг и ГетИнт да заиста добити ове вредности од корисника. Ја могу да идем о додавању константа јер ово је генерално лоша пракса на хард код неких као произвољан број 3 овде и онда само запамтите да сте ставили више од 3 ученика у њему. Вероватно би било боље да користимо # дефине на врху мом досијеу и фактор који се, па уистину, пусти ме да иде напред и генерализујемо ово. Дозволите ми да отворим један пример који је међу данашњим примери унапред, струцтс1. Ово је више комплетан програм који користи # дефине овде и каже да ћемо имати 3 ученика по дефаулту. Овде сам проглашењу класе вредну студената, па учионица за студенте, и сада сам помоћу петље само да је код мало више елегантан, населити класу уз учешће корисника, па прелазили од И = 0 на до студената, што је 3. А онда сам питати корисника у овој верзији  Шта је ученик ИД, а ја га добити са ГетИнт. Шта је студентска име, а онда се то са ГетСтринг. Шта је студентска кућа? Капирам са ГетСтринг. А онда на дну овде сам одлучио да промени како сам штампање ове напоље и да заправо користе петљу, и кога ја штампање? Према коментару сам штампарије никога у Матхер, и да је тако Роб и Томи, и тако даље, заправо Томми је у Матхер. Томи и Дејвид ће бити штампан у овом случају, али како се то ради? Нисмо видели ову функцију пре, али узети погоди о томе шта то ради. Пореди ниске. То је мало не јасно како се пореди конце, јер се испоставило ако враћа 0 то значи да су стрингови су једнаки. Ако се врати -1 значи један алфабетски долази пред другима, и ако се врати +1 значи другу реч долази по абецеди пред другима, а можете погледати на мрежи или на ман страници да видим тачно на који начин је који, али све то сада ради је то да каже ако [и]. кућа једнака "Матхер" онда само напред и штампају тако и тако је у Матхер. Али овде је нешто нисмо видели, а ми ћемо се вратити на ово. Не сећам се да је икада да се то уради у било ком од мојих програма. Бесплатно је очигледно односи на меморију, ослобађање меморије, али шта меморијске ја очигледно ослобађајући у овој петљи на дну овог програма? Изгледа као да сам ослобађајући име особе и нечија кућа, али зашто је то тако? Испоставило се свих ових недеља које сте користили ГетСтринг смо некако били увођења грешку у свакој од својих програма. ГетСтринг од издваја дизајна меморије, тако да може да се врати на вас ниске, као Давид, или Роб, и затим могу да ураде шта год желиш са тим стрингом у вашем програму, јер смо резервисану меморију за вас. Проблем је све ово време сваки пут када позовете ГетСтринг ми, аутори ГетСтринг, су тражећи оперативни систем да нам дају мало РАМ-а за ову жицу. Дајте нам мало РАМ-а за ову следећу ниске. Дајте нам мало више РАМ за овај следећи стринг. Шта ви, програмер, никада нису радили нам даје ту меморијску леђа, тако да је за ових неколико недеља све програме које сте написали имали оно што се зове меморијски скок чиме су га користим све више и више меморије сваки пут када позовете ГетСтринг, и то је у реду. Намерно смо то у првим недељама јер није то интересантно морати да бринете о томе где ниска долази. Све што желим је реч Роб се вратити када га корисник врсте ин Али напредује сада морамо да почну све више софистициран о томе. Сваки пут када смо издвојити меморију на крају смо боље да преда назад. Иначе у стварном свету на вашем Мац-у или ПЦ-можда морати повремено искусног Симптоми где се ваш рачунар брушење до застоја на крају или глуп спиновање лопта за плажу тек заузима рачунар је Цела пажња и да не може да уради ствари. То се може објаснити било који број грешака, али међу тим могућих грешака се ствари називају мемори леакс којима неко ко је написао тај комад софтвера ви користите не заборавите да слободне меморије да он или она питао оперативни систем за, не користи ГетСтринг, јер је то ствар ЦС50, али користећи сличне функције да питам оперативни систем за меморију. Ако ви или они зајебеш и никада заправо вратити ту меморију симптом који може бити да програм успорава и успорава и успорава ако заборавите да позовете бесплатно. Вратићемо се када и зашто ће позвати бесплатно, али идемо напред само за добру меру и покушајте да покренете овај посебан програм. То се звало струцтс1, ентер. Дозволите ми да иде напред и покрените струцтс1, 123, Дејвид Матхер, 456, Роб Киркланд, 789, Томи Матхер и видимо Давидов је у Матхер, Томми је у Матхер. Ово је само мало разум проверите да програм ради. Сада, нажалост, овај програм је мало фрустрирајуће у томе Ја сам све то раде, ја сам откуцао у 9 различитих жице, притисните ентер, је рекао ко је био у Матхер, али очигледно сам знао ко је био у Матхер већ зато што сам откуцао. Било би лепо ако барем овај програм је више као базе података и то је заправо памти оно што сам откуцао у па сам опет не морате да унос ове студентске евиденције. Можда је као регистрариал система. Можемо да урадимо ово користећи ову технику познату као филе И / О филе улаза и излаза, Веома генерички начин да се каже било које време желите да прочитате фајлове или напиши фајлове можете да урадите ово са неког скупа функција. Дозволите ми да иде напред и отвори ову струцтс2.ц пример, који је готово идентичан, али хајде да видимо шта је то сада чини. На врху фајла изјављујем класу студената. Онда попуните класу са улаза корисника, па те линије кода су управо као пре. Онда, ако сам доле помицати овде одштампали свако ко је у Матхер произвољно као и пре, али ово је интересантно нова функција. Ове линије кода су нови, и они уведу нешто овде, Филе, све капе, и то је * у и овде. Дозволите ми да померим ово овде, а * овамо као добро. Ова функција нисмо видели, фопен, али то значи фајл отворен, па хајде да прелистам преко њих, и то је нешто што ћемо вратити у будућим псетс, али овај ред овде у суштини отвара фајл под називом базе података, а посебно га отвара на такав начин да може да уради шта на њега? [Нечујан-студент] Добро, па "в" само значи да говори оперативни систем отворите овај фајл на такав начин да могу да пишем на њега. Ја не желим да га прочитам. Ја не желим само да га погледам. Желим да га промените и додајте ствари потенцијално њега, и фајл ће се звати база података. То би се могло назвати ништа. Ово би могло да буде датабасе.ткт. Ово би могло да буде дб.. Ово би могао да буде реч као фоо, али сам самовољно одлучио да именује базу података датотеке. Ово је мало разум провера да ћемо се вратити у великом детаљно током времена, ако је ФП, за датотеку показивача, није једнак НУЛЛ значи све је добро. Да скратимо причу, функционише попут фопен понекад не. Можда датотека не постоји. Можда сте ван простора на диску. Можда немате дозволу за тај фолдер, па ако фопен враца нулл нешто лоше десило. Насупрот томе, ако фопен не враћа нулл све је добро и ја могу да почнем да пишем на овом фајлу. Ево нови трик. Ово је за петљу која је итератинг над сваким од мојих ученика, а ово изгледа тако слично ономе што смо урадили раније, али ова функција је рођак иф позвао фпринтф за датотеку принтф, и приметио да је то другачије у само 2 начина. Једна, она почиње са ф уместо п, али онда је први аргумент је очигледно шта? [Студенти] Филе. >> То је фајл. Ова ствар се зове ФП, који смо на крају ћемо задиркивао, осим што фајл поинтер је, али за сада фп једноставно представља фајл који сам отворио, па иф овде говори штампање ИД страницу корисника у датотеци, а не на екрану. Принт име корисника у датотеци, а не на екрану, кућа фајла, не на екрану, а затим овде, очигледно, затворите датотеку, а затим овамо без меморије. Једина разлика између ове верзије 2 и верзија 1 је увођење фопен и овај фајл са * а овај појам фпринтф, па хајде да видимо шта крајњи резултат је. Пусти ме да идем у мој прозор терминала. Дозволите ми да покренете струцтс2, ентер. Изгледа као да је све у реду. Идемо реприза струцтс2. 123, Дејвид Матхер, 456, Роб Киркланд, 789, Томи Матхер, унесите. Изгледа као да се понашали исто, али ако ја сад лс приметити шта датотека је овде међу свим мојим кодом, база података, па хајде да отворимо ту, гедит базе података, и поглед на то. То није најсексепилнији од формата. То је заиста један део података линије по линији по реду, али они од вас који користе Екцел или ЦСВ датотеке, зарез раздвојене вредности, Би сигурно сам фпринтф користи да уместо можда овако нешто тако да сам стварно могао створити еквивалент Екцел фајл одвајањем ствари са зарезима, а не само нове линије. У овом случају, ако сам је користио уместо зареза уместо нове линије Буквално сам могао да отвори овај фајл базе података у Екцел ако сам уместо тога направио да изгледа овако. Укратко, сада када имамо моћ да пише у фајлове сада можемо почети Непромењен податке, држећи га око на диску тако да можемо да информације око изнова и изнова. Обавештење неколико других ствари које су сада мало позната. На врху овог фајла Ц имамо типедеф јер смо желели да створе тип података који представља реч, тако да овај тип се зове реч, и унутар ове структуре то је мало одгајивача сада. Зашто је реч састављена од низа очигледно? Шта је реч само интуитивно? То је низ знакова. То је низ знакова поново враћа се назад. ПИСМА у свим капе деси да ми произвољно рећи максимална дужина било речи у речнику који користимо за Сцрамбле. Зашто имам +1? Поништеног карактер. Подсетимо, када смо урадили Бананаграмс пример нам је потребно посебну вредност на крају речи, како да пратите где речи заиста завршио и као проблем скуп спецификација каже Овде смо дружење са датом речју боолеан вредност, застава, да тако кажем, тачно или нетачно. Да ли сте већ пронашао ову реч, јер смо схватили стварно потребан начин сећања не само шта реч је Сцрамбле али да ли или не вама, људи, нису га нашли тако да ако радите наћи реч "је" не можете куцати, унесите је, унесите је, унесите и добити 3 поена, 3 поена, 3 поена, 3 поена. Ми желимо да будемо у могућности да црну листу ту реч постављањем боол да важи ако сте већ нашли, па зато смо садржана је у тој структури. Сада, овде у јагма да је ово друго струцт зове речник. Одсуство овде је реч типедеф јер у том случају морали смо да обухвати идеју речнику, и речник садржи гомилу речи, као подразумевао овом низу, а колико од тих речи су тамо? Па, шта год то променљива зове величине каже. Али ми само треба један речник. Не треба тип података зове речник. Ми само треба један од њих, тако да испада у Ц да ако не кажеш типедеф, само реци струцт, онда унутар заграда сте ставили своје променљиве, онда стави име. Ово је прогласио једну променљиву зове речник то изгледа овако. Насупрот томе, ове линије стварају вишекратну употребу структуру података под називом реч да можете да направите више копија, баш као што смо створили више копија ученика. Шта се то на крају нам омогућити да радимо? Дозволите ми да се вратим у, рецимо, једноставнији пример од једноставнијих времена, и пусти ме да отворим, рецимо, цомпаре1.ц. Проблем овде на руци је заправо одлепите слој ниске и почети полетање ове обуке точкове јер испада да је ниска све ово време је као што смо обећали у недељу 1. заиста само надимак, синоним из ЦС50 библиотеке за нешто што изгледа мало више криптично, цхар *, а ми смо видели ову звезду пре. Ми смо то видели у контексту фајлова. Да сада видимо зашто смо се крије овај детаљ за неко време сада. Овде је фајл под цомпаре1.ц, и то очигледно пита корисника за 2 жице, С и Т, а онда покушава да упореди те жице за равноправност у складу 26, и ако су они једнаки каже, "Ти откуцао исту ствар" и ако они нису једнаки каже, "Ти откуцао различите ствари." Дозволите ми да иде напред и покрените овај програм. Пусти ме да идем у мој изворни директоријум, направите цомпаре1. Ок саставио је. Дозволите ми да покренете цомпаре1. Ја ћу увећали, ентер. Реци нешто. ЗДРАВО. Ја ћу рећи нешто поново. ЗДРАВО. Ја дефинитивно нисам тип различите ствари. Дозволите ми да покушам поново. Бие бие. Дефинитивно не разликује, па шта се овде дешава? Па, шта се заиста се пореди у складу 26? [Нечујан-студент] Да, тако испада да стринг, тип података, је врста беле лажи. Стринг је цхар *, али шта је цхар *? Цхар *, како кажу, је показивач, и показивач је ефикасно адреса, збир локација у меморији, а ако вам се деси да сте откуцали у једном речју као ЗДРАВО, сећам из претходних дискусија о жицама ово је као реч ЗДРАВО. Запамтите да реч као здраво може бити представљена као низ знакова као што је овај а затим са посебним карактером на крају зове нулл карактер, као \ означава. Шта је заправо ниска? Обратите пажњу да је ово више комади меморије, и, у ствари, крај ње је позната само када погледате кроз читав низ у потрази за специјалне нулл карактером. Али, ако је ово комад сећања из меморије мог рачунара, хајде произвољно рећи да овај стринг само посрећило, а добио налази на самом почетку мог РАМ рачунара. То је бајт 0, 1, 2, 3, 4, 5, 6 ... Када кажем нешто као ГетСтринг и радим Стринг с = ГетСтринг шта се заиста враћа? За протеклих неколико недеља, шта се заиста се чувају у С није овај стринг по себи, али у овом случају оно што се чувају је број 0, јер оно што заправо чини ГетСтринг се она не врати физички низ. То чак не баш да концептуални смисао. Шта ради повратак је број. Тај број је адреса у меморији ЗДРАВО, и гудачки а онда, ако се одлепите овај слој, гудачки заиста не постоји. То је само поједностављење у ЦС50 библиотеци. Ово је заиста нешто што се зове цхар *. Знак има смисла, јер шта је реч, као што је ЗДРАВО? Па, то је серија карактера, низ знакова. Знак * значи адресу карактера, па шта то значи да врати стринг? Лепо, једноставно начин враћања ниску је уместо да покуша да схватим како сам се врати на 5 или 6 различитих бајтова дозволите ми да се вратим на адресу коју бајт? Прво. Другим речима, дозволите ми да вам дам адресу карактера у меморији. То је оно што цхар представља, адреса једног карактера у меморији. Позив да се променљива с. Чувати на с да се посебна адреса, коју сам произвољно рекао је 0, Само да све буде једноставно, али у стварности је то генерално је већи број. Чекај мало. Ако само дајеш ми адресу првог карактера, како да знам шта је адреса другог карактера, трећи, четврти и пети? [Нечујан-студент] Ви само знате где крај стринга је путем ове практичне трик, тако да када користите нешто иф, иф оно буквално узима као аргумент, Подсећамо да користимо ове чувар места% с, и онда прође променљива која се складишти стринг. Оно што стварно јесте доношење адреса првог карактера тог низа. Принтф затим користи за петље или док петља по добијању те адресе, на пример, 0, па пусти мене да то сада, принтф ("% с \ н", с); Када зовем принтф ("% с \ н", с); шта сам стварно принтф пружимо је адреса првог карактера у с, што је у овом случају је произвољно Х. Како принтф знам шта је тачно да се прикаже на екрану? Особа која спроводи иф спровела вхиле петљу или за петљу која каже да се овај лик једнак посебан карактер нулл? Ако није, штампа. Шта мислите о овоме? Ако не штампају, да га одштампате, одштампајте, одштампате га. Ох, ово је посебна. Стоп штампање и вратити кориснику. И то је буквално све што се дешава испод хаубе, и то је доста да свари у првом дану класе, али за сада је то заиста зграда блок разумевања свега која се дешава унутар нашег сећања рачунара, и на крају ћемо задиркивао ово осим уз малу помоћ од једног од наших пријатеља у Стенфорду. Професор Ницк Парланте на Станфорду је урадио овај предиван видео секвенцу од свих врста различитих језика које су увеле ово мало Цлаиматион карактер Бинки. Глас да намеравате да чујете у само неколико другом увид је да је од Станфорд професора, а ви добијате сада само 5 или 6 секунди овог права, али ово је белешка о којима ћемо закључити данас и почне у среду. Дајем вам Поинтер забаве са Бинки, преглед. [♪ ♪ Мусиц] [Професор Парланте] Хеј, Бинки. Пробудите се. То је време за забаву показивача. [Бинки] Шта је то? Сазнајте више о тројке? О, снаша! Ми ћемо вас видети у среду. [ЦС50.ТВ]