[Muzikos grojimo] David J. Malan: Tai kaip pirmakursis seminaras šiandien. GERAI. Taigi labai lietinga iš. Tai yra linkęs atsitikti trečiadieniais, bet visi daugiau galimybių Jei turite klausimų šiandien. Taigi pradėkime nuo tikrųjų su vos per akimirką filmas. Bet mes pradėsime Ambicinga kaip visada. Tai yra CS50, ir tai yra 4 savaitės pabaigos. Taigi, jei jūs kada nors stebėjo TV ar kino kuriame Yra keletas kompiuterių ekspertai ir policija, ar FTB, arba kai agentūra bando sugauti kai Priešininkas, gerai, jūs tikriausiai girdėjote posakį "pagerinti" kuriuo ta technikas kažkaip stebuklingai priartinti iki begalybės kiek matyti nusikaltėlius tapatybė arba NL skaičius į net veidrodį mirguliavimas ar kieno nors akis žibėti. Taigi iš tiesų, tegul pažvelgti keletas tokių scenos iš Holivudo. [Vaizdo įrašų atkūrimas] Ok, dabar galime gauti gerą pažvelgti jums. -Laikyk. Vykdyti, kad atgal. -Palauk minutėlę. Eiti į dešinę. -Yra, Užšaldyti, kad. -Per visą ekraną. Ok, užšaldyti, kad. Sugriežtinti ant, kad jūs? -Vector On, kad vaikinas iš galinio rato. -Zoom Į čia šioje vietoje. -Su Tinkamą įrangą, vaizdas galėtų būti išplėsta ir aštrus. -Kas tai? -Jis Yra patobulinimas programa. -Ar Jums aišku, kad iki tokių yra? -Nežinau. Leiskite jį pagerinti. -Enhance Skyriuje A6. -Aš Sustiprino detales, and-- Aš manau, kad yra pakankamai sustiprinti, išleisti jį į mano ekraną. -Aš Sustiprino savo akis atspindys. -ėlis Manimi paleisti tai per Vaizdo didinimas. -Edgar, Galite padidinti tai? -Laikykis. -I've Dirba šioje atspindys. -Someone Anketa atspindys. -Atspindys. -Yra Šiek iš žmogaus veido atspindys. -The Atspindys. -Yra Šiek atspindys. -Zoom Į ant veidrodžio. -Jūs Galite pamatyti atspindys. -Ar Jums padidinti atvaizdą iš čia? -Ar Jums padidinti jį čia? -Ar Tu jį pagerinti? Ar galite jį pagerinti? -Ar Mes sustiprinti tai? -Ar Tu jį pagerinti? -Hold Ant sekundę, aš stiprinti. -Zoom Į ant durų. -Times 10. -Zoom. -Move Vietą. -Daugiau. -Wait, Sustoti. -Stop. -Pause Ją. -Rotate Mums 75 laipsnių aplink vertikalią, prašau. -Stop. Grįžti į dalis apie duris, dar kartą. -Got Vaizdo stipriklis, kuris gali Bitmap? -hey, Gal mes galime naudoti Pradeep Sen būdas pamatyti į langus. -Tai Programinė įranga yra moderniausias. -The Savo reikšmės yra išjungtas. -Su Dešinę kombinaciją algorithm-- -Jis Yra imtasi panaikinimas algoritmai į kitą lygį, ir aš galiu naudoti juos sustiprinti šį nuotrauka. -Lock Įjungimas ir padidinti z ašį. -Enhance. -Enhance. -Enhance. -Freeze Ir sustiprinti. [PABAIGA PLAYBACK] David J. Malan: Gerai, taip visi tie, kurie iš tikrųjų žodžiai. Jie tiesiog suverti kartu A būdas, kad iš tikrųjų tai ne protinga. Ir, tiesą sakant, CS50 ir kursai patinka linkęs sugadinti TV ir filmų daug tau. Nes kai tų kompiuterių ekspertai yra barškėjimas Atskyrimo sąlygų ir sako: išgalvotas dalykų, pavyzdžiui, vektoriai, ir z ašis, ir bet koks kitas numeris tikrai daugiau techniniai terminai, jie tikrai tik apjuostame žodžiai kartu pernelyg dažnai. Ar tai vienas iš mūsų viltis yra ta, kad kaip šalutinis poveikis imtis kursus kaip tai bus daugiau žmonių Pasaulio tikrųjų galėtų sverti ir tiesiog vis tiek šiek tiek įtakoti kokybė ir tikslumas iš tų filmų? Iš tiesų, tegul į realybę išvaizdą. Taigi čia yra darbuotojai nuotrauka Marija, vienas iš mūsų mokymo bičiulių. Ir manau, ji yra įtariamas kažką. Ir dar, ten yra mirgėti kai įrodymu jos akis, arba iš jos akiniai atspindys. Na, jei mes tiksliai taip, kaip filmuose pasiūlyti, kur mes priartinimas ir "pagerinti", tai, kiek informacijos yra Marijos veido kai fotografuojate su tuo originaliu dydžiu. Ir, iš tiesų, jūs galite pamatyti šiuos taškus. Ir tai yra tai, ką yra vadinami pikselių, kad P-I-X-E-L-S, kuris yra tik kvadratinis paprastai kad yra taškas, kad komponuje vaizdą. Ir atgal per dieną, o iš tiesų net Šiandien kai kurie iš šiandienos LED televizorių ar LCD televizorių, jei jūs turite vienas savo kambaryje ar namuose, Jei eiti Super jai artimas ir ypač jei tai šiek tiek vyresni televizija, Jūs tikriausiai net pamatyti šiuos taškus ir tai, ką rašyti vaizdą. Ir ten yra ne daugiau Informacija nei šis. Galėtume "padidinti", atsižvelgiant į prasme švelninamasis dalykus vėl ir rūšiuoti išvadą rūšies, tarsi ką spalva turi būti šalia Marijos akis kad iš tikrųjų tai ne taip pixelated. Bet jei aš nuolat priartinimo, yra yra blogiukas savo akis. Pavyzdžiui, kad yra visi Informacija, kurią mes turime. Jūs negalite kurti Informacija iš nieko. Yra tik ribotas bitų skaičius ten. Taigi, problemą, 4, kur Jūs turite galimybę žaisti su šio pasaulio natūra. Probleminėse Set 4, jums ištirti pasaulis grafika, ir ekspertizės, ir iš tikrųjų rašyti kodą kad atgauna prarastus vaizdų. Jūs rašyti kodą, kad manipuliuoja esamus vaizdus ir galiausiai suprasti, kas vyksta po gaubtu. Ir it turns out, tai tikrai ne visi, kad sudėtinga. Pavyzdžiui, jei mes norėjome atstovauti smiley veido kur šių juodų taškų, arba šie juodi, Na, mes galime tiesiog atstovauti juos kaip tikrai Bitmap. Ir jei jūs kada nors girdėjote, kad išraiška Bitmap, galbūt dabar pradeda padaryti šiek tiek daugiau prasmės šiandien. Mes jau žinome, kas šiek tiek yra. Tai 0 arba 1. Ir žemėlapis yra tik kažkas kaip popieriaus lapo kuri suteikia jums nurodymus ir turi gal nuo x ir y koordinatėmis tinklelis. Taigi čia yra rastras. Tai Bitų žemėlapis pagal kurį 1, matyt, ketina atstovauti balta pikselių, ir 0 ketina atstovauti juodas pikselis. Bet mes tikrai galėtų apversti jį aplink. Jis tikrai ne klausimas, todėl Kol mes nuoseklūs. Ir čia yra kaip, binary-- viduje kompiuterio atmintyje, ar net viduje iš kietajame failą drive-- galėtum laikyti iš smiley veido vaizdų paprasčiausias. Bet ką mes, žinoma, trūksta šio paveikslėlio? Spalva, tiesa? Tai akivaizdus Kitas žingsnis ar stiprinimas, siekiant pagerinti tai su spalva. Taigi, deja, tik su viena bitų, 0 arba 1, galėtume atstovauja spalvą. Tai galėtų būti raudonos, mėlynos arba, arba juoda, arba balta, arba žalios arba rausvos spalvos, arba bet spalvų poros. Bet paprastumo dėlei, mes tiesiog manyti, juoda ir balta. Taigi, kas logiškai mums reikia, jei mes nori įgyvendinti spalvą vaizdą? Ką turime daryti? Pavyzdžiui, jei veiksnys ribojantis yra tai, kad su vienu tiek galite tik atstovauja du būsenos, 0 arba 1, balta arba juoda, ką jūs norite daryti? Auditorija: Daugiau duomenų. David J. Malan: Daugiau bitai, Yeah daugiau duomenų, daugiau bitai. Ir, tiesą sakant, tai yra būtent tai, kaip spalva vaizdai yra atstovaujama. Užuot naudoti vieną gabaliuką, 0 arba 1 kiekvienam vaizdo elementui, kiekvienas taškas, jūs tiesiog naudoti kelis. Gal naudoti 8, galbūt, dažniau naudoti 24, ir iš tiesų, probleminėse Set 4, bus jums žaisti su byla formatas, kuris naudoja 24 bitų paprastai. Bet dauguma iš jūsų tikriausiai susipažinęs su JPEG. Jeigu jūs kada nors imtasi nuotrauka telefoną, arba įkeliami ar matė kažką "Facebook", "Flickr" ar, bet koks skaičius foto pagrįstas svetaines, jūs tikriausiai matė JPEG anksčiau. Ir pasirodo, tai yra failas formatas mes ketiname naudoti PSet 4 kuriuo jūs ketinate turi susigrąžinti vaizdus kad aš atsitiktinai ištrintas iš taško A sugadintas atminties kortelę į fotoaparatą, jei bus. Ir paaiškėja, kad nors JPEG yra gana sophisticated-- tai daug sudėtingesnės nei juoda ir balta taškeliais mes matėme prieš momentas, nes ten iš tikrųjų išgalvotas algoritmai, kad yra naudojami suspausti JPEG, taip, kad jūs galite turėti tikrai gražus, kokybės vaizdą, bet naudojant palyginti nedaug bitai. Ir mes grįžti į suspaudimo prieš ilgas. Pasirodo, kad pirmasis trys baitų JPEG image-- nesvarbu, ką jūs atlikote nuotrauka of-- vertybės 255, 216, 255. Kitaip tariant, jei jūs tiesiog matyti, kad bitai modelį, atstovavo čia kaip trys baitų, arba 24 bitai iš viso, su didele tikimybe galima daryti išvadą, kad jūs žiūrite į jį tai pirmas tris baitų JPEG. Ir tai yra tai, kas vadinama kaip JPEG parašu. A failų formatų daug ten yra linkę pradėti su tam tikrais modeliais 0s ir 1s, taip, kad Windows ir Mac OS ir "iOS", ir "Android žinoti, kokios bylos jie yra, be to, taip vadinamo failą pratęsimo, kuri daug failų turėti. Jei turite .jpg, tai kitas raktas į kompiuterį. Tad dabar pažvelgti į tai, šiek tiek daugiau techniškai. Mes žinome, po dešimtainio Sistema yra 0 iki 9. Mes žinome, dvejetainis yra 0 ir 1. Ir jei jūs manote atgal į PSet 0, mes turėjome galite ristis su, už truputį, kažko vadinamas šešioliktainis, kur jūs turite 16 skaitmenų, vietoj 10 arba vietoj 2. Ir tie skaičiai, pagal susitarimą, yra 0 iki 9 ir tada per f, kur f parodo, ką dešimtainis skaičius, kaip greitai normalumas patikrinti? Taigi, 15. Ir turi atstovauti 10, tiesiog pobūdis užsakymų, kad aš tikros. Tai tiesiog savavališkai konvencija, bet tai gana standartinis. Taigi, jei pažvelgtume į šio modelio trijų bytes-- tegul tik pradeda žiūrėti į jį būdu, kuris atitiktų tai, kaip kompiuterių mokslininkai paprastai pažvelgti ir pagalvoti apie failus. Jūs tikrai gali galvoti apie failai 0s ir 1s ir dešimtainė, Bet iš tikrųjų, mes linkę naudoti dvejetainis ar daugiau paprastai hexadecimal-- atgal nuo PSet 0. Taigi leiskite man pasiūlyti, kad 255, 216, 255 ir yra tik šie 0s ir 1s modeliai. Ir jūs galite tai patikrinti, jei jūs noriu padaryti matematikos nuo 0-inę savaitę. Bet dabar, tiesiog manyti, , kad tai yra iš tikrųjų teisinga. Aš ką tik perrašyta tūkstantųjų numeriai trys dvejetainių reikšmių. Dabar ką aš ruošiuosi padaryti, tai tiesiog pridėkite keletą tarpą, tik skaitomumas labui. Ir pranešimas, aš tiesiog vyksta perkelti daiktus atskirai. Taigi, prieš, po, prieš, po. Darau nieko įdomaus kita ne tik plinta dalykus taip kad pranešimas kiekviena aštuonių rinkinys bitai yra dabar dvi keturių bitai. Tai yra naudinga, nes šešioliktainėje yra ypač madinga nes kiekvienas šešioliktainis skaitmuo 0 per f, arba, konkrečiau 0 per 15, gali būti atstovaujama su lygiai keturi bitai. Kitaip tariant, jei jūs šešioliktainėje nori atstovauti 0, tai tik 0000, keturi nuliai. Ir jei norite atstovauti 15, tai 1111, kuri yra keturi bitai. Ir jei jūs matematikos, jei tai yra tie, vieta, tai yra 16s vieta, kad ketina suteikti you-- o kad vyksta to-- Atsiprašome, susidedančiame iš dviejų, kad ketina suteikti jums 15, tie vieta, Nedideliais vieta Fours ir aštuonias vieta. Taigi leiskite man pasiūlyti, kad šis nustatyti iš keturių bitų kairėje yra tai, ką mes ketiname skambinti f. Tai didžiausias kiekis, kurį gali atstovauti keturios bitai. Ir mes jau žinome iš šešioliktainis f yra didžiausia skaitmenų šešioliktainis. Mes turime dar vieną F ten, dar du ten. Ir dabar, tiesiog tikėjimu kad aš padariau matematikos teisę ir kad yra kairėje pusėje tų bitai, 1101, yra tas pats, kaip D šešioliktainėje. Ir dešinė, 1000, yra tik 8. Ir, kad viena lengva pamatyti, tiesa? 8 represents-- yra teisinga po to aštuonias vietoje. Taigi, mes turime vieną į aštuonias kolonėlės ir nieko, keturiomis, po du ar tie. Taigi dabar daugiau tradiciškai, žmonės linkę rašyti šešioliktainius skaitmenis, kaip šis, jūs tiesiog Squish juos kartu, ir tada jūs priešdėlis juos su 0x. Tai reiškia ne ką kitą, nei vizualiai raktas į human-- čia ateina šešioliktainis value-- nes jis gali kitaip būti akivaizdu. Kuris yra, galiausiai, kad iš nulių ir modelis, arba šešioliktainis modelis skaitmenų analogiškai, kad esate ketina pradėti ieškoti probleminėse Set 4 yra this-- ir problema Nustatyti 4 spec eis Jūs per tai daugiau detail-- bet suprasti, kaip rūšiuoti paslaptingų kaip Tai gali atrodyti iš pirmo žvilgsnio, jūs ketinate pradėti matyti šį daug. Ir iš tikrųjų, netgi GDB, The debugeris įdiegėme pirmadienį ir Danas pristato į PSet 3, vyksta dažnai jums parodyti šešioliktainius vertybes tik dėl to, jie linkę būti daugiau Paprastųjų nei dešimtosios dalies arba dvejetainis į kompiuterių pasaulyje. Dabar galime įdėti į kontekstą tai. Daugelis galbūt prisiminti tai įsivaizduoju čia, kuris atėjo iš ką? "Vista", todėl net anksčiau nei , kad "Windows XP" padarė šį debiutą. Taigi tai yra gražus kraštovaizdis. Ir iš tiesų, jei baksnoti aplink online-- Aš manau, kad tai Vikipedijos straipsnis, kuriame kažkas labai nuostabiai išėjo nustatyta, kad tai vieta pasaulyje įsteigti jo ar jos kamera būtent teisę place-- o tai šiandien atrodo like-- bet tai lygiai tas pats nustatymas. Šis vaizdas, nors, yra faile formatas vadinamas Bitmap, B-M-P. Ir mes ketiname imtis super Greita žvilgsnis, ką tai reiškia. Bet Bitmap yra tik kitoks būdas atstovaujantys vaizdai vis dar naudojate taškų į 0s ir 1s, galiausiai. Bet greitai žvilgsnio, ji turi įdomesnis parašas tuo failo pradžioje. Tai ne tik trijų baitų, o ten visa krūva modelių baitų , kurie iš anksto nustatytą reikšmę. Pavyzdžiui, kažkur Pirmieji keli baitai rastrinis vaizdas ketina būti dydis vaizdas, atvaizdo plotis, atvaizdo aukštis, todėl Naudingos metaduomenų, jei bus. Naudinga informacija, kad Photoshop arba bet grafikos programa jūs naudojate gali iš tikrųjų rūpi. Taigi daugiau apie tai Problemų nustatymas 4, tačiau tai tik pasakyti, kad Dienos pabaigoje visi formatai jau naudojate už years-- failus Microsoft Word, Skaičiai failus, Excel failus, bet formatų skaičius kurie gali turėti tam tikrą žinoma failo plėtinys yra tik 0s ir 1s po gaubtu. Ir žmonės nusprendė ką konvencijos yra, kas modeliai 0s ir 1s atstovauti Word failą, palyginti su Excel failą, palyginti su bet kitų failų formatų. Taigi PSet 4, turėsite galimybė žaisti su tuo. Bet ką tai reiškia turėti konstrukto. Tai tikrai gražus Segue dabar į C, kuris turi tik pora Papildomų funkcijų, mes ne pažvelgė dar. Tai gana mažas kalba ir viena iš naudingų funkcijų apie C yra konstrukto. Pavyzdžiui, jei jūsų norėjau represent-- tegul sako, kad jūs norėjo turėti kintamąjį, kad reiškia, kad kai kuriose programos studentas. Gal jūs raštu kursą Registracija programa arba pagrindinė prekybos priemonė, ar kažkas panašaus. Kokie vienetų duomenis, susijusius studentui, kad ateina į galvą? Kaip studentas atstovauja su tuo, ką vertina? Taip? Jūs turite vardą kaip studentas. Ką dar veikia tipiškas studentas turi? Auditorija: [nesigirdi] David J. Malan: Taigi, atsiprašau. Auditorija: Amžius. David J. Malan: amžiaus arba gimtadienis analogiškai, yep. Kas dar? Auditorija: ID numeris? David J. Malan: Taigi identifikacinį numerį, o gal telefono numeris, gal bendrabučio, ar namas, ar koledžas, ar kažkas panašaus. Bet koks duomenų dalis, kad skaičius jums gali tekti jūsų adresatų sąrašo kas gali apibrėžti studentas. Taigi, jei mes norėjome tai padaryti, kodiniai, mes galime padaryti kažką paprasto kaip šis. Mes gali turėti, kad programa turi tarkim, int main (void). O jei aš noriu atstovauti studentas aš gali turėti, pavyzdžiui, eilutė vadinama pavadinimas šio studento, eilutė vadinama bendrabučio tos studentas, gal int vadinamas ID tos studentas. O kadangi aš naudoju eilutę, aš reikia grįžti, supakuoti CS50.h. Gal aš ruošiuosi reikia stdio.h. Taigi leiskite man Preemptively tie, ir aš ketina tai vadina student.c dabar ir išsaugoti tai. Ir dabar galiu padaryti kažką šių kintamųjų. Ir mes tik ketina rašyti kad kaip pseudo kodas komentarą, nes tai neįdomu ką mes darome dabar. Gerai, kad tai yra programa, kuri kažkaip saugo studentą. Ką aš noriu daryti, jei aš norite išsaugoti du studentai? Taigi mano pirmasis instinktas vyksta kad viskas bus gerai, palauk, jei aš turiu kitą studentą, kodėl ne aš just do styginių pavadinimas 2, styginių bendrabučio 2, INT ID2. Ir mes padarėme dingo žemyn šiuo keliu prieš ir kas buvo mūsų sprendimas, kas atrodo būti natūra iš hackish Kopijuoti Įklijuoti darbas čia? Auditorija: Masyvas. David J. Malan: Taip, galėtume naudoti masyvą. Teisė tai labai greitai tampa griozdiškas. Jūs turite rūšiuoti savavališkai pradėti pavadinimų visų šių kintamųjų. Ir jūs, žmogaus, turi išlaikyti sekti, kad Gerai name2, atitinka su dorm2 atitinka ID2 į ÷ jimas. Jis tiesiog tampa netvarka. Taigi, tai daug lengviau, prisiminti iš prieš kelias savaites, tiesiog turintys vadinamas styginių pavadinimų o gal mums iš kurių trys. Ir tada gal mes turime string bendrabučiuose ir turi trys iš jų, arba kartu su konstanta, int ID ir turėti iš kurių trys. Bet net ir dabar tai jaučia šiek tiek prastesnis, į dešinę. Mes kalbame apie studentus ir dar Aš tikrai gyvenamųjų vangiu įgyvendinimo detales. Studentas yra pavadinimas ir bendrabučio ir ID. Kodėl aš negaliu tiesiog paskelbti kintamąjį vadinamas studentas ir jį vadiname Š. O jei aš noriu dar vieną studentą, kodėl ne aš tiesiog jį vadiname t. Arba, jei noriu visa krūva Studentų, tai kodėl gi ne aš tiesiog sako turiu visą klasę studentai, ir tai trys iš jų. Kitaip tariant, kodėl aš negaliu ateiti su mano paties duomenų tipo, vadinamas Studentų, kurio viduje yra pavadinimas, yra ID yra bendrabučio, yra bet kitose srityse, skaičius. Ir paaiškėja, jums gali padaryti būtent tai. Taigi C turi šią funkciją, vadinamą konstrukto. Štai kalbos funkcija, kuri leidžia mums daryti būtent tai. Aš ruošiuosi eiti į priekį ir atverti structs.h kur mes ketiname pamatyti Žemiau apibrėžimo studentas. Pasirodo - ir tai vienas net paprastesnė nei vieną apimantį ID akimirka prieš. Jei norite sugalvoti Jūsų namų duomenų tipas, ir, be to, INT ir apanglėjusia Plūdė ir visus šiuos kitiems, kad egzistuoja, Jūs galite padaryti tiesiog raštu Typedef konstrukto, tada kai garbanotas petnešos, viduje, kurį sąrašą kintamuosius, kuriuos norite susieti su šia nauja užsakymą duomenis įrašykite kaip pavadinimas ir bendrabučio, ir tada po klamrami galite duoti vardą į naują duomenų tipą. Taigi, pavyzdžiui, studentas. Ir kas malonu apie tai dabar yra tas, kad jei pažvelgsime į atitinkamą kodą, Konvencija pirmiausia iš visų, yra įdėti ši į failą pavadinimu kažkas dot h, antraštės failą, kurį mes turime ne pradėjo naudoti save per daug. Tačiau mes ketiname pradėti naudojant gana šiek tiek dabar. Ir ką mes galime padaryti su tuo, Galiausiai, šių kelių eilučių kodo yra paskelbti būtent tai duomenų tipas, studentas. O dabar tegul jį naudoti. Aš ruošiuosi dabar eiti į failas vadinamas structs1.c. Ir tegul ne išvaizdą Keletas charakteristikos čia. Taigi stuff čia yra daugiausia pažįstamas, ir mes grįžti į tai, kas nėra susipažinęs vos akimirką. Tai, žinoma, yra, įskaitant mano paties antraštės failą, kuris yra nauja, taip pat, išskyrus PSet 3, kur, Prisiminkite, mes turime helpers.h. Taigi jums gali prisiminti #include helpers.h. Kodėl nors aš naudoju citatos vietoj kampinių skliausteliuose? Kai man pasirinkti tarp jų? Beveik visada man atrodo naudoti kampu skliausteliuose. Ir tada visi staiga ant linija šešių aš naudoju kabutes. Kodėl tai gali būti? Taip? Auditorija: [nesigirdi] David J. Malan: Štai tikroji, ką? Auditorija: Kad jūsų IDE. David J. Malan: Taip, tai mano tikrojo IDE. Ir tegul ne gyvens IDE, nes tai tik priemonė, kuri aš naudoju. Kad mano dabartinis yra katalogas, specialiai. Taigi structs.h yra mano paties failo neįdiegta IDE, į operacinę sistemą pačiam, o tai mano einamojo katalogo. Taigi Konvencija, jei norite įtraukti savo antraštės failą, tiesiog naudokite kabutes. Ką mes vadiname šį dalyką linija 8, apskritai? Tai ką? #define kažką. Tai reiškia, konstantas, tiesa? Jei norite turėti vertė savo programą kad jūs naudojate visuma krūva kartų, tai geras konvencija veiksnys jį, paskelbti ją, su grotelėmis apibrėžti, tada pagal konvenciją visose didžiąsias word-- nors tai ne būtina, bet Tai žmogaus konvencija kapitalizuoti konstantas kad jie iššokti ne jums visually-- erdvę ir tada vertė norite būti lygiavertis kad būtų nuolat vardu. Nėra kabliataškis, bet jūs tiesiog sekti, kad modelis nėra. Taigi, ką aš darau šiame faktinio kodą. Taigi leiskite pažvelgti pagrindinė programa yra čia. Pagal 12 nes aš Įtraukėme structs.h, Dabar aš turiu stebuklingai mano šalinimo naujas duomenų tipas. Aš ne tik turėti prieigą prie int, ir char ir plūdė, ir styginių, ir mėlyna ir kt. Dabar aš turiu priėjimą prie studentas duomenų tipas. Taigi vadovaujantis 12, aš derinant du ideas-- vieną užsakymą duomenų tipas ir du, naudojant masyvą. Ir taip šioje programoje, jei Noriu, kad iš tikrųjų remti trys skirtingi studentai mano programa, aš gali tiesiog pasakyti man kintamąjį vadinami studentų, kurių kiekviena yra tipo studentams, kurie mano užsakymą duomenų tipas. Ir būtent, duok man trys iš jų, mano masyvo. Taigi, ką mes darome šioje programoje? Štai tik už kilpos Iteracja nuo 0 iki 3, todėl, kad tai ką studentai vertina tai. Aš tiesiog paskatino vartotoją man studento vardą. Ir tada pagal 17, mes turi daugiausia pažįstamas liniją. Mes turime senas draugas GetString dešinėje. Ir ką gabalas sintaksę matyt naujas, jei jūs niekada užprogramuotas C anksčiau, ir niekada naudojo structs? Taip? Auditorija: .name. David J. Malan: The .name. Bet tai nėra per daug šuolis, nes dabar studentai laikiklis i suteikia jums i-asis studentas. Ir jei norite pasinerti viduje šios struktūros, jūs tiesiog naudoti vieną laikotarpį ir tada kintamojo vardas viduje, ar viduje, kad nuosavybė norite gauti prieigą prie. Panašiai tada, jei aš tada paragins vartotojas, duok man studento bendrabučio, galite taip pat laikyti, kad Styga į bendrabučio kintamojo viduje tos studento struktūrą. Ir dabar viskas pasidaro šiek tiek fantazijos. Ir tai vyksta ieškoti ne gal daug gana greitai. Bet jūs pamatysite tai kas daugiau PSet 4, todėl galime tik žvilgsnis jį dabar. Pasirodo, kad pagal 23 per 38, ką jūs manote, aš galbūt darote? Aš nuimti komentarus už ir šiandien, bet versija kodo internete nuoroda turi visus komentarus. Ką man atrodo, darai? Auditorija: failą su visais taupymas informacija, kuri įvesta vartotojas. David J. Malan: Taip, tiksliai, tai yra naujas būdas kad mes matome du, Kitas C funkcija, kuriuo galiu sukurti savo failus. Iki šiol beveik kiekviena programa parašiau yra be pilietybės. Kaip tik tai daroma veikia, tai viskas. Nėra atmintis arba prisiminimai apie jį. Nėra failų išsaugotas. Bet jei jūs norite išsaugoti indėlį, atsitiko, kaip ir žaidimą ar programą kaip šis, it turns out, mes galime tai padaryti. Ir jūs pamatysite tai daugiau į PSet 4 ir skyriuje. Bet tai 23 eilutė iš esmės sukuria failą pavadinimu students.csv. Ir jūs galėjote matyti anksčiau. Net jei jūs niekada studijavo CS anksčiau, CSV yra kableliais atskirtų kintamieji. Tai lyg labai vargšas versija Excel failą, o tai reiškia, kad ji galėtų būti atidarytas Excel ir "Apple" numeriai, ir ji turi eilutes ir stulpelius. Bet tai ne patentuotas formatas, kaip "Microsoft" ar "Apple". Tai tiesiog kableliai atskirti vertybės, kurios mes pamatysime per akimirką. Ir tik spėti. Pagal 23 Pačioje pabaigoje, mano antrasis argumentas į šią naują funkciją, vadinamą f atvira Atidaryti failą w. Ką gali W reiškia? Taip? Auditorija: Jis leidžia jums rašyti į failą? David J. Malan: Tai leidžia rašote į failą. Taigi ten yra variantų pora kad mes galime prijungti čia. Bet jei jūs tiesiog norite skaityti failas, tai yra pažvelgti į jį ir skaityti jį į atmintį, tiesiog naudokite citata citatos pabaiga "R". Jei norite rašyti failą, galite naudoti citata citatos pabaiga "W". Taip pat pridėti ir kitų dalykų pora jei norite pakeisti esamus failus. Dabar mes ketiname nuolat matau tai dalykas, tada mes grįžti į 24 eilutės. NULL, it turns out, yra ypatinga reikšmė, gali būti grąžinta tam tikrų funkcijų jei kažkas nuėjo wrong-- jei failas neegzistuoja, jei jūs paleisti iš atminties, arba kitų klaidų krūva. Bet dabar, tegul tiesiog manyti, kad ši yra tik įprastas klaidų tikrinimas. Čia pagal 26, aš Iteracja nuo 0 iki 3 per visus mano studentai. Ir tai yra rūšies rūšiuoti naujos funkcijos, fprintf, bet tik spėti. Jei printf yra tik Spausdinti suformatuotą eilutė, Ką fprintf tikriausiai reiškia? Auditorija: spausdinti į failą. David J. Malan: Išspausdinkite suformatuotas eilutė faile. Štai kas yra papildoma f priemonės yra failas. Ir nauja pirmasis argumentas turi būti kintamasis, kuris atstovauja savo failą. Tada mes tiesiog formatą styginių kaip printf. Ir nors tai sintaksė yra nauja, tai tik reiškia prijungti studento vardas, plug-in studentų bendrabučio, o tada su fclose, uždarykite rinkmeną. Ir tada lastly-- tai yra naujas ir mes grįžti prie šio prieš long-- aš išlaisvinant už priežasčių studentas tai atsitiko iki aukščiau ten. Bet mes grįžti kad kad prieš long-- tai todėl, kad, kaip GetString yra tikrųjų dirba po gaubtu. Taigi leiskite priimti greitai pažvelgti čia. Jei aš tipo ls mano kataloge, pastebėsite, kad aš ne turėti failą pavadinimu students.csv, tik ne ten, neegzistuoja. Taigi, jei aš dabar kaupia šią programą, padaryti structs-1. / structs-1 ir aš ruošiuosi eiti į priekį ir įveskite Andi, kuris gyvena Berkeley Jeilio. Mes ketiname turėti Rob, kuris gyvena Thayer šių dienų. Ir tegul sugalvoti, kur yra, manau, Marija yra Mather, jei aš atsimenu teisingai. Taigi nieko atrodo, kad taip atsitiktų. Bet jei aš tipo ls dabar yra students.csv. Vykime į priekį ir atvira students.csv. Tai vėl labai lengvas failo formatas. Bet aš tiesiog priėmė konvenciją kad turiu dvi eilutes ir stulpelius. Pirmasis stulpelis žmonių vardai. Antrame stulpelyje yra studento bendrabučio, ar koledžas, ar namas, ar Plauktiņš. Ir dabar aš išgelbėtas šis nuolat failą. Taigi, tai ne visi, kad įdomus. Bet tai tik slenksčiu dabar , kad galėtų išlikti informacija visam laikui. Taigi pažiūrėkime, ką mes galime daugiau daryti su šiomis ir kitomis funkcijomis. Bet pirmiausia, kokių nors klausimų? Tai buvo daug, ir kad buvo greitai. Bet jūs pamatysite daug daugiau PSet 4, taip pat. Taip? Auditorija: Ar yra būdas toliau pridedant pavadinimus šio failo? David J. Malan: Geras klausimas. Ar yra būdas toliau pridedant pavadinimus šio failo? Taip. Ir, iš tiesų, jei jūs galų iki pakartotinio atidarant failą, norite naudoti citata citatos pabaiga "A" už Papildyti, kuri būtų tiesiog pridėti naują liniją, nauja linija vėl ir vėl, tiksliai. Geras klausimas. Kiti klausimai? Taip? Auditorija: Jei bėgo programa vėl dabar, tai turėtų nuolat pridedant pavadinimus į failo ar tai turėtų atverti naują failą? David J. Malan: Ak, geras klausimas. Jei jūs paleidote programą iš naujo teisė dabar, gal įvedėte naujais vardais, būtų jį įtrauksime į failą arba perrašyti failą? Pastarasis, nes aš nenaudojate papildymo režimui. Ir todėl aš tiesiog aklai atidaryti failą rašymui, tai tik ketina perrašyti failą. Taigi aš iš tiesų reikia padaryti, tai pridėti, jei aš noriu, kad iš tikrųjų turi ilgalaikius duomenų bazė. Dabar CSV yra naudinga, tiesą sakant, net už, pavyzdžiui, jei esate writing-- ir mes galų gale pamatyti šį vėliau semestro, kai mes naudojame CSV ataskaitose kitiems tikslams. Jei norite išsaugoti visi žmonės kurie registruojami tam tikrą įvykį, arba užsiregistravau jūsų studentas grupė, ar kažkas panašaus, saugoti duomenis į šios rūšies iš formatu yra super patogu. Kadangi pažodžiui, jei aš buvo atsisiųsti šį failą. Galėčiau double-- ir tegul realiai išbandyti šį jei turiu Excel arba numerius čia. Aš ruošiuosi dešiniuoju pelės mygtuku spustelėkite ar kontrolės pelės mygtuku spustelėkite Mano failą. Oi. Dešiniuoju pelės mygtuku spustelėkite ir kontrolės pelės mygtuku spustelėkite Mano failą. Nagi, mano pele nebendradarbiauja. Download-- aš ruošiuosi atsisiųsti visus failus čia, kad tiesiog, kad aš galiu paimti šį vieną. Ir tegul pamatyti, jei tai veikia students.csv-- pirmas kartas Aš įjungta. Dabar jie nori matyti savo kontaktus. Dabar, aš iš viso turiu užsiregistruoti. Pažiūrėkite, kaip lengva tai naudoti CSV ataskaitose? Taip, nuolat jį atnaujina. Gerai, dabar mes pasirengę klasėje. Gerai, oi, kas naujo? Gerai, arti. Tai buvo stebuklinga. Gerai, dabar mes turime atnaujinti. Ir dabar, ji pamiršo, kas byla Aš iš pradžių atidaryti, bet kas a-- ten einame. Gerai, kad dabar mes turime Excel failą. Ačiū. Gerai, kad tai, ką aš padariau buvo lengva dalis. Žinoma, aš galėjo iš anksto įdiegta "Excel" arba numeriai, ar kokia programa. Bet tai yra gražus, nes dabar galiu manipuliuoti kad į standartinį formatą duomenys. Taigi, dabar tegul kontekstas pereiti prie kur mes baigėte paskutinį kartą, kuris buvo pradėti kilimo mokymo ratus. Bet pirmiausia, tu negali pamatyti šį ankstesnį pietūs vėl vyksta čia ir ugnies Ledo Kembridže, Sitar New Haven. Užsiregistruoti ant CS50s svetainėje ASAP prisijungti CS50 studentus ir personalą. Taigi mes priėmėme mokymo ratus ne pirmadienį, kaip follows-- eilutė buvo deklaruota CS50s biblioteka tam tikrą laiką. Ir tai gerai, nes jis leidžia mums kalbėti apie kintamuosius kaip pilnas žodžiai ir sakiniai ir daugiau. Tačiau paaiškėja, eilutę neegzistuoja. Tai tiesiog sinonimas, arba slapyvardį, kad mes sukūrėme kažką, kad iš tikrųjų yra šiek tiek daugiau techninė vadinamas char *. Ir iš tiesų, mes pamatėme pavyzdį iš pirmadienį programos kad nesielgė visai kaip mes tikėjomės. Tai buvo byla, palyginti-0. Ir prisiminti, kad palyginti-0, jei Aš perkompiliuoti pirmadienio programą ir paleisti palyginti-0 ir įveskite mama mažosiomis raidėmis, o mama mažosiomis raidėmis dar kartą. Programa reikalavo I įrašykite skirtingus dalykus, nors mama, visi mažosiomis raidėmis, yra identiški vizualiai. Taigi, kas buvo trumpas atsakymas kodėl mano kompiuteris šios dvi stygos skiriasi? Taip? Auditorija: [nesigirdi] David J. Malan: Teisė. Taigi, mama, pirmą kartą Aš įveskite jį, ji yra kažkur mano kompiuterio atminties, bet kitoje vietoje nei antrą kartą aš tipo mama. Dabar jis tikrai galėtų būti optimizuotas. Kompiuteris gali būti protingas ir įgyvendinti šiuos dvi eilutes, ei, jie identiški. Leiskite man nėra nereikalingai laikyti jį. Bet Kompiuteriai nedaryk to optimizavimas, nebent jūs pasakykite jiems. Taigi, pagal nutylėjimą, jie tik ketina baigti dviejų skirtingų vietų atmintyje. Ir taip, kad būtų aiškiau, kai lyginome dvi eilutes, Pirmasis buvo vadinami S, antrasis vadinosi T, ką konkrečiai man buvo Lyginant čia on-line 13? Taip. Auditorija: Tai atminties vieta kad kintamasis bus nurodyti. David J. Malan: Būtent, aš buvau lyginant atmintyje vietą kad tie kintamieji nurodė. Taigi, konkrečiai, jei mama buvo baitas skaičius 1, ir 2, ir 3, ir 4-- nes prisimenu backslash 0 turi būti visi pabaigoje būdas. Ir kitas pavyzdys mama, m-O-M, buvo adresu 10, 11, 12, ir 13. Buvau lyginant 1, kad adresas, kad atminties vietą, prieš 10, kuris yra akivaizdu, kad ne tos pačios. 1 yra ne 10. Taigi tai yra gražus tuo, kad tai gana paprasta. Bet tai problemiška tiek, kiek mes negalime lyginti eilutes. Taigi fundamentally-- ir šiuo žemo lygio, jei norite įgyvendinti programa palyginti du atskiri žodžiai, kad vartotojas įvedėte kokybės, jie išsirikiuoja char už char, tik bendrais bruožais, ką mes turime daryti, matyt? Tai nepakanka tik pažvelgti šių dviejų adresus. Ką turime daryti? Taip? Auditorija: pakartoti per eilutė [nesigirdi]. David J. Malan: Taip, tegul pakartoti per eilutę. Leiskite naudoti už kilpos, per while cikle, arba ką jūs labiausiai patogiai. Ir jei mes turime dvi eilutes kažkur atmintyje, pažvelkime į kiekvieną aisiais Pirmasis simbolis, tada kiekvienas antras charakteris, tada trečia, ketvirta, ir penkta, kol mes hit kas ypatingą Sentinel vertė? Auditorija: [nesigirdi] David J. Malan: Taip, Backslash nulis, kuriame taškas arba eilutę mes galime nuspręsti, kad viskas. Ar mes atitiko kiekvieną simbolį? Jei ne, return false. Jei taip, grąžina true. Ir taip, kad tai, ką ši versija Programos palyginti-1.c daro. Jis yra identiškas, ką pažvelgė į pirmadienį, išskyrus, kad aš Dotarłeś atsikratyti žodžio string-- nors kad neturi funkcinio impact-- visi Darau dabar pašalinti kai regėjimo mokymo ratai, bet aiškiai matyti, kad s ir t yra adresai. Ir tai, ką žvaigždė, Žvaigždute, atstovauja yra adresas, kitaip žinoma daugiau techniškai kaip žymeklis. Taigi, kai aš pareiškiu, S 9 linijos ir pasakyti char * s, tai nereiškia, kad man eilutę. Tai reiškia, kad man kintamąjį, kurio gyvenimo tikslas yra saugoti adresą. Nes aš esu apie įdėti adresas eilutę į jį. Ir iš tiesų, GetString, būti aišku, negrąžina eilutę. Jis negrįžta mama Backslash nulis, per se. Ką GetString specialiai ir tiksliai grįžti? Auditorija: [nesigirdi] David J. Malan: adreso, adresas pirmojo požymio kai eilutę jis įgytas. Ir todėl dabar mes matome specialus raktažodžių dar kartą. Ir aš užsiminiau tai anksčiau. Tai bus gera konvencija kad dabar mes pamatysime vėl ir vėl. Aš patikrinti, įsitikinkite, kad s yra ne niekinis ir t yra ne niekinis. Nes pagal mano tikrai Greita paminėti anksčiau, ką galėtų reikšti, jei GetString grįžta ne adresas, bet N-U-L-L, kuris yra dar kartą, kai ypatingą vertę? AUDITORIJA: Klaida. David J. Malan: Tai įvyko klaida. Kažkas negerai. Ir kas paprastai gali atsitikti, ypač su strings-- kuris gali būti nežinomos ilgio advance-- gal kompiuteriai " iš atminties, gal Jūs įvedėte tokiu ilgas žodis ar sakinys arba įterptas toks didžiulis esė ten tiesiog nėra pakankamai atminties. Ir taip GetString negali grįžti į visa tai, adresas, todėl tiesiog grįžta nieko. Ir ji sako klaida nutiko grąžinant ypatingą NULL reikšmę. Tai nulinis adresas, taip sakant. Dabar paaiškėja, C ateina su funkcija, kuri veikia, kad iteracijos. Neturime įgyvendinti tai su už kilpa arba while cikle save. Mes galime naudoti funkciją, vadinamas trumpai, maišykite comp ar styginių palyginti, kurio gyvenimo tikslas yra padaryti būtent tai. Jūs suteikiate jai du patarimų, du adresus, ir ji bus eiti į šių adresų ir tada palyginti raidę laiškas laiške kokybės, sustabdyti tik tada, kai kas yra tiesa? Kai intuityviai turėtų išmaišyti comp Nustojus Iteracja, tiesiog, kad būtų aišku? Kai jis hitai Atgal nerijos velniop 0 vienu eilutė, kuriame temperatūra gali nuspręsti jau viskas suderinta, arba ten buvo neatitikimas? Taigi, jei mes paleisti tai dabar ir bando mūsų mažai kapitalizacija žaidimas, todėl įsitikinkite, palyginti-1, ./compare-1 ir įrašykite mama mažosiomis raidėmis abu kartus. Dabar tai tas pats dalykas. Ir jei aš jį dar kartą su mažosios ir tada gal didžiąsias. Dabar jis iš tikrųjų išskiria tarp viršutinės ir mažosiomis raidėmis. Taigi ne visi, kad sunku ar stebuklinga, bet ji dabar paaiškinti kas vyksta po gaubtu. Taigi ką dar galima mes ekstrakto iš šios pamokos natūra? Taigi leiskite pažvelgti šią išvaizdą. Aš ruošiuosi eiti į priekį ir rašyti Greita programa čia vadinama kopija-0. O dabar eikime į priekį ir iš tikrųjų darykime this-- kopiją-0, pažvelgti, ką aš čia turiu išvaizdą. Aš pirmą kartą pranešti vartotojui, ką nors pasakyti. Tada gaunu eilutę ir aš saugomi jį s. Tada aš patikrinti, ar -ai lygus lygus NULL, tiesiog grįžti 1 d. Taigi tai yra tik standartinė paklaida tikrinimas. Nieko įdomaus neįvyko. Ir iš tikrųjų, jei mes atsikratyti klaidų tikrinimo, tai atrodo savaitę 1 kodas šiuo metu. Bet aš pradėjau gauti tiek geriau apie tai. Dabar atitinka 16, prieš savaitę, o gal ir net prieš keletą dienų ar minučių, galite pasakyti linija 16 yra sukurti kintamą vadinamas t ir kopijavimas s į jį. Ir tai puikiai protinga Takeaway. Bet tiksliau dabar. Kas vyksta vadovaujantis 16? Kas yra gauti nukopijuotas iš kairės į dešinę? Taip? Auditorija: yra t gauti žinutę iš S adresą? David J. Malan: Lygiai t yra gauti iš S adresą. Taigi, kad būtų aišku, dabar, jei aš einu atgal į tą ankstesnį pavyzdžiui ir aš atkreipti dėmesį į ką aš įvedėte vietą. Ir ką aš įvedėte in-- čia s, o čia yra tai, ką aš įvedėte kažkur atmintis, mama ir tada Backslash 0 kad pridėtinė už mane. Ką saugomi čia, prisiminti, tai yra bent vietą 1, 2, 3, 4, tai, kas šiuo metu s. Taigi, jei on-line 16, sakau duok man kitas kintamasis vadinamas T ir parduotuvė bent vertė s, kas pasireiškia saugomi čia nebus mama o tik 1 numeris. Taigi, jei mes žiūrime į priekį šioje programoje Dabar, kas nutiks? Taigi pastebėti, kad ten Ši funkcija jums gali naudojo tai prieš kurį laiką už Cezaris, arba Vigenere, o gal ne visi. Galiu reikalauti mano printf, aš ketina pasinaudoti kopijavimo t. Pirmasis eilutė 19, greitai normalumas Tikrinti, strlen Tikrina t ilgį. Nes aš nenoriu pabandykite pasinaudoti kažką Jei nėra styginių ten. Jei vartotojas tiesiog paspauskite Enter ten nieko pasinaudoti. Taigi, aš nenoriu daryti liniją 21 d. Taigi linija 21 yra kapitalizuoti kuri laiškas, matyt, t? AUDITORIJA: M? David J. Malan: Jis atrodo kaip tai kopijavimas kurių vienas? AUDITORIJA: M. David J. Malan: Uh m. Gerai, kad pirmą m, nes įspėjimo, kad aš pereinant prie toupper, kuris jei jūs niekada matė jį tai tik funkcija pasinaudoti kaip savo indėlį. T laikiklis nulis reiškia duoti man nulis pobūdis t. Ir taip, kaip tai daro nuotrauka kaita, kad būtų aišku? Ką reikia gauti perrašyti arba pakeisti atsižvelgiant į s ir t MOM Backslash nulis. Auditorija: [nesigirdi] David J. Malan: Taip, todėl tai vienas čia tiesiog reikia gauti pasikeitė to-- nustatyti this-- reikia gauti pakeistas į kapitalo m. Bet dabar, atrodo vėliau, programa, jei aš atsispausdinti s ir t, kaip aš valyti čia, žiūrėti, kas nutiks spausdinti s ir t. Taigi, kad kopija-0, ./copy-0. Leiskite man eiti į priekį ir įveskite MoM visose mažosiomis raidėmis. Atkreipkite dėmesį, tiek originalus ir kopija buvo kapitalizuotos. Kodėl? Na, s ir t yra tiek nukreipta į, jei bus, tas pats gabalas atmintį. Ir tiesą sakant, tai vis tikrai uninteresting-- tai kad mes naudojame adresų nulį čia. Aš turiu galvoje, aš nerūpi kur medžiaga yra atmintyje. Atsiprašome aš ištrinti šiek tiek per daug. Bet aš nerūpi kur viskas yra atmintyje. Ir taip, iš tiesų, ką programuotojai linkę galvoti apie yra tai, kad, kai jūs kalbate apie adresą, ar rodyklė, kuris rūpinasi, kur ji yra atmintyje. Man nerūpi, ar tai ne baitas viena ar vienas milijardas. Aš tik rūpintis, kad šis kintamasis yra efektyviai nukreipta į tą atminties riekė. Ir taip, nuo šiol, o ne kalambūras per savavališkai atminties adresus, tegul tiesiog pradėkite piešti patarimų kaip rodykles, nes strėlių. Taigi, kas s ir t yra iš tikrųjų, Pagal šią programą, nes, kaip aš sukūriau t, tai tik du atskiri kintamieji nukreipta tuo pačiu riekë atminties. Ir mes do not care, kur jie yra. Taigi, mes galime abstrakti karto, kad išsamiai. Taigi, kaip man išspręsti šią problemą? Jei aš noriu parašyti kopijos versiją programos, kad tikrai kopijos styginių ir pasinaudos tik Kopijuoti, tiesiog intuityviai, kas turite būti ingredientas mūsų sprendimas? Auditorija: [nesigirdi] David J. Malan: Mums reikia ką? Auditorija: riekė atmintį. David J. Malan: Turime kitą atminties riekė, tiesa? Mes nežinome, kaip daryti dar, nebūtinai. Bet tam tikra prasme man tai įvyktų taip, kad originalus mama mažosiomis raidėmis baigiasi toje papildomą riekė atmintį. Ir tada, kai aš pakeisti kopiją, aš nenoriu keisti šią kopiją čia. Aš vietoj norite pakeisti tik šį Kopijuoti kad originalas yra nepakitęs. Taigi, pažiūrėkime, kaip mes galime tai padaryti. Be kopija-1, kuri jau buvo atimta komentarą, tačiau komentavo internete. Mes vietoj daryti following-- tai linijos yra identiški, gauti man eilutę ir skambinti tai ai. Bet dabar pažvelkime vienas iš mūsų labiausiai sudėtingas, bet paskutinis sudėtingumo tam tikrą laiką, linija 16 tai tiksliai tai. Taigi, jei jūsų Nežiūriu su nuotrauka mes tiesiog drew-- duok man naują riekė atminties, kopijuoti viską į jį, pažiūrėkime, kaip mes verčiame, kad norint kodą. Taigi linija 16, kairėje pusėje, char * t, suteikia man šį langelį čia. Štai visa tai daro. Dešinėje pusėje, m ALLOC arba malloc, yra atminties paskirstymas, super išgalvotas, Neaiškus būdas tiesiog pasakyti duok man atminties riekė. Kiek atminties mums reikia? Na, yra natūra didelis išraiška. Bet pažiūrėkime, ką ji sako čia. Taigi, šis, žinoma, yra duoti man eilutė ilgis s. Taigi, mama ji turėtų būti, ką? Taigi tik trys, tiesa? mama yra trys simboliai. Jūs neturite suskaičiuoti Backslash nulio, kai jūs kalbėti apie eilutę jis ilgio Tiesą sakant, žmogaus matomus raides. Taigi mama, todėl tai suteikia man 3. Bet palauk, aš dabar pridedant 1. Kodėl aš iš tikrųjų noriu skirti 4 baitų, o ne tik 3? Taip? Auditorija: Sentinel vertės? David J. Malan: Būtent, tos Sentinel vertės. Dėl backslash nulis, Man reikia 4 baitų iš viso. Taigi man reikia ilgio Virvės plius 1 d. Ir tada tiesiog geros measure-- nors šioje sistemoje, jis visada bus 1-- aš sakau padauginti iš CHAR dydžio. Pasirodo, sizeof yra operatorius C, kad tiesiog jums pasakys baitų skaičius, kad tai reikalingas tam tikro duomenų tipą. Tai neveikia masyvai, paprastai, kartais tai daro. Bet, bendru atveju, ne. Bet tai bus pasakyti, kiek baitų char yra, kuris paaiškėja, visada yra 1. Taigi tai yra kaip padauginus iš 1. Taigi super paslaptingas ieško linija kodą. Bet visa tai daro, yra suteikia man atminties riekė. Bet tai, atrodo, kopijavimo nieko į tą atmintį? Dar ne. Ir taip Ką on-line 22 ir 23, 24, 25, gerai, aš tiesiog tai padaryti. Ir tai yra tarsi senosios mokyklos dalykų dabar. Tai kaip PSet 2, kur jūs tiesiog juda dalykų aplink atmintyje, ar veikiau stygos. Taigi, aš Iteracja nuo 0 iki eilutės s ilgio. Ir aš kopijavimo i-ojo požymio S į i-ojo požymio t. O kadangi aš, programuotojas, pagamintas Būtinai skirti tiksliai taip, kaip daug baitų kaip man reikia, tai puikus vienas su vienu "santykius. Ir aš nukopijuoti mama mažosiomis prie nauju. Ir tada galiausiai, aš šioje eilutėje. Ir taip poveikis yra tik pasinaudoti šia t čia. Taigi daug sugeria, bet jei jūs tiesiog apsvarstyti kas iš tikrųjų vyksta apie po gaubtu tiesiog perkelti šiuos baitų aplink, visi, kad reikia išspręsti šią problemą yra tiesiog suteikti mums šią atminties riekė. Šiuo metu yra rizikos didele, leiskite man parodyti vienas kitas pavyzdys, kad beveik vienodos, išskyrus šį vieną linija kodą. Taigi tai yra įsilaužėlis versija Šios programos, jei bus. Bet tegul tiesiog Alembikować tai į tai, kas vyksta. 24 eilutė naudojama būti tai t laikiklis i gauna -us laikiklį I priedą. Dabar aš keičiasi tai Daug daugiau paslaptingas žvaigždė t plius 1 lygu žvaigždė -ai plius 1. Taigi, kas vyksta ir kodėl Ar turime žvaigždės charakterį? Mes matėme žvaigždė anksčiau, ir jis naudojamas skirtingai čia. Mes anksčiau matė char *, dabar matau Žvaigždžių pradžioje, ir kad viskas OK. Nes paaiškėja, mes gali rūšies išvadą tik nuo pirmojo principai, kas vyksta. Taigi tiesiog būti aišku, kas yra s? Praėjusią savaitę jis buvo eilutė. Tai nepakanka nebėra. Tai, kas yra S, konkrečiai? Auditorija: [nesigirdi] David J. Malan: Tai rodyklė. Tai iš adresas Pirmasis simbolis mes įvedėte. Gerai, kas yra t? Auditorija: [nesigirdi] David J. Malan: adresas pirmasis baitas t, ty atminties riekė perskirstytos. Taigi paaiškėja, kad kai mes kartoti nuo 0 nuo iki eilutę length-- visų pirma, aš prasideda 0, nes Šios senojoje mokykloje for ciklas dalykas. Taigi tiesiog paprastumo, tegul Tarkime, kad pirmą eilutę kodo yra tikrai tik tai, tiesa. Jei i yra nulis, pridedant nulį kažkas matyt nesiruošia turėti poveikį. Taigi, kas tai yra posakis? Pasirodo, kad žvaigždės operatorius šiame kontekste yra dereference operatorius, kuris yra tik išgalvotas būdas pasakyti eiti adresu. Taigi, jei s yra pirmasis adresas personažas šiame atminties riekė, * s "reiškia ten. Ir todėl mes sudarytas šioje būdu nuotrauka, galite patvirtina Žemiau psichikos modelį. Jei tai yra S, o jūs sakote * s * s, lyg loviai ir kopėčios, jei pamenate žaidimą iš vaikystės, yra kaip sekti, kad rodyklę ir eiti į adresą. * t yra tas pats dalykas. Taigi pradėkite čia, eikite į savo riekė. Aš negaliu tiesiog piešti ant Šis ekranas, kad taip. * T reiškia eiti čia. Ir tada, už linijos, yra tik sakydamas perkelti šį simbolį čia perkelti šį simbolį čia perkelti šį simbolį čia. Bet kaip man padaryti, kad rodmenų didėjimas? Man reikia anuliuoti, ką aš tiesiog ištrinti. Tai yra tai, ką paprastai vadinama rodyklė aritmetinis, kuris reiškia matematikos su adresais. Jei, tai už kilpos, Aš nuolat incrementing i, ir s yra adresą ir t yra Adresas, jei aš tiesiog nuolat pridedant 1, kad tik reiškia nuolat juda į priekį, ir į priekį, ir perduoti į atmintį. Tai kaip Oxford Street, The gatvės, kad CS pastatas yra. CS pastatai yra 33 Oxford Street. Taigi, jei jums buvo daryti 33 Oksfordo gatvė plius 1, kad atneša jums 34 Oksforde Gatvė, tada 35 Oxford Street, tada 36 Oxford Street, ką tie pastatai iš tikrųjų yra - jei jie egzistuoja. Ir taip, tai viskas, ką mes darome čia su rodykle aritmetika. Taigi, tai super slaptas būdas išreikšti save. Bet visa tai, kas vyksta po kapotu yra tik šiuos adresus, kaip po žemėlapį, jei norite, arba po rodykles, kaip mes parengtos ekrane. Gerai, daug virškinti. Bet koks klausimas, sintaksė, koncepcijas, rodyklės, malloc ar pan. Taip, daugiau nei čia pirmas. Auditorija: Taigi, kur, kad sako * t lygus toupper * t, yra tai, kad ketina pasinaudoti Visos raidės ar just-- David J. Malan: Ak, tikrai geras klausimas. Taigi, šiame linija čia, 31, tai vyksta kapitalizuoti pirmoji raidė arba visas raides. Taigi leiskite atsakyti, kad vyksta atgal į pirmųjų principų. Ir pirmieji principai čia aš turiu galvoje Tiesiog nueikite į pagrindinių sąvokų kas manimi dalyvauja. Taigi toupper yra funkcija kad pasinaudos char. Tai viskas. * T reiškia eiti į first-- eiti į t adresą. Taigi, vaizdą, jei tai yra su korinio atminties skyrėme su malloc, ir tai yra t, * t reiškia, eikite čia. Tuo tarpu, jūs artimųjų ši vertė, mažosiomis m į toupper, jūs gaunate atgal kapitalas, M, kur jūs išleisti jį? Jūs esate išleidimą toje pačioje vietoje. Ir taip tos tų logika pagrindinės sąvokos tai tik Kapitalizacija pirmąją raidę nebent jūs pakartoti su I arba A už kilpa arba while cikle, jis nesiruošia nieko daugiau, nei jūs paprašykite jį daryti. Geras klausimas. Taip? Auditorija: Kodėl naudoti dereference būdas, o ne masyvas? David J. Malan: Ak, geras klausimas. Kodėl jūs naudojate dereference metodas vietoj masyvo metodas? Jokios ypatingos priežasties, turi būti sąžiningas. Ir, tiesą sakant, tai rūšies, pavyzdžiui, į dešinę, Aš tiesiog teigdamas, todėl programa sudėtingesnė, daugiau akys stiklinimas daugiau, žmonės patikrinti nes tai atrodo super slaptas, tačiau nors ji daro tą patį. Ir taip, atvirai, tai yra be reikalo vizualiai sudėtingas sprendimas į problemą. Jis vis dar geras dizainas, penki iš penkių projektavimo, ar tai skliausteliuose žymėjimas arba žymėjimo žymeklis. But-- ypač kai mes gauname vėliau kursuose PSet 5 kai mes įgyvendinti šį žodyną Minėjau iš times-- pora mes iš tikrųjų rūpi žemo lygio atminties adresai kad mes tikrai suprantame, kas vyksta. Bet, dabar, pasirodo, kad šis eilutę kodo čia laužtiniuose skliaustuose ne tikrai egzistuoja. Jie yra tai, kas vadinama sintaksinis cukraus, kuris yra tik keistai kietas būdas sakydamas kompiliatorius paverčia skliaustus, kad būtų kad matematinė išraiška. Taigi, tai žmogaus konvencija kad būtų galima tiesiog rašyti Šie patogus naudoti skliausteliuose. Bet kas sudarytojas, žvangėjimas, tikrai daro bet kuriuo metu rašote, kas pabrėžiama linija 24, po gaubtu, tai tikrai konvertuojant jį į tai. Tai tiesiog malonesnis kaip žmogaus skaityti ir rašyti kodą kaip 24 eilutės. Bet galų gale tie, mokymo ratai per pleiskanoti Kai vienas savo Comfort stiprėja. Visos teisės, todėl prisimenu tada, kad ši buvo didžiausia problema rūšiuoti nubėgome į. Ir tai, kas sukėlė šį visumą velniškai pokalbis apie rodykles, ir adresai, ir kopijavimas dalykų. Tai buvo, nes mes jo užkliūti Tai kvaila, kvaila problema, kur Aš įgyvendinama logically-- su Lauren čia ant demo ir apelsinų sulčių į milk-- puikiai algoritmiškai teisinga funkcija už Swapping dviejų kintamųjų " vertės, bet velniškai dalykas neturėjo jokių patvari, arba nuolatinis, poveikis mano kodas. Ir kodėl tai buvo? Trumpai tariant, kodėl tai įgyvendinimas apsikeitimo logiškai teisinga, tačiau neturi įtakos kintamieji, kurios perduodamos į jį, kaip x ir Y pagrindinis? Koks buvo šio klausimo esmė? Taip? Auditorija: Kadangi kintamasis padarė kopijos kintamasis perdavimo per funkcija. David J. Malan: Būtent, kai pravažiuojate kintamuosius į funkciją, ar argumentai į funkciją, jie praėjo egzempliorius, kuris reiškia, kad gausite identišką ieško modelis bitai abiejų x ir y, čia vadinamas a ir b. Ir jūs galite padaryti bet ką norite su šiais egzemplioriais, bet jie ketina turėti ne Poveikis skambinančio funkcija. Ir, tiesą sakant, mes atkreipė kad nuotrauka ant ekrano, prisiminti Paskutinį kartą, kuriuo, jei jums tikrai manau, kad apie tai, kas vyksta po jei hood-- Tai jūsų kompiuterio atmintyje, ir žemyn čia yra riekė atminties naudojama pagrindinė, tai yra su korinio atminties naudojama apsikeitimo, ir net jei pagrindinis turi du kintamieji, X ir Y, apsikeitimo gali turėti identiškas ieško vertybės, kurios abi yra 1 ir 2 dalyse, bet jie visiškai skirtingi gabalai atminties. Taigi, mes turime išspręsti šią. Ir tiesą sakant, atrodo, kad mes dabar turi išspręsti šią problemą, į dešinę. Jei dabar mes turime galimybę manipuliuoti būdu adresų ir, rūšiuoti loviai ir kopėčios stilius, atlikite šiuos rodykles ir niekur mes norime atmintyje, mes negalėjome išspręsti šią problemą Pereinant nuo pagrindinės apsikeitimo ne vertybės norime apsikeitimo, bet tiesiog intuityviai Ką galėtume perduoti apsikeitimo vietoj? [Tarpines BALSAS] David J. Malan: kodėl ne mes tiesiog perduoti jį adresai, tiesa? Kodėl mes suteikiame sukeisti lobių žemėlapį, jei norite, kuris veda jį į faktiniai dydžiai x ir y. Leiskite apsikeitimo, iš tikrųjų keisti tie originalūs, o ne bitai tik artimųjų kopijas bitai. Ir taip, iš tiesų, tai, kas yra bus sprendimas. Ši versija čia yra aiškiai bloga ir trūkumų. Ir dabar, iš pirmo žvilgsnio, tai tiesiog atrodo kaip mes pridėjo žvaigždžių krūva atsitiktinai ir kirto mūsų pirštai kad būtų surinkti. Bet dabar jis kaupia. Bet pažiūrėkime, kas tai. Ir, deja, autorių C galėjo pasirinkti kitą simbolį kad tai šiek tiek aiškesnis, bet žvaigždė operatorius turi skirtingą reikšmę dviejuose skirtinguose kontekstuose. Ir mes matėme tiek, bet tegul atskirti. Taigi iki ne ten viršuje, kai aš pakeitė a ir b gražu int yra į blogas versija int žvaigždės, A ir B Anksčiau buvo sveikieji skaičiai. Kas yra A ir B dabar geras, žalia versija? Jie adresus. Adresai, ką, kad būtų aišku? Adresai sveikųjų skaičių. Taigi dėl to, kad aš sakydamas int žvaigždučių priemonės tai yra adresas sveikasis skaičius, konkrečiai. Taigi, dabar apie tai pranešusios, kodas linijų, kažkas pasikeitė per daug. tmp lieka ta pati, nes tai tik laikinas sveikasis skaičius, nėra atminties magija ten. Bet dabar reikia žvaigždė. Ir, iš tiesų, kiekvienas kita paminėjimas A ir B, pastebėsite, kad visi tai keičiasi iš raudonos į žalią yra tai, kad aš priešdėlį tie kintamieji su žvaigždėmis. Nes aš nenoriu kopijuoti ir b. Nes jei aš tiesiog nukopijuokite a ir b ir apsikeitimo a ir b, ką aš iš tikrųjų Swapping? Tik adresai, noriu sukeisti kas tose adresus. Noriu ten. Ir taip žvaigždė operatorius viduje mano funkcija, ne viduje parametrų sąraše, reiškia, kad jūs einate į šių adresų ir iš tikrųjų pakeisti šias vertybes. Taigi, ką paveikslėlį dabar atrodo vietoj. Na, jei ne aš artimųjų į A ir B ne 1 ir 2-- Aš iš tikrųjų reikia pridėti vienas kitas apibrėžimas čia. Taigi manau, kad tai riekė atminties yra vietos 10. Tai buvimo vietos 11, bet tai yra iš supaprastinti tiek, Dabar aš turiu du pasirinkimus aš praeiti x ir y ar man praeiti jų adresus? Jei galiu perduoti savo adresus kaip šis, aš tiesiog dabar reikia įgyvendinti apsikeitimo už žalios kodas taip, kad, kai jis mato ir ją mato B, tai nereiškia tiesiog nukopijuokite A ir B ir perkelti pieno ir apelsinų sulčių. Pienas ir apelsinų sultys metafora dabar skyla, nes tie, kurie puodeliai skystų, o ne žemėlapiais. Mes vietoj reikia eiti spręsti 10 ir mes reikia eiti spręsti 11, ir tada atlikti šią Swapping logiką. Taigi logika yra tas pats, bet mums reikia šiek tiek kitaip nuo susipažinimo tuos kintamuosius. Ir taip galų gale, ką Programa turi atrodyti tai. Be swap.c pažodžiui nukopijuojami ir įklijuoti žalią versiją. Bet man reikia padaryti vieną pakeitimą. Tai nepakanka tik pakeisti apsikeitimo. Kokie kiti linija kodą man reikia pakeisti? Taip? AUDITORIJA: Kur ji mano argumentus. David J. Malan: Kur ji užima savo argumentus. Taigi, jei aš slinkite aukštyn į pagrindinį aš galite ne tik pereiti į x ir y, ir, pažadu, paskutinis gabalas naujos sintaksės šiandien. Man reikia praeiti ne x ir y bet x ir y adresas. Ir it turns out, simbolį kad C autoriai pasirinko yra, jei jūs čia naudoti ampersendo, o ne painioti su Bitinis ženklui, Jei naudojate ampersendo čia ir Ampersand čia Tai skaičiai, už jus, kas yra x adresas gal tai 10, kas yra adresas y, gal tai 11, ir eina tie, vietoj. Taigi daug sugerti visus iš karto. Bet pažiūrėkime, dabar greitai Mūsų likusios keturios minutės kur viskas gali pašlyti. Ir kaip panaikinti, iš tikrųjų Aš paėmė šią nuotrauką, TF paėmė šią nuotrauką per metus ar du atgal. Taigi, šis kampas yra atgal iš Eliot valgomajame. Pointeriai yra turbūt sunkiausia temą, kad mes padengti CS50. Taigi, jei jūs nerimauti rūšiuoti nuolydis yra kaip gal tai daugiau ledo ritulio lazda kaip tai, suprantame, mes rūšies artėja viršūnę sąlygos konceptualaus sudėtingumo. Ir aš auklėti tai nuotrauka, nes prisiekiu Dievui, rudenį 1996, kai aš paėmė CS50 su mano mokymo bendradarbiu, Nishat Mehta, jis sėdėjo mane į kampas Eliot D. salėje per pietus, arba vakarienė, ar kažkas bando padėti man suprasti patarimų. Ir tai, kai buvau savaitėms po ji buvo įvesta paskaita jei toks Aš pagaliau supratau patarimų. Ir aš tikiu, tikisi, kad šis bus spustelėkite toli anksčiau už jus. Tačiau suprantame, kad tai absoliučiai tarp sudėtingesnį temos mes pažvelgė. Bet tai viena iš labiausiai galingas. Ir kai jūs gaunate jį, tai tikrai visi tik ketina pagaliau atėjo kartu. Taigi būkite tikri, jis nėra reikia visa kriaukle šiandien. Taigi čia paskutinis programa mes ketiname pažvelgti. Ir mes ketiname baigti su greitai tris minutes Claymation pagaminti mūsų draugas, Nick Parlante. Štai programa, kad viršutinė dviejų linijos pareiškia kintama x ir y. Kurie abu yra adresai sveikųjų skaičių, dar žinomas kaip patarimų. Mes tada skirti pakankamai atminties saugoti int ir laikyti adresą tos atminties x. Taigi, tai dar paprasčiau nei pavyzdžiui, prieš. Duok man keturis baitų atminties, tai iš int dydis, ir įdėti, kad adresą x. Ši eilutė čia reiškia eiti į X adresą ir įdėti prasmę gyvenimą, skaičius 42 yra. Tačiau ši eilutė mane jaudina. Pažymėti Y reiškia eiti į adreso y, ir įdėti nelaimingas numeris 13 ten. Kodėl tai pavojinga, šiuo metu į story-- nors greitai papasakojo mūsų rečiau minučių here-- kodėl tai blogai man pasakyti, eikite į Y adresą? Auditorija: Jūs neturite [nesigirdi]. David J. Malan: Turiu ne įdėti ką nors į y. Taigi, kas yra iš y vertė, šiuo metu į istoriją? Mes neįsivaizduoju. Tai kai šiukšlių vertė ir nedaro Binky žinoti. Jei galėtume baigiasi šio pranešimo. [Vaizdo įrašų atkūrimas] -hey, Binky, pabusti. Atėjo laikas rodykle įdomus. -Kas tai? Sužinokite daugiau apie rodykles? Oi, Goody. -Well, Pradėti, manau, mes ketinate reikia pora patarimų. -GERAI. Šis kodas skiria dvi rodykles kuris gali nurodyti sveikaisiais skaičiais. Ok, gerai matau dvi rodyklės, tačiau jie neatrodo, kad būti nukreipta į ką nors. -Teisingai. Iš pradžių Pointeriai nenukreipkite į nieką. Tai, ką jie atkreipia dėmesį į yra vadinamas pointees ir nustatyti juos yra atskiras žingsnis. -OH, Į dešinę, į dešinę. Aš žinojau, kad. Į pointees yra atskira. Taigi, kaip jums skirti pointee? Ok, gerai šiame kodekse skiria naujas sveikas pointee, ir Šioje dalyje nustatomi x atkreipti į jį. -hey, Kad atrodo geriau. Todėl įsitikinkite, kad kažką daryti. Ok, aš dereference rodykle X saugoti skaičių 42 į savo pointee. Dėl šios apgauti, aš need my Magic Wand dereferencing. -Tavo Stebuklinga lazdele ir dereferencing? Uh, kad tai puiku. -Tai Ką kodas atrodo. Aš tiesiog įsteigti skaičių and-- [Pop GARSO] -hey, Ieškoti ten jis eina. Taigi, daro dereference pagal x taip rodyklė prieiti prie savo pointee. Šiuo atveju, 42 laikyti ten. Ei, pabandykite naudoti ją saugoti numerį 13 pro kitą žymeklis, y. -GERAI. Aš tiesiog eiti per čia y, ir gauti numeris 13 išsidėstymą aikštelėje. Ir tada į lazdelę dereferencing ir just-- [BUZZER GARSO] -OH, Ei, kad neveikia. Pasakykite, uh, Binky, aš ne manau dereferencing y yra gera idėja, nes nustatant Up pointee yra atskiras žingsnis. Ir aš nemanau, kad mes kada nors padarė. -Hmm, Geras dalykas. -Yeah, Mes skyrė rodyklę, Y, bet mes niekada nustatyti, kad jis rodo, kad pointee. -Hmm, Labai pastabus. -hey, Jūs ieško gero ten, Binky. Ar galite pataisyti taip, kad y taškai prie to paties pointee kaip x. -Sure, Aš naudoju mano stebuklinga lazdele nuo rodykle užduotį. -Ar Kad ketina būti problema, kaip ir anksčiau? Ne, tai nėra paliesti pointees. Jis tiesiog keičia vieną žymiklį atkreipti dėmesį į tas pats thing-- [Pokštelėjimas] --as kitą. -O, supratau. Dabar y taškų į tą pačią vietą kaip x. Taigi, laukti, dabar y yra fiksuota. Ji turi pointee. Taigi galite pabandyti su lazdele dereferencing vėl siųsti 13 daugiau. -OH, Gerai, čia eina. -hey, Pažvelgti, kad. Dabar dereferencing darbus y. Ir dėl to, kad patarimų dalijasi kad viena pointee, jie abu pamatyti 13. -Yeah, Dalijimasis, uh, nesvarbu. Taigi, mes ketiname pereiti vietas dabar? -OH, Atrodo mes pavėluotai. -But-- -Just Prisiminti tris žymeklį taisykles. Numeris 1, pagrindinė struktūra yra tai, kad jūs turite žymeklį, ir ji nurodo perkelti į pointee. Bet žymeklis ir pointee yra atskira. Ir dažna klaida yra įsteigti žymiklį bet pamiršti suteikti jai pointee. Numeris 2, žymeklis dereferencing prasideda rodyklės ir taip savo rodyklę virš prieiti prie savo pointee. Kaip mes visi žinome, tai veikia tik tada, kai yra pointee, kokios gauna atgal į Taisyklė numeris 1. Numeris 3, žymeklis užduotis trunka vieną žymiklį ir keičia ją atkreipti dėmesį į pats pointee kaip kitą rodyklę. Taigi po perleidimo, dvi rodykles bus taškas į tą patį pointee, kartais, kad vadinama dalijimosi. Ir tai viskas yra į jį, tikrai. Čučumuiža dabar. [PABAIGA PLAYBACK] David J. Malan: Štai jį CS50. Ačiū profesoriui Nick Parlante. Mes jus pamatyti kitą savaitę. [Elektroninės muzikos žaisti]