[Musiikkia] DAVID J. MALAN: Tämä on kuin fuksi seminaarin tänään. OK. Niin hyvin sateinen ulos. Tämä yleensä tapahtuu keskiviikkoisin, mutta sitäkin tilaisuus kysymyksiä tänään. Joten alkaa todella kanssa elokuvan vain hetken. Mutta aloitamme grandly kuten aina. Tämä on CS50, ja tämä on viikon lopussa 4. Joten jos olet koskaan katsonut Televisiota tai elokuvaa, jossa siellä on tietokone asiantuntijat ja poliisi, tai FBI, tai jotkut virasto yrittää saada kiinni joitakin vastustaja, hyvin, olet luultavasti kuulleet sanonnan "parantaa" jolloin se teknikko jotenkin maagisesti zoomaa äärettömän paljon nähdä rikollisia identiteetin tai rekisterinumero parillisina hohto peilin tai kimaltaa jonkun silmään. Joten todellakin, nyt katsomaan muutamia tällaisia ​​kohtauksia Hollywood. [VIDEOTOISTOSTA] -OK, Nyt Mennään hyvä katsoa sinua. -Pidä sitä. Ajelu että takaisin. -Hetkinen. Käänny oikealle. -On, Jäädyttää että. -Koko näyttö. -OK, Jäädyttää että. Tiukentaa ylös, että aiotte? -Vector Kauppaa näillä kaveri takapyörä. -Zoom Sisään täällä tällä paikalla. -Kun Oikea laitteet, kuva voitaisiin laajentaa ja teroittaa. -Mikä tuo on? -Se Tehostamisohjelma. Voitko selvää, että mihin tahansa? -Minä en tiedä. Katsotaanpa parantaa sitä. -Paranna Kohta A6. -En Parannettu yksityiskohta, and-- Mielestäni on olemassa tarpeeksi parantaa, vapauta se minun näytön. -En Parannettu heijastus hänen silmässä. -Anna Run tätä kautta kuvanmuokkausteknologia. -Edgar, Voit parantaa tämän? -Odota. -I've Työskennellyt tämän pohdintaa. -Someone Heijastus. -Reflection. -On On heijastus miehen kasvot. -The Heijastus. -On On heijastus. -Zoom Sisään peiliin. -Voit Nähdä heijastus. Voitko parantaa kuvan tästä? Voitko parantaa hänet täällä? Voitko parantaa sitä? Voitko parantaa sitä? -Voi Parannamme tätä? Voitko parantaa sitä? -Hold Toisella, minä parantaa. -Zoom Vuonna oveen. -Times 10. -Zoom. -Muuttaa. -Lisää. -Wait, Lopeta. -Stop. -Pause Se. -Rotate Meille 75 astetta ympäri pystysuoran, kiitos. -Stop. Mene takaisin osan noin ovi, jälleen. -Got Kuva tehostajana, joka voi Bitmap? Hei, ehkä voimme käyttää Pradeep Sen menetelmä kurkistaa ikkunoita. -tämä Ohjelmisto on uusinta. -The Ominaisarvo on pois päältä. -Kun Oikea yhdistelmä algorithm-- -Hän Ottanut poistaminen algoritmit seuraavalle tasolle, ja voin käyttää niitä parantaa tämän valokuvan. -Lock Päälle ja suurentaa z-akselin. -Paranna. -Paranna. -Paranna. -Freeze Ja parantaa. [Lopeta toisto] DAVID J. MALAN: Selvä, joten kaikki nämä ovat todella sanoja. He vain kireä yhdessä että ei ole oikeastaan ​​järkevää. Ja itse asiassa, CS50 ja kursseja kuten se taipumus pilata paljon televisiota ja elokuvia sinua varten. Koska kun ne tietokone asiantuntijat ravistelevat pois ehdot ja sanomalla fancy asioita, kuten ominaisvektoria, ja z-akselin, ja useita muita oikeastaan ​​enemmän teknisiä termejä, he todella vain nauhassa sanat yhdessä aivan liian usein. Onko se yksi toiveemme on, että kuten haittavaikutus kursseja näin, tulee enemmän ihmisiä maailma todella voi punnita ja juuri koskaan niin hieman vaikuttaa laatu ja tarkkuus näistä elokuvista? Itse asiassa, nyt katsomaan todellisuutta. Joten tässä on henkilöstön kuva Maria, yksi opetuksen Fellows. Ja kai hän on epäillään jotain. Ja silti, siellä on pilkahdus jotkut todiste hänen silmässä, tai heijastus hänen silmälasit. No, jos teemme juuri niin kuin elokuvien ehdottaa, jolloin me zoomata ja "parantaa", tämä on kuinka paljon tietoa on Marian kasvot kun kuvattaessa kanssa, että alkuperäinen resoluutio. Ja itse asiassa, voit nähdä nämä pisteet. Ja nämä ovat mitä ovat kutsutaan pikseliä, P-I-X-E-L-S, joka on vain neliö tyypillisesti joka on piste, joka muodostaa kuvan. Ja takaisin seuraavana päivänä, ja itse asiassa jopa tänään jotkut nykypäivän LED-televisiot tai LCD-televisiot, jos sinulla yksi oman huoneen tai kotona, jos menet ylös Super lähellä sitä, ja varsinkin jos se on hieman vanhempi TV, voit todennäköisesti jopa nähdä nämä pisteet ja sitähän säveltää kuvan. Ja ei ole enää tiedot kuin tämä. Voisimme "parantaa", siinä mielessä tasoitus asioita yli ja tavallaan päättelemällä sellainen, tavallaan mitä väri pitäisi olla vieressä Marian silmä niin että se ei ole oikeastaan ​​niin pixelated. Mutta jos pidän zoomaus, siellä on paha kaveri hänen silmässä. Kuin että on kaikki tiedot meillä on. Et voi luoda tiedot tyhjästä. On vain rajallinen bittien määrä siellä. Joten Harjoitus 4, jossa sinulla on mahdollisuus pelata tällaista maailman. Vuonna Harjoitus 4, voit tutkia maailmaan grafiikka, ja Forensics, ja todella kirjoittaa koodia joka toipuu menetetty kuvia. Sinun kirjoittaa koodia, joka manipuloi olevien kuvien ja lopulta ymmärtää, mitä on meneillään alla huppu. Ja se kääntyy pois, se on todella ole kovin monimutkainen. Esimerkiksi, jos halusimme edustavat hymiö kasvot jossa mustilla pikseliä, tai näitä mustia pisteitä, hyvin, voisimme yksinkertaisesti edustaa ne todella bittikartta. Ja jos koskaan kuullut, että ilmaisu bittikartta, ehkä nyt alkaa tehdä vähän enemmän järkeä tänään. Tiedämme jo mitä vähän on. Se on 0 tai 1. Ja kartta on vain jotain kuten paperille joka antaa sinulle ohjeita ja on ehkä verkkoon x- ja y-koordinaatit. Joten tässä on bittikartta. Se on kartta bittejä jolloin 1 on ilmeisesti menossa edustaa valkoinen pikseli, ja 0 on menossa edustamaan musta pikseli. Mutta voisimme varmasti käännä se ympäri. Se ei ole oikeastaan ​​väliä niin kunhan olemme johdonmukaisesti. Ja tässä miten, vuonna binary-- sisällä tietokoneen muistiin, tai jopa sisällä tiedoston kiintolevyn drive-- voi tallentaa yksinkertaisin hymiö kasvot kuvia. Mutta mitä me, tietenkin, puuttuu tämän kuvan? Väri, eikö? Se on selvää, että seuraava askel tai lisälaite parantaa tätä väriä. Joten valitettavasti vain yhdellä bittinen, 0 tai 1, voisimme esittää väri. Se voisi olla punainen tai sininen, tai musta tai valkoinen, tai vihreä, tai vaaleanpunainen, tai paria värejä. Mutta yksinkertaisuuden vuoksi, olemme will vain olettaa musta ja valkoinen. Joten mitä loogisesti me tarvitsemme, jos haluamme halua toteuttaa kuvan värin? Mitä meidän on tehtävä? Kuten jos rajoittava tekijä tässä on se, että yhden bitin voit vain edustavat kahta valtiota, 0 tai 1, valkoinen tai musta, mitä haluat tehdä? Yleisö: Lisää tietoja. DAVID J. MALAN: enemmän bittejä, joo enemmän tietoa, enemmän bittejä. Ja todellakin, juuri niin värikuvia ovat edustettuina. Sen sijaan käyttää yhden bitin, 0 tai 1 kunkin pikselin, jokainen piste, käytät vain useita. Ehkä käyttää 8, ehkä, yleisemmin käyttää 24, ja todellakin, vuonna Harjoitus 4, tulee pelaat tiedosto muodossa, joka käyttää 24 bittiä tyypillisesti. Mutta useimmat teistä ovat luultavasti perehtynyt JPEG. Jos olet koskaan ottanut kuva puhelimeen, tai ladata tai nähnyt jotain Facebook, tai Flickr, mikä tahansa numero valokuva-pohjaisia ​​web-sivustoja, olet luultavasti nähnyt JPEG ennen. Ja se kääntyy pois, tämä on tiedosto muodossa aiomme käyttää PSET 4, jolloin aiot täytyy palauttaa kuvia että olen vahingossa poistettu vioittunut muistikortti kamerassa, jos haluatte. Ja käy ilmi, että vaikka JPEG on melko sophisticated-- se on paljon kehittyneempi kuin musta ja valkoisia pisteitä näimme hetki sitten, koska siellä todella fancy algoritmeja käytetään pakata JPEG, joten että voit olla todella mukava, kuvanlaatu mutta käyttämällä suhteellisen vähän bittiä. Ja me palaamme puristus ennen pitkää. On käynyt ilmi, että ensimmäinen kolme tavua JPEG image-- mitä olet ottanut valokuvan of-- ovat arvot 255, 216, 255. Toisin sanoen, jos vain nähdä, että malli bittien, täällä edustettuina kolme tavua, tai 24 bittiä yhteensä, suurella todennäköisyydellä voit päätellä, että etsit sitä tällä kolmen ensimmäisen tavua JPEG. Ja tämä on mitä kutsutaan koska allekirjoitus JPEG. Paljon tiedostomuotoja siellä yleensä alkaa tiettyjä malleja 0s ja 1s, niin että Windows ja Mac OS, ja IOS, ja Android tietää minkälainen tiedosto he ovat lisäksi niin kutsutun tiedoston laajennus paljon tiedostoja on. Jos olet .jpg, se toinen vihje tietokoneeseen. Joten nyt tarkastelemme tätä hieman teknisesti. Tiedämme desimaalin järjestelmä on 0 kautta 9. Tiedämme binary on 0 ja 1. Ja jos luulet takaisin PSET 0, meillä oli sinä painia, varten hieman, jotain nimeltään heksadesimaali, jos sinulla on 16 numeroa, sijasta 10 tai sijasta 2. Ja ne numeroa, sopimuksen mukaan, ovat 0 kautta 9 ja sitten kautta f, jossa f edustaa mitä desimaaliluku, kuten nopea järki tarkistaa? Niin, 15. Ja on edustettava 10, vain luonne tilaus että olen antanut. Se on vain mielivaltainen yleissopimus, mutta se on melko tavallinen. Joten jos katsomme tätä mallia kolme bytes-- katsotaanpa vain alkaa katsomaan sitä tavalla, joka on miten tietotekniikan tutkijoita yleisesti tarkastella ja miettiä tiedostoja. Voit varmasti ajatella tiedostoja 0s ja 1s, ja desimaalin, mutta todellisuudessa meillä on tapana käyttää binary tai tyypillisemmin hexadecimal-- takaisin PSET 0. Haluan siis ehdottaa, että 255, 216, ja 255 ovat vain nämä mallit 0 ja 1s. Ja voit tarkistaa tämän, jos haluavat tehdä matematiikka viikosta 0. Mutta, nyt, vain olettaa että tämä on todellakin oikea. Olen juuri uusiksi kolmen desimaalin numerot kolme binääriarvot. Nyt mitä aion tehdä, on lisää vain tyhjää tilaa, vain luettavuuden vuoksi. Ja ilmoitus, olen juuri menossa siirrellä toisistaan. Joten ennen, jälkeen, ennen, jälkeen. Mulla mitään mielenkiintoista muut kuin vain levittää asiat niin että ilmoitus jokaisen sarjan kahdeksan bitit on nyt kaksi neljä bittiä. Tämä on hyödyllinen, koska heksadesimaali on erityisen muodikas koska jokainen heksadesimaalinumero 0 f, tai tarkemmin sanottuna 0 läpi 15, voidaan esittää täsmälleen neljä bittiä. Toisin sanoen, heksadesimaali jos haluavat edustaa 0, se on vain 0000, neljä nollaa. Ja jos haluat edustaa 15, se on 1111, mikä on neljä bittiä. Ja jos et matematiikka, jos tämä on itse paikka, tämä on 16s paikka, joka tulee antaa sinä-- pikemminkin se on menossa to-- pahoillani, binary, joka on menossa antaa sinulle 15, niistä paikka, kaksittain paikka, nelosta ja kahdeksikkoa paikka. Joten haluan ehdottaa, että Aseta neljä bittiä vasemmalle on mitä aiomme soittaa f. Se on suurin numero voi edustaa neljä bittiä. Ja tiedämme jo heksadesimaali, f on suurin numero heksadesimaalimuodossa. Meillä toinen f siellä, kaksi tuolla. Ja nyt, ota uskoon että olen tehnyt matematiikka oikea ja että vasen puoli Näiden bittien, 1101, on sama asia kuin d heksadesimaalimuodossa. Ja oikea käsi, 1000, on vain 8. Ja että yksi helppo nähdä, eikö? 8 represents-- on oikea alla, että kahdeksikkoa paikka. Joten meillä on yksi kahdeksikkoa sarakkeessa ja mikään nelosta, kaksittain tai niistä. Joten nyt enemmän tavanomaisesti, ihmisillä on taipumus kirjoittaa heksadesimaaliluvut näin, juuri litistää ne yhteen, ja sitten etuliitteen ne 0x. Se ei tarkoita mitään muuta kuin visuaalinen vihje human-- tässä tulee heksadesimaalinen value-- koska se ei ehkä muuten olisi ilmeinen. Joka on sanoa, lopulta, että kuvio nollia ja ykkösiä, tai rakenteessa heksadesimaali numeroa vastaavasti, että olet aikoo aloittaa etsivät vuonna Harjoitus 4 on this-- ja Harjoitus 4 spec kävellä sinua tässä enemmän detail-- mutta ymmärtää koska tavallaan mystistä kuin tämä saattaa näyttää ensi silmäyksellä, aiot alkaa nähdä tätä paljon. Ja itse asiassa jopa GDB, debuggeri otimme käyttöön maanantaina ja Dan esittelee vuonna PSET 3, tulee usein näyttää heksadesimaaliarvot vain koska he ovat yleensä tavanomainen kuin desimaalin tai binary maailman tietokoneita. Nyt Taustaksi tälle. Monet teistä saattaa muistaa tämä kuva täällä, joka tuli mitä? Vista, joten jopa aiemmin kuin että, Windows XP teki tämän debyytti. Joten tämä on kaunis maisema. Ja itse asiassa, jos penkoa online-- Minusta se on Wikipedia-artikkeli, jossa joku hyvin hämmästyttävän lähtivät löytyi tämä päin maailmaa perustettu hänen kamera juuri oikeaan place-- ja tämä tänään näyttää like-- mutta se on täsmälleen sama asetus. Tämä kuva on kuitenkin tiedostoon muodossa nimeltä bittikartta, b-m-p. Ja aiomme ottaa super Pikainen vilkaisu mitä se tarkoittaa. Mutta bittikartta on vain erilainen tapa edustavat kuvia edelleen käytössä pikseliä vuonna 0s ja 1s, lopulta. Mutta nopealla silmäyksellä, se on mielenkiintoisempi allekirjoitus alussa tiedoston. Se ei ole vain kolme tavua, eikä siellä koko joukko malleja tavua jotka ovat ennalta merkitys. Esimerkiksi jossain muutaman ensimmäisen tavua bittikarttakuvan tulee olla koko kuva, leveys kuvan, kuvan korkeus, niin hyödyllinen metatiedot, jos haluatte. Hyödyllistä tietoa että Photoshop tai kuvankäsittelyohjelmaan käytät voisi itse välitä. Joten lisää tästä Harjoitus 4, mutta tämä on vain sanoa, että päivän päätteeksi kaikki tiedostomuodot olet käyttänyt varten years-- Microsoft Word-tiedostoja, Numbers tiedostoja, Excel-tiedostoja, rajoittamattoman määrän tiedostomuotoja että saattaa olla joitakin tunnettu tiedostopääte ovat vain 0s ja 1s alla huppu. Ja ihmiset ovat päättäneet mitä sopimukset ovat, mitä malleja 0s ja 1s edustavat Word-tiedosto vs. Excel-tiedoston, vastaan ​​useita muita tiedostomuotoja. Joten PSET 4, sinun on mahdollisuus pelata kanssa. Mutta mitä se tarkoittaa olla struct. Tämä on todella mukava segue nyt osaksi C, joka on vain pari lisäominaisuuksia, jotka emme ole katsonut vielä. Se on aika pieni kieli ja yksi kivoja ominaisuuksia noin C on struct. Esimerkiksi, jos halusi represent-- katsotaanpa että haluat olla muuttuja, joka edustaa opiskelija joku ohjelma. Ehkä olit kirjallisesti kurssi rekisteröinti ohjelma, tai ydin ostoksia työkalu, tai jotain sellaista. Mitä kappaletta liittyviä tietoja opiskelijalle, jotka tulevat mieleen? Kuten opiskelija edustanut mitä arvoja? Joo? Sinulla nimi opiskelija. Mitä muuta tyypillinen opiskelija on? Yleisö: [äänetön] DAVID J. MALAN: Niin, anteeksi. Yleisö: Ikä. DAVID J. MALAN: ikä tai syntymäpäivä vastaavasti, jep. Mitä muuta? Yleisö: ID-numero? DAVID J. MALAN: Niin henkilötunnus, ehkä puhelinnumero, ehkä asuntolan, tai talo, tai korkeakoulussa, tai jotain sellaista. Mikä tahansa kappalemäärä tietojen saatat olla yhteystietoluettelossasi on mitä voisi määritellä opiskelija. Joten jos halusimme tehdä tämän koodin, voisimme tehdä jotain yksinkertaista, kuten tämä. Meillä saattaa olla ohjelman niin, että on sanokaamme, int main (void). Ja jos haluan edustaa opiskelija voisin olla, esimerkiksi, merkkijonon kehotti nimi että opiskelija, merkkijono nimeltään asuntolan että opiskelija, ehkä int kehotti tunnus että opiskelija. Ja koska olen käyttäen merkkijono, minä täytyy mennä takaisin ja laittaa ylös CS50.h. Ehkä olen menossa on stdio.h. Joten anna minun ennaltaehkäisevästi tehdä noita ja minä olen aikoo kutsua tätä student.c nyt ja tallentaa. Ja nyt voin tehdä jotain näitä muuttujia. Ja me juuri menossa kirjoittaa että kuten kommentti pseudokoodin, koska se ei ole kiinnostavaa mitä teemme nyt. OK, joten tämä on ohjelma, joka jotenkin tallentaa opiskelija. Mitä haluan tehdä, jos haluat tallentaa kaksi opiskelijaa? Joten minun ensimmäinen vaisto on menossa olla kunnossa, odota minuutti, jos minulla on toinen opiskelija Miksi en vain tehdä merkkijonon nimi 2, merkkijono asuntolan 2, int ID2. Ja olemme tehneet mennyt tällä tiellä ennen ja mikä oli meidän ratkaisu mitä näyttää olla eräänlainen hackish Kopioi Liitä työ täällä? Yleisö: array. DAVID J. MALAN: Joo, voisimme käyttää array. Oikea tämä hyvin nopeasti työskentely ruuhkautuu. Sinun täytyy lajitella mielivaltaisesti aloittaa nimeäminen kaikkia näitä muuttujia. Ja sinä, ihminen, on pidettävä seurata, että OK NAME2 vastaa kanssa dorm2 vastaa ID2. Se vain tulee sotkua. Niin se on paljon helpompaa, muistamme muutama viikko sitten, vain ottaa kutsutaan merkkijono nimet ja ehkä antaa meille kolme näistä. Ja sitten ehkä meillä merkkijono asuntoloissa ja on kolme näistä, tai vakio, int tunnukset ja kolme noita. Mutta jo nyt tämä tuntuu hieman huolimaton, oikea. Puhumme opiskelijoita ja vielä Olen todella asunnon alhaisella tasolla toteutuksen yksityiskohdat. Opiskelija nimi ja asuntolan ja tunnus. Miksi en voi vain julistaa muuttuja nimeltään opiskelija ja kutsua sitä s. Ja jos haluan toisen opiskelijan, miksi en vain kutsua sitä T. Tai jos haluan koko joukko opiskelijoiden, miksi en vain sanoa, että olen koko luokan opiskelijoille, ja se on kolme. Toisin sanoen, miksi en tulla kanssa oman datatyypin, nimeltään Opiskelijoita, jonka sisällä on nimi, on tunnus, on asuntolan, on useita muita kenttiä. Ja se osoittautuu sinua voi tehdä juuri näin. Joten C on tämä ominaisuus nimeltä struct. Se kielen ominaisuus, joka antaa meille mahdollisuuden tehdä juuri tämän. Aion mennä eteenpäin ja avata structs.h minne olemme menossa katsomaan seuraava määritelmä opiskelija. On käynyt ilmi - ja tämä on jopa yksinkertaisempi kuin yksi mukana tunnus hetki sitten. Jos haluat keksiä kotitekoisia tietotyyppi, ja lisäksi int, ja nieriää ja float ja kaikki nämä muut olemassa, voit tehdä niin kirjaimellisesti kirjallisesti typedef struct, sitten jotkut aaltosulkeita, jonka sisällä sinua luettelo muuttujat haluat liittävät tämän uuden mukautetun tiedot kirjoita kuten nimi ja asuntolan, ja sitten sen jälkeen aaltosulkeita annat nimen uusien tietojen tyyppi. Niinpä esimerkiksi, opiskelija. Ja mitä mukavaa tästä on, että nyt jos katsomme vastaava koodi, yleissopimus, ensimmäinen Kaikkien, on laittaa tämä tiedostoon nimeltä jotain piste h, header-tiedosto, joka meillä ei alkoi käyttää itseämme liikaa. Mutta aiomme aloittaa käyttäen melko vähän nyt. Ja mitä voimme tehdä tämän, lopulta, näissä muutaman rivin koodia on julistaa juuri sitä tietotyyppi, opiskelija. Ja Nyt käyttää sitä. Aion nyt mennä tiedosto nimeltä structs1.c. Ja lähdetään katsomaan harvat ominaisuudet täällä. Joten tukkia tässä enimmäkseen tuttuja, ja me palata mikä ei ole tuttu vain hetken. Tämä tietenkin on myös omassani header-tiedosto, joka on uusi myös, paitsi PSET 3 missä, Recall, meillä on helpers.h. Joten saatat muistaa # include helpers.h. Miksi vaikka minulla on käytössä lainausmerkkejä sijasta kulmassa suluissa? Milloin voin valita ne? Lähes aina Näytän käyttää kulma suluissa. Ja sitten, yhtäkkiä on line kuusi Käytän lainausmerkkeihin. Miksi voisi olla? Joo? Yleisö: [äänetön] DAVID J. MALAN: Se todellinen, mitä? Yleisö: Se on teidän IDE. DAVID J. MALAN: Joo, se on minun todellinen IDE. Ja älkäämme viipyä IDE, koska se on vain työkalu, joka olen käyttäen. Se on minun nykyinen hakemiston, erityisesti. Joten structs.h on oma tiedosto ei asennettu IDE, käyttöjärjestelmä itse, vaan se on minun hakemistossa. Joten yleissopimus on, jos haluat sisällyttää oman header-tiedosto, käytät vain lainausmerkkejä. Mitä me kutsumme tätä asia linja 8, yleisesti ottaen? Tämä on mitä? #define jotain. Tämä on vakiot, eikö? Jos haluat olla arvoa ohjelman että käytät koko joukko kertaa, se on hyvä yleissopimus tekijä sitä, julistaa, että se, hash symboli määritellä, sitten Sopimuksen mukaan kaikissa isoiksi word-- vaikka se ei ole ehdottoman välttämätöntä, mutta se on ihmisen yleissopimus hyödyntää vakioita jotta ne hyppää ulos sinua visually-- tilaa ja niin arvo haluat olla vastaa, että jatkuva nimi. Ei puolipiste, mutta voit yksinkertaisesti seuraa, että kuvio siellä. Joten mitä teen tässä todellinen koodi. Joten katsomaan pääohjelma täällä. Linjassa 12, koska olen ovat olleet structs.h, Minulla on nyt maagisesti minun hävittäminen uusi tietotyyppi. Minulla ei vain ole pääsyä int, ja nieriää, ja kellua, ja string, ja sininen ja muut. Minulla on nyt pääsy opiskelija tietotyyppi. Joten linja 12, olen yhdistämällä kaksi ideas-- yksi mukautetun tietotyyppi ja kaksi, käyttäen array. Ja niin tässä ohjelmassa, jos Haluan todella tukea kolme eri opiskelijat minun ohjelma, minä voi yksinkertaisesti sanoa antaa minulle muuttuja kutsutaan opiskelijoita, joista jokainen on tyyppiä opiskelijoita, jotka minulla on tapana tietotyyppi. Ja, erityisesti, anna minulle kolme näistä minun array. Joten nyt mitä me teemme tässä ohjelmassa? Tässä on vain varten silmukka iteroimalla 0-3, koska se on mitä arvo opiskelijoiden on. Olen vain kehottaa käyttäjää anna minulle opiskelijan nimi. Ja sitten linjassa 17, me on enimmäkseen tuttuja linja. Meillä on vanha ystävä GetString oikealla. Ja mitä pala syntaksin on ilmeisesti uusi, jos et ole koskaan ohjelmoitu C ennen, eikä ole koskaan käyttänyt structs? Joo? Yleisö: .name. DAVID J. MALAN: .name. Mutta tämä ei ole liikaa harppaus, koska nyt opiskelijat kannatin i antaa sinulle i: nnen opiskelija. Ja jos haluat sukeltaa sisällä että rakenne, käytät vain yhden kerran ja sitten muuttujan nimi sisällä, tai omaisuuden sisällä että haluat päästä käsiksi. Samoin silloin, jos en sitten pyytää käyttäjä, anna minulle opiskelijan asuntolan, voit samalla tallentaa että merkkijono asuntolan muuttuja sisällä Kyseisen opiskelija rakenne. Ja nyt asiat saavat hieman fancy. Ja tämä tulee näyttämään klo ehkä paljon melko pian. Mutta näet tämän paljon enemmän PSET 4, joten haluan vain vilkaista sitä nyt. On käynyt ilmi, että linja 23 kautta 38, mitä luulet minun kenties tekemässä? Olen poistanut kommentit tänään, mutta versio koodi verkossa viittaus on kaikki kommentit. Mitä Näytän tekevän? Yleisö: tallentaminen tiedoston kaikki tiedot, jotka käyttäjä on antanut. DAVID J. MALAN: Joo, juuri, tämä on uusi tapa että näemme kaksi, Toinen piirre C, jolloin voin luoda oman tiedostoja. Tähän mennessä lähes jokainen ohjelma olet kirjoittanut on kansalaisuudeton. Heti kun se on tehty käynnissä, se on siinä. Ei ole muistia tai muistikuvaa siitä. Ei ole tallennettu tiedosto. Mutta jos et halua tallentaa tulo että on tapahtui, kuten pelin tai ohjelman näin, se kääntyy pois voimme tehdä niin. Ja näet tämän lisää vuonna PSET 4 ja jaksossa. Mutta tämä linja 23 olennaisesti luo tiedosto nimeltä students.csv. Ja ehkä nähnyt tämän ennenkin. Vaikka et ole koskaan opiskellut CS ennen, CSV on pilkulla erotettuna muuttujia. Se on kuin hyvin köyhän versio Excel-tiedoston, mikä tarkoittaa, että se voidaan avata Excel ja Apple numerot, ja se on rivejä ja sarakkeita. Mutta se ei ole omaa muodossa, kuten Microsoftin tai Applen. Se on vain pilkkuja erottamalla arvot että näemme hetken kuluttua. Ja ota arvaus. Linjassa 23, aivan Lopulta minun toinen väite tähän uuteen toiminto nimeltään f avoinna tiedosto auki on w. Mikä mahtaa W tarkoittavat? Joo? Yleisö: Sen avulla voit kirjoittaa tiedostoon? DAVID J. MALAN: Sen avulla voit kirjoittaa tiedostoon. Joten siellä on pari vaihtoehtoja että voimme plug täällä. Mutta jos haluat vain lukea tiedosto, joka on katsoa sitä ja lukea sen muistiin, voit vain käyttää lainaus lainaus päättyy "R". Jos haluat kirjoittaa tiedosto, käytät lainaus lainaus päättyy "w". Mukana on myös liittää ja pari muutakin jos haluat muokata olemassa olevia tiedostoja. Nyt aiomme pitää nähdä tämä asia, niin me palaamme linja 24. NULL, se kääntyy pois, on erityinen arvo voidaan palauttaa tiettyjä toimintoja jos jotain on mennyt wrong-- jos tiedostoa ei ole olemassa, jos olet loppuu muisti, tai joukko muita virheitä. Mutta nyt, haluan vain olettaa, että tämä on vain tavanomainen virheentarkistus. Täällä linja 26, olen iteroimalla 0-3 kaikkia oppilaitani. Ja tämä on tavallaan eräänlainen Uuden toiminnon, fprintf, mutta ota arvaus. Jos printf on vain tulosta muotoiltu merkkijono, mitä fprintf luultavasti tarkoittaa? Yleisö: Tulosta tiedostoon. DAVID J. MALAN: Tulosta muotoiltu merkkijono tiedostoon. Sitähän lisää f keino on tiedosto. Ja uusi ensimmäinen väite on oltava muuttuja, joka edustaa tiedosto. Sitten vain formaatti string kuten printf. Ja vaikka tämä syntaksi on uusi, tämä vain tarkoittaa kytke opiskelijan nimi, plug-in opiskelija asuntolan, ja sitten kanssa fclose, sulje tiedosto. Ja sitten lastly-- tämä on uusi ja me palaamme tähän ennen long-- Olen vapauttaa opiskelija syistä tapahtui ylhäällä siellä. Mutta tulemme takaisin sen, että ennen long-- se johtuu siitä, miten GetString on itse asiassa työskentelevät alla huppu. Joten ottaa vilkaista täällä. Jos kirjoitan ls minun hakemistoon, huomata, että en on tiedosto nimeltä students.csv, vain ole siellä, ei ole olemassa. Jos siis nyt kokoamaan tämän ohjelman, tehdä structs-1. / Tietueet-1, ja aion mennä eteenpäin ja kirjoita Andi, joka asuu Berkeley Yalen. Aiomme olla Rob jotka asuu Thayer näinä päivinä. Ja nyt keksiä missä on, mielestäni, Maria on Mather, jos olen muistanut oikein. Joten mitään ei tunnu tapahtuvan. Mutta jos kirjoitan ls nyt, on students.csv. Mennään eteenpäin ja avoin students.csv. Tämä on jälleen hyvin kevyt tiedostomuoto. Mutta olen yksinkertaisesti antoi yleissopimus että minulla on kaksi riviä ja sarakkeita. Ensimmäisessä sarakkeessa on ihmisten etunimet. Toinen sarake on opiskelijan asuntolan, tai korkeakoulussa, tai talon, tai vaikka mitä. Ja nyt olen tallentanut tämän pysyvästi tiedostoon. Joten se ei ole kaikki, että mielenkiintoinen. Mutta tämä on vain ponnahduslauta nyt , että voi jatkua tiedot pysyvästi. Katsotaanpa nyt, mitä enemmän voimme tehdä näitä ja muita ominaisuuksia. Mutta ensin kysyttävää? Se oli paljon, ja se oli nopea. Mutta näet paljon enemmän PSET 4, samoin. Joo? Yleisö: Onko olemassa tapa jatkaa lisäämällä nimiä tiedoston? DAVID J. MALAN: Hyvä kysymys. Onko tapa jatkaa Nimien lisääminen tiedoston? Kyllä. Ja itse asiassa, jos lopetat up uudelleen tiedoston avaus käyttäisit lainaus lainaus "" varten append, joka olisi vain lisätä uuden rivin, Uusi linja uudestaan ​​ja uudestaan, tarkalleen. Hyvä kysymys. Muita kysymyksiä? Joo? Yleisö: Jos suoritit ohjelma uudelleen juuri nyt, olisi se pitää lisätä nimet tiedostoon tai olisiko avata uuden tiedoston? DAVID J. MALAN: Ah, hyvä kysymys. Jos juoksi ohjelman uudelleen oikea nyt, ehkä kirjoittanut uudet nimet, olisi se lisää tiedosto tai korvata tiedoston? Jälkimmäinen, koska olen et käytä append tilassa. Ja koska olen vain sokeasti tiedoston avaus kirjoittamista varten, se vain menee korvata tiedoston. Joten haluan todellakin tarvitsee vain liittää, jos haluan todella olla pitkällä aikavälillä tietokanta. Nyt CSV on hyödyllinen, suoraan sanottuna, vaikka sillä kuten jos olet writing-- ja me lopulta nähdä tämä myöhemmin lukukauden kun käytämme CSV-raportit voivat muihin tarkoituksiin. Jos haluat tallentaa kaikki ihmiset jotka ovat rekisteröityneet jostakin tapahtumasta, tai rekisteröitynyt oman opiskelija ryhmä, tai jotain, datan tallentamisen tällaisessa muotoa on erittäin kätevä. Koska kirjaimellisesti, jos en olivat lataat tämän tiedoston. Voisin double-- ja nyt itse kokeilla tätä jos minulla on Excel tai Numerot täällä. Aion hiiren kakkospainikkeella tai Control-osoita minun arkistoida. Oho. Hiiren kakkospainikkeella tai Control-osoita minun arkistoida. Tule, minun hiiri ei ole yhteistyötä. Download-- Aion ladata kaikki tiedostot täällä niin vain jotta voin napata tämä yksi. Ja katsotaan, jos tämä toimii students.csv-- ensimmäistä kertaa Olen aktivoitu. Nyt he haluavat nähdä minun yhteystiedot. Nyt minun täytyy rekisteröityä. Katso, miten helppoa se on käyttää CSV-raportit voivat? Kyllä, pitää sen ajan tasalla. OK, nyt olemme valmiita luokan. OK, oi, mitä uutta? OK, sulje. Se oli maaginen. OK, nyt meidän on päivitettävä. Ja nyt, se unohtanut, mitä tiedosto Olen alun perin avannut, mutta mitä a-- siellä mennään. OK, joten nyt meillä on Excel-tiedoston. Kiitos. OK, joten mitä tein oli helppoa. Tietenkin olisin voinut esiasennettuna Excel- tai numerot, tai mitä ohjelmaa. Mutta tämä on mukava, koska nyt voin manipuloida tiedot vakiomuodossa. Joten nyt Katsotaanpa yhteydessä vaihtaa mihin jäimme viime kerralla, jonka oli määrä aloittaa ottaa pois apupyörät. Mutta ensin sinun ei nähdä tämän aikaisemmin lounas jälleen tapahtuu täällä Palo ja Ice Cambridge, Sitar New Haven. Rekisteröidy ylös CS50s verkkosivuilla ASAP liittyä CS50 opiskelijoille ja henkilökunnalle. Joten otimme apupyörät pois maanantain follows-- merkkijono on ilmoitettu CS50s kirjasto jonkin aikaa. Ja se on mukavaa, koska se mahdollistaa voimme puhua muuttujien olevan kokonaisia ​​sanoja ja lauseita ja enemmän. Mutta se osoittautuu merkkijono ei ole olemassa. Se on vain synonyymi, tai alias, että olemme luoneet jotain, itse asiassa on hieman tekninen kutsutaan char *. Ja todellakin, näimme esimerkki ohjelman maanantaina että ei käyttäytynyt aivan kuin odotimme. Tämä oli tiedosto, vertaa-0. Ja muistuttavat, että vertaat-0, jos Olen kääntää maanantain ohjelma ja ajaa vertaa-0 ja kirjoita äiti vuonna pieniä, ja äiti pienillä kirjaimilla uudelleen. Ohjelma vaati I Kirjoita eri asioita, vaikka äiti, kaikki pieniä, on sama visuaalisesti. Joten mikä oli lyhyt vastaus miksi tietokoneen ajattelee nämä kaksi merkkijonoa ovat erilaisia? Joo? Yleisö: [äänetön] DAVID J. MALAN: Oikea. Niin, äiti, ensimmäistä kertaa Kirjoitan sen, ollaan tallennettu jonnekin tietokoneeni muistia, mutta eri paikassa kuin toinen kerta, kun kirjoitat äiti. Nyt se varmasti voitaisiin optimoida. Tietokone voi olla fiksu ja ymmärtää nämä kaksi merkkijonoa, hei, he identtisiä. Saanen ei tarpeettomasti säilytä sitä. Mutta tietokoneet eivät tee sitä optimointi, ellet kerro heille. Joten, oletuksena, he juuri menossa päätyä kahdessa eri paikassa muistiin. Ja niin olla selvempi, kun vertasimme kaksi merkkijonoa, ensimmäinen oli nimeltään s, toinen oli nimeltään t, mitä nimenomaan oli I verrataan täällä line 13? Joo. Yleisö: Se on paikka muistiin että muuttuja osoittaa. DAVID J. MALAN: Aivan, olin vertaamalla paikka muistiin että nämä muuttujat viittasivat. Joten erityisesti, jos äiti oli tavu numero 1, ja 2, ja 3, ja 4-- koska muistan kenoviiva 0 on oltava aina lopussa. Ja muut esiintymä äiti, m-o-m, oli osoitteessa 10, 11, 12, ja 13. Olin vertaamalla 1, että osoite, että paikalla muistissa, vastaan ​​10, joka on tietenkään ole sama. 1 ei ole 10. Joten tämä on mukavaa, että se on melko yksinkertainen. Mutta se on ongelmallinen sikäli kuin emme voi näyttää verrata jouset. Niin fundamentally-- ja tällä alhaisella tasolla, jos halusi toteuttaa ohjelma verrata kaksi erillistä sanaa, jotka käyttäjä on kirjoitettu laatua, he riviin char varten char, vain yleisesti, mitä meidän täytyy tehdä, ilmeisesti? Se ei ole riittävää vain Katso näitä kaksi osoitetta. Mitä meidän pitää tehdä? Joo? Yleisö: kerrata kautta string [kuultavissa]. DAVID J. MALAN: Joo, katsotaanpa kerrata läpi merkkijono. Katsotaanpa käyttää silmukka, kun silmukka, tai mitä olet eniten mukava. Ja jos meillä kaksi merkkijonoa jonnekin muistiin, Katsotaanpa jokaisen n Ensimmäinen merkki, jokainen toinen merkki, sitten kolmas, ja neljäs, ja viides, kunnes osuma mitä erityisiä Sentinel arvo? Yleisö: [äänetön] DAVID J. MALAN: Joo, kenoviiva nolla, minkä jälkeen joko merkkijono voimme päättää se on siinä. Olemmeko Hyväksytty jokainen merkki? Jos ei, return false. Jos näin on, return true. Ja niin se on juuri mitä tämä versio Ohjelman vertaa-1.c tekee. Se on sama kuin mitä me Katsoin maanantain paitsi että olen päässyt eroon sanan string-- vaikka että ei ole toiminnallista impact-- kaikki Teen nyt on poistaa joitakin visuaalisia apupyörät, mutta nähdä selvästi, että s ja t ovat osoitteita. Ja sitähän tähti, tähti, edustaa on osoite, joka tunnetaan teknisesti osoittimena. Joten kun Vakuutan s linja 9 ja sanoa char * s, se ei tarkoita antaa minulle merkkijono. Tämä tarkoittaa antaa minulle muuttuja, jonka tarkoitus elämässä on säilyttää osoite. Koska olen aikeissa laittaa osoitteen merkkijono siihen. Ja todellakin, GetString, olla kirkas, ei palauta merkkijonon. Se ei palauta äiti kenoviiva nolla, sinänsä. Mitä GetString erityisesti ja tarkasti palata? Yleisö: [äänetön] DAVID J. MALAN: osoite, osoite ensimmäisen merkin Joissakin merkkijono se on saanut. Ja nyt näemme erityinen avainsana uudelleen. Ja minä viittasi tähän aiemmin. Tämä tulee olemaan hyvä yleissopimuksen että näemme uudelleen ja uudelleen nyt. Olen tarkkailun varmistaa, että s ei ole nolla ja t ei ole nolla. Koska perustuu minun todella nopea mainita aikaisemmin, mitä saattaa merkitä, jos GetString palauttaa ei osoite mutta N-U-L-L, joka on jälleen, joitakin erityisiä arvoa? Yleisö: Virhe. DAVID J. MALAN: Se on virhe. Jotain meni pieleen. Ja mitä tyypillisesti voi tapahtua, erityisesti kanssa strings-- jotka saattavat olla tuntemattomien pituus advance-- ehkä tietokoneet " muisti, ehkä kirjoitit tällaisessa pitkä sana tai lause tai liittää niin valtava essee siellä vain ole tarpeeksi muistia. Ja niin GetString voi palauttaa osoitteen koko juttu, niin se vain palauttaa mitään. Ja se sanoo virhe on tapahtunut palauttamalla erityinen NULL arvo. Se on nolla osoite, niin sanoakseni. Nyt on käynyt ilmi C mukana toiminto, joka tekee sen iterointia. Meillä ei tarvitse toteuttaa tämän kanssa silmukan tai while-silmukka itse. Voimme käyttää toimintoa, nimeltään ytimekkäästi, sekoita comp, tai merkkijono vertailla, jonka tarkoitus elämässä on tehdä juuri näin. Annat sille kaksi osoittimia, kaksi osoitetta, ja se menee osoitteet ja sitten verrata kirjain kirjain, kirjain laatu, pysähtyen vain silloin, kun mikä on totta? Kun intuitiivisesti pitäisi sekoittua Comp lopettaa iteroimalla, vain olla selvä? Kun se osuu kenoviiva 0 joko string, jolloin se voi päättää on kaikki Hyväksytty, tai ei ole ollut ristiriita? Joten, jos me suorittaa tämän nyt ja kokeile meidän pikku-arvo peli, joten varmista vertailla-1, ./compare-1, ja Kirjoita äiti pienillä molemmilla kerroilla. Nyt se on sama asia. Ja jos teen sen uudelleen pieniä ja sitten ehkä isoja. Nyt se todellakin erottaa pien- ja suuraakkosten välillä. Joten kaikki, että kova tai maaginen, mutta se ei nyt selittää mitä tapahtuu alla huppu. Mitä enemmän voimme poimia tällaisesta oppitunnin? Joten katsomaan tätä. Aion mennä eteenpäin ja kirjoittaa nopea ohjelma tässä kutsutaan copy-0. Ja nyt mennään eteenpäin ja todella Tehdään this-- kopio-0, katsomaan mitä minulla täällä. Haluan ensin kertoa käyttäjälle, sanoa jotain. Sitten saan merkkijono ja minä varastoidaan sen s. Sitten minä tarkistaa, jos s on yhtä kuin vastaa NULL, vain palata 1. Joten tämä on vain standardi virheentarkistus. Mitään mielenkiintoista on tapahtunut. Ja itse asiassa, jos me eroon virhe tarkistus-, tämä näyttää viikolla 1 koodi hetkellä. Mutta olen alkanut saada vähän paremmin siitä. Nyt linja 16, viikko sitten, ehkä jopa pari päivää tai minuuttia sitten, saatat sanoa linja 16 on luodaan muuttuja nimeltä t ja kopiointi s siihen. Ja se on täysin kohtuullinen takeaway. Mutta tarkemmin nyt. Mitä tapahtuu linja 16? Mitä on tulossa kopioidaan oikealta vasemmalle? Joo? Yleisö: on t saada osoitteen s? DAVID J. MALAN: Aivan, t on saada osoitteen s. Joten tehtävä selväksi nyt, jos menen takaisin tämän aikaisemman esimerkin ja minä vetää ulos mitä olen kirjoittanut. Ja mitä olen kirjoittanut in-- tässä s, ja tässä on mitä olen kirjoittanut jossain muisti, äiti ja sitten kenoviiva 0 joka on lisätty minulle. Mitä minä tallennettu täällä, muistaa, tämä on paikassa 1, 2, 3, 4, tämä on mitä tällä hetkellä n. Joten jos linjalla 16, sanon anna minulle toinen muuttuja nimeltä t ja tallentaa klo arvon s, mitä saa säilyttää täällä ei äiti vaan vain numero 1. Joten jos katsomme eteenpäin tässä ohjelmassa nyt, mitä tulee tapahtumaan? Niin huomaa, että on olemassa tämä toiminto saatat ovat käyttäneet tätä jonkin aikaa sitten Caesar, tai Vigenere, tai ehkä ei ollenkaan. Väitän minun printf, olen menossa hyödyntää kopion t. Ensimmäinen rivi 19, nopea järki tarkista, strlen tarkastukset pituus t. Koska en halua yrittää hyödyntää jotain jos ei ole merkkijono siellä. Jos käyttäjä painaa Enter, ei ole mitään hyödyntää. Joten en halua tehdä linja 21. Joten linja 21 capitalizing joka kirjeen, ilmeisesti, t? Yleisö: m? DAVID J. MALAN: Se näyttää kuten se on kopiointi kumpi? Yleisö: m. DAVID J. MALAN: Tuota, m. OK, joten ensimmäinen m, koska ilmoitus, että olen ohimennen toupper, joka jos et ole koskaan nähnyt sitä se on vain toiminto hyödyntämään sen panos. t kiinnike nolla tarkoittaa antaa minulle nolla luonnetta t. Ja niin miten tämä kuva muutos, olla selvä? Mitä pitää saada kirjoitettu uudelleen tai muuttaa suhteen s ja t ja äiti kenoviiva nolla. Yleisö: [äänetön] DAVID J. MALAN: Joo, joten tämä yksi täällä yksinkertaisesti tarvitsee saada muuttunut to-- korjata this-- pitää saada muuttunut pääoman m. Mutta nyt, katso myöhemmin ohjelma, jos olen tulostaa s ja t kuin siivoan täällä, katsella mitä tapahtuu tulostaa s ja t. Niin tehdä kopio-0, ./copy-0. Anna minun mennä eteenpäin ja kirjoita vuonna äiti on pienillä. Huomaa, sekä alkuperäisessä kopio on aktivoitu. Miksi? Hyvin, s ja t ovat molemmat osoittavat, jos haluatte, sama murikka muistia. Ja rehellisesti, tämä on tulossa todella uninteresting-- se että käytämme osoite nolla täällä. Tarkoitan, en todellakaan välitä jossa tavaraa on muistissa. Anteeksi pyyhkimällä hieman liikaa. Mutta en oikeastaan ​​välitä jossa asiat ovat muistissa. Ja niin, todellakin mitä ohjelmoijat taipumus ajatella on, että kun puhut osoitteen, tai osoitin, joka välittää missä se on muistissa. En välitä, jos se on tavu yksi tai miljardi. Minä vain välitä, että tämä muuttuja on tehokkaasti osoittaen että murikka muistia. Ja niin, vastedes, pikemminkin kuin saivarrella yli mielivaltaisen muistin osoitteet, katsotaanpa vain alkaa tehdä osoittimia osoittimia, kuten nuolet. Joten mitä s ja t todella ovat, Tämän ohjelman mukaisesti, koska miten Loin t, se on vain kaksi erillistä muuttujaa osoittaen samalla murikka muistia. Ja emme välitä, missä ne ovat. Joten voimme abstrakti pois, että yksityiskohtia. Joten miten voin korjata tämän? Jos haluan kirjoittaa version kopio ohjelma, joka todella kappaletta merkkijono ja aktivoi vain kopio, vain intuitiivisesti, mitä täytyy olla ainesosa meidän ratkaisu? Yleisö: [äänetön] DAVID J. MALAN: Tarvitsemme mitä? Yleisö: murikka muistia. DAVID J. MALAN: Tarvitsemme toinen kimpale muistia, eikö? Emme tiedä, miten tehdä sitä vielä, välttämättä. Mutta olen sellainen täytyy tämän tapahtua niin että alkuperäinen äiti pienin kirjaimin päätyy että ylimääräinen murikka muistia. Ja sitten kun muutan kopio, minä eivät halua muuttaa tämä kopio täällä. Olen sen sijaan haluat muuttaa vain tämä kopio niin että alkuperäinen on ennallaan. Niin, Katsotaanpa, miten voisimme tehdä tämän. In copy-1, joka on jo viety kommentti, mutta ei kommentoi verkossa. Me sen sijaan tehdä following-- nämä linjat ovat samat, saat minut merkkijono ja kutsuvat sitä s. Mutta nyt Katsotaanpa yksi kaikkein monimutkainen mutta viimeinen monimutkaisuus jonkin aikaa, linja 16 tekee juuri tämän. Joten jos mukava kanssa kuva me vain drew-- anna minulle uusi kimpale muistia, kopioida kaiken siihen, Katsotaanpa, miten voimme kääntää, että koodin. Joten linja 16, vasemmalla puolella, char * t antaa minulle tämä jos tänne. Siinä kaikki se tekee. Oikealla puolella, m Alloc, tai malloc, on muistin jakamista, Super fancy, arvoituksellinen tapa vain sanoa antaa minulle palan muistia. Kuinka paljon muistia tarvitaan? No, on tavallaan iso ilme. Mutta katsotaanpa, mitä tässä sanotaan. Joten tämä tietenkin on antaa minulle merkkijonon pituus n. Niin, äiti olisi mitä? Joten vain kolme, eikö? äiti on kolme merkkiä. Sinun ei lasketa kenoviiva nollaan, kun puhua pituus merkkijono on todella ihmisen näkyvissä kirjaimet. Niin äiti, joten tämä antaa minulle 3. Mutta hetkinen, olen nyt lisäämällä 1. Miksi todella haluavat jakaa 4 tavua eikä vain 3? Joo? Yleisö: Sentinel arvo? DAVID J. MALAN: Aivan, että Sentinel arvo. Sillä kenoviiva nolla, Tarvitsen 4 tavua yhteensä. Joten minun on pituus merkkijonon plus 1. Ja sitten vain hyvä measure-- vaikka tätä järjestelmää, se on aina olemaan 1-- sanon moninkertaistaa tätä koko char. Osoittautuu sizeof on operaattori C että vain kertoo tavujen, joka on vaaditaan tiettyjen tietojen tyyppi. Se ei toimi paneelit, tyypillisesti, joskus se tekee. Mutta yleisessä tapauksessa ei. Mutta se kertoo minulle, kuinka monta tavua nieriä on, joka osoittautuu on aina 1. Joten tämä on kuin kertomalla 1. Joten Super arvoituksellinen etsivät riviä koodia. Mutta kaikki se on antanut minulle kimpale muistia. Mutta se näyttää olevan kopiointi mitään tuohon muistiin? Ei vielä. Ja niin mitä voin verkossa 22, ja 23, 24, 25, no, minä yksinkertaisesti tehdä tämän. Ja tämä on tavallaan old school kamaa nyt. Tämä on kuin PSET 2, jossa olet vain liikkuvat asiat noin muistiin tai pikemminkin jouset. Joten olen iteroimalla 0 merkkijonon pituus n. Ja olen kopiointi i: nnen merkin S osaksi i: nnen hahmo t. Ja koska minä, ohjelmoija, tehty Muista jakaa täsmälleen yhtä monta tavua kuten minä tarvitsen, se on täydellinen yksi-yhteen suhde. Ja voin kopioida äiti vuonna pieniksi uuteen yhteen. Ja sitten lopuksi, teen tätä linjaa. Ja niin vaikutus on vain hyödyntää t täällä. Niin paljon imeä, mutta jos vain harkita mitä todella tapahtuu on alla huppu on vain liikkuvat nämä tavua noin, kaikki, tarvitaan ratkaista tämä ongelma on vain antaa meille tämän murikka muistia. Nyt riski ylivoimainen, haluan näyttää Toinen esimerkki, joka on lähes identtinen, lukuun ottamatta tämä koodiriviä. Joten tämä on hakkeri versio tämän ohjelman, jos haluatte. Mutta Haluan vain polttaa se mitä tapahtuu. Rivi 24 aiemmin t kiinnike i saa s kiinnike i. Nyt olen muuttuvat tämän paljon arvoituksellinen tähti t plus 1 vastaa tähti s plus 1. Joten mitä tapahtuu ja miksi meillä on tähti merkki? Olemme nähneet tähti ennen, ja sitä käytetään eri tavalla täällä. Olemme aiemmin näimme char *, nyt näen tähti alussa, ja se on OK. Koska se osoittautuu meillä voi sellaista päätellä vain Näistä ensimmäinen periaatteita mitä tapahtuu. Joten vain tehdä selväksi, mikä on s? Viime viikolla se oli merkkijono. Se ei riitä enää. Mikä on s, erityisesti? Yleisö: [äänetön] DAVID J. MALAN: Se on osoitin. Se on osoite Ensimmäinen merkki me kirjoitetaan. OK, mikä on t? Yleisö: [äänetön] DAVID J. MALAN: osoite ensimmäisen tavun t, että murikka muistia uudelleen. Joten käy ilmi, että kun me kerrata 0 jopa merkkijono length-- ensinnäkin, i alkaa klo 0, koska Tämän vanhan koulun silmukka asia. Joten yksinkertaisuuden, katsotaanpa olettaa, että ensimmäinen rivi koodia on oikeastaan ​​vain tämä, oikea. Jos i on nolla, lisäämällä nolla jotain oletettavasti ei tule vaikuttaa. Joten mitä on tämä sanonta? On käynyt ilmi, että tähti toimija tässä yhteydessä on dereference operaattori, joka on vain hieno tapa sanoa mennä seuraavaan osoitteeseen. Joten jos s on osoite ensimmäisen merkki tässä kimpale muistia, * S tarkoittaa sinne. Ja koska olemme laadittu kuva tällä tavalla, voit hyväksyä Seuraavat henkinen malli. Jos tämä on s, ja sanot * s, * s ikään kuin liukumäet ja tikkaat, jos muistat peli lapsuudesta, on kuin seurata, että nuoli ja mennä osoitteeseen. * T on sama asia. Niin alkaa täällä, siirry sen kimpale. En voi vain hyödyntää tämän näytön näin. * T tarkoittaa mennä tänne. Ja sitten, silmukka on vain sanomalla siirtää tätä merkkiä täällä, siirtää tätä merkkiä täällä, siirtää tämän merkin tässä. Mutta miten voin tehdä, että incrementation? Minun täytyy perua, mitä juuri poistettu. Tämä on mitä yleensä kutsutaan osoitin aritmeettinen, joka tarkoittaa matematiikka osoitteita. Jos tässä silmukka, Jatkan monesko I, ja s on osoite ja t on osoite, jos vain pitää lisätä 1, että vain sitä jatkaa eteenpäin, ja eteenpäin, ja eteenpäin muistissa. Se on kuin Oxford Street, katu että CS rakennus sijaitsee. CS rakennukset on 33 Oxford Street. Joten jos olit tehdä 33 Oxford Street plus 1, joka vie sinut 34 Oxford Katu, sitten 35 Oxford Street, sitten 36 Oxford Street, riippumatta näiden rakennukset todellisuudessa ovat - jos ne ovat olemassa. Ja niin, että kaikki teemme täällä osoitin aritmeettinen. Joten se on erittäin mystistä tavalla ilmaista itseämme. Mutta kaikki, mitä tapahtuu alla huppu on vain seuraava näistä osoitteista, kuten seuraava kartta, jos haluatte, tai seuraavat nuolia kuten olemme piirretään ruudulle. OK, paljon sulattaa. Kysymyksiin on syntaksi, käsitteitä, osoittimia, malloc, tai vastaavat. Joo, täällä ensin. Yleisö: Missä että sanoo * t vastaa toupper * t, on, että aikoo hyödyntää kaikki kirjaimet tai just-- DAVID J. MALAN: Ah, todella hyvä kysymys. Joten tätä linjaa täällä, 31, tämä tulee hyötymään ensimmäinen kirjain tai kaikki kirjaimet. Joten vastata tähän menemällä takaisin ensimmäiset periaatteet. Ja ensimmäiset periaatteet tässä tarkoitan vain mennä perusmääritelmät ja mitä mukana. Joten toupper on funktio että aktivoi merkkiä. Siinä kaikki. * T tarkoittaa mennä first-- Siirry osoitteeseen t. Joten, kuvassa, jos tämä on murikka muistia me kohdennetaan malloc, ja tämä on t, * t tarkoittaa täältä. Samalla olet ohimennen että arvo, pieniä m että toupper, saat takaisin pääoma M, missä olet laittoi pallon? Olet laskemisesta sitä, että samassa paikassa. Ja niin, että logiikka näiden perusmääritelmiä se on vain hyödyntäminen ensimmäinen kirjain ellet kerrata I tai silmukan tai while-silmukka, se ei tule tehdä mitään enemmän kuin kysyt sitä. Hyvä kysymys. Joo? Yleisö: Miksi käytät dereference tapa eikä array? DAVID J. MALAN: Ah, hyvä kysymys. Miksi käytät dereference menetelmä sijaan array menetelmä? Mitään erityistä syytä, olla rehellinen. Ja, itse asiassa, tämän Tällainen esimerkiksi oikea, Olen vain väittäen tehdä ohjelma monimutkaisempi, lisää silmät lasitus yli, ihmiset ovat tarkkailun koska tämä näyttää erittäin mystistä, mutta vaikka se tekee saman asian. Ja niin, rehellisesti, tämä on tarpeettoman visuaalisesti monimutkainen ratkaisu ongelmaan. Se on edelleen hyvä suunnittelu, viidessä viidestä suunnittelun, onko se on kiinnike merkintä tai osoitin merkintä. But-- erityisesti uusista myöhemmin kurssin PSET 5 kun toteutamme että sanakirjaa Olen maininnut pari times-- me todella kiinnostaa alhainen muistiosoitteita että me todella ymmärtää mitä on meneillään. Mutta, nyt, käy ilmi, että tämä koodiriviä tässä hakasulkeet ei ole edes olemassa. Ne ovat mitä kutsutaan syntaktisia sokeria, joka on vain outo viileä tapa sanoa kääntäjä muuntaa hakasuluissa olevan että matemaattinen lauseke. Joten se on ihmisen yleissopimus pystyä vain kirjoittaa nämä erittäin käyttäjäystävällinen suluissa. Mutta mitä kääntäjä, clang, on todella tekee tahansa voit kirjoittaa mitä korostetaan linja 24, alla huppu se on todella muuntaa sen tähän. Se on vain enemmän miellyttävää kuin ihmisen lukea ja kirjoittaa koodia rivi 24. Mutta lopulta ne apupyörät liian irtoa kun oman mukavuuden vahvistuu. Selvä, joten muistuttaa sitten, että tämä oli tavallaan suurin ongelma törmäsimme. Ja sitähän herätti tämä koko hemmetin keskustelua viitteitä, ja osoitteet, ja kopiointi asioita. Se oli, koska me kompastui tämä tyhmä, tyhmä kysymys, jolloin Olen toteuttanut logically-- Lauren täällä demo ja appelsiinimehu vuonna milk-- täydellisesti algoritmisesti oikea toiminto ja vaihtamalla kaksi muuttujaa " arvot, mutta hemmetin asia ei ollut pysyviä, tai pysyvä, vaikutus minun koodi. Ja miksi se oli? Lyhyesti sanottuna, miksi tämä täytäntöönpano swap loogisesti oikea, mutta sillä ei ole vaikutusta muuttujia, jotka välitetään se, kuten x ja y pääasiallisten? Mikä oli ydin kysymys? Joo? Yleisö: Koska vaihteleva tehty kopiot muuttuja pass Läpitoiminto. DAVID J. MALAN: Aivan, kun ohitat muuttujia funktio, tai väitteitä osaksi toiminto, he ohi kopio, joka tarkoittaa, saat samanlaista näköinen kuvio bittiä sekä x ja y, kutsutaan täällä ja b. Ja voit tehdä mitään haluat näiden kopiot, mutta he aikovat ei ole Vaikutus kutsuvan toiminto. Ja itse asiassa me kiinnitti että kuva ruudulla, Recall viime kerralla, jolloin jos todella miettiä, mitä meneillään alla hood-- jos tämä on tietokoneen muistiin, ja täällä on kimpale muistia käytetään pääasiassa tämä on kimpale muistia käytetään swap, ja niin vaikka tärkein on kaksi muuttujaa, x ja y, swap saattaa olla samanlainen näköinen arvot, jotka molemmat ovat 1 ja 2, mutta ne ovat täysin eri paloina muisti. Tarvitsemme siis ratkaisu tähän. Ja rehellisesti, näyttäisi siltä, ​​että me nyt on ratkaisu tähän ongelmaan, oikea. Jos meillä on nyt mahdollisuus manipuloida asiat Poiketen osoitteiden ja, tavallaan liukumäet ja tikkaat tyyli, toimi nuolet ja mennä minne haluamme muistiin, emmekö voisi ratkaista tämän ongelman kulkee päässä tärkeimmistä vaihtaa ei arvoja haluamme swap, mutta vain intuitiivisesti mitä voisimme kulkea vaihtaa sijaan? [Väliin ÄÄNTÄ] DAVID J. MALAN: Miksi emme vain siirtää sen osoitteet, eikö? Miksi emme anna swap aarrekartan, jos haluatte, joka johtaa sen todelliset arvot x ja y. Katsotaanpa swap, todella muuttaa Original bittiä sijasta vain ohimennen kopioita bittiä. Ja niin, itse asiassa, se on mitä olemaan ratkaisu. Tämä versio tässä selvästi huono ja puutteellinen. Ja nyt, ensi silmäyksellä, se vain näyttää kuin lisäsimme nippu tähtiä satunnaisesti ja keskitti sormet että se koota. Mutta se nyt koota. Mutta katsotaanpa mitä ne oikein ovat. Ja valitettavasti laatijat C olisi voinut valita toisen symbolin tehdä tästä hieman selkeämpi, mutta tähti operaattori on eri merkitys kahdessa eri yhteydessä. Ja olemme nähneet molemmat, mutta nyt erottaa. Joten ylös huipulla siellä, kun olen muuttanut ja b olemasta int n huono versio int tähtiä, ja b, aikaisemmin, oli kokonaislukuja. Mitä ovat a ja b nyt hyvä, vihreä versio? He osoitteet. Osoitteet mitä, olla selvä? Osoitteet kokonaislukujen. Niin että olen sanomalla int tähti välineet tämä on osoite kokonaisluku, erityisesti. Joten nyt ilmoituksen riviä koodia, jotain muuta on muuttunut liikaa. TMP pysyy samana, koska se on vain väliaikainen kokonaisluku, ei muisti taikuutta siellä. Mutta tarvitsee nyt tähti. Ja, itse asiassa, joka muut maininta ja b, huomaat, että kaikki se muuttuvat punaisesta vihreäksi on että olen prefixing nämä muuttujat tähtien kanssa. Koska en halua kopioida ja b. Koska jos vain kopioida ja b ja swap ja b, mitä olen todella vaihtokauppa? Vain osoitteet, haluan vaihtaa mitä noita osoitteita. Haluan mennä sinne. Ja niin tähti operaattori sisällä minun toiminto, ei sisällä parametriluetteloon tarkoittaa menet osoitteet ja todella muuttaa näitä arvoja. Joten mitä kuva nyt näyttää sijaan. No, jos sen sijaan olen ohimennen in ja B 1 ja 2-- Olen itse täytyy lisätä yksi muu määritelmä täällä. Joten olettaa, että tämä möhkäle muistia on paikassa 10. Tämä on paikka 11, mutta tämä on vähän yksinkertaistamista, Minulla on nyt kaksi vaihtoehtoa tehdä välitän X ja y tai voin siirtää niiden osoitteet? Jos kuljen heidän osoitteet näin, minä vain nyt täytyy toteuttaa swap kohti vihreää koodi niin että kun se näkee, ja kun se näkee b, se ei vain kopioida ja b ja siirrä maito ja appelsiinimehu. Maito ja appelsiinimehu metafora nyt hajoaa, koska ne ovat kupit nesteen eikä karttoja. Meidän sijaan täytyy mennä käsitellä 10 ja me täytyy mennä käsitellä 11, ja sitten suorittaa että vaihtamalla logiikka. Joten logiikka on sama, mutta Tarvitsemme hieman eri tavalla saada yhteys näiden muuttujien. Ja niin lopulta, mitä Ohjelma on näyttää tämä. Vuonna swap.c kirjaimellisesti kopioitu ja liittänyt vihreä versio. Mutta minun täytyy tehdä yksi muutos. Se ei ole riittävää vain vaihtaa swap. Mitä muita koodiriviä minun täytyy muuttaa? Joo? Yleisö: Jos se vie väitteet. DAVID J. MALAN: Missä se tekee väitteen. Jos siis siirry jopa tärkein, I voi vain kulkea x ja y, ja, lupaan, viimeinen pala uusia syntaksin tänään. Minun täytyy kulkea ei X ja y mutta osoite x ja y. Ja se osoittautuu, symboli että laatijat C valitsi on jos käytät et-merkki täällä, ei sekoittaa ja verkon peiton et-merkki, jos käytät et-merkki täällä ja et-merkki täällä, tämä keksii sinulle, mitä osoitteen x, ehkä se on 10, mikä on osoite y, ehkä se 11, ja kulkee kuin sijasta. Niin paljon imeä kaikki kerralla. Mutta katsotaanpa nyt nopeasti meidän jäljellä neljä minuuttia jossa asiat voivat mennä pieleen. Ja syrjään, todella Otin tämän kuvan, TF otti tämän kuvan vuosi tai kaksi sitten. Joten tämä on takaisin nurkka Eliot ruokasalissa. Osoittimet ovat ehkä vaikein aihe, että me kattaa CS50. Joten jos olet huolissasi lajitella kaltevuus on kuin ehkä se enemmän jääkiekkomailasta näin, ymmärtää olemme tavallaan loppusuoralla huippu ehdot käsitteellinen monimutkaisuus. Ja minä tuoda tätä valokuva, koska vannon Jumalalle, syksyllä 1996, kun otin CS50 minun opetus muiden, Nishat Mehta, hän istui minua alas nurkassa Eliot D. Hall lounaalla, tai päivällinen, tai jotain yrittää auttaa minua ymmärtämään osoittimia. Ja tämä on missä olin viikon kuluttua se otettiin käyttöön vuonna luento kun Olen vihdoin ymmärtänyt osoittimia. Ja olen toiveikas, että tämä klikkaa paljon nopeammin sinulle. Mutta ymmärtää tämä ehdottoman keskuudessa kehittyneempiä aiheita teimme. Mutta se on yksi tehokkaimmista. Ja kun saat sen, se on oikeastaan ​​kaikki juuri menossa vihdoinkin yhdessä. Joten varma se ei täytyy kaikki uppoavat tänään. Joten tässä on viimeinen ohjelma aiomme tarkastella. Ja aiomme päättyy nopea kolmen minuutin claymation tekemät ystävämme, Nick Parlante. Tässä ohjelmassa, että kaksi parasta linjat ilmoittaa muuttujan x ja y. Jotka molemmat ovat osoitteita kokonaislukujen, AKA osoittimia. Sitten käyttää riittävästi muisti tallentaa int ja tallenna osoite Tämän muistin x. Niin, se on vieläkin helpompaa kuin esimerkiksi ennen. Anna minulle neljä tavua muistia, se koko int, ja esittää, että osoite X. Tämä linja tässä tarkoittaa Siirry osoitteeseen X ja laittaa merkitys elämä, numero 42 siellä. Mutta tämä linja huolestuttaa minua. Star y tarkoittaa mennä osoitteeseen y, ja laittaa epäonnen luku 13 siellä. Miksi on vaarallista, tässä vaiheessa vuonna story-- joskin nopeasti kertoi meidän hiipuu minuutissa here-- miksi se huono minun sanoa, mene osoitteeseen y? Yleisö: Et ole [kuultavissa]. DAVID J. MALAN: En ole laita mitään y. Joten mikä on arvo y, tässä vaiheessa tarina? Meillä ei ole aavistustakaan. On joitakin roskat arvo ja eikä Binky tiedä. Jos voisimme päättyy tämän merkinnän. [VIDEOTOISTOSTA] Hei, Binky, herätä. On aika osoitin hauskaa. -Mikä tuo on? Lisätietoja viitteitä? Voi, Goody. -No, Päästä alkuun, kai olemme menossa on pari viitteitä. -OK. Tämä koodi jakaa kaksi osoitinta joka voi viitata kokonaislukuja. -OK, Hyvin näen kaksi osoitinta, mutta ne eivät näytä olevan osoittaa mitään. -Oikein. Aluksi Nata eivät viittaa mihinkään. Mitä he viittaavat ovat nimeltään pointees ja asettamalla ne on erillinen vaihe. -Voi, Oikea, oikea. Tiesin sen. Pointees ovat erillisiä. Joten miten jakaa pointee? -OK, Hyvin tämä koodi allokoi uusi kokonaisluku pointee, ja tämä osa sarjaa x osoittamaan sitä. -Hei, Että näyttää paremmalta. Joten tee se jotain. -OK, Minä epäviittausongelman osoitin X Tallenna numero 42 osaksi pointee. Tämän temppu, minä tarvitsen taikasauva on dereferencing. -Sinun Taikasauva on dereferencing? Uh, että se on suuri. -Tämä On mitä koodi näyttää. Otan vain perustanut numero and-- [POP SOUND] Hei, katso siellä se menee. Joten, tekee dereference X seuraavasti nuoli pääsy sen pointee. Tässä tapauksessa, tallentaa 42 siellä. Hei, kokeile sitä tallentaa numero 13 kautta muiden osoitin, y. -OK. Otan vain mennä tänne y, ja saada numero 13 perustaa. Ja sitten ottaa sauva on dereferencing ja just-- [Summeriäänen] -Voi, Hei että ei toimi. Sano, öh, Binky, en ajatella dereferencing y on hyvä idea, koska asetus ylös pointee on erillinen vaihe. Ja en usko meidän koskaan tehnyt sitä. -Hmm, Hyvä pointti. -Joo, Me varattu osoitin, y, mutta emme koskaan aseta se osoittamaan pointee. -Hmm, Hyvin tarkkaavainen. Hei, etsit hyvä siellä, Binky. Voitteko korjata sen niin, että y pistettä samaan pointee kuin x. -Sure, Käytän taikasauvaa osoitin tehtävän. -Onko Se tulee ongelma, kuten ennen? -Ei, Tämä ei kosketa pointees. Se vain muuttaa yksi osoitin osoittamaan samaan thing-- [Poksahdus] --as toiseen. -Voi, Näen. Nyt y pistettä samaan paikkaan kuin x. Niin, odota, nyt y on kiinteä. Se on pointee. Joten voit kokeilla sauva on dereferencing jälleen lähettää 13 yli. -Voi, OK, tässä menee. Hei, katso tuota. Nyt dereferencing toimii y. Ja koska viitteitä jakavat että yksi pointee, he molemmat katso 13. -Niin, Jakaminen, öh riippumatta. Joten, aiomme vaihtaa paikkoja nyt? -Voi, Katso olemme myöhässä. -But-- -Vain Muistaa kolme osoitin sääntöjä. Numero 1, perusrakenne on, että sinulla on osoitin, ja se osoittaa yli pointee. Mutta osoitin ja pointee ovat erillisiä. Ja yleinen virhe on perustaa osoitin mutta unohtaa antaa sille pointee. Numero 2, osoitin dereferencing alkaa osoittimen ja seuraa sen nuoli yli pääsy sen pointee. Kuten me kaikki tiedämme, tämä toimii vain jos on pointee, millaisia ​​saa takaisin lausua numero 1. Numero 3, osoitin toimeksianto kestää yhden osoitin ja muuttaa sen osoittamaan sama pointee kuin toinen osoitin. Niin sen jälkeen tehtävän, kaksi osoitinta tulee kohta samaan pointee, joskus sitä kutsutaan jakaminen. Ja siinä kaikki on sitä, todella. Hei hei nyt. [Lopeta toisto] DAVID J. MALAN: Se on se CS50. Kiitos professori Nick Parlante. Nähdään ensi viikolla. [ELECTRONIC musiikkia]