Дэвід Дж. Малан: Добра. Так што сардэчна запрашаем першай у гісторыі CS50 пасмяротнае для віктарыны. Мы думалі, што адкрываць гэтая традыцыя ў гэтым годзе. І гэта будзе магчымасць ісці праз рашэння віктарыны. І мы будзем паскорыць ці запаволіць аснове на інтарэсах тых, хто тут. Такім чынам, вы, верагодна, тут, таму што вы зацікаўлены ў тым, як вы маглі б ці павінны адказалі некаторыя з гэтых праблем. Дык чаму б нам не зірнуць у гэтым раздзеле ў першую чаргу? Таму атрыманне радкоў. Гэта дало вам тры розных версіі праграмы, якая была, у канчатковым рахунку, азначала, каб атрымаць радок ад карыстальніка. Ці не, гэта зрабіў, што было застаецца вам вызначыць. І мы папрасілі ў пытанні 0, Выкажам здагадку, што версія 1 скампіляваць і выканана. Чаму можа праграма сегментацыі? На першы погляд, любыя прапановы , Чаму? Так. АЎДЫТОРЫЯ: Так што я памятаю, гэта ў Папярэдні прыклад глядзець на сімвал * з і бачачы сканіраванне з і бачачы, таму што гэта паказальнік, як гэта паўплывала на тое, што вы скануецца ў? З'яўляецца гэта з або адрас з? Дэвід Дж. Малан: ОК. Добра. Такім чынам, у канчатковым рахунку, крыніца любой праблемы Меркавана збіраецца скараціць да гэтага зменнай с. І гэта сапраўды пераменная. Тып дадзеных гэтай зменнай з'яўляецца сімвал *, што азначае, што гэта збіраецца ўтрымліваць адрас знака. І ў гэтым заключаецца разуменне. Гэта збіраецца ўтрымліваць адрас знак ці, больш агульна, адрас першага знака ў цэлы блок знакаў. Але загваздка ў тым, што сканіраванне з, мэта ў жыццё, даецца адрас і з улікам код фармату, як% з, чытання радок ў кавалак памяці па гэтым адрасе. Але паколькі няма знака роўнасці перад што кропка з коскі на першы радок кода, таму што мы на самай справе не вылучае памяці з Таноса, таму што гэта на самай справе не вылучыць масіў нейкі памеру, усё вы робіце чытае карыстальніка увод з клавіятуры ў некаторых поўнай значэнне смецця, якія знаходзіцца ў з па змаўчанні. Так шанцы вы збіраецеся да выпадзення, калі што адрас не проста так здарыцца быць значэнне, якое вы можаце, на самай справе, напішыце. Так дрэнна не вылучыць ваша памяць ёсць. Такім чынам, у пытанні 1, мы спыталі, Выкажам здагадку, што версія 2 скампіляваць і выканана. Чаму можа гэтая праграма сегментацыі? Так што гэта адзін менш памылак. І ёсць сапраўды толькі адзін відавочны спосаб, дзе вы можаце выклікаць сегментацыі тут. І гэта тэматычная. Кожны раз, калі мы выкарыстоўваем з у памяці, што вы маглі б зрабіць, каб выклікаць сегментацыі з версіі 2? АЎДЫТОРЫЯ: Калі вы выкарыстоўваеце гэты ўваход у радок гэта больш, чым 49 знакаў. Дэвід Дж. Малан: Цалкам дакладна. Кожны раз, калі вы бачыце што-то фіксаванай даўжыні калі справа даходзіць да масіва, ваш РЛС павінна згаснуць, што гэта можа быць праблематычна, калі вы не правяраючы Межы масіва. І гэта праблема. Мы ўсё яшчэ выкарыстоўваем зсапЕ. Мы ўсё яшчэ карыстаецеся% S, што азначае, паспрабаваць чытаць радок ад карыстальніка. Вось якія будуць чытаць у з,, у гэтай кропцы, эфектыўна адрас кавалак памяці ці гэта эквівалентна. Гэтае імя масіва знакаў памяці. Але менавіта гэта, калі вы чытаеце радок гэта больш, чым 49 сімвалаў, 49 таму што вам трэба месца для зваротнай касой рысы 0, вы будзеце перапаўняцца што буфер. І ты можаш стаць шчасліўчыкам і быць у стане напісаць 51-й характар, 52, 53. Але ў нейкі момант, АС збіраецца сказаць, няма. Гэта вызначана не памяці Вам дазваляюць чапаць. І праграма будзе да выпадзення. Так што, эўрыстыка павінна быць ніякіх Час у вас ёсць фіксаваную даўжыню, у вас ёсць каб пераканацца, што вы правяраеце даўжыню з тое, што вы спрабуеце чытаць у яе. АЎДЫТОРЫЯ: Такім чынам, каб вырашыць, што, вы маглі б мелі аб праверкі на самай справе даўжыня больш ці менш? Дэвід Дж. Малан: Цалкам дакладна. Вы проста ёсць умова што кажа, калі - ці, хутчэй, вам не абавязкова ведаць, загадзя, колькі знакаў карыстальнік збіраецца ўвесці, таму што ў вас ёсць курыца і яйка. Ня, пакуль вы не чыталі яго з зсапЕ Вы можаце высветліць, як доўга гэта. Але ў той момант, што гэта занадта позна, таму што вы ўжо чыталі яго ў некаторы блок памяці. Так як у бок, бібліятэка CS50 пазбягае гэтае пытанне ў цэлым, нагадаем, з дапамогай fgetc. І ён чытае адзін знак за адзін раз, дыбачках ўздоўж, ведаючы, што вам не можа перапоўніцца характар, калі Вы праглядаеце па адным. Загваздка ў тым, з GetString адкліканні з'яўляецца што мы павінны ўвесь час змяняць памеры што частка памяці, якая гэта проста боль. Гэта шмат ліній Код гэтага рабіць. Так што іншы падыход будзе на самай справе выкарыстаць стрыечны брат, так сказаць, зсапЕ. Існуюць варыянты Многія з гэтых функцыі, якія на самай справе праверыць даўжыня, колькі знакаў Вы маглі б чытаць максімальна. А вы маглі б паказаць, не чытайце больш за 50 знакаў. Так што было б іншы падыход, але менш ветлівым з вялікіх уваходаў. Так пытанне 2 пытаецца, выкажам здагадку, што версія 3 складаецца і выконваецца. Чаму ж гэта праграма сегментацыі? Так што гэта адзін на самай справе тое ж самае адказаць, хоць гэта выглядае крыху больш незвычайным. Мы выкарыстоўваем Таноса, які адчувае сябе падобна мы даем сабе больш магчымасцяў. А потым мы вызваляючы, што памяці ў канцы. Ён па-ранейшаму ўсяго 50 байт памяці. Такім чынам, мы маглі б ўсё яшчэ спрабую чытаць у 51, 52, 1000 байтаў. Гэта збіраецца да выпадзення для сапраўды гэтак жа прычына. Але ёсць і іншая прычына. Што яшчэ магло Malloc вяртанне да таго ж адрас кавалак памяці? Гэта можа вярнуць нулявы. І таму, што мы не правяраючы што мы маглі б рабіць нешта па-дурному і па іншай прычыне, якая з'яўляецца, што мы маглі б распавядаць зсапЕ, чытаць ўвод карыстальніка з клавіятуры у 0 месцы, AKA нуль. І гэта таксама, безумоўна, выклікаць сегментацыі. Такім чынам, для мэтаў тэст, мы б прынялі адзін з тых, як важкі чыннік. Адным з іх з'яўляецца ідэнтычным. Адным з іх з'яўляецца трохі больш нюансаў. Нарэшце, у дачыненні да програмы выкарыстанне памяці, як жа версіі 2 і версія 3 адрозніваюцца? Такім чынам, для чаго гэта каштуе, мы бачылі здавалася б, бясконцая колькасць можна Адказы на гэты. І сярод адказаў людзей, тое, што мы былі спадзеючыся на, але мы прынялі іншае рэчы, было некаторы згадка пра Справа ў тым, што версія 2 выкарыстоўвае так званы стэк. Версія 3 выкарыстоўвае кучу. І функцыянальна, гэта на самай справе не зрабіць усё, што асаблівай розніцы. У рэшце рэшт, мы ўсё яшчэ проста атрымаць 50 байт памяці. Але гэта быў адзін з магчымых адказаў што мы глядзелі. Але вы ўбачыце, як вы атрымаеце ваш віктарыны назад ад ТФ, што мы зрабілі прыняць іншыя абмеркавання іх разрозненыя выкарыстання памяці, а таксама. Але стэк і куча б просты адказ, каб пайсці з. Ёсць пытанні? Я даю вам Роб. ROB BOWDEN: Так праблема 4. Гэта тое месца, дзе вы павінны былі запоўніць у лік байтаў з усіх гэтыя розныя тыпы, якія выкарыстоўваюцца. Так першае, што мы бачым. Выкажам здагадку, 32-разрадную архітэктуру, як гэты CS50 прыбора. Такім чынам, адна з асноўных рэчаў, аб 32-бітныя архітэктуры, які кажа нам, дакладна, як вялікі паказальнік збіраецца знаходзіцца ў архітэктуры. Так адразу, мы ведаем, што любы паказальнік тып 32 біта ці 4 байта. Так, гледзячы на ​​гэтую табліцу, вузел * з'яўляецца паказальнікам. Гэта будзе 4 байта. Структура, вузел *, вось літаральна ідэнтычны вузла зоркі. І так, што гэта будзе 4 байта. Радок, так што не падобны паказальнік пакуль няма, але ЬурейеЕ, радок проста сімвал *, які з'яўляецца тып паказальніка. Так што гэта будзе 4 байта. Такім чынам, гэтыя тры усе 4 байта. Цяпер, вузел і вучань з'яўляюцца крыху больш складана. Так, гледзячы на ​​вузле і вучня, мы бачым, вузел у выглядзе цэлага ліку і паказальнік. І студэнт два паказальніка ўнутры яго. Так па крайняй меры ў нашым выпадку тут, то, як што мы ў канчатковым выніку разліку памеру гэтая структура проста скласці ўсе што знаходзіцца ўнутры структуры. Такім чынам, для вузла, у нас ёсць цэлае, які мае памер 4 байта. У нас ёсць паказальнік, які з'яўляецца 4 байта. І так адзін вузел збіраецца заняць 8 байт. І сапраўды гэтак жа для студэнтаў, у нас ёсць Паказальнік вось 4 байта, а другі Паказальнік вось 4 байта. Так што будзе ў канчатковым тым, што 8 байт. Так вузел і вучань 8 байт. І гэтыя тры усе 4 байта. Пытанні па гэтай нагоды? Так. Залы: гэта быў 64-разрадны архітэктура, хацеў бы, каб падвоіць усе з іх? ROB BOWDEN: Гэта не так падвоіць ўсё з іх. Так 64-разрадная архітэктура, гэта, зноў жа, змены, якія фундаментальная рэч, якая Паказальнік Зараз 64 біта. Так. Так паказальнік складае 8 байт. Такім чынам, гэтыя, што былі 4 байта будуць 8 байт. Студэнт, які быў два паказальніка, добра, цяпер ён збіраецца быць 8 байт, 8 байт. Гэта збіраецца зрабіць 16 байт. Але вузел яшчэ 4 байта. Так гэты паказальнік будзе каб быць 8 байтаў. Гэта 4 байта. Так вузел будзе толькі быць 12 байт. Любыя іншыя пытанні аб тым, што адзін? Такім чынам, наступны, гэта коды стану HTTP. І ў вас было б апісаць абставіны , Пры якіх яны маглі б Вам вернутыя. адна праблема, што я чуў, некаторыя студэнты ёсць тое, што яны паспрабавалі зрабіць Памылкі быць на канцы кліента. Таму, калі мы спрабуем зрабіць запыт на сервер, нешта ідзе няправільна з нашага боку. Але ў цэлым, гэтыя коды вяртаецца на серверы. Таму мы хочам, каб высветліць, што адбываецца няправільна або прама на серверы, выклікае гэтыя рэчы павінны быць вернутыя. Дык чаму маглі б праз сервер вяртае Код стану 200? Любыя думкі? Так. Так нешта паспяхова запыт прайшоў. І яны змаглі вярнуцца усё, што вы прасілі. Так што ўсё было выдатна. Што пра 302 знойдзена? Так. АЎДЫТОРЫЯ: Сервер шукаў за тое, што вы прасілі. Але гэта не мог знайсці яго. Такім чынам, ёсць памылка. ROB BOWDEN: Так сервер быў шукае тое, што вы хацелі. Так што проста гледзячы тут, 302 знойдзена, ён быў у стане знайсці яго. АЎДЫТОРЫЯ: Мне вельмі шкада. Знойдзена азначае, што яны знайшлі яго. Выбачайце. ROB BOWDEN: Так 302 знойдзена. Сервер здольны знайсці што вы хацелі. АЎДЫТОРЫЯ: Але гэта не адлюстроўваючы яго? ROB BOWDEN: Розніца паміж гэта 302 і 200 з'яўляецца тое, што ён ведае, што вы хочаце. Але гэта не дакладна, дзе вы хацелі спытаць. Так 302 з'яўляецца тыповым рэдырэкт. Такім чынам, вы запыталі старонку. Яна ведае, о, я хачу вярнуцца табе гэта. Але гэта ў іншым URL. Так эй, вы на самой справе хочаце гэтага. Дэвід Дж. Малан: Гэта кавалак, што сказаў што мы далі вы, хлопцы рэдырэкт функцыя, якая выкарыстоўвалася функцыя загалоўка што, у сваю чаргу, раздрукаваць месцазнаходжанне, тоўстай кішкі, а затым URL, да якога Вы хочаце, каб адхіліць карыстальніка. Нават калі вы не бачылі 302 відавочна ёсць, гэта тое, што РНР чароўным ўставіць у якасці загалоўка кажучы, што менавіта сказаў Роб там - знойдзена. Але ідуць сюды замест гэтага. ROB BOWDEN: ОК. Так што пра 403 забаронена? Залы: Я думаю, што гэта тое, што сервер у асноўным кажа, што кліент не можа атрымаць доступ да хатняй старонцы. ROB BOWDEN: Дык што, да. Ну, тыповы адказ мы былі чакаючы нешта падобнае, файлы ня chmodded адпаведным чынам. Гэта, верагодна, пры якіх абставінах вы бачылі іх. Але ёсць прычына, што кліент можа быць вінаватыя ў гэтым. Там на самай справе іншы код стану - 401. Так што гэта вельмі падобна. 401 з'яўляецца несанкцыянаваным. І 403 забаронена. І так несанкцыянаванага вы выключна атрымаць, калі вы не прайшлі ідэнтыфікацыю Але рэгістрацыя можа азначаць што вы маеце права. Але калі вы ўжо зарэгістраваныя, і вы да гэтага часу не мае дазволу, то вы таксама можаце атрымаць забаронена. Так што, калі вы ўвайшлі ў сістэму і не маюць дазвол, забаронена таксама тое, што вы можаце атрымаць. Дэвід Дж. Малан: І механізм, з дапамогай якой гэтыя праблемы, як правіла вырашаецца на сэрвэры праз тое, што каманда? CHMOD, калі гэта, сапраўды, правоў выдаваць на файл або каталог. ROB BOWDEN: Тады 404 ня знойдзены. Так. Так у адрозненне ад 302, дзе гэта не было сапраўды дзе вы пытаецеся, але ён ведае, што вы хочаце, гэта, ён проста павінен ніякая ідэя, што вы хочаце. І вы не з просьбай нешта дзейнічае. 418 Я чайнік, а затым 500 ўнутраны сервер. Дык чаму можа ты гэта ўзяў? Так сегментацыі - Я на самой справе не ведаю, Градуіроўка стандарт для гэтага. Але калі ваш код PHP было нешта ў гэтым дрэннага, у тэорыі, гэта магло фактычна сегментацыі, у якім выпадку гэта 500 Унутраная памылка сервера, то, не так з вашага сервера Канфігурацыя. Або ёсць памылка сінтаксісу у кодзе PHP. Ці нешта дрэннае адбываецца. Дэвід Дж. Малан: Мы сапраўды бачылі сегментацыі сярод адказаў у некалькіх людзей. І тэхнічна, гэта можа адбыцца. Але гэта было б PHP, праграма напісаныя іншымі людзьмі, на самай справе segfaulted, якія толькі калі гэтыя людзі аблажаўся і напісаў памылка ў праграмным кодзе ў іх перакладчык былі б Сам PHP сегментацыі. Таму, нават калі 500 падобны да сегментацыі у духу, гэта амаль заўсёды вынікам пытанні канфігурацыйнага файла з вашага вэб-сервера, ці, як сказаў Роб, памылка сінтаксісу, як і вы не зачыняў цытату. Ці вы страцілі кропку з коскі недзе. АЎДЫТОРЫЯ: Такім чынам, для Shuttle PSet, я думаю, калі я зрабіў гэта, як толькі я націснуў браўзэр, але нічога падышоў, тое, што яны называюць белым старонкі. Але гэта было, таму што частка кода. Я думаю, што было JavaScript, праўда? ROB BOWDEN: Так. АЎДЫТОРЫЯ: о, калі б памылка яшчэ прыдумаць? ROB BOWDEN: Такім чынам, вы б не атрымалі гэтая памылка, таму што ўсе з пункту гледжання вэб-сервера было абсалютна выдатна. Але вы прасілі index.html. Вы прасілі shuttle.js і service.js. І гэта было ў стане паспяхова вярнуцца Вам усім з тых рэчаў - 200. ОК. І толькі калі ваш браўзэр спрабаваў інтэрпрэтаваць код JavaScript, што Гэта як, пачакайце, гэта не дзейнічае памылка JavaScript. Любыя іншыя пытанні? Добра. Дэвід Дж. Малан: Так што ў наступны склаў лік 11. І 11 было самым страшным для многіх людзей. Такім чынам, самае галоўнае, каб адзначыць тут было тое, што гэта было, сапраўды, аб двусвязный спіс. Але гэта не было так жа, як у мінулым годзе двусвязного праблема спіс, якія не даюць вам агаворкай, што спіс можна, на самай справе, быць адсартаваныя. Таму той факт, што спіс быў малокомплектных і той факт, што гэта слова было падкрэслены там павінен быў перадаць што гэта на самай справе спрашчэнне пра тое, што ў адваротным выпадку было б больш складанай праблемай і больш доўгі. Так распаўсюджаная памылка тут у тым, каб паставілі рашэнне ў мінулым годзе на адным пэйджар, а затым проста слепа капіяваць, што ўніз ў адказ, што права адказаць на іншае пытанне блізкія па духу. Але тонкасці тут былі наступныя. Так што, мы вузел абвешчаныя і вызначаецца звычайным чынам тут. Пасля гэтага мы вызначылі спіс быць глабальным паказальнік ініцыялізуецца на нуль. Тады, па-відаць, ёсць дзве функцыі у нас ёсць прататыпы тут, устаўка і выдаліць. А то ў нас некаторыя прыклады кода тут рабіць кучу уставак. І тады мы просім Вас запоўніць рэалізацыя ўстаўкі ніжэй у такіх чынам, што ён устаўляе п у ​​спіс за пастаянны час, таксама падкрэсліў, нават калі ўжо прысутнічае. Так прыгажосць магчымасць ўставіць ў пастаянным часу з'яўляецца тое, што ён мяркуе што ў вас ёсць, каб ўставіць новы вузел, дзе? У пярэдняй. Так ён ліквідуе, на шчасце, па меншай меры, адзін з выпадкаў, якія раней патрабуюць яшчэ больш радкоў кода, як гэта было у мінулым годзе і нават у класе, калі мы казалі праз такога роду рэчы з людзьмі і з некаторымі слоўнае псеўда-код. Такім чынам, у вырашэнні тут, давайце прапусціць да таго, што проста мець візуальны кантакт экран. Звярніце ўвагу, што мы робім наступнае. А таксама звярніце ўвагу на іншую спрашчэнне было тое, што нават калі гэта ўжо прысутнічае, гэта азначае, нават калі колькасць ужо ёсць, вы можаце проста слепа ўставіць іншы яго копія. І гэта таксама павінна было быць спрашчэнне, так што вы маглі б засяродзіцца на, сапраўды, некаторыя з больш інтэлектуальна цікавая частка і не толькі некаторыя дадатковыя праверкі памылак улічваючы абмежаваны час. Так што ў гэтым прыкладзе рашэння, мы вылучаем паказальнік на левай бок тут да вузла. Цяпер разумею, што паказальнік, як Роб сказаў, толькі 32 біт. І гэта на самай справе не ўтрымліваюць адрас да вас прысвоіць яму адрас. І мы робім гэта на правай бок праз Таноса. Як добрасумленны грамадзянін, мы правяраем, што Таноса не з'яўляецца, па сутнасці, нулявы, так што мы не выпадкова стварыць сегментацыі тут. І кожны раз пры выкарыстанні Таноса ў жыцці, вам павінны быць праверкі нуль, каб ў вас ёсць тонкі памылка. Тады мы ініцыялізаваць гэтую нуль на прысваення п і папярэдні і наступны. І ў гэтым выпадку тут, я ініцыялізацыі папярэдняя ў нуль, таму што гэта новае вузел будзе новы пачатак майго спісу. Так што гэта будзе нічога перад ім. І я хачу, каб істотна дадаць існуючы спіс у новы вузел па сядзіць побач роўная спіс сябе. Але я не зрабіў толькі пакуль. Так што, калі сам спіс ужо існуе, і было па меншай меры адзін вузел ўжо на месцы, калі гэта спіс тут, і я ўставіць новы вузел тут, я трэба пераканацца, што мой былы вузел паказвае назад, каб мой новы вузел, таму што гэта, зноў жа, двусвязный спіс. Так мы робім ёсць просты тэст. Калі спіс не пусты, калі ёсць ужо адзін ці больш вузлоў там, тады дадаць, што яшчэ спасылку, так бы мовіць. І тады вельмі Апошняе, што нам трэба зрабіць, гэта на самай справе абнавіць глабальны Спіс зменных сама пазначыць да таго новаму вузла. Так. АЎДЫТОРЫЯ: У стрэлкай паказальніка [Неразборліва] роўная нуль, ці значыць гэта справу са спісам, таму што спіс пусты? Дэвід Дж. Малан: Не. Гэта проста я, будучы актыўна асцярожныя, у тым, што калі гэта маё першапачатковы спіс з, магчыма, некаторыя больш вузлоў тут і я ўставіць мой Новы вузел сюды, там збіраецца не што іншае сюды. І я хачу, каб захапіць гэтую ідэю , Усталяваўшы папярэдні нуль на новым вузле. І трэба меркаваць, калі мой код правільны і няма ніякага іншага спосабу для ўстаўкі акрамя гэтай функцыі вузлоў, як мяркуецца, нават калі спіс ужо ёсць адзін або некалькі вузлоў ў ім, па-відаць, спіс, першы вузел, будзе мець папярэдняя паказальнік самой нуль. АЎДЫТОРЫЯ: І проста працягам. Прычына вы паклалі паказальнік наступная роўна Спіс вы робіце паказальнік перад спіс у тым, што ён, паказваючы да іншага, я думаю, - Я не - проста пералічвае? Дэвід Дж. Малан: Цалкам дакладна. І таму давайце на самай справе разгледзець два выпадкі тут сапраўды, нягледзячы на ​​тое, Парадак мы будзем ўлічваць іх ня цалкам гэтак жа, як код. Але на высокім узроўні, калі гэта ўяўляе спіс, і гэта 32-разрадная паказальнік, самы просты сцэнар што гэта нуль па змаўчанні. І выкажам здагадку, што я хачу, каб ўставіць нумар 50 быў першым нумарам. Так што я збіраюся ісці наперад і вылучыць вузел, які будзе ўтрымліваць тры палі - п, папярэдняй і наступнай. Я збіраюся паставіць нумар 50 тут, таму што гэта будзе н. Гэта будзе наступны. І гэта будзе папярэдняя. І так што ж мне рабіць у гэтым выпадку? Ну, я толькі што зрабіў лінію 1 тут. Паказальнік н атрымлівае н. Я тады казаў, папярэдняя павінны атрымаць нулявы. Так што гэта будзе нулявы. Тады я буду казаць далей збіраецца атрымаць спіс. І гэта проста працуе добра. Гэта нуль. І таму я кажу, новага вузла побач поле павінна атрымаць тое, што гэта. Так што ставіць яшчэ адзін нуль там. І тое апошняе, што Я гэта праверыць тут. Калі спіс не роўна NULL, але гэта роўная нуль, таму мы прапускаем, што ў цэлым. І так усё, што я рабіць далей, спіс становіцца паказальнік, які наглядна прыводзіць да карціна так. Дык вось адзін сцэнар. І той, які вы пыталіся пра спецыяльна гэта сітуацыя, як гэта, дзе ў нас ужо ёсць спіс з адным вузлом. І калі я вярнуся ў арыгінале пастаноўка праблемы, на наступны мы будзем ўставіць скажам на 34, толькі для дзеля абмеркавання. Так што я збіраюся проста зручна прыцягнуць, што тут. Я толькі што malloced. Давайце выкажам здагадку, я правяраю для нуль. Зараз, я збіраюся ініцыялізацыі н быць 34. І гэта будзе н. Гэта будзе наступны. І гэта будзе папярэдняя. Давайце пераканацца, што я не зрабіў атрымаць назад. Папярэдні прыходзіць першым ў вызначэнні. Дазвольце мне выправіць гэта. Гэта папярэдняя. Гэта побач. Нават калі яны ідэнтычныя, давайце трымаць яго паслядоўным. Папярэдні. Гэта побач. Так што я проста malloced маю запіску, праверыў для нуль, прызначаны 34 у вузел. Папярэдні атрымлівае нуль. Так, што дае мне гэта. Наступная атрымлівае спіс. Так спіс гэта. Так што гэта тое ж самае зараз, як маляванне гэта стрэлка, так што яны паказваюць на адзін у тое ж самае. А потым я правяраю, калі спіс ня роўны NULL. І гэта не ў гэты раз. Тады я збіраюся зрабіць спіс папярэдняя атрымлівае паказальнік. Так спісу папярэдні атрымлівае PTR. Такім чынам, гэта мае эфект ўводу графічнае стрэлка тут. І гэта становіцца трохі хвалістыя, лініі. А потым, нарэшце, абнавіць спіс, каб паказаць на паказальнік. Так што зараз гэта паказвае на гэтага хлопца. А цяпер, давайце зробім кароткі здаровае праверка. Вось спіс, які з'яўляецца глабальная пераменная. Першы вузел, сапраўды, 34, таму што Я сачу, што стрэлку. І гэта правільна, таму што я хачу ўставіць у пачатку спісу усе новыя вузлы. Яго наступнае поле прыводзіць мяне да гэтага хлопца. Калі я працягваю, я ўдарыў побач з'яўляецца несапраўдным. Так няма больш спіс. Калі б я ўдарыў папярэдні, я атрымліваю туды, дзе я чакаю. Так што ёсць яшчэ некалькі саветаў, відавочна, маніпуляваць. Але тое, што вы сказалі зрабіць гэта ў пастаянным часу азначае, што вы толькі маюць канчатковае лік рэчаў Вам дазваляюць зрабіць. І што гэта за лік? Гэта можа быць на адзін крок. Гэта можа быць два. Гэта можа быць 1000 крокаў. Але гэта канчатковая, а значыць, вы не можаце ёсць якой-небудзь петлеобразования адбываецца тут, не рэкурсіўна, без завес. Гэта проста павінна быць жорстка-закадаваныя радкоў кода, як у нас у гэтым узоры. Так што ў наступны Праблема 12 папрасілі нас завяршыць рэалізацыю Выдаліць Ніжэй такім чынам, што яна выдаляе н з спісу ў лінейнае час. Так у вас ёсць трохі больш манеўру цяпер. Вы можаце лічыць, што п, калі ён прысутнічае у спісе, будзе прысутнічаць не больш чым адзін раз. І гэта таксама прызначаецца, каб быць віктарына на аснове спрашчае здагадка, так што, калі вы знойдзеце нумар 50 дзесьці у спісе, вы не таксама прыйдзецца турбавацца аб працягваючы ітэрацыі, шукаю усе магчымыя копія 50, што б проста перадаваць у некаторых дробязях ў абмежаваны час. Так што з выдаліць, гэты быў вызначана больш складанай і больш Код пісаць. Але на першы погляд, шчыра кажучы, гэта магло б шукаць пераважная і як нешта няма ніякага спосабу, вы маглі б прыдумаць на віктарыне. Але калі мы арыентуемся на асобных этапаў, Спадзяюся, ён будзе раптам стукнуць вас, што кожны з гэтых індывідуальных крокі робіць відавочным сэнс ў рэтраспектыве. Так што давайце зірнем. Такім чынам, спачатку мы ініцыялізуем паказальнік быць спіс сябе. Таму што я хачу лінейнае час, што сродкі Я збіраюся ёсць цыкл. І звычайны спосаб для перабору вузлы ў структуры спісу або любога віду структуры шматразова гэта ўзяць паказальнік на пярэдняй частцы дадзеных Структура, а затым проста пачаць абнаўленне гэта і ісці свой шлях праз структуру дадзеных. Так што я збіраюся зрабіць менавіта гэта. У той час як паказальнік, мая часовая пераменная, ня роўнае NULL, давайце ісці наперад і праверыць. Хіба я пашанцуе? Ці з'яўляецца поле п у ​​вузле Я ў цяперашні час гледзячы на ​​роўнай лік Я шукаю? І калі так, то давайце нешта рабіць. Цяпер, звярніце ўвагу гэта, калі ўмова акружае ўвесь Наступныя радкі кода. Гэта адзінае, што мяне хвалюе - знайсці нумар у пытанне. Дык не яшчэ, што спрашчае рэчы канцэптуальна няшмат. Але цяпер я зразумеў, і вы, магчыма, толькі зразумеў гэта, падумаўшы гэта праз некаторы час, ёсць на самай справе два выпадкі тут. Адным з іх з'яўляецца дзе вузел знаходзіцца на пачатак спісу, які з'яўляецца трохі раздражняе, таму што гэта асаблівы выпадак, таму што вы павінны мець справу з гэтай рэччу, якая з'яўляецца адзіным анамалія. Усюды яшчэ ў спісе, гэта тое ж самае. Там у папярэдні вузел і побач вузел, папярэдні вузел, наступны вузел. Але гэты хлопец стаіць крыху асобна, калі ён у самым пачатку. Такім чынам, калі паказальнік роўны спіс Сам, так што калі я ў пачатку спіс, і я знайшоў п, мне трэба зрабіць некалькі рэчаў. Адзін з іх, мне трэба змяніць спіс паказваюць на наступнае поле, 50. Так выказаць здагадку, што я спрабую выдаліць 34. Так гэты хлопец павінен ісці далёка ў імгненне. Так што я збіраюся сказаць, спіс атрымлівае паказальнік побач. Ну, гэта паказальнік. Наступная паказвае тут. Так гэтая сітуацыя мяняецца гэтую стрэлку права Цяпер, каб паказаць на гэтага хлопца тут. Цяпер, памятаеце, у нас ёсць часовая пераменная. Такім чынам, мы не асірацеў любыя вузлы, таму што я таксама з гэтым хлопцам у маім рэалізацыя выдаляецца. Так што цяпер, калі сам спіс не з'яўляецца пустым, Мне трэба, каб выправіць сёе-тое. Мне трэба цяпер пераканацца, што гэтая стрэлка, які папярэдне паказваючы ад 50 да 34, гэта павінна сысці, таму што калі я спрабую пазбавіцца з 34, 50 лепш не падтрымліваць любы выгляд зваротная спасылка на яго як стрэлка прапанаваў. Так што я проста зрабіў гэтую лінію. Дык вось, я зрабіў. Гэтую справу на самай справе даволі проста. Отрубание галавы спісу адносна простая. На жаль, ёсць такі раздражняе яшчэ блок. Так што цяпер, я павінен разгледзець выпадак дзе ёсць нешта ў сярэдзіне. Але гэта не так ужо страшна, за выключэннем сінтаксісу, як гэта. Так што, калі я не ў пачатку Спіс, я дзесьці ў сярэдзіне. І гэтая лінія тут кажа, старт на ўсё, што вузел вы знаходзіцеся. Пераход да наступнага полі папярэдняга вузла і паказваюць, што на паказальнік. Давайце зробім гэта графічна. Гэта станавілася больш складана. Так што, калі ў мяне ёсць папярэднія поля тут - давайце зробім гэта - тут наступныя поля. Я збіраюся спрасціць мае паказальнікі, а чым намаляваць цэлую кучу рэчы назад і наперад перакрыжоўваюцца адзін да аднаго. А цяпер, давайце проста скажам, што гэта 1, 2, 3 дзеля абмеркавання, нават хоць гэта не супадаць з дадзеная праблема. Такім чынам, вось мой звязаны спіс. Я спрабую выдаліць два ў гэтым прыватнасці версія гісторыі. Так я абнавіў паказальнік быць паказваючы на ​​гэтага хлопца. Так што гэта PTR. Ён паказвае тут. Гэта спіс, які існуе глабальна, як і раней. І ён ніколі паказваючы тут ні на што. І зараз, я спрабую выдаліць два. Так што, калі паказальнік накіраваны тут, я будзе прытрымлівацца, па-відаць, папярэдняя паказальнік, які ставіць мяне ў 1. Я тады хацеў сказаць, што наступны поле, якое прыносіць мне да гэтай скрынка тут, збіраецца роўная паказальнік насупраць. Так што, калі гэты паказальнік, гэта побач. Гэта азначае, што гэтая стрэлка патрэбы пазначыць на гэтага хлопца. Так што, што радок кода мае толькі зроблена трохі пра гэта. І зараз, гэта выглядае як крок у правільным кірунку. Мы істотна хочаце, каб адрэзаць 2 ад'ездзе сярэдзіны 1 і 3. Так што мае сэнс, што мы хочам маршрут гэты паказальнік вакол яго. Так што гэта наступная радок праверкі, калі паказальнік наступная не з'яўляецца нулявым, ёсць сапраўды хтосьці справа ад 2, гэта азначае, што мы таксама павінны зрабіць трохі БНіП тут. Так што я зараз павінны прытрымлівацца гэты паказальнік і абнавіць папярэдні паказальнік на гэты хлопец, каб зрабіць трохі абыйсці тут кропку тут. А цяпер, візуальна гэта прыемна. Гэта трохі брудны у тым, што ёсць ніхто не паказваючы на ​​2 больш. 2 паказвае на левай баку. І 2 паказвае направа. Але ён можа рабіць усё, што ён хоча, таму што ён збіраецца атрымаць свабоду. І не мае значэння, што гэтыя значэння больш. Важна тое, што тыя, што засталіся хлопцы маршрутызацыі вышэй і ніжэй яго зараз. І на самай справе, гэта тое, што мы будзем рабіць далей. Мы бясплатна паказальнік, а гэта значыць, мы гаворым аперацыйная сістэма, вы можаце каб вярнуць гэта. А потым, нарэшце, мы вернемся. Астатняе няяўна, калі мы яшчэ не вярнуліся, мы павінны працягваць пошукі. Так паказальнік роўная паказальнік наступны раз азначае рухацца гэты хлопец тут. Перасоўванне гэтага хлопца тут. Перасоўванне гэтага хлопца тут, калі, па сутнасці, мы не знайшлі нумар мы шукаем яшчэ. Так шчыра кажучы, гэта выглядае зусім Пераважная, я думаю, у першую чаргу погляд, асабліва калі вы з усіх сіл з гэтым у ходзе віктарыны затым паглядзець, нешта накшталт гэтага. І вы пагладзіць сябе па спіне. Ну, няма ніякага спосабу, я мог бы прыдумаць, што на віктарыне. Але я б сказаў, вы можаце, калі вы парушыце гэта ўніз, у гэтыя індывідуальныя выпадкі і проста ўвайсці ў яе старанна, хоць, трэба прызнаць, у стрэсавыя абставіны. На шчасце, карціна зробленая усё больш шчаслівым. Вы маглі звярнуць на гэта ў любую колькасць спосабаў. Вы не павінны рабіць, якія перасякаюць рэч тут. Вы можаце зрабіць гэта з прамой лініі, як гэта. Але сутнасць гэтай праблемы, у Наогул, было разумець, што карціна ў канцы павінны трохі нешта накшталт гэтага, таму што Сталая часу мае на ўвазе, што вы трымаеце перашкод і перашкод і перашкод новыя вузлы ў пачатку з спісу. Ёсць пытанні? Верагодна, найбольш складанай з вядома пытанні кадавання. АЎДЫТОРЫЯ: Так спіс падобны на галаву ў папярэдніх прыкладах. Дэвід Дж. Малан: Сапраўды, сапраўды. Проста іншае імя для глабальная пераменная. Ва ўсім свеце і што? ROB BOWDEN: ОК. Так што гэта тое месца, дзе вы павінен быў напісаць гэты пункт. Некаторыя людзі пісалі эсэ на гэтае пытанне. Але трэба проста выкарыстоўваць гэтыя шэсць членаў каб апісаць, што адбываецца, калі Вы паспрабуйце звязацца facebook.com. Так што я буду проста казаць праз працэс выкарыстоўваючы ўсе гэтыя тэрміны. Так у нашым браўзэры, мы набіраем facebook.com і націсніце Увод. Такім чынам, наш браўзэр збіраецца пабудаваць HTTP прасіць, каб ён збіраецца адправіць праз некаторы працэсу ў Facebook для 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 да гэтай машыне. Так, як гэта дабрацца да гэтай машыны? Ну, запыт ідзе ад маршрутызатар да маршрутызатара падскокваючы. Памятаеце прыклад у класе, дзе мы фактычна бачылі маршрут, што Пакеты ўзяў, калі мы спрабавалі мець зносіны. Мы бачылі гэта пераскочыць праз Атлантыку Акіян у адной кропцы або любы іншы. Такім чынам, апошні член порт. Так што гэта цяпер на вашым кампутары. Вы можаце мець некалькі рэчаў у цяперашні час зносін з Інтэрнэтам. Так што я магу быць запушчаны, скажам, Skype. Я, магчыма, вэб-браўзэр з адкрытым. Я мог бы мець тое, што torrenting файлы. Так што ўсе гэтыя рэчы зносін з Інтэрнэт у некаторым родзе. Таму, калі ваш кампутар атрымлівае некаторыя дадзеныя з Інтэрнэту, як робіць гэта ведаю, што прыкладанне на самай справе хоча дадзеныя? Як гэта ведаю, наколькі гэта прыватнасці дадзеныя, прызначаныя для torrenting прыкладанне ў адрозненне ў вэб-браўзэры? Так што гэта мэта партоў ў тым, што ўсе гэтыя прыкладанні маюць сцвярджаў, порт на вашым кампутары. Так што ваш вэб-браўзэр кажа, эй, Я на порце 1000. І ваша праграма torrenting кажа, Я на порце 3000. І Skype кажа, я выкарыстоўваю порт 4000. Таму, калі вы атрымліваеце некаторыя дадзеныя, якія належыць да аднаго з гэтых прыкладанняў, дадзеных адзначаны які порт ён на самай справе павінны быць дасланыя разам з. Так што гэта кажа, о, я належу да порта 1000. Я ведаю, то мне трэба накіраваць гэты разам з маім вэб-браўзэра. Так што прычына, што гэта стаўленне тут з'яўляецца тое, што вэб-серверы, як правіла, порт 80. Таму, калі я звязацца Facebook.com, я зносін з некаторай машыны. Але я павінен сказаць, які порт, што машына Я хачу мець зносіны з. І вэб-серверы, як правіла, праслухоўвае порт 80. Калі б яны хацелі, яны маглі ўсталяваць яго так, гэта паказвае, як на порце 7000. А потым у вэб-браўзэры, я мог ўручную ўвесці Facebook.com: 7000 у адправіць запыт на порт 7000 вэб-сервер Facebook. Дэвід Дж. Малан: І ў гэтым выпадку, нават хоць мы не патрабавалі, каб людзі кажу пра гэта, у дадзеным выпадку, тое, што порт будзе запыт на самай справе пайсці? Паспрабуйце яшчэ раз. Менавіта так. Не маю патрэбу ў гэтым, але тонкасць што не там ні апошнім. ROB BOWDEN: Так HTTPS, так як гэта слухаць спецыяльна для зашыфраваны, гэта на порце 4430. Аўдыторыя: і электронныя лісты 25, ці не так? Дэвід Дж. Малан: Выходны трафік электронныя лісты, 25, так. ROB BOWDEN: я нават не ведаю, што большасць з - Усё ніжнія маюць тэндэнцыю быць зарэзерваваны для рэчаў. Я думаю, што ўсё пад 1024 зарэзерваваны. АЎДЫТОРЫЯ: Чаму вы кажаце, 3 быў няправільны нумар? ROB BOWDEN: Таму што ў IP-адрас, ёсць чатыры групоўкі лічбаў. І яны ад 0 да 255. Так 192.168.2.1 з'яўляецца агульным Лакальны IP-адрас сеткі. Звярніце ўвагу, усе тыя, менш, чым 255. Таму, калі я пачаў з 300, што не мог мець быў адным з лікаў. Дэвід Дж. Малан: Але гэта глупства кліп ад - гэта было CSI, дзе яны павінны былі лік, якое было занадта вялікім для IP-адрасы. ROB BOWDEN: Усе пытанні па гэтай нагоды? Наступны, так поўнае змяненне тэма, але ў нас ёсць гэта PHP масіў для дома ў четырехядерных. І ў нас ёсць неўпарадкаваных спіс. І мы хочам, каб раздрукаваць кожнага элемента спісу проста, якая змяшчае імя дом. Таму ў нас ёсць цыкл па кожнаму элементу. Так што памятаеце, сінтаксіс Еогеасп Масіў як элемента масіва. Так праз кожны ітэрацыі цыклу, дом збіраецца ўзяць на адным з значэнні ўнутры масіва. На першай ітэрацыі, дом будзе Кабот Дом. На другі ітэрацыі, дом будзе быць Курьер дома і гэтак далей. Такім чынам, для кожнага квадрата, як дома, мы проста ў друк - Вы таксама маглі б рэхам - элемент спісу, а затым назва дома ў і зачыніце элемент спісу. Фігурныя дужкі з'яўляюцца неабавязковымі тут. І тады мы таксама сказаў у пытанні Сам, не забудзьцеся зачыніць неўпарадкаваных спіс тэгаў. Так што мы павінны выйсці з рэжыму PHP для таго, каб зрабіць гэта. Ці мы маглі б паўтарае зачыніць неўпарадкаваных спіс тэг. Дэвід Дж. Малан: Таксама добра тут будзе былі выкарыстоўваць старую школу для пятля з $ I = 0 0 і выкарыстоўваючы разлічвае на высветліць даўжыню прамяня. Цалкам таксама добра, толькі трохі wordier. АЎДЫТОРЫЯ: Дык што, калі вы збіраліся [Неразборліва], вы маглі б зрабіць - Я забыўся, што пятля [неразборліва] ёсць. Вы б $ чатырох'ядравы кранштэйны я? Дэвід Дж. Малан: Цалкам дакладна. Так, менавіта так. ROB BOWDEN: што-небудзь яшчэ? Дэвід Дж. Малан: Добра. Кампрамісы. Так з'явіліся гронкі адказаў магчыма для кожнага з іх. Мы сапраўды проста шукаеце нешта прывабным для перавернутай і і адваротны бок. І лік 16 спытаў, праверка карыстальнікі ' уваход з боку кліента, так як з JavaScript, замест боку сервера, а з PHP. Так у чым жа патэнцыял росту рабіць на баку кліента? Ну, адна з рэчаў, мы прапанавалі гэта што вы паменшыць час чакання, таму што вы не прыйдзецца турбавацца кантакце сервер, які можа заняць некалькі мілісекунд ці нават пару секунд пазбягаючы, што і проста Праверка звестак, якія ўводзяцца на баку кліента карыстальнікаў па выклікаючы на-ўявіць апрацоўшчык і проста праверка, яны тыпу нешта ў якасці імя? Хіба яны нешта тыпу на працягу адрас электроннай пошты? Хіба яны выбіраюць інтэрнат ад выпадальнае меню? Вы можаце даць ім імгненную зваротную сувязь з дапамогай гігагерц кампутар ці што ў іх ёсць гэта фактычна на стале. Так што гэта проста лепш карыстальнік вопыт звычайна. Але недахоп рабіць на баку кліента Праверка, калі вы робіце гэта без таго, рабіць праверку на боку сервера з'яўляецца тое, што Найбольш нехта выходзіць з CS50 ведае што вы можаце проста адправіць любое дадзеныя, якія неабходна на сэрвэры любую колькасць спосабаў. Шчыра кажучы, у большасці любым браўзэры, вы можаце націсніце вакол у наладах і проста выключыць наяўнасць, якая б, Таму, адключыць любую форму праверка. Але вы таксама маглі б успомніць, што нават я зрабіў нейкія мудрагелістыя дзеянні ў класе, выкарыстоўваючы Telnet і фактычна робячы выгляд, быць браўзэру, адправіўшы GET запыты да сервера. І гэта, вядома, не з дапамогай любога JavaScript. Вось толькі мне ўводу каманд на клавіятуры. Так на самай справе, любы праграміст ў досыць камфорт з вэб-і HTTP- можа адправіць ўсе дадзеныя ён або яна хоча да сервера без праверкі. І калі ваш паслужнік ня таксама праверкі, яны даць мне імя, з'яўляецца гэта на самай справе сапраўдны адрас электроннай пошты, зрабіў яны выбіраюць інтэрнат, то ў канчатковым да ўстаўкі падробленых або проста пусты дадзеных у базу дадзеных, якая, верагодна, не будзе добра, калі Вы былі мяркуючы, што гэта было. Так што гэта прыкрая рэальнасць. Але ў агульным, на баку кліента праверка вялікі. Але гэта значыць, у два разы больш працы. Хоць існуюць розныя бібліятэкі, JavaScript бібліятэкі для Асобнік, якія робяць гэта шмат, значна менш галаўнога болю. І вы можаце выкарыстоўваць частка кода на боку сервера, на баку кліента. Але разумею, што гэта, як правіла, дадатковая праца. Так. АЎДЫТОРЫЯ: Дык што, калі мы проста сказаў менш бяспечным - Дэвід Дж. Малан: [смяецца] Цьфу. Тыя, заўсёды цяжэй тыя, для разгляду. ROB BOWDEN: Гэта было б былі прынятыя. Дэвід Дж. Малан: Што? ROB BOWDEN: Я стварыў гэтую праблему. Гэта была б прынятая. Дэвід Дж. Малан: Так. АЎДЫТОРЫЯ: Круто. ROB BOWDEN: Але мы не прымалі для першага - добра, што мы шукалі гэта нешта накшталт вас не павінны сувязі з серверам. Мы не прымаем толькі хутчэй. АЎДЫТОРЫЯ: А як наконт не перагрузіш старонку? ROB BOWDEN: Так. Гэта было прынята адказваць. Дэвід Дж. Малан: Усе, дзе мы адчувалі, гэта было больш верагодна, чым няма, хутчэй за ўсё што вы ведалі, што вы былі кажучы, што з'яўляецца жорсткім лінія звярнуць часам. Выкарыстанне звязанага спісу, а ня з масіва для падтрымання сартуюцца спіс цэлых лікаў. Так з ног, мы часта цытуюць з звязаны спісы, матываваныя ўсю сваю Ўвядзенне быў вы атрымліваеце дынамізм. Яны могуць расці. Яны могуць скарачацца. Так што вам не прыйдзецца скакаць праз абручы на самай справе стварыць больш памяці з масівам. Ці вы не павінны проста кажуць, прабачце, карыстальнік. Масіў запаўняецца. Так дынамічны рост спісе. Ніжняя бок, хоць звязаных спісаў? АЎДЫТОРЫЯ: Гэта лінейная. Пошук на звязаны спіс лінейная замест таго, што вы ўваходзіце ў Дэвід Дж. Малан: Цалкам дакладна. Пошук на звязаны спіс з'яўляецца лінейным, нават калі гэта сартуецца, таму што вы можаце толькі наступныя хлебныя крошкі, гэтыя паказальнікі, ад пачатку спісу да канца. Вы не можаце выкарыстаць выпадковы доступ і, Такім чынам, бінарны пошук, нават калі гэта сартуюцца, што вы маглі б зрабіць з масівам. І ёсць яшчэ адна вартасць. Так. АЎДЫТОРЫЯ: Памяць неэфектыўна? Дэвід Дж. Малан: Так. Ну, я б не стаў абавязкова сказаць неэфектыўным. Але гэта будзе каштаваць вам больш памяці, таму што вам трэба 32 біта за кожны вузел для дадатковага паказальніка, па крайняй меры, для аднанакіраванага спісу. Цяпер, калі вы толькі спосаб захоўвання цэлалікавых і Вы дадаеце паказальнік, гэта на самай справе выгляд нетрывіяльна. Гэта падваенне аб'ёму памяці. Але на самай справе, калі вы захоўваеце звязаны спіс структур, якія маглі б 8 байт, 16 байт, яшчэ больш Акрамя гэтага, можа быць, гэта менш маргінальнай кошту. Але гэта кошт, тым не менш. Так што альбо з тых б ужо было выдатна, як недахопы. 18. Выкарыстанне PHP замест C напісаць Праграма каманднага радка. Дык вось, гэта часта хутчэй выкарыстоўваць мова, як PHP або Ruby, або Python. Вы проста хутка адкрыць да тэкставым рэдактары. У вас ёсць значна больш функцый даступныя для вас. PHP мае ракавіну функцый, тады як у C, вы ёсць вельмі і вельмі мала. На самай справе, хлопцы ведаюць на ўласным горкім вопыце што ў вас няма хэш-табліцы. Вы не звязалі спісы. Калі вы хочаце, каб тыя, вы павінны рэалізаваць іх самастойна. Так што патэнцыял росту PHP або сапраўды любы інтэрпрэтаваць мова з'яўляецца шпаркасць з дапамогай якога можна пісаць код. Але недахоп, мы бачылі гэта, калі я хутка на хуткую руку misspeller рэалізацыя ў лекцыі з выкарыстаннем PHP, з'яўляецца што выкарыстанне інтэрпрэтаванага мовы як правіла, больш павольна. І мы бачылі, што відавочна з павелічэнне часу ад 0,3 секунды да 3 секунд, з-за інтэрпрэтацыі што адбываецца на самай справе. Іншы верх у тым, што вам не абавязкова збіраць. Так яно і паскарае распрацоўку дарэчы, таму што ў вас няма ў два этапы запуску праграмы. Вы проста ёсць. І такім чынам, гэта даволі пераканаўчым, а таксама. Выкарыстанне базы дадзеных SQL замест файл у фармаце CSV для захоўвання дадзеных. Так SQL база дадзеных выкарыстоўваецца для pset7. CSV файлаў, якія вы не выкарыстоўвалі шмат. Але вы выкарыстоўвалі яго ўскосна ў pset7 як добра, пагаварыўшы з Yahoo Finance. Але CSV гэтак жа, як файл Excel, але супер проста, дзе слупкі проста дэмаркіраваную коскамі ўнутры у адваротным выпадку з тэкставага файла. І з выкарыстаннем базы дадзеных SQL з'яўляецца трохі больш пераканаўчым. Гэта станоўчая бок, таму што вы атрымліваеце тое, як абраць і ўстаўляць і выдаляць. І вы атрымаеце, як мяркуецца, індэксы, MySQL і іншых баз дадзеных, як Oracle, пабудаваць для вас у памяці, што азначае, што ваш выбар, верагодна, не будзе лінейнай зверху ўніз. Гэта на самай справе будзе нешта як бінарны пошук ці нешта блізкія па духу. Такім чынам, яны як правіла, хутчэй. Але недахоп у тым, што гэта проста больш працы. Гэта больш высілкаў. Вы павінны зразумець, базы дадзеных. Вы павінны ўсталяваць яго. Вам патрэбен сервер для запуску што база дадзеных па. Вы павінны разумець, як яго наладзіць. Так што гэта толькі гэтыя віды кампрамісаў. У той час як файл CSV, вы можаце стварыць яго з Gedit. І вы добра ісці. Там няма складанасці за рамкі гэтага. Выкарыстанне сінтаксічнага дрэва замест хэш-табліцы з паасобнага звязвання для захоўвання слоўнік слоў, якія нагадваюць з pset5. Так спрабуе ўверх, у тэорыі па меншай меры, гэта тое, што? Пастаянны час, па меншай меры, калі вы хэшавання на кожным з асобных літары ў словы, як і вы можа мець для pset5. Гэта можа быць пяць хэшы, шэсць хэшы, калі ёсць пяць ці шэсць літары ў слове. І гэта вельмі добра. І калі ёсць верхняя мяжа, як доўга вашы словы могуць быць, гэта сапраўды асімптатычна пастаянная часу. У той час як хэш-табліцу з асобным ланцужкі, праблему там з, што Такая структура дадзеных з'яўляецца тое, што выкананне вашых алгарытмаў звычайна залежыць ад колькасці рэчаў ўжо ў структуры дадзеных. І гэта, безумоўна, у выпадку з ланцугу, у выніку чаго больш матэрыялу вы паклалі ў хэш-табліцу, тым даўжэй тых, ланцуга ісці, што азначае, у горшым так, то, што вы маглі б шукаць ўсё шляху ў канцы адзін з гэтых ланцугоў, якія эфектыўна перадае ў чымсьці лінейнай. Цяпер, на практыцы яна можа абсалютна быць так, што хэш-табліцу з ланцуга хутчэй, чым адпаведны Рэалізацыя сінтаксічнага дрэва. Але гэта па розных прычынах, сярод якія спрабуе выкарыстаць усю серыю што памяць можа, на самай справе, павольныя рэчы ўніз, таму што вы не атрымліваеце добры Перавагі, што называецца кэшаванне, дзе рэчы, якія блізка адзін да аднаго ў памяці можна атрымаць часта больш хутка. І часам вы можаце прыдумаць сапраўды добры хэш-функцыя. Нават калі вам прыйдзецца марнаваць трохі памяці, вы можаце, вядома, быць у стане знайсці рэчы хутка і ня так дрэнна, як лінейна. Карацей кажучы, ёсць не абавязкова з любым з іх адзін ці нават два канкрэтныя рэчы, якія мы шукалі. Сапраўды нічога пераканаўчым як уверх і недахопаў як правіла, трапіўся на вочы. ROB BOWDEN: Дык што для версе, мы зрабілі ня прымае самастойна "хутчэй". Вы павінен быў сказаць нешта пра гэта. Нават калі вы тэарэтычна хутчэй сказаў, мы ведалі, што вы, здаецца, зразумеў што гэта 0 1. І хэш-табліцы, у тэорыі, ня 0 1. Згадка нічога выканання як правіла, атрымалі вы кропкі. Але "хутчэй", большасць рашэнняў на вялікі савет, якія былі галіны былі аб'ектыўна павольней, чым рашэнняў што былі хэш-табліцы. Так хутчэй і само па сабе не зусім так. Дэвід Дж. Малан: Дом дэ дом дом. Я, напэўна, адзіны, які разумее, вось як, што, як мяркуецца, прамаўляцца, правільна? ROB BOWDEN: у мяне не было на самай справе не ведаю,. Дэвід Дж. Малан: Ён зрабіў сэнс у маёй галаве. ROB BOWDEN: Я раблю гэта. ОК. Так што гэта тое месца, дзе вы павінны былі звярнуць Дыяграма падобная на вас, магчыма, бачылі на мінулых экзаменаў. Так што давайце проста паглядзім на гэта. Так што з HTML вузла, у нас ёсць два дзеці, галава і цела. Такім чынам, мы пашырыцца - галаву і цела. Галоўка мае тэг загалоўка. Таму ў нас ёсць назва. Цяпер, адна рэч, шмат людзей забыўся, што гэтыя тэкставыя вузлы элементы ўнутры гэтага дрэва. І вось мы, здараецца, прыцягнуць іх у выглядзе авалаў каб адрозніваць іх ад іх тыпы вузлоў. Але звярніце ўвагу таксама тут у нас ёсць вяршыні, сярэдні, і ніжні будзе ў канчатковым выніку тэкставыя вузлы. Так забываючы тых, была некалькі агульнай памылку. Цела мае траіх дзяцей - гэтыя тры дзівы. Так спраў, спраў, спраў, а затым тэкст вузел дзеці тых дзівы. Гэта ў значнай ступені гэта для гэтага пытанні. Дэвід Дж. Малан: І варта заўважыць,, хоць мы не будзем спыняцца на іх дэталі ў часу мы праводзім на JavaScript, што парадак робіць, у Справа ў тым, незалежна ад таго, у тэхнічным плане. Так што, калі кіраўнік ідзе перад органам у HTML, то ён павінен з'явіцца ў злева ад цела ў фактычным DOM. Што яго, увогуле, проста FYI, тое, што называецца парадак дакумент, дзе гэта мае значэнне. І калі вы былі рэалізацыі парсер, праграма, якая чытае HTML у будынку уверх па дрэве ў памяці, калі шчыра, вось інтуітыўна верагодна, што вы зрабіць у любым выпадку - зверху ўніз, злева направа. ROB BOWDEN: Пытанні з гэтай нагоды? Ці павінен я зрабіць наступны? Дэвід Дж. Малан: Вядома. ROB BOWDEN: ОК. Так што гэта перапаўненне буфера напад пытанне. Галоўнае, каб прызнаць тут, ну, як маглі б супернік трук гэтая праграма ў выкананні адвольнага кода? Так argv1, першы каманднага радка аргумент гэтай праграмы, якія могуць быць адвольнай даўжыні. Але тут мы выкарыстоўваем тетсру скапіяваць argv1, якія тут знаходзіцца бар. Мы перадачы яго ў якасці аргументу. І так гэта займае на завадской бар. Такім чынам, мы memcpying бар у гэтай буфернай ст. Колькі байт мы капіявання? Ну аднак многія бар байт здараецца выкарыстоўваць, даўжыню гэтага аргументу. Але з складае ўсяго 12 байт у шырыню. Так што, калі мы набярэм аргумент каманднага радка гэта больш, чым 12 байт, мы збіраецца перапаўняцца гэта прыватнасці буфера. Цяпер, як можа праціўнік падмануць запраграмаваць ў выкананні адвольны код? Таму памятайце, што тут Асноўны кліча Foo. І так, то асноўныя выклікі Foo. Давайце намалюем гэта. Так у нас ёсць стэк. А галоўнае ёсць кадр стэка у ніжняй часткі. У нейкі момант, асноўныя выклікі Foo. Ну, адразу, асноўныя выклікі Foo. І так Foo атрымлівае уласны фрэйм ​​стэка. Зараз, у нейкі момант, Foo збіраецца вярнуцца. І пайшоў Foo вяртання, мы павінны ведаць, у што радок кода ўнутры галоўнага мы былі для таго, каб ведаць, дзе мы павінны аднавіць у асноўны. Мы можам назваць Foo ад ў цэлым куча розных месцах. Як мы ведаем, дзе, каб вярнуцца? Ну, нам трэба захаваць, што недзе. Так недзе прама тут, мы захоўваем дзе мы павінны вярнуцца, каб яшчэ Foo вяртаецца. І гэта зваротны адрас. Бо супернік можа скарыстацца гэтага з'яўляецца той факт, што гэты буфер з захоўваецца, давайце сказаць, прама тут з. Такім чынам, мы атрымалі 12 байт для с. Гэта з. І гэта стэк кольца Foo ст. Такім чынам, калі зламыснік ўваходзіць больш байт, чым 12 або яны ўваходзяць у каманду Аргумент радок, якая даўжэй, чым 12 знакаў, то мы збіраемся перапаўненне гэты буфер. Мы можам працягваць ісці. І ў нейкі момант, мы ідзем далёка Дастаткова таго, што мы пачынаем перазапісу гэты зваротны адрас. Таму, як толькі мы перазапісаць адрас вяртання, Гэта азначае, што калі Foo вяртаецца, мы вяртаемся туды, дзе зламыснік кажа яго па любое значэнне ён увайшоў, якім бы знакаў карыстач увёў. І таму, калі зламыснік у цяперашні час асабліва разумны, ён можа мець гэта вярнуцца да дзесьці ў PRINTDEF функцыя ці недзе ў Таноса Функцыя, дзе-небудзь адвольным. Але яшчэ больш разумны гэта тое, што калі ў яго ёсць карыстальнік вярнуцца да прама тут. І тады вы пачынаеце выкананне іх як радкоў кода. Так у гэтай кропцы, карыстальнік можа ўвесці усё, што ён хоча ў гэтым рэгіёне. І ён мае поўны кантроль над вашай праграмы. Пытанні па гэтай нагоды? Так што ў наступны пытанне завяршэння перапісанай Foo такім чынам ня, што гэта больш не ўразлівыя. Такім чынам, ёсць некалькі спосабаў, вы маглі б зрабіць гэта. У нас яшчэ ёсць з толькі быць даўжынёй 12. Вы, магчыма, змянілі гэта як частка вашага рашэння. Мы таксама дадалі праверку, каб зрабіць упэўнены бар ня быў пустым. Хоць вам не трэба што за поўны крэдыт. Такім чынам, мы праверкі спачатку даўжыня радка бар. Калі гэта больш за 12, то фактычна не робяць копію. Дык вось адзін з спосабаў яе выпраўленне. Іншы спосаб фіксацыі яго ёсць замест маючы гр быць толькі даўжыні 12, у мяне быць даўжыні STRLEN (бар). Іншы спосаб фіксацыі яго з'яўляецца на самай справе, толькі што вярнуліся. Так што калі вы толькі што пазбавіўся ад усіх гэта, калі вы толькі што выдаліў усе радкоў кода, вы атрымалі б поўны крэдыт, так як гэтую функцыю на самай справе не чагосьці дамагчыся. Гэта капіявання з каманднага радка Аргумент у некаторую масіва ў яе мясцовы кадр стэка. І тады, што вяртаецца. І ўсё, што ён дасведчаны сышоў. Так вяртанне было таксама досыць спосаб атрымаць поўны крэдыт. Дэвід Дж. Малан: Не зусім дух пытанне, але прымальны за спецыфікацыі, тым не менш. ROB BOWDEN: Пытанні па любой з гэтага? Адзінае, што вы па крайняй меры трэба было кампіляцыі кода. Таму, нават калі тэхнічна вы не уразлівымі, калі ваш код ня кампіляцыі, мы не пагадзіцца з гэтым. Няма пытанняў? ОК. Дэвід Дж. Малан: Вы хочаце сказаць гэта назва? ROB BOWDEN: Не. Дэвід Дж. Малан: Так у гэтым, гэта была ці добрая гэта навіна ці дрэнная навіна. Гэта літаральна тая ж праблема у якасці першага віктарыны. І гэта амаль тое ж самае Праблема, як pset1. Але гэта было наўмысна спрошчаная, каб быць прасцей піраміда, які можа быць вырашана са злёгку прасцей ітэрацыі. І на самай справе, што мы атрымлівалі ў тут не столькі логіка, таму, верагодна, да гэтага моманту, вы больш камфортна, чым вы былі у тыдзень адзін з для завес ці чаму завес, але на самой справе, каб дражніць адзін ад аднаго, што вы крыху знаёмыя з Паняцце, што PHP не толькі пра тое, што праграмавання. Гэта сапраўды можа быць выкарыстаны ў якасці мовы пісаць праграмы каманднага радка. І на самай справе, гэта тое, што мы спрабавалі каб звярнуць вашу ўвагу на. Гэта праграма PHP каманднага радка. Так C код тут, у той час як правільнае у З, ня выправіць для PHP. Але код сапраўды адно і тое ж. Калі параўнаць рашэнні для віктарыны 0 супраць Віктарына 1, вы выявіце, што гэта амаль ідэнтычныя, за выключэннем некаторыя знакі даляра і для Адсутнасць тыпу дадзеных. У прыватнасці, калі мы зірнем тут, вы ўбачыце, што мы перабіраем, у гэтым выпадак, ад 1 да да 7. Мы маглі б зрабіць гэта 0 індэкс. Але часам, я думаю, гэта проста думках лягчэй думаць пра рэчы, ад 1 да 7. Калі вы хочаце адзін блок, потым два блокі, потым тры, потым кропка, кропка, кропка сем. Мы J ініцыялізацыі да 1 а затым разлічвае на да I. І тут усё у адваротным выпадку ідэнтычныя. Але варта назваць некалькі рэчаў. Мы даем вам гэтыя два радкі, гэта першае адзін, goofily названы як прытон для рэзкага выбуху. І гэта толькі паказвае шлях, папка, у якой праграма можа быць выявілі, што вы хочаце выкарыстоўваць інтэрпрэтаваць гэты файл. І тое лінія пасля гэтага, з Вядома, азначае увайсці ў рэжым PHP. А лінія ў самым нізе азначае выхаду з рэжыму PHP. І гэта працуе, увогуле, з інтэрпрэтаваная мова. Гэта свайго роду раздражняе, калі вы пішаце Праграма ў файле пад назвай foo.php. І тады вашыя карыстальнікі павінны проста памятаеце, ОК, каб запусціць гэтую праграму, я павінны ўвесці "PHP прастору foo.php." Выгляд раздражняе, калі нічога іншага. І гэта таксама паказвае, што ваша праграма напісана ў PHP, які не ўсе што асвятлення для карыстальніка. Такім чынам, вы можаце выдаліць. PHP наогул Нагадаем, ад лекцыі. І вы рэальна можаце зрабіць. / Foo калі Вы chmodded яго, зрабіўшы яго выкананы. Так CHMOD + х Foo зрабіў бы гэта. І калі вы таксама дадаць прытон тут. Але на самой справе, праблема хіліць Раздрукаваўшы нешта накшталт гэтага. Няма HTML, няма C-код, вядома, толькі некаторыя PHP. Так Міла затым вярнуўся ў задачы 25. І ў 25, вам далі наступныя Код шкілет, які быў даволі проста вэб-старонкі. І сакавітая частка HTML-мудры знізіўся тут, дзе мы маем ўнутры цела форма, якая мае унікальны ідэнтыфікатар ўваходу усярэдзіне якога было два ўваходу, адзін з ідэяй імя, адзін з ідэяй кнопкі. Першым быў тып тэксту, Другі тып ўяўляе. І так, мы далі вам, на самай справе, больш інгрэдыенты, чым вам трэба, проста так вы, хлопцы, былі варыянты, з якімі каб вырашыць гэтую праблему. Вы не строга неабходна ўсе гэтыя ідэнтыфікатары. Але гэта дазваляе вырашыць гэта па-рознаму. І наверсе, заўважыць, што Мэтай было выклікаць акно, як гэта - Добры дзень, Міла! - з'яўляцца ў браўзэры з дапамогай супер проста, калі не вырадак, абвесткі функцыя. І так, у канчатковым рахунку, гэта зводзіцца канцэптуальна неяк праслухоўвання Довады віду на баку кліента , Ці не на боку сервера, так ці інакш адказваючы на ​​гэтай прадстаўленні хапаючы значэнне, уведзены карыстальнікам і поле імя, а затым адлюстроўваючы яго ў целе папярэджання. Так адзін з спосабаў зрабіць гэта з JQuery, які выглядае крыху сінтаксічна здзіўленне ў першую чаргу. Вы можаце зрабіць гэта з чыстай кода DOM - document.getelement па ID. Але давайце зірнем на гэтай версіі. У мяне ёсць некалькі важных лініі ў першую чаргу. Так што, у нас ёсць гэтая лінія, якая з'яўляецца ідэнтычны таму, што вы, магчыма, бачылі у, я лічу, form2.html ад класа ў тыдзень 9. І гэта проста кажу, выканаць Наступны код, калі дакумент гатовы. Паколькі гэта важна толькі таму, што HTML старонкі чытаюцца зверху знізу, злева направа. І таму, калі вы паспрабуеце зрабіць нешта ў кодзе тут у нейкі DOM элемент, некаторыя HTML тэгі, гэта ўніз тут, вы робіце гэта занадта рана, таму што гэта не мае нават быў прачытаны ў памяць. Так, кажучы гэтую document.ready лінія, мы гаворым, Вось код, браўзэр. Але не ня выконваць гэта, пакуль у цэлым Дакумент гатовы, то ёсць DOM дрэва існуе ў памяці. Гэта адна крыху больш проста, калі сінтаксічна трохі адрозніваецца, дзе я кажу, захоп элемент HTML чые унікальныя ідэнтыфікатар ўваходу. Гэта тое, што хэш-тэг пазначае, унікальны ідэнтыфікатар. А потым я тэлефаную. Уявіць. Так. Уявіць тут з'яўляецца функцыяй, у адваротным выпадку вядомы як спосаб, гэта ўнутры аб'екта на левай бок там, што я не вылучыць. Так што калі вы думаеце, уваходаў у якасці аб'екта ў памяці - і гэта сапраўды так. Гэта вузел у дрэве - . Уявіць сродкі, калі гэтая форма з гэты ідэнтыфікатар уяўляецца, выканаць наступны код. Мне ўсё роўна, як называецца функцыя Я выканання. Дык вось, я выкарыстоўваю, як і раней, што называецца функцыяй лямбда або ананімная функцыя. Гэта зусім не інтэлектуальна Цікава іншае, чым гэта не мае імя, і гэта добра, калі вы толькі калі-небудзь буду называць яго адзін раз. А ўнутры я на самой справе справіцца прадстаўленне формы. Я спачатку аб'явіць зменную называецца значэнне. І тое што эфект ад гэтага падкрэсліў частка тут цяпер? Што гэта рабіць у высокі ўзровень для мяне? АЎДЫТОРЫЯ: Ён атрымлівае значэнне, карыстальнік не ніжэй у HTML. Ён атрымлівае гэты ідэнтыфікатар, а затым выяўляе, што значэнне яго. Дэвід Дж. Малан: Цалкам дакладна. Яна захоплівае вузел, чые унікальныя ідэнтыфікатар імя. Ён атрымлівае значэнне ў ім, якія гэта, па-відаць, што карыстач набралі яго ці сябе. А потым ён захоўвае, што ў зменная з імем значэнне. Як і ў бок, вы маглі б таксама зрабіў гэта крыху па-іншаму. Цалкам прымальным, робячы нешта хлусня значэнне зменнай атрымлівае document.getElementById. І менавіта таму гэта крыху стомна, каб не выкарыстоўваць JQuery. "Назва" значэнне .. Так цалкам прымальна. Розныя спосабы зрабіць гэта. JQuery проста мае тэндэнцыю быць трохі больш кароткім і вызначана больш папулярным сярод праграмістаў. Зараз, я раблю трохі разважнасці праверыць, таму што ў задачы заяву мы відавочна сказаў, калі Карыстальнік пакуль не набралі яго ці яе назваць, не паказваюць папярэджанняў. Але вы можаце праверыць на што, проста праверка на пусты радка для цытата-канец цытаты, калі ёсць нічога на самай справе. Але калі гэта не роўна катыровак канец цытаты, Я хачу патэлефанаваць абвесткі. І самае цікавае ў тым, што мы з дапамогай аператара плюс, які чым займаецца ў JavaScript? Аб'яднанне. Так што гэта, як PHPs аператара кропкі. Тая ж самая ідэя, сінтаксіс крыху іншы. І я проста стварэнне радок, вы бачылі на скрыншоце - Добры дзень, так і так. І тады апошняя дэталь заключаецца ў наступным. Чаму я вярнуцца ілжывае ўнутры гэтай ананімнай функцыі? АЎДЫТОРЫЯ: Там няма значэнне. Вы ставіце яго ў форме. Гэта проста кажа, калі значэнне не роўна пусты, то зрабіце гэта. Быў прабел у гэтай прадстаўлення. Дэвід Дж. Малан: ОК. Асцярожны, хоць. Там няма нікога тут. І, што вяртанне ілжывым знаходзіцца за межамі з, калі ўмовы. Так што гэта падкрэсліў лінію, вярнуцца ілжывым, не выконвае ні на што, калі формы. Што вяртання ілжывае ўнутры гэтага апрацоўшчык падзеі, як гэта называецца, разгляданая падзея быць прадстаўленне? АЎДЫТОРЫЯ: Таму што гэта адбываецца толькі адзін раз. Дэвід Дж. Малан: толькі адбываецца адзін раз. Не зусім. Да? АЎДЫТОРЫЯ: Гэта прадухіляе форму ад прадстаўлення да паводзінаў па змаўчанні, які зробіць перазагрузкі старонкі. Дэвід Дж. Малан: Цалкам дакладна. Так што я перагрузкі тэрмін прадставіць тут, таму што я кажу, форма ўяўляецца. Але, як вы кажаце, на самай справе гэта не быў прадстаўлены ў праўдзівай HTTP чынам. Пры націску кнопкі Адправіць, з-за нашага OnSubmit апрацоўшчык, мы перахопу што форма прадстаўлення, так бы мовіць. Мы тады рабіць сваю справу з кодам JavaScript. Але я свядома вяртання ілжывым, таму што я не хачу каб гэта адбылося долю секунды пазней для ўсёй форме Сам павінен быць прадстаўлены ў Інтэрнэце сервер з пар ключ-значэнне, змяніўшы URL, каб быць нешта накшталт д = кошкі або тое, што мы зрабілі, Напрыклад, у класе. Я не хачу, каб гэта адбылося, таму што няма слухае сервер для гэтага сфарміраваць уяўленне. Гэта чыста зроблена ў кодзе JavaScript. І менавіта таму я нават не маюць Дзеянне атрыбут маёй форме, таму што я не маюць намеру, каб гэта калі-небудзь зайсці на сервер. Так што гэта ўяўляецца. Але мы перахопу гэтую форму прадстаўленне і прадухілення дэфолту паводзіны, якое з'яўляецца фактычна прайсці ўвесь шлях да сервера. АЎДЫТОРЫЯ: Так трымаць яго на баку кліента. Дэвід Дж. Малан: Вядзенне гэта на баку кліента. Цалкам дакладна. Затым быў мой, аб MySQL. ROB BOWDEN: ОК. Так што гэта першае пытанне было наогул груба для людзей. Хоць больш познія пайшлі лепш. Такім чынам, вы павінны былі выбраць правільныя дадзеныя тыпу для абодвух гэтых слупкоў. І абодва з іх маюць некаторыя рэчы пра іх, што зрабіць выбар цяжка. Так унутр не правільны увядзіце колькасці. Прычына ў тым, 12-значны нумар рахунку лік, унутр не з'яўляецца дастаткова вялікім, каб захоўваць за ўсё лічбы. Так дзейнічае выбар быў бы вялікі Int, калі вы не ведаеце, што. Іншы варыянт мог бы быць поле сімвал даўжыні 12. Так што альбо з тых, працаваў бы. Int не будзе. Цяпер, баланс, ўспомніце pset7. Такім чынам, мы спецыяльна выкарыстоўвалі дзесятковыя захоўваць кошту акцый або - Дэвід Дж. Малан: Наяўнымі. ROB BOWDEN: Наяўнымі. Мы выкарыстоўвалі дзесятковыя для захоўвання колькасці грашовых сродкаў, якія карыстач у цяперашні час мае. Так па гэтай прычыне мы зрабіць гэта таму што, памятаеце, плавае. Там у з якая плавае кропкай у дакладнасці. Ён не можа дакладна захоўваць грошы значэнні, як мы хочам тут. Так дзесятковай здольны дакладна магазін нешта, скажам, два знака пасля коскі. Вось чаму баланс, мы хочам яго дзесятковы, а ня плаваць. Дэвід Дж. Малан: А таксама, таксама, хоць гэта магло б быць разумным і ў іншых кантэксты, каб думаць, можа быць, гэта гэта шанец для унутр. Я проста адсочваць рэчы ў капейкі. Таму што мы відавочна паказалі па змаўчанні Значэнне быўшы 100.00, што азначае, што ён можа быць проста унутр. І яшчэ тонкасць таксама з колькасці было тое, што гэта не было прызначана быць пытанне з падвохам. Але нагадаем, што унутр у MySQL, як у С, па меншай меры Прыбор, з'яўляецца 32-разрадным. І хоць мы не чакаем Вас дакладна ведаць, колькі лічбы, якія сродкі, не ўспомніць, што найбольшая колькасць Вы можаце прадстаўляць патэнцыйна з 32-разраднага колькасці прыкладна тое, што? Які нумар у нас заўсёды кажу? Ад 2 да 32, што і прыкладна? Вы не павінны ведаць дакладна. Але прыкладна карысна ў жыцці. Гэта прыкладна 4 мільярды. Такім чынам, мы сказалі, што некалькі разоў. Я ведаю, што сказаў, што некалькі разоў. І гэта прыкладна 4 мільярды. І гэта добрае правіла эмпірычнае ведаць. Калі ў вас ёсць 8 біт, 256 з'яўляецца магічным лікам. Калі ў вас ёсць 32 біта, 4 млрд. плюс-мінус. Так што калі вы проста запішыце 4000000000, вы ўбачыце, што гэта менш лічбаў, чым 12, што азначае, што відавочна не дастаткова выразнасць захапіць 12-значны нумар рахунку. ROB BOWDEN: ОК. Такім чынам, астатнія пайшлі лепш. Так выказаць здагадку, што банк накладае $ 20 штомесяц плата за абслугоўванне па ўсіх рахунках. З чым SQL запытаў маглі банк адняць $ 20 з кожнага лічыльніка, нават калі гэта прыводзіць да некаторых адмоўным сальда? Так у асноўным, Ёсць чатыры Асноўныя тыпы запытаў - ўставіць, выберыце, абнаўлення і выдалення. Такім чынам, што мы думаем, што мы збіраецеся выкарыстоўваць тут? Абнаўленне. Так што давайце зірнем. Дык вось мы абнаўляем. Які стол мы абнаўленні рахунку? Так абнаўленні рахунку. І тое сінтаксіс кажа, што на рахунках мы абнаўленні? Ну, мы ўсталёўваем баланс, роўны бягучае значэнне балансу мінус 20. Так што гэта будзе абнавіць усе радкі рахункаў, аднімання $ 20 з балансу. Дэвід Дж. Малан: Распаўсюджаная памылка тут, хоць мы часам дараваў яго, быў на самай справе ёсць PHP код тут выкліку функцыі запыту або пакласці Двукоссі вакол усяго, што не павінны быць там. ROB BOWDEN: Памятаеце, што MySQL з'яўляецца асобны мову з PHP. Мы, аказваецца, пісаць MySQL ў PHP. І PHP затым адправіць яго да сервера MySQL. Але вам не трэба PHP для таго, каб сувязь з сэрвэрам MySQL. Дэвід Дж. Малан: Цалкам дакладна. Так ніякія зменныя са знакамі даляра павінна быць у дадзеным кантэксце. Ён можа проста зрабіць усё матэматыкі ў самой базе дадзеных. ROB BOWDEN: ОК. Так што ў наступны адзін. Гэта наступны? Так. Так з тым, што SQL-запыт можа банк здабывання з памяці нумароў з-за яго багатыя кліенты, тыя, з Рэшткі больш, чым 1000? Дык які з чатырох асноўных тыпаў мы збіраемся тут трэба? Выберыце. Таму мы хочам, каб абраць. Што мы хочам, каб абраць? Што калонка мы хочам, каб абраць? Мы спецыяльна хочам для выбару нумара. Але калі вы сказалі зорка, мы Таксама прынята лічыць, што. Так выбраць нумар з якой табліцы? Ўліковыя запісы. І тое ўмова мы хочам? Дзе баланс перавышае 1000. Мы таксама прынялі больш або роўна. Апошняе адзін. З чым SQL запытаў маглі банк блізка, гэта значыць выдаліць усе рахункі, якія мае баланс $ 0? Такім чынам, якія з чатырох мы захоча выкарыстоўваць? Выдаліць. Так сінтаксіс для гэтага? Выдаліць з якой табліцы? Ўліковыя запісы. І тое ўмова, на якім мы хочам, каб выдаліць - дзе баланс роўны нулю. Так выдаліць усе радкі з рахункаў дзе баланс роўны нулю. Пытанні па любой з іх? Хочаце чарзе? Дэвід Дж. Малан: Чарга кіраўніцтва. Так у гэтым, мы далі вам некалькі знаёмыя структура, якую мы даследавалі трохі ў класе побач з структурамі, які быў дадзеныя структура, якая адносіцца па духу. Розніца хоць і з чаргі што мы павінны былі неяк памятаю, хто быў у пачатку чарзе, у вялікай частка, так што мы маглі б зрабіць больш эфектыўнае выкарыстанне памяці, па меншай меры, калі б мы выкарыстоўвалі масіў. Таму нагадаем, калі ў нас ёсць масіў, калі, напрыклад, гэта фронт чаргу, калі я атрымліваю ў чаргу тут, а потым хто-то ўваходзіць у лінію ззаду мяне, у мяне за спіной, у мяне за спіной, і адзін чалавек выходзіць з лініі, вы мог, як мы бачылі некаторыя з нашых чалавека добраахвотнікі ў класе, ёсць у кожнага перакласці гэты шлях. Але ў цэлым, то, усё робяць нешта не найлепшым чынам выкарыстаць час ў праграме, таму што гэта азначае, што ваш Алгарытм працуе ў якой асімптатычнае час працы? Гэта лінейная. І я адчуваю, што гэта свайго роду па-дурному. Калі наступны чалавек у чарзе на наступны Чалавек, які павінен ляцець у магазін, яны не ва ўсіх ёсць рухацца разам. Проста дазвольце, што чалавек будзе рваў калі прыйдзе час, напрыклад. Так што мы можам зэканоміць трохі часу там. І так, каб зрабіць гэта, аднак, што сродкі што кіраўнік чарзе або Пярэдняя частка чаргі будзе паступова рухацца глыбей і глыбей ў масіве і ў канчатковым рахунку маглі б фактычна абгарнуць вакол, калі мы выкарыстоўваем масіў для захоўвання людзей у гэтай чарзе. Такім чынам, вы можаце падумаць, з Масіў у выглядзе круглага дадзеных структура ў гэтым сэнсе. Такім чынам, вы так ці інакш давядзецца адсочваць памер яго ці сапраўды канец яго а затым, калі пачало ёй. Такім чынам, мы мяркуем, што вы аб'яўляеце адным з такіх чэргаў, пакліканне гэта д, проста адна літара. Тады мы прапануем, што пярэдняя быць ініцыялізавацца роўным нулю, і што памер ініцыялізаваць нуля. Таму ў дадзены момант, няма нічога ўнутры гэтай чарзе. І мы просім вас запоўніць рэалізацыя Enqueue ніжэй у такім чынам, каб функцыя дадае п да канец д, а затым вяртае ісціну. Але калі д поўная ці адмоўным, функцыя павінна замест вярнуцца ілжывым. І мы далі вам пару здагадак. Але яны на самай справе не функцыянальна стаўленне, проста BOOL існуе, таму што, тэхнічна, лагічны ня існуюць у C, калі вы не ўключаюць вызначаны файл загалоўка. Так што проста пераканайцеся, што не было гэта трук Пытанне роду рэчы. Так паставіць у чаргу, мы прапанавалі ва ўзоры рашэнні па рэалізацыі наступным чынам. Адзін з іх, мы спачатку правяраем лёгкасць, нізка віслыя садавіна. Калі чаргу запоўненая альбо лічбу, што Вы спрабуеце ўставіць менш нуля, што мы сказалі ў спецыфікацыя праблемы павінны не дапускаецца, таму што мы толькі хочам неадмоўнае значэнне, то вы павінны проста адразу вярнуцца ілжывым. Такім чынам, некаторыя адносна лёгка Праверка памылак. Калі б вы хочаце дадаць, што фактычная лік, што трэба было зрабіць трохі думаю тут. І гэта тое, дзе гэта крыху раздражняе думках, таму што вы павінны высветліць, як звяртацца цыклічнага вяртання. Але зачаток ідэі тут, гэта з цікавасць для нас з'яўляецца тое, што з пахам часта мае на ўвазе модульная арыфметыка і мод аператар, працэнт бок, дзе вы можаце пайсці ад большага значэння на нуль, а затым адзін і два і тры, а затым назад да нуля, адзін і два і тры і гэтак далей зноў і зноў. Так як мы прапануем зрабіць гэта што мы хочам у якасці індэкса ў Масіў называецца лікаў, дзе нашы цэлыя ляжаць. Але каб трапіць туды, мы спачатку хочам зрабіць незалежна ад памеру чарзе ўсяго толькі затым дадаць да гэтага тое, што Пярэдняя частка спісу. І эфект, што з'яўляецца, каб паставіць нас у правільная пазіцыя ў чарзе і Не думайце, што першым чалавекам у лініі знаходзіцца ў пачатку, што ён ці яна абсалютна можа быць, калі мы былі таксама пераход ўсіх. Але мы проста ствараем працу для сябе, калі мы ўзялі што асаблівая шлях. Так што мы можам трымаць яго адносна проста. Мы павінны памятаць, што мы проста дадаў Int ў чаргу. А потым мы проста вяртаем праўда. Між тым, у Dequeue, мы папрасілі вам рабіць наступнае. Рэалізаваць гэта такім чынам, што яна dequeues, гэта значыць выдаляе і вяртае, Int ў пярэдняй частцы чарзе. Каб зняць Int, досыць забыць яго. Вам не трэба перавызначыць сваю лепту. Так што гэта яшчэ на самай справе. Гэтак жа, як дадзеныя на цвёрдым дыску, мы проста ігнаруючы той факт, што цяпер там. І калі д пусты, мы павінны замест гэтага вяртаць адмоўнае 1. Так што гэта адчувае адвольным. Чаму вярнуцца адмоўны 1 замест ілжыва? Так. АЎДЫТОРЫЯ: Пытанне захоўвае станоўчыя значэння. Так як вы толькі захоўваць станоўчыя значэння у д, адмоўны памылка. Дэвід Дж. Малан: Добра, праўда. Так, таму што мы толькі захоўваць станоўчым значэння або роўны нулю, то гэта выдатна, каб вяртаць адмоўнае значэнне ў якасці дазорцы значэнне, адмысловы знак. Але вы перапісвання гісторыі там, таму што прычына, што мы толькі вяртанне неадмоўнае значэнне таму што мы хочам, каб мець значэнне дазорнай. Так, больш канкрэтна, чаму б проста не вярнуцца ілжывым у выпадку памылкі? Так. АЎДЫТОРЫЯ: Вы не змаглі вярнуцца цэлае. Дэвід Дж. Малан: Цалкам дакладна. І гэта дзе З атрымлівае даволі стрымліваючым. Калі вы кажаце, што вы збіраецеся вярнуць Int, у вас ёсць вярнуць Int. Вы не можаце атрымаць фантазіі і пачаць вяртанне BOOL або паплавок або радок ці нешта ў гэтым родзе. Цяпер, тым часам, JavaScript і PHP і некаторыя іншыя мовы можа, на самай справе, Вы вяртанні адрозніваецца тыпы значэнняў. І гэта сапраўды можа быць карысна, калі вы маглі б вярнуцца станоўчыя INTS, нулі, адмоўныя Інтс, ці хлусня або нулявы нават для абазначэння памылку. Але мы не маем, што ўніверсальнасць ў С. Так што з Dequeue, што мы прапаную зрабіць гэта - ROB BOWDEN: Вы можаце вярнуцца ілжывым. Гэта проста, што хлусня з'яўляецца хэш вызначыць хлусня нуля. Так што калі вы вярнуцца ілжывым, вы вярнуліся да нуля. І нуль з'яўляецца дапушчальным, што ў нашай чарзе, у той час як адмоўны 1 ня, калі ілжыва здарылася з адмоўным 1. Але вы не павінны нават павінны ведаць, што. Дэвід Дж. Малан: Гэта чаму я не сказаў гэтага. ROB BOWDEN: Але гэта не так што вы не можаце вярнуцца ілжывым. Дэвід Дж. Малан: Вядома. Так з чаргі, заўважыць, што мы прымаем анулявання ў якасці аргументу. І гэта таму, што мы не праходзячы нічога цалі Мы проста хочам, каб выдаліць элемент у пачатку чарзе. Такім чынам, як мы маглі б ісці пра гэта? Ну, па-першае, давайце зробім гэта Хуткая праверка здаровае. Калі памер чарзе 0, ёсць няма працы трэба будзе зрабіць. Вярнуцца адмоўны 1. Гатова. Так вось некалькі радкоў маёй праграмы. Так толькі чатыры лініі застаюцца. Дык вось я вырашыў зменшыць памер. І памяншаючы памер эфектыўна азначае, што я забыўся нешта там. Але я таксама павінен абнавіць дзе пярэдняя з лікаў з'яўляюцца. Такім чынам, каб зрабіць гэта, мне трэба зрабіць дзве рэчы. Я ў першую чаргу неабходна ўспомніць, што колькасць знаходзіцца ў пачатку чарзе, таму што мне трэба вярнуць гэтую рэч. Так што я не хачу, каб выпадкова забыцца пра гэта і затым перазапісаць яго. Я проста хачу, каб памятаць ў міжнар. А цяпер, я хачу, каб абнавіць q.front быць q.front 1. Так што, калі гэта быў першы чалавек у лінія, цяпер, я хачу зрабіць плюс 1 да пазначыць на наступны чалавек у лініі. Але я павінен справіцца з гэтым цыклічнага вяртання. І калі магутнасць складае глабальная канстанта, што адбываецца, каб дазволіць мне пераканацца як я даводжу да самага апошняга чалавека ў лінія, аперацыя па модулю прынясе мяне назад да нуля пры Пярэдняя частка чаргі. І які апрацоўвае пахам тут. А потым я працягну вярнуцца н. Цяпер, уласна кажучы, я не зрабіў павінны абвясьціць н. У мяне не было, каб схапіць яго і захоўваць яго часова, таму што значэнне яшчэ там. Так што я мог бы проста рабіць правільныя арыфметычныя вярнуць былога кіраўніка чэргі. Але я проста адчуваў, што гэта было больш ясна, на самай справе захапіць Int, паклаў яго на рускай мове, а затым вярнуцца, што для яснасці, але не з'яўляецца строга неабходным. Psst. Яны ўсе якія гавораць у маёй галаве. ROB BOWDEN: Так першае пытанне гэта праблема бінарнае дрэва. Так першы пытанне, мы улічваючы гэтыя лічбы. І мы хочам, каб хоць неяк ўставіць іх у гэтыя вузлы такім чынам, што гэта дзейнічае бінарнае дрэва. Такім чынам, адна рэч, каб памятаць пра бінарныя дрэвы пошуку з'яўляецца тое, што гэта не толькі тое, што рэч, каб злева менш і, што трэба права больш. Гэта павінна быць тое, што ўсё дрэва, каб левы менш, і ўсё дрэва направа, што больш. Так што калі я стаўлю 34 тут у верхняй частцы, а затым Я паклаў 20 тут, так што гэта сапраўды так далёка, таму што 34 тут. 20 збіраецца злева. Дык вось менш. Але я не магу затым пакласці 59 тут, таму што хоць 59 знаходзіцца справа 20, яна па-ранейшаму злева ад 34. Так што з гэтага абмежавання на ўвазе, Самы просты спосаб, верагодна, вырашаючы гэты Праблема ў тым, каб толькі выгляд з гэтых лікаў - так 20, 34, 36, 52, 59, 106. І затым устаўце тых, злева направа. Так 20 ідзе тут. 34 ідзе тут. 36 ідзе тут. 52, 59, 106. І вы таксама маглі б разабраўся з некаторыя падлучэння і разумеючы, ой, пачакайце, я не хапае нумароў запоўніць гэта ў тут. Таму мне трэба reshift што мой маршрут заўвага будзе. Але звярніце ўвагу, што ў канчатковым трох, калі Вы чытаць злева направа, ён знаходзіцца ў парадку ўзрастання. Так што цяпер, мы хочам аб'явіць, што структура будзе для вузлы ў гэтым дрэве. Дык што ж нам трэба ў двайковым дрэве? Таму ў нас ёсць значэнне тыпу унутр, таму некаторыя унутр значэнне. Я не ведаю, што мы назвалі гэта ў растворы - Int N. Нам трэба паказальнік на левай дзіцяці і паказальнік на правай дзіцяці. Дык гэта будзе выглядаць наступным чынам. І гэта будзе на самой справе выглядаюць перад калі ж двусвязный Спіс матэрыял, так апавяшчэнне - Я збіраюся прыйдзецца пракручваць ўсё зваротны шлях да праблемы 11. Так заўважыце, што ён выглядае так жа, гэта, акрамя таго што мы проста выпадкова называем гэтыя розныя імёны. У нас яшчэ ёсць цэлае значэнне і два паказальніка. Гэта проста, што замест лячэння паказальнікі як паказваючы на ​​наступную рэч а папярэдняя рэч, мы лячэння паказальнікі, каб паказаць на левай дзіцяці і права дзіцяці. ОК. Дык вось наша структура вузла. А цяпер, адзіная функцыя, мы павінны рэалізацыі гэтага з'яўляецца траверс, якія мы хочам перайсці на дрэве, друк з значэнняў дрэва ў парадку. Так глядзіць сюды, мы хацелі б, каб надрукаваць з 20, 34, 36, 52, 59 і 106. Як мы дамагліся гэтага? Так што гэта вельмі падобна. Калі б вы бачылі ў мінулым экзамен праблема што вы хацелі, каб раздрукаваць усё дрэва коскамі паміж ўсё, гэта было на самай справе, нават лягчэй, чым гэта. Дык вось рашэнне. Гэта было значна лягчэй калі вы зрабілі гэта рэкурсіўна. Я не ведаю, калі хто-то спрабаваў зрабіць гэта паўторна. Але, па-першае, у нас ёсць базавы варыянт. Што рабіць, калі корань з'яўляецца несапраўдным? Тады мы толькі збіраемся вярнуцца. Мы не хочам, каб надрукаваць што-небудзь. Астатняе мы збіраемся прайсці рэкурсіўна ўніз. Надрукаваць ўвесь левае поддерево. Так друкаваць ўсё менш чым мой бягучага значэння. А потым я збіраюся друкаваць сам. А потым я збіраюся рэкурсіўна ўніз мой Увесь правае поддерево, таму ўсе больш, чым мая каштоўнасць. І гэта ў друк з усё ў парадку. Пытанні аб тым, як гэта на самай справе Дасягаецца гэта за? АЎДЫТОРЫЯ: У мяне ёсць пытанне на [неразборліва]. ROB BOWDEN: Так адзін з спосабаў набліжаецца любая рэкурсіўная праблема ў тым, каб проста думаць пра гэта, як вы павінны думаць аб усіх вуглавыя выпадкі. Так лічаць, што мы хочам раздрукаваць гэтую усё дрэва. Так што ўсе мы збіраемся засяродзіцца на гэта канкрэтны вузел - 36. Рэкурсіўныя выклікі, мы робім выгляд, тых, хто толькі працаваць. Дык вось, гэта рэкурсіўны выклік траверс, мы, нават не задумваючыся пра гэта, проста перасякаючы левую тры, уявіце, што ўжо друкуе 20 і 34 для нас. А потым, калі мы ў канчатковым рахунку рэкурсіўна патэлефанаваць траверс на Добра, што будзе правільна друкаваць 52, 59 і 106 для нас. Такім чынам, улічваючы, што гэта можа друкаваць 20, 34 і іншы можа друкаваць 52, 59, 108, усё, што мы павінны быць у стане зрабіць, гэта друк , Сябе ў сярэдзіне гэтага. Так раздрукаваць ўсё перад намі. Надрукаваць OURSELF, таму бягучы вузел друку 36, рэгулярны Е, а затым друкаваць усё пасля нас. Дэвід Дж. Малан: Гэта дзе Рэкурсія становіцца сапраўды прыгожа. Гэта гэты дзіўны скачок веры, дзе Вы робіце драбнюткія крыху працы. І тады вы дазволіць камусьці яшчэ ўсё астатняе. І, што хто-то яшчэ з'яўляецца, па іроніі лёсу, вы. Такім чынам, для сур'ёзных пунктаў дамавіка, калі прагортцы на пытанні - ROB BOWDEN: Па пытаннях? Дэвід Дж. Малан: І трохі ўніз, каб лічбы, хто-небудзь ведае, дзе гэтыя лічбы ўзяліся? ROB BOWDEN: У мяне літаральна ні найменшага падання. Дэвід Дж. Малан: Яны з'яўляюцца па ўсёй віктарыны. АЎДЫТОРЫЯ: Ці з'яўляюцца яны тыя ж нумары? Дэвід Дж. Малан: Гэтыя лічбы. Трохі Велікоднае яйка. Так што для тых з вас, назіраючы ў Інтэрнэце па адрасе дадому, калі вы можаце сказаць нам па электроннай пошце heads@CS50.net якое значэнне гэтых паўтаральных шэсць лічбы ўсёй віктарыны 1, мы будзем душ вас з дзіўным ўвагай у фінале Лекцыя і стрэс мяч. Добры, тонкі. ROB Боуден: Любы апошнія пытанні ні пра што на віктарыне?