[Musik spiller] DAVID J. MALAN: Dette er ligesom en freshman seminar i dag. OK. Så meget regnfulde ud. Denne tendens til at ske om onsdagen, men så meget desto mere mulighed for spørgsmål i dag. Så lad os starte faktisk med filmen på bare et øjeblik. Men vi starter prægtigt som altid. Dette er CS50, og dette er slutningen af ​​ugen 4. Så hvis du nogensinde har set TV eller en film, hvori der er nogle computer eksperter og politiet, eller FBI, eller nogle agentur forsøger at fange nogle modstander, ja, du har sikkert hørt udtrykket "forbedre" hvorved der tekniker eller anden måde magisk zoomer i uendeligt langt for at se de kriminelle identitet eller nummerpladen i selv de glitre af et spejl eller glimt af en persons øjne. Så ja, lad os tage et kig på et par sådanne scener fra Hollywood. [VIDEO PLAYBACK] -OK, Lad os nu få et godt kig på dig. -Hold det. Kør det tilbage. -Vent et minut. Gå til højre. -Der, Fryse det. -Fuld skærm. -OK, Fryse det. Stramme op op på dette, vil du? -Vector Ind på at fyr af baghjulet. -Zoom I lige her på dette sted. -Med Det rigtige udstyr, billedet kan blive udvidet og skærpet. -Hvad er det? -Det Er en forbedring program. Kan du klare at op nogen? -Jeg ved ikke. Lad os styrke det. -Enhance Afsnit A6. -I Forbedret detaljen, og-- Jeg tror, ​​der er nok til at forbedre, frigive den til min skærm. -Jeg Forbedret refleksion i hendes øjne. -Lad Os køre dette gennem video ekstraudstyr. -Edgar, Kan du forbedre dette? -Hæng i. -Jeg Har arbejdet på denne refleksion. -Someone Refleksion. -Reflection. -Der Er en afspejling af mandens ansigt. -Den Refleksion. -Der Er en refleksion. -Zoom Ind på spejlet. -Du Kan se en refleksion. -Kan Du styrke billedet herfra? -Kan Du øge ham lige her? -Kan Du forbedre det? Kan du forbedre det? -Kan Vi styrke denne? -Kan Du forbedre det? -Hold på en anden, vil jeg forbedre. -Zoom I på døren. -Times 10. -Zoom. -Flytte ind. -Mere. -Wait, Stop. -Stop. -Pause Det. -Rotate Os 75 grader omkring den lodrette, tak. -Stop. Gå tilbage til den del om døren, igen. -Got Et billede forstærker, der kan bitmap? -Hey, Måske vi kan bruge Pradeep Sen metode til at se ind i vinduerne. -Denne Software er state of the art. -Den Egenværdi er slukket. -Med Højre kombination af algorithm-- -Han Er taget elimination algoritmer til det næste niveau, og jeg kan bruge dem til at forbedre dette fotografi. -Lock På og forstørre z-aksen. -Enhance. -Enhance. -Enhance. -Freeze Og styrke. [END AFSPIL] DAVID J. MALAN: Okay, så alle disse er faktisk ord. De er bare hængte sammen i en måde, der er faktisk ikke fornuftigt. Og i virkeligheden, CS50 og kurser som det har tendens til at ødelægge en masse tv og film for dig. Fordi når disse edb-eksperter er raslende off vilkår og siger fancy ting som egenvektorer, og z-aksen, og et antal andre faktisk mere tekniske termer, de er virkelig bare snor ord sammen alt for ofte. Er det en af ​​vores forhåbninger er, som en bivirkning af at tage kurser som denne, mere vil folk i verden faktisk være i stand til at veje i og bare nogensinde så lidt indflydelse på kvaliteten og nøjagtigheden af ​​disse film? Faktisk, lad os tage et kig på virkeligheden. Så her er personale foto af Mary, en af ​​vores undervisning stipendiater. Og vel er hun mistænkt for noget. Og alligevel er der et glimt af nogle stykke bevismateriale i øjet, eller refleksion af hendes briller. Tja, hvis vi gør præcis som filmene foreslå, hvor vi zoome og "styrke", dette er, hvor meget information er i Marys ansigt når du tager et billede med den oprindelige opløsning. Og i virkeligheden, kan du se disse prikker. Og disse er hvad er kaldes pixel, P-I-X-E-L-S, som er lige en firkant typisk der er en prik, der komponerer et billede. Og tilbage i dag, og faktisk endnu i dag med nogle af nutidens LED-TV eller LCD-tv, hvis du har fået en i dit værelse eller derhjemme, hvis du går op super tæt på det, og især hvis det er en lidt ældre TV, kan du sikkert selv se disse prikker og det er hvad komponere et billede. Og der er ikke mere information end dette. Vi kunne "forbedre", i den forstand, udjævning over tingene og sortering af udlede slags, hvad slags farve skal være ved siden af ​​Marys øjne så det er faktisk ikke så pixeleret. Men hvis jeg bliver ved at zoome ind, der er den dårlige fyr i hendes øje. Ligesom det er alle de oplysninger, vi har. Du kan ikke oprette oplysninger ud af ingenting. Der er kun en begrænset antallet af bits der. Så i Problem Set 4, hvor du har en mulighed at lege med dette slags verden. I Problem Set 4, vil du udforske verden af ​​grafik og retsvidenskab, og faktisk skrive kode der genvinder tabt billeder. Du vil skrive kode, der manipulerer eksisterende billeder og i sidste ende forstå, hvad der er foregår under kølerhjelmen. Og det viser sig, det er faktisk ikke alt, kompliceret. For eksempel, hvis vi ønskede at repræsenterer et smilende ansigt, hvor med disse sorte pixels, eller disse sorte prikker, godt, vi kunne simpelthen repræsentere dem som i sandhed en bitmap. Og hvis du nogensinde havde hørt, at ekspression bitmap, måske det nu begynder at foretage en lidt mere mening i dag. Vi ved allerede, hvad en bit er. Det er 0 eller 1. Og et kort er bare noget som et stykke papir der giver dig retninger og har måske et gitter af x- og y-koordinater. Så her er en bitmap. Det er et kort over bits hvorved en 1 tilsyneladende kommer til at udgøre en hvid pixel og en 0 vil repræsentere en sort pixel. Men vi kunne helt sikkert vende det rundt. Det er faktisk ligegyldigt, så længe vi er konsekvente. Og her er, hvordan man i binary-- inde af en computers hukommelse, eller endda inde af en fil på din harddisk drive-- kunne du gemme den enkleste af smiley ansigtsbilleder. Men hvad skal vi naturligvis mangler i dette billede? Farve, ikke? Det er et oplagt næste skridt eller enhancement at forbedre denne med farve. Så desværre med blot et enkelt bit, 0 eller 1, kunne vi repræsentere farve. Det kunne være rød eller blå, eller sort eller hvid, eller grøn, eller pink, eller eventuelle par af farver. Men for nemheds skyld, vi får bare antage sort og hvid. Så hvad logisk har vi brug for, hvis vi ønsker at gennemføre farve i et billede? Hvad skal vi gøre? Ligesom hvis den begrænsende faktor her er, at man lidt med du kan kun repræsenterer to stater, 0 eller 1, hvid eller sort, hvad vil du gøre? Publikum: Flere oplysninger. DAVID J. MALAN: Flere bits, yeah flere data, flere bits. Og, ja, det er præcis, hvordan farvebilleder er repræsenteret. I stedet for at bruge en enkelt bit, et 0 eller 1 for hver pixel, hver prik, du bare bruge flere. Måske bruge 8, måske, mere almindeligt bruge 24, og ja, i Problem Set 4, vil du spille med en fil format, der bruger 24 bit typisk. Men de fleste af jer er formentlig fortrolig med JPEG. Hvis du nogensinde har taget et foto på din telefon, eller uploades eller set noget på Facebook eller Flickr, et vilkårligt antal af foto-baserede hjemmesider, du har sandsynligvis set et JPEG-billede før. Og det viser sig, det er filen format vi vil bruge i pset 4, hvorved du kommer til at nødt til at gendanne billeder at jeg ved et uheld har slettet fra en beskadiget hukommelseskort i kameraet, hvis du vil. Og det viser sig, at selv om JPEG er temmelig sophisticated-- det er meget mere sofistikeret end de sorte og hvide prikker vi så et øjeblik siden, fordi der er faktisk fancy algoritmer, anvendes til at komprimere en JPEG, så at du kan have en virkelig rart, kvalitet billede, men ved hjælp af relativt få bit. Og vi vil komme tilbage til komprimering inden længe. Det viser sig, at den første tre bytes i et JPEG image-- uanset hvad du har taget et fotografi of-- er værdierne 255, 216, 255. Med andre ord, hvis du bare se mønster af bits, her repræsenteret som tre byte eller 24 bit i alt, med stor sandsynlighed kan udlede, at du kigger på det på denne første tre bytes af en JPEG. Og det er hvad der er kendt som undertegnelsen af ​​en JPEG. En masse af filformater derude en tendens til at starte med visse mønstre af 0'er og 1-taller, så Windows og Mac OS, og iOS, og Android ved, hvilken slags fil, de er, i tillæg til den såkaldte fil udvidelse, der en masse filer har. Hvis du har .jpg, det er endnu et fingerpeg til computeren. Så lad os nu se på dette lidt mere teknisk. Vi kender decimal Systemet er 0 til 9. Vi ved binære er 0 og 1. Og hvis du tænker tilbage på pset 0, vi havde du kæmper med, for en lille smule, noget kaldet hexadecimal, hvor du har 16 cifre, i stedet for 10 eller i stedet for 2. Og disse tal, efter sædvane, er 0 til 9 og derefter en gennem f, hvor f repræsenterer det decimaltal, ligesom en hurtig fornuft tjek? Så 15. Og en skal repræsentere 10, blot ved karakteren af ​​den bestilling, som jeg har givet. Det er bare en vilkårlig konvention, men det er helt standard. Så hvis vi ser på dette mønster af tre bytes-- lad os bare begynde at se på det i overensstemmelse med, hvordan dataloger generelt se på og tænke over filer. Du kan helt sikkert tænke over filer i 0'erne, og 1-taller og decimal, men i virkeligheden, er vi tilbøjelige til at bruge binær eller mere typisk hexadecimal-- tilbage fra pset 0. Så lad mig foreslå, at 255, 216, og 255 er netop disse mønstre af 0'er og 1-taller. Og du kan tjekke dette, hvis du ønsker at gøre det math fra uge 0. Men, for nu, bare antage at dette faktisk er korrekt. Jeg har lige omskrevet tre decimal numre som tre binære værdier. Nu, hvad jeg har tænkt mig at gøre, er blot tilføje nogle hvide rum, bare for læsbarheden skyld. Og varsel, jeg bare at flytte tingene fra hinanden. Så før, efter, før, efter. Jeg gør intet interessant andre end blot at sprede tingene ud, så meddelelsen hvert sæt af otte bits er nu to sæt af fire bits. Dette er nyttigt, fordi hexadecimal er særlig mode fordi hver hexadecimalt ciffer 0 til f, eller mere specifikt fra 0 til 15, kan repræsenteres med præcis fire bits. Med andre ord, i hexadecimal hvis du ønsker at repræsentere en 0, det er bare 0000, fire nuller. Og hvis du ønsker at repræsentere 15, det er 1111, hvilket er fire bit. Og hvis du gør det math, hvis dette er dem sted, dette er 16s sted, der kommer til at give du-- snarere, at der foregår at-- undskyld, i binær, der kommer til at give dig 15, dem sted, Toere sted, fours og ottere sted. Så lad mig foreslå, at der sæt af fire bit til venstre er, hvad vi vil kalde f. Det er det største antal, du kan repræsentere med fire bits. Og vi allerede kender fra hexadecimal, f er den største ciffer i hexadecimal. Vi har fået en anden f der, to mere derovre. Og for nu, bare tage på tro at jeg har gjort det math ret og at den venstre halvdel af disse bits, 1101, er det samme som d i hexadecimal. Og højre, 1000, er kun 8. Og at ens let at se, ikke? Den 8 represents-- er rigtigt nedenunder, ottere sted. Så vi har en i ottere kolonnen og intet i fours, toere eller dem. Så nu mere konventionelt, mennesker har en tendens til at skrive hexadecimale cifre som denne, du bare klemme dem sammen, og du derefter præfiks dem med 0x. Det betyder intet andet end en visuel fingerpeg til en human-- her kommer en hexadecimal value-- fordi det måske ikke ellers være indlysende. Hvilket vil sige, i sidste ende, at mønstret af nuller og ettaller, eller mønstret af hexadecimale cifre tilsvarende, at du er kommer til at begynde at lede efter i Problem Set 4 er denne-- Og problemet Set 4 spec vil gå dig gennem denne mere detail-- men indse som en slags mystisk som dette ser måske ved første øjekast, du vil begynde at se det en masse. Og faktisk selv i GDB, den debugger vi indført på mandag og Dan introducerer i pset 3, går til ofte vise dig hexadecimale værdier bare fordi de har tendens til at være mere konventionel end decimal eller binær i verden af ​​computere. Lad os nu sætte dette ind i en sammenhæng. Mange af jer måske huske dette billede her, som kom fra hvad? Vista, så selv tidligere end at Windows XP gjorde dette debut. Så dette er et smukt landskab. Og i virkeligheden, hvis du stikke rundt online-- Jeg synes det er en Wikipedia-artikel, hvor en person meget forbavsende gik ud fandt denne sted i verden oprettet hans eller hendes kamera i netop den rigtige sted-- og det i dag ser like-- men Det er præcis den samme indstilling. Dette billede er dog, i en fil format kaldet bitmap, b-m-s. Og vi kommer til at tage en super hurtigt blik på, hvad det betyder. Men bitmap er bare en anden måde at repræsenterer billeder stadig bruger pixel i 0'er og 1-taller, i sidste ende. Men på hurtigt blik, har det en mere interessant signatur ved begyndelsen af ​​filen. Det er ikke kun tre bytes, snarere er der en hel masse mønstre af bytes der har forudbestemt mening. For eksempel, et sted i første par bytes af en bitmap billede bliver størrelsen af billede, bredden af ​​billedet, højden af ​​billedet, så nyttige metadata, hvis du vil. Nyttige oplysninger, som Photoshop eller noget grafik programmerer du bruger kan faktisk bekymrer sig om. Så mere om dette i Problem Set 4, men dette er kun at sige, at ved slutningen af ​​dagen alle de filformater du har brugt for years-- Microsoft Word-filer, Numbers filer, Excel-filer, vilkårligt antal filformater at kunne have en vis kendt filtype er blot 0'er og 1'ere nedenunder hætten. Og mennesker har besluttet hvad konventionerne er, hvilke mønstre af 0'er og 1'ere repræsenterer en Word-fil versus en Excel-fil, versus en række andre filformater. Så i pset 4, vil du have en mulighed for at spille med. Men det mener, hvad gør for at have en struct. Dette er faktisk en dejlig segue nu i C, som kun har et par af ekstra funktioner, Vi har ikke set på endnu. Det er en temmelig lille sprog, og en af de gode funktioner om C er en struct. For eksempel, hvis du ønskede at represent-- lad os sige, at du ønskede at have en variabel, repræsenterer en studerende i nogle program. Måske var du skrive et kursus registrering program eller kerne shopping værktøj, eller noget lignende. Hvad er stykker af data vedrørende til en studerende, der kommer til at tænke på? Ligesom en studerende er repræsenteret med hvilke værdier? Ja? Du har et navn som studerende. Hvad betyder en typisk elev have? PUBLIKUM: [uhørligt] DAVID J. MALAN: Så, undskyld. PUBLIKUM: Alder. DAVID J. MALAN: En alder eller fødselsdag ækvivalent, jep. Hvad ellers? PUBLIKUM: id-nummer? DAVID J. MALAN: Så et ID-nummer, måske et telefonnummer, måske en sovesal, eller hus, eller college, eller noget lignende. Ethvert antal stykker af data, du måtte have på din kontaktliste er det måske definere en elev. Så hvis vi ønskede at gøre dette, i kode, vi kan gøre noget simpelt som dette. Vi har måske et program, så har lad os sige, int main (void). Og hvis jeg ønsker at repræsentere en studerende jeg måtte have, for eksempel, en streng kaldet navn for denne elev, en streng kaldet sovesal for den studerende, måske en int kaldes ID for at elev. Og fordi jeg bruger streng, jeg nødt til at gå tilbage og sætte CS50.h. Måske jeg vil få brug for stdio.h. Så lad mig forebyggende gøre dem, og jeg er kommer til at kalde denne student.c for nu og gemme denne. Og nu kan jeg gøre noget med disse variabler. Og vi bare at skrive at som en kommentar i pseudokode, fordi det ikke er interessant hvad vi gør nu. OK, så dette er et program, en eller anden måde gemmer en studerende. Hvad ønsker jeg at gøre, hvis jeg ønsker at gemme to studerende? Så min første indskydelse går at være i orden, vent et minut, hvis jeg har en anden studerende, hvorfor ikke jeg bare gøre strengnavn 2, snor kollegieværelse 2, int ID2. Og vi har gjort gået ad denne vej, før og hvad var vores løsning på, hvad der synes at være slags en hackish copy paste job her? PUBLIKUM: Et array. DAVID J. MALAN: Ja, vi kunne bruge et array. Lige denne meget hurtigt bliver uhåndterlig. Du er nødt til at sortere på vilkårligt begynde at navngive alle disse variabler. Og du, mennesket, nødt til at holde spore, at OK NAME2 svarer med dorm2 svarer til ID2. Det bare bliver noget rod. Så det er meget nemmere, huske fra et par uger siden, til bare at skulle kaldes strengnavne og måske give os tre af dem. Og så måske har vi string sovesale og har tre af disse, eller med en konstant, int ids og har tre af dem. Men selv nu det føles lidt sjusket, højre. Vi taler om studerende og endnu Jeg er virkelig dvæle ved det lave niveau detaljer gennemførelsen. Den studerende er et navn og et kollegieværelse og id. Hvorfor kan jeg ikke bare erklære en variabel kaldet studerende og kalder det s. Og hvis jeg vil have en anden studerende, hvorfor jeg ikke bare kalde det t. Eller hvis jeg vil have en hel masse af studerende, hvorfor jeg ikke bare siger jeg har en hel klasse af studerende, og det er tre af dem. Med andre ord kan hvorfor ikke jeg kommer op med min egen datatype, kaldet Studerende, inden i hvilken er et navn, er et id, er et kollegieværelse, er en række andre områder. Og det viser sig du kan gøre netop dette. Så C har denne funktion, der hedder struct. Det er et sprog, funktion, giver os mulighed for at gøre netop dette. Jeg har tænkt mig at gå videre og åbne op structs.h hvor vi kommer til at se Følgende definition af en studerende. Det viser sig - og denne ene er endda enklere end den involverer et id for et øjeblik siden. Hvis du ønsker at komme med din hjemmelavede datatype, og foruden int og char og flyde og alle disse andre, der findes, du kan gøre det ved bogstaveligt skrive typedef struct, derefter nogle krøllede parenteser, inden i hvilken man liste over de variabler, du ønsker at associere med denne nye skik data skriv gerne et navn og en sovesal, og derefter efter de krøllede parenteser du giver et navn til den nye datatype. Så for eksempel, elev. Og hvad er nice om dette nu er, at hvis vi ser på den tilsvarende kode, konventionen, først af alt, er at sætte dette i en fil kaldet noget dot h, en header fil, som vi ikke har begyndte at bruge os selv for meget. Men vi kommer til at starte ved hjælp af ganske lidt nu. Og hvad vi kan gøre med dette, i sidste ende, i disse få linjer kode er erklærer præcis det datatype, en studerende. Og lad os nu bruge den. Jeg har tænkt mig at nu gå ind i en fil kaldet structs1.c. Og lad os tage et kig på en få karakteristika her. Så den ting op her er meste velkendt, og vi vil komme tilbage til hvad der ikke er kender i bare et øjeblik. Det er naturligvis også min egen header-fil, som er nyt så godt, bortset pset 3, hvor tilbagekaldelse, har vi helpers.h. Så du kan huske # include helpers.h. Hvorfor dog bruger jeg citater i stedet for vinklede beslag? Hvornår skal jeg vælge mellem dem? Næsten altid jeg synes at bruge vinklede parenteser. Og så lige pludselig på line seks Jeg bruger dobbelte anførselstegn. Hvorfor kan det være? Ja? PUBLIKUM: [uhørligt] DAVID J. MALAN: Det er en faktisk, hvad? PUBLIKUM: Det er i din IDE. DAVID J. MALAN: Ja, det er i min egentlige IDE. Og lad os ikke dvæle ved IDE, fordi det er bare et værktøj, som jeg bruger. Det er i min nuværende bibliotek, specifikt. Så structs.h er min egen fil ikke installeret i IDE, i selve operativsystemet, snarere er det i min nuværende mappe. Så konventionen er, hvis du vil at inkludere din egen header fil, du bare bruge dobbelte anførselstegn. Hvad skal vi kalde denne ting i linje 8, generelt? Dette er, hvad? #define noget. Dette repræsenterer konstanter, ikke? Hvis du ønsker at have en værdi i dit program at du bruger en hel masse gange, er det god konvention til faktor det ud, erklære den, med hash symbolet definere, så efter sædvane i alle store bogstaver word-- selvom det ikke er strengt nødvendigt, men det er menneskeligt konvention at kapitalisere konstanter så de springe ud på dig visually-- plads og derefter den værdi, du ønsker at være svarende til det konstante navn. Ingen semikolon, men du blot følge dette mønster der. Så hvad gør jeg i denne konkrete kode. Så lad os tage et kig på hovedprogrammet her. På linje 12, fordi jeg har inkluderet structs.h, Jeg har nu magisk på min rådighed en ny datatype. Jeg har ikke bare har adgang til int, og fjeldørred, og flyde, og snor, og blå og andre. Jeg har nu adgang til en studerende datatype. Så i linje 12, jeg kombinere to ideas-- én en brugerdefineret datatype og to, ved hjælp af et array. Og så i dette program, hvis Jeg ønsker at faktisk støtte tre forskellige elever i mit program, jeg kan blot sige give mig en variabel kaldet studerende, der hver især er af typen studerende, som er min brugerdefinerede datatype. Og, specielt, giv mig tre af dem i min array. Så nu, hvad gør vi i dette program? Her er bare en for-løkke iteration fra 0 til 3, fordi det er hvad værdien af ​​elever er. Jeg er bare at spørge brugeren give mig den studerendes navn. Og derefter i linje 17, vi har en hovedsagelig velkendte linje. Vi har vores gamle ven GetString til højre. Og hvad stykke syntaks er tilsyneladende nye, hvis du aldrig har programmeret i C før, og har aldrig brugt structs? Ja? PUBLIKUM: Den .name. DAVID J. MALAN: Den .name. Men det er ikke for meget af et spring, fordi nu studerende beslag jeg giver dig i'te elev. Og hvis du ønsker at dykke indersiden af ​​denne struktur, du bare bruge en enkelt periode og derefter navnet på variablen inde, eller ejendommen indeni, du ønsker at få adgang til. Ligeledes da, hvis jeg så bede bruger, giv mig den studerendes kollegieværelse, du kan ligeledes gemme det streng i kollegiet variabel inde af at de studerendes struktur. Og nu tingene bliver lidt fancy. Og det kommer til at se ved måske en masse ganske snart. Men du vil se det langt mere i pset 4, så lad os bare blik på det nu. Det viser sig, at i linie 23 gennem 38, hvad tror du jeg måske gør? Jeg har fjernet kommentarerne for i dag, men den version af koden online henvisningen har alle kommentarer. Hvad skal jeg synes at gøre? PUBLIKUM: Gemmer filen med alle de oplysninger, som brugeren har indtastet. DAVID J. MALAN: Ja, præcis, det er en ny måde at vi ser to, en anden funktion i C, hvorved jeg kan lave mine egne filer. Hidtil, næsten hver program du har skrevet, er statsløs. Så snart det er gjort kører, det er det. Der er ingen hukommelse eller erindring om det. Der er ingen fil gemt. Men hvis du ønsker at gemme input, der har skete, ligesom i et spil eller et program som dette, viser det sig, at vi kan gøre det. Og du vil se denne mere i pset 4 og i afsnit. Men denne linje 23 i det væsentlige opretter en fil kaldet students.csv. Og du måske har set det før. Selv hvis du aldrig har studeret CS før, CSV er kommaseparerede variabler. Det er ligesom en meget dårlig mands version af en Excel-fil, hvilket betyder, at det kunne åbnes i Excel og i Apple Numbers, og det har rækker og kolonner. Men det er ikke en proprietær format som Microsoft eller Apples. Det er bare kommaer adskiller værdier, som vi vil se i et øjeblik. Og bare tage et gæt. I linie 23 i det ende, min andet argument til denne nye funktion kaldet f åben for fil åben er w. Hvad kan w betegne? Ja? PUBLIKUM: Det kan du skrive til filen? DAVID J. MALAN: Den lader du skriver til filen. Så der er et par varianter at vi kan tilslutte her. Men hvis du blot ønsker at læse filen, der er at se på det og læse det i hukommelsen, du bare bruge quote citat slut "r". Hvis du ønsker at skrive til fil, du bruger citat citat slut "w". Der er også tilføje og et par andre ting Hvis du ønsker at ændre eksisterende filer. Nu vil vi holde se denne ting, så vi vil komme tilbage til linje 24. NULL, viser det sig, er en særlig værdi, kan returneres ved visse funktioner hvis noget er gået wrong-- hvis filen ikke findes, hvis du har kørt ud af hukommelsen, eller en masse andre fejl. Men for nu, lad os bare antage, at dette er bare almindelig fejlkontrol. Her på linje 26, jeg iteration fra 0 til 3 i løbet af alle mine elever. Og det er sådan slags af en ny funktion, fprintf, men bare tage et gæt. Hvis printf er bare print en formateret streng, hvad betyder fprintf formentlig betyde? PUBLIKUM: Udskriv til en fil. DAVID J. MALAN: Udskriv en formateret streng til en fil. Det er, hvad den ekstra f middel er fil. Og den nye første argument skal være den variabel, der repræsenterer din fil. Så vi bare have et format snor ligesom printf. Og selv om dette syntaks er nyt, det bare betyder stik i den studerendes navn, plug-in den studerende kollegieværelse, og derefter med fclose, lukke filen. Og så lastly-- dette er nyt og vi vil komme tilbage til dette før long-- jeg frigøre den studerende til grunde der skete op over der. Men vi vil komme tilbage til at før long-- det er på grund af, hvordan getString er faktisk arbejder under kølerhjelmen. Så lad os tage et hurtigt kig her. Hvis jeg skriver ls i min mappe, bemærke, at jeg ikke har en fil kaldet students.csv, bare ikke, findes ikke. Så hvis jeg nu kompilere dette program, gøre structs-1,. / structs-1, og jeg har tænkt mig at gå videre og skrive Andi, der bor i Berkeley på Yale. Vi bliver nødt til Rob, som bor i Thayer disse dage. Og lad os komme op med, hvor er, tror jeg, Maria er i Mather, hvis jeg har husket rigtigt. Så intet synes at ske. Men hvis jeg skriver ls nu der er students.csv. Lad os gå videre og åbne students.csv. Dette er igen en meget letvægts filformat. Men jeg har simpelthen vedtaget en konvention at jeg har to rækker og kolonner her. Den første søjle er folks fornavne. Den anden kolonne er den studerendes kollegieværelse, eller college, eller hus, eller whatnot. Og nu har jeg gemt denne permanent i en fil. Så det er ikke alt, interessant. Men dette er blot et springbræt nu at være i stand til at fortsætte information permanent. Så lad os nu se, hvad mere vi kan gøre med disse og andre funktioner. Men først, eventuelle spørgsmål? Det var en masse, og det var hurtig. Men du vil se en masse mere pset 4, samt. Ja? PUBLIKUM: Er der en måde at fortsætte med at tilføje navne til denne fil? DAVID J. MALAN: Godt spørgsmål. Er der en måde at fortsætte tilføjer navne til denne fil? Ja. Og i virkeligheden, hvis du ender up genåbne filen, du ville bruge quote citat slut "a" for append, som netop ville tilføje en ny linje, en nye linje igen og igen, nøjagtigt. Godt spørgsmål. Andre spørgsmål? Ja? PUBLIKUM: Hvis du kørte program igen lige nu, ville det holde tilføje navne til fil eller ville det åbne en ny fil? DAVID J. MALAN: Ah, godt spørgsmål. Hvis du kørte programmet igen til højre nu, måske skrevet i nye navne, ville det tilføje til filen eller overskrive filen? Sidstnævnte, fordi jeg er ikke bruger append mode. Og fordi jeg er bare blindt åbne filen til skrivning, det bare at gå at overskrive filen. Så jeg vil faktisk skal gøre er tilføje, hvis jeg vil faktisk have en langsigtet database. Nu CSV er nyttig, helt ærligt, selv for ligesom hvis du er writing-- og vi vil i sidste ende se denne senere i semestret, når vi bruger CSV-filer må til andre formål. Hvis du ønsker at gemme alle de mennesker der har registreret for nogle begivenhed, eller tilmeldt dit studiekort gruppe eller noget lignende, lagring af dataene i denne form format er super praktisk. Fordi bogstaveligt, hvis jeg var at downloade denne fil. Jeg kunne double-- og lad os faktisk prøve denne hvis jeg har Excel eller Numbers på her. Jeg har tænkt mig at højreklikke eller kontrol på Denne fil. Hovsa. Højreklik eller kontrol på Denne fil. Kom nu, er min mus ikke samarbejder. Download-- jeg har tænkt mig at hente alle filerne her, så bare så jeg kan få fat i denne. Og lad os se om det virker students.csv-- første gang Jeg har aktiveret. Nu ønsker de at se mine kontakter. Nu behøver jeg at registrere. Se, hvor nemt det er at bruge CSV-filer må? Ja, holde det ajour. OK, nu er vi klar til klassen. OK, åh, hvad er nyt? OK, tæt på. Det var magisk. OK, nu er vi nødt til at opdatere. Og nu, det glemte, hvad fil Jeg oprindeligt åbnet, men hvad en-- der vi gå. OK, så nu har vi en Excel-fil. Tak. OK, så hvad jeg gjorde, var den nemme del. Selvfølgelig kunne jeg have pre-installeret Excel eller Numbers, eller hvad programmet. Men det er rart, fordi nu kan jeg manipulere data i et standardformat. Så lad os nu kontekst skifte til hvor vi slap sidste gang, der var at starte at tage ud støttehjul. Men først, du ikke gjorde se denne tidligere frokost igen sker her på brand og Is i Cambridge, Sitar i New Haven. Tilmeld dig på CS50s hjemmeside ASAP at slutte sig til CS50 studerende og ansatte. Så vi tog uddannelse hjul off på mandag som follows-- strengen er blevet erklæret i CS50s bibliotek i nogen tid. Og det er rart, fordi det giver os til at tale om variabler som værende komplette ord og sætninger og meget mere. Men det viser sig streng findes ikke. Det er bare et synonym eller et alias, at vi har skabt for noget, faktisk er lidt mere teknisk kaldes en char *. Og ja, vi så et eksempel af et program på mandag der ikke opfører sig helt som vi forventede. Det var den fil, sammenligne-0. Og huske, at sammenligne-0, hvis Jeg kompilere mandagens program og køre sammenligne-0 og skriv mor i små bogstaver, og mor med små bogstaver igen. Programmet insisterede jeg skrive forskellige ting, selv om mor, alle i små bogstaver, er identisk visuelt. Så hvad var det korte svar for hvorfor computeren mener disse to strenge er forskellige? Ja? PUBLIKUM: [uhørligt] DAVID J. MALAN: Right. Så mor, første gang Jeg skriver det i, er ved at blive gemt et eller andet sted i min computers hukommelse, men i en anden placering end anden gang, jeg skriver i mor. Nu er det helt sikkert kunne optimeres. Computeren kan være smart og realisere disse to strenge, hey, de er identiske. Lad mig ikke redundant gemme det. Men computere ikke gøre det optimering, medmindre du fortælle dem til. Så som standard, de er bare kommer til at ende i to forskellige steder i hukommelsen. Og således være mere klar, når sammenlignede vi to strenge, de første blev kaldt s, den anden blev kaldt t, hvad der specifikt var jeg sammenligning her på linie 13? Ja. PUBLIKUM: Det er det sted i hukommelsen at den variable vil pege på. DAVID J. MALAN: Præcis, var jeg sammenligning af sted i hukommelsen at disse variabler pegede på. Så specielt hvis mor var på byte nummer 1 og 2 og 3, og 4-- fordi huske backslash 0 skal være hele vejen i slutningen. Og den anden forekomst af mor, m-o-meter, var på adressen 10, 11, 12 og 13. Jeg sammenligner 1, den pågældende adresse, denne placering i hukommelsen, mod 10, som er naturligvis ikke den samme. 1 er ikke 10. Så dette er rart i, at det er ret ligetil. Men det er problematisk, for så vidt Vi kan ikke synes at sammenligne strenge. Så fundamentally-- og på dette lave niveau, hvis du ønsker at implementere et program for at sammenligne to separate ord, at bruger har indtastet for kvalitet, gør de linje op char for char, bare i generelle vendinger, hvad skal vi gøre, tilsyneladende? Det er ikke nok bare at se på de to adresser. Hvad skal vi gøre? Ja? PUBLIKUM: gentage gennem strengen [uhørligt]. DAVID J. MALAN: Ja, lad os gentage gennem strengen. Lad os bruge en for-løkke, en while-løkke, eller uanset hvad du er mest komfortabel med. Og hvis vi har to strenge eller andet sted i hukommelsen, lad os se på hver s første tegn, så hver anden karakter, så tredje og fjerde og femte, indtil vi ramt hvilke særlige sentinel værdi? PUBLIKUM: [uhørligt] DAVID J. MALAN: Ja, det backslash nul, på hvilket tidspunkt i enten string vi kan beslutte det er det. Har vi matchede hvert enkelt tegn? Hvis ikke, return false. Hvis ja, returnere sandt. Og så det er præcis, hvad denne version af programmet sammenligne-1.c gør. Den er identisk med det, vi så på mandag, bortset fra at jeg har fået slippe af ordet string-- selv der ikke har nogen funktionel impact-- alle Jeg gør nu fjerner nogle visuelle uddannelse hjul, men at se klart, at s og t er adresser. Og det er, hvad stjernen, asterisken, repræsenterer er en adresse, også kendt mere teknisk som en pegepind. Så når jeg erklærer s på linje 9 og sige char * s, det betyder ikke give mig en streng. Det betyder at give mig en variabel, hvis formål i livet er at gemme en adresse. Fordi jeg er ved at sætte adresse af en streng ind i det. Og ja, getString, at være klar, ikke vender tilbage en streng. Det behøver ikke returnere mor backslash nul, per se. Hvad betyder getString specifikt og præcist tilbage? PUBLIKUM: [uhørligt] DAVID J. MALAN: En adresse, den adresse for det første tegn i nogle streng har fået. Og så nu ser vi en særlig søgeord igen. Og jeg hentydet til dette tidligere. Dette vil være god konvention at vi vil se igen og igen nu. Jeg kontrol for at sikre, at s er ikke nul og t er ikke null. Fordi baseret på min virkelig hurtig omtale tidligere, hvad der kunne betyde, hvis getString ikke returnerer en adresse, men N-U-L-L, som igen, nogle særlige værdi? PUBLIKUM: Fejl. DAVID J. MALAN: Det er en fejl. Noget gik galt. Og hvad der typisk kan ske, især med strings-- som kan være af ukendt længde i advance-- måske computerne ' tør for hukommelse, måske du har skrevet i sådan en lange ord eller sætning eller indsat sådan en stor essay der er bare ikke nok hukommelse. Og så getString kan ikke vende tilbage adressen på det hele, så det bare returnerer ingenting. Og det siger der er sket en fejl ved at returnere den specielle NULL værdi. Det er nul adresse, så at sige. Nu viser det sig, C leveres med en funktion, der gør, at iteration. Vi behøver ikke at gennemføre dette med en for-løkke eller en while-løkke os selv. Vi kan bruge en funktion, kaldet kortfattet, røre comp eller en snor sammenligne, hvis formål i livet er at gøre netop dette. Du giver det to pointere, to adresser, og det vil gå til disse adresser og derefter sammenligne brev til brev til brev til kvalitet, stopper kun når hvad der er sandt? Når intuitivt bør røre comp stoppe iteration, bare for at være klar? Når den rammer en omvendt skråstreg 0 i enten streng, på hvilket tidspunkt det kan bestemme har alt matches, eller har der været en uoverensstemmelse? Så hvis vi kører det nu, og prøv vores lille kapitalisering spil, så gør sammenligne-1, ./compare-1, og skriv mor med små bogstaver begge gange. Nu er det de samme ting. Og hvis jeg gør det igen med små bogstaver, og så måske store bogstaver. Nu er det faktisk skelner mellem store og små bogstaver. Så ikke alt det hårde eller magisk, men det gør nu forklare hvad der foregår under kølerhjelmen. Så hvad mere kan vi udtrække fra denne form for lektion? Så lad os tage et kig på denne. Jeg har tænkt mig at gå videre og skrive en hurtig program her kaldes kopi-0. Og lad os nu gå videre og faktisk lad os gøre denne-- med kopi-0, tage et kig på, hvad jeg har fået her. Jeg først fortælle brugeren, sige noget. Så får jeg en streng og jeg gemt det i s. Så jeg kontrollere, hvis s er lig lig NULL, bare returnere 1. Så dette er bare standard fejlkontrol. Intet interessant er sket. Og i virkeligheden, hvis vi slippe af fejlen kontrol, dette ligner uge 1 kode i øjeblikket. Men jeg er begyndt at få en lidt bedre om. Nu på linje 16, for en uge siden, måske endnu et par dage eller minutter siden, du kan sige linje 16 er at skabe en variabel kaldet t og kopiering s ind i det. Og det er en helt rimelig takeaway. Men være mere præcis nu. Hvad sker der i linje 16? Hvad der blive kopieret fra højre mod venstre? Ja? PUBLIKUM: Er t få en adresse på s? DAVID J. MALAN: Præcis, t bliver adressen på s. Så for at være klar nu, hvis jeg går tilbage til tidligere eksempel og jeg trækker ud, jeg har skrevet i. Og hvad jeg har skrevet in-- her er s, og her er, hvad jeg har skrevet i et sted i hukommelse, mor og derefter en omvendt skråstreg 0, der er tilføjet for mig. Hvad jeg gemt i her, husker, dette er ved stedet 1, 2, 3, 4, dette er, hvad der er i øjeblikket i s. Så hvis i linje 16, siger jeg give mig anden variabel kaldet t og opbevare ind på værdien af ​​s, hvad bliver gemt her vil ikke mor men snarere blot nummer 1. Så hvis vi ser fremad i dette program nu, hvad der kommer til at ske? Så bemærke, at der er denne funktion du måske har brugt denne for nogen tid siden til Cæsar, eller Vigenere, eller måske slet ikke. Jeg hævder med min printf, jeg er kommer til at udnytte kopien t. Først på linje 19, hurtig tilregnelighed kontrollere, StrLen kontrol længden af ​​t. Fordi jeg ønsker ikke at forsøge at udnytte noget hvis der ikke er nogen streng der. Hvis brugeren bare trykke Enter, der er ikke noget at udnytte. Så jeg ønsker ikke at gøre linje 21. Så linie 21 er kapitalisere hvilket bogstav, tilsyneladende i t? PUBLIKUM: m? DAVID J. MALAN: Det ser ligesom det er kopiering hvilken? PUBLIKUM: m. DAVID J. MALAN: Øh, m. OK, så det første m, fordi varsel, at jeg er passerer til toupper, som hvis du aldrig har set det, det er blot en funktion til kapitalisere som sit input. t beslag nul betyder at give mig nultegnet t. Og så hvordan gør dette billede forandring, for at være klar? Hvad skal få omskrevet eller ændret med hensyn til S og T og mor backslash nul. PUBLIKUM: [uhørligt] DAVID J. MALAN: Ja, så denne ene her blot behov for at få ændret at-- ordne denne-- har brug for at få ændret til en kapital m. Men nu, se senere i program, hvis jeg udskrive s og t, som jeg rengøre her, se hvad der er kommer til at ske udskrive s og t. Så gør copy-0, ./copy-0. Lad mig gå videre og skrive i mor i små bogstaver. Læg mærke både den oprindelige og kopien er aktiveret. Hvorfor? Nå, s og t er begge peger på, hvis du vil, det samme luns af hukommelse. Og helt ærligt, det er at få virkelig uninteresting-- den kendsgerning at vi bruger adresse nul her. Jeg mener, jeg ikke rigtig pleje hvor ting er i hukommelsen. Undskyld jeg slette lidt for meget. Men jeg kan ikke rigtig pleje hvor tingene er i hukommelsen. Og så, ja hvad programmører har tendens til at tænke over er, at når man taler om en adresse eller en pegepind, Hvem bekymrer sig om, hvor det er i hukommelsen. Jeg er ligeglad, om det er på byte en eller en milliard. Jeg bare passe, at dette variabel er effektivt peger på, at bid af hukommelse. Og så, nu, i stedet brokker i løbet af vilkårlige hukommelse adresser, lad os bare begynde at tegne pointers som pejlemærker, som pile. Så hvad s og t virkelig er, ifølge dette program, på grund af hvordan jeg skabte t, Det er blot to separate variabler peger på den samme klump hukommelse. Og vi er ligeglade hvor de er. Så vi kan abstrakt væk, detaljer. Så hvordan kan jeg løse dette? Hvis jeg vil skrive en version af kopien program, der faktisk kopierer snor og akkumulerer kun kopiere, lige intuitivt, hvad der er nødt til at være en ingrediens til vores løsning? PUBLIKUM: [uhørligt] DAVID J. MALAN: Vi har brug for en hvad? PUBLIKUM: Chunk hukommelse. DAVID J. MALAN: Vi har brug for anden luns af hukommelse, right? Vi ved ikke, hvordan man gør det endnu, nødvendigvis. Men jeg slags brug for dette til at ske så at den oprindelige mor med små bogstaver ender i den ekstra bid af hukommelse. Og så når jeg ændre det eksemplar, jeg ønsker ikke at ændre denne kopi her. Jeg stedet ønsker at ændre kun dette kopi således at den oprindelige er uændret. Så lad os se, hvordan vi kan gøre dette. I copy-1, som allerede har blevet frataget kommentar, men kommenteres online. Vi i stedet gøre det following-- disse linjer er identiske, få mig en streng og kalder det s. Men lad os nu se på et af vores mest komplekse, men den sidste af kompleksiteten for en stund, linje 16 gør præcis dette. Så hvis din comfy med den billede, vi bare drew-- give mig en ny luns af hukommelse, kopiere alt i det, lad os se, hvordan vi oversætter det til kode. Så linje 16, på venstre side, char * t giver mig denne boks herovre. Det er alt, den gør. På højre side, m Alloc, eller malloc, er hukommelse tildeling, super fancy, en kryptisk måde bare at sige give mig en luns af hukommelse. Hvor meget hukommelse har vi brug for? Tja, er lidt af en stor udtryk. Men lad os se, hvad der står her. Så dette er naturligvis, er at give mig strengen længde s. Så mor det bør være hvad? Så bare tre, ikke? mor er tre tegn. Du behøver ikke tælle backslash nul, når du taler om længden af ​​en streng, det er faktisk den humane synlige bogstaver. Så mor, så det giver mig 3. Men vent et øjeblik, jeg nu tilsætte 1. Hvorfor har jeg rent faktisk ønsker at afsætte 4 byte og ikke kun 3? Ja? PUBLIKUM: For sentinel værdi? DAVID J. MALAN: Præcis, for at sentinel værdi. For omvendt skråstreg nul, Jeg har brug for 4 byte alt. Så jeg har brug for længden af strengen plus 1. Og så bare for god measure-- selvom på dette system, det altid vil være 1-- jeg siger multipliceres af størrelsen af ​​en char. Slår ud sizeof er en operatør i C, der bare fortæller dig antal bytes, der er der kræves til en bestemt type data. Det virker ikke til arrays, typisk, nogle gange er det ikke. Men i det generelle tilfælde, no. Men det vil fortælle mig, hvor mange bytes en char er, som viser sig altid 1. Så det er ligesom at gange med 1. Så super kryptisk leder linje kode. Men alt det gør, er giver mig en luns af hukommelse. Men det synes at være at kopiere noget i denne hukommelse? Ikke endnu. Og så hvad gør jeg på linje 22, og 23, 24, 25, ja, jeg simpelthen gøre dette. Og det er en slags gamle skole ting nu. Dette er ligesom pset 2, hvor du bare flytte tingene rundt i hukommelsen, eller snarere i strenge. Så jeg iteration fra 0 til længden af ​​strengen s. Og jeg kopiere den i'te karakter i s i den i'te tegn i t. Og fordi jeg, programmøren, lavet Sørg for at afsætte præcis som mange bytes som jeg har brug for, det er perfekt en-til-en-forhold. Og jeg kopiere mor i små bogstaver til den nye. Og så endelig, jeg gør denne linje. Og så effekten er kun at udnytte denne t her. Så en masse til at absorbere, men hvis du bare overveje hvad der virkelig foregår på under kølerhjelmen er bare at flytte disse bytes rundt, alt, er nødvendig for at løse dette problem er bare for at give os denne luns af hukommelse. Nu med risiko for overvældende, lad mig vise et andet eksempel, som er næsten identiske, bortset fra denne ene linje kode. Så dette er hacker-version af dette program, hvis du vil. Men lad os bare destillere det ind i, hvad der foregår. Linje 24 bruges til at være denne t beslag i får s beslag i. Nu, jeg ændre dette til den langt mere kryptiske stjerne t plus 1 er lig med stjerne s plus 1. Så hvad der sker, og hvorfor har vi en stjerne karakter? Vi har set stjernen før, og det bliver brugt forskelligt her. Vi har tidligere set char *, nu jeg ser En stjerne i starten, og det er OK. Fordi det viser sig, at vi kan slags udlede lige fra de første principper, hvad der foregår. Så bare for at være klar, hvad er s? I sidste uge var det en streng. Det er ikke tilstrækkeligt længere. Hvad er s, specifikt? PUBLIKUM: [uhørligt] DAVID J. MALAN: Det er en pointer. Det er adressen på første tegn, vi har skrevet i. OK, hvad er t? PUBLIKUM: [uhørligt] DAVID J. MALAN: Den adressen på den første byte i t, at luns af hukommelse omfordelt. Så det viser sig, at når vi gentage fra 0 på op til strengen length-- først og fremmest, jeg starter ved 0, fordi af denne gamle skole for loop ting. Så bare for enkelhed, lad os antager, at den første linje kode er egentlig bare det, højre. Hvis jeg er nul, tilføjer nul til noget formodentlig kommer ikke til at have en effekt. Så hvad er denne ordsprog? Det viser sig, at stjernen operatør i denne sammenhæng er dereference operatør, som er lige en fancy måde at sige gå til følgende adresse. Så hvis r er adressen på den første karakter i denne klump hukommelse, * s midler gå der. Og fordi vi har tegnet billedet på denne måde, du kan vedtage Følgende mental model. Hvis dette er s, og du siger * s, * s lidt ligesom slisker og stiger, hvis du kan huske spillet fra barndommen, er som følger, at pilen og gå til adressen. * t er det samme. Så start her, gå til sin luns. Jeg kan ikke bare trække på denne skærm på den måde. * t betyder at gå her. Og så, for-løkken er lige siger flytte denne karakter her, flytte denne karakter her, flytte denne karakter her. Men hvordan gør jeg det optælling? Jeg har brug for at fortryde, hvad jeg lige slettet. Dette er, hvad der generelt kaldes pointer aritmetik, som betyder matematik med adresser. Hvis de i denne for-løkke, Jeg bliver ved forøgelse i, og s er en adresse og t er et adresse, hvis jeg bare holde tilføje 1, det betyder bare at bevæge os fremad, og frem, og sender i hukommelsen. Det er ligesom Oxford Street, gade, CS bygningen er på. CS bygninger er på 33 Oxford Street. Så hvis du skulle gøre 33 Oxford Street plus 1, der bringer dig til 34 Oxford Street, derefter 35 Oxford Street, derefter 36 Oxford Street, uanset de bygninger faktisk er - hvis de findes. Og ja, det er alt, vi gør her med pointer aritmetik. Så det er en super mystiske måde at udtrykke os selv. Men alt det der sker under kølerhjelmen er bare at følge disse adresser, ligesom efter et kort, hvis du vil, eller efter pile som Vi har tegnet på skærmen. OK, til en masse fordøje. Ethvert spørgsmål om syntaks, koncepter, pegepinde, malloc eller lignende. Ja, herovre først. PUBLIKUM: Så hvor der siger * t lig toupper * t, er, at han er at udnytte alle breve eller bare-- DAVID J. MALAN: Ah, rigtig godt spørgsmål. Så i denne linje her, 31, dette vil kapitalisere det første bogstav eller alle bogstaverne. Så lad os besvare dette ved at gå tilbage til første principper. Og første principper her mener jeg bare gå til de grundlæggende definitioner af hvad der er involveret. Så toupper er en funktion der udnytter en char. Det er alt. * t betyder gå til first-- gå til adressen i t. Så i billedet, hvis dette er den luns hukommelse vi tildelt med malloc, og det er t, * t betyder gå her. I mellemtiden er du passerer denne værdi, små bogstaver m til toupper, du får tilbage hovedstaden M, hvor er du sætte det? Du lægger det på den samme placering. Og det ved denne logik af disse grundlæggende definitioner det er kun kapitalisere det første bogstav medmindre du gentage med I eller en for-løkke eller en while-løkke, er det ikke kommer at gøre noget mere end du spørger det. Godt spørgsmål. Ja? PUBLIKUM: Hvorfor har du bruger dereference metode snarere end array? DAVID J. MALAN: Ah, godt spørgsmål. Hvorfor ville du bruge dereference metode i stedet for array metode? Ingen særlig grund, for at være ærlig. Og i virkeligheden, for det form for eksempel til højre, Jeg er bare argumenterer gøre programmet mere kompliceret, flere øjne ruder i, folk tjekker fordi det ser super mystiske, men selvom det er at gøre det samme. Og så, helt ærligt, det er en unødigt visuelt kompleks løsning på problemet. Det er stadig godt design, fem ud af fem for design, uanset om det er i holderen notation eller markøren notation. Men-- især når vi får senere i kurset i pset 5 når vi gennemføre denne ordbog, Jeg har nævnt et par gange-- Vi vil faktisk bekymrer sig om lavt niveau lageradresser at vi virkelig forstår hvad sker der. Men, for nu viser det sig, at denne linje kode her firkantede parenteser ikke rigtig eksisterer. De er, hvad der kaldes syntaktisk sukker, som er blot en underligt cool måde at sige det compiler konverterer firkantede parenteser til at være at matematisk udtryk. Så det er en menneskelig konvention at være i stand til bare at skrive disse meget brugervenlige beslag. Men hvad compileren, klang, er virkelig gør enhver tid du skriver, hvad der er fremhævet i overensstemmelse 24, under emhætten er det virkelig konvertere den til dette. Det er bare mere behagelig som et menneske at læse og skrive kode som linje 24. Men i sidste ende dem, uddannelse hjul også komme ud når ens egen komfort bliver stærkere. Okay, så huske dengang, at dette var slags største problem vi løb ind. Og det er, hvad udløste hele denne pokkers samtale om pointere, og adresser og kopiering ting. Det var fordi vi sikkerhedsafbryderen over denne dumme, dumme problem, hvorved Jeg implementeret logically-- med Lauren heroppe på demoen og appelsinjuice i milk-- en helt algoritmisk korrekt funktion til at bytte to variabler ' værdier, men den skid ikke har nogen vedvarende eller permanente, effekt på min kode. Og hvorfor var det? I en nøddeskal, hvorfor er dette implementering af swap logisk korrekt, men har ingen indvirkning om de variabler, der er gået til det, ligesom x og y til main? Hvad var kernen i problemet? Ja? PUBLIKUM: Fordi variabel lavet kopier af variabel i passet gennem funktion. DAVID J. MALAN: Præcis, når du passerer variabler i en funktion, eller argumenter ind i en funktion, de er bestået af kopi, som betyder, at du får et identisk leder mønster af bits til både x og y, kaldes her a og b. Og du kan gøre noget du vil med disse kopier, men de kommer til at have nogen virkning på den kaldende funktion. Og i virkeligheden, vi trak at billede på skærmen, tilbagekaldelse sidste gang, hvor hvis du virkelig tænke over, hvad der er foregår under hood-- hvis dette er din computers hukommelse, og hernede er luns af hukommelse, der bruges til main, dette er chunk hukommelse, der bruges til swap, og så selvom main har to variabler, x og y, swap kan have identiske leder værdier, som begge er 1 og 2, men de er helt forskellige bidder af hukommelsen. Så vi har brug for en løsning på dette. Og helt ærligt, ville det ud til, at vi nu har en løsning på dette problem, højre. Hvis vi nu har mulighed for at manipulere ting ved hjælp af adresser og, en slags sliske og stiger stil, skal du følge disse pile og gå overalt vi ønsker i hukommelsen, kunne vi ikke løse dette problem ved passerer fra vigtigste at bytte ikke de værdier, vi ønsker at swap, men bare intuitivt hvad kunne vi passerer at bytte i stedet? [Indskyde VOICES] DAVID J. MALAN: Hvorfor vi ikke bare passere det adresserne, ikke? Hvorfor har vi ikke give swap en skattekort, hvis du vil, der fører det til faktiske værdier x og y. Lad os bytte, rent faktisk at ændre disse oprindelige bits, snarere end blot passerer kopier af bits. Og så, i virkeligheden, det er hvad er kommer til at være løsningen. Denne version her er klart dårlig og mangelfuld. Og nu, ved første øjekast, det bare ser ligesom vi tilføjet en masse stjerner tilfældigt og krydsede vores fingre at det ville kompilere. Men, ville det nu kompilere. Men lad os se, hvad disse ting betyder. Og desværre forfattere C kunne have valgt et andet symbol at gøre dette til en lille klarere, men stjernen operatør har forskellig betydning i to forskellige sammenhænge. Og vi har set begge, men lad os skelne. Så op på toppen er der, når jeg har skiftet a og b fra at være int s i dårlige version for at int stjerner, a og b, Tidligere blev heltal. Hvad er a og b nu det gode, grønne version? De er adresser. Adresser på hvad, for at være klar? Adresser på heltal. Så det faktum, at jeg er siger int stjerne midler dette er adressen på et heltal, specifikt. Så nu meddelelse i de linjer kode, noget andet har også ændret sig. tmp forbliver den samme, fordi det er bare den midlertidige heltal, ingen hukommelse magi der. Men en nu brug for en stjerne. Og i virkeligheden, hver anden omtale af a og b, bemærke, at alle, der er skifter fra rødt til grønt er, at jeg forudfastsætte disse variable med stjerner. Fordi jeg ikke ønsker at kopiere a og b. For hvis jeg bare kopiere a og b og swap a og b, hvad er det jeg faktisk at bytte? Bare adresser, jeg ønsker at bytte hvad der er på disse adresser. Jeg ønsker at gå der. Og så stjernen operatør inde i min funktion, ikke inde i parameter listen, betyder du går til disse adresser og faktisk ændre disse værdier. Så hvad betyder billedet nu se ud som i stedet. Tja, hvis i stedet jeg passerer i for A og B ikke 1 og 2-- Jeg faktisk nødt til at tilføje én anden definition her. Så antage, at denne luns hukommelse er ved placeringen 10. Dette er ved stedet 11, men dette er lidt af en forenkling, Jeg har nu to valg gør jeg passerer x og y eller skal jeg videregive deres adresser? Hvis jeg videregive deres adresser som dette, jeg lige nu nødt til at gennemføre swap pr den grønne kode således at når den ser en og når det ser derfor b, betyder det ikke bare kopiere a og b og flyt mælk og appelsinjuice. Mælk og appelsinjuice metafor bryder nu ned, fordi de er kopper af flydende og ikke kort. Vi har i stedet brug for at gå at behandle 10 og vi nødt til at gå til adressen 11, og derefter udføre at swapping logik. Så logikken er den samme, men vi har brug for en lidt anden måde af brug af disse variabler. Og så i sidste ende, hvad det Programmet har til at ligne er det. I swap.c bogstaveligt kopieret og indsættes den grønne version. Men jeg har brug for at lave en ændring. Det er ikke nok bare at ændre swap. Hvilke andre linje kode skal jeg ændre? Ja? PUBLIKUM: Hvor det tager argumenterne. DAVID J. MALAN: Hvor det tager sin opfattelse. Så hvis jeg rulle op til main, jeg kan ikke bare passere i x og y, og, lover jeg, den sidste stykke ny syntaks dag. Jeg har brug for at passere i ikke x og y men adressen af ​​x og y. Og det viser sig, symbolet at forfatterne af C valgte er, hvis du bruger et og-tegn her, for ikke at forveksles med bitvis tegnet, hvis du bruger et og-tegn her og et og-tegn her, dette tal ud for dig, hvad er adressen på x, måske er det 10, hvad er adresse y, måske er det 11, og passerer dem i stedet. Så meget at absorbere alle på én gang. Men lad os nu se hurtigt i vores resterende fire minutter hvor tingene kan gå galt. Og som en sidebemærkning, faktisk Jeg tog dette billede, TF tog dette billede for et år eller to siden. Så dette er tilbage hjørne af Eliot Dining Hall. Pointere er måske den sværeste emne, som vi dækker i CS50. Så hvis du bekymre dig den slags af hældningen er som måske er det mere af en hockeystav som dette, indser vi slags nærmer sig et højdepunkt i form af den konceptuelle kompleksitet. Og jeg opdrage dette foto, fordi jeg sværger til Gud, i efteråret 1996, hvor jeg tog CS50 med min undervisning kolleger, Nishat Mehta, han sad mig i hjørne af Eliot D. Hall frokosten, eller middag, eller noget at prøve til at hjælpe mig med at forstå pointere. Og det er her, jeg var uger efter den blev indført i foredrag, når Jeg endelig forstod pointere. Og jeg er håbefuld, at dette vil klikke langt hurtigere for dig. Men indse dette absolut blandt de mere sofistikerede emner Vi har kigget på. Men det er blandt de mest magtfulde. Og når du får det, det er virkelig alt bare gå til endelig komme sammen. Så forvisset det ikke har brug for at alle vask i dag. Så her er det sidste program vi kommer til at se på. Og vi kommer til at ende med en hurtig tre minutter af claymation lavet af vores ven, Nick Parlante. Her er et program, der på de to øverste linjer erklærer en variabel x og y. Som begge er adresser af heltal, alias pointere. Vi derefter allokere nok hukommelse til at gemme en int og gemme adressen af denne hukommelse i x. Så det er endnu nemmere end eksemplet før. Giv mig fire bytes hukommelse, der er på størrelse med en int, og sætte denne adresse i x. Denne linje betyder her gå til adressen i x og sætte betydningen af liv, nummer 42 der. Men denne linje bekymrer mig. Stjerne y betyder gå til adressen i y, og sætte den uheldige nummer 13 der. Hvorfor er det farligt, på dette tidspunkt i story-- omend hurtigt at vide i vore svindende minutter her-- hvorfor er det dårligt for mig at sige, gå til adressen i y? PUBLIKUM: Du har ikke [uhørligt]. DAVID J. MALAN: Jeg har ikke sætte noget i y. Så hvad er værdien af ​​y, på dette tidspunkt i historien? Vi har ingen idé. Det er nogle skrald værdi og heller ikke Binky kender. Hvis vi kunne ende på denne note. [VIDEO PLAYBACK] -Hey, Binky, vågne op. Det er tid til pointer sjov. -Hvad er det? Lær om pointers? Åh, goody. Tja, komme i gang, jeg tror vi er vil få brug for et par pointers. -OK. Denne kode tildeler to pejlemærker der kan pege på heltal. -OK, Godt jeg ser to pointere, men de synes ikke at pege på noget. -Det er rigtigt. Oprindeligt pointere ikke pege på noget. De ting, de peger på er kaldet pointees og indstille dem er et separat trin. -OH, Højre, højre. Jeg vidste, at. De pointees er adskilt. Så hvordan kan du tildele en pointee? -OK, Godt denne kode allokerer en ny heltal pointee, og denne del sæt x til at pege på den. Hey, der ser bedre. Så gør det gøre noget. -OK, Jeg vil dereference markøren X til gemme nummeret 42 i sin pointee. Til dette trick, vil jeg har brug for min tryllestav af dereferere. -Din Tryllestav af dereferere? Uh, det, det er fantastisk. -Det Er hvad koden ser ud. Jeg vil bare oprette nummeret og-- [POP SOUND] -Hey, Ser der det går. Så gør en dereference på x følger på pilen for at få adgang til sin pointee. I dette tilfælde, for at lagre 42 derinde. Hey, prøve at bruge den til at gemme nummeret 13 gennem den anden pointer, y. -OK. Jeg vil bare gå over her til y, og få nummer 13 oprettet. Og derefter tage staven af dereferere og bare-- [BUZZER SOUND] -OH, Hey, der fungerede. Sige, øh, Binky, det gør jeg ikke tror dereferere y er en god idé, fordi indstillingen op pointee er et separat trin. Og jeg tror ikke, vi nogensinde gjorde det. -Hmm, God pointe. -Ja, Vi tildelt markøren, y, men vi satte det aldrig til at pege på en pointee. -Hmm, Meget opmærksomme. -Hey, Du søger god der, Binky. Kan du lave det, så y punkter til samme pointee som x. -Sure, Jeg bruge min tryllestav af pointer opgave. -er Der vil være en problem, som før? -Nej, Betyder det ikke røre pointees. Det ændrer blot én pointer til at pege på den samme thing-- [Poppende lyd] --as anden. -Ah, javel. Nu y peger på det samme sted som x. Så vent, nu y er fast. Det har en pointee. Så du kan prøve staven af dereferere igen for at sende 13 i. -OH, OK, her går. -Hey, Se på det. Nu dereferere værker på y. Og fordi de pejlemærker deler at en pointee, de begge ser 13. -Ja, Deling, øh, uanset hvad. Så vi kommer til at skifte steder nu? -OH, Ser vi er ude af tid. -But-- -Just Huske de tre pointer regler. Nummer 1, grundstrukturen er, at du har en pegepind, og den peger til et pointee. Men markøren og pointee er adskilt. Og den fælles fejl er at oprette en pointer men at glemme at give det en pointee. Nummer 2, pointer dereferere starter ved markøren og følger sin pilen hen over at få adgang til sin pointee. Som vi alle ved, det virker kun, hvis der er en pointee, hvilken slags kommer tilbage at herske nummer 1. Nummer 3, pointer Opgaven tager en pointer og ændrer det til at pege på den samme pointee som en anden pointer. Så efter opgaven, de to pointere vil pege på den samme pointee, undertiden som kaldes deling. Og det er alt der er til det, virkelig. Bye-bye nu. [END AFSPIL] DAVID J. MALAN: Det er det for CS50. Takket være professor Nick Parlante. Vi vil se dig i næste uge. [ELEKTRONISK musik spiller]