DAVID J. Malan: Në rregull. Pra, të mirëpritur të parë ndonjëherë Postmortem CS50 për një quiz. Ne menduam se do të inaugurojmë kjo traditë këtë vit. Dhe kjo do të jetë një mundësi të ecin nëpër zgjidhje për quiz. Dhe ne do të shpejtuar ose ngadalësuar bazuar në interes të atyre këtu. Pra, ju jeni me siguri këtu për shkak se ju jeni të interesuar në atë se si ju mund të ketë ose duhet të janë përgjigjur disa nga këto probleme. Pra, pse nuk kemi marrë një sy në këtë pjesë të parë? Pra, duke marrë vlerat. Kjo ju dha tri versione të ndryshme i një programi që ishte, në fund të fundit, do të thotë për të marrë një varg nga një përdorues. Nëse janë apo jo ajo e bëri që ishte e lënë për ju për të përcaktuar. Dhe ne i kërkuam në pyetjen 0, mendoj se versioni 1 është hartuar dhe ekzekutuar. Pse mund segfault programi? Në pamje të parë, çdo sugjerim se pse? Po. Audienca: Kështu që unë mend duke parë këtë në një shembull i mëparshëm i kërkuar në char * s dhe duke parë scan e s dhe duke parë sepse është një tregues, se si e bëri atë të ndikojë në atë që ju skanuar në? A është ajo s ose adresa e s? DAVID J. Malan: OK. Mirë. Pra në fund të fundit, burimi i çdo problemi është me sa duket duke shkuar për të reduktuar në atë të ndryshueshme s. Dhe kjo është me të vërtetë një variabël. Lloji dhënat e asaj variabël është char *, që do të thotë se do të përmbajnë një adresë të një karakter. Dhe aty qëndron pasqyrë. Ajo do të përmbajë adresën e një karakter ose, më në përgjithësi, adresa e karakterit të parë në një bllok të tërë të karaktereve. Por kapur është se scan s, qëllimi në jeta, është dhënë një adresë dhe duke pasur parasysh një kod format, si% s, të lexuar një varg në copë të memorie në atë adresë. Por për shkak se nuk ka asnjë shenjë të barabartë para se pikëpresje më parë linjë e kodit, sepse ne nuk e bëjmë në të vërtetë ndajë çdo memorie me malloc, sepse ajo nuk ka të vërtetë akordojë një rrjet të disa madhësisë, të gjitha ju jeni duke bërë është lexuar e shfrytëzuesit input keyboard në disa plotë Vlera e mbeturinave, të cilat është në s by default. Pra, shanset janë që ju jeni do të segfault nëse se adresa nuk ndodh vetëm në mënyrë të të jetë një vlerë që ju mund, në fakt, shkruaj për të. Aq i keq të mos shpërndajë kujtesën tuaj atje. Pra, në pyetjen 1, kemi pyetur, mendoj se versioni 2 është hartuar dhe ekzekutuar. Pse mund segfault ky program? Pra, kjo është më pak buggy. Dhe nuk ka të vërtetë vetëm një Mënyra më e qartë ku ju mund të shkaktojë një segfault këtu. Dhe kjo është tematike. Çdo herë që ne jemi duke përdorur c në kujtesë, çfarë mund të bëni për të shkaktoj një segfault me versionin 2? Audienca: Në qoftë se ju përdorni këtë input në një varg që është më shumë se 49 karaktere. DAVID J. Malan: Pikërisht. Çdo herë që të shihni diçka të caktuar gjatësinë kur është fjala për një grup, juaj radar duhet të shkoni jashtë se kjo mund të jetë problematike në qoftë se ju nuk jeni duke kontrolluar Kufijtë e një grup. Dhe ky është problemi këtu. Ne jemi ende duke përdorur scanf. Ne jemi ende duke përdorur% s, që do të thotë të përpiqemi për të lexuar një varg nga përdoruesit. Kjo do të të lexohet në s, e cila, në këtë pikë, është efektive adresa e një copë e kujtesës ose kjo është ekuivalente. Është emri i një grup e karaktereve të kujtesës. Por pikërisht këtë, në qoftë se ju lexoni një varg kjo është më shumë se 49 karaktere, 49 sepse ju keni nevojë për hapësirë ​​për backslash 0, ju jeni do të del nga shtrati që tampon. Dhe ju mund të merrni me fat dhe të jenë në gjendje të shkruar një karakter 51-të, e 52, e 53. Por në një pikë, OS do të thotë, nuk ka. Kjo definitivisht nuk është e kujtesës ju jeni i lejuar për të prekur. Dhe programi do të segfault. Pra atje, heuristics duhet të jetë ndonjë herë ju keni marrë gjatësi të caktuar, ju keni për t'u siguruar që ju jeni duke kontrolluar kohëzgjatjen i çfarëdo qoftë ajo është që ju jeni duke u përpjekur për të lexuar në të. Audienca: Pra, për të zgjidhur atë, ju mund të kanë pasur një deklaratë të kontrolluar në të vërtetë është më e madhe Length se, ose më pak se? DAVID J. Malan: Absolutisht. Ju vetëm duhet një kusht thotë që, nëse - ose më mirë ju nuk domosdoshmërisht e di paraprakisht se sa karaktere përdoruesit do të shkruani, sepse ju keni pule dhe vezë. Jo deri sa ju keni lexuar atë në me scanf mund të ju kuptoj se sa kohë ajo është. Por në atë pikë, është tepër vonë, sepse e keni lexuar tashmë atë në disa bllok i kujtesës. Pra, si një mënjanë, shmang biblioteka CS50 kjo çështje krejt, risjell duke përdorur fgetc. Dhe ai lexon një karakter në një kohë, tip-toeing së bashku, duke e ditur se ju nuk mund të del nga shtrati një karakter nëse ju lexoni një në një kohë. Kapur është me getString risjell është se ne duhet të vazhdimisht ri-madhësi se copë e kujtesës, e cila është vetëm një dhimbje. Kjo është një shumë e linjave të Kodi për të bërë këtë. Pra, një tjetër përqasje do të ishte të në fakt përdorin një kushëri, kështu për të folur, të scanf. Ka variante të një shumë të këtyre Funksionet që në të vërtetë kontrolloni Gjatësia e sa karaktere ju mund të lexoni maksimalisht. Dhe ju mund të specifikojë, mos lexoni më shumë se 50 karaktere. Kështu që do të jetë një tjetër qasje, por më pak qejf e inputeve të mëdha. Pra pyetje 2 pyet, mendoj se versioni 3 është hartuar dhe ekzekutuar. Pse mund segfault se programi? Pra, kjo është në të vërtetë e njëjta përgjigje, edhe pse duket pak njohës. Ne jemi duke përdorur malloc, e cila ndjehet si ne jemi duke i dhënë vetes më shumë opsione. Dhe pastaj ne jemi liruar që kujtese në fund. Është ende vetëm 50 bytes të memories. Pra, ne mund të ende të përpiqet për të lexuar në 51, 52, 1000 bytes. Ajo do të segfault për pikërisht të njëjtën arsye. Por ka edhe një arsye tjetër shumë. Çfarë tjetër mund të malloc kthimin përveç adresa e një copë të kujtesës? Kjo do të mund të kthehen null. Dhe për shkak se ne nuk jemi duke kontrolluar për se, ne mund të bëjmë diçka budalla për një arsye tjetër, e cila është se ne të thënë scanf, lexoni input të përdoruesit nga tastiera 0 në vend, AKA null. Dhe kjo, gjithashtu, do patjetër të shkaktojë një segfault. Kështu që për qëllim quiz-së, ne do të kanë pranuar as nga ata si një arsye të vlefshme. Njëra është identike. Njëra është pak më shumë nuanca. Së fundi, në lidhje me programin e Përdorimi i kujtesës, se si bëjnë version 2 dhe version 3 ndryshojnë? Pra, për atë që është me vlerë, ne pamë një Furnizimi me dukje të pafund të jetë e mundur përgjigje për këtë. Dhe në mesin e përgjigjeve të njerëzve, ajo që ne ishim duke shpresuar për të, por pranoi të tjera gjëra, ishte një përmendja e fakti se ky version 2 është duke përdorur e ashtuquajtura rafte. Version 3 është duke përdorur grumbull. Dhe funksionalisht, kjo nuk ka të vërtetë të bëjë të gjitha që shumë për një ndryshim. Në fund të ditës, ne jemi ende vetëm duke marrë 50 byte memorje. Por kjo ishte një nga përgjigjet e mundshme se ne kemi qenë duke kërkuar në. Por ju do të shihni, si ju merrni kuize tuaj prapa nga TFS, që ne e bëmë pranojnë diskutime të tjera të tyre Përdorime të ndryshëm të kujtesës si. Por rafte dhe tog do të kishte qenë një përgjigje e lehtë për të shkuar me të. Ndonjë pyetje? Unë ju jap Rob. Rob Bowden: Pra problemi 4. Kjo është ajo ku ju duhet të plotësoni në numrin e bytes nga të gjitha këto lloje të ndryshme të përdorura. Pra gjëja e parë që ne shohim. Supozojmë një arkitekturë të 32-bit, si ky aplikim CS50. Pra, një nga gjërat themelore për 32-bit arkitektura, që na tregon saktësisht se sa i madh një akrep po shkon të jetë në arkitekturën. Pra menjëherë, ne e dimë se çdo akrep lloj është 32-bit ose 4 bytes. Pra, duke kërkuar në këtë tryezë, një nyje * është një lloj i akrep. Kjo do të jetë 4 bytes. Nyje struct *, kjo është fjalë për fjalë identike me yll node. Dhe kështu që do të jetë 4 bytes. String, kështu që nuk duket si një treguesin, por typedef, një varg është vetëm një * char, e cila është një lloj i akrep. Kështu që do të jetë 4 bytes. Pra, këta të tre janë të gjitha 4 bytes. Tani, nyje dhe nxënës janë pak më e komplikuar. Pra, duke kërkuar në nyje dhe student, ne shohim nyjë si një numër të plotë dhe një tregues. Dhe studenti është dy pointers në brendësi të saj. Pra, të paktën për rastin tonë këtu, mënyra se ne fund deri të llogaritet madhësia e kjo struct është vetëm të shtoni deri çdo gjë kjo është brenda struct. Pra për nyje, ne kemi një numër të plotë, cili është 4 bytes. Ne kanë një tregues i cili është 4 bytes. Dhe kështu një nyjë është duke shkuar për të marrë 8 bytes. Dhe në mënyrë të ngjashme për student, ne kemi një akrep kjo është 4 bytes dhe një tjetër akrep kjo është 4 bytes. Kështu që do të përfundojë duke qenë 8 bytes. Pra, nyje dhe të studentëve janë 8 bytes. Dhe këta të tre janë të gjitha 4 bytes. Pyetjet për se? Po. Audienca: A është e ishte një 64-bit arkitekturës, që do të dyfishtë të gjithë ata? Rob Bowden: Nuk do dyfishtë të gjithë ata. Pra arkitekturës 64-bit, ai, përsëri, Ndryshimet që gjëja themelore që një akrep është tani 64 bit. Po. Pra, një tregues është 8 bytes. Pra, këto që ishin 4 byte do të jetë 8 bytes. Një student, i cili ishte dy pointers, mirë, tani ajo do të të jetë 8 bytes, 8 bytes. Ajo do të bëjë 16 bytes. Por një nyje është ende 4 bytes. Pra, ky tregues është duke shkuar të jetë 8 bytes. Kjo është 4 bytes. Pra, një nyje është vetëm do të jetë 12 bytes. Çdo pyetje të tjera në se një? Kështu që një tjetër, këto janë kodet e statusit HTTP. Dhe keni pasur për të përshkruar rrethanat sipas të cilave këto mund të të kthehet tek ju. një problem që kam dëgjuar disa studentë kanë është se ata u përpoqën për të bërë Gabime të jetë në fund të klientit. Pra, kur ne përpiqemi për të bërë kërkesën në server, diçka shkon gabuar në fund tonë. Por në përgjithësi, këto kode janë të duke u kthyer nga serveri. Pra, ne duam të kuptoj se çfarë po ndodh gabuar ose të drejtë në server që shkakton këto gjëra që të kthehen. Pra, pse mund a kthimit server Kodi status 200? Çdo mendime? Po. Pra, diçka në lidhje me sukses kërkesa shkuan përmes. Dhe ata janë në gjendje të kthehen çdo gjë që keni kërkuar. Kështu që çdo gjë ishte në rregull. Çfarë rreth 302 gjetur? Po. Audienca: server është në kërkim për atë që ju kërkohet. Por kjo nuk mund të gjeni atë. Pra, ka një gabim. Rob Bowden: Pra server ishte duke kërkuar për atë që ju kërkohet. Pra, vetëm në kërkim këtu, 302 gjetur, ajo ishte në gjendje për të gjetur atë. Audienca: Më vjen keq. Gjetur do të thotë se ata kanë gjetur atë. Më vjen keq. Rob Bowden: Pra 302 gjetur. Server është në gjendje për të gjetur atë që ju kërkohet. Audienca: Por kjo nuk është shfaqur atë? Rob Bowden: Dallimi në mes ky 302 dhe 200 është se ajo e di atë që ju dëshironi. Por nuk është saktësisht ku ju kërkuar për të pyetur. Pra, 302 është një përcjellim tipike. Kështu që ju kërkuar një faqe. Ai e di, oh, unë dua për të ju kthyer këtë. Por kjo është në një URL ndryshme. Pra, hej, ju në të vërtetë duan këtë. DAVID J. Malan: Kjo është një pjesë që ka thënë që kemi dhënë ju djema një përcjellim Funksioni që përdoret header funksionit që, nga ana tjetër, të shtypura nga lokacioni, zorrës së trashë, dhe pastaj URL në të cilën ju doni të refuzojë përdorues. Edhe pse ju nuk e shihni 302 në mënyrë eksplicite ka, kjo është ajo PHP magjike do të futur si kokë duke thënë se pikërisht ajo Rob tha se ka - gjetur. Por shkoni këtu në vend. Rob Bowden: OK. Pra, ajo që për 403 e ndaluar? Audienca: Unë mendoj se është se server është në thelb duke thënë se klienti nuk mund të hyni në faqen kryesore. Rob Bowden: Pra, po. Well, përgjigja tipike ne ishim presim është diçka si, dosjet nuk janë chmodded në mënyrë të përshtatshme. Kjo është ndoshta në çfarë rrethanash ju pa ato. Por ka një arsye që klienti mund të jetë në faj këtu. Ka në fakt një tjetër kod statusi - 401. Pra, këto janë shumë të ngjashme. 401 është e paautorizuar. Dhe 403 është e ndaluar. Dhe kështu paautorizuar ju ekskluzivisht të marrë në qoftë se ju nuk jeni futur me emrin tuaj Por logging in mund të thotë që ju të jeni të autorizuar. Por në qoftë se ju jeni tashmë i identifikuar dhe ju ende nuk kanë leje, atëherë ju gjithashtu mund të merrni ndaluar. Pra, nëse ju jeni regjistruar dhe nuk kanë leje, e ndaluar është edhe diçka që ju mund të merrni. DAVID J. Malan: Dhe mekanizmi nga të cilat këto probleme janë zakonisht të zgjidhen në server është nëpërmjet çfarë komandë? Chmod, në qoftë se ajo është në të vërtetë, një lejet nxjerrë në file apo directory. Rob Bowden: Pastaj 404 nuk u gjet. Po. Pra, ndryshe nga 302 ku ajo nuk ishte pikërisht ku ju jeni duke kërkuar, por ajo e di se çfarë ju dëshironi, këtë, ajo vetëm ka nuk ka ide se çfarë doni. Dhe ju nuk jeni duke kërkuar diçka të vlefshme. 418 Unë jam një ibrik çaji dhe pastaj 500 server të brendshme. Pra, pse mund të merrni atë? Pra segfault - Unë në fakt nuk e di kategorizimin standard për këtë. Por në qoftë se kodi juaj PHP kishte diçka gabuar në të, në teori, ajo mund të në të vërtetë segfault, në të cilin rast, kjo 500 gabim i brendshëm server, diçka është e gabuar me server-së tuaj konfigurimit. Apo ka ndonjë gabim sintakse në kodin tuaj PHP. Apo diçka e keqe po ndodh. DAVID J. Malan: Ne e shohim segfault në mesin e përgjigjeve s pak njerëz. Dhe teknikisht, kjo mund të ndodhë. Por kjo do të ishte një PHP, programi shkruar nga njerëzit e tjerë, në të vërtetë segfaulted, i cili vetëm nëse ata njerëz dehur dhe shkroi kodin buggy në përkthyesi i tyre do të Vetë PHP segfault. Pra, edhe pse 500 është si një segfault në frymë, është pothuajse gjithmonë rezultat i një çështje e file e konfigurimit me web serverin tuaj, ose, siç tha Rob, një gabim sintakse, si ju nuk e mbylli një kuotë. Ose ju ka humbur një pikëpresje diku. Audienca: Pra, për pset Shuttle, unë mendoj se kur unë e bëri atë një herë unë klikuar shfletuesi, por asgjë nuk doli, atë që e quajtën faqe të bardhë. Por kjo ishte për shkak të kodit. Unë mendoj se ishte e JavaScript, e drejtë? Rob Bowden: Po. Audienca: A do që error ende të dalë? Rob Bowden: Pra, ju nuk do të kishte marrë ky gabim për shkak se çdo gjë nga perspektiva e web serverit ishte krejtësisht në rregull. Por ju kërkohet index.html. Ju kërkohet shuttle.js dhe service.js. Dhe kjo ishte në gjendje të kthehen me sukses për ju të gjithë nga ato gjëra - 200. OK. Kjo është vetëm kur shfletuesi juaj përpoq të interpretojnë kodin JavaScript që kjo është si, prisni, kjo nuk është error vlefshme JavaScript. Çdo pyetje të tjera? Dakord. DAVID J. Malan: Pra ardhshëm up ishte numri 11. Dhe 11 ishte scariest për shumë njerëz. Pra, gjëja më e rëndësishme të theksohet këtu ishte se kjo ishte, në të vërtetë, në lidhje me një listë e lidhur dyfish. Por kjo nuk ishte e njëjtë si vitin e kaluar Problemi listë e lidhur dyfish, të cilat nuk ju japin caveat që lista do të mund, në fakt, të jetë unsorted. Pra, fakti se lista ishte unsorted dhe fakti se ajo fjalë ishte nënvizoi nuk kishte për qëllim të përcjellë se kjo është në fakt një thjeshtësim të asaj që përndryshe do të kishte qenë një problem më sfiduese dhe a më një. Pra, një gabim i përbashkët këtu ishte që të kanë vënë Zgjidhja e vitit të kaluar në një tuaj pager dhe pastaj vetëm verbërisht kopje që poshtë si përgjigje, që është e drejta përgjigje të një pyetje të ndryshme të ngjashme në frymë. Por hollësitë këtu ishin si më poshtë. Pra një, ne kemi një nyje deklaruar dhe përcaktuar në mënyrë të zakonshme këtu. Pastaj ne përcaktohet lista e të jetë një globale tregues të initialized null. Pastaj me sa duket, ka dy funksione ne kemi prototipa për këtu, insert dhe për të hequr. Dhe pastaj ne kemi një kod mostër këtu për të bërë një bandë e insertions. Dhe pastaj ne ju kërkojmë të përfunduar Zbatimi i futur poshtë në të tilla një mënyrë që ajo fut n në lista në kohë të vazhdueshme, theksoi gjithashtu, edhe në qoftë se tashmë i pranishëm. Pra, bukuria e të qenit në gjendje për të futur në kohë të vazhdueshme është se ai nënkupton që ju duhet për të futur nyja e re ku? Në pjesën e përparme. Pra, ajo eliminon, fatmirësisht, të paktën një nga raste që përdoren në nevojë edhe më shumë rreshta të kodit, si ajo e bëri vitin e kaluar dhe madje edhe në klasë kur ne biseduar me këtë lloj gjë me njerëzit dhe me disa verbal kod pseudo. Pra, në zgjidhjen këtu, le të kaloni mbi të që vetëm të ketë një në Visual ekran. Vini re që ne jemi duke bërë në vijim. Dhe gjithashtu të vini re thjeshtësim të tjera ishte se edhe nëse është e tashmë i pranishëm, kështu që kjo do të thotë edhe në qoftë se numri është tashmë atje, ju mund të vetëm verbërisht futur një tjetër kopje e saj. Dhe kjo, gjithashtu, kishte për qëllim të jetë një thjeshtim, në mënyrë që ju mund të të përqëndrohet në, me të vërtetë, disa nga më të Pjesa intelektualisht interesante dhe jo vetëm disa gabim shtesë kontrolluar duke pasur parasysh kohën e kufizuar. Pra, në këtë zgjidhje mostër, ne ndajë një tregues të dorës së majtë tjetrën këtu për një nyje. Tani, të kuptojë se treguesin, si Rob tha, është vetëm 32 bit. Dhe kjo nuk ka të vërtetë përmbajnë një adresë deri sa ju caktojë atë adresë. Dhe ne bëjmë këtë në të djathtë Ana nëpërmjet malloc. Ashtu si një qytetar i mirë, ne kontrolloni se malloc nuk është, në fakt, null, në mënyrë që ne nuk aksidentalisht të krijojë një segfault këtu. Dhe çdo herë që përdorin malloc në jetë, ju duhet të jenë të kontrolluar për null, që të mos ju keni një bug delikate. Pastaj ne nisja atë null duke caktimin n dhe i mëparshëm dhe të ardhshëm. Dhe në këtë rast këtu, unë initialized mëparshme të null, sepse ky i ri nyje do të jetë e re në fillim të listës sime. Pra, nuk do të jetë asgjë para saj. Dhe unë dua të thelb append listë ekzistuese me nyje të ri nga vendosjen e ardhshme të barabartë tek lista veten. Por unë nuk jam bërë vetëm ende. Pra, nëse lista vetë tashmë ekzistonte, dhe nuk kishte të paktën një nyje tashmë në vend, në qoftë se kjo është lista këtu dhe unë futur një nyje të re këtu, unë duhet të bëni të sigurtë që ish nyje im vë prapa për nyje tim të ri, sepse kjo është, përsëri, një listë e lidhur dyfish. Pra, ne bëjmë një kontroll mendje e shëndoshë. Nëse lista nuk është i pavlefshëm, në qoftë se ka tashmë një ose më shumë nyje atje, pastaj shtoj se përsëri referencë mënyrë që të flasin. Dhe pastaj shumë e fundit gjë që duhet për të bërë është në të vërtetë Përditëso globale Lista ndryshueshme vetë për pikë në atë nyje të re. Po. Audienca: Në akrep shigjeta [Padëgjueshme] është e barabartë me null, bën që merren me lista sepse Lista është e pavlefshme? DAVID J. Malan: Jo. Kjo është thjesht mua po në mënyrë proaktive kujdesshëm, në se në qoftë se ky është im Lista origjinale me ndoshta disa nyjet më shumë mbi këtu dhe unë jam futur tim nyja e re mbi këtu, nuk do të jetë asgjë mbi këtu. Dhe unë dua të kapur këtë ide duke vendosur mëparshme të null mbi nyjen e ri. Dhe me sa duket, në qoftë se kodi im është i saktë dhe nuk ka mënyrë tjetër për të futur nyjet e tjera përveç këtij funksioni, me sa duket, edhe në qoftë se lista tashmë ka një ose më shumë nyje në të, me sa duket lista, nyja e parë, do të ketë një tregues i mëparshëm i vetë null. Audienca: Dhe vetëm një vazhdim. Arsyeja keni vënë akrep barabartë ardhshme Lista është që ju jeni duke e bërë në treguesin para në listë që është e vënë në për të ardhshëm, unë mendoj - I don 't - vetëm listat? DAVID J. Malan: Pikërisht. Dhe kështu që le të konsiderojmë në të vërtetë dy raste këtu me të vërtetë, edhe pse mënyrë ne do t'i shqyrtojmë nuk është krejt e njëjtë me kodin. Por në një nivel të lartë, në qoftë se kjo paraqet lista dhe kjo është një 32-bit akrep, skenari më e thjeshtë është se kjo është null by default. Dhe mendoj unë dua të futur numri 50 ishte numri i parë. Kështu që unë jam duke shkuar për të shkuar përpara dhe të ndajë një nyje, e cila do të përmbajë tri fusha - n, mëparshme, dhe të ardhshëm. Unë jam duke shkuar për të vënë numrin 50 këtu, sepse kjo do të jetë n. Kjo do të jetë e ardhshme. Dhe kjo do të jetë të mëparshme. Dhe kështu që çfarë të bëj në këtë rast? E pra, unë e kam bërë vetëm 1 vijë këtu. Pointer n merr n. Unë jam pra duke thënë: paraardhëse duhet të merrni null. Pra, kjo do të jetë e pavlefshme. Atëherë unë jam do të thonë tjetër do të merrni listë. Dhe kjo vetëm punon jashtë mirë. Kjo është null. Dhe kështu që unë jam duke thënë, nyja e re e ardhshme fushë duhet të marrë çdo gjë që kjo është. Kështu që i vë një tjetër null atje. Dhe pastaj gjëja e fundit Unë po të shikoni këtu. Nëse lista nuk është e barabartë me null, por ajo është e barabartë me null, kështu që ne kaloni krejt. Dhe kështu të gjitha unë bëjë tjetër është lista e merr akrep, e cila në pikturë rezulton në një foto si kjo. Pra, kjo është një skenar. Dhe ai që ju kanë pyetur për në mënyrë të veçantë është një situatë si kjo, ku ne tashmë kemi një listë të një-nyje. Dhe kur të shkoj përsëri në origjinal Deklarata problem, e ardhshëm ne do të insert të themi është 34, vetëm për hir të diskutimit. Kështu që unë jam duke shkuar për të vetëm të përshtatshme nxjerrë se mbi këtu. Unë e kam malloced vetëm. Le të supozojmë Unë jam duke kontrolluar për null. Tani, unë jam duke shkuar për të nisja n të jenë 34. Dhe kjo do të jetë n. Kjo do të jetë e ardhshme. Dhe kjo do të jetë të mëparshme. Le t'u siguruar që unë nuk e kam merrni këtë prapa. Kthehu vjen e para në përkufizimin. Më lejoni të rregullojmë këtë. Kjo është mëparshme. Kjo është tjetër. Edhe pse këto janë identike, le të mbani atë të qëndrueshme. Kthehu. Kjo është tjetër. Kështu që unë kam malloced vetëm shënim time, kontrolluar për null, caktuar 34 në nyje. Kthehu merr null. Kështu që më jep atë. Next merr listë. Pra, lista është ky. Pra, kjo është e njëjtë si tani duke tërhequr këtë shigjete, në mënyrë që ata të tregojnë një në të njëjtën. Dhe atëherë unë jam duke kontrolluar nëse lista nuk është e barabartë me null. Dhe kjo nuk është këtë herë. Atëherë unë jam duke shkuar për të bërë lista mëparshme merr treguesin. Pra, lista e mëparshme merr PTR. Pra, kjo ka efektin e vendosjes së një shigjetë grafike këtu. Dhe kjo është duke marrë një pak me onde, linjat. Dhe pastaj, së fundi, unë të rinovuar listë të tregojnë për treguesin. Deri tani kjo tregon për këtë djalë. Dhe tani, le të bëjë një të shpejtë kontrolloni mendje e shëndoshë. Ja lista, e cila është ndryshorja globale. Nyja e parë është, me të vërtetë, 34, për shkak se Unë jam duke ndjekur këtë shigjetë. Dhe kjo është e saktë, sepse unë dua të futur në fillim të lista të gjitha nyjet e reja. Fusha e tij e ardhshme më çon në këtë djalë. Nëse unë do të mbajë, i goditi tjetër është null. Pra, nuk ka më shumë listë. Nëse unë goditi mëparshme, të shkoj mbështesë ku unë pres. Pra, ka ende disa pointers, qartë, për të manipuluar. Por fakti që ju u tha për të bërë këtë në kohë të vazhdueshme ju do të thotë vetëm kanë një numër i caktuar i gjërave ju jeni i lejuar për të bërë. Dhe çfarë është ky numër? Kjo mund të jetë një hap. Ajo mund të jetë dy. Ajo mund të jetë 1.000 hapa. Por është e fundme, që do të thotë që ju nuk mund të kanë çdo lloj looping ndodh këtu, nuk ka recursion, nuk ka sythe. Ajo ka vetëm të jenë në linjat e vështirë-koduar i kodit si ne kemi në këtë mostër. Pra, problemi tjetër 12 na kërkoi që të përfundimin e zbatimit të hequr më poshtë në mënyrë të tillë që ai heq n nga lista në kohë lineare. Pra, ju keni një pak më shumë dhomë luaj tani. Ju mund të supozojmë se n, nëse është i pranishëm në listë, do të jetë i pranishëm jo më shumë se një herë. Dhe se shumë është menduar të jetë një quiz me bazë thjeshtimi supozim, kështu se në qoftë se ju të gjeni numrin 50 diku në listë, ju nuk e bëni edhe duhet të shqetësohen për të vazhduar për të iterate, duke kërkuar për çdo të jetë e mundur kopje e 50, e cila vetëm do të zhvilloheshin në disa minutia në kohë të kufizuar. Pra me hequr, kjo ishte patjetër më sfiduese dhe më shumë Kodi për të shkruar. Por në shikim të parë, sinqerisht, ajo mund shikoni diçka të madhe dhe si nuk ka asnjë mënyrë ju mund të ketë të dalë me në një quiz. Por në qoftë se ne të fokusohemi në hapat individualë, me shpresë, ajo do të papritur rreh se secili prej këtyre individëve Hapat e ka kuptim të dukshëm në retrospektivë. Pra, le të marrin një sy. Pra, së pari, ne nisja treguesin të jetë lista veten. Sepse unë dua kohë lineare, që do të thotë Unë do të ketë disa lak. Dhe një mënyrë e përbashkët për të iterate mbi nyjet në një strukturë listë apo çdo lloj e strukturës iteratively është për të marrë nje tregues të para të dhëna Struktura dhe pastaj vetëm të fillojë përditësimin atë dhe ecin në rrugën tuaj nëpërmjet strukturës dhënave. Kështu që unë jam duke shkuar për të bërë pikërisht këtë. Ndërsa akrep, e ndryshueshme im i përkohshëm, nuk është e barabartë me null, le të të shkojnë përpara dhe të kontrolloni. A e kam të merrni me fat? A është fusha n në nyjen unë jam duke kërkuar në barabartë tek Numri Unë jam duke kërkuar për? Dhe nëse është kështu, le të bëjë diçka. Tani, këtë njoftim nëse gjendja rrethon gjithë linjat e mëposhtme të kodit. Kjo është e vetmja gjë që më intereson - gjetjen e një numri në fjalë. Kështu që nuk ka asnjë tjetër, e cila thjeshton gjëra konceptualisht pak. Por tani, e kam kuptuar, dhe ju mund të keni vetëm e kuptoi këtë pasi duke menduar ajo me pak, ka në fakt dy raste këtu. Njëra është nyja ku është në fillimi i lista, e cila është një pak i bezdisshëm, sepse kjo është një rast i veçantë, për shkak se ju duhet të merren me këtë gjë, e cila është e vetmja anomali. Kudo tjetër në listë, është e njëjta gjë. Ka një nyje e mëparshme dhe një tjetër nyje, nyje e mëparshme, nyje e ardhshme. Por ky djalë është një e veçantë pak në qoftë se ai është në fillim. Pra, nëse treguesi është e barabartë me listën në vetvete, kështu që në qoftë se unë jam në fillim të lista dhe unë kam gjetur n, kam nevojë për të bërë disa gjëra. Një, Unë kam nevojë për të ndryshuar listën e të pikë në fushën e ardhshme, 50. Kështu që mendoj se unë jam duke u përpjekur për të hequr 34. Pra, ky djalë e mori për të shkuar larg në vetëm një moment. Kështu që unë jam duke shkuar për të thënë, lista merr treguesin e ardhshme. E pra, kjo është akrep. Tjetra është vënë mbi këtu. Pra, kjo po ndryshon këtë të drejtë shigjetë tani për pikë në këtë djalë këtu. Tani, mos harroni, ne kemi një variabël e përkohshme. Pra, ne nuk kemi jetimë ndonjë nyje, sepse edhe unë kam këtë djalë në tim zbatimin e hequr. Deri tani, në qoftë se lista vetvete nuk është null, Unë kam nevojë për të rregulluar një diçka të vogël. Unë kam nevojë për të tani të siguruar që kjo shigjetë, cila është parë duke 50-34, kjo ka marrë për të shkuar larg, sepse në qoftë se unë jam duke u përpjekur të heqin qafe e 34, 50 kishin më mirë të mos mbajë asnjë lloj përsëri referencë për atë si shigjetë sugjeruar. Kështu që unë vetëm e bëri këtë linjë. Pra, atëherë unë jam bërë. Ky rast është në të vërtetë shumë e lehtë. Kishte prerë kokën e listës është relativisht i drejtpërdrejtë. Për fat të keq, nuk ka kjo bllok i bezdisshëm tjetër. Deri tani, unë duhet të marrin në konsideratë rastin ku ka diçka në mes. Por nuk është shumë e tmerrshme, me përjashtim të për sintaksë si kjo. Pra, në qoftë se unë nuk jam në fillim të listë, unë jam diku në mes. Dhe kjo vijë këtu është duke thënë, start në çfarëdo nyje ju jeni në të. Shko në fushën e ardhshëm nyjen kaluar dhe pika që në kursorit. Le të bëjmë këtë në pikturë. Që ishte duke u komplikuar. Pra, nëse unë kam një fushat të mëparshme këtu - le ta bëjmë këtë - fusha e ardhshme këtu. Unë jam duke shkuar për të lehtësuar e mia pointers në vend se të nxjerrë një bandë e tërë e gjëra mbrapa dhe me radhë crisscrossing njëri tjetrin. Dhe tani, le të vetëm të thonë se kjo është 1, 2, 3 për hir të diskutimit, madje edhe edhe pse kjo nuk do të vijë deri me problemi në fjalë. Kështu që këtu është lista ime e lidhur. Unë jam duke u përpjekur për të hequr dy në këtë version të veçantë të historisë. Kështu që unë kam updated tregues për të treguar për këtë djalë. Pra, kjo është PTR. Ai është treguar këtu. Kjo është lista, e cila ekziston globalisht si më parë. Dhe ai duke vënë këtu pa marrë parasysh çfarë. Dhe tani, unë jam duke u përpjekur për të hequr dy. Pra, nëse treguesi është duke treguar këtu, unë jam i duke shkuar për të ndjekur, me sa duket, akrep i mëparshëm, i cili e vë më në 1. Unë jam duke shkuar për të thënë më pas se tjetër fushë, e cila sjell në dorë të kësaj kuti këtu, do të akrep barabartë ardhshëm. Pra, nëse ky akrep, kjo është tjetër. Kjo do të thotë se kjo shigjetë nevojat të tregojnë për këtë djalë. Pra, çfarë linjë e kodit që ka vetëm bërë është pak për këtë. Dhe tani, kjo është në kërkim si një hap në drejtimin e duhur. Ne thelb duam të prerje me 2 nga , në mes të 1 dhe 3. Kështu që ka kuptim që ne duam të Rruga këtë tregues rreth tij. Pra, kjo linjë tjetër është kontrolluar nëse akrep tjetër nuk është null, ka dikush me të vërtetë për të drejtën e 2, që do të thotë që ne gjithashtu kemi të bëjmë pak prerje këtu. Kështu që unë tani duhet të ndjekin këtë treguesin dhe update treguesin e mëparshme mbi ky djalë për të bërë pak a workaround këtu pikë këtu. Dhe tani, kjo është e bukur me sy. Është pak e çrregullt në se ka askush nuk e vënë në 2 më. 2 është duke treguar në të majtë. Dhe 2 është duke treguar në të djathtë. Por ai mund të bëjë çfarëdo që ai dëshiron, sepse ai është gati për të marrë të lirë. Dhe kjo nuk ka rëndësi se çfarë ato vlera janë më. Ajo që është e rëndësishme është se mbetur djemtë janë kurs më lart dhe poshtë tij tani. Dhe me të vërtetë, kjo është ajo që ne bëjmë tjetër. Ne akrep të lirë, që do të thotë që ne të treguar sistemit operativ, ju jeni të mirëpritur për të kërkuar këtë. Dhe pastaj në fund, do të kthehemi. Tjetër implicite, në qoftë se ne nuk janë kthyer ende, ne kemi marrë për të mbajtur në kërkim. Pra, është e barabartë me akrep akrep tjetër vetëm do të thotë të lëvizur këtë djalë këtu. Leviz këtë djalë këtu. Leviz këtë djalë këtu në qoftë se, në fakt, ne nuk e gjeni numrin ne jemi në kërkim të ende. Pra sinqerisht, duket krejtësisht madhe, unë mendoj se, në fillim shikim, veçanërisht nëse ju luftuar me këtë gjatë quiz pastaj shohim diçka e tillë. Dhe ju pat veten në anën e pasme. E pra, nuk ka asnjë mënyrë unë mund të ketë dalë me që në quiz. Por unë do të argumentojnë, ju mund të qoftë se ju pushim ajo poshtë në këto individuale raste dhe vetëm ecin nëpër atë me kujdes, edhe pse, pa dyshim, në bazë të rrethana të vështira. Fatmirësisht, foto bërë çdo gjë më të lumtur. Ju mund të tërheqë këtë në ndonjë numër të mënyra. Ju nuk keni për të bërë crisscrossing gjë këtu. Ju mund të bëjë atë me të drejtë Linjat e pëlqejnë këtë. Por në esencë e këtij problemi, në përgjithësi, ishte që të kuptojnë se fotografia në fund duhet të shikoni pak diçka si kjo, sepse Koha konstante la të kuptohet se ju mbani zhurma dhe zhurma dhe zhurma nyjet e reja në fillim lista. Ndonjë pyetje? Ndoshta më sfiduese e sigurisht pyetjet kodim. Audienca: Pra, është lista e ngjashme me kokë në shembujt e mëparshëm. DAVID J. Malan: Pikërisht, saktësisht. Vetëm një emër të ndryshëm për një ndryshore globale. Botërore të gjerë çfarë? Rob Bowden: OK. Pra, kjo është ajo ku ju kishte për të shkruar paragrafin. Disa njerëz shkruajtur ese për këtë pyetje. Por ju vetëm duhet të përdorni këto gjashtë kushte për të përshkruar se çfarë ndodh kur ju përpiqeni të kontaktoni facebook.com. Kështu që unë vetëm do të flasim përmes procesit të duke përdorur të gjitha këto terma. Pra në shfletuesin tonë, ne shkruani facebook.com dhe hit Enter. Pra shfletuesin tonë do të ndërtojë një HTTP kërkojë që ajo do të dërgojë nëpërmjet një procesi në Facebook për Facebook për t'iu përgjigjur ne me HTML i faqes së saj. Pra, çfarë është proces me të të cilat HTTP kërkesa në fakt merr në Facebook? Pra, së pari, ne kemi nevojë për të përkthyer Facebook.com. Pra, vetëm duke pasur parasysh emrin Facebook.com, ku në fakt nuk kerkesen HTTP duhet të shkoni? Pra, ne kemi nevojë për të përkthyer Facebook.com në një adresë IP, e cila në mënyrë unike identifikon çfarë makine ne fakt dëshironi të dërgoni këtë kërkesë për të. Laptop juaj ka një adresë IP. Çfarëdo e lidhur me internetit ka një adresë IP. Pra DNS, Domain Name Sistemit, që është çfarë do të merret me përkthimin e nga facebook.com në një adresë IP që ju në të vërtetë dëshironi të kontaktoni. Pra, ne të kontaktoni serverat DNS dhe të themi, çfarë është facebook.com? Ai thotë, oh, kjo është adresa IP 190,212 diçka, diçka, diçka. Dakord. Tani, unë e di se çfarë makine Unë dua të kontaktoni. Pra, atëherë ju dërgoni HTTP kërkesën tuaj mbi të atë makinë. Pra, si e bën atë të shkoj në atë makinë? E pra, kërkesa shkon nga router për kërcim router. Mos harroni shembullin në klasë, ku ne fakt e pa rrugë që pako e mori kur ne u përpoqëm për të komunikuar. Ne e pamë atë hidhen mbi Atlantik Oqeani në një moment apo çfarëdo. Pra, port termi fundit. Pra, kjo është tashmë në kompjuterin tuaj. Ju mund të keni gjëra të shumta aktualisht komunikimit me internet. Kështu që unë mund të konkurrojnë, të themi, Skype. Unë mund të ketë një shfletues të hapur. Unë mund të ketë diçka që torrenting fotografi. Pra, të gjitha këto gjëra janë të komunikimit me internet në një farë mënyre. Pra, kur kompjuteri juaj merr disa të dhëna nga interneti, si e bën ai e di se çfarë e aplikimit në të vërtetë do që të dhënat? Si e di nëse këtë të veçantë të dhënave është menduar për torrenting aplikimin krahasim me shfletuesin web? Pra, ky është qëllimi i portet në të cilat të gjitha këto aplikime kanë pohoi një port në kompjuterin tuaj. Pra shfletuesin tuaj web thotë, hej, Unë jam duke dëgjuar në portin 1000. Dhe programi juaj torrenting është duke thënë, Unë jam duke dëgjuar në portin 3000. Dhe Skype thotë, unë jam duke përdorur portin 4000. Pra, kur ju të merrni disa të dhëna që i takon njërit prej këtyre aplikimeve, të dhënat është shënuar me të cilat portin ai në fakt duhet të dërgohen së bashku për të. Pra, kjo thotë, oh, i perkas në portin 1000. Unë e di se kam nevojë për të përpara këtë së bashku me shfletuesin tim web. Pra, arsyeja është e rëndësishme këtu është se web servers kanë tendencë të të dëgjuar në portin 80. Kështu që kur të kontaktoj Facebook.com, unë jam i komunikuar me një makinë. Por unë duhet të them se cili portin e që makinë Dua të komunikojnë me të. Dhe serverat e web priren të jenë të dëgjuar në portin 80. Në qoftë se ata donin, ata mund të vendosur atë up kështu që listat si në portin 7000. Dhe pastaj në një shfletues web, unë mund me dorë të tipit Facebook.com: 7000 të dërgoni kërkesën në portin 7000 i web server Facebook. DAVID J. Malan: Dhe në këtë rast, edhe edhe pse ne nuk kërkonte që njerëzit përmend këtë, në këtë rast, atë port do kërkesa të vërtetë të shkojnë për të? Provoni përsëri. Pikërisht. Jo duke kërkuar për atë, por një finesë kjo është nuk ka asnjë fundit. Rob Bowden: Pra HTTPS, që nga ajo e dëgjuar në mënyrë specifike për i mbyllur, kjo është në portin 4430. Audienca: Dhe email janë 25, apo jo? DAVID J. Malan: Jashtë email, 25, yep. Rob Bowden: Unë nuk e di edhe shumica e - gjitha nga ato ulta priren të jenë të rezervuara për gjëra. Unë mendoj se çdo gjë nën 1024 është e rezervuar. Audienca: Pse më the: 3 ishte numri i gabuar? Rob Bowden: Sepse në një adresë IP, ka katër grupimet e shifra. Dhe ata janë prej 0 deri 255. Pra 192.168.2.1 është një e zakonshme rrjetit lokal adresë IP. Njoftim të gjithë ata janë më pak se 255. Kështu që kur kam filluar me 300, që ndoshta nuk mund të ketë qenë një nga numrat. DAVID J. Malan: Por kjo clip pa kuptim nga - ishte ajo CSI, ku ata kishin një numër i cili ishte shumë i madh për adresën IP. Rob Bowden: Çdo pyetje në këtë? Një tjetër, ndryshimi në mënyrë të plotë në temë, por ne e kemi këtë rrjet të PHP për shtëpitë në kuadrat. Dhe ne kemi një listë të parenditur. Dhe ne duam të shtypura nga çdo zëri të listës vetëm që përmban emrin shtëpi. Pra, ne kemi një lak foreach. Pra mbani mend, sintaksa është foreach array si pika në rrjet. Pra, me anë të çdo ripërsëritje të lak, shtëpi do të marrë në një nga Vlerat brenda e array. Në e parë përsëritje, shtëpi do të jetë Cabot House. Në një përsëritje të dytë, shtëpia do të jetë Courier House dhe kështu me radhë. Pra, për çdo kuadrat si shtëpi, ne jemi vetëm do të shtypura - ju gjithashtu mund të ketë jehonë - pika lista dhe më pas emri të shtëpisë dhe pastaj të ngushtë zëri të listës. Formatimin e teksteve kaçurrel janë fakultative këtu. Dhe pastaj kemi thënë edhe në pyetjen vetë, mos harroni të mbyllur tag renditura lista. Pra, ne kemi nevojë për të dalë mënyrën PHP në mënyrë që të bëjë këtë. Ose ne mund të kemi bëri jehonë mbyllur tag listë të parenditur. DAVID J. Malan: Gjithashtu gjobë këtu do të kanë qenë për të përdorur një shkollë të vjetër për lak me një $ i = 0 0 dhe duke përdorur akuza të kuptoj se gjatësinë e rreze. Shumë Krejtësisht gjobë, vetëm një wordier pak. Audienca: Pra, nëse ju u do të [Padëgjueshme], do të bëni - I harroj atë lak [padëgjueshme] është. A do të $ kllapa kuadrat ï? DAVID J. Malan: Pikërisht. Po, pikërisht. Rob Bowden: Çdo gjë tjetër? DAVID J. Malan: Në rregull. Tregtisë të humbura. Pra, ka pasur vile rrushi të përgjigjeve mundshme për secilin prej tyre. Ne ishim me të vërtetë vetëm në kërkim të diçka bindëse për një kokë dhe një dobësitë. Dhe numrin 16 e pyeti, Vleresimin përdoruesit ' input klient-side, si me JavaScript, në vend të server-krah, si me PHP. Pra, çfarë është një kokë e duke bërë klient-side? E pra, një nga gjërat që ne të propozuara është që ju të zvogëlojë latente, sepse ju nuk duhet të shqetësojë kontaktuar server, e cila mund të marrë disa milliseconds apo edhe disa sekonda duke shmangur këtë dhe vetëm Vleresimin e përdoruesve të dhëna klient-krah për shkaktuar një mbi-dorëzojë mbajtës dhe vetëm kontrolluar, e ata shkruani diçka në emrin? A ato të tipit diçka në për adresë e-mail? A ata zgjedhin një konvikt nga menu drop-down? Ju mund të jepni atyre reagime të menjëhershëm duke përdorur kompjuterin gigahertz ose çdo gjë që ata kanë se është në të vërtetë në tavolinën e tyre. Pra, kjo është vetëm një përdorues të mirë përjetojnë në mënyrë tipike. Por një downside për të bërë klientit-side validation, nëse ju bëni atë pa edhe duke bërë validimin server-side është se më dikush që vjen nga CS50 di që vetëm ju mund të dërgoni çdo të dhënat që ju dëshironi me një server në çdo numër mënyrash. Sinqerisht, në më të çdo shfletues, ju mund të klikoni rreth në rregullimet dhe vetëm fikni JavaScript, i cili do të, Prandaj, çaktivizoni çdo formë të validation. Por ju gjithashtu mund të kujtohet se edhe unë bëri disa gjëra misterioze në klasë duke përdorur Telnet dhe në fakt pretenduar të të jetë një shfletues të kihet duke dërguar get kërkesa për një server. Dhe kjo sigurisht nuk është e duke përdorur ndonjë JavaScript. Kjo është vetëm mua shtypni komandat e në një tastierë. Pra, me të vërtetë, çdo programues në kuadër të mjaftueshme rehati me web dhe HTTP mund të dërgojë çfarëdo të dhënave që ai apo ajo dëshiron me një server pa validation. Dhe në qoftë se serveri juaj nuk është gjithashtu e kontrolluar, bëri ata të më jepni një emër, është kjo në fakt një adresë e vlefshme email, bëri ata të zgjedhin një konvikt, ju mund të përfundojnë up futur fals apo vetëm të dhënat bosh në bazën e të dhënave tuaja, të cilat ndoshta nuk do të jetë një gjë e mirë nëse ju jeni duke supozuar se ishte atje. Pra, ky është një realitet i bezdisshëm. Por në përgjithësi, klient-ana validation është e madhe. Por kjo do të thotë dy herë më shumë punë. Edhe pse nuk ekzistojnë të ndryshme biblioteka, biblioteka JavaScript për shkallës, që e bëjnë këtë shumë, shumë më pak e një dhimbje koke. Dhe ju mund të ripërdorimin disa të kodit server-side, klient-side. Por e kuptojnë se kjo është në mënyrë tipike punë shtesë. Po. Audienca: Pra, nëse ne vetëm tha më pak të sigurta - DAVID J. Malan: [qesh] Ugh. Ata janë gjithmonë të vështirë ato të gjykojnë. Rob Bowden: Kjo do të janë pranuar. DAVID J. Malan: Çfarë? Rob Bowden: I krijuar këtë problem. Që do të kishte pranuar. DAVID J. Malan: Po. Audienca: Best. Rob Bowden: Por ne nuk e pranojmë për një të parë - mirë, ajo që ne po kërkoni është diçka si ju nuk keni për të komunikuar me server. Ne nuk e pranojmë vetëm më të shpejtë. Audienca: Po në lidhje me mos ringarkoni faqen? Rob Bowden: Po. Kjo ishte një përgjigje e pranuar. DAVID J. Malan: Çdo gjë ku kemi ndjerë ajo ishte më shumë gjasa se nuk ka gjasa se ju e dinte se çfarë keni qenë thënë, e cila është një ashpër linjë për të nxjerrë ndonjëherë. Duke përdorur një listë e lidhur në vend nga një grup për të mbajtur një renditura listën e numrave të plotë. Pra, një kokë ne shpesh përmendin me i lidhur Listat që motivuar tërë e tyre hyrje ishte që ju të merrni dinamizëm. Ata mund të rritet. Ata mund të tkurret. Pra, ju nuk keni për të kërcejnë përmes hoops që në fakt krijojnë më shumë memorie me një grup. Ose ju nuk keni të drejtë të thonë, vjen keq, përdoruesi. Array është e mbushur. Rritja në mënyrë dinamike të listës. Një dobësitë pse e listave të lidhura? AUDIENCA: Kjo është linear. Duke kërkuar në listën e lidhur është linear në vend të asaj që ju log in DAVID J. Malan: Pikërisht. Duke kërkuar në listën e lidhur është linear, edhe nëse është e renditura, sepse ju mund të vetëm ndiqni këto crumbs bukë, këto pointers, që në fillim të listës në fund. Ju nuk mund të levave qasje të rastit dhe, në këtë mënyrë, kërko binar, edhe nëse është e të renditura, që ju të mund të bëjë me një grup. Dhe ka edhe një kosto. Po. Audienca: Memory joefikase? DAVID J. Malan: Po. E pra, unë nuk do domosdoshmërisht thonë joefikase. Por kjo ju kushton më shumë memorie, sepse ju keni nevojë për 32 bit për çdo nyje për treguesin shtesë, në paktën për një listë e lidhur në formë individuale. Tani, në qoftë se ju jeni vetëm ruajtjen integers dhe ju jeni duke shtuar treguesin, kjo është në fakt lloj i jo-parëndësishëm. Është dyfishuar sasinë e kujtesës. Por në realitet, në qoftë se ju jeni magazinimin e një listë e lidhur e structs që mund të kenë 8 bytes, 16 bytes, edhe më shumë se kaq, ndoshta është më pak i një kosto margjinale. Por kjo është një kosto megjithatë. Pra, ose të atyre që do të kemi qenë gjobë si dobësi. 18. Duke përdorur PHP në vend të C për të shkruar një program command-line. Pra këtu, është shpesh më të shpejtë të përdorë Gjuha si PHP ose Ruby ose Python. Ju vetëm të shpejt të hapur deri një editor teksti. Ju keni shumë funksione më shumë në dispozicion për ju. PHP ka lavaman kuzhine e funksioneve, ndërsa në C, ju kanë shumë, shumë pak. Në fakt, djema e di rrugën e vështirë që ju nuk keni tavolina hash. Ju nuk keni të lidhura listat. Nëse ju doni ata, ju duhet të zbatojë vetë. Pra, një me kokë nga PHP apo me të vërtetë ndonjë gjuha interpretohet është shpejtësia me të cilat ju mund të shkruani kodin. Por një dobësitë, e pamë këtë kur kam whipped shpejt një misspeller Zbatimi në leksion duke përdorur PHP, është se duke përdorur një gjuhë të interpretohet zakonisht është më i ngadalshëm. Dhe ne pamë se dukshëm me një rritet në kohë nga 0.3 në 3 sekonda sekonda më, për shkak të interpretimit që në fakt ndodh. Një tjetër me kokë ishte se ju nuk kanë për të hartuar. Pra, ajo gjithashtu përshpejton zhvillimin ra fjala, sepse ju nuk keni Dy hapa për drejtimin e një program. Ju vetëm duhet një të tillë. Dhe kështu kjo është shumë e imponues si. Duke përdorur një bazë të dhënash SQL në vend të një fotografi CSV për të ruajtur të dhënat. Pra SQL database është përdorur për pset7. Fotografi CSV ju nuk e përdorni shumë. Por ju e përdorur atë në mënyrë të tërthortë në pset7 si edhe duke biseduar me Yahoo Finance. Por CSV është vetëm si një file Excel por super e thjeshtë, ku shtyllat janë demarked vetëm me presje brenda i një mënyrë tjetër skedar teksti. Dhe duke përdorur një bazë të dhënash SQL është pak më shumë bindëse. Është një kokë, për shkak se ju të merrni gjërat si të zgjedhur dhe futur dhe fshini. Dhe ju merrni, me sa duket, indekseve që MySQL dhe bazat e të dhënave të tjera, si Oracle, të ndërtuar për ju në kujtesë, të cilat do të thotë zgjidhni juaj ndoshta nuk është do të jetë e lartë lineare e deri në fund. Është e vërtetë do të jetë diçka si kërkim binar apo diçka të ngjashme në frymë. Pra, ata janë në përgjithësi më të shpejtë. Por një downside është se kjo është vetëm punë më shumë. Është më shumë përpjekje. Ju duhet të kuptoni bazave të të dhënave. Ju duhet për të vendosur atë. Ju duhet një server për të drejtuar që baza e të dhënave në. Ju duhet të kuptoni se si ta konfiguroni atë. Pra, këto janë vetëm këto llojet e tregtisë të humbura. Ndërsa një fotografi CSV, ju mund të të krijojë atë me gedit. Dhe ju jeni të mirë për të shkuar. Nuk ka kompleksiteti përtej kësaj. Duke përdorur një Trie në vend të një tabelë hash me chaining të veçantë për të ruajtur një fjalor i fjalëve të kujton i pset5. Pra, një përpiqet me kokë, në teori të paktën, është ajo? Koha konstante, të paktën nëse ju jeni hashing on secili i individit letra në një fjalë, si ju mund të ketë për pset5. Kjo mund të jetë pesë hashes, gjashtë hashes në qoftë se ka pesë ose gjashtë letra në fjalë. Dhe kjo është shumë e mirë. Dhe në qoftë se ka një kufi i sipërm se si gjatë fjalët e tua mund të jetë, kjo është Ora vërtetë asymptotically konstante. Ndërsa një tabelë hash me i veçantë chaining, problemin atje me atë lloj i strukturës së të dhënave është se Ecuria e algoritme tuaj zakonisht varet nga numri i gjërave tashmë në strukturën dhënave. Dhe kjo është padyshim rasti me zinxhirët, ku më shumë sende të vendosni në një tryezë të hash, më të gjatë ata zinxhirët shkoni, që do të thotë në më të keq rast, gjë që ju mund të kërkoni për është gjithë mënyrë në fund të një nga ato zinxhirët, i cili në mënyrë efektive bie në diçka lineare. Tani, në praktikë, ajo mund të absolutisht të jetë rast që një tabelë hash me zinxhirët është më e shpejtë se sa një që korrespondon Zbatimi Trie. Por kjo është për arsye të ndryshme, në mesin e të cilat mundohet të përdorë një të tërë shumë që mund, në fakt, gjërat ngadalshëm memorie poshtë, sepse ju nuk e merrni e bukur Përfitimet e diçka të quajtur caching, ku gjërat që janë të ngushtë së bashku në kujtim mund të arrihen shpesh më shpejt. Dhe ndonjëherë ju mund të dalë me një funksion të vërtetë të mirë hash. Edhe në qoftë se ju keni për të humbur një grimë kujtesës, ju mund të, me të vërtetë, të drejtë të të gjeni gjëra të shpejtë dhe nuk e si e keqe si linear. Pra me pak fjalë, nuk kishte domosdoshmërisht me ndonjë nga këto një ose edhe dy gjëra të veçanta ne kemi qenë në kërkim të. Me të vërtetë ndonjë gjë bindëse si një kokë dhe dobësitë përgjithësi zënë sytë tonë. Rob Bowden: Pra, për të përmbysur, ne e bëmë nuk e pranojnë më vete "më të shpejtë." Ju kishte për të thënë diçka për të. Edhe nëse ju tha teorikisht më të shpejtë, ne e dinim se ju lloj i kuptuar se kjo është 0 i 1. Dhe tabela hash, në teori, nuk eshte 0 nga 1. Duke përmendur asgjë rreth duhur në përgjithësi të marrë ju pikë. Por "të shpejtë," shumica e zgjidhjeve për Bordi i madh që po mundohet ishin objektivisht më e ngadaltë se zgjidhjet që ishin tavolina hash. Pra, më të shpejtë në vetvete nuk është me të vërtetë e vërtetë. DAVID J. Malan: Dom de dom dom. Unë jam ndoshta i vetmi që realizon kjo është se si ajo është menduar për të shqiptohet, apo jo? Rob Bowden: kam pasur në fakt asnjë ide. DAVID J. Malan: Është bërë kuptim në kokën time. Rob Bowden: Unë jam duke bërë këtë një të tillë. OK. Pra, kjo është ajo ku keni pasur për të nxjerrë Diagrami i ngjashëm me ty mund kanë parë në provimet e kaluara. Pra, le të vetëm të shikoni në këtë. Pra, nga nyjen HTML, ne kemi dy fëmijët, kreu dhe trupi. Pra, ne të zgjerohet - kokën dhe trupin. Kreu ka një tag titullin. Pra, ne kemi një titull. Tani, një gjë shumë njerëz harruar është se këto nyje tekst janë elementet brenda kësaj peme. Pra, këtu ne të ndodhë për të nxjerrë ato si ovals të dallojnë ata nga këto lloje të nyje. Por vini re edhe këtu kemi të lartë, mesme, dhe në fund do të përfundojë si nyjet tekst. Pra, duke harruar ato ishte disi një gabim të përbashkët. Trupi ka tre fëmijë - këto tre divs. Pra div, div, div dhe pastaj teksti Fëmijët nyje të atyre divs. Kjo është shumë e shumë të për atë pyetje. DAVID J. Malan: Dhe kjo vlen të përmendet, edhe pse ne nuk e ndalem në këto Detajet në kohë kemi shpenzuar në JavaScript, që urdhri ka, në fakt, çështje teknikisht. Pra, nëse kreu vjen para trupit në HTML, atëherë ajo duhet të paraqitet për majtë të trupit në DOM aktuale. Kjo tij është, në përgjithësi, vetëm FYI, diçka që quhet mënyrë dokument, ku kjo ka rëndësi. Dhe në qoftë se keni qenë zbatimit të një parser, një program që lexon HTML në ndërtimin e deri pemë në kujtesën, të jetë i sinqertë, kjo është intuitive ndoshta ajo që ju të bëjë gjithsesi - lart poshtë, majta në të djathtë. Rob Bowden: Pyetjet për këtë? A duhet të bëjë një tjetër? DAVID J. Malan: Sigurisht. Rob Bowden: OK. Pra, kjo është tampon muar Pyetja sulm. Gjëja kryesore për të njohur këtu është, mirë, se si mund një mashtrim kundërshtar ky program në ekzekutimin e Kodi arbitrare? Pra argv1, linja e parë e komandës Argumenti për këtë program, që mund të jetë në mënyrë arbitrare të gjatë. Por këtu ne jemi duke përdorur memcpy të kopje argv1, e cila këtu është bar. Ne jemi duke kaluar atë si argument. Dhe kështu që është duke marrë në emrin bar. Pra, ne jemi duke memcpying bar në këtë tampon c. Sa bytes jemi ne kopjuar? E pra megjithatë shumë bytes bar ndodh të të përdorur, gjatësinë e këtij argumenti. Por c është vetëm 12 bytes të gjerë. Pra, në qoftë se ne të shkruani një argument të command line kjo është më e gjatë se 12 bytes, ne jemi do të del nga shtrati këtë tampon të veçantë. Tani, si mund të gënjejnë një kundërshtari programit në ekzekutimin kodin arbitrare? Pra, mos harroni se këtu kryesor është duke bërë thirrje foo. Dhe kështu pastaj thirrjet kryesore Foo. Le të nxjerrë këtë. Pra, ne kemi turrë tonë. Dhe kryesor ka një kornizë rafte në fund. Në disa pika, thirrjet kryesore Foo. E pra, menjëherë, thirrjet kryesore Foo. Dhe kështu foo merr kuadrin e vet të rafte. Tani, në disa pika, foo do të kthehen. Dhe shkoi kthimit foo, ne kemi nevojë të dimë në çfarë linjë e kodit brenda ne kryesore ishin në mënyrë që të dini se ku ne duhet të rifillojë në kryesore. Ne mund të telefononi foo nga një i tërë bandë e vende të ndryshme. Si e dimë se ku të kthehen? E pra, ne kemi nevojë për të ruajtur atë diku. Pra, diku të drejtë rreth këtu, ne dyqan ku ne duhet të kthehet në një herë kthimit foo. Dhe kjo është adresa e kthimit. Pra, si një kundërshtar mund të përfitojnë e ky është fakti se kjo tampon c është ruajtur, le të thonë, këtu është c. Pra, ne kemi marrë 12 bytes për të c. Kjo është c. Dhe kjo është unaza e rafte Foo-së. Pra, në qoftë se përdoruesi hyn me qëllim të keq më shumë bytes se 12 ose ata hyjnë në një komandë Argumenti linjë kjo është më shumë se 12 karaktere, atëherë ne do të del nga shtrati këtë tampon. Ne mund të mbajë. Dhe në një pikë, ne do të shkojmë larg mjaftueshme që të fillojmë overwriting këtë adresë e kthimit. Pra, një herë ne prishësh adresë e kthimit, kjo do të thotë se kur foo kthimit, ne jemi duke u kthyer në kudo përdoruesit me qëllim të keq është e thënë atë nga çfarëdo vlerë ajo hyri, me çfarëdo karaktere përdoruesit hyri. Dhe kështu në qoftë se përdoruesi qëllim të keq është duke u veçanërisht i zgjuar, ai mund të ketë këtë kthehet diku në printDef funksioni ose diku në malloc funksion, vetëm kudo arbitrare. Por edhe më e zgjuar është ajo nëse ai ka përdoruesit të kthehet në të drejtë këtu. Dhe pastaj ju filloni ekzekutimin këto si rreshta të kodit. Pra, në këtë pikë, përdoruesi mund të hyjë çdo gjë që ai dëshiron në këtë rajon. Dhe ai ka kontroll të plotë mbi programin tuaj. Pyetjet për se? Pra, pyetja tjetër është i plotë reimplementation i foo në një mënyrë të tillë se kjo nuk është më e ndjeshme. Pra, ka disa mënyra ju mund të ketë bërë këtë. Ne ende kemi c vetëm duke qenë i gjatësisë 12. Ju mund të ketë ndryshuar këtë si pjesë solucion tuaj. Ne gjithashtu shtoi një kontroll për të bërë sigurt bar nuk ishte null. Edhe pse ju nuk duhet që për kredi të plotë. Pra, ne jemi duke kontrolluar parë Gjatësia varg bar. Në qoftë se kjo është më e madhe se 12, atëherë në fakt nuk bëjnë kopje. Pra, kjo është një mënyrë e fiksimin e tij. Një mënyrë tjetër e fiksimin e tij është në vend të që ka c jetë vetëm i gjatësi 12, e kanë atë të jetë i gjatësi strlen (bar). Një mënyrë tjetër e fiksimin e tij është që në fakt vetëm të kthehen. Pra, nëse ju kishte vetëm gotten shpëtoj të gjithë këtë, në qoftë se ju kishte vetëm të fshirë të gjitha rreshta të kodit, ju do të keni marrë kredi të plotë, pasi këtë funksion nuk në të vërtetë nuk arrijnë asgjë. Është kopjimi command line Argumenti në një grup në kornizë e saj lokale rafte. Dhe pastaj gjë po kthehet. Dhe çfarëdo qoftë ajo realizohet është zhdukur. Kështu që kthimi ishte gjithashtu një e mjaftueshme mënyrë për të marrë kredi të plotë. DAVID J. Malan: Jo mjaft fryma e pyetje por e pranueshme për spekulim megjithatë. Rob Bowden: Pyetjet për ndonjë nga kjo? Një gjë që ju të paktën nevojshme për hartimin e kanë kodin. Pra, edhe pse teknikisht nuk jeni e ndjeshme nëse kodi juaj nuk ka përpilojnë, ne nuk e pranojmë këtë. Nuk ka pyetje? OK. DAVID J. Malan: A doni për të thënë këtë titull? Rob Bowden: Jo. DAVID J. Malan: Pra, në këtë, kjo ishte ose një lajm i mirë apo lajm i keq. Kjo është fjalë për fjalë të njëjtin problem si quiz e parë. Dhe kjo është pothuajse e njëjtë Problemi si pset1. Por kjo është thjeshtëzuar me qëllim që të jetë i një piramidë të thjeshtë, e që mund të jenë të zgjidhet me një pak më të përsëritje të thjeshtë. Dhe me të vërtetë, ajo që ne po merrnin në këtu nuk ishte aq shumë logjika, sepse ndoshta, në këtë pikë, ju jeni më të rehatshme se keni qenë në javë me një për sythe apo pse sythe, por me të vërtetë të vë në lojë përveç se ju jeni pak të kënaqur me Nocioni që PHP nuk është vetëm për atë programimit. Ajo në fakt mund të përdoret si gjuhë e për të shkruar programet e shkruar e komandave. Dhe me të vërtetë, kjo është ajo që ne ishim duke u përpjekur të tërheq vëmendjen tuaj për të. Ky është një program PHP command line. Pra C kodin këtu, ndërsa i saktë në C, nuk e korrigjuar për PHP. Por kodi në të vërtetë është e njëjtë. Nëse ju krahasoni zgjidhje për Quiz 0 kundër Quiz 1, ju do të gjeni se kjo është pothuajse identike, përveç disa shenja të dollarit dhe për Mungesa e një lloji të dhënave. Në veçanti, në qoftë se ne të marrë një sy këtu, ju do të shihni se ne iterate, në këtë rast, nga 1 deri me 7. Ne mund të ketë bërë atë indeks 0. Por ndonjëherë, unë mendoj se është vetëm mendërisht më të lehtë për të menduar për gjëra të 1-7. Nëse doni një bllok, atëherë dy blloqe, pastaj tre, pastaj dot, dot, dot shtatë. Ne kemi j duke u nisur në 1 dhe pastaj llogarit deri të i. Dhe çdo gjë këtu është identike. Por, vlen të përmendet janë disa gjëra. Ne ju japim këto dy rreshta, kjo e parë një, i quajtur goofily si një mesele për zhurmë të mprehtë. Dhe kjo vetëm përcakton rrugën, folder, në të cilin një program mund të jetë gjetur se ju doni të përdorni për të interpretuar këtë fotografi. Dhe pastaj vija e pas kësaj, të Sigurisht, do të thotë të hyjë mënyrën e PHP. Dhe vija në fund shumë nënkupton mënyrën dalje PHP. Dhe kjo punon, në përgjithësi, me interpretuar gjuhë. Kjo është lloj i bezdisshëm, nëse ju shkruani një program në një skedar të quajtur foo.php. Dhe pastaj përdoruesit tuaj keni të drejtë të mos harroni, OK, për të drejtuar këtë program, unë duhet të tipit "foo.php hapësirë ​​php." Lloj i bezdisshëm, nëse asgjë tjetër. Dhe ajo gjithashtu tregon se programi juaj është shkruar në PHP, e cila nuk është e gjitha që ndriçues për përdoruesit. Kështu që ju mund të hiqni. Php krejt kujtohet nga leksioni. Dhe në të vërtetë ju mund të bëni. / Foo nëse ju keni chmodded atë duke e bërë atë ekzekutueshëm. Pra chmod a + x foo do të kishte bërë atë. Dhe në qoftë se ju të shtoni mesele këtu. Por me të vërtetë, problemi ishte duke u në shtypjen nga diçka si kjo. Jo HTML, jo C-kod me siguri, vetëm disa PHP. Pra, Milo pastaj u kthye në problem të 25. Dhe në 25, ju janë dhënë në vijim Kodi skelet, i cili ishte një faqe shumë e thjeshtë web. Dhe pjesa me lëng HTML-i mençur ishte poshtë ketu, ku ne kemi brenda trupit një formë që ka ID unike e inputeve brenda të cilave ishte dy inputet, një me një ide të emrit, një me një ide të button. I pari ishte teksti lloji, dytë të tipit të paraqesë. Dhe kështu që ju lamë, në të vërtetë, më shumë përbërësit se ju e nevojshme, vetëm në mënyrë të ju djema pasur mundësitë me të cilat për të zgjidhur këtë problem. Ju nuk keni nevojë në mënyrë rigoroze të gjitha këto kartat e identitetit. Por kjo ju mundëson për të zgjidhur ajo në mënyra të ndryshme. Dhe deri në krye, vëreni se Qëllimi ishte për të shkaktuar një dritare si kjo - Përshëndetje, Milo! - për të pop në shfletuesin duke përdorur super e thjeshtë, nëse nuk i shëmtuar, funksion alarm. Dhe kështu, në fund të fundit, kjo boils poshtë konceptualisht të disi dëgjuar për parashtresat e klientit-anën formë , Jo-server side, disi përgjigjur kësaj dorëzimit nga grabbing vlerën që përdoruesi shtypur në të fushës emrit, dhe pastaj shfaqur atë në trupin e nje alarm. Pra, një mënyrë ju mund ta bëni këtë është me jQuery, e cila duket pak syntactically hutues në fillim. Ju mund ta bëni këtë me kod të pastër DOM - document.getelement nga ID. Por le të marrë një sy në këtë version. Unë kam një çift të rëndësishme linja e parë. Pra një, ne kemi këtë linjë, e cila është identike me atë që ju mund të keni parë në, unë besoj, form2.html nga klasa në javën e 9. Dhe kjo është vetëm duke thënë, ekzekutuar kodi në vazhdim, kur dokumenti është gati. Duke qenë e rëndësishme vetëm për shkak Faqet HTML lexohen lartë të fund, e majta në të djathtë. Dhe për këtë arsye, në qoftë se ju të përpiqet të bëjë diçka në kodin e deri këtu në disa DOM element, disa HTML tag, që është poshtë këtu, ju jeni duke bërë atë shumë shpejt, sepse kjo ka as edhe janë lexuar në kujtesë. Pra, duke thënë se këtë document.ready linjë, ne jemi duke thënë, këtu e disa kodi, shfletues. Por nuk do të ekzekutojë këtë deri sa të gjithë dokumenti është gati, se është DOM pemë ekziston në kujtesën. Kjo është pak më drejtpërdrejtë, në qoftë se një syntactically pak e ndryshme, ku unë jam duke thënë, grab element HTML unik i të cilit Identifikuesi është inputeve. Kjo është ajo që tag hash tregon, ID unike. Dhe atëherë unë jam duke e quajtur. Paraqesë. Pra. Paraqesë këtu është një funksion, përndryshe i njohur si një metodë, kjo është në brendësi të objektit në të dorës së majtë Ana atje që unë nuk e theksoj. Pra, nëse ju mendoni se e inputeve si një objekt në kujtim - dhe në të vërtetë është. Kjo është një nyje në një pemë - . Paraqesë mjete kur kjo formë me ky ID është dorëzuar, ekzekutuar kodi në vazhdim. Unë nuk e kujdesit çfarë emri i funksion është unë jam ekzekutimin. Kështu që këtu unë jam duke përdorur, si më parë, ajo që është quajtur funksioni lambda ose një funksion anonim. Kjo nuk është aspak intelektualisht interesante të tjera se ajo nuk ka emër, e cila është e mirë në qoftë se ju jeni vetëm ndonjëherë do të thërrasë atë një herë. Dhe brenda atje unë në fakt të trajtuar dorëzimin e formularit. I pari deklaroj një ndryshore quajtur vlera. Dhe pastaj çfarë është efekti i kësaj theksoi pjesë këtu tani? Çfarë do të bëni në një Niveli i lartë për mua? Audienca: Ajo merr vlerën që Përdoruesi nuk ka në HTML më poshtë. Ajo merr atë ID dhe pastaj gjen vlerën e saj. DAVID J. Malan: Pikërisht. Ai grabs nyjen, të cilit unik Identifikuesi është emri. Ajo merr vlera në të, e cila është, me sa duket, ajo që përdoruesi shtypur atë ose veten. Dhe atëherë ajo ruan se në ndryshore të quajtur vlera. Si një mënjanë, ju mund të ketë edhe bërë këtë pak ndryshe. Krejtësisht e pranueshme duke bërë diçka Vlera gënjeshtër var merr document.getElementById. Dhe kjo është arsyeja pse ajo është pak lodhshme për të mos përdorin jQuery. "Emër". Vlerë. Pra krejtësisht e pranueshme. Mënyra të ndryshme për të bërë këtë. jQuery vetëm ka tendencë të jetë pak më të ngjeshur dhe patjetër më popullore në mesin e programuesit. Tani, unë jam duke bërë një grimë e një mendje e shëndoshë kontrolloni, sepse në problem Deklarata e kemi thënë në mënyrë të qartë, në qoftë se përdorues nuk e ka shtypur ende tij ose të saj emrin, nuk tregojnë një alarme. Por ju mund të kontrolloni për këtë, vetëm me kontrolluar për vargun e zbrazët për një quote-mbyll thonjëzat në qoftë se ka asgjë në të vërtetë atje. Por nëse kjo nuk është e barabartë me kuotë-mbyll thonjëzat, Unë dua të telefononi alarme. Dhe pjesa më interesante këtu është se ne jemi duke përdorur operatorin plus, e cila bën çfarë në JavaScript? Lidh. Pra, kjo është si PHPs dot operatorit. E njëjta ide, sintaksa pak të ndryshme. Dhe unë jam vetëm duke krijuar vargun që ju keni parë në ekran shtënë - Përshëndetje, kështu dhe kështu. Dhe pastaj detaj i fundit është ky. Pse kthehen brenda të rreme e këtij funksioni anonim? Audienca: Nuk ka vlerë. Ju vënë atë në formë. Ai vetëm thotë, në qoftë se vlera nuk është barabartë me bosh, pastaj të bëjë atë. Nuk ishte një bosh në atë nënshtrim. DAVID J. Malan: OK. Kujdes pse. Nuk ka askush tjetër këtu. Dhe se kthimi i rremë është jashtë e nëse kushtet. Pra, kjo linjë të theksuar, kthimit të rreme, ekzekuton pa marrë parasysh çfarë, kur formë është dorëzuar. Çfarë do të kthehej brenda të rreme të kësaj Mbajtësi i ngjarjeve, siç është quajtur, ngjarja në fjalë duke qenë nënshtrim? Audienca: Për shkak se ndodh vetëm një herë. DAVID J. Malan: Vetëm ndodh një herë. Jo fare. Po? Audienca: Ajo parandalon formularin nga dorëzimin në sjelljen e parazgjedhur, e cila do ta bënte të rifreskoni faqe. DAVID J. Malan: Pikërisht. Kështu që unë jam mbingarkesat termi paraqesë këtu, sepse unë jam duke thënë, formë është duke u dorëzuar. Por si ju sugjeroj, nuk është në të vërtetë është dorëzuar në mënyrë të vërtetë HTTP. Kur ju klikoni Submit, për shkak të ynë mbajtës onsubmit, ne jemi duke intercepting se paraqitja formë mënyrë që të flasin. Ne jemi duke pastaj duke bërë gjë tonë me kodin JavaScript. Por unë jam kthyer qëllimisht i rremë, sepse ajo që unë nuk dua të ndodhë një ndarje të dytë më vonë është për të gjithë formën vetë që do të paraqitet në web server me çifte kyçe vlerë duke ndryshuar URL të jetë diçka si q = macet apo çfarëdo që kemi bërë, për shembull, në klasë. Unë nuk dua që kjo të ndodhë, sepse nuk ka dëgjuar për këtë server formë nënshtrim. Kjo është bërë thjesht në kodin JavaScript. Dhe kjo është arsyeja pse unë nuk kanë edhe një veprim atribut në formularin tim, sepse unë nuk kanë ndërmend që kjo të ndonjëherë shkojnë në server. Pra, është duke u dorëzuar. Por ne jemi të ndërprejnë atë formë Dorëzimi dhe parandalimin default sjellje, e cila është të vërtetë të shkojnë të gjithë rrugën në server. Audienca: Pra, duke e mbajtur atë të klientit-side. DAVID J. Malan: Mbajtja ajo klient-side. Saktësisht e drejtë. Next up ishte tim oh MySQL. Rob Bowden: OK. Pra, kjo pyetja e parë ishte në përgjithësi përafërt për njerëzit. Edhe pse ato më vonë shkoi mirë. Kështu që ju duhet të zgjidhni të dhënat e saktë Llojet për të dyja këto kolona. Dhe të dyja këto kanë disa gjëra për ata që të bëjë zgjedhje të vështira. Pra, int nuk ishte e vlefshme shkruani për numrin. Arsyeja është një llogari me 12 shifra Numri, një int nuk është mjaft e madhe për të dyqan shifra totale. Pra, një zgjedhje e vlefshme do të ishte një i madh int nëse ju ndodh që të dini se. Një tjetër zgjedhje mund të ketë qenë një fushë char e gjatësi 12. Pra, ose të atyre që do të kishte punuar. Int nuk do. Tani, bilanci, mendoj se përsëri në pset7. Pra, ne në mënyrë specifike të përdorura decimal të të ruajtur vlerën e aksioneve ose - DAVID J. Malan: Cash. Rob Bowden: Cash. Ne kemi përdorur decimal të ruajtur sasinë e të holla që përdoruesi aktualisht ka. Pra arsyeja që ne të bërë këtë është sepse, mos harroni, gjithandej. Nuk ka pikë lundrues në saktësi. Ajo nuk mund saktësisht të ruajtur të holla Vlerat si ne duam këtu. Pra dhjetor është në gjendje për të pikërisht dyqan diçka për të, të themi, dy vende dhjetore. Kjo është arsyeja pse bilanc, ne duam atë të jetë decimal dhe nuk noton. DAVID J. Malan: Dhe gjithashtu, shumë, edhe pse ajo mund të ketë qenë i zgjuar në të tjera kontekste të menduar, ndoshta kjo është një shans për një int. Unë vetëm do të mbajnë gjurmët e gjërat në pennies. Sepse ne në mënyrë të qartë treguan default vlera të qenë 100.00, që do të thotë se mund të jetë vetëm një int. Dhe një tjetër finesë shumë me numër ishte se ajo nuk kishte për qëllim të jetë një pyetje mashtrim. Por kujtojmë se një int në MySQL, si në C, të paktën në aplikim, është 32-bit. Dhe, edhe pse ne nuk presim nga ju që të e di saktësisht se sa shifrat që do të thotë, më kujtohet se numri më i madh ju mund të përfaqësojnë potencialisht me një numër të 32-bit është afërsisht ajo? E sa nuk kemi gjithmonë të themi? 2 deri 32, e cila është ajo afërsisht? Ju nuk duhet të dinë saktësisht. Por përafërsisht është e dobishme në jetë. Kjo është afërsisht 4 miliard. Pra, ne kemi thënë se disa herë. Unë e di unë kam thënë se disa herë. Dhe kjo është afërsisht 4 miliard. Dhe kjo është një rregull të mirë i gishtit të dini. Nëse ju keni 8 bit, 256 është numri magjik. Nëse keni 32 bit, 4 miliardë japë ose të marrë. Pra, nëse ju vetëm shkruani 4 miliardë, ju do të shihni se ajo është më pak se shifra 12, që do të thotë se nuk është e qartë shprehurit të mjaftueshme për të kapur një Numri i llogarisë 12-shifror. Rob Bowden: OK. Pra, ato të tjera shkuan mirë. Pra, mendoj se banka imponon një $ 20 mujore Tarifa e mirëmbajtjes për të gjitha llogaritë. Me çfarë query SQL mund banka zbres 20 $ nga çdo akuzë, edhe nëse rezulton në disa bilancet negative? Pra, në thelb, ka katër Llojet kryesore të pyetjeve - insert, zgjidhni, update, dhe fshini. Pra, çfarë bëjmë ne mendoj se ne jemi do të përdorni këtu? Update. Pra, le të marrin një sy. Pra, këtu ne jemi përditësimin. Ajo që table jemi ne përditësimin llogari? Pra përditësimin llogari. Dhe pastaj sintaksa thotë, çfarë në llogaritë jemi përditësimin? E pra, ne jemi vendosjen e bilancit të barabartë me Vlera aktuale e bilancit minus 20. Pra, kjo do update të gjitha rreshtave e llogarive, zbritur 20 $ nga bilanci. DAVID J. Malan: Një gabim i përbashkët këtu, edhe pse ne nganjëherë e fali atë, ishte që në fakt kanë kodin PHP këtu duke e quajtur funksionin query ose duke Kuotat e rreth çdo gjëje që nuk duhet të jetë atje. Rob Bowden: Mos harroni se MySQL është një gjuhë e ndarë nga PHP. Ne të ndodhë që të jetë me shkrim MySQL në PHP. Dhe PHP është pastaj e dërguar atë gjatë në server MySQL. Por ju nuk keni nevojë PHP në mënyrë që të të komunikuar me një server MySQL. DAVID J. Malan: Pikërisht. Kështu që nuk ka variabla me shenja të dollarit duhet të jetë në këtë kontekst. Ajo vetëm mund të bëjë të gjitha të math në bazën e të dhënave vetë. Rob Bowden: OK. Kështu që një tjetër. A është kjo një tjetër? Po. Pra, me çfarë query SQL mund banka rifitoj numrat e llogarive të të saj Klientët më të pasura, ata me Bilancet e madhe se 1000? Pra, cila nga katër llojet kryesore po ne do të duan këtu? Zgjidhni. Pra, ne duam të zgjidhni. Çfarë duam të zgjidhni? Ajo që kolona duam të zgjidhni? Ne do të duan në mënyrë specifike për të zgjedhur numrin. Por nëse ju tha yll, ne gjithashtu pranoi se. Pra, zgjidhni numrin nga çfarë tryezë? Llogaritë. Dhe pastaj kusht që duam? Ku bilanci më i madh se 1000. Ne gjithashtu pranuar më e madhe se ose e barabartë. E fundit. Me çfarë query SQL mund banka ngushtë, dmth, fshini çdo llogari që ka një bilanc prej $ 0? Pra, cila nga katër jemi ne do të dëshironi të përdorni? Fshij. Pra, sintaksa për këtë? Fshij nga çfarë tryezë? Llogaritë. Dhe pastaj gjendja në të cilën ne duam të fshini - ku bilanci është e barabartë me zero. Pra fshini të gjitha rreshtave nga llogaritë ku bilanci është zero. Pyetjet për ndonjë nga këto? Dëshironi të radhë? DAVID J. Malan: udhëzues Queue. Pra, në këtë, ne ju dha një disi Struktura e njohur se ne hulumtohen a bit në klasë së bashku me të structs, e cila ishte një e të dhënave Struktura e lidhur në shpirt. Dallimi edhe pse me një radhë është që ne kishim për të disi të kujtuar që është në pjesën e përparme të radhë, në të mëdha pjesë në mënyrë që ne mund të bëjë më shumë përdorimin efikas të kujtesës, të paktën në qoftë se ne kemi qenë duke përdorur një rrjet. Sepse kujtojnë, në qoftë se ne kemi një rrjet, nëse, për shembull, kjo është fronti i radhë, në qoftë se unë të marrë në radhë këtu, dhe pastaj dikush merr në linjë pas meje, pas meje, pas meje, dhe një person del nga linjës, ju mund, siç e pamë disa të njeriut tonë vullnetarët në klasë, kanë të gjithë ndryshim në këtë mënyrë. Por në përgjithësi, pasi të gjithë e bëjnë diçka nuk është përdorimi më i mirë i kohës në një program, sepse kjo do të thotë tuaj algorithm po kandidon në atë asymptotic kohë running? Kjo është linear. Dhe unë ndjehem si kjo është lloj i trashë. Nëse personi tjetër në linjë është tjetër person që është menduar për të shkuar në dyqan, ata nuk e kanë të gjithë për të lëvizur së bashku. Vetëm le ky person të këputur, të njomë kur të vijë koha, për shembull. Pra, ne mund të ruaj një pak kohë atje. Dhe në mënyrë për të bërë këtë edhe pse, që do të thotë se kreu i radhë ose front i radhë do të progresive lëvizin thellë e më thellë në grup dhe në fund mund në të vërtetë të përfundojë rreth në qoftë se ne jemi duke përdorur një array për të ruajtur popullin në këtë radhë. Kështu që ju mund të pothuajse të mendoj për array si të dhëna rrethore Struktura në këtë kuptim. Kështu që ju disi duhet të mbajnë gjurmët e Madhësia e tij ose me të vërtetë fundi i saj dhe pastaj ku fillimi i saj është. Pra, ne propozojmë që të deklarojë një radhë e tillë, duke e quajtur ajo q, vetëm një letër. Pastaj ne propozojmë që të jetë e para nisur zero dhe se madhesia të niset në zero. Deri tani, nuk ka asgjë brenda kësaj radhë. Dhe ne ju kërkojmë të përfunduar Zbatimi i enqueue më poshtë në një mënyrë të tillë që shton funksioni N tek fundi i q dhe pastaj kthehet e vërtetë. Por në qoftë se q është e plotë ose negative, Funksioni duhet në vend të kësaj kthimit të rreme. Dhe ne ju dha një çift e supozimeve. Por ata nuk janë me të vërtetë funksionale relevante, vetëm se bool ekziston, për shkak se, teknikisht, bool nuk ekzistojnë në C nëse nuk përfshijnë një sigurt header fotografi. Kështu që ishte vetëm sigurohuni që nuk nuk u është ky një mashtrim lloj pyetje gjë. Pra enqueue, kemi propozuar në mostër zgjidhje për të zbatuar si më poshtë. Një, ne së pari kontrolloni lehtësuar, frytet ulët varur. Nëse radhë është e plotë ose numri që jeni duke u përpjekur për të futur është më pak se zero, të cilat ne tha në specifikimin e problemit duhet të nuk lejohet, sepse ne duam vetëm vlerat jo-negative, atëherë ju duhet vetëm të kthimit të rreme menjëherë. Pra disa relativisht e lehtë error checking. Nëse pse ju doni të shtoni atë aktuale numrin, ju kishte për të bërë një grimë duke menduar këtu. Dhe ky është vendi ku është pak i bezdisshëm mendërisht, sepse ju duhet të kuptoj se si për të trajtuar wraparound. Por embrion i idesë këtu kjo është e interes për ne është se wraparound shpesh nënkupton aritmetikë modulare dhe operatori mod, pala qind, ku ju mund të shkoni nga një vlerë më të madhe përsëri në zero dhe më pas një dhe dy dhe tre dhe pastaj kthehet rreth në zero, një dhe dy dhe tre e kështu me radhë përsëri dhe përsëri. Pra, mënyra propozojmë bërë këtë është që ne duam të indeksit në array quajtur numra ku integers tona qëndrojnë. Por për të arritur atje, ne së pari duam të bëjmë pavarësisht nga madhësia e radhë është, por pastaj shtoni të se çdo gjë që front i listës është. Dhe efektin e që është për të na vënë në pozita e drejtë në radhë dhe nuk supozojmë se personi i parë në linjë është në fillim të cilën ai ose ajo absolutisht mund të jetë në qoftë se ne gjithashtu ishin të zhvendosur të gjithë. Por ne jemi vetëm duke krijuar punë për veten tonë nëse ne e mori se rruga e veçantë. Pra, ne mund të mbani atë relativisht e thjeshtë. Ne duhet të mbani mend se ne vetëm shtoi një int me radhë. Dhe atëherë ne vetëm kthim i vërtetë. Ndërkohë, në dequeue, kërkuam ju të bëjë të mëposhtme. Zbatuar atë në një mënyrë të tillë që dequeues, që është heq dhe kthimet, int në frontin e radhë. Për të hequr int, mjafton për të harruar atë. Ju nuk keni nevojë për të shkelur pak e saj. Pra, është ende në të vërtetë atje. Ashtu si të dhënave në një hard drive, ne jemi vetëm duke injoruar faktin se kjo është tani aty. Dhe në qoftë se q është bosh, ne duhet në vend që të kthehen negative 1. Pra, kjo ndihet arbitrare. Pse kthehen Negativ 1 në vend të rreme? Po. Audienca: Q është magazinimin e vlerat pozitive. Që ju vetëm të ruajë vlerat pozitive në q, negative është një gabim. DAVID J. Malan: OK, e vërtetë. Pra, për shkak se ne jemi vetëm ruajtjen pozitiv Vlerat ose zero, atëherë kjo është në rregull për të të kthehen një vlerë negative si Sentinel vlerë, një simbol të veçantë. Por ju jeni duke rishkruar historinë atje, sepse arsyeja që ne jemi vetëm kthyer vlerat jo-negative është për shkak se ne duam të kanë një vlerë Sentinel. Pra, më konkretisht, pse jo vetëm kthimit të rreme në rastet e gabimeve? Po. Audienca: Ju keni dështuar për të kthyer një numër të plotë. DAVID J. Malan: Pikërisht. Dhe ky është vendi ku merr C kufizuar mjaft. Nëse ju jeni duke thënë se ju do të jeni të kthehen një int, ju keni marrë të kthehet një int. Ju nuk mund të merrni dashuroj dhe të fillojnë të kthehen a bool ose një pluskues ose një string ose diçka të tillë. Tani, ndërkohë, JavaScript dhe PHP dhe disa gjuhë të tjera mund, në fakt, a keni kthyer ndryshme lloje të vlerave. Dhe që në fakt mund të jenë të dobishme, ku ju mund të kthehet Ints pozitive, zero, Ints negative, ose të rreme apo null edhe për të ditur gabim. Por ne nuk kemi se shkathtësi në C. Pra me dequeue, ajo që ne propozojë të bëni është - Rob Bowden: Ju mund të kthimit të rreme. Është vetëm se i rremë është hash përcaktojnë false në zero. Pra, nëse ju kthimit të rreme, ju jeni kthyer zero. Dhe zero është një gjë e vlefshme në radhë tonë, ndërsa negative 1 nuk është në qoftë se false ndodhur të jetë negative 1. Por ju nuk duhet edhe duhet të dini se. DAVID J. Malan: Kjo është pse unë nuk them atë. Rob Bowden: Por kjo nuk ishte e vërtetë që ju nuk mund të kthimit të rreme. DAVID J. Malan: Sigurisht. Pra dequeue, njoftim ne e pranojmë të pavlefshme si argument të saj. Dhe kjo është për shkak se ne nuk jemi duke kaluar asgjë in Ne vetëm duam të hequr elementin në pjesën e përparme të radhë. Pra, si mund të shkojmë për të bërë këtë? E pra, së pari, le të bëjë këtë kontroll i shpejtë mendje e shëndoshë. Nëse madhësia radhë është 0, nuk ka nuk ka punë për të bërë. Kthehu negative 1. Done. Pra, kjo është disa rreshta të programit tim. Pra, vetëm katër linja të mbetet. Kështu që këtu unë të vendosë për pakësim madhësia. Dhe decrementing madhësinë në mënyrë efektive do të thotë se unë jam i harruar diçka është në atje. Por unë gjithashtu kanë për të rinovuar, ku para të numrave janë. Pra, për të bërë këtë, kam nevojë për të bërë dy gjëra. Për herë të parë duhet të mbani mend se çfarë numrin është në pjesën e përparme të radhë, sepse kam nevojë për të kthyer atë gjë. Kështu që unë nuk dua të harroj aksidentalisht lidhje me të dhe më pas prishësh atë. Unë jam vetëm duke shkuar për të kujtuar në një int. Dhe tani, unë dua të rinovuar q.front që do q.front +1. Pra, nëse ky ishte personi i parë në line, tani, unë dua të bëj plus 1 të pikë në personi tjetër në linjë. Por unë kam për të trajtuar atë wraparound. Dhe në qoftë se kapaciteti është një konstante globale, që do të më lejoni të bëni të sigurtë si unë pikë në person shumë i fundit në line, operacioni modulo do të sjellë mua mbrapa në zero në përparme e radhë. Dhe që merret me wraparound këtu. Dhe pastaj unë të vazhdojë të kthehen n. Tani, të thuash të drejtën, nuk e kam duhet të deklarojnë n. Unë nuk kam për të rrëmbyer atë dhe ruajtur atë përkohësisht, sepse vlera është ende atje. Kështu që unë mund vetëm të bëjë aritmetike e duhur për të kthyer kokën ish e radhë. Por unë thjesht mendonin se kjo ishte më e qartë që në fakt kap int, e vënë atë në n, dhe pastaj të kthehen që për hir të qartësisë, por jo shumë e nevojshme. Psst. Ata janë të gjithë shqiptueshëm në kokën time. Rob Bowden: Pyetja Pra, së pari është problemi binar pemë. Pyetja e parë është kështu, ne jemi duke pasur parasysh këto shifra. Dhe ne duam të futur ato në një farë mënyre këto nyje e tillë që është një pemë të vlefshme kërko binar. Pra, një gjë që të kujtohet për pemë binare e kërkimit është se ajo nuk është vetëm se gjëja në të majtë është më pak dhe gjëja për të e drejta është më i madh. Ajo duhet të jetë se e gjithë pema për të majtë është më pak, dhe tërë pema në të djathtë është më i madh. Pra, nëse unë vendos 34 këtu në krye, dhe pastaj I vënë 20 këtu, kështu që kjo është e vlefshme aq më tani, sepse 34 deri këtu. 20 do të majtë. Pra, kjo është më pak. Por unë nuk mund të pastaj të vënë 59 këtu, sepse edhe pse 59 është në të drejtën e 20, është ende në të majtë të 34. Pra, me këtë detyrim në mendje, Mënyra më e lehtë e ndoshta zgjidhjen e kësaj Problemi është që vetëm lloj këto numra - kështu 20, 34, 36, 52, 59, 106. Dhe pastaj futur ato nga e majta në të djathtë. Pra 20 shkon këtu. 34 shkon këtu. 36 shkon këtu. 52, 59, 106. Dhe ju gjithashtu mund të ketë motive nga me disa mbylljen në dhe realizimin, oh, prisni, unë nuk kam numra të mjaftueshme për të mbushur këtë në mbi këtu. Kështu që unë duhet të reshift çfarë tim Shënimi rrugë do të jetë. Por vini re se në tre të fundit, në qoftë se ju lexohet nga e majta në të djathtë, është në rritjen e rendit. Deri tani, ne duam të deklarojnë se çfarë struct do të jetë për nyjet në këtë pemë. Pra, çfarë nuk kemi nevojë në një pemë binare? Pra, ne kemi një vlerë prej llojit int, kështu që disa vlera int. Unë nuk e di atë që e quajti ajo në zgjidhjen - int n. Ne kemi nevojë për një tregues për fëmijën e majtë dhe një tregues për fëmijën e duhur. Pra, kjo do të duket si ky. Dhe kjo në fakt do të shikojmë përpara kur e ka dy herë më i lidhur Lista stuff, kështu njoftim - Unë do të duhet të lëviz të gjitha mënyrë përsëri poshtë për të problemit 11. Pra njoftim duket identike me këtë, veç se po të ndodhë vetëm për të thirrur këto emra të ndryshëm. Ne ende kemi një numër të plotë Vlera dhe dy pointers. Është vetëm se në vend të trajtimit të pointers si duke treguar gjë tjetër dhe gjëja e mëparshme, ne jemi duke e trajtuar pointers të tregojnë për një fëmijë të majtë dhe fëmija e drejtë. OK. Pra, kjo është nyja jonë struct. Dhe tani, i vetmi funksion ne kemi nevojë për të zbatuar për këtë është kundërvënie, i cili ne duam të shkojnë mbi pemë, shtypjen nga vlerat e pemës me qëllim. Pra, duke kërkuar këtu, ne do të duan të shtypura nga 20, 34, 36, 52, 59, dhe 106. Si nuk kemi arritur këtë? Pra, është shumë e ngjashme. Nëse ju pa në provim të kaluar problemi që ju të kërkuar për të shtypura nga tërë pemë me presje në mes çdo gjë, ai ishte në fakt edhe më e lehtë se kaq. Kështu që këtu është zgjidhje. Kjo ishte në mënyrë të konsiderueshme më e lehtë në qoftë se ju e bëri atë Recursively. Unë nuk e di nëse dikush ka tentuar për të bërë atë iteratively. Por së pari, ne kemi rastin tonë bazë. Çka po të jetë rrënja është i pavlefshëm? Pastaj ne jemi vetëm do të kthehen. Ne nuk duam të shtypura asgjë. Tjetër ne do të kaloj nëpër Recursively poshtë. Print gjithë subtree majtë. Pra, të shtypur çdo gjë më pak se vlera time aktuale. Dhe atëherë unë jam duke shkuar për të shtypur veten. Dhe atëherë unë jam duke shkuar për recurse poshtë mia tërë subtree e drejtë, kështu që çdo gjë më e madhe se vlera e mia. Dhe kjo do të shtypura jashtë çdo gjë në rregull. Pyetjet se si kjo në të vërtetë realizon këtë? Audienca: Unë kam një pyetje më [e padëgjueshme]. Rob Bowden: Pra, një mënyrë për të afruar ndonjë problem gjithkund rekursive është që vetëm të mendojnë në lidhje me të doja që ju duhet të mendoni për të gjitha rastet qoshe. Kështu që e konsiderojnë se ne duam të print tërë këtë pemë. Pra, të gjithë ne do të përqëndrohet në është kjo nyje të veçantë - 36. Thirrjet e gjithkund rekursive, ne pretendojmë ata vetëm punë. Kështu që këtu, kjo thirrje rekursive për të Kundërvënie, ne edhe pa menduar për këtë, vetëm traversing majtë tre, imagjinoni se tashmë shtyp 20 dhe 34 për ne. Dhe atëherë kur ne përfundimisht Recursively telefononi kundërvënie në drejtë, që do të shtypura si duhet 52, 59, dhe 106 për ne. Pra, duke pasur parasysh se kjo mund të shtypura 20, 34, dhe tjetër mund të shtypura 52, 59, 108, të gjithë ne duhet të jetë në gjendje të bëni është të shtypura ourself në mes të se. Pra, të shtypura nga çdo gjë para nesh. Print ourself, kështu print aktuale nyjen 36, printf rregullt, dhe pastaj të shtypur çdo gjë pas nesh. DAVID J. Malan: Kjo është ajo ku recursion merr me të vërtetë e bukur. Është ky hap mahnitshme e besimit ku ju bëni pak vogël të punës. Dhe pastaj ju lënë dikë tjetër të bëjë pjesën tjetër. Dhe se dikush tjetër është, për ironi, ju. Kështu që për pikë serioze brownie, nëse ju të shkoni deri në pyetjet - Rob Bowden: Në pyetjet? DAVID J. Malan: Dhe poshtë pak për të numrat, nuk e di ndokush se ku këto shifra vijnë nga? Rob Bowden: Unë fjalë për fjalë kanë asnjë ide. DAVID J. Malan: Ata duket të gjithë quiz. Audienca: A janë ata të njëjtat numra? DAVID J. Malan: Këto numra. Një vezë pak Pashkëve. Kështu që për ato prej jush shikuar në internet në në shtëpi, në qoftë se ju mund të na tregoni me email për të heads@CS50.net çfarë rëndësia e këto të përsëritura gjashtë numra janë të gjithë Quiz 1, ne do të të dush me vëmendje të mahnitshme në finale leksion dhe një top stresi. E bukur, delikate. Rob Bowden: Çdo pyetje e fundit për ndonjë gjë në quiz?