>> [MUSIK SPELA]
David J. MALAN: Detta är som en förstaårselev seminarium i dag.
OK.
Så mycket regniga ut.
Detta tenderar att ske på onsdagar, men desto mer möjligheter
för frågor i dag.
Så låt oss börja faktiskt med filmen på bara ett ögonblick.
Men vi börjar storslaget som alltid.
>> Detta är CS50, och detta är slutet av vecka 4.
Så om du någonsin har sett TV eller se en film, där
det finns vissa dataexperter och polisen eller FBI, eller någon byrå
försöker fånga några motståndare, ja, du har
säkert hört uttrycket "förbättra" varvid att teknikern på något sätt
magiskt zoomar in oändligt långt för att se brottslingar
identitet eller registreringsnumret även i de skimmer av en spegel
eller glimt av någons ögon.
Så ja, låt oss ta en titt på några sådana scener från Hollywood.
[VIDEOAVSPELNING]
-Okej, Nu ska vi få en ordentlig titt på dig.
>> -Stopp.
Kör det tillbaka.
>> -Vänta En minut.
Gå höger.
>> -Det, Frysa det.
-Fullskärm.
-Okej, Frysa det.
-Tighten Upp på det, kommer du?
-Vector In på den killen av bakhjulet.
-ZOOM In här på denna plats.
-Med Rätt utrustning, bilden kan förstoras och skärpas.
-Vad är det?
-Det Är en förbättring program.
-Kan Du klart att upp någon?
-Jag Vet inte.
Låt oss förbättra den.
>> -Förbättra Avsnitt A6.
>> -Jag Förbättrade detalj, och-- Jag tror att det finns
tillräckligt för att förbättra, Släpp det till min skärm.
-Jag Förbättrade reflektion i hennes ögon.
>> -Vi Kör detta genom videoförbättring.
-Edgar, Kan du förbättra detta?
>> -Vänta.
>> -Jag Har arbetat med denna reflektion.
>> -Någon Reflektion.
-Reflection.
-Det Finns en återspegling av mannens ansikte.
-Den Reflektion.
-Det Finns en reflektion.
-ZOOM I på spegeln.
-Du Kan se en reflektion.
-Kan Du förbättra bilden härifrån?
-Kan Du förbättra honom just här?
-Kan Du förbättra den?
Kan du förbättra den?
>> -Kan Vi förstärka denna?
>> -Kan Du förbättra den?
-Hold På en sekund, jag förbättra.
-ZOOM I på dörren.
-Tider 10.
-ZOOM.
-Flytta in.
-mer.
-Vänta, Sluta.
-Sluta.
-Pause Den.
-Rotate Oss 75 grader runt den vertikala, tack.
-Sluta.
Gå tillbaka till den del om dörren, igen.
>> -Got En bildförstärkare som kan bitmapp?
>> -Hej, Kanske vi kan använda Pradeep Sen metod för att se in i fönstren.
-detta Programvara är state of the art.
>> -Den Egenvärde är avstängd.
>> -Med Höger kombination av algorithm--
>> -Han Är tagen eliminering algoritmer till nästa nivå,
och jag kan använda dem för att förstärka denna fotograferar.
>> -Lock På och förstora z-axeln.
>> -Förbättra.
-Freeze Och förbättra.
>> [END SPELA]
>> DAVID J. MALAN: Okej, så alla av dem är faktiskt ord.
De är bara uppträdda tillsammans i en sätt som är egentligen inte klokt.
Och i själva verket, CS50 och kurser som det tenderar att förstöra en hel del TV och filmer
för dig.
För när de dataexperter är rabbla villkor och säger
tjusiga saker som egenvektorer och z-axeln,
och vilket som helst antal andra faktiskt mer tekniska termer,
de är egentligen bara strängarna ord tillsammans alltför ofta.
Är det en av våra förhoppningar är att som en bieffekt av att ta kurser
gillar det här, fler kommer människor i värld faktiskt kunna väga in
och bara någonsin så lite påverka kvalitet och noggrannhet av dessa filmer?
>> I själva verket, låt oss ta en titt på verkligheten.
Så här är personalen foto Maria, en av våra undervisnings medmänniskor.
Och antar att hon är misstänkt för något.
Och ändå finns det en strimma av några bevis i hennes ögon,
eller i en återspegling av hennes glasögon.
Tja, om vi gör precis som filmerna föreslå, där vi in ​​och "förbättra",
detta är hur mycket information är i Marias ansikte
När du tar en bild med den ursprungliga upplösningen.
>> Och i själva verket kan du se dessa punkter.
Och dessa är vad som kallade pixlar, p-i-X-E-L-S,
vilket är bara en kvadrat typiskt det är en punkt som komponerar en bild.
Och tillbaka i dag, och faktiskt även idag med några av dagens LED-TV
eller LCD-TV, om du har en i ditt rum eller hemma,
om du går upp super nära till den, och speciellt om det är en något äldre TV,
kan du förmodligen även se dessa punkter och det är vad komponera en bild.
>> Och det finns ingen mer information än detta.
Vi kunde "öka", i betydelsen utjämning saker om och typ av
frånhändas typ av, typ av vad Färgen ska vara intill Maria öga
så att det är faktiskt inte så pixelated.
Men om jag fortsätter zoomar in, det är den dåliga killen i hennes ögon.
Som det är alla Information har vi.
Du kan inte skapa uppgifter ur ingenting.
Det finns bara en begränsad antal bitar där.
>> Så i Problem Set 4, där du har en möjlighet
att spela med den här typen av världen.
I Problem Set 4, kommer du utforska värld av grafik, och kriminalteknik,
och faktiskt skriva kod som återvinner förlorade bilder.
Du kommer att skriva kod som manipulerar befintliga bilder
och slutligen förstå vad som är pågår under huven.
>> Och visar det sig, det är faktiskt inte så komplicerat.
Till exempel, om vi ville representerar en smiley där
med dessa svarta pixlar, eller dessa svarta prickar,
Tja, vi kan helt enkelt representera dem som verkligen en bitmapp.
Och om du hade någonsin hört att uttrycks bitmapp, kanske
det börjar nu för att göra en lite mer meningsfullt i dag.
>> Vi vet redan vad lite är.
Det är 0 eller 1.
Och en karta är bara något som ett papper
som ger dig riktningar och har kanske ett rutnät av x- och y-koordinater.
Så här är en bitmapp.
Det är en karta över bitar varigenom en 1 är uppenbarligen
kommer att representera en vit pixel, och en 0 kommer att representera en svart pixel.
Men vi kan säkert vända runt.
Det spelar egentligen ingen roll så länge vi är konsekventa.
Och här är hur man i binary-- inne av en dators minne, eller till och med inne
av en fil på din hårddisk drive-- kan du spara
den enklaste av smiley ansiktsbilder.
Men vad är vi, naturligtvis, saknas i den här bilden?
Färg, eller hur?
Det är ett självklart nästa steg eller förstärkning för att förbättra detta med färg.
Så tyvärr med bara en enda bit, 0 eller 1, kan vi representerar färg.
Det kan vara röd eller blå, eller svart, eller vit eller grön, eller rosa,
eller några par av färger.
Men för enkelhets skull kommer vi bara antar svart och vitt.
>> Så vad logiskt behöver vi om vi vill implementera färg i en bild?
Vad har vi att göra?
Som om den begränsande faktorn här är att med en bit du bara kan
representerar två stater, 0 eller 1, vit eller svart, vad vill du göra?
Målgrupp: Mer data.
DAVID J. MALAN: Fler bitar, Yeah mer data, fler bitar.
Och, ja, det är exakt hur färgbilder är representerade.
Hellre än att använda en enda bit, en 0 eller 1 för varje pixel, varvid varje prick,
du bara använda flera.
Kanske använder 8, kanske, mer vanligt använder 24, och faktiskt, i Problem Set
4, kommer du att spela med en fil format som använder 24 bitar typiskt.
>> Men de flesta av er är förmodligen bekant med JPEG.
Om du någonsin har tagit ett foto på din telefon,
eller laddas upp eller sett något på Facebook eller Flickr, vilket som helst antal
fotobaserade webbplatser, du har förmodligen sett en JPEG-bild innan.
Och det visar sig, detta är filen format vi kommer att använda i PSET 4,
där du kommer att måste återskapa bilder
att jag av misstag har raderat från en skadade minneskort i kameran,
om du vill.
>> Och det visar sig att även om JPEG är ganska sophisticated--
det är mycket mer sofistikerade än de svarta och vita prickar
vi såg för en stund sedan, eftersom det finns faktiskt snygga algoritmer som
används för att komprimera en JPEG, så att du kan ha en riktigt trevlig,
bildkvalitet men med användning av relativt få bitar.
Och vi ska återkomma till kompression snart.
Det visar sig att den första tre byte i en JPEG image--
oavsett vad du har tagit ett fotografi of-- är värdena 255, 216, 255.
>> Med andra ord, om du bara se att mönstret av bitar,
representerad här som tre byte, eller 24 bitar totalt,
med stor sannolikhet kan du dra slutsatsen att du tittar på den här första tre
bytes av en JPEG.
Och detta är vad som är känt som undertecknandet av en JPEG.
En hel del filformat ute tenderar att starta
med vissa mönster av 0 och 1, så att Windows och Mac OS och IOS,
och Android vet vilken typ av fil de är, förutom den så kallade fil
tillägg som en hel del filer har.
Om du har .jpg, det är en ledtråd till datorn.
>> Så låt oss nu titta på detta lite mer tekniskt.
Vi vet decimal Systemet är 0 till 9.
Vi vet binärt är 0 och 1.
Och om du tänker tillbaka på PSET 0, hade vi att du brottas med,
för lite, något kallas hexadecimala,
där du har 16 siffror, i stället för 10 eller i stället för två.
Och dessa siffror, enligt konvention, är 0 till 9 och sedan en
till f, där f representerar vad decimaltal, precis som en snabb sanity
kolla?
Så, 15.
Och en måste representera 10, bara genom att typ av beställning som jag har gett.
Det är bara en godtycklig konvention, men det är ganska standard.
>> Så om vi ser på detta mönster av tre bytes-- låt oss
bara börja att titta på det i ett sätt som är förenligt med hur
datavetare allmänhet titta på och tänka på filer.
Du kan säkert tänka filer i 0s och 1s och decimal,
men i verkligheten, tenderar vi att använda binär eller mer typiskt hexadecimal--
tillbaka från PSET 0.
Så låt mig föreslå att 255, 216 och 255 är just dessa mönster av 0 och 1.
Och du kan kontrollera detta om du vill göra matten från vecka 0.
Men för nu, bara anta att detta verkligen är korrekt.
Jag har just skrivit om tre decimal nummer som tre binära värden.
Nu vad jag ska göra är att bara lägga till lite vitt utrymme,
bara för läsbarhet skull.
Och varsel, jag bara gå att flytta isär saker.
Så före, efter, före, efter.
Jag gör inget intressant andra än bara utspridning saker så
att kallelse varje uppsättning av åtta bitar är nu två uppsättningar av fyra bitar.
Detta är användbart eftersom hexadecimalt är särskilt modet
eftersom varje hexadecimal siffra 0 till f, eller mer specifikt 0 genom 15,
kan representeras med exakt fyra bitar.
Med andra ord, i hexadecimal om du vill representera en 0, det är bara 0000,
fyra nollor.
Och om du vill representera 15, det är 1111, vilket är fyra bitar.
Och om du gör matten, om detta är ettor plats,
detta är den 16s plats, som kommer att ge du--
snarare som kommer att-- ledsen, i binär,
det kommer att ge dig 15, som plats, Twos plats, fyror och åttor plats.
Så låt mig föreslå att det uppsättning av fyra bitar till vänster
är vad vi kommer att kalla f.
Det är det största antalet du kan representera med fyra bitar.
Och vi vet redan från hexadecimal, f är den största siffran i hexadecimalt.
Vi har en annan f där, ytterligare två borta.
Och nu, bara ta på tro att jag har gjort matten rätt
och att den vänstra halv av dessa bitar, 1101,
är samma sak som d i hexadecimal.
Och den högra, 1000, ligger bara 8.
>> Och att man är lätt att se, eller hur?
Den 8 represents-- är rätt därunder åttor plats.
Så vi har ett i åttor kolumnen och ingenting i fours, tvåor och ettor.
Så nu mer konventionellt, människor tenderar att skriva hexadecimala siffror som denna,
man bara trycka ihop dem tillsammans, och sedan prefix dem med 0x.
Det betyder inget annat än en visuell ledtråd till en human--
Här kommer en hexadecimal value-- eftersom det kanske inte annars vara uppenbart.
>> Vilket betyder att i slutändan, att mönstret av ettor och nollor,
eller mönstret för hexadecimal Siffrorna ekvivalent att du är
kommer att börja leta efter i Problem Set 4 är this--
och problemet Set 4 spec kommer att gå dig igenom detta mer detail--
men inser som en slags svårbegripliga som Detta kan se ut vid första anblicken,
du kommer att börja se detta en hel del.
Och faktiskt, även i GDB, den debugger vi infört på måndag
och Dan införs i PSET 3, går att ofta visa dig hexadecimalvärden
bara för att de tenderar att vara mer konventionell än decimal eller binärt
i världen av datorer.
Nu ska vi sätta detta i sitt sammanhang.
Många av er kanske kommer ihåg detta bild här, som kom från vad?
Vista, så ännu tidigare än det gjorde Windows XP denna debut.
Så det här är ett vackert landskap.
Och i själva verket om du rota runt online-- Jag tycker det är en Wikipedia-artikel,
där någon väldigt otroligt gick ut tyckte att det här platsen i världen som inrättats
hans eller hennes kamera i exakt rätt plats--
och detta i dag ser like-- men Det är exakt samma inställning.
Den här bilden är dock i en fil format som kallas bitmapp, b-m-p.
Och vi kommer att ta en super snabbtitt på vad det betyder.
>> Men bitmapp är bara ett annat sätt att företräder bilder fortfarande använder pixlar
i 0 och 1, i slutändan.
Men vid hastig blick, har det en mer intressant signatur
i början av filen.
Det är inte bara tre bitgrupper, snarare finns det
en massa mönster av byte som har förutbestämda mening.
Exempelvis någonstans i första byte i en bitmappsbild
kommer att vara storleken på bild, bredden av bilden,
höjden av bilden, så användbara metadata, om du kommer.
Användbar information som Photoshop eller någon grafik programmerar du använder
kan faktiskt bryr sig om.
>> Så mer om detta i Problem Set 4, men detta
är endast att säga att Vid slutet av dagen
alla filformat du har använt för years-- Microsoft Word-filer,
Numbers filer, Excel-filer, valfritt antal filformat
som kan ha några känd filändelse
är bara 0 och 1 under huven.
Och människor har beslutat vad konventionerna,
vilka mönster av 0 och 1 representerar en Word-fil jämfört med en Excel-fil,
kontra ett antal andra filformat.
Så PSET 4, har du en möjlighet att spela med det.
>> Men vad betyder det att ha en struct.
Detta är faktiskt ett trevligt SEGUE nu till C, som har endast ett par
ytterligare funktioner som Vi har inte tittat på ännu.
Det är en ganska liten språk och en av de trevliga funktioner om C är en struct.
Till exempel, om du ville represent-- låt oss
säga att du ville ha en variabel som representerar en student i något program.
Kanske du skrev en kurs registreringsprogram, eller kärn shoppa
verktyg, eller nåt sånt.
Vad är bitar av uppgifter om till en student som kommer att tänka på?
Som en student är representerad med vilka värden?
Yeah?
Du har ett namn som student.
Vad betyder en typisk studenten?
>> PUBLIK: [OHÖRBAR]
>> DAVID J. MALAN: Så, tyvärr.
>> PUBLIK: Age.
>> DAVID J. MALAN: En ålder eller födelsedag ekvivalent, yep.
Vad annars?
PUBLIK: ID-nummer?
DAVID J. MALAN: Så ett ID-nummer, kanske ett telefonnummer, kanske en sovsal eller hus,
eller högskola, eller nåt sånt.
Vilket som helst antal datadelar som du kan ha i din kontaktlista
är vad som kan definiera en student.
Så om vi ville göra detta i koden, vi kan göra något enkelt som här.
Vi kanske har ett program så att har låt oss säga, int main (void).
Och om jag vill representera en elev Jag kanske har, till exempel,
en sträng som kallas namn för den studerande, en sträng som kallas sovsal för den studerande,
kanske en int kallas ID för den studerande.
Och eftersom jag använder sträng, jag behöver gå tillbaka och sätta upp CS50.h.
Kanske jag kommer att behöva stdio.h.
Så låt mig i förebyggande syfte göra dem och jag är kommer att kalla detta student.c nu
och spara denna.
>> Och nu kan jag göra något med dessa variabler.
Och vi ska bara skriva det som en kommentar i pseudokod,
eftersom det inte är intressant vad vi gör nu.
OK, så det här är ett program som på något sätt lagrar en student.
Vad vill jag göra om jag vill lagra två studenter?
Så min första instinkt går att vara okej, vänta en minut,
om jag har en annan student gör varför inte jag bara göra string name 2, sträng sovsal 2,
int ID2.
Och vi har gjort borta denna väg innan
och vad som var vår lösning till vad som verkar att vara lite av en hackish kopiera klistra
jobb här?
Publik: En array.
DAVID J. MALAN: Ja, vi skulle kunna använda en array.
Höger detta mycket snabbt blir ohanterlig.
Du måste sortera godtyckligt börja namnge alla dessa variabler.
Och du som människa, måste hålla spåra att OK NAME2 motsvarar
med dorm2 motsvarar ID2.
Det blir bara en enda röra.
Så det är mycket enklare, minns från ett par veckor sedan,
att bara behöva kallas strängnamn och kanske ge oss tre av dessa.
Och då kanske vi har sträng sovsalar och har
tre av dessa, eller med en konstant, int ids och har tre av dem.
Men även nu det känns lite slarvigt, höger.
Vi pratar om studenter och ändå Jag är verkligen bostad på den låga nivån
genomförandet detaljer.
Studenten är ett namn och en sovsal och ID.
>> Varför kan jag inte förklara bara en variabel kallas student och kallar det är.
Och om jag vill ha en annan student, varför inte jag bara kalla det t.
Eller om jag vill ha en hel drös av studenter, varför inte jag bara
säga att jag har en hel klass av studenter, och det är tre av dem.
Med andra ord, varför kan jag inte komma med min egen datatyp, som kallas
Studenter, insida som är ett namn, är ett ID, är en sovsal,
är ett antal andra områden.
Och det visar sig att du kan göra just det.
>> Så C har denna funktion som kallas struct.
Det är ett språk funktion som tillåter oss att göra just detta.
Jag kommer att gå vidare och öppna upp structs.h
där vi kommer att se Följande definition av en student.
Det visar sig - och detta är ännu enklare än den som inbegriper ett ID
en stund sedan.
Om du vill komma med din hemgjorda datatyp,
och dessutom till int, och röding och flyter och alla dessa andra som finns,
kan du göra det genom att bokstavligen skriver typedef struct,
sedan några klammerparenteser, inuti vilken man
lista de variabler som du vill associera med detta nya anpassade uppgifter
skriver som ett namn och en sovsal, och sedan efter klammerparenteserna
du ange ett namn för den nya datatypen.
Så, till exempel, student.
>> Och vad är trevligt om detta nu är att Om vi ​​tittar på motsvarande kod,
konventionen först av allt, är att sätta detta
i en fil som heter något dot h, en header-fil, som vi inte har
började använda oss alltför mycket.
Men vi kommer att börja med hjälp av en hel del nu.
Och vad vi kan göra med detta, slutligen, i dessa få rader kod
är förklara exakt som datatyp, en student.
Och nu ska vi använda den.
>> Jag ska nu gå in en fil som heter structs1.c.
Och låt oss ta en titt på en Några egenskaper här.
Så grejer här är mestadels bekant, och vi ska
komma tillbaka till vad som inte är bekant på bara ett ögonblick.
Detta är naturligtvis inklusive mitt eget header-fil, som är ny liksom,
utom för PSET 3 där, minns, har vi helpers.h.
Så du kanske kommer ihåg #include helpers.h.
>> Varför om jag använder citat i stället för vinklade konsoler?
När väljer jag mellan dem?
Nästan alltid jag verkar att använda vinklade fästen.
Och sedan, helt plötsligt på line sex Jag använder dubbla citattecken.
Varför skulle det vara?
Yeah?
>> PUBLIK: [OHÖRBAR]
DAVID J. MALAN: Det är en faktisk, vad?
PUBLIK: Det är i IDE.
DAVID J. MALAN: Ja, det är i min faktiska IDE.
Och låt oss inte uppehålla mig vid IDE, eftersom det är bara ett verktyg som jag använder.
Det är i min nuvarande katalog, specifikt.
Så structs.h är min egen fil inte installerat i IDE,
i själva operativsystemet, utan det är i min nuvarande katalog.
Så konventionen är om du vill att inkludera din egen headerfil,
du bara använda dubbla citattecken.
>> Vad kallar vi den här saken i linje 8, generellt sett?
Det här är vad?
#define något.
Detta representerar konstanter, eller hur?
Om du vill ha en värde i ditt program
att du använder en hel gäng gånger, det är
bra konvention faktor ut, förklara den, med hash symbol
definiera, då, enligt konvention, i alla versaler word-- om det inte
absolut nödvändigt, men Det är mänskligt konvention
att kapitalisera konstanter så att de hoppar ut
på dig visually-- utrymme och då det värde du vill vara
likvärdig med den som konstant namn.
Ingen semikolon, men du helt enkelt följer detta mönster där.
>> Så vad jag gör i denna faktiska koden.
Så låt oss ta en titt på huvudprogrammet här.
I linje 12 eftersom jag har inkluderat structs.h,
Jag har nu magiskt på mitt förfogande en ny datatyp.
Jag vill inte bara ha tillgång till int, och röding, och flyta, och snöre,
och blått och andra.
Jag har nu tillgång till en typ elev data.
Så i linje 12, jag kombinera två ideas-- en en egen datatyp och två,
med användning av en matris.
Och så i detta program om Jag vill faktiskt stödja
tre olika elever i mitt program, jag
kan helt enkelt säga ge mig en variabel kallas studenter, som var och en
är av typ studenter, som är min typ anpassad uppgifter.
Och särskilt ge mig tre av de i mitt arrayen.
>> Så nu vad gör vi i det här programmet?
Här är bara en for-loop iteration 0-3, eftersom det är
vad värdet av studenter är.
Jag är bara att användaren tillfrågas ge mig studentens namn.
Och sedan i linje 17, vi har en mestadels bekant linje.
Vi har vår gamle vän GetString till höger.
Och vad bit av syntax är uppenbarligen nya,
Om du aldrig har programmerat i C innan, och har aldrig använt structs?
Yeah?
>> Publik: Den .name.
David J. MALAN: Den .name.
Men det är inte för mycket av ett språng, för nu eleverna fästet i
ger dig den i: te student.
Och om du vill dyka insidan av denna struktur,
du bara använda en enda period och sedan namnet på variabeln inuti,
eller egendom inuti som du vill få tillgång till.
På samma sätt då, om jag då uppmana användaren, ge mig studentens studentrummet,
kan på liknande sätt lagra den sträng i sovsal variabel inuti
av detta elev struktur.
>> Och nu det blir lite finare.
Och detta kommer att se på kanske en hel del ganska snart.
Men du ser så här långt mer i PSET 4, så låt oss bara blick på det nu.
Det visar sig att i linje 23 genom 38, vad tror du att jag kanske gör?
Jag har tagit bort kommentarer för idag, men version
av koden online referensen har alla kommentarer.
Vad gör jag verkar göra?
>> PUBLIK: Spara filen med alla den information som användaren angett.
>> DAVID J. MALAN: Ja, exakt, är detta ett nytt sätt
att vi ser två, annat särdrag hos C,
där jag kan skapa mina egna filer.
Hittills, nästan alla program du har skrivit är statslös.
Så snart det är gjort kör, det är det.
Det finns inget minne eller minne av det.
Det finns ingen fil sparas.
Men om du vill spara ingång som har
hände, som i ett spel eller ett program så här, visar det sig att vi kan göra det.
Och du ser detta mer i PSET 4 och i avsnitt.
Men denna linje 23 i huvudsak skapar en fil som heter students.csv.
Och du kanske har sett det här förut.
Även om du aldrig har studerat CS tidigare, CSV är kommaseparerade variabler.
Det är som en mycket fattig mans version av en Excel-fil,
vilket innebär att den kan öppnas i Excel och i Apples Numbers,
och det har rader och kolumner.
Men det är inte en patentskyddad format som Microsoft eller Apple.
Det är bara kommatecken separerar värden som vi ser i ett ögonblick.
>> Och bara ta en gissning.
I linje 23, vid mycket ände, mitt andra argumentet
till denna nya funktion kallas f öppen för filen öppen är w.
Vad kan w betecknar?
Yeah?
>> PUBLIK: Det låter dig skriva till filen?
>> DAVID J. MALAN: Det låter du skriver till filen.
Så det finns ett par varianter att vi kan koppla in här.
Men om du bara vill läsa filen är att titta på det
och läsa den i minnet, du bara använda citat unquote "r".
Om du vill skriva till fil, använder du citerar unquote "w".
Det är också bifoga och ett par andra saker
Om du vill ändra befintliga filer.
Nu ska vi fortsätta att se detta sak, då vi ska komma tillbaka till linje 24.
NULL, visar det sig, är ett speciellt värde som
kan returneras av vissa funktioner Om något har gått wrong--
Om filen inte finns, om du har slut på minne,
eller en massa andra fel.
Men nu, låt oss bara anta att detta är bara konventionell felkontroll.
Här i linje 26, jag iterera 0-3 över alla mina elever.
Och detta är typ av sort av en ny funktion, fprintf,
men bara ta en gissning.
Om printf är bara print en formaterad sträng,
vad betyder fprintf förmodligen innebära?
PUBLIK: Skriv ut till en fil.
DAVID J. MALAN: Skriva ut en formaterad sträng till en fil.
Det är vad den ytterligare f organ är fil.
Och den nya första argumentet måste vara variabeln som representerar din fil.
Då har vi bara ett format sträng precis som printf.
Och även om detta Syntaxen är nytt, detta bara
betyder koppla in elevens namn, plug-in för studenthem, och sedan
med fclose stänger du filen.
Och sedan lastly-- detta är nytt och vi ska återkomma till detta
innan long-- jag frigöra studenten skäl
som hände upp ovan finns.
Men vi kommer tillbaka till att innan long--
det är på grund av hur getString är faktiskt arbetar under huven.
>> Så låt oss ta en snabb titt här.
Om jag skriver ls i min katalog, märker att jag inte
har en fil som heter students.csv, bara inte där, inte existerar.
Så om jag nu sammanställa det här programmet, göra structs-1,. / structs-1,
och jag kommer att gå vidare och skriva in Andi, som bor i Berkeley vid Yale.
Vi kommer att ha Rob som bor i Thayer dessa dagar.
Och låt oss komma med där är, tror jag, är Maria i Mather,
om jag har mindes rätt.
>> Så ingenting verkar hända.
Men om jag skriver ls nu, det finns students.csv.
Låt oss gå vidare och öppna students.csv.
Detta är återigen en mycket lätt filformat.
Men jag har bara antagit en konvention att jag har två rader och kolumner här.
Den första kolumnen är folks förnamn.
Den andra kolumnen är studentens sovsal, eller högskola, eller hus, eller allt.
Och nu har jag sparat detta permanent i en fil.
>> Så det är inte så intressant.
Men detta är bara en språngbräda nu att kunna kvarstå uppgifter
permanent.
Så låt oss nu se vad mer vi kan göra med dessa och andra funktioner.
Men först, några frågor?
Det var en hel del, och det var snabb.
Men du kommer att se en hel del mer PSET 4, liksom.
Yeah?
>> PUBLIK: Finns det något sätt att fortsätta att lägga namn till den filen?
>> DAVID J. MALAN: Bra fråga.
Finns det ett sätt att fortsätta lägga till namn till den filen?
Ja.
Och, faktiskt, om du avslutar up återuppta ärendet,
du skulle använda citat unquote "a" för append,
som bara skulle lägga till en ny rad, en ny linje om och om igen, exakt.
Bra fråga.
Övriga frågor?
Yeah?
PUBLIK: Om du körde program igen just nu,
skulle det fortsätta att lägga namn till fil eller skulle det öppna upp en ny fil?
>> DAVID J. MALAN: Ah, bra fråga.
Om du körde programmet igen rätt nu, kanske skrev i nya namn,
skulle man lägga till filen eller skriva över filen?
Den senare, eftersom jag är inte använder bifogningsläge.
Och eftersom jag är bara blint öppna filen för skrivning,
det bara kommer att skriva över filen.
Så jag skulle verkligen behöver göra är att lägga till, om jag vill faktiskt ha en långsiktig
databas.
>> Nu CSV är användbar, uppriktigt sagt, även för som om du är writing--
och vi kommer så småningom se denna senare i den termin då
Vi använder CSVs för andra ändamål.
Om du vill lagra alla människor som har anmält sig till någon händelse,
eller registrerat dig för din student grupp, eller nåt sånt,
lagring av data i denna typ av format är super bekvämt.
Eftersom bokstavligen, om jag skulle ladda ned den här filen.
Jag kunde double-- och låt oss faktiskt prova detta
om jag har Excel eller Numbers här.
>> Jag kommer att högerklicka eller kontrollklicka min fil.
Hoppsan.
Högerklicka eller kontrollklicka min fil.
Kom igen, är min mus inte samarbetar.
Download-- jag ska ladda ner alla filer här så
bara så att jag kan ta det här.
Och låt oss se om det fungerar students.csv-- första gången
Jag har aktiverat.
Nu vill de se mina kontakter.
Nu måste jag registrera.
Se hur enkelt det är att använda CSVs?
Ja, hålla den aktuell.
OK, nu är vi redo för klass.
OK, åh, vad är nytt?
OK, nära.
Det var magisk.
OK, nu måste vi uppdatera.
Och nu, glömde det vad fil Jag ursprungligen öppnades,
men vad A-- där vi går.
OK, så nu har vi en Excel-fil.
Tack.
>> OK, så vad jag gjorde var den enkla biten.
Naturligtvis kunde jag ha förinstallerat Excel eller Numbers, eller vad programmet.
Men det är trevligt, eftersom Nu kan jag manipulera
data i ett standardformat.
>> Så nu ska vi sammanhang byta till där vi slutade
förra gången, vilket var att starta att ta av stödhjul.
Men först, det gjorde du inte se denna tidigare lunch
återigen händer här på Fire och Is i Cambridge, Sitar i New Haven.
Registrera dig på CS50s webbplats ASAP att gå CS50 studenter och personal.
>> Så vi tog utbildning hjul rabatt på måndagen som follows--
sträng har försatts i CS50s bibliotek för en tid.
Och det är trevligt, eftersom det tillåter oss att tala om variabler som
fullständiga ord och meningar och mer.
Men det visar sig sträng existerar inte.
Det är bara en synonym, eller ett alias, att vi har skapat för något som
faktiskt är lite mer tekniskt kallas en char *.
>> Och faktiskt, såg vi ett exempel av ett program på måndag
som inte beter sig helt som vi förväntade oss.
Detta var filen jämföra-0.
Och minns att jämföra-0, om Jag kompilera måndagens program
och kör jämför-0 och skriv in mamma i gemener, och mamma i gemener igen.
Programmet insisterade jag skriver olika saker,
även om mamma, allt i gemener, är identisk visuellt.
Så vad var det korta svaret till varför datorn tänker
dessa två strängar är olika?
Yeah?
>> PUBLIK: [OHÖRBAR]
DAVID J. MALAN: Rätt.
Så, mamma, för första gången Jag skriver det är att vara
lagras någonstans i datorns minne men i en annan plats
än andra gången jag skriver i mamma.
Nu säkert det skulle kunna optimeras.
Datorn kan vara smart och förverkliga dessa två strängar, hej,
de är identiska.
Låt mig inte redundant lagra den.
Men datorer inte gör det optimering om du berätta för dem att.
Så som standard, de är bara kommer att hamna
på två olika platser i minnet.
Och så för att vara mer tydlig, när jämförde vi två strängar,
de första kallades s, den andra kallades
t, vad som specifikt var jag jämförelse här på rad 13?
Yeah.
>> PUBLIK: Det är den plats i minnet att variabeln kommer att peka på.
>> DAVID J. MALAN: Just det, var jag jämföra den plats i minnet
att dessa variabler pekade.
Så specifikt, om mamma var på byte nummer 1, och 2 och 3,
och 4-- eftersom ihåg backslash 0 måste vara hela vägen i slutet.
Och den andra instans av mamma, m-o-meter, var vid adress 10, 11, 12, och 13.
Jag jämförde 1, den adressen, den platsen i minnet,
mot 10, som är uppenbarligen inte samma sak.
1 är inte 10.
>> Så det här är trevligt att Det är ganska enkelt.
Men det är problematiskt mån vi verkar inte kunna jämföra strängar.
Så fundamentally-- och på denna låga nivå,
om du ville genomföra ett program för att jämföra
två separata ord som användaren har skrivit in för kvalitet,
gör de rada upp röding för röding, bara i allmänna termer,
Vad behöver vi göra, tydligen?
Det är inte tillräckligt att bara titta på dessa två adresser.
Vad behöver vi göra?
Yeah?
>> PUBLIK: iterera igenom strängen [OHÖRBAR].
>> DAVID J. MALAN: Ja, låt oss iterera igenom strängen.
Låt oss använda en for-loop, en while-slinga, eller vad du är mest bekväm med.
Och om vi har två strängar någonstans i minnet, låt oss titta på varje s
första bokstaven och varje är andra karaktär, då tredje och fjärde,
och femte, tills vi hit vilka särskilda sentinel värde?
PUBLIK: [OHÖRBAR]
DAVID J. MALAN: Ja, det omvända snedstrecket noll, vid vilken punkt i endera strängen
Vi kan besluta att det är.
Har vi matchade varenda karaktär?
Om inte, returnera false.
Om så är fallet, return true.
Och så det är precis vad den här versionen av programmet jämföra-1.c gör.
Den är identisk med vad vi tittat på måndag, förutom att jag har
blivit av ordet string-- men som inte har någon fungerande impact-- alla
Jag gör nu är att ta bort vissa visuella stödhjul,
men att se tydligt att s och t är adresser.
Och det är vad stjärnan, asterisken representerar
är en adress, annars känd mer tekniskt som en pekare.
>> Så när jag försäkrar er om linje 9 och säga char * s,
det betyder inte att ge mig en sträng.
Det innebär att ge mig en variabel vars syfte i livet är att lagra en adress.
Eftersom jag är på väg att sätta adressen för en sträng i den.
Och faktiskt, getString, att vara klart, inte returnerar en sträng.
Det går inte tillbaka mamma omvänt snedstreck noll, i och för sig.
Vad betyder getString specifikt och exakt tillbaka?
PUBLIK: [OHÖRBAR]
David J. MALAN: En adress, den adressen för det första tecknet
i vissa strängen har fått.
Och så nu ser vi en speciell sökord igen.
Och hänvisade jag till detta tidigare.
Detta kommer att vara bra konvention att vi får se om och om igen nu.
Jag kollar att se till att s inte är noll och t är inte noll.
Eftersom de baseras på min verkligen snabbt nämna tidigare,
vad kan innebära om getString återvänder inte en adress men N-U-L-L, som är återigen,
några speciella värde?
>> PUBLIK: Fel.
>> DAVID J. MALAN: Det är ett fel.
Något gick snett.
Och vad typiskt kan hända, särskilt
med strings-- som kan vara av okänd längd i advance--
kanske datorerna " slut på minne, kanske
du skrev på ett sådant långa ord eller en mening
eller klistras sådan enorm uppsats det finns bara inte tillräckligt med minne.
Och så getString kan inte återvända adressen till det hela,
så det bara returnerar ingenting.
Och det står ett fel har hänt genom att returnera den speciella NULL värde.
Det är noll adress, så att säga.
>> Nu visar det sig C levereras med en funktion som gör det iteration.
Vi behöver inte genomföra detta med en for-loop eller en while-slinga själva.
Vi kan använda en funktion, kallas kortfattat,
rör comp, eller sträng jämföra, vars syfte i livet är att göra just detta.
Du ger det två pekare, två adresser, och det kommer att gå till dessa adresser
och sedan jämföra bokstav för bokstav för bokstav för kvalitet,
stannar bara när det som är sant?
När intuitivt Rör om komp stopp iteration, bara för att vara klart?
När den träffar ett omvänt snedstreck 0 i antingen sträng, vid vilken punkt det kan bestämma
har allt matchas, eller har det skett en avvikelse?
>> Så, om vi kör detta nu och prova vår lilla kapitalisering spel,
så att jämföra-1, ./compare-1, och skriver mamma med gemener båda gångerna.
Nu är det samma sak.
Och om jag gör det igen med gemener och sedan kanske versaler.
Nu är det verkligen skiljer mellan övre och gemener.
Så inte så svårt eller magiska, men det gör nu förklarar
vad som händer under huven.
>> Så vad mer kan vi utvinna från denna typ av lektion?
Så låt oss ta en titt på detta.
Jag kommer att gå vidare och skriva en snabb program här kallad copy-0.
Och nu ska vi gå vidare och faktiskt låt oss göra this-- med kopia-0,
ta en titt på vad jag har här.
Jag först tala om för användaren, säga något.
Då får jag en sträng och jag lagras det i s.
Sedan kollar jag om s är lika med är lika med noll, bara tillbaka en.
Så det här är bara vanlig felkontroll.
Inget intressant har hänt.
Och faktiskt, om vi blir av felet kontroll, ser detta som vecka 1 kod
just nu.
Men jag har börjat få en lite bättre om det.
>> Nu i linje 16, för en vecka sedan, kanske även ett par dagar eller minuter sedan,
du kan säga linje 16 är skapa en variabel som heter t
och kopiering s in i den.
Och det är en perfekt rimlig takeaway.
Men vara mer exakt nu.
Vad händer i linje 16?
Vad är att få kopieras från höger till vänster?
Yeah?
PUBLIK: Är t få en adress till s?
>> DAVID J. MALAN: Exakt, t blir adressen till s.
Så för att vara tydlig nu, om jag går tillbaka till det tidigare exempel
och jag dra ut det jag har skrivit in.
Och vad jag har skrivit in-- här är s, och här
är vad jag har skrivit i någonstans i minne, mamma och sedan ett omvänt snedstreck
0 som är till för mig.
Vad jag lagras här, minns, detta är på plats 1, 2, 3, 4,
Detta är vad som för närvarande i s.
Så om på rad 16, säger jag ge mig en annan variabel som kallas t och lagra
in på värdet på s, vad får lagras här kommer inte mamma
utan snarare bara antalet 1.
>> Så om vi blickar framåt i detta program nu, vad som kommer att hända?
Så märker att det finns denna funktion kan du kanske
har använt detta för en tid sedan för Caesar, eller Vigenère, eller kanske inte alls.
Jag hävdar med min printf, jag kommer att kapitalisera kopierings t.
Först i raden 19, snabb sanity kontrollera, strlen kontrollerar längden på t.
Eftersom jag inte vill försöka kapitalisera något
om det inte finns någon sträng där.
Om användaren bara trycka Enter, det finns inget att kapitalisera.
Så jag vill inte göra linjen 21.
Så linje 21 kapitalisera vilken bokstav, tydligen, i t?
>> PUBLIK: m?
DAVID J. MALAN: Det ser som det är kopiering som ett?
PUBLIK: m.
DAVID J. MALAN: Öh, m.
OK, så den första m, eftersom märker att jag är
passerar till TOUPPER, vilket Om du aldrig har sett det är det
bara en funktion för att kapitalisera som sin insignal.
t bygel noll innebär ge mig noll karaktär t.
Och så hur gör detta bild förändring, att vara tydlig?
Vad behöver få skrivas om eller ändras med avseende på s och t och mamma
snedstreck noll.
>> PUBLIK: [OHÖRBAR]
>> DAVID J. MALAN: Ja, så här här bara
måste få ändrats att-- fixa this-- behöver få ändras till en kapital m.
Men nu ser senare i program, om jag skriver ut
s och t som jag städa här, titta på vad som är kommer att hända skriva ut s och t.
Så gör copy-0, ./copy-0.
Låt mig gå vidare och skriva i mamma i alla gemener.
Lägg märke till både den ursprungliga och kopian har aktiverats.
Varför?
Tja, s och t båda pekar på, om ni så vill, samma bit av minnet.
Och ärligt talat, det här är att få verkligen uninteresting-- det faktum
att vi använder adress noll här.
Jag menar, jag vet inte riktigt bryr där grejer är i minnet.
Ledsen jag radera lite för mycket.
Men jag bryr mig egentligen inte där saker är i minnet.
Och så, ja vad programmerare tenderar att tänka på
är att när man talar om en adress, eller en pekare,
vem bryr sig om det är i minnet.
Jag bryr mig inte om det är på byte av en eller en miljard.
Jag bryr bara att detta variabel är effektivt
pekar på att bit av minnet.
Och så, hädanefter, snarare än käbbla över godtyckliga minnesadresser, låt oss
bara börja dra pekare som pekare, som pilar.
Så vad s och t verkligen är, enligt detta program,
på grund av hur jag skapade t, Det är bara två separata variabler
pekar på samma bit av minne.
Och vi bryr oss inte var de är.
Så vi kan abstrakt bort den detaljen.
>> Så hur kan jag fixa det?
Om jag vill skriva en version av kopian program som faktiskt kopierar sträng
och aktiverar endast kopiera, bara intuitivt,
vad måste vara en ingrediens till vår lösning?
PUBLIK: [OHÖRBAR]
DAVID J. MALAN: Vi behöver en vad?
PUBLIK: Chunk minne.
DAVID J. MALAN: Vi behöver en annan bit av minnet, eller hur?
Vi vet inte hur man gör det ännu, nödvändigtvis.
Men jag slags vill att detta ska ske så att den ursprungliga mamma i gemener
hamnar i den extra bit av minnet.
Och sen när jag byter kopian, jag vill inte ändra detta exemplar här.
Jag stället bara vill ändra detta kopia så att originalet är oförändrad.
>> Så, låt oss se hur vi kan göra detta.
I copy-1, som redan har tagits kommentar
men kommenteras på nätet.
Vi istället göra following-- dessa linjer är identiska, få mig en sträng
och kallar det är.
Men nu ska vi titta på ett av våra mest komplex men den sista av komplexiteten
ett tag, gör linje 16 just detta.
Så om din bekväma med bild vi drew-- bara
ge mig en ny bit av minnet, kopiera allt i det,
Låt oss se hur vi översätter det till kod.
>> Så linje 16, på vänster sida, char * t ger mig denna ruta hit.
Det är allt den gör.
På höger sida, m alloc eller malloc,
är minnesallokering, super snygga, en kryptisk sätt att bara säga
ge mig en bit av minne.
Hur mycket minne behöver vi?
Tja, är lite av en stor uttryck.
Men låt oss se vad det står här.
Så det här är naturligtvis är att ge mig stränglängd s.
Så, mamma det borde vara vad?
Så bara tre, eller hur? mamma är tre tecken.
Du behöver inte räkna omvänt snedstreck noll när du
tala om längden av en sträng är det faktiskt de mänskliga synliga bokstäver.
Så mamma, så det här ger mig tre.
Men vänta en minut, jag nu lägga till en.
Varför jag verkligen vill fördela 4 byte och inte bara tre?
Yeah?
>> PUBLIK: För sentinel värdet?
>> DAVID J. MALAN: Exakt, för att sentinel värde.
För det omvända snedstrecket noll, Jag behöver 4 byte totalt.
Så jag behöver längden av strängen plus ett.
Och sedan bara för bra measure-- trots att på detta system,
det kommer alltid att vara 1-- jag säger multiplicera med storleken på en röding.
Det visade sig att sizeof är en operatör i C som
bara berättar dig Antalet byte som är
krävs för en viss datatyp.
Det fungerar inte för matriser, typiskt, ibland den gör.
Men i det allmänna fallet, nr.
Men det kommer att tala om för mig hur många byte en röding är, som visar sig är alltid en.
Så det här är som att multiplicera med 1.
>> Så super kryptiska ser kodrad.
Men allt den gör är ger mig en bit av minne.
Men det verkar vara kopiering någonting i detta minne?
Inte än.
Och så vad gör jag på rad 22, och 23, 24, 25, ja, jag helt enkelt göra det.
Och detta är typ av old school grejer nu.
Detta är som PSET 2, där du bara ska flytta saker
runt i minnet, eller snarare i strängar.
>> Så jag iterera från 0 till längden av strängen s.
Och jag kopierar den i: te karaktär is i den i: te karaktär i t.
Och eftersom jag, programmeraren, gjort Var noga med att allokera exakt så många bytes
som jag behöver, det är perfekt ett-till-ett förhållande.
Och jag kopiera mamma i gemener till den nya.
Och sedan slutligen gör jag den här raden.
Och så effekten är endast att kapitalisera denna t här.
Så mycket att absorbera, men Om du bara betrakta
vad som verkligen händer på under huven
är bara flytta dessa byte runt, alla som
behövs för att lösa detta problem är bara för att ge oss denna del av minnet.
Nu med risk för överväldigande, låt mig visa
ett annat exempel som är nästan identiska, med undantag för detta
kodrad.
Så det här är hacker version av detta program, om man så vill.
Men låt oss bara destillera det i vad som händer.
Linje 24 brukade vara denna t fäste i får s fäste i.
Nu, jag ändra detta till mycket mer kryptiska stjärna t
plus en lika stjärna s plus ett.
>> Så vad som händer och varför har vi en stjärna karaktär?
Vi har sett stjärnan tidigare, och den används på olika sätt här.
Vi såg tidigare char *, nu jag ser en stjärna i början, och det är OK.
Eftersom det visar sig vi kan typ av sluta bara
från de första principer vad som händer.
Så bara för att vara tydlig, vad är er?
Förra veckan var det en sträng.
Det räcker inte längre.
Vad är s, speciellt?
>> PUBLIK: [OHÖRBAR]
>> DAVID J. MALAN: Det är en pekare.
Det är adressen för första tecknet vi skrev in.
OK, vad är t?
>> PUBLIK: [OHÖRBAR]
>> David J. MALAN: Den adressen för den första bitgruppen
it, att bit av minne omfördelas.
Så visar det sig att när vi upprepa från 0 på upp till strängen
length-- först av allt, jag börjar vid 0, eftersom
i denna gamla skola för loop sak.
Så bara för enkelhetens skull, låt oss anta att den första raden kod
är egentligen bara detta, rätt.
Om jag är noll, lägga till noll till något förmodligen
kommer inte att ha någon effekt.
>> Så vad är detta talesätt?
Det visar sig att stjärnan operatör i detta sammanhang
är dereference operatör, vilket är bara
ett fint sätt att säga gå till följande adress.
Så om s är adressen till den första karaktär i denna bit av minne,
* s organ dit.
Och eftersom vi har ritat bilden på detta sätt,
Du kan anta efter mental modell.
Om detta är er, och ni säger * s * s ungefär som rännor och stegar,
om du kommer ihåg matchen från barndomen, är som följer den pilen och gå
till den adress.
>> * t är samma sak.
Så börja här, gå till sin bit.
Jag kan inte bara dra nytta av den här skärmen på det sättet.
* t innebär att gå hit.
Och då är det för loop bara säger flytta denna karaktär här,
flytta denna karaktär här, flytta denna karaktär här.
Men hur gör jag det inkrementering?
Jag behöver ångra vad jag bort bara.
Detta är vad som brukar kallas pekare aritmetik, som
betyder matte med adresser.
>> Om det i detta för en slinga, Jag fortsätter uppräkning i,
och s är en adress och t är ett adress, om jag håller bara lägga 1
det betyder bara fortsätta framåt, och framåt, och framåt i minnet.
Det är som Oxford Street, gata som CS byggnaden är på.
CS byggnader på 33 Oxford Street.
Så om du skulle göra 33 Oxford Street plus ett,
som tar dig till 34 Oxford Street, sedan 35 Oxford Street,
då 36 Oxford Street, oavsett de byggnader faktiskt är - om de finns.
Och så, det är allt vi gör här med pekare aritmetik.
>> Så det är en super mystiska sätt att uttrycka oss själva.
Men allt som händer under huven
bara följa dessa adresser, gilla att följa en karta, om ni så vill,
eller följande pilar som Vi har ritat på skärmen.
OK, mycket att smälta.
Varje fråga om syntax, begrepp, pekare, malloc, eller liknande.
Ja, här borta först.
>> PUBLIK: Så var det säger * t lika TOUPPER * t,
är att gå att kapitalisera alla bokstäver eller bara--
>> DAVID J. MALAN: Ah, riktigt bra fråga.
Så i denna linje här, 31, Detta kommer att kapitalisera
den första bokstaven eller alla bokstäver.
Så låt oss svara på det genom att gå tillbaka till första principer.
Och första principer här menar jag bara att gå till de grundläggande definitionerna
av vad det innebär.
Så TOUPPER är en funktion som aktiverar en röding.
Det var allt.
* t betyder gå till first-- gå till adressen i t.
Så, på bilden, om detta är en stor bit minne vi tilldelades med malloc,
och detta är t * t betyder gå hit.
>> Under tiden, du passerar detta värde, gemener m
till TOUPPER, du får tillbaka huvudstad M, där du lägger det?
Du lägger den i samma läge.
Och detta genom att logiken i de grundläggande definitioner det är bara
kapitalisera den första bokstaven om du inte upprepa med i eller
för slinga eller en while-slinga, det kommer inte att göra något mer än du ber den.
Bra fråga.
Yeah?
>> PUBLIK: Varför du använder dereference metod snarare än
arrayen?
>> DAVID J. MALAN: Ah, bra fråga.
Varför skulle du använda dereference metod i stället för arrayen metoden?
Ingen särskild anledning, att vara ärlig.
Och, faktiskt, för detta typ av exempel rätt,
Jag bara argumentera att göra programmet mer komplicerat,
fler ögon inglasning över, folk bläddrar i
eftersom det ser super svårbegriplig, men även om det gör samma sak.
Och så, uppriktigt sagt, är detta en onödigt visuellt komplex lösning
på problemet.
>> Det är fortfarande god design, fem av fem för design,
oavsett om det är i hållaren notation eller pekaren notation.
Men-- särskilt när vi får senare i kursen Pset 5
när vi genomföra denna ordbok som Jag har nämnt ett par times--
vi faktiskt bryr sig om lågnivå minnesadresser
att vi verkligen förstår vad händer.
>> Men nu visar det sig att detta kodrad här hakparenteser
inte verkligen existerar.
De är vad som kallas syntaktisk socker, som
är bara en metallbit coolt sätt att säga kompilator omvandlar hakparenteser vara
som matematiskt uttryck.
Så det är en mänsklig konvention att kunna bara skriva
Dessa mycket användarvänliga konsoler.
Men vad kompilator, klang, verkligen gör helst
du skriver vad som lyfts fram i linje 24, under huven är det verkligen
omvandla den till detta.
Det är bara mer angenäm som en människa att läsa och skriva kod som linje 24.
Men så småningom de stödhjul lossnar också
när ens egen bekvämlighet blir starkare.
>> Okej, så minns då att detta var den sortens största problemet
Vi sprang in.
Och det är vad utlöste hela denna jävla samtal om pekare,
och adresser, och kopiatorer saker.
Det var därför vi trippade över denna dumma, dumma frågan, varvid
Jag genomfört logically-- med Lauren upp här på demo och apelsinjuicen
i milk-- en perfekt algoritmiskt korrekt funktion
för pumpning två variabler värden, men den jävla sak
inte har någon ihållande, eller permanent, effekt på min kod.
>> Och varför var det?
I ett nötskal, varför är detta genomförande av växlings
logiskt korrekt, men har ingen inverkan på de variabler som skickas till den,
som x- och y för main?
Vad var kontentan av problemet?
Yeah?
PUBLIK: Eftersom variabel gjort kopior av variabel i passet
genom funktion.
>> DAVID J. MALAN: Just det, när du passerar variabler till en funktion, eller argument
till en funktion, de är passerade genom att kopiera, vilket
innebär att du får en identisk ser mönster av bitar för både x och y,
kallas här a och b.
Och du kan göra något du vill med dessa kopior,
men de kommer att ha någon effekt på anropsfunktionen.
Och i själva verket, drog vi att bild på skärmen, återkallelse
förra gången, där om du verkligen tänka på vad som är
pågår under hood-- om Detta är datorns minne,
och här nere är en stor bit av minne som används för main,
detta är den del av minne som används för swap,
och så även om huvud har två variabler, x och y,
swap kan ha identiska ser värden, som båda är ett och två,
men de är helt olika bitar av minnet.
>> Så vi behöver en lösning på detta.
Och ärligt talat, verkar det som vi nu har en lösning på detta problem, höger.
Om vi ​​nu har möjlighet att manipulera saker i form av adresser
och, typ av rännor och stegar stil, följ pilarna
och gå någonstans vi vill i minnet, kunde inte vi
lösa detta problem genom övergång från huvud att byta
inte de värden vi vill swap, men bara intuitivt
vad kan vi gå att byta i stället?
>> [Inplacering UTTRYCKER]
>> DAVID J. MALAN: Varför inte vi bara passera den adresser, eller hur?
Varför vi inte ge swap en skattkarta, om ni så vill,
som leder den till faktiska värdena x och y.
Låt oss swap, faktiskt ändra de ursprungliga bitar, snarare än
bara passerar kopior av bitarna.
Och så, i själva verket, det är vad är kommer att vara lösningen.
Denna version här är klart dåligt och bristfällig.
Och nu, vid första anblicken, bara ser det som vi lagt till en massa stjärnor slumpmässigt
och korsade fingrarna att det skulle kompilera.
Men, skulle det nu kompilera.
>> Men låt oss se vad detta betyder.
Och, tyvärr, författarna C kunde ha valt en annan symbol
att göra det lite tydligare, men stjärnan operatören
har olika innebörd i två olika sammanhang.
Och vi har sett både, men låt oss urskilja.
>> Så upp på toppen finns, när jag har bytt a och b
från att vara int si dåliga version till int stjärnor, a och b,
tidigare var heltal.
Vilka är a och b nu i det goda, gröna versionen?
De är adresser.
Adresser till vad, att vara tydlig?
Adresser till heltal.
Så det faktum att jag är säga int stjärna organ
detta är adressen till ett heltal, specifikt.
>> Så nu märker i rader kod, något annat har förändrats också.
tmp förblir densamma, eftersom det är bara tillfälligt heltal
inget minne magi där.
Men nu behöver en stjärna.
Och, faktiskt, varje andra omnämnandet av a och b,
märker att allt som är byte från rött till grönt
är att jag prefix dessa variabler med stjärnor.
Eftersom jag inte vill kopiera a och b.
För om jag bara kopiera a och b och swap a och b, vad ska jag egentligen byta?
Bara adresser, jag vill byta vad som står på dessa adresser.
Jag vill åka dit.
Och så stjärnan operatören insidan av min funktion,
inte inne av parameterlistan, innebär att du går till dessa adresser
och faktiskt ändra dessa värden.
>> Så vad gör bilden nu ser ut som i stället.
Tja, om istället jag passerar in a och b inte ett och 2--
Jag behöver faktiskt lägga en andra definitionen här.
Så antar att denna bit minne är på plats 10.
>> Detta är på plats 11, men detta är lite av en förenkling,
Jag har nu två val att göra jag passerar x och y eller som jag passerar deras adresser?
Om jag passerar deras adresser så här, jag bara
Nu behöver för att genomföra swap per den gröna koden
så att när den ser ett och när den ser B, att det inte bara kopiera a och b
och flytta mjölk och apelsinjuice.
Den mjölk och apelsinjuice metafor bryter nu ner,
eftersom de är koppar flytande och inte kartor.
Vi behöver i stället för att gå att ta itu med 10 och vi
behöver gå till adress 11, och utför sedan att byta logik.
>> Så logiken är densamma, men vi behöver ett något annorlunda sätt
att få tillgång till dessa variabler.
Och så i slutändan, vad Programmet har att se ut är det.
I swap.c rally kopieras och klistrat in gröna versionen.
Men jag måste göra en förändring.
Det är inte tillräckligt att bara ändra swap.
Vilka andra kodrad måste jag ändra?
Yeah?
>> PUBLIK: Om det tar argumenten.
>> DAVID J. MALAN: Var Det tar sin argumentation.
Så om jag bläddra upp till huvud jag kan inte bara passera i x och y,
och jag lovar, det sista bit av ny syntax idag.
Jag behöver skicka in inte x och y men adressen av x och y.
Och det visar sig, symbolen att författarna till C valde
är om du använder ett et-tecken här, inte förväxlas med bitvis et-tecken,
om du använder ett et-tecken här och ett et-tecken här,
Detta listar ut för dig, vad är adressen för x,
kanske är det 10, vad är det adress y, kanske är det
11, och passerar de i stället.
>> Så mycket att absorbera allt på en gång.
Men låt oss se nu snabbt våra återstående fyra minuter
där saker och ting kan gå snett.
Och som en sidoreplik, faktiskt Jag tog den här bilden,
TF tog den här bilden ett eller två år sedan.
Så det här är det bakre hörnet av Eliot Dining Hall.
Pekare är kanske det svåraste ämne som vi täcker i CS50.
Så om du oroa sort lutning är som kanske är det
mer av en hockeyklubba så här, inser
vi typ av närmar sig en topp i när det gäller den begreppsmässiga komplexitet.
>> Och jag tar upp detta foto, eftersom jag svär
gud, hösten 1996, när jag tog CS50 med min undervisning karl,
Nishat Mehta, satte han sig mig i hörnet av Eliot D. Hall under lunchen,
eller middag, eller något att prova att hjälpa mig att förstå pekare.
Och det är där jag var veckor efter det infördes föreläsning när
Jag förstod äntligen pekare.
Och jag är hoppfull om att detta klickar långt tidigare för dig.
Men inser att detta absolut bland de mer sofistikerade ämnen
Vi har tittat på.
Men det är bland de mest kraftfulla.
Och när du får det, det är verkligen allt bara att äntligen komma samman.
Så lita på att det inte måste alla handfat i dag.
>> Så här är det sista programmet vi kommer att titta på.
Och vi kommer att sluta med en snabba tre minuter claymation
gjord av vår vän, Nick Parlante.
Här är ett program, som på de två översta linjer deklarerar en variabel x och y.
Som båda är adresser av heltal, AKA pekare.
Vi sedan allokera tillräckligt minne för att lagra en int
och lagra adressen i nämnda minne i x.
Så, är det ännu enklare än exemplet tidigare.
Ge mig fyra byte minne, det är storleken på en int,
och satte den adressen i x.
Denna linje betyder här gå till adressen i x
och sätta innebörden av liv, antalet 42 där.
Men denna linje oroar mig.
Star y betyder gå till adressen i y, och satte otursnummer 13 där.
Varför är det farligt, vid denna tidpunkt i story-- om än snabbt berättade
i våra avtagande minuter här-- varför är det dåligt
för mig att säga, gå till adressen i y?
>> PUBLIK: inte Du har [OHÖRBAR].
DAVID J. MALAN: Jag har inte sätta något i y.
Så vad är värdet av y, vid denna tidpunkt i historien?
Vi har ingen aning.
Det är en del skräp värde och inte heller Binky vet.
Om vi ​​kunde sluta på denna anmärkning.
>> [VIDEOAVSPELNING]
>> -Hej, Binky, vakna.
Det är dags för pekaren kul.
>> -Vad är det?
Lär dig mer om pekare?
Åh, karamell.
>> -Ja, För att komma igång, jag antar att vi är kommer att behöva ett par pekare.
>> -OK.
Denna kod tilldelar två pekare vilket kan peka på heltal.
>> -Okej, Och jag ser två pekare, men de
verkar inte vara pekar på någonting.
>> -Det är rätt.
Initialt pekare inte peka på någonting.
De saker som de pekar på är kallas pointees och bygga upp dem
är ett separat steg.
>> -Oh, Höger, höger.
Jag visste att.
De pointees är separata.
Så hur kan du tilldela en pointee?
>> -Ok, Väl detta kod allokerar ett nytt heltal pointee,
och denna del uppsättningar x att peka på det.
>> -Hej, Ser det bättre.
Så gör det att göra något.
>> -Okej, Jag avreferera pekaren x lagra numret 42 i sin pointee.
För detta trick, jag behöver min trollspö av Återgång.
>> -Din Trollspö av Återgång?
Eh, det är så bra.
>> Det här är vad koden ser ut.
Jag ska bara ställa upp antalet och--
>> [POP SOUND]
>> -Hej, Titta där det går.
Så, gör en dereference på x följer pilen för att komma åt dess pointee.
I detta fall, för att lagra 42 där inne.
Hej, prova att använda den för att lagra numret 13 genom den andra pekaren, y.
>> -OK.
Jag ska bara gå hit till y, och få nummer 13 inrättas.
Och sedan ta trollspö Namnåtergång och bara--
>> [Summerton]
>> -Oh, Hej som inte fungerade.
Säg, eh, Binky, det gör jag inte tror Återgång
y är en bra idé, eftersom inställning upp pointee är ett separat steg.
Och jag tror inte att vi någonsin gjorde det.
>> -Hmm, Bra poäng.
>> -Ja, Vi tilldelas pekaren, y, men vi aldrig satt det att peka på en pointee.
>> -Hmm, Mycket observant.
-Hej, Du ser bra ut där, Binky.
Kan du fixa det så att y poäng till samma pointee som x.
>> -Visst, Jag använder min trollstav av pekartilldelning.
>> -Är Det kommer att bli en problem, som förut?
>> -Nej, Detta inte vidrör pointees.
Det förändrar bara en pekare att peka på samma thing--
>> [Knäppande ljud]
--as annan.
>> -Jag förstår.
Nu y pekar på samma plats som x.
Så, vänta, nu y är fast.
Den har en pointee.
Så du kan prova trollspö Namnåtergång igen för att skicka den 13 över.
>> -Oh, OK, här går.
>> -Hej, Titta på det.
Nu Namnåtergång fungerar på y.
Och eftersom pekarna delar att en pointee, de båda se 13.
>> -Ja, Dela, eh, vad som helst.
Så vi kommer att byta plats nu?
>> -Oh, Vi ser är för sent.
>> -But--
>> -Bara Ihåg de tre pekar reglerna.
Nummer 1, den grundläggande strukturen är att du har en pekare,
och det pekar upp till ett pointee.
Men pekaren och pointee är separata.
Och vanligt fel är att inrätta en pekare
men att glömma att ge den en pointee.
>> Nummer 2, pekare Återgång börjar vid pekaren
och följer sin pil över att få tillgång till sin pointee.
Som vi alla vet, detta fungerar bara om det är en pointee, vilken typ av får tillbaka
att regel nummer ett.
>> Nummer 3, pekare Uppdraget tar en pekare
och ändrar det att peka på samma pointee som en annan pekare.
Så efter överlåtelsen, de två pekarna
kommer att peka på samma pointee, ibland som kallas delning.
Och det är allt som finns att det, verkligen.
Bye-bye nu.
>> [END SPELA]
>> DAVID J. MALAN: Det är det för CS50.
Tack vare professor Nick Parlante.
Vi ses nästa vecka.
>> [ELEKTRONISK MUSIK SPELA]