>> SPEAKER 1: All right.
Velkommen tilbake.
Dette er uke to av CS50, og vi har så langt vært å bruke funksjoner, men
i stor grad tatt dem for gitt.
Vi har brukt printf som har bivirkning av utskrift
ting på skjermen.
Vi har brukt get-int, får flyte.
>> Men hva om du faktisk ønsker å skape dine egne funksjoner, som noen av
du har kanskje allerede begynt å gjøre for Problem Set One, men
strengt tatt ikke nødvendig?
Vel, la oss gå videre og besøker samme problemet med bare å spørre brukeren for
deres navn og utskrift noe på skjermen, men prøv å faktor ut noen
av felles at vi har sett i koden vår så langt.
Så med det mener jeg følgende.
>> Jeg kommer til å gå videre og skape et nytt program, bare ring
det hello.c som vanlig.
Jeg kommer til å gå videre og gi meg selv Utover standard io.h på toppen.
Jeg skal også gi meg selv preemptively den CS50 biblioteket slik at
Jeg får ikke skreket til av kompilatoren.
Og nå skal jeg gå videre og erklære int, viktigste, annullert.
>> Og så i her, det er her jeg vil å begynne å outsource funksjonalitet til
en annen funksjon som jeg selv er kommer til å skrive, men som ikke
Det finnes i dag.
For eksempel anta at jeg ønsket å skrive en funksjon som tillater meg å
skrive ut Hallo, komma, og deretter noen brukers navn.
Snarere enn å fortsette å gjøre printf hallo,% s, ikke ville det være fint om
det var bare en funksjon kalt ikke printf men print navn?
>> Så med andre ord, jeg vil være i stand til å skrive et program som gjør litt
noe sånt som dette.
Først skal jeg si printf din navn, og dermed spørre brukeren til
gi meg hans eller hennes navn, og da er jeg kommer til å bruke de kjente streng s til
erklære en streng.
Gi meg en variabel av type string, kalle det s, og oppbevar i at
resultere av ringer får streng.
Men nå i uker tidligere, ville jeg ha noe ordinært gjort hallo,% s / n.
>> Og med andre ord, vi har sett dette eksempel en rekke ganger, og det er en
trivielt eksempel fordi det er bare en linje med kode så det er egentlig ikke en
big deal å fortsette å skrive på nytt.
Men anta at denne linjen med kode faktisk var blitt en byrde, og
det er ikke en linje med kode, men det er 10 kodelinjer et par uker fra nå,
og du bare blir sliten å kopiere og lime inn eller
retyping den samme koden.
Ville det ikke vært fint stedet for å gjøre printf hallo,% s og så videre,
ville det ikke vært fint hvis det var bare en funksjon kalt print navn som
tar et argument -
med andre ord, tar det inngang -
og deretter semikolon.
Slik at funksjon, ville det ikke være fint om det fantes?
Da ville jeg ikke trenger å bekymre deg hva printf er, hva% s og alle
denne kompleksiteten som er ikke alle som interessant.
De er nyttige.
>> Så print navn, dessverre, var ikke oppfunnet noen 40 pluss år siden.
Ingen tenkte å skrive det.
Men det er det fine med å ha en programmeringsspråk, akkurat som i
Skrapelodd kan du definere tilpassede blokker, så i C og de fleste andre språk, kan du
definere din egen funksjonalitet, kan du definere dine egne funksjoner.
Så selv om vi får viktigste by automatisk for gratis, kan vi erklære
våre egne funksjoner.
>> Så jeg kommer til å gjøre noen plass her oppe opp toppen, og jeg kommer til å erklære min
egen funksjon som kommer til å se en litt rart i begynnelsen, men vi vil komme
tilbake til dette før lenge.
Jeg kommer til å si ugyldig, og dermed indikerer denne funksjonen gjør
noe, har en bivirkning, men det returnerer ikke noe til meg i
samme måte som får int eller får streng selv gjør.
Og jeg kommer til å gi denne funksjonen en Navn på print navn, og jeg kommer til å
spesifisere at denne fyren kommer til å ta en streng, og jeg kommer til å kalle det
string navn.
Jeg kan kalle det hva jeg vil, men jeg vil ha min kode for å være selvstendig dokumentere.
Med andre ord, var hvis en av dere til åpne denne filen og lese den, kan du
slags antyde fra navnet på det inngang hvilken rolle den skal spille.
>> Og nå under det, kommer jeg til å åpne klammeparentes og lukket klammeparentes,
og så merker jeg har fulgt det samme mønster på linjene fire gjennom syv som
Jeg har fulgt etter en god uke pluss nå mellom, sier ni linjer og
14 som komponere viktigste.
Med andre ord, skrive navnet er en annen funksjon.
Nå er kompilatoren ikke kommer til å vite å kalle denne tingen automatisk
fordi jeg bokstavelig talt bare oppfant den, men det vil vite fortsatt å kalle hoved
automatisk, og da selvfølgelig i linje 13, jeg kaller min egen funksjon.
Og fordi jeg har erklært at funksjonen opp på linje fire før main,
dette kommer til å lære kompilatoren hva sitat, unquote, "print name"
betyr og hva den skal gjøre.
Så jeg er liksom gi det en ny tilpasset blokkere i sammenheng, sier Scratch.
>> Så her kan jeg putte det svært vanlig eller gjentakende mønster av koden jeg holder
skriver i klassen, printf % S hallo,% s / n ", -
hva ønsker jeg å sette her?
S?
Så jeg ønsker å sette navn i denne sammenheng.
Så merker litt av en dikotomi her.
Fordi jeg erklære min egen funksjon og jeg har noe tilfeldig kalt
det ut navn, og fordi jeg har angitt i parentes at dette
Funksjonen tar ett argument, type som er en streng - så det er et ord
eller en setning eller noe sånt - og Jeg ringer som argument navn, som
betyr den eneste variabelen som er i omfang, så å si, er navnet.
>> S eksisterer bare mellom det to klammeparentes, selvfølgelig?
Vel egentlig, akkurat som linje 10 gjennom 14, så akkurat som på mandag kan ikke bruke
S, men hva jeg kan gjøre er å passere S i trykken navn.
Skriv ut navn bare så skjer for å gi den et alias, et synonym, et kallenavn,
kaller det navnet, og nå bruke det i denne linjen.
Så nå la meg lagre denne, zoome ut.
>> La meg gå videre og gjøre hallo.
Ser bra ut.
Fikk ikke spytte ut eventuelle feil. . / Hallo Enter.
Hva er navnet mitt?
David.
Og hallo David.
Så ikke alt som er spennende, men tenk nå.
Du har nå den samme ingrediens som vi gjorde i Scratch til
gjøre våre egne funksjoner.
>> Men det er litt av en fikser.
Anta at jeg egentlig ikke hadde tenkt dette gjennom og jeg faktisk uten
egentlig tenker om det skrev som fungerer her nede.
Føles helt rimelig.
I Scratch er det ingen forestilling av plassering i skript.
Du kan sette en opp her, her oppe, her oppe, og det kan starte
å se litt rotete hvis du ikke legge den ut pent, men det gjør ikke
Uansett hvor fysisk skript var på skjermen.
Dessverre i C - og dette er ulikt språk som Java og Python
og andre at du kan bli kjent med - dessverre i C, gjør rekkefølge
saken fordi watch hva som er kommer til å skje nå.
>> Standard funksjon som kommer å utføre er, selvfølgelig, hoved.
Hoved kommer til å kalle print navn på linjen åtte, men dessverre,
kompilatoren vil ikke engang vet at print navn foreligger før det blir til linje 11,
som dessverre kommer til å være for sent.
Så la oss gjøre gjøre hallo.
Og nå jævla, to feil genereres.
Så nå la meg bla opp til den aller først, som vi alltid bør gjøre, og
legge merke til at det er roping på meg, "Implisitt deklarasjon av funksjon
skrive navn. "
>> Så vi har sett denne meldingen før, implisitt deklarasjon av funksjon.
Når har vi sett at type feil?
Når jeg ikke er bibliotek.
Hvis jeg har glemt cs50.h og jeg ville få skreket til for få streng eller få int.
Men i dette tilfelle, er denne funksjonen print Navnet er ikke i et bibliotek, ikke sant?
Det er bokstavelig talt i denne filen, så hva er egentlig problemet?
>> Vel dessverre i C, tar det deg så utrolig bokstavelig talt at hvis du
vil ha en funksjon som heter print navn til eksisterer, du enten nødt til å implementere
som fungerer på toppen av din koden slik at det er tilgjengelig for å senke
funksjoner, men ærlig talt, det blir slurvete svært raskt.
Personlig liker jeg å sette viktigste først fordi da er det svært klart hva dette
Programmet gjør ved første øyekast.
Og pluss, kan du komme inn rare hjørne tilfeller der hvis x ønsker å ringe
y, men y kan kalle x, du bare fysisk kan faktisk ikke sette en
over hverandre.
>> Men det viser seg i C, kan vi løse dette veldig enkelt.
Jeg kommer til å sette en liten bit av plass opp her, og jeg skal bare
preemptively, om enn noe redundant, kommer til å lære
kompilator som det eksisterer en funksjon kalles print navn, tar det en streng,
og jeg kommer til å ringe det navnet semikolon.
>> Så dette nå på linje fire, som vi ikke har sett før, er en erklæring
av en funksjon print navn, men det er bare et løfte om at denne funksjonen vil
etter hvert bli definert, til slutt iverksettes.
Dette nå kan jeg la være fordi nå dette er definisjonen, den
gjennomføring, liksom den siste mil av gjennomføringen av dette
bestemt funksjon.
Så ærlig talt det er dumt, det er irriterende, men dette er måten er C, og den er
fordi det tar deg svært bokstavelig og, som en datamaskin ærlig bør,
bare gjør akkurat det du ber den om gjør, og slik at sortering er viktig.
>> Så hold det i tankene og igjen, begynner å merke gjentakelse av mønstre.
Odds er du vil, hvis du ikke har allerede, begynner å støte på meldinger
slik som ved første øyekast synes helt kryptisk, men hvis du starter
å lete etter disse stikkordene som "Implisitt erklæring," omtale av en
funksjon i dette tilfellet - og ærlig, du noen ganger også få en liten grønn
gulrot symbol som forteller deg hvor problemet er sannsynligvis -
du kan begynne å jobbe deg gjennom ennå usett feilmeldinger.
Eventuelle spørsmål om å skrive egen funksjon på denne måte?
>> La oss gjøre noe som er en litt mer overbevisende.
Snarere enn bare å gjøre noe som har en bivirkning av utskrift, la meg gå
videre og lagre en ny fil, og vi vil kaller dette positive.c, selv om det er
kommer til å være litt annerledes versus forrige gang.
Og denne gangen, jeg ønsker å re-implementere siste tids positive.C eksempel, som
er tvinge brukeren til å gi me et positivt heltall.
Men jeg måtte bruke få int siste gang.
Ville det ikke vært fint hvis det var en funksjon som heter få positive int
at jeg bare kunne outsource denne stykke funksjonalitet til?
Så forskjellen her er vi vil implementere få positive int, men i motsetning til
print navn som hadde en bivirkning - det kom ikke tilbake noe til meg som
et tall eller en streng -
få positive int er, selvfølgelig, kommer til å tilbake, forhåpentligvis, en positiv int.
>> Så la oss gjøre dette.
Inkluder cs50.h, Inkluder standard io.h.
Int main ugyldig.
Og nå her, jeg kommer til å gå videre og la oss si int, kall det n er lik
få positive int.
Og akkurat som få int allerede eksisterer fordi de ansatte skrev det, jeg kommer
å anta for øyeblikket at få positive int eksisterer, og nå skal jeg
å gå videre og si printf, takk for% i / n ", n.
>> Så nå hvis jeg kompilere dette programmet, hva kommer til å skje i terminalen min
vinduet på bunnen av skjermen?
Jeg skal nok få som samme feil som tidligere.
Så la oss prøve dette.
Gjør positive.
Og igjen, implisitt erklæring av funksjon, får positiv int.
Så vi kan løse dette i et par måter.
Jeg kommer til å holde det enkelt og bare sette min erklæringen opp her og få
positive int.
Jeg trenger den såkalte signatur.
Signaturen refererer bare til estetikk av
første linjen i programmet.
Så hva bør få positive int retur?
>> Så en int.
Jeg mener også ideelt sett tilbake noe sånt som positivt int, men at
finnes ikke.
Vi har ikke sett at blant våre data typer, så vi har å forholde seg til
faktum at vi har svært få datatyper å jobbe med.
Men vi kan returnere en int og bare stoler på at det vil være positivt.
Det kommer til å bli kalt få positive int.
>> Og nå hva med sine argumenter?
Tar det noen innspill?
Trenger det noen innspill?
Slik at den ikke trenger å vite på forhånd noe.
Få strengen ikke får int ikke.
Printf gjør - det er behov for å ha noen innspill gått inn i den - og skrive ut navn
trengte noen innspill, men få positive int ikke.
Så jeg kommer til å eksplisitt fortelle kompilatoren ugyldig.
Void er fraværet av noe annet.
Så ugyldig betyr ingenting kommer inne av disse parenteser, semikolon.
>> Og nå på bunnen av filen min - og igjen, jeg bare være snill av anal
her sette hoved øverst, som er god praksis fordi denne måten
når du eller noen andre åpner filen, vises
funksjonalitet er rett der.
Du kan dykke i fra Square One.
Så nå skal jeg kopiere dette, få positive int tomrom, men jeg er ikke
kommer til å treffe et semikolon nå.
Jeg kommer til å åpne klammeparentes, og nå trenger jeg å låne
noen ideer fra mandag.
>> Så som du husker, gjorde vi noe liker du gjøre følgende mens
noe var sant.
Og hva gjorde jeg?
Jeg gjorde noe som gir meg et positivt heltall,
litt av en melding.
Jeg kunne bruke noen ord jeg ønsker.
Og så brukte jeg det?
Int n er lik få int, ingen argumenter til det.
>> Og legg merke til forskjellen.
Når du ringer til en funksjon, når du bruker en funksjon, trenger du ikke sette i tomrommet.
Du bare gjøre det når erklære en funksjon, undervisning kompilatoren hva
det bør forvente.
Slik at du ikke trenger å sette ugyldiggjøre det selv.
>> Og nå hva som var tilstanden min?
Vel, er n ikke lik positiv, men det er bare pseudo-kode.
Så hvordan uttrykker jeg gjør dette mer renslig?
Slik at mindre enn eller lik null.
Så igjen, merker du kan gjøre mindre enn eller lik.
Selv om det er to separate symboler, kan du gjøre det på
tastaturet som sådan.
>> Men det er fortsatt en bug som Jeg skrudd opp sist gang også.
Jeg må erklære -
nøyaktig.
Jeg må erklære n utenfor av løkken.
Så jeg trenger å sette n opp her, og jeg vet ikke ønsker å re-erklære den inn her
så jeg får en ny variabel.
Jeg vil bare tilordne en verdi her.
>> Og nå er jeg ikke helt ferdig her.
La meg komme foran meg selv og late som jeg er ferdig.
Gjør positive, og nå det er en ny feil.
Kontroll når slutten av ikke-void funksjon.
Så ny feilmelding, men hvis du snill av erte hverandre hvert av ordene, det
sannsynligvis hint på hva som er galt.
>> Kontrollere.
Styreinnretningen bare til rekkefølgen av virksomheten i et program.
Datamaskinen er i kontroll og noe gikk galt.
Så det kommer til slutten av en ikke-void funksjon.
Hvilken funksjon er det tilsynelatende henviser til?
Hva funksjonen er ikke-tomrom?
Så får positive int, og litt forvirrende i at godt,
det er slags tomrom.
Den har en spesifikasjon av tomrom for dens argumenter, men produksjonen skal
være av typen n..
Så ordet til venstre er såkalt retur-type.
Ordet på innsiden her er de null eller flere argumenter
som en funksjon tar.
>> Så hva må jeg gjøre?
På dette punktet i min kode, linje 21 hvor den blinkende meldingen er nå, jeg
ha en positiv int inne av variabel kalt N.
Hvordan gir jeg den tilbake til hovedsiden?
Bokstavelig talt.
Returnere n semikolon.
>> Så akkurat som Colton returnerte stykke papir med et svar til meg ved å slippe
det stykke papir i den lille sorte boksen på bordet, for å gjøre det i
koden, du bokstavelig talt bare skrive, returnere n, og det er som om Colton var
levere meg noe fysisk tilbake.
I dette tilfellet, det som skjer er få positive int kommer til å levere tilbake
hva er formodentlig en positiv heltall til hvem?
Hvor ender denne verdien opp?
Som ender opp i denne variabelen, n, og da vi fortsette med linjen ni.
>> Så med andre ord, i størrelsesorden drift, starter dette programmet
gjennomføring, og kompilatoren innser, Åh, du vil biblioteket?
La meg gå grab hva som er inni det.
Åh, du vil standard IO biblioteket?
La meg gå grab hva som er inni det.
Hva sier kompilatoren til seg selv når den treffer linjen fire?
Oh, du lovte å implementere funksjon som heter få positive, men
vi vil komme tilbake til det senere, noe langs disse linjene.
>> Int main ugyldig betyr bare her er guts av mitt program.
Linje syv er bare en klammeparentes.
Linje åtte sier til venstre, gi me 32 bits for et heltall, kall det n.
På høyre side er det sier få positive int.
Nå la oss stoppe denne historien fordi nå Jeg kan ikke bevege meg markøren ned.
Min markøren går nå ned her fordi nå får positive int utfører.
Int n er deklarert.
Gjør følgende.
Printf gir meg et positivt heltall.
>> Få en int fra brukeren, lagre den i n, og kanskje gjøre dette igjen og igjen.
Denne sløyfen betyr at denne koden makt kjøre opp og ned som dette igjen
og igjen, men når brukeren endelig samarbeider og gir meg en positiv
int, jeg traff linjen 21, noe som medførte at nummeret er levert tilbake, og som man
bør jeg fremheve nå?
Ni.
Kontroll, så å si, returnerer til linje ni.
Det er den linjen som er nå ansvarlig.
>> Så det er hva som har skjedd alle denne gangen under panseret, men
når vi har brukt funksjoner som printf eller selv få streng som noen andre
skrev til deg, ble kontrollen blir overlevert off til andres kodelinje
for linje for linje.
Det er bare vi ikke kunne se det, og vi kunne egentlig ikke skildre det i denne
program fordi det er i en annen fil på harddisken
Ukjent for oss.
Så la oss faktisk kompilere og kjøre dette nå.
>> Gjør positive.
Kompilere, det er fremgang.
. / Positiv.
Gi meg et positivt heltall.
La oss være vanskelig.
Negative en.
Zero.
La oss gi den 50.
Takk for 50, og så kontroll har nå returnert.
Eventuelle spørsmål, da, på det?
Yeah?
>> [Uhørlig].
>> Si det igjen.
Oh, godt spørsmål.
Så du kanskje merke en parallell her at Jeg er litt å kutte et hjørne på.
I linje 12, jeg sier, får positiv int returnerer en int, men av den samme
logikk, står det nå til grunn at det i Online seks, jeg sier at viktigste avkastning
en int, men hva har vi aldri hatt i noen av våre programmer?
Vi har aldri hatt omtale av dette stikkordet retur.
>> Så det viser seg at i C, minst den versjonen av det at vi bruker
gjort i 1999, teknisk, er dette skjer automatisk for deg.
Når du gjennomføre et program, og du implementere en funksjon som heter main,
at funksjonen vil returnere null ved standard hvis du ikke sier noe annet,
og null er bare en konvensjon.
Verden returnerer null dermed som indikerer at alt er bra,
effektivt forlate oss med fire milliarder mulige ting som kan gå
feil slik at hvis vi går tilbake ett, som kan betegne en kode som betyr dette
ting gikk galt.
Vi kunne returnere to, noe som innebærer denne andre ting gikk galt.
Vi kunne returnere fire milliarder, som betyr dette andre ting gikk galt.
>> Og hvis du nå tenker om din egen PC eller Mac, kan du huske at
noen ganger får du kryptiske feilmeldinger fra programvare som du er
ved hjelp av, og noen ganger har det et menneske vennlig beskrivelse, men det er
ofte en kode eller et nummer på skjermen?
Hvis dette ikke kommer til hjernen, bare holde et øye for det.
Det er typisk hva disse kodene henviser til.
De er inkludert i Microsoft Word og andre programmer, slik at hvis du sende inn en
feilrapport med selskapet, kan du fortelle dem, oh, jeg fikk feil nummer 45.
Og noen programmerer tilbake på selskapet kan se det opp i hans eller hennes
koden og si, oh, det er fordi jeg har gjort denne feilen, og det er derfor brukeren
fikk denne meldingen.
>> Men ærlig talt, det er bare litt distraherende og litt kjedelig å
konkluderer med at, i det minste på vår første få programmer, så vi har
vært å utelate det.
Men hele denne tiden hver og en av dine funksjoner main har i all hemmelighet hadde denne
linjen automatisk lagt for deg av kompilator, bare ved konvensjonen til
spare deg litt tid.
>> [Uhørlig].
>> Du trenger ikke å inkludere det i main.
Det er bra.
Du trenger ikke å inkludere den hvis du var implementere en funksjon som dette.
Ellers funksjonen flat ut ville ikke fungere.
Men i hovedsak er det ikke nødvendig.
I en uke eller to, vil vi begynne å bli inn som vane når vi ønsker å starte
betegner feil.
Virkelig godt spørsmål.
>> Så rask verbal pause for å nevne at denne fredagen, vil vi ikke ha lunsj
per se, men vi skal ha middag med noen av studenter og ansatte.
Hvis du ønsker å bli med oss, føler fri til å gå til cs50.net/rsvp.
06:00 denne fredagen.
Space er, som alltid, begrenset, men vi vil fortsette å gjøre disse på en nesten
ukentlig basis hvis plassen går ut denne uken.
>> Så cliffhanger at vi slapp på Mandag var at strengene kan faktisk
bli indeksert inn, noe som betyr bare at du kan få ved første tegn,
andre tegn, det tredje tegnet og så videre, fordi du kan
effektivt tenke på en snor, som hallo, som i dette tilfellet fem
bokstaver på innsiden av bokser.
Og du kan få på hver av de bokser med hva syntaks gjorde vi
innføre på mandag?
De klammer på tastaturet.
Det betydde bare gå til plassering null.
>> Vi begynner å telle på null, så brakett null betyr h, en brakett
betegner E, og så videre.
Og så hele tiden når vi har vært hjelp strenger og skrive i "hallo"
og "verden" og andre ting på skjermen, er det blitt lagret
i bokser som dette.
Og ta en gjetning.
Hva hver boks representerer fysisk innsiden av datamaskinen?
>> [Uhørlig].
>> Sorry?
>> Tegn.
>> Så et tegn, sikkert på grunn av strenger, og et tegn er bare
åtte bits eller én byte.
Slik at du sannsynligvis er minst vagt kjent med det faktum at
datamaskinen har minne.
Den har to typer minne minst.
Den ene er den harddisken der du lagrer stappe permanent, og det er
vanligvis stor slik at du kan ha filmer og musikk og så videre.
>> Da har du en annen type minne kalt RAM, R-A-M, Random Access
Minne, og dette er den typen minne som brukes når datamaskinen er
kjører, men hvis du mister makt eller din batteriet dør, noe som er lagret
i RAM forsvinner hvis du mister makt helt fordi det ikke er
vedvarende.
Du vanligvis har, i disse dager, en gig av det, to konserter, kanskje mer.
Og oppsiden av RAM er at det er mye mye, mye raskere enn harddisker
eller Solid State-stasjoner i disse dager, men det er vanligvis dyrere så
du har mindre av det.
>> Så dagens samtale refererer virkelig til RAM, som type minne som
bare eksisterer mens det er strøm blir matet inn i datamaskinen.
Så når du skriver i H-E-L-L-O, Enter på tastaturet, er H går i ett
byte av RAM, er E går i en annen byte RAM, er som
resten av ordet.
Så husker hva vi kunne å gjøre siste gang var dette.
La meg gå videre og åpne opp filen som vi kalte string.c, og husker
at det så litt noe sånt som dette.
La meg faktisk rulle tilbake og endre det til nøyaktig hvordan det så ut,
hyssinglengde på s.
>> Så se på programmet her.
Vi inkluderer CS50 biblioteket slik som vi kan bruke får streng.
Vi inkluderer standard io.h slik at vi kan bruke printf.
Hvorfor gjorde vi inkluderer string.h?
Dette var nytt på mandag.
Så vi ønsket strenglengde.
Str leng.
Folk besluttet år siden, la oss bare være konsis.
I stedet for å kalle det "streng lengde," la oss kalle det "str leng" og la
verden figur som ut, og slik at det er hva vi får tilgang til med string.h.
>> Dette er kjent.
Dette er kjent.
Dette er en lite nytt.
I 22 line - og vi vil komme tilbake til dette, men for nå vet -
og du ville bare vite dette fra å ha Les dokumentasjonen eller hvis
du visste C allerede -
får streng noen ganger kan skru opp.
Hvis brukeren er egentlig motstandere eller lite samarbeidsvillig, og han eller hun bare
ikke skriver ikke noe på tastaturet eller typer så mye på tastaturet som
de overdøver datamaskinens minne, i teorien får streng kunne returnere
noe annet enn en streng med tegn.
Det kunne returnere en spesiell verdi som kalles NULL i store bokstaver, N-U-L-L, og dette er
bare en såkalt fast punkt verdi.
Det er en spesiell verdi som betegner noe dårlig skjedde i dette tilfellet.
Det er fraværet av en streng.
>> Så null Jeg sjekker for rett og slett slik at lang historie kort, str leng og
andre funksjoner som kommer med C, hvis de forventer en streng, men passerer du dem
fravær av en streng, hvis du passerer dem NULL, datamaskinen eller programmet
vil bare krasje direkte.
Det skal henge.
Det vil kaste opp noen feilmelding.
Dårlige ting vil skje.
Så selv om dette er fortsatt ikke godt definert -
Dette vil være mer fornuftig i en uke eller to - på linje 22, er dette bare en
eksempel på selvtillit defensive feilkontroll bare i tilfelle en gang ut av
en million noe går galt, på Minst mitt program ikke vil krasje.
>> Så hvis s ikke lik noe dårlig, Jeg har dette for loop, og dette var
hvor vi hadde den andre nytt stykke av syntaks.
Jeg har en for loop gjentar fra null på opp til lengden av s.
Og så her, var jeg en utskrift ut s brakett i, men hvorfor har jeg bruk% c alle
Plutselig stedet for% s selv men s er en streng?
Det er et tegn, ikke sant?
S er en streng, men s braketten noe, s brakett jeg hvor jeg er null
eller en eller to, er at en person karakter i strengen, og slik for
det, trenger printf å bli informert om at det er faktisk et tegn du kan forvente.
>> Og så husker, gjorde hva dette programmet faktisk gjør?
>> Skrives det ut i kolonner.
>> Ja, akkurat.
Det bare trykte ordet som jeg skriver i en kolonne, ett tegn per linje.
Så la oss se dette igjen.
Så sørg for streng.
Kompilert OK. . / String.
La meg skrive i H-E-L-L-O, Enter, og faktisk jeg får det, ett per linje.
>> Så la meg gjøre en optimalisering her.
Hvis du tenker på det, spesielt hvis du har programmert før, er det
uten tvil en ineffektivitet i tråd 24.
Med andre ord, er det ikke nødvendigvis den beste design.
Grei, i hvert fall når du huske hva str Leng er, men det er
gjør noe dumt potensielt.
Hva kan det være?
>> [Uhørlig].
>> Nettopp.
Det sjekker for lengden på s hver eneste gang, selv om
H-E-L-L-O er alltid kommer å være fem tegn.
Hver gang gjennom denne sløyfen, de fem ikke er i endring.
Jeg kan økes i, men hva er lengden s på hvert
gjentakelse av denne sløyfen?
Det er fem, er det fem, er det fem, og Likevel er jeg likevel spørre dette
spørsmålet igjen og igjen og igjen.
Nå ærlig, er datamaskinen så jævla rask, er det ingen som kommer til å merke en
Forskjellen i dette tilfellet, men slike av dårlig design beslutninger kan
begynner å legge opp hvis kompilatoren selv ikke prøve å fikse dette for deg som
det vanligvis ikke ville, på minst i apparatet.
>> Så jeg kommer til å gjøre dette.
Jeg kommer til å legge til et komma etter min første variabelen, jeg.
Jeg kommer til å gi meg selv en annen variabel, kaller det n, bare ved
konvensjonen for tall, og da er jeg kommer til å tildele n Verdien av strengen
lengden på s.
Og så jeg kommer til å endre min tilstand å være det?
Jeg kommer til å endre min tilstand til mens jeg er mindre enn n.
>> Så nå, hvor mange ganger jeg kontroll av lengden av s?
Gang, men det er greit å sjekke i mot n igjen og igjen fordi nå de
verdier er faktisk ikke forandrer seg.
Nå for nå, bare vet at når du kalle en funksjon, det er litt av
overhead, ikke nok til å ta motet fra deg egentlig fra noensinne å bruke funksjoner, men
sikkert når det er en linje med kode liker det - og linjene vil få
mer interessant før lenge - der det er en mulighet til å tenke at hvis jeg
skriv inn denne koden, hvor mange ganger vil det utføre?
Du vil begynne å se over tid ytelse av programmene kan
faktisk endres.
>> Faktisk anvise en av problemet har vi gjort i år tidligere innebærer
gjennomføring, som du kanskje husker fra uke null, en stavekontroll, men en
stavekontroll som er utformet for å støtte en ordbok på 150.000 pluss
ord som vi gir dere.
Du må skrive kode som laster disse ordene inn i RAM, så inn
bokser som vi så på skjermen et øyeblikk siden, og da så fort du
kan, må du være i stand til å svare på et Spørsmålet av skjemaet, er dette ordet
feilstavet?
Er dette ordet stavet feil?
>> Og i noe sånt som at det vi har gjort i år tidligere er slått den inn,
om enn på en opt-in frivillig basis, en konkurranse av former, der
elever som bruker mindre RAM og mindre tid, færre CPU-sykluser, ender opp
bobler opp til toppen av et litt leder styret eller rangering som vi legger på
kursets hjemmeside som vi har gjort i år tidligere.
Så igjen, helt valgfri, men denne taler til design muligheter
som er i forkant når vi starter bygge på toppen av noen av disse
grunnleggende byggesteinene.
>> Så la meg gå tilbake til dette diagrammet for bare et øyeblikk og avslører litt
noe mer.
Dette er faktisk en streng, og vi har tatt Fordelen med noen biblioteker,
standard io.h som har -
>> Printf.
>> Printf, blant annet.
cs50.h, som har få int og få streng og så videre, string.h, som
hadde str leng.
Men det viser seg at det er enda en.
Ærlig talt, det er masse header filer som erklærer funksjoner
for bibliotekene, men dette ctype.h er faktisk kommer til å bli noe
en fordel fordi jeg kommer å gå videre og gjennomføre en
andre program her.
>> La meg gå videre og åpne opp noe Jeg skrev på forhånd kalt
capitalize.c, og la oss ta en titt på hvordan dette fungerer.
Legg merke til at jeg bruker, i denne versjonen av det, tre kjente filer.
Legg merke til at i tråd 18, jeg få en tekstlinje.
Varsel på linje 21, jeg hevde at følgende kode skal
kapitalisere s, hva brukeren har skrevet i, og hvordan gjør jeg det?
Vel, jeg tar -
lekse lært fra forrige gang -
Jeg erklærer jeg og n og iterating over karakterene i strengen.
Og hva er denne blokken av kode på linje 24 gjennom 27
gjør i lekmann vilkår?
>> Små bokstaver brev tilbake.
>> Nettopp.
Hvis s brakett i - så hvis i-te karakter i s, er der en spesifikk
char i strengen, er større enn eller lik til små bokstaver og et -
husker at dobbel-tegn betegne og -
og samme tegn, s brakett I, er mindre enn eller lik små bokstaver z,
det betyr at det er en a eller en b eller en c eller prikk, prikk, prikk eller en z, noe som betyr
det er små bokstaver.
Hva ønsker jeg å gjøre i dette tilfellet?
Vel, jeg kan gjøre dette litt kryptisk, men
la oss erte dette fra hverandre.
>> Jeg kommer til å kalle printf, skriver% c fordi jeg ønsker å trykke denne
tegn på skjermen.
Jeg er så kommer til å ta s brakett i, den i-ende tegn i s, og deretter hvorfor
gjør jeg dette lille trikset her, små bokstaver et minus kapital A?
Hva som kommer til å gi meg, generelt sett?
>> [Uhørlig].
>> Nettopp.
Jeg vet egentlig ikke huske -
det var 65 for hovedstaden A. Jeg har egentlig ikke huske hva små bokstaver en er,
men uansett.
Datamaskinen vet.
Så ved å si, små bokstaver et minus kapital A, er det rart å være
subtrahere en char fra en annen, men hva er tegn under panseret?
De er bare tall.
Så uansett hva disse tallene er, la maskinen husker det
snarere enn meg menneske.
>> Så små bokstaver et minus kapital A er kommer til å gi meg en forskjell.
Det skjer for å være 32, og det ville være tilfelle for små b og kapital B
og så videre.
Det forblir konsekvent, heldigvis.
Så jeg er egentlig sier, ta liten bokstav, trekker seg som
standard forskjell, og at effektivt endringer s brakett i fra
små bokstaver til, selvfølgelig, store bokstaver, uten at jeg virkelig måtte tenke
om eller huske, hva var de tallene vi snakket om da de åtte
frivillige kom opp på scenen?
Nå i mellomtiden, i den andre, hvis det ikke er en liten bokstav som bestemmes
for linje 24, bare skrive det ut.
Jeg vil bare berøre tegn som var
faktisk opprinnelig små bokstaver.
>> Så la oss se dette.
Gjør kapitalisere.
Kompilert, OK.
. / Kapitalisere.
Og la meg skrive i H-E-L-L-O med små bokstaver, Enter.
Og legg merke til at den er konvertert inn store bokstaver.
La meg gjøre dette igjen med et annet ord.
Hva med D-A-V-I-D med den første D balanseføres som et navn er typisk?
Enter.
Legg merke til det er fortsatt riktig.
Det bare sendes ut at første D uendret via det annet konstruere.
>> Så husk, da en par ting her.
En, hvis du noen gang ønsker å sjekke to forholdene på en gang, kan du og dem
sammen som vi spådde.
Du kan sammenligne tegn på denne måten og effektivt behandle tegn som
tall, men ærlig, dette er så jævla kryptisk jeg aldri kommer til å huske
hvordan å komme opp med dette fra scratch uten resonnement gjennom det for ganske
litt tid.
>> Ville det ikke vært fint hvis noen ute skrev en funksjon kalles er
lavere som kan svare for meg sant eller falske, er dette tegnet små bokstaver?
Vel heldigvis, den som skrev ctype.h gjorde akkurat det.
La meg gå opp her og legge ctype for c typer, og nå la meg gå ned her og
omskrive denne linje som følger.
>> Så hvis det heter er lavere, jeg hevder, s brakett i, så jeg kommer til å slette
disse to linjene helt.
Så nå noen andre, håper jeg skrev en funksjon som heter er lavere, og det
svinger ut de gjorde, og de erklærte det inni ctype.h.
Og nå skal jeg til å forlate line 27 alene, jeg kommer til å forlate linjen 31
alene, men legger merke til hvor mye jeg har strammet opp min kode.
Det er nå renere.
Det er mindre vanskelig å se gjennom fordi nå funksjonen, dessuten er
så fantastisk heter det bare gjør det de sier.
>> Så nå skal jeg lagre dette.
Jeg kommer til å zoome ut.
Og akkurat som i spillene du kunne ha Boolske, boolske verdier sant eller
falsk, det er akkurat det som er senke effektivt avkastning.
La meg rekompilere.
La meg re-run.
Og la oss nå prøve det igjen, H-E-L-L-O, Enter.
Det er ganske bra.
Og prøve det igjen, sørge for at jeg ikke skru noe opp.
Det er balanseført i tillegg.
>> Men dette er ikke bra nok fordi andre ting som jeg aldri kommer til å
Husker med mindre jeg jobbe gjennom det virkelig nøye på, sier, er papir
denne jævla linje.
Ville det ikke vært fint hvis det var en funksjon kalt til videregående?
Vel det viser seg at det er i ctype.h også.
Jeg kommer til å gå videre og skriver -
la meg ta den linjen tilbake.
I stedet for dette her, la meg gå videre og si erstatning for% c
Resultatet av å kalle denne funksjonen til øvre på i-ende tegn i s.
Og nå merker det begynner å bli litt balansert.
Jeg må holde styr på hvor mange parenteser Jeg har åpnet og lukket.
>> Så nå er det enda renere.
Nå er dette programmet blir bedre og bedre utformet uten tvil fordi det er
mye, mye mer lesbar, men det la ingen er riktig.
Gjør kapitalisere.
. / Kapitalisere.
H-E-L-L-O. La oss kjøre det igjen, D-A-V-I-D. OK, så vi er fortsatt i
ganske god form.
>> Men nå til videregående.
Jeg foreslår at det er ett mer raffinement vi kunne gjøre som ville være
veldig hyggelig, som kunne virkelig stramme opp denne koden og virkelig gi oss fem
av fem for utforming, for eksempel.
Hva ville være fint å bli kvitt?
Vel, se hvor jævla lenge denne blokken av Koden er bare for å gjøre noe enkelt.
>> Nå som en side, som du kanskje har sett i super seksjon denne fortiden
helg, trenger du strengt tatt ikke trenger klammeparentes når du bare har én
kodelinje, selv om vi foreslo holder dem slik at det gjør mye
mer tydelig, som i Scratch er U-formet blokker, hva som er inne i den grenen.
Men ville det ikke vært fint om til øvre, når gitt sin input, snudde det til
store bokstaver hvis det ikke er, og hva ville være flott i motsatt tilfelle hvis
det er allerede store bokstaver?
Bare passerer det gjennom og la det være.
>> Så kanskje det gjør det.
Jeg kan prøve og bare håper at det gjør, men la meg
introdusere en annen ting.
I stedet for å bruke denne innebygde terminal vindu her nede, husker at
denne plassen svart ikon gir deg en større terminal vindu som jeg kan full
skjermen hvis jeg vil?
Så det viser seg at de er liksom merkelig navngitt, men det er disse tingene heter
man-sider, manuelle sider, mann for kort, og jeg kan få tilgang til disse ved
skrive mann -
hva ønsker jeg å skrive?
Man til øvre.
>> Og nå merke hvis det finnes en fungere innsiden av maskinen, i
dette tilfellet apparatet, som er bare operativsystemet Linux, det kommer
å gi meg en noe kryptisk sett utgang, men du finner over tid som
det alltid er formatert ganske mye samme slik at du begynner å bli vant til det.
Legg merke øverst til øvre, og tilsynelatende er den samme dokumentasjonen
for å senke.
Den som skrev det var å kutte noen hjørner og sette det hele på en side.
Disse tingene 'formål i livet er å konvertere en
brev til øvre eller små bokstaver.
>> Legg merke til at under Synopsis, mannen siden lærer meg hvilken fil jeg har
å inkludere for å bruke denne tingen.
Det gir meg underskriftene for disse funksjoner, begge av dem, selv
selv om vi akkurat nå bare bryr seg om en.
Her er nå en beskrivelse.
Til øvre konverterer brevet c til store bokstaver hvis mulig.
>> Fortsatt ikke at lærerikt, men la meg nå ser under returverdi, tingen
som er levert tilbake.
Så den returnerte verdien er at av konvertert brev eller c hvis
konvertering ikke var mulig.
Hva er c?
>> Den opprinnelige karakter.
>> Den opprinnelige karakter, og vi vet at ved, igjen, går opp til
synopsis, og den som skrev dette funksjon nettopp besluttet at inngangen
til å øvre og nedre er bare vilkårlig kommer til å bli kalt c.
De kunne ha kalt det mest noe de vil, men de holdt det
enkelt som c.
Så jeg har konsultert mannen siden.
Denne setningen forsikrer meg at hvis det er ikke en liten bokstav, er det
kommer til å bare gi meg tilbake c, som er perfekt, noe som betyr at jeg kan bli kvitt
min andre tilstand.
>> Så la meg gå tilbake til gedit, og Nå la meg bare gjøre dette.
Jeg kommer til å kopiere min printf uttalelse.
Jeg kommer til å gå videre og rett på innsiden for loop print det ut, og få
kvitt nå hele denne hvis konstruksjon.
Var ikke en dårlig idé, og det var veldig mye riktig og i samsvar med
alt vi har forkynt, men bare ikke nødvendig.
Så snart du oppdager noen bibliotek Funksjonen finnes det noen andre
skrev, eller kanskje du skrev et annet sted i filen, kan du bruke det og virkelig
begynner å stramme opp koden.
>> Og når jeg sier ting som god stil, det faktum at denne personen kalles
fungere til øvre, eller tidligere er lavere er fantastisk nyttig fordi
de er veldig beskrivende.
Du ville ikke ønsker å ringe dine funksjoner x og y og z, som har
mye, mye mindre betydning.
Eventuelle spørsmål om den serien av forbedringer?
>> Så det er nok å si at en av de takeaways er likesom deres eget problem
sett - kanskje problem sett en, men sikkert P satt to og framover, selv
når de er riktig betyr ikke nødvendigvis mener de er perfekt akkurat
ennå, eller spesielt godt designet.
Det er den andre aksen til begynne å tenke på.
Så dette var en streng innsiden av datamaskinens minne, men hvis du har en
hel haug av tegn som H-E-L-L-O innsiden av RAM, og anta
at du i programmet ringe få streng flere ganger slik at du
ring får streng gang, så du ring får streng igjen.
Vel, hva kommer til å skje over tid?
>> Med andre ord, hvis du har en linje med kode, om enn ut av sammenhengen, som
string s blir -
la oss gjøre dette.
String navn tilsvarer får streng.
Så antar at kodelinje er ment å spørre brukeren om hans eller hennes navn.
Denne neste kodelinje er ment å spørre brukeren for hans eller hennes skole, og
denne neste linje, og så videre.
Anta at vi fortsette å spørre brukeren for en annen og
annen og en annen streng.
De kommer til å bo i minnet samtidig.
Man kommer ikke til å clobber den andre.
Skolen er overskriver ikke den andre.
Men hvor gjør de alle ende opp i minnet?
>> Vel, hvis vi begynner å tegne på skjermen, som vi kan bruke denne tingen
her som en tavle, hvis dette svart rektangel representerer datamaskinen min
minne, kommer jeg til å vilkårlig starte dele det opp i små firkanter,
som hver representerer én byte minne.
Ærlig talt, hvis du har en gigabyte RAM i disse dager, har du en milliard bytes
minnet i maskinen din, slik at en milliard av disse rutene.
Så det er nok å si, dette er egentlig ikke å skalere.
>> Men vi kunne holde tegne alle disse åpenbart ikke i riktig målestokk kvadrater, og denne
kollektivt representerer min datamaskinens minne.
Nå er vi bare vil gjøre prikk, prikk, prikk.
Så med andre ord, når jeg nå be bruker med get streng å gi meg en
streng, hva skjer?
Hvis brukeren skriver inn "hallo", som ender opp i H-E-L-L-O. Men antar at den
brukeren deretter typer i -
Egentlig burde jeg ikke ha gjort hei fordi vi ber
dem for deres navn.
Så la oss gå tilbake hvis jeg kan gjøre dette.
>> Så hvis jeg skriver i D-A-V-I-D for mitt navn, men husker at den andre linjen på
koden ble få strengen igjen å få deres skole.
Hvor er det ordet som brukeren typer i kommer til å gå neste?
Vel, kanskje det kommer til å gå inn H-A-R-V-A-R-D. Så selv om jeg har
trukket det som to rader, er dette bare en hel haug med byte i din
datamaskinens RAM.
Det er et problem nå, fordi nå hvis jeg er bruker RAM i denne svært rimelig
men slags naiv måte, hva kan du ikke tilsynelatende skille?
Hvor den ene begynner og hvor en ender, ikke sant?
De er litt uskarpe sammen.
>> Så det viser seg datamaskinen ikke gjør dette.
La meg faktisk bla tilbake i tid tegnene, og i stedet for Harvard
kommer umiddelbart etter brukerens navn, brukeren får faktisk, bak
kulissene, en spesiell karakter satt inn av
datamaskin for ham eller henne.
/ 0, ellers kjent som nul karakter plagsomt kalt N-U-L, ikke
N-U-L-L, men du skriver det som / 0.
Det er bare alle null biter er en markør i mellom det første ordet som brukerens
skrevet og det andre.
>> Så Harvard faktisk ender nå opp som denne sekvensen av tegn
og en mer / 0.
Så med andre ord, ved å ha disse fast punkt verdier, åtte sammenhengende null
bits, kan du nå begynne å skille ett tegn fra en annen.
Så hele denne tiden hva som var "hallo" er faktisk "hallo" med a / 0, og
i mellomtiden, det kan godt være ganske litt mer RAM
innsiden av maskinen.
>> La meg gjøre en annen ting nå.
Det viser seg at alle disse rutene vi har vært å tegne, de er, ja,
strenger, men mer generelt, disse tingene er arrays.
En matrise er bare en del av minne det er rygg mot rygg mot rygg mot rygg,
og du som regel bruke en rekke av veien av denne hakeparentes notasjon.
Så vi kommer til å se disse ganske mye over tid, men la meg gå videre og
åpne opp, la oss kalle det aldre.
Og legg merke til hva vi kan gjøre med de samme triksene, litt
litt mer syntaks her.
>> Så i linje 17 av dette programmet - faktisk, la meg kjøre programmet først
så vi kan se hva denne tingen gjør.
La meg kalle gjøre aldre til kompilere dette programmet.
. / Aldre.
Hvor mange mennesker er i rommet?
Kall det tre.
Alder av den første personen?
18, 19, og 20..
Og nå litt latterlig, bare jeg har laget et program som eldes de
tre personer.
>> Så det er helt klart en mulighet for litt moro aritmetikk her.
Heldigvis er regnestykket riktig.
18 gikk til 19, 19 gikk til 20 og så videre.
Men hva er egentlig ment å være illustrerende her er hvordan vi lagrer
de tre folks aldre.
La meg zoome inn på hva som er skjer her.
>> Så først, disse første linjene bør være å få ganske kjent.
Jeg er bare å spørre brukeren for antall personer i rommet.
Så jeg bruker få int og gjøre mens til gjøre dette igjen og igjen og igjen.
Vi har sett dette mønsteret før, men linje 27 er ny, og faktisk ganske
stoff, og vil bli mer og mer viktig.
Legg merke til at det er annerledes i line 27 er at jeg ser ut til å erklære en
int kalt aldre, men vent.
Det er ikke bare int aldre.
Det er disse klammer, på innsiden av hvilken er n.
>> Så braketten n i denne sammenheng ikke innsiden av en printf uttalelse her, men
i dette eneste linje 27, er denne linje sier, gi meg n ints, som hver
er av type int.
Så dette er en bøtte, så å si, av, i dette tilfellet tre heltall tilbake til
rygg mot rygg slik at jeg effektivt har tre variabler.
Alternativet, å bli klar, ville være dette.
>> Hvis jeg ønsket det første studentens alder, kan jeg gjøre dette.
Hvis jeg ønsket den andre studentens alder jeg kan gjøre dette.
Hvis jeg ønsket den tredje student alder, kan jeg gjøre dette.
Og gud forby vi trenger alles alder i dette rommet -
Jeg mener, dette er en pokker for en masse kopier, lime igjen og igjen og igjen.
Og pluss når jeg kompilere dette programmet, hvis en annen student går inn over seg
av døren, nå nummeret mitt variabler er feil.
>> Så hva er fint om en matrise er som snart du begynner å føle deg selv
kopiere og lime inn, oddsen er det er ikke den beste tilnærmingen.
En rekke er dynamisk potensielt.
Jeg vet ikke på forhånd hvor mange mennesker kommer til å være i rommet,
men jeg vet jeg trenger n av dem, og jeg vil finne ut n når den tid kommer.
Dette kodelinje betyr nå, gi meg en del av minnet som ser slik ut
der antall bokser på skjermen er helt avhengig av at n
brukeren har skrevet i.
>> Så nå resten av dette programmet er faktisk ganske likt det vi
bare gjorde med tegn.
Merker jeg har en for loop starter på linje 30.
Så rett etter at jeg får array, jeg iterere fra y er lik null på opptil n.
Jeg må bare denne lærerikt printf melding sier bare, gi meg en alder
person #% i, så nummer en, nummer to, tre tall.
Og hvorfor gjorde jeg dette?
Oppriktig, mennesker foretrekker å telle fra én på opp mens dataforskere,
null på opp.
dataforskere kommer ikke til å bruke denne typen program, så vi er
kommer til å bare begynne å telle på en som normale mennesker.
>> Og nå på linje 33, ser den litt annerledes stykke syntaks.
I-te alder i at variabel av type matrise kommer til å få en int.
Og nå til slutt, er dette bare aritmetikk her nede.
Jeg bestemte meg i en egen sløyfe for å hevde noen tid har gått, og nå i dette
separat loop, disse linjene utføre.
>> Et år fra nå, personen jeg vil være i år gammel, men merker dette ikke er
variabelen i.
Dette er nå% i for int.
Og legg merke til som den første plassholderen, jeg plug in i pluss ett, så vi telle som en
normal person.
Og så for verdien av deres alder, for i. år gammel, jeg tar aldre brakett
i - og hvorfor gjør jeg pluss en her?
De bare alderen.
Det er min dumme valg av programmer.
De bare alderen ett år.
Jeg kunne skrive inn et tall som Jeg faktisk ønsker det.
>> Så hva er egentlig alle relevansen her?
Vel, la meg faktisk bla tilbake over her og male et bilde
av hva som ligger foran.
Hva vi skal gjøre med vår neste Problem Set To er dabbling i
verden av kryptografi.
Så dette er en streng av tegn, slik at en sekvens av flere tegn, og hva
sier dette?
Det er ikke i den elektroniske versjonen av lysbildene.
>> Så jeg hevder at dette tilsvarer dette en dum reklame fra mange år
siden det kan faktisk huske en av dens opprinnelse.
Så dette er et eksempel på kryptering eller kryptografi.
Det viser seg at hvis du ønsker å faktisk sende informasjon eller dele
informasjon med noen sikker måte, som en melding som dette, kan du
scramble bokstaver.
Men vanligvis, ordene er ikke scrambled tilfeldig.
De er permutert på noen måte eller endres på noen måte slik at - oops.
Det er en morsom spoiler for neste gang.
>> Så du kan kartlegge hva som er tilsynelatende O til B. Legg merke til at linjene opp
kapitalisering-messig.
Angivelig r blir e.
Tilsynelatende F-H-E-R blir S-U-R-E. Så det viser seg at det er en kartlegging, og i
dette tilfellet er det en ganske dum kartlegge om noen har funnet det ut?
Dette er noe som kalles Rot 13, Roter 13.
Det er den dummeste av kryptering mekanismer fordi det bokstavelig talt bare
legger 13 til hver og en av bokstavene, dum i den forstand at hvis du bare
har litt ledig tid på hendene og en blyant, eller du bare tror det
gjennom i hodet ditt, kan du prøve alle mulige filer - en, to,
tre, prikk, prikk, prikk, 25 til bare rotere hele alfabetet, og
slutt, vil du finne ut hva denne meldingen er.
Så hvis du gjorde noe som dette i grunnskolen passerer meldinger til
beste venn, hvis grunnskolen lærer bare lese gjennom
meldingen og utstrakte tvunget løsningen, du kan ha fått
et svar etter det.
>> Nå selvfølgelig, i den virkelige verden, kryptografi er mer sofistikert.
Dette er et tekstutdrag fra en datasystem som har brukernavn og
passord, som nesten alle av oss gjør, og dette er hva passordet makt
se ut hvis det er lagret på harddisken din kjøre, men i kryptert form.
Dette er ikke bare en rotasjon av bokstaver, A er B og B er C. Dette er
mye mer sofistikert, men den bruker hva som er allment kjent som hemmelig nøkkel
kryptografi.
Dette bildet forteller følgende historien med noen få ikoner.
>> På venstre har vi det vi vil kalle ren tekst.
I en verden av kryptografi, vanlig Teksten er bare den opprinnelige meldingen
skrevet på engelsk eller fransk eller hvilket som helst språk overhodet.
Hvis du ønsker å kryptere det, vil vi passere det billedlig gjennom en hengelås, så
noen av slags algoritme, noen funksjon eller et program som noen skrev
at forvrenges bokstavene forhåpentligvis mer complicatedly enn bare å legge 13
til hver av dem.
>> Hva du får ut av denne prosessen i midten er det kalles cyphertext.
Så snilt av en sexy ord.
Det betyr bare det er den krypterte versjon av ren tekst.
Og bare hvis du har den samme hemmelige, 13 eller minus 13, er du i stand til å
dekryptere en melding sånn.
>> Så i oppgavesettet To blant de tingene du skal gjøre om i Hacker
Edition, må du skrive kode for å knekke disse passordene, finne ut
hva de var og hvordan de var kryptert, selv om vi gjør gir deg en bit
av veiledning underveis.
I Standard Edition, innfører vi et par av koder, kryptering
mekanismer, en som heter Cæsar, en kalt Vigenère, som fortsatt
rotasjons chifre der A blir noe, blir B noe, men
du må gjøre det programmatisk fordi det vil faktisk være en hemmelighet
nøkkel involvert som typisk er et tall eller et nøkkelord som kun
avsender og mottaker av disse meldinger skal forstå.
>> Nå har dette faktisk inkarnasjoner i den virkelige verden.
Dette, for eksempel, er lite orphan Annie hemmelige dekoder ring, og du
kan faktisk gjennomføre disse rotasjons chifre -
En blir noe, blir B noe - med et par hjul,
en på utsiden, en på innsiden slik at hvis du roterer hjulet eller
ringen, kan du faktisk stille opp brev med ulike bokstaver,
får en hemmelig kode.
Og så som cliffhanger for i dag, det jeg trodde jeg ville gjøre er litt av
tilbakesteg at hvis du slår på TV den 24. desember, kan du se
film ad nauseum for 24 timer på rad.
Men for i dag, vil jeg åpne den opp her og gir oss bare to minutter av en
pedagogisk relevant Christmas Story med en liten fyr som heter Ralphie.
>> [VIDEOAVSPILLING]
>> -Det være kjent for alle og enhver at Ralph Parker er herved utnevnt en
medlem av Little Orphan Annie hemmelighet sirkel og har krav på
æren og fordeler forekommende dertil.
>> -Signed, Little Orphan Annie.
Countersigned, Pierre Andre i blekk.
Honors og fordeler allerede i en alder av ni.
>> [SKRIKER PÅ RADIO]
>> Kom igjen, la oss fortsette med det.
Jeg trenger ikke all that jazz om smuglere og pirater.
>> -Lytt morgen kveld for avsluttende eventyr av den svarte
piratskip.
Nå er det tid for Annie Secret Melding for dere medlemmer
av den hemmelige sirkel.
Husk barna.
Bare medlemmer av Annie Secret Circle kan dekode Annie hemmelige budskap.
Husk at Annie avhengig av deg.
Still dine pins til B2.
Her er budskapet.
12, 11, 2 -
>> -Jeg er i min første hemmelig møte.
>> -25, 14, 11, 18, 16 -
>> -Pierre var i stor stemme i kveld.
Jeg kunne fortelle at kveldens melding var veldig viktig.
>> -3, 25 år.
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 ro og dekode.
Aha, gikk B. jeg til den neste.
E. Det første ordet er "være". S. Det kom lettere nå.
U. 25.
Det er R.
>> -Kom igjen, Ralphie.
Jeg må gå.
>> -Jeg kommer rett ned, Ma.
Jøss.
>> -T. O. Pass på å.
Pass på å hva?
Hva var Little Orphan Annie prøver å si?
Pass på å hva?
>> -Ralphie, har Randy må 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 må gå.
>> -Jeg kommer rett ut for roper høyt.
>> -Nesten der.
Fingrene mine fløy.
Mitt sinn var en stål felle.
Hver pore vibrerte.
Det var nesten klar.
Ja, ja, ja, ja, ja.
>> -Sørg for å drikke din Ovaltine.
Ovaltine?
En crummy kommersielle?
Son of a bitch.
>> [END VIDEOAVSPILLING]
>> SPEAKER 1: Dette er CS50, og at vil være Problem Set Two.
Se deg neste uke.
>> SPEAKER 2: Ved neste CS50, skjer dette.
>> SPEAKER 1: Så ett emne vi har ikke sett på så langt er
det av funksjonspekere.
Nå er en funksjon peker bare adressen til en offentlig
funksjon, men mye som -
sønn av en -