David J. MALAN: Lahat ng karapatan. Kaya maligayang pagdating sa unang kailanman CS50 postmortem para sa isang pagsusulit. Naisip naming italaga sa tungkulin ito tradisyon sa taong ito. At ito ay magiging isang pagkakataon upang maglakad sa pamamagitan ng solusyon sa pagsusulit. At kami mapabilis o bagalan batay sa interes ng mga dito. Kaya ikaw ay marahil dito dahil ikaw interesado sa kung paano mo maaaring magkaroon o dapat nasagot ang ilang mga sa mga problemang ito. Kaya bakit hindi tinitingnan namin ang muna sa seksyon na ito? Kaya sa pagkuha ng mga string. Ito ay nagbigay sa iyo ng tatlong iba't ibang mga bersyon ng isang program na noon ay, sa huli, sinadya upang makakuha ng isang string mula sa isang user. Man o hindi ginawa ito na noon ay ang natitira sa iyo upang matukoy. At kami tinanong sa Tanong 0, ipagpalagay na bersyon 1 ay pinagsama-sama at pinaandar. Bakit maaaring segfault sa program? Sa unang tingin, ang anumang mga mungkahi kung bakit? Oo. Madla: Kaya tandaan ko nakikita ito sa isang nakaraang halimbawa ng pagtingin sa pansamantalang trabaho * s at nakikita ang pag-scan ng s at nakikita dahil ito ay isang pointer, kung paano ay ito makakaapekto sa kung ano ang iyong na-scan sa? Ito ba ay s o ang address ng s? David J. MALAN: OK. Mahusay. Kaya sa huli, ang pinagmulan ng anumang problema ay siguro pagpunta upang mabawasan ang sa mga na variable. At ito ay sa katunayan isang variable. Ang uri ng data ng mga variable na iyon ay pansamantalang trabaho *, na nangangahulugang ito ay pagpunta sa maglaman ang address ng isang character. At sa ganyang bagay ay namamalagi ang pananaw. Ito ay pagpunta sa maglaman ang address ng isang character o, mas karaniwan, ang address ng unang character sa isang buong bloke ng mga character. Pero ang catch ay na-scan s, layunin sa buhay, ay binigyan ng isang address at ibinigay isang format ng code, tulad ng% s, basahin ang isang string sa tipak ng memory sa address na iyon. Ngunit dahil walang kapantay na pag-sign bago na tuldok-kuwit sa unang linya ng code, dahil hindi namin talaga magtalaga ng anumang memory sa malloc, sapagkat ito ay hindi talaga magtalaga ng isang array ng ilang mga laki, ang lahat ng ginagawa mo ay pagbabasa ng gumagamit keyboard input sa ilang mga kumpletong halaga ng basura, na ay nasa mga bilang default. Kaya logro ay ka pagpunta sa segfault kung address na iyon ay hindi lamang kaya mangyari upang maging isang halaga na maaari mong, sa katunayan, sumulat sa. Kaya hindi magandang hindi upang magtalaga ng doon iyong memorya. Kaya pinag-uusapan 1, hiniling namin, ipagpalagay na bersyon 2 ay pinagsama-sama at pinaandar. Bakit maaaring segfault programang ito? Kaya ang isang ito ay mas maraming surot. At mayroon talagang isa lamang halata paraan kung saan maaari kang trigger ng segfault dito. At ito ay pampakay. Anumang oras na aming ginagamit c sa memory, kung ano magagawa mo upang mang-upat ng isang segfault gamit ang bersyon na 2? Madla: Kung gumagamit ka ng pag-input na sa isang string na mas mahaba sa 49 character. David J. MALAN: Mismong. Anumang oras na makita ka ng isang bagay nakapirming haba pagdating sa isang array, ang iyong dapat pumunta off radar na maaaring ito ay may problema kung hindi ka naka-check sa mga hangganan ng isang array. At iyon ang problema dito. Kami ay gumagamit pa rin scanf. Kami ay gumagamit pa rin ng% s, na nangangahulugan na subukan basahin ang isang string mula sa user. Iyon pupuntahan mababasa sa s, na, sa puntong ito, ay epektibo ang address ng isang tipak ng memory o ito ay katumbas. Ito ay ang pangalan ng isang array ng mga character ng memorya. Ngunit nang eksakto na, kung basahin mo ang isang string na mas mahaba kaysa sa 49 mga character, 49 dahil kailangan mo room para sa backslash 0, ka ng pagpunta sa pag-apaw na buffer. At maaari kang makakuha ng masuwerteng at ma- magsulat ng 51 na character, 52, 53. Ngunit sa ilang mga punto, ang OS ay pagpunta sa sabihin, hindi. Ito tiyak ay hindi memory pinapayagan ka upang hawakan. At ang mga programa ay pagpunta sa segfault. Kaya doon, ang heuristics dapat maging anumang oras na kailangan nakapirming haba, mayroon kang upang makatiyak na iyong-check sa haba ng kahit ano ito ay na sinusubukan upang mabasa ito. Madla: Kaya upang malutas iyon, maaari mong ay nagkaroon ng isang pahayag na aktwal na pagsusuri ay ang haba mas malaki mababa sa o mas mababa? David J. MALAN: GANAP. Mayroon kang lamang isang kundisyon na nagsasabing, kung ang - o sa halip mo ay hindi kinakailangang alam nang maaga kung gaano karaming mga character ang gumagamit ay pagpunta sa i-type, dahil mayroon kang manok at ang itlog. Hindi hanggang mong basahin ito sa iyong may scanf maaari mong malaman kung gaano ito kahaba. Ngunit sa puntong iyon, ito ay huli na, dahil na-nabasa mo ito sa ang ilang mga bloke ng memorya. Kaya bilang isang-tabi, ang avoids CS50 library ang isyu na ito nang sama-sama, pagpapabalik sa pamamagitan ng paggamit fgetc. At bumabasa ng ito sa isang character sa isang pagkakataon, tip-toeing kasama, alam na Hindi maaaring mapuno ang isang character kung basahin mo nang paisa-isa. Catch ay may getstring pagpapabalik ay mayroon kaming upang patuloy na muling-size na tipak ng memorya, na ay isang sakit lamang. Ito ay isang pulutong ng mga linya ng code upang gawin iyon. Kaya isa pang diskarte ay magiging sa talaga gumamit ng pinsan, kaya magsalita, ng scanf. Mayroong mga variant ng isang pulutong ng mga mga function na aktwal na suriin ang haba ng kung gaano karaming mga character maaari mong basahin maximally. At maaari mong tukuyin, huwag basahin higit sa 50 mga character. Kaya na magiging isa pang diskarte ngunit mas matulungin ng mas malaking input. Kaya tanong 2 nagtatanong, ipagpalagay na bersyon 3 ay pinagsama-sama at pinaandar. Bakit maaaring segfault programa na? Kaya ang isang ito ay talagang ang parehong sagutin, kahit na ito mukhang ng kaunti may interes. Ginagamit namin malloc, na pakiramdam ng tulad ng kami ay nagbibigay sa ating sarili higit pang mga pagpipilian. At pagkatapos kami ay pagbabakante na memory sa dulo. Ito ay bytes 50 lamang ng memorya pa rin. Kaya maaari pa rin sinusubukan naming basahin sa 51, 52, 1000 bytes. Ito ay pagpunta sa segfault para sa eksakto ang parehong dahilan. Ngunit mayroong Masyadong isa pang dahilan. Ano pa ang maaari malloc balik bukod sa ang address ng isang tipak ng memory? Maaaring ito bumalik null. At dahil hindi namin Sinusuri para sa iyon, maaaring ginagawa namin ng isang bagay nakababagod para sa isa pang dahilan, na kung saan ay na Maaaring pagsabi namin scanf, basahin ang input ng user mula sa mga keyboard sa 0 lokasyon, aka null. At iyon, masyadong, ay talagang trigger ng segfault. Kaya para sa layunin ng pagsusulit ay, kami ay Tinanggap ang alinman sa mga bilang wastong dahilan. Ang isa ay magkapareho. Ang isa ay mas ng kaunti nuanced. Panghuli, na may paggalang sa ng program paggamit ng memory, kung paano gawin bersyon 2 at bersyon 3-iba? Kaya para sa kung ano ito ay nagkakahalaga, nakita namin ang isang tila walang katapusang supply ng panahon mga sagot sa mga ito. At bukod sa mga sagot ng mga tao, kung ano kami ay inaasahan namin pero hindi namin tinatanggap ang iba pang mga mga bagay, ay ang ilang mga pagbanggit ng katotohanan na bersyon 2 ay gumagamit ng ng tinatawag na stack. Bersyon 3 ay gumagamit ng magbunton. At sa pagtakbo, ito ay hindi gumagana talaga gawin ang lahat na magkano ng isang pagkakaiba. Sa pagtatapos ng araw, kami pa rin nakukuha lang 50 bytes ng memorya. Ngunit iyon ay isa sa mga posibleng sagot tayo ay tumitingin sa. Ngunit makikita mo, bilang makuha mo ang iyong mga pagsusulit pabalik mula sa TFs, na ginawa namin tanggapin iba pang mga talakayan ng kanilang disparate mga paggamit ng memory pati na rin. Ngunit stack at sana ay naging kimpal isang madaling kasagutan sa pumunta sa. Ang anumang mga katanungan? Ibinibigay ko sa iyo Rob. Rob BOWDEN: Kaya problema 4. Ito ang isa kung saan kayo ay nagkaroon ng upang punan sa bilang ng mga byte out sa lahat mga iba't ibang mga uri ginagamit. Kaya unang bagay na makita namin. Ipagpalagay na ang isang 32-bit architecture, ganito CS50 appliance. Kaya isa sa mga pangunahing bagay tungkol sa 32-bit architectures, na nagsasabi sa atin nang eksakto kung gaano kalaki ang isang pointer ay pagpunta upang maging sa arkitektura. Kaya agad-agad, alam namin na ang anumang pointer uri ay 32-bit o 4 bytes. Kaya ng pagtingin sa talahanayan na ito, isang node * ay isang uri pointer. Iyon pupuntahan maging 4 bytes. Struct node *, na literal kapareho node bituin. At upang ang pupuntahan maging 4 bytes. String, kaya ito ay hindi mukhang isang pa pointer, ngunit ang typedef, isang string lamang ang pansamantalang trabaho *, na ay isang uri ng pointer. Kaya na pupuntahan maging 4 bytes. Kaya ang tatlong ay ang lahat ng 4 bytes. Ngayon, node at mag-aaral ay ng kaunti pang kumplikado. Kaya tumitingin sa node at mag-aaral, makikita natin node bilang isang integer at isang pointer. At mag-aaral ay dalawang mga payo sa loob nito. Kaya hindi bababa sa para sa aming kaso dito, ang paraan na nagtatapos up namin kinakalkula ang laki ng ito struct ay magdagdag ng hanggang lamang ang lahat ng bagay na ang nasa loob ng struct. Kaya para sa node, mayroon kaming isang integer, na kung saan ay 4 bytes. Mayroon kaming isang pointer, na kung saan ay 4 bytes. At kaya isa node ay pagpunta upang tumagal ng hanggang 8 bytes. At katulad para sa mag-aaral, mayroon kaming isang pointer na 4 bytes at isa pa pointer na 4 bytes. Kaya na pupuntahan magtapos up pagiging 8 bytes. Kaya node at mag-aaral ay 8 bytes. At ang tatlong ay ang lahat ng 4 bytes. Mga Tanong sa iyon? Oo. Madla: Ay ito ay isang 64-bit architecture, gagawin na double lahat ng mga ito? Rob BOWDEN: Ito gagawin hindi double lahat ng mga ito. Kaya 64-bit architecture, ito, muli, pagbabago na pangunahing bagay na ang isang pointer ngayon ay 64 bits. Oo. Kaya isang pointer ay 8 bytes. Kaya ang mga iyon ay mga 4 bytes ay magiging 8 bytes. Ang isang mag-aaral, na kung saan ay dalawang mga payo, well, ngayon ito pupuntahan maging 8 bytes, 8 bytes. Ito ay pagpunta sa gawin 16 bytes. Ngunit isang node ay 4 bytes pa rin. Kaya ito pointer ay pagpunta upang maging 8 bytes. Ito ay 4 bytes. Kaya isang node ay pagpunta lamang upang maging 12 bytes. Anumang iba pang mga tanong sa isa na? Kaya sa susunod na isa, ito ay mga ang code ng katayuan ng HTTP. At nagkaroon ka ng upang ilarawan ang mga pangyayari sa ilalim kung saan ang mga baka ibabalik sa iyo. isa problema na narinig ko ang ilang mga mag-aaral mayroon ay na sinubukan nila upang gawin ang mga error maging sa dulo ng kliyente. Kaya kapag sinusubukan naming gawin ang kahilingan sa server, isang bagay na napupunta mali sa aming pagtatapos. Ngunit sa pangkalahatan, ang mga code ay ini-ibinalik ng server. Kaya gusto naming malaman kung ano ang nangyayari mali o pakanan sa server na nagiging sanhi ng mga bagay na ito na ibabalik. Kaya bakit maaari isang server babalik status code 200? Anumang mga saloobin? Oo. Kaya ang isang bagay tungkol sa matagumpay nagpunta ang kahilingan sa pamamagitan ng. At ang mga ito ay maaaring makabalik ano naman hiniling mo. Kaya ang lahat ng bagay ay pinong. Paano ang tungkol sa 302 nahanap? Oo. Madla: Ang server ay naghahanap para sa kung ano ang iyong hiniling. Ngunit hindi nito ma-mahanap ito. Kaya mayroong isang error. Rob BOWDEN: Kaya ang server noon ay naghahanap ng kung ano ang gusto mo. Kaya lang hinahanap dito, 302 nakita, ito ay magagawang upang hanapin ito. Madla: Sorry. Nahanap na nangangahulugan na sila ay ginawa mahanap ito. Sorry. Rob BOWDEN: Kaya 302 natagpuan. Ang server ay magagawang mahanap kung ano ang nais mo. Madla: Ngunit ito ay hindi pagpapakita ito? Rob BOWDEN: Ang pagkakaiba sa pagitan ng ito 302 at 200 ay tumutulong ito nakakaalam kung ano ang gusto mo. Ngunit ito ay hindi eksakto kung saan mo nais na magtanong. Kaya 302 ay isang tipikal na pag-redirect. Kaya mo Humiling ka ng pahina. Nakakaalam Ito, oh, gusto kong upang bumalik sa iyo ito. Ngunit ito ay sa isang iba't ibang mga URL. Kaya hey, na talagang gusto ito. David J. MALAN: Ito ay isang piraso na sinabi na binigay namin sa iyo guys isang pag-redirect function na ginagamit ang function ng header iyon, siya namang, i-print out ng lokasyon, tutuldok, at pagkatapos ay ang URL na kung saan na nais mong tanggihan ang user. Kahit na hindi mo makita 302 tahasan doon, iyon ay kung ano ang PHP Gusto magically magpasok ng bilang ng header sinasabi kung ano mismo ang sinabi Rob doon - natagpuan. Ngunit pumunta dito sa halip. Rob BOWDEN: OK. Kaya kung ano ang tungkol sa 403 Ipinagbabawal? Madla: Sa tingin ko ito na ang server ay isa lamang na nagsasabi na ang kliyente Hindi ma-access ang home page. Rob BOWDEN: So yes. Well, ang tipikal na sagot namin umaasa ay isang bagay tulad ng, ang mga file Hindi chmodded nang naaangkop. Iyon ay marahil sa ilalim kung ano pangyayari na nakita mo ang mga ito. Subalit mayroong isang dahilan na ang kliyente maaaring maging sa kasalanan dito. Mayroon talaga ng isa pang code ng katayuan - 401. Kaya ang mga ito ay halos katulad na. 401 ay walang pahintulot na. At 403 Ipinagbabawal. At kaya hindi awtorisadong mo eksklusibong makuha kung hindi ka naka-log in Ngunit pag-log in ay maaaring mangahulugan na pinahintulutan. Ngunit kung mayroon kang naka-log in at ikaw hindi pa rin magkaroon ng pahintulot, pagkatapos ay i- maaari ka ring makakuha ng mga ipinagbabawal na. Kaya't kung ikaw ay naka-log in at wala kang pahintulot, ipinagbabawal din isang bagay na maaari kang makakuha ng. David J. MALAN: At ang mga mekanismo sa pamamagitan ng kung saan ang mga problemang ito ay karaniwang Nalutas sa server ay sa pamamagitan ng kung ano ang utos? Chmod, kung ito ay, sa katunayan, isang pahintulot maglalabas sa file o direktoryo. Rob BOWDEN: Pagkatapos 404 hindi nahanap. Oo. Kaya hindi tulad ng 302 kung saan ito ay hindi eksakto kung saan ka nagtatanong pero alam kung ano mo gusto, ito, lamang ito ay may walang ideya kung ano ang gusto mo. At hindi ka humihiling isang bagay wasto. 418 Isa akong tsarera at pagkatapos ay 500 panloob server. Kaya kung bakit maaari kang makakuha ng mga iyon? Kaya segfault - Ako talagang hindi alam ang grading pamantayan para sa mga ito. Ngunit kung ang iyong code na PHP ay nagkaroon ng isang bagay mali sa loob nito, sa teorya, ng dati talaga segfault, kung saan, ito 500 panloob na error sa server, isang bagay ay mali sa server ang iyong configuration. O kaya mayroong isang syntax error sa iyong code na PHP. O isang bagay na masama ay pagpunta sa. David J. MALAN: namin nakita segfault kasama ng mga sagot ng ilang mga tao na. At technically, maaari itong mangyari. Ngunit iyon ay magiging isang PHP, ang programa nakasulat sa pamamagitan ng iba pang mga tao, talaga segfaulted, na lamang kung ang mga taong iyon screwed up at na sinulat maraming surot code sa kanilang mga tagasalin ng ginagawa PHP mismo segfault. Kaya kahit na 500 ay tulad ng isang segfault sa espiritu, ito ay halos palaging ang resulta ng isang isyu ito sa configuration file gamit ang iyong web server o, tulad ng sinabi Rob, syntax error, tulad mo Hindi maisara ang isang quote. O nawala ka ng isang tuldok-kuwit sa isang lugar. Madla: Kaya para sa Shuttle pset, ako Sa tingin kapag ginawa ko ito nang isang beses na-click ko ang browser, ngunit wala dumating up, ano ang tinatawag nila puting pahina. Ngunit iyon ay dahil sa ang code. Sa tingin ko na noon ay JavaScript, tama? Rob BOWDEN: Oo. Madla: Gusto error na makaisip pa rin? Rob BOWDEN: Kaya hindi na makakakuha ka ang error na ito dahil ang lahat ng bagay mula sa pananaw ng server ng web ay ganap fine. Ngunit na iyong hiniling index.html. Hiniling mo shuttle.js at service.js. At iyon ay matagumpay na mai bumalik sa iyo ang lahat ng mga bagay - 200. OK. Ito ay lamang kapag sinubukan iyong browser upang bigyang-kahulugan ang code ng JavaScript na ito ay tulad, maghintay, ito ay hindi wastong error sa JavaScript. Anumang iba pang mga katanungan? Ayos lang. David J. MALAN: Kaya susunod up noon ay bilang 11. At 11 ay ang scariest para sa maraming mga tao. Kaya ang pinakamahalagang bagay na dapat tandaan dito noon na ito ay, sa katunayan, tungkol sa isang doble naka-link na listahan. Ngunit hindi ito ay ang parehong bilang ng nakaraang taon doble naka-link problema listahan, na hindi nagbibigay sa iyo ng caveat na ang listahan ay maaaring, sa katunayan, maging unsorted. Kaya ang katotohanan na ang listahan ay unsorted at ang katotohanan na ang salitang iyon ay nakasalungguhit doon ay sinadya upang magbigay-kahulugan na ito ay talagang isang pagpapagaan ng kung ano kung hindi man ay maaaring naging isang mas mapaghamong problema at ng mas mahabang isa. Kaya isang pangkaraniwang pagkakamali dito ay pinagsikapan solusyon ng nakaraang taon sa iyong isa pager at pagkatapos lamang nang walang taros kopyahin na down na bilang sagot, kung saan ay ang karapatan sagutin sa ibang tanong katulad sa espiritu. Ngunit ang subtleties dito ay tulad ng sumusunod. Kaya isa, kami ng node ipinahayag at tinukoy sa karaniwang paraan dito. Pagkatapos ay natukoy namin listahan ng mga maging isang pandaigdigang pointer nasimulan upang null. Pagkatapos ay tila, mayroong dalawang mga function mayroon kaming mga modelo para dito, insert at alisin. At pagkatapos ay mayroon kaming ilang sample code dito ng paggawa ng grupo ng mga pagpapasok. At pagkatapos ay tanungin ka namin upang makumpleto ang pagpapatupad ng insert sa ibaba sa naturang isang paraan na ito insert n sa listahan sa pare-pareho ang oras, nakasalungguhit din, kahit na mayroon na. Kaya ang kagandahan ng kawalan ng kakayahang magpasok ng mga sa pare-pareho ang oras ay nagpapahiwatig na ito na mayroon ka upang ipasok ang bagong node saan? Papunta sa front. Kaya ito inaalis, thankfully, hindi bababa sa isa sa mga kaso na ginagamit upang mangailangan higit pang mga linya ng code, tulad ng ito ginawa nakaraang taon at kahit sa klase kung kailan namin usapan sa pamamagitan ng ganitong uri ng bagay may mga kawani na tao at may ilang mga ukol sa pandiwa palsipikado code. Kaya sa ang solusyon dito, ni laktawan sa paglipas ng ipaalam sa na magkaroon lamang ng isang visual sa screen. Pansinin na aming ginagawa ng mga sumusunod. At mapapansin din ang iba pang pagpapagaan ay na kahit na ito ay na mayroon na, kaya ang ibig sabihin nito kahit na ang bilang na ito ay pa ito doon, maaari kang lamang nang walang taros magpasok ng isa pang kopya nito. At iyon, masyadong, ay nilalayong maging isang pagpapagaan, sa gayon na maaari mong tumuon sa, talaga, ang ilan sa mga higit pang mga intellectually kagiliw-giliw na bahagi at hindi lamang ng ilang karagdagang mga error pagsuri na nabigyan ng limitadong oras. Kaya sa ang sample na solusyon, maglaan namin tagaturo sa mga kaliwete Side dito sa isang node. Ngayon, mapagtanto na pointer, bilang Sinabi ni Rob, ay bit sa 32 lang. At hindi ito aktwal na naglalaman ng isang address hanggang sa iyo italaga ito ang address. At gawin namin na sa kanang kamay gilid sa pamamagitan ng malloc. Tulad ng isang mabuting mamamayan, suriin namin na malloc ay hindi, sa katunayan, null, upang hindi namin sinasadyang lumikha isang segfault dito. At anumang oras mong gamitin ang malloc sa buhay, mo dapat na naghahanap ng mga null, baka mayroon kang isang banayad na bug. Pagkatapos initialize namin na null sa pamamagitan ng nagtatalaga n at nakaraan at susunod. At sa kasong ito dito, ako nasimulan nakaraang sa null, dahil ang bagong na node ay magiging ang bagong simula ng aking listahan. Kaya doon pupuntahan maging walang bago ito. At gusto kong i-mahalagang ikabit ang umiiral na listahan sa bagong node sa pamamagitan ng pagtatakda ng susunod na katumbas ng ilista ang sarili nito. Ngunit hindi pa lang ako tapos na. Kaya kung ang listahan mismo na umiral, at nagkaroon ng hindi bababa sa isa node nasa lugar, kung ito ang listahan dito at ipasok ko ng bagong node dito, ako kailangan upang matiyak na ang aking dating node tumuturo pabalik sa aking bagong node, dahil ito ay, muli, isang doble naka-link na listahan. Kaya ang ginagawa namin ng isang tseke katinuan. Kung listahan ay hindi null, kung mayroong pa isa o higit pang mga node doon, pagkatapos ay magdagdag na muli reference sa gayon na magsalita. At pagkatapos ay ang napaka-huling bagay na kailangan namin gawin ay talagang i-update ang global listahan mismo variable upang ituro sa na ang mga bagong node. Oo. Madla: Sa pointer arrow [Hindi marinig] ay katumbas ng null, gumagana na makitungo sa listahan dahil ang listahan ay walang bisa? David J. MALAN: Nope. Iyon ay lamang sa akin sa pagiging maagap Mag-ingat, sa na kung ito ay ang aking orihinal na listahan na may marahil ilang mga higit pang mga node sa paglipas dito at ako pagpasok ng aking bagong node sa paglipas dito, may pupuntahan na maging walang paglipas dito. At gusto kong makuha na ideya sa pamamagitan ng pagtatakda nakaraang sa null sa bagong node. At siguro, kung ang aking code ay tama at walang iba pang mga paraan upang ipasok nodes bukod sa ito function, siguro, kahit na listahan ay mayroon isa o higit pang mga node sa loob nito, siguro ang listahan, ang unang node, ay magkakaroon ng isang nakaraang pointer ng null mismo. Madla: At isang follow-up lang. Ang dahilan kung bakit inilagay mo pointer sa tabi Kapantay listahan ay pinakikinabangan ninyo ang pointer bago listahan sa na ito ng pagturo sa susunod, hulaan ko - Ako don't - lamang ay naglilista? David J. MALAN: Mismong. At ni aktwal na isaalang-alang ang dalawang mga kaso kaya hayaan dito talaga ito, kahit na ang Upang ipapakita namin isaalang-alang ang mga ito ay hindi parehong medyo bilang ang code. Ngunit sa isang mataas na antas, kung ito ay kumakatawan ilista at ito ay isang 32-bit pointer, ang pinakasimpleng sitwasyon ay na ito ay walang bisa sa pamamagitan ng default. At ipagpalagay na nais ko upang ipasok ang numero 50 ay ang unang numero. Kaya pupuntahan ko sige at maglaan isang node, na kung saan ay pagpunta sa maglaman tatlong mga patlang - n, nakaraan, at susunod. Pupunta ako sa ilagay ang numero 50 dito, dahil ito ay magiging n. Ito ang magiging susunod. At ito ay magiging nakaraang. At kaya kung ano ang gagawin ko sa kasong ito? Well, na lang tapos na ako 1 linya dito. N ng pointer ay nakakakuha n. Pagkatapos ay ako na nagsasabi, nakaraang dapat makakuha null. Kaya ito ay magiging walang bisa. Pagkatapos pupuntahan ko sabihin sa tabi Pupunta upang makakuha ng listahan. At ito lamang ang gumagana out na rin. Ito ay walang bisa. At kaya ako sinasabi ko, ang mga bagong node ng susunod field na dapat makakuha ng kahit ano ito ay. Kaya na naglalagay ng isa pang null doon. At pagkatapos ay ang huling bagay Ay ko check dito. Kung listahan ay hindi kapantay sa null, ngunit ito ay katumbas ng null, upang laktawan namin na sama-sama. At kaya susunod ay ang lahat ng kailangan kong gawin listahan ay makakakuha ng pointer, na pictorially nagreresulta sa isang larawan tulad na. Kaya iyon ang isa tagpo. At ang isa na ikaw ay nagtatanong tungkol sa partikular ay isang sitwasyon tulad nito, kung saan kami ay mayroon ng isang listahan ng isa-node. At kung pumunta ako pabalik hanggang sa ang orihinal problema na pahayag, ang susunod na kami ay isingit sabihin nating 34, para lamang sa ang alang-alang ng talakayan. Kaya Pupunta ako sa Maginhawang lamang gumuhit na sa paglipas dito. Lamang ako ng malloced. Ipagpalagay nating Lalabas na ako para sa null Hayaan. Ngayon, ako pagpunta sa pagsisimula ng pag- n na maging 34. At ito ay magiging n. Ito ang magiging susunod. At ito ay magiging nakaraang. Tiyakin ko ang hindi Hayaang makakuha ng mga ito pabalik. Unang Nakaraang pagdating sa kahulugan. Hayaan akong ayusin ito. Ito ay nakaraang. Ito ang susunod. Kahit na ang mga ito ay magkakahawig, panatilihin ni ito pare-pareho ipaalam. Nakaraang. Ito ang susunod. Kaya nagbigay lamang malloced ko ang aking tala, nasuri para sa null, itinalaga 34 papunta sa node. Nakaraang nakakakuha null. Kaya na nagbibigay sa akin na iyon. Susunod na nakakakuha listahan. Kaya list na ito. Kaya ito ang parehong ngayon bilang pagguhit ito arrow, upang ituro ang mga ito sa isa sa parehong. At pagkatapos ay Lalabas na ako kung listahan ay hindi kapantay sa null. At ito ay hindi oras na ito. Pagkatapos ay pupuntahan ko na gawin listahan nakaraang ay makakakuha ng pointer. Kaya ilista ang nakaraang ay makakakuha ng PTR. Kaya ito ay ang epekto ng paglalagay ng isang graphical arrow dito. At na nakakakuha ng kaunti may alun-alon, ang mga linya. At pagkatapos, sa wakas, i-update ko ilista upang tumuro sa pointer. Kaya ngayon ito nagtuturo sa ito tao. At ngayon, ni gawin ang isang mabilis na ipaalam check katinuan. Narito ang listahan, na kung saan ay ang global variable. Ang unang node ay, sa katunayan, 34, dahil Sinusundan ko arrow na. At iyon ay tama dahil gusto kong isingit sa simula ng listahan lahat ng mga bagong nodes. Humahantong ang kanyang susunod na field sa akin sa ito tao. Kung panatilihing ako pagpunta, pindutin ko sa tabi ay walang bisa. Kaya walang higit pang listahan. Kung ang hit ko nakaraang, nakukuha ko i-back kung saan aking inaasahan. Kaya doon ang ilang mga payo pa rin, malinaw naman, upang manipulahin. Ngunit ang katotohanan na ikaw ay sinabi na gawin ito sa pare-pareho ang oras ay nangangahulugan na ikaw lamang magkaroon ng isang tiyak na bilang ng mga bagay ka pinapayagang gawin. At kung ano ang numerong iyon? Maaaring maging isang hakbang. Maaaring maging dalawa. Maaaring maging 1,000 na mga hakbang. Ngunit ito ay may hangganan, na nangangahulugan na hindi mo magagawa na ang anumang uri ng looping ng pagpunta sa dito, walang recursion, walang mga loop. Ay Naging ito upang maging hard-code na mga linya ng code bilang mayroon kami sa sample na ito. Kaya't tinanong ang susunod na problema 12 sa amin sa kumpletuhin ang pagpapatupad ng pag-alis sa ibaba sa paraan na ito ay nag-aalis n mula sa listahan sa linear oras. Kaya mayroon kang isang kaunti pa kumawag room ngayon. Maaari mong ipalagay na n, kung kasalukuyan sa listahan, ay naroroon hindi hihigit sa isang beses. At na masyadong nilalayong maging isang pagsusulit na batay sa pagpapasimple ng pagkukunwari, kaya na kung nakita mo ang isang lugar numero 50 sa listahan, hindi mo rin kailangang mag-alala tungkol sa patuloy na umulit, naghahanap para sa bawat posibleng kopya na 50, na kung saan ay malipat lamang sa ilang mga minutia sa limitadong panahon. Kaya sa pag-alis, ang isang ito ay talagang higit pang mga hamon at higit pa code upang magsulat. Ngunit sa unang tingin, lantaran, maaari itong Inaasahan napakatinding at tulad ng isang bagay walang paraan maaari kang magkaroon ng makabuo ng sa isang pagsusulit. Ngunit kung tumuon kami sa indibidwal na mga hakbang, sana, ito nasain bigla strike sa iyo na ang bawat isa sa mga indibidwal na mga hakbang na ginagawang halata kahulugan sa pag-alaala. Kaya ipaalam sa tumagal ng isang hitsura. Kaya una, initialize namin pointer upang maging ilista ang sarili nito. Dahil gusto ko linear oras, na paraan Pupunta ako magpa-loop. At isang pangkaraniwang paraan upang umulit sa ibabaw ng mga node sa isang istraktura ng listahan o anumang uri ng istraktura iteratively ay gumawa tagaturo patungo sa harap ng data istraktura at pagkatapos lamang simulan ang pag-update ito at walk iyong paraan sa pamamagitan ng istraktura ng data. Kaya pupuntahan ko na gawin eksakto na. Habang pointer, ang aking pansamantalang variable, ay hindi kapantay sa null, sabihin sige at tingnan. Ba akong makakuha ng masuwerteng? Ay ang n patlang sa node sa kasalukuyan ako tumitingin sa katumbas ng bilang Naghahanap ako? Gawin ang isang bagay at kung gayon, sabihin. Ngayon, mapapansin na ito kung kondisyon pumapalibot sa buong sumusunod na linya ng code. Ito ay ang tanging bagay na mahalaga ako tungkol sa - paghahanap ng isang numero na pinag-uusapan. Kaya walang ibang tao, na pinapasimple bagay conceptually kaunti. Ngunit ngayon, ako na maisasakatuparan, at maaaring mayroon ka natanto na ito lamang pagkatapos ng pag-iisip ito sa pamamagitan ng isang bit, mayroong talagang dalawang mga kaso dito. Ang isa ay kung saan ang node ay sa simula ng listahan, na isang maliit na nakakainis na, dahil iyon ay isang espesyal na kaso, dahil mayroon kang haharapin may bagay na ito, na ay ang tanging anomalya. Kahit saan pa man sa listahan, ito ay ang parehong bagay. Mayroong isang nakaraang node at isang tabi node, nakaraang node, susunod na node. Ngunit ito tao ay isang maliit na espesyal kung siya ay sa simula. Kaya kung ang pointer ay katumbas sa listahan mismo, kaya kung ako sa simula ng ang listahan at nalaman ko na n, Kailangan ko na gawin ang isang pares ng mga bagay. Ang isa, kailangan kong baguhin ang listahan upang ituro sa susunod na patlang, 50. Kaya ipagpalagay na sinusubukan ko alisin 34. Kaya ito tao ay nakuha upang pumunta ang layo sa isang sandali lamang. Kaya pupuntahan ko sabihin, listahan ay makakakuha ng pointer susunod. Well, ito ang pointer. Susunod na nakaturo sa paglipas dito. Kaya ito ay nagbabago ito arrow right ngayon upang tumuro sa ito tao dito. Ngayon, tandaan, mayroon kami isang pansamantalang variable. Kaya hindi pa namin naulila anumang nodes, dahil mayroon ko rin ito tao sa aking pagpapatupad ng pag-alis. Kaya ngayon, kung listahan mismo ay hindi null, Kailangan ko upang ayusin ang isang maliit na isang bagay. Kailangan ko bang ngayon tiyakin na ito arrow, na kung saan ay dati nang pagturo 50-34, ito ay nakuha upang pumunta ang layo, dahil kung sinusubukan ko upang mapupuksa ng 34, 50 ay nagkaroon ng mas mahusay na hindi panatilihin ang anumang mga uri ng pabalik sanggunian sa ito bilang mga iminungkahing arrow. Kaya lang ginawa ko sa linyang ito. Kaya pagkatapos ay ako tapos na. Kaso Iyon ay aktwal na medyo madali. Pagpuputol off ulo ng listahan ay medyo prangka. Sa kasamaang palad, mayroong ito nakakainis na iba block. Kaya ngayon, mayroon akong upang isaalang-alang ang kaso kung saan mayroong isang bagay sa gitna. Ngunit ito ay hindi masyadong kahila-hilakbot, maliban para sa syntax tulad nito. Kaya kung hindi ako sa simula ng listahan, ako sa isang lugar sa gitna. At ang linyang ito dito ay sinasabi, simula sa kahit anong node ikaw ay sa. Pumunta sa susunod na field sa nakaraang node ni at ituro iyon sa pointer. Ni gawin ito pictorially Hayaan. Iyon ay nakakakuha kumplikado. Kaya kung mayroon akong isang nakaraang field dito - ni gawin ito ipaalam - susunod na field dito. Pupunta ako sa gawing simple ang aking mungkahi ukol sa halip kaysa gumuhit ang maramihang mga bagay na pabalik-balik crisscrossing isa't isa. At ngayon, sabihin nating lamang ito ay 1, 2, 3 alang-alang sa talakayan, kahit na bagaman na hindi line up sa ang problema na pinag-uusapan. Kaya narito ang aking listahan ng naka-link. Ako ay sinusubukan mong alisin ang dalawang sa ito partikular na bersyon ng kuwento. Kaya na-update ko pointer sa ay nagtuturo sa ito tao. Kaya ito ay PTR. Siya'y tumuturo dito. Ito ang listahan, na kung saan ay umiiral sa buong mundo tulad ng dati. At siya ay tumuturo dito kahit na ano. At ngayon, sinusubukan ko upang alisin ang dalawa. Kaya kung pointer nakaturo dito, ako pagpunta sa sundin, sa malas, ang nakaraang pointer, na naglalagay sa akin sa 1. Pagkatapos ay pupuntahan ko sabihin na ang susunod na patlang, na pinagsasama-ako sa ibabaw upang ito box dito, ay pagpunta sa katumbas pointer susunod. Kaya kung ito pointer, ito ang susunod. Ay nangangahulugan na na ito pangangailangan arrow upang ituro sa tao na ito. Kaya kung ano ay may lamang na linya ng code tapos Medyo ng ito. At ngayon, ito ay naghahanap ng tulad ng isang hakbang sa kanan direksyon. Talaga namin nais na may Ginupit 2 out ng gitna ng 1 at 3. Kaya ito ang akma na gusto naming ruta na ito pointer sa paligid nito. Kaya ito susunod na linya ay check kung pointer susunod ay hindi null, mayroong sa katunayan isang tao sa kanan ng 2, Ibig sabihin nito na mayroon din naming gawin ang kaunti na may Ginupit dito. Kaya kailangan ko ngayon upang sundin ang pointer at i-update ang nakaraang pointer sa ito tao na gawin ang isang maliit na bit ng isang workaround dito ang punto dito. At ngayon, biswal na ito ay magaling. Ito ay isang maliit na walang kaayusan sa na mayroong walang sinuman na tumuturo sa 2 na ngayon. 2 nakaturo sa kaliwa. At 2 nakaturo sa kanan. Ngunit maaari siya gawin ang anumang siya Nais ni, dahil siya ay tungkol sa upang makakuha ng mga napalaya. At hindi mahalaga kung ano ang mga halaga ay nakikita. Ano ang mahalaga ay na ang mga natitirang guys ay routing sa itaas at sa ibaba sa kanya ngayon. At sa katunayan, iyon ang ginagawa namin sa susunod. Kami ng mga libreng pointer, na nangangahulugang sabihin namin ang operating system, ikaw ay malugod i-reclaim na ito. At pagkatapos ay sa wakas, bumalik kami. Iba Pa nang kataon lamang, kung namin hindi pa ibinalik, mayroon kaming panatilihing naghahanap. Kaya pointer ay katumbas ng pointer sa tabi lang Nangangahulugan ilipat ang tao dito. Ilipat ang tao dito. Ilipat ang tao dito kung, sa katunayan, hindi kami nakahanap ng mga numero kaming naghahanap ng mga pa. Kaya nang tapat, mukha itong ganap napakalaki, sa palagay ko, sa unang sulyap, lalo na kung struggled may ito sa panahon ng pagsusulit pagkatapos makita isang bagay na katulad nito. At sa iyo Pat iyong sarili sa likod. Well, walang paraan maaari kong magkaroon makabuo ng mga na sa pagsusulit. Ngunit Gusto ko magtaltalan, maaari mong kung masira mo ito down sa mga indibidwal na kaso at lamang maglakad sa pamamagitan nito Maingat, kahit na, tinatanggap na, sa ilalim ng nakababahalang pangyayari. Thankfully, ang larawan ginawa ang lahat ng bagay mas masaya. Maaari mong iguhit ito sa anumang bilang ng mga paraan. Hindi mo kailangang gawin ang crisscrossing bagay dito. Maaari mong gawin ito sa tuwid mga linya tulad nito. Subalit ang diwa ng problemang ito, sa pangkalahatan, ay upang mapagtanto na ang larawan sa dulo ay dapat magmukhang ng kaunti isang bagay na tulad nito, dahil pare-pareho ang oras ipinahiwatig na panatiliin ninyo trapiko at trapiko at trapiko ang bagong mga node sa simula ng listahan. Ang anumang mga katanungan? Marahil ang pinaka-hamon ng tiyak ang mga tanong na coding. Madla: Kaya ay listahan na katulad ng magtungo sa mga nakaraang mga halimbawa. David J. MALAN: Eksaktong, eksakto. Lamang ng ibang pangalan para sa isang global variable. World malawak na ano? Rob BOWDEN: OK. Kaya ito ay ang isa kung saan mo nagkaroon na magsulat ng talata. Ang ilang mga tao ay nagsulat Mga Sanaysay para sa tanong na ito. Ngunit kailangan mo lamang na gamitin ang mga anim na tuntunin upang ilarawan kung ano ang mangyayari kapag subukan mo upang makipag-ugnay sa facebook.com. Kaya ko makikita lamang makipag-usap sa pamamagitan ng proseso gamit ang lahat ng mga tuntuning ito. Kaya sa aming mga browser, i-type namin facebook.com at pindutin ang Enter. Kaya ang nangyayari sa aming mga browser upang bumuo ng isang HTTP hilingin na ito ang nangyayari upang magpadala ng sa pamamagitan ng ilang mga proseso sa Facebook para sa Facebook upang tumugon sa amin sa HTML ng pahina nito. Kaya kung ano ay ang proseso sa pamamagitan ng saan ang kahilingan ng HTTP talaga ang nakakakuha sa Facebook? Kaya una, kailangan namin upang isalin Facebook.com. Kaya lang ibinigay ang pangalan Facebook.com, kung saan ang aktwal na mga kahilingan ng HTTP kailangan pumunta? Kaya kailangan namin upang isalin ang Facebook.com sa isang IP address, na tanging Kinikilala ng kung ano ang machine namin talaga nais na magpadala ng kahilingan na ito sa. Ang iyong laptop na may IP address. Anumang bagay konektado sa internet may IP address. Kaya DNS, Domain Name System, iyon ay kung ano ang nangyayari upang mahawakan ang pagsasalin mula sa facebook.com sa isang IP address na talagang gusto mong makipag-ugnay. Kaya-ugnay kami ng mga DNS server at sabihin nating, ano ang facebook.com? Sinasabi nito, oh, ito ay ang IP address ng 190.212 isang bagay, isang bagay, isang bagay. Ayos lang. Ngayon, alam ko kung ano ang machine Gusto kong makipag-ugnay. Kaya pagkatapos mong ipadala ang iyong kahilingan sa HTTP sa ibabaw sa machine na. Kaya paano nito makapunta sa machine na? Well, napupunta ang kahilingan mula sa router sa router bounce. Alalahanin ang halimbawa sa klase, kung saan talaga Nakita namin ang ruta na ang packet kinuha noong sinubukan naming upang makipag-ugnayan. Nakita namin ito tumalon sa ibabaw ng Atlantic Karagatan sa isang punto o kahit ano. Kaya ang huling termino port. Kaya ito ay ngayon sa iyong computer. Maaari kang magkaroon ng maramihang mga bagay sa kasalukuyan pakikipag-ugnay sa internet. Kaya ko maaaring tumatakbo, sabihin nating, Skype. Maaaring mayroon akong isang web browser bukas. Maaaring mayroon akong isang bagay na torrenting mga file. Kaya lahat ng mga bagay na ito ay pakikipag-ugnay sa internet sa ilang mga paraan. Kaya kapag ang iyong computer na natatanggap ng ilang data mula sa internet, paano gagawin nito sa malaman kung ano ang application talaga Nais ni ang data? Paano gumagana ang alam ito kung ang partikular na data ay sinadya para sa torrenting application na taliwas sa web browser? Kaya ito ay ang layunin ng port sa na lahat ng mga application na ito ay may inaangkin ng isang port sa iyong computer. Kaya iyong web browser nagsasabing, hey, Ako pakikinig sa port 1000. At ang iyong mga torrenting programa ay nagsasabi, Ako pakikinig sa port 3000. At Skype sabi, gumagamit ako ng port 4000. Kaya kapag nakakuha ka ng ilang mga data na pag-aari sa isa sa mga application na ito, ang data ay minarkahan ng port kung saan ito talaga dapat ipadala kasama sa. Kaya ito ang sinasabi, oh, nabibilang ko sa port 1000. Alam ko pagkatapos kailangan kong ipasa ito kasama sa aking web browser. Kaya ang dahilan kung ito'y may-katuturang dito ay ang mga web server ay may posibilidad na makinig sa port 80. Kaya kapag-ugnay ako sa Facebook.com, ako pakikipag-ugnayan sa ilang mga machine. Ngunit kailangan kong sabihin na port ng na machine gusto kong makipag-usap sa. At mga web server ay may posibilidad na maging pakikinig sa port 80. Kung nais nila, maaari nilang itakda ito up kaya inililista nito ang bilang sa port 7000. At pagkatapos ay sa isang web browser, maaari ko mano-manong i-type Facebook.com: 7000 upang magpadala ng kahilingan sa port 7000 ng web server Facebook ni. David J. MALAN: At sa kasong ito, kahit na kahit na hindi namin ginawa ay kinakailangan na ang mga tao banggitin ito, sa kasong ito, kung ano ang port Gusto ang kahilingan aktwal na pumunta sa? Subukang muli. Mismong. Hindi naghahanap ng iyon, ngunit isang kapitaganan na mayroong none ang huling. Rob BOWDEN: Kaya ang HTTPS, dahil ito ay partikular pakikinig para sa naka-encrypt, ito ay sa port 4430. Madla: At na email ay 25, tama? David J. MALAN: Papalabas email, 25, yep. Rob BOWDEN: hindi ko kahit na ang karamihan sa mga kilala ang - ang lahat ng mga mas mababang mga bago ay may posibilidad na maging nakalaan para sa mga bagay. Sa tingin ko ang lahat ng bagay sa ilalim ng 1024 ay nakareserba. Madla: Bakit mo sinasabi 3 ay ang maling numero? Rob BOWDEN: Dahil sa isang IP address, mayroong apat na mga pagpapangkat ng mga digit. At ang mga ito ay 0-255. Kaya 192.168.2.1 ay isang pangkaraniwang lokal na IP address ng network. Pansinin lahat ng mga Mas mababa sa 255. Kaya kapag nagsimula ako sa 300, na Hindi ma posibleng magkaroon naging isa sa mga numero. David J. MALAN: Ngunit na ulok clip mula sa - ay ito CSI, kung saan sila ay nagkaroon ng isang na numero ay masyadong malaki para sa mga IP address. Rob BOWDEN: Anumang mga katanungan sa ito? Ang susunod na isa, kaya kumpletong pagbabago sa topic, ngunit mayroon kaming ito array PHP para sa ang mga bahay sa patyo sa loob. At kami ay may isang unordered listahan. At gusto naming i-print ang bawat item sa listahan lamang na naglalaman ng mga pangalan ng bahay. Kaya mayroon kaming foreach loop. Kaya tandaan, ang syntax ay foreach array bilang item sa array. Kaya sa pamamagitan ng bawat pag-ulit ng loop, bahay ay pagpunta sa tumagal ng sa isa sa mga mga halaga sa loob ng array. Nasa unang iteration, bahay Magiging Cabot House. Sa isang pangalawang iteration, bahay habilin maging Courier House at iba pa. Kaya para sa bawat patyo sa loob bilang house, kami ay lamang ng pagpunta sa i-print - din sana echoed mo - ang item sa listahan at pagkatapos ay ang pangalan ng bahay ni at pagkatapos isara ang item sa listahan. Ang kulot tirante ay opsyonal dito. At pagkatapos ay sinabi rin namin sa pinag-uusapan mismo, tandaan upang isara ang unordered listahan tag. Kaya kailangan namin upang lumabas sa mode na PHP upang gawin ito. O kaya naman sana echoed namin ang isara unordered listahan tag. David J. MALAN: masarap na rin dito gagawin naging gumamit ng isang lumang paaralan para sa loop na may $ i = 0 0 at paggamit ng mga bilang sa tayahin ang haba ng ray. Lahat-lahat fine masyadong, lamang medyo wordier. Madla: Kaya't kung ikaw ay pagpunta sa [Hindi marinig], gagawin mo - Nalimutan ko kung ano ang loop [hindi marinig] ay. Gusto mo $ patyo sa loob bracket i? David J. MALAN: Mismong. Oo, eksakto. Rob BOWDEN: Ano pa? David J. MALAN: Lahat ng karapatan. Trade-off. Kaya mayroong bunches ng sagot posible para sa bawat isa sa mga. Kami ay talagang lamang naghahanap para sa isang bagay na nakakahimok para sa isang nakabaligtad at isang downside. At bilang 16 nagtanong, pagpapatunay sa mga gumagamit ' input client-side, tulad sa JavaScript, sa halip ng server-side, tulad sa PHP. Kaya kung ano ang isang bentahe ng paggawa client-side? Well, isa sa mga bagay na aming iminungkahi ay na bawasan mo latency, dahil ikaw Hindi mo na kailangang mag-abala pakikipag-ugnay sa server, na maaaring tumagal ng ilang millisecond o kahit na ilang mga segundo sa pamamagitan ng pag-iwas na lamang at pagpapatunay ng pag-input client-side ng mga gumagamit ' nagti-trigger ng on-sumite handler at check lang, nag-type sila isang bagay in para sa pangalan? Type mo ba sila ng isang bagay in para sa email address? Pumili ba sila ng dorm mula sa sa drop-down menu? Maaari mong bigyan sila ng madalian feedback gamit ang gigahertz computer na o kahit anong mayroon sila na talaga sa kanilang desk. Kaya ito ay lamang ng isang mas mahusay na user makaranas ng karaniwang. Ngunit isang downside ng paggawa ng client-side pagpapatunay, kung gagawin mo ito nang hindi rin paggawa server-side pagpapatunay ay na karamihan ng sinuman galing sa CS50 alam na maaari mo lamang magpadala ng anumang data na nais mong sa isang server ng anumang bilang ng mga paraan. Nang tapat, sa karamihan ng anumang browser, maaari kang i-click sa paligid ng mga setting at lamang i-off ang JavaScript, na gagawin, samakatuwid, huwag paganahin ang anumang paraan ng pagpapatunay. Ngunit maaari mo ring isipin na kahit ako May ginawang ilang arcane bagay sa klase ng paggamit telnet at talagang pagkukunwaring maging isang browser sa pamamagitan ng pagpapadala get mga kahilingan sa server. At iyon ay tiyak na hindi gamit ang anumang JavaScript. Na lang ako mag-type command sa isang keyboard. Kaya talaga, ang anumang mga programmer sa loob ng sapat na ginhawa sa web at HTTP maaaring ipadala ang anumang data siya Nais ni sa isang server na walang pagpapatunay. At kung ang iyong server ay hindi rin pagsuri, ay magbibigay sila sa akin ng isang pangalan, ay ito talagang isang wastong email address, ginawang sila pumili ng dorm, maaari mong tapusin up pagpasok bogus o lamang blangko ang data sa iyong database, na marahil ay hindi pagpunta sa maging isang magandang bagay kung ikaw ay sa pag-aakala ito ay doon. Kaya ito ay isang nakakainis na katotohanan. Ngunit sa pangkalahatan, ang client-side pagpapatunay ay napakahusay. Ngunit ito ay nangangahulugan ng dalawang beses bilang magkano ang trabaho. Kahit na gawin doon umiiral ang iba't-ibang mga aklatan, mga aklatan ng JavaScript para sa Halimbawa, na gumawa ito magkano, higit na mas mababa ng isang sakit ng ulo. At maaari mong muling gamitin ang ilan sa mga code server-side, ang client-side. Ngunit huwag mapagtanto na ito ay karaniwang dagdag na trabaho. Oo. Madla: Kaya kung kami lamang Sinabi gaanong secure - David J. MALAN: [LAUGHS] He. Iyon ang palagi ang mas mahirap mga bago upang dinggin. Rob BOWDEN: gagawin iyon tinanggap. David J. MALAN: Ano? Rob BOWDEN: Lumikha ako ng problemang ito. Iyon sana ay natanggap na. David J. MALAN: Oo. Madla: Cool. Rob BOWDEN: Ngunit kami ay hindi tanggapin para sa unang isa - well, ano humahanap kami ay isang bagay na tulad mo Hindi mo na kailangang makipag-ugnayan sa server. Hindi kami tumatanggap ng mas mabilis lang. Madla: Paano ang tungkol sa huwag i-reload ang pahina? Rob BOWDEN: Oo. Iyon ay isang tinatanggap na sagot. David J. MALAN: Anumang bagay kung saan kami nadama ito ay mas malamang kaysa sa hindi malamang na alam mo kung ano ang mga sinasabi, na isang matigas linya upang gumuhit ng minsan. Sa halip Paggamit ng isang naka-link na listahan ng isang array upang mapanatili ang isang pinagsunod-sunod na listahan ng mga integer. Kaya isang nakabaligtad kami madalas sipiin may naka-link mga listahan na motivated ang kanilang buong panimula ay kang makakuha ng dynamism. Maaari silang lumaki. Maaari silang pag-urong. Kaya hindi mo na kailangang tumalon sa pamamagitan hoops upang aktwal na lumikha ng higit pang memory may isang array. O kaya hindi mo na kailangang lamang sabihin, paumanhin, ang user. Ang array ay puno. Kaya dynamic na paglago ng listahan. Isang downside bagaman ng naka-link na listahan? Madla: Ito ay linear. Naghahanap sa naka-link na listahan ay linear sa halip ng kung ano-log in ka David J. MALAN: Mismong. Naghahanap sa naka-link na listahan ay linear, kahit na ito ay pinagsunod-sunod, dahil maaari ka sundin lamang ang mga tinapay crumbs, ang mga mga payo, mula sa simula ng listahan sa dulo. Hindi mo maaaring magamit random access at, kaya, binary paghahanap, kahit na ito ay pinagsunod-sunod, na maaari mong gawin sa isang array. At mayroon ding isa pang gastos. Oo. Madla: Memory hindi mabisa? David J. MALAN: Oo. Well, hindi ko gagawin naman sabihin hindi mabisa. Ngunit ito ang gastos sa iyo ng karagdagang memorya, dahil kailangan mo 32 bits para sa bawat na node para sa karagdagang pointer, sa hindi bababa sa para sa isang isa-isa naka-link na listahan. Ngayon, kung ikaw ay lamang ang pag-iimbak integer at nagdadagdag ka ng mga pointer, na talagang uri ng di-walang kuwenta. Ang pagdodoble nito ang halaga ng memorya. Ngunit sa katotohanan, kung ikaw ay nag-iimbak ng isang naka-link na listahan ng mga structs na maaaring mayroon 8 bytes, 16 bytes, kahit na higit pa kaysa doon, marahil ito ay mas mababa ng isang nasa gilid gastos. Ngunit ito ay isang cost gayunman. Kaya ang alinman sa mga nais nai naging fine bilang downsides. 18. Paggamit ng PHP sa halip na C upang magsulat isang programa command-line. Kaya dito, ito ay madalas na mas mabilis na gamitin ang isang wika tulad ng PHP o Ruby o Python. Ikaw lamang madaling mabuksan up ng isang text editor. Mayroon kang maraming iba pang mga pag-andar magagamit mo. May kusina ang lababo ng mga function na PHP, samantalang sa C, mo may napaka, napakaliit. Sa katunayan, guys ang alam na ang mahirap na paraan na wala kang hash talahanayan. Hindi mo nai-link ang mga listahan. Kung nais mong iyon, mayroon kang upang ipatupad ang mga ito sa iyong sarili. Kaya isa bentahe ng PHP o talagang anumang kahulugan ng wika ay ang kabilisan na kung saan maaari mong isulat ang code. Ngunit isang downside, nakita namin na ito kapag ako ay mabilis whipped up ng isang misspeller pagpapatupad sa panayam gamit ang PHP, ay na gumagamit ng isang kahulugan ng wika ay karaniwang mas mabagal. At nakita namin na demonstrably may isang dagdagan sa oras mula sa 0.3 segundo upang 3 segundo, dahil sa ang interpretasyon na aktwal na mangyayari. Isa pang bentahe ay na sa iyo Hindi mo na kailangang mag-compile. Kaya din pinapabilis ito pataas-unlad nagkataon, dahil hindi mo na kailangang dalawang hakbang sa pagpapatakbo ng isang programa. Magkaroon ng isa ka lang. At kaya na medyo nakahihimok pati na rin. Sa halip ng paggamit ng isang database SQL isang CSV file upang mag-imbak ng data. Kaya SQL database ay ginagamit para sa pset7. CSV na mga file mo ay hindi magkano ang gamitin. Ngunit ginagamit mo ito nang kataon lamang sa pset7 bilang na rin sa pamamagitan ng pakikipag-usap sa Yahoo Finance. Ngunit CSV ay katulad lamang ng isang Excel file ngunit sobrang simple, kung saan ang mga hanay ay lamang demarked ng mga kuwit loob ng isang kung hindi man tekstong file. At gamit ang isang database ng SQL ay mas nakakahimok ng kaunti. Ito ay isang bentahe, dahil makakakuha ka ng mga bagay piliin tulad at ipasok at tanggalin. At nakuha, siguro, ini-index na MySQL at iba pang mga database, tulad ng Oracle, bumuo ng para sa iyo sa memorya, na nangangahulugan na ang iyong piliin Marahil hindi pagpunta sa maging linear itaas hanggang sa ibaba. Talaga Ito ay pagpunta sa maging isang bagay tulad ng binary paghahanap o isang bagay katulad sa espiritu. Kaya ang mga ito ay karaniwang mas mabilis. Ngunit isang downside ay na ito lamang ay pang trabaho. Ito ay higit na pagsusumikap. Mayroon kang upang maunawaan ang mga database. Mayroon kang i-set up ito. Kailangan mo ng isang server upang tumakbo na database sa. Kailangan mong maunawaan paano i-configure ito. Kaya ang mga ito ay lamang ang mga mga uri ng kalakalan-off. Sapagkat isang CSV file, maaari mong lumikha ng ito sa gedit. At ikaw ay handa na upang patakbuhin. Walang kumplikado lampas na. Paggamit ng isang trie sa halip ng isang hash talahanayan may nakahiwalay na chaining upang mag-imbak ng diksyunaryo ng mga salita nakapagpapagunita ng pset5. Kaya isang sinusubukan ng nakabaligtad, sa teorya hindi bababa sa, ay kung ano? Ang patuloy na mga oras, hindi bababa sa kung ikaw ay hashing sa bawat isa sa mga indibidwal na mga letra sa isang salita, tulad mo maaaring mayroon para sa pset5. Iyon ay maaaring maging limang hashes, anim hashes kung mayroong lima o anim na mga titik sa salita. At iyon ang medyo magandang. At kung mayroong isang pang-itaas nakatali sa kung paano ang haba ng iyong mga salita ay maaaring maging, na sa katunayan asymptotically pare-pareho ang panahon. Sapagkat isang hash talahanayan na may nakahiwalay na chaining, ang problema doon sa na uri ng istraktura ng data ay ang pagganap ng iyong mga algorithm ay karaniwang ay depende sa bilang ng mga bagay Nasa istraktura ng data. At iyon ang tiyak ang kaso sa chain, kung saan ang higit pang mga bagay-bagay na inilagay mo sa isang hash talahanayan, ang mas mahabang mga chain pumunta, na nangangahulugan na sa pinakamasama kaso, ang bagay sa iyo ay maaaring naghahanap ng ay ang lahat ng mga paraan sa dulo ng isa ng mga chain, na epektibong devolves sa isang bagay linear. Ngayon, sa pagsasagawa, ito ay maaaring walang pasubali ang kaso na ang isang hash talahanayan na may chain ay mas mabilis kaysa isang naaayong trie pagpapatupad. Ngunit iyon para sa iba't ibang mga kadahilanan, bukod sa na kung saan ay pagsusubok na gumamit ng isang buong maraming memory na maaari, sa katunayan, mabagal na mga bagay pababa, dahil hindi mo makakuha ng magaling mga benepisyo ng isang bagay na tinatawag na pag-cache, kung saan mga bagay na malapit nang sama-sama sa memory maaaring ma-access madalas na mas mabilis. At kung minsan maaari kang makabuo ng isang talagang magandang hash. Kahit na mayroon ka upang aksaya ng kaunting memorya, ikaw ay maaaring, sa katunayan, ma- mabilis at hindi mahanap ang mga bagay bilang masamang bilang linearly. Kaya sa maikling, nagkaroon hindi kinakailangang may alinman sa mga ito ng isa o kahit dalawang mga tukoy na bagay humahanap kami. Talagang kahit ano mapanghimok bilang isang nakabaligtad at downside sa pangkalahatan ay nahuli ang aming mata. Rob BOWDEN: Kaya't para ng bentahe, ginawa namin Hindi tumatanggap sa sarili nitong "mas mabilis." Sa iyo Nagkaroon sasabihin ng isang bagay tungkol dito. Kahit na sinabi mo theoretically mas mabilis, Alam namin na iyong uri ng naunawaan na ito ay 0 ng 1. At hash talahanayan, sa teorya, Hindi 0 ng 1. Pagbanggit ng kahit ano tungkol sa runtime sa pangkalahatan ay nakuha mo ang punto. Ngunit "mas mabilis," ang karamihan sa mga solusyon sa ang malaking board na pagsusubok ay talaga mas mabagal kaysa sa mga solusyon na naging hash talahanayan. Kaya mas mabilis sa at ng sarili nito ay hindi talaga totoo. David J. MALAN: Dom de DOM DOM. Ako ay marahil ang isa lamang na napagtanto na kung paano na dapat ay binibigkas, tama? Rob BOWDEN: Mayroon akong talagang walang ideya. David J. MALAN: Ito ginawa kahulugan sa aking ulo. Rob BOWDEN: ako ng paggawa ng isang ito. OK. Kaya ito ay ang isa kung saan kayo ay nagkaroon upang gumuhit ang diagram katulad mo lakas na nakita sa nakaraang pagsusulit. Kaya tingnan lamang ni sa ito ipaalam. Kaya mula sa HTML node, mayroon kaming dalawang mga bata, ang ulo at ang katawan. Kaya branch namin - ulo at katawan. Ulo ay may isang tag na pamagat. Kaya mayroon kaming isang pamagat. Ngayon, ang isang bagay ng maraming tao Nakalimutan ay na ang mga nodes teksto ay mga elemento sa loob ng punong kahoy na ito. Kaya dito mangyari namin upang gumuhit ng mga ito bilang mga ovals pag-iibahin ang mga ito mula sa mga mga uri ng node. Ngunit notice din dito mayroon kaming tuktok, gitna, at ibaba ay napupunta sa pagiging teksto nodes. Kaya forgetting mga noon ay medyo ng isang pangkaraniwang pagkakamali. Ang katawan ay may tatlong mga bata - ang tatlong divs. Kaya div, div, div at pagkatapos ay ang teksto node mga anak ng mga divs. Iyan ay medyo magkano ito para sa na mga katanungan. David J. MALAN: At ito ay nagkakahalaga ng noting, kahit na hindi namin mangatwiran ang mga mga detalye sa time gastusin namin sa JavaScript, na ginagawa ng order, sa katunayan, technically bagay na ito. Kaya kung ulo nauuna bago katawan sa HTML, pagkatapos ay dapat na lumitaw sa iniwan ng katawan sa aktwal na DOM. Iyon ang kanyang ay, sa pangkalahatan, Para sa Iyong Impormasyon lamang, isang bagay na tinatawag na order dokumento, kung saan ginagawa nito bagay. At kung ikaw ay pagpapatupad ng isang pang-parse, isang program na bumabasa ng HTML sa gusali up tree sa memorya, upang maging tapat, na intuitively marahil kung ano ang iyong gawin pa rin - itaas hanggang sa ibaba, kaliwa papuntang kanan. Rob BOWDEN: Mga tanong sa iyon? Dapat ko bang gawin ang kasunod? David J. MALAN: Oo naman. Rob BOWDEN: OK. Kaya ito ay ang buffer sumobra atake tanong. Ang pangunahing bagay na makilala dito ay, well, kung paano maaari isang kalaban kahanga-hangang gawa ito programa sa e-execute arbitrary code? Kaya argv1, ang unang linya ng command argumento sa program na ito, na maaaring maging nagkataon mahaba. Ngunit dito na aming ginagamit memcpy upang kopyahin , na argv1 dito ay bar. Kami ay pagpasa ito bilang argumento. At kaya tumatagal sa pangalan bar. Kaya kami memcpying bar sa ito buffer c. Gaano karaming bytes kami ng pagkopya? Well gayunpaman maraming mga byte bar ang mangyayari sa ginagamit, ang haba ng na argumento. Ngunit c ay 12 lamang bytes ang lapad. Kaya kung nag-type namin ang isang argumento command line na mas mahaba kaysa sa 12 bytes, hindi namin pagpunta sa pag-apaw na ito partikular na buffer. Ngayon, kung paano maaaring isang kalaban linlangin ang programa sa e-execute arbitrary code? Kaya tandaan na dito pangunahing Tinatawagan foo. At kaya pagkatapos pangunahing mga tawag sa foo. Ni gumuhit ito Hayaan. Kaya mayroon kaming ang aming stack. At pangunahing ay may isang stack frame sa ibaba. Sa ilang mga punto, ang mga pangunahing mga tawag sa foo. Well, agad-agad, pangunahing mga tawag sa foo. At kaya foo ay makakakuha ng sarili nitong stack frame. Ngayon, sa isang punto, foo Pupunta upang bumalik. At nagpunta foo pagbalik, kailangan naming malaman sa ano linya ng code sa loob ng main namin ay upang malaman kung saan dapat naming ipagpatuloy sa pangunahing. Maaari kaming tawagan foo mula sa isang kabuuan tungkos ng iba't ibang mga lugar. Paano ko malalaman namin kung saan upang bumalik? Well, kailangan namin upang mag-imbak na sa isang lugar. Kaya sa isang lugar sa paligid ng karapatan dito, iniimbak namin kung saan dapat naming bumalik sa isang beses foo babalik. At ito ang return address. Kaya kung paano maaaring tumagal ng isang kalaban kalamangan ng ito ay ang katunayan na ang ito buffer c ay naka-imbak, sabihin sabihin, dito mismo ay c. Kaya Nakakuha kami ng 12 bytes para c. Ito ay c. At ito ay stack singsing foo ni. Kaya kung nagpasok ang nakakahamak na gumagamit nang higit pa bytes sa 12 o magpasok sila ng isang command argumento linya na mas mahaba sa 12 character, pagkatapos kami ay pagpunta sa mapuno ito buffer. Maaari naming panatilihin ang pagpunta. At sa isang punto, pumunta kami ngayon sapat na sisimulan namin ang Sasapawan nito ang return address. Kaya minsan patungan namin ang return address, Nangangahulugan ito na kapag foo pagbalik, kami ay bumabalik sa kung saan man ang nakakahamak na gumagamit ay nagsasabi sa ito sa pamamagitan ng kahit anong halaga ito ipinasok, sa pamamagitan ng kahit anupamang mga character na ipinasok ng gumagamit. At kaya kung ang nakakahamak na gumagamit ay pagiging lalo na matalino, siya ay maaaring magkaroon ng ito bumalik sa isang lugar sa printDef pag-andar o sa isang lugar sa malloc function, lamang kahit saan di-makatwirang. Ngunit kahit na higit pa matalino ay kung ano kung mayroon siyang gumagamit ang bumalik sa dito mismo. At pagkatapos mong simulan ang pagpapatupad sa ito bilang mga linya ng code. Kaya sa puntong iyon, maaari ipasok ang user ano naman siya Nais ng sa rehiyon na ito. At siya ay may kumpletong kontrol higit sa iyong mga programa. Mga Tanong sa iyon? Kaya sa susunod na tanong ay kumpleto na ang reimplementation ng foo sa paraang na hindi na ito mahina laban. Kaya mayroong ilang mga paraan maaaring nagawa mo na ito. Mayroon pa kaming c lamang pagiging ng haba 12. Maaaring nagbago ka ito bilang bahagi ng iyong solusyon. Nagdagdag din kami ng isang tseke upang gumawa ng sigurado bar ay hindi null. Kahit na hindi mo kailangan na para sa buong credit. Kaya kami muna ng pagsuri sa string haba ng bar. Kung ito ay mas malaki kaysa sa 12, pagkatapos ay huwag aktwal na gawin ang mga kopya. Kaya iyon ang isang paraan ng pag-aayos nito. Ang isa pang paraan ng pag-aayos ng ito ay sa halip ng pagkakaroon c maging ng haba 12 lamang, mayroon itong maging ng haba strlen (bar). Ang isa pang paraan ng pag-aayos ng ito ay upang bumalik talaga lang. Kaya kung lang mo ay nakuha mapupuksa ang lahat ng ito, kung lamang sa iyo ay tinanggal lahat linya ng code, na maaaring nakuha mo buong credit, dahil ito function na ay hindi aktwal na makamit kahit ano. Ito ay pagkopya sa command line argumento sa ilang mga array sa nito lokal na stack na frame. At pagkatapos ay ang bagay ay bumabalik. At ano naman ito nagagawa ay nawala. Kaya return ay isang sapat na rin paraan ng pagkuha ng buong credit. David J. MALAN: Hindi masyadong ang espiritu ng ang tanong ngunit katanggap-tanggap ayon sa mga spec gayunman. Rob BOWDEN: Mga tanong sa anuman sa mga iyon? Ang isang bagay na hindi bababa sa kinakailangan upang pa kino-compile ang code. Kaya kahit na technically kayo ay hindi maaaring masaktan kung ang iyong code ay hindi sumulat ng libro, hindi kami tumatanggap ng iyon. Walang mga tanong? OK. David J. MALAN: Nais mo upang sabihin sa pamagat na ito? Rob BOWDEN: Hindi. David J. MALAN: Kaya sa isang ito, ito ay alinman sa mabuting balita o masamang balita. Ito ay literal ang parehong problema bilang unang pagsusulit. At ito ay halos pareho problema bilang pset1. Ngunit sadyang ito ay pinasimple upang maging ng isang mas simpleng pyramid, isa na maaaring maging Nalutas na may bahagyang mas simple iteration. At talaga, kung ano tayo ay nakakakuha sa dito ay hindi kaya magkano ang logic, dahil marahil, sa pamamagitan ng puntong ito, ikaw ay higit pang mga kumportableng kaysa ikaw ay sa linggo ang isa ay may para sa mga loop o bakit loop, pero talagang mang-ulol-hatiin na ikaw ay isang maliit na komportable na sa paniwala na PHP ay hindi tungkol sa kung ano lamang programming. Talaga Ito ay maaaring magamit bilang isang wika sumulat ng linya mga programa ng command. At sa katunayan, iyon ang kung ano ang aming sinusubukan upang gumuhit ng iyong pansin sa. Ito ay isang programa command line PHP. Kaya C code dito, habang tama sa C, hindi itama para sa PHP. Ngunit ang code talaga ay pareho. Kung ihambing mo ang mga solusyon para sa Pagsusulit 0 laban sa Pagsusulit 1, makikita mo na ito ay halos magkapareho, maliban sa ang ilang mga palatandaan dollar at para sa mga kawalan ng isang uri ng data. Sa partikular, kung tinitingnan namin ang dito, makikita mo na umulit namin, sa ganitong kaso, mula 1 up sa pamamagitan ng 7. Na namin ma-tapos na ito 0 index. Ngunit minsan, sa tingin ko ito lamang sa itak mas madali mag-isip tungkol sa mga bagay 1-7. Kung nais mong isang bloke, pagkatapos ng dalawang bloke, pagkatapos ay tatlo, pagkatapos ay tuldok, tuldok, dot pitong. J namin ini-initialize sa 1 at pagkatapos ng pagbibilang sa hanggang sa i. At lahat ng bagay dito ay kung hindi man magkapareho. Ngunit karapat-dapat sa tala ay dalawang bagay. Bigyan ka namin ng mga dalawang linya, una ito isa, goofily pinangalanan bilang isang shebang para sa matalim putok. At na tumutukoy lamang sa landas, ang folder, kung saan ang isang programa ay maaaring maging nalaman na gusto mong gamitin upang bigyang-kahulugan ang file na ito. At pagkatapos ay ang linya matapos na, ng Siyempre, nangangahulugan ipasok ang mode PHP. At ang mga linya sa ibaba napaka Nangangahulugan mode exit na PHP. At ito ay gumagana, sa pangkalahatan, may kahulugan ng mga wika. Ito ay uri ng nakakainis na kung sumulat ka ng isang programa sa isang file na tinatawag foo.php. At pagkatapos ang iyong mga gumagamit ay may sa makatarungan tandaan, OK, upang patakbuhin ang program na ito, ako Mayroon i-type ang "php space foo.php." Uri ng mga nakakainis na kung wala pang tao. At ito rin ay nagpapakita na ang iyong mga programa ay nakasulat sa PHP, na kung saan ay hindi lahat na pagbibigay para sa user. Kaya maaari mong alisin ang. Php nang sama-sama isipin mula sa panayam. At maaari mong talagang gawin. / Foo kung na iyong chmodded ito sa pamamagitan ng pagpapadali executable. Kaya sana ay tapos chmod isang + x foo iyon. At kung mong idagdag din ang shebang dito. Ngunit talaga ito, ang problema ay nakukuha sa nagpi-print out ng isang bagay na katulad nito. Walang HTML, walang C-code ay tiyak na, ilan lang na PHP. Kaya Milo pagkatapos ay ibinalik sa problema 25. At sa 25, kung saan bibigyan ka ng mga sumusunod balangkas code, na noon ay isang medyo simple web page. At ang makatas bahagi ng HTML-matalino ay down dito, kung saan mayroon sa loob ng katawan namin ng isang form na may mga natatanging ID ng input sa loob ng na kung saan ay dalawang input, isa may isang ideya ng pangalan, isa may isang ideya ng pindutan. Ang unang naging uri ng teksto, ang pangalawang uri ng isumite. At kaya nagbigay kami sa iyo, talaga, nang higit pa sangkap kaysa sa iyo na kailangan, kaya lamang ka guys ay nagkaroon ng mga pagpipilian na kung saan upang malutas ang problemang ito. Hindi mo na mahigpit na kailangan lahat ng mga ID. Ngunit ito ay nagbibigay-daan sa iyo upang malutas ito sa iba't ibang paraan. At hanggang sa tuktok, napansin na ang ang layunin ay upang palitawin ang isang window na tulad nito - Kumusta, Milo! - mag-pop up sa browser gamit ang sobrang simple, kung hindi mainit ang ulo, function na alerto. At kaya, sa huli, boils down na ito conceptually upang kahit papaano ay nakikinig para sa mga pagsusumite ng form ng client-side , Hindi ang server-side, kahit paano pagtugon sa pagsusumite na sa pamamagitan ng daklot ang halaga na nai-type ng gumagamit ang in sa patlang na Pangalan, at pagkatapos ay pagpapakita ng mga ito sa katawan ng isang alerto. Kaya isang paraan na maaari mong gawin ito ay may jQuery, na kamukha ng kaunti syntactically nakalilito sa unang. Maaari mong gawin ito gamit ang purong DOM code - document.getelement sa pamamagitan ng ID. Ngunit ipaalam sa tumagal ng isang pagtingin sa bersyong ito. Mayroon akong isang pares ng mga mahalagang mga linya unang. Kaya isa, mayroon kaming ang linyang ito, na kung saan ay magkapareho sa kung ano ang maaaring na nakita mo sa, naniniwala ako, form2.html mula sa klase sa linggo 9. At ito ay sinasabi lang, gawin ang sumusunod na code kapag ang dokumento ay handa na. Ang pagiging mahalaga dahil lamang Mga HTML na pahina ay read tuktok upang ibaba, kaliwa papuntang kanan. At samakatuwid, kung susubukan mong gawin isang bagay sa code dito sa ilang mga DOM elemento, ang ilang mga HTML tag, na kung pababa dito, ninyo ito ginagawa masyadong lalong madaling panahon, dahil ito ay hindi kahit na Na-basahin sa memorya. Kaya sa pamamagitan ng sinasabi ito document.ready linya, sinasabi na namin, narito ang ilang code, browser. Ngunit huwag mag-execute ito hanggang ang buong dokumento ay handa na, iyon ay ang DOM puno umiiral sa memorya. Isa na ito ay isang kaunti pa prangka, kung syntactically isang bit ibang, kung saan makakakuha ako sinasabi, mang-agaw ang HTML element na kung saan ang mga natatanging identifier ay input. Iyon ay kung ano ang hash tag Tinutukoy, ang mga natatanging ID. At pagkatapos ay ako sa pagtawag. Isumite. Kaya. Isumite dito ay isang function, kung hindi man Kilala bilang isang paraan, na sa loob ng bagay na sa mga kaliwete gilid doon na hindi ako nag-i-highlight. Kaya kung sa tingin mo ng input bilang isang bagay na sa memorya - at sa katunayan ito ay. Ito ay isang node sa isang puno - . Isumite ang paraan kapag ang form na ito sa ang ID na ito ay isinumite, gawin ang sumusunod na code. Wala akong pakialam kung ano ang pangalan ng function ay ako e-execute. Kaya dito ko ginagamit, tulad ng dati, kung ano ang na tinatawag na ang lambda function na o isang anonymous na function. Ito ay hindi sa lahat intellectually kagiliw-giliw na bukod sa ito ay walang pangalan, na kung saan ay pinong kung ikaw ay lamang kailanman pagpunta sa tumawag ito nang isang beses. At sa loob doon talaga ako mahawakan ang pagsusumite ng form. Ako unang magpahayag ng isang variable tinatawag na halaga. At pagkatapos ay kung ano ang epekto ng mga ito naka-highlight na bahagi dito ngayon? Ano ang ibig na gawin sa isang mataas na antas para sa akin? Madla: Ito ay nakakakuha ng halaga na ang May ginawang gumagamit hindi sa HTML sa ibaba. Ito ay makakakuha ng ID na iyon at pagkatapos ay nakakahanap ng mga halaga ng mga ito. David J. MALAN: Mismong. Ito grabs ang node, na ang natatanging identifier ay pangalan. Ito ay nakakakuha ng halaga doon, na ay, siguro, kung ano ang user nai-type sa kanya o ang kanyang sarili. At pagkatapos ay nag-iimbak ito na sa variable na tinatawag na halaga. Bilang isang bukod, maaari kang magkaroon din tapos ito medyo naiiba. Lahat-lahat katanggap-tanggap sa pamamagitan ng paggawa ng isang bagay ay makakakuha ng kasinungalingan var halaga document.getElementById. At ito ang dahilan kung bakit ito ay isang maliit na nakakapagod na hindi gumagamit ng jQuery. "Pangalan" value.. Kaya lubos na katanggap-tanggap. Iba't ibang mga paraan upang magawa ito. jQuery lamang may gawi na maging mas maikli at malinaw at ng kaunti Talagang mas sikat kabilang sa mga programmer. Ngayon, ako paggawa ng isang bit ng isang katinuan suriin, dahil sa mga problema pahayag tahasan naming sinabi, kung ang user ay hindi pa nai-type ang kaniyang pangalanan, huwag ipakita ang isang alerto. Ngunit maaari mong suriin para sa na, sa pamamagitan lamang pagsusuri para sa mga walang laman na string para sa isang quote-magpanipi kung mayroong wala talaga doon. Ngunit kung ito ay hindi katumbas ng quote-magpanipi, Gusto kong tumawag sa mga alerto. At ang mga kagiliw-giliw na bahagi dito ay na ginagamit namin ang plus operator, na ginagawa kung ano sa JavaScript? Pagdugtungin. Kaya ito ay tulad ng PHPs tuldok operator. Parehong ideya, bahagyang naiiba syntax. At Lumilikha ako lamang ang string na na nakita mo sa shot screen - Kamusta, sa gayon. At pagkatapos ay ang huling detalye ay na ito. Bakit bumalik ako ng hindi totoo sa loob ng anonymous function na ito? Madla: Walang halaga. Inilagay mo ito sa form na ito. Ito lang ang sabi, kung halaga ay hindi katumbas ng blangko, pagkatapos ay gawin ito. Nagkaroon ng blangko sa pagsusumite iyon. David J. MALAN: OK. Mag-ingat bagaman. Walang sinuman ang dito. At na return false ay nasa labas ng kung kundisyon. Kaya ito na naka-highlight linya, bumalik hindi totoo, executes kahit na ano kapag ang form ay isinumite. Ano ang bumabalik na hindi totoo sa loob ng ito handler ng kaganapan, pati na ang tawag dito, ang kaganapan na pinag-uusapan pagiging pagsusumite? Madla: Dahil ito mangyayari lamang nang isang beses. David J. MALAN: mangyayari lamang nang isang beses. Hindi masyadong. Oo? Madla: Pinipigilan nito ang form na ito mula sa pagsusumite sa default na pag-uugali, na kung saan ay gagawa ng reload na pahina. David J. MALAN: Mismong. Kaya ako ingagkakargaang labis ko ng term na magsumite dito, dahil ako na nagsasabi, ang form ay ini-sumite. Ngunit bilang iminumungkahi sa iyo, ito ay talagang hindi Naisumite na sa totoo HTTP paraan. Kapag nag-click ka sa Isumite, dahil sa aming onSubmit handler, kami ay intercepting na ang pagsumite ng form upang magsalita. Pagkatapos naming ginagawa ang aming bagay may JavaScript code. Ngunit sadya ako bumabalik na hindi totoo, dahil kung ano ang hindi ko gustong mangyari ng split second mamaya ay para sa buong anyo mismo na isinumite sa web server gamit ang key ng mga pares ng halaga sa pamamagitan ng pagbabago ang URL upang maging isang bagay tulad ng q = pusa o kahit anong ginawa namin, halimbawa, sa class. Hindi ko nais na mangyari, dahil walang pakikinig server para sa bumuo ng pagsusumite. Pulos tapos na ito sa JavaScript code. At iyon ang dahilan kung bakit ako ay hindi kahit na magkaroon ng isang pagkilos ipatungkol sa aking form, dahil ako hindi nilayon para sa ito sa kailanman pumunta sa server. Kaya ito ay ini-sumite. Ngunit kami ay intercepting form na iyon ang pagsumite at pumipigil sa default pag-uugali, na kung saan ay ang aktwal na pumunta lahat ng mga paraan sa server. Madla: Kaya pagpapanatiling ito sa panig ng client. David J. MALAN: Pagpapanatiling ito client-side. Akmang-akma. Susunod up ay aking oh MySQL. Rob BOWDEN: OK. Kaya ito unang tanong ay sa pangkalahatan magaspang na para sa mga tao. Kahit na ang mamaya mga nagpunta mas mahusay. Kaya kayo ay nagkaroon ng upang piliin ang tamang data mga uri para sa parehong ng mga hanay na ito. At pareho sa mga may ilang mga bagay tungkol sa kanila na gawin ang mga pagpipilian mahirap. Kaya int ay hindi isang wastong nagta-type para sa numero. Ang dahilan sa pagiging isang 12-digit account numero, isang int ay hindi sapat na malaki upang mag-imbak ng kabuuang mga digit. Kaya isang wastong pagpili maaaring naging isang malaking int kung mangyari mong malaman na. Sana naging Ang isa pang pagpipilian isang pansamantalang trabaho field ng haba 12. Kaya ang alinman sa mga sana ay nagtrabaho. Int gagawin hindi. Ngayon, balanse, sa tingin pabalik sa pset7. Kaya partikular na namin ginagamit decimal sa mag-imbak ang halaga ng pagbabahagi o - David J. MALAN: Cash. Rob BOWDEN: Cash. Ginamit namin decimal upang i-imbak ang halaga ng cash na ang gumagamit ay kasalukuyang may. Kaya ang dahilan ginagawa namin na dahil, tandaan, sa kamay. Mayroong mga lumulutang na tuldok sa katumpakan. Hindi ito maaaring tumpak iimbak ang cash mga halaga tulad namin gusto dito. Kaya decimal ay magagawang tiyak na tindahan isang bagay sa, sabihin nating, dalawang decimal place. Iyon ang dahilan kung bakit balanse, gusto namin ito upang maging decimal at hindi lumutang. David J. MALAN: At din, masyadong, bagaman maaaring ito ay inalisan ng matalino sa iba pang mga konteksto sa tingin, siguro ito ay isang pagkakataon para sa isang int. Kukunin ko na lang subaybayan ang mga bagay sa pennies. Dahil tahasan naming Nagpakita ang default na halaga ng pagiging 100.00, na Nangangahulugan ito ay maaaring lamang sa isang int. At isa pang kapitaganan masyadong may numero ay hindi ito sinadya upang maging isang kahanga-hangang gawa tanong. Ngunit isipin na isang int sa MySQL, tulad ng sa C, hindi bababa sa appliance, ay 32-bit. At kahit na hindi namin inaasahan mong eksaktong alam kung gaano karaming mga digit na paraan, huwag isipin na ang pinakamalaking bilang maaari mong kumatawan potensyal na may 32-bit na numero ay halos kung ano? Ano ang numero ko palagi naming sabihin? 2 sa 32, na kung saan ay kung ano ang halos? Hindi mo na kailangang malaman tumpak. Pero halos ay kapaki-pakinabang sa buhay. Ito ay humigit-kumulang 4000000000. Kaya na sinabi namin na nang ilang beses. Alam ko na ako ay sinabi na nang ilang beses. At ito ay halos 4000000000. At iyon, isang magandang panuntunan ng hinlalaki malaman. Kung mayroon kang 8 bits, 256 ay ang magic number. Kung mayroon kang 32 bits, 4 bilyon bigyan o tumagal. Kaya kung sumulat ka lang pababa 4000000000, makikita mo na ito ay mas kaunti kaysa sa mga digit 12, na nangangahulugan na malinaw na hindi sapat expressiveness upang makuha ang isang 12-digit na numero ng account. Rob BOWDEN: OK. Kaya ang iba pang mga bago nagpunta mas mahusay. Kaya ipagpalagay na ang bank nagpatupad ang isang $ 20 buwanang maintenance fee sa lahat ng mga account. Sa aling mga SQL query ng dati ang bank ibabawas $ 20 mula sa bawat count, kahit na Mga resulta ng ito sa ilang mga negatibong balanse? Kaya talaga, may mga apat pangunahing uri ng mga query - isingit, piliin, i-update, at tanggalin. Kaya ano ang tingin namin kami ay pagpunta sa gamitin dito? I-update. Kaya ipaalam sa tumagal ng isang hitsura. Kaya dito naming ina-update. Ano talahanayan ay ina-update namin ang mga account? Kaya pag-update ng account. At pagkatapos ay ang syntax sabi, kung ano sa mga account ay ina-update namin? Well, kami ay pagtatakda ng balanse katumbas ng kasalukuyang halaga ng balanse minus 20. Kaya Maa-update ito sa lahat ng mga hilera ng mga account, ng pagbabawas $ 20 mula sa balanse. David J. MALAN: Ang isang karaniwang pagkakamali dito, kahit minsan forgave namin ito, ay ang aktwal na mayroon dito code na PHP pagtawag sa function na query o paglalagay quote sa palibot ng lahat ng bagay na ay hindi kailangang maging doon. Rob BOWDEN: Tandaan na ang MySQL ay isang hiwalay na wika mula sa PHP. Mangyari namin na sumusulat MySQL sa PHP. At PHP ay pagkatapos ipadala ito sa ibabaw ng mga MySQL server. Ngunit hindi mo kailangang PHP upang makipag-ugnayan sa isang MySQL server. David J. MALAN: Mismong. Kaya walang mga variable na may mga palatandaan dollar Dapat na nasa kontekstong ito. Maaari lamang itong gawin ang lahat ng mga matematika sa loob ng mismong database. Rob BOWDEN: OK. Kaya sa susunod na isa. Sa susunod na isa ba ito? Oo. Kaya may ano SQL query ng dati ang bank mabawi ang mga numero ng account ng nito pinakamayamang mga customer, ang mga may balanse mas malaki kaysa sa 1000? Kaya kung alin sa mga apat na pangunahing uri kami makapupunta sa gusto dito? Piliin. Kaya gusto naming piliin. Ano ang gusto naming piliin? Ano haligi nais naming piliin? Susubukan naming partikular, gusto upang piliin ang numero. Ngunit kung sinabi mo star, namin Tinanggap din iyon. Kaya piliin ang numero mula sa kung ano ang talahanayan? Accounts. At pagkatapos ay ang kundisyon gusto naming? Saan balanse mas malaki kaysa sa 1000. Tinanggap din kami ng mas malaki mababa sa o katumbas. Huling isa. Sa aling mga SQL query ng dati ang bank malapit, ibig sabihin, tanggalin ang bawat account na May balanse ng $ 0? Kaya kung aling sa apat na tayo pagpunta sa nais na gumamit? Tanggalin. Kaya ang syntax para sa iyon? Tanggalin mula sa kung ano ang talahanayan? Accounts. At pagkatapos ay ang kundisyon kung saan gusto naming tanggalin - kung saan ay katumbas ng balanse sa zero. Kaya tanggalin ang lahat ng mga hilera mula sa mga account kung saan walang balanse. Mga tanong sa anuman sa mga ito? Gustong mag-lilinya? David J. MALAN: gabay sa Queue. Kaya sa isang ito, binigyan ka namin ng isang medyo pamilyar na istraktura na ginalugad namin ang isang bit sa klase sa tabi ng structs, na kung saan ay isang data may kaugnayan sa espiritu istraktura. Ang pagkakaiba bagama't may queue na namin ay may upang kahit papaano ay matandaan kung sino ay nasa harap ng pila, sa malalaking bahagi nang sa gayon ay maaari kaming magsagawa ng higit pang mga mahusay na paggamit ng memory, hindi bababa sa kung kami ay gumagamit ng isang array. Dahil pagpapabalik, kung kami ay may isang array, kung, halimbawa, ito ay ang harapan ng ang queue, kung makakuha ako papunta sa pila dito, at pagkatapos ay isang tao ay nakakakuha sa linya sa likod ng akin, sa likod ako, sa likod sa akin, at isang tao hakbang out ng linya, mo dati, bilang Nakita namin ang ilan sa aming pantao boluntaryo sa klase, mayroon ng lahat shift ganitong paraan. Ngunit sa pangkalahatan, pagkakaroon ng lahat ng tao gawin isang bagay ay hindi ang pinakamabuting paggamit ng oras sa isang programa, dahil ang ibig sabihin nito ang iyong algorithm ay tumatakbo sa kung ano asymptotic oras running? Ito ay linear. At sa tingin ko katulad na uri ng bobo. Kung ang susunod na tao sa linya ay ang susunod na tao kung sino ang dapat na pumunta sa tindahan, sila hindi lahat ng mayroon upang ilipat nang magkakasama. Hayaan lamang ang taong iyon ay plucked off kapag ang oras ay dumating, halimbawa. Kaya maaaring mag-save kami ng kaunting oras doon. At kaya bang gawin iyon bagaman, paraan na na ang pinuno ng queue o ang harap ng queue ay pagpunta sa progressively ilipat ang mas malalim at mas malalim sa array at kalaunan maaari talaga balutin sa paligid kung ginagamit namin ang isang array upang i-imbak ang mga tao sa ganitong queue. Kaya maaari mong halos isipin ang array bilang isang pabilog na data istruktura sa na kahulugan. Kaya mo kahit papaano mayroon upang masubaybayan ang laki ng ito o talagang sa dulo ng ito at pagkatapos ay kung saan ang simula ng ito ay. Kaya ipanukala namin na pinahahayag isa tulad queue, pagtawag ito q, isang titik lamang. Pagkatapos ipanukala namin na ang front maging nasimulan sa zero at na ang laki ma-initialize sa zero. Kaya ngayon, walang ay sa loob ng na queue. At magtanong ka namin upang makumpleto ang pagpapatupad ng enqueue sa ibaba sa tulad ng isang paraan na ang pag-andar nagdadagdag n sa sa dulo ng q at pagkatapos ay bumalik totoo. Ngunit kung q ay puno na o negatibong, ang pag-andar ay dapat na sa halip bumalik hindi totoo. At binigyan ka namin ng isang pares ng mga palagay. Ngunit ang mga ito ay hindi talaga sa pagtakbo , umiiral ang may-katuturang bool lang iyon, dahil, technically, bool hindi umiiral sa C maliban kung isinama mo ang isang ang ilang mga file na header. Kaya na tiyakin lamang na mayroong ay hindi ito isang kahanga-hangang gawa tanong uri ng bagay. Kaya enqueue, ipinanukala sa sample solusyon upang ipatupad tulad ng sumusunod. Ang isa, muna naming suriin ang kadalian, low-hanging prutas. Kung ang queue ay puno o ang bilang na na sinusubukan mong ipasok Mababa sa zero, na sinabi namin sa pagtutukoy ng problema dapat hindi papayagan, dahil gusto naming lamang hindi-negatibong halaga, pagkatapos ay dapat mong bumalik lamang huwad na agad. Kaya ang ilang mga relatibong madaling error-check. Kung bagaman gusto mong idagdag na aktwal na numero, nagkaroon ka na gawin ang isang bit ng pag-iisip dito. At ito ay kung saan ito ay isang maliit na nakakainis sa pag-iisip, dahil mayroon kang upang malaman kung paano panghawakan ang wraparound. Ngunit ang mikrobyo ng ideya dito na ng interes sa amin ay na wraparound madalas nagpapahiwatig Modular palatuusan at ang mod operator, ang porsiyento gilid, kung saan maaari kang pumunta mula sa isang mas malaking halaga bumalik sa zero at pagkatapos ay i-isa at dalawa at tatlong at pagkatapos ay bumalik sa paligid sa zero, isa at dalawa at tatlong at iba pa muli at muli. Kaya ang paraan nagmungkahi kami ng paggawa nito ay na nais naming i-index sa array na tinatawag na mga numero kung saan ang aming integer nagsasabi ng totoo. Ngunit upang makakuha ng doon, gusto muna naming gawin anuman ang laki ng queue pero pagkatapos ay idagdag sa na kung ano ang harapan ng listahan ay. At ang epekto ng na ay upang ilagay sa amin sa ang tamang posisyon sa queue at hindi ipinapalagay na ang unang tao sa linya ay sa simula, na siya o siya walang pasubali maaaring maging kung namin ay rin nagbabago lahat. Ngunit ka lamang paglikha namin trabaho para sa ating mga sarili kung kinuha namin na partikular na daanan. Kaya maaari naming panatilihin ito medyo simple. Kami kailangang tandaan na namin lamang Idinagdag sa isang int sa pila. At pagkatapos ay bumalik lang namin totoo. Samantala, sa dequeue, hiniling namin mong gawin ang sumusunod. Ipatupad ito sa paraan na ito dequeues, na nag-aalis at babalik, ang int sa harap ng queue. Upang alisin ang mga int, suffices ito upang makalimutan ito. Hindi mo kailangang i-override bit nito. Kaya ito ay talagang doon pa rin. Tulad ng data sa isang hard drive, kami ay hindi papansin ang lang ang katotohanan na ito ay mayroon na ngayong. At kung q ay walang laman, dapat namin sa halip bumalik negatibong 1. Kaya ito nararamdaman di-makatwirang. Bakit bumalik negatibong 1 sa halip ng hindi totoo? Oo. Madla: Q ay ang pag-iimbak mga positibong halaga. Dahil imbak mo ang mga positibong halaga sa q, negatibong ay isang error. David J. MALAN: OK, totoo. Kaya dahil kami lamang ang pag-iimbak ng positibong mga halaga o zero, pagkatapos ito ay pinong upang magbalik ng negatibong halaga bilang isang tanod halaga, isang espesyal na simbolo. Ngunit ka muling pagsusulat ng kasaysayan doon, dahil ang dahilan lamang kami bumabalik hindi-negatibong halaga ay dahil gusto naming magkaroon ng isang halaga nagbabantay. Kaya higit na partikular, kung bakit hindi lamang bumalik hindi totoo sa mga kaso ng mga error? Oo. Madla: mo na nabigo upang bumalik isang integer. David J. MALAN: Mismong. At ito ay kung saan nakakakuha C medyo constraining. Kung ikaw ay nagsasabi ka ng pagpunta upang bumalik sa isang int, na kailangan upang bumalik sa isang int. Hindi ka maaaring makakuha ng magarbong at simulan ang pagbabalik isang bool o isang float o isang string o isang bagay tulad na. Ngayon, samantala, JavaScript at PHP at ilang iba pang mga wika maaari, sa katunayan, mayroon kang bumabalik iba't ibang mga uri ng mga halaga. At na aktwal na maaaring maging kapaki-pakinabang, kung saan maaari kang bumalik positibong ints, zero, negatibong ints, o hindi totoo o null kahit na upang magpahiwatig ng error. Ngunit wala kaming na masaklaw na karunungan sa C. Kaya may dequeue, kung ano ang aming ipanukala gawin ay - Rob BOWDEN: Maaari kang bumalik hindi totoo. Ito ay lamang na hindi totoo ay hash tukuyin ang hindi totoo sa zero. Kaya't kung ikaw ay bumalik hindi totoo, bumabalik ka sa zero. At zero ay isang wastong bagay sa aming queue, samantalang ang mga negatibong 1 ay hindi kung maling nangyari sa mga negatibo 1. Ngunit hindi ka dapat kahit na kailangang malaman iyon. David J. MALAN: Iyon bakit hindi ko ito sinasabi. Rob BOWDEN: Subalit hindi totoo na hindi na kayo makakabalik false. David J. MALAN: Oo naman. Kaya dequeue, mapapansin na aming tinatanggap walang bisa bilang argument nito. At iyon ay dahil kami ay hindi pagpasa ng kahit ano in Gusto lang namin upang alisin ang elemento ng sa harap ng queue. Kaya kung paano maaari naming pumunta tungkol sa paggawa na ito? Well, una, ni gawin ito ipaalam mabilis na check katinuan. Kung ang laki queue 0, mayroong walang trabaho na gawin. Bumalik negatibong 1. Tapos na. Kaya na ng ilang linya ng aking programa. Kaya apat lang linya mananatiling. Kaya dito nagpasya kong pagbawas ang laki. At decrementing ang laki nang epektibo Nangangahulugan na ako forgetting isang bagay ay nasa doon. Ngunit mayroon din akong i-update kung saan sa harap ng mga numero ay. Kaya upang gawin iyon, kailangan ko upang gawin ang dalawang bagay. Kailangan ko munang i-matandaan kung ano ang bilang ay nasa harap ng pila, dahil kailangan ko upang bumalik bagay na iyon. Kaya hindi ko nais na sinasadyang kalimutan ang tungkol dito at pagkatapos patungan ito. Lamang ako ng pagpunta sa tandaan sa isang int. At ngayon, gusto kong i-update q.front na q.front 1. Kaya kung ito ay ang unang tao sa linya, ngayon, gusto kong gawin plus 1 sa ituro sa susunod na tao sa linya. Ngunit mayroon akong upang mahawakan na wraparound. At kung kapasidad ay isang pandaigdigang pare-pareho, na pupuntahan payagan ako upang tiyakin na bilang ituro ako sa napaka huling tao sa linya, ang operasyon modulo ay magdadala ng ako pabalik sa zero sa harap ng queue. At na humahawak sa mga wraparound dito. At pagkatapos ay magpatuloy ako upang bumalik n. Ngayon, mahigpit na nagsasalita, ginawa ko hindi mayroon na idedeklara n. Hindi ko kailangang mag-grab ito at mag-store ito pansamantalang, dahil ang halaga ay pa rin doon. Kaya maaari kong gawin lang sa tamang palatuusan upang ibalik ang dating ulo ng queue. Ngunit lamang nadama ko na ito ay mas malinaw upang aktwal na-grab ang int, ilagay ito sa n, at pagkatapos ay bumalik na alang-alang sa kalinawan ng ngunit hindi mahigpit na kinakailangan. Psst. Ang mga ito ang lahat ng mga nabibigkas sa aking ulo. Rob BOWDEN: Kaya unang tanong ay ang binary problema tree. Kaya unang tanong ay, kami ay naibigay na ang mga numerong ito. At gusto namin upang kahit papaano ay ipasok ang mga ito sa mga nodes tulad na ito ay isang wastong binary paghahanap tree. Kaya ang isang bagay upang tandaan tungkol sa binary paghahanap puno ay na ito ay hindi lamang na ang mga bagay sa kaliwa Mababa at ang bagay na dapat sa kanan ang mas mataas. Kailangan itong maging na ang buong tree upang kaliwa ay mas mababa, at ang buong puno sa kanan ang mas mataas. Kaya kung ko bang ilagay ang 34 dito sa tuktok, at pagkatapos ay Naglagay ako ng 20 dito, kaya iyon ang wastong kaya sa ngayon, dahil 34 up dito. 20 ay pagpunta sa kaliwa. Kaya na mas mababa. Ngunit hindi ko pagkatapos ay maaari ilagay 59 dito, dahil kahit na 59 ay nasa kanan ng 20, ito ay sa kaliwa ng 34 pa rin. Kaya may na hadlang sa isip, ang pinakamadaling paraan ng pag-solve marahil ito problema ay ang uri lamang ng mga numerong ito - kaya 20, 34, 36, 52, 59, 106. At pagkatapos ay ipasok ang mga mula kaliwa papuntang kanan. Kaya 20 na napupunta dito. 34 napupunta dito. 36 napupunta dito. 52, 59, 106. At ka din sana may korte out kasama ilang i-plug in at napagtatanto, oh, maghintay, wala akong sapat na mga numero upang punan ito sa paglipas dito. Kaya kailangan kong reshift ano ang aking tala ruta ay magiging. Ngunit mapansin na sa huling tatlong, kung mong basahin mula kaliwa hanggang kanan, ito ay nasa pagtaas ng order. Kaya ngayon, gusto naming magpahayag ng kung ano ang struct ay magiging para sa mga node sa punong kahoy na ito. Kaya kung ano ang kailangan namin sa isang binary puno? Kaya mayroon kaming isang halaga ng uri int, kaya ang ilang mga halaga int. Hindi ko alam kung ano ang tinatawag naming ito sa solusyon - int n. Kailangan namin ng isang pointer sa kaliwa anak at isang pointer sa kanan bata. Kaya ito ay pagpunta sa ganito ang hitsura. At talagang ito kailanman lilingon bago kapag sinabi ng doble na naka-link bagay-bagay na listahan, kaya notice - Pupunta ako sa mag-scroll ang lahat ng mga paraan bumalik down sa problema 11. Kaya't mapapansin mukha itong kapareho ito, maliban mangyari lamang namin na tumawag sa mga iba't ibang mga pangalan. Mayroon pa kaming isang integer halaga at dalawang mga payo. Ito ay lamang na sa halip ng pagpapagamot ng mga mga payo bilang ng pagturo sa susunod na bagay at naunang bagay, kami ay pagpapagamot ng ang mga payo upang tumuro sa isang kaliwang anak at kanang mga bata. OK. Kaya iyon ang aming struct node. At ngayon, ang tanging pag-andar na kailangan namin upang ipatupad para ito ay tumawid, na gusto naming pumunta sa ibabaw ng tree, pag-print out ang mga halaga ng puno sa pagkakasunud-sunod. Kaya hinahanap dito, nais namin nais na i-print out 20, 34, 36, 52, 59, at 106. Paano ko maisagawa namin iyon? Kaya ito ay medyo katulad. Kung nakita mo sa nakaraan eksaminasyon ang problema na nais mong i-print out ang buong puno na may mga kuwit sa pagitan ng ang lahat ng bagay, ito ay aktwal na kahit na mas madali kaysa sa na. Kaya dito ay ang solusyon. Ito ay makabuluhang mas madali kung ginawa mo ito recursively. Hindi ko alam kung Tinangka sinuman upang gawin ito iteratively. Ngunit una, mayroon kaming ang aming base kaso. Paano kung ang ugat ay walang bisa? Pagkatapos lang kami ng pagpunta upang bumalik. Hindi namin nais na i-print ang kahit ano. Iba Pa kami ng pagpunta sa pagtawid recursively pababa. I-print ang buong kaliwang subtree. Kaya mag-print ng lahat ng bagay mas kaunti kaysa sa aking kasalukuyang halaga. At pagkatapos ay ako pagpunta sa i-print ang aking sarili. At pagkatapos ay ako pagpunta sa recurse down na aking buong karapatan subtree, kaya ang lahat ng bagay mas higit pa kaysa sa aking halaga. At ito ay pagpunta sa i-print out ang lahat sa order. Mga Tanong sa kung paano ito talaga accomplishes na? Madla: Mayroon akong tanong sa [hindi marinig]. Rob BOWDEN: Kaya isang paraan ng papalapit anumang recursive problema ay ang sa tingin lamang tungkol dito gusto mayroon kang mag-isip tungkol sa lahat ng mga kaso sulok. Kaya isaalang-alang na nais naming i-print ang buong tree. Kaya lahat kami ay pagpunta sa focus sa ay ang partikular na node - 36. Ang recursive tawag, magpanggap namin mga lang gagana. Kaya dito, ito recursive tawag sa tumawid, namin nang hindi kahit na pag-iisip tungkol dito, traversing lamang sa kaliwa tatlo, isipin na mayroon ng mga Kopya 20 at 34 para sa amin. At pagkatapos ay kapag kami kalaunan recursively tumawag sa pagtawid sa kanan, na tama ang i-print 52, 59, at 106 para sa amin. Kaya ibinigay na maaaring i-print ito 20, 34, at maaaring mag-print ang iba pang mga 52, 59, 108, lahat ng kailangan namin upang magawang gawin ay i-print kami mismo sa gitna ng iyon. Kaya i-print out ang lahat bago sa amin. I-print kami mismo, kaya ang kasalukuyang node sa pag-print 36, regular printf, at pagkatapos ay i-print ang lahat pagkatapos sa amin. David J. MALAN: Ito ay kung saan recursion ay makakakuha ng talagang magandang. Ito ay ang mga kamangha-manghang talon ng pananampalataya kung saan gagawin mo ang tiniest bit ng trabaho. At pagkatapos mong hayaan ang isang tao iba na ang bahala. At may iba ay, ironically, mo. Kaya para sa mga malubhang mga puntos ng brownies, kung kang mag-scroll pataas sa mga tanong - Rob BOWDEN: Sa mga tanong? David J. MALAN: At pababa ng kaunti sa ang mga numero, ang sinuman alam kung saan ang mga numerong ito nanggaling? Rob BOWDEN: Mayroon akong Literal na walang ideya. David J. MALAN: Lumilitaw ang mga ito sa buong pagsusulit. Madla: ba ang mga ito ang parehong numero? David J. MALAN: Yaong mga numero. Ang isang maliit na Easter itlog. Kaya para sa mga mo ang panonood online sa bahay, kung maaari mong sabihin sa amin sa pamamagitan ng e-mail sa heads@CS50.net kung ano ang kabuluhan sa mga umuulit na anim na mga numero ay sa buong Pagsusulit 1, magkakaroon kami ng shower mo may mga kamangha-manghang pansin sa panghuling magbigay ng panayam at ang stress ball. Nice, madaya. Rob BOWDEN: Anumang huling tanong tungkol sa anumang bagay sa pagsusulit?