DAVID J. Malan: Olgu. Nii teretulnud esimene CS50 postmortem kohta viktoriini. Me otsustasime, et pidulikult Selle traditsiooni tänavu. Ja see annab võimaluse kõndida läbi lahendusi viktoriini. Ja me kiirendada või aeglustada põhinevad on huvi nende siin. Nii et sa oled ilmselt siin, sest sa oled huvitatud sellest, kuidas te oleksite või oleks vastanud mõnele neid probleeme. Miks ei võiks me vaatleme selles rubriigis esimesena? Nii saad stringe. See andis teile kolm erinevat versiooni programmi, mis oli lõppkokkuvõttes tähendas, et saada stringi kasutaja. Kas ta tegi seda oli vasakule sinu otsustada. Ja küsisime küsimuses 0, oletame, et versioon 1 on koostatud ja rakendatud. Miks võiks programmi segfault? Esmapilgul kõik ettepanekud miks? Jah. Publik: Ma nägin seda Eelmises näites vaadates char * s ja nägemine skaneerimisega s ja näha, sest see on pointer, kuidas ei mõjuta see, mida skaneeritud? Kas see s või aadress s? DAVID J. Malan: OK. Väga hea. Nii lõpuks allikas mingit probleemi on arvatavasti läheb vähendada selle muutuja s. Ja see on tõepoolest erinevad. Andmete tüüpi muutuja on char *, mis tähendab, et see saab sisaldavad aadress iseloomu. Ja selles peitub ülevaate. See saab sisaldama aadress iseloomu või üldisemalt aadressi esimene märk kogu plokk tähemärki. Aga saak on see, et skaneerida s, selleks elu on antud aadress ja antud formaadis kood, nagu% s, loe string tüki mälu sellel aadressil. Aga kuna pole võrdusmärk enne et semikoolon esimesel koodirida, sest me tegelikult ei eraldada iga mälu malloc, sest see ei ole tegelikult jaotada massiivi mõnel suurust; sa teed loeb kasutaja klaviatuuriga mõnda täielik prügi väärtus, mis on s vaikimisi. Nii koefitsiendid sa lähed segfault kui et aadress ei ole lihtsalt nii juhtub, olema väärtus, mida saab tegelikult kirjutada. Nii halb mitte eraldada teie mälu on. Nii et küsimus 1, küsisime, oletame, et versioon 2 on koostatud ja rakendatud. Miks see programm segfault? Nii see on vähem lollakas. Ja seal on tõesti ainult üks selge viis, kus saab vallandada segfault siin. Ja see on temaatilised. Iga kord me kasutame c mälu, mida sa said esilekutsumiseks segfault versioonist 2? Publik: Kui te kasutate, et oma panuse string, mis on pikem kui 49 tähemärki. DAVID J. Malan: Täpselt. Iga kord, kui näen midagi fikseeritud pikkusega kui tegemist on massiiv, oma radar peaks minema välja, et see võib olla problemaatiline, kui sa ei kontrolli piirid massiivi. Ja see on probleem. Me veel kasutades scanf. Me veel kasutades% s, mis tähendab, et proovida lugeda string kasutaja. See saab lugeda meie s, mis Siinkohal on tõhusalt aadress tüki mälu või see on samaväärne. See nimi array märkide mälu. Aga täpselt, et kui sa loed string see on pikem kui 49 tähemärki, 49 sest teil on vaja ruumi kurakriips 0, sa lähed koguneda et puhver. Ja võite saada õnnelik ja suutma kirjutada 51. iseloomu, 52., 53.. Aga mingil hetkel OS ei ütle ei. See kindlasti ei ole mälu sa tohi puudutada. Ja programm läheb segfault. Nii et, heuristika peaks olema iga aega sul fikseeritud pikkusega, siis on veenduda loed pikkus ja mis see on sa üritad loe ta. Publik: Nii, et lahendada see, mida võiks pidanud avalduse kontrollimisel tegelikult on pikkus suurem või väiksem kui? DAVID J. Malan: Absoluutselt. Sa pead lihtsalt seisukorras , mis ütleb, et kui - või pigem sa ei pruugi teada, ette, kui palju märke kasutaja saab tippida, sest teil on kana ja muna. Mitte enne, kui olete lugenud seda koos scanf Kas te saate aru, kui kaua see on. Aga sel hetkel, kui on liiga hilja, sest sa oled juba lugenud see mõned ploki mälu. Nii nagu kõrvale, CS50 raamatukogu väldib see asi üldse, tagasivõtmine abil fgetc. Ja see kõlab üks täht korraga, tip-keera mööda, teades, et sa ei uputa iseloomu kui Lugedes ühekaupa. Saak on koos getString tagasivõtmine on et me peame pidevalt uuesti suurus et tüki mälu, mis on vaid valu. See on palju ridu koodi teha. Nii teine ​​lähenemine oleks tegelikult kasutada nõbu, nii rääkida, on scanf. On variante palju neid funktsioone, mis tegelikult kontrollida pikkus, kui palju märke võite lugeda maksimaalselt. Ja siis võiks täpsustada, ei loe rohkem kui 50 tähemärki. Nii et oleks teine ​​lähenemine, kuid vähem majutamiseks suuremate sisendeid. Niisiis küsimus 2 küsib, oletame, et versioon 3 on koostatud ja rakendatud. Miks võib selle programmi segfault? Nii see on tegelikult sama vastata, kuigi see paistab pisut peenema. Me kasutame malloc, mis tundub me anname ise rohkem võimalusi. Ja siis me vabastades et mälu lõppu. See on ikka ainult 50 baiti mälu. Nii et me võiks veel proovida lugeda 51, 52, 1000 baiti. See saab segfault eest täpselt samal põhjusel. Kuid on veel üks põhjus ka. Mida võiks malloc tagastamise lisaks aadress tüki mälu? See võib naasta null. Ja kuna me ei kontrolli eest et me võiksime teha midagi loll muul põhjusel, mis seisneb selles, et me võiks öelda, scanf lugeda kasutaja sisend klaviatuur arvesse 0 asukoha AKA null. Ja see ka, kindlasti vallandada segfault. Nii viktoriin eesmärgi, oleksime on nõustunud kumbki neist nii mõjuv põhjus. Üks on identsed. Üks on natuke rohkem nüansse. Lõpuks, seoses programmi kasutada mälu, kuidas versioon 2 ja versioon 3 erinevad? Niisiis, mida see on väärt, nägime näiliselt lõputu pakkumise võimalik vastuseid sellele. Ja vahel inimeste vastuseid, mida me lootes, kuid me nõustuda teiste asjad, oli mõned mainita Asjaolu, et versioon 2 kasutab nn stack. Versioon 3 kasutab hunnik. Ja funktsionaalselt, see ei ole tegelikult tegema kõik, et palju erinevust. Lõpus päeval, et me oleme ikka lihtsalt saada 50 baiti mälu. Aga see oli üks võimalikke vastuseid et otsisime. Aga näete, kui sa saad oma viktoriinid tagasi TF, et me tegime aktsepteerida muid arutelusid nende erinevate kasutusalade mälu samuti. Aga korstna ja hunnik oleks olnud lihtne vastus minna. Kas on küsimusi? Ma annan sulle Rob. ROB BOWDEN: Nii probleem 4. See on see, kus sa pidid täitma aastal baitide välja kõik Nende eri tüüpi kasutada. Nii et esimene asi, mida me näeme. Oletame, 32-bitine arhitektuur, Asjalik CS50 aparaat. Nii üks põhilisi asju 32-bitine arhitektuur, mis ütleb meile, täpselt, kui suur osuti läheb olevat arhitektuuri. Nii kohe, me teame, et kõik pointer tüüp on 32 bitti või 4 baiti. Nii vaadates seda tabelit, node * on viit tüüpi. See saab olema 4 baiti. Struct sõlme *, mis on sõna otseses mõttes identne sõlm star. Ja nii, et see saab olema 4 baiti. String, seega ei tundu pointer, aga typedef, string on lihtsalt char *, mis on viit tüüpi. Nii et see saab olema 4 baiti. Nii et need kolm on kõik 4 baiti. Nüüd sõlme ja õpilane on natuke keerulisem. Nii vaadeldes sõlme ja õpilane, siis näeme, sõlme täisarv ja pointer. Ja õpilane on kaks vihjeid sees on. Nii vähemalt meie puhul siin, kuidas et me lõpetame suuruse arvutamisel see struct on lihtsalt liita kõik mis seal sees struct. Nii sõlme, meil on täisarv, mis on 4 baiti. Meil on pointer, mis on 4 baiti. Ja nii üks sõlm läheb asuda 8 baiti. Ja samamoodi üliõpilane, meil on pointer, mis on 4 baiti ja teine pointer, mis on 4 baiti. Nii et läheb lõppu up on 8 baiti. Nii sõlme ja õpilane on 8 baiti. Ja need kolm on kõik 4 baiti. Küsimused, mis? Jah. Publik: Kas see oli 64-bit arhitektuur, kas see kahekordistada neid kõiki? ROB BOWDEN: See ei tooks kahekordistada neid kõiki. Nii 64-bitine arhitektuur, seda jällegi muutusi, mis põhiline asi, mis pointer on nüüd 64 bitti. Jah. Nii osuti on 8 baiti. Nii et need, kes olid 4 baiti saab olema 8 baiti. Õpilane, kes oli kaks suunanäitajaks, Noh, nüüd siis läheb olema 8 baiti, 8 baiti. See saab teha 16 baiti. Aga tipp on veel 4 baiti. Nii et see osuti läheb olema 8 baiti. See on 4 baiti. Nii sõlm on ainult kavatse olema 12 baiti. Muid küsimusi, et üks? Nii kõrval üks, on need HTTP olekud. Ja siis tuli kirjeldada asjaolusid mille alusel need võivad tagastatakse Teile. üks probleem, et ma kuulsin mõned õpilased on see, et nad püüdsid teha vead on kliendi lõpuni. Nii et kui me püüame teha taotluse server, midagi läheb valesti meie lõpp. Aga üldiselt on need koodid tagastatakse serveri poolt. Nii et me tahame teada, mis toimub vale või õige server, mis põhjustab neid asju tagasi. Miks võiks server naaseb staatuse kood 200? Kõik mõtted? Jah. Seega midagi edukalt taotlus läbis. Ja nad naasta mida sa palusid. Nii et kõik on korras. Aga 302 leitud? Jah. Publik: server otsisin mida sa soovisid. Aga ta ei suutnud seda leida. Nii et seal on viga. ROB BOWDEN: Nii server oli otsin, mida sa tahtsid. Nii lihtsalt vaadates siin, 302 leidis, see oli võimalik leida. Publik: Mul on kahju. Leitud tähendab, et nad ei leia ta. Vabandust. ROB BOWDEN: So 302 found. Server on võimalik leida mida sa tahtsid. Publik: Aga see ei näita seda? ROB BOWDEN: vahe Selle 302 ja 200, et see teab, mida sa tahad. Aga see ei ole täpselt, kus sa tahtsid küsida. Nii 302 on tüüpiline suunata. Nii sa soovisid lehel. Ta teab, oh, ma tahan tagasi sulle selle. Aga see on erinev URL. Nii hei, mida sa tegelikult tahad seda. DAVID J. Malan: See on tükk, mis ütles et andsime teid suunata funktsioon, mida kasutatakse päises funktsioon mis omakorda trükkida asukoht käärsoole ja seejärel URL millele soovite keelduda kasutaja. Isegi kui sa ei näe 302 selgesõnaliselt seal, et on, mida PHP oleks maagiliselt sisestada nagu päises öelda täpselt, mida Rob ütles, et - leitud. Aga mine parem siia. ROB BOWDEN: OK. Nii et kuidas 403 keelatud? Publik: Ma arvan, et see, et server Põhimõtteliselt ütleb, et klient ei pääse kodulehekülg. ROB BOWDEN: Nii et jah. Noh, tüüpiline vastus olime oodates on midagi, failid ei chmodded sobivalt. See on ilmselt põhjus, millistel tingimustel nägid neid. Aga seal on üks põhjus, et klient võiks olla viga siin. Seal on tegelikult veel status code - 401. Nii et need on väga sarnased. 401 on lubamatu. Ja 403 on keelatud. Ja nii volitamata sa ainult saada, kui sa pole sisse logitud Aga logides võib tähendada et teil on õigus. Aga kui sa oled juba sisse loginud ja te veel ei ole luba, siis saab ka keelatud. Nii et kui te olete sisse logitud ja ei ole loata keelatud on ka midagi saad. DAVID J. Malan: ja mehhanismiga, kus need probleemid on tavaliselt lahendatud serveris on kaudu, mida käsk? Chmod, kui see on tõepoolest õigused väljastada faili või kataloogi. ROB BOWDEN Siis 404 ei leitud. Jah. Seega erinevalt 302, kus ei ole täpselt kus sa palud, kuid ta teab, mida sa tahad, see, see lihtsalt on ei tea, mida sa tahad. Ja sa ei ole esitanud midagi kehtiv. 418 Ma olen teekann ja seejärel 500 internal server. Miks võiks sa selle said? Nii segfault - Ma tegelikult ei tea, liigitamine standard eest. Aga kui teie PHP kood oli midagi vale see, teoreetiliselt võiks see tegelikult segfault, mispuhul see 500 internal server error, midagi viga on serveri konfiguratsioonis. Või seal on süntaksi viga Sinu PHP koodi. Või midagi halba juhtub. DAVID J. Malan: Me ei vaata segfault väheste inimeste vastuseid. Ja tehniliselt, see võib juhtuda. Aga see oleks PHP programm kirjutatud teiste inimeste poolt, tegelikult GDB, mis ainult siis, kui need inimesed, silmamunad ja kirjutas lollakas kood nende tõlk oleks PHP ise segfault. Nii et kuigi 500 on nagu segfault vaimus, see on peaaegu alati tulemusena konfiguratsioonifailis küsimus oma veebi server või kui Rob ütles süntaksi nagu sa ei sulgenud tsiteerida. Või sa kaotasid semikooloniga kusagil. Publik: Nii Shuttle pset, I arvan, et kui ma seda tegin, kui ma klõpsatud brauseri, kuid midagi tuli, mida nad nimetasid valge leht. Aga see oli, sest kood. Ma arvan, et see oli JavaScript, eks? ROB BOWDEN: Jah. Publik: Kas see viga veel tulla? ROB BOWDEN: Nii et te ei oleks saanud see viga, sest kõik veebiserverisse seisukohast oli täiesti korras. Aga sa soovisid index.html. Sa taotles shuttle.js ja service.js. Ja ta suutis edukalt naasta et te kõik need asjad - 200. OK. See on ainult siis, kui brauseri proovinud tõlgendada JavaScript koodi, mis See on nagu, oota, see ei ole kehtiv JavaScript viga. Muid küsimusi? Hea küll. DAVID J. Malan: Nii et järgmine up oli number 11. Ja 11 oli kõige hirmutavam jaoks palju inimesi. Nii et kõige tähtsam on tähele panna siin oli, et see oli tõepoolest umbes kahekordselt seotud nimekirja. Kuid see ei olnud sama, mis eelmisel aastal kahekordselt seotud nimekirja probleemid, mis ei anna teile hoiatus, et nimekirja võib tegelikult olla sortimata. Niisiis asjaolu, et nimekiri oli sortimata ja asjaolu, et see sõna oli rõhutati seal pidi edasi et see on tegelikult lihtsustamise mis muidu oleks olnud keerukam probleem ja pikem. Nii üldine viga siin oli pidanud eelmise aasta lahendus teie üks piipar ja siis lihtsalt pimesi kopeerida, et alla kui vastus, mis on õige vastata teistsugune küsimus sarnase sisuga. Aga peensusi siin olid järgmised. Nii et üks, oleme sõlme deklareeritud ja määratletud tavapärasel viisil siin. Siis määratletud loetelu olla globaalne pointer lähtestatud tühjaks. Siis ilmselt, seal on kaks funktsiooni meil prototüüpe siia, sisesta ja eemaldada. Ja siis on meil mõned proovi kood siia teeme hunnik sisestamisel. Ja siis me palume teil täita rakendamise sisesta allpool sellistes nii, et see lisab n viiakse nimekiri pidevas ajal rõhutas ka, isegi kui see on juba olemas. Nii ilu on võimalik sisestada konstantse ajaga on see, et see tähendab, et teil sisestada uus sõlm, kus? Into ees. Seega kaob õnneks vähemalt üks juhtudel oli varem vaja isegi rohkem rida koodi, nagu ta tegi, eelmisel aastal ja ka klassi kui me rääkisime läbi selline asi inimestega ning mõned suuline pseudo kood. Nii et lahendus siin, lähme vahele jätta selle lihtsalt on silmaga ekraanil. Pange tähele, et me teeme järgmine. Ja ka teate muid lihtsustusi oli, et isegi juhul, kui see juba olemas, nii et see tähendab, isegi kui number on juba olemas, saate lihtsalt pimesi lisada veel koopia. Ja see ka, pidi olema lihtsustamist, et saaksite keskenduda tõesti, mõned rohkem intellektuaalselt huvitav osa ja mitte ainult mõned täiendavad veakontrollifunktsioon arvestades piiratud aja jooksul. Nii et selles proovis lahendus, me eraldada kursor vasakul küljele siin sõlme. Nüüd mõistan, et pointer, kuna Rob ütles, on ainult 32 bitti. Ja see ei ole tegelikult sisaldavad aadress, kuni olete anna see aadress. Ja me teeme seda on paremal side kaudu malloc. Nagu hea kodanik, siis kontrollige, et malloc pole tegelikult null, nii et me ei kogemata tekitada segfault siin. Ja iga kord, kui kasutate malloc elus, siis peaksid olema kontrollimiseks null, muidu teil on peen viga. Siis initsialiseerida et null poolt määrates n ja eelmisele või järgmisele. Ja selles asjas, ma initsialiseerida Varasemates null, sest see uus sõlm saab olema uus alguses minu nimekirjas. Nii et see saab olema midagi enne seda. Ja ma tahan, et sisuliselt lisada olemasolevat loendit uue sõlme poolt milles järgmine võrdne nimekirja ise. Aga ma ei teinud veel. Nii et kui nimekiri iseenesest juba olemas, ja seal oli vähemalt üks sõlm juba olemas, kui see on loendis siin ja ma lisada uus sõlm siin, ma on vaja veendumaks, et mu endine sõlme juhib tagasi minu uus sõlm, sest see on jällegi kahekordselt seotud nimekirja. Nii et me meelerahu vaadata. Kui nimekirjas ei ole null, kui seal on juba ühe või enama sõlme seal, siis lisada, et tagasi antud nii rääkida. Ja siis väga viimane asi, me peame teha, on tegelikult uuendada ülemaailmse muutuv nimekiri ise juhtida selle uue sõlme. Jah. Publik: In pointer nool [Kuuldamatu] võrdub null, siis kas see tegelema nimekirja, sest Nimekiri on null? DAVID J. Malan: Ei. See on lihtsalt minu on ennetavalt ettevaatlik, sest kui see on minu Algset nimekirja võibolla veel mõned sõlmed siin ja ma olen lisades minu uus sõlm siin, seal saab olla midagi siin. Ja ma tahan, et lüüa, et idee seades enne null kohta uus sõlm. Ja arvatavasti, kui minu kood on õige ja ei ole muud võimalust lisada sõlmed peale seda funktsiooni, arvatavasti, isegi kui nimekiri on juba üks või rohkem tippe see arvatavasti nimekirja esimene sõlm, oleks eelmine osuti null ise. Publik: Ja just järelkontrolli. Põhjus paned kursori järgmise võrdsete Nimekiri on sa üritad pointer Enne nimekirja, et see osutab teisele, ma arvan - Ma ei - lihtsalt nimekirjad? DAVID J. Malan: Täpselt. Ja olgem tegelikult kaaluda kahel juhul siin tõesti, kuigi et me kaaluda neid ei ole üsna sama koodi. Aga kõrge tase, kui see on loetleda ja see on 32-bitine pointer, lihtsam stsenaarium et see on null vaikimisi. Ja arvan, et ma tahan lisada number 50 oli esimene number. Ma lähen edasi minna ja eraldama sõlm, mis läheb sisaldavad kolmes valdkonnas - n, eelmine ja järgmine. Ma panen number 50 siin, sest see on n. See saab olema järgmine. Ja see saab olema eelmisest. Ja mida ma pean tegema sel juhul? Noh, ma olen lihtsalt teinud line 1 siin. Pointer n saab n. Ma siis ütlesid eelmine peaksid null. Nii et see saab olema null. Siis ma lähen ütlen järgmise ei hakka nimekirja. Ja see lihtsalt toimib hästi. See on null. Ja nii ma ütlen, uus sõlm järgmise valdkonnas peaks saama see, mis see on. Nii et paneb teise null seal. Ja siis viimane asi, Ma ei vaadata siin. Kui loetelu ei ole võrdne null, kuid see võrdub null, nii et me vahele, et täielikult. Ja nii ma järgmisena teha on nimekiri muutub pointer, mis piltlikult tulemuseks pilt selline. Nii et üks stsenaarium. Ja see, mida sa küsisid konkreetselt on olukord selline, kus meil on juba ühe sõlme nimekirja. Ja kui ma olen läinud tagasi üles originaal Probleem avaldus, järgmine meiepoolsete sisestada sõna on 34, lihtsalt huvides arutelu. Nii et ma lähen lihtsalt mugavalt Joonistame selle siia. Ma olen lihtsalt malloced. Oletame Ma kontrollin for null. Nüüd ma lähen initsialiseerida n olema 34. Ja see on n. See saab olema järgmine. Ja see saab olema eelmisest. Teeme kindlaks, et ma ei teinud seda saada see tagasi. Eelmine esikohal aastal definitsiooni. Las ma lahendan selle. See eelmine. See on järgmine. Isegi kui need on identsed, Jätame selle järjepidev. Eelmine. See on järgmine. Nii et ma olen lihtsalt malloced minu märkus, kontrollitud for null, määrati 34 arvesse sõlme. Eelmine muutub null. Nii et annab mulle. Järgmine saab nimekirja. Nii nimekiri on järgmine. Nii et see on sama, nüüd nagu joonistus see nool, et nad viitavad ühe aastal sama. Ja siis ma kontrollin, kas nimekirja ei ole võrdne null. Ja see ei ole see aeg. Siis ma teen nimekirja eelmine muutub kursor. Nii nimekiri eelmine muutub PTR. Nii et see on toime pannes graafiline nool siin. Ja see muutub vähe laineline liinid. Ja siis lõpuks, ma värskendan list käsk pointer. Nüüd see viitab see kutt. Ja nüüd, teeme kiire Psüühikavise. Siin on nimekiri, mis on globaalse muutuja. Esimene sõlm on tõepoolest 34, sest Ma pärast noolt. Ja see on õige, sest ma tahan sisestada alguses nimekirja kõik uued tipud. Tema järgmine valdkonnas paneb mind seda meest. Kui ma käiks, ma tabanud kõrval on null. Seega ei ole enam nimekirjas. Kui ma tabanud eelmisel ma saan tagasi, kui ma oodata. Seega on veel mõningaid näpunäiteid, Ilmselt manipuleerida. Aga see, et sa olid rääkinud, mida teha see pidev aeg tähendab, et sa ainult on hulga asju olete lubatud teha. Ja mis see number? See võib olla üks samm. See võib olla kaks. See võib olla 1000 sammu. Aga see on piiratud, mis tähendab, et sa ei saa on mingeid silmukoiminen toimub siin, rekursioon, ei silmuseid. See on lihtsalt pean olema kodeeritud read koodi, mis meil on selles proovis. Nii et järgmine probleem 12 palus meil täielik rakendamine eemalda Allpool sellisel viisil, et see eemaldab n nimekirjast lineaarne aeg. Nii et teil on veidi rohkem kõigutama tuba nüüd. Võite eeldada, et n, kui see on olemas loendis on kohal mitte rohkem kui üks kord. Ka see on mõeldud viktoriin põhinev lihtsustada eeldusel, et et kui sa leiad number 50 kusagil nimekirjas, siis ei ole ka pea muretsema jätkates itereerima, otsin kõikvõimalikke koopia 50, mis oleks lihtsalt vaimule mõnda minutia piiratud aja jooksul. Nii eemaldada, see oli kindlasti keerukamaks ja rohkem koodi kirjutada. Aga esmapilgul, ausalt, see võib vaata valdav ja nagu midagi ei ole nii, siis võiks olla tulla on viktoriini. Aga kui me keskendume sammud, Loodetavasti äkki leida, et iga individuaalse samme teeb selge mõistus tagantjärele. Võtame vaata. Nii et esimene, me initsialiseerida pointer olema nimekirja ise. Sest ma tahan lineaarne aeg, et vahendid Ma lähen on mõned loop. Ja levinum viis Käi sõlmede nimekiri struktuur või mis tahes struktuuri korduvalt on võtta kursor ees andmeid struktuur ja seejärel lihtsalt alustada ajakohastamine see ja kõndida oma teed kaudu andmete struktuuri. Nii et ma teen just nii. Kuigi pointer, mu ajutine muutuja, ei ole võrdne null, olgem minna ja vaadata. Kas ma saan õnnelik? Kas n valdkonnas sõlme Olen praegu vaadates võrdne number Otsin? Ja kui nii, teeme midagi. Nüüd märka seda, kui tingimus ümbritseb kogu järgmine rida koodi. See on ainuke asi, millest ma hoolin - leida number küsimus. Seega pole muud, mis lihtsustab asjad kontseptuaalselt natuke. Aga nüüd sain aru, ja te võib-olla ainult seda mõistnud pärast mõtlemine läbi veidi, seal on tegelikult kahel juhul siin. Üks on see, kui sõlm on loetelu alguses, mis on natuke tüütu, sest see on eriline juhtum, sest sa pead tegelema see asi, mis on ainus anomaalia. Kõikjal mujal nimekirjas, see on sama asi. Seal eelmine sõlme ja järgmise sõlm, eelmine tipp, järgmine sõlme. Aga see mees on veidi eriline kui ta alguses. Nii et kui osuti võrdub nimekiri ise, nii et kui ma alguses nimekirja ja leidsin n, ma vajan teha paar asja. Üks, mul on vaja muuta nimekirja juhtida järgmisele väljale, 50. Olgu, oletame, et ma üritan eemaldada 34. Nii et see mees peab minema ära vaid hetk. Nii et ma ütlen, nimekiri saab pointer kõrval. Noh, see on osuti. Järgmine on suunaga siia. Nii et see on muutumas see nool paremale nüüd käsk see kutt siin. Nüüd, pea meeles, on meil ajutise muutuja. Nii et me ei ole orvuks iga sõlmede sest mul on ka see kutt minu rakendamise eemalda. Nüüd, kui nimekiri ei ole iseenesest null, Mul on vaja määrata natuke midagi. Ma pean nüüd veenduda, et see nool, mis on eelnevalt osutades 50-34, see on saanud ära minna, sest kui ma üritan lahti saada 34, 50 oli parem ei säilita objekti tagasi viite seda Nool soovitas. Tegin seda joont. Siis ma olen teinud. See juhtum on tegelikult üsna lihtne. Tükeldamise off eesotsas nimekirja on suhteliselt lihtne. Kahjuks pole seda tüütu teine ​​plokk. Nüüd pean ma kaaluma võimalust kui on midagi keskel. Aga see ei ole liiga kohutav, välja arvatud süntaksi niimoodi. Nii et kui ma ei ole alguses nimekirja, ma olen kusagil keskel. Ja seda joont siin ütleb, start ükskõik sõlme sa oled. Eelmise sõlme järgmisele väljale ja punkt, et kursor. Teeme seda piltlikult. See oli saada keeruline. Nii et kui mul eelmine väljad siin - teeme seda - järgmise valdkondades siin. Ma lähen, et lihtsustada oma suunanäitajaks pigem kui teha terve hunnik asju edasi ja tagasi crisscrossing üksteist. Ja nüüd, ütleme lihtsalt, et see on 1, 2, 3 pärast arutelu, isegi kuigi see ei ole ühel joonel kõnealuse probleemi. Nii et siin on minu seotud nimekirja. Püüan eemaldada kaks selles konkreetse versiooni loost. Nii et ma olen uuendatud kursor osutades seda meest. Nii et see on PTR. Ta osutab siin. See on nimekiri, mis on olemas maailmas kui enne. Ja ta osutab siin ükskõik mida. Ja nüüd, ma üritan eemaldada kaks. Nii et kui osuti osutab siin, ma olen kavatse järgida ilmselt eelmine pointer, mis paneb mind 1. Ma siis ütlen, et järgmine valdkonnas, mis toob mind üle selle kasti siin, läheb võrdne pointer kõrval. Nii et kui see pointer, see on järgmine. See tähendab, et see nool vajadustele osutada seda meest. Mis siis, et koodirida on lihtsalt teha on natuke seda. Ja nüüd on see näeks välja nagu samm õiges suunas. Me sisuliselt tahad Lõigata 2 välja Lähis 1 ja 3. Seega on loogiline, et me tahame tee seda pointer ümber. Nii et see järgmine rida on kontrollida, kas osuti Järgmine ei ole null, ei tõesti keegi paremal 2, see tähendab, et me peame tegema veidi lõikama siin. Nii et ma nüüd vaja jälgida seda pointer ja värskendada eelmise osutiga see poiss teha natuke vastukaalu siin punkt siin. Ja nüüd, visuaalselt see on kena. See on natuke segane, et seal on keegi osutades 2 enam. 2 on suunaga vasakule. Ja 2 on suunatud paremale. Aga ta saab teha mida iganes ta tahab, sest ta on umbes saada vabaks. Ja see ei ole oluline, mida need väärtused on enam. Oluline on see, et ülejäänud poisid suunamises üle ja alla teda nüüd. Ja tõepoolest, see on, mida me teha. Me vaba pointer, mis tähendab, et me öelda operatsioonisüsteem, olete teretulnud nõuda seda. Ja siis lõpuks, me tagasi. Else kaudselt, et kui me pole veel tagasi tulnud, meil hoida otsin. Nii pointer võrdub pointer kõrval lihtsalt tähendab liikuda see kutt siin. Viige see mees siin. Viige see mees siin, kui tegelikult me ei leidnud number me otsime veel. Nii öeldes, tundub täiesti masendavalt, ma arvan, et esimesel lühidalt, eriti kui sa võitlesid Selle viktoriini ajal siis vaata midagi sellist. Ja sa pat ise tagaküljel. Noh, seal on kuidagi ma võiks olla tulla, et viktoriini. Aga ma väidan, võite, kui sa murda see jaguneb individuaalse juhtudel ja lihtsalt läbi minema hoolikalt, kuigi, tõsi, alla stressi tingimustes. Õnneks pilt tehtud kõik õnnelikumad. Sa võid teha seda väga mitmel viisil. Sa ei pea tegema crisscrossing asi siin. Sa võid seda teha otse read niimoodi. Kuid põhisisu on see probleem Üldiselt oli aru saada, et pilt lõpuks peaks vaatama natuke midagi sellist, sest pidev aeg mõista, et te ei hoia segamise ja segamise ja segamise sõlmede alguses nimekirja. Kas on küsimusi? Tõenäoliselt on kõige keerulisem kindlasti kodeerimine küsimusi. Publik: Nii on nimekiri sarnane pea eelnevates näidetes. DAVID J. Malan: Täpselt nii, täpselt. Just teine ​​nimi globaalne muutuja. Ülemaailmne mida? ROB BOWDEN: OK. Nii et see on see, kus sa tuli kirjutada lõik. Mõned inimesed kirjutasid esseesid Selle küsimuse. Aga sa lihtsalt vaja kasutada neid kuue tingimused kirjeldada, mis juhtub siis, kui üritate ühendust facebook.com. Nii et ma lihtsalt rääkida läbi protsessi kasutades kõiki neid tingimusi. Nii meie brauser, me kirjutame facebook.com ja vajuta Enter. Nii et meie brauseri kavatse ehitada HTTP taotluse, et see läheb talle läbi mõned protsessi Facebook eest Facebook vastata meile HTML oma lehele. Mis on protsess, mis HTTP taotluse tegelikult saab Facebook? Nii et kõigepealt peame tõlkima Facebook.com. Nii lihtsalt antud nimi Facebook.com, kus tegelikult teeb HTTP taotluse on vaja minna? Seega peame tõlkima Facebook.com IP aadress, mis üheselt määratleb, mida masin me tegelikult soovite saata see palve. Teie sülearvuti on IP-aadress. Midagi ühendatud internetti on IP-aadress. Nii DNS, Domain Name System, mis on mis hakkab tegelema tõlge alates facebook.com et IP-aadress, mida sa tegelikult soovid ühendust luua. Nii et me ühendust DNS serverite ja ütleme, mis on facebook.com? Ta ütleb, oh, see on IP aadress 190,212 midagi, midagi, midagi. Hea küll. Nüüd ma tean, mida masin Tahan pöörduda. Nii siis saatke oma HTTP taotluse üle, et masin. Niisiis, kuidas see saada, et masin? Noh, et taotlus läheb ruuter ruuter kopsakas. Mäleta näiteks klassis, kus me tegelikult nägime marsruuti paketid võttis kui üritasime suhelda. Me nägime seda hüpata üle Atlandi Ocean ühel hetkel või mis iganes. Nii eelmise koosseisu port. Nii et see on nüüd arvutis. Sul võib olla mitu asja praegu suhtlemine internetis. Ma võin olla töötab, ütleme, Skype. Ma võib-olla veebibrauser lahti. Ma võib-olla midagi, mis torrenting faile. Nii et kõik need asjad on suhtlemisel internet mingil moel. Seega, kui arvuti saab mõned andmed Internetist, kuidas see tean, mida rakendus tegelikult tahab andmed? Kuidas ta teab, kas see konkreetne andmed on mõeldud torrenting taotlus erinevalt veebibrauser? Nii et see on eesmärk sadamad et kõik need taotlused on väitis port arvutis. Nii oma veebilehitseja ütleb, hei, Ma kuulan Sadama 1000. Ja teie torrenting programm ütleb, Ma kuulan Sadama 3000. Ja Skype ütleb, ma kasutan port 4000. Nii et kui saad mõned andmed, mis kuulub et üks neist taotlused, andmed on tähistatud mis port see tegelikult tuleks saata mööda. Nii et see ütleb, oh, ma kuulun sadamasse 1000. Ma tean, siis ma pean edastada käesolev mööda minu veebibrauser. Seega põhjus, miks ta on siin oluline on see, et veebiserverite kipuvad kuulata port 80. Nii et kui ma ühendust Facebook.com, ma olen suheldes mõned masin. Aga ma pean ütlema, mis sadamas, et masin tahan suhelda. Ja veebiserverite kipuvad olema kuula port 80. Kui nad tahavad, võivad nad määrata selle nii, et nimekirjades Sadama 7000. Ja siis veebibrauser, suutsin käsitsi tippida Facebook.com: 7000 Kirjuta taotluse port 7000 Facebook veebiserver. DAVID J. Malan: Ja sel juhul, isegi kuigi me ei nõua, et inimesed mainida seda, et käesolevas asjas, mis port oleks taotluse tegelikult minna? Proovi uuesti. Täpselt. Ei tunne, aga teravmeelsus et seal ükski eelmine. ROB BOWDEN: Nii HTTPS, sest see on kuulamise spetsiaalselt krüpteeritud, see on port 4430. Publik: Ja kirju on 25, eks? DAVID J. Malan: väljaminev e-25, eks. ROB BOWDEN: Ma ei tea isegi enamik - kõik alumised kalduvad olema reserveeritud asju. Ma arvan, et kõik alla 1024 on reserveeritud. Publik: Miks sa ütlesid 3 oli vale number? ROB BOWDEN: Sest IP-aadress, seal on neli rühmituste numbrit. Ja nad on 0-255. Nii 192.168.2.1 on ühine kohaliku võrgu IP-aadress. Teate kõik need on vähem kui 255. Nii et kui ma alustasin 300, et ei saanud olla olnud üks numbrid. DAVID J. Malan: Aga rumal clip alates - see oli CSI, kus nad olid number, mis oli liiga suur jaoks IP-aadress. ROB BOWDEN: Kas on küsimusi selle kohta? Järgmise üks, nii et täielik muutus teema, kuid meil on see PHP massiivi maja quad. Ja meil on ebakorrapärane nimekirja. Ja me tahame välja trükkida iga loendiüksusest lihtsalt sisaldav maja nime. Nii et meil on foreach silmus. Seega pidage meeles, süntaks on foreach massiivi elemendi massiivist. Nii läbi iga iteratsiooni loop, maja läheb võtma ühel väärtused sees massiivi. On esimene esitus, maja on Cabot House. On teise korduse maja olema Courier House ja nii edasi. Nii iga quad nagu maja, me oleme lihtsalt trükkimineku - sa ka oleks kordas - Nimekirja objekt ja siis maja nimi ja sulgege nimekirja objekt. Lokkis traksid on vabatahtlik siin. Ja siis ütles ka küsimus ise, mäletan sulgeda Tavalise nimekirja tag. Seega on meil vaja, et väljuda PHP režiim et seda teha. Või oleksime korratud sulgeda Tavalise nimekirja tag. DAVID J. Malan: Ka trahv oleks siin olnud võimalik kasutada vana kooli loop koos $ i = 0 0 ja kasutades arvu, nuputada pikkus ray. Täiesti trahvi ka, lihtsalt vähe wordier. Publik: Nii et kui te ei kavatse [Kuuldamatu] sa teeksid - Ma unustan, mida loop [kuuldamatu] on. Kas sulle $ quad sulg i? DAVID J. Malan: Täpselt. Jah, täpselt. ROB BOWDEN: Midagi veel? DAVID J. Malan: Olgu. Kompromisse. Nii oli kobarad vastused võimaldab igal neist. Me olime tegelikult lihtsalt otsin midagi kaalukaid positiivseid ja negatiivsed. Ja number 16 küsis kinnitamise kasutajate input kliendipoolse, nagu JavaScript, asemel server-side, nagu PHP. Mis on tagurpidi teeme kliendipoolse? Noh, üks asi, mida me kavandatud on teil vähendada latency, sest sa ei pea vaeva ühendust server, mis võib kesta mõne millisekundit või isegi paar sekundit vältides selle ja lihtsalt kinnitamise kasutajate panus kliendipoolse vallandada on-esitab käitleja lihtsalt kontrollisin, kas nad tüüp midagi ette nime? Kas nad kirjuta midagi aastal e-posti aadress? Kas nad valida ühiselamus alates rippmenüüst? Võite anda neile hetkeline tagasiside kasutades gigahertsi arvuti või mis iganes nad on, et see on tegelikult oma kirjutuslaud. Nii et see on lihtsalt parem kasutaja tekib tavaliselt. Aga negatiivne külg kliendipoolse valideerimine, kui sa seda ilma ka tee server-side valideerimine et Kõige keegi sealt välja CS50 teab et saate saata andmeid soovite Lisa server tahes mitmel viisil. Ausalt, enamik iga brauseriga saab kliki ringi seaded ja lihtsalt lülitage JavaScript, mis oleks seega keelata igasugune valideerimist. Aga sa ka võiks meenutada, et isegi mina tegin mõned kauge asjad klassi kasutades telnet ja tegelikult teeskleb olema brauseri saates get taotlused server. Ja see on kindlasti mitte mis kasutavad mis tahes JavaScript. See on lihtsalt minu kirjutades käske kell klaviatuuri. Nii et tõesti, iga programmeerija jooksul piisavalt Mugavus veebi ja HTTP võib saata mis tahes andmeid ta soovib et server ei valideerimist. Ja kui teie server ei ole ka kontroll, Kas nad ei anna mulle nimi on see tegelikult kehtiv e-posti aadress, tegi nad valivad ühiselamus, võite end üles sisestamist võlts või lihtsalt tühjaks andmed oma andmebaasi, mis tõenäoliselt ei kavatse olla hea, kui sa eeldada, et see oli seal. Nii et see on tüütu reaalsus. Aga üldiselt, kliendipoolse valideerimine on suur. Aga see tähendab, kaks korda nii palju tööd. Kuigi seal on küll olemas eri raamatukogud, JavaScript raamatukogud Näiteks, et muuta see palju, palju vähem peavalu. Ja saate kasutada osa kood server-side, kliendipoolse. Aga saan aru, et see on tavaliselt lisatööd. Jah. Publik: Nii et kui me lihtsalt ütles vähem turvaline - DAVID J. Malan: [naerab] Ugh. Need on alati raskem need lahendada. ROB BOWDEN: See oleks on heaks kiidetud. DAVID J. Malan: Mis on? ROB BOWDEN: lõin selle probleemi. See oleks heaks kiidetud. DAVID J. Malan: Jah. Publik: Cool. ROB BOWDEN: Aga me ei nõustu jaoks esimene - hästi, mida me otsime, on midagi sa ei pea serveriga suhelda. Me ei nõustu lihtsalt kiiremini. Publik: Mis ei lae leht uuesti? ROB BOWDEN: Jah. See oli heaks vastuse. DAVID J. Malan: Midagi, kus me tundsime see on tõenäolisem kui ei ole tõenäoline, et sa tead, mida sa olid öeldes, mis on karm line teha mõnikord. Kasutades seotud nimekirja asemel massiivi säilitada järjestatud nimekirja täisarvud. Nii pea me tihti tsiteerivad lingitud nimekirju, mis ajendas oma kogu sissetoomine saad dünaamilisust. Nad võivad kasvada. Nad võivad väheneda. Nii et sa ei pea hüpata läbi kõvadele tegelikult luua rohkem mälu massiivi. Või sa ei pea lihtsalt ütlevad, sorry, kasutaja. Massiiv on täis. Nii dünaamiline kasv nimekirja. Puuduseks aga on seotud nimekirjad? Publik: See on lineaarne. Otsin seotud nimekirja on lineaarne selle asemel, mida sa sisse logida DAVID J. Malan: Täpselt. Otsin ahelloend on lineaarne, isegi kui see on järjestatud, sest sa võid vaid järgige neid leivapuru, need viiteid, alates algust nimekirja lõpuni. Sa ei saa võimendada muutmälu ja seega, binaarne otsing, isegi kui see on sorteeritud, et sa võiksid teha massiiv. Ja seal on ka teine ​​hind. Jah. Publik: Memory ebaefektiivne? DAVID J. Malan: Jah. Noh, ma ei pruugi öelda ebaefektiivne. Aga see ei maksa teile rohkem mälu, sest sa pead 32 bitti iga sõlm täiendavaid pointer kell vähemalt ühekaupa seotud nimekirja. Nüüd, kui sa oled ainult ladustamiseks täisarvud ja olete lisatud pointer, see on tegelikult selline mitte-triviaalne. See kahekordistada mälu. Aga tegelikult, kui sa oled ladustamiseks seotud nimekirja structs, millel võib olla 8 baiti, 16 baiti veel kui, et äkki see on vähem ja piirkulu. Aga see kulu sellegipoolest. Nii kumbki neist oleks pidanud olnud trahvi varjuküljed. 18. Kasutades PHP C asemel kirjutada käsurea programm. Nii et siin, see on tihti kiirem kasutada keeles nagu PHP või Ruby või Python. Sa lihtsalt kiiresti avada tekstiredaktor. Teil on palju rohkem funktsioone teile kättesaadavaks. PHP on köögi kraanikauss funktsioone, kusjuures C, siis on väga, väga vähe. Tegelikult mehed teavad raske tee et sa ei pea hash tabeleid. Sul ei ole seotud nimekirju. Kui soovid neid, siis pead rakendada neid ise. Nii et üks tagurpidi PHP või tegelikult mis tahes tõlgendada keel on kiirust millega saab kirjutada koodi. Aga negatiivne külg, nägime seda, kui ma kiiresti vahustatud up misspeller rakendamine loeng kasutades PHP, on et kasutades tõlgendada keel Tavaliselt on aeglasem. Ja me nägime, et silmnähtavalt koos suureneb aega 0,3 sekundit 3 sekundit, sest tõlgendamise mis tegelikult juhtub. Teine tagurpidi oli, et sa ei pea koostama. Nii see ka kiirendab arengut muide, sest sa ei pea kaks sammu töötab programm. Sul on ainult üks. Ja nii see on päris mõjuvad samuti. Kasutades SQL andmebaasi asemel CSV-faili andmete talletamiseks. Nii SQL andmebaasi kasutatakse pset7. CSV faile ei kasuta palju. Aga sa seda kasutanud kaudselt pset7 kui hästi, rääkides Yahoo Finance. Aga CSV on nagu Exceli faili, kuid super lihtne, kus veerud on lihtsalt demarked komadega sees muidu tekstifaili. Ja kasutades SQL andmebaas natuke selgem. See on pea peale, sest sa saad asju nagu valida ja lisada ja kustutada. Ja sa saad arvatavasti, indeksid, mis MySQL andmebaasi ja teiste andmebaaside, nagu Oracle, ehitada teid mälu, mis tähendab, et teie valige ole ilmselt saab olema lineaarne ülevalt alla. See on tegelikult saab olema midagi nagu binaarne otsing või midagi sarnase sisuga. Nii nad tavaliselt kiiremini. Aga negatiivne külg on see, et see on lihtsalt rohkem tööd. See on rohkem vaeva. Sa pead aru saama andmebaase. Sa pead seda seadistada. Peate server käivitada et andmebaas. Sa pead aru saama, kuidas seda seadistada. Nii et need on vaid need liiki kompromisse. Arvestades CSV fail, saab luua seda gedit. Ja sa oled hea minna. Pole mingit keerukust kaugemale. Kasutades Prefiksipuu asemel hash tabel eraldi sõiduahelate salvestada sõnastik sõnu meenutab kohta pset5. Nii püüab tagurpidi teoreetiliselt vähemalt on mis? Pidev aega vähemalt juhul, kui sa oled segamist iga üksiku tähed sõna, nagu te võib-olla võtta pset5. See võib olla viis hashes kuus hashes kui seal on viis või kuus tähed sõna. Ja see on päris hea. Ja kui seal on ülemine piir, kuidas kaua teie sõnad olla, see tõepoolest asymptotically pidevalt aega. Arvestades hash tabelis eraldi ühendamine, probleem on selle millist andmestruktuuri on, et täita oma algoritme tavaliselt sõltub paljudest asjadest juba andmestruktuur. Ja see on kindlasti puhul ketid, kusjuures rohkem asju paned arvesse hash tabel, enam neid ketid minna, mis tähendab, et halvimal juhul asi võite olla otsivad kõik on kuidagi lõpuks üks ketist, mis tõhusalt devolves midagi lineaarne. Nüüd tegelikkuses võiks see absoluutselt juhtuda, et hash tabel ketid on kiirem kui vastav Prefiksipuu rakendamist. Aga see on erinevatel põhjustel, sealhulgas mis üritab kasutada kogu palju mälu, mis võib tegelikult aeglane asju maha, sest sa ei saa kena kasu, mida nimetatakse vahemälu kus asjad, mis on lähestikku mälu saab tutvuda sageli kiiremini. Ja mõnikord võib tulla tõesti hea hash funktsiooni. Isegi kui teil on raisata natuke mälu, siis võib tõepoolest olla võimalik leida asju kiiresti ja ei nii halb, kui lineaarselt. Nii lühike, ei olnud tingimata mõni neist ühe või isegi kahe konkreetsed asjad, mida me otsisime. Tõesti midagi veenev kui positiivseid kui negatiivseid üldiselt on püütud meie silma. ROB BOWDEN: Nii pea, tegime ei võta oma "kiiremini." Sa oli öelda midagi. Isegi kui sa ütlesid teoreetiliselt kiiremini, Me teadsime, et sa selline aru et see on 0 ja 1. Ja hash tabelis teoreetiliselt ei ole 0 1. Mainimine midagi runtime üldiselt on sulle punkte. Aga "kiiremini," enamik lahendusi suur laud, mis üritab olid objektiivselt aeglasem lahendused mis olid hash tabeleid. Nii kiirem ja iseenesest ei ole tegelikult tõsi. DAVID J. Malan: Dom de dom dom. Ma olen ilmselt ainus, kes saab aru, see on, kuidas see peaks hääldada, eks? ROB BOWDEN: Mul oli tegelikult aimugi. DAVID J. Malan: Ta tegi mõtet peas. ROB BOWDEN: ma teen seda. OK. Nii et see on see, kus sa pidid koostama skeem sarnane sa võiksid näinud varem eksamid. Teeme lihtsalt vaata seda. Nii et HTML sõlme, meil on kaks lapsed, pea ja keha. Nii me filiaal - pea ja keha. Pea on pealkiri tag. Nii et meil on pealkiri. Nüüd, üks asi, et paljud inimesed unustasin, et need teksti sõlmed elemente seda puud. Nii et siin me juhtuda juhtida neid ovaali eristada neid nende tüüpi sõlmed. Aga teate ka meil siin üleval, keskelt ja alt on lõppkokkuvõttes Teksti sõlmed. Nii unustan mõnevõrra ühine viga. Keha on kolm last - Nende kolme divs. Nii div div div ja siis tekst sõlme lapsed need divs. See on päris palju seda sellele küsimusele. DAVID J. Malan: Ja see on väärt märkimist, kuigi me ei ela need üksikasjad aega me kulutame JavaScript, et et ei, Tegelikult asi tehniliselt. Nii et kui juht jõuab enne keha HTML, siis tuleb näi vasak keha tegeliku DOM. Et tema on üldiselt lihtsalt FYI, midagi, mida nimetatakse dokumendi liik, kus see asi. Ja kui sa olid rakendamise parser, programm, mis loeb HTML hoone puu otsa mälu, olgem ausad, see on intuitiivselt ilmselt, mida sa teha niikuinii - ülalt alla, vasakult paremale. ROB BOWDEN: Küsimused, mis? Kas ma peaksin tegema järgmise üks? DAVID J. Malan: Muidugi. ROB BOWDEN: OK. Nii et see on puhvri ületäitumine rünnaku alla. Peaasi tunnustada siin on, hästi, kuidas võiks vastane trikk see programm arvesse täidesaatva suvalise koodi? Nii argv1 esimese käsurea argument, et see programm, mis võib olla meelevaldselt pikk. Aga siin me kasutame memcpy kopeerida argv1, mis siin on baar. Me kulgeb see argument. Ja nii see on, võttes nime bar. Nii et me memcpying bar sellesse puhver c. Mitu baiti on meil kopeerida? Noh aga palju baite baar juhtub kasutavad, pikkus, et argument. Aga c on ainult 12 baiti suur. Nii et kui me kirjuta käsureal see on pikem kui 12 baiti, et me oleme läheb ülevoolu see eelkõige puhver. Nüüd, kuidas võiks vastane trikk programm arvesse täidesaatva suvalise koodi? Seega pidage meeles, et siin Peamine helistab suva. Ja nii siis peamised kõned foo. Joonistame selle. Nii et meil on meie stack. Ja peamine on freimi allosas. Mingil hetkel, peamised kõned foo. Noh, kohe, peamised kõned foo. Ja nii foo saab oma freimi. Nüüd mingil hetkel suva läheb tagasi. Ja läks foo naaseb, me peame teadma, kell mida koodirida sees peamine me oli, et teada saada, kus peaksime jätkuda peamine. Me saame kutsuda foo alates kogu hunnik erinevates kohtades. Kuidas me teame, kuhu naasta? Noh, meil on vaja salvestada, et kusagil. Nii kuskil parem siin, me salvestada kus me peaks tagasi, kui foo tulu. Ja see on saatja aadress. Niisiis, kuidas vastane võib ära see on asjaolu, et Seda puhvrit c on salvestatud, olgem öelda, siin on c. Nii et meil on 12 baiti c. See on c. Ja see on suva tema stack ring. Seega, kui pahatahtlik kasutaja sisestab rohkem baidid kui 12 või nad sisestada käsu line argument, mis on pikem kui 12 märki, siis me läheme ülevoolu see puhver. Me ei jätka. Ja mingil hetkel, me kaugele piisavalt, et hakkame ülekirjutamist selle saatja aadress. Nii et kui me kirjutada saatja aadress, see tähendab, et kui foo naaseb, oleme tagasi seal, kus pahatahtlik kasutaja räägib seda, mida mis iganes väärtus on sisestatud, mis tahes tähemärki kasutaja sisestatud. Ja nii, kui pahatahtlik kasutaja on eriti tark, ta ei ole seda tagasi kuskil printDef funktsioon või kusagil malloc funktsioon, just kuskil meelevaldne. Kuid veelgi tark on see, kui tal on kasutaja tagasi siinsamas. Ja siis hakkad täidesaatva Nende kui rida koodi. Niisiis sel hetkel, kasutaja saab sisestada mida iganes ta tahab sellesse piirkonda. Ja tal on täielik kontroll üle oma programmi. Küsimused, mis? Nii et järgmine küsimus on lõppenud reimplementation foo nii et see ei ole enam haavatav. Nii et seal on paar võimalust sa oleks seda teinud. Meil on veel c ainult on pikkusega 12. Sa oleks võinud muuta selle osana oma lahendus. Lisasime check teha kindel bar polnud null. Kuigi te ei pea et täies ulatuses krediiti. Nii me kontrollime esimest string pikkusega bar. Kui see on suurem kui 12, siis tegelikult ei tee koopia. Nii et üks võimalus, millega ta. Teine viis, millega see on selle asemel võttes c olla ainult pikkus 12, on see olema pikkusega strlen (bar). Teine viis, millega on tegelikult lihtsalt tagasi. Nii et kui sa olid just saanud lahti kõik see, kui sa olid just välja kõik rida koodi, siis oleks saanud täies ulatuses krediiti, sest see funktsioon tegelikult ei täita midagi. See on kopeerimine käsurea argument mõnda massiivi tema kohalik freimi. Ja siis asi on taastumas. Ja mis see saavutatud on läinud. Nii kasum oli ka piisav võimalus saada täieliku krediiti. DAVID J. Malan: Mitte päris vaimus küsimus aga vastuvõetav kohta spec sellegipoolest. ROB BOWDEN: Küsimused ükskõik mis? Üks asi, mida vähemalt vaja on koostada kood. Nii et kuigi tehniliselt te ei ole haavatavamad kui koodi ei koguda, et me ei saa sellega nõustuda. Ei ole ühtegi küsimust? OK. DAVID J. Malan: Kas sa tahad öelda pealkiri? ROB BOWDEN: Ei DAVID J. Malan: Nii see on see oli kas hea uudis või halb uudis. See on sõna otseses sama probleem kui esimesele viktoriin. Ja see on peaaegu sama probleemi pset1. Aga see oli sihilikult lihtsustatud, et lihtsam püramiid, mis võib olla lahendatud veidi lihtsam iteratsiooni. Ja tõesti, mida me ei saada hetkel siin ei olnud nii palju loogikat sest ilmselt selle punkti, et sa oled mugavam kui sa olid nädalal üks jaoks silmuseid või miks silmad, aga tõesti tease peale, et sa oled natuke rahul Arusaam, et PHP ei ole ainult see, mida programmeerimine. See võib tegelikult kasutada keelt kirjutada käsurea programme. Ja tõepoolest, see on, mida me püüdsime juhtida teie tähelepanu. See on käsurea PHP programm. Nii C-koodi siin, kuigi õige C, pole õige PHP. Aga kood on tõesti sama. Kui võrrelda lahendusi Quiz 0 vastu Quiz 1, siis leiad, et see on peaaegu identsed, välja arvatud mõned dollarimärki ja Kuna andmete liiki. Eriti siis, kui me vaatleme siin te näete, et me kinnitada, sellega juhul alates 1 kuni läbi 7. Me oleks võinud teha seda 0 indeks. Aga mõnikord, ma arvan, et see on lihtsalt vaimselt kergem mõelda asjad 1-7. Kui sa tahad ühte plokki, siis kaks plokid, siis kolm, siis dot, dot, dot seitse. Oleme j Alglaaditakse 1 ja siis arvestan kuni i. Ja kõik on siin identne. Aga tuleb mainida, on paar asja. Anname teile need kaks rida, seda esimest üks, goofily nimeks Jutt terava paugu. Ja see lihtsalt täpsustab tee, kausta, kus saab programmi Leiti, et soovid kasutada tõlgendada seda faili. Ja siis joon pärast seda, ning Loomulikult tähendab sisestage PHP režiim. Ja joon väga põhjas tähendab väljumise PHP režiim. Ja see toimib, üldiselt koos tõlgendada keeles. See on selline tüütu, kui sa kirjutad programmi fail nimega foo.php. Ja siis teie kasutajad on lihtsalt mäletan, OK, et kasutada seda programmi, ma pead kirjutama "php ruumi foo.php." Lahke tüütu, kui miski muu. Ja see näitab ka, et teie programm on kirjutatud PHP, mis ei ole kõik et valgustav kasutaja. Nii saab kõrvaldada. Php üldse mäletate loeng. Ja tegelikult võite seda teha. / Foo kui olete chmodded seda tehes käivitatav. Nii chmod + x suva oleks teinud. Ja kui sa ka lisada Jutt siin. Aga tõesti, probleem oli saada aadressil printimisest midagi sellist. No HTML, C-kood kindlasti, vaid mõned PHP. Nii Milo naasis probleem 25. Ja 25, siis anti järgmise skelett kood, mis oli päris lihtne veebileht. Ja mahlane osa HTML-tark oli maas siin, kus meil on sees keha vormi, mis on unikaalne ID sisendite mille sees oli kaks sisendit, üks idee on nimi, mis on üks koos idee nuppu. Esimene oli teksti tüüp, Teine tüüp esitama. Ja nii me andsime teile, tegelikult rohkem koostisosi kui teil on vaja, just nii teil oli võimalusi, mis Selle probleemi lahendamiseks. Sul ei ole tingimata vaja kõik need IDd. Kuid see võimaldab teil lahendada see erinevalt. Ja ülaosas, märkate, et Eesmärgiks oli, et käivitada aken niimoodi - Tere, Milo! - avanes brauseri abil super lihtne, kui mitte kole, häire funktsioon. Ja lõpuks, see taandub kontseptuaalselt kuidagi kuulates esildised vormi kliendipoolse Mitte server-side, kuidagi vastates, et esitamise haarates raha, et kasutaja sisestatud sisse väljale Nimi ja seejärel väljapanek ta keha märguanne. Nii et üks viis, kuidas saate seda teha on koos jQuery, mis tundub vähe süntaktiliselt segadusttekitav esimesel. Seda saab teha puhta DOM kood - document.getelement by ID. Kuid olgem vaatleme seda versiooni. Mul on paar olulist rida esimene. Nii et üks, meil on seda joont, mis on identne sellega, mida te olete näinud aastal, usun, form2.html klassist nädalal 9. Ja see on lihtsalt öeldes, teostada järgmine kood kui dokument on valmis. See on tähtis ainult sellepärast, HTML lehti lugeda ülevalt alla, vasakult paremale. Ja seega, kui sa püüad teha midagi kood siia mõned DOM element, mõned HTML tag, mis on ette siin, sa teed seda liiga kiiresti, sest see ei ole isegi loetud mällu. Nii öelda, see document.ready line, me ütleme, siin on natuke koodi, brauserit. Aga ei tee seda enne, kui kogu dokument on valmis, et on DOM puu olemas mälu. See üks on natuke rohkem arusaadav, kui süntaktiliselt natuke erinev, kui ma ütlen, ostke HTML element, mille ainulaadne tunnus on sisendid. Seda räsi tag märgib, unikaalne ID. Ja siis ma helistan. Esitama. Nii. Esitada siin on funktsioon, vastasel juhul tuntud meetodit, mis on sees objekt vasakul pool seal, et ma välja ei toodud. Nii et kui te arvate sisendite objekt mälu - ja seda ta tõepoolest on. See on sõlme puu - . Esitada vahend kui käesoleva vormi Selle ID esitatakse, täidab järgmine kood. Mind ei huvita, mida nimi funktsioon ma täidesaatva. Nii et siin ma kasutan, kui enne, mis on nimetatakse lambda funktsioon või anonüümne funktsioon. See ei ole üldse intellektuaalselt huvitav, va see ei ole nime, mis on hea, kui sa oled ainult kunagi helistada üks kord. Ja seal sees ma tegelikult hakkama esitamise vorm. Ma esimest kuulutada muutuja nimetatakse väärtus. Ja mis on selle tulemuseks rõhutatud osa siin nüüd? Mida see teeb juures kõrge tase on minu jaoks? Publik: Läheb väärtus, kasutaja ei ole HTML allpool. Läheb et ID ja seejärel leiab väärtuseks. DAVID J. Malan: Täpselt. See haarab sõlme, kelle ainulaadne tunnus on nimi. Läheb väärtus selles, mis on arvatavasti see, mida kasutaja tipitud ennast. Ja siis ta salvestab, et muutuja nimega väärtus. Nagu kõrvale, siis võib olla ka teha natuke teistmoodi. Täiesti vastuvõetav, tehes midagi vale var väärtus muutub document.getElementById. Ja see on põhjus, miks see on natuke tüütu, et ei kasuta jQuery. "Name". Väärtus. Seega täiesti vastuvõetav. Erinevaid viise seda teha. jQuery lihtsalt kipub olema veidi lühemalt ja kindlasti rohkem populaarne seas programmeerijad. Nüüd ma teen natuke meelerahu kontrollida, sest probleem avaldus me selgesõnaliselt öelnud, et kui Kasutaja ei ole veel kirjutatud tema Nimi, ei näita teateid. Aga te võite kontrollida, et just kontrollimine tühi string viisi kraami, kui seal on midagi tegelikult olemas. Aga kui see ei ole võrdne viisi kraami, Ma tahan helistada teateid. Ja huvitav osa on see, et me kasutame pluss operaator, mis mida teeb JavaScript? Concatenate. Nii et see on nagu PHPS dot operaator. Sama mõte, mis on pisut teistsugune süntaks. Ja ma lihtsalt luua string nägid ekraanil shot - Tere, nii ja nii. Ja siis viimane detail on see. Miks ma tagasi false sees Selle anonüümne funktsioon? Publik: Pole mingit väärtust. Sa pane see vormi. Ta lihtsalt ütleb, kui raha ei ole võrdne tühi, siis tee seda. Seal oli tühi selle esitamist. DAVID J. Malan: OK. Hoolikas aga. Seal on keegi teine ​​siin. Ja tagasi false on väljaspool ning kui tingimused. Nii see esile rida, tagastab false, täidab ükskõik mida, kui vorm on esitatud. Mis naasmist vale sees selle sündmus, nagu seda nimetatakse, kõnealuse sündmuse olles esitamine? Publik: Sest see juhtub ainult üks kord. DAVID J. Malan: juhtub ainult üks kord. Mitte päris. Jah? Publik: See takistab vormi esitades vaikimisi, mis muudaks lehekülje reload. DAVID J. Malan: Täpselt. Nii et ma ülekoormus mõiste esitada siin, sest ma ütlen, et vorm on esitatakse. Aga kui te soovitate, see pole tegelikult esitati tõsi HTTP tee. Kui klõpsate Saada, sest meie onSubmit handler, me pealtkuulamist et vormi esitamise nii rääkida. Me siis teeme oma asja JavaScript koodi. Aga ma teadlikult tagastamise vale, sest ma ei taha, et juhtuma Sekundi pärast on kogu vormi ise tuleb esitada veebis server koos põhiväärtus paari muutes URL oleks midagi q = kassid või mida iganes me tegime, Näiteks klassi. Ma ei taha, et see juhtuks, sest pole server kuulata seda moodustavad esitamist. See on puhtalt tehtud JavaScripti koodi. Ja see on põhjus, miks ma ei olnud isegi tegevuse atribuut minu vorm, sest ma ei kavatse võtta seda kunagi minna server. Nii, et see on esitatud. Aga me pealtkuulamist, et vormi esitamise ja ennetamise default käitumine, mis on tegelikult minna kõik viis server. Publik: Nii hoides seda kliendipoolse. DAVID J. Malan: Keeping see kliendipoolse. Täpselt nii. Next up oli mu oh MySQL. ROB BOWDEN: OK. Nii et see esimene küsimus oli üldiselt karm inimestele. Kuigi hiljem ones läks paremini. Nii et teil oleks valida õiged andmed tüübid mõlemad sambad. Ja mõlemad on mõned asju neile, et teeb valiku raskeks. Nii int ei kehti tippida number. Selle põhjuseks on 12-kohaline konto number, int ei ole piisavalt suur, et salvestada kogu numbrit. Nii kehtiv valik oleks olnud suur int kui juhtub, et tead seda. Teine valik oleks olnud char valdkonnas pikkus 12. Nii kumbki neist oleks töötanud. Int ei teeks. Nüüd, tasakaalu, arvan, et tagasi pset7. Nii me konkreetselt kasutada koma salvestada aktsiate väärtust või - DAVID J. Malan: Cash. ROB BOWDEN: Cash. Me kasutasime kohaga säilitada summa raha, et kasutaja on praegu. Seega põhjus, miks me seda teha ei sest mäletan, hõljub. Seal ujukoma täpsus. Seda ei saa täpselt salvestada raha väärtused nagu me tahame siin. Nii koma on võimalik täpselt poest midagi öelda, kaks kohta pärast koma. Sellepärast tasakaalu, me tahame seda olema kohaga, mitte ujuda. DAVID J. Malan: Ja ka liiga, kuigi oleks olnud tark teiste kontekstis mõtlema, võibolla see on võimalus int. Ma lihtsalt jälgida asju penni. Sest me selgelt näitas default väärtus on 100,00, mis tähendab, et see võib olla lihtsalt int. Ja veel üks nüanss liiga number oli see, et see ei olnud mõeldud olevat trikiga küsimus. Aga meenutan, et int MySQL nagu C, vähemalt aparaat, on 32-bit. Ja kuigi me ei oota, et te tean täpselt, kui palju numbreid, mis vahenditega, ei meelde, et kõige rohkem saate esindama potentsiaalselt 32-bit number on umbes mida? Mis number me alati öelda? 2 kuni 32, mis on see umbes? Sul ei ole täpselt teada. Aga enam-vähem on kasulik eluiga. See on umbes 4 miljardit. Nii et me oleme öelnud, et paar korda. Ma tean, et ma olen öelnud, et paar korda. Ja see on umbes 4 miljardit. Ja see on hea reegel Pöidla teada. Kui teil on 8 bitti, 256 on maagiline number. Kui sul on 32 bitti, 4 miljardit anda või võtta. Nii et kui sa lihtsalt kirjutada 4000000000, te näete, et see on vähem numbreid kui 12, mis tähendab, et see ei ole ilmselgelt piisavalt väljendusrikkust lüüa 12-kohaline kontonumber. ROB BOWDEN: OK. Nii Ülejäänud läks paremini. Olgu, oletame, et pank paneb $ 20 igakuine hooldustasu igas aspektis. Millega SQL Päring võib pank maha $ 20 iga loota, isegi kui see toob mõned saldo negatiivne? Nii et põhimõtteliselt on neli peamist tüüpi päringuid - sisestamiseks valige, värskendada ja kustutada. Niisiis, mida me arvame, et oleme kavatse kasutada siin? Uuenda. Võtame vaata. Nii et siin me oleme ajakohastamine. Mida tabeli me ajakohastamine kontot? Nii ajakohastamine kontod. Ja siis süntaks ütleb, mida kontodel me ajakohastamine? Noh, me seame tasakaal võrdne praegune väärtus tasakaal miinus 20. Nii see uuendab kõik read raamatupidamise, lahutades $ 20 alates tasakaalu. DAVID J. Malan: üldine viga siin, kuigi me mõnikord andestas ta, oli tegelikult PHP kood siia helistades päringu funktsiooni või paneb jutumärgid kõike ei pea seal olema. ROB BOWDEN: Pea meeles, et MySQL on Eraldi keel PHP. Meil juhtub olema kirjalikult MySQL PHP. Ja PHP seejärel saates selle üle MySQL server. Aga sa ei pea PHP et suhelda MySQL server. DAVID J. Malan: Täpselt. Seega pole muutujaid dollari märgid peaks selles kontekstis. Seda saab lihtsalt teha kõik matemaatika jooksul andmebaas ise. ROB BOWDEN: OK. Nii et järgmine üks. Kas see on järgmine? Jah. Niisiis, mida SQL Päring võib pank laadida kontonumbrid oma rikkamaid kliente, kellel tasakaalu üle 1000? Niisiis, mis on neli peamist liiki hakkame siit tahad? Vali. Nii et me tahame valida. Mida me tahame valida? Mida veerus me tahame valida? Me just soovite valida number. Aga kui sa ütlesid, star, me Aktsepteeritakse ka mis. Nii valida number, mida lauale? Kontod. Ja siis seisukorras tahame? Kui tasakaal on suurem kui 1000. Meil on ka tunnustatud suurem või võrdne. Viimane. Millega SQL Päring võib pank lähedale, st kustutada iga konto, on tasakaalu $ 0? Niisiis, mis on neli on meil kavatse soovite kasutada? Kustuta. Nii süntaks on? Kustuta mida lauale? Kontod. Ja siis tingimus, mille kohta me tahame kustutada - kus tasakaal võrdub nulliga. Nii kustutada kõik read kontodelt kui saldo on null. Küsimused ühelgi neist? Tahad järjekorda? DAVID J. Malan: Queue guide. Nii et see, andsime me teile pisut tuttav struktuur, uurisime natuke klassi kõrval structs, mis oli andmete struktuur, mis on seotud vaimu. Erinevus kuigi järjekord on et pidime kuidagi meenutada, kes oli ees järjekorda, suurtes osa, et me saaksime teha rohkem tõhus kasutamine mälu, vähemalt kui olime kasutades massiivi. Sest mäletate, kui meil on massiiv, kui Näiteks on see ees järjekorda, kui ma saan järjekorda siin ja siis keegi saab vastavalt minu taga, minu taga, minu taga, ja üks inimene astub üle piiri, siis võiks, nagu me nägime mõned meie inimeste vabatahtlike klassis, on kõik suunata sel viisil. Aga üldiselt, kes kõik teevad midagi ei ole parim ajakasutus aastal programmi, sest see tähendab oma algoritm töötab, mida asümptootiline sõiduaega? See on lineaarne. Ja ma tunnen, et see on tobe. Kui järgmine inimene liin on järgmine inimene, kes pidi minema poest, ei ole kõik liikuda koos. Las see isik tuleb kitkuda välja kui saabub aeg, näiteks. Nii võime säästa natuke aega seal. Ja mida teha, et siiski, et vahendite et pea järjekorras või ees järjekord läheb järk-järgult liikuda sügavamale arvesse massiivi ja lõpuks võiks tegelikult ümbritsev kui me kasutame array salvestada inimesed selles järjekorras. Nii saab peaaegu mõtle massiivi ümmarguse andmed struktuur selles mõttes. Nii et sa kuidagi on jälgida suurus või tõesti lõpuks see ja seejärel, kui algul on. Seega teeme ettepaneku, et te deklareerite üks selline järjekord, kutsudes see q, ainult ühe kirja. Siis teeme ettepaneku, et ees on lähtestatud nulli ja suurus lähtestatakse nulli. Nii et just nüüd, seal on midagi sees, et järjekorda. Ja me palume teil täita rakendamise Lisa järjekorda allpool nii, et funktsioon lisab n lõpuks q ning tagastab true. Aga kui q on täis või negatiivne, funktsioon peaks hoopis tagasi false. Ja me andsime teile paar Eelduste. Aga nad ei ole tegelikult ülesannetes asjakohane, lihtsalt et bool on olemas, sest tehniliselt bool ei olemas C, kui lisate teatud header fail. Nii et see oli lihtsalt veendumaks, et ei olnud see trikk Küsimus selline asi. Niisiis Lisa järjekorda, tegime ettepaneku proovis lahendusi rakendada järgmiselt. Üks, vaatame kõigepealt tundma, kergesti kättesaadavad viljad. Kui järjekord on täis või number, üritate sisestada vähem kui null, mis me ütlesime spetsifikatsiooni tohiks probleemi ei ole lubatud, sest me tahame ainult mittenegatiivsed väärtused, siis tuleks lihtsalt tagasi false kohe. Nii mõned suhteliselt lihtne Vigade kontrollimine. Kui aga soovite lisada, et tegelik number, mida pidin tegema natuke mõtlesin siin. Ja see on koht, kus see on natuke tüütu vaimselt, sest sa pead nuputada, kuidas hakkama Kietaisu. Aga idud idee siin see on meid huvitab see, et Kietaisu Sageli tähendab modulaarne aritmeetika ja mod operaatori protsenti poolel kus saab minna suurem väärtus tagasi nulli ja siis üks ja kaks ja kolm ja siis ringiga tagasi nulli üks ja kaks ja kolm ja nii edasi uuesti ja uuesti. Niisiis, kuidas me teeme ettepaneku selle saavutamiseks on et me ei taha indeks array numbrite kus meie täisarvud valeta. Aga sinna me esimest korda teha tahad olenemata suurusest järjekord on aga siis lisada, et olenemata ees nimekirjas on. Ja mõju, mis on panna meid õiges asendis järjekorras ja Mitte eeldada, et esimene inimene line on alguses, kus ta või ta absoluutselt olla, kui me Samuti minnes kõigile. Aga me lihtsalt luua töö ise kui võtsime et erilist teed. Nii saame hoida seda suhteliselt lihtne. Me peame meeles pidama, et me lihtsalt lisatud int järjekorda. Ja siis me lihtsalt tagasi tõsi. Vahepeal dequeue palusime teil teha järgmist. Rakendada sellisel viisil, et see dequeues, mis eemaldab ja tagastab, int ees järjekorda. Eemaldamiseks int, piisab seda unustada. Sa ei pea alistada oma natuke. Nii et see on ikka tegelikult on. Just nagu andmed kõvakettale, me lihtsalt ignoreerides asjaolu et see on nüüd olemas. Ja kui q on tühi, siis peaks asemel tagasi negatiivne 1. Nii see tundub meelevaldne. Miks tagasi negatiivne 1 asemel vale? Jah. Publik: Q on hoidmiseks positiivsed väärtused. Kuna sul on ainult säilitada positiivsed väärtused aastal q, negatiivne on viga. DAVID J. Malan: OK, tõsi. Niisiis, kuna me alles hoidmiseks positiivne väärtused või null, siis on see hea, et tagasi negatiivne väärtus valvur väärtus, spetsiaalne sümbol. Aga sa ümberkirjutamist ajalugu seal, sest põhjus, miks me oleme ainult tagastamise mittenegatiivsed väärtused sest me tahame on valvur väärtus. Nii täpsemalt, siis miks mitte lihtsalt tagasi false vigade korral? Jah. Publik: Sa oled suutnud tagasi täisarv. DAVID J. Malan: Täpselt. Ja see on koht, kus C muutub päris piiravaks. Kui sa tahad öelda, et sa lähed tagasi int, sul tagasi int. Sa ei saa fancy ja hakata tagasi pöörduma bool või float või nööri või midagi sellist. Nüüd, vahepeal JavaScript ja PHP ja mõne muu keele saab tegelikult olete naasevad erinev tüüpi väärtusi. Ja mis võib tegelikult olla kasulik, kui võid naasta positiivne ints, nullid, negatiivne ints või vale või null isegi tähendama viga. Kuid me ei ole seda mitmekülgsus C. Nii dequeue, mida me ettepanekuid teha, on - ROB BOWDEN: Võite tagasi false. See on lihtsalt nii vale on hash määratleda vale nulli. Nii et kui sa tagasi false, naasete null. Ja null on kehtiv asi meie järjekorda, samas negatiivne 1 ei ole, kui false juhtus olema negatiivne 1. Kuid te ei tohiks isegi pead teadma, et. DAVID J. Malan: See on miks ma ei öelnud seda. ROB BOWDEN: Aga see ei olnud tõsi et te ei saa tagasi false. DAVID J. Malan: Muidugi. Nii dequeue märka me aktsepteerime kehtetuks, kuna selle argumendiga. Ja see on sellepärast, et me ei ole möödaminnes midagi sisse Me lihtsalt tahame, et eemaldada element temperatuuril ees järjekorda. Niisiis, kuidas võiks me minna seda teed? Noh, esiteks, teeme seda kiire mõistuse kontrolli all. Kui järjekorras suurus on 0, ei mingit tööd teha. Tagasi negatiivne 1. Valmis. Nii et paar rida minu programmis. Nii ainult nelja jääma. Nii et siin ma otsustan kahandab suurus. Degressioon suurus tõhusalt tähendab, et ma unustan midagi on seal. Aga mul on ka uuendada, kui ees numbrid. Niisiis, mida teha, et ma vajan teha kahte asja. Mul on vaja kõigepealt meenutada, mis number on ees järjekorda sest ma pean tagasi et asi. Nii et ma ei taha kogemata unustada seda ja siis kirjutatakse see. Ma lihtsalt meeles pidada int. Ja nüüd, ma tahan, et ajakohastada q.front tuleb q.front 1. Seega, kui see oli esimene inimene line, nüüd, ma tahan teha, pluss 1 osutavad järgmise isiku rida. Aga ma pean hakkama Kietaisu. Ja kui maht on ülemaailmne pidev, mis toimub, mis võimaldab mul teha kindel nagu ma juhtida tähelepanu väga viimane inimene line, moodul operatsiooni toob mind tagasi nulli ees järjekorda. Ja mis tegeleb Kietaisu siin. Ja siis ma minna tagasi n. Nüüd, äärmisel ma ei kinnitama, n. Ma ei pea seda haarata ja hoidke seda ajutiselt, sest väärtus on ikka veel seal. Nii et ma võiks lihtsalt teha õigeid aritmeetika tagasi endine juht järjekorda. Aga ma lihtsalt tundsin, et see oli veel selge tegelikult haarata int, pane see n, ja siis tagasi, et Selguse mõttes kuid ole tingimata vajalik. Psst. Nad kõik hääldatavate peas. ROB BOWDEN: Nii et esimene küsimus on kahendpuu probleem. Nii et esimene küsimus on, et me oleme Arvestades neid numbreid. Ja me tahame kuidagi lisada need need sõlmed selline, et see kehtiv Kahendotsingupuu. Nii üks asi meeles pidada umbes binaarne otsing puud on see, et see ei ole lihtsalt, et asi vasakule on väiksem ja asi õigus on suurem. See peab olema, et kogu puu Vasakul on vähem ja kogu puu paremal on suurem. Nii et kui ma panen 34 siin üleval ja seejärel Panin 20 siin, nii et see kehtib nii kaugele, kuna 34 siin. 20 läheb vasakule. Nii et vähem. Aga ma ei saa siis pane 59 siin, sest kuigi 59 on õigus 20, see on ikka vasakul 34. Nii et piirang meeles Lihtsaim viis ilmselt lahendada see Probleem on selles, et justkui need numbrid - nii 20, 34, 36, 52, 59, 106. Ja siis lisada need vasakult paremale. Nii 20 läheb siia. 34 läheb siia. 36 läheb siia. 52, 59, 106. Ja sa ka võinud arvasin, koos mõned kõrvaldamine ning mõistes, oh, oota, ma ei ole piisavalt numbrid et täita seda enam siin. Nii et ma pean reshift mis minu tee märge saab olema. Aga teate, et lõplik kolm, kui Lugedes vasakult paremale, see on kasvavas järjekorras. Nüüd tahame tunnistada, mida struct saab olema jaoks tippe seda puud. Mida me vajame, kahendpuu? Nii et meil on väärtus tüüpi int, nii et mõned int väärtust. Ma ei tea, mida me kutsusime see lahendus - int n. Vajame kursorit vasakule laps ja kursor paremale laps. Nii see läheb välja nägema selline. Ja see saab tegelikult vaadata enne Millal kahekordselt seotud nimekiri kraami, nii teate - Ma pean kerida kõik kuidas tagasi alla probleem 11. Nii märkate tundub identne sellele, välja arvatud me lihtsalt juhtub kutsume neid erinevate nimede all. Meil on veel täisarv väärtus ja kaks suunanäitajaks. See on lihtsalt, et selle asemel, et ravida viiteid osutades järgmine asi ja eelmise asi, me ravivad viiteid osutavad vasakul laps ja õigus laps. OK. Nii et meie struct sõlme. Ja nüüd, ainus funktsioon on meil vaja rakendada seda Traverse, mis me tahame minna üle puu-, trüki- välja väärtused puus. Nii vaadates siin, me tahaks, et printida out 20, 34, 36, 52, 59 ja 106. Kuidas saavutada, et? Nii et see on üsna sarnane. Kui sa nägid varem eksami probleem et sa tahad välja printida terve puu komadega vahel kõik, see oli tegelikult isegi lihtsam kui see. Nii et siin on lahendus. See oli oluliselt lihtsam kui sa tegid seda rekursiivselt. Ma ei tea, kas keegi üritas seda teha korduvalt. Aga kõigepealt on meil tugipunkti. Mida teha, kui juur on null? Siis me lihtsalt tagasi. Me ei taha, et midagi printida. Else me läbida rekursiivselt alla. Trüki kogu vasaku alampuu. Nii printida kõike vähem kui mu praegune väärtus. Ja siis ma lähen trükkida ise. Ja siis ma lähen püsi arhiivi alla mu kogu parem alampuu, nii et kõik suurem kui minu raha. Ja see saab printida kõike selleks. Küsimused selle kohta, kuidas see tegelikult saavutatakse, et? Publik: Mul on küsimus kohta [kuuldamatu]. ROB BOWDEN: Nii üks viis läheneb iga rekursiivne probleem on lihtsalt arvan umbes nii, nagu sa pead mõtlema kõigi nurgas juhtudel. Seega leian, et me tahame printida kogu puu. Nii et kõik me keskenduda on selle konkreetse sõlme - 36. Rekursiivne kõne, teeskleme need lihtsalt tööd. Nii et siin, see rekursiivne kõne Traverse, me isegi mõelda about it, lihtsalt liiklevad vasakus kolm, kujutage ette, et juba prindib 20 ja 34 meie jaoks. Ja siis, kui me lõpuks rekursiivselt kutsuvad Traverse kohta õigus, et korrektselt printida 52, 59 ja 106 juures. Seega, arvestades, et see on võimalik printida 20, 34 ja muud saab printida 52, 59, 108, kõik me vajame, et oleks võimalik teha, on print paigaldada keset seda. Nii välja printida kõik enne meid. Trüki paigaldada nii aktiivse sõlme print 36, regulaarne printf ja seejärel prindi kõik pärast meid. DAVID J. Malan: See on koht, kus rekursioon saab tõesti ilus. See on uskumatu hüpe usu kus sa small natuke tööd. Ja siis las keegi muidu ei puhata. Ja et keegi on iroonilisel kombel sind. Nii tõsine hellake punkte, kui liigute üles küsimused - ROB BOWDEN: On küsimusi? DAVID J. Malan: ja alla veidi numbrid, keegi ei tea, kus need numbrid tulevad? ROB BOWDEN: mul on sõna otseses mõttes ei tea. DAVID J. Malan: Nad näivad kogu viktoriini. Publik: Kas need samad numbrid? DAVID J. Malan: Need numbrid. Vähe lihavõttemuna. Neile, kes te vaatate online kodus, kui te ei ütle meile e-posti teel heads@CS50.net mis tähtsus Nende korduvate kuus numbrit on kogu Quiz 1, siis duši te hämmastav tähelepanu lõplik loeng ja stress palli. Nice, peen. ROB BOWDEN: Iga viimane küsimused umbes midagi tegema?