[Powered by Google Translate] [Viikko 4] [David J. Malan] [Harvardin yliopisto] [Tämä on CS50.] [CS50.TV] Selvä, tämä on CS50, ja tämä on alku viikolla 4, ja tämä on yksi hitain mahdollista lajittelualgoritmeja. Kumpi oli se, että me vain katselin siellä? Se oli kupla lajitella, jotta iso O (n ^ 2) + summa, ja olemme todella ole ainoita tässä maailmassa tunnu tietävän mikä kupla lajitella on tai sen käyntiaika. Itse asiassa tämä oli haastattelun Eric Schmidt Google ja entinen senaattori Barack Obama vain muutama vuosi sitten. Nyt, senaattori, olette täällä Google, ja haluan ajatella puheenjohtajuuskauden työhaastattelu. Nyt on vaikea saada työtä presidenttinä, ja olet menossa läpi jäykkyys nyt. On myös vaikea saada työtä Google. Meillä on kysymyksiä, ja pyydämme ehdokkaita kysymyksiä, ja tämä yksi on Larry Schwimmer. Te kaverit ajattelevat olen tosissasi? Se on täällä. Mikä on tehokkain tapa lajitella miljoonaa 32-bittisiä kokonaislukuja? [Naurua] Hyvin Olen pahoillani. >> Ei, ei, ei, ei. Mielestäni kupla lajitella olisi väärä tapa edetä. Tule, joka kertoi hänelle tästä? Viime viikolla muistaa otimme tauon koodin, ainakin päivä, ja alkoi keskittyä jonkin korkeamman tason ideoita ja ongelmanratkaisu yleisemmin yhteydessä etsiminen ja lajittelu, ja me otettiin jotain, emme läimäyttää tätä nimeä viime viikolla, mutta asymptoottinen notaatio, Big O, Big Omega, ja joskus Big Theta notaatio, ja nämä olivat vain tapoja kuvata käyntiaika algoritmeja, kuinka paljon aikaa kuluu algoritmin ajaa. Ja ehkä muistaa, että puhuitte käyntiaika suhteen koko tulon, jota yleensä kutsumme n riippumatta ongelma voi olla, missä n on ihmisten määrä huoneessa, sivumäärä puhelinluettelosta, ja aloimme kirjoittaa asioita kuten O (n ^ 2) tai O (n) tai O (n log n), ja vaikka matematiikka ei oikein toiminut niin täydellisesti ja se oli n ² - n / 2 tai jotain me sen sijaan vain heittää pois joitakin alemman asteen termit, ja motivaatio on, että me todella haluamme eräänlainen objektiivinen tapa arvioida ohjelmien suorituskykyä tai suorituskyvyn algoritmit että loppujen lopuksi ei ole mitään tekemistä, esimerkiksi kanssa tietokoneen nopeudesta tänään. Esimerkiksi, jos toteuttaa kupla lajitella, tai voit toteuttaa yhdistää lajitella tai valinta lajitella tänään tietokoneella, 2 GHz tietokone, ja käytät sitä, ja se vie jonkin määrän sekunnissa, ensi vuonna siellä 3 GHz tai 4 GHz tietokone, ja saatat sitten väittää, että "Vau, minun algoritmi on nyt kaksi kertaa niin nopeasti ", kun todellisuudessa se ei tietenkään pidä paikkaansa. Se on vain laitteisto on saanut nopeammin, mutta tietokone ei ole, ja niin me todella haluamme heittää pois asioita, kuten 2 kerrannaisina tai 3 kerrannaisina, kun se tulee kuvataan kuinka nopeasti tai kuinka hidas algoritmi on ja oikeastaan ​​vain keskittyä n: tai jokin tekijä niiden Joissakin voiman kuin tapauksessa lajittelee viime viikolla. Ja muistuttaa, että sen avulla merge sort pystyimme tekemään niin paljon paremmin kuin kupla lajitella ja valinta lajitella ja jopa lisäys lajitella. Saimme alas n log n, ja jälleen, Muistutan, että log n tarkoittaa yleensä jotain, joka kasvaa hitaammin sitten n, joten n log n tähän asti oli hyvä koska se oli pienempi kuin n ². Mutta saavuttamaan n log n kanssa Merge sort Mikä oli perus alkio ajatus, että meillä oli hyödyntää että me myös velkarahalla takaisin viikolla 0? Miten voimme ratkaista lajittelu ongelma taitavasti Yhdistäminen tavallaan? Mikä oli avain näkemystä, kenties? Kuka tahansa. Okei, ota askel taaksepäin. Kuvaile yhdistää lajitella omin sanoin. Miten se toimii? Okei, me soutaa takaisin viikossa 0. Okei, joo. [Äänetön-opiskelija] Okei, hyvä, joten jaoimme joukko numeroita 2 kpl. Meillä lajitellaan kukin näistä kappaletta, ja sitten yhdistimme ne, ja olemme nähneet tätä ajatusta ennen ottaa ongelma, että tämä on iso ja pilkkominen se ylös ongelma, että tämä on iso tai näin iso. Recall puhelinluettelon esimerkki. Muistuttaa itsestään laskenta algoritmin viikkoa sitten niin yhdistää lajitella teki yhteenvedon tämän pseudokoodilla täällä. Kun olet antanut n osia, ensin se oli järki tarkistaa. Jos n <2, niin älä tee yhtään mitään koska jos n <2, niin n on luonnollisesti 0 tai 1, joten jos se on joko 0 tai 1 ei ole mitään lajitella. Olet valmis. Luettelo on jo triviaalisti lajitellaan. Mutta muuten jos sinulla 2 tai useampia elementtejä mennä eteenpäin ja jakaa ne osaksi 2 puolikkaat, vasemmalle ja oikealle. Lajittele kukin näistä puolikkaat, ja sitten yhdistää lajiteltu puolikkaat. Mutta ongelma tässä on se, että ensi silmäyksellä tämä tuntuu olemme punting. Tämä on pyöreä määritelmän, että jos olen pyytänyt sinua lajitella nämä n elementtiä ja sanot "Hyvä on, me lajitella ne n / 2 ja nuo n / 2 elementtiä" Sitten minun seuraava kysymys tulee olemaan "Hieno, miten lajitella n / 2 alkiota?" Mutta koska rakenne tämän ohjelman koska on perustapauksen, niin sanotusti, tämä erityinen tapaus, joka sanoo jos n > Sara, okei. Kelly. >> Kelly ja? Willy. >> Willy, Sara, Kelly, ja Willy. Juuri nyt olen ollut kysyi joku kuinka monet ihmiset ovat jopa tässä vaiheessa, ja minulla ei ole aavistustakaan. Tämä on todella pitkä lista, joten sen sijaan aion tehdä tämän tempun. Aion kysyä henkilölle viereeni tekemään suurimman osan työstä, ja kun hän on tehnyt tekee suurimman osan työstä Aion tehdä vähiten työtä mahdollista ja vain lisää 1 mihin tahansa hänen vastaus on, joten tässä mennään. Minulta on kysytty, kuinka monet ihmiset ovat lavalla. Kuinka monta ihmistä lavalla vasemmalla sinä? Vasen minua? >> Okei, mutta älä huijaa. Se on hyvä, se on oikein, mutta jos haluamme jatkaa tätä logiikkaa Oletetaan, että olet samalla haluat punt tämän ongelman vasemmalla teitä, niin kuin vastauksen suoraan mennä eteenpäin ja vain sysätä. Voi, kuinka monet ihmiset ovat vasemmalla minua? Kuinka monet ihmiset ovat vasemmalle? 1. [Naurua] Okei, joten 0, joten mitä nyt Willy on tehnyt on olet palannut vastauksesi tähän suuntaan sanomalla 0. Nyt, mitä teidän pitäisi tehdä? >> 1. Okei, joten olet 1, niin sanot, "Okei, aion lisätä 1 mihin tahansa Willy n määrä oli "niin 1 + 0. Olet nyt 1 niin vastauksesi oikealla on nyt- 1. >> Ja minun olisi 2. Hyvä, niin otat edellinen vastaus on 1, lisäämällä pieni määrä työtä haluat tehdä, mikä on +1. Sinulla on nyt 2, ja voit sitten ojentaa minulle mikä arvo? 3, tarkoitan, anteeksi, 2. Hyvä. No, meillä oli 0 vasemmalle. Sitten meillä oli 1, ja sitten lisätään 2, ja nyt olet ojentamassa minulle numero 2, ja niin minä sanon, okei, +1, 3. On tosiaan 3 henkilöä vieressäni minua tässä vaiheessa, jotta olisimme voineet tietysti tehdä tämän hyvin lineaarisesti, erittäin paljon ilmeinen muoti, mutta mitä me todella? Otimme ongelma koko 3 aluksi. Sitten purettiin se ongelma koko 2, Sitten ongelma koko 1, ja sitten lopulta perustapauksessa oli todella, oh, siellä ei ole ketään, jolloin Willy palasi tehokkaasti kovakoodatuilla vastaus pari kertaa, ja toinen sitten kuplina ylös, kuplina ylös, kuplina ylös, ja sitten lisäämällä tähän vielä yksi 1 olemme toteuttaneet tätä perusajatusta rekursion. Nyt, tässä tapauksessa se ei todellakaan ratkaise ongelmaa yhtään tehokkaammin silloin olemme nähneet tähän mennessä. Mutta ajattele algoritmit olemme tehneet lavalle toistaiseksi. Meillä oli 8 paperinpaloja tauluun video kun Sean oli etsimässä numero 7, ja mitä hän oikeasti tekee? No, hän ei tee minkäänlaista hajota ja hallitse. Hän ei tee minkäänlaista rekursion. Pikemminkin hän vain teki tämän lineaarinen algoritmi. Mutta kun esittelimme ajatuksen lajiteltu numeroita lavalla elää viime viikolla Sitten meillä oli tämä vaisto menee keskelle, jolloin meillä oli pienempi luettelon koon 4 tai toisen luettelon koon 4, ja sitten meillä oli täsmälleen sama ongelma, joten toistuva, toistetaan, toistetaan. Toisin sanoen, me recursed. Paljon kiitoksia meidän 3 Vapaaehtoiset osoittamiseksi rekursion kanssamme. Katsotaan jos emme voi tehdä tätä nyt vähän konkreettisempaa, ratkaista ongelma, joka jälleen voisimme tehdä melko helposti, mutta käytämme sitä ponnahduslautana täytäntöön tätä perusajatusta. Jos haluan laskea summattu joukko numeroita, Esimerkiksi, jos ohitat määrä 3, Haluan antaa teille arvon sigma 3, niin summa 3 + 2 + 1 + 0. Haluan saada takaisin vastauksen 6, niin me täytäntöön tämän sigma toimintoa, tämä summattu toiminto että, jälleen, vie tulo ja palauttaa sitten summattu tuosta määrästä kaikki alas 0. Voisimme tehdä melko yksinkertaisesti, eikö? Voisimme tehdä tästä jonkinlainen kiehkura rakenteen, joten anna minun mennä eteenpäin ja saada tämä alkoi. Sisällytä stdio.h. Otan itseni tärkein työskennellä täällä. Säästetään tätä sigma.c. Sitten aion mennä tänne, ja aion julistaa int n, ja aion tehdä seuraavat, kun käyttäjä ei tee yhteistyötä. Vaikka käyttäjä ei ole antanut minulle positiivinen luku anna minun mennä eteenpäin ja pyytää heitä n = GetInt, ja haluan antaa heille joitakin ohjeita siitä, mitä tehdä, joten printf ("Positiivinen kokonaisluku please"). Just jotain suhteellisen yksinkertaista, kuten tämä, niin että kun me osuma linja 14 meillä on nyt positiivinen kokonaisluku oletettavasti n.. Nyt asialle jotain. Anna minun mennä eteenpäin ja laske summattu, joten int summa = sigma (n). Sigma on vain summattu, joten olen vain kirjallisesti sitä harrastaja tavalla. Me vain kutsumme sitä sigma siellä. Tuo summa, ja nyt aion tulostaa tuloksen, printf ("summa on% d, \ n", summa). Ja sitten palaan 0 hyvä toimenpide. Olemme tehneet kaiken tämän ohjelma vaatii paitsi mielenkiintoinen osa, joka on todella toteuttaa sigma toimintoa. Päästä minut tänne pohjaan, ja haluan julistaa toiminnon sigma. Se sai ottaa muuttuja on tyyppiä Integer, ja mitä tietotyyppi haluan palata oletettavasti Sigma? Int, koska haluan sen vastaamaan odotuksia linjalla 15. Täällä haluan mennä eteenpäin ja toteuttaa tämän vuonna melko mutkattomasti. Mennään eteenpäin ja sanoa int summa = 0, ja nyt aion mennä on hieman for silmukka täällä että menee sanoa jotain tällaista, for (int i = 0; i <= luku; i + +) summa + = i. Ja sitten aion palata summa. Olisin voinut toteuttaa tämän monin tavoin. Olisin voinut käyttää while-silmukka. Olisin voinut ohittaa käyttämällä summamuuttuja jos halusin, mutta lyhyesti sanottuna meillä vain on tehtävä, että jos en hölmö vakuuttaa summa on 0. Sitten se toistetaan alkaen 0. läpi numero, ja jokaisen iteraation se lisää, että käypä arvo on summa ja palaa sitten summa. Nyt siellä on hieman optimointi täällä. Tämä on luultavasti hukkaan askel, mutta olkoon niin. Se on hieno nyt. Olemme ainakin on perusteellinen ja menee 0 koko matkan ylös. Ei kovin kova ja melko yksinkertainen, mutta se osoittautuu, että sigma toiminnon meillä on samat mahdollisuudet kuten teimme täällä lavalla. Lavalla me vain laskea kuinka monta ihmistä oli vierelläni, vaan jos haluaisimme laskea numero 3 + 2 + 1 siitä alas 0 voisimme samalla ruuhi toiminnon että minä sen sijaan kuvailla olevan rekursiivinen. Täällä Tehdään nopea järki tarkistaa ja varmista En hölmö. Tiedän, että ainakin yksi asia tässä ohjelmassa että tein väärin. Kun Löin kirjoita aion saada minkäänlaista huutaa minua? Mitä minä olla huusi noin? Joo, unohdin prototyyppi, joten olen käyttäen toiminto nimeltään Sigma linjalla 15, mutta se ei ilmoitettu vasta linja 22, joten olen paras ennakoivasti mennä tänne ja julistaa prototyyppi, ja sanon int sigma (int numero), ja se on siinä. Se on toteutettu alareunassa. Tai toinen tapa voisin ratkaista, Voisin siirtää toiminnon siellä, mikä ei ole huono, mutta ainakin kun ohjelmat alkavat saada pitkä, rehellisesti, Minusta siinä on jotain arvoa aina ottaa pääasiassa yläreunassa niin että te lukija voi avata tiedostoa ja sitten heti nähdä mitä ohjelma tekee ilman etsiä sitä etsivät että päätehtävä. Mennään alas minun pääteikkunaa täällä, yritä tehdä sigma tehdä sigma, ja minä mokasin täälläkin. Implisiittiset ilmoitus toiminnan GetInt tarkoittaa olen unohtanut tehdä mitä muuta? [Äänetön-opiskelija] Hyvä, joten ilmeisesti yleinen virhe, joten katsotaanpa laittaa tämän tänne, cs50.h, ja nyt mennään takaisin minun pääteikkuna. Minä tyhjentää näytön, ja minä uusintana tehdä sigma. Se näyttää koottu. Saanen nyt ajaa sigma. Minä kirjoita numero 3, ja sain 6, joten ei tiukkaa tarkastus, mutta ainakin se näyttää toimivan ensi silmäyksellä, mutta nyt mennään repiä sen lisäksi, ja mennään todella hyödyntää ajatusta rekursio, jälleen on hyvin yksinkertainen tilanteessa niin, että muutaman viikon kuluttua kun alamme tutkia harrastaja tietorakenteita kuin ryhmät meillä on toinen työkalu työkalupakin, jonka kanssa käsitellä tietoa rakenteita kuten näemme. Tämä on iteratiivinen lähestymistapa, loop-lähestymistapaa. Saanen sen sijaan nyt tähän. Saanen sen sijaan sanoa, että summattu numero alas 0 ei todellakaan ole sama asia kuin numero + sigma (numero - 1). Toisin sanoen, kuten lavalla I punted kullekin ihmiset viereeni, ja ne puolestaan ​​pidetty punting kunnes vihdoin pohjansa Willy, joka joutui palaamaan kovakoodatuilla vastaukseksi esimerkiksi 0. Täällä nyt olemme samalla punting sigma Sama toiminto kuin oli alun perin nimeltään, mutta avain käsityksen tästä on, että emme ole vaatimassa sigma identtisesti. Emme ohimennen n. Olemme selvästi ohimennen - 1, joten hieman pienempi ongelma, hieman pienempi ongelma. Valitettavasti tämä ei ole aivan vielä ratkaisua, ja ennen kuin korjata mitä voidaan hyppäämällä ulos ilmeinen jossain teistä anna minun mennä eteenpäin ja uusintana tehdä. Vaikuttaa koota kunnossa. Saanen uusintana Sigma 6. Oho, haluan uusinta Sigma 6. Olemme nähneet tämän ennenkin, vaikkakin vahingossa viime kerralla samoin. Miksi saan tämän arvoituksellinen segmentointi vika? Joo. [Äänetön-opiskelija] Ei ole pohja tapauksessa ja erityisesti, mitä todennäköisesti tapahtui? Tämä on oire mitä käyttäytymistä? Sano se hieman kovempaa. [Äänetön-opiskelija] Se on loputon silmukka tehokkaasti, ja ongelma ääretön silmukat kun niihin liittyy rekursiota tässä tapauksessa funktio kutsuu itseään, mitä tapahtuu joka kerta kun soittaa funktio? No, muistelen miten säädettyihin muistin tietokoneen. Sanoimme, että tämä kimpale muistia kutsutaan pino, joka on alareunassa, ja joka kerta kun soittaa funktio hieman muistia saa laittaa tätä ns pino sisältää funktion paikallinen muuttujia tai parametreja, joten jos sigma puhelut sigma puhelut sigma vaatii sigma  kehottaa Sigma Mihin tämä tarina päättyy? No, se lopulta ylitykset yhteensä muistia että sinulla on käytettävissä tietokoneen. Voit ylivuoto segmentin että sinun pitäisi pysyä sisällä, ja saat tämän segmentointi vika, ydin polkumyynnillä, ja mitä ydin polkumyynnillä tarkoittaa, että minulla on nyt tiedosto nimeltä ydin joka on tiedosto, joka sisältää nollia ja ykkösiä että oikeastaan ​​tulevaisuudessa diagnostisesti hyödyllisiä. Jos se ei ole selvää, missä teidän kuoriainen voit itse tehdä vähän rikosteknisen analyysin, niin sanotusti, tämän core dump tiedoston, joka taas on vain koko joukko nollia ja ykkösiä että pohjimmiltaan edustaa valtion oman ohjelman muistiin hetkellä kaatui tällä tavalla. Fix tässä on, että emme voi vain sokeasti palata sigma, numero + sigma on hieman pienempi ongelma. Meidän on jonkinlainen pohja tässä tapauksessa, ja mitä pitäisi perustapaus lienee? [Äänetön-opiskelija] Okei, niin kauan kuin numero on positiivinen meidän pitäisi oikeastaan ​​palauttaa tämän, tai toisin sanoin, jos numero on, eli <= 0 Tiedätkö mitä, minä menen eteenpäin ja palaa 0, aivan kuten Willy teki, ja muuten, aion mennä eteenpäin ja palauta, joten se ei ole niin paljon lyhyempi kuin iteratiivinen versio me lyöty jopa ensin käyttämällä varten silmukka, mutta huomaa, että siellä on tällainen eleganssia sitä. Sen sijaan palauttaa joidenkin määrän ja suorittaa kaikki tämä matematiikka ja lisäämällä asioita paikallisia muuttujia sinä sen sijaan sanomalla "Okei, jos tämä on erittäin helppo ongelma, kuten numero on <0, haluan heti palata 0 ". Emme vaivautuisi tukemiseen negatiivisia lukuja, joten aion kova koodi arvo 0. Mutta muuten toteuttaa tämän ajatuksen yhteenlaskua kaikki nämä numerot yhteen voit tehokkaasti ottaa pikkupurtavaa pois ongelman, aivan kuten me teimme täällä lavalla, Sitten punt loput ongelman seuraava henkilö, mutta tässä tapauksessa seuraava henkilö itse. Se samannimistä toimintoa. Vain siirtää sitä pienempiä ja pienempiä ongelma joka kerta, ja vaikka meillä ei aivan virallisesti asioita koodi tähän tämä on juuri sitä, mitä oli tekeillä viikolla 0 ja puhelinluettelosta. Tämä on juuri sitä, mitä oli tekeillä viimeisen viikon Sean ja meidän mielenosoituksia etsiä numeroita. Se vie ongelman ja jakamalla se uudestaan ​​ja uudestaan. Toisin sanoen, on olemassa tapa nyt kääntää Tämän reaalimaailman rakenteen, tämän korkeamman rakenteen hajota ja hallitse ja tehdä jotain uudestaan ​​ja uudestaan koodin, joten tämä on jotain näemme jälleen ajan. Nyt, sivuun, jos olet uusi rekursio sinun pitäisi ainakin ymmärtää nyt miksi tämä on hauska. Aion mennä google.com, ja aion etsiä vinkkejä ja niksejä rekursio, kirjoita. Kerro henkilö vieressäsi jos niitä ei nauraa juuri nyt. Tarkoititko rekursio? Did you mean-ah, siellä mennään. Okei, nyt on loput kaikille. Pieni pääsiäismuna upotettu jossain siellä Google. Sivuhuomautuksena, yksi linkeistä laitamme kurssin verkkosivuilla tänään on juuri tämä ruudukon eri lajittelualgoritmeja, joista me katsoimme viime viikolla, mutta mitä mukavaa tästä visualisointi kuin yrität wrap mieltäsi noin erilaisia ​​asioita, jotka liittyvät algoritmit tietää, että voit helposti nyt aloittaa erilaisilla tuloa. Tulot kaikki käänteinen, tulot enimmäkseen lajiteltu, tulot satunnainen ja niin edelleen. Kun yrittää jälleen erottaa nämä asiat mielessäsi ymmärtävät, että tämä URL kurssin verkkosivuilla Luennot sivulla saattaa auttaa syystä läpi joitakin niistä. Tänään vihdoin ratkaista tämän ongelman taas takaisin, mikä oli tämän swap toiminto ei vain toiminut, ja mikä oli perustavanlaatuinen ongelma tämän toiminnon swap, jonka tavoitteena oli jälleen vaihtaa arvon täällä ja täällä siten, että tämä tapahtuu? Tämä ei oikeastaan ​​toimi. Miksi? Joo. [Äänetön-opiskelija] Aivan, selitystä tälle bugginess yksinkertaisesti ollut, koska kun soitat toiminnot C ja nämä funktiot argumentteja, kuten ja b täällä, olet ohimennen kopioita arvosta riippumatta olet tarjoamalla tälle tehtävälle. Et ole tarjota alkuperäiset arvot itse, joten näimme tämän yhteydessä buggyc, buggy3.c, joka näytti vähän jotain tällaista. Muistaa, että meillä oli x-ja y-alustetaan 1 ja 2, vastaavasti. Sitten tulostaa mitä ne olivat. Sitten väitti että olin vaihtamalla niitä soittamalla swap x, y. Mutta ongelma oli, että vaihtava toimi, mutta vain soveltamisalaan Swap-toiminto itse. Heti kun osuimme line 40 ne vaihtoivat arvot heitettiin pois, ja niin mikään Alkuperäisen funktion tärkeimmät todella muuttunut lainkaan, joten jos ajattelet tuolloin, mitä tämä näyttää kannalta meidän muisti jos tämä vasemmalla puolella Hallitus edustaa- ja minä teen parhaani kaikkien nähdä tämä, jos tämä vasemmalla puolella hallituksen edustaa, eli muistin, ja pino tulee kasvamaan edelleen aina tällä tavalla, ja me kutsumme toiminto, kuten pää-, ja pääasialliset on 2 paikallisia muuttujia, x ja y, mennään kuvaamaan niitä kuin x täällä, ja mennään kuvaamaan näitä kuin y täällä, ja mennään laittaa arvot 1 ja 2, joten tämä tässä on tärkein, ja kun tärkeimmät kutsuu swap toiminto käyttöjärjestelmä antaa swap toiminnon oman väylä muistia pinon, oman runko pinoon, niin sanotusti. Se myös allokoi 32 bittiä näistä ints. Se tapahtuu soittaa heille ja b, mutta se on täysin mielivaltainen. Se olisi voinut kutsua heitä mitä haluaa, mutta mitä tapahtuu, kun pääasiallinen kehottaa swap se vie tämän 1, laittaa kopio siellä laittaa kopio sinne. On 1 muu paikallinen muuttuja swap kuitenkin nimeltään mitä? >> Tmp. Tmp, joten annan itselleni toisen 32 bittiä täällä, ja mitä minä tein tämän toiminnon? Sanoin int tmp saa, joten on 1, joten tein tämän, kun olemme viimeksi toistettu tämän esimerkin. Sitten saa b, niin b on 2, joten nyt tämä tulee 2, ja nyt b saa lämpötila, joten lämpötila on 1, joten nyt B tulee tämän. Se on hienoa. Se toimi. Mutta sitten heti kun funktio palauttaa Vaihdetaan muistiin tehokkaasti katoaa, niin että sitä voidaan käyttää uudelleen jokin muu toiminto tulevaisuudessa, ja tärkein on tietenkin täysin ennallaan. Tarvitsemme tapa pohjimmiltaan ratkaista tämän ongelman, ja tänään me viimein tapa tehdä tämä, jossa voimme esitellä jotain kutsutaan osoittimen. On käynyt ilmi, että voimme ratkaista tämän ongelman ei ohimennen kopioita x ja y vaan läpäisemällä mitä, luuletko, että swap-toiminto? Joo, entä osoitteen? Emme ole puhuneet osoitteita paljon yksityiskohtia, mutta jos tämä liitutaulu edustaa tietokoneeni muistiin Voisimme varmasti aloittaa numerointi tavua minun RAM ja sanoa, tavu # 1, tämä on tavu # 2, tavu # 3, tavu # 4, tavu # ... 2000000000 jos minulla on 2 gigatavua RAM- jotta voisimme varmasti keksiä jokin mielivaltainen numerointi Kaikkien yksittäisten tavujen tietokoneen muistiin. Mitä jos sen sijaan kun soitan swap eikä kulkea kopiot x ja y miksi en vaan kulkea osoitteen x täällä, osoite y täällä, lähinnä postiosoite x ja y koska silloin vaihtaa, jos hän ilmoitti osoitteen muistiin x: n ja y, sitten vaihtaa, jos koulutettu häntä hieman, hän voisi mahdollisesti ajaa kyseiseen osoitteeseen, niin sanotusti, x, ja vaihda numero siellä sitten ajaa osoitteeseen y, Muuta numero siellä, vaikka ei oikeastaan ​​saada jäljennökset näistä arvoista itsensä, joten vaikka puhuimme tästä olevan tärkein muistia ja tämä on swap muistin voimakas ja vaarallinen osa C on se, että mikä tahansa toiminto voi koskettaa muistia missä tahansa tietokoneessa, ja tämä on voimakas, että voit tehdä hyvin fancy asioita tietokoneohjelmien C. Tämä on vaarallista, koska voit myös tyriä helposti. Itse asiassa yksi yleisimmistä tavoista ohjelmia nykyään voidaan hyödyntää vielä on ohjelmoija ei ymmärrä että hän sallii data kirjoitetaan paikkaan muistissa, joka ei ollut tarkoitettu. Esimerkiksi, hän ilmoittaa joukko koko 10 mutta sitten vahingossa yrittää sijoittaa 11 tavua, että joukko muistia, ja aloitat koskettaa osia muistin jotka eivät ole enää voimassa. Vain asiayhteyteen tähän, jotkut teistä ehkä tietävät, että ohjelmiston usein kysyy sarjanumeroita tai rekisteröinti avaimet, Photoshop ja Word ja ohjelmat, kuten tämä. On olemassa halkeamia, kuten jotkut teistä tietävät, verkossa, jossa voit ajaa pieni ohjelma, ja voila, enää pyyntöä sarjanumero. Miten se toimii? Monissa tapauksissa nämä asiat ovat yksinkertaisesti toteamus tietokoneet Tekstin segmentit tietokoneen todellinen nollia ja ykkösiä missä on se toiminto, jossa sarjanumero pyydetään, ja te korvata tähän tilaan, tai kun ohjelma on käynnissä voit selvittää missä avain on tosiasiallisesti varastoitu käyttämällä jotain kutsutaan debuggeri, ja voit crack-ohjelmiston tavoin. Tämä ei tarkoita sitä, että tämä on meidän tavoite lähipäivinä, mutta se on hyvin reaalimaailman seurauksia. Tämä sattuu ottamaan varkaus ohjelmisto, mutta siellä on myös kompromissi koko koneita. Itse asiassa, kun sivustot näinä päivinä hyödynnetään ja heikentynyt ja tietojen on vuotanut ja salasanoja on varastettu Tämän hyvin usein liittyy huono hallinta oman muistin tai, jos kyseessä on tietokantoja, ettei ennakoida kontradiktorista tulo, niin lisää, että tulevina viikkoina, mutta nyt vain esimakua sellainen vahinko, että voit tehdä se ei aivan ymmärtää miten asiat toimivat alla huppu. Mennään siitä ymmärtää, miksi tämä on rikki työkalulla, joka tulee enemmän ja enemmän hyötyä koska ohjelmamme saavat monimutkaisempi. Toistaiseksi kun olet ollut bugi ohjelma miten olet mennyt noin debuggaamista? Mitkä ovat sinun tekniikoita olleet tähän mennessä, joko opettanut teidän TF tai vain itseoppinut? [Student] printf. Printf, joten printf on luultavasti ollut ystäväsi, että jos haluat nähdä mitä tapahtuu sisällä ohjelman vain laittaa printf tänne, printf täällä, printf täällä. Sitten voit käyttää sitä, ja saat koko joukko tavaraa ruudulla että voit sitten päätellä, mitä todella vialla ohjelman. Printf taipumus olla hyvin voimakas asia, mutta se on hyvin manuaalinen prosessi. Sinun täytyy laittaa printf täällä, printf täällä, ja jos laitat sen sisällä silmukan saatat saada 100 riviä tuotannon että sinulla on sitten käydä läpi. Se ei ole kovin käyttäjäystävällinen tai vuorovaikutteinen mekanismi Ohjelmointivirheiden, mutta onneksi on olemassa vaihtoehtoja. Siellä on ohjelma, esimerkiksi, nimeltään GDB, GNU Debugger, joka on hieman mystistä, miten käytät sitä. Se on vähän monimutkaista, mutta suoraan sanottuna, Tämä on yksi niistä asioista, joissa jos laitat tällä ja ensi viikolla ylimääräinen tunti ymmärtää jotain GDB se säästää luultavasti kymmeniä tunteja pitkällä aikavälillä, Niin, että, minä annan sinulle teaser, miten tämä asia toimii. Olen minun pääteikkunassa. Anna minun mennä eteenpäin ja kääntää tämän ohjelman buggy3. Se on jo ajan tasalla. Saanen käyttää sitä aivan kuten teimme taas takaisin, ja todellakin, se on rikki. Mutta miksi tämä on? Ehkä mokasin swap-toiminto. Ehkä se on ja b. En ole aivan siirtämällä niitä oikein. Anna minun mennä eteenpäin ja tehdä tätä. Sen sijaan vain ajaa buggy3 anna minun sijasta suorittaa tämän ohjelman GDB, ja aion kertoa sen toimimaan buggy3, ja aion sisällyttää komentorivin argumentti,-TUI- ja laitamme tätä tulevaisuudessa ongelmat spec muistuttaa. Ja nyt tämä mustavalkoinen käyttöliittymä piipahti jopa, että jälleen kerran, on hieman ylivoimainen aluksi, koska siellä on kaikkea tätä takuutietoja tänne, mutta ainakin siellä on jotain tuttua. Vuonna ikkunan yläosassa on minun todellista koodia ja jos minä siirry tänne haluan siirtyä hyvin alkuun minun tiedoston, ja todellakin, siellä buggy3.c, ja ilmoitus alareunassa tämän ikkunan Minulla on tämä GDB nopeasti. Tämä ei ole sama kuin minun normaali John Harvardin nopeasti. Tämä on nopea että menee saanen ohjata GDB. GDB on debuggeri. Debuggeri on ohjelma, jonka avulla voit kävellä läpi toteuttaminen ohjelmasi rivi rivi riviltä, matkan varrella tehdä mitä haluat ohjelman jopa soittaa toimintoja tai etsivät vielä tärkeämpää, eri muuttujan arvoja. Mennään eteenpäin ja tehdä tämän. Aion mennä eteenpäin ja kirjoita run GDB: n kehotteeseen niin huomaa alareunassa näytön vasemmassa olen kirjoittanut juosta, ja olen Enter, ja mitä se tekee? Se kirjaimellisesti juoksi minun ohjelma, mutta en oikeastaan ​​näe paljon mennä tänne koska en ole oikeastaan ​​kertonut debuggeri keskeyttää tietyllä hetkellä. Kirjoittamalla run käynnistää ohjelman. En oikeastaan ​​näe mitään. En voi manipuloida sitä. Sen sijaan haluan tehdä tämän. Tällä GDB kehotteeseen haluan vaan kirjoittaa tauko, kirjoita. Se ei ole mitä aioin kirjoittaa. Mennään vaan kirjoita tauko tärkein. Toisin sanoen, en halua asettaa jotain kutsutaan keskeytyskohdan, joka on osuvasti nimetty, koska se rikkoo tai keskeyttää toteuttaminen ohjelman tuohon tiettyyn paikkaan. Tärkein on nimi minun tehtävä. Huomaa, että GDB on aika fiksu. Se tajunnut että tärkeimmät sattuu aloittaa noin rivillä 18 sekä buggy3.c, ja sitten huomaa täällä ylhäällä vasemmalla b + on aivan linjan 18. Se on muistuttaa minua siitä, että olen asettanut keskeytyskohdan linjan 18. Tällä kertaa kun kirjoitan aikavälillä, aion ajaa minun ohjelma kunnes se osuu että murtuessa, niin ohjelma pysähtyy minulle rivillä 18. Täällä mennään, juosta. Mikään ei näytä tapahtuneen, mutta ilmoituksen alareunassa jäljellä alkaen ohjelma, buggy3, keskeytyskohta 1 Tärkeimpien klo buggy3.c linjan 18. Mitä voin tehdä nyt? Ilmoitus voin alkaa kirjoittaa asioita, kuten tulostus, ei printf, print x, ja nyt se on outoa. $ 1 on vain uteliaisuus, kuten näemme joka kerta, kun painan jotain saat uuden $ arvo. Se on niin, että voit palata edelliseen arvoja vain siinä tapauksessa, mutta nyt mitä tulosta kertoo minulle, että arvo x tässä vaiheessa tarina on ilmeisesti 134514032. Mitä? Mistä tuo edes tulevat? [Äänetön-opiskelija] Itse asiassa tämä on mitä me kutsumme roskat arvo, ja olemme ole puhunut tästä vielä, mutta syy, että olet alustaa muuttujat On ilmeisesti niin, että heillä on jonkinlaista arvoa, että haluat heidän olla. Mutta saalis on muistaa, että voit julistaa muuttujia kuten tein hetki sitten minun sigma esimerkissä ilman todella heille arvoa. Recall mitä tein täällä Sigma. Olen ilmoittanut n, mutta mikä arvo annoin sen? Ei ole, koska tiesin, että muutaman seuraavan linjat GetInt hoitaisi ongelman laittamalla arvon sisällä n.. Mutta tässä vaiheessa tarina linjan 11 ja linja 12 ja linja 13 sekä linja 14 kauttaaltaan näiden useita rivejä, mikä on n: n arvo? C et vain tiedä. Se on yleensä joitakin roskat arvo, jotkut täysin satunnaisluku on jäljellä yli lähinnä joidenkin aiempien toiminto jotka on ajaa, niin ohjelma toimii Muistutan, että funktio saa funktio, toiminto, funktio. Kaikki nämä kehykset saada laittaa muistiin, ja sitten ne toiminnot paluuta, ja aivan kuten ehdotin kanssa pyyhekumia niiden muisti on lopulta uudelleen. No, se vain on niin, että tämä muuttuja x tähän ohjelmaan näyttää sisälsi joitakin roskaa arvo kuin 134514032 Joidenkin edelliseen toimintoon, ei yksi, että olen kirjoittanut. Se voisi olla jotain, joka tulee tehokkaasti käyttöjärjestelmä, jokin funktio alla huppu. Okei, se on hienoa, mutta katsotaanpa nyt edetä seuraavalle riville. Jos kirjoitan "seuraava" minun GDB nopeaa ja osuin enter huomaa, että korostus siirtyy alas linja 19, mutta looginen seuraus on, että linja 18 on nyt päättynyt täytäntöönpanovaltiossa, joten jos en kerran kirjoitat "print x" Minun pitäisi nyt nähdä 1, ja todellakin, en. Jälleen $ tavaraa on tapa GDB muistuttaa sinua mitä historia tulosteita ovat, että olet tehnyt. Nyt haluan mennä eteenpäin ja tulostaa y ja todellakin, y on joitakin hulluja arvo samoin, mutta no big deal, koska budjettikohtaan 19 aiomme antaa sen arvo 2, joten haluan kirjoittaa "Seuraava" uudelleen. Ja nyt me olemme printf rivillä. Anna minun tehdä tulosta x. Anna minun tehdä tulosta y. Rehellisesti, Saan hieman kyllästynyt tulostaa tästä. Saanen sen sijaan kirjoittaa "näyttö x" ja "näyttö Y" ja nyt joka kerta kun kirjoitat komennon tulevaisuudessa Aion muistutetaan mitä x ja y, mitä x ja y, mitä x ja y. Voin myös sivuhuomautuksena, kirjoita "info paikallisia." Info on erityinen komento. Paikalliset tarkoittaa se näyttää minulle paikallisia muuttujia. Vain jos unohdan tai tämä on hullu, monimutkainen toiminto että minä tai joku muu kirjoitti info paikalliset kertovat mitkä ovat kaikki paikalliset muuttujat sisälle paikalliseen toiminto että saatat välität jos haluat penkoa. Nyt printf on aikeissa toteuttaa, joten anna minun mennä eteenpäin ja kirjoita "Seuraava". Koska olemme tässä ympäristössä emme oikeastaan ​​näe sitä suorittaa täällä, mutta huomaa se alkaa hieman sekavaa täällä. Mutta huomaa se ohittaa ruudun siellä, joten se ei ole täydellinen ohjelma täällä, mutta se on okei, koska en voi aina penkoa tulostusmateriaalien jos haluan. Saanen kirjoittaa ensi kerran, ja nyt täällä on mielenkiintoinen osa. Tässä vaiheessa tarina y on 2, ja x on 1, ehdottivat täällä, ja taas, Syy tähän on automaattisesti näyttää nyt, koska käytin komento näyttö x ja näytön y, joten tällä hetkellä en kirjoita seuraava teoriassa x ja y tulisi vaihtaa. Nyt tiedämme jo, että ei aio olla, mutta näemme hetken miten voimme sukeltaa syvemmälle selvittää, miksi se on totta. Seuraavaksi, ja valitettavasti, y on edelleen 2 ja x on edelleen 1, ja voin vahvistaa niin paljon. Tulosta x, tulostaa y. Itse asiassa ei vaihtamalla on todella tapahtunut, joten aloitetaan tämän yli. Selvästi swap on rikki. Mennään vaan kirjoita "run" uudelleen. Sanon kyllä, haluan käynnistää sen alusta, kirjoita. Nyt olen takaisin ylös rivillä 18. Nyt huomaa x ja y ovat roskaa arvot uudelleen. Seuraavaksi, seuraavaksi, seuraavaksi, seuraavaksi. Jos minä kyllästy voin myös kirjoittaa n. ensi. Voit lyhentää sen lyhin mahdollinen merkkijono. Swap on nyt rikki. Mennään sukellus, joten kirjoittamisen sijaan ensi- nyt aion kirjoittaa askel niin että olen tehostaminen sisällä tätä toimintoa niin että voin kävellä sen läpi, joten osuin askeleen ja kirjoita. Huomaa, että esiin hyppää alas alempi minun ohjelma linjaa 36. Nyt mitä paikallisia muuttujia? Info paikalliset. Mikään aivan vielä, koska olemme ei mennyt että linja, joten mennään eteenpäin ja sanoa "seuraava". Nyt näyttää olevan tmp, tulostaa tmp. Garbage arvo, eikö? Luulen niin. Miten tulostaa, tulostaa b, 1 ja 2? Hetken kun kirjoitan ensi kerran tmp vie on arvo 1, toivottavasti koska tmp aiotaan saama arvo. Nyt ei tulostu, tulosta b, mutta nyt tulostaa tmp, ja se on todellakin 1. Anna minun tehdä seuraavaksi. Anna minun tehdä seuraavaksi. Olen valmis swap-toiminto. Olen silti sisällä sen linjan 40, joten haluan tulostaa, Print b, enkä välitä mitä tmp on. Se näyttää swap on oikea, kun se tulee vaihtava ja b. Mutta jos minä nyt kirjoittaa seuraavaksi, hyppään takaisin linja 25, ja tietysti, jos en kirjoita x ja tulostaa y he silti ennallaan, joten emme ole korjannut ongelman. Mutta diagnostisesti nyt ehkä tähän GDB ohjelmaan olemme ainakin saaneet askeleen lähempänä ymmärrystä Mikä vialla ilman pentueen meidän koodia laittamalla printf täällä, printf täällä, printf täällä ja sitten käynnissä sen uudestaan ​​ja uudestaan yrittää selvittää, mitä tapahtuu pieleen. Aion mennä eteenpäin ja lopettaa pois tästä kokonaan pois sulkea. Se tulee sitten sanoa, "Lopeta kummiskin?" Kyllä. Nyt olen takaisin minun normaali nopeaa, ja olen tehnyt käyttäen GDB. Sivuhuomautuksena, sinun ei tarvitse käyttää tätä-TUI lippua. Itse asiassa, jos jätät sen saat lähinnä alaosassa näytön. Jos minä kirjoita taukoa tärkein ja suorita sitten Voin silti ajaa minun ohjelma, mutta mitä se tekee on enemmän sanallisesti vain näytä olevan rivin kerrallaan. -TUI, tekstuaalisen käyttöliittymä, vain näyttää enemmän ohjelman kerralla, mikä on todennäköisesti hieman käsitteellisesti helpompaa. Mutta todellakin, voin vain tehdä seuraavaksi, seuraavaksi, seuraavaksi, ja aion nähdä yksi rivi kerrallaan, ja jos haluan todella nähdä mitä tapahtuu Voin kirjoittaa listan ja nähdä koko joukko naapurimaiden linjat. On video, että olemme pyytäneet, että te katsella ongelma asettaa 3 jossa Nate kattaa joitakin koukerot GDB, ja tämä on yksi niistä asioista, rehellisesti, jos joitakin ei-triviaaleja osuus sinua koskaan kosketa GDB, ja se tulee olemaan huono asia koska kirjaimellisesti voit päätyä menoja enemmän aikaa myöhemmin tänä lukukautena jahtaavat alas bugeja niin voisitte jos laitat että puoli tuntia / tunti tällä ja ensi viikolla oppimisen totutella GDB. Printf oli ystäväsi. GDB pitäisi nyt olla ystäväsi. Kysyttävää GDB? Ja tässä on nopea lista joistakin tehokkain ja hyödyllisiä komentoja. Joo. >> Voitko tulostaa merkkijonon? Voitko tulostaa merkkijonon? Ehdottomasti. Se ei tarvitse vain olla kokonaislukuja. Jos muuttuja s on merkkijono kirjoita vain tulostaa s. Se näyttää, mitä se merkkijono muuttuja on. [Äänetön-opiskelija] Se antaa sinulle osoitteen ja merkkijono itse. Se näyttää teille molemmille. Ja viimeinen asia, vain koska ne ovat hyvä tietää liikaa. Backtrace ja runko, haluan sukeltaa tämän viimeisen kerran, täsmälleen sama ohjelma GDB. Anna minun mennä eteenpäin ja ajaa tekstuaalinen käyttöliittymän versio, rikkoa tärkein. Anna minun mennä eteenpäin ja ajaa uudestaan. Tässä olen. Nyt haluaisin mennä seuraavaksi, seuraavaksi, seuraavaksi, seuraavaksi, seuraavaksi, askel, kirjoita. Ja nyt kai olen nyt swap tarkoituksella, mutta minä olen kuin "Hitto, mikä oli arvo x?" En voi tehdä x enää. En voi tehdä y koska he eivät laajuudeltaan. He eivät yhteydessä, mutta ei ole ongelma. Voin kirjoittaa backtrace. Se näyttää minulle kaikki toiminnot, jotka ovat toteuttaneet jopa tässä vaiheessa. Huomaa, että yksi pohjassa, pääasiassa linjojen kanssa tärkeimpien ollessa pohjassa meidän kuva täällä. Se, että swap on sen yläpuolella linjojen kanssa swap on sen yläpuolella muistiin tänne, ja jos haluan päästä takaisin päävalikkoon tilapäisesti voin sanoa "runko". Mikä numero? Tärkein on kehyksen # 1. Aion mennä eteenpäin ja sanoa "runko 1." Nyt olen takaisin tärkein, ja voin tulostaa x, ja voin tulostaa y, mutta en voi tulostaa tai b. Mutta voin jos sanon, "Okei, odota hetki. Missä oli swap?" Anna minun mennä eteenpäin ja sanoa "frame 0". Nyt olen takaisin minne haluan olla, ja sivuun, olemassa muita komentoja minäkin jos olet todella saada kyllästynyt kirjoittamalla seuraava, seuraava, seuraava, seuraava, voit yleensä sanoa asioita, kuten "seuraava 10" ja joka selata seuraavan 10 riviä. Voit myös kirjoittaa "jatka", kun todella kyllästyä tehostamalla sen läpi. Jatka ajaa ohjelman keskeytyksettä, kunnes se osuu toiseen murtuessa, onko silmukka tai laske alas teidän ohjelmassa. Tässä tapauksessa jatkoimme loppuun, ja ohjelma poistui normaalisti. Tämä on hieno tapa, huonompi prosessi. Vain ohjelman lähtenyt normaalisti. Lisää, että video ja virheenkorjaus istunnoissa tulla. Se oli paljon. Otetaan meidän 5 minuutin tauko täällä, ja me palata tietueet ja tiedostot. Jos olet sukeltanut tämän viikon PSET jo tiedät että käytämme jakelu koodin, lähdekoodi, että voimme tarjota sinulle lähtökohta, joitakin uusia tekniikoita. Erityisesti toimme uuden avainsanan nimeltään struct, rakenteelle, jotta voimme luoda mukautettuja muuttujia tapaisena. Olemme myös käyttöön käsite tiedoston I / O, tiedosto tulo ja lähtö, ja tämä on niin, että voimme pelastaa tilan oman Scramble aluksella tiedoston levylle niin että opetus kaverit ja voin ymmärtää mitä tapahtuu sisällä ohjelman ilman käsin pelata kymmeniä pelejä Scramble. Voimme tehdä tämän enemmän automatedly. Tämä ajatus struct ratkaisee melko vakuuttava ongelma. Oletetaan, että haluamme toteuttaa joitakin ohjelmaan että jotenkin pitää kirjaa tietoa opiskelijoiden, ja opiskelijoiden voi olla, esimerkiksi, ID, nimi ja talo paikassa kuten Harvard, joten nämä ovat 3 paloja tiedot haluamme pitää sen, niin haluan mennä eteenpäin ja alkaa kirjoittaa pieni ohjelma täällä, kuuluu stdio.h. Anna minun tehdä sisältyy cs50.h. Ja sitten alkaa minun tärkein tehtävä. En viitsi mitään komentoriviargumentteja, ja tässä haluan olla opiskelija, joten aion sanoa Opiskelijan on nimi, joten aion sanoa "merkkijonon nimi." Sitten aion sanoa Opiskelijalla on tunnus, joten int id, ja opiskelija on talossa, joten olen myös menossa sanoa "merkkijono talo." Sitten minä tilata hieman puhtaammin kuin tämä. Okei, nyt minulla on 3 muuttujien joka edustaa opiskelija, joten "opiskelija". Ja nyt haluan asuttamaan näitä arvoja, joten anna minun mennä eteenpäin ja sanoa jotain "Id = 123". Nimi on menossa David. Sanotaan talo menossa Mather, ja sitten aion tehdä jotain mielivaltaisesti kuten printf ("% s, jonka tunnus on% d, asuu% s. Ja nyt, mitä haluan kytkeä täällä, yksi toisensa jälkeen? Nimi, id, house, return 0. Okei, ellei Mokasin jossain täällä Mielestäni meillä on aika hyvä ohjelma, joka tallentaa yksi opiskelija. Tietenkin, tämä ei ole kovin kiinnostava. Mitä jos haluan olla 2 opiskelijaa? Se ei ole iso juttu. Voin tukea 2 henkilöä. Anna minun mennä eteenpäin ja korostaa tätä ja mennä tänne, ja voin sanoa "id = 456" kaltaiselleni Rob asuva Kirkland. Okei, odota, mutta en voi kutsua näitä sama asia, ja se näyttää aion pitää kopioida tämän, niin haluaisin sanoa, että nämä ovat Daavidin muuttujia, ja haluaisin saada kopioita näistä Rob. Me kutsumme näitä Rob, mutta tämä ei tule toimimaan nyt koska olen-odottaa, katsotaanpa muuttaa minua ID1, NAME1 ja house1. Rob on 2, 2. Minun täytyy muuttaa tänne, täällä, täällä, täällä, täällä, täällä. Odota, entä Tommy? Tehdään tämä uudestaan. Ilmeisesti jos olet edelleen sitä mieltä tämä on hyvä tapa tehdä tämä, se ei ole, niin kopioi / liitä huono. Mutta me ratkaisi viikko sitten. Mikä oli meidän ratkaisu, kun halusimme olla useita esiintymiä samaa tietotyyppiä? [Opiskelijat] array. Array, joten haluaisin yrittää puhdistaa tämän. Haluan tehdä jonkin verran itse yläreunassa, ja haluan sen sijaan tehdä tätä täällä. Me kutsumme näitä ihmisiä, vaan aion sanoa "int tunnukset" ja aion tukea 3 meistä nyt. Aion sanoa "merkkijonoa" ja minä tukea 3 meistä, ja sitten aion sanoa "string taloja" ja aion tukea 3 meistä. Nyt täällä Daavidin sijaan saada oman paikallisia muuttujia voimme päästä eroon näistä. Se tuntuu hyvältä, että olemme puhdistamista tähän asti. Voin sanoa sitten David tulee olemaan [0] ja nimet [0] ja talot [0]. Ja sitten Rob voimme samalla pelastaa tämän. Laitetaan tähän täällä, joten hän tulee mielivaltaisesti ids [1]. Hän tulee olemaan nimet [1], ja sitten lopuksi, talot [1]. Vielä vähän tylsiä, ja nyt minun täytyy miettiä tätä, niin sanotaan "nimet [0], id [0], talot [0] ja katsotaanpa pluralize tätä. Ids, ids, ids. Ja vielä, minä teen sen, niin taas, olen jo turvautua kopioi / liitä uudelleen, joten kertoimet ovat olemassa toinen ratkaisu täällä. Voin ehkä puhdistaa tähän asti pidemmälle silmukka tai jotain, niin lyhyt, se on vähän parempi, mutta silti tuntuu Olen turvautuminen kopioi / liitä, mutta tämäkin, väitän, ei oikeastaan ​​pohjimmiltaan oikea ratkaisu, koska Mitä jos joskus päätämme tiedätkö mitä? Meidän olisi todellakin pitänyt varastointia sähköpostiosoitteet David ja Rob ja kaikki muut tässä ohjelmassa. Meidän pitäisi myös tallentaa puhelinnumeroita. Meidän pitäisi myös tallentaa hätätilanteessa numerot. Meillä on kaikki nämä palaset tietojen haluamme tallentaa, joten miten edetä tee sitä? Voit ilmoittaa toisen array yläreunassa, ja sitten manuaalisesti lisätä sähköpostiosoite [0], sähköpostiosoite [1] David ja Rob ja niin edelleen. Mutta on oikeastaan ​​vain oletus taustalla tämä malli että olen käyttäen kunnia järjestelmä tietää, että [I] kussakin useita matriiseja sattuu viittaamaan samalle henkilölle, joten [0] IDS on numero 123, ja aion olettaa, että nimet [0] on sama henkilön nimi ja talot [0] on sama henkilö taloon ja niin edelleen kaikille eri matriisit luon. Mutta huomaa, että ei ole perustavanlaatuisia yhteys joukossa 3 kpl tiedon, id, nimi ja talon, vaikka yhteisö yritämme mallia tässä ohjelmassa ei ole taulukoita. Paneelit ovat vain tällä ohjelmallinen tapa tehdä tämä. Mitä todella haluamme mallintaa meidän ohjelma on henkilö kuten David, henkilö kuten Rob jonka sisällä tai kapselointi on nimi ja tunnus sekä talon. Voimmeko jotenkin ilmaista tätä ajatusta kapselointi jolloin henkilö on tunnus, nimi ja talon eikä turvautua todella tätä hakata jonka me juuri luottaa kiinnike jotain viittaa samaan ihmisen yksikön kussakin näiden eri matriiseja? Voimme todella tehdä tämän. Anna minun mennä yli tärkein nyt, ja haluan luoda oman tietotyypin varten todella ensimmäistä kertaa. Käytimme tätä tekniikkaa Scramble, mutta täällä aion mennä eteenpäin ja luoda tietotyyppi, ja tiedätkö mitä, aion kutsua sitä opiskelija tai henkilö, ja aion käyttää typedef varten määritellä tyyppiä. Aion sanoa, että tämä on rakenne, ja sitten tämä rakenne tulee olla tyyppiä opiskelija, me sanoa, vaikka se hieman päivätty nyt minulle. Me sanomme "int id." Me sanomme "merkkijonon nimi." Sitten me sanomme "string talo" joten nyt loppuun mennessä näiden muutaman rivin koodia Olen juuri opettanut clang että on olemassa tietotyyppi lisäksi ints lisäksi jouset, paitsi tuplaa lisäksi kellukkeet. Koska tätä hetkeä rivillä 11, on nyt uusi tietotyyppi nimeltään opiskelijoita, ja nyt voin julistaa opiskelija muuttuja mihin haluan, joten haluan selaa tänne ihmisiä. Nyt voin päästä eroon tästä, ja voin mennä takaisin alas David täällä ja David voin todella sanoa, että David, voimme kirjaimellisesti nimetä muuttuja itsestäni, tulee olla tyyppiä opiskelija. Tämä saattaa näyttää hieman oudolta, mutta tämä ei ole kaikki, että eri ilmoittamasta niinkin int tai merkkijono tai float. Sattui vain niin kutsua opiskelija nyt, ja jos haluan laittaa jotain sisällä tämän rakenteen Olen nyt käyttää uutta pala syntaksin, mutta se on melko yksinkertainen, david.id = 123, david.name = "David" pääoman D, ja david.house = "Mather," ja nyt voin päästä eroon tästä kamaa täällä. Ilmoituksessa olemme nyt uudistaneet ohjelma todella paljon parempi tapa että nyt meidän ohjelma heijastaa reaalimaailman. Siellä reaalimaailman käsitteestä henkilö tai opiskelija. Täällä meillä on nyt C-version henkilön tai tarkemmin opiskelija. Inside tämän henkilön nämä asiaankuuluvat ominaisuudet, Tunnus, nimi ja talon, joten Rob olennaisesti muuttuu samaa täällä, niin opiskelija rob, ja nyt rob.id = 456, rob.name = "Rob." Se, että muuttuja on nimeltään Rob on tavallaan merkityksetön. Olisimme voineet kutsuneet sitä x tai y tai z. Me vain nimesi sen Rob on semanttisesti johdonmukaisia, mutta oikeastaan ​​nimi on sisällä että alan itse joten nyt olen tässä. Myöskään tämä ei tunnu parasta suunnittelua että olen kova koodattu David. Olen kova koodattu Rob. Ja minulla on vielä turvautumaan joitakin kopioida ja liittää aina kun haluan uusia muuttujia. Lisäksi minulla on ilmeisesti antaa jokaiselle näistä muuttujista nimi, vaikka olisin paljon mieluummin kuvata näitä muuttujia  lisää yleisesti opiskelijat. Nyt voimme yhdistää ajatuksia, jotka ovat työskennelleet hyvin meille ja sen sijaan sanovat, "Tiedätkö mitä, anna minulle muuttuja nimeltä opiskelijoita, ja Katsotaan se olla kooltaan 3 ", joten nyt voin tarkentaa tätä vielä, päästä eroon käsin julisti David, ja voin sen sijaan sanoa jotain opiskelijoita [0] täällä. Voin sitten sanoa opiskelijat [0] täällä, opiskelijat [0] täällä, ja niin edelleen, ja voin mennä noin ja siivota Rob. Voisin myös mennä nyt ehkä lisäämällä silmukan ja käyttämällä GetString ja GetInt todella saada nämä arvot käyttäjältä. Voisin mennä lisäämällä vakio, koska tämä on yleensä huono käytäntö koviin koodi jotkut mielivaltaisen määrän kuin 3 täällä ja sitten vain muistaa, että sinun pitäisi laittaa enintään 3 opiskelijaa siinä. Se olisi todennäköisesti parempi käyttää # define yläreunassa minun tiedosto ja kerroin että ulos, niin todellakin haluan mennä eteenpäin ja yleistää tätä. Saanen avata esimerkki, joka on kesken päivän esimerkkejä etukäteen, structs1. Tämä on enemmän täydellinen ohjelma joka käyttää # define täällä ja sanoo aiomme olla 3 opiskelijaa oletuksena. Täällä olen julistamisesta luokan verran opiskelijoita, niin luokkahuoneessa opiskelijoita, ja nyt olen käyttäen silmukka vain tehdä koodia hieman tyylikäs, kansoittavat luokka käyttäjän panosta, joten iteroida alkaen i = 0 asti opiskelijoita, mikä on 3. Ja sitten minä pyytää käyttäjältä tämän version  mitä opiskelijan tunnus, ja saan sen GetInt. Mikä opiskelijan nimi, ja sitten saan sen GetString. Mikä opiskelijan talossa? Saan sitä GetString. Ja sitten alaosassa täällä olen vain päättänyt vaihtaa miten olen tulostamista nämä ulos ja itse käyttää silmukka, ja kuka olen tulostamista? Mukaan kommentin olen tulostamista ketään Mather, ja se on siinä niin Rob ja Tommy jne.-itse Tommy on Mather. Tommy ja David olisi painettu tässä tapauksessa, mutta miten tämä toimii? Emme ole nähneet tätä toimintoa ennen, mutta arvata, mitä tämä tekee. Vertaa merkkijonoja. Se on vähän kuin selvää, miten se vertaa merkkijonoja koska se kääntyy pois jos se palauttaa 0, joka tarkoittaa jouset ovat yhtä. Jos se palauttaa -1, joka tarkoittaa yhtä tulee aakkosjärjestyksessä ennen toista, ja jos se palaa +1 joka tarkoittaa toinen sana tulee aakkosjärjestyksessä ennen muita, ja voit katsoa verkossa tai man-sivu nähdä tarkalleen mihin suuntaan on joka, mutta kaikki tämä on nyt tekemässä se sanoo jos [i]. talo on yhtä "Mather" sitten mennä eteenpäin ja tulostaa niin ja niin on Mather. Mutta tässä on jotain emme ole ennen nähneet, ja me palaamme tähän. En muista koskaan tarvitse tehdä missään minun ohjelmia. Ilmainen on ilmeisesti viittaa muistiin, mikä vapauttaa muistia, mutta muisti olen ilmeisesti vapauttaa tämän silmukka alareunassa tämän ohjelman? Näyttää siltä, ​​olen vapauttaa henkilön nimi ja henkilön luona, mutta miksi? On käynyt ilmi, kaikki nämä viikkoja, että olet käyttänyt GetString olemme tavallaan ottaneet käyttöön bugi osaksi jokaisen ohjelmia. GetString suunnittelun varaa muistia, jotta se voi palata sinulle merkkijono, kuten David, tai Rob ja voit tehdä mitä haluat kanssa merkkijono ohjelman, koska olemme varattu muisti sinulle. Ongelmana on koko ajan aina soittaa GetString me, laatijat GetString, ovat kyselleet käyttöjärjestelmä antaa meille vähän RAM tätä merkkijono. Antakaa meille vähän muistia tähän ensi merkkijono. Antakaa meille vähän lisää muistia tähän ensi merkkijono. Mitä sinä, ohjelmoija, ole koskaan tehneet antaa meille, että muisti takaisin, joten nämä useita viikkoja kaikki ohjelmat olet kirjoittanut on ollut mitä kutsutaan muistin harppaus jossa ne pitää käyttää enemmän ja enemmän muistia aina soittaa GetString, ja se on hienoa. Olemme tietoisesti tehdä sen ensimmäisen viikon, koska se ei ole niin kiinnostavaa on huolehtia siitä, missä merkkijono on peräisin. Kaikki haluamasi on sana Rob palata kun käyttäjä sitä sisään Mutta eteenpäin meidän on nyt alkaa saada enemmän kehittyneempiä tästä. Aina me varata muistia olemme parempia lopulta luovuttaa sitä takaisin. Muuten reaalimaailmassa Macin tai PC saatat olla joskus kokeneet oireita jos tietokone on pysähtymässä lopulta tai tyhmä spinning rantapallo on vain miehittää tietokoneen koko huomiota ja et voi tehdä asioita. Tämä voidaan selittää minkä tahansa määrän bugeja, mutta joukossa mahdolliset bugit ovat asioita kutsutaan muistivuotoja jossa joku kirjoitti, että ohjelmisto käytät ei muistanut vapaata muistia että hän kysyi käyttöjärjestelmä, ei käytössä GetString, koska se CS50 juttu, mutta käyttäen samankaltaisia ​​tehtäviä että kysy käyttöjärjestelmän muistin. Jos sinä tai he tyriä ja koskaan palaa, että muisti oire, joka voi olla se, että ohjelma hidastuu ja hidastuu ja hidastaa jos muistat soittaa ilmaiseksi. Tulemme takaisin milloin ja miksi te soittaa ilmaiseksi, mutta mennään eteenpäin vain hyvä toimenpide ja kokeile käynnissä kyseistä ohjelmaa. Tätä kutsuttiin structs1, kirjoita. Anna minun mennä eteenpäin ja ajaa structs1, 123, David Mather, 456, Rob Kirkland, 789, Tommy Mather, ja näemme Davidin kaupungista Mather, Tommy on Mather. Tämä on vain pieni järki tarkistaa, että ohjelma toimii. Nyt valitettavasti tämä ohjelma on hieman turhauttavaa, että En kaiken työn, olen kirjoittanut 9 eri jouset, enteriä, kerrottiin joka oli Mather, mutta ilmeisesti tiesin kuka oli Mather jo, koska olen kirjoittanut sen. Olisi ainakin mukavaa, jos tämä ohjelma on enemmän kuin tietokanta ja se todella muistaa mitä olen kirjoittanut joten en koskaan enää tarvitse syöttää nämä elevbokföring. Ehkä se on kuin registrarial järjestelmä. Voimme tehdä tämän käyttämällä tätä tekniikkaa kutsutaan tiedoston I / O, tiedosto tulo ja lähtö, hyvin yleinen tapa sanoa milloin haluat lukea tiedostoja tai kirjoittaa tiedostoja Voit tehdä tämän tietty joukko toimintoja. Anna minun mennä eteenpäin ja avata tässä esimerkissä structs2.c, joka on lähes identtinen, mutta katsotaanpa mitä se nyt tekee. Ylimpänä tiedoston julistan opiskelijaryhmiä. Sitten kansoittavat luokassa käyttäjän panos, joten ne koodiriviä ovat juuri ennen. Sitten jos selaa täällä voin tulostaa kaikille on Mather mielivaltaisesti kuten ennen, mutta tämä on mielenkiintoinen uusi ominaisuus. Nämä koodiriviä ovat uusia, ja ne otetaan käyttöön jotain, KUVA, kaikki lippikset, ja se on * täällä samoin. Jatkan tätä tänne, * täällä samoin. Tämä toiminto emme ole ennen nähneet, fopen, mutta se tarkoittaa tiedostoa auki, joten katsotaanpa lukaista läpi nämä, ja tämä on jotain tulemme takaisin tulevaisuudessa psets, mutta tämä linja tässä pohjimmiltaan avaa tiedosto nimeltä tietokanta, ja se koskee erityisesti avaa sen siten, että se voi tehdä mitä se? [Äänetön-opiskelija] Oikea, joten "w" vain tarkoittaa se kertoo käyttöjärjestelmä avaa tämä tiedosto niin, että voin kirjoittaa sitä. En halua lukea sitä. En halua vain katsoa sitä. Haluan muuttaa ja lisätä tavaraa mahdollisesti siihen, ja tiedosto on menossa kutsutaan tietokantaan. Tätä voitaisiin kutsua mitään. Tämä voisi olla database.txt. Tämä voisi olla. Db. Tämä voisi olla sana kuten foo, mutta mielivaltaisesti päätti nimetä tiedosto tietokantaan. Tämä on pieni järki tarkistaa, että tulemme takaisin hyvin yksityiskohtaisesti ajan, jos fp, tiedostojen osoitin, ei ole sama NULL se tarkoittaa, että kaikki on hyvin. Pitkä tarina lyhyt, toimii kuin fopen joskus epäonnistua. Ehkä tiedostoa ei ole olemassa. Ehkä olet poissa levytilaa. Ehkä sinulla ei ole oikeuksia kansion, joten jos fopen palauttaa null jotain pahaa tapahtui. Toisaalta, jos fopen ei palauta null kaikki on hyvin ja voin alkaa kirjoittaa tähän tiedostoon. Tässä uusi temppu. Tämä on for-silmukka, joka on iteroimalla yli jokaisen oppilaani ja tämä näyttää niin samankaltaisia, mitä olemme tehneet aiemmin, mutta tämä toiminto on serkku printf vaati fprintf tiedostojen printf, ja huomaa se on erilainen vain 2 tapaa. Yksi, se alkaa f sijasta p, mutta sen ensimmäinen väite on ilmeisesti mitä? [Opiskelijat] Tiedosto. >> Se tiedostoa. Tämä juttu nimeltä fp, jonka me lopulta erottaa toisistaan, mikä tiedoston osoitin on, mutta nyt FP yksinkertaisesti edustaa tiedosto olen avannut, joten fprintf tässä sanoo tulostaa tämän käyttäjän ID tiedoston, eikä näyttöön. Tulosta käyttäjän nimen tiedoston, eikä näyttöön, talon tiedostoa, ei näytön, ja sitten tänne, tietenkin, sulje tiedosto, ja sitten täällä vapaata muistia. Ainoa ero tässä versio 2 ja versio 1 on käyttöönotto fopen ja tämän tiedoston * ja tämä käsite fprintf, joten katsotaanpa mitä lopputulos on. Anna minun mennä minun pääteikkuna. Saanen juosta structs2, kirjoita. Näyttää kaikki on hyvin. Katsotaanpa uusintana structs2. 123, David Mather, 456, Rob Kirkland, 789, Tommy Mather, kirjoita. Näyttää se käyttäytyi samalla, mutta jos en nyt tee ls huomaa, mitä tiedosto on täällä kaikkien minun koodi, tietokanta, joten katsotaanpa avaa, gedit tietokannan, ja katso sitä. Se ei ole seksikkäin tiedostomuotoja. Se on todellakin yksi kappale datajohdin rivillä kohti, mutta ne teistä, jotka käyttävät Excel tai CSV-tiedostoja, pilkulla erotetut arvot, Voisin varmasti käyttää fprintf sen sijaan ehkä tehdä jotain tällaista niin että voisin itse luoda vastaava Excel-tiedoston erottamalla asiat pilkuilla, ei vain uusia linjoja. Tässä tapauksessa, jos olisin sen sijaan käyttää pilkkuja sijaan uusien linjojen Voisin kirjaimellisesti avata tietokantatiedoston Excelissä jos olen sen sijaan tehnyt näyttää tältä. Lyhyesti sanottuna, nyt meillä on valta kirjoittaa tiedostoja voimme nyt aloittaa jatkuva tiedon, pitää se noin levyllä jotta voimme pitää tietoa ympäri uudestaan ​​ja uudestaan. Ilmoitus pari muuta asiaa, jotka ovat nyt hieman tutumpi. Ylimpänä tämän C tiedoston meillä typedef koska halusimme luoda tietotyyppi edustaa sana, joten tämä tyyppiä kutsutaan sana, ja sisällä tämän rakenteen se on vähän harrastaja nyt. Miksi sana koostuu ilmeisesti array? Mikä on sana vain intuitiivisesti? Se on erilaisia ​​merkkejä. Se on merkkijono takaisin takaisin takaisin. Isot kirjaimet sattuu olemaan meidän mielivaltaisesti sanoa maksimipituus tahansa sana sanakirjasta että käytämme varten Scramble. Miksi minulla on +1? Nollamerkki. Recall kun teimme Bananagrams esimerkki tarvitsimme erityinen arvo lopussa sanan jotta seurata , missä sanat tosiasiallisesti päättynyt, ja koska ongelmana asetettu spesifikaatio sanoo täällä me liitytään tiettyä sanaa boolean arvo, lippu, niin sanoakseni, tosi tai epätosi. Oletko löytänyt tämän sanan jo, koska ymmärrämme, me todella tarvitsemme tapa muistaa paitsi mitä sana on Scramble mutta vai et, ihmisen, löytäneet sen joten jos et löydä sanaa "" ei voi vain kirjoittaa, kirjoita,, anna, antamalla ja saada 3 pistettä, 3 pistettä, 3 pistettä, 3 pistettä. Haluamme pystyä mustalle listalle, että sana asettamalla bool true jos olet jo löytänyt sitä, joten siksi olemme kapseloitu se tässä rakenteessa. Nyt täällä on Scramble on tämä muu struct nimeltään sanakirja. Absent tässä on sana typedef koska tässä tapauksessa meidän piti kiteyttää ajatukseen sanakirja, ja sanakirja sisältää koko joukko sanoja, koska ymmärtää tämä jono, ja kuinka moni noista sanoista ovat siellä? No, mitä tämä muuttuja nimeltä kokoa sanoo. Mutta meidän on vain sanakirja. Emme tarvitse tietotyyppiä kutsutaan sanakirja. Meidän täytyy vain yksi niistä, niin se kääntyy pois C että jos et sano typedef, sanoit struct, niin sisällä aaltosulkeita laitat muuttujia, niin laitat nimen. Tämä on julistaa yhden muuttujan nimeltään sanakirja joka näyttää tältä. Sen sijaan nämä linjat luovat uudelleen tietorakenne kutsutaan sana että voit luoda useita kopioita, aivan kuten olemme luoneet useita kopioita opiskelijoille. Mitä tämä lopulta antaa meille mahdollisuuden tehdä? Anna minun mennä takaisin, sanokaamme, yksinkertaisempi esimerkki yksinkertaisempaa kertaa, ja anna minun avata, sanotaanko, compare1.c. Ongelmana tässä käsillä on todella Taitat kerros merkkijonon ja aloitat pois näistä apupyörät koska osoittautuu, että merkkijono koko tämän ajan on kuten lupasimme viikolla 1 oikeastaan ​​vain lempinimi, synonyymi alkaen CS50 kirjastosta jotain, joka näyttää hieman arvoituksellisesti, char *, ja olemme nähneet tämän tähden ennen. Näimme sen yhteydessä tiedostoista. Katsotaanpa nyt, miksi olemme olleet piilossa tähän yksityiskohtaisesti jo jonkin aikaa. Täällä on tiedosto nimeltä compare1.c, ja se ilmeisesti pyytää käyttäjältä 2 jouset, s ja t, ja sitten se yrittää verrata näitä Kielet tasa rivi 26, ja jos he yhtä sanotaan, "Kirjoitit sama asia" ja jos he eivät yhtä se sanoo, "Kirjoitit eri asioita." Anna minun mennä eteenpäin ja suorita tämä ohjelma. Anna minun mennä minun lähde hakemistoon, tee compare1. Se laaditaan okei. Saanen juosta compare1. Minä zoomata, kirjoita. Sano jotain. HELLO. Sanon jotain uudestaan. HELLO. En todellakaan ole kirjoittaa eri asioita. Yritän tässä uudelleen. BYE BYE. Ehdottomasti ei eri, niin mitä täällä tapahtuu? No, mitä todella verrataan linjassa 26? [Äänetön-opiskelija] Kyllä, niin se kääntyy pois että merkkijono, tietotyyppi, on eräänlainen valkoinen valhe. Merkkijono on char *, mutta mikä on char *? Char *, kuten sanotaan, on osoitin, ja osoitin on tehokkaasti osoite, summa sijainti muistissa, ja jos sinulla sattuu olemaan kirjoitettu sana kuten HELLO, muistuttaa aiemmista keskusteluista merkkijonoja Tämä on kuin sana HELLO. Muista, että sanan HELLO voidaan esittää kuten erilaisia ​​merkkejä kuten tämä ja sitten erikoismerkki lopussa kutsutaan nollamerkki, kuten \ tarkoittaa. Mikä on oikeastaan ​​merkkijono? Huomaa, että tämä on useita paloina muistia, ja itse asiassa pää on tiedossa vasta kun näytät läpi koko merkkijono etsivät erityistä nollamerkki. Mutta jos tämä on kimpale muisti tietokoneen muistista, Oletetaan mielivaltaisesti sanoa, että tämä jono vain onnekas, ja se sai sijoitettu alusta tietokoneeni RAM. Tämä on tavu 0, 1, 2, 3, 4, 5, 6 ... Kun sanon jotain GetString ja minä string s = GetString mitä oikeastaan ​​palautetaan? Näiden viime viikkojen mitä todella on tallennettu s ei tämä merkkijono sinänsä, mutta tässä tapauksessa, mitä on tallennettu on numero 0, koska mitä GetString oikeastaan ​​tekee ei se ole fyysisesti palauttaa merkkijonon. Se ei edes oikeastaan ​​tee käsitteellistä järkeä. Mitä se tekee paluun numero. Tämä numero on osoite HELLO muistiin, ja merkkijono s sitten, jos kuori takaisin tämän kerroksen merkkijono ei todellisuudessa ole olemassa. Se on vain yksinkertaistaa CS50 kirjastossa. Tämä todellakin on jotain kutsutaan char *. Char järkevää, koska mikä sana, kuten HELLO? No, se on sarja merkkiä, useita merkkejä. Char * tarkoittaa osoitteen luonne, niin mitä se tarkoittaa palauttaa merkkijonon? Kiva, yksinkertainen tapa palauttaa merkkijonon on pikemminkin kuin yrittää selvittää, miten palata 5 tai 6 eri tavua Saanen palata osoite, joka tavun? Ensimmäinen. Toisin sanoen, minä annan sinulle osoitteen merkin muistiin. Sitähän char * edustaa, osoite yhden merkin muistiin. Soita se muuttuja s. Säilytä s kyseisen osoite, jota mielivaltaisesti sanonut on 0, vain pitää asiat yksinkertaisina, mutta todellisuudessa se on yleensä isompi numero. Hetkinen. Jos olet vain antaa minulle osoitteen ensimmäisen merkin, mistä tiedän, mikä osoite on toinen merkki, kolmas, neljäs ja viides? [Äänetön-opiskelija] Et vain tiedä missä merkkijonon lopussa on tapa tämän kätevä temppu, joten kun käytät jotain printf, mitä printf kirjaimellisesti tekee sen väitteen, muistuttaa, että käytämme tätä% s paikkamerkkiä, ja sitten kulkea muuttuja, joka on varastointi merkkijono. Mitä olet todella kulkee on osoite ensimmäinen merkki merkkijonon. Printf sitten käyttää for-silmukka tai kun silmukka saatuaan että osoite, Esimerkiksi, 0, joten haluan tehdä sen nyt, printf ("% s \ n" s); Kun Kutsun printf ("% s \ n" s), mitä olen todella antaa printf kanssa on osoite ensimmäisen merkin s, joka tässä mielivaltaisesti tapauksessa on H. Miten printf tietävät mitä näyttää ruudulla? Henkilö, joka toteutettiin printf toteutetaan while-silmukka tai for-silmukka joka sanoo tämä merkki yhtä erityistä nollamerkki? Jos ei, tulostaa sen. Entäs tämä? Jos ei tulosta se, tulosta se, tulosta se, tulostaa sen. Voi, tämä on erikoinen. Pysäytä tulostus ja palaa käyttäjälle. Ja se on kirjaimellisesti kaikki on tapahtunut alla huppu, ja että on paljon sulattaa ensimmäisenä päivänä luokan, mutta nyt se on todella rakennuspalikka ymmärryksen kaikesta joka on jatkunut sisällä meidän tietokoneen muistiin, ja lopulta me kiusata tätä erilleen hieman apua yhdeltä ystävämme Stanfordissa. Professori Nick Parlante Stanfordin on tehnyt tämän ihanan videon järjestyksessä alkaen kaikenlaisia ​​eri kieliä käyttöön tämä pieni claymation merkin Binky. Ääni olet aikeissa kuulla vain muutaman sekunnin ennakkoesitys on, että Stanfordin professori, ja saat vain 5 tai 6 sekuntia tämän juuri nyt, mutta tämä on huomautus, joka me tehdä tänään ja alkavat keskiviikkona. Annan teille Pointer Fun with Binky, esikatselu. [♪ Music ♪] [Professori Parlante] Hei, Binky. Herää. On aika osoittimen hauskaa. [Binky] Mikä tuo on? Lisätietoja viitteitä? Voi goody! Tulemme näkemään sinut keskiviikkona. [CS50.TV]