[Powered by Google Translate] DAVID J. MALAN: All right.
Dette er CS50, og dette er slutten av uke to.
Hvis du forventer å være sulten på denne tiden i morgen, vet at vi skal
å innkalle som en liten gruppe i morgen, torsdag, 1:15 PM.
Det er denne nettadressen her hvis du ønsker å RSVP.
Plassen er begrenset, så tilgi hvis skjemaet er fylt opp av den tiden du
fylle ut dette.
En annen URL skjønt som kan være av interesse er dette.
>> Så i omtrent en måneds tid, er kurset skal gjøres tilgjengelig
desto mer grovt via EDX, via som folk på internett vil være
i stand til å følge med, delta i kurset ganske aktivt, faktisk.
De skal bruke CS50 Appliance og CS50 Diskuter og det meste av
ulike dataverktøy som vi allerede har brukt dette semesteret.
Og ett av tiltakene vi ønsker å ta på som et eksperiment i år
er å se hvor mye innhold vi kan oversette til andre talt og
skriftspråk.
Så hvis du kan ha en interesse i å delta i dette prosjektet, der
Vi vil gi engelsk utskrifter og undertekster for kurset er
forelesninger og shorts og seminarer og seksjoner og lignende -
hvis du snakker flytende eller skrive flytende et annet språk, ville vi
elsker å engasjere deg i dette prosjektet, hvor du tar på en eller flere av
videoer, oversette dem til et språk du kjenner ganske godt.
For å gi deg en følelse av grensesnittet, er det denne web-basert brukergrensesnitt
at vi skal bruke som vil skape hovedsak en UI som dette.
Dette ble meg å undervise noen Halloween siden.
Og på høyre side der i svart ved siden av disse tidsstempler,
vil du se de forskjellige tingene som kom ut av munnen min den dagen.
Og deretter under det, vil du være i stand til å oversette til et annet språk.
Nøyaktig hva kartleggingen er mellom, i dette tilfellet, engelsk
og, si, spansk.
Så det er faktisk en veldig brukervennlig verktøy.
Du kan spole tilbake og spole frem veldig lett med hurtigtaster.
Så hvis du ønsker å ta del i dette eksperimentet, og har dine ord
sett og lest av potensielt tusenvis av folk der ute, gjør du gjerne
gratis å delta.
>> Nå ett ord om kattungen fra mandag, for at vi har sendt en altfor
skremmende melding.
Innser at så kontortid foreslå og som deler foreslår, den
utformingen av kurset er veldig mye å ha studenter samarbeider og
snakker å arbeide gjennom oppgavesett og problemer sammen.
Og virkelig linjen kommer bare ned til, igjen, arbeidet du til slutt
skal sende bør være din egen.
Og så er det, helt ærlig - i kontortiden, er det helt normalt -
det er helt å forvente, selv - for å bli chatter med noen
venner ved siden av deg.
Hvis han eller hun sliter med noen tema, og du liker, oh, vel la
meg gi deg et glimt av noen linje med kode som jeg skrev.
Det er fint.
Det skjer.
Og det er veldig mye bidrar, tror jeg, med prosessen med læring.
Hvor linjen, igjen, blir krysset er når hodet er slags vippet løpet
her for altfor mange sekunder eller minutter for at virkelig å ha bare
vært en Unblocking mulighet for din venn.
Og sikkert, når ting blir utvekslet via e-post og Dropbox og
lignende, er det for linjen.
Så for all del, føler deg komfortabel og føler oppfordres til å chatte med venner
og klassekamerater om psets og mer.
Og bare innse at det du til slutt sende burde egentlig være
produkt av din kreasjon og ikke noen andre.
>> Så i samme ånd av kosete skapninger, kanskje du
vet denne fyren her.
Så dette er en horrifically cheesy film fra år siden.
Noen her sett Spaceballs?
OK.
Så en god del her.
Så dette er vår fantastisk akademisk måte å introdusere i dag til slutt
oppfatningen av kryptografi.
Og så en av de domene spesifikke problemer for to pset, som vil komme
ut sent i morgen kveld, er å dykke inn i verden av kryptografi, som
er kunsten å kryptere eller scrambling informasjon.
Og dette gjelder slutt til en verden av sikkerhet.
>> Nå sikkerhet for de fleste kommer oss i form av ganske dagligdagse mekanismer.
Alle av oss har brukernavn og passord.
Og alle av oss har svært dårlige brukernavn og passord, mest sannsynlig.
Hvis passordet er det samme på flere nettsteder, er det sannsynligvis ikke
den beste ideen, som vi vil diskutere mot semesters slutt.
Hvis passordet er skrevet på en klistrelapp - ingen spøk - på
monitor, som også er ikke nødvendigvis den beste design, men ganske vanlig
fenomen.
Og hvis du ikke bruker kryptografi for å kryptere passordene dine, er de
spesielt sårbare.
Så hvis du tror du er super flink ved å ha en skjult Word
dokumentere et sted på harddisken din som har alle passordene dine, men
det er i en mappe som ingen kommer til å se på, som er for ikke en veldig
sikker mekanisme.
Og så hva pset 2 vil introdusere er denne kunsten av kryptografi og
scrambling informasjon slik at ting som passord er
desto mer sikker.
Slik som å motivere denne svært virkelige verden problem med en veldig ikke-real-world
scenario, la meg introdusere deg til en av våre favorittklipp her fra dette
film, Spaceballs.
>> [VIDEOAVSPILLING]
-Hjelm, du djevel, hva skjer?
Hva gjør du til datteren min?
-Tillat meg å presentere den strålende unge plastisk kirurg, Dr. Philip
Schlotkin, den største nesen jobb mann i hele
universet og Beverly Hills.
-Deres Høyhet.
-Nose jobb?
Jeg forstår ikke.
Hun har allerede hatt en nese jobb.
Det var en søt 16 stede.
-Nei, det er ikke hva du tror.
Det er mye, mye verre.
Hvis du ikke gir meg kombinasjonen til luft skjold, Dr. Schlotkin vil
gi din datter tilbake sitt gamle nesen.
-Nei!
Hvor fikk du den?
-Greit.
Jeg skal fortelle.
-Nei, pappa, nei.
Du må ikke.
-Du har rett, min kjære.
Jeg kommer til å savne den nye nesen.
Men jeg vil ikke fortelle dem kombinasjonen uansett.
-Veldig godt.
Dr. Schlotkin, gjør din verste.
-Min glede.
-Nei!
Vent, vent.
Jeg skal fortelle.
-Jeg visste det ville fungere.
Greit, gi den til meg.
-Kombinasjonen er en.
-One.
-To.
-Tre
-Tre.
-Four.
-Fem
-Fem.
-Så kombinasjonen er en, to, tre, fire, fem.
Det er den dummeste kombinasjonen jeg noensinne har hørt i mitt liv.
Det er den slags ting en idiot ville ha på bagasjen sin.
-Takk, din høyhet.
-Hva gjorde du?
-Jeg slått av veggen.
-Nei, det gjorde du ikke.
Du har slått av hele filmen.
-Jeg må ha trykket på feil knapp.
-Vel, sette den på igjen.
Sette filmen på igjen.
-Ja, sir.
Ja, sir.
-Kom igjen, Erna.
Kom, Gretchen.
Selvfølgelig vet du at jeg har fortsatt å fakturere deg for dette.
-Vel, fungerte det?
Hvor er porten?
-Det fungerte, sir.
Vi har kombinasjonen.
-Flott.
Nå kan vi ta hver siste pust av frisk luft fra planeten Druidia.
Hva er kombinasjonen?
-En, to, tre, fire, fem.
-En, to, tre, fire, fem?
-Ja.
-Det er utrolig.
Jeg har den samme kombinasjonen på bagasjen min.
Forbered Spaceball 1 for umiddelbar avgang.
-Ja, sir.
-Og endre kombinasjonen på bagasjen min.
-Au!
[END VIDEOAVSPILLING]
>> DAVID J. MALAN: An amazing film du skal nå alle se.
Så sammenhengen her er at med usikre data kommer en mulighet til å
kryptere den og til å rykke det.
Og så dette, for eksempel, er et eksempel på en kryptert melding.
Dette sier faktisk noe på engelsk.
Men det er åpenbart ikke helt opplagt.
Og vi vil komme full sirkel i dag for å erte hverandre hva denne hemmeligheten
budskap her er.
Men i den virkelige verden av datamaskiner, ting ikke engang ser ut som de kanskje
være engelske setninger.
For eksempel er dette hva du kan finne på en standard Linux eller Mac eller
Unix datamaskin i en fil som var en gang kalt passord fil.
I dag er det blitt flyttet til andre steder.
Men hvis du ser på rett sted på et system, vil du se ikke bare din
brukernavn eller som av andre mennesker på systemet, men du vil se en
kryptert versjon av passordet sitt.
Faktisk tyder ordet krypten der at følgende ting er kryptert.
Og denne serien av tilsynelatende tilfeldige bokstaver og tegn og tall, og
så videre kan dekrypteres bare generelt vite noen hemmelighet -
et hemmelig ord, et hemmelig nummer.
Og så ja, til kunsten kryptografi slutt koker ned stole på noen
sortere og vite noe som noen andre gjør det ikke.
Vi vil utforske dette i en litt mer detaljert i dag og i pset som kommer.
>> Og nå et ord på bestått / ikke bestått.
Så spesielt, har som noen av dere stupte inn en pset, apparatet, og
en veldig ny verden for deg selv, innså at frustrasjoner og
forvirring og bare tekniske problemer er å være forventet.
Spesielt med den første pset, der det er bare så mye nytt, bare å få
kjent med ls og cd og alle disse uforståelige kommandoer i et nytt miljø.
Og som er atskilt fra selve materialet og programmering selv.
Så skjønner også at det er sikkert kontortid som finnes som
bærekonstruksjonen.
Seksjoner begynner førstkommende søndag.
Men viktigst av alt, hvis du føler bare at dette ikke er
verden for deg, skjønner at det virkelig tar bare tid.
Og var det ikke for denne muligheten år siden for meg for å ta en klasse
bestått / ikke bestått, ærlig, jeg ville aldri ha selv satt foten i klasserommet.
Og du kan endre dette frem til, sier den femte mandag av kurset.
Så hvis du er på kanten nå, innser at heller enn hodet til noen andre
farvann helt, gjør absolutt vurdere å bare bytte til bestått / ikke bestått.
Igjen, det er jo ikke denne kulturen her på Harvard for å ta ting
bestått / ikke bestått siden alle egentlig ønsker å oppnå eller overgå.
Men ærlig, dette er en flott måte å prøve noe ut som kanskje ikke
være kjent for deg.
Og du vil ende opp med å gjøre i de fleste tilfeller ganske fine, kanskje
mye å overraske din.
Og i mer konkret hva jeg tror bestått / ikke bestått generelt gjør,
spesielt som du kanskje har opplevd med pset 0, hvis du har satt
i 10 timer, 15 timer, 25 timer i noen pset - og du er bare banging
hodet mot veggen,
og det blir super sent på kvelden,
men du har tatt pset som 90% av veien,
du vet du bare ikke kan finne ut en ting -
bestått / ikke bestått virkelig tar kanten av en klasse som dette, hvor du kan sortere
av gjerne si greit, jeg vet det er ikke perfekt.
Men jeg jobbet ræva av meg på dette.
Jeg er ganske fornøyd med hvor det endte opp.
Og som vil tilfredsstille forventningene til bestått / ikke bestått.
Så hold det i tankene.
>> OK.
Så de av dere som har kjempet for å bruke Harvard University Wi-Fi vet
at det er en CS50 SSID, en Wi-Fi-tilkobling flyter rundt som du
kan ha bedre lykke til.
Det er litt ironisk at passordet for dette - hvis du ønsker å prøve
tilkobling til dette for bedre hastigheter og la oss få vite om det er noe bedre -
er en, to, tre, fire, fem, hele veien opp til åtte fordi åtte er
sikrere enn fem.
Så hvis du trenger Wi-Fi passord, koble til CS50 trådløst her.
En, to, tre, fire, fem, seks, sju, åtte.
Og innlegg på CS50 Diskuter hvis du fortsatt har intermitterende tilkoblingsproblemer,
og vi vil gi krefter som skal vite for denne plassen.
>> OK.
Så en rask teaser, spesielt for de av dere som er fan gutter eller jenter
av alle ting Apple.
Hva jeg gravd opp fra et par år tilbake var denne filen her, ilock.c, bare for å
slags gjør mer konkret og mer komplekse noen av de mer rene C
programmene vi har skrevet.
Så jeg åpnet opp denne filen, ilock.c.
Det er tilgjengelig på forelesninger siden for i dag.
På venstre side ser du en lang liste med funksjoner.
Så fyr som skrev dette skrev opp en masse funksjoner,
mer enn bare main.
Han brukte en hel haug av biblioteker her.
Og hvis vi begynner å bla gjennom, hva dette egentlig er er svært
første, tror jeg, sprekk for den originale iPhone.
Når du ønsket å jailbreak den originale iPhone, noe som betyr untether
det fra AT & T, nemlig å installere spesiell programvare på den og gjøre ting
at Apple ikke vil at folk skal gjøre -
vel, tok noen tid til å finne ut nøyaktig hvordan de kan utnytte
programvare feil, feil, feil, i Apples programvare.
Og slik ble født ilock.c.
At hvis du kompilerte det på en datamaskin og installerte den på en iPhone som
ble koblet til datamaskinen via, sier en USB-kabel, vil dette gi deg
administrative eller rotrettigheter på din iPhone og lar deg gjøre ganske mye
hva du vil.
>> Og så det har vært denne fascinerende katt og mus lek mellom Apple og
resten av verden særlig når de, som mange bedrifter, kan du prøve å låse
sine ting ned slik at du bare kan gjøre med det hva de har tenkt.
Men takket være folk som dette og deres forståelse av lavt nivå
detaljer og i dette tilfellet, C programmering og mye av de kjente konstruksjoner
at vi har begynt å leke med, er du i stand til å virkelig utnytte den
maskinvare på en måte det passer og ikke nødvendigvis noen bedriftsenhet.
Så for eksempel, har jeg ingen anelse om hva alt dette gjør.
Men GetVersion høres ganske grei.
Og det ser ut som dette er en funksjon som denne personen skrev.
Ta noen form for heltall som argument, ikke returnerer noe, men
ser ut til å sløyfe med en for løkke her, og en hvis tilstanden, hvis tilstand,
pause, og noe relatert til versjonsnumre.
Hvis vi bla nedover -
selv om mange av disse søkeordene skal være nye, og det er en
hel masse funksjoner i her vi aldri har sett, og kanskje aldri se over
løpet av semesteret -
på slutten av dagen, følger det samme regler og logikk som vi har vært
spille med så langt.
Så dette er altfor gammel til å knekke iPhone 3s eller 4s eller snart 5s, i disse dager,
men vet at det er alle veldig mye avledet fra denne verden som vi har
stupte inn.
>> Så la oss ta en titt på en litt mer enkelt eksempel.
Denne, bare for å få varme opp med noen syntaks og også noen andre data
type som vi har snakket om, men har egentlig ikke sett i C. Så dette er en
fil som heter positive1.c.
Og per kommentarene på toppen, krever dette bare at en bruker gir en
positivt tall.
Så det er et eksempel på en do-while loop, som er fint for bruker-interaktiv
programmer der du trenger for å fortelle brukeren om å gjøre noe.
Og hvis de ikke samarbeider, roper du på dem eller avvise deres innspill.
Case in point, jeg kommer til å gjøre linjene 19 til 24 så lenge brukeren har
ikke gitt meg et positivt tall.
Nå er denne detalj her på linje 18, hvorfor jeg erklærer n over hele denne
looping konstruere motsetning til rett ved siden av linje 22 hvor jeg
faktisk har lyst til å få n?
Ja?
[Uhørlig]
>> DAVID J. MALAN: Ja, så denne utgaven av omfanget.
Og i lekmann sikt, hva omfanget refererer til?
Ja?
[Uhørlig]
DAVID J. MALAN: Kan du snakke litt høyere?
SPEAKER 1: Hvor du kan få tilgang til et bestemt variabel.
DAVID J. MALAN: Perfect.
Hvor du kan få tilgang til en bestemt variabel.
Og generelt, tommelfingerregelen hittil har vært at omfanget av noen
variabelen er definert av de nyeste klammeparentes som du har sett.
Og så i dette tilfellet, hvis jeg har gjort feil i å erklære n på linje 22,
den linjen ville fungere.
Jeg ville få en int, og jeg ville sette det inn i den variable n i linje 22.
Men hvilken linje med kode ville nå har ingen anelse om hva jeg snakker om?
Så 25, og det viser seg 24, så vel, fordi i dette tilfellet, faller den utenfor
av klammeparentes.
Så bare en liten bit av en ordensforstyrrelser, men veldig enkelt løses ved å erklære
den variable utenfor funksjonen selv.
>> Nå får vi se senere i dag, kan du gå ett steg videre.
Og du kan selv få litt lat -
og dette er ikke å bli anbefalt, generelt -
men du kan selv bli lat og sette en variabel globalt, så å si, ikke
innsiden av en funksjon, ikke inne i en løkke, men i selve filen, utenfor
av alle funksjonene du har skrevet, som jeg gjorde her på linje 15.
Men dette er generelt mislikt.
Men innser at dette er en løsning noen ganger til andre problemer, som vi vil
slutt se.
Så for nå, vil vi la det slik.
Men la oss se om vi kan omskrive dette bare for å begynne å uttrykke oss selv en
litt annerledes.
>> Så dette programmet, bare for å være klar, er positive1.
La meg gå videre her og i min terminal-vinduet gjør positive1, Enter.
Sammenstiller, ok.
Jeg kommer til å kjøre positive1, trykk på Enter.
Jeg krever at du gir meg et positivt heltall.
Jeg vil si -1.
Som ikke fungerte.
0, 99, som synes å fungere.
Kanskje ikke den mest grundige test.
Men minst det er en fin sunn fornuft sjekk at vi er på rett spor.
Så nå la meg gå videre og åpne versjon to av dette.
Og hva er annerledes allerede?
Det implementerer det samme.
Men hva hoppe ut som klart annerledes denne gangen?
Ja, så dette bool i grønt.
Gedit har uthevet i grønt dette søkeordet kjent som bool,
som er en datatype.
Det kommer ikke innebygd i alle versjoner av C. Du må inkludere en
bestemt bibliotek.
I vårt tilfelle, inkludert jeg CS50 biblioteket slik at vi
har tilgang til bool.
Men i linje 18, synes vi å ha en boolsk verdi her kalt takknemlig.
Så jeg kunne ha kalt dette noe.
Men jeg kalte det takknemlig bare for å slags formidle noe semantisk mening.
Så først på linje 18, er jeg tydeligvis ikke takknemlig fordi
Boolean verdi takknemlig er initialisert til false i linje 18.
Og det synes det jeg har gjort her i linjer 21 til 23 er jeg bare
slags omskrevet min logikk.
Så ingen funksjonelt forskjellige.
Men i linje 22 nå, jeg sjekke om int brukeren har gitt er større enn
0, så jeg bare endre verdien av takknemlig til sann.
Og hvorfor gjør jeg det?
Fordi i linje 25, tilsynelatende, jeg kommer til å sjekke en tilstand.
Gjør dette løkke mens takknemlig er falsk.
>> Så jeg foreslår dette som et alternativ til versjon fordi det er minst en
litt mer intuitiv, kanskje.
Det er litt mer jordet på engelsk.
Så gjør du følgende mens du ikke er takknemlig eller mens takknemlig er falsk.
Og denne gangen også, jeg tydeligvis ikke lyst til å huske hva brukeren har skrevet
i fordi varsel er det ingen variabel n.
Så egentlig, jeg -
en liten hvit løgn der.
Funksjonelt, er programmet litt annerledes når vi kommer til bunns i
det fordi jeg ikke husker hva n er.
Men jeg ønsket å demonstrere her også at selv om vi har sett GetInt og
GetString som brukes på den høyre side av et likhetstegn hittil slik at
vi husker verdien, teknisk, det er ikke strengt nødvendig.
Hvis uansett grunn bare du ikke lyst til å lagre verdien, du bare ønsker
å sjekke verdien merke til at vi bare kan skrive dette som GetInt åpen
paren, nær paren.
At funksjonen skal returnere en verdi, som vi har sagt.
Det kommer til å gi deg tilbake en int.
Og så hvis du mentalt tenker på at dette skjer, når jeg skriver i 99, GetInt
returnerer tallet 99.
Og så konseptuelt, er det som om min kode var faktisk dette.
Så hvis 99 er faktisk større enn 0, så takknemlig blir sant.
Deretter linje 25 innser ooh, vi gjort fordi jeg er nå takknemlig.
Og i linje 26, vi bare si, takk for den positive heltall, uansett hva det
skjedd å være.
>> Nå la oss gjøre litt syntaktisk sukker her, så å si.
La oss se om vi kan rydde opp denne linjen 25 med denne tredje og siste varians
i positive3.
Så merker den eneste forskjellen nå er hvilken linje av koden?
Ja, så 25.
Og vi har ikke egentlig sett dette trikset ennå.
Men vi fikk se utropstegn på mandag, som betegner hva?
Så ikke, eller negasjon.
Så ta en boolsk verdi og sprelle med verdi.
Sant blir falskt.
Falske blir sant.
Så dette, ville jeg foreslå, er enda litt mer intuitiv av en måte å
skrive koden fordi jeg fortsatt initialisere takknemlig for falsk.
Jeg fortsatt gjøre følgende.
Jeg satt takknemlig å true når den tid kommer.
Men nå kan du egentlig bare oversette denne koden verbalt venstre til høyre,
mens ikke takknemlig.
Fordi bang, eller utropstegn, betegner begrepet ikke, så mens
ikke takknemlig.
>> Så igjen, har vi ikke innført noen nye konsepter per se.
Vi har snakket om boolske tilbake når vi spilte med Scratch.
Men innser nå kan vi bare begynne å skrive vår kode i
mange forskjellige måter.
Så spesielt i pset1, hvis du er liksom sliter med å finne ut en måte å
skrive noen program, er du flaks odds fordi det kommer til å være noen
antall løsninger som du kan skje på.
For eksempel er dette bare tre for selv de enkleste programmene.
OK.
Og nå husker på mandag, vi igjen på dette notatet med retur verdier.
Så for aller første gang, skrev vi et program som ikke bare har main,
det har også sin egen egendefinert funksjon som jeg skrev her.
Så i tråd 31 gjennom 34, har jeg implementert en kube funksjon.
Det er ikke komplisert.
Det er bare en ganger en ganger en, i dette tilfellet.
Men det som er viktig om det er at jeg tar inn i form av en og
Jeg er tilbake ut i form av en ganger en ganger en.
>> Så nå har jeg muligheten, mye som jeg brukte til med printf alene, å ringe
denne funksjonen ved å kalle kuben funksjonen.
Og kuben funksjonen tar noen innspill.
Og kuben funksjonen returnerer noen utgang.
Og så derimot, printf bare gjorde noe.
Det kom ikke tilbake noe som vi brydde seg om - selv om, som en
side, gjør det returnere en verdi.
Du bare generelt ignorere det.
Printf bare gjorde noe.
Den hadde en bivirkning av utskrift til skjermen.
I motsetning her, har vi kuben funksjonen, som
faktisk returnerer noe.
>> Så dette er generelt -
for de som er kjent med dette, er det en ganske grei idé.
Men for de mindre kjent med denne ideen om bestått i innganger og få
tilbake utganger, la oss prøve bare noe super enkelt.
Er noen komfortabel kommer opp på scenen kort?
Du må være komfortabel med et kamera på deg, så vel.
Ja.
Ok, hva heter du?
KEN: Ken.
DAVID J. MALAN: Ken.
Greit, Ken.
Kom opp.
Så Ken kommer til å være en funksjon av sorterer her.
Og la oss gå videre og gjøre dette.
La oss få litt fancy.
Hyggelig å treffe deg.
Velkommen til sentrum scene.
OK.
La oss hit på denne knappen her.
OK.
Så her har du en moderne tavle.
Og hva jeg er den viktigste funksjonen, for eksempel.
Og jeg har ikke en iPad i hånden.
Jeg vet egentlig ikke huske hvordan du - vel, egentlig, kan ikke si det.
Jeg har egentlig ikke god håndskrift.
Og så derfor vil jeg at du skal skrive ut noe på skjermen for meg.
>> Så jeg blir hovedprogrammet.
Og jeg kommer til å ha dere si dette ved å skrive det i min kylling scratch og
så passerer du en inngang.
Så som dum om denne øvelsen er, oppfatningen av funksjoner og ringer en
funksjon og returnere en funksjon egentlig koker ned til dette.
Jeg er viktigste.
Jeg har nettopp skrevet printf ("noe") på skjermen.
Jeg kjører dette programmet.
Og så snart printf blir kalt, tar det ett argument - eller en parameter,
noen ganger -
mellom doble anførselstegn.
Her er det argumentet.
Eg gir den til Ken.
Nå er han en svart boks skrevet et antall år siden at tilsynelatende
bare vet hvordan du skriver ut ting på skjermen.
>> Så, utføre.
Det er ikke dårlig.
Så, veldig bra.
Så nå Ken gjøres utfører.
Trenger han å gi meg noe tilbake?
Så ikke at vi har sett så langt.
Igjen, ikke printf faktisk tilbake et nummer.
Men vi kommer til å ignorere det for nå fordi vi aldri har brukt det.
Så det er det for Ken.
Og så nå main kommer tilbake for å utføre -
main tar over kontrollen av programmet igjen fordi den linjen med kode,
printf, gjøres utfører.
Og vi går om vår måte å utføre hva andre linjer er der.
>> OK.
Så nå skal vi prøve en litt annen eksempel.
Og denne gangen her, la oss først tømme skjermen her.
Og denne gangen vil vi gjøre det cubing funksjonen.
Men denne gangen, jeg forventer en produksjon verdi.
Så la oss gå videre og gjøre dette.
Så nå har jeg en linje med kode som sier x = cube (x).
Så egentlig let's -
kodelinjen, tilbakekalling, ser ut som dette.
x = cube (x).
Så hvordan dette kommer til å fungere?
Så la oss gå videre og gi deg en hvit skjerm igjen.
Og jeg kommer til å skrive nå ned verdien av x, som på dette tidspunktet i
tid skjer for å være, la oss si, 2, for å holde det enkelt.
Så jeg har skrevet ned på et stykke papir verdien av 2,
som er min verdi x.
Jeg leverer den til Ken.
KEN: Og jeg bare skrive svaret?
DAVID J. MALAN: Ja, la oss bare skrive svaret.
Okay.
Og nå har han å returnere meg noe.
Så -
perfekt.
Hyggelig segue.
>> Så nå er han rekker meg tilbake verdien av 8, i dette tilfellet.
Og hva gjør jeg med det?
Vel, faktisk, la oss se.
Få denne retten.
Hva skal jeg gjøre med det?
Nå skal jeg ta denne verdien, og faktisk lagre den i dem
samme biter i minnet.
Men legg merke til, jeg slags sliter her.
Jeg er litt forvirret fordi der jeg faktisk skrive verdien av x?
Fordi det jeg har nettopp gjort er fysisk hånd Ken et stykke papir
som hadde verdien 2, som var x.
Og ja, det er nettopp det som skjer.
Så det viser seg at når du kaller en funksjon, og du passerer i en krangel
som "Hello World", eller du passerer i en krangel som 2, generelt, er du
passerer i en kopi av argumentet.
Og så akkurat som jeg skrev ned nummeret to her og ga den til Ken, det må
mener at jeg fortsatt har en kopi av verdien 2 et sted.
Fordi faktisk, nå som jeg har fått tilbake verdien 8, jeg trenger å gå tilbake i
RAM og faktisk skrive ned 8 der jeg en gang hadde nummer 2.
>> Så visuelt huske denne oppfatningen av passerer i bokstavelig
en kopi av verdien.
Ken gjør sin ting, gir meg noe tilbake - i dette tilfellet,
en verdi som 8.
Og da må jeg gjøre noe med den verdien hvis jeg
ønsker å holde den rundt.
Så alt dette vil være alt for kjent før lenge.
Takk så mye for denne demoen her, Ken.
OK.
Veldig godt gjort.
Så la oss se hvordan det til slutt gjelder noen av funksjonen
ringer som vi har gjort her.
Så la meg gå videre og bringe oss tilbake til den cubing eksempel her.
Og legg merke til at hvis vi ønsker å faktisk begynne å ta dette videre, skal vi
til å være oppmerksom på det faktum at antall x som blir vedtatt i
her er forskjellig fra det som faktisk blir vedtatt i funksjon.
Så igjen, dette vedtatt av kopien kommer til å bli ganske
germane i bare et øyeblikk.
>> Så la oss ta en titt på noe som ikke helt fungerer riktig ennå.
Jeg kommer til å gå videre og åpner en tredje buggy eksempel, som
er feil av naturen.
Og det heter buggy3, og den implementerer en byttering funksjon.
Så her har vi en viktig funksjon som har x og y vilkårlig initialisert til
1 og 2, henholdsvis.
Vi kunne bruke GetInt, men vi trenger bare en enkel øvelse.
Så det er hardkodet som 1 og 2.
I linjene 21 og 22, vi tilsynelatende skrive ut x og y, ett per linje.
Deretter, på linje 23, hevder jeg at jeg bytte disse verdiene, dot, dot, dot.
Jeg tydeligvis kalle en funksjon på linje 24 som heter swap
som tar to argumenter.
Det er helt legit for funksjoner for å ta to argumenter.
Vi har sett printf gjøre det allerede.
Så swap tar tilsynelatende x og y.
Og som navnet antyder, ville jeg håper at det kommer til å
bytte disse to verdiene.
Så da jeg hevder på linje 25, byttet.
Og jeg skrive x og y under forutsetning av at
de har faktisk blitt byttet.
Men hvis jeg faktisk kjøre dette programmet -
la meg åpne opp en terminal vindu.
La meg gjøre buggy3.
Som navnet antyder, er dette ikke kommer til å ende godt.
Fordi når jeg trykker Enter merke til at x er en.
y er to.
Og likevel på slutten av programmet, er de fortsatt, faktisk, det samme.
>> Så basert på demonstrasjonen akkurat nå med Ken, hva som faktisk skjer?
Vel, la oss dykke inn i denne swap-funksjon.
Det er super kort.
Det er bare noen få linjer med kode lang.
Men hva er det grunnleggende problemet basert på det enkle historien fortalt
opp her med Ken?
Hvorfor er swap brutt?
[Uhørlig]
Akkurat.
Så vi lagring til en kopi, ikke variabelen selv.
Med andre ord, tar swap tilsynelatende to argumenter, en int.
Og det er vilkårlig kalles a og b.
Og her oppe, jeg har gått i x og y, som er henholdsvis 1 og 2.
Men jeg er ikke bokstavelig talt passerer i x.
Jeg er ikke bokstavelig passerer y.
Jeg passerer en kopi av x og en kopi av y.
Det er som nesten som om du har kopiert og limt inn i bytte verdier som
du vil den skal faktisk manipulere.
Så hvis det er tilfelle, da jeg, programmet, begynner utfører
linje 35, og deretter 36 -
når jeg kommer til linje 37, på dette punktet i historien, er det verdien av en?
På dette punktet i historien, linje 37, hvilken verdi av en på dette punktet?
Så det skulle bare være en.
Rett?
Fordi x ble vedtatt i som det første argumentet.
Og denne funksjonen bare vilkårlig kaller sin første argumentet, en.
Tilsvarende er y, det andre argumentet.
Og det er bare vilkårlig kaller det andre argumentet b.
>> Nå er denne motsetningen er faktisk ganske enkelt forklart.
Tenk på det.
Ingen av oss har møtt personen som skrev printf.
Så sikkert, har han eller hun ingen anelse om hva våre variabler 30 år senere kommer
å bli kalt.
Så det må være et skille mellom det du kaller variabler i
funksjoner du skriver og hva du kaller variabler i funksjoner du er
ringer eller bruker.
Så med andre ord, jeg har skrevet mine variabler som x og y.
Men hvis noen andre hadde skrevet swap-funksjonen, vil han eller hun sikkert
ville ikke vite hva mine variabler kommer til å bli kalt.
Så skjønner at dette er grunnen til at du har denne dualiteten av navn.
Teknisk sett kunne jeg gjøre dette ved en tilfeldighet.
Men de ville fortsatt være bestått som kopier.
Det ville bare være en ren tilfeldighet estetisk hvis den personen som skrev
swap hadde brukt de samme navnene.
>> OK.
Så på dette punktet i historien, linje 37, er en 1.
b er 2.
Og nå har jeg fortsette å bytte dem.
Vel først av alt, la meg faktisk gjør dette mye enklere.
Jeg vet ikke hva disse tre linjer med kode gjorde.
La meg bare gjøre dette.
b får en.
en får b.
Ferdig.
Hvorfor er denne brutt, logisk?
Det er slags intuitiv ting, ikke sant?
Så en blir b.
Og b blir en.
Men problemet er at så snart linje 37 kjører, hva er
verdien av a og b?
Det samme, en.
Fordi du har angrepet, så å si, har du endret b for å tilsvare en.
Så når linje 37 er utført, er det flott.
Du har nå to eksemplarer av nummer 1 på innsiden av denne funksjonen.
Så når du sier i tråd 38, får en b, vel, er du slags skrudd.
Fordi du bare tildele 1-1.
Du har slags mistet verdien du brydde deg om.
>> Så i den opprinnelige versjonen av dette, legge merke til hva jeg gjorde.
Jeg i stedet hadde en tredje linje med kode som så ut som dette.
Jeg erklærer en midlertidig variabel - tmp er et svært vanlig navn
for en midlertidig variabel.
Det er en int fordi det har å matche det jeg ønsker å lage en kopi av.
Jeg lagrer en kopi av en innsiden av tmp. Så når linje 37 har utført,
verdien av a er -
rask tilregnelighet sjekk -
1.
Verdien av b er 2.
Og verdien av tmp er også en.
Så nå er jeg utføre linje 38.
Så når linjen 38 utfører, tar en på verdien av b.
Og b var to.
Så en er nå 2.
Så på dette punktet i historien, er en 2, er b 2,
og tmp er en.
Så nå logisk, kan vi bare plop tmp verdi inn b.
Og vi er ferdige.
>> Så vi har løst det problemet.
Dessverre, når jeg kjører dette programmet i dette skjemaet, er det ikke egentlig bytte
noen verdier.
Men for å være klar, hvorfor?
Jeg fikset den logiske problemet fra bare et øyeblikk siden.
Men igjen, hvis jeg kjører dette programmet, x og y forblir uendret ved utgangen av
programmets gjennomføring.
[Uhørlig]
DAVID J. MALAN: Så vi har ikke returnert noe.
Så det er sant.
Men det viser seg at det er litt av et problem her fordi så langt,
eneste vi har vært i stand til å returnere er én ting.
Og dette er en begrensning av C. Du kan bare returnere virkelig en verdi,
i så fall, jeg slags fast her
fordi jeg kunne gå tilbake den nye verdien av x eller jeg kunne gå tilbake
ny verdi av y.
Men jeg vil begge tilbake.
Så tilbake ikke er den enkle løsning her.
Men problemet er fundamentalt hvorfor?
Hva har vi egentlig byttet?
a og b.
Men a og b er kopier av x og y, slik at vi bare gjorde alt dette
jobbe - vi bare brukt som tre minutter å snakke om swap
funksjon og alle tre av disse størrelsene.
Og det er flott, helt riktig i isolasjon.
Men a og b omfang er bare i disse linjene her.
Så akkurat som en for loop, hvis du deklarerer et heltall i inne i for
loop - på samme måte, hvis du erklære a og b innsiden av en funksjon som
har du skrevet, de er bare gyldig innsiden av denne funksjonen.
Som betyr så snart swap er gjort utføring og vi går fra linje 24 til
25 linje, x og y er ikke endret i det hele tatt.
Du bare kastet bort en hel masse tid bytte kopier av variabler.
>> Så det viser seg at løsningen på dette er faktisk ikke opplagt.
Det er ikke helt tilstrekkelig til å returnere verdier fordi vi kan
bare returnere en verdi.
Og jeg virkelig ønsker å bytte både x og y på samme tid.
Så vi kommer til å komme tilbake til dette.
Men for nå, innser at problemet fundamentalt stammer fra det faktum
at a og b er kopier.
Og de er i sitt eget omfang.
Vel, la oss prøve å løse dette på noen måte.
La meg faktisk bla tilbake hit og åpne opp, la oss si, en fjerde variant
av dette, buggy4.
Og hva med dette?
Dette er en lignende, men enklere problem å se på før vi tar en stikke på
løse det.
Dette programmet kalles tilvekst.
Og det initialiseres tilsynelatende en x heltall til en i linje 18.
Jeg så hevder x er en.
Jeg så hevder økes, dot, dot, dot.
Jeg deretter ringe tilvekst.
Men da i linjene 22 og 23, hevder jeg at det er blitt økes.
Jeg hevder x er nå hva det er, 2 formodentlig.
>> Men dette programmet er buggy.
Hva er problemet?
Ja?
[Uhørlig]
DAVID J. MALAN: Nettopp.
Så x har blitt erklært åpenbart på linje 18.
Som er inne viktigste er klammeparentes.
Så det enkle svaret her er at, vel, finnes x her.
Det finnes ikke i linje 32.
Så dette programmet faktisk ikke engang kompilere.
Kompilatoren, når jeg prøver å kompilere denne koden, kommer til å kjefte på meg
om noen svart identifikator eller noe om dette.
Faktisk, la oss prøve.
Dette er å buggy4.
Det er det.
Bruk av svart identifikator x i linje 32.
Og faktisk, la oss være mer eksplisitt her i dag, slik at dette er nyttig i
kontortid og hjemme.
Legg merke til at det er litt kryptisk skrevet.
Men det faktum at Clang har skreket til oss, sier
buggy4.c: 32:5, faktisk er nyttig.
Det betyr at feilen er på linje 32 ved tegnposisjon fem.
Så en, to, tre, fire, fem.
Det er, faktisk, hvor problemet er.
Og også å huske på kontortid og hjemme, jeg er heldig her.
Jeg har en feil.
Det kommer til å være relativt enkelt å fikse.
Men hvis du får en hel skjerm full av overveldende feilmeldinger, igjen,
innse at den nederste man kan bare være symptomatisk for
de øverste seg.
Så alltid jage ned bugs fra toppen og ned.
Fordi det kan bare være en daisy-chain effekt som insinuerer du
har mye mer problemer enn du faktisk gjør.
>> Så hvordan kan vi fikse dette hvis mitt mål er å øke x?
Hva er det?
Okay.
Så vi kan gjøre x global.
La oss ta snarveien at jeg advarte om tidligere.
Men pokker, vi trenger bare en rask løsning.
Så la oss bare si int x opp her.
Det gjør x global.
Så nå main har tilgang til den.
Og tilvekst har tilgang til den.
Og så la meg gå videre og kompilere dette nå.
Gjør buggy4, Enter.
Synes å kompilere nå.
La oss kjøre buggy4, og det synes å faktisk fungerer.
Nå er dette en av disse tingene -
gjør som jeg sier, ikke som jeg gjør, så jeg har nettopp gjort her.
Fordi Generelt, våre programmer kommer til å få mye mer interessant og
mye lenger enn dette.
Og hvis din løsning på livets problemer er bare ah, legge all
variabler på toppen av filen, veldig raskt gjøre programmer får
horrifically vanskelig å administrere.
Det blir vanskeligere å finne på nye variabelnavn.
Det blir vanskeligere å forstå hva variabel som gjør hva.
>> Og så generelt, dette er ikke en god løsning.
Så la oss gjøre dette bedre.
Vi ønsker ikke å bruke en global variabel her.
Jeg ønsker å øke x.
Så jeg kunne selvsagt -
på slutten av dagen, er det en slags dum historie fordi vi bare gjøre dette.
Men hvis jeg ikke visste om at operatøren, eller jeg ikke fikk lov til å
endre den i hoved seg selv, hvordan kunne jeg ellers iverksette Ken over her, dette
tid ikke å kube, men å øke?
Hvordan endrer jeg denne greia her?
Ja.
[Uhørlig]
DAVID J. MALAN: Ok, bra.
Så hvorfor ikke jeg passere i x?
Og så heller enn den tilbake, hvorfor jeg ikke bare må returnere x + 1?
Nå, et par flere ting må endre her.
Jeg er på rett spor.
Hva annet trenger jeg å finpusse?
Noen andre.
Ja?
[Uhørlig]
DAVID J. MALAN: Jeg trenger å endre retur type tilveksten
fordi det ikke er ugyldig.
Void betyr ingenting som blir returnert.
Men klart, nå er det.
Så dette må endres til int å være konsekvent med hva
Jeg er faktisk tilbake.
>> Nå noe annet, er fortsatt buggy her.
Ja?
[Uhørlig]
DAVID J. MALAN: Så jeg trenger å øke x?
[Uhørlig]
DAVID J. MALAN: Ah, så jeg må passere x.
Så jeg trenger å gjøre dette her.
Så prototypen, må jeg endre dette opp her.
Så dette må bli en int.
Dette må bli -
hmm.
Jeg har faktisk en bug her nede.
La oss fikse dette først.
Hva bør dette faktisk være?
Så det er nødt til å være en int noe.
Det kan være x.
Men ærlig, hvis du begynner å ringe alle dine variablene x, kommer det til å bli
mindre og mindre tydelig hva som er hva.
Så la oss bare vilkårlig velge en annen navnekonvensjon for min
helper funksjoner, funksjoner jeg skriver.
Vi kaller det en.
Eller vi kan kalle det - la oss kalle even_number det å være enda mer eksplisitt.
Så da må jeg tilbake uansett antall er pluss en.
Og nå må jeg endre en annen ting her oppe, og en
andre ting her oppe.
Hva må jeg endre på linje 21 første?
Jeg må tilordne den til x.
Så jeg kan ikke bare ringe tilvekst x.
Jeg trenger å huske svaret ved å endre verdien av x på
venstre side.
Og selv om x er nå på venstre og høyre, det er helt fint fordi
høyre side blir utført først da blir plopped i den venstre
hånden ting, x i dette tilfellet.
Og så til slutt, er dette lett å fikse nå.
Dette bør bare matche det er ned nedenfor.
Int nummer.
>> OK.
Så en hel haug av endringer for en virkelig dum funksjon.
Men representant for ting som vi vil i økende grad ønsker å gjøre.
Så sørg buggy4.
Jeg har skrudd opp et sted.
Herregud.
Fem feil i, liker, en seks-line program.
Så hva er galt på linje 18, 5 karakter?
OK.
Så jeg må erklære denne int.
OK.
Så la oss se, en hel haug med andre feil.
Oh my god.
19, 18, 21.
Men igjen, la oss bare tømme skjermen -
Kontroll L her - og re-run Clang.
Så fem problemene er faktisk bare den.
Så nå la oss kjøre buggy4, Enter.
Puh.
x er økes riktig.
>> OK.
Eventuelle spørsmål om hvordan å øke tallene?
Ja?
SPEAKER 2: Hvorfor er det slik at du bare kan endre x til tallet i variabelen
navngi og det vil vite hva du mener?
DAVID J. MALAN: Godt spørsmål.
Hvordan har det seg at jeg bare kan endre x til nummer og programmet vil vite
umiddelbart?
Så igjen, tenk på det som denne abstraksjon.
Så hvis jeg er hoved-og Ken er inkrementell, ærlig, jeg bryr meg ikke
hva Ken kaller sin iPad.
Jeg bryr meg ikke hva han kaller alt som har å gjøre med gjennomføringen hans
av denne funksjonaliteten.
Så dette er en implementering detaljer som jeg, viktigste, ikke
å bry seg om.
Og så bare å endre det konsekvent innsiden av funksjonen, antall her
og nummeret her, er alt det tar så lang som jeg rekompilere.
Det er liksom som om du tenker på - mange av oss, de av dere med førerens
lisenser som har kjørt, eller hvis du har selv kjørt i en bil -
de fleste av oss har ingen anelse om hvordan en bil fungerer under panseret.
Og bokstavelig talt, hvis du åpner opp panseret, de fleste av oss - meg selv inkludert -
kommer ikke til å virkelig vite hva vi ser på.
Typen som du kanskje føler med ting som dette akkurat nå.
Men vi trenger egentlig ikke å bry seg om hvordan bilen fungerer.
Vi trenger ikke å bry seg hva alle stenger og stempler og kabler inne i
bilen faktisk gjør.
>> Så noe som det du kaller stempelet ingen rolle
her i dette tilfellet.
Samme idé.
Ja?
[Uhørlig]
DAVID J. MALAN: Hvis det var mer bruk av variabelen xa øyeblikk siden,
deg, programmerer, måtte endre dem overalt.
Eller du kan bokstavelig talt gjøre Fil, Meny og deretter Finn / Erstatt,
noe sånt.
Men du er nødt til å gjøre disse endringene selv.
Du må være konsekvent.
[Uhørlig]
DAVID J. MALAN: En spesiell rekkefølge som her?
Hvis dette var int annet nummer?
Ja.
Så for teller når du ringer funksjonen.
Så hvis jeg skulle kalle tilvekst her med noe komma noe,
det er en direkte kartlegging.
Den første variabelen, hva det heter, er laget en kopi av den første
argument over her.
Beklager, dette burde ikke være en parentes.
Det andre argumentet på linje med andre.
>> Så orden, ja, saker.
OK.
Beklager at jeg tok en lang vei å komme dit.
Andre spørsmål?
OK.
Så la oss se om vi ikke kan male et bilde av hva som faktisk skjer
her under panseret, så å si.
Så dette er et rektangel som kan representere datamaskinens minne.
Så selv om du har ingen anelse om hvordan hukommelsen virker eller hvordan RAM fungerer, minst
anta at du har bunter av det i disse dager.
Du har megabyte det.
Du har gigabyte det.
Og vi vet fra uke null som en byte er bare hva?
8 biter.
Høyre, så 8 nuller og enere.
Så hvis datamaskinen har en gig RAM, to gigabyte RAM i disse dager, har du en
milliarder eller 2 milliarder bytes minne, eller om lag 8 milliarder kroner eller 16 milliard
biter, på innsiden av datamaskinen.
Nå motsetning til lille Woolly Willy eksempel, er det ikke magnetiske partikler
typisk lenger.
Stadig, i bærbare datamaskiner i det minste, det er solid state-disker, SSD, som
bare har ingen bevegelige deler.
Det er all elektronisk.
Det er all elektrisitet basert.
Så tenker, skjønt, av dette rektangel som bare representerer en eller to
gigabyte minne som du har.
>> Så det er en del av minnet.
Nå er verden av datateknologi har liksom fradeles biter av
minne til å gjøre forskjellige ting.
Så for eksempel, hvis dette er datamaskinens RAM - som foreslått av
rektangel der - det viser seg at ved konvensjonen, på toppen av RAM, så
å snakke, er generelt det som kalles en tekst segment.
De er de nuller og enere som du har samlet.
Så når vi har sett under panseret på hva a.out er, alle
nullpunktene og enere -
når du kjører et program, er de nuller og enere lastet inn fra harddisken din
kjøre inn noe som kalles RAM.
Og i RAM, blir de satt på toppen.
Nå i mellomtiden, har du andre ting.
Initialisert data, uinitialiserte data.
De to ranker minne refererer til globale variabler, som
du ikke bruker ofte.
Men noen ganger hvis du gjør det, ender de opp der oppe også.
Så er det noen andre ting.
Miljøvariabler, som vi ikke vil tilbringe mye tid på.
Men så to viktige ting som vil komme tilbake gjennom hele denne
semester, stack og heap.
>> Så de fleste av datamaskinens minne er reservert når du kjører et program for
noe som kalles stabelen og noe som kalles haugen.
Og vi kommer ikke til å snakke om heap i dag, men vi vil
snakke om bunken.
Og stakken er ment å trylle frem det visuelle av som matsalen
matbrett i Mather House, eller hvor du måtte befinne deg, hvor
spisesal personalet rense dem hver dag.
De stable dem opp fra gulvet på opp.
Og tilsvarende i minnet, er det denne ideen om å sette noe på en
stable sette noe på en stabel, sette noe på en stabel.
Og hva mener vi med dette?
Vel, la oss zoome inn på akkurat den nedre halvdelen av dette bildet, datamaskinens
RAM, for å foreslå følgende.
Det viser seg at når du kjører et program som a.out eller Hallo, hva
programmet er at du har skrevet,
igjen, blir disse nuller og enere lastet fra harddisken - som er
langtidslagring, forblir der selv når du trekker ut pluggen -
lastet inn i RAM.
RAM er raskere enn harddisker.
Det er mindre enn harddisker.
Men det er der programmene leve mens du kjører dem.
>> Så du dobbeltklikker et program på en Mac eller en PC - det er lastet fra
harddisken inn RAM.
Så snart det er lastet inn i RAM, nullpunktene og enere gå på veien toppen,
såkalte tekstsegment.
Men så så snart programmet faktisk begynner å kjøre, det viktigste
funksjonen kalles.
Og viktigste, som vi har sett, ofte har lokale variabler.
Og det har ints og strenger og chars og lignende.
Så hvis programmet som du har skrevet eller det programmet du har
dobbeltklikket brukt noen variabler inne i main, de ender opp på
bunnen av bunken med minne, så å si.
Nå mer konkret, hva dette egentlig betyr?
Dette betyr bare at hvis vi skulle nummerere ting -
hvis vi skulle nummerere bytes RAM i datamaskinen, legge merke til at
dette kan være bytenummer null.
Dette kan være byte nummer en, to, tre, fire, fem, seks, alle
veien opp til å like -
2000000000 ville være helt der oppe på toppen.
Så med andre ord, når vi snakker om RAM eller minne i form av bytes, det
betyr bare at noen har bestemt seg for hva de skal telle hver av
de biter av minnet.
>> Så når du trenger 32 bits for en int, eller du trenger 8 biter for en røye, der
ende de opp i minnet?
Vel konseptuelt, de bare ende opp på bunnen av denne
tingen kalt stabelen.
Men det som er interessant nå er når main kaller en funksjon.
Anta at en funksjon kalt foo, bare et tilfeldig navn.
Det som skjer er main er på bunnen av denne stabel av minnet.
Foo nå er satt på toppen av hoved i minnet.
Slik at eventuelle lokale variabler som Foo har ende opp slags begrepsmessig over
de i main.
Hvis foo kaller en annen funksjon kalt bar, disse variablene ende opp her.
Hvis bar kaller noe annet, her, her, her.
Så hva er interessant om hvordan du kjører et program er at når du kaller funksjoner,
og som disse funksjonene kaller funksjoner, og som disse funksjonene kaller funksjoner,
du bygge opp denne bunken av funksjoner i minnet.
Og bare en gang i funksjonen returnerer du begynne å få det minnet tilbake.
Så en av de enkleste måtene å kjøre ut av minnet i et dataprogram er å
skrive funksjoner som aldri tilbake.
>> Så for eksempel, la oss vise så mye med en
forsettlig buggy program.
La meg gå videre og gjøre # include , int main (void).
Og jeg kommer til å gjøre mens (2> 1), som sannsynligvis ikke vil noensinne
endre på oss.
Og la meg gå videre nå og gjøre printf.
Egentlig, det kommer til å være mindre visuelt interessant.
La oss gjøre dette.
For int (i = 0; i> 0).
La oss gjøre dette feil, i + +.
Og la oss ikke printf her.
La oss praktisere det jeg forkynner.
La oss ha en metode her.
Void chorus, og vi vil si int i.
Og så skal jeg si, printf -
oh, la oss gjøre dette mer interessant.
La oss faktisk ikke skrive noe i det hele tatt.
La oss bare gjøre dette.
Chorus (i).
>> OK.
Så dette er buggy fordi hvorfor?
Jeg gjør dette som jeg gå fordi programmet ikke gjør faktisk noe
av interesse.
Men det er ikke målet.
Målet er å skrive et program som viktigste funksjon gjør hva, tilsynelatende?
Kalle seg.
Og faktisk, trenger vi ikke loopen.
La oss selv forenkle dette bare for ikke å miste av syne virkelig
fundamental feil.
Viktigste samtaler kor til å synge noen refreng.
Så jeg gjorde noe dumt, og jeg hadde kor samtale kor fordi jeg antok
noen andre skulle gjennomføre det kanskje.
Og nå er dette ikke kommer til å kompilere ennå.
Jeg trenger å gjøre hva?
Jeg trenger prototypen, huske.
Så jeg må ha her oppe void kor (int i);.
>> Så nå, hvis jeg går ned her -
faktisk, la oss bruke større vindu.
La oss gå videre og gjøre refreng.
Bruk av uidentifiserte spillefører jeg.
Å, det var dumt.
Vi trenger ikke argumentet.
La oss bare gjøre dette.
Skulle ønske vi hadde startet på denne måten.
Det ville ha vært en mye enklere program for å skrive.
Så det.
Nå la oss gå over til min terminal-vinduet, re-run Clang.
Og her vi går.
Det var virkelig rask.
Hva som faktisk skjedde, da?
Vel, nå skal jeg legge ut linje, slik at vi kan se.
Så la meg si printf, la oss si, jeg er her.
Ok, ingen variabler, vil vi la det sånn.
La meg re-run gjøre.
La meg re-run refreng.
Og kom igjen.
Holde det gående.
Som en side, hvorfor har det ikke krasjet ennå?
Segmentering feil skjedde super rask før.
[Uhørlig]
DAVID J. MALAN: Nettopp.
Så det tar tid å skrive ut.
Det tar bare mer arbeid på datamaskinen del.
Og det er det.
Segmentering feil.
>> Så legge merke til hvor raskt programmene kjører.
Hvis du ikke skriver noe, super rask.
Men vi har fortsatt denne segmentering feil fordi det som skjedde?
Vel, hvis du tenker på hvordan datamaskinens minne er lagt ut, dette
skjer for å være viktigste.
Men her -
la oss bare kalle dette koret, og la oss kalle dette koret.
Og nå hvis jeg gjør mine estetikk rett, dette bare kommer til å si kor,
kor, kor, kor, kor, kor, kor, ad nauseum.
Og til slutt, hva kommer til å skje?
Hvis det store bildet bokstavelig er dette, hva skjer bare konseptuelt?
Stabelen overskridelser haugen.
Eller verre, du bare overkjørt alt, inkludert tekst-segmentet, som er
nullpunktene og de som representerer programmet.
Kort sagt, dette er bare super, super dårlig.
Rett?
Ditt program har kommet ut av kontroll.
Du bruker mye mer minne enn du hadde tenkt alt på grunn av en dum
feil, i dette tilfellet.
Eller i dette tilfellet, en svært bevisst gjort funksjon Ringekonto seg.
Nå er dette ikke så verst.
Funksjoner som kaller seg faktisk har stor makt
når du bruker den riktig.
Jeg har ikke brukt den riktig her.
>> Så dette er ikke så verst.
Men det faktum at jeg aldri slutte å kalle meg selv er en grunnleggende
svakhet her av dette programmet.
Så hvor skal vi med alt dette?
Vel, hva som egentlig skjer?
Når jeg kaller tilvekst funksjonen, som vi gjorde i disse eksemplene,
Jeg har en verdi som en som jeg passerer i.
Jeg passerer i en kopi av nummer én.
Så følgende skjer.
Så la oss gå inn i inkrement eksempel.
Og denne fyren rett over her.
Så her er hva som faktisk skjer.
Når jeg ringte tilvekst, og jeg passerer i x, billedlig hva som er
skjer her er dette -
hvis jeg har verdien 1 lagret her, og jeg faktisk ringe tilvekst, noe som
heter nå kor -
Ja, det er å kaste meg av her.
Så la oss kalle dette tilvekst.
Og vi vet ikke hva dette neste funksjonen kommer til å bli.
Så hva som faktisk skjer er her et sted i hoved, jeg har en del av
minne som lagrer nummer 1.
Når jeg ringer tilvekst, jeg bruker en annen del av minnet, men nå har jeg
har kopi av en.
Når jeg øke denne verdien, blir dette 2 - horribly skrevet på
skjermen her.
Men så, hva skjer så snart tilvekst avkastning?
Dette minnet bare blir sendt tilbake til operativsystemet, noe som betyr alt
du har gjort er ikke noe nyttig.
Den som opprinnelig ble inneholdt i main er fortsatt faktisk der.
>> Så hvor skal vi med dette?
Vel, det viser seg at i minnet du har denne rygg mot rygg sekvens av
byte som du kan sette ting i.
Og det viser seg at vi allerede har sett noe som innebærer å sette
ting tilbake til tilbake til rygg mot rygg.
Hva er en streng, basert på uke en og nå uke to?
Så det er bare en samling av tegn.
Så det viser seg, akkurat som du kan sette tall i minnet, på samme måte kan du
sette tegn i minnet.
Og når vi begynner å sette karakterer i minnet rygg mot rygg til rygg å
tilbake, viser det seg at det å bruke de enkleste ting som en for loop eller
en stund loop, kan vi iterate -
fra venstre til høyre over tegnene i en streng -
og begynne å massere dem inn i ulike karakterer helt.
En kan bli B. B kan bli C. Så det slutt, kan vi ta en
Engelsk setning som faktisk er fornuftig og konvertere hver av dem
bokstaver en av gangen ved å gå gjennom vår datamaskinens minne til å
rett til faktisk kryptere.
>> Så la oss ta våre fem minutters pause her, og når vi kommer tilbake, vil vi
starte denne prosessen med scrambling informasjon.
>> OK.
Så før vi dykke i noen krypto og disse tingene som kalles matriser, la meg
pause for eventuelle spørsmål fordi jeg føler at jeg virkelig slags forvirret noen av
disse emnene.
Så la oss fikse nå hvis vi kan.
Så vi bare snakket om retur verdier.
Vi snakket om argumenter.
Og vi snakket om denne tanken, som vi vil komme tilbake til i de neste ukene
komme, for visning minne som en hel haug av disse stablet
skuffer, så å si.
Fra bunnen på opp, slik at hver skuff som blir satt på stakken representerer
en funksjon som for tiden å bli kalt.
Eventuelle spørsmål?
Så hva med - la meg prøve å stille et spørsmål.
Jeg holder ødelegger det, men nå det er - you've alle sett guttens ansikt.
Så vi vil komme tilbake til det.
>> Så la meg stille et spørsmål her.
La meg forenkle dette tilbake til hva det var før noen av våre tidligere Q & A.
Og det faktum at tilveksten har åpen parentes, int antall, lukket
parentes.
Hva representerer int nummer?
[Uhørlig]
DAVID J. MALAN: Et argument.
Ok, men hva er et argument?
[Uhørlig]
DAVID J. MALAN: Beklager, hva er det?
SPEAKER 3: Noe du passerer i.
DAVID J. MALAN: Ok.
Så noe som du passerer i.
Og mer generelt, er det bare inngangen.
Hvis du skriver en funksjon og at funksjons mål i livet er å gjøre
noe litt annerledes hver gang du bruker den, så den eneste måten for
at det skal skje virkelig synes å være å gi den med innspill slik at den
kan gjøre noe annerledes med at innspill hver gang.
>> Så du trenger å angi to ting når en funksjon tar innganger.
Du må angi navnet du ønsker å gi til den inngangen, rent for
din egen bekvemmelighet, slik at du kan se den i funksjonen du
selv skriver, som jeg gjorde her i linje 32.
Men du må også angi sin type fordi C er et programmeringsspråk
som krever bare
at hvis du ønsker en variabel, må du fortelle datamaskinen hva
data type det er,
i stor grad slik at den vet hvor mange biter til
bevilge for denne variabelen.
Fordi det kan være seks -
lei, vil det ikke være seks.
Det kan være 16.
Det kan være 8.
Det kan være 32, selv 64.
Men datamaskinen trenger å vite.
Nå int på venstre side representerer det derimot?
[Uhørlig]
DAVID J. MALAN: Hva er det?
[Uhørlig]
DAVID J. MALAN: Typen av funksjonen og, mer spesifikt,
type produksjonen sin.
Høyre.
Så mens tingen i parentes representerer sin inngang, om noen,
ting til venstre representerer sin produksjon.
Og i dette tilfellet, returnerer tilvekst tilsynelatende en int.
Og så int er avkastningen type av denne funksjonen.
>> Hva betyr det å vende tilbake?
Bokstavelig talt, bruker du nøkkelordet retur.
Og så hvis det du er tilbake til høyre for søkeordet er en
heltall, så det er faktisk i samsvar med det vi har lovet.
Du kunne ikke gjøre noe som dette -
Hei, verden -
fordi det er en streng.
Selvfølgelig er det ikke et heltall.
Så kort sagt, er byrden virkelig på oss, programmerer, for å være spesifikk som
til hva vi er tilbake og deretter faktisk gå om retur det.
Og deretter å gjøre en tad mer tydelig sammenheng -
Der er han igjen.
Sammenheng -
stor overraskelse kommer i løpet av et øyeblikk.
Konteksten her nå er at datamaskinens minne er, igjen, en
gigabyte, to gigabyte, uansett.
Kanskje det er mer.
Kanskje det er mindre.
Men datamaskinen ser det som å ha forskjellige seksjoner.
Noe går der nede.
Noe annet går opp der.
Forskjellige ting går i midten.
Og i dag, vi bare begynne å fortelle denne historien.
>> Men vi vil komme tilbake til dette over tid.
For nå er det eneste stykke minne vi virkelig bryr seg om tekstsegment
fordi det representerer bare de nuller og enere
som Clang har generert.
Så når du kjører en kommando på tastaturet som a.out, eller du dobbeltklikker
klikk på et ikon på Mac OS eller Windows, er programmet lastet ned fra hardt
kjøre inn RAM.
Og det er plopped på toppen av datamaskinens RAM, så å si.
Nå i mellomtiden, som programmet starter, og viktigste blir kalt i
program du har skrevet eller programmet Microsoft eller Apple skrev noen av sine
lokale variabler ender opp der nede på bunnen av datamaskinens minne.
Men hvis viktigste ringer en annen funksjon som selv har variabler eller
argumenter, de ender opp over det.
Og hvis det funksjon kaller noe, ender de opp over det,
ovenfor det, ovenfor den.
Og bare en gang i funksjonen er ferdig utfører gjør stabelen med skuffer, så
å snakke, begynne å bli lavere og lavere.
Og dette er hva da, i et nøtteskall, forklarer hvorfor, når du ringer kube -
eller du kaller stigning -
du passerer i en kopi av verdien.
Og hva det betyr billedlig er at du bokstavelig talt skrive
nummer 1 i en annen del av minnet, endring at 1-2, i tilfelle av
stigning -
eller til en 8, i tilfellet av kuben -
og deretter kaste at minnet bort så snart tilvekst eller kuben
funksjonen returnerer.
>> Spørsmål.
[Uhørlig]
DAVID J. MALAN: Hvor - globale variabler er lagret i hva som er
i dag kalt initialisert data eller uinitialiserte data.
Forskjellen er, hvis du har en global variabel, og du tilordne det
umiddelbart en verdi med likhetstegnet, ender det opp på toppen der.
Og hvis du bare si int x semikolon uten verdi, ender det opp litt
lavere i RAM ved å konvensjonen.
Andre spørsmål.
OK.
>> Så dette bildet vil komme tilbake som vi får mer kraftig med hva vi kan gjøre
med datamaskinen.
Men for nå, la oss ta en kort intro til kryptografi, en bestemt type
kryptografi som ikke løser alle verdens problemer, men løser
noen av dem.
I dette tilfellet her har vi noe som heter hemmelig nøkkel kryptografi.
Og hemmelig nøkkel kryptografi, som navnet antyder, stammer sikkerhet
fra en hemmelighet.
Så for eksempel, hvis du er tilbake på grunnskolen og du passerer en
liten hemmelighet kjærlighetsbrev til gutten eller jenta du er knusende på - hvis du
ønsket å passere som gjennom publikum, har du sannsynligvis ikke ville skrive
slik et notat på engelsk eller hva morsmålet ditt er, heller, du
kan kryptere den.
Eller du kan bare sende dem en tekstmelding i disse dager.
Men du kan faktisk sende dem et notat i hele klasserommet.
Og for å gjøre dette sikkert, på en slik måte at dine venner og læreren
vet ikke hva du skriver, kan du komme opp med en ganske enkel
algoritme -
ung om du kan være -
å bare krafse ordene.
Så i stedet for å skrive en, kan du skrive B. I stedet for B, kan du skrive
C. I stedet for C, kan du skrive D, og ​​så videre.
Eller du kan komme opp med en mer sofistikert oversettelse av brev
til forskjellige bokstaver.
Men fangsten er gutt eller jente som du sender dette notatet må
vet noe.
Som er det, selvsagt?
Liker, hva hemmeligheten er.
Liker, hva er det mapping mellom As og Bs og Cs og Ds?
Er det bare å legge en, så å si, til hver av bokstavene til å gå fra
A til B, B til C?
Er det mer komplisert enn som så?
Slik at du og din knuse trenger å ha denne hemmelig informasjon.
Men det er litt av en catch-22 her.
Hvis dette er den aller første gangen du skal sende denne kjærlighetsbrev gjennom
klasse, hvordan det gutt eller jente kommer til å vite hva hemmeligheten selv er?
Så hemmelig nøkkel kryptering løser ikke alle verdens problemer.
Og det er faktisk et forhold som vi vil komme tilbake til mot
semesters slutt.
>> Tilsvarende har ingen av oss noen sinne sendt en -
Tilsvarende, de fleste av oss ikke kjenner noen som fungerer, for eksempel på
Amazon.com.
Og likevel har mange av oss sannsynligvis kjøpt ting på Amazon.com.
Og vi har blitt opplært til å anta at disse e-handel
transaksjoner er sikre.
Rett?
Nettadressen sier trolig https.
Det er kanskje en dum liten hengelås sted.
Det er en slags kryptografi sikre kredittkortinformasjonen
mellom deg og Amazon.com.
Og likevel, hvis kryptografi innebærer å vite noen hemmelighet, og likevel gjør jeg ikke
Vet noen på Amazon, og jeg har absolutt ikke arrangert noen form for
Hemmeligheten med noen på Amazon, er hvordan min datamaskin eller nettleseren min å gjøre dette?
Vel, det viser seg det er andre typer kryptografi sammen som løser
det problemet.
Men for i dag, vil vi fokusere på enkel en, der du kan ordne i
avansere til kjenne noen hemmelighet, som i tillegg til en eller noen tilordning mellom As og Bs.
>> Og prosessen med kryptografi generelt innebærer dette.
Du har noen ren tekst, avbildet her til venstre.
Du kjører det gjennom en slags algoritme eller prosedyre
for kryptering det.
Kanskje det er bare A blir B, blir B C. Og så ender du opp med
uleselig tekst.
I mellomtiden, når forelskelsen mottar hemmelige notatet, har han eller hun til da
dekryptere den ved generelt reversere at algoritmen slik som å få
tilbake ren tekst.
Nå er det fysiske inkarnasjoner av dette.
For eksempel er dette en liten hemmelighet dekoder ring.
Og dette er en ring i den forstand at det er to ringer her.
På utsiden periferien av denne tingen, det er bokstavene A til Z,
selv om de er i tilfeldig rekkefølge.
Og på innsiden, det er faktisk noen tall, slik at med dette
ring, kan du slags slå utsiden, men ikke på innsiden for å stille opp
tall med bokstaver.
Og i klippet du er i ferd med å se - noen som du kanskje har sett 24/7
rundt jula fra en film som heter A Christmas Story.
Du vil se at lille Ralphie var så ivrig etter å finne ut hva liten foreldreløs
Annie hemmelige budskap var til ham som hadde blitt kommunisert, tror jeg, i
danne av numeriske meldinger på en seriell boks.
Og du måtte samle alle de små kortene som kom
i frokostblanding boksen.
Du måtte sende dem i.
Du måtte komme tilbake den hemmelige dekoder ring, slik at du kan endelig finne
ut hva kartleggingen er mellom bokstaver og tall,
eller bokstaver og bokstaver.
Så jeg gir deg denne korte klipp fra A Christmas Story å motivere pset 2 og
vår diskusjon, i et øyeblikk, for arrays.
Så her har vi Ralphie.
>> [VIDEOAVSPILLING]
-La det være kjent for alle og enhver at Ralph Parker herved utnevnt en
medlem av Little Orphan Annie Secret Circle og har krav på
æren og fordeler forekommer dette.
-Signert, Little Orphan Annie.
Countersigned, Pierre Andre!
I blekk!
Æresbevisninger og fordeler, som allerede i en alder av ni.
Kom igjen, la oss fortsette med det.
Jeg trenger ikke all that jazz om smuglere og pirater.
-Lytt morgen kveld for den avsluttende eventyr av The Black
Pirate Ship.
Nå er det tid for Annie hemmelige budskap til deg medlemmer
av Secret Circle.
Husk, barn, kan bare medlemmer av Annie Secret Circle dekode
Annie hemmelige budskap.
Husk at Annie avhengig av deg.
Sett dine pins til B2.
Her er budskapet.
12, 11 -
-Jeg er i mitt første hemmelig møte.
-14, 11, 18, 16 -
-Pierre var i stor stemme i kveld.
Jeg kunne fortelle at kveldens budskap var veldig viktig.
-3, 25.
Det er en melding fra Annie selv.
Husk, ikke si det til noen.
-90 Sekunder senere, jeg er i det eneste rommet i huset der en gutt på ni
kunne sitte i fred og dekode.
Aha, gikk B. Jeg til den neste.
E. Det første ordet er være.
S. Det kom lettere nå.
U.
-Kom igjen, Ralphie.
Jeg må gå.
-Jeg er rett ned, ma.
-Jøss.
-T, O. Pass til.
Pass på hva?
Hva var Little Orphan Annie prøver å si?
Pass på hva?
-Ralphie!
Randy har å gå.
Kan du komme ut?
-Greit, ma.
Jeg kommer rett ut.
-Jeg begynte å bli nærmere nå.
Spenningen var forferdelig.
Hva var det?
Skjebnen til planeten kan henge i balanse.
-Ralphie!
Randy er nødt til å gå.
-Jeg er rett ut, for roper høyt.
-Jøss, nesten der.
Fingrene mine fløy.
Mitt sinn var en stål felle.
Hver pore dirret.
Det var nesten klar.
Ja, ja, ja, ja.
-Sørg for å drikke din Ovaltine.
Ovaltine?
En crummy kommersielle?
Drittsekk.
[END VIDEOAVSPILLING]
>> DAVID J. MALAN: Så det har vi kryptografi.
Så hvordan i en datamaskin kan vi gå om etablering eller
representerer ting som dette?
Vel, vi trenger en måte å uttrykke oss selv litt mer fleksibelt enn
våre variabler så langt har tillatt.
Vi har hatt ints.
Vi har hatt tegn.
Vi har hatt flyter og dobbeltrom og noen få andre.
Men de er individuelle deler av minnet som ikke egentlig tillate oss å
uttrykke ting som ord og setninger og uttrykk.
Faktisk har vi kalt slike ting strenger.
Men vi lovet at dette er egentlig bare en forenkling i CS50
bibliotek som vi har tenkt å skrelle tilbake.
>> Og så la oss begynne å gjøre det her.
La meg gå videre og åpne opp en fil -
alle disse filene er tilgjengelig som vanlig på nettet -
kalt array.c å løse et problem som ikke er relatert til strenger, men det tegner et
bilde her av hvordan vi kan bruke noe som kalles en matrise.
En matrise er en datatype.
Det er en type variabel, sorterer, som har flere mindre datatyper
innsiden av det tilbake til tilbake til rygg mot rygg.
Så for eksempel, hvis vi ønsker å skrive et lite program som gir deg din
quiz gjennomsnittet for et kurs som 50 som har to spørrekonkurranser, du kan veldig lett
skrive dette programmet - basert selv på noen av forrige ukes materiale -
ved hjelp GetInt og et par variable.
Int quiz1, quiz2 int, og det er ganske grei.
Det er kanskje 10, 20 linjer med kode, maks, for å gjennomføre et program som ber
bruker for to quiz score og deretter regner gjennomsnittlig ved å legge dem
sammen, dividere med to, og deretter skrive resultatene.
Vi kunne sannsynligvis gjøre det ganske lett nå etter
noen flere minutter.
>> Men problemet er at anta at 50 hadde tre quizer eller fire.
Anta at du ønsket å bruke det samme programmet for en klasse som hadde
ukentlig quiz.
Tenk om en klasse som har ukentlige quiz.
Hvis det er som 16 eller så uker i et semester, nå har du 16 variabler -
int quiz1, int quiz2, int quiz3, quiz4 int.
Så snart du begynner å se denne redundans, dette kopiere og lime inn
av koden, bør det begynne å gjøre deg skulle ønske det var en bedre måte.
Og heldigvis, på grunn av matriser, er det.
Så la oss gjøre dette.
Først, la meg presentere en veldig enkel ting som vi ikke har brukt så langt,
men du vil se det noen ganger i koden.
Dette er hva som er generelt kalt en konstant.
Så det er en konstant i den forstand at denne verdien ikke endres.
Den menneskelige konvensjonen når du oppretter en konstant er å bruke all kapital
brev, bare slik at det virkelig skiller seg ut i koden din.
Og den spesielle nøkkelord som du bruker i C er å definere #.
Så hvis du sier # define, deretter et mellomrom, deretter ordet du vil bruke for
konstanten navn, og deretter verdien av konstanten.
Så varsel, er dette forskjellig fra å tildele noe til en variabel.
Det er ingen likhetstegn.
Det er ingen semikolon.
Dette er hva som er allment kjent som en preprosessor direktivet, men mer på
at en annen gang.
>> For nå, skaper dette en uforanderlig verdi som kalles quizer som faktisk
numerisk verdi er 2.
Så når du ser spørrekonkurranser, quiz, spørrekonkurranser hele denne filen, er at
bare nummer 2.
Nå, hvis jeg ser på main nå, la oss se hvordan dette fungerer.
Ved første, ser det litt kryptisk.
Men det er all ting fra uke én.
Spør brukeren for karakterer.
Hvordan gjør vi dette?
Vel, i linje 22 -
dette er virkelig saftig del -
Jeg erklærer en flåte, men ikke bare en enkelt flåte.
Jeg erklærer heller en rekke flytpunktverdier.
Den variabelen kommer til å bli kalt karakterer, som underforstått her.
Men den eneste stykke av ny syntaks så er disse hakeparenteser, det faktum
at jeg har sagt float karakterer og deretter åpen klamme og deretter et tall.
Varsel, hvis dette er en konstant, er dette akkurat som vi gjorde dette.
Dette betyr hei datamaskin, gi meg to flottører, og la oss kollektivt kalle
dem karakterer.
Dette er i kontrast til en mye mer langtekkelig prosess som dette.
Float Grade1, flyte Grade2, og så videre.
Så en matrise tillater oss å gjennomføre denne ideen, men mye mindre messily, i
en slik måte at vi kan skrive en linje med kode i stedet for, sier 16 for en 16
uke semester.
Så jeg ønsker ikke å hard-kode 2 fordi hvis du tenker på dette nå
logisk - anta neste år CS50 endringer i 3 quizer i stedet.
Og jeg hadde nummer 2 her.
Jeg hadde nummer 2 her.
Det blir veldig kjedelig og veldig lett å skru opp og til uhell endrer
en verdi til 3 og savner noen annen verdi med 2 stk.
Så jeg kommer til stedet abstrakt dette bort og bruke denne konstant som, som sin
navnet antyder, aldri endres.
Og nå, quizer uansett om vi har annerledes i år eller neste, jeg
må bare endre det på ett sted, her oppe på toppen.
>> Så det er all konstant er.
I mellomtiden er den nye konseptuelle funksjon som av en matrise.
Så klammeparentesene gi meg så mange flyter og lar meg kollektivt
kaller dem karakterer her.
Så la oss nå se hva jeg skal gjøre.
Her i linje 24 er begynnelsen av en for løkke.
Dette er egentlig ikke noe fancy.
Det er bare å bruke spørrekonkurranser stedet for en hardkodet nummer.
Men det er ingenting intellektuelt annerledes der fra forrige uke.
Dette er bare printf.
Så printf ("quiz nummer% d av% ​​d") fordi jeg vil bare skrive ut gi meg quiz
nummer én av to og deretter to av to.
Så dette er en ren estetisk ting.
Men det interessante delen er nå på linje 27.
For å fylle en av de to plassholderne med et flyttall
verdi, du igjen bruke hakeparenteser.
I dette tilfellet, jeg bruker jeg fordi dette for loop har startet med i tilsvarende
hva verdien, tilsynelatende?
0.
>> Så på den første iterasjon av denne sløyfen, er det som om jeg
skrev dette i koden.
Men på den andre iterasjon av denne sløyfen, er det som om jeg
skrev dette i min kode.
Men det faktum at jeg bruker en variabel er perfekt fordi, som navnet
antyder, er det varierende sin verdi på hver iterasjon.
Så jeg fyller denne tabellen ett sted om gangen.
Hvordan ser denne tabellen ut?
Vel, grunnen til at jeg trakk denne super enkle rektangel på skjermen her
før var på grunn av dette.
En matrise er bare en del av minnet etterfulgt av en annen del av minnet,
etterfulgt av en annen del av minnet, og så videre.
Så hvis min array er av størrelse 2, i dette tilfellet her, alt jeg ville gjøre med
skrive i min quiz score, som her.
Jeg fikk 100 på denne.
Og så fikk jeg en 99 på dette.
Da dette minnet kanskje ikke engang brukes fordi jeg har bare spurt
datamaskin for en matrise av størrelse 2.
Disse rutene er der fortsatt.
Rett?
Du har fortsatt to gigabyte RAM, selv om du bare
ber om to flyter.
Så ideen bak arrays er at datamaskinen bare tar en bit av minne
og apportions deretter mindre biter rygg mot rygg til rygg mot rygg.
Og så det er alt en matrise er.
Det er en sammenhengende del av minnet, innsiden av som du kan sette ting.
>> Nå skjer så gjør bare noen kjedelig aritmetikk.
Hvis jeg ruller nedover her, dette er hvor jeg da iterere over tabellen.
Jeg kommer opp med summering av alle verdiene i tabellen.
Og så bruker jeg den runde funksjon her å faktisk gjøre
summen deles spørrekonkurranser.
Men la meg bølge min hånd på det som en slags nok aritmetikk for nå.
Men alle som gjør for meg til slutt beregner et gjennomsnitt.
Så første quiz pluss andre quiz, delt på to, og deretter skrive ut
det ut som en int.
>> Men la oss nå gjøre overgangen til et annet eksempel heter streng1,
som maler et lignende bilde, men bruker strenger.
La meg gå videre og forenkle dette for bare et øyeblikk.
Og tilgi innrykk for nå.
Varsel i linje 19 i denne eksempel, får jeg en streng fra brukeren.
Men legg merke hva jeg neste gjøre i linjer 22 og fremover.
Jeg er faktisk iterating fra jeg opp til - og dette er et nytt triks -
strlen, hyssinglengde.
Dette er en funksjon som kommer med C at hvis du sender den en streng, forteller det
deg hvor mange tegn er i strengen.
Det er alt.
Det faktum at det er strlen stedet for streng lengde er bare fordi det er
mer konsis.
30 år siden, likte folk å skrive ting som konsist som mulig.
Så vi har holdt at konvensjonen her.
i + + betyr bare øke jeg i hver iterasjon.
Og nå merke til dette, noe som er veldig interessant.
Så i linje 24, sier jeg datamaskin, gi meg et tegn, åtte
biter, og kaller det c.
Men hva er dette på høyre side sier?
På engelsk, hva som representerer?
[Uhørlig]
DAVID J. MALAN: Nettopp.
Gi meg det første tegnet i rekken.
Eller mer generelt, gi meg i-th karakter i tabellen.
Og realisere det er viktig nå at så dataforskere, er vi faktisk
telle fra 0.
Du har ikke skjønn nå for å begynne å gjøre dette.
Nå må du oppføre seg i henhold til datamaskinens forventninger og
telle fra null fordi [0] kommer til å være den første
tegnet i en streng.
[1] kommer til å bli den andre.
[2] kommer til å bli den tredje, og så videre.
Så dette programmet, hvis jeg kompilere det - dette er, igjen, streng1.
>> Så sørg streng1.
Og nå har jeg kjørt streng1 i min terminal-vinduet.
Den venter på innspill, så jeg kommer til å skrive i, sier David.
Enter.
Og nå er det ut DAVID alle på ulike linjer fordi
Legg merke til hva jeg gjør.
Jeg skriver ett tegn om gangen.
Nå vil vi ikke gå i detalj i dag på dette.
Men jeg slettet et øyeblikk siden denne sjekken her.
Det viser seg at hvis brukeren ikke ordentlig, motstandere, eller bare
forvirret, kan du faktisk ikke klarer å gi en streng av noen lengde.
Hvis du treffer feil tast på tastaturet, kan du gi
ingen streng i det hele tatt.
Eller hvis du er ondsinnet, kan du prøve å lime på en gigabyte verdt av en
essay å fylle denne strengen.
Og hvis maskinen går tom for minne, viser det seg at vi skal
å komme tilbake denne spesielle verdi som kalles null.
Så for nå, bare vet at det er denne spesielle verdi som kalles null som
vil tillate oss å sjekke når vi er ute av minne, blant annet.
>> Men hvis jeg åpner opp nå streng2, merke en forskjell her.
Merke en forskjell her med streng2.
Med streng2, dette er for loop litt annerledes.
La meg slette nuller slik at vi kan snakke om dem en annen gang.
Men hva er annerledes om for loop denne gangen?
Og jeg kan gå tilbake til forrige eksempel.
Så det er versjon to.
Dette er versjon én.
En, to, en to.
Så strlen samtalen er der?
Det er i den første del av for loop.
Noen tanker om hvorfor jeg gjør dette?
Ja.
[Uhørlig]
DAVID J. MALAN: Så vi ikke kalle funksjonen hver eneste gang.
Akkurat.
Husker fra for looper at de er super enkelt når du liksom
forstå at dette er initialiseringen,
tilstand, og oppdateringen.
Problemet er at tilstanden skjer på hver
iterasjon av sløyfen.
Og så i dette eksempelet her, er hva dårlig med det faktum
at dette er min tilstand?
Du ringer strlen igjen og igjen og igjen.
Men når jeg har skrevet i DAVID, er lengden av strengen fem.
Og det kommer ikke til å forandre på hver iterasjon av loopen fordi
streng er fortsatt D-A-V-I-D. Så dette er et hint om hva som kommer til å bli en
stadig viktigere idé kjent som en design beslutning, hvor - bare ikke
gjøre datamaskinen gjøre unødvendig arbeid.
>> Nå bare som en sniktitt på to pset, 2 pset i standardutgaven er
kommer til å utfordre deg til å faktisk gjennomføre noen flere koder, noen
antall krypteringsalgoritmer, slik at du både kan kryptere og dekryptere
hemmelige meldinger, mye som den Ralphie det dekodet.
I hacker utgave av pset 2, vi kommer til å gå litt lenger.
Vi kommer til å gi deg en fil fra en faktisk datasystem som inneholder en
hel haug med brukernavn og faktiske krypterte passord, og utfordringen
for hacker utgaven kommer til å være å knekke disse passordene og figur
ut hva kryptografi eller hva hemmeligheten ble brukt til å faktisk
generere disse passordene.
Og vi kommer til å gjøre dette ved hjelp av en ny funksjon her på C som jeg skal gi
du bare en demo av, kjent som kommandolinjeargumenter.
>> Så det viser seg, som noen av dere kanskje har sett i avsnitt eller i lærebøker,
main ikke alltid trenger å være ugyldig i parentes.
Det viser seg at hoved kan også skrives som dette, med to argumenter,
argc og argv, hvor argc er antall ord som du skriver etter
programmets navn på kommandolinjen.
Og argv er de faktiske ordene.
Og som klammeparentesene det foreslår, er argv tilsynelatende en matrise.
Det kommer til å være en streng etter en streng etter en streng i minnet.
Så det vi kommer til å være i stand til å gjøre, starter med pset 2,
noe sånt som dette.
Hvis jeg gjør argv1, som er et eksempel vi vil komme tilbake til på mandag, og kjøre
det merke til at det ikke synes å gjøre noe ennå.
Det skriver bare ut sitt eget navn.
Men hvis jeg sier farvel klasse, legg merke til at dette programmet tilsynelatende gjentar
over hver av de ordene som ble skrevet ved ledeteksten.
Og midlene som vi får tilgang til ord som brukeren har
skrives inn ved ledeteksten er ved å endre viktigste, starter denne helgen, fra int
main (void) til int main (argc, argv).
Og dermed vil bli født kommandolinjeargumenter.
Og når du får virkelig sofistikert på dette, vil du være i stand til å skrive
virkelig trippy programmer, slik som denne her, som går utover
noen av funksjonene vi har gjort så langt, men alle ganske kraftig.
>> Så vi vil forlate dette med denne på skjermen.
Og vi vil se deg på mandag.