DAVID J. MALAN: Selvä. Joten tervetuloa ensimmäinen CS50 jälkipuinti varten tietokilpailu. Ajattelimme vihkiä Tämän perinteen tänä vuonna. Ja tämä on tilaisuus kulkea ratkaisuja tietokilpailuun. Ja me nopeuttaa tai hidastaa perustuu korko näistä täällä. Joten olet luultavasti täällä, koska olet kiinnostuneita siitä, miten olisit voinut tai olisi pitänyt vastata joidenkin näistä ongelmista. Joten miksi emme katsomaan tässä osassa ensin? Niin saa jouset. Tämä antoi sinulle kolme eri versiota ohjelma, joka oli lopulta tarkoitus saada merkkijono käyttäjä. Onko se teki sitä oli vasemmalle voit päättää. Ja pyysimme kysymyksessä 0, Oletetaan, että versio 1 on käännetty ja teloitettiin. Miksi voisi ohjelman Segfault? Ensi silmäyksellä, mitään ehdotuksia miksi? Joo. Yleisö: Niin Muistan nähneeni tämän Edellisen esimerkin tarkastella char * s ja nähdä skannaus s ja nähdä, koska se on osoitin, miten ei se vaikuta siihen, mitä skannataan? Onko se s tai osoitteen s? DAVID J. MALAN: OK. Hyvä. Joten lopulta, lähde mitään ongelmaa on oletettavasti menossa vähentää kyseiseen muuttuja s. Ja se on todellakin muuttuja. Tietotyyppi, että muuttuja on char *, mikä tarkoittaa, että se tulee sisältää osoitteen luonne. Ja siinä piilee oivallus. Se tulee sisältämään osoite merkin tai yleisemmin osoitteen ensimmäisen merkin koko lohko merkkiä. Mutta saalis on, että scan s, tarkoitukseen elämä, annetaan osoite ja annetaan muotoilukoodi, kuten% s, lue string kimpale muisti kyseisessä osoitteessa. Mutta koska ei ole mitään yhtäläisyysmerkkiä ennen että puolipiste ensimmäisenä koodiriviä, koska emme oikeastaan ohjattava kaikki muisti malloc, koska se ei oikeastaan jakaa joukko joitakin koko, jotka kaikki teet lukee käyttäjän näppäimistöä johonkin täydellinen roskat arvo, joka on s oletuksena. Joten kertoimet ovat aiot Segfault jos että osoite ei vain niin tapahdu olla arvo, jonka voit, itse asiassa kirjoittaa. Niin paha olla jakamatta muistiasi siellä. Joten kysymyksessä 1, pyysimme, Oletetaan, että versio 2 on käännetty ja teloitettiin. Mistä tämä voisi ohjelman Segfault? Joten tämä on vähemmän buginen. Ja siellä oikeastaan ​​vain yksi ilmeinen tapa, jossa voit laukaista segfault täällä. Ja tämä on temaattinen. Aina käytämme c muistiin, mitä voisit tehdä aiheuttaa segfault 2. version? Yleisö: Jos käytät että panostus merkkijono, joka on pidempi kuin 49 merkkiä. DAVID J. MALAN: Aivan. Aina kun näet jotain kiinteä pituus kun se tulee array, sinun tutka pitäisi mennä pois, että tämä voisi olla ongelmallista, jos et ole tarkkailun rajat array. Ja se on ongelma. Olemme edelleen käytössä scanf. Olemme edelleen käytössä% s, mikä tarkoittaa, kokeile lukea merkkijonon käyttäjä. Se menee luettavaksi osaksi s, joka tässä vaiheessa, on tehokkaasti osoite kimpale muisti tai sen vastaavan. Se on nimi array merkkien muistia. Mutta juuri näin, jos olet lukenut merkkijono joka on pidempi kuin 49 merkkiä, 49 koska tarvitset tilaa kenoviiva 0, olet menossa ylivuoto että puskuri. Ja saatat saada onnekas ja pystyä kirjoittaa 51st hahmo, 52., 53.. Mutta jossain vaiheessa, OS aikoo sanoa mitään. Tämä varmasti ei ole muistia olet saanut koskea. Ja ohjelma on menossa Segfault. Joten ei, heuristiikka pitäisi olla kun olet saanut kiinteää pituutta, sinulla on varmista, että olet tarkkailun pituus mitä se on, jota yrität lukea sitä. Yleisö: Niin ratkaista, että voisit on ollut selvitys tarkkailun todella on pituus suurempi tai pienempi kuin? DAVID J. MALAN: Ehdottomasti. Sinulla on vain kunnossa joka sanoo, jos - tai pikemminkin et välttämättä tiedä etukäteen, kuinka monta merkkiä käyttäjä on menossa kirjoittaa, koska sinulla on kana ja muna. Vasta olet lukenut sen kanssa scanf voit selvittää, miten kauan se on. Mutta siinä vaiheessa, se on liian myöhäistä, koska olet jo lukenut sen jonkin lohkon muistia. Niin syrjään, CS50 kirjasto välttelee tämän ongelman kokonaan, Recall käyttämällä fgetc. Ja se lukee yhden merkin kerrallaan, tip-toeing pitkin, tietäen, että olet ei voi ylivuoto merkki, jos luet yksi kerrallaan. Saalis on kanssa getString Recall on että meidän on jatkuvasti uudelleen koko että kimpale muistia, joka on vain kipua. Se on paljon riviä koodin tehdä. Joten toinen vaihtoehto olisi todella käyttää serkku, joten sanotusti scanf. On olemassa muunnelmia paljon näitä toimintoja, jotka itse tarkistaa pituus, kuinka monta merkkiä saatat lukea maksimaalisesti. Ja voit määrittää, älä lue yli 50 merkkiä. Jotta olisi toinen lähestymistapa, mutta vähemmän otollinen suurempia panoksia. Joten kysymys 2 kysyy, olettaa, että versio 3 on käännetty ja teloitettiin. Miksi se mahtaa ohjelma Segfault? Joten tämä on itse asiassa sama vastata, vaikka se näyttää hieman harrastaja. Käytämme malloc, joka tuntuu annamme itsellemme enemmän vaihtoehtoja. Ja sitten me vapauttaa että muisti lopussa. Se on edelleen vain 50 tavua muistia. Joten saatamme silti yrittää lukea 51, 52, 1000 tavua. Se tulee Segfault varten täsmälleen samasta syystä. Mutta on toinenkin syy liian. Mitä muuta voisi malloc paluun lisäksi osoitteen kimpale muisti? Se voisi palata null. Ja koska emme tarkistamalla että voisimme tehdä jotain tyhmä muusta syystä, joka on se, että saatamme olla kertomatta scanf, lue käyttäjän näppäinsyötteisin osaksi 0 sijainti, AKA null. Ja sekin varmasti laukaista segfault. Joten tietokilpailu tarkoitus, olisimme ovat hyväksyneet kumpaakaan näistä kuin pätevää syytä. Yksi on sama. Yksi on hieman vivahteikas. Lopuksi suhteessa ohjelman muistin käyttö, miten versio 2 ja versio 3 eroavat toisistaan? Joten mitä se kannattaa, näimme loputtomalta tarjonta mahdollista vastauksia tähän. Ja joukossa ihmisten vastauksia, mitä olimme toivoen, mutta me hyväksyimme muut asioita, oli noin maininta Se, että versio 2 käyttää ns pino. Versio 3 käyttää kasaan. Ja toiminnallisesti, tämä ei oikeastaan tehdä kaikki, että paljon eroa. Lopussa päivän, olemme yhä juuri 50 tavua muistia. Mutta se oli yksi mahdollisista vastauksista että me tarkastelemme. Mutta näet, kun saat tietokilpailuja takaisin TF: ille, että teimme hyväksyä muita keskusteluja niiden erilaisia ​​käyttötapoja muistia samoin. Mutta pino ja keko olisi ollut helppo vastaus mennä. Kaikki kysymykset? Annan sinulle Rob. ROB BOWDEN: Eli ongelma 4. Tämä on yksi, jossa piti täyttää on tavujen pois kaikki nämä erilaiset käyttää. Joten ensimmäinen asia näemme. Oletetaan 32-bittinen arkkitehtuuri, näin CS50 laitetta. Joten yksi perustavista asioita 32-bittisessä arkkitehtuurissa, joka kertoo meille, kuinka suuri osoitin on menossa olevan arkkitehtuurin. Joten heti, me tiedämme, että osoitin tyyppi on 32-bittiä tai 4 tavua. Niin etsivät tässä pöydässä, solmu * on osoitin tyyppiä. Se tulee olemaan 4 tavua. Struct solmu *, joka on kirjaimellisesti identtinen solmuun tähden. Ja niin, että tulee olemaan 4 tavua. String, joten se ei näytä osoitin vielä, mutta typedef, merkkijono on vain char *, joka on osoitin tyyppiä. Niin, että tulee olemaan 4 tavua. Joten nämä kolme ovat kaikki 4 tavua. Nyt, solmu ja opiskelija ovat hieman monimutkaisempi. Joten etsit solmu ja opiskelija, näemme solmu kokonaisluku ja osoitin. Ja opiskelija on kaksi osoitinta sen sisälle. Joten ainakin meidän tapauksessa täällä, tapa että päädymme koon laskemista tämä struct on vain täsmää kaiken se sisällä struct. Joten solmulle, meillä on kokonaisluku, , joka on 4 tavua. Meillä on osoitin, joka on 4 tavua. Ja niin yksi solmu on menossa ryhtyä 8 tavua. Ja vastaavasti opiskelija, meillä on osoitin, joka on 4 tavua ja toinen osoitin, joka on 4 tavua. Niin että menee loppuun asti on 8 tavua. Niin solmu ja opiskelija ovat 8 tavua. Ja nämä kolme ovat kaikki 4 tavua. Kysymyksiä siitä? Kyllä. Yleisö: Onko se oli 64-bittinen arkkitehtuuri, jospa kaksinkertaistaa ne kaikki? ROB BOWDEN: Se ei olisi kaksinkertaistaa ne kaikki. Joten 64-bittinen arkkitehtuuri, se taas muutoksia, että perusoikeuksia asia, että Osoitin on nyt 64 bittiä. Joo. Joten osoitin on 8 tavua. Joten nämä, jotka olivat 4 tavua tulevat olemaan 8 tavua. Opiskelija, joka oli kaksi osoitinta, No, nyt se tulee olla 8 tavua, 8 tavua. Se tulee tehdä 16 tavua. Mutta solmu on edelleen 4 tavua. Joten tämä osoitin on menossa olla 8 tavua. Tämä on 4 tavua. Niin solmu on vain menee olla 12 tavua. Muita kysymyksiä, että yksi? Joten seuraava, nämä ovat HTTP-tilakoodien. Ja sinun pitäisi kuvailla olosuhteita joiden mukaisesti nämä voimin palautetaan sinulle. yksi ongelma, että kuulin jotkut opiskelijat on se, että he yrittivät tehdä virheitä olla asiakkaan loppuun. Joten kun yritämme tehdä pyynnön palvelimeen, jokin menee väärin meidän loppua. Mutta yleensä nämä koodit ovat palautetaan palvelimen. Joten haluamme selvittää, mitä tapahtuu oikeassa tai väärässä palvelimeen, aiheuttaa nämä asiat palautetaan. Joten miksi pitää palvelin palauttaa tilakoodi 200? Mitään ajatuksia? Joo. Joten jotain onnistuneesti pyyntö meni läpi. Ja he voivat palata mitä pyysit. Joten kaikki oli kunnossa. Entä 302 löytyi? Joo. Yleisö: palvelin oli etsimässä mitä pyysit. Mutta se ei löytänyt sitä. Joten ei ole virhe. ROB BOWDEN: Eli palvelin oli etsivät mitä halusi. Joten katson tässä, 302 löytyy, se oli löytänyt sitä. Yleisö: Olen pahoillani. Löytyi tarkoittaa, että he löysivät sen. Anteeksi. ROB BOWDEN: So 302 löytynyt. Palvelin pystyy löytämään mitä halusit. Yleisö: Mutta se ei ole se näytetään? ROB BOWDEN: ero Tämän 302 ja 200 on se, että tietää, mitä haluat. Mutta se ei ole tarkalleen missä halusit kysyä. Joten 302 on tyypillinen uudelleenohjaus. Joten pyysit sivun. Se tietää, oh, haluan palata sinulle tämän. Mutta tämä on eri URL. Joten hei, te todella haluavat tätä. DAVID J. MALAN: Se on pala, joka sanoi että annoimme teille uudelleenohjaus toiminto, joka käyttää header-toiminto että puolestaan ​​tulostaa sijainti, paksusuoli, ja sitten URL-osoitteen, joka haluat hylätä käyttäjälle. Vaikka et näe 302 nimenomaisesti siellä, sitähän PHP piti taianomaisesti aseta otsikkomääränpääosoitteena selvää, mitä Rob sanoi, että - löytyi. Mutta täältä sijaan. ROB BOWDEN: OK. Entä 403 kiellettyä? Yleisö: Minusta se on, että palvelin on pohjimmiltaan sanomalla, että asiakkaan ei voi käyttää etusivulle. ROB BOWDEN: Joten kyllä. No, tyypillinen vastaus olimme Odotetaan on jotain, tiedostot ei chmodded asianmukaisesti. Se on luultavasti missä olosuhteissa näit ne. Mutta on syy, että asiakas voisi olla syyllinen täällä. Siellä on todella toinen tila koodi - 401. Joten nämä ovat hyvin samankaltaisia. 401 on luvaton. Ja 403 on kielletty. Ja niin luvattoman sinua yksinomaan saada, jos et ole kirjautunut sisään Mutta kirjautumalla saattaa tarkoittaa että sinulla on oikeus. Mutta jos olet jo kirjautunut sisään ja vieläkään ei ole lupaa, niin voit myös saada kielletty. Joten jos olet kirjautunut sisään ja ei ole lupaa, kielletty myös jotain voit saada. DAVID J. MALAN: Ja mekanismi nämä ongelmat ovat yleensä ratkaistaan ​​palvelin on millaisin komento? Chmod, jos se on todellakin käyttöoikeudet antavat tiedoston tai hakemiston. ROB BOWDEN: Sitten 404 ei löytynyt. Joo. Joten toisin kuin 302, jos se ei ollut täsmälleen jos kysyt, mutta se tietää, mitä haluat, tämä, se vain on ei ole aavistustakaan, mitä haluat. Ja et ole vaatinut jotain voimassa. 418 Olen teekannu ja sitten 500 internal server. Joten miksi saattaa sait sen? Joten Segfault - En oikeastaan ​​tiedä luokittelu standardi tätä. Mutta jos PHP-koodin oli jotain väärässä siinä, teoriassa se voisi itse asiassa Segfault, jolloin tämä 500 internal server error, jotain vikaa palvelimen kokoonpano. Tai siellä syntaksivirheen oman PHP-koodin. Tai jotain pahaa tapahtuu. DAVID J. MALAN: Emme katso segfault keskuudessa harvat vastauksia. Ja teknisesti, se voisi tapahtua. Mutta se olisi PHP, ohjelma kirjoittanut muita ihmisiä, oikeastaan segfaulted, joista vain jos ne ihmiset mokasi ja kirjoitti buginen koodi niiden tulkki olisi PHP itse Segfault. Joten vaikka 500 on kuin segfault hengessä, se on lähes aina tulos asetustiedosto kysymys Web-palvelimen tai, kuten Rob sanoi, syntaksivirhe, kuten sinäkin ei sulje lainaus. Tai olet menettänyt puolipiste jonnekin. Yleisö: Joten Shuttle PSET, I ajattelevat, kun tein sen kerran klikkasin selain, mutta mitään ei tullut ylös, mitä he kutsuivat valkoinen sivu. Mutta se johtui koodin. Mielestäni oli JavaScript, eikö? ROB BOWDEN: Joo. Yleisö: Jospa virhe vielä keksiä? ROB BOWDEN: Joten sinulla ei olisi saanut tämän virheen, koska kaikki web-palvelimen näkökulmasta oli täysin kunnossa. Mutta pyysit index.html. Pyysit shuttle.js ja service.js. Ja se kykeni palaamaan teille kaikki nuo asiat - 200. OK. Vasta kun selaimen yritti tulkitsevat JavaScript-koodia, joka Se on kuin, odota, tämä ei ole voimassa JavaScript virhe. Muuta kysyttävää? Selvä. DAVID J. MALAN: Joten seuraavan up oli numero 11. Ja 11 oli pelottavin ja paljon ihmisiä. Joten tärkein asia huomata tässä oli, että tämä oli todellakin noin kaksinkertaisesti linkitetty lista. Mutta tämä ei ollut sama kuin viime vuonna kaksin verroin linkitetty lista ongelma, joka ei anna sinulle varoitus, että Listaa voisi itse asiassa olla lajittelemattoman. Niin, että luettelo on lajittelematonta ja se, että kyseinen sana oli alleviivattu siellä on tarkoitus välittää että tämä on todella yksinkertaistaminen mitä muuten olisi ollut enemmän haastava ongelma ja pidempi. Niin yleinen virhe täällä oli ryhtyneen viime vuoden ratkaisu ONE hakulaite ja sitten vain sokeasti kopioida, että alas kuin vastaus, mikä on oikea vastaus eri kysymykseen hengeltään samanlainen. Mutta vivahteet täällä olivat seuraavat. Joten, olemme solmun ilmoitettu ja määritellään tavalliseen tapaan tässä. Sitten määritellään luettelo olla maailmanlaajuinen osoitin alustetaan nollaksi. Niin ilmeisesti siellä on kaksi tehtävää meillä on prototyyppejä täällä, insert ja poista. Ja sitten meillä on joitakin näyte koodi tähän tehdä joukko lisäyksiä. Ja sitten pyydämme sinua täyttämään täytäntöönpanoa insert alla tällaisissa siten, että se lisää n listaan jatkuvassa aikaan myös korosti, vaikka jo läsnä. Joten kauneus pysty lisäämään jatkuvassa aika on, että se merkitsee että sinun täytyy lisätä uusi solmu missä? Etuosaan. Niin se poistaa, onneksi, ainakin yksi niistä tapauksista, joihin ennen tarvittiin vieläkin riviä koodia, kuten se teki viime vuonna ja jopa luokassa, kun me puhui läpi tällainen asia ihmisiin ja joidenkin sanallinen pseudo koodia. Joten ratkaisu täällä, hypätään yli tähän vain on näköyhteys näytön. Huomaa, että teemme seuraavan. Ja myös huomata muuta yksinkertaistamista oli se, että vaikka se on jo läsnä, joten tämä tarkoittaa, vaikka numero on jo olemassa, voit vain sokeasti lisää toinen kopio. Ja sekin oli tarkoitus olla yksinkertaistamista, jotta voisitte keskittyä, todella, jotkut enemmän älyllisesti mielenkiintoinen osa ja ei vain joitakin ylimääräisiä virheentarkistusmenetelmiä annetaan rajoitetun ajan. Joten tässä näyteliuoksessa, myönnämme osoitin vasen sivulle tästä solmuun. Nyt ymmärtää, että osoitin, koska Rob sanoi, on vain 32 bittiä. Ja se ei varsinaisesti sisällä osoitetta, kunnes määrittää sen osoite. Ja teemme sen oikealla kädellä puoli kautta malloc. Kuten hyvä kansalainen, tarkistamme, että malloc ei ole itse asiassa nolla, niin että emme vahingossa luo segfault täällä. Ja milloin käytät malloc elämässä, sinun pitäisi olla tarkistamatta null, ettei sinulla on hienovarainen bugi. Sitten alustaa että null by määrittämällä n ja edellinen ja seuraava. Ja tässä tapauksessa täällä, olen alustettu ennen null, koska tämä uusi solmu tulee olemaan uuden alussa listallani. Joten siellä tulee olemaan mitään ennen sitä. Ja haluan olennaisesti liittää luodun luettelon uuteen solmuun asettamalla vieressä yhtä luetteloa. Mutta en ole tehnyt vielä. Joten jos luettelo itse jo olemassa, ja siellä oli ainakin yhden solmun jo olemassa, jos tämä on luettelo täällä ja asetan uuden solmun täällä, en täytyy varmistaa, että minun entinen solmu huomauttaa taaksepäin minun uusi solmu, koska tämä on jälleen kaksinkertaisesti linkitetty lista. Joten emme järki tarkistaa. Jos lista ei ole nolla, jos on jo yhden tai useamman solmun siellä, niin lisätä, että sivuväli niin sanotusti. Ja sitten aivan viimeinen asia, jota tarvitsemme vain todella päivittää maailmanlaajuisen muuttujalista itse osoittamaan sen, että uusi solmu. Joo. Yleisö: Kun osoitin nuoli [Äänetön] on yhtä suuri kuin nolla, tekee sen käsitellä luettelosta, koska lista on nolla? DAVID J. MALAN: Ehei. Se on yksinkertaisesti minulle on ennakoivasti Varo, että jos tämä on minun alkuperäinen lista ehkä hieman enemmän solmuja tänne ja olen lisäämällä minun uusi solmu tänne, siellä tulee olevan mitään tänne. Ja haluan kaapata ajatus asettamalla ennen null uusi solmu. Ja oletettavasti, jos koodi on oikea ja ei ole muuta keinoa lisätä solmut muuta kuin tätä toimintoa, oletettavasti, vaikka lista on jo yhden tai useamman solmun se, oletettavasti lista, ensimmäinen solmu, olisi edellinen osoitin null itse. Yleisö: Ja juuri seurannan. Syynä laitat osoittimen vieressä tasavertaisina Lista on teet osoitin ennen alalta, että se on suunnattu seuraavaan, luulisin - I älkää - vain luetellaan? DAVID J. MALAN: Aivan. Ja niin katsotaanpa todella tarkastelemme tilannetta, täällä todella, vaikka Jotta me pitävät heitä ei ole aivan sama kuin koodi. Mutta korkealla tasolla, jos se on luetella ja tämä on 32-bittinen osoitin, yksinkertaisin tilanteessa on että tämä on null oletuksena. Ja kai haluan lisätä numero 50 oli ensimmäinen numero. Joten aion mennä eteenpäin ja jakaa solmu, joka tulee sisältämään kolme kenttää - n, edellinen ja seuraava. Aion laittaa numero 50 täällä, koska tämä on n. Tämä on ensi. Ja tämä on edellinen. Ja niin mitä voin tehdä tässä tapauksessa? No, olen juuri tehnyt linja 1 täällä. Pointer n saa n. En sitten sanomalla, edellinen pitäisi saada null. Joten tämä tulee olemaan nolla. Sitten aion sanoa seuraavaksi on menossa luetteloon. Ja tämä vain toimii hyvin. Tämä on null. Ja niin minä sanon, uusi solmu seuraava kentän pitäisi saada mitä tämä on. Niin, että tuo toinen null siellä. Ja sitten viimeinen asia En on tarkistaa täältä. Jos luettelo ei ole yhtä suuri kuin nolla, mutta se on yhtä kuin nolla, joten jätä että kokonaan. Ja niin kaikki mitä teen seuraavaksi on lista saa osoitin, joka kuvallisesti johtaa kuva niin. Joten se on yksi skenaario. Ja joka olit kysyä Erityisesti on tämänkaltaisessa tilanteessa, jossa meillä on jo yksi-yhtymäkohtalistassaan. Ja vaikka minä menen takaisin ylös alkuperäisessä ongelmalausekkeen Seuraavaksi voisi aseta sanoa on 34, vain vuoksi keskustelua. Joten aion vain kätevästi piirtää että tänne. Olen juuri malloced. Oletetaan Olen tarkistanut null. Nyt aion alustaa n olevan 34. Ja tämä on n. Tämä on ensi. Ja tämä on edellinen. Varmistetaan että en saat tämän taaksepäin. Edellinen tulee ensin määritelmään. Haluan korjata tämän. Tämä on vanha. Tämä on seuraava. Vaikka ne ovat identtisiä, Pidetään se johdonmukainen. Edellinen. Tämä on seuraava. Joten olen juuri malloced viestini, tarkastetaan for null, annettu 34 osaksi solmu. Edellinen saa null. Niin että antaa minulle. Seuraava saa luettelon. Joten lista on tämä. Joten tämä on nyt sama kuin piirustus tämä nuoli, niin että ne viittaavat yhteen samalla. Ja sitten olen tarkistaa, jos lista ei ole yhtä kuin nolla. Ja se ei ole tällä kertaa. Sitten aion tehdä luettelo Edellisen saa osoitin. Joten listaan ​​edellinen saa PTR. Joten tämä vaikutus on laskemisesta graafinen nuoli täällä. Ja se on tulossa hieman aaltoileva, linjat. Ja sitten lopuksi päivitän luetella osoittamaan osoitin. Joten nyt tämä viittaa tämä kaveri. Ja nyt, nyt tehdä nopeasti järki tarkistaa. Tässä lista, joka on globaali muuttuja. Ensimmäinen solmu on, todellakin, 34, koska Olen jälkeen, että nuoli. Ja se on oikein, koska haluan lisätä alussa luettelon kaikki uudet solmut. Hänen seuraava kenttä pääsenkin tämä kaveri. Jos pidän menossa, osuin seuraavaksi on null. Joten ei ole enää olemassa lista. Jos osuin edellinen, saan takaisin jos odotan. Joten on vielä muutaman vinkin, tietenkin, manipuloida. Mutta se, että lääkäri on määrännyt tehdä Tämän jatkuvasti, sitä vain on rajallinen määrä asioita et saa tehdä. Ja mikä on sen numero? Se voisi olla yksi askel. Se voi olla kaksi. Se voi olla 1000 askelta. Mutta se on rajallinen, mikä tarkoittaa, et voi ovat minkäänlaista silmukoiminen tekeillä täällä, ei rekursio, ole silmukoita. Se on vain pakko olla kovakoodatuilla linjat koodin kuten olemme tässä näytteessä. Niin seuraava ongelma 12 pyytäneet meitä täydellinen täytäntöönpano remove alle siten, että se poistaa n luettelosta lineaarisessa ajassa. Joten sinulla on hieman enemmän liikkumavaraa nyt. Voit olettaa, että n, jos käytössä luettelossa, on läsnä enintään kerran. Ja sekin on tarkoitus olla tietokilpailu-pohjainen yksinkertaistava oletus, joten että jos löydät numeron 50 jonnekin luettelossa, et myös tarvitse huolehtia edelleen kerrata, etsivät kaikki mahdolliset jäljennös 50, joka olisi vain siirtää johonkin erikoiskohtaa rajoitetun ajan. Joten poistaa, tämä oli ehdottomasti haastavampaa ja enemmän koodia kirjoittaa. Mutta ensi silmäyksellä, suoraan sanottuna, se saattaa haitata näyttää ylivoimainen ja jotain ei mitenkään sinulla voisi olla keksiä tietovisa. Mutta jos keskitymme yksittäisiä vaiheita, Toivottavasti se yhtäkkiä iskeä sinua että kukin näistä vaiheet tekee selvää järkeä jälkikäteen. Joten katsotaanpa katsomaan. Joten ensin, me alustaa osoitin olevan luetteloa. Koska haluan lineaarisen ajan, että välineet Aion olla silmukka. Ja yleinen tapa kerrata yli solmut Hakemistorakenteessa tai minkäänlaista Rakenteen iteratiivisesti on ottaa osoittimen edessä datan rakennetta ja sitten vain alkaa päivittää se ja kävellä tiesi kautta tietorakenne. Joten aion tehdä juuri näin. Vaikka osoitin, väliaikaiset muuttuja, ei ole sama kuin nolla, katsotaanpa mennä eteenpäin ja tarkistaa. Sainko onnekas? Onko n kentän solmuun olen tällä hetkellä tarkastellaan yhtä numero Etsin? Ja jos on, tehdään jotain. Nyt, huomaa tämä, jos ehto ympäröi koko Seuraavat riviä koodia. Tämä on ainoa asia välitän - löytää numero kyseessä. Joten ei ole mitään muuta, mikä yksinkertaistaa asioita käsitteellisesti hieman. Mutta nyt tajusin, ja saatat olla vain tajusi tämän jälkeen ajattelu sitä kautta vähän, siellä on oikeastaan ​​täällä kaksi asiaa. Yksi on, jos solmu on alussa lista, joka on vähän harmittaa, koska se on erikoistapaus, koska sinun täytyy käsitellä tämä asia, joka on ainoa poikkeus. Kaikkialla muualla luettelossa se on sama asia. Siellä edellisen solmun ja ensi solmu, edellisen solmun, seuraavaan solmuun. Mutta tämä kaveri on hieman erikoinen jos hän alussa. Joten jos osoitin vastaa luettelon itse, joten jos olen alussa luettelo ja olen löytänyt n, tarvitsen tehdä pari asiaa. Yksi, minun täytyy muuttaa luetteloa viittaavat seuraavaan kenttään 50. Joten olettaa, että olen yrittänyt poistaa 34. Joten tämä kaveri sai mennä pois vain hetken. Joten aion sanoa, lista saa osoitin seuraavaksi. No, tämä on osoitin. Seuraava osoittaa tänne. Joten tämä on muuttumassa tätä nuolta oikealle nyt osoittamaan tämä kaveri täällä. Muista nyt, meillä on väliaikainen muuttuja. Joten emme ole orpoja mitään solmuja, koska minulla on myös tämä kaveri minun täytäntöönpanon poistaa. Joten nyt, jos lista itsessään ei ole nolla, Minun täytyy korjata jotain. Minun täytyy nyt varmistaa, että tämä nuoli, joka on aikaisemmin osoittaa 50-34, tämä on saanut mennä pois, koska jos yritän päästä eroon 34, 50 oli parempi saa pitää eräänlainen takaisin viittaamalla sen nuoli ehdotti. Joten tein tätä linjaa. Niin sitten olen valmis. Tällöin on oikeastaan ​​aika helppoa. Paloittelu pään pois listalta on suhteellisen yksinkertaista. Valitettavasti tämä harmittaa muu lohko. Joten nyt minun on harkittava tapaus missä on jotain keskellä. Mutta se ei ole liian kauhea, paitsi syntaksille näin. Joten jos en ole alussa lista, olen jossain keskellä. Ja tämä linja täällä sanoo, alku minä tahansa solmussa olet. Siirry edelliseen solmun seuraavaan kenttään ja osoittele osoitin. Tehdään tämä kuvallisesti. Että oli tulossa monimutkainen. Joten jos minulla on edellisen Pellot - tehdään tämä - ensi aloilla täällä. Aion yksinkertaistaa minun viitteitä pikemminkin kuin vetää koko joukko asioita edestakaisin crisscrossing toisiaan. Ja nyt, haluan vain sanoa, tämä on 1, 2, 3 vuoksi keskustelua, jopa kuitenkin, että ei asetu kyseinen ongelma. Joten tässä on minun linkitetty lista. Yritän poistaa kaksi tässä Erityisesti versio tarinasta. Joten olen päivittänyt osoitin osoittavan tämä kaveri. Joten tämä on PTR. Hän osoittaa täällä. Tämä on lista, joka on olemassa maailmanlaajuisesti kuin ennen. Hän osoittaa täällä vaikka mitä. Ja nyt yritän poistaa kaksi. Joten jos osoitin osoittaa täällä, olen menossa seuraamaan, ilmeisesti, edellinen osoitin, joka asettaa minut 1. Olen niin menee sanoa, että seuraava kenttä, joka tuo minua tähän laatikko täällä on menossa yhtä osoittimen vieressä. Joten jos tämä osoitin, tämä on seuraava. Tämä tarkoittaa, että tätä nuolta tarpeisiin osoittamaan tämä kaveri. Niin mitä Koodirivin on juuri tehtävä on hieman tätä. Ja nyt, tämä on näköisenä askel oikeaan suuntaan. Olemme pääasiassa haluavat leikata 2 ulos ja keskellä 1 ja 3. Joten on järkevää, että haluamme Reitin tämä osoitin sen ympärille. Joten tämä seuraava rivi on tarkistaa, jos osoitin seuraava ei ole nolla, siellä todellakin joku oikealle 2, se tarkoittaa, että meidän on myös tehtävä pieni snip täällä. Joten minun täytyy nyt seurata tätä osoitinta ja päivittää edellisen osoittimen tämä kaveri tekemään hieman Voit kiertää täällä kohta täällä. Ja nyt, visuaalisesti tämä on mukavaa. Se on vähän sotkuinen, että siellä on kukaan suunnattu 2 enää. 2 on osoittaa vasemmalle. Ja 2 on osoittaa oikealle. Mutta hän voi tehdä mitä hän haluaa, koska hän on saamassa vapautti. Ja se ei ole väliä, mitä nämä arvot ovat enää. Tärkeää on, että jäljellä kaverit reititys edellä ja hänen alapuolellaan nyt. Ja todellakin, sitähän me teemme seuraavaksi. Me vapaa osoitin, mikä tarkoittaa kerromme käyttöjärjestelmä, olet tervetullut perimään tätä. Ja sitten lopuksi palaamme. Else implisiittisesti, jos me eivät ole palautuneet vielä, meidän täytyy jatkaa etsimistä. Joten osoitin vastaa osoittimen vieressä vain tarkoittaa siirtää tämä kaveri täällä. Siirrä tämä kaveri täällä. Siirrä tämä kaveri täällä, jos asiassa emme löytäneet numero etsimme vielä. Joten rehellisesti, se näyttää täysin ylivoimainen, mielestäni ensin silmäyksellä, varsinkin jos kamppaillut Tämän aikana tietokilpailu sitten nähdä jotain tällaista. Ja voit taputtaa itseäsi selkään. No, ei voi enää mitenkään voisin olla keksiä, että tietokilpailu. Väittäisin kuitenkin, voit jos rikot se alas näihin yksittäisiin tapauksissa ja vain kävellä läpi huolellisesti, vaikkakin tosin alle stressaavaa olosuhteissa. Onneksi kuva tehty kaiken onnellisempi. Voisit piirtää tämän kuinka monella tavalla tahansa. Sinun ei tarvitse tehdä crisscrossing juttu täällä. Voisit tehdä sen suoraan linjat kuten tämä. Mutta ydin tämän ongelman Yleensä oli ymmärtää, että kuva lopulta näyttää hieman jotain tällaista, koska vakioaikaisia ​​ymmärtää, että pidät jammailua ja häirintä ja häirintä uudet solmut alussa luettelon. Kaikki kysymykset? Luultavasti kaikkein haastavin varmasti koodaus kysymyksiä. Yleisö: Niin on lista samanlainen pää edellisissä esimerkeissä. DAVID J. MALAN: Aivan, aivan. Vain toinen nimi globaali muuttuja. Maailmanlaajuinen mitä? ROB BOWDEN: OK. Joten tämä on yksi, jossa voit piti kirjoittaa kohtaan. Jotkut ihmiset kirjoittivat esseitä tähän kysymykseen. Mutta sinun tarvitsee vain käyttää nämä kuusi termejä kuvaamaan, mitä tapahtuu, kun yrität ottaa yhteyttä facebook.com. Joten minä vain puhua läpi prosessin käyttäen kaikkia näitä ehtoja. Joten meidän selain, kirjoitamme facebook.com ja paina Enter. Joten meidän selain tulee rakentaa HTTP-pyynnön, että se tulee lähettää läpi joitakin prosessin Facebookiin Facebook vastata meille HTML sen sivun. Joten mikä on prosessi, joka HTTP-pyynnön todella saa Facebookiin? Ensin meidän täytyy kääntää Facebook.com. Joten juuri antanut nimen Facebook.com, jos todella tekee HTTP-pyynnön täytyy mennä? Joten meidän täytyy kääntää Facebook.com IP-osoite, joka yksiselitteisesti määritellään, mitä kone me oikeastaan haluat lähettää tämän pyynnön. Kannettava tietokone on IP-osoite. Mitään yhteydessä internetiin on IP-osoite. Joten DNS, Domain Name System, joka on mitä tulee käsitellä käännös alkaen facebook.com IP-osoitteen, joka te todella haluavat ottaa yhteyttä. Joten otamme yhteyttä DNS-palvelimet ja sanoa, mikä on facebook.com? Siinä sanotaan, oh, se on IP-osoite 190,212 jotain, jotain, jotain. Selvä. Nyt tiedän mitä kone Haluan yhteyden. Niin sitten lähetät HTTP-pyynnön yli automaatista. Joten miten se päästä, että kone? No, pyyntö menee reitittimen mukaan terhakka. Muista Esimerkiksi luokassa, jossa me itse nähnyt reitti, joka paketit otti kun yritimme kommunikoida. Näimme sen hypätä yli Atlantin Ocean jossain vaiheessa tai mitä tahansa. Joten viimeinen termi satamaan. Joten tämä on nyt tietokoneellesi. Sinulla voi olla useita asioita tällä hetkellä kommunikoida Internetissä. Joten en voi olla käynnissä, vaikkapa Skype. Saatan olla web-selain auki. Minulla saattaa olla jotain, torrenting tiedostoja. Joten kaikki nämä asiat ovat kommunikoida Internet jollakin tavalla. Joten kun tietokone vastaanottaa joitakin tietoja Internetistä, kuinka se tietää, mitä sovellus todella haluaa tietoa? Miten se tietää, onko tässä nimenomaisessa data on tarkoitettu torrenting sovellus vastakohtana Web-selaimeen? Joten tämä on tarkoitus satamien että Kaikki nämä sovellukset ovat väitti porttiin. Joten selaimessasi sanoo, hei, Olen kuuntelee porttia 1000. Ja torrenting ohjelma sanoo, Olen kuuntelee porttia 3000. Ja Skype sanoo, olen käyttäen portin 4000. Joten kun saat joitakin tietoja, joka kuuluu yksi näistä sovelluksista, data on merkitty, mihin satamaan se tosiasiallisesti tulee lähettää pitkin. Joten tämä kertoo, oh, minä kuulun porttiin 1000. Tiedän, silloin minun täytyy välittämään tämän pitkin minun selaimella. Niin syy on merkitystä tässä on, että web-palvelimet ovat yleensä tarkkaile porttia 80. Joten kun otan yhteyttä Facebook.com, olen tiedonsiirrossa joidenkin koneella. Mutta minun täytyy sanoa, mihin satamaan kyseisen kone Haluan kommunikoida. Ja web-palvelimet ovat yleensä kuuntelee porttia 80. Jos he halusivat, he voisivat asettaa sen niin se luettelee portissa 7000. Ja sitten web-selain, voisin manuaalisesti tyyppi Facebook.com: 7000 lähetä pyyntö porttiin 7000 Facebookin web-palvelin. DAVID J. MALAN: Ja tässä tapauksessa, vaikka Vaikka emme edellytä, että ihmiset Mainitsen tämän, tässä tapauksessa mitä porttia olisi pyynnön itse mennä? Yritä uudelleen. Täsmälleen. Eivät etsi sitä, mutta hienovaraisuutta että siellä mikään viimeinen. ROB BOWDEN: Niin HTTPS, koska se on kuuntelee nimenomaan salattu, se on portissa 4430. Yleisö: Ja sähköpostit ovat 25, eikö? DAVID J. MALAN: Outbound sähköposteja, 25, jep. ROB BOWDEN: En edes tiedä useimmat - kaikki alemmat yleensä varattu asioita. Mielestäni kaikki alle 1024 on varattu. Yleisö: Miksi sanoit 3 oli väärä numero? ROB BOWDEN: Koska IP-osoitteen, siellä on neljä ryhmää numeroita. Ja he ovat 0-255. Joten 192.168.2.1 on yhteinen lähiverkon IP-osoite. Huomaa kaikki nämä ovat alle 255. Joten kun aloitin 300, että ei mitenkään ole voinut ollut yksi numeroita. DAVID J. MALAN: Mutta se typerä clip alkaen - oli se CSI, jossa heillä oli numero, joka oli liian suuri IP-osoitteen. ROB BOWDEN: Kysyttävää tästä? Seuraava, niin täydellinen muutos topic, mutta meillä on tämä PHP array talot quad. Ja meillä on Järjestämätön lista. Ja haluamme tulostaa kunkin kohdan vain joka sisältää talon nimi. Joten meillä on foreach silmukka. Muista siis, syntaksi on foreach array kohde array. Joten läpi kunkin iterointia silmukan, talo vie yksi arvojen sisällä array. On ensimmäistä iterointia, talo tulee Cabot House. On toinen variaatio, talo olla Courier talo ja niin edelleen. Joten jokaisen quad kuin talo, olemme juuri menossa painoon - voit myös voi ovat toistaneet - luettelon kohtaan ja sitten talon nimi ja sulje luettelon kohtaan. Aaltosulkeita ovat valinnaisia ​​täällä. Ja sitten me myös sanoi kyseessä itse, muista sulkea Järjestämätön lista tag. Joten meidän täytyy poistua PHP tilassa voidakseen tehdä tämän. Tai voisimme ovat toistaneet Sulje Järjestämätön lista tag. DAVID J. MALAN: Myös hieno tässä olisi on ollut käyttää vanhaa koulua silmukka $ i = 0 0 ja käyttämällä laskurien selvittää pituus säde. Täysin kunnossa myös, vain hieman wordier. Yleisö: Joten jos olit menossa [Äänetön], tekisitkö - Unohdan mitä silmukka [kuultavissa] on. Voisitko $ quad kiinnike i? DAVID J. MALAN: Aivan. Joo, aivan. ROB BOWDEN: Jotain muuta? DAVID J. MALAN: Selvä. Kompromisseja. Joten oli risuryppäät vastauksia mahdollista, että kukin näistä. Olimme oikeastaan ​​vain etsimässä jotain pakottavia ylösalaisin ja kääntöpuolensa. Ja numero 16 kysyi, validointi käyttäjien input client-side, kuten JavaScript, sijasta server-side, kuten PHP. Joten mitä ylösalaisin tekee client-side? No, yksi niistä asioista, ehdotimme on että voit vähentää latenssi, koska olet ei tarvitse vaivautua yhteyttä palvelin, joka saattaa kestää muutaman millisekuntia tai jopa pari sekuntia välttämällä että ja vain validointi käyttäjien panos client-side by liipaisu paikan esittää ohjaajan ja vain tarkistaa, he kirjoita jotain nimelle? Oliko he kirjoittavat jotain in sähköpostiosoitetta? He valitsivat asuntolan alkaen pudotusvalikosta? Voit antaa heille hetkellinen palautetta käyttäen gigahertsin tietokone tai mitä ne ovat, että on itse asiassa niiden vastaanotto. Joten se on vain parempi käyttäjä kokevat tyypillisesti. Mutta haittapuoli tehdä client-side validointi, jos teet sen ilman myös tekee server-side validointi on, että useimmat kukaan tulossa ulos CS50 tietää että voit vain lähettää tietoja haluat palvelimeen monella tavalla tahansa. Suoraan sanottuna, useimmissa tahansa selaimella, voit klikkaa ympäri asetukset ja juuri sammutettava JavaScript, joka siinä tapauksessa, siis poistaa kaikenlainen validointi. Mutta voit myös ehkä muistaa, että vaikka en teki joitakin mystistä asioita luokassa käyttäen telnet ja todella teeskentelee olla selaimen lähettämällä get pyyntöjä palvelimelle. Ja se ei todellakaan ole jollakin JavaScript. Se on vain minun kirjoittamalla komentoja klo näppäimistö. Siis todella, mitä tahansa ohjelmoija sisällä tarpeeksi mukavuutta web ja HTTP voisi lähettää mitä tietoja hän haluaa palvelimeen ilman vahvistusta. Ja jos palvelin ei myös tarkistaa, he antoivat minulle nimi, on tämä todella toimiva sähköpostiosoite, teki he valitsevat asuntolan, saatat päätyä ylös työntämällä vääriä tai vain tyhjiä tiedot tietokantaan, joka todennäköisesti ei tule olemaan hyvä, jos olit olettaen, että se oli siellä. Joten tämä on ärsyttävää todellisuutta. Mutta yleensä, client-side validointi on suuri. Mutta se tarkoittaa kaksi kertaa niin paljon työtä. Vaikka ovat olemassa eri kirjastot, JavaScript kirjastot Esimerkiksi, jotka tekevät tästä paljon, paljon vähemmän päänsärkyä. Ja voit käyttää uudelleen joitakin koodi server-side, client-side. Mutta älä ymmärrä, että se on tyypillisesti lisätyötä. Joo. Yleisö: Eli jos me vain sanoi vähemmän turvallinen - DAVID J. MALAN: [LAUGHS] Ugh. Ne ovat aina vaikeampaa niitä ratkaista. ROB BOWDEN: Se olisi on hyväksytty. DAVID J. MALAN: Mitä? ROB BOWDEN: Loin tämän ongelman. Että olisi hyväksytty. DAVID J. MALAN: Joo. Yleisö: Cool. ROB BOWDEN: Mutta me emme hyväksy että ensimmäinen - No, mitä etsimme on jotain sinun ei tarvitse palvelimen kanssa. Emme hyväksy vain nopeammin. Yleisö: Entä älä enää käytä sivun? ROB BOWDEN: Kyllä. Se oli hyväksytty vastaus. DAVID J. MALAN: Anything jossa tunsimme se oli todennäköisempää kuin todennäköistä että tietäisit, mitä olit sanomalla, joka on kova line tehdä joskus. Käyttämällä linkitetyn listan sijaan array säilyttää lajiteltu kokonaislukujen lista. Joten ylösalaisin me usein mainitsevat kanssa sidoksissa luettelot, jotka motivoivat heidän koko käyttöönotto oli saat dynaamisuutta. Ne voivat kasvaa. Ne voivat kutistua. Joten sinun ei tarvitse hypätä kautta vanteet itse luoda enemmän muistia kanssa array. Tai sinun ei tarvitse vain sanoa, anteeksi, käyttäjän. Array on täynnä. Joten dynaaminen kasvu luettelosta. Huonona puolena tosin on linkitetty lista? Yleisö: Se on lineaarinen. Haetaanko linkitetty lista on lineaarinen sen sijaan mitä kirjaudu sisään DAVID J. MALAN: Aivan. Hakuja linkitetty lista on lineaarinen, vaikka se lajitellaan, koska voit vain seuraa näitä korppujauhoja, nämä osoittimet, alusta alkaen luettelon loppuun. Et voi hyödyntää random access ja näin, binäärihaku, vaikka se on lajiteltu, että voisit tehdä array. Ja siellä on myös toinen kustannuksia. Joo. Yleisö: Muisti tehotonta? DAVID J. MALAN: Joo. No, en olisi välttämättä sanovat tehotonta. Mutta se maksaa enemmän muistia, koska tarvitset 32 ​​bittiä jokaisen solmu ylimääräisiä osoitin kello ainakin yksittäin linkitetty lista. Nyt, jos olet vain tallentaa kokonaislukuja ja lisäät osoitin, joka on oikeastaan ​​eräänlainen ei-triviaali. Se kaksinkertaistaa muistin määrä. Mutta todellisuudessa, jos olet tallentaa linkitetty lista structs, jotka saattavat olla 8 tavua, 16 tavua, vielä kuin, että ehkä se on vähemmän of rajakustannus. Mutta se on kustannus kuitenkin. Joten joko näistä olis ollut hieno kuin haittoja. 18. PHP sijaan C kirjoittaa komentorivin ohjelma. Joten tässä, se on usein nopeampi käyttää kuten PHP tai Ruby tai Python. Sinä vain nopeasti avata up tekstieditori. Sinulla on paljon enemmän toimintoja käytössäsi. PHP on tiskiallas toimintoja, kun taas C, sinun on hyvin, hyvin vähän. Itse asiassa kaverit tietää kantapään kautta että sinulla ei ole hash taulukoita. Sinulla ei ole linkitettyjä listoja. Jos haluat ne, sinun täytyy toteuttaa ne itse. Joten yksi Ylösalaisin PHP tai oikeastaan ​​mitään tulkittu kieli on nopeus jolla voit kirjoittaa koodia. Mutta haittapuoli, näimme tämän, kun nopeasti lyöty jopa Misspeller täytäntöönpano luento PHP, on että käyttämällä tulkittava kieli on yleensä hitaampaa. Ja näimme, että todistettavasti kanssa kasvaa aika 0,3 sekuntia 3 sekuntia, koska tulkinta että todella tapahtuu. Toinen ylösalaisin oli, että ei tarvitse kääntää. Niin se myös nopeuttaa kehitystä muuten, koska sinulla ei ole kaksi askelta käynnissä ohjelma. Sinulla on vain yksi. Ja niin se on aika pakottavia samoin. Käyttäen SQL-tietokannan sijasta CSV-tiedoston tallentamiseen. Joten SQL-tietokannan käytetään pset7. CSV-tiedostoja et käyttänyt paljon. Mutta käytit sitä välillisesti pset7 kuin hyvin puhumalla Yahoo Finance. Mutta CSV on aivan Excel-tiedoston, mutta Super yksinkertainen, jossa sarakkeet ovat vain demarked pilkuilla sisällä on muuten tekstitiedosto. Ja käyttämällä SQL-tietokanta on hieman enemmän pakottavia. Se on ylösalaisin, koska saat asiat kuten valita ja lisätä ja poistaa. Ja saat oletettavasti indeksien MySQL ja muita tietokantoja, kuten Oraakkeli, rakentaa sinulle muistiin, jossa tarkoittaa valitse ei luultavasti ole olemaan lineaarista ylhäältä alas. Se on oikeastaan ​​olemaan jotain kuten binäärihaku tai jotain hengeltään samanlainen. Joten he ovat yleensä nopeammin. Mutta haittapuoli on, että se on vain enemmän työtä. Se on enemmän vaivaa. Sinun täytyy ymmärtää tietokantoihin. Sinun täytyy asettaa se. Tarvitset palvelimen suoritettavaksi että tietokanta. Sinun täytyy ymmärtää miten määrittää se. Joten nämä ovat vain näitä erilaisia ​​kompromisseja. Ottaa huomioon, että CSV-tiedosto, voit luoda sitä gedit. Ja olet hyvä mennä. Ei ole monimutkaisia ​​pidemmälle. Käyttämällä triestä sijaan hajautustaulun erillisellä ketjutus tallentaa sanakirja sanoja mieleen of pset5. Joten yrittää ylösalaisin, teoriassa ainakin on mitä? Jatkuva aikaa, ainakin jos olet hajautus on kunkin yksittäisen kirjaimet sana, kuten sinäkin saattaa olla varten pset5. Se voisi olla viisi hash, kuusi hash jos on viisi tai kuusi sanan kirjainten. Ja se on aika hyvä. Ja jos on yläraja, miten pitkä sanasi voisi olla, se on todellakin asymptoottisesti vakioaikaisia. Ottaa huomioon, että tiiviste erillisellä ketjuttamalla ongelma siellä, että Tällainen tietorakenne on, että suorituskykyä algoritmien yleensä riippuu monia asioita jo tietorakennetta. Ja se on ehdottomasti tapauksessa ketjut, jolloin enemmän tavaraa laitat osaksi tiiviste, enää niitä ketjut mennä, mikä tarkoittaa pahimmassa tapauksessa asia, saatat olla etsimässä on aina lopussa yhden näistä ketjuista, joka tehokkaasti lankeaa jotain lineaarinen. Nyt käytännössä, se voisi aivan olla, että hash-taulukko, jossa on ketjut on nopeampi kuin vastaava trie täytäntöönpanoa. Mutta se on eri syistä, muun jotka yrittää käyttää paljon muistin, joka voi itse asiassa, hidas asioita alas, koska et saa mukavaa hyödyistä jotain kutsutaan välimuistin jos asioita, jotka ovat lähellä toisiaan muistia voidaan käyttää usein nopeammin. Ja joskus voi keksiä todella hyvä hajautusfunktio. Vaikka joudut tuhlaamaan hieman muistia, kyseessä saattaa todellakin pystyä löytää asioita nopeasti eikä niin paha kuin lineaarisesti. Joten lyhyt, ei ollut välttämättä mitään näistä yksi tai jopa kaksi tiettyjä asioita etsimme. Oikeastaan ​​mitään vakuuttava kuin positiiviset ja negatiiviset yleensä kiinni meidän silmään. ROB BOWDEN: Joten ylösalaisin, teimme ei hyväksy omasta "nopeammin." Sinua piti sanoa jotain. Vaikka sanoit teoreettisesti nopeammin, Tiesimme, että olet sellainen ymmärtänyt että se on 0 1. Ja tiiviste, teoriassa, ei ole 0 1. Viittaavat mitään runtime yleensä sai sinut pistettä. Mutta "nopeammin", useimmat ratkaisut iso board jotka yrittää olivat objektiivisesti hitaampaa ratkaisuja jotka olivat hash taulukoita. Joten nopeammin ja itse ei ole oikeasti totta. DAVID J. MALAN: Dom de Dom dom. Olen luultavasti ainoa, joka tajuaa näin, joka on tarkoitus lausutaan, eikö? ROB BOWDEN: Minulla oli oikeastaan ​​aavistustakaan. DAVID J. MALAN: Se teki järkeä päähäni. ROB BOWDEN: Teen tämän yhden. OK. Joten tämä on yksi, jossa piti piirtää kaavio samanlainen saatat nähneet viimeisen tentit. Joten katsokaa tätä. Joten HTML-solmu, meillä on kaksi lapset, pään ja kehon. Joten me haara - pään ja vartalon. Pää on otsikko tag. Joten meillä on otsikko. Nyt yksi asia paljon ihmisiä Unohdin on, että nämä teksti solmut ovat elementit tämä puu. Joten tässä satumme tehdä niitä ovaaleina erottamaan niitä näitä tyyppisiä solmuja. Mutta ilmoitus myös täällä meillä on top, keski-ja pohja on lopulta teksti solmut. Joten unohtamatta niitä oli jonkin verran of yleinen virhe. Elin on kolme lasta - Näiden kolmen divs. Joten div, div, div ja sitten teksti solmun lapset näiden divs. Se on aika paljon se että kysymyksiin. DAVID J. MALAN: Ja on syytä huomata, vaikka emme asua näissä yksityiskohtia käytämme aikaa JavaScript, että määräys ei, Itse asiassa teknisesti. Joten jos pää tulee ennen elimen HTML, sen pitäisi näyttää jäljellä kehon todellinen DOM. Että hänen on yleensä vain FYI, jotain kutsutaan asiakirja järjestyksessä, jossa sillä on väliä. Ja jos olit täytäntöön jäsennin, ohjelma, joka lukee HTML rakentamisessa ylös puuhun muistissa, ollakseni rehellinen, se intuitiivisesti luultavasti mitä tehdä joka tapauksessa - ylhäältä alas, vasemmalta oikealle. ROB BOWDEN: Kysymyksiä tähän? Pitäisi tehdä seuraava? DAVID J. MALAN: Toki. ROB BOWDEN: OK. Joten tämä on puskurin ylivuoto hyökkäys kysymys. Tärkeintä on tunnistaa tässä, hyvin, miten voisi vastustaja temppu Tämä ohjelma täytäntöönpanosta mielivaltaisen koodin? Joten argv1, ensin komentoriviltä argumentti tähän ohjelmaan, joka voi olla mielivaltaisesti pitkiä. Mutta tässä käytämme memcpy kopioida argv1, joka tässä on baari. Jossa olemme sitä väitettä. Ja niin se on saamassa nimeä baarissa. Joten olemme memcpying bar tähän puskuriin c. Kuinka monta tavua me kopiointi? No kuitenkin monta tavua bar sattuu käyttää, pituus tämän väitteen. Mutta c on vain 12 tavua leveä. Jos siis kirjoitat Komentoriviargumentti joka on pidempi kuin 12 tavua, olemme menossa ylivuoto tämän Erityisesti puskuri. Nyt, miten voisi vastustaja huijata ohjelmoida täytäntöönpanovaltion mielivaltaisen koodin? Niin muista, että täällä Tärkein soittaa foo. Ja niin sitten tärkein puhelut fooksi. Katsotaanpa piirtää tämän. Joten meillä on pino. Ja tärkein on pinokehyksen alareunassa. Jossain vaiheessa, tärkeimmät puhelut fooksi. No, heti, tärkeimmät puhelut fooksi. Ja niin foo saa oman pinokehyksen. Nyt, jossain vaiheessa, foo aikoo palata. Ja meni foo palaa, meidän on tiedettävä milloin mitä koodiriviä sisällä tärkein me olivat kunnossa tietää, missä meidän pitäisi jatkaa pää. Voimme soittaa foo alkaen koko joukko eri paikoissa. Mistä tiedämme minne palata? No, meidän täytyy tallentaa se jonnekin. Joten jossain täälläpäin Tallennamme jossa meidän pitäisi palata kerran foo palaa. Ja tämä on palautusosoite. Joten miten vastustaja voi hyödyntää tästä on se, että tämä puskuri C on tallennettu, katsotaanpa sanoa, täällä on c. Joten meillä 12 tavua c. Tämä on c. Ja tämä on foo pinon rengas. Joten jos ilkeä käyttäjä syöttää lisää tavut kuin 12 tai ne tulevat komento argumentti, joka on pidempi kuin 12 merkkejä, niin aiomme ylivuoto tämä puskuri. Voimme jatkaa. Ja jossain vaiheessa, menemme pitkälle riitä, että alamme päälle tämä palautusosoite. Kun siis korvata paluuosoite, Tämä tarkoittaa, että kun foo palaa, olemme palaamassa missä pahantahtoinen käyttäjä kertoo sen mukaan arvosta riippumatta se tuli, millä tahansa merkkiä käyttäjä kirjoittaa. Joten jos pahantahtoinen käyttäjä ollaan erityisen taitava, hän voi olla tässä palata jossain printDef toiminto tai jossain malloc toiminto, juuri missään mielivaltainen. Mutta vielä fiksu on mitä jos hänellä on käyttäjä palaa täällä. Ja sitten aloitat täytäntöönpanosta näitä riviä koodia. Joten tässä vaiheessa, käyttäjä voi syöttää mitä hän haluaa tälle alueelle. Ja hän on täydellinen hallinta yli oman ohjelman. Kysymyksiä siitä? Joten seuraava kysymys on valmis uudelleen toteutus foo siten, että se ei enää vaarassa. Niin siellä pari tapaa olisit voinut tehdä tämän. Meillä on vielä c vain on pituuden 12. Olet olisivat saattaneet muuttaa tätä osana ratkaisua. Lisäsimme myös tarkistaa, jotta Varmista baari ei ollut null. Vaikka et tarvitse että täydet pisteet. Joten me tarkastamme ensin merkkijonon pituus bar. Jos se on yli 12, niin eivät itse tehdä kopio. Joten se on yksi tapa vahvistaa sitä. Toinen tapa vahvistaa on sen sijaan ottaa c vain olla pituudeltaan 12, on se olla pituudeltaan strlen (bar). Toinen tapa vahvistaa on todella vain palata. Joten jos sinulla oli juuri päässyt eroon kaikista Tässä, jos olisit juuri poistanut kaikki riviä koodia, olisit saanut täydet pisteet, sillä tämä toiminto ei oikeastaan ​​mitään aikaiseksi. Se kopioimalla komentoriviltä argumentti johonkin array sen paikalliset pinokehyksen. Ja sitten asia on palaamassa. Ja mitä se aikaan on mennyt. Joten paluu oli myös riittävä tapa saada täydet pisteet. DAVID J. MALAN: Ei aivan henkeä kysymys, mutta hyväksyttävää kohti spec kuitenkin. ROB BOWDEN: Kysymyksiä mitään siitä? Yksi asia, että olet ainakin tarvitaan on koota koodia. Joten vaikka teknisesti et ole haavoittuvaisia, jos koodia ei koota, emme hyväksy sitä. Ei kysymyksiä? OK. DAVID J. MALAN: Haluatko sanoa tämän otsikon? ROB BOWDEN: Ei. DAVID J. MALAN: Joten tämä, tämä oli joko hyvä uutinen tai huono uutinen. Tämä on kirjaimellisesti sama ongelma kuin ensimmäinen tietokilpailu. Ja se on lähes sama ongelma pset1. Mutta se oli tarkoituksella yksinkertaistettu olevan yksinkertaisempi pyramidi, joka voi olla ratkaistu hieman yksinkertaisempi iterointia. Ja oikeastaan, mitä olimme tulossa at tässä ei ollut niinkään logiikkaa, koska luultavasti tässä vaiheessa, olet mukavampaa kuin olit viikolla yksi silmukoita tai miksi silmukoita, mutta todella erottaa toisistaan, että olet hieman mukava ajatus, että PHP ei ole vain siitä, mitä ohjelmointi. Se voi todella käyttää kieltä kirjoittaa komentoriviltä ohjelmia. Ja todellakin, se mitä yritimme kiinnittää huomiota. Tämä on komentoriviltä PHP-ohjelma. Joten C-koodia täällä, kun oikea C, ei korjata PHP. Mutta koodi todella on sama. Jos vertaa ratkaisuja Quiz 0 vastaan ​​Quiz 1, huomaat, että se on lähes identtinen, lukuun ottamatta jotkut dollarin merkkejä ja puuttuessa tietotyyppi. Erityisesti jos me katsomaan täällä, näet, että me kerrata tässä tapauksessa 1 läpi 7. Olisimme voineet tehdä sen 0-indeksi. Mutta joskus, mielestäni se on vain henkisesti helpompi miettiä asioita 1-7. Jos haluat yhden korttelin, sitten kaksi lohkot, sitten kolme, sitten dot, piste, piste seitsemän. Olemme j alustetaan 1 ja sitten luotan jopa i. Ja täällä kaikki on muuten samanlainen. Mutta huomionarvoisia ovat pari asiaa. Annamme sinulle nämä kaksi riviä, tämä ensin yksi, goofily nimettiin shebang terävät bang. Ja että vain määrittää polun, kansio, jossa ohjelma voi olla totesi, että haluat käyttää tulkita tämän tiedoston. Ja sitten linja jälkeen, ja tarkoittaa tietenkin syötä PHP-tilaan. Ja linja alareunaan tarkoittaa exit PHP tilassa. Ja tämä toimii, yleisesti, ja tulkita kielillä. Se on tavallaan ärsyttävää jos kirjoitat ohjelman tiedosto nimeltä foo.php. Ja sitten käyttäjien tarvitsee vain muistaa, OK, ohjelman suorittamiseen, I täytyy kirjoittaa "php tilaa foo.php." Laji harmittaa jos ei muuta. Ja se paljastaa myös, että ohjelma on kirjoitettu PHP, joka ei ole kaikkien että valaisevat käyttäjälle. Joten voit poistaa. Php kokonaan muistamme luento. Ja voit itse tehdä. / Foo jos olet chmodded sitä tekemällä siitä executable. Joten chmod + x foo olisi tehnyt niin. Ja jos sinulla on myös lisätä roska täällä. Mutta oikeasti, ongelma oli saada at tulostaa jotain tällaista. Ei HTML, ei C-koodia varmasti, vain joitakin PHP. Joten Milo palasi ongelmatilanteissa 25. Ja 25, saitte seuraavan luuranko-koodi, joka oli melko yksinkertaisia ​​web-sivulle. Ja mehukas osa HTML-viisas laski täällä, missä meillä on rungon sisältä lomake, jossa on yksilöllinen tunnus tuotantopanosten jonka sisällä oli kaksi tuloa, yksi idean nimi yksi joiden ajatus-painiketta. Ensimmäinen oli kirjoittaa tekstiä, toisen tyypin lähettävät. Ja niin me annoimme teille, oikeastaan ​​enemmän ainesosia kuin mitä tarvitaan, juuri niin te oli mahdollisuuksia, joita Tämän ongelman ratkaisemiseksi. Sinun ei ehdottomasti tarvitse kaikki nämä tunnukset. Mutta sen avulla voit ratkaista sitä eri tavoin. Ja ylös huipulla, huomaa, että Tavoitteena oli käynnistää ikkuna näin - Hei, Milo! - pop up-selaimen avulla Super yksinkertainen, jos ei ruma, hälytystoiminto. Ja niin lopulta tämä kuihtuu käsitteellisesti jotenkin kuuntelee lausumat muodossa client-side , Ei server-side, jotenkin vastata, että näkökannan tarttumalla Arvo, joka kirjoitetaan sisään nimen kenttään ja se näytetään kielellä elin hälytys. Joten yksi tapa voit tehdä tämä on kanssa jQuery, joka näyttää hieman rakenteeltaan hämmentävää aluksi. Voit tehdä tämän kanssa puhdasta DOM-koodi - document.getelement ID. Mutta katsotaanpa katsomaan tätä versiota. Minulla on pari tärkeää linjat ensin. Joten meillä on tämä linja, joka on identtinen, mitä olet ehkä nähnyt vuonna, uskon, form2.html luokan viikolla 9. Ja tämä on vain sanoa, suorita seuraava koodi, kun asiakirja on valmis. Tämä on tärkeää vain siksi, HTML sivut luetaan ylhäältä alhaalta, vasemmalta oikealle. Ja siksi, jos yrität tehdä jotain koodin tänne jossain DOM elementti, jotkut HTML-tunniste, se alas täällä, teet sen liian aikaisin, koska tämä ei ole edes luettu muistiin. Joten sanon tämän document.ready line, me sanomme, tässä hieman koodia, selain. Mutta eivät suorita tätä kunnes koko asiakirja on valmis, että on DOM puu olemassa muistissa. Tämä yksi on hieman yksinkertaista, jos syntaktisesti vähän erilainen, jos sanon, tartu HTML-elementti, jonka ainutlaatuinen tunniste on tuloa. Sitähän hash-tunniste tarkoittaa, yksilöllinen tunnus. Ja sitten soitan. Lähetä. Joten. Esittää tässä funktio, toisin tunnetaan menetelmä, joka on sisällä objektin vasen puolella, että en korosta. Joten jos luulet tuotantopanosten esine muistiin - ja se todellakin on. Se solmu puussa - . Esittää keinoja, kun tämän lomakkeen tämä tunnus on toimitettu, suorita seuraava koodi. En välitä mitä nimi toiminto on olen täytäntöönpanosta. Joten tässä olen käyttäen, kuten ennen, mikä on kutsutaan lambda-toiminto tai Nimetön toiminto. Se ei ole ollenkaan älyllisesti mielenkiintoinen muuta kuin se ei ole nimeä, mikä on hienoa, jos olet vain ikinä kutsua sitä kerran. Ja sisällä on olen itse hoitaa jättämisen muodossa. Haluan ensin julistaa muuttuja nimeltään arvo. Ja mitä sitten on vaikutus tämän korostettu osa täällä nyt? Mitä tämä tekemistä korkeatasoinen minulle? Yleisö: Se saa arvon, joka Käyttäjä ei itse HTML alla. Se saa että tunnus ja sitten toteaa sen arvoa. DAVID J. MALAN: Aivan. Se tarttuu solmu, jonka ainutlaatuinen tunniste on nimi. Se saa arvon osalta, joista on, oletettavasti, mitä käyttäjä kirjoituskoneella itseään. Ja sitten se tallentaa että muuttuja nimeltä arvoa. Sivuhuomautuksena, sinulla voisi olla myös tehnyt tätä hieman eri tavalla. Täysin hyväksyttävää tekemällä jotain valhe var arvo saa document.getElementById. Ja siksi se on vähän ikävä käytä jQuery. "Nimi". Arvon. Niin täysin hyväksyttävää. Erilaisia ​​tapoja tehdä tätä. jQuery vain taipumus olla hieman täsmällisemmin ja varmasti suositumpi keskuudessa ohjelmoijia. Nyt olen tekemässä hieman järki tarkistaa, koska ongelma lausuma me nimenomaan sanoi, jos Käyttäjä ei ole vielä kirjoittanut hänen Nimi, älä näytä hälytyksiä. Mutta voit tarkistaa, että vain tarkistamalla tyhjä merkkijono quote-lainaus jos on mitään todella olemassa. Mutta jos se ei ole sama kuin quote-lainaus, Haluan soittaa hälytykset. Ja mielenkiintoinen osa tässä on se, että käytämme plus toimija, joka tekee mitä JavaScript? KETJUTA. Joten se on kuin PHPs dot operaattori. Sama idea, hieman eri syntaksia. Ja olen vain luoda merkkijono, joka näit kuvakaappaus - Hei, niin ja niin. Ja sitten viimeistä yksityiskohtaa on tämä. Miksi return false sisällä Tämän Nimetön toiminto? Yleisö: Ei ole arvoa. Laitat sen muodossa. Se vain kertoo, jos arvo ei ole yhtä tyhjä, niin tee se. Oli tyhjä tätä väitettä. DAVID J. MALAN: OK. Kuitenkin varovainen. Ei kukaan muu täällä. Ja että paluu vääriä ulkopuolella ja jos olosuhteet. Joten tämä korostetun rivin, return false, toteuttaa mitä tahansa, kun lomake lähetetään. Mitä palaavat vääriä sisäosat Tapahtumakäsittelijän kuten sitä kutsutaan, kyseiseen tapahtumaan ollessa jättämisestä? Yleisö: Koska se tapahtuu vain kerran. DAVID J. MALAN: tapahtuu vain kerran. Ei aivan. Joo? Yleisö: Se estää lomakkeen toimittavat oletustoimintaa, joka tekisi sivun reload. DAVID J. MALAN: Aivan. Joten olen ylikuormitusta aikavälillä esittää täällä, koska minä sanon, muoto on esittämisestä. Mutta kuten ehdotatte, se ei todellisuudessa ole jätetty tosi HTTP tavalla. Kun valitset Lähetä, koska meidän onsubmit käsittelijä, olemme kuuntelua että lomakkeen lähettäminen niin sanotusti. Me sitten tekee meidän juttu JavaScript-koodin. Mutta olen tietoisesti palaamassa vääriä, sillä se, mitä en halua tapahtuvan Sekunnin murto myöhemmin on koko lomake itse toimitetaan web palvelimelle keskeinen arvo pareja muuttamalla URL olla jotain q = kissoja tai mitä teimme, esimerkiksi luokassa. En halua että näin tapahtuu, koska ei ole palvelin kuuntelee tätä lomakkeen lähettäminen. Se on puhtaasti tapahtuu JavaScript-koodia. Ja siksi en edes ole toiminta määritteen minun muodossa, koska olen aio tähän kohteeseen koskaan mene palvelimelle. Joten se on toimitettu. Mutta emme kuuntelua, että lomake esittämisen ja estää oletuksena käyttäytyminen, joka on todella mennä aina palvelimelle. Yleisö: niin pitää se client-side. DAVID J. MALAN: Keeping se client-side. Aivan oikein. Seuraavaksi oli minun oh MySQL. ROB BOWDEN: OK. Joten tämä ensimmäinen kysymys oli yleensä karkea ihmisille. Vaikka myöhemmin niistä meni paremmin. Joten sinulla oli valittava oikeat tiedot tyyppejä molemmat näistä sarakkeita. Ja molemmat on joitakin asioita heille, että tekevät valinnan vaikeaksi. Joten int ei ollut voimassa kirjoita numeron. Syynä on 12-numeroinen tunnus numero, int ei ole tarpeeksi suuri tallentaa yhteensä numeroa. Joten voimassa valinta olisi ollut iso int jos satut tietää, että. Toinen vaihtoehto olisi voinut olla char alalla pituus 12. Joten jompikumpi näistä olisi toiminut. Int eivät. Nyt, tasapaino, muistelen pset7. Joten me nimenomaan käytetään desimaali tallentaa osakkeiden arvo tai - DAVID J. MALAN: Cash. ROB BOWDEN: Cash. Käytimme desimaalin tallentaa määrä rahaa, että käyttäjä on tällä hetkellä. Joten syy teemme joka on koska muistan, kellukkeet. Ei liukuluku tarkkuus. Se ei voi tarkasti tallentaa käteistä arvoja, kuten me haluamme täällä. Joten desimaalin pystyy tarkasti tallentaa jotain, sano, kahden desimaalin tarkkuudella. Siksi tasapaino, haluamme sen olla desimaalin eikä kellua. DAVID J. MALAN: Ja myös, liian, vaikka se olisi voinut olla fiksu muissa yhteyksissä ajatella, ehkä tämä on mahdollisuus int. Otan vain seurata asioita penniä. Koska me nimenomaan osoitti oletus arvo on 100,00, että Sen voisi vain olla int. Ja toinen hienovaraisuus liian kanssa numero oli, että se ei ollut tarkoitus olla kompakysymys. Mutta muistuttaa, että int MySQL, kuten C, ainakin laite, on 32-bittinen. Ja vaikka emme odota sinun tietää tarkalleen, kuinka monta numeroa että keinot, älä muistaa, että eniten voit edustavat mahdollisesti 32-bittinen numero on suunnilleen mitä? Mikä numero me aina sanoa? 2 32, joka on mitä suurin piirtein? Sinun ei tarvitse tietää tarkasti. Mutta karkeasti on hyödyllistä elämässä. Se on noin 4 miljardia euroa. Joten olemme sanoneet, että muutaman kerran. Tiedän, että olen sanonut, että muutaman kerran. Ja se on noin 4 miljardia euroa. Ja se on hyvä sääntö peukalo tietää. Jos sinulla on 8 bittiä, 256 on maaginen numero. Jos sinulla on 32 bittiä, 4 miljardia antaa tai ottaa. Joten jos vain kirjoittaa 4 miljardia, huomaat, että se on vähemmän numeroita kuin 12, mikä tarkoittaa, että ei selvästikään tarpeeksi ilmaisukyky kaapata 12-numeroinen tilinumero. ROB BOWDEN: OK. Joten toisilla meni paremmin. Joten olettaa, että pankki asetetaan 20 dollaria kuukaudessa Yhtiövastike kaikkiin tileihin. Millä SQL-kysely voisi pankki vähentää 20 dollaria jokaisesta luottaa, vaikka se johtaa joissakin negatiiviset saldot? Joten periaatteessa on neljä päätyyppiä kyselyt - lisätä, valitse, päivittää ja poistaa. Niin mitä luulemme aio käyttää täällä? Päivitä. Joten katsotaanpa katsomaan. Joten tässä olemme päivittää. Mitä taulukossa me päivittää tilejä? Joten päivittää tilejä. Ja sitten syntaksin sanoo, mitä tileillä me päivittää? No, olemme arvostelemassa tasapaino yhtä nykyinen arvo tasapaino miinus 20. Joten tämä päivittää kaikki rivit Tilien, vähentämällä 20 dollaria tasapainoa. DAVID J. MALAN: Yleinen virhe tässä, vaikka joskus anteeksi sitä, oli oikeastaan ​​PHP täällä soittamalla hakutoiminto tai käyttöön lainausmerkkeihin kaiken, ei tarvitse olla siellä. ROB BOWDEN: Muista, että MySQL on erillinen kieli PHP. Satumme olla kirjallisesti MySQL PHP. Ja PHP on sitten sen lähettämistä yli MySQL-palvelimen. Mutta sinun ei tarvitse PHP voidakseen kommunikoida MySQL-palvelimen. DAVID J. MALAN: Aivan. Joten ei muuttujat dollarin merkkejä tulisi olla tässä yhteydessä. Se voi vain tehdä kaikki matematiikka tietokannassa itse. ROB BOWDEN: OK. Joten seuraava. Onko tämä seuraava? Joo. Joten mitä SQL-kysely voisi pankki noutaa tilinumerot sen rikkain asiakkaita, joilla on saldot yli 1000? Joten mikä on neljä päätyyppiä aiomme haluat täällä? Valitse. Joten haluamme valita. Mitä me haluamme valita? Mitä sarake haluamme valita? Me nimenomaan haluamme Valitse numero. Mutta jos olet sanonut tähden, me myös, että. Joten valitse numero mitä pöytään? Tilit. Ja sitten kunnon haluamme? Jossa tasapaino on suurempi kuin 1000. Olemme myös hyväksynyt suuremman tai yhtä suuri kuin. Viimeinen. Millä SQL-kysely voisi pankki lähellä, ts. poistaa jokaisen huomioon, että on tasapaino 0 dollaria? Joten mikä neljästä olemme menossa haluavat käyttää? Poista. Joten syntaksin? Poista mitä pöytään? Tilit. Ja sitten, millä ehdolla haluamme poistaa - jos saldo on nolla. Joten poistaa kaikki rivit tilit jos saldo on nolla. Kysymyksiä mitään näistä? Haluatko jonoon? DAVID J. MALAN: Jono opas. Joten tässä yksi, me annoimme teille hieman tuttu rakenne, joka selvitimme bittinen luokassa rinnalla structs, joka oli tiedot rakenne liittyvät hengessä. Ero joskin jono on että meidän piti jotenkin muistaa, kuka oli jonon, suurissa osittain siten, että voisimme tehdä enemmän tehokas käyttö muistia, ainakin jos käytimme array. Koska muistaa, jos meillä on erilaisia, jos Esimerkiksi, tämä on edessä jono, jos saan jonoon täällä, ja sitten joku saa linjassa takanani, takanani, takanani, ja yksi henkilö astuu ulos linja, voit voisi, kuten näimme joitakin ihmisen vapaaehtoisia luokassa, ovat kaikki siirtää tällä tavalla. Mutta yleensä, joilla jokainen tehdä jotain ei ole parasta aikaa ohjelmassa, koska se tarkoittaa, että algoritmi on käynnissä missä asymptoottinen ajoaika? Se on lineaarinen. Ja minusta tuntuu, että on typerää. Jos seuraava henkilö on vuorossa seuraava henkilö, joka on tarkoitus mennä myymälä, ne eivät kaikki ole liikkua yhdessä. Päästä tämä henkilö repelin kun se aika tulee, esimerkiksi. Jotta voimme säästää hieman aikaa siellä. Ja niin tehdä, että kuitenkin, että keinot että jonon tai jonon on menossa edetä asteittain syvemmälle ja syvemmälle osaksi array ja lopulta ehkä todella kietoa jos käytämme array tallentaa ihmisiä tässä jonossa. Joten voit melkein ajatella array pyöreä tiedot rakenne siinä mielessä. Joten jotenkin täytyy seurata koko sitä tai oikeastaan ​​lopussa se ja sitten jos alussa on. Joten ehdotamme, että ilmoitatte Yksi tällainen jono, kutsuvan se q, vain yksi kirjain. Sitten ehdotamme, että edessä on alustetaan nollaksi, ja että koko alustetaan nollaan. Joten nyt, ei mitään sisällä jonoa. Ja pyydämme sinua täyttämään täytäntöönpanoa enqueue alla siten, että toiminto lisää n- loppuun q ja palauttaa sitten totta. Mutta jos q on täynnä tai negatiivinen, toiminto pitäisi sen sijaan palauttaa false. Ja me annoimme teille pari oletuksia. Mutta ne todellisuudessa ole toiminnallisesti asiaa, vain että bool olemassa, koska, teknisesti, bool ei olemassa C ellet sisällyttää tietyt header-tiedosto. Niin että oli vain varmistaa, ettei ollut tämä temppu Kysymys sellainen asia. Joten enqueue ehdotimme näytteessä ratkaisuja toteuttaa seuraavasti. Yksi, tarkistamme ensin helppous, matalalla roikkuvat hedelmät. Jos jono on täynnä tai numero yrität lisätä on vähemmän kuin nolla, jonka totesimme erittely ongelma pitäisi ei voida sallia, koska me vain haluamme ei-negatiivisia arvoja, niin kannattaa vain return false välittömästi. Joten jotkut suhteellisen helppoa virheentarkistukset. Jos vaikka haluat lisätä, että todellinen numero, sinun piti tehdä vähän Tarkoitan nyt. Ja tässä se on vähän ärsyttävää henkisesti, koska sinun täytyy selvittää, miten käsitellä kaareva. Mutta alkiot Ideana se on etua meille on, että ympäröivä edellyttää usein modulaarinen aritmeettinen ja mod-operaattori prosenttia puolella, jossa voit siirtyä suuremman arvon takaisin nollaan ja sitten yksi ja kaksi ja kolme ja sitten takaisin noin nollaan, yksi ja kaksi ja kolme ja niin edelleen uudelleen ja uudelleen. Joten miten me ehdotamme tehdä tämä on että haluamme indeksinä array kutsutaan numerot meidän kokonaislukuja valehdella. Mutta sinne, haluamme ensin tehdä koosta riippumatta jono, mutta lisätään sitten, että mitä tahansa edessä lista on. Ja vaikutus, joka on tehnyt meistä oikeaan asentoon jonossa ja oleta, että ensimmäinen henkilö vastaa on alussa, jonka hän tai hän ehdottomasti voisi olla, jos me Myös siirtymässä kaikille. Mutta olemme vain työllistää itsellemme jos otimme että tiettyä polkua. Jotta voimme pitää sitä suhteellisen yksinkertainen. Meillä täytyy muistaa, että me vain lisätty int jonoon. Ja sitten me vain palata totta. Samaan aikaan dequeue, pyysimme voit tehdä seuraavaa. Toteuttaa se siten, että se dequeues, että on Poistaa ja palauttaa, int edessä jonossa. Voit poistaa int, riittää unohtaa sen. Sinun ei tarvitse ohittaa sen vähän. Joten se on silti todella olemassa. Aivan kuten tiedot kiintolevyltä, me vain sivuutettu se tosiasia, että se on nyt siellä. Ja jos q on tyhjä, meidän pitäisi sen sijaan palata negatiivinen 1. Joten tämä tuntuu mielivaltainen. Miksi palata negatiivinen 1 sijasta vääriä? Joo. Yleisö: Q tallentaa positiivisia arvoja. Koska sinulla on vain tallentaa positiivisia arvoja Q, negatiivinen on virhe. DAVID J. MALAN: OK, totta. Niin, koska olemme vain säilytykseen positiivinen arvoja tai nolla, niin se on hienoa palautettava kielteinen arvo Sentinel arvo, erikoissymboli. Mutta olet kirjoittamasta historiaa siellä, koska syy me olemme vain paluu ei-negatiivisia arvoja on koska haluamme on Sentinel arvoa. Joten tarkemmin, miksi ei vain return false virhetapauksissa? Joo. Yleisö: Olet epäonnistui palata kokonaisluku. DAVID J. MALAN: Aivan. Ja tämä on C saa melko rajoittava. Jos sanot aiot palata int, sinulla palata int. Et voi saada hienoja ja palautuvan bool tai float tai merkkijono tai jotain. Nyt puolestaan ​​JavaScript ja PHP ja joillakin muilla kielillä voi itse asiassa, oletko palaamassa eri tyyppisiä arvoja. Ja se voi todella olla hyötyä, jos voisit palata positiivinen ints, nollia, negatiivinen ints tai vääriä tai null jopa merkitä virhe. Mutta meillä ei ole, että monipuolisuutta C. Joten dequeue, mitä me aikoo tehdä on - ROB BOWDEN: Voit palauttaa false. Se on vain, että väärä on hash määritellä vääriä nollaan. Joten jos palaat vääriä, palaat nolla. Ja nolla on voimassa asia meidän jonossa, Kielteisten 1 ei ole, jos false sattui olemaan negatiivinen 1. Mutta sinun ei pitäisi edes täytyy tietää, että. DAVID J. MALAN: Tuo miksi en sano sitä. ROB BOWDEN: Mutta se ei ollut totta että et voi palata vääriä. DAVID J. MALAN: Toki. Joten dequeue, huomaa hyväksymme mitätöidä argumenttina. Ja se johtuu siitä emme ole ohimennen mitään sisään Haluamme vain poistaa elementin edessä jonossa. Joten miten me saatamme edetä näin? No, ensinnäkin, tehdään tämä nopeasti järki tarkistaa. Jos jonon koko on 0, siellä ei tehtävää. Palata negatiivinen 1. Valmis. Niin, että muutaman rivin minun ohjelma. Joten vain neljä riviä jäljellä. Joten tässä päätän dekrementoidaan kokoa. Ja pienentämällä kokoa tehokkaasti tarkoittaa sitä, että olen unohtanut jotain on siellä. Mutta minulla on myös päivittää, jos edessä numerot. Niin tehdä, että tarvitsen tehdä kaksi asiaa. Haluan ensin täytyy muistaa, mitä numero on jonon, koska minun täytyy palata, että asia. Joten en halua vahingossa unohtaa siitä ja sitten korvata sen. Olen juuri menossa muistaa int. Ja nyt haluan päivittää q.front voidaan q.front +1. Joten jos tämä oli ensimmäinen henkilö linja, nyt haluan tehdä plus 1 osoitat seuraava henkilö linjassa. Mutta minun täytyy käsitellä sitä ympäröivä. Ja jos kapasiteetti on maailmanlaajuinen vakio, että menee saanen varmistaa kuten Osoitan hyvin viimeinen henkilö linja, modulo-operaation tuo minut takaisin nollaan jonon. Ja joka käsittelee ympäröivä täällä. Ja sitten lähden palata n. Nyt, tarkkaan ottaen, en on julistaa n. Minulla ei ollut napata se ja säilytä sitä väliaikaisesti, koska arvo on edelleen olemassa. Niin voisin vain tehdä oikea aritmeettinen palata entisen johtajan jonon. Mutta minä vain tuntui, että tämä oli selvempi todella napata int, laita se N, ja palata sitten, että selvyyden vuoksi, mutta ole ehdottoman välttämätöntä. Psst. He kaikki lausuttavia päähäni. ROB BOWDEN: Eli ensimmäinen kysymys on binääripuu ongelma. Joten ensimmäinen kysymys on, olemme antanut näitä numeroita. Ja haluamme jotenkin lisätä ne nämä solmut siten, että se on voimassa binäärihakupuu. Joten yksi asia muistaa binäärihaku puita on, että se ei ole vain, että asia vasemmalle on vähemmän ja asia oikeus on suurempi. Sen on oltava, että koko puun vasemmalla on vähemmän, ja koko puu oikealla on suurempi. Joten jos laitan 34 täällä huipulla, ja sitten Laitoin 20 täällä, niin se on voimassa niin pitkälle, koska 34 täällä. 20 on menossa vasemmalle. Niin, että vähemmän. Mutta en voi sitten laittaa 59 täällä, koska vaikka 59 on oikealla puolella 20, se on edelleen vasemmalla puolella 34. Niin, että rajoitus mielessä, Helpoin tapa lienee ratkaista tämä Ongelmana on vain eräänlainen näistä numeroista - niin 20, 34, 36, 52, 59, 106. Ja asenna ne vasemmalta oikealle. Joten 20 menee täällä. 34 menee täällä. 36 menee täällä. 52, 59, 106. Ja voit myös voinut tajunnut kanssa jotkut kytkemällä ja toteuttamisessa, Odota, minulla ei ole tarpeeksi numeroita täyttämään tämän tänne. Joten minun täytyy reshift mitä minun reitti huomautus tulee olemaan. Mutta huomaa, että kolmessa viimeisessä, jos luet vasemmalta oikealle, se on kasvavassa järjestyksessä. Joten nyt haluamme julistaa mitä struct tulee olemaan varten solmut tässä puussa. Mitä me tarvitsemme binääripuun? Joten meillä on arvo tyyppiä int, joten jotkut int arvo. En tiedä, mitä me kutsutaan se ratkaisu - int n. Meidän osoitin vasen lapsi ja osoitin oikea lapsi. Joten se tulee näyttää tältä. Ja se tulee todella näyttävät ennen Milloin kaksinkertaisesti sidottu lista tavaraa, joten ilmoitus - Aion tarvitse vierittää kaikki Paluumatkalla alas ongelmaan 11. Niin huomaa se näyttää identtinen tämän, paitsi me vain sattuvat kutsua näitä eri nimiä. Meillä on vielä kokonaisluku arvo ja kaksi osoitinta. Se on vain, että sen sijaan hoitoon osoittimet viittaavat myös seuraava asia ja edellinen asia, olemme hoitoon osoittimet osoittamaan vasen lapsi ja oikea lapsi. OK. Niin, että meidän struct solmu. Ja nyt, ainoa tehtävä meidän toteuttaa tähän on Traverse, joka haluamme mennä yli puiden, tulostus ulos arvot puun järjestyksessä. Joten katson tässä, me haluaisi tulostaa pois 20, 34, 36, 52, 59, ja 106. Miten me sen aikaan? Joten se on melko samanlainen. Jos näit aiemmin tentti ongelma että halusit tulostaa koko puun pilkuilla välillä kaikki, se oli itse asiassa jopa helpompaa kuin se. Joten tässä on ratkaisu. Tämä oli huomattavasti helpompaa jos teit sen rekursiivisesti. En tiedä, jos joku yritti tehdä se iteratiivisesti. Mutta ensin meillä on perusta tapauksessa. Entä jos juuri on nolla? Sitten me vain aio palata. Emme halua tulostaa mitään. Else aiomme kulkea rekursiivisesti alas. Tulosta koko vasemman alipuun. Joten tulostaa kaiken vähemmän kuin minun nykyinen arvo. Ja sitten aion tulostaa itse. Ja sitten aion recurse alas minun koko oikea alipuu, joten kaikki suurempi kuin minun arvo. Ja tämä on menossa painoon ulos kaikki kunnossa. Kysymyksiä siitä, miten tämä todella aikaan, että? Yleisö: Minulla on kysymys on [kuultavissa]. ROB BOWDEN: Joten yksi tapa lähestyä mitään rekursiivinen ongelma on ajatelkaa siitä kuin sinun on ajateltava kaikista nurkassa tapauksissa. Mieti siis, että haluamme tulosta tämä kokonaisen puun. Joten kaikki aiomme keskittyä on tässä solmu - 36. Rekursiokutsua, me teeskennellä nämä vain toimivat. Joten tässä, tämä rekursiivinen kutsu poikittainen, me edes ajattelematta siitä, vain liikkumisesta vasen kolme, kuvitella, että jo tulostaa 20 ja 34 meille. Ja sitten kun me lopulta rekursiivisesti soittaa Traverse on oikeus, joka oikein tulostaa 52, 59 ja 106 meille. Joten koska tämä voi tulostaa 20, 34, ja muut voivat tulostaa 52, 59, 108, kaikki mitä meidän tarvitsee pystyä tekemään on tulosta ourself keskellä sitä. Joten tulostaa kaikki ennen meitä. Tulosta itsestämme, joten nykyinen solmu tulosta 36, säännöllinen printf, ja sitten tulostaa kaiken meidän jälkeemme. DAVID J. MALAN: Täällä rekursio saa todella kaunista. On tämä uskomaton harppaus uskosta, jossa teet pienimmätkin vähän työtä. Ja sitten annat jonkun muu hoitaa loput. Ja että joku muu on, ironista kyllä, voit. Niin vakavia tonttu pistettä, jos selaat ylös kysymykset - ROB BOWDEN: On kysymyksiä? DAVID J. MALAN: Ja alas vähän numerot, ei kukaan tiedä, missä nämä luvut tulevat? ROB BOWDEN: Minulla ei kirjaimellisesti ole aavistustakaan. DAVID J. MALAN: Ne näkyvät koko tietokilpailu. Yleisö: Ovatko ne samat numerot? DAVID J. MALAN: Nuo luvut. Pikku pääsiäismunia. Joten ne teistä katsomassa netissä kotiin, jos voit kertoa meille sähköpostitse heads@CS50.net mitä merkitystä Näiden toistuvien kuusi numeroa ovat koko Quiz 1, me suihku sinulle hämmästyttävän huomiota lopullisessa luento ja stressipallo. Kiva, hienovarainen. ROB BOWDEN: Viimeisiä kysymykset noin mitään tietovisa?