Дејвид Џ MALAN: Во ред. Па добредојде на првиот CS50 посмртна за квиз. Ние сме мислеле дека би се инаугурира оваа традиција оваа година. И ова ќе биде можност да одиме преку решенија за квиз. И ние ќе го забрза или успори врз на интересот на оние тука. Па ти си веројатно тука, бидејќи сте заинтересирани за тоа како би можеле да имаат или треба да се одговори на некои од овие проблеми. Па зошто да не фрлите поглед во оваа секција првиот? Па добивање жици. Ова ви даде три различни верзии на програмата што беше, во крајна линија, со цел да се добие низа од корисникот. Дали е или не го сторија тоа беше лево кон вас да се утврди. А ние праша во прашање 0, Претпоставувам дека таа верзија 1 е Составувач и егзекутирани. Зошто би можело програмата segfault? На прв поглед, какви предлози зошто? Да. Публика: Се сеќавам гледаат оваа во претходниот пример на гледање на char * а и при гледањето на скенирање на ОК и види, бидејќи тоа е покажувач, како сето тоа влијае на она што се скенираат во? Е тоа е или адресата на е? Дејвид Џ MALAN: OK. Добро. Значи во крајна линија, изворот на било каков проблем е веројатно нема да се намали на тој променлива s. И тоа е навистина променлива. Типот податоците на таа променлива е char *, што значи дека нема да се содржи адреса на некој лик. И во него лежи увид. Тоа се случува да содржи адреса на карактер или, поопшто, адресата на првиот карактер во целина блок карактери. Но се фати е дека скенирање с, намена во живот, е дадена адреса и дава формат код, како% s, да се прочита стринг во залакот на меморија на таа адреса. Но, бидејќи не постои знак за еднаквост пред дека запирка на првиот линија код, бидејќи ние не, всушност, распредели било меморија со Примерок, бидејќи тоа всушност не распредели низа на некои големина, сите правиш е читање на корисникот тастатура за внес во некои целосно ѓубре вредност, која е во с од стандардните. Затоа, шансите се сте ќе segfault ако таа адреса не само да се случи да биде вредност што можеш, всушност, пишете на. Толку лошо да не се распредели вашата меморија таму. Значи во прашање 1, ги прашавме, Претпоставувам дека верзијата 2 е Составувач и егзекутирани. Зошто би можело оваа програма segfault? Така што ова е помалку кабриолет. И таму е навистина само еден очигледен начин каде што можете да предизвика segfault тука. И ова е тематика. Секое време ние сме користење на C во меморијата, што можете да го направите да предизвикаат segfault со верзијата 2? Публика: Ако користите дека влез во стринг кој е повеќе од 49 карактери. Дејвид Џ MALAN: Токму така. Во секое време да видите нешто со фиксна должина кога станува збор за низа, вашиот радар треба да одам дека ова би можело да биде проблематична ако не сте проверка на границите на низата. И тоа е проблемот тука. Ние сме сè уште користење scanf. Ние сме сè уште користење на% s, што значи се обиде да го прочитате низа од корисникот. Тоа се случува да се прочита во ОК, што, во овој момент, е ефективно адресата на парче меморија или тоа е еквивалентно. Тоа е името на низа на карактери на меморија. Но, токму тоа, ако го прочитате низа тоа е повеќе од 49 карактери, 49 затоа што треба простор за обратна коса црта 0, си оди за да претекување дека тампон. И можеби ќе имаат среќа и ќе биде во можност да напише 51. карактер, 52., 53. Но во одреден момент, оперативниот систем се случува да се каже, бр. Ова дефинитивно не е меморија сте дозволено да го допре. И програма ќе се segfault. Па таму, хеуристичко треба да има никаква време имаш фиксна должина, имате да бидете сигурни дека сте проверка на должината на што и да е што се обидуваш да се прочита во неа. ПУБЛИКАТА: Значи да се реши тоа, можете да имале изјава проверка всушност е со должина поголема или помала од? Дејвид Џ MALAN: Апсолутно. Вие само треба услов кој се вели дека, ако - или подобро кажано, вие не мора да знаете однапред колку знаци на корисникот е случува да напишеш, затоа што имате пилешко и јајца. Не додека сте го прочитате во со scanf може да дознаам колку долго е. Но, во тој момент, тоа е премногу доцна, бидејќи веќе сте го прочитате во некои блок од меморија. Па како настрана, CS50 библиотека избегнува ова прашање заедно, да се потсетиме со користење на fgetc. И гласи еден карактер во еден момент, врвот-toeing заедно, знаејќи дека не може да претекување лик ако ќе прочитате еден по еден. Улов е со getstring потсетиме е дека мораме постојано да се ре-големина дека парче на меморија, која е само болка. Тоа е многу линии на кодот да го направите тоа. Па друг пристап ќе биде да се всушност се користи братучед, па да се каже, на scanf. Постојат варијанти на многу од овие функции кои всушност се провери должина од колку знаци може да се прочита максимално. И може да се одреди, не ги читаат повеќе од 50 карактери. Така што ќе биде поинаков пристап, но помалку сместување на поголеми влезови. Значи прашањето 2 прашува, да претпоставиме дека верзијата 3 е составена и погубен. Зошто би можело таа програма segfault? Така што ова е всушност истиот одговори, иако тоа изгледа малку познавач. Ние сме користење Примерок, кој се чувствува како ние сме се даваат повеќе опции. А потоа ние сме ослободување што меморија на крајот. Тоа е сепак само 50 бајти меморија. Па ние се уште може да се обиде да го прочитате во 51, 52, 1000 бајти. Тоа се случува да segfault за иста причина. Но, постои уште една причина премногу. Што друго би можел Примерок враќање покрај адресата на парче меморија? Тоа би можело да се врати NULL. И бидејќи ние не сме проверка за тоа, ние би можеле да се прави нешто глупави за друга причина, а тоа е дека ние би можеле да се кажува scanf, да се прочита влез на корисникот од тастатура во 0 локација, АКА нула. И дека, исто така, дефинитивно ќе предизвика segfault. Па за целта на квизот, ние ќе го прифатиле било кој од овие како оправдана причина. Една од нив е идентична. Една од нив е малку посуптилни. Крај, во однос на програмата употреба на меморија, како да верзија 2 и верзија 3 се разликуваат? Па за она што вреди, видовме навидум бескрајна снабдување на можни одговори на ова. И меѓу одговорите на луѓето, она што бевме надевајќи се дека за, но го прифативме други работи, беше некои споменување на Фактот дека верзијата 2 е користење на т.н. оџак. Верзија 3 е користење на грамада. И функционално, ова навистина не направи сето тоа многу разлика. На крајот на денот, ние сме се уште само добивање 50 бајти меморија. Но, тоа беше една од можните одговори дека ние се гледа во. Но ќе се види, како ќе ја добиете вашата квизови назад од TFS, дека ние го сторивме прифатат други дискусиите на нивните различни начини на употреба на меморијата, како и. Но магацинот и грамада би биле лесен одговор да одам со. Било какви прашања? Јас ви даде Роб. Роб BOWDEN: Значи проблемот 4. Ова е една каде што требаше да се пополни на бројот на бајти од сите овие различни видови се користат. Па првото нешто што го гледаме. Претпостави 32-битна архитектура, вака CS50 апаратот. Така една од основните работи за 32-битна архитектура, која ни кажува точно колку е голема покажувач се случува да биде во архитектурата. Па веднаш, ние знаеме дека секој покажувачот тип е 32-бита или 4 бајти. Па гледајќи оваа маса, јазол * е тип покажувач. Тоа ќе биде 4 бајти. Struct јазол *, тоа е буквално идентична со јазол ѕвезда. И така што ќе биде 4 бајти. Стринг, па тоа не изгледа како покажувачот уште, но typedef, на стринг е само char *, која е тип покажувач. Така што ќе биде 4 бајти. Значи овие три се сите 4 бајти. Сега, јазол и ученикот се малку посложена. Па гледајќи јазол и студент, гледаме јазол како цел број и покажувач. И студентски е два совети во него. Па барем за нашиот случај тука, начинот на дека на крајот ќе заврши пресметување на големината на овој struct е само да додадете на сè тоа е во внатрешноста на struct. Значи за јазол, имаме цел број, кое што е 4 бајти. Ние имаат покажувач, што е 4 бајти. И така еден јазол се случува да ги преземат 8 бајти. И слично за студент, имаме покажувачот тоа е 4 бајти, а друг покажувачот тоа е 4 бајти. Така што се случува да се стави крај до суштество 8 бајти. Па јазол и ученикот се 8 бајти. И овие три се сите 4 бајти. Прашања во врска со тоа? Да. ПУБЛИКАТА: Дали тоа беше 64-битна архитектура, би дека двојно сите од нив? Роб BOWDEN: Тоа не би двојно сите нив. Па 64-битна архитектура, тоа, повторно, промени кои фундаментално нешто што покажувачот е сега 64 бита. Да. Па покажувачот е 8 бајти. Па овие, кои беа 4 бајти се случува да биде 8 бајти. Еден студент, кој беше два покажувачи, Па, сега тоа се случува да биде 8 бајти, 8 бајти. Тоа ќе го направат 16 бајти. Но еден јазол е сеуште 4 бајти. Значи ова покажувачот се случува да биде 8 бајти. Ова е 4 бајти. Па еден јазол е само ќе да биде 12 бајти. Било какви други прашања на оној? Па следниот, овие се кодови HTTP статус. И ти мораше да се опише околности под кои тие би можеле да да Ви бидат вратени. еден проблем што слушнав некои студенти имаат е дека тие се обиделе да се направи грешки биде на крајот на клиентот. Па кога ние се обидуваме да се направи барање до серверот, нешто ќе тргне ред на нашиот крај. Но, генерално, овие кодови се се врати од страна на серверот. Затоа сакаме да дознаам што се случува погрешно или десно на сервер кој предизвикува овие работи кои треба да бидат вратени. Па зошто би можеле сервер се враќа статус код 200? Било кој мисли? Да. Па нешто за успешно барање помина низ. И тие се способни да се вратат што и да побара. Значи се е во ред. Што е со 302 пронајден? Да. ПУБЛИКАТА: Серверот е во потрага за она што го бара. Но, тоа не можеше да го најде. Значи има грешка. Роб BOWDEN: Значи серверот беше во потрага по она што ти сакаше. Па само бараат овде, 302 се најде, тоа беше во можност да го најдете. Публика: Жал ми е. Најде значи дека тие не го најдете. Жал. Роб BOWDEN: Значи 302 пронајдени. Серверот е во состојба да се најде она што го сакаше. Публика: Но, тоа не е тоа прикажување? Роб BOWDEN: Разликата помеѓу ова 302 и 200 е тоа што знае она што го сакате. Но тоа не е точно каде си сакал да прашам. Па 302 е типичен пренасочување. Така да побара страница. Тоа познава, ах, сакам да ви се врати ова. Но, ова е на друг URL. Па еј, ти всушност сакаат тоа. Дејвид Џ MALAN: Тоа е парче што рече дека ние даде вас момци пренасочување функција која се користи насловот функција тоа, пак, отпечатени локација, дебелото црево, а потоа рачно на која сакате да ги одбивате корисникот. И покрај тоа што не гледам 302 експлицитно таму, тоа е она што PHP магично ќе се вметне како и заглавието велејќи дека токму она што Роб рече дека - најде. Но оди тука, наместо. Роб BOWDEN: OK. Значи она што за 403 забрането? Публика: Мислам дека тоа е дека серверот е во основа велејќи дека клиентот не може да пристапи на почетната страница. Роб BOWDEN: Така да. Па, типичниот одговор бевме очекувајќи е нешто како, на датотеки не се chmodded соодветно. Тоа е веројатно под кои околности ги видов. Но, постои причина дека клиентот би можело да биде виновен тука. Таму е всушност уште еден код за статус - 401. Па овие се многу слични. 401 е неовластено. И 403 е забрането. И така неовластено вас исклучиво добиете ако вие не сте најавени Но влезете во би можело да значи дека се овластени. Но, ако веќе сте најавени и ќе уште немате дозвола, а потоа исто така можете да добиете забрането. Значи, ако сте најавени во и немаат дозвола, забрането е, исто така, нешто што може да се добие. Дејвид Џ MALAN: И механизмот со кои овие проблеми се обично реши на серверот е преку она команда? Chmod, ако тоа е, всушност, дозволи прашање на датотека или директориум. Роб BOWDEN: Тогаш 404 не е пронајден. Да. Па за разлика од 302, каде што тоа не беше точно каде што го бараме, но тоа не знае што сакате, тоа, тоа само има никаква идеја што сакате. И да не се бара нешто валидно. 418 Јас сум Чајникот, а потоа 500 внатрешниот сервер. Па зошто би можеле да ти е тоа? Па segfault - Јас всушност не знаат оценување стандард за ова. Но, ако вашиот PHP код имаше нешто лошо во тоа, во теорија, тоа би можело да всушност segfault, во кој случај, овој 500 внатрешна грешка на серверот, нешто не е во ред со вашиот сервер конфигурација. Или има синтаксички грешки во вашиот PHP код. Или нешто лошо се случува. Дејвид Џ MALAN: Ние го види segfault меѓу одговорите на неколку луѓе. И технички, тоа би можело да се случи. Но, тоа ќе биде PHP, на програмата напишани од други луѓе, всушност segfaulted, која само ако тие луѓе зезнав и напиша кабриолет кодот во нивни преведувач би PHP е самата segfault. Па дури иако 500 е како segfault во духот, тоа е речиси секогаш резултат на конфигурациската датотека прашање со вашиот веб сервер или, како Роб рече, синтаксата, како тебе не го затвори понуда. Или сте ја изгубиле точка-запирка некаде. ПУБЛИКАТА: Значи за шатлот pset, јас дека кога јас го направив тоа еднаш јас кликна на пребарувач, но ништо не излезе, она што се нарекува бела страница. Но тоа е затоа што на кодот. Мислам дека тоа беше да го вклучите Javascript, нели? Роб BOWDEN: Да. Публика: Дали тоа грешка уште да излезе? Роб BOWDEN: Значи вие не би го добиле оваа грешка, бидејќи сè од перспектива на веб-серверот беше сосема во ред. Но вие бара index.html. Баравте shuttle.js и service.js. И тоа беше во состојба успешно да се вратат на сите оние работи што - 200. OK. Тоа е само кога вашиот прелистувач се обиде да толкуваат JavaScript код кој Тоа е како, чекај, ова не е валидна го вклучите Javascript-грешка. Било какви други прашања? Во ред е. Дејвид Џ MALAN: Значи следниот беше за бројот 11. И 11 е најстрашниот за многу луѓе. Па најважното нешто да се напомене тука ова беше, всушност, за двојно поврзана листа. Но, тоа не беше иста како минатата година двојно поврзана листа проблеми, кои не ви даде забелешката дека листата може, всушност, да бидат несортиран. Значи фактот дека листата е несортиран и фактот дека тој збор беше подвлече дека требаше да се пренесе дека ова е всушност поедноставување на она што инаку би биле повеќе предизвик проблем и не една. Така честа грешка тука беше да се стави минатата година решение на вашиот еден пејџер, а потоа само слепо копија од тоа надолу како одговор, што е право одговори на различно прашање слични во духот. Но суптилностите тука беа како што следи. Значи еден, имаме еден јазол декларирани и дефинирани во вообичаениот начин тука. Тогаш ние дефинирана листа на биде глобален покажувачот иницијализиран на NULL. Тогаш очигледно, има две функции имаме прототипови за тука, вметнете и извадете го. А потоа имаме некои примерок код овде на вршење на еден куп на инсерции. А потоа бараме од вас да се заврши спроведувањето на вметнете подолу во таква начин што го внесува n во листата во постојана време, исто така, истакна, дури и ако веќе присутни. Па убавината на можноста да се вметне во постојан време е дека тоа подразбира дека мора да се вметне на нов јазол каде? Во предниот. Така ја елиминира, за среќа, барем еден од случаите кои се користат да се бара дури и повеќе линии на код, како тоа го правеше минатата година и дури во класа кога ние зборуваше преку овој вид на работа со луѓето и со некои вербална псевдо код. Па во раствор тука, ајде да ја прескокнете над за тоа само за да имаат визуелна на екранот. Забележите дека ние сме прави следново. И исто така забележуваме останатите поедноставување беше дека дури и ако тоа е веќе присутни, така што ова значи дека дури и ако бројот е веќе таму, можете да само слепо вметнете друга копија од него. И дека, исто така, беше замислена да биде поедноставување, така што ќе може се фокусираат на, навистина, некои од повеќе интелектуално интересна дел и а не само некои дополнителни грешка проверка со оглед на ограничено време. Така што во овој примерок решение, ние додели покажувач на левата рака страна овде на јазол. Сега, да сфатат дека покажувачот, како Роб рече, е само 32 бита. И тоа всушност не содржи адреса, додека не се додели адресата. И тоа го правиме на десната страна страна преку Примерок. Како добар граѓанин, ние се провери дали Примерок не е, всушност, нула, така што ние не случајно се создаде на segfault тука. И во секое време да го користите Примерок во животот, ти треба да се проверуваат за ништовни, за да не имате суптилен бубачка. Тогаш ние се иницијализира дека нула од доделување n и претходната и следната. И во овој случај тука, јас се иницијализира претходна на нула, затоа што овој нов јазол ќе биде новиот на почетокот на мојата листа. Па таму се случува да биде ништо пред него. И сакам да суштина додаваат постоечка листа на нов јазол од поставување следната еднаква на самата листа. Но, јас не сум сторил само уште. Значи, ако на листата се веќе постоеле, и имаше барем еден јазол веќе во место, ако ова е листа тука и јас ја внесе нов јазол тука, јас треба да бидете сигурни дека мојот поранешен јазол укажува наназад мојот нов јазол, бидејќи ова е, повторно, двојно поврзана листа. Па ние се направи здрав разум чек. Ако листата не е нула, ако има веќе еден или повеќе јазли таму, тогаш додадете дека назад референца така да се каже. А потоа самиот последното нешто што ние треба да се направи е, всушност, ажурирање на глобалната променлива листата по себе да се истакне на тој нов јазол. Да. ПУБЛИКАТА: Во стрелката на покажувачот [Нечујни] еднаква на нула, не дека се справи со список, бидејќи листата е нула? Дејвид Џ MALAN: Не бе. Тоа е едноставно ми се проактивно внимателно, со тоа ако ова е мојот оригиналната листа со можеби некои повеќе јазли овде и јас сум вметнување ми нов јазол овде, таму ќе да биде ништо повеќе од тука. И сакам да се фати дека идејата со поставување претходно да нула на новиот јазол. И веројатно, ако ми кодот е точен и не постои друг начин да се вметне јазли, освен оваа функција, веројатно, дури и ако веќе има листа еден или повеќе лимфни јазли во него, веројатно листа, првиот јазол, ќе има претходната покажувачот на нула себе. Публика: И само follow-up. Причина што стави покажувачот следната еднаквите Листата е што ги правите на покажувачот пред листата во кои тоа е покажувајќи на следната, претпоставувам - Јас Дон - само Листи? Дејвид Џ MALAN: Токму така. И така ајде да всушност се разгледа два случаи тука, навистина, иако цел ќе ги разгледа не е сосема исто како и код. Но на високо ниво, ако ова претставува листа и ова е 32-битна покажувачот, наједноставниот сценарио е дека ова е нула од стандардните. И претпоставувам дека сакате да го вметнете број 50 беше првиот број. Па ќе одам да се оди напред и да се распределат јазол, кој ќе содржи три области - n, претходниот, а следната. Одам да се стави на бројот 50 тука, бидејќи ова ќе биде н. Ова ќе биде следниот. И тоа ќе биде претходниот. И уште па што да правам во овој случај? Па, јас сум само направено алинеја 1 тука. Покажувачот N добива n. Јас сум да кажат, претходните треба да добие нула. Па ова ќе биде нула. Тогаш јас ќе одам да се каже следното се случува да добиете листа. И тоа само работи добро. Ова е нула. И така сакам да кажам дека, новиот јазол следната поле треба да се добие она што е оваа. Така што става уште еден null таму. А потоа последното нешто Јас направите е да проверите тука. Ако листата не е еднаква на нула, но тоа е еднаква на нула, па ние го прескокнете дека заедно. И така сите да направам следно е листа добива покажувач, што сликовито резултира со слика слично. Па тоа е едно сценарио. И оној што го бараа за конкретно е ваква ситуација, каде што веќе имаат еден јазол листа. И ако се вратам во оригиналната проблем изјава, Следна ние ќе вметнете го кажам е 34, само за доброто на дискусијата. Па ќе одам да се само погодно подготви кои овде. Јас сум само malloced. Ајде да се претпостави Јас сум проверка за ништовни. Сега, јас ќе одам да се иницијализира n да биде 34. И ова ќе биде n. Ова ќе биде следниот. И тоа ќе биде претходниот. Ајде да бидете сигурни дека не направив добие оваа наназад. Претходна прво во дефиницијата. Дозволете ми да го надминете овој. Ова е претходен. Ова е следната. Иако овие се идентични, нека си го задржи доследни. Претходниот. Ова е следната. Па јас сум само malloced мојата забелешка, проверив за ништовни, доделен 34 во јазол. Претходна добива нула. Така што ми дава тоа. Следна добива листа. Па листата е ова. Па ова е исто сега како цртање ова Arrow, така што тие укажуваат на еден во истиот. И тогаш јас сум проверка, ако листа не е еднаква на нула. И тоа не е овој пат. Тогаш јас ќе одам да направите листа претходната добива покажувач. Значи листа претходната добива кон меморија. Па ова има ефект на ставање графички стрелките тука. И тоа е добивање малку брановидна, линиите. И тогаш, на крај, јас се ажурира листа за да се укаже на покажувачот. Па сега ова укажува на ова момче. И сега, ајде да направиме еден брз разумност проверка. Тука е листа, која е на глобалната променлива. Првиот јазол е, всушност, 34, бидејќи Јас сум по стрела. И тоа е точно, бидејќи сакам да вметнување на почетокот од листата сите нови јазли. Неговиот следен поле, ме тера да овој човек. Ако јас Продолжувам да одам, јас хит следната е нула. Па нема повеќе листата. Ако го погоди претходната, да се добие се врати каде што се очекува. Значи се уште има неколку совети, очигледно, да се манипулира. Но, фактот дека ти беше кажано да се направи ова во постојан пат кога ќе значи само имаат ограничен број на работи сте дозволено да се направи. И она што е тој број? Тоа може да биде еден чекор. Тоа може да биде два. Тоа може да биде 1000 чекори. Но тоа е ограничен, што значи дека не може било каков вид на looping случува тука, без рекурзија, нема петелки. Тоа е само што влегов да биде хард-кодирани линии на кодот како што имаме во овој пример. Па следниот проблем 12 побара од нас да заврши спроведувањето на отстранување под на таков начин што ги отстранува n од листата во линеарно време. Па имате малку повеќе шаване соба сега. Може да се претпостави дека N, доколку се присутни во листата, ќе бидат присутни не повеќе од еднаш. И дека премногу е замислена да биде квиз-базирани поедноставување на претпоставката, па дека ако се најде бројот 50 некаде во листата, не направи, исто така мора да се грижите за продолжуваат да iterate, во потрага по сите можни Копија од 50, која само ќе се префрлат во некои minutia во ограничено време. Така е и со отстранат, ова беше дефинитивно поголем предизвик и повеќе кодот да се напише. Но на прв поглед, искрено, тоа би можело изгледа огромна и како нешто не постои начин би можеле да имаат излезе со на квизот. Но, ако ние се фокусира на индивидуалните чекори, се надевам, ќе одеднаш штрајк вас, кои секоја од овие индивидуални чекори прави очигледно смисла во ретроспектива. Па ајде да ги разгледаме. Значи прво, ние се иницијализира покажувачот да биде на листата себе. Затоа што сакам линеарно време, тоа значи дека Одам да имаат некои јамка. И заеднички начин да iterate преку јазли во листа структура или било каков вид на структурата iteratively е да се земе покажувач на предниот дел на податоци структура и тогаш само на проектот ажурирање тоа и одиме вашиот пат преку податочна структура. Па јас ќе одам да направите токму тоа. Додека покажувачот, мојата привремена променлива, не е еднаков на нула, ајде да оди напред и да се провери. Никако не можев да добиете среќа? Е поле n во јазол Јас сум во моментов гледајќи еднаква на број Го барам? И ако е така, ајде да направиме нешто. Сега, забележуваат тоа, ако состојба опкружува целата следниве линии на код. Ова е единственото нешто што можам се грижат за тоа - изнаоѓање на број во прашање. Па нема друг, кој го поедноставува работи концептуално малку. Но сега, сфатив, и вие би можеле да имаат само реализира ова откако размислување преку малку, има всушност два случаи тука. Еден е местото каде што јазол е во почетокот на листата, која е малку досадни, затоа што тоа е посебен случај, бидејќи ќе треба да се справи со оваа работа, што е единствениот аномалија. Секаде на друго место во листата, тоа е иста работа. Има претходната јазол и следната јазол, претходниот јазол, следниот јазол. Но, овој човек е малку посебна ако тој е на почетокот. Па ако покажувачот еднаква на листа себе, па ако сум на почетокот на листата и сум ги нашол n, ми треба да се направи неколку работи. Еден, јас треба да се промени листа за да укажуваат на следното поле, 50. Па претпоставувам дека јас се обидувам да се отстрани 34. Па овој човек мора да оди далеку во само еден миг. Па ќе одам да се каже, листа добива покажувачот следната. Па, ова е покажувач. Следна е да се покажува овде. Значи ова се менува овој стрелките право сега да се укаже на овој човек тука. Сега, сетете се, имаме привремена променлива. Па не сме сираче било јазли, бидејќи исто така имам овој човек во мојата имплементација на отстранување. Па сега, ако листата по себе не е нула, Јас треба да се поправи малку нешто. Ми треба сега да бидете сигурни дека ова стрела, кој е претходно укажува 50-34, ова мора да си оди, бидејќи ако јас се обидувам да се ослободи на 34, 50 имале подобро да не се одржи било вид на back однос на тоа како стрелка предложи. Па јас само направив оваа линија. Па тогаш сум се направи. Тој случај е всушност прилично лесно. Секое отсечено чело на листата е релативно јасна. За жал, не е тоа досадни друго блок. Па сега, морам да го разгледа случајот каде што има нешто во средината. Но тоа не е премногу страшно, освен за синтакса како оваа. Значи, ако јас не сум на почетокот на листа, јас сум некаде во средината. И оваа линија тука е велејќи дека, почетокот на она што јазол сте во. Оди до следното поле претходната јазол и точка дека на покажувачот. Да го направиме ова сликовито. Тоа беше добивање комплицирано. Па ако имам претходната полиња тука - ајде да го сторат тоа - следната полиња тука. Одам да се поедностави мојот совети, а од нацрта цела група на работите и назад crisscrossing едни со други. И сега, да речеме ова е 1, 2, 3 за доброто на дискусијата, дури и иако тоа не се редат со проблемот е во прашање. Па овде е мојата поврзана листа. Јас се обидувам да се отстрани два во овој особено верзија на приказната. Па јас нема покажувач на се укажува на овој човек. Значи ова е кон меморија. Тој покажува тука. Ова е листа, која постои на глобално ниво како порано. И тој е покажувајќи тука, без разлика што. И сега, јас се обидувам да се отстрани два. Па ако покажувачот е да се покажува тука, јас сум ќе следат, очигледно, претходната покажувач, што ме става во 1. Јас сум тогаш случува да се каже дека следната поле, што ме доведува во текот на оваа кутија тука, се случува да се еднакви покажувачот следната. Значи, ако овој покажувач, ова е следната. Тоа значи дека овој стрелките потреби да се укаже на овој човек. Па што таа линија на кодот има само направи е малку од ова. И сега, ова е гледа како чекор во вистинската насока. Ние во суштина сакаат да режа 2 од на средината на 1 и 3. Па тоа го прави смисла дека ние сакаме да пат овој покажувач околу неа. Значи ова следната линија е проверка ако покажувачот Следниот не е нула, има навистина некој на правото на 2, тоа значи дека ние, исто така, треба да се направи малку парченце тука. Па јас сега треба да го следат овој покажувач и ажурирање на претходните покажувачот на овој човек да се направи малку на заобиколи тука поентата тука. И сега, визуелно ова е убаво. Тоа е малку неуредна во кои има никој посочувајќи на 2 повеќе. 2 е да се покажува кон лево. И 2 е да се покажува кон десно. Но тој може да направи она што тој сака, затоа што тој е за да се ослободи. И тоа не е важно она што тие вредности се веќе. Она што е важно е дека останатите момци се рутирање над и под него сега. И навистина, тоа е она што го правиме понатаму. Ние слободен покажувач, што значи дека ние ја каже оперативен систем, вие сте добредојдени да бараат враќање на тоа. А потоа на крај, ние се вратат. Друго имплицитно, ако ние се уште не се вратени, ние мора да ги бараме. Па покажувачот еднаква на покажувачот следната само значи се движат овој човек тука. Се движат овој човек тука. Се движат овој човек тука ако, всушност, ние не се најде бројот ние сме во потрага по уште. Па искрено, тоа изгледа сосема големо, мислам, во прво поглед, особено ако се бореше со ова во текот на квизот потоа види нешто како ова. А ти си туп на грбот. Па, не постои начин би можел да има излезе со дека на квизот. Но јас би рекол, можете да ако се скрши го надолу во овие индивидуални случаи и само оди преку неа внимателно, иако, очигледно, под стресни околности. За среќа, сликата направена сè што посреќни. Вие би можеле да се подготви овој во било кој број на начини. Вие не треба да го стори crisscrossing нешто овде. Вие би можеле да го направи тоа со директно линии вака. Но главното обележје на овој проблем, во Генерално, беше да се сфати дека слика на крајот треба да се погледне малку нешто како ова, бидејќи постојана време се подразбира дека ќе ги задржи притискање и притискање и притискање на нови јазли на почетокот на листата. Било какви прашања? Веројатно најголемиот предизвик на сигурно кодирање прашања. Публика: Така е листа слични на главата во претходните примери. Дејвид Џ MALAN: Точно, точно. Само друго име за глобална променлива. Ширум светот што? Роб BOWDEN: OK. Значи ова е една, каде што мораше да напише став. Некои луѓе напиша есеи за ова прашање. Но вие само треба да ги користат овие шест услови за да се опише она што се случува кога ќе се обидат да се поврзеш facebook.com. Па јас само ќе разговара во текот на процесот користење на сите овие термини. Па во нашата интернет пребарувач, ние тип facebook.com и притиснете Enter. Значи нашата интернет пребарувач се случува да се изгради HTTP барање дека тоа се случува да се испрати преку некој процес на Facebook за Фејсбук за да одговори на нас со HTML кодот на својата страница. Значи она што е процес со кој HTTP барање всушност добива на Facebook? Значи прво, ние треба да се преведе Facebook.com. Па само дадено името Facebook.com, каде што всушност го прави HTTP барање треба да се оди? Значи ние треба да се преведе Facebook.com до IP адресата, која уникатно се идентификува она што машина ние всушност сакате да ја пратите оваа барање до. Вашиот лаптоп има IP адреса. Нешто поврзано со интернет има IP адреса. Па DNS, Domain Name System, кој е она што се случува да се справи со превод од facebook.com за да се IP адресата, кој вие всушност сакате да го контактирате. Па ние се поврзеш со DNS серверите и да речеме, што е facebook.com? Таа вели дека, ох, тоа е IP адреса 190,212 нешто, нешто, нешто. Во ред е. Сега, знам што машина Сакам да се јавите. Па тогаш ќе ја испратите вашата HTTP барање во текот на таа машина. Па, како тоа дојде до таа машина? Па, на барање оди од рутер да рутер бие. Се сеќавам на пример во класа, каде што бевме сведоци на пат дека пакети зеде кога се обидовме да се комуницира. Видовме тоа скокаат над Атлантикот Океанот во еден момент или whatever. Па на последниот мандат порта. Значи ова е сега на вашиот компјутер. Можете да имате повеќе работи во моментов комуникација со интернет. За да можам да се работи, да речеме, Skype. Јас би можеле да имаат веб-пребарувач е отворен. Јас би можеле да имаат нешто што torrenting датотеки. Значи сите овие нешта се комуникација со интернет на некој начин. Значи, кога вашиот компјутер добива некои податоци од интернет, како тоа го прави знаете што апликација всушност сака на податоци? Како не го знае дали овој податоци е наменета за torrenting пријавата што е спротивно на веб прелистувач? Значи ова е целта на пристаништа во кои сите овие апликации имаат тврди порта на вашиот компјутер. Така да твојот веб пребарувач вели, еј, Јас сум слуша на порта 1000. И вашиот torrenting програма е велејќи дека, Јас сум слуша на порта 3000. И Skype вели, јас сум користење пристаниште 4000. Па кога ќе добие некои податоци што му припаѓа на еден од овие апликации, податоци е означена со кој порт тоа всушност треба да бидат испратени заедно да. Значи ова вели, ох, јас припаѓам да пристаниште 1000. Знам тогаш јас треба да го проследи ова заедно со мојот веб прелистувач. Значи причината тоа е релевантно тука е дека на веб сервери, имаат тенденција да се слушате на порта 80. Па кога ќе се јавите Facebook.com, јас сум комуникација со некои машина. Но јас треба да се каже кој порт на кој машина Сакам да комуницира со. И веб сервери имаат тенденција да бидат слушање на порта 80. Ако сакаат, тие би можеле да го постави така што наведува како на порта 7000. А потоа во веб прелистувачот, можев рачен тип Facebook.com: 7000 испрати барање до пристаништето 7000 на Фејсбук веб серверот. Дејвид Џ MALAN: И во овој случај, дури и иако ние не бара луѓе се спомене и тоа, во овој случај, на која порта би барање всушност, оди на? Обидете се повторно. Токму така. Не барам за тоа, но суптилноста дека е таму никој последен. Роб BOWDEN: Значи HTTPS, бидејќи тоа е слушање специјално за шифрирана, тоа е на порта 4430. Публика: и пораки се 25, нели? Дејвид Џ MALAN: Излезни пораки, 25, Да. Роб BOWDEN: Јас дури и не знаат повеќето од на - сите на долниот оние со тенденција да биде резервирана за нештата. Мислам дека сè под 1024 е резервирана. ПУБЛИКАТА: Зошто рековте 3 е погрешен број? Роб BOWDEN: Бидејќи во IP адреса, има четири групации на цифри. И тие се 0-255. Па 192.168.2.1 е заеднички локалната мрежа IP адреса. Забележите и сите од нив се помалку од 255. Па кога почнав со 300, што не може да можеби имаат е еден од броеви. Дејвид Џ MALAN: Но, тоа глупо клип од - тоа беше CSI, каде што имаше број што беше премногу голем за IP адреса. Роб BOWDEN: Било какви прашања за тоа? Следниот, па целосна промена во тема, но ние имаме овој PHP низа за куќи во четири. И ние имаме неподреден список. И ние сакаме да испечатите секој елемент од листата само што содржи името на куќата. Па ние имаме foreach циклусот. Значи се сеќавам, синтаксата е foreach низа како ставка во низа. Па преку секоја повторување на јамка, куќа се случува да се земе на една од вредности во внатрешноста на низата. На првиот повторување, куќа ќе биде Кабот куќа. На втората итерација, куќа ќе биде Куриерски Дом и така натаму. Значи за секој quad како куќа, ние сме само ќе се печати - Можете исто така би можеле да имаат повтори - на елемент во листата, а потоа името на куќата а потоа ја затвори елемент во листата. На тркалезните загради се опционални тука. А потоа ние, исто така, рече дека во прашање себе, не заборавајте да се затвори неподреден список таг. Значи ние треба да излезете PHP на владата со цел да го направите тоа. Или би можеле да се повтори затвори неподреден список таг. Дејвид Џ MALAN: Исто така во ред тука ќе да се да се користи старата школа за јамка со $ i = 0 0 и користење точки да дознаам должината на зраци. Целосно во ред, само малку wordier. Публика: Значи, ако си одеше да [Нечујни], ќе се направи - Го заборавам она јамка [нечујни] е. Ќе ви $ quad заградата јас? Дејвид Џ MALAN: Токму така. Да, точно. Роб BOWDEN: Нешто друго? Дејвид Џ MALAN: Во ред. Размени. Па имаше гроздовете на одговори можно за секоја од нив. Ние бевме навистина само барате нешто релевантни за главата и недостатоци. И бројот 16 прашав, проверување на корисниците влез клиент-страна, како со JavaScript, наместо на страна на серверот, како и со PHP. Значи она што е наопаку на прави клиент-страна? Па, една од работите што предлага е дека ќе се намали латентност, затоа што не мора да се мачат да се јавите на серверот, која може да потрае неколку милисекунди или дури неколку секунди преку избегнување тоа и само потврдување на корисниците влез клиентот-страна од активира он-достават управувачот и само проверка, дали тие тип нешто за името? Дали тие напишеш нешто во за е-мејл адреса? Дали тие избираат дом од опаѓачкото мени? Можете да ги даде моментален фидбек со користење на гигахерците компјутер или што и тие го имаат тоа е всушност на нивната маса. Па тоа е само подобро корисничко искуство обично. Но недостатоци на тоа клиент-страна валидација, ако го направи тоа без, исто така, прави од страна на серверот валидација е дека повеќето никого излегува од CS50 знае дека само може да испрати било податоци што сакате на сервер кој било број на начини. Искрено, во повеќето секој интернет пребарувач, можете да кликнете наоколу во подесувањата и само исклучи го вклучите Javascript, која би, Затоа, се оневозможи било каква форма на валидација. Но вие исто така може да се сети дека дури и јас не некои arcane работи во класа користење телнет и всушност преправајќи се биде прелистувачот со испраќање добие барања до серверот. И тоа е, секако, не користење на било кој вклучите Javascript-. Тоа е само мене пишување команди на тастатурата. Значи, навистина, секој програмер во рамките доволно удобност со веб и HTTP може да се испрати сите податоци тој или таа сака на серверот без валидација. И ако вашиот сервер не е, исто така, проверка, не тие ми даде името, е ова всушност валидна емаил адреса, дали тие избираат дом, може да заврши до вметнување лажни или само празни податоци во вашата база на податоци, која, најверојатно, нема да биде добра работа, ако сте биле под претпоставка дека тоа беше таму. Па ова е досадно реалност. Но, во принцип, клиент-страна валидација е одлично. Но тоа значи двојно повеќе работа. Иако таму постојат различни библиотеки, го вклучите Javascript-библиотеки за пример, кои го прават тоа многу, многу помалку од главоболка. И можете да повторна употреба на некои од кодот од страна на серверот, клиентот-страна. Но не сфаќаат дека тоа е типично дополнителна работа. Да. Публика: Значи, ако ние само рече помалку безбеден - Дејвид Џ MALAN: [се смее] Ugh. Тие се секогаш толку потешко од нив да се судат. Роб BOWDEN: Тоа би биле прифатени. Дејвид Џ MALAN: Што? Роб BOWDEN: Јас создаде овој проблем. Кои би биле прифатени. Дејвид Џ MALAN: Да. ПУБЛИКАТА: Кул. Роб BOWDEN: Но, ние не го прифати за првиот - добро, она што ние баравме е нешто како не треба да се комуницира со серверот. Ние не го прифати само побрзо. Публика: Што е со не ја превчитате страница? Роб BOWDEN: Да. Тоа беше прифатен одговор. Дејвид Џ MALAN: ништо, каде што се чувствува тоа е поверојатно отколку не, најверојатно, дека ти знаеше што сте биле велејќи, која е тешка линија за да се подготви понекогаш. Користење на поврзана листа, наместо на низа да се одржи Подредена листа на цели броеви. Па наопаку, ние често се цитираат со поврзани листи кои ги мотивираше нивните целата Воведувањето беше добиете динамика. Тие може да расте. Тие може да се намали. Значи, вие не треба да скокаат преку карики за да всушност се создаде повеќе меморија со низа. Или не треба да се само велат, извинете, корисникот. Низата е исполнет. Па динамичен раст на листата. А недостатоци иако на поврзани листи? ПУБЛИКАТА: Тоа е линеарна. Пребарување на поврзана листа е линеарна наместо на она што ќе се логирам Дејвид Џ MALAN: Токму така. Пребарување на поврзана листа е линеарна, дури и ако тоа е сортирана, затоа што може само следете ги овие трошки од леб, овие совети, од почетокот на листата до крај. Вие не може да потпора случаен пристап и, Така, бинарни пребарување, дури и ако тоа е подредени, дека можете да направи со низа. И таму е исто така уште еден трошок. Да. ПУБЛИКАТА: Меморија неефикасна? Дејвид Џ MALAN: Да. Па, јас не би нужно велат неефикасни. Но тоа не ве чини повеќе меморија, затоа што треба 32 бита за секој јазол за дополнителни покажувач, во барем за одделно поврзана листа. Сега, ако сте само чување на цели броеви и сте додавање на покажувачот, тоа е всушност вид на не-тривијални. Тоа е удвојување на износот на меморија. Но, во реалноста, ако сте чување на поврзани листа на structs дека би можеле да имаат 8 бајти, 16 бајти, па дури и повеќе Освен тоа, можеби е помалку на маргиналните трошоци. Но тоа е цената сеедно. Значи, која било од тие ќе си е парична казна како негативни страни. 18. Користење на PHP, наместо Ц за да напишете командната линија програма. Па еве, тоа е често побрзо да се користи јазик како PHP или Ruby или Пајтон. Вие само брзо отворање до уредувач на текст. Имаш многу повеќе функции достапни за вас. PHP има кујна со мијалник на функции, додека во Ц, имаат многу, многу малку. Всушност, момци знаат на потешкиот начин дека немате хеш табели. Вие не се поврзани листи. Ако сакате оние, што треба да ги имплементира себе. Така што едно главата на PHP или навистина било толкува јазик е брзината со кој можете да се напише кодот. Но недостатоци, видовме ова кога ќе се брзо крави до misspeller имплементација во предавање користење на PHP, е дека со користење на толкува јазик обично побавно. И видовме дека очигледно со се зголеми во време од 0,3 секунди за да 3 секунди, бидејќи на толкување кои, всушност, се случува. Друга главата е во тоа што не мора да се компајлира. Па затоа, исто така, го забрзува развојот патем, затоа што немаат два чекори за водење на програма. Вие само треба еден. И така тоа е доста релевантни, како и. Користење на SQL база на податоци, наместо на CSV датотека за складирање на податоци. Па SQL база на податоци се користи за pset7. CSV датотеки не сте го користите многу. Но го користи посредно во pset7 како и од разговорот со Јаху финансии. Но CSV е исто како една датотека Excel, но супер едноставен, каде што колони се само demarked со запирки во внатрешноста на инаку текстуална датотека. И со помош на SQL база на податоци е малку повеќе привлечни. Тоа е главата, затоа што се работи како да изберете и вметнување и бришење. И ќе добиете, веројатно, индекси кои MySQL и други бази на податоци, како Oracle, се изгради за вас во меморија, која значи дека вашиот изберете веројатно не е ќе биде линеарна врвот до дното. Тоа е всушност ќе биде нешто како бинарен за пребарување или нешто слични во духот. Па тие се генерално побрзо. Но Недостатоци е тоа што тоа е само повеќе работа. Тоа е повеќе напор. Мора да се разбере бази на податоци. Што треба да го постави. Ви треба сервер да се кандидира таа база на податоци за. Треба да се разбере Како да го конфигурирате. Значи овие се само овие видови на размени. Додека CSV датотека, можете да создаде со gedit. И вие ќе бидете добро да отидевме. Нема комплексноста подалеку од тоа. Користење на TRIE наместо на хеш табелата со посебен врзувањето да се складира речник на зборови потсетува на pset5. Па се обидува со главата, во теорија барем, е она? Постојана време, барем ако сте hashing на секоја од поединечните букви во еден збор, како тебе би можеле да имаат за pset5. Тоа може да биде пет хашови, шест хашови ако има пет или шест букви во зборот. И тоа е прилично добар. И ако има горна граница за тоа како долго твоите зборови може да биде, тоа е навистина асимптоматично постојана време. Со оглед на тоа хеш табелата со посебни врзувањето, проблемот постои со тоа вид на податоци структура е дека ефикасноста на вашиот алгоритми обично зависи од бројот на нештата веќе во податочна структура. И тоа е дефинитивно случај со синџири, при што повеќе работи се стави во хеш табелата, толку подолго оние синџири одат, што значи во најлош случај, нешто што може да се бара е целиот пат на крајот на една на оние синџири, кои ефикасно devolves во нешто линеарна. Сега, во пракса, тоа би можело апсолутно да биде случај дека хаш табелата со синџири е побрз од соодветните TRIE имплементација. Но тоа е поради различни причини, меѓу кои се обидува користат едночудо меморија која може, всушност, бавен работи надолу, затоа што не се добие убав придобивките од нешто што се нарекува кеширање, каде работите кои се блиску еден до друг во меморијата може да се пристапи често побрзо. А понекогаш може да излезе со навистина добра хеш функција. Дури и ако имате да потроши малку меморија, може да, навистина, да биде во можност да најдат работи брзо и не толку лоша како линеарно. Значи во кратки, не беше неопходно со било кој од овие еден или дури и две специфични работи што го барате. Навистина ништо убедлив како главата и недостатоци Општо земено фатени нашето око. Роб BOWDEN: Значи за главата, ние го сторивме не го прифати за свој "побрзо". Можете имаше да каже нешто околу тоа. Дури и ако рече теоретски побрзо, знаевме дека сте вид на разбрана дека е 0 од 1. И хаш табелата, во теорија, не е 0 од 1. Се спомне нешто за траење Општо земено имаш поени. Но, "побрзо", повеќето решенија за на големите одбор, кои беа обиди беа објективно побавно отколку решенија кои беа хеш табели. Толку побрзо во себе и за себе не е навистина точно. Дејвид Џ MALAN: Дом де ДОМ ДОМ. Јас сум веројатно единствениот кој сфаќа тоа е како што би требало да се изрече, нели? Роб BOWDEN: Имав всушност немаат идеја. Дејвид Џ MALAN: Тоа го направи смисла во мојата глава. Роб BOWDEN: Јас го правам ова. OK. Значи ова е една, каде што имаше да се подготви дијаграмот слични на вас може видовме на минатото испити. Па да се погледне на овој. Па од HTML јазол, имаме две деца, главата и телото. Па ние гранка - главата и телото. На главата има наслов таг. Па ние имаме титула. Сега, една работа многу луѓе заборавив е дека овие текстуални јазли се елементи во рамките на ова дрво. Па еве ние се случи да ги привлече како ovals да се разликуваат од овие видови на јазли. Но известување, исто така, тука имаме врвот, средината и дното ќе завршат да бидат текст јазли. Па заборавам беше малку на честа грешка. Телото има три деца - овие три Divs. Па div, div, div, а потоа текстот јазол деца од оние Divs. Тоа е доста тоа за тоа прашања. Дејвид Џ MALAN: И тоа е вреди да се напомене, иако ние не се задржиме на овие детали во време трошиме на JavaScript, дека наредбата не, во Всушност, прашање технички. Значи, ако главата доаѓа пред телото во HTML, тогаш тоа треба да се појави на лево од телото во конкретната ДОМ. Дека неговата е, воопшто, само Материјал цел, нешто што се нарекува документот ред, каде што тоа не е важно. И ако сте биле спроведување на парсер, програма која го чита HTML во зграда до дрвото во меморијата, да бидам искрен, тоа е интуитивно веројатно она што го направи секој случај - врвот до дното, лево кон десно. Роб BOWDEN: Прашања за тоа? Треба да направам следниот? Дејвид Џ MALAN: Секако. Роб BOWDEN: OK. Значи ова е тампон превишаването напад прашање. Главната работа е да се препознае тука е, Па, како би можеле да противник трик оваа програма во извршување арбитрарен код? Па argv1, првиот командната линија аргумент на оваа програма, која може да биде произволно долго. Но тука ние сме со користење memcpy да го копирате argv1, која тука е бар. Ние сме го поминува како аргумент. И така тоа е преземање на бар име. Па ние сме memcpying бар во оваа тампон в. Колку бајти сме копирање? Па сепак многу бајти бар се случува да биде со користење, должината на тој аргумент. Но в е само 12 бајти широк. Значи, ако ние напишете командата тоа е подолг од 12 бајти, ние сме ќе претекување овој особено тампон. Сега, како би можеле да противник трик на програма во извршување на произволен код? Па се сеќавам дека тука Главната повикува foo. И така, тогаш главната повици foo. Ајде да се подготви овој. Па ние имаме оџак. И главните има магацинот рамка на дното. Во одреден момент, главни повици foo. Добро, веднаш, главни повици foo. И така foo добива свој магацинот рамка. Сега, во одреден момент, foo се случува да се вратат. И отиде foo се враќа, треба да знаеме на што линија код во внатрешноста на главниот ние беа со цел да се знае каде ние треба да продолжат во главната. Можеме да го наречеме foo од цела куп на различни места. Како да знаеме каде да се вратат? Па, ние треба да ги чувате дека некаде. Значи некаде во право околу тука, ние да се сместат каде што треба да се врати за уште foo враќа. И ова е враќање адреса. Па како противник би можеле да ги искористат предностите за ова е фактот дека овој тампон в е зачувана, ајде да велат, токму тука е в. Значи имаме 12 бајти за в. Ова е в. И ова е оџакот прстен foo е. Значи, ако злонамерен корисник влегува повеќе бајти од 12 или внесете ја командата линија аргумент дека е подолг од 12 карактери, тогаш ние ќе треба да претекување оваа тампон. Ние можеме да продолжувам да одам. И во одреден момент, ние одиме далеку доволно е што ние почнат пребрише ова враќање адреса. Значи еднаш сме ја пребришете враќање адреса, тоа значи дека кога foo се враќа, ние сме се врати на секаде каде што злонамерен корисник е тоа го кажувам за да од страна на она што вредност се влезе, со какви било карактери на корисникот внесе. И така ако злонамерен корисник е да се биде особено умен, тој може да ја имаат оваа се вратат во некаде во printDef функција или некаде во Примерок функција, само насекаде произволни. Но, дури и попаметниот е што ако тој има корисникот врати во право тука. А потоа ќе почнете извршување овие како линии на код. Значи во тој момент, корисникот може да влезе она што тој сака во овој регион. И тој има целосна контрола над вашата програма. Прашања во врска со тоа? Па следното прашање е завршена reimplementation на foo на таков начин дека тоа е веќе ранливи. Значи има неколку начини би можеле да имаат направено ова. Ние се уште имаат в само се должина 12. Вие би можеле да се промени оваа како дел од вашиот решение. Ние, исто така, додаде проверка за да бидете сигурни бар не беше нула. Покрај тоа што не треба дека за целосна кредитна. Па ние сме проверка првиот стринг должина на бар. Ако тоа е поголема од 12, а потоа всушност не копија. Значи тоа е еден начин на одредување неа. Друг начин на одредување на тоа е наместо има в само да биде со должина од 12, ја имаат биде со должина од strlen (лента). Друг начин на одредување на тоа е за да всушност само се вратат. Значи, ако сте имале само добиле ослободи од сите ова, ако сте имале само избришани сите линии на код, што би добиле целосна кредитна, бидејќи оваа функција всушност не се постигне ништо. Тоа е копирање на командната линија аргумент во некои низа во нејзините локални магацинот рамка. А потоа нешто се враќа. И што и да оствари е нема. Па враќање исто така беше доволно начин на добивање целосна кредитна. Дејвид Џ MALAN: Не сосема во духот на прашање, но прифатливо за на спецификации сеедно. Роб BOWDEN: Прашања на која било од тоа? Едно нешто што ти барем потребни за да се составувањето код. Па дури иако технички не сте ранливи ако вашиот код не состави, ние не го прифати тоа. Без прашања? OK. Дејвид Џ MALAN: Дали сакате да се каже овој наслов? Роб BOWDEN: Не Дејвид Џ MALAN: Значи во овој, овој беше или добра вест или лоша вест. Ова е буквално истиот проблем како на првиот квиз. И тоа е речиси ист проблем како pset1. Но тоа беше намерно поедноставен за да биде поедноставен пирамида, која може да биде реши со малку поедноставно повторување. И навистина, она што се добива на тука не беше толку логика, бидејќи веројатно, од оваа точка, ти си поудобно отколку што беа во една недела со за петелки или зошто петелки, но навистина да ги разграничат дека си малку удобно со Идејата дека PHP не е само за тоа што програмирање. Тоа всушност може да се користи како јазик да се напише командната линија програми. И навистина, тоа е она што ние се обидувавме да привлече вашето внимание на. Ова е командната линија PHP програма. Па C код овде, додека точниот во C, не се поправи за PHP. Но го кодот навистина е иста. Ако се споредат решенија за одбивање 0 против Квиз 1, ќе најдете дека тоа е речиси идентични, освен за некои доларот знаци и за отсуство на тип на податоци. Особено, ако ги погледнеме тука, ќе видите дека ние iterate, во овој случај, од 1 до преку 7. Ние може да го направи 0 индекс. Но, понекогаш, мислам дека тоа е само ментално полесно да размислувам за нешта од 1 до 7. Ако сакате еден блок, а потоа два блокови, а потоа три, а потоа точка, точка, точка седум. Ние сме ѕ се иницијализиран на 1 а потоа смета на до i. И тука сè е инаку идентични. Но достоен за ум се неколку работи. Ние ви даде овие две линии, првата еден, goofily именуван како shebang за остар тресок. И дека само одредува патот, папка, во која програма може да биде покажа дека сакате да го користите да го протолкува оваа датотека. А потоа линијата после тоа, на Се разбира, значи влезе PHP на владата. И линијата на самото дно значи излез PHP на владата. И тоа функционира, во целина, со толкува јазици. Тоа е вид на досадни, ако ти напишам Програмата во датотека наречена foo.php. А потоа вашата корисниците имаат само се сеќавам, во ред, да ја извршите оваа програма, јас треба да напишете "PHP простор foo.php." Вид на досадни, ако ништо друго. И тоа, исто така, открива дека вашата програма е напишана во PHP, што не е за сите дека осветлуваат за корисникот. Па може да се отстрани. PHP целосно потсетиме од предавање. И навистина може да се направи. / Foo ако сте го chmodded со тоа што извршна. Па chmod a + x foo би го сторил тоа. И ако вие исто така да додадете на shebang тука. Но, навистина, проблемот е добивање на печатење нешто како ова. Без HTML, без C-кодот, секако, само некои PHP. Па Мило а потоа се врати во проблем 25. И во 25, ќе се даде следниве скелет код, што беше прилично едноставна веб-страница. И сочни дел HTML-мудар беше долу тука, каде што имаме внатрешноста на телото форма која има уникатен ID на влезови внатрешноста на кој беше два влеза, еден со идеја за името, еден со идеја на копче. Првиот беше тип текст, Вториот тип поднесе. И така ние ви даде, всушност, повеќе состојки отколку што е потребно, само така вие момци имаше опции со кои за решавање на овој проблем. Вие не треба строго сите овие ИД. Но тоа ви овозможува да ги реши тоа на различни начини. И на врвот, забележи дека целта е да се активира прозорец вака - Здраво, Мило! - да pop-up во прелистувачот користење супер едноставен, ако не грда, алармирање функција. И така, во крајна линија, тоа се сведува концептуално некако да слуша за поднесоци од формата клиент-страна , А не од страна на серверот, некако одговарајќи на кој поднесување од страна грабање вредноста што корисникот внесе во полето за име, а потоа прикажување на тоа во телото на алармирање. Значи еден од начините можете да го направите ова е со jQuery, кој изгледа малку синтаксички тежок на прв. Можете да го направите ова со чиста ДОМ код - document.getelement од проект. Но, ајде да ги разгледаме во оваа верзија. Имам неколку важна линии во прв план. Значи еден, имаме оваа линија, која е идентични со она што може да се види во, верувам, form2.html од класа во 9 недела. И ова е само велејќи, извршување го следниов код кога документот е подготвен. Ова се важни само затоа што HTML страници се читаат врвот до дното, лево кон десно. И затоа, ако се обидете да го направите нешто во кодот тука некои ДОМ елемент, некои HTML таг, тоа е надолу тука, сте го прави тоа прерано, бидејќи тоа има дури и не се прочита во меморијата. Значи со ова го зборувам document.ready линија, ние велиме, еве некои код, прелистувачот. Но, не ја изврши оваа додека целата документот е подготвен, тоа е ДОМ дрво постои во меморија. Оваа една е малку повеќе јасна, ако синтаксички на малку различни, каде што јас велам, го дофати елементот на HTML, чија единствена идентификатор е влезови. Тоа е она што на хаш таг означува, единствен проект. А потоа јас го повикувам. Поднесе. Тоа. Праќајте овде е функција, инаку познат како метод, тоа е внатрешноста на објектот на левата рака страна има дека јас не се потенцира. Значи, ако мислите на инпутите како објект во меморија - и навистина е тоа. Тоа е јазол на дрво - . Поднесат средства кога овој формулар со овој проект е поднесен, извршување следниве код. Не ми е гајле што името на функција е јас сум извршување. Па еве јас сум со користење, како и досега, она што е наречен ламбда функција или анонимен функција. Тоа не е воопшто интелектуално Интересно освен тоа нема име, што е во ред ако сте само некогаш ќе го нарекуваат еднаш. И во внатрешноста таму всушност се справи со поднесување на формуларот. Јас прв пат декларирате променлива наречен вредност. И тогаш што е ефект на овој Нагласени дел тука сега? Што значи дека го прават на високо ниво за мене? Публика: Станува вредноста што корисникот не во HTML подолу. Станува тој проект, а потоа добива вредноста на неа. Дејвид Џ MALAN: Токму така. Тоа зграпчува јазол, чија единствена идентификатор е името. Станува вредноста него, која е, веројатно, она што корисникот отчукува него или себе си. И тогаш тоа продавници кои во променлива наречена вредност. Како настрана, би можеле да имаат, исто така, направиле ова малку поинаку. Сосема прифатлива правејќи нешто лага var вредност добива document.getElementById. И ова е причината зошто тоа е малку досадни да не ги користат jQuery. "Името". Вредност. Па сосема прифатлива. Различни начини да го направите тоа. jQuery само има тенденција да биде малку повеќе содржаен и дефинитивно повеќе популарни меѓу програмери. Сега, јас сум прави малку здрав разум провери, бидејќи во проблемот изјава ние експлицитно рече, ако корисникот сеуште не внесе неговото или нејзиното името, не покажуваат сигнали. Но, можете да се провери за што, со само проверка за празен стринг за Цитат-unquote ако има всушност ништо не постои. Но, ако тоа не е еднаква на понуда-unquote, Сакам да се јавам сигнали. И интересна дел овде е дека ние сме со користење на плус оператор, кој што прави во вклучите Javascript-? CONCATENATE. Па тоа е како Phps точка оператор. Истата идеја, малку поинаков синтакса. И јас сум само создавање на стринг кој те видов на екранот - Здраво, така и така. А потоа последниот детал е ова. Зошто се врати лажни внатре на овој анонимен функција? Публика: Нема вредност. Ќе го стави во форма. Тоа само вели, ако вредноста не е еднаков на празно, тогаш направете го тоа. Имаше празни во тој поднесување. Дејвид Џ MALAN: OK. Внимателно иако. Нема никој друг тука. И дека враќањето лажни е надвор на ако услови. Значи ова истакна линија, враќање false, извршува без разлика што кога форма се доставува. Што значи враќање лажни внатрешноста на оваа ракувачот со настани, како што се вика, настанот во прашање се поднесување? ПУБЛИКАТА: Поради тоа што се случува само еднаш. Дејвид Џ MALAN: се случува само еднаш. Не сосема. Да? Публика: Тоа го спречува форма од потчинува на стандардно однесување, која ќе го направи страница Вчитај ја страната повторно. Дејвид Џ MALAN: Токму така. Па јас сум преоптоварување терминот достават тука, бидејќи јас велам, формата е се поднесува. Но како што укажуваат, тоа е, всушност, не се поднесени во вистинска HTTP начин. Кога ќе кликнете на Прати, бидејќи на нашите onSubmit управувачот, ние сме зграпчување таа форма поднесување така да се каже. Ние сме тогаш прави нашата работа со JavaScript код. Но јас сум намерно се враќа лажни, затоа што јас не сакам да се случи секундата подоцна е за целото форма себе да се достават до веб сервер со клучните вредност парови со промена на URL-то да биде нешто како q = мачки или што ние го сторивме, на пример, во класата. Не сакам тоа да се случи, затоа што не постои на серверот слушање на оваа форма поднесување. Тоа е чисто направено во JavaScript код. И тоа е причината зошто јас дури и не мора на акција атрибут на мојата форма, затоа што не планираат за тоа да некогаш одат на серверот. Така, тоа е се поднесува. Но, ние сме зграпчување таа форма поднесување и спречување на стандардниот однесување, што е всушност одат сите на патот до серверот. ПУБЛИКАТА: Значи тоа имајќи клиент-страна. Дејвид Џ MALAN: Одржување тоа клиент-страна. Точно во право. Потоа ми беше ох MySQL. Роб BOWDEN: OK. Значи ова прво прашање беше генерално груб за луѓе. Иако подоцна оние отиде подобро. Па ти мораше да се избере точниот податоци типови за двете од овие столбови. И двете од овие имаат некои работи за нив, кои направи избор тешко. Па int не беше валиден тип за број. Причината е во тоа 12-цифрен сметка број, со int не е доволно голема за да се складирање на вкупно цифри. Па валидна избор би бил голем int ако се случи да знаете дека. Друг избор би можело да се на знак областа на должина 12. Значи, која било од тие би работеле. Int не би. Сега, рамнотежа, се сетам на pset7. Значи ние специјално се користат децимална до чување на вредноста на акциите или - Дејвид Џ MALAN: Кеш. Роб BOWDEN: Кеш. Ние се користат децимална за чување на износот на готово дека корисникот моментов има. Па причина ние го направите тоа е затоа, се сеќавам, лебди. Има подвижна запирка во прецизноста. Тоа не може прецизно да се сместат на пари вредности како што сакаме овде. Па децимална е во состојба прецизно да продавница нешто, да речеме, две децимални места. Тоа е зошто рамнотежа, што сакаме ние да биде децимална и не лебдат. Дејвид Џ MALAN: И, исто така, исто така, иако тоа би можело да се паметни во други контексти да се размислува, можеби ова е шанса за Инт. Јас само ќе ги пратите на работи во пени. Затоа што експлицитно му покажа стандардно вредноста на се 100.00, што значи тоа само може да биде Инт. И уште суптилност премногу со број беше во тоа што не требаше да биде трик прашање. Но се потсетиме дека int во MySQL, како во C, барем во апаратот, е 32-битна. И иако ние не ќе очекуваат да знаат точно колку бројки кои средства, се сеќавам дека најголемиот број можете да ја претставува потенцијално со 32-битен број е околу што? Она што бројот ние секогаш велат? 2 до 32, кое е што околу? Вие не треба да се знае точно. Но, грубо е корисен во животот. Тоа е околу 4 милијарди долари. Па ние рековме дека неколку пати. Знам дека велат дека неколку пати. И тоа е околу 4 милијарди долари. И тоа е добро правило на палецот да знаеш. Ако имате 8 бита, 256 е магичната бројка. Ако имате 32 бита, 4 милијарди се дава или зема. Значи, ако само ги запишувам 4 милијарди долари, ќе видите дека тоа е помалку цифри од 12, што значи дека е јасно доволно експресивност да го фати 12-цифрен број на сметка. Роб BOWDEN: OK. Па останатите отиде подобро. Па претпоставувам дека банката наметнува $ 20 месечно надомест за одржување на сите сметки. Со она што SQL пребарување на можеле банка одземе 20 $ од секој брои, дури и ако тоа резултира со некои негативни салда? Значи, во основа, постојат четири Главните видови на пребарувања - вметнете, изберете, ажурирање и бришење. Значи она што мислиме дека ние сме случува да се користи тука? Ажурира. Па ајде да ги разгледаме. Значи тука сме ажурирање. Што табелата сме ажурирање сметки? Значи ажурирање сметки. А потоа синтаксата вели, што во сметките сме ажурирање? Па, ние сме поставување рамнотежа еднаква на Сегашната вредност на рамнотежа минус 20. Па ова ќе ги ажурира сите редови на сметките, одземање 20 $ од рамнотежа. Дејвид Џ MALAN: Честа грешка тука, иако ние понекогаш прости, беше да всушност имаат PHP код овде повикување на пребарување функција или ставање наводници околу сето она што не треба да биде таму. Роб BOWDEN: Запомни дека MySQL е посебен јазик од PHP. Се случи да биде пишување MySQL, во PHP. И PHP е испраќање на истата во текот на MySQL серверот. Но, вие не треба PHP со цел да се комуницира со MySQL серверот. Дејвид Џ MALAN: Токму така. Па нема променливи со доларот знаци треба да биде во овој контекст. Тоа само може да направи сите по математика во базата на податоци себе. Роб BOWDEN: OK. Значи следниот. Дали е ова следниот? Да. Така да со тоа што на SQL query на можеле банка добивање на сметка броеви на нејзиниот најбогатите клиенти, оние со салда поголема од 1000? Значи кој од четири главни типови одиме да сакаат тука? Изберете. Затоа сакаме да изберете. Што сакаме да изберете? Што колона сакаме да изберете? Ние конкретно ќе сакаат за да го изберете бројот. Но, ако ти рече ѕвезда, ние исто така прифатена тоа. Па одберете број од она маса? Сметки. А потоа состојбата сакаме? Каде рамнотежа поголема од 1000. Ние, исто така, прифати поголема од или еднаква. Последен. Со она што SQL пребарување на можеле банка блиску, односно, избришете секоја сметка што има биланс од $ 0? Значи кој од четири сме ние ќе сакате да ги користите? Избришеш. Па синтакса за тоа? Избришете од она маса? Сметки. А потоа состојбата на кој ние сакаме да ја избришете - каде рамнотежа е еднаква на нула. Па ги избришете сите редови од сметки каде што рамнотежата е нула. Прашања на која било од овие? Сакате да задача? Дејвид Џ MALAN: Задача водич. Така што во овој еден, ние ќе ви даде малку запознаени структура која ние ја испитавме на малку во класа заедно на structs, кој беше на податоци структура поврзани во духот. Разликата иако со редица е дека моравме да некако се сеќавам на кој беше во предниот дел на дното, во голем дел, така што би можеле да заработат повеќе ефикасна употреба на меморија, најмалку ако бевме користење низа. Бидејќи повлекување, ако имаме низа, ако, на пример, ова е пред на листа на чекање, ако одам во редот тука, а потоа некој добива во согласност зад мене и зад мене и зад мене, и едно лице излегува од линија, може, како што видовме некои од нашите човечки волонтери во класа, има секој префрлат на овој начин. Но, во принцип, откако сите го прават нешто не е најдобро да се користи на време во програмата, бидејќи тоа значи дека вашиот алгоритам работи во она што асимптотска трчање време? Тоа е линеарна. И јас се чувствувам како тоа е вид на глупави. Ако следната лице во линија е следниот лице кое би требало да одат во продавница, тие не сите имаат да се движат заедно. Само нека тоа лице се куби надвор кога ќе дојде време, на пример. За да можеме да ги зачувате малку време таму. И така да го стори тоа иако, тоа значи дека дека шефот на дното или на редот на чекање се случува да се постепено се движи подлабоко и подлабоко во низа и на крајот може да всушност заврши околу ако ние сме со користење на низа за чување на луѓето во оваа задача. Па речиси може да се мисли на низа на кружен податоци структура во таа смисла. Така некако мора да ги пратите на големината на неа, или навистина на крајот од неа а потоа, каде што на почетокот на тоа. Па ние предлагаме дека прогласи една таква задача, нарекувајќи тоа q, само една буква. Тогаш ние предлагаме дека пред да биде иницијализиран на нула и дека големината да се иницијализира на нула. Па сега, нема ништо внатре во тоа задача. И бараме од вас да се заврши имплементација на Стави во ред подолу во таков начин што функцијата додава n да на крајот на q, а потоа се враќа точно. Но, ако q е целосно или негативен, функција, наместо да се врати лажни. А ние ви даде неколку на претпоставки. Но тие не се навистина функционално релевантни, само што bool постои, бидејќи, технички, bool не го прави тоа постојат во C, освен ако не се вклучат во одредени хедер датотека. Така што беше само бидете сигурни дека не беа дали е ова трик Прашањето вид на работа. Па Стави во ред, ние предложени во примерокот решенија да се имплементираат како што следи. Еден, ние прво проверете на леснотија, ниско-бесење плодови. Ако задача е полна или бројот што ти се обидуваш да го вметнете е помалку од нула, кои што се вели во спецификација на проблемот треба да не се дозволени, бидејќи ние само сакаме не-негативни вредности, тогаш треба да само враќање false веднаш. Па некои релативно лесно грешка проверка. Ако сепак сакате да додадете дека вистинските број, ти мораше да се направи малку размислување тука. И ова е местото каде што тоа е малку досадни ментално, бидејќи ќе треба да да дознаам како да се справи со заобиколен. Но зародишот на идејата дека тука е на интерес за нас е тоа што заобиколен често имплицира модуларен аритметика и МО оператор, процентот страна, каде што можете да одат од поголема вредност назад до нула, а потоа еден и два и три, а потоа назад околу да се нула, еден и два и три и така натаму повторно и повторно. Па начинот на кој ние предлагаме тоа е дека ние сакаме да индексира во низа наречен броеви каде нашите цели броеви лаже. Но, за да одам таму, ние прво ќе сакате да направите без оглед на големината на редот е само потоа додадете дека без оглед на пред листа е. И ефектот од тоа е да ни стави на вистинската позиција на листа на чекање и Не се претпостави дека првиот човек во линија е на почетокот, која тој или таа апсолутно би можело да биде ако ние исто така се менувале секого. Но, ние сме само создавање работа за нас ако ние ја дека одредена патека. За да можеме да го задржи релативно едноставна. Ние треба да се запамети дека ние само додаде int на дното. А потоа ние едноставно се врати вистина. Во меѓувреме, во dequeue, ги прашавме можете да го направите следново. Спроведување на таков начин што тоа dequeues, односно ги отстранува и се враќа, ИНТ во предниот дел на дното. Да се ​​отстрани int, е доволно да го заборавам. Вие не треба да ја замени својата малку. Па тоа е уште всушност таму. Исто како и податоците на хард дискот, ние сме само игнорира фактот дека тоа е сега таму. И ако q е празна, ние треба да наместо да се врати негативни 1. Значи ова се чувствува произволни. Зошто се врати негативни 1 наместо лажни? Да. ПУБЛИКАТА: П е чување позитивни вредности. Бидејќи вие само да се сместат позитивни вредности во q, негативен е грешка. Дејвид Џ MALAN: Добро, точно. Па затоа ние сме само чување на позитивни вредности или нула, тогаш тоа е во ред да се врати негативна вредност како стража вредност, посебен симбол. Но ти си пренапишување на историjата таму, бидејќи причина ние сме само враќање не-негативни вредности е затоа што ние сакаме да имаат стража вредност. Па поконкретно, зошто да не само враќање false во случаи на грешки? Да. Публика: Сте успеа да се вратат цел број. Дејвид Џ MALAN: Токму така. И ова е местото каде што C добива прилично ограничувачки. Ако си ти што зборуваш си оди да се вратат int, имаш да се вратат Инт. Вие не може да се фенси и да почне враќањето на bool или плови или стринг или нешто слично. Сега, пак, JavaScript и PHP и некои други јазици може, всушност, ви се врати различни типови на вредности. И кои, всушност, може да биде корисно, каде можете да се врати позитивен ints, нули, негативни ints, или лажни или нула дури и да се означи грешка. Но, ние не го имаат тоа флексибилност во C. Така е и со dequeue, она што ние предлагаат да се направи е - Роб BOWDEN: Вие може да се врати лажни. Тоа е само дека лажно е хаш дефинираат лажни до нула. Значи, ако се врати лажни, сте враќа нула. И нула е валидна нешто во нашата листа на чекање, додека негативните 1 не е ако лажни случи да биде негативен 1. Но вие не треба дури и треба да знаете дека. Дејвид Џ MALAN: Тоа е зошто не сум го кажам. Роб BOWDEN: Но, тоа не е вистина дека не може да се врати лажни. Дејвид Џ MALAN: Секако. Па dequeue, информации ние прифаќаме поништат како свој аргумент. И тоа е затоа што ние не сме поминува ништо внатре Ние само сакаме да се отстрани елементот во предниот дел на дното. Па, како би можеле да се обратите за тоа? Па, прво, да го направите ова брзо здрав разум чек. Ако на листа на чекање големина е 0, постои нема работа да се направи. Врати негативни 1. Направи. Па тоа е неколку линии на мојата програма. Па остануваат само четири линии. Па еве јас да одлучи да Decrement големината. И, намалување на големината ефикасно значи дека јас сум заборавил нешто не е во таму. Но јас, исто така, треба да се ажурира каде предниот дел на броеви се. Па да го направите тоа, ми треба да направите две работи. Јас прво треба да се сетиш што бројот е во предниот дел на дното, затоа што треба да се врати таа работа. Па јас не сакаат да случајно забораваат за него, а потоа запишете врз неа. Јас сум само ќе се сетам во Инт. И сега, сакам да се ажурира q.front да се q.front +1. Така да ако ова е првата личност во линија, сега, сакам да направам плус 1 до укаже на следната лице во линија. Но, морам да се справи со тоа заобиколен. И ако капацитетот е глобален константна, тоа ќе ми овозможи да бидете сигурни дека како што укажуваат на многу последната личност во линија, операцијата modulo ќе донесе ме врати на нула на пред редот. И што се справува со заобиколен тука. А потоа да продолжите да се вратат n. Сега, строго земено, не сум мора да се декларираат n. Јас не треба да го грабне и чувајте го привремено, бидејќи вредноста е уште е таму. Па јас само би можеле да ја направат вистинската аритметички да се вратат поранешниот шеф на задачата. Но јас само се чинеше дека ова е повеќе јасно за да всушност го дофати int, го стави во N, а потоа се врати што заради јасност, но не е строго неопходно. Psst. Сите тие се произносим во мојата глава. Роб BOWDEN: Значи првото прашање е бинарно дрво проблем. Па првото прашање е, ние сме со оглед на овие броеви. И ние сакаме некако да ги вметнете во овие јазли, така што тоа е регуларна програма пребарување дрво. Значи едно нешто да се запамети околу бинарни пребарување дрвја е дека тоа не е само дека она кон лево е помалку и нешто што треба да право е поголема. Тоа треба да биде дека целата дрвото за да Лево е помалку, а целиот дрво на правото е поголема. Значи, ако јас се стави 34 тука на врвот, а потоа Ставив 20 тука, па тоа е валидна, па далеку, бидејќи 34 до тука. 20 ќе левата страна. Па тоа е помалку. Но, јас не тогаш може да се стави 59 тука, затоа што иако 59 е на десната страна од 20, тоа е уште на левата страна на 34. Така да со тоа ограничување на ум, Најлесниот начин за веројатно решавање на овој Проблемот е само вид од овие броеви - така 20, 34, 36, 52, 59, 106. И потоа вметнете оние од лево кон десно. Па 20 оди овде. 34 оди овде. 36 оди овде. 52, 59, 106. И ти исто така би можеле да имаат сфатиле со некои приклучување и реализација, О, чекај, јас немам доволно броеви да се пополни оваа во текот тука. Значи ми треба да reshift што ми пат белешка ќе биде. Но да се забележи дека во последните три, ако ви се чита од лево кон десно, тоа е во зголемување на ред. Па сега, ние сакаме да се декларираат она на struct ќе биде за јазли во ова дрво. Значи она што ние треба во бинарно дрво? Па ние имаме вредноста на тип int, па така некои int вредност. Не знам она што се нарекува тоа во решение - int n. Ние треба покажувач кон лево дете и покажувач на правото на детето. Па затоа се случува да изгледа вака. А тоа всушност ќе изгледа пред Кога на двојно поврзани листа нешта, па најава - Одам да мора да дојдете сите начин назад до проблем 11. Па се забележи тоа изгледа идентично на ова, освен ние едноставно се случи да се јавите на овие различни имиња. Ние се уште имаат цел број вредност и два покажувачи. Тоа е само дека наместо лекување на совети како да се покажува кон следното нешто и претходната работа, ние сме лекување покажувачи да се укаже на левата дете и правото на детето. OK. Па тоа е нашата struct јазол. И сега, единствената функција треба да спроведување за ова е пресек, кој ние сакаме да одиме во текот на дрво, печатење од вредностите на дрво во ред. Така гледајќи тука, ние би сакале да се печати од 20, 34, 36, 52, 59, и 106. Како да се постигне тоа? Така, тоа е прилично слични. Ако сте гледале во минатото испит проблемот што си сакал да испечатите целото дрво со запирки помеѓу сè, тоа беше, всушност, дури и полесно од тоа. Значи тука е решение. Ова беше значително полесен ако тоа го правеше рекурзивно. Не знам дали некој се обидел да го стори тоа iteratively. Но, прво, имаме нашата база на случајот. Што ако коренот е нула? Тогаш ние само ќе се вратат. Ние не сакаме да се печати ништо. Друг ние ќе напречни рекурзивно надолу. Печати целата лева поддрво. Па печати сè помалку од мојата тековна вредност. А потоа јас ќе одам да си се печати. А потоа јас ќе одам да recurse по моите Целиот право поддрво, па сè поголема од мојата вредност. И ова се случува да се печати од сè во ред. Прашања за тоа како ова всушност остварува тоа? Публика: Имам едно прашање на [нечујни]. Роб BOWDEN: Значи еден од начините на приближување било рекурзивен проблем е само да мислат за тоа како треба да мислат за сите агол случаи. Па сметаат дека сакаме да печати целата оваа дрво. Така што сите ние ќе се обидеме да се фокусира на е ова особено јазол - 36. На рекурзивните повици, ние се преправаме оние кои само работа. Па еве, овој рекурзивен повик да се напречни, ние дури и без размислување во врска со тоа, само traversing на левата три, замислете дека веќе отпечатоци 20 и 34 за нас. А потоа кога ние на крајот рекурзивно јавете се напречни на право, дека правилно ќе печати 52, 59, и 106 за нас. Па со оглед дека ова може да печати 20, 34, и другите може да печати 52, 59, 108, сите ние треба да бидат способни да направите е да печати потполно во средината на тоа. Па испечатите сè пред нас. Печати потполно, па сегашната јазол печатење 36, редовно printf, а потоа печати сè по нас. Дејвид Џ MALAN: Ова е местото каде рекурзија добива навистина убава. Тоа е овој неверојатен скок на верата каде да го направите на најситните малку на работа. А потоа ќе ги споделите со некој друг го стори останатото. И дека некој друг е, иронично, вас. Па за сериозни пусти поени, ако дојдете горе на прашања - Роб BOWDEN: На прашања? Дејвид Џ MALAN: И по малку да се на броеви, дали некој знае каде овие бројки доаѓаат од? Роб BOWDEN: Имам буквално нема идеја. Дејвид Џ MALAN: Тие се појавуваат во текот на квизот. Публика: Дали се тие иста броеви? Дејвид Џ MALAN: Оние броеви. А малку велигденско јајце. Така и за оние од вас гледа на интернет на Дома, ако можете да ни кажете преку е-маил за да heads@CS50.net што значењето на овие периодични шест броеви се во текот Квиз 1, ние ќе ви туш со неверојатни внимание на финалната предавање и стрес топче. Убаво, суптилни. Роб BOWDEN: Секое минатата прашања за ништо на квизот?