[Powered by Google Translate] [6 savaitė] [David J. Malan] [Harvardo universiteto] [Tai CS50.] [CS50.TV] Tai CS50, o tai yra 6 Savaitės pradžia, taip pora naujų priemonių, dabar yra prieinami jums pasinaudoti, kurių pirmasis, vadinamas CS50 Stilius. Šansai yra, jei jūs panašus į mane ar bet mokymo bičiulių, jūs tikriausiai matė programą, kurios stilius atrodo truputį kažką panašaus į tai. Gal pradėdami pjauti kai kampus vėlai naktį, ar jums kovoti su ja vėliau, ir tada TF arba CA ateina darbo valandomis. Tada jis mums sunku skaityti. Na, šis kodas yra sintaksiškai teisinga, ir jis bus sudaryti, ir tai tikrai bus paleisti. Bet tai tikrai ne dėl stiliaus 5. Bet dabar, jei mes einame į šį katalogą čia ir pastebėjo, kad turiu conditions2.c- ir aš paleisti šią naują komandą, style50, šio failo conditions2.c, Enter, pastebėsite, kad jis man pranešė, kad jis buvo stilizuotas. Gedit pastebėjau, kad failas buvo pakeistas diske, ir jei aš spustelėkite paleisti, visos jūsų problemos dabar yra automatizuotas. [Plojimai] Tai yra vienas iš dalykų, mes padarėme šį savaitgalį. Suprasti, kad ji yra netobula, nes yra keletas kodas , kad ji tiesiog negali būti Stilizuoti puikiai, bet suprantame, kad tai dabar yra įrankis, kurį galite pasinaudoti jei tik sutvarkyti kai daugiau errantly pateikti Garbanotasis petnešos ir pan. Bet daugiau įtikinamų CS50 Registracijos. CS50 patikrinimui, jūs iš tikrųjų galite atlikti tuos pačius korektiškumo bandymus savo kodą, kad mokymo bičiulių galime. Tai yra komandų eilutės įrankis, kuris ateina dabar į prietaisą kuo greičiau padaryti, kaip už update50 pset 4 specifikacijos, o jūs jį naudoti iš esmės panašus į šį. Jūs paleisti komandų check50. Tada jums perduoti komandinės eilutės argumentu, arba apskritai žinomi kaip jungiklis ar vėliava. Apskritai, dalykų, kurie brūkšnelių vadinamas jungiklis komandinės eilutės programa, todėl c aprašoma patikrinimai, kad jūs norite paleisti. Išbandymas, kurį norite paleisti individualiai pažymimas šios eilutės, 2012/pset4/resize. Kitaip tariant, tai tik savavališkai, bet unikalus ID kad mes naudojame unikaliai identifikuoti pset 4 korektiškumo testus. Ir tada jums nurodyti, atskirtų tarpais, sąrašas failus, kad jūs norite ákelti CS50 patikrinimo analizei. Pavyzdžiui, jei aš einu į mano sprendimas čia resize.c leiskite man atverti didesnę terminalo lange- ir aš einu į priekį ir paleisti tegul sako check50-c 2012/pset4/resize ir tada aš eiti į priekį ir nurodyti failų pavadinimus, resize.c, ir tada paspauskite Enter, ji suspaudžia, Ji išsiunčia, jis pasitikrina, ir aš tiesiog nepavyko visa krūva bandymų. Viena raudonai viršutiniame kairiajame kampe sako, kad egzistuoja resize.c ir BMP. Tai buvo bandymas. Tai buvo klausimas, mes paprašė. Ir tai yra nelaimingas, nes atsakymas buvo neteisingas. Baltas tekstas žemiau sako, kad tikimasi, bmp.h egzistuoti, ir tai tik mano kaltė. Aš pamiršau įkelti jį, todėl man reikia įkelti abu failus, resize.c ir bmp.h. Bet dabar pastebėsite, visi kiti bandymai yra geltonos spalvos, nes jie nebuvo paleisti, ir taip smiley veido yra vertikali, nes jis nei laimingi, nei liūdna, bet mes turime ištaisyti šį klausimą raudonai, iki šių kiti patikrinimai bus paleisti. Leiskite man išspręsti šią problemą. Leiskite man nutolinti ir iš naujo, šį kartą su bmp.h taip pat į komandų eilutę, Enter, ir dabar, jei viskas vyks gerai, ji ketina patikrinti ir tada grįžti rezultatą laikykite savo kvėpavimą visai žalia, o tai reiškia, darau tikrai gerai pset 4 šiol. Jūs galite matyti ir daryti išvados aprašomasis tekstas čia ką ji yra, mes patikrinome. Mes pirmiausia tikrinama, ar failai yra? Mes tada buvo patikrintas, veikia resize.c kompiliavimo? Tada mes patikrinome, ar ji nemano dydį 1x1 pikselių BMP, kai n, dydį faktorius, yra 1. Dabar, jei jūs neturite idėjos, kas n yra, jums bus, kai jūs pasinerti į pset 4, bet kad tiesiog yra normalumas patikrinti, įsitikinkite, kad jūs ne dydžio keitimas vaizdas ne visi, jei dydžio keitimo koeficientas yra 1. Jei, priešingai, ji didinama 1x1 pikselio iki 1x1 pixel BMP 2x2 teisingai kai n yra 2, tada panašiai, mano formų. Trumpai tariant, tai reiškia, vienas, imtis kirtimo pirštų iš lygtį tiesiai prieš jus pateikti savo pset. Jūs žinosite, ką jūsų TF netrukus žinoti , kai jūs einate, kaip pateikti kai kurie iš šių probleminių rinkinių, taip pat pedagoginis motyvacija yra tikrai įdėti galimybė, kad priešais jus, kai jūs žinote, a priori , kad yra savo kodą klaidas ir bandymai, kurie negali būti perduodama, jūs galite įdėti daugiau efektyvaus laiko priekyje spręsti šias problemas , o ne prarasti taškų, gauti grįžtamąjį ryšį iš savo TF ir tada eiti "Ahh, kaip aš turėjo suprato, kad iš. Dabar bent yra įrankis, kad padėtų jums rasti, kad. Jis nesiruošia atkreipti dėmesį į tai, kur klaida yra, bet jis jums pasakys, kas yra simptominis. Dabar suprantame, bandymai nebūtinai yra baigtinis. Tiesiog todėl, kad jūs gaunate ekranas visiškai žalia smiley veidus nereiškia, kad jūsų kodas yra tobulas, tačiau tai nereiškia, kad jis praėjo tam tikrus tyrimus, nustatytas pagal spec. Kartais mes neatleidžia patikrinimus. Pavyzdžiui, Detektīvromāns, vienas iš aspektų pset 4, rūšies nuvilia, jei mes suteikiame Jums atsakymas, kokia ji yra, ir yra būdų atskleisti kas yra tas asmuo yra to raudono triukšmo. Visada nurodyti spec ateityje pset 5 tolyn kokių patikrinimų yra už jus. Jūs pastebėsite, ten tai white URL apačioje. Nes dabar, tai yra tik diagnostikos produkcija. Jei norite aplankyti šį URL, jūs gausite visą krūva Crazy, paslaptingas žinutes kad jūs pažvelgti pro, bet tai daugiausia darbuotojų , kad galėtume diagnozuoti ir derinimo klaidas check50 pati. Be triukšmo, galime pereiti, kur mes nerašomas. CS50 biblioteka mes laikė savaime keletą savaičių, bet tada praeitą savaitę, mes pradėjome lupimasis atgal vieną iš jos sluoksnių. Eilutę, už ką, ​​o ne atsisakyti įsišaknijusių? [Studentai] Char. Char *, kuri buvo char * visą šį laiką, bet dabar mes neturime apsimesti, kad tai faktinis duomenų tipas eilutė. Atvirkščiai, tai buvo tam tikros rūšies sinonimas char * eilutė yra simbolių seka, kodėl ji prasmės atstovauti eilutes kaip char * s? Ką char * į šią eilutę koncepciją? Taip. >> [Studentų] pirmasis simbolis. Geras, pirmasis simbolis, bet ne visai pirmasis simbolis. Tai-[Studentai] Adresas. Geras, pirmą pobūdžio adresas. Viskas, ko reikia atstovauti eilutę, kompiuterio atmintyje yra tik unikalus adresas, labai pirmasis baitas. Jūs net neturi žinoti, kiek laiko ji yra , nes, kaip jūs galite suprasti, kad atliekami dinaminiai? [Studentų] String ilgis. Galite skambinti eilutės ilgis, puikus, bet kaip veikia eilutės ilgio? Ką jis daro? Taip. [Studentų] Keep going,, kol gausite null charakterį. Taip, tiksliai, tai tiesiog kartojasi už linijos, o linijos, nepriklausomai nuo * iki galo, ir pabaiga yra atstovaujama \ 0, vadinamasis nul personažas, nul, neturi būti painiojama su NULL, kuris yra rodyklė, kuris ateis į pokalbį vėl šiandien. Nuplėšus sluoksnį GetInt, tada mes paėmė pažvelgti GetString bei primena, kad šių funkcijų, ar tikrai, GetString, naudojant tam tikrą funkciją faktiškai apdoroti, kad, skaityti ir analizuoti, vartotojo įvestį. Ir kas buvo, kad nauja funkcija? Scanf arba sscanf. Ji iš tikrųjų ateina į keletą skirtingų skonių. Yra scanf, yra sscanf, yra fscanf. Nes dabar, nors, galime sutelkti dėmesį į vienas labiausiai puikiai iliustruoja, ir leiskite man eiti į priekį ir atidaryti prietaiso kaip šį failą, scanf1.c. Tai yra super paprasta programa, bet kad daro kažką, kad mes niekada padaryti be CS50 bibliotekoje. Gauna iš naudotojo int. Kaip tai veikia? Na, line 16 yra, pastebėti, kad mes skelbiame int vadinama X, ir šio taško istorija, kas yra x vertė? [Nesigirdi studentas atsakas] [M. David] Teisė, kas žino, kai šiukšlių vertė gali būti, kad 17, mes tiesiog pranešti vartotojui man duoti numerį, prašome, ir 18 žingsnis yra ten, kur jis bus įdomus. Scanf atrodo, kad skolintis iš printf idėja, kad ji naudoja šiuos formato kodus į kabutes. % D, žinoma, dešimtainis skaičius. Bet kodėl aš artimųjų & X, o ne tik X? Pirmoji yra teisinga. Taip. [Nesigirdi studentas atsakas] Tiksliai, jei šios programos tikslas, kaip ir pačios funkcijos GetInt yra gauti iš vartotojo int galiu perduoti funkcijas visi kintamieji noriu, bet jei aš neturiu perduoti jas nuorodą arba adresu arba žymeklis, visi šiandienos tikslais sinonimai, tada, kad funkcija neturi galimybės keisti šio kintamojo turinį. Tai būtų perduoti kopija, lygiai kaip Buggy versija apsikeitimo sandorio , kad mes kalbėjome apie kelis kartus dabar. Bet vietoj to, atlikdami & X, aš tiesiog eina kokiais? [Studentų] adresas. >> X adresą. Tai, pavyzdžiui, piešimo funkcija vadinama scanf žemėlapį ir sako: čia, tai yra kompiuterio atminties riekė nurodymai , kad galite eiti laikyti šiek tiek sveikasis skaičius, in Tam, kad sscanf dabar daryti, kad operatorius, ką gabalas sintaksė jis ketina naudoti nors mes negalime matyti, nes kažkas ją parašė šią funkciją? Kitaip tariant - kas tai? [Studentų] X skaityti. Ten bus šiek tiek skaityti, bet tik atsižvelgiant į X čia. Jei scanf išlaikė x adresą, sintaksiškai, operatorius privalo egzistuoti kažkur viduje scanf įgyvendinimo, kad scanf iš tikrųjų galite rašyti skaičių 2 tuo adresu? Taip, kad *. Prisiminkite, kad * yra mūsų dereference operatorius, kuris iš esmės reiškia, ten. Sukūrę buvo perduotas adresą, kaip yra šiuo atveju, scanf tikriausiai, jei mes iš tikrųjų pažvelgė aplink savo kodą daro * x arba atitinkamą faktiškai eiti tuo adresu ir įdėti tam tikrą vertę. Dabar, kaip scanf gauna įvesties iš klaviatūros, mes pakylės mūsų rankas šiandien. Tiesiog manyti, kad operacinė sistema leidžia sscanf kalbėti vartotojo klaviatūros, tačiau šiuo metu dabar atitinka 19, kai mes tiesiog atspausdinti x, atrodo, kad tuo atveju, kad scanf įdėti int x. Tai yra būtent tai, kaip scanf veikia, ir prisiminti praėjusią savaitę tai tiksliai, kaip GetString ir GetInt ir kitų šeimos funkcijų galiausiai veikia, nors ir šiek tiek prieštarauja, pavyzdžiui, sscanf o tai reiškia, nuskaityti vietoj klaviatūros eilutę. Bet Paimkime bent šiek tiek variacijos išvaizdą. Į scanf2, aš tikrai įsukus. , Kas yra negerai, ir aš paslėpti komentaras, kuris paaiškina, kiek kas yra negerai su šia programa, versija 2? Techninį ir šiuo metu. Atrodo gana gerai. Tai gražiai įtraukta, tačiau gerai, kaip apie galime genėti trumpesnius klausimus? Linija 16. Kas linija 16 daro tiksliai, bet techninė anglų kalba? Kaip šiek tiek nepatogu. Taip, Maiklai. [Studentų] Ji nukreipta į eilutę pirmąją raidę. Gerai, arti. Leiskite man įgnybti, kad šiek tiek. Nukreipta į pirmąją raidę eilutę, jūs deklaruojate kintamasis vadinamas buferis kad į pirmą eilutę adresą, arba, tiksliau, kad bus nurodyti tiksliau char. Pastebėsite, kad jis nėra iš tikrųjų nukreipta niekur, nes nėra priskyrimo operatorius. Nėra jokios lygybės ženklas, todėl visi mes darome, yra paskirstant kintamasis vadinamas buferis. Taip atsitinka, kad 32 bitų, nes tai rodyklė, ir tikriausiai buferio turinys galiausiai bus pateikta char adresą, bet dabar, ką buferis yra? Tiesiog kai fiktyvus, kas žino, kai šiukšlių vertė, nes mes ne aiškiai inicializuoti jį, todėl mes neturėtų prisiimti nieko. Gerai, kad dabar eilutė 17-ką eilutė 17 daryti? Gal, kad bus šilta tai padaryti. Jis spausdina eilutę, tiesa? Jis spausdina Styginių prašome. Eilutė 18 rūšies susipažinę dabar, kad mes tik pamačiau tai dispersiją bet su kitokiu formatu kodą, todėl 18 eilutėje, mes sakau scanf čia yra atminties riekė adresas. Aš noriu, kad jis skambėtų į eilutę, kurį rodo nuo% s, tačiau problema yra ta, kad mes ne padaryti keletą dalykų. , Kas yra viena iš problemų? [Studentų] Jis bando dereference NULL pointeris. Geras, null, arba tiesiog kitaip nežinoma patarimų. Jūs dalijamos scanf adresą, bet ką tik sakė prieš akimirką , kad adresas yra šiek tiek šiukšlių vertė, nes mes ne iš tikrųjų priskirti jį su visa ir taip sakai scanf efektyviai eiti įdėti eilutę, bet mes nežinome, kur čia dar yra, taip mes ne iš tikrųjų skiriama atminties buferio. Be to, ką tu taip pat nėra net pasakoja scanf? Manau, kad tai buvo atminties riekė, ir tai buvo ne šiukšlių vertė, , bet jūs vis dar nesako scanf kažką svarbaus. [Studentų] Jei jis iš tikrųjų yra, Ampersand. Ampersand, todėl šiuo atveju, tai gerai. Nes buferis jau deklaruotas kaip rodyklė * gabalas sintaksę, mums nereikia naudoti ampersendo , nes ji jau adresas, bet aš manau, kad aš girdėjau jį čia. [Studentų] Kaip didelis yra? Geras, mes ne sakau scanf kaip didelis buferis yra, , o tai reiškia, net jei buferis rodyklė, mes sakome scanf, įdėti eilutę, bet čia gali būti 2 baitai, tai gali būti 10 baitų, tai gali būti megabaitas. Scanf neturi jokios idėjos, nes tai yra atminties riekė matyt, tai nėra dar eilutę. Tai tik eilutę, kai rašote simbolių ir \ 0 iki tos atminties riekė. Dabar tai tik keletas atminties riekė. Scanf nebus žinoti, kada sustoti parašydami tuo adresu. Jei jūs prisimenate, kai praeityje pavyzdžių, kai aš atsitiktinai klaviatūros įvestą į bando perpildymo buferio, ir mes kalbėjomės penktadienį, apie būtent tai. Jei priešininkas kažkaip įleidžia į savo programą daug didesnę žodį ar sakinį ar frazė, tada jūs tikėjotės, galite viršyta daug atminties riekė, kurie gali turėti blogas pasekmes, kaip visame pačios programos. Mes turime išspręsti šią problemą kažkaip. Leiskite man nutolinti ir eiti į šios programos 3 versija. Štai šiek tiek geriau. Šioje versijoje pastebėsite skirtumą. Atitinka 16, aš vėl skelbiantis kintamasis vadinamas buferis, bet kas tai yra? Tai 16 simbolių masyvas. Tai yra gerai, nes tai reiškia, aš dabar gali pasakyti scanf čia yra tikrasis atminties riekė. Jūs galite beveik galvoti apie masyvų dabar kaip rodykles, nors jie faktiškai nėra lygiavertis. Jie elgiasi skirtingai skirtinguose kontekstuose. Bet tai tikrai tas atvejis, buferis nuorodas 16 gretimuose simbolių, nes tai, ką masyvas ir buvo keletą savaičių dabar. Čia aš čia sakau scanf riekė atminties. Šį kartą, tai tikrai iš atminties riekė, bet kodėl ši programa vis dar eksploatuojamas? Kas negerai dar? Jau sakiau duok man 16 baitų, bet- [Studentų] Ką daryti, jei jie tipo daugiau nei 16? Tiksliai, ką daryti, jei vartotojas įveda į 17 simbolių ar 1700 simbolių? Iš tiesų, galime pamatyti, jei mes negalime užkliūti šios klaidos dabar. Tai geriau, bet nėra tobula. Leiskite man eiti į priekį ir kaupti šią programą, paleisti, kad scanf3. Aš bėgsiu scanf3, styginių prašome: labas, ir mes, atrodo, bus gerai. Leiskite man pabandyti šiek tiek ilgiau žmogus, hello there. Gerai, tegul neturi hello there how are you today, "Enter". Kaip rūšies pasisekė čia, tegul say hello how are you. Damn it. Gerai, kad mums pasisekė. Leiskite pamatyti, jei mes galime išspręsti šią problemą. Ne, jis nesiruošia leisti man nukopijuoti. Pabandykime tai vėl. Viskas gerai, stovėti. Mes pamatyti, kaip ilgai aš galiu apsimesti, kad sutelkti dėmesį, o dar tai daryti. Damn it. Kad, o, iš tikrųjų. Čia mes eiti. Taškas. Tai nemalonu, nors ji taip pat yra, tai taip pat yra vienas iš sujaukė šaltinių rašyti programas, kurios klaidas, nes jie pasireiškia tik vieną kartą, o kartais. Realybė yra tai, kad net jei jūsų kodas yra visiškai neveikia, gali tik visiškai neveikia vieną kartą, o , nes kartais, iš esmės kas atsitinka, kai operacinės sistemos skiria šiek tiek daugiau atminties, nei jums iš tikrųjų reikia, dėl bet kokios priežasties, ir, kad niekas kitas naudoja atmintį, iš karto po to, kai savo riekė 16 simbolių, todėl, jei jūs einate į 17, 18, 19, nepriklausomai nuo, tai nėra tokia baisi. Dabar, kompiuteris, net jei jis nėra gedimų, tuo momentu, kažkas ilgainiui gali naudoti baitų skaičių 17 arba 18 arba 19, , kuriose pabrėžiama, kad jūs įtraukėte savo duomenis, nors ir pernelyg ilgas, ketina gauti perrašyti potencialiai kitu funkcija. Tai nebūtinai ketina likti sveiki, bet ji nebūtinai sukelti seg kaltės. Tačiau šiuo atveju, aš pagaliau pakankamai simbolių kad aš iš esmės viršijo savo atminties segmentą, ir BAM, operacinė sistema, sakė: "Deja, tai nieko gero, segmentavimas kaltė". Ir pažiūrėkime dabar, jei tai, kas lieka čia mano kataloge pastebėsite, kad turiu šį failą čia, core. Atkreipkite dėmesį, kad tai dar kartą paragino core dump. Tai iš esmės failas, kuriame savo programos atminties turinį to momento, kai jis sudužo, ir tiesiog pabandykite šiek tiek pavyzdį leiskite man eiti čia ir paleisti gdb scanf3 ir tada nurodyti trečiojo argumento, vadinama pagrindinė, ir pastebėsite čia, kad jei aš sąrašą kodą, galėsime, kaip įprasta, su gdb pradėti vaikščioti per šią programą, ir galiu paleisti ir kuo greičiau aš paspauskite žingsnio komandą gdb kaip tik aš hit potencialiai Buggy eilutę po rašyti didžiulis eilutę, Aš galėtų iš tikrųjų nustatyti jį čia. Daugiau informacijos apie tai, nors, skyriuje kalbant apie pagrindinių sąvartynų ir pan, kad jūs iš tikrųjų galite baksnoti aplink viduje core dump ir pamatyti, ką linija programa nepavyko. Bet tada rodykles ir adresais klausimų? Nes šiandien mes ketiname pradėti vartoti savaime suprantamu dalyku, kad šie dalykai egzistuoja ir mes žinome, ką jie yra. Taip. [Studentų] Kaip gi jūs neturite įdėti ampersendo daliai Geras klausimas. Kaip atvykti aš neturėjau įdėti simbolių masyvas šalia ampersendo, kaip aš anksčiau su dauguma iš mūsų pavyzdžių? Trumpas atsakymas yra, matricos yra šiek tiek ypatingas. Jūs galite beveik manote, buferis, kaip iš tikrųjų yra adresas, ir jis tiesiog taip atsitinka, kad tuo atveju, kad kvadratas laikiklis notacijos yra patogiau, kad galėtume eiti į laikiklio 0 1, laikiklis, laikiklis 2, be naudoti * žymėjimą. Tai yra šiek tiek balto melas, nes matricas ir rodyklės , iš tikrųjų yra šiek tiek skiriasi, tačiau jie gali dažnai, bet ne visada gali būti vartojami kaip sinonimai. Trumpai tariant, kai funkcija laukiasi žymiklį į atminties riekė, galite perduoti, kad adresas buvo grąžintas pagal malloc ir mes pamatyti, malloc vėl prieš ilgas, ar galite perduoti jį masyvo vardą. Jūs neturite ampersendo su matricomis, nes jie jau iš esmės nori adresus. Štai viena išimtis. Skliaustus, kad jie ypatingas. Ar jūs galėsite įdėti ampersendo prie buferio? Ne šiuo atveju. Kad neveiks nes, vėlgi, šio kampo atveju kur matricos yra ne visai tikrųjų adresai. Bet mes galbūt grįžti, kad iki kol su kitais pavyzdžiais. Pabandykime išspręsti problemą čia. Mes turime duomenų struktūra, kad mes buvo naudojant tam tikrą laiką, žinomas kaip masyvo. Byla punktas, kad tai, ką mes tik turėjo. Bet matricos turi šiek tiek upsides ir praradimas. Matricos yra gražus, kodėl? Kas yra vienas dalykas, kad jums patinka tiek, kiek jums patinka masyvų apie masyvų? Kas patogu apie juos? Kas yra patrauklus? Kodėl mes pristatyti juos į pirmąją vietą? Taip. [Studentų] Jos gali saugoti daug duomenų, ir jūs neturite naudoti visą dalykas. Jūs galite naudoti skyrių. Geras, masyvo galite saugoti daug duomenų, ir jūs nebūtinai turite naudoti visa tai, todėl galite overallocate, , kuris gali būti patogu, jei jūs nežinote, iš anksto, kaip daug ką galima tikėtis. GetString yra puikus pavyzdys. GetString, parašyta ne mums, neturi jokios idėjos, kiek simbolių galima tikėtis, todėl tai, kad mes galime skirti gabaliukus vientisos atminties yra gera. Matricos taip pat išspręsti problemą, mes matėme prieš porą savaičių dabar jūsų kodas prasideda pereina į kažką labai prastai parengto. Prisiminkite, kad aš sukūriau studentų struktūrą, pasišaukęs Dovydą, ir tada, kad iš tikrųjų buvo alternatyva, nors, kad kintamasis vadinamas vardą ir kito kintamojo pavadinimu, manau, namas, kitas kintamasis vadinamas ID, nes toje istorija Aš tada norėjau pristatyti ką nors kita patinka Rob į programą, taip, tada aš nusprendė palauk, Man reikia pervadinti šiuos kintamuosius. Susisiekime kasyklos NAME1, ID1, house1. Susisiekime Rob NAME2 house2, ID2. Bet tada palauk minutėlę, ką apie Tommy? Tada mes turėjome tris kintamuosius. Mes pristatėme kažkas kitas, keturių kintamųjų rinkinius. Pradėjo gauti purvinas pasaulis labai greitai, todėl mes pristatėme structs, o kas įtikinamų apie struct? Ką C struct jums tai padaryti? Tai tikrai nepatogu šiandien. Ką? >> [Nesigirdi studentas atsakas] Taip, būtent, Typedef leidžia jums sukurti naują duomenų tipą, struct struct raktinį žodį, leidžia jums įdėti į kapsulę konceptualiai susiję duomenų vienetų , o po to jiems skambinti kažką panašaus studentas. Kad buvo gerai, nes dabar mes galime modeliuoti daug daugiau rūšiuoti konceptualiai atitinka studento sąvoka kintamasis o ne savavališkai, turintys vieną eilutę, po vieną asmens tapatybę ir pan. Matricos yra gražus, nes jie leidžia mums pradėti valyti savo kodą. Bet kas yra neigiama masyvo? , Ką galite daryti? Taip. [Studentų] Jūs turite žinoti, kaip didelis jis yra. Jūs turite žinoti, kaip didelis jis yra, todėl rūšies skausmas. Tiems iš jūsų, ankstesnės programavimo patirties žinome, kad daug kalbų, pavyzdžiui, "Java", galite paprašyti atminties riekė, specialiai masyvo, kaip didelis, kurių ilgis, turtinės padėties, taip sakant, ir tai tikrai patogu. C, jūs negalite net skambinti strlen bendrinis masyvo nes strlen, nes žodis reiškia, yra tik stygos, ir jūs galite išsiaiškinti, eilutės ilgis, nes šio žmogaus konvencijos A \ 0, bet masyvo, bendrąja prasme, yra tik atminties riekė. , Jei tai int masyvas, ten nebus kai specialus simbolis pabaigoje laukia Jūsų. Jūs turite prisiminti, masyvo ilgį. Kitas masyvo neigiama, auginami savo galvą į save GetString. Kas yra kitą masyvo neigiama? Pone, tik tu ir aš šiandien. [Nesigirdi studentas atsakas] >> Tai ką? Jis deklaruojamas kamino. Gerai, deklaruojamas kamino. Kodėl gi ne jums tai patinka? [Studentų], nes jis gauna pakartotinai naudoti. Ji gauna pakartotinai naudoti. Gerai, jei jūs naudojate masyvą paskirstyti atmintį, Pavyzdžiui, jūs negalite grįžti, nes tai ant kamino. Gerai, kad trūkumas. Ir kaip apie vieną su kita masyvo? Kai jūs jį skirti, esate rūšies prisukamas, jei jums reikia daugiau vietos, , nei masyvas. Tada mes pristatėme, prisiminti, malloc, kuris davė mums galimybę dinamiškai paskirstyti atmintį. Bet kas, jei mes bandėme kitą pasaulį apskritai? Ką daryti, jei mes norėjome išspręsti keletą šių problemų , kad mes, o ne-mano parkeris užmigo čia ką daryti, jei mes, o ne norėjo iš esmės sukurti pasaulį, kad ne ilgiau kaip tai? Tai masyvas, ir, žinoma, šios rūšies pablogėja, kai mes paspauskite masyvo pabaigos, ir aš dabar nebeturi kito sveikojo skaičiaus ar kitokio pobūdžio vietos. Ką daryti, jei mes tarsi Preemptively pasakyti, kodėl ne mes atsipalaiduoti šis reikalavimas, kad visi šie atminties gabaliukus ribotis atgal atgal, ir kodėl gi ne, kai man reikia int arba char tik duok man vietos vienam iš jų? Ir kai aš turiu kitą, duok man kitą erdvę, ir kai man reikia kito, duok man kitą erdvę. Kurio privalumas yra tai, kad, jei kas nors per čia mano atminties, ne big deal. Imsiu šį papildomą atminties riekė čia tai jo. Dabar, tik sugavimo čia yra tai, kad beveik jaučiasi turiu visa krūva įvairių kintamųjų. Tai jaučiasi penkių skirtingų kintamųjų, galinčių daryti poveikį. Bet kas, jei mes pavogti idėją nuo styginių kurią mes kažkaip susieti šiuos dalykus kartu konceptualiai, ir ką daryti, jei aš padariau tai? Tai yra mano labai prastai parengtas rodyklė. Tačiau tarkime, kad kiekvienas iš šių atminties gabaliukus atkreipė dėmesį į kitą, ir šis vaikinas, kuris neturi broliai ir seserys savo teisę, neturi tokio rodyklę. Tai yra iš tikrųjų, tai, kas vadinama susieta sąrašas. Tai nauja duomenų struktūra, kuri leidžia mums skirti atminties riekė, tada kitą, tada kitą, tada kitą, bet kuriuo metu mes norime programos metu, ir mes prisiminti, kad jie visi kažkaip susiję pažodžiui Grupavimo juos kartu, o mes padarėme, kad pictorially su rodykle. Bet kodu, koks būtų mechanizmas, per kurį galėtų kažkaip sujungti, beveik kaip nulio, viena į kitą riekė riekė? Mes galime naudoti rodyklę, tiesa? Nes tikrai rodyklė, kad manimi vyksta viršutiniame kairiajame aikštėje, šis vaikinas šį vieną, gali būti viduje šioje aikštėje ne tik kai int, ne tik kai char, bet kas, jei aš iš tikrųjų skiriama šiek tiek daugiau erdvės, kad dabar, kiekvienas mano gabaliukus atminties, nors tai kainuos man, dabar atrodo šiek tiek stačiakampio formos, kai vienas iš atminties gabaliukus naudojamas numerį, kaip ir skaičiumi 1, ir tada, jei šis vaikinas saugo skaitmeniu "2", tai kitas gabalas atminties naudojama rodykle, arba konkrečiau, žymeklis. Ir manau, kad aš čia įrašykite šį numerį iš 3, o aš naudoju tai, pabrėžiama, kad vaikinas, ir dabar šis vaikinas, tarkime, aš tik noriu tris tokius gabaliukus atminties. Aš nubrėžti liniją, kad, nurodant null. Nėra jokių papildomų pobūdis. Iš tiesų, tai, kaip mes galime eiti apie įgyvendinimo kažkas, kad vadinama susieta sąrašas. Sąrašas nauja duomenų struktūra, o tai yra pirmasis žingsnis link daug mėgėjas duomenų struktūras, kad pradėti spręsti problemas kartu "Facebook" tipo problemų linijų ir tipo "Google" problemų kur jūs turite didelius duomenų rinkinius, ir ji nebepalaiko gabalai jį laikyti viską Kaimynystėje ir naudoti kažką panašaus į tiesinės paieškos ar net kažkas panašaus dvejetainis paieškos. Jūs norite dar geresnių rodymo laikus. Iš tiesų, viena Šventosios Grails mes kalbame apie vėliau šią savaitę arba kitą yra algoritmas, kurio trukmė yra pastovi. Kitaip tariant, ji visada mano pačios trukmės laikotarpį, nesvarbu, kaip didelis indėlis yra, ir kad iš tikrųjų būtų įtikinamų, netgi labiau nei kas nors logaritminis. Kas tai yra ekrane čia? Kiekviena iš stačiakampių, yra būtent tai, ką aš ką tik piešė rankomis. Bet dalykas kairėje yra specialus kintamasis. Tai bus viena rodyklė, nes vienas kabliuko susietą sąrašą, kaip šie dalykai yra vadinami yra, kad jūs turite pakabinti ant vieno galo susietojo sąrašą. Tiesiog patinka su eilutę, jūs turite žinoti, pirmą char adresą. Tas pats spręsti dėl susijusių sąrašų. Jūs turite žinoti, kad pirmą riekė atminties adresą , nes iš ten, jūs galite pasiekti kiekvieną kitą. Neigiama. Kokia kaina mes mokėti už šio universalumo dinamiškai didelis duomenų struktūra, kad, jei mes kada nors reikia daugiau atminties, gerai, tiesiog skirti dar vieną gabalą ir parengti rodyklę sena į naują sąrašo uodega? Taip. [Studentų] Tai užtrunka maždaug dvigubai daug vietos. Tai užtrunka dvigubai daug vietos, todėl tai tikrai neigiama, ir mes matėme tai kompromisas prieš tarp laiko ir erdvės ir lankstumo dabar, mes turime ne 32 bitus kiekvienam iš šių numerių. Mums tikrai reikia 64, 32 skaičių ir 32 už rodyklė. Bet hey, aš turiu 2 GB RAM. Pridėti kitą 32 bitų čia ir čia neatrodo, kad didelis spręsti. Tačiau kai duomenų rinkiniai dideli, tai tikrai prideda iki tiesiog dvigubai tiek, kiek. Kaip dar neigiama dabar, ar ką funkciją mes pasiduoti, jei mes atstovaujame dalykų sąrašus su susietą sąrašą ir ne masyvo? [Studentų] Jūs negalite feed jį atgal. Jūs negalite feed jį atgal, todėl jūs tipo prisukamas, jei jūs vaikščioti iš kairės į dešinę linijos ar while cikle ir tada jūs suprasite, "O, aš noriu grįžti prie sąrašo pradžioje." Jūs negalite, nes šių patarimų tik eiti iš kairės į dešinę, kaip strėlės rodo. Dabar galite prisiminti sąrašo pradžioje su kito kintamojo, bet tai sudėtingumą reikia nepamiršti. Masyvas, nesvarbu, kaip toli jums eiti, jūs visada galite padaryti minuso, minusas, minusas, atėmus ir grįžti atgal, iš kur tu atėjai. Kaip dar neigiama čia? Taip. [Nesigirdi studentas klausimas] , Todėl Jūs galite jūs iš tikrųjų tiesiog pasiūlė duomenų struktūrą, vadinamas dvigubai susijęs sąrašas ir iš tiesų, jums reikės pridėti dar vieną žymiklį į kiekvieną iš šių stačiakampių kad eina kita kryptimi, aukštyn dabar, jums gali eiti į priekį ir atgal, kurių neigiama dabar jūs naudojate tris kartus daugiau atminties, kaip mes panaudojome ir sudėtingumą, taip pat pridedant kodą, jūs turite parašyti, teisę ją gauti. Tačiau visa tai yra galbūt labai pagrįstų kompromisų, jei atstatymas yra svarbesnis. Taip. [Studentų] Jūs taip pat negali turėti 2D susietą sąrašą. Gerai, jūs negalite iš tikrųjų turi 2D susijęs sąrašą. Galima. Tai toli gražu ne taip paprasta, kaip masyvo. Kaip masyvo, jūs skliaustai atidaromi uždarą skliaustelius, skliaustai atidaromi, uždaryti laikiklį, ir jūs gaunate šiek tiek 2-dimensijų struktūrą. Jūs galite įgyvendinti 2-dimensijų susijęs sąrašą jei jūs add-proposed-trečiąją žymeklį į kiekvieną iš šių dalykų, ir jei jūs manote apie kito sąrašo, dar ne 3D stilius iš ekrano į mus visus, o tai tik dar vienas tam tikros rūšies grandinės. Mes galime tai padaryti, bet tai nėra taip paprasta, kaip rašyti skliaustai atidaromi, kvadratas laikiklis. Taip. [Nesigirdi studentas klausimas] Gerai, kad tai yra realus skandalistas. Šie algoritmai, kad mes pined daugiau, kaip oh, dvejetainis paieškos skaičių masyvo galite ieškoti ant lentos arba per telefono knygą, daug greičiau, jei jūs naudojate skaldyk ir valdyk ir dvejetainis paieškos algoritmas, bet dvejetainis paieškos reikalaujama dvi prielaidas. Vienas iš jų, kad duomenys buvo surūšiuoti. Dabar mes galime matyt išlaikyti šią surūšiuoti, tad gal tai ne problema, bet dvejetainis paieškos pat daroma prielaida, , kad jūs turėjo laisvą prieigą prie numerių sąraše, ir pasirinkimas leidžia jums turėti laisvą prieigą, ir laisvą prieigą, Aš turiu galvoje, jei jūs masyvą, kiek laiko tai užtruks jums patekti į laikiklio 0? Viena operacija, tiesiog naudokite [0] ir tu teisus ten. Kiek žingsnių reikia, kad patekti į 10 vietą? Vienas žingsnis, jums tiesiog eikite į [10] ir jūs ten. Priešingai, kaip jums gauti į susietą sąrašą 10 sveikąjį skaičių? Jūs turite pradėti iš pradžių, nes jūs tik prisiminti, įsimenamas susietą sąrašo pradžioje, kaip ir eilutės savo pirmojo char adresą, ir rasti, kad 10 int arba, kad 10 simbolių į eilutę, jūs turite ieškoti visoje Damn Thing. Vėlgi, mes ne spręsti mūsų problemų. Mes pristatome naujus, bet tai tikrai priklauso nuo to, ką jūs bandote kurti. Įgyvendinimo, mes galime skolintis idėja, kad studentas struktūros. Sintaksė yra labai panaši, išskyrus dabar, idėja yra šiek tiek daugiau abstraktus nei namas, vardas ir pavardė ir ID. Bet aš siūlau, kad galėtume turėti duomenų struktūrą C tai yra vadinama mazgas, paskutinis žodis skaidrėje rodo, viduje mazgas, mazgas yra tik bendrinis informatikos konteineris. Tai paprastai sudarytas apskritimas ar kvadratas ar stačiakampis, kaip mes padarėme. Ir šios duomenų struktūros, mes turime int, n, taip, kad I norite išsaugoti. Bet kas tai yra antra eilutė, Struct mazgas * šalia? Kodėl tai yra teisinga, ar kokį vaidmenį tai, ką žaisti, nors tai šiek tiek paslaptingas, iš pirmo žvilgsnio? Taip. [Nesigirdi studentas atsakas] Tiksliai, todėl * tarsi grobio, kad tai tam tikra rodyklė. Šio rodyklė vardas savavališkai kitą, , tačiau mes galime jį pavadino ką norime, bet ką tai rodyklė taškas? [Studentų] Kitas mazgas. >> Būtent, ji nurodo kitas toks mazgas. Dabar, tai yra tarsi C. smalsumo Prisiminkite, kad C skaito sudarytojas viršaus į apačią, iš kairės į dešinę, tai reiškia, jei, tai yra šiek tiek skiriasi nuo to, ką mes padarėme su mokiniu. Kai mes apibrėžta studentas, mes iš tikrųjų nebuvo įdėjo žodį. Jis tiesiog pasakė Typedef. Tada mes turėjome int id, String vardas, String namas, ir tada studentas struct apačioje. Ši deklaracija yra šiek tiek kitoks, nes, vėl, C kompiliatorius yra šiek tiek kvailas. Tai tik ketina skaityti iš viršaus į apačią, todėl, jei jis pasiekia 2-oji linija toliau yra paskelbta ir ji mato, oi, čia kintamasis vadinamas kitą. Tai rodyklė struct mazgo. Kompiliatorių suprasti, kas yra Struct mazgas? Aš niekada girdėjote apie prieš šio dalyko, , nes žodis mazgas gali kitaip pasirodyti iki dugno, todėl yra šis rezervo. Jūs turite pasakyti struct mazgas, kurį galite sutrumpinti vėliau dėka Typedef žemai čia, bet tai yra dėl mes nuorodų struktūra pati viduje struktūros. Štai kabliuko nėra. Keletas įdomių problemų atsirasti. Mes turime numerių sąrašą. Kaip mes įterpti į jį? Kaip mes ieškoti? Kaip mes ištrinti iš jo? Ypač dabar, kad mes turime valdyti visus šiuos patarimus. Jūs manėte, patarimų buvo tarsi iš proto-lenkimo kai turėjo vienas iš jų tiesiog bando skaityti int. Dabar mes turime visą sąrašą verta manipuliuoti. Kodėl ne mes atsižvelgti į mūsų 5-minučių pertrauką, ir tada mes atnešti kai ant scenos žmonės daryti būtent tai. C yra daug smagiau, kai jis veikė. Kas būtų tiesiog norite būti pirmas? Gerai, ateiti iki. Jūs esate pirmas. Kas norėtų būti 9? Gerai, 9. Kaip apie 9? 17? Mažai klika čia. 22 ir 26 toje pirmoje eilėje. Ir tada, kaip apie ką nors ten buvo pažymėti. Jūs esate 34. Gerai, 34, ateiti iki. Pirma, tai ten. Gerai, iš jūsų vaikinai visi keturi. Ir kas mes sakome, 9? Kas yra mūsų 9? , Kuris tikrai nori būti 9? Viskas gerai, nagi, būti 9. Čia mes einame. 34, mes susitikti su jumis ten. Pirmoji dalis yra padaryti sau atrodyti, kad. 26, 22, 17, geras. Jei jūs galite stovėti ne į tą pusę, nes mes ketiname malloc jums akimirką. Gerai, gerai. Gerai, puikiai, todėl galime užduoti porą klausimų. Ir iš tikrųjų, kas yra jūsų vardas? >> Anita. Anita, gerai, eikš čia. Anita ketina padėti mums tarsi išspręsti vieną gana paprastą klausimą pirmąjį, kaip jums atrodo, ar ne vertė yra sąraše? Dabar pastebėti, kad, pirma, sudarė čia Lucas, yra šiek tiek kitoks, ir todėl jo gabalas popieriaus sąmoningai į šoną , nes tai nėra labai aukštas ir neužima kuo daugiau bitų, nors techniškai jis yra tokio paties dydžio popieriaus, yra pasukti. Bet jis šiek tiek skiriasi tuo, kad jis yra tik 32 bitų rodykle, ir visi šie vaikinai yra 64 bitų, iš kurių pusė yra skaičius, iš kurių pusė yra žymeklis. Bet rodyklė nėra vaizduojamas, todėl, jei jus vaikinai galėtų šiek tiek nerangiai naudoti savo kairę ranką, pabrėžiama, kad asmuo šalia tavęs. Ir jūs numeris 34. Koks tavo vardas? Ari. Ari, kad iš tikrųjų, laikykite popierių į savo dešinę ranką ir kairę ranka eina tiesiai žemyn. Jūs pareiškiate null kairėje. Dabar mūsų žmogaus vaizdas yra labai nuosekli. Iš tikrųjų tai yra kaip patarimų dirbti. Ir, jei galite Menkė šiek tiek tokiu būdu, kad aš ne į savo kelią. Anita čia, rasti man 22 skaičių, bet prisiimti ne žmonės telpa popieriaus lapų apribojimą, bet tai yra sąrašas, ir jūs turite tik Lucas pradėti , nes jis yra tiesiog pirmas rodyklė. Tarkime, jūs sau yra žymeklis, ir kad jūs taip pat turi galimybę atkreipti dėmesį į kažką. Kodėl gi ne jums pradėti, nurodydami, ką Lucas nukreipta? Geras, ir leiskite man priimti tai iš čia. Tik diskusijos dėlei, leiskite man atsigriebti tuščią puslapį. Kaip rašoma jūsų vardas? >> Anita. Gerai, Anita. Tarkime, mazgas * anita = Lucas. Na, mes neturėtume skambinti jums Lucas. Turėtume skambinti pirmą kartą. Kodėl tai iš tikrųjų atitinka su tikrove čia? Vienas, pirmiausia, jau egzistuoja. Pirma buvo skirta turbūt kažkur čia. Mazgas * pirma ir tai buvo skirta sąrašą kažkaip. Aš nežinau, kaip tai atsitiko. Tai atsitiko prieš klasę pradėjo. Šis susijęs su žmonių sąrašas buvo sukurtas. , O šiuo metu šio punkto istorija-tai yra viskas "Facebook", matyt, vėliau- Šiuo istorija Anita buvo inicijuoti, turi būti lygus, pirmiausia, bet tai nereiškia, kad Anita punktai Lucas. Atvirkščiai, ji atkreipia į tai, ką jis nurodo nes tas pats adresas, tai viduje Lucas "32 bits - 1, 2, 3 - dabar taip pat viduje Anita "32 bitų - 1, 2, 3. Dabar rasti 22. Kaip tu apie tai darote? Kas tai? >> Point whatever. Atkreipti whatever, kad eiti į priekį ir veikti tai, kaip geriausiai galite čia. Gerai, gerai, ir dabar jūs nukreipta į, koks tavo vardas su 22? Ramonas. >> Ramonas, todėl Ramonas telpa 22. Jūs jau padaryta čekį. Ar Ramonas == 22 ir jei taip, pavyzdžiui, mes galime grįžti tiesa. Leiskite man, o šie vaikinai stoviu čia šiek tiek nerangiai leiskite man padaryti kažką greitai, kaip Bool rasti. Aš ruošiuosi eiti į priekį ir pasakyti (mazgas * sąrašas, int n). Aš būsiu su jumis vaikinai. Aš tiesiog parašyti šiek tiek kodo. Ir dabar aš ruošiuosi eiti į priekį ir tai padaryti, mazgas * anita = sąrašą. Ir aš ruošiuosi eiti į priekį ir pasakyti, o (Anita! = NULL). Metafora čia truputį ištempti, bet o (Anita! = NULL), ką aš noriu padaryti,? Man reikia šiek tiek nuorodų kelią sveikasis skaičius, kad Anita nukreipta. Praeityje, kai mes turėjome struktūras, kurios mazgas yra, mes naudojome taško žymėjimą, ir mes norime pasakyti kažką panašaus anita.n, bet problema čia yra ta, kad Anita struct savaime nėra. Kas ji yra? Ji yra žymeklis, kad tikrai, jei norime naudoti šią dot žymėjimą ir tai vyksta ieškoti sąmoningai šiek tiek paslaptingas mes turime kažką daryti, pavyzdžiui, eiti į Nepriklausomai Anita kaire ranka nukreipta į ir tada gauti lauką pavadinimu n. Anita yra rodyklė, bet, kas yra * anita? Kaip jums atrodo, kai jūs einate į ką Anita nukreipta? Struct mazgas ir mazgas, išėmimą iš apyvartos, turi lauką, vadinamą n nes ji, prisiminti, šie 2 laukai, šalia ir N, kad mes matėme prieš akimirką čia. Faktiškai imituoti kodu, galėtume tai padaryti ir pasakyti, ar ((* anita). n == n), n, kad aš ieškau. Atkreipkite dėmesį, kad funkcija buvo perduota skaičius man rūpi. Tada aš galiu eiti į priekį ir padaryti kažką panašaus Return TRUE. Kitur, jei tai ne tas atvejis, ką aš noriu daryti? Kaip man išversti kodas Anita taip ir padarė intuityviai pėsčiomis per sąrašą? Ką turėčiau daryti, čia, kad būtų imituotos Anita šį žingsnį į kairę, kad žingsnis į kairę? [Nesigirdi studentas atsakas] >> Kas tai? [Nesigirdi studentas atsakas] Gera, o ne bloga idėja, bet anksčiau, kai mes padarėme tai, mes baigsite Anita + + , nes tai būtų pridėti 1 Anita , kuri paprastai nurodo kitą asmenį, kaip Ramon, arba asmuo, šalia jo, arba šalia jo asmuo žemyn linija. Bet tai dar ne gana gera čia, nes tai, ką šis dalykas atrodo kaip atminties? Ne todėl, kad. Turime išjungti. Atrodo, kad ši atminties, ir nors aš paruošiau 1 ir 2 ir 3 arti vienas kito, jei mes tikrai imituoti tai gali jus vaikinai, o dar nukreipta į tų pačių žmonių, kai kurie iš jūsų atsitiktinį žingsnį atgal, kai kurie iš jūsų atsitiktinis žingsnis į priekį? Ši netvarka yra vis dar susieta sąrašas tačiau šie vaikinai gali būti bet kur į atmintį, taip Anita + + yra nesiruošia dirbti, kodėl? Kas LOCATION anita + +? Kas žino. Tai kai kita vertė, kad tiesiog taip atsitinka, turi būti tarpininke tarp visų šių atsitiktinai mazgų, nes mes ne naudojant masyvą. Skyrėme vienas iš šių mazgų atskirai. Gerai, jei jus vaikinai galite valyti save atgal į viršų. Leiskite man pasiūlyti, kad vietoj anita + +, mes, o ne daryti anita gauna gerai, tai kodėl ne mes einame kokia Anita nukreipta ir tada daryti. toliau? Kitaip tariant, mes einame į Ramon, kas holdingo kurios numeris 22, ir tada. šalia yra, nors Anita būtų kopijuoti Jo kairė ranka žymeklį. Bet ji negali eiti toliau nei Ramon, nes mes radome 22. Bet tai būtų idėja. Dabar, tai yra dievas baisu netvarka. Sąžiningai, niekas kada nors prisiminti šią sintaksę, ir, laimei tai tikrai šiek tiek sąmoningas-Oh, jūs ne iš tikrųjų matyti, ką parašiau. Tai būtų patrauklesni, jei galėtumėte. Voila! Užkulisiuose, aš išspręsti šią problemą šiuo būdu. Anita, žengti šį žingsnį į kairę, pirma, mes eiti tuo adresu, Anita nukreipta į ir kur ji ras ne tik n, kurį mes ką tik patikrino palyginimas labui, bet jūs taip pat rasti kitą - šiuo atveju, Ramon kaire ranka, nukreipta į kitą mazgą sąraše. Bet tai yra dievas baisu netvarka, aš paminėjo anksčiau, tačiau paaiškėja, C leidžia mums supaprastinti šią. Vietoj to, kad raštu (* anita), mes galime, o ne tiesiog parašyti Anita> N, ir tai yra lygiai toks pats dalykas funkciškai, bet tai daug daugiau intuityvi, ir tai daug labiau atitiktų vaizdą, kad mes buvo piešimo visą šį laiką naudojant rodykles. Galiausiai, ką mes turime padaryti, šios programos pabaigoje? Yra viena eilutė kodo likusių. Grįžti ką? Klaidinga, nes, jei mes gauname per visą while cikle ir Anita, iš tiesų, yra nulis, tai reiškia, kad ji nuėjo visą kelią į sąrašo pabaigoje kur ji buvo nukreipta ne-koks tavo vardas dar kartą? Ari Ari. >> Kairė ranka, kuris yra niekinis. Anita dabar yra nulis, ir aš suprantu, jūs tiesiog čia stovėjo nerangiai nežinioje nes aš ruošiuosi į monologą, bet mes įtraukti jus vėl vos akimirką. Anita yra niekinis tuo istorija tašką, todėl while cikle baigiasi, ir mes turime gražins false, nes, jei ji gavo visą kelią iki Ari NULL pointeris ten buvo ne skaičius, kad ji siekė sąraše. Mes galime išvalyti iki pat, tačiau tai yra gana gera įgyvendinimo Sankryþos funkcija, rasti funkcijos susietos sąrašą. Jis vis dar yra linijinis paieška, bet tai nėra taip paprasta, kaip + + rodyklė + + i kintamasis, nes dabar mes galime negali atspėti kur kiekvienas iš šių mazgų yra atminties. Mes turime tiesiog sekti duonos trupinių takas arba, tiksliau, rodyklės, gauti iš vieno mazgo į kitą. Dabar pabandykime dar vieną. Anita, jūs norite grįžti čia? Kodėl ne mes einame į priekį ir paskirti po vieną asmenį iš auditorijos? Malloc-koks tavo vardas? >> Rebecca. Rebecca. Rebecca buvo malloced iš auditorijos, ir ji saugoti, kurios numeris 55. Ir po ranka tikslas dabar yra Anita įterpti Rebecca į susietą sąrašą čia savo tinkamoje vietoje. Nagi čia for a moment. Aš padariau kažką panašaus į tai. Aš padariau mazgas *. Ir koks tavo vardas dar kartą? Rebecca. >> Rebecca, gerai. Rebecca gauna malloc (sizeof (mazgas)). Tiesiog kaip ir skyrėme anksčiau, dalykų, pavyzdžiui, studentams ir Papuošalą mums reikia mazgo dydį, todėl dabar Rebecca yra nukreipta į tai, ką? Rebecca jos viduje turi du laukus, iš kurių vienas yra 55. Darykime ką, Rebecca-> = 55. Bet tada rebecca-> Kitas turėtų būti kaip dabar, jos ranka yra natūra, kuris žino,? Ji nukreipta į kai šiukšlių vertės, tai kodėl gi ne į gera priemonė mes bent jau tai padaryti taip, kad kairė ranka dabar jos pusėje. Dabar Anita, išgerkite ją iš čia. Turite Rebecca, kuriems buvo skirtos. Eiti į priekį ir rasti, kur turėtume Rebecca. Gerai, labai gerai. Gerai, gerai, ir dabar mes turime jums pateikti šiek tiek krypties, todėl jūs pasiekėte Ario. Jo kairė ranka yra niekinis, bet Rebecca aiškiai priklauso į dešinę, taip, kaip mes turime pakeisti šią susietą sąrašą siekiant įtraukti Rebecca į tinkamą vietą? , Jei galėtumėte tiesiog perkelti žmonių kairę rankas aplink, kiek reikia, mes jums išspręsti šią problemą, kad taip. Gerai, gerai, o tuo tarpu, Rebecca kaire ranka dabar šalia jos. Tai buvo labai lengva. Pabandykime skiriant mes beveik jau padaryta, 20. Gerai, ateiti iki. 20 buvo skirta, todėl leiskite man eiti į priekį ir dar kartą pasakyti, čia mes ką tik padaryta mazgas * Saad. Mes turime malloc (sizeof (mazgas)). Mes tada daryti tą patį tiksliai sintaksę, kaip mes padarėme prieš, 20 ir aš padarysiu next = NULL, ir dabar jis iki Anita įterpti į susietą sąrašą, jei galima žaisti, kad tą patį vaidmenį. Vykdyti. Gerai, gerai. Dabar pagalvokite, prieš pradėdami juda į kairę rankas aplink. Jūs iki šiol gavo labiausiai nepatogios vaidmenį šiandien. Kurio ranką turėtų būti perkeltas pirmas? Gerai, palauk, aš klausos kai ne. , Jei kai kurie žmonės būtų mandagiai patinka padėti išspręsti nepatogią padėtį čia. Kieno kairė ranka turėtų būti atnaujintas galbūt? Taip. [Studentų] Saad. Gerai, Saad, kodėl, nors? [Nesigirdi studentas atsakas] Gerai, nes jei mes einame-koks tavo vardas? >> Maršalo Marshall, jei mes einame į ranką null dabar mes tiesiog našlaičiais keturi žmonės šiame sąraše , nes jis buvo vienintelis dalykas, nukreipta į Ramon ir kiekvienas į kairę, atnaujinti, kad žymeklį pirmą kartą buvo blogas. Leiskite anuliuoti, kad. Gera, ir dabar eiti į priekį ir perkelti atitinkamą kairę ranką, nukreipta į Ramon. Tai jaučiasi šiek tiek nereikalingas. Dabar yra du žmonės, rodančių, Ramon, bet tai gerai nes dabar kaip kitaip mes atnaujinti šį sąrašą? Kas kita vertus, turi judėti? Puikus, dabar mes prarado atmintį? Ne, taip gerai, galime pamatyti, jei mes galime padalyti dar kartą. Paskutinį kartą, Mallocing numeris 5. Visi atgal būdas, nagi žemyn. Tai labai įdomi. [Plojimai] Koks tavo vardas? >> Ron. Ron, gerai, jūs malloced kaip 5 numeriu. Mes ką tik įvykdytas kodą, kuris beveik identiškas šių tik kitu pavadinimu. Puikus. Dabar Anita, geros kloties, įterpiant į sąrašą 5. Geras, ir? Puikus, todėl tai yra tikrai trečiasis iš trijų visų susirgimų. Mes pirmą kartą buvo kažkas pabaigoje, Rebecca. Mes tada buvo kažkas per vidurį. Dabar mes turime ką nors pradžioje, ir šiame pavyzdyje, dabar mes pirmą kartą teko atnaujinti Lucas nes pirmasis elementas sąraše dabar turi atkreipti naujas mazgas, kurie, savo ruožtu, yra nukreipta mazgo numeris 9. Tai buvo labai nepatogu demonstravimas, aš tikiu, todėl didelis audringi plojimai šie vaikinai, jei galėtumėte. Gražiai padaryta. Štai ir viskas. Galite palikti popieriaus lapų, šiek tiek atminties. Pasirodo, kad tai daryti kodas yra ne visai taip paprasta, kaip tiesiog perkelti rankas aplink ir rodo, patarimų įvairių dalykų. Bet suprantame, kad kai jis ateina laikas įgyvendinti kažką panašaus susijęs sąrašas ar jo variantas, jei jums sutelkti dėmesį į tikrai šie pagrindiniai pagrindai, kąsnio dydžio problemos, turiu išsiaiškinti, tai ranka ar tai ranka, reikia suprasti, kad tai, kas kitaip gana sudėtinga programa , iš tiesų, gali būti sumažintas iki gana paprastų statybinių blokų, kaip šis. Paimkime dalykų sudėtingesnių kryptimi. Dabar mes turime iš susietų sąrašo sąvoka. Mes taip pat turime dėl šio pasiūlymo atgal yra dvigubai susijęs sąrašas, , kuris atrodo beveik tas pats, bet dabar mes turime dvi rodykles viduje struct vietoj vieno, ir mes turbūt galėtų skambinti tos rodykles ankstesniojo ir kito arba į kairę arba į dešinę, bet mes, tiesą sakant, reikia du iš jų. Kodas būtų šiek tiek aktyviau dalyvauti. Anita būtų turėjusi daugiau dirbti čia ant scenos. Bet mes tikrai galėtų įgyvendinti tokios struktūros. Važiavimo laikas, nors, kas būtų važiavimo laikas Anita rasti skaičiaus n susietos sąraše dabar? Vis dar didelis O n, todėl ne geriau ne linijinis paieška. Mes negalime daryti Dvejetainė paieška, nors vėl. Kodėl, kad byla? Jūs negalite šokinėti. , Nors mes akivaizdžiai pamatyti visas scenoje žmones, ir Anita galėjo eyeballed jį ir tarė: "Čia yra sąrašo viduryje" ji negalėjo žinoti, kad, jei ji buvo kompiuterinė programa nes vienintelis dalykas, ji turėjo sklende scenarijaus pradžioje Lucas, kuris buvo pirmasis žymeklis. Ji būtinai turi sekti tuos ryšius, skaičiuojant savo kelią, kol ji rado maždaug viduryje, ir net tada, ji nesiruošia žinoti, kai ji pasiekė vidurį nebent ji eina visą kelią iki galo išsiaiškinti, kiek yra, backtracks, ir kad taip pat būtų sunku, nebent jūs turėjote dvigubai susijęs sąrašas tam tikros rūšies. Tam tikrų problemų sprendimas šiandien, bet įvedant kitus. Ką apskritai apie skirtingas duomenų struktūros? Tai Mather House padėklai nuotrauka, ir šiuo atveju, mes turime duomenų struktūrą, mes taip pat rūšies jau kalbėti apie. Mes kalbėjome apie kamino atminties, ir tai tarsi sąmoningai pavadintas, nes kamino atminties iš esmės yra duomenų struktūra, kad yra vis daugiau ir daugiau dalykų Sluoksniuotas ant jo. Bet įdomus dalykas, apie kamino, kaip yra šiuo atveju, iš tikrųjų, yra tai, kad specialios rūšies duomenų struktūros. Tai duomenų struktūra, pagal kurią pirmasis elementas yra paskutinis elementas. Jei esate pirmasis dėklas turi būti įdėti į steką, jūs ketinate būti deja paskutinis dėklas būti išbraukti iš kamino, ir tai nebūtinai yra geras dalykas. Priešingai, jūs galite galvoti apie tai, atvirkščiai, paskutinis yra pirmas išėjo ". Dabar visi scenarijai ateiti į galvą, kai kamino duomenų struktūra, kur jūs turite, kad nuosavybė in, first out, iš tikrųjų yra įtikinamų? Yra tai, kad geras dalykas? Yra tai, kad yra blogas dalykas? Tai tikrai blogas dalykas, jei padėklai buvo ne visi identiški ir jie buvo visi specializuota įvairių spalvų arba Papuošalą, ir norimą spalvą visi apačioje būdas. Žinoma, jūs negalite gauti, kad be didelių pastangų. Jūs turite pradėti iš viršaus ir dirbti savo kelią žemyn. Be to, ką daryti, jei jums buvo viena iš šių ventiliatoriaus berniukai kas laukia visą naktį bando gauti "iPhone" ir linijų iki vietoje, kaip ši? Ar nebūtų puiku, jei "Apple" parduotuvė kamino duomenų struktūra? Yay? Dargi? Tai tik tiems žmonėms, kurie rodo iki paskutiniu minutę ir tada gauti nupešti eilę. Ir iš tiesų, tai, kad aš taip linkę pasakyti eilę iš tiesų yra suderinamas su tuo, ką mes vadiname šios rūšies duomenų struktūros, vienas iš tikrųjų, kai užsakymas yra svarbu, , ir jūs norite, kad pirmasis turi būti pirmasis jei tik Žmogiškojo teisingumo labui. Mes paprastai vadiname eilė duomenų struktūra. Pasirodo, be susijusių su sąrašų, mes galime pradėti naudoti tas pačias pagrindines idėjas ir pradėti kurti naujų ir skirtingų tipų sprendimų problemų. Pavyzdžiui, kamino, mes galime atstovauti kamino naudojant duomenų struktūrą, kaip tai, aš norėčiau pasiūlyti. Šiuo atveju, aš paskelbė struct, ir aš sakė šios struktūros viduje yra skaičių masyvas ir tada kintamasis vadinamas dydis, ir aš einu skambinti šis dalykas kamino. Dabar kodėl tai faktiškai dirba? Kamino, galėčiau daryti tai veiksmingai kaip masyvo ekrane. Čia yra mano kamino. Tie, kurie mano numeriai. Ir mes parengti juos, nes tai, tai, tai, tai, tai. Ir tada aš turiu kai kurių kitų duomenų narys čia kuris yra vadinamas dydis, todėl tai yra dydis, ir tai yra numeriai, ir kolektyviai, čia visa iPad atstovauja vieną kamino struktūrą. Dabar, pagal nutylėjimą, dydis, manoma, turite būti inicializuoti iki 0, ir tai, kas viduje skaičių masyvas iš pradžių kai aš pirmą kartą skirti masyvą? Šiukšlių. Kas žino? Ir tai iš tikrųjų nėra svarbu. Nesvarbu, jei tai yra 1, 2, 3, 4, 5, visiškai atsitiktinai nedalia saugomi mano struktūros, nes taip ilgai, kaip aš žinau, kad kamino dydis yra 0, tada aš žinau, programiškai, ne pažvelgti į bet kurį iš masyve elementų. Nesvarbu, kas ten. Nežiūrėkite į juos, kaip būtų nuo 0 dydžio potekstė. Tačiau tarkime, dabar aš eiti į priekį ir įrašyti kažką į kaminą. Noriu įrašyti skaičius 5, todėl aš įdėti skaičius 5, ir kas tada aš pribaigti? Dabar aš iš tikrųjų pribaigti 1 dydžio, o dabar krūva yra 1 dydžio. Ką daryti, jei aš einu į priekį ir įterpti skaičių, galime pasakyti, 7 Toliau? Tai tada bus atnaujintas iki 2, ir tada mes padarysime 9, ir tada tai bus atnaujintas iki 3. Bet įdomi funkcija šio kamino yra tai, kad Aš turėjo pašalinti, kuris elementas, jei aš noriu, kad pop ką nors ne iš kamino, taip kalbėti? 9 būtų pirmas dalykas, kurį eiti. Kaip turėtų paveikslėlį pakeisti, jei noriu, kad pop-off kamino elementas, panašiai kaip dėklą Mather? Taip. >> [Studentų] Įrenginio dydis 2. Tiksliai, aš nustatyto dydžio 2, ir ką man daryti su masyvo? Aš neturiu nieko daryti. Galėjau, tiesiog, kad būtų analinis, 0 Nėra įdėti ar -1 ar kažką, rodanti , kad tai yra ne teisėtas, bet nesvarbu, nes Galiu užrašyti už masyvo, kiek laiko ji todėl, kad aš žinau, tik pažvelgti į pirmuosius du šio masyvo elementų. Dabar, jei aš einu skaičiumi 8, ir pridėti šio masyvo, kaip vaizdas keičia kitą? Tai tampa 8, ir tai tampa 3. Aš pjovimo kelis kampus. Dabar mes turime 5, 7, 8, ir mes grįžome į 3 dydžio. Tai gana paprasta įgyvendinti, bet kai mes ketiname apgailestauju sprendimą šio projekto? Kada viskas pradeda eiti labai, labai negerai? Taip. [Nesigirdi studentas atsakas] , Kai norite grįžti ir gauti pirmąjį elementą jūs įtraukėte in It turns out, nors krūva yra po gaubtu masyvas, Mes pradėjome kalbėti apie šių duomenų struktūros taip pat paprastai žinomas kaip Abstraktus duomenų struktūros, pagal kurią, kaip jie įgyvendinami yra visiškai be taško. Duomenų struktūra, kaip kamino Manoma, kad įtraukti paramą operacijos, pavyzdžiui, stumti, kuris verčia padėklą ant kamino, ir pop, kuris pašalina elementą iš kamino, ir viskas. Jei buvo atsisiųsti kažkieno kodą, kuris jau įgyvendinta šis dalykas, vadinamas kamino, kad asmuo būtų parašyta tik dvi funkcijos jums stumti ir pop, kurio vienintelis gyvenimo tikslas būtų daryti būtent tai. Jūs arba jam ar jai, kurie įgyvendino šią programą būtų buvę visiškai vienas nuspręsti, kaip įgyvendinti po gaubtu stumti ir Popping semantika arba stumti ir Popping funkcijos. Ir aš čia šiek tiek trumparegis sprendimą mano krūvą su šia paprasta duomenų struktūra, kodėl? Kada šio duomenų struktūros pertraukos? , Ką turiu grąžina klaidos, kai vartotojas skambina stumti, pavyzdžiui? [Studentų] Jei nėra daugiau vietos. Tiksliai, jei yra ne daugiau vietos, jei aš viršijo pajėgumus, yra visi dangteliai, nes ji rodo, kad tai kažkoks pasaulio konstantos. Na, tada aš tik ketina turėti pasakyti: "Atsiprašau, aš negaliu stumti kitą vertę ant kamino, "panašiai kaip Mather. Tam tikru momentu, jie ketina hit viršutinę dalį, kad šiek tiek spintoje. Daugiau nebėra vietos ar pajėgumus įrenginyje, kuriame taškas yra keletas klaidų rūšies. Jie turi įdėti elementą kažkur kitur, dėklas kažkur kitur, ar niekur ne visi. Dabar, kai eilėje, mes galime įgyvendinti jai šiek tiek kitaip. Eilė yra šiek tiek kitoks, kad po gaubtu, ji galėtų būti įgyvendinta masyvo, bet kodėl, šiuo atveju, aš siūlo taip pat galvos dalis, sudaranti sąrašo galvą, sąrašo priekyje, pirmasis asmuo, atsižvelgiant į Apple Store, be dydžiui? Kodėl aš turiu papildomų duomenų gabalas čia? Prisiminkite ką numerius jei aš paruošiau taip. Tarkime, tai dabar vietoj kamino eilė, yra kaip ir "Apple" parduotuvėje eilėje skirtumas yra teisinga. Pirmasis asmuo eilėje prie sąrašo pradžioje, šiuo atveju 5 numeris, jis ar ji bus tegul į parduotuvę. Darykime, kad. Tarkime, kad tai yra mano eilėje valstybės šiuo metu laiku, o dabar "Apple" parduotuvė atidaro ir pirmasis asmuo, numeris 5, vadovauja į parduotuvę. Kaip aš galiu pasikeisti paveikslėlį, dabar, kad aš įtraukiami į eilę ir joje pirmojo asmens- priekinės linijos? Kas tai? >> [Studentų] Keisti eilę. Keisti galvą, todėl 5 dingsta. Iš tikrųjų, tai kaip nors, kaip geriausiai tai padaryti? Iš tikrųjų, tai, taip, lyg šis vaikinas dingsta. Ką numeris 7 faktinė parduotuvėje? Jie būtų didelis žingsnis į priekį. Bet tai, ką mes vertiname, kai jis ateina į masyvų ir perkelti dalykų aplink? Tai tipo savo laiko švaistymas, tiesa? Kodėl jūs turite būti, analinis, kad pirmasis asmuo į eilutės pradžią, ne fiziškai, atminties riekė pradžios? Tai visiškai nereikalingas. Kodėl? Ką galėčiau tiesiog prisiminti vietoj? >> [Nesigirdi studentas atsakas] Tiksliai, galėčiau tiesiog prisiminti šią papildomą duomenimis, valstybės galvos kad dabar sąraše galva nebėra 0, kuris prieš tai buvo momentas. Dabar tai tikrai numeris 1. Tokiu būdu, man šiek tiek optimizavimas. Tik todėl, kad aš-į eilę ir joje ką nors iš linijos į eilutės pradžią Apple Store nereiškia, kad kiekvienas turi pereiti, išėmimas iš apyvartos yra tiesinė operacija. Galiu vietoj nuolatinio laiko praleisti tik ir pasiekti daug greičiau reaguoti. Bet kaina, aš mokėti yra tai, ką gauti, kad papildomos efektyvumą ir nereikia perkelti visus? Taip. >> [Nesigirdi studentas atsakas] Galite pridėti daugiau žmonių, gerai, kad problema yra statmenos į tai, kad mes ne perjungimo žmonių visame. Jis vis dar yra masyvas, ar ne mes pereiti visus ar ne oh, aš matau, ką tu kalbi, gerai. Tiesą sakant, aš sutinku su tuo, ką jūs sakote, kad tai beveik kaip nors mes dabar niekada naudoti šio masyvo pradžios nebėra nes jei aš pašalinti 5, tada aš pašalinti 7. Bet aš tik įdėti žmonių į dešinę. Jis jaučiasi kaip aš taupiai, ir galiausiai mano eilė išsigimsta į visai nieko, , kad galėtume tiesiog žmonės vaikjuostės ir mes galime galvoti apie šiame masyve tikrai kažkokio apskrito struktūra, bet mes naudojame, kas operatorių C padaryti, kad vaikjuostės rūšiuoti? [Nesigirdi studentas atsakas] >> modulį operatorius. Būtų šiek tiek erzina, apgalvoti, kaip jūs darote vaikjuostės, , tačiau mes galime tai padaryti, ir mes galime pradėti išleisti žmones tuo, kas anksčiau buvo priekinės linijos, bet mes tiesiog prisiminti su šio galvos kintamojo, kuris tikrasis vadovas linijos iš tikrųjų yra. Ką daryti, jei, vietoj to, galiausiai mūsų tikslas, nors, ieškoti numerius, kaip mes čia ant scenos su Anita, bet mes tikrai norime, kad visų šių pasaulių geriausias? Mes norime daugiau rafinuotumo kaip masyvas leidžia nes mes norime, kad gebėjimas dinamiškai augti duomenų struktūrą. Bet mes nenorime, kad turi kažką, kad jau minėta, į pirmąją paskaitą nebuvo optimalus algoritmas, kad tiesinio paieška. It turns out, kad jūs galite iš tikrųjų, pasiekti arba bent jau arti nuolat laiko, kuriuo kažkas panašaus Anita, jei ji konfigūruoja savo duomenų struktūrą negali būti susieta sąrašas negali būti kamino, negali būti eilė, galėtų, iš tiesų, sugalvoti su duomenų struktūrą, kuri leidžia jai ieškoti dalykų, net žodžiai, o ne tik skaičiai, ką mes vadiname pastovų laiko. Ir iš tikrųjų, kalbant apie ateitį, vienas iš šios klasės psets beveik visada iš spellchecker įgyvendinimas, kuriuo mes suteikiame Jums dar keletą 150.000 angliškų žodžių ir tikslas yra įkelti į atmintį ir greitai galės atsakyti į klausimus formos yra parašyti teisingai šis žodis? Ir tai būtų tikrai čiulpia, jei Jums teko pakartoti per visus 150.000 žodžių atsakyti, kad. Bet, tiesą sakant, mes matome, kad galite tai padaryti labai, labai greitai laikas. Ir tai vyksta įtraukti įgyvendinimo kažką, vadinamą maišos lentelė, ir nors iš pirmo žvilgsnio šis dalykas, vadinamas maišos lentelė ketina leiskite mums pasiekti šie Super Rapid reagavimo laikas, paaiškėja, kad yra iš tikrųjų problema. Kai ateina laikas įgyvendinti šią dalykas vadinamas-vėl, aš darau jį dar kartą. Aš esu čia tik vienas. Kai jis ateina laikas įgyvendinti tai, ką pavadino maišos lentelė mes ketiname priimti sprendimą. Kaip didelis turėtų tai, ką iš tikrųjų? Ir kai mes pradedame nurodydami numerius į šią maišos lentelės, kaip mes ketiname saugoti juos taip, , kad mes galime gauti juos atgal taip greitai, kaip mes turime juos? Bet mes pamatysime prieš ilgas, kad šis klausimas kai kiekvienas gimtadienis yra klasės bus gana Priklauso. Pasirodo, kad šiame kambaryje, mes turime kelis šimtus žmonių, todėl tikimybė, kad du iš mūsų gimtadienis yra tikriausiai gana didelis. Ką daryti, jei ten buvo tik 40 iš mūsų šiame kambaryje? , Kas yra dviejų žmonių, turinčių tą patį gimtadienį šansai? [Studentai] Daugiau nei 50%. Taip, daugiau kaip 50%. Tiesą sakant, aš net davė diagramos. Pasirodo, ir tai yra tikrai tik Slapta peržiūra jei yra tik iš mūsų 58 šiame kambaryje, 2 tikimybė mus turintys tą patį gimtadienį yra labai didelis, beveik 100%, ir kad ketina sukelti mums skauda visa krūva trečiadienį. Turint tai sakė, galime atidėti čia. Mes pamatysime trečiadienį. [Plojimai] [CS50.TV]