DAVID MALAN: Okei, tervetuloa takaisin. Tämä on CS50. Tämä on alku viikolla seitsemän. Joten se on ollut jonkin aikaa, joten ajattelin olimme ottaa tornado kiertueen, jossa olemme jäit ja missä olemme nyt menossa. Joten tämä asia täällä voisi olla aiheutti ahdistusta aluksi. Mutta toivottavasti alatte sopeutua mitä tämä tarkoittaa täällä - tähden edustavat osoitin, joka on juuri, enemmän maallikon termein? Joten se osoite. Joten se osoite jotain muistiin. Ja aloimme kuori takaisin kerrokset pari viikkoa sitten, asioita, kuten GetString ja muita tällaisia ​​toimintoja Koko tämän ajan on palaamassa osoitteet asioita muistiin, kuten osoite ensimmäisen merkin Joissakin sekvenssi. Joten me esitteli myös valgrind, joka voit alkaa käyttää tähän ongelmaan set, etenkin seuraavaan Harjoitus samoin. Ja valgrind tekee mitä meille? Se etsii muistivuotoja, ja se tarkistaa myös väärin muistin. Se voi tietyllä todennäköisyydellä, havaita, jos koodi tulee koskettaa muistia että se ei yksinkertaisesti ole. Joten ei välttämättä vuoda, mutta jos ylittävät rajoja joidenkin array, ja olet todella ajaa valgrind ja aiheuttaa, että käyttäytymisestäsi valgrind on käynnissä ohjelma on käynnissä sen sisällä, saat tällaista viestiä - "virheellinen kirjoittavat koon 4 ", joka muistuttaa pari viikkoa sitten tarkoitti, että minulla oli vahingossa kuin yhden int liian pitkälle rajojen ulkopuolelle array. Ja niin koko 4 tarkoittaa tässä koko että erityisesti int. Joten ota varmuuden siinä, että valgrind tuotannosta, muoto se, on vain kamalaa. On todella vaikea nähdä läpi sotku ja mielenkiintoista tietoa. Joten mitä olemme tehneet täällä on vain ote jotkut pari lisää mielenkiintoinen linjat. Mutta ymmärtää, että 80% valgrind n lähtö tulee olemaan hieman häiriötekijä. Vain etsiä malleja, kuten nämä - virheellinen oikea, virheellinen lukea, 40 tavua ja jotkut lohkojen määrä on varmasti menetetty, avainsanoja, kuten että. Ja mitä tulee toivottavasti nähdä jonkin verran Tällainen jälki mikä funktio virhe on todella sisään Tässä tapauksessa täällä, missä linja minun koodi oli virhe ilmeisesti? 26-tiedostoon memory.c, joka oli Esimerkiksi me leikimme tuolloin. Joten se on luultavasti ole malloc. Se oli luultavasti minun koodin sijasta. Niin näemme tämän uudelleen ja jälleen ennen pitkää. Joten scanf, tämä tuli esille pari muotoja toistaiseksi. Näimme sscanf lyhyesti. Se oli jotain määrä olet sukeltanut oman valmistelut tietokilpailu. Ja scanf on oikeastaan ​​mitä CS50 Kirjasto on käyttänyt alla huppu jo jonkin aikaa, jotta saada käyttäjän syötettä. Esimerkiksi jos muutan yli CS50 laite täällä, haluaisin avata Esimerkiksi tänään, että kutsutaan scanf-0.c Ja se on erittäin yksinkertaista. Se on vain muutaman rivin koodia. Mutta se osoittaa todella, miten getInt on toiminut koko tämän ajan. Tässä ohjelmassa täällä line 16 , Huomaa, että julistan int. Joten ei viitteitä, ei mitään maagista siellä, vain int. Sitten linja 17, I pyytää käyttäjän numero, kiitos. Sitten loppuvuodesta 18, käytän scanf täällä. Ja olen täsmentänyt, ikään kuin printf, että olen odottanut viestiä listatut prosenttia i. Joten prosenttia i, tietenkin, tarkoittaa int. Mutta huomaa, mitä toinen argumentti scanf on. Miten kuvailisit toinen argumentti pilkun jälkeen? Mikä se on? Se on osoite x. Joten tämä on hyödyllistä, koska tarjoamalla scanf osoite x, mitä jotka antavat että toiminto tehdä? Ei vain mennä sinne, mutta myös mitä? Tee muutos siihen. Koska voit mennä sinne, se on eräänlainen kuten kartan sijainti muistiin. Ja niin kauan kuin annat scanf tai mitään toimintoa sellainen kartta, joka toiminto voi mennä sinne, eikä vain katsokaa arvoa, mutta se voi myös muuttaa tätä arvoa, mikä on hyödyllistä, jos tarkoitusta elämään scanf on skannata käyttäjän syötettä, erityisesti näppäimistöltä. Ja F tarkoittaa alustettu, kuten printf, F tarkoittaa alustettu merkkijono, jonka haluat tulostaa. Joten lyhyt, tämä linja 18 yksinkertaisesti sanoo, yritä lukea int käyttäjän näppäimistö ja säilytä se sisällä x kello mitä osoite x sattuu asumaan. Ja sitten lopuksi, linja 19 sanoo vain, kiitos int, tässä tapauksessa. Joten anna minun mennä eteenpäin ja tehdä tämän. Joten tee scanf 0. Anna minun mennä eteenpäin ja zoomata sisään Menen ja ajaa tämän kanssa pisteitä slash scanf 0. Numero, kiitos? 50. Kiitos 50. Joten se on melko yksinkertainen. Nyt mitä se ei tee? Se ei tee koko joukko Virheen tarkistus. Esimerkiksi, jos en yhteistyötä, enkä kirjoittaa numeron, mutta vaan minä kirjoitan jotain "hei" se on vain outoa. Ja niin yksi niistä asioista CS50 kirjasto on tehnyt meille jostain aika on, että reprompting ja reprompting. Yritä lause muistaa oli cs50.c, ja se on syy, että getInt vuonna CS50 kirjasto on itse asiassa koko nippu riviä pitkä, koska olemme tarkistamalla tyhmä tavaraa kuten tämä. Ei käyttäjä ei anna Meidän mielestämme, int? Oliko hän antaa meille jotain kuten aakkosellinen kirje? Jos näin on, haluamme havaita että ja huutaa heille. Mutta asiat saavat enemmän mielenkiintoista tässä seuraavassa esimerkissä. Jos menen scanf-1.c, mikä on yksi asia, joka on perusteellisesti muuttunut tämä seuraava esimerkki? Käytän char *, tietenkin, sijasta int. Joten tämä on mielenkiintoinen, koska char *, muistaa, on oikeastaan ​​vain sama asia kuin merkkijono. Joten se tuntuu ehkä tämä on erittäin yksinkertaisen toteutuksen getString. Mutta olen kuoriutui kerros ja CS50 kirjaston, joten olen kutsumalla tätä char * nyt. Katsotaanpa missä, jos missä, me mennä pieleen. Line 17 - Sanon taas, antakaa minulle jotain, Tässä tapauksessa merkkijono. Ja sitten seuraavalle riville, pyydän scanf, uudelleen, jolloin se muoto koodi, mutta tällä kertaa prosenttia s. Ja sitten tällä kertaa, olen ja antaa sen puskuriin. Nyt huomaa, en käytä et-merkki. Mutta miksi se on todennäköisesti OK täällä? Sillä mitä puskuri jo? Se on jo osoitin. Se on jo osoite. Ja antaa tämän sanan "hämmentää" haluan vain kutsua sitä s, esimerkiksi sen, yksinkertaisuus. Mutta olen sitä kutsui puskuri koska Yleensä ohjelmointi, jos sinulla on kimpale muisti, joka merkkijono todella vain on, voit kutsua sitä puskuria. Se on paikka tallentaa tietoja. Samanlaisia ​​asioita, kuten YouTube, kun he puskurointi, niin sanoakseni, että vain tarkoittaa sitä lataamalla bittiä Internet-ja tallentamalla ne paikallisten joukko, paikallinen kimpale muistia, joten että voit katsella sitä myöhemmin ilman se ohitetaan tai roikkuu voit toiston aikana. Joten siellä ongelma tässä kuitenkin, koska Kerron scanf, odottaa merkkijonon käyttäjä. Tässä osoite kimpale muisti. Laita merkkijonon siellä. Miksi näin on sidottu antaa harmia, vaikka? Mikä tuo on? Voinko käyttää että osa muistia? Tiedäthän, en tiedä. Koska on puskuri ole alustettu mitään? Ei oikeastaan. Ja niin se mitä olemme kutsuneet roskat arvo, joka ei ole virallista sanaa. Se vain tarkoittaa, että meillä ei ole aavistustakaan, mitä bittiä ovat sisällä neljä tavua, että Olen varattu puskurina. En ole soittanut malloc. Olen ehdottomasti ei kutsuttu getString. Joten kuka tietää, mikä on todella sisällä puskuri? Ja vielä kertoa scanf sokeasti, mene sinne ja laittaa mitä käyttäjä kirjoittaa. Joten mikä on omiaan aiheuttamaan meidän koodi, jos otamme sen? Luultavasti segfault. Ehkä ei, mutta luultavasti segfault. Sanon ehkä ei, koska joskus teet, joskus et saa segfault. Joskus vain onnekas, mutta se kuitenkin tulee olemaan bug ohjelmaamme. Joten anna minun mennä eteenpäin ja koota tähän. Aion tehdä sen vanhan koulun tavalla. Joten kalahtaa viiva 0, scanf-1, scanf-1.c, Anna. Hups, liian vanha koulu. Katsotaanpa. Minne menen? Voi, char * puskuri. Kiitos - Tallenna, OK - hyvin vanha koulu. Okei, se on ollut jonkin aikaa. Joten olen juuri tallentanut tiedoston jälkeen tehdä, että väliaikainen muuttaa hetki sitten. Ja nyt olen koonnut sen manuaalisesti kalahtaa. Ja nyt aion mennä eteenpäin ja ajaa scanf-1, Anna. String kiitos. Tulen kirjoittamaan "hei." Ja nyt, tässä kun suoraan sanottuna printf voi on hieman ärsyttävää. Se ei oikeastaan ​​tule segfault tässä tapauksessa. Printf on hieman erityinen, koska se on niin erittäin yleisesti käytetty, että lähinnä printf tekee meille palveluksen ja ymmärtämättä, se ei ole voimassa osoitin. Otan sen itselleni vain tulostaa out suluissa null, jopa vaikka se ei ole välttämättä mitä me itse odottaa. Joten emme todellakaan voi helposti aiheuttaa segfault tämän, mutta selvästi tämä ei ole käyttäytymistä halusin. Joten mitä yksinkertainen ratkaisu? No, scanf-2, haluaisin ehdottaa, että eikä oikeastaan ​​vain jaettaessa char *, anna minun olla hieman älykkäämpiä tämän ja haluan varata puskuria jaksona 16 merkkiä. Joten en voi tehdä tämän pari tapaa. Voisin ehdottomasti käyttää malloc. Mutta voin palata viikon kaksi, kun Tarvitsin vain koko joukko merkkiä. Se on vain joukko. Joten haluan sen sijaan uudelleen puskuri on joukko 16 merkkiä. Ja nyt, kun kuljen puskuri - ja tämä on jotain emme puhua viikolla kaksi - mutta voit hoitaa array vaikka se on osoite. Teknisesti kuten olemme nähneet, he hieman erilainen. Mutta scanf ei pahastu, jos ohitat sen nimi array, sillä mitä Kalahtaa tekee meille on olennaisesti hoitoon nimi, että levyjärjestelmän osoite kimpale 16 tavua. Joten tämä on parempi. Tämä tarkoittaa nyt, että voin toivottavasti toimi seuraavasti. Saanen loitontaa hetki ja tekevät scanf-2, koottu OK. Nyt haluan tehdä sai slash scanf-2. String kiitos. "Hei." Ja se näytti toimivan tällä kertaa. Mutta voiko joku ehdottaa skenaario jossa se ei ehkä vielä toimi? Niin? Jotain yli 16 merkkiä. Ja todella, voimme olla hieman tarkempi. Jotain enää sitten 15 merkkiä, koska todellakin meidän täytyy pitää mielessä että me tarvitsemme kenoviiva nolla implisiittisesti lopussa merkkijonon, joka on varattu scanf tyypillisesti hoitaa meille. Joten anna minun tehdä jotain - Joskus voimme vain jätä se niin. OK, joten olemme nyt aiheuttama meidän segmentointi vika. Miksi? Koska olen kirjoittanut yli 15 merkkejä, joten olemme todella kosketti muisti, että olen itse ei pitäisi olla. Joten mitä todella ratkaisu tähän? No, mitä jos me tarvitsemme enää merkkijono? No, me ehkä tehdä 32 tavua. No, mitä jos se ei ole tarpeeksi pitkä? Entä 64 tavua? Mitä jos se ei ole tarpeeksi pitkä? Entä 128 tai 200 tavua? Mikä oikeastaan ​​on ratkaisu täällä Yleisessä tapauksessa, jos emme tiedä etukäteen, mitä käyttäjän tulee kirjoittaa? Se on vain sellainen iso riesa, Ollakseni rehellinen, minkä vuoksi CS50 kirjastossa on muutamia kymmeniä rivejä koodi, joka yhdessä toteuttaa GetString merkkijonon siten, että emme on tiedettävä etukäteen, mitä käyttäjän tulee kirjoittaa. Erityisesti jos katsomme taaksepäin cs50.c kaksi viikkoa sitten, näet että getString todella tekee ei käytä scanf tällä tavalla. Pikemminkin se lukee yhden merkin kerrallaan. Koska yksi kiva juttu lukee yhden merkin on voimme taata itsemme aina on ainakin yksi merkkiä. Voin vain todeta nieriää, ja sitten ottaa nämä todella askelin vain lukea jokin merkki on aika näppäimistöltä. Ja sitten, mitä näet getString tekee, on aina se loppuu, sanovat, 16 tavua muistia, se käyttää malloc tai serkku sekä että jakaa enemmän muistia, kopiointi vanha muistin uuteen, ja sitten indeksoinnin pitkin, saada yksi merkki kerrallaan, ja kun se loppuu, että kimpale muisti, heittää sen pois, nappaa isompi kimpale muisti, kopioi vanha uusiin, ja toistaa. Ja se on todella tuskaa todella toteuttaa jotain niin yksinkertaista kuin saada panosta käyttäjä. Voit siis käyttää scanf. Voit käyttää muita vastaavia toimintoja. Ja paljon oppikirjoja ja online- esimerkkejä tehdä, mutta ne ovat kaikki alttiita tämänkaltaisia ​​ongelmia. Ja lopulta saada segfault on tavallaan ärsyttävää. Se ei ole hyvä käyttäjälle. Mutta pahimmassa tapauksessa, mitä se pohjimmiltaan laittaa koodi vaarassa? Jonkinlainen hyökkäys, mahdollisesti. Puhuimme yksi tällainen hyökkäys - täynnä pino. Mutta yleensä, jos et saa ylivuoto puskuri, kuten teimme pari viikkoa sitten, vain kirjallisesti enemmän kuin "Hello" pinoon, et voi todellakin ottaa, mahdollisesti tietokoneen, tai ainakin päästä käsiksi tietoihin, jotka ei kuulu sinulle. Joten lyhyt, siksi olemme ne apupyörät. Mutta nyt alamme ottaa niitä pois, meidän ohjelmia ei enää tarvitse, välttämättä, käyttäjän syötettä. Mutta jos ongelma asetettu kuusi, syöte tulevat valtava sanastotiedostoa 150 joidenkin outoa tuhat sanaa. Joten sinun ei tarvitse huolehtia käyttäjän mielivaltainen tulo. Annamme sinulle joitakin oletuksia siitä tiedoston. Kysyttävää viitteitä tai scanf tai käyttäjä syöttää yleensä? Okei, joten vilkaista sitten yksi perään aihe kaksi viikkoa sitten. Ja se oli tämä käsite struct. Ei siksi, että - tämä käsite struct, joka oli mitä? Mitä struct tehdä meille? Määrittele - Anteeksi? Määritä muuttujan tyyppi. Joten tavallaan. Olemme itse asiassa yhdistämällä kaksi aihetta. Joten typedef, muistaa, että voimme julistaa tyyppi omaa, kuten synonyymi, kuten merkkijonon char *. Mutta käyttämällä typedef ja struct, voimme luoda aidosti omia tietorakenteita. Esimerkiksi, jos menen takaisin gedit täällä vain hetken, ja menen eteenpäin ja tehdä jotain, haluan säästää tämä, sanotaanko, structs.c tilapäisesti, olen juuri menossa mennä eteenpäin ja sisältää standardio.h, int main mitätön. Ja sitten täällä, olettaa, että haluan kirjoittaa ohjelma, joka tallentaa useita opiskelijoita useista taloja, esimerkiksi. Joten se on kuin registrarial tietokanta jonkinlaisia. Joten jos tarvitsen nimensä yksi opiskelija, I voisi tehdä jotain char * nimi, ja minä teen jotain - Oikeastaan ​​nyt käyttää CS50 kirjasto vain hetken tehdä tästä hieman yksinkertaisempi, jotta voimme lainata niitä kymmeniä rivejä koodia. Ja haluan vain pitää asiat yksinkertaisina. Pidämme sitä merkkijono, ja nyt getString. Joten Väitän nyt, että olen tallennettu nimi Joidenkin opiskelijoiden ja talon Joissakin opiskelija, yksinkertaisesti käyttämällä muuttujia kuten teimme ja viikolla yksi. Mutta kai nyt halua tukea useita opiskelijoita. Okei, joten minun vaistoni tehdä string nimi2 saa getString, string house2 saa getString. Ja sitten meidän kolmas opiskelija, Tehdään nimi3 getString. Okei, joten tämä on toivottavasti silmiinpistävää te typerää, koska tämä prosessi on oikeastaan ​​koskaan tulee päättymään, ja se on juuri menossa tehdä minun koodi näyttää pahempi ja pahemmaksi. Mutta me ratkaisi liian viikolla kaksi. Mikä oli meidän suhteellisen puhdasta ratkaisu kun meillä oli useita muuttujia samaa tietotyyppiä, jotka kaikki liittyvät, mutta emme halua tätä kamalaa sotkua samalla tavoin nimetty muuttujia? Mitä me teimme sen sijaan? Joten Taisin kuulla muutamia paikkoja. Meillä oli jono. Jos haluat useita esiintymiä jotain, miksi emme puhdista kaikki ja vain sanoa, anna minulle array kutsutaan nimillä? Ja nyt, nyt kova koodi 3. Ja sitten antaa minulle toisen array kutsutaan taloa, ja anna minulle nyt kova koodi 3. Ja olen massiivisesti siivonnut sotkea, että olen juuri luonut. Nyt olen edelleen kova koodattu 3, mutta vielä 3 voisi dynaamisesti tulevat käyttäjän, tai argv tai vastaavia. Joten tämä on jo puhtaampaa. Mutta mikä on ärsyttävää tässä on, että nyt, vaikka nimi on jotenkin liittyviä peruskysymyksiä opiskelijan talo - se on opiskelija, että olen todella haluavat edustaa - Minulla on nyt kaksi paneelit, jotka ovat rinnakkaisia siinä mielessä, että he samankokoisia, ja nimet kiinnike 0 oletettavasti karttoja talot kiinnike 0, ja nimet kiinnike 1 karttoja taloja kiinnike 1. Toisin sanoen, että opiskelija asuu että talo, ja että muut opiskelija asuu, että muut talossa. Mutta varmasti tämä voisi olla tehdään entistä puhtaammin. No, se voi itse asiassa. Ja anna minun mennä eteenpäin ja avata up structs.h, ja voit katso tätä ajatusta täällä. Huomaa, että olen käyttänyt typedef, kun viittasi hetki sitten julistaa meidän oma tietotyyppi. Mutta olen myös tällä muita avainsanan nimeltään struct joka antaa minulle uuden tietorakenne. Ja tämä tietorakenne Väitän on menossa on kaksi asiaa sisällä se - merkkijono kutsutaan nimellä, ja merkkijono kutsutaan talon. Ja nimi aion antaa Tämä tietorakenne on menossa kutsua opiskelija. Voisin kutsua sitä mitä haluan, mutta semanttisesti tehdä järkeä minulle mielessäni. Joten nyt, jos en avaa parempi versio Ohjelman aloin kirjoittaa siellä, haluan selaa alkuun. Ja siellä on joitakin riviä koodia täällä, mutta haluan keskittyä varten hetki yhdessä. Olen ilmoittanut jatkuvasti kutsuttu opiskelijoita ja kova koodattu 3 nyt. Mutta nyt, huomaa kuinka puhdas minun koodi alkaa saada. Linjassa 22, julistan joukko opiskelijoita. Ja huomaa, että opiskelija on ilmeisesti nyt tietotyyppi. Koska yläreunassa olevan tiedoston, huomaa Olen mukana, että otsikkotiedoston että olen vetänyt ylös juuri hetki sitten. Ja että header-tiedosto yksinkertaisesti ollut tämä määritelmä opiskelija. Joten nyt olen luonut omia tietoja tyyppi, joka laatijat C vuotta sitten ei ajattele etukäteen. Mutta ei ole ongelma. Voin tehdä sen itse. Joten tämä on joukko nimeltään opiskelijoita, jokainen, jonka jäsenet on opiskelija rakenne. Ja haluan kolme näistä pakassa. Ja nyt, mitä muualla Tämän ohjelman tehdä? Tarvitsin jotain hieman mielivaltainen. Joten verkossa 24 lähtien Olen toistaa 0-3. Sitten kysyä käyttäjältä opiskelijan nimi. Ja sitten käytän getString kuin ennen. Sitten pyydän opiskelijan talossa, ja käytän getString kuin ennen. Mutta ilmoitus - hieman uutta pala syntaksin - En voi silti indeksi i. opiskelija, mutta miten saan at erityisiä tietoja alan sisällä struct? No, mitä ilmeisesti uusi pala syntaksin? Se on vain piste operaattori. Olemme oikeastaan ​​nähnyt tätä ennen. Olet nähnyt sen PSET viisi, jos olet syöksyi jo kanssa bittikarttatiedostoja. Mutta piste tarkoittaa vain sitä sisällä tämän struct tai useita kenttiä, antaa piste nimi, tai antaa minulle dot talo. Tämä tarkoittaa mennä sisälle struct ja saada ne tietyt kentät. Mitä loput tämän ohjelman tehdä? Se ei ole kaikki, että seksikäs. Huomaa, että en kerrata 0-3 uudelleen, ja minä yksinkertaisesti luoda Englanti lause kuten niin ja niin on niin ja kuten talo, kulkee pisteen nimi i: nnen opiskelijoiden ja niiden talon samoin. Ja sitten lopuksi, nyt alamme saada anaali tästä, nyt kun olemme perehtynyt mitä malloc ja muut toiminnot ovat olleet tekee kaiken tämän ajan. Miksi minun täytyy vapauttaa molemmat nimi ja talon, vaikka en ei soita malloc? GetString teki. Ja se oli likainen pikku salaisuus useita viikkoja, mutta getString on vuotanut muistin koko sijoittaa kaikki lukukauden toistaiseksi. Ja valgrand lopulta paljastaa tämän meille. Mutta se ei ole iso juttu, koska tiedän että en voi yksinkertaisesti vapauttaa nimi ja talon, vaikka teknisesti, jotta olla super, super turvallinen, minun pitäisi olla tekee joitakin virheentarkistusta täällä. Mitä vaistosi kertovat sinulle? Mitä minun pitäisi olla tarkistamatta ennen kuin vapauttaa mikä on merkkijono, alias joka char *? Olisin todella tarkistaa, jos opiskelijat kiinnike i dot nimi ei ole yhtä null. Sitten se tulee olemaan OK mennä eteenpäin ja vapaa että osoitin, ja sama tai muiden yhtä hyvin. Jos opiskelijat kiinnike i dot talo ei ole sama null, tämä nyt suojaa kulmaa vasten tapaus, jossa GetString palauttaa jotain null. Ja näimme hetki sitten, printf tulee suojella meitä täällä vain sanomalla null, joka on menossa katsomaan outoa. Mutta ainakin se ei segfault, kuten olemme nähneet. No, anna minun tehdä yksi asia täällä. structs-0 on sellainen tyhmä ohjelma koska en anna kaiken tämän tiedon, ja sitten se menetetään, kun ohjelma päättyy. Mutta haluan mennä eteenpäin ja tehdä tämän. Haluan tehdä terminaalin ikkuna vähän isompi. Haluan tehdä structs-1, joka on uusi versio. Minä suurentaa hieman. Ja nyt haluan ajaa piste slash structs-1. Opiskelijan nimi - David Mather, tehdään Rob Kirkland, Tehdään Lauren Leverett. Mielenkiintoista on nyt ilmoitus - ja minä vain tiedän tämän, koska Kirjoitin ohjelman - siellä on tiedosto nyt minun nykyinen hakemistoon students.csv. Jotkut teistä ehkä nähnyt Näiden todellisessa maailmassa. Mikä on CSV-tiedosto? Comma erotetut arvot. Se on tavallaan kuin köyhän miehen versio Excel-tiedoston. Se taulukko rivien ja sarakkeiden voit avata kuten Excel, tai Numerot Mac. Ja jos avaan tiedoston täällä gedit, ilmoitus - ja numerot eivät ole siellä. Se on vain gedit kertoo minua linja numerot. Huomaa ensimmäisellä rivillä tämän tiedosto on David ja Mather. Seuraava rivi on Rob pilkulla Kirkland. Ja kolmas rivi on Lauren pilkku Leverett. Joten mitä olen luonut? Olen nyt kirjoittanut C-ohjelma, joka tehokkaasti voi tuottaa taulukkolaskenta että voidaan avata kuten Excel. Ei kaikki, että pakottavia tietokokonaisuus, mutta jos sinulla on paljon suurempi paloina tietoja, joita et itse halua manipuloida ja tehdä kuvaajia ja kuten, tämä on ehkä yksi tapa luoda tietoihin. Lisäksi CSVs ovat todella erittäin yleinen vain tallentaa yksinkertaisia ​​tietoja - Yahoo Finance, esimerkiksi jos saat osakekursseja kautta ns API, ilmainen palvelu, jonka avulla voit get ajan tasalla varastossa lainauksia yrityksille, ne antaa tietoja takaisin Super yksinkertainen CSV-muodossa. Joten miten me sen teemme? No huomata, suurin osa tämän ohjelman lähes sama. Mutta huomaa täällä, eikä tulosta oppilaat ulos, on line 35 eteenpäin, Väitän, että olen säästö opiskelijat levylle, joten säästää tiedoston. Niin huomaa olen julistamisesta FILE * - nyt tämä on sellainen epäkohta C. Jostain syystä FILE on kaikki korkit, joka ei ole kuten useimmat muut tietotyypit in C. Mutta tämä on sisäänrakennettu tietotyyppi, FILE *. Ja olen julistamisesta osoitin tiedoston, Näin voit ajatella, että. fopen tarkoittaa open file. Mitä tiedosto haluat avata? Haluan avata tiedoston minä mielivaltaisesti soittaa students.csv. Voisin soittaa että jotain haluan. Ja sitten ottaa arvaus. Mitä toinen argumentti to fopen luultavasti tarkoittaa? Oikea, w kirjoittamista varten, voisi olla r lukea. Siellä on append jos haluat lisätä rivejä eikä korvata koko juttu. Mutta haluan luoda tämän tiedoston kerran, niin minä käytän quote lainaus w. Ja tiedän, että vain lukeneeni asiakirjoja tai man-sivulta. Jos tiedosto ei ole nolla - toisin sanoen, jos mitään meni pieleen - haluan kerrata yli opiskelijat 0-3. Ja nyt huomaa jotain koskaan niin hieman eri noin line 41 täällä. Se ei ole printf. Se fprintf tiedostojen printf. Joten se tulee kirjoittaa tiedostoon. Mitä tiedostoa? Yksi, jonka osoitin voit määrittää ensimmäisenä argumenttina. Sitten määrittää muotomerkkijonoa. Sitten määrittää, mitä merkkijono haluamme plug in ensimmäinen prosenttia s, ja sitten toinen muuttuja tai Toinen prosenttia s. Sitten suljemme tiedoston fclose. Kuin minä vapauttaa muistia kuin ennen, vaikka Minun pitäisi mennä takaisin ja lisää Joissakin tarkistaa null. Ja siinä se. fopen, fprintf, fclose antaa minulle kyky luoda tekstitiedostoja. Nyt näet ongelmatilanteissa asetettu viisi, joka liittyy kuvia, voit käyttää binääritiedostot sijaan. Mutta pohjimmiltaan, idea on sama, vaikka toimintoja will nähdä ovat hieman erilainen. Joten pyörremyrsky kiertue, mutta saat liiankin tuttuja tiedosto I/O-- tulo ja lähtö - kanssa PSET viisi. Ja kysyttävää aluksi perusasiat täällä? Niin? Mitä jos yrität vapauttaa nolla? Uskon, ellei vapaa on saanut hieman enemmän käyttäjäystävällinen, voit mahdollisesti segfault. Kulkee sen null on huono, koska en uskovat ilmaiseksi viitsii tarkistaa sinulle, koska se olisi mahdollisesti jätettä aikaa se tehdä itselleen kaikki maailman. Hyvä kysymys. Okei, joten tällainen saa meitä kiinnostava aihe. Teema Harjoitus viisi on tutkintaan. Ainakin se osa Ongelman asetettu. Forensics viitataan yleensä elpyminen tietoa, joka voi tai ei ehkä ole poistettu tarkoituksella. Ja niin ajattelin kertoa teille nopeasti maku mitä todella tapahtuu kaikilla tällä kertaa alla huppu tietokoneen. Esimerkiksi, jos sinulla on sisäpuolelle kannettavan tai pöytätietokoneen kovalevy, se on joko mekaaninen laite, joka todella pyörii - siellä on pyöreä asioita kutsutaan Platters jotka näyttävät aivan kuten mitä juuri ruudulle täällä, vaikka Tämä on yhä vanha koulu. Tämä on kolmen ja puolen tuuman kiintolevylle. Ja kolme ja puoli tuumaa viittaa of kanssa on asia, kun asennat sen ja tietokone. Monet teistä kaverit kannettavat tietokoneet nyt on solid-state drives tai SSD, jossa ei ole mitään liikkuvia osia. Ne ovat paremminkin RAM ja vähemmän kuin Nämä mekaaniset laitteet. Mutta ideat ovat edelleen samat, varmasti kuin ne liittyvät ongelmaan asettaa viisi. Ja jos ajattelee nyt kovalevy edustaa on ympyrä, jonka Minä piirtää täällä näin. Kun luot tiedosto tietokoneeseen, onko se SSD, tai Tällöin vanhempi koulun kiintolevy, että tiedosto sisältää useita bittejä. Sanotaan, että se on tämän 0 ja 1, koko joukko 0 ja 1 s. Joten tämä on minun koko kiintolevyn. Tämä on ilmeisesti aika iso tiedosto. Ja se käyttää jopa 0 ja 1 s tuohon osa fyysisen lautasella. No, mitä se on fyysinen osa? No, käy ilmi, että kiintolevylle, ainakin tämän tyyppinen, siellä on nämä pikku magneettisia hiukkasia. Ja he pohjimmiltaan ovat pohjois-ja etelänavat heille niin, että jos puolestaan ​​yksi niistä magneettisia hiukkasia Näin voisi sanoa, että se on edustaa 1. Ja jos se on ylösalaisin etelään pohjoiseen, voisi sanoa, että se on eli 0. Joten todellisessa fyysisessä maailmassa, joka on miten voisi edustaa jotain binary tila 0 ja 1. Niin, että kaikki tiedosto on. On koko joukko magneettinen hiukkasia, jotka ovat niiden tällä tavalla tai Tällä tavoin luodaan malleja 0 ja 1 s. Mutta näyttää siltä, ​​kun tallennat tiedoston, joitakin tietoja on tallennettu erikseen. Joten tämä on pieni pöytä, hakemistoon, niin sanoakseni. Ja Soitan tämän sarakkeen nimi, ja Soitan tämän sarakkeen sijainti. Ja aion sanoa, kai tämä on minun jatkaa. Oma resume.doc varastoidaan sijainti, sanokaamme 123. Olen aina mennä, että numero. Mutta riittää sanoa, että aivan kuten RAM, voit ottaa kiintolevyn se gigatavu tai 200 gigatavua tai teratavu, ja voit määrä koko tavua. Voit numeroida kaikki paloina 8 bittiä. Joten me sanomme, että tämä on paikka 123. Joten tämän hakemiston sisällä minun käyttöjärjestelmä järjestelmä muistaa, että minun ansioluettelosi on paikalla 123. Mutta se saa mielenkiintoista, kun poistat tiedoston. Joten esimerkiksi - ja onneksi suurin osa maailman on kiinni kiinni tämän - mitä tapahtuu, kun vedät tiedoston Mac OS Trash tai Windowsin roskakorin? Mikä tarkoitus tehdä se? Se on tietysti päästä eroon tiedoston, mutta mitä teko vetämällä ja tippu roskakoriin tai Roskakori tehdä tietokoneella? Ei yhtään mitään, oikeastaan. Se on aivan kuin kansio. Se on erityinen kansio, on varma. Mutta se todella poistaa tiedoston? No, ei, koska jotkut teistä luultavasti ollut kuin, oh damn, et ole tarkoita tehdä. Joten kaksoisnapsauttamaasi Roskakoriin tai roskakoriin. Olet pisti ympäri ja olet takaisin tiedosto vetämällä se pois sieltä. Niin selvästi, se ei ole välttämättä poistamista. OK, olet fiksumpi. Tiedät, että vain vetämällä sen Roskakoriin tai roskakorin ei tarkoita olet tyhjennys roskakoriin. Joten voit mennä jopa valikkoon ja sanot Tyhjennä roskakori tai Tyhjennä roskakori. Mitä sitten tapahtuu? Niin, niin se poistetaan enemmän. Mutta kaikki tämä tapahtuu, on tämä. Tietokone unohtaa missä resume.doc oli. Mutta mitä ei ole muuttunut ilmeisesti kuvassa? Bittiä, 0 ja 1 s joka Väitän ovat paikan päällä joidenkin fysikaalisten laitteisto. He ovat yhä olemassa. Se on vain tietokone on unohtanut, mitä ne ovat. Joten se on lähinnä vapautti tiedoston bittejä niin, että ne voidaan käyttää uudelleen. Mutta ei ennen kuin luoda enemmän tiedostoja, ja enemmän tiedostoja, ja lisää tiedostot toden-näköisesti, ne 0 ja 1 s, nämä magneettiset partikkelit, saavat uudelleen, ylösalaisin tai oikein päin, sillä muita tiedostoja, 0 ja 1 s. Joten sinulla on tämä aikaikkuna. Ja se ei ole ennustettavissa pituus, todella. Se riippuu koosta kiintolevyn ajaa ja kuinka monta tiedostoa olet ja kuinka nopeasti voit tehdä uusia. Mutta on tämä aikaikkuna aikana kyseinen tiedosto on edelleen täysin kerrytettävissä. Joten jos joskus käyttää ohjelmia, kuten McAfee tai Norton yrittää palauttaa tiedot, kaikki he tekevät yrittää palauttaa tämän ns hakemiston selvittää, missä tiedosto oli. Ja joskus Norton ja sanon, tiedosto on 93% kerrytettävissä. No, mitä se tarkoittaa? Se tarkoittaa vain sitä, että jonkin toisen tiedoston sattumalta päätyi käyttämällä vaikkapa ne bittiä alkuperäinen tiedosto. Joten mitä todella mukana tietojen palauttaminen? No, jos sinulla ei ole jotain Norton valmiiksi asennettu tietokoneeseen, parasta mitä voi joskus tehdä on katsoa klo koko kiintolevyn etsimässä bittikuvioina. Ja yksi teemoista Harjoitus viisi on, että voit etsiä vastaa kiintolevyn, oikeuslääketieteen kuva compact flash kortti digitaalikamera, etsivät 0s ja 1s, että tyypillisesti korkea todennäköisyys, edustavat alku JPEG-kuvan. Ja te voi palauttaa niitä kuvia olettaen, jos näen tätä mallia bittiä rikosteknisen kuvan, jossa suuri todennäköisyys, että merkit alku JPEG. Ja jos näen saman kuvion uudestaan, että luultavasti merkitsee alkua toinen JPEG, ja toinen JPEG, ja toinen JPEG. Ja tämä on tyypillisesti miten tietojen palauttamista toimii. Mitä mukavaa noin JPEG on vaikka tiedostomuoto itsessään on hieman monimutkainen, alussa jokaisen tällaisen tiedosto on oikeastaan ​​melko tunnistettavissa ja yksinkertainen, kuten näette, Jos et ole saanut jo. Joten lähemmin alla huppu siitä, mitä on ollut meneillään, ja mitä nämä 0 ja 1 s ovat, antaa sinulle vähän enemmän yhteydessä tähän nimenomaiseen haasteeseen. [VIDEOTOISTOSTA] -Jos tietokone tallentaa eniten sen pysyvä tietojen. Voit tehdä, että data kulkee RAM ohjelman kanssa signaaleja, jotka kertovat kovalevy, miten säilyttää tietoihin. Kovalevy piirit kääntää nämä signaalit jännite vaihtelut. Nämä puolestaan ​​hallita kiintolevyn liikkuvat osat, joitakin harvoja liikkuvat osat jäljellä moderni tietokone. Osa signaaleista ohjata moottoria joka pyörii metallipäällysteisten Platters. Tietosi on tosiasiallisesti varastoitu Näiden Platters. Muut signaalit siirtää lukea / kirjoittaa päät lukea tai kirjoittaa tietoja Platters. Tämä kone niin tarkka, että ihmisen hiukset voinut edes kulua päätä ja spinning Platters. Silti se kaikki toimii loistava nopeuksilla. [END VIDEOTOISTOSTA] DAVID MALAN: Suurenna hieman syvemmälle nyt mitä itse asiassa nämä Platters. [VIDEOTOISTOSTA] -Katsotaan mitä vain näki hidastettuna. Kun lyhyt pulssi sähköä lähetetään luku / kirjoituspää, jos kääntää on pieni sähkömagneettinen varten sekunnin murto-osassa. Magneetti luo kentän, joka muutoksia napaisuus pieni, pieni osa metalli-hiukkaset, jotka takki jokaisen vati pinta. Kuvio sarja näitä pieniä, ladattu-alueilla levylle edustaa yhtä vähän tietoja binääriluku käyttämän tietokoneita. Nyt, jos nykyinen on lähetetty yksi tapa läpi luku / kirjoituspää, alue on polarisoitu yhteen suuntaan. Jos nykyinen lähetetään vastakkaiseen suuntaan, polarisaatio on päinvastainen. Miten saat tietoja pois kiintolevyltä? Vain kääntää prosessi. Joten se on hiukkasia levyn jotka saavat virran luku / kirjoituspää liikkuu. Kokoa miljoonia tällaisia magneettisia segmentit, ja sinulla tiedoston. Nyt palaset yhteen tiedostoon voi olla hajallaan ympäri aseman Platters, ikään kuin sotku papereita pöydällä. Joten erityinen extra tiedosto pitää kirjaa , missä kaikki on. Etkö halua sinulla oli jotain? [END VIDEOTOISTOSTA] DAVID MALAN: OK, luultavasti ei. Joten kuinka moni teistä kaverit Kasvoin nämä? OK, joten se on vähemmän ja vähemmän omistajaa joka vuosi. Mutta olen iloinen, että olet ainakin tuttuja niiden kanssa, koska tämä ja oman Varaa demo valitettavasti kuolevat hyvin hidas kuolema täällä tuntemus. Mutta tämä on mitä olen ainakin takaisin lukion, käytetään käyttö varmuuskopioita. Ja se oli mahtavaa, koska voisi tallentaa 1,4 megatavua tässä levylle. Ja tämä oli suuri tiheys versio, kuten on osoitettu HD, joka on eli ennen tämänpäiväistä HD-videoita. Standard tiheys oli 800 kilotavua. Ja sitä ennen oli 400 kilotavun levyjä. Ja sitä ennen oli 5 ja 1/4 tuuman levyt, jotka olivat todella levyke, ja hieman leveämpi ja korkeampi kuin nämä asiat täällä. Mutta voit itse nähdä niin sanotut floppy osa näistä kiekoista. Ja toiminnallisesti, he todella melko samanlainen kuin kovalevyt at ainakin tätä tyyppiä. Jälleen SSD uudemmissa tietokoneissa toimivat hieman eri tavalla. Mutta jos siirrät että pieni metalli-välilehti, voit itse nähdä hieman evästeen, tai vati. Se ei ole metallia kuin tämä yksi. Tämä on todella jokin halvempi muovia. Ja voit sellaista heiluminen sitä. Ja olet trully vain pyyhkiä pois joitakin bittien määrä tai magneettisia hiukkasia Tämän levyn. Joten onneksi ei ole mitään sitä. Jos tämä asia on sillä tavalla - ja kattavat silmäsi ja ne teidän naapuri - voit vain sellainen vetää tämän koko vaippa pois niin. Mutta on hieman keväällä, joten tietoinen, että silmäsi. Joten nyt sinulla on todella levyke. Ja mitä merkillistä tästä on se, että niin paljon kuin se on pienimuotoinen esitys suurempi kovalevy, nämä asiat ovat super, Super yksinkertainen. Jos hyppysellinen pohjaan se nyt, että metalli asia on pois ja kuori ne auki, kaikki on on kaksi kappaletta huopa ja ns levyke kanssa pala metallia sisäpuolella. Ja siellä menee puolet minun levyn sisällöstä. Siinä menee toinen puolet. Mutta se kaikki pyöri sisällä käyttävän tietokoneen menneen. Ja vielä, että tämä oikeisiin mittasuhteisiin, kuinka suuri on irti kovalevyt näinä päivinä? 500 gigatavua, teratavu, ehkä pöytätietokone, 2 teratavua, 3 teratavua, 4 teratavua, eikö? Tämä on yksi megatavu, antaa tai ottaa, joita ei edes sovi tyypillinen MP3 enää näinä päivinä, tai joidenkin samankaltaisia ​​musiikkitiedoston. Joten pieni matkamuisto sinulle tänään ja myös auttaa contextualize mitä me voidaan ottaa itsestäänselvyytenä nyt ongelma asettaa viisi. Joten ne ovat sinun omiasi. Joten anna minun siirtyminen, jossa on viettää seuraavan PSET samoin. Joten olemme nyt asetettu tälle sivulle - oh, pari ilmoitukset nopeasti. Tänä perjantaina, jos haluat liittyä CS50 lounaalle, mene paikkakunta, cs50.net/rsvp. Ja opinnäytetyön - niin per oppimäärän, olemme julkaisseet Opinnäytetyö erittely jo. Ymmärtäkää, että se ei tarkoita se johtuu erityisesti pian. Se on lähetetty, todella, vain saada te ajatellut sitä. Ja todellakin, erittäin merkittävä prosenttiosuus sinun tulee puuttua lopullinen hankkeiden aineistosta, että ei ole edes mennyt luokassa, mutta jo ensi viikolla. Ilmoitus kuitenkin, että spec vaatii muutama eri osien opinnäytetyön. Ensimmäinen, muutaman viikon, on alustava ehdotus, melko rento sähköpostia oman TF kertoa hänelle tai mitä olet miettiä projektin, jossa ei sitoudu. Ehdotus on sinun sitoutuminen, sanoi täällä, tämä on mitä Haluaisin tehdä projektiini. Mitä mieltä olet? Liian iso? Liian pieni? Onko se hallittavissa? Ja näet spec lisätietoja. Pari viikkoa sen jälkeen, että on tilaa mietintö, joka on samalla casual sähköpostia oman TF sanoa, kuinka kaukana olet lopulliseen hankkeen toteuttamiseen, jonka jälkeen CS50 Hackathon joka antaa kaikille on kutsuttu, joka on tapahtuman 20:00 yhtenä iltana asti 07:00 AM seuraavana aamuna. Pizza, kuten olen saattanut mainita viikolla nolla, wil tarjoillaan 21:00, Kiinalaista ruokaa 01:00. Ja jos olet vielä hereillä 05:00, otamme sinut IHop aamiaiseksi. Joten hackathon on yksi enemmän elämyksiä luokassa. Sitten täytäntöönpano johtuu, ja sitten huipussaan CS50 Fair. Lisätietoja kaikista näistä vuonna lähiviikkoina. Mutta mennään takaisin jotain old school - uudelleen, array. Joten array oli mukavaa, koska se ratkaisee ongelmia, kuten näimme hetki sitten opiskelija-rakenteet saada vähän käsistä, jos me haluavat olla opiskelija yhden, opiskelija kaksi, Opiskelija kolme, opiskelija dot dot dot, Joissakin mielivaltainen joukko opiskelijoita. Joten paneelit, muutama viikko sitten, swooped ja ratkaista kaikki ongelmamme, ettei tietäen etukäteen, kuinka paljon tietyntyyppinen saatamme haluta. Ja olemme nähneet, että structs voi auttaa meitä edelleen järjestää meidän koodi ja pitää käsitteellisesti samankaltaisia ​​muuttujia, kuten nimi ja talon yhdessä, jotta voimme voi käsitellä niitä yhtenä kokonaisuutena sisällä joita on pienempiä paloja. Mutta paneelit on joitakin haittoja. Mitkä ovat joitakin haittoja olemme kohdanneet jossa ryhmät tähän mennessä? Mikä tuo on? Kiinteä koko - joten vaikka saatat voitava varata muistia array, kun tiedät kuinka monta opiskelijaa sinulla on, kuinka monta merkkiä on käyttäjältä, kun olet varattu array, olet sellainen maalattu itsesi nurkkaan. Koska et voi lisätä uusia osia keskelle array. Et voi lisätä enemmän elementtejä lopussa array. Oikeasti, sinun täytyy turvautua luoda kokonaan uusi joukko, kuten olemme keskustelleet, kopioimalla vanha uuteen. Ja vielä, että on päänsärky, joka GetString käsittelee sinulle. Mutta jälleen kerran, et voi jopa lisätä jotain keskelle array jos korko ei ole täysin täytetty. Esimerkiksi, jos tämä joukko tässä koon kuusi on vain viisi asiaa siinä, Voisit vain tack jotain kiinni loppuun. Mutta entä jos haluat lisätä jotain keskelle array, vaikka se voisi olla viisi kuudesta asioita se? No, mitä me teemme, kun meillä oli kaikki meidän vapaaehtoisilla ihmisillä lavalla viikkoa aiemmin? Jos halusimme laittaa joku täällä, joko nämä ihmiset miten siirtää tämän tavalla, tai nämä ihmiset miten siirtää tämän tavalla, ja että tuli kalliiksi. Siirtämällä ihmisiä sisällä array päätyi laskemalla ja kustannuslaskenta meille aikaa, joten paljon meidän n potenssiin käynnissä aikoina lisäyslajittelu varten Esimerkiksi, pahimmassa tapauksessa. Joten ryhmät ovat suuria, mutta sinun on tietää etukäteen, kuinka suuri haluat. Joten OK, tässä on ratkaisu. Jos en tiedä etukäteen, kuinka monta opiskelijat Saatan olla, ja tiedän kerran Päätän kuitenkin olen juuttunut, että monet opiskelijat, miksi en vain aina jakaa kaksi kertaa niin paljon tilaa niin voisin mielestäni tarvitse? Eikö tämä ole järkevä ratkaisu? Realistisesti, en usko, että olemme menossa on yli 50 paikkaa in array keski-kokoluokan joten haluan vain pyöristää ylöspäin. Teen 100 paikkaa minun array, vain jotta voimme varmasti saada opiskelijoiden määrä Odotan olla joissakin keskisuurten luokassa. Joten miksi ei vain koota ja jakaa enemmän muistia, Tyypillisesti array kuin uskot edes tarvitse? Mitä tämä yksinkertainen pushback tätä ajatusta? Olet vain tuhlaa muistia. Kirjaimellisesti jokainen ohjelma kirjoitat sitten on ehkä käyttää kaksi kertaa enemmän muistia kuin todella tarvitset. Ja se vain ei tunnu Erityisen tyylikäs ratkaisu. Lisäksi se vain laskee todennäköisyys ongelma. Jos sinulla sattuu olemaan suosittu kurssi yhden lukukauden ja sinulla on 101 opiskelijoita, ohjelma on vielä pohjimmiltaan edessään sama ongelma. Joten onneksi on olemassa ratkaisu Tämän mainoksen kaikki ongelmamme muodossa tietorakenteita, jotka ovat monimutkaisempia kuin ne, olemme nähneet tähän mennessä. Tämä Väitän, on linkitetty lista. Tämä on luettelo numerot - 9, 17, 22, 26, ja 34 - , jotka on yhdistetty toisiinsa tavalla mitä olen piirretään nuolet. Toisin sanoen, jos halusin edustaa array, voisin tehdä jotain tällaista. Ja laitan tämän riippukuljettimella vain hetken. Voisin tehdä - Hei, kaikki hyvin. Valmiustila. Uusi tietokone täällä, kirkas - Selvä. Joten jos minulla on nämä numerot array - 9, 17, 22, 26, 24 - ei välttämättä mittakaavassa. Okei, joten tässä on minun array - oh my god. Okei, joten tässä on minun array. Oh my god. [Naurua] DAVID MALAN: Pretend. Se on liian paljon vaivaa mennä takaisin ja korjata se, joten - 26. Joten meillä on tämä joukko 9, 17, 22, 26, ja 34. Niille näet kiusallista virhe Olen juuri tehnyt, siellä se on. Olen siis väittävät, että tämä on erittäin tehokas ratkaisu. Olen myönnetty yhtä monta ints kuin Tarvitsen - yksi, kaksi, kolme, neljä, viisi tai kuusi - ja olen sitten tallennetaan numerot sisällä tämän taulukon. Mutta oletetaan, sitten haluan lisätä arvo, kuten numero 8? No, jos se menee? Oletetaan Haluan lisätä numero kuin 20. No, jos se menee? Jossain keskellä, tai numero 35 on mennä jossain lopussa. Mutta olen kaikki loppui. Ja niin tämä on keskeinen haaste Taulukoiden, että ei ole ratkaisu. Väitin ​​hetki sitten, getString ratkaisee tämän ongelman. Jos haluat lisätä kuudennella numerolla tähän array, mikä on ainakin yksi ratkaisu voi turvautua varmasti, aivan kuten me teemme getString? Mikä tuo on? No, tee se isompi on helpommin sanottu kuin tehty. Emme voi välttämättä tehdä array isompi, mutta mitä voimme tehdä? Tee uusi joukko, joka on isompi, kooltaan 6, tai ehkä koko 10, jos haluamme päästä eteenpäin asioita, ja sitten kopioida vanha array uuteen, ja sen jälkeen vapauttaa vanha array. Mutta mitä käyntiaika nyt tätä prosessia? Se on iso O n, koska kopiointi tulee maksamaan sinulle yksikköä aikaa, joten ei niin hyvä, jos meillä on jakaa uuden array, joka on menossa kuluttaa kaksi kertaa niin paljon tilapäisesti muistiin. Kopioi vanha uusiksi - Tarkoitan, se on vain päänsärky, joka on, jälleen, miksi me kirjoitimme GetString sinulle. Joten mitä voisimme tehdä sen sijaan? No, mitä jos meidän tietorakenne todella on aukkoja se? Oletetaan, että olen rentoutua minun tavoite saada peräkkäisiä paloina muistia, jossa 9 on aivan 17, joka on aivan 22, ja niin edelleen. Ja olettaa, että 9 voi olla yli täällä RAM ja 17 voi olla yli täällä RAM, ja 22 voi olla yli täällä RAM. Toisin sanoen, en tarvitse niitä edes takaisin takaisin enää. Minulla on vain jotenkin lanka neulan läpi jokaisen näistä numeroista tai kukin Näiden solmut, kuten me kutsumme suorakulmioissa Olen laatinut heitä, Muistan miten päästä viimeinen kuten solmun ensin. Joten mikä on ohjelma rakentaa olemme nähneet viime aikoina, joista en voi toteuttaa, että kierre, tai piirretään täällä, jolla voin panemaan ne nuolet? Joten viitteitä, eikö? Jos minä kohdentaa ole vain int, mutta solmu - ja solmu, en tarkoita vain astiaan. Ja visuaalisesti, tarkoitan suorakulmio. Joten solmu ilmeisesti tarvitsee sisältää kaksi arvoa - int itse, ja sitten, kuten ehdotetun alaosassa suorakulmion, tilaa int. Joten ajatellen täällä, kuinka suuri on tämä solmu, tämä kontti kyseessä? Kuinka monta tavua int? Oletettavasti 4, jos se on yhtä paljon kuin tavallisesti. Ja sitten kuinka monta tavua että osoitin? 4. Joten tämä pakkaus, tai tämän solmun, on olemaan 8-tavun rakenne. Niin, ja se on onnellinen sattuma, että me vain esitteli tämän käsitteen struct, tai C-rakenne. Niin väitän, että haluan ottaa askel tätä kohti kehittyneempiä täytäntöönpano lukuluettelosta linkitetty lista numeroita, minun täytyy tehdä hieman ajattelua edessä ja julistaa ei vain int, mutta struct että soitan, tavanomaisesti täällä, solmu. Voisimme kutsua sitä mitä haluamme, mutta solmu tulee olemaan temaattinen paljon asioita, alamme nyt. Sisällä että solmu on int n. Ja sitten tämä syntaksin, hieman outo ensi silmäyksellä - struct solmu * seuraavaksi. No kuvallisesti, mikä se on? Tämä on alaosa suorakulmion näimme vain hetki sitten. Mutta miksi minä puhun struct solmu * toisin kuin vain solmuun *? Koska jos näin osoitin osoittaa toisessa solmussa, se on vain osoite, solmun. Se vastaa sitä, mitä olemme keskustelivat viitteitä toistaiseksi. Mutta miksi, jos väitän, tämä rakenne on nimeltään solmu, minun on sanottava struct solmun täällä sisällä? Täsmälleen. Se on tavallaan typerä todellisuus C. Typedef, niin sanotusti, ei ole vielä tapahtunut. C on super kirjaimellisesti. Se lukee koodin ylhäältä alas, vasemmalta oikealle. Ja kunnes se osuu, että puolipiste on bottom line, arvaa mitä ei olemassa tietotyyppi? Solmu, lainaus lainaus solmu. Mutta koska Pidempi ilmoitus tein ensimmäisellä rivillä - struct solmu - koska se oli ensin, ennen aaltosulkeita, että on tavallaan kuin pre-kouluttamalla kalahtaa, että olet Tiedätkö mitä, anna minulle struct nimeltään struct solmu. Suoraan sanottuna, en pidä soittaa asioita struct solmu, struct solmu kaikki koko minun koodi. Mutta minä käyttää sitä vain kerran, vain sisällä, niin että voin tehokkaasti luoda eräänlainen kehäviittauksen, ei osoitin itselleni sinänsä, mutta osoitin toiseen sama tyyppi. Niin on käynyt ilmi, että tietorakenne näin, siellä on muutama toiminnot, jotka voivat olla kiinnostaa meitä. Meidän kannattaa lisätä osaksi listan näin. Meidän kannattaa poistaa luettelosta näin. Meidän kannattaa etsiä luettelosta arvo, tai yleisemmin kulkea. Ja Traverse on vain hieno tapa sanomalla alkavat vasemmalle ja siirtää kaikki aivan oikealle. Ja ilmoitusta, vaikka tätä hieman hienostunut tietorakenne, anna minulle ehdottaa, että voimme lainata joitakin ajatuksia viimeisen kahden viikon aikana ja toteuttaa toiminto nimeltään etsiä näin. Se tulee palauttaa true tai väärä, osoittaa kyllä ​​tai no, n on luettelossa. Sen toinen argumentti on osoitin luetteloon itse, niin osoitin solmuun. Kaikki aion niin tehdä, on ilmoittaa väliaikainen muuttuja. Me kutsumme sitä PTR Sopimuksen mukaan osoitintoimintoihin. Ja voin liittää se sama listan alussa. Ja nyt huomaa kun silmukka. Niin kauan kuin osoitin ei ole yhtä suuri null, aion tarkistaa. Onko osoitin nuoli n yhtä n, joka hyväksyttiin vuonna? Ja odota hetki - uusi pala syntaksin. Mikä on nuoli yhtäkkiä? Niin? Täsmälleen. Joten taas muutama minuutti sitten, käytimme dot merkintätapa käyttää jotain sisällä struct, jos muuttuja et ole struct itse, mutta osoitin struct, Onneksi pala syntaksin lopulta tekee vaistomaisesti järkevältä. Nuoli tarkoittaa seurata osoitin, kuten meidän nuolet tyypillisesti tarkoittaa kuvallisesti, ja mennä tiedot alan sisällä. Joten nuoli on sama asia kuin piste, mutta voit käyttää sitä, kun olet osoittimen. Joten vain kertaus sitten, jos n alalla sisällä struct kutsutaan osoitin vastaa yhtä n, return true. Muuten, tämä linja täällä - osoitin vastaa osoittimen vieressä. Joten mitä tämä tekee, ilmoitusta, on, jos olen Olen tällä hetkellä suunnattu struct , joka sisältää 9, ja 9 ei ole numero Etsin - kai Etsin for n = 50 - Aion päivittää väliaikainen osoitin ja osoita tässä solmu enää, mutta osoitin nuolta, joka aikoo laittaa minut tänne. Nyt tajusin on tornado käyttöönottoa. Keskiviikkona me itse tehdä tämän joidenkin ihmisten ja joidenkin enemmän koodi hitaammin. Mutta ymmärtää, olemme nyt tekemässä tietomme rakenteet monimutkaisempi niin, että algoritmeja voidaan saada tehokkaampia, joka tulee olemaan edellytys PSET kuusi, kun lataudu, taas ne, 150000 sanaa, mutta täytyy tehdä niin tehokkaasti, ja mieluiten luoda ohjelma, joka toimii meidän käyttäjät eivät lineaarinen, ei N potenssiin, mutta jatkuva aikaan, ihanteellinen. Nähdään keskiviikkona. SPEAKER: Seuraavassa CS50, David unohtaa hänen base tapauksessa. DAVID MALAN: Ja se miten lähettää tekstiviestejä C. Mikä - [ERI TEKSTIVIESTI Ilmoituksen ääniä]