>> SPEAKER 1: Okay.
Velkommen tilbage.
Dette er Uge To af CS50, og vi har hidtil været hjælp af funktioner, men
i høj grad taget dem for givet.
Vi har brugt printf som har bivirkning af udskrivning
ting på skærmen.
Vi har brugt get-int, få flyde.
>> Men hvad nu hvis du rent faktisk ønsker at skabe dine egne funktioner, som nogle af
du måske allerede begyndt at gøre for Problem Set One, selvom
ikke strengt nødvendigt?
Nå, lad os gå videre og gense det problem bare at spørge brugeren om
deres navn og udskrivning noget på skærm, men prøv at faktor nogle
af fællestræk, at vi har ses i vores kode hidtil.
Så ved at jeg mener det følgende.
>> Jeg har tænkt mig at gå videre og skabe et nyt program, skal du blot ringe til
det hello.c som sædvanlig.
Jeg har tænkt mig at gå videre og give mig selv omfatte standard io.h på toppen.
Jeg har tænkt mig at også give mig selv preemptively det CS50 biblioteket, således at
Jeg bliver ikke råbte på af compiler.
Og nu vil jeg gå videre og erklære int, main, ugyldig.
>> Og så her er det, hvor jeg vil at begynde at outsource funktionalitet til
nogle andre funktioner, som jeg selv er kommer til at skrive, men som ikke
findes i dag.
For eksempel antage, at jeg ønskede at skrive en funktion, der tillader mig at
udskrive hej, komma, og derefter nogle brugerens navn.
Snarere end at fortsætte med at gøre printf hej,% s, ville det ikke være rart, hvis
der var bare en funktion kaldet ikke printf men print navn?
>> Så med andre ord, vil jeg være i stand til skrive et program, der gør lidt
noget som dette.
Først vil jeg sige printf din navn, hvorved spørge brugeren til
give mig hans eller hendes navn, og så er jeg kommer til at bruge de velkendte strengen s til
erklære en streng.
Giv mig en variabel af typen string, kalder det s, og opbevares i, at den
følge af ringe få strengen.
Men nu i uger tidligere, ville jeg have noget kedelig gjort hej,% s / n.
>> Og med andre ord, vi har set det fx en masse gange, og det er en
trivielt eksempel fordi der er kun én linje kode, så det er virkelig ikke en
big deal at holde skrive i igen.
Men formoder, at denne linje kode var faktisk ved at blive en byrde, og
det er ikke én linje kode, men det er 10 linjer kode et par uger fra nu,
og du bare at blive træt at kopiere og indsætte eller
genindtastning samme kode.
Ville det ikke være rart i stedet for at gøre printf hej,% s og så videre,
ville det ikke være rart, hvis der var bare en funktion kaldet print navn,
tager et argument -
med andre ord, det tager input -
og derefter semikolon.
Så denne funktion, ville det ikke være rart, hvis der eksisterede?
Så jeg ville ikke have at bekymre sig om hvad printf er, hvad% s og alle
disse komplekse, der er ikke så interessant.
De er nyttige.
>> Så print navn var desværre ikke opfundet nogle 40 plus år siden.
Ingen troede at skrive det.
Men det er skønheden i at have en programmeringssprog, ligesom i
Scratch kan du definere brugerdefinerede blokke, så i C og de fleste ethvert sprog, kan du
definere din egen funktionalitet, kan du definere dine egne funktioner.
Så selv om vi får main ved automatisk gratis, kan vi erklære
vores egne funktioner.
>> Så jeg har tænkt mig at gøre nogle plads op her up top, og jeg har tænkt mig at erklære min
egen funktion, der kommer til at se en lidt mærkeligt i starten, men vi vil komme
tilbage til denne inden længe.
Jeg har tænkt mig at sige ugyldig, og dermed angiver denne funktion gør
noget, har en bivirkning, men det ikke returnere noget til mig i
samme måde som får int eller få strengen selv gør.
Og jeg har tænkt mig at give denne funktion en Navn på print navn, og jeg har tænkt mig at
angive, at denne fyr kommer til at tage en streng, og jeg har tænkt mig at kalde det
string navn.
Jeg kunne kalde det noget, jeg vil, men jeg vil have min kode til at være selvdokumenterende.
Med andre ord var hvis en af ​​jer til at åbne filen og læse den, du kunne
slags udleder navnet på denne input hvilken rolle det er meningen at spille.
>> Og nu under det, jeg kommer til at åbne klammeparentes og lukkede klammeparentes,
og så opdager jeg har fulgt den samme mønster på linjerne fire gennem syv som
Jeg har fulgt efter en god uge plus nu mellem f.eks linjerne ni og
14, som komponerer main.
Med andre ord, skal du udskrive navn er en anden funktion.
Nu er compileren ikke kommer til at kende at kalde denne ting automatisk
fordi jeg bogstaveligt talt bare opfandt det, men det vil vide stadig at kalde main
automatisk, og så selvfølgelig i linje 13, jeg kalder min egen funktion.
Og fordi jeg har erklæret, at funktionen up on line fire før main,
dette vil lære compiler hvad citerer, citat slut, "print name"
betyder, og hvad den skal gøre.
Så jeg er slags at give den en ny brugerdefineret blokere i forbindelse med, siger, Skrab.
>> Så her kan jeg sætte det meget almindeligt eller tilbagevendende mønster kode jeg holder
skriver i klassen, printf % S hej,% s / n ", -
hvad ønsker jeg at sætte her?
S?
Så jeg ønsker at sætte navn i denne sammenhæng.
Så mærke lidt af en tvedeling her.
Fordi jeg erklære min egen funktion og jeg har noget vilkårligt kaldt
udskrives navn, og fordi jeg har specificeret i parentes, at dette
Funktionen tager et argument, typen af hvilket er en streng - så det er et ord
eller en sætning eller noget - og Jeg ringer dette argument navn, så
betyder den eneste variabel, der er i rækkevidde, så at sige, er navnet.
>> S findes kun mellem, hvad to krøllede parenteser, selvfølgelig?
Nå virkelig, ligesom linie 10 gennem 14, så bare gerne på mandag kan ikke bruge
S, men hvad jeg kan gøre, er pass S i trykken navn.
Print navn bare så sker for at give det et alias, et synonym et kaldenavn,
kalde det navn, og nu bruger det i denne linje.
Så lad mig gemme dette, zoome ud.
>> Lad mig gå videre og gøre hej.
Ser godt ud.
Ikke spytte ud eventuelle fejl. . / Hello Enter.
Hvad er mit navn?
David.
Og goddag David.
Så ikke alt, spændende, men bare tænk nu.
Du har nu den samme ingrediens som vi gjorde i Scratch til
gøre vores egne funktioner.
>> Men der er lidt af en Gotcha.
Antag, at jeg virkelig ikke havde troet dette igennem, og jeg faktisk uden
virkelig tænke over det skrev denne funktion hernede.
Føles helt rimeligt.
I Scratch er der ingen forestilling af placering i dine scripts.
Du kunne sætte en op her, en op her, en op her, og det kan begynde
at se lidt rodet, hvis du ikke lægge det ud pænt, men det gør ikke
ligegyldigt hvor det er fysisk scripts var på skærmen.
Desværre i C - og det er i modsætning til sprog som Java og Python
og andre, som du kan være bekendt med - desværre i C, rækkefølgen er
noget, fordi ur, hvad der er kommer til at ske nu.
>> Som standard-funktion, der kommer at udføre, er, naturligvis, hoved.
Main kommer til at kalde print navn på line otte, men desværre
compiler vil ikke engang vide, at udskrive navn eksisterer indtil det bliver til linie 11,
som desværre er kommer til at være for sent.
Så lad os gøre gøre hej.
Og nu damn, to fejl genereres.
Så lad mig rulle op til den meget første, som vi altid bør gøre, og
bemærke, at det er råben på mig, "Underforstået erklæring af funktion
print navn. "
>> Så vi har set dette budskab før, implicit erklæring af funktionen.
Hvornår har vi set, at form for fejl?
Da jeg ikke omfatter et bibliotek.
Hvis jeg har glemt cs50.h og jeg ville få råbte på for at få strengen eller få int.
Men i dette tilfælde er denne funktion print navn er ikke et bibliotek, right?
Det er bogstaveligt talt i denne fil, så hvad der virkelig er problemet?
>> Nå desværre i C, det tager dig så utroligt bogstaveligt, at hvis du
ønsker en funktion kaldet print navn til eksisterer, skal du enten nødt til at gennemføre
denne funktion øverst på din kode, så det er tilgængeligt at sænke
funktioner, men helt ærligt, der bliver sjusket meget hurtigt.
Personligt kan jeg godt lide at sætte vigtigste først fordi så er det meget klart, hvad dette
program gør ved første øjekast.
Og plus, kan du komme ind underlig hjørne tilfælde, hvor hvis x ønsker at kalde
y men y kunne kalde x, du bare fysisk kan faktisk ikke sætte en
over den anden.
>> Men det viser sig i C, kan vi løse dette meget enkelt.
Jeg har tænkt mig at sætte en lille smule af plads heroppe, og jeg vil bare
preemptively, omend lidt redundant, gå til at undervise i
compiler, at der findes en funktion kaldet print navn, det tager en streng,
og jeg har tænkt mig at ringe til det navngive semikolon.
>> Så det nu på linje fire, som vi ikke har set før, er en erklæring
for en funktion print navn, men det er kun et løfte, at denne funktion vil
sidst defineres, efterhånden blive gennemført.
Dette nu kan jeg forlade alene fordi nu er dette den definition, den
implementering, sortering af den sidste kilometer af gennemførelsen af ​​dette
særlig funktion.
Så ærligt det er dumt, det er irriterende, men det er den måde C er, og det er
fordi det tager dig meget bogstaveligt og, som en computer ærligt bør
kun gør præcis, hvad du fortæller det til gøre, og således at bestilling er vigtig.
>> Så holder det i tankerne og igen, begynder at mærke til gentagelse af mønstre.
Odds er du vil, hvis du ikke har allerede begynder at støde beskeder
som denne, der ved første øjekast synes helt kryptisk, men hvis du starter
til at lede efter disse centrale ord som "Underforstået erklæring", nævner en
funktion i dette tilfælde - og helt ærligt, du undertiden endda få en lille grøn
gulerod symbol, der fortæller dig, hvor spørgsmålet sandsynligvis er -
kan du begynde at arbejde dig vej gennem endnu usete fejlmeddelelser.
Eventuelle spørgsmål om at skrive din egen funktion på denne måde?
>> Lad os gøre noget, der er en lidt mere overbevisende.
Snarere end blot at gøre noget, der har en bivirkning af udskrivning, så lad mig gå
videre og gemme en ny fil, og vi vil kalder denne positive.c, selvom det er
kommer til at være lidt anderledes versus sidste gang.
Og denne gang vil jeg på ny at gennemføre sidste tids positive.C eksempel, som
er tvinge brugeren til at give mig et positivt heltal.
Men jeg måtte bruge få int sidste gang.
Ville det ikke have været rart, hvis der var en funktion kaldet få positiv int
at jeg bare kunne outsource denne stykke af funktionalitet til?
Så forskellen her er vi vil gennemføre få positive int, men i modsætning til
print navn, som havde en bivirkning - det returnerede ikke noget til mig som
et nummer eller en snor -
få positive int er naturligvis at gå til tilbage, forhåbentlig en positiv int.
>> Så lad os gøre dette.
Medtag cs50.h, Medtag standard io.h.
Int main ugyldig.
Og nu her, jeg kommer til at gå videre og lad os sige int, kalder det n er lig
få positive int.
Og ligesom at få int allerede eksisterer fordi personalet skrev det, jeg går
påtage sig for øjeblikket, der får positive int findes, og nu vil jeg
at gå videre og sige printf, tak for% i / n ", n.
>> Så nu, hvis jeg kompilere dette program, hvad kommer til at ske i min terminal
vindue nederst på skærmen?
Jeg har tænkt mig at nok få at samme fejl som før.
Så lad os prøve dette.
Gør positivt.
Og igen, underforstået erklæring af funktion, få positiv int.
Så vi kan løse dette på et par måder.
Jeg har tænkt mig at holde det simpelt og bare sætte min erklæring op her og få
positive int.
Jeg har brug for den såkaldte signatur.
Signaturen netop refererer til æstetik
første linje af programmet.
Så hvad bør få positive int tilbage?
>> Så en int.
Jeg mener ideelt set, ville den vende tilbage noget som positivt int, men at
eksisterer ikke.
Vi har ikke set, at der blandt vores data typer, så vi er nødt til at beskæftige sig med
faktum, at vi har meget få datatyper at arbejde med.
Men vi kan vende tilbage en int og bare tillid til, at det vil være positivt.
Det kommer til at hedde få positive int.
>> Og nu hvor omkring sine argumenter?
Er det tage nogen input?
Er det behøver nogen input?
Så det behøver ikke at vide i forvejen noget.
Få strengen ikke får int ikke.
Printf gør - det skal have nogle input passerede ind i det - og udskrive navn
brug for nogle input, men får positive int ikke.
Så jeg har tænkt mig at eksplicit fortælle compiler ugyldig.
Void er fraværet af noget andet.
Så void betyder intet der foregår inde i af disse parenteser. semikolon
>> Og nu på bunden af ​​min fil - og igen, jeg bare bliver slags anal
her sætte main foroven, som er god praksis, fordi denne måde,
når som helst du eller en anden åbner din fil,
funktionaliteten er lige der.
Du kan dykke ind fra udgangspunktet.
Så nu har jeg tænkt mig at duplikere denne, få positive int tomrum, men jeg er ikke
kommer til at ramme et semikolon nu.
Jeg har tænkt mig at åbne krøllede parenteser, og nu har jeg brug for at låne
nogle ideer fra mandag.
>> Så som du husker, vi gjorde noget gerne gøre følgende, mens
noget var sandt.
Og hvad gjorde jeg?
Jeg gjorde noget lignende giver mig et positivt heltal,
lidt af en prompt.
Jeg kunne godt bruge nogle ord, jeg ønsker.
Og så brugte jeg hvad?
Int n er lig med få int, ingen argumenter for det.
>> Og mærke forskellen.
Når du ringer til en funktion, når du bruger en funktion, behøver du ikke sætte i tomrum.
Du skal kun gøre det, når erklære en funktion, undervisning compiler, hvad
det skal forvente.
Så du behøver ikke at sætte ugyldig der selv.
>> Og nu, hvad var min tilstand?
Nå, n er ikke lig med positiv, men det er bare pseudo-kode.
Så hvordan kan jeg udtrykke dette mere rent?
Så mindre end eller lig med nul.
Så igen mærke, at du kan gøre mindre end eller lig med.
Selvom det er to separate symboler, kan du gøre det på
tastaturet som sådan.
>> Men der er stadig en fejl, Jeg skruet op sidste gang også.
Jeg nødt til at erklære -
nøjagtigt.
Jeg nødt til at erklære n udenfor af løkken.
Så jeg har brug for at sætte n op her, og jeg kan ikke ønsker at re-erklære den her
lest jeg får en ny variabel.
Jeg ønsker blot at tildele en værdi på her.
>> Og nu er jeg ikke helt færdig her.
Lad mig komme foran mig og lader jeg er færdig.
Gør positivt, og nu der er en ny fejl.
Kontrol når til slutningen af non-void funktion.
Så ny fejlmeddelelse, hvis men du slags af drille hinanden hver af de ord,
formentlig antyder hvad der er galt.
>> Kontrollere.
Kontrol betyder bare til bestillingen af operationer i et program.
Computeren er i kontrol og noget gik galt.
Så det når enden af en ikke-void funktion.
Hvilken funktion er det tilsyneladende henvise til?
Hvilken funktion er ikke ugyldig?
Så får positive int, og lidt forvirrende i, godt,
det er lidt ugyldige.
Det har en specifikation af tomrum for sin argumenter, men dens produktion vil
være af typen n.
Så ordet til venstre er den såkaldt returtype.
Ordet på indersiden her er de nul eller flere argumenter
at en funktion tager.
>> Så hvad skal jeg gøre?
På dette tidspunkt i min kode, linje 21, hvor Den blinkende prompt er nu, jeg
have en positiv int inde af variabel kaldet n.
Hvordan giver jeg den tilbage til main?
Bogstaveligt.
Retur n semikolon.
>> Så lige så Colton returneret et stykke af papir med et svar til mig ved at droppe
det stykke papir i den lille sorte boksen på bordet, for at gøre det i
kode, du bogstaveligt talt bare skrive, tilbage n, og det er som om Colton var
rakte mig noget fysisk tilbage.
I dette tilfælde er, hvad der sker får positive int kommer til at aflevere tilbage
hvad er formentlig en positiv heltal til hvem?
Hvor kommer denne værdi ender?
Der ender i denne variabel, n, og så vi videre med linje ni.
>> Så med andre ord, i rækkefølge operationer, dette program starter
udførelse, og compiler indser, åh, du vil have biblioteket?
Lad mig gå grab hvad der er indeni det.
Åh, du ønsker standard IO biblioteket?
Lad mig gå grab hvad der er indeni det.
Hvad betyder compiler sige til sig selv når det rammer linje fire?
Åh, du lovede at gennemføre funktion kaldet få positiv, men
vender vi tilbage til senere, noget langs disse linjer.
>> Int main void betyder blot her er tarme af mit program.
Linje syv er blot en klammeparentes.
Linie otte siger på venstre side, giver me 32 bit til et heltal, kalder det n.
På den højre side, er det siger få positive int.
Lad os nu holde pause den historie, fordi nu Jeg kan ikke holde flytte min markøren ned.
Min cursor nu går ned her, fordi nu få positive int udfører.
Int n deklareres.
Gør følgende.
Printf giver mig et positivt heltal.
>> Få en int fra brugeren, skal det opbevares i n, og måske gøre det igen og igen.
Denne løkke betyder, at denne kode kunne eksekvere op og ned som dette igen
og igen, men når brugeren endelig samarbejder og giver mig en positiv
int, jeg ramte linje 21, på hvilket tidspunkt nummer er afleveret tilbage, og som man
skal jeg fremhæve nu?
Ni.
Kontrol, så at sige, vender til linje ni.
Det er den linje, der er nu i gebyr.
>> Så det er hvad der er sket alle denne gang under hætten, men
når vi har brugt funktioner som printf eller endda få strengen, som en anden
skrev til dig, var kontrollen bliver afleveret off til en andens kode linje
ved linje for linje.
Det er bare vi ikke kunne se det, og vi kunne ikke rigtig skildre den i denne
program, fordi det er på en anden fil på harddisken
ukendt for os.
Så lad os faktisk kompilere og køre det nu.
>> Gør positivt.
Kompiler, det er fremskridt.
. / Positive.
Giv mig et positivt heltal.
Lad os være vanskelig.
Negativ 1..
Nul.
Lad os give det 50..
Tak for de 50, og så kontrol er nu vendt tilbage.
Eventuelle spørgsmål, så på det?
Ja?
>> [Uhørligt].
>> Sig igen.
Åh, godt spørgsmål.
Så du måske bemærke en parallel her, at Jeg er lidt skære et hjørne på.
I linje 12, jeg siger, få positive int returnerer en int, men på det samme
logik, er det nu indlysende, at i line seks, jeg siger, at de vigtigste afkast
en int, men hvad har vi aldrig havde i nogen af ​​vores programmer?
Vi har aldrig haft omtale af denne Nøgleordet tilbage.
>> Så det viser sig, at i C, mindst den version af det, vi bruger
i 1999, teknisk, det er sker automatisk for dig.
Hver gang du gennemfører et program, og du gennemføre en funktion kaldet main,
at funktionen vil returnere nul standard, hvis du ikke siger andet,
og nul er bare en konvention.
Verden returnerer nul derved angiver, at alt er godt,
effektivt forlader os med fire milliarder mulige ting, der kunne gå
galt, så at hvis vi vende tilbage en, der kunne betyde en kode, der betyder
ting gik galt.
Vi kunne vende tilbage to, hvilket betyder denne anden ting gik galt.
Vi kunne vende tilbage fire milliarder, hvilket betyder det anden ting gik galt.
>> Og hvis du nu tænker om din egen PC eller Mac, kan du huske, at
nogle gange får kryptiske fejlmeddelelser fra software, som du er
bruger, og undertiden har en menneskelig venlig beskrivelse, men der er
ofte en kode eller et tal på skærmen?
Hvis dette ikke kommer til at tænke, bare holde øje med det.
Det er typisk, hvad disse koder henviser til.
De er inkluderet i Microsoft Word og andre programmer, så hvis du indgive en
fejlrapport med virksomheden, kan du fortælle dem, åh, jeg fik fejl nummer 45..
Og nogle programmør tilbage på virksomheden kan se, at op i hans eller hendes
kode og sige, åh, det er fordi jeg gjorde denne fejl, og det er derfor, at brugeren
fik denne meddelelse.
>> Men helt ærligt, det er bare en smule distraherende og lidt besværligt at
konkludere, at i det mindste på vores første par programmer, så vi har
været udelade det.
Men al denne tid hver eneste af dine funktioner main har i al hemmelighed haft dette
line tilføjes automatisk for dig af compiler, bare ved konvention
spare dig tid.
>> [Uhørligt].
>> Du behøver ikke at medtage den i main.
Det er fint.
Du behøver at medtage det, hvis du var gennemføre en funktion som denne.
Ellers funktion flad ud ville ikke fungere.
Men i main, er det ikke nødvendigt.
I en uge eller to, vil vi begynde at få ind i denne vane, når vi ønsker at starte
signalerer fejl.
Virkelig godt spørgsmål.
>> Så hurtig verbal pause at nævne, at denne fredag, vil vi ikke have frokost
per se, men vi vil være at have middag med nogle af de studerende og ansatte.
Hvis du gerne vil slutte sig til os, føler sig fri til at gå til cs50.net/rsvp.
06:00 denne fredag.
Rummet er, som altid, begrænset, men vi vil fortsætte med at gøre disse på en næsten
ugentlig basis, hvis pladsen løber ud i denne uge.
>> Så den cliffhanger, som vi slap på Mandag var, at strengene kan faktisk
blive indekseret i, hvilket netop betyder, at du kan få på den første karakter,
andet tegn, er det tredje skrifttegn og så videre, fordi du kan
effektivt tænke på en snor, ligesom hej, som værende i dette tilfælde fem
bogstaver inde i kasser.
Og du kan få på hvert af de kasser med, hvad syntaks gjorde vi
introducere på mandag?
Disse firkantede parenteser på dit tastatur.
Det betød bare gå til sted nul.
>> Vi begynder at tælle ved nul, så beslag nul betyder h, beslaget et
betyder e, og så videre.
Og så hele tiden, når vi har været hjælp strings og skrive "hej"
og "verden", og andre ting på skærmen, er det blevet opbevaret
i kasser som denne.
Og tage et gæt.
Hvad betyder hver boks repræsenterer fysisk indersiden af ​​din computer?
>> [Uhørligt].
>> Undskyld?
>> Tegn.
>> Så et tegn, i hvert fald i tilfælde af strenge, en karakter og er lige
otte bits eller en byte.
Så har du sandsynligvis er mindst vagt bekendt med det faktum, at din
computer har hukommelse.
Det har to typer hukommelse mindst.
Den ene er den harddisk, hvor du gemmer kram permanent, og det er
typisk store, så du kan have film og musik og så videre.
>> Så har du en anden type hukommelse kaldet RAM, R-A-M, Random Access
Hukommelse, og det er den type hukommelse der bruges, når computeren er
kører, men hvis du mister magt eller din batteriet dør, noget, der er gemt
i RAM forsvinder, hvis du mister strøm helt, fordi det ikke er
vedholdende.
Du typisk har, i disse dage, en gig af det, to koncerter, måske flere.
Og opadrettede af RAM er, at det er meget meget, meget hurtigere end harddiske
eller endda solid state drev i disse dage, men det er typisk dyrere, så
du har mindre af det.
>> Så dagens samtale virkelig refererer til RAM, at type hukommelse, som
eksisterer kun, mens der er strøm bliver fodret ind i din computer.
Så når du skriver i H-E-L-L-O, på Enter tastaturet er H går i ét
byte RAM, er E går i anden byte RAM, som er
resten af ​​ordet.
Så huske hvad vi kunne at gøre sidste gang var dette.
Lad mig gå videre og åbne filen at vi kaldte string.c og husker
at det kiggede lidt noget som dette.
Lad mig faktisk rulle tilbage og ændre det på præcis, hvad det lignede,
streng længde sek.
>> Så kig på programmet her.
Vi inkluderer CS50 biblioteket, så at vi kan bruge få streng.
Vi inkluderer standard io.h så vi kan bruge printf.
Hvorfor har vi inkluderer string.h?
Det var nyt på mandag.
Så vi ønskede streng længde.
Str Leng.
Folk besluttede år siden, lad os bare være kortfattet.
I stedet for at kalde det "streng længde," lad os kalde det "str Leng", og lad
verdens figur ud af, og så det er hvad vi får adgang til med string.h.
>> Dette er velkendt.
Dette er velkendt.
Dette er en lille ny.
På linje 22 - og vi vil komme tilbage til dette, men for nu kender -
og du vil kun kender det fra at have læs dokumentationen, eller hvis
du vidste C allerede -
få strengen til tider kan skrue op.
Hvis brugeren er virkelig kontradiktorisk eller usamarbejdsvillig og han eller hun bare
ikke skrive noget på tastaturet eller typer, så meget på tastaturet, der
Det overvælder computerens hukommelse, i teorien få strengen kunne returnere
noget andet end en streng af tegn.
Det kunne returnere en speciel kaldet værdi NULL i alle caps, N-U-L-L, og dette er
blot en såkaldt sentinel værdi.
Det er en særlig værdi, der betyder noget slemt er sket i dette tilfælde.
Det er fraværet af en streng.
>> Så null jeg tjekker for blot at så, lang historie kort, str. Leng og
andre funktioner, der kommer med C, hvis de forventer en streng, men du passerer dem
fraværet af en streng, hvis du passerer dem NULL, computeren eller programmet
vil bare gå ned direkte.
Det vil hænge.
Det vil kaste op nogle fejlmeddelelse.
Dårlige ting vil ske.
Så selvom dette er stadig ikke veldefineret -
dette vil gøre mere mening i en uge eller to - i linie 22, er dette blot en
eksempel af selv defensiv fejlkontrol bare i tilfælde én gang ud af
en million noget går galt, ved mindst mit program ikke vil gå ned.
>> Så hvis s ikke gør lig noget slemt, Jeg har denne for-løkke, og det var
hvor vi havde den anden nyt stykke syntaks.
Jeg har en for-løkke iteration fra nul på op til længden af ​​s.
Og så er her, var jeg et trykkeri ude s beslag i, men hvorfor jeg bruger% c alle
pludselig i stedet for% s selv selvom s er en streng?
Det er et tegn, right?
S er en streng, men s beslag noget, s beslag i hvor i er nul
eller en eller to, som er en individuel tegn i strengen, og så for
at printf skal informeres om, at Det er faktisk et tegn til at forvente.
>> Og så husker, hvad der gjorde det program faktisk gøre?
>> Trykt det ud i kolonner.
>> Ja, præcis.
Det bare udskrevet det ord, som jeg skriver i en kolonne, et tegn per linje.
Så lad os se det igen.
Så gør streng.
Opgjort OK. . / Streng.
Lad mig skrive i H-E-L-L-O, Enter, og ja, jeg får det, én pr linje.
>> Så lad mig gøre én optimering her.
Hvis du tænker over det, især hvis du har programmeret før, er der
velsagtens en ineffektivitet på linje 24..
Med andre ord, er det ikke nødvendigvis det bedste design.
Ligetil, mindst én gang du huske, hvad str Leng er, men det er
gør noget dumt potentielt.
Hvad kan det være?
>> [Uhørligt].
>> Præcis.
Det kontrollerer for længden af ​​s hver eneste gang, selvom
H-E-L-L-O altid vil til at være fem tegn.
Hver gang gennem denne løkke, de fem ikke ændrer sig.
Jeg kunne være forøgelse i, men hvad er længden af ​​s på hver
iteration af denne løkke?
Det er fem, det er fem, det er fem, og dog er jeg ikke desto mindre stiller dette
spørgsmål igen og igen og igen.
Nu ærligt, at computeren er så pokkers hurtig, er ingen kommer til at mærke en
Forskellen i dette tilfælde, men disse former af fattige design beslutninger kan
begynde at tilføje op, hvis compileren selv forsøger ikke at løse dette for dig, som
det typisk ville ikke på mindst i apparatet.
>> Så jeg har tænkt mig at gøre dette.
Jeg har tænkt mig at tilføje et komma efter min første variabel, dvs.
Jeg har tænkt mig at give mig selv et andet variable, kalder det n, blot ved
konvention for tal, og så er jeg vil tildele n værdien af ​​strengen
længde sek.
Og så jeg har tænkt mig at ændre min tilstand at være, hvad?
Jeg har tænkt mig at ændre min tilstand til, mens jeg er mindre end n.
>> Så nu, hvor mange gange jeg kontrollere længden af ​​s?
Én gang, men det er OK at tjekke jeg imod n igen og igen, fordi nu er der
værdier faktisk ikke ændrer sig.
Nu for nu, ved bare, at hver gang du kalde en funktion, der er lidt af
overhead, ikke nok til at afskrække dig virkelig fra nogensinde at bruge funktioner, men
sikkert, når der er en linje kode lide det - og linjerne får
mere interessant inden længe - hvor der er en mulighed for at tænke, hvis jeg
skriv denne kode, hvor mange tider vil det udføre?
Du vil begynde at se over tid udførelsen af ​​dine programmer kan
faktisk ændre.
>> Faktisk indeholder en af ​​det problem, vi har gjort i de forløbne år indebærer
implementering, som du måske husker fra uge nul, en stavekontrol, men en
Stavekontrol, der er designet til at understøtte en ordbog på 150.000 plus
ord, som vi giver jer.
Du ville have til at skrive kode, der indlæses disse ord i RAM, så ind
bokse som vi så på skærmen et øjeblik siden, og derefter så hurtigt som du
kan, skal du være i stand til at besvare et spørgsmål af formen, er dette ord
stavet forkert?
Er dette ord stavet forkert?
>> Og i sådan noget, hvad vi har gjort i de forløbne år er vendt det til,
omend på en opt-in frivillig basis, en konkurrence slags, hvorved
studerende, der bruger mindre RAM og mindre tid, færre CPU-cyklusser, ender
gennemstrømning op til toppen af ​​en lille pointtavlen eller rangering som vi sætter på
kursets hjemmeside, som vi har gjort i de forløbne år.
Så igen helt valgfrit, men dette taler til de konstruktionsmæssige muligheder
der er foran, når vi starter bygning oven nogle af disse
grundlæggende byggesten.
>> Så lad mig gå tilbage til dette diagram for bare et øjeblik og afslører lidt
noget mere.
Dette faktisk er en streng, og vi har taget udnyttede et par biblioteker,
standard io.h der har -
>> Printf.
>> Printf, blandt andre ting.
cs50.h, som har få int og få streng og så videre, string.h, som
havde str Leng.
Men det viser sig at der er endnu en.
Helt ærligt, der er masser og masser af header filer, der erklærer funktioner
til biblioteker, denne ctype.h men er faktisk kommer til at være noget
fordelagtig, fordi jeg har tænkt mig at gå videre og gennemføre en
andet program her.
>> Lad mig gå videre og åbne op noget Jeg skrev i kaldet forhånd
capitalize.c, og lad os tage et kig på hvordan det virker.
Bemærk, at jeg bruger, i denne version af det,. tre velkendte filer
Bemærk, at på linje 18, er jeg få en linje af tekst.
Bemærk i linje 21, jeg hævder, at følgende kode vil
kapitalisere s, hvad brugeren har indtastet i, og hvordan gør jeg det?
Nå, jeg tager -
lektion lærte fra sidste gang -
Jeg erklærer i og n og iteration over tegn i strengen.
Og hvad er så denne blok af kode i linie 24 gennem 27
gør i lægmandssprog?
>> Lille bogstav tilbage.
>> Præcis.
Hvis s beslag i - så hvis den i'te karakter s, som er en specifik
char i strengen, er større end eller lig med små bogstaver a og -
minde om, at dobbelt-tegn betyde og -
og den samme karakter, s beslag i, er mindre end eller lig med små bogstaver z,
det betyder, at det er et a eller b eller en c eller dot, dot, dot, eller et z, hvilket betyder
det er små.
Hvad ønsker jeg at gøre i denne sag?
Tja, jeg kan gøre det lidt kryptisk, men
lad os drille det fra hinanden.
>> Jeg har tænkt mig at kalde printf udskriver% c fordi jeg ønsker at genoptrykke denne
tegn på skærmen.
Jeg derefter gå til at tage s beslag i, at i'te karakter i s, og hvorfor
gør jeg dette lille trick her små bogstaver et minus kapital A?
Hvad der kommer til at give mig generelt?
>> [Uhørligt].
>> Præcis.
Jeg kan ikke rigtig huske -
Det var 65 for kapital A. jeg ikke rigtig huske, hvad små bogstaver a er,
men uanset.
Computeren kender.
Så ved at sige, små bogstaver et minus kapital A, det er underligt at være
trække et tegn fra hinanden, men hvad er tegn under hætten?
De er bare tal.
Så uanset hvad disse numre er, lade computeren huske det
snarere end mig menneske.
>> Så små bogstaver et minus hovedstad A er kommer til at give mig en forskel.
Det sker for at være 32, og det ville være tilfældet for lille b og kapital B
og så videre.
Den forbliver konsistent, heldigvis.
Så jeg hovedsageligt siger, tage små bogstaver, trække det
standard forskel, og at ændrer effektivt s beslag i fra
små bogstaver til, naturligvis, store bogstaver, uden min egentlig at skulle tænke
om, eller husk, hvad der var dem numre, vi talte om, når de otte
frivillige kom op på scenen?
Nu mellemtiden, i andet, hvis det ikke er et lille bogstav, som bestemt
af linie 24, printe det bare ud.
Jeg ønsker kun at røre ved tegn, der var
faktisk oprindeligt små bogstaver.
>> Så lad os se dette.
Foretag kapitalisere.
Opgjort, OK.
. / Kapitalisere.
Og lad mig skrive i H-E-L-L-O med små bogstaver, Enter.
Og læg mærke til, at det omdannes ind store bogstaver.
Lad mig gøre det igen med et andet ord.
Hvordan om D-A-V-I-D med den første D kapitaliseret som et navn typisk er?
Enter.
Bemærk det er stadig korrekt.
Det bare udlæst det første D uændret via det andet konstruere.
>> Så husk på, så en par ting her.
One, hvis du nogensinde ønsker at kontrollere to betingelser på en gang, du kan og dem
sammen som vi forudsagde.
Du kan sammenligne tegn på denne måde og effektivt at behandle tegn som
tal, men helt ærligt, det er så pokkers kryptisk Jeg kommer aldrig til at huske
hvordan man kommer op med dette fra bunden uden begrundelse gennem det i ganske
lidt tid.
>> Ville det ikke have været rart, hvis nogen derude skrev en funktion kaldet er
lavere, der kunne svare for mig sandt eller falsk, denne karakter er små bogstaver?
Nå heldigvis, hvem skrev ctype.h gjorde præcis det.
Lad mig gå op her og tilføje ctype for c typer, og nu lade mig gå herned og
omskrive denne linje som følger.
>> Så hvis det hedder, er mindre, jeg hævder, s beslag i, så jeg har tænkt mig at slette
disse to linjer helt.
Så nu en anden, jeg håber, skrev en funktion kaldet er lavere, og det
Slår de gjorde, og de erklærede det inde i ctype.h.
Og nu vil jeg forlade linje 27 alene, vil jeg lade linie 31
alene, men bemærke, hvor meget jeg har strammet min kode.
Det er nu renere.
Det er mindre vanskeligt at se gennem fordi nu den funktion er i øvrigt
så vidunderligt navngivne det bare gør hvad den siger.
>> Så nu har jeg tænkt mig at gemme denne.
Jeg har tænkt mig at zoome ud.
Og ligesom i Scratch du kunne have Booleans, boolske værdier sandt eller
falsk, det er præcis, hvad der er lavere effektivt afkast.
Lad mig kompilere.
Lad mig re-run.
Og lad os nu prøve det igen, H-E-L-L-O, Enter.
Det er temmelig godt.
Og prøv det igen, sørge for jeg ikke skrue noget op.
Det aktiveres så godt.
>> Men dette er ikke godt nok, fordi anden ting, som jeg aldrig har tænkt mig at
husk medmindre jeg arbejder gennem det virkelig forsigtigt på, siger, papir
den forbandede linje.
Ville det ikke være rart, hvis der var en funktion kaldet til øverste?
Nå det viser sig, at der er i ctype.h samt.
Jeg har tænkt mig at gå videre og skrive -
Lad mig bringe denne linje tilbage.
I stedet for denne her, lad mig gå videre og sige, stedet for den% c.
resultat af at kalde denne funktion til øverste på i-th karakter s.
Og nu mærke til det er at få lidt afbalanceret.
Jeg er nødt til at holde styr på, hvor mange parenteser, jeg har åbnet og lukket.
>> Så nu er det endnu renere.
Nu er dette program bliver bedre og bedre designet velsagtens fordi det er
meget, meget mere læsbar, men det er ikke så lad os rette.
Foretag kapitalisere.
. / Kapitalisere.
H-E-L-L-O. Lad os køre det igen, D-A-V-I-D. OK, så vi er stadig i
temmelig god figur.
>> Men nu til øverste.
Jeg foreslår, at der er én mere raffinement vi kunne gøre det ville være
virkelig rart, der virkelig kunne strammes op denne kode og virkelig give os fem
ud af fem for design, f.eks.
Hvad ville være rart at slippe af med?
Nå, se hvor pokkers lang tid denne blok af kode er bare at gøre noget simpelt.
>> Nu som en sidebemærkning, som du måske har set i super afsnit denne fortid
weekend, behøver du ikke strengt brug for krøllede parenteser, når du bare har én
linje kode, selvom vi foreslog holde dem så det gør meget
mere klar, ligesom i Scratch er U-formet blokke, hvad der er indeni af filialen.
Men ville det ikke være rart, hvis til øverste, når det gives sit input, vendte det til
store bogstaver, hvis det ikke er, og hvad ville være vidunderligt i den modsatte tilfældet, hvis
det allerede store bogstaver?
Bare passere det gennem og overlade det alene.
>> Så måske det gør det.
Jeg kunne prøve og bare håbe at det gør, men lad mig
introducere en anden ting.
I stedet for at bruge denne indbyggede terminal Vinduet hernede, minde om, at
dette torv sorte ikon giver dig en større terminal vindue, jeg kan fuld
skærmen, hvis jeg vil?
Så det viser sig at de er en slags mærkeligt navngivne, men der er disse kaldet ting
man-sider, manualsider, mand for korte, og jeg kan få adgang til disse ved
skrive mand -
hvad gør jeg vil skrive?
Man til øverste.
>> Og nu mærke til, om der foreligger en fungere inde i computeren, i
dette tilfælde apparatet, som er lige operativsystemet Linux, går det
at give mig en noget kryptisk sæt output, men du vil finde over tid,
det altid er formateret temmelig samme, så du begynder at vænne sig til det.
Bemærk øverst til øverste og tilsyneladende er det samme dokumentation
for at sænke.
Hvem skrev det var at skære nogle hjørner og sætte det hele på én side.
Disse ting 'formål i livet er at konvertere en
brev til øvre eller små bogstaver.
>> Bemærk, at under Synopsis, manden siden er undervisning mig, hvad fil jeg har
at inkludere at bruge denne ting.
Det giver mig signaturen for disse funktioner, både af dem, selv
selvom vi lige nu kun bekymrer sig om én.
Her er nu en beskrivelse.
Til øverste konverterer brevet c til store bogstaver, hvis muligt.
>> Stadig ikke så lærerigt, men lad mig nu se under returværdi, de ting
der er afleveret tilbage.
Så den returnerede værdi er, at den konverterede brev eller c, hvis
omdannelse var ikke muligt.
Hvad er c?
>> Den oprindelige karakter.
>> Den oprindelige karakter, og vi kender at ved igen, går op til
synopsis, og hvem skrev dette Funktionen netop besluttet, at input
til at øvre og nedre er bare vilkårligt kommer til at blive kaldt c..
De kunne have kaldt det mest noget de vil, men de holdt det
simpelt som ca.
Så jeg har hørt manden siden.
Denne sætning beroliger mig, at hvis det er ikke et lille bogstav, det er
vil bare give mig tilbage C, hvilket er perfekt, hvilket betyder, at jeg kan slippe af med
min ellers tilstand.
>> Så lad mig gå tilbage til gedit, og lad mig bare gøre dette.
Jeg har tænkt mig at kopiere min printf erklæring.
Jeg har tænkt mig at gå videre og lige inde for-løkken print det ud og få
slippe af nu er denne helhed, hvis konstruktion.
Var ikke en dårlig idé, og det var meget meget korrekt og i overensstemmelse med
alt, hvad vi har prædiket, men bare ikke nødvendigt.
Så snart du er klar over nogle biblioteket funktionen eksisterer, at en anden
skrev, eller måske du skrev andetsteds i filen, kan du bruge det og virkelig
begynde at stramme op på koden.
>> Og når jeg siger ting som god stil, det faktum, at denne person kaldes
funktion til øverste eller tidligere er lavere er vidunderligt nyttigt, fordi
de er meget beskrivende.
Du ville ikke ønsker at ringe til dine funktioner x og y og z, som har
meget, meget mindre mening.
Eventuelle spørgsmål vedrørende denne serie forbedringer?
>> Så er det tilstrækkeligt at sige en af ​​de grillbarer er endda så dit eget problem
sæt - måske problem set én, men sikkert P indstille to og fremefter, selv
når de er korrekt ikke nødvendigvis betyde, at de er perfekte lige
endnu, eller særligt veltilrettelagt.
Det er den anden akse til begynde at tænke over.
Så det var en streng inde i dit computerens hukommelse, men hvis du har en
hel masse tegn ligesom på H-E-L-L-O inde i RAM, og formoder
at du i dit program kalder få strengen flere gange, således at man
kalde få strengen én gang, så du kalde få strengen igen.
Nå, hvad sker til ske over tid?
>> Med andre ord, hvis du har en linje af kode, omend ud af kontekst, ligesom
string s får -
lad os gøre det.
String navn lig få streng.
Så antage, at linje kode menes at spørge brugeren om hans eller hendes navn.
Denne næste linje kode er beregnet til at spørge brugeren for hans eller hendes skole, og
denne næste linie, og så videre.
Antag, at vi holde beder brugeren for en anden og
anden og en anden streng.
De kommer til at bo i hukommelsen på samme tid.
Man kommer ikke til at tæske den anden.
Skole er ikke overskrive det andet.
Men hvor gør de alle ender i hukommelsen?
>> Tja, hvis vi begynder at tegne på skærmen, som vi kan bruge denne ting
her som en tavle, hvis denne sorte rektangel repræsenterer min computers
hukommelse, vil jeg vilkårligt starte dividere det op i små firkanter,
hver især repræsenterer en byte hukommelse.
Helt ærligt, hvis du har en gigabyte RAM disse dage, har du en milliard bytes
af hukommelse i din computer, så en milliard af disse kvadrater.
Så er det tilstrækkeligt at sige, at dette er egentlig ikke at skalere.
>> Men vi kunne holde trække alle disse tydeligvis ikke at skalere kvadrater, og dette
kollektivt repræsenterer min computers hukommelse.
Nu vil vi bare gøre dot, dot, dot.
Så med andre ord, når jeg nu bede bruger med get snor at give mig en
streng, hvad sker der?
Hvis brugeren typer i "Hej," der ender i H-E-L-L-O. Men formoder
Brugeren typer i -
Faktisk burde jeg ikke have gjort hej fordi vi beder
dem for deres navne.
Så lad os gå tilbage, hvis jeg kan gøre dette.
>> Så hvis jeg skriver i D-A-V-I-D for mit navn, men minder om, at den anden linje
koden blev få strengen igen for at få deres skole.
Hvor er det ord, som brugeren typer i kommer til at gå næste?
Tja, måske er det kommer til at gå ind i H-A-R-V-A-R-D. Så selvom jeg har
trukket det som to rækker, det er bare en hel bunke af bytes i din
computerens RAM.
Der er et problem nu, fordi nu, hvis jeg hjælp RAM i denne meget rimelige
men slags naiv måde, hvad kan du tilsyneladende ikke skelne?
Hvis en begynder, og hvor man ender, right?
De er slags sløring sammen.
>> Så det viser sig computeren ikke gør dette.
Lad mig faktisk rulle tilbage i tiden et få tegn, og i stedet for Harvard
går umiddelbart efter brugerens navn, brugeren bliver faktisk, bag
kulisserne, en særlig karakter indsat ved
computer for ham eller hende.
/ 0, ellers kendt som NUL-tegn irriterende kaldet N-U-L, ikke
N-U-L-L, men du skriver det som / 0.
Det er bare alle nul bits er en markør i mellem det første ord, brugerens
maskinskrevet og andet.
>> Så Harvard faktisk nu ender da denne sekvens af tegn
og en mere / 0.
Så med andre ord, ved at have disse sentinel værdier, otte sammenhængende nul
bits, kan du nu begynde at skelne et tegn fra hinanden.
Så al denne tid, hvad der blev "Hej" er faktisk "hej" med en / 0, og
I mellemtiden er der meget vel være ganske lidt mere RAM
indersiden af ​​computeren.
>> Lad mig gøre en anden ting nu.
Det viser sig, at alle disse kvadrater vi har været tegning, de er, ja,
strenge, men mere generelt, disse ting er arrays.
Et array er blot en luns af hukommelse der er tilbage til tilbage til tilbage til tilbage,
og du bruger typisk et array ved hjælp af denne firkantede beslag notation.
Så vi kommer til at se disse ganske lidt over tid, men lad mig gå videre og
åbne op, lad os kalde det aldre.
Og læg mærke til, hvad vi kan gøre med disse samme tricks lidt
lidt mere syntaks her.
>> Så på linje 17 i dette program - faktisk, lad mig køre programmet først
så vi kan se, hvad denne ting gør.
Lad mig kalde lave aldre til kompilere dette program.
. / Aldre.
Hvor mange mennesker er i rummet?
Kald det tre.
Age of den første person?
18, 19 og 20.
Og nu noget latterligt, jeg bare har lavet et program, der aldre dem
tre personer.
>> Så der er helt klart en mulighed for nogle sjove aritmetik her.
Heldigvis math er korrekt.
18 gik til 19, 19, gik til 20 og så videre.
Men hvad der virkelig betød at være illustrative her er hvordan vi opbevaring
disse tre folks aldre.
Lad mig zoome ind på, hvad der er foregår her.
>> Så det første, disse første par linjer bør være at få temmelig bekendt.
Jeg er bare at spørge brugeren om Antallet af personer i lokalet.
Så jeg bruger får int og gøre, mens at gøre det igen og igen og igen.
Vi har set, at mønsteret før, men line 27 er ny og faktisk ret
nyttige, og vil blive mere nyttigt.
Bemærk, at hvad der er anderledes på linje 27 er, at jeg synes at erklære en
int kaldet aldre, men vent.
Det er ikke kun int aldre.
Der er i disse kantede parenteser, inderside er n.
>> Så beslaget n i denne sammenhæng ikke indersiden af ​​en printf erklæring her, men
i denne ene linje 27, er denne linje sagde, giv mig n ints, som hver især
er af typen int.
Så dette er en spand, så at sige, af, i dette tilfælde, at tre heltal tilbage
tilbage til tilbage, så jeg effektivt have tre variabler.
Alternativet, for at være klar, ville være det.
>> Hvis jeg ønskede den første studerendes alder, kunne jeg gøre dette.
Hvis jeg ville den anden elevs alder, jeg kan gøre dette.
Hvis jeg ønskede det tredje studerendes alder, kunne jeg gøre dette.
Og Gud forbyde vi har brug for alles alder i dette rum -
Jeg mener, det er en pokkers af en masse kopi, indsætte igen og igen og igen.
Og plus når jeg kompilere dette program, hvis en anden elev går ind over ud
af den dør, som nu mit nummer variabler er forkert.
>> Så hvad er rart om et array er så snart du begynder at føle dig
kopiere og indsætte, er odds, der er ikke den bedste fremgangsmåde.
Et array er dynamisk potentielt.
Jeg kender ikke på forhånd, hvor mange mennesker kommer til at være i rummet,
men jeg ved, jeg har brug for n af dem, og jeg vil regne ud n når den tid kommer.
Denne linje kode betyder nu, giv mig et luns af hukommelse, der ser sådan ud
hvor antallet af kasser på skærmen er helt afhængig af n som
brugeren skrevet i.
>> Så nu resten af ​​dette program er faktisk temmelig svarer til, hvad vi
bare gjorde med tegn.
Bemærk, at jeg har en for-løkke startende i linje 30.
Så lige efter jeg får array, jeg gentage fra y lig nul på op til n..
Jeg har bare det lærerigt printf budskab siger bare, giv mig den alder,
person #% i, så nummer et, nummer to, nummer tre.
Og hvorfor gjorde jeg det?
Helt ærligt, mennesker foretrækker at tælle fra den ene på op mens dataloger,
nul på op.
dataloger ikke kommer til at bruge denne form for program, så vi er
vil bare begynde at tælle på én som normale mennesker.
>> Og nu på linje 33, bemærke den lidt anderledes stykke syntaks.
Den i'te alder at variabel af typen matrix kommer til at få en int.
Og nu endelig, det er bare aritmetiske hernede.
Jeg besluttede i en separat loop til at kræve der går nogen tid, og nu i denne
separat loop, disse linjer udføre.
>> Et år fra nu, person, vil jeg være i år, men bemærke dette er ikke den
variablen i.
Dette er nu% i for int.
Og varsel som den første pladsholder, jeg plug in i plus 1, så vi tæller som en
normal person.
Og så for værdien af ​​deres alder, for jeg år, jeg tager aldre beslag
I - og hvorfor gør jeg plus en her?
De har lige alderen.
Det er min dumme valg af programmer.
De har lige alderen et år.
Jeg kunne skrive i vilkårligt antal, Jeg faktisk ønsker der.
>> Så hvad er faktisk alle relevansen her?
Nå, lad mig faktisk rulle tilbage herover og male et billede
af, hvad der ligger forude.
Hvad vi vil gøre med vores næste Problem Set Two fuske i
verden af ​​kryptografi.
Så dette er en streng af tegn, så en sekvens af flere tegn, og hvad
siger det?
Det er ikke i online-version af dias.
>> Så jeg hævder, at dette er lig det, en stupid annonce fra mange år
siden, kan faktisk huske en af ​​dens oprindelse.
Så dette er et eksempel på kryptering eller kryptering.
Det viser sig, at hvis du ønsker at faktisk sende oplysninger eller deler
oplysninger med nogen sikkert, ligesom en besked som denne, kan du
scramble bogstaver.
Men typisk, ordene er ikke krypteret tilfældigt.
De er permuteres i nogle måde eller ændres på en måde, således at - UPS.
Det er en sjov spoiler til næste gang.
>> Så du kan kortlægge, hvad der er tilsyneladende O til B. Bemærk, at linjerne op
kapitalisering-wise.
Tilsyneladende r bliver e.
Tilsyneladende F-H-E-R bliver S-U-R-E. Så det viser sig der er en kortlægning, og
dette tilfælde er der er en temmelig dum kortlægning hvis nogen har regnet det ud?
Det er noget, der hedder Rot 13, Roter 13.
Det er den dummeste af kryptering mekanismer, fordi det bogstaveligt talt bare
tilføjer 13 til hver eneste af de breve, dum i den forstand, at hvis du bare
have lidt fri tid på dine hænder og en blyant, eller du bare synes, det
igennem i dit hoved, kan du prøve alle mulige tilføjelser - en, to,
tre, prik, prik, prik, 25 til bare rotere hele alfabetet, og
i sidste ende, vil du finde ud af hvad dette budskab er.
Så hvis du gjorde noget som dette i folkeskolen passerer beskeder til din
bedste ven, hvis din folkeskolen Læreren blot læse igennem
besked og brutale tvang opløsningen, du måske har fået
et svar med det.
>> Nu er selvfølgelig, i den virkelige verden kryptografi er mere sofistikeret.
Dette er et uddrag af tekst fra en edb-system, der har brugernavne og
passwords, da næsten alle vores gør, og dette er hvad dit password måske
ser gerne, hvis der er gemt på din harddisk køre, men i krypteret form.
Dette er ikke blot en rotation af breve, A er B og B er C. Dette er
langt mere sofistikeret, men det bruger hvad er almindeligt kendt som hemmelige nøgle
kryptografi.
Dette billede fortæller følgende historie med et par ikoner.
>> Til venstre har vi, hvad vi kalder almindelig tekst.
I en verden af ​​kryptografi, plain Teksten er bare den oprindelige meddelelse
skrevet på engelsk eller fransk eller noget sprog overhovedet.
Hvis du ønsker at kryptere det, vil vi passerer det billedligt gennem en hængelås, så
nogle af slags algoritme, nogle funktion eller et program, nogen skrev
at krypterer bogstaverne forhåbentlig mere complicatedly end blot at tilføje 13
til hver af dem.
>> Hvad du får ud af denne proces i midten der kaldes cyphertext.
Så sådan en sexet ord.
Det betyder blot, det er den krypterede udgave af almindelig tekst.
Og kun hvis du har den samme hemmelighed, 13 eller minus 13, er du i stand til at
dekryptere en besked som denne.
>> Så i Problem Set To, blandt de ting du vil gøre hvis i Hacker
Edition, bliver du nødt til at skrive kode til knæk disse adgangskoder, regne ud,
hvad de var, og hvordan de var krypteret, selvom vi giver dig en smule
vejledning undervejs.
I Standard Edition, introducerer vi et par ciphers, kryptering
mekanismer, den ene kaldte Cæsar, en kaldet Vigenere, som stadig er
roterende ciphers hvor A bliver noget, B bliver noget, men
du er nødt til at gøre det programmatisk fordi der rent faktisk vil være en hemmelighed
involverede nøgle som typisk er en række eller et søgeord, at kun de
afsender og modtager af disse meddelelser skal forstå.
>> Nu, dette har faktisk inkarnationer i den virkelige verden.
Dette, for eksempel, er lidt sjældne Annie hemmelige dekoder ring, og du
kan rent faktisk at gennemføre disse roterende ciphers -
A bliver noget, B bliver noget - med et par hjul,
en på ydersiden, en på indersiden sådan, at hvis du drejer hjulet eller
ringen, kan du faktisk linje op breve med forskellige bogstaver,
få en hemmelig kode.
Og så den cliffhanger for i dag, hvad jeg troede, jeg ville gøre, er lidt af
throwback at hvis du tænder for fjernsynet den 24. december, kan du se den
movie ad nauseum for 24 timer i træk.
Men for i dag, vil jeg åbne det op her og give os blot to minutter af en
pædagogisk relevant Christmas Story med en lille fyr ved navn Ralphie.
>> [VIDEO AFSPIL]
>> -Be det kendt for alle og enhver, at Ralph Parker udnævnes til
medlem af Little Orphan Annie hemmelighed cirkel og er berettiget til alle
hæder og fordele forekommende dertil.
>> -Signed, Little Orphan Annie.
Medunderskrives, Pierre Andre i blæk.
Honors og fordele allerede i en alder af ni.
>> [RÅBER PÅ RADIO]
>> Kom, lad os komme videre med det.
Jeg behøver ikke alt det jazz om smuglere og pirater.
>> -Lyt morgen aften for indgåelse eventyr af den sorte
sørøverskib.
Nu er det tid til Annies Secret Meddelelse til dig medlemmer
Den hemmelige cirkel.
Husk, unger.
Kun medlemmer af Annies Secret Circle kan afkode Annies hemmelig besked.
Husk, Annie afhængig af dig.
Sæt dine ben til B2.
Her er budskabet.
12, 11, 2 -
>> -Jeg er i min første hemmeligt møde.
>> -25, 14, 11, 18, 16 -
>> -Pierre var i stor stemme i aften.
Jeg kunne fortælle, at aftenens budskab var virkelig vigtigt.
>> -3, 25..
Det er en besked fra Annie selv.
Husk, ikke fortælle nogen.
>> -90 Sekunder senere, er jeg i det eneste rum i huset, hvor en dreng på ni
kunne sidde i fred og afkode.
Aha, gik B. I den næste.
E. Det første ord er "at være." S. Det kom lettere nu.
U. 25..
Det er R.
>> -Kom nu, Ralphie.
Jeg skal gå.
>> -Jeg skal lige ned, Ma.
Gee guru.
>> -T. O. Vær sikker på at.
Vær sikker på at hvad?
Hvad var Little Orphan Annie prøver at sige?
Vær sikker på at hvad?
>> -Ralphie har Randy kom til at gå.
Vil du venligst komme ud?
>> -Okay, Ma.
Jeg kommer lige ud.
>> -Jeg var at komme tættere på nu.
Spændingen var forfærdeligt.
Hvad var det?
Den skæbne af planeten kan hænge i balance.
>> -Ralphie, Randys skal afsted.
>> -Jeg skal lige ud for skriger højt.
>> -Næsten der.
Mine fingre fløj.
Mit sind var en stål fælde.
Hver pore vibrerede.
Det var næsten klar.
Ja, ja, ja, ja, ja.
>> -Sørg for at drikke din Ovaltine.
Ovaltine?
En mærkværdige kommercielle?
Son of a bitch.
>> [END VIDEOAFSPILNING]
>> SPEAKER 1: Dette er CS50, og at vil være Problem Set Two.
Se dig næste uge.
>> SPEAKER 2: På det næste CS50, dette sker.
>> SPEAKER 1: So ét emne har vi ikke så på hidtil er
at funktions pointere.
Nu en funktion pointer er bare adressen på en offentlig
funktion, men meget ligesom -
søn af en -