>> Högtalare 1: Okej.
Välkommen tillbaka.
Detta är Vecka två av CS50, och vi har hittills använt funktioner men
till stor del tagit dem för givna.
Vi har använt printf som har den bieffekt av tryckning
saker på skärmen.
Vi har använt get-int, får flyta.
>> Men vad händer om du verkligen vill skapa egna funktioner, som en del av
Du kanske redan har börjat göra för Problem Set One, men
inte absolut nödvändigt?
Nåväl, låt oss gå vidare och se över den Problemet med just be användaren
deras namn och skriva något på skärmen, men försök att räkna ut vissa
av likheterna som vi har sett i vår kod hittills.
Så med det menar jag följande.
>> Jag kommer att gå vidare och skapa ett nytt program, bara att ringa
det hej.c som vanligt.
Jag kommer att gå vidare och ge mig själv innehålla standardinformation io.h på toppen.
Jag ska också ge mig själv preemptively den CS50 biblioteket så att
Jag blir inte utskälld av kompilatorn.
Och nu ska jag gå vidare och förklara int, huvud, tomrum.
>> Och sedan i här, är det där jag vill ha att börja lägga ut funktioner till
någon annan funktion som jag själv kommer att skriva, men som inte
närvarande existerar.
Anta till exempel att jag ville skriva en funktion som tillåter mig att
skriva ut Hej, kommatecken, och sedan några användarens namn.
Istället för att fortsätta att göra printf Hej% s, inte skulle det vara trevligt om
Det fanns bara en funktion som kallas inte printf men print namn?
>> Så med andra ord, vill jag kunna skriva ett program som gör en liten
ungefär så här.
Först kommer jag att säga printf din namn, varigenom uppmanar användaren att
ge mig hans eller hennes namn, och då är jag kommer att använda de välkända sträng s till
deklarera en sträng.
Ge mig en variabel av typen String, kalla det s, och förvara i att den
resultera i ringa hämta sträng.
Men nu i veckor tidigare, skulle jag ha något tröttande gjort hej,% s / n.
>> Och med andra ord, vi har sett det här exempel ett gäng gånger, och det är en
trivialt exempel eftersom det finns bara en kodrad så det är egentligen inte en
big deal att hålla skriva in igen.
Men anta att denna kodrad faktiskt höll på att bli en börda, och
det är inte en kodrad men det är 10 kodrader ett par veckor från nu,
och du bara få trött att kopiera och klistra in eller
behöva skriva samma kod.
Skulle det inte vara trevligt istället för att göra printf hej,% s och så vidare,
skulle det inte vara trevligt om det fanns bara en funktion som kallas print namn som
tar ett argument -
med andra ord, det tar ingång -
och sedan semikolon.
Så det fungerar, skulle det inte vara trevligt om det fanns?
Då skulle jag inte behöva oroa sig för vad printf är, vad% s och alla
dessa komplikationer som är inte så intressant.
De är användbara.
>> Så skriv ut namn, tyvärr var inte uppfann några 40 plus år sedan.
Ingen trodde att skriva det.
Men det är det fina med att ha en programmeringsspråk, precis som i
Scratch kan du definiera egna block, så i C och mest något språk, kan du
definiera egna funktioner, kan du definiera egna funktioner.
Så även om vi får huvud genom automatiskt för gratis, kan vi deklarera
våra egna funktioner.
>> Så jag kommer att göra några rum här uppe uppe, och jag ska förklara min
egen funktion som kommer att se en lite konstigt i början, men vi ska komma
tillbaka till detta kort.
Jag kommer att säga ogiltig och därigenom indikerar denna funktion gör
något, har en bieffekt, men det inte tillbaka något till mig i
samma sätt som får int eller få strängen själv gör.
Och jag kommer att ge denna funktion en name of print namn, och jag ska
ange att den här killen kommer att ta en sträng, och jag kommer att kalla det
string name.
Jag skulle kunna kalla det vad jag vill, men jag vill ha min kod för att vara själv-dokumentera.
Med andra ord, var om en av er att öppna filen och läsa den, kan du
slags utläsa namnet på det ingång vilken roll den ska spela.
>> Och nu under det, kommer jag att öppna klammerparentes och slutna klammerparentes,
och så märker jag har följt samma mönster på linjerna fyra till sju som
Jag har följt efter en bra vecka plus nu mellan, säg, linjer nio och
14 som komponerar main.
Med andra ord, skriv ut namn är en annan funktion.
Nu är kompilatorn går inte att veta att kalla denna sak automatiskt
eftersom jag bokstavligen bara uppfunnit det, men det kommer fortfarande vet att kalla main
automatiskt, och då naturligtvis i linje 13, jag kallar min egen funktion.
Och eftersom jag har förklarat att funktionen upp på rad fyra före main,
detta kommer att undervisa kompilatorn vad citationstecken, unquote, "print namn"
innebär och vad den ska göra.
Så jag är liksom att ge det en ny anpassad blockera i samband med, säg, Scratch.
>> Så här kan jag sätta det mycket vanligt eller återkommande mönster av koden jag håller
skriver i klassen, printf % S Hej% s / n ", -
vad vill jag sätta här?
S?
Så jag vill sätta namn i det här sammanhanget.
Så märker lite av en dikotomi här.
Eftersom jag förklara min egen funktion och jag har något godtyckligt kallat
det skriver ut namn, och eftersom jag har inom parentes att detta
Funktionen tar ett argument, vilken typ av vilket är en sträng - så det är ett ord
eller fras eller något liknande - och Jag ringer det argumentet namn, som
innebär den enda variabel som finns i räckvidd, så att säga, är namnet.
>> S existerar endast mellan vad två Klammerparenteserna, förstås?
Jo verkligen, precis som linje 10 genom 14, så precis som på måndagen inte kan använda
S, men vad jag kan göra är att passera S i tryck namn.
Skriv namn råkar vara så att ge det ett alias, en synonym, ett smeknamn
kalla det namnet, och nu använda det i denna linje.
Så nu vill jag spara detta, zooma ut.
>> Låt mig gå vidare och göra hej.
Ser bra ut.
Inte spotta ut eventuella fel. . / Hello Enter.
Vad heter jag?
David.
Och hej David.
Så inte så spännande, men tänk nu.
Du har nu samma ingrediens som vi gjorde i Scratch till
göra våra egna funktioner.
>> Men det är lite av en Gotcha.
Antag att jag inte riktigt hade tänkt igenom detta och jag faktiskt utan
verkligen tänka på det skrev som fungerar här nere.
Känns helt rimligt.
I Scratch finns det ingen föreställning över platsen i dina skript.
Du kan sätta en upp här, en här uppe, en här uppe, och det kan börja
se lite rörigt om du inte lägga ut det prydligt, men det gör det inte
Vart fysiskt skript var på skärmen.
Tyvärr i C - och det är skillnad språk som Java och Python
och andra som du kanske känner med - tyvärr i C, gör att
roll eftersom klockan vad kommer att hända nu.
>> Den förvalda funktionen som händer att verkställa är, naturligtvis, main.
Huvudsaklig ska ringa print namn på line åtta, men tyvärr, det
kompilatorn kommer inte ens veta att print namn existerar innan den kommer till ledningen 11,
som tyvärr kommer att vara för sent.
Så låt oss göra göra hello.
Och nu Fan, två fel genereras.
Så nu låt mig rulla fram till den mycket först, som vi alltid gör, och
märker att det skriker på mig, "Implicit deklaration av funktionen
skriva ut namn. "
>> Så vi har sett detta meddelande innan, implicit deklaration av funktionen.
När har vi sett denna typ av fel?
När jag inte har ett bibliotek.
Om jag glömde cs50.h och jag skulle få skrek åt för att få strängen eller få int.
Men i detta fall, denna funktion tryck Namnet är inte i ett bibliotek, eller hur?
Det är bokstavligen i den här filen, så vad är egentligen problemet?
>> Jo tyvärr i C, det tar dig så otroligt bokstavligen att om du
vill ha en funktion som kallas print namn till existerar, måste du antingen tillämpa
som fungerar i den absoluta toppen av din kod så att den är tillgänglig för att sänka
funktioner, men ärligt talat, blir det slarvig mycket snabbt.
Personligen gillar jag att sätta på första eftersom det då är mycket tydligt vad detta
Programmet gör vid första anblicken.
Och plus, kan du komma in i konstiga hörn fall där om x vill ringa
y men y kan kalla x, du bara fysiskt kan faktiskt inte sätta en
ovanför den andra.
>> Men det visar sig i C, kan vi lösa detta mycket enkelt.
Jag kommer att sätta lite utrymme här uppe, och jag ska bara
preemptively, om än något redundant, kommer att undervisa
kompilatorn att det finns en funktion kallas print namn, det tar en sträng,
och jag ska ringa det namn semikolon.
>> Så här nu i linje fyra, som vi inte har sett förut, är en förklaring
av en funktion print namn, men det är bara ett löfte om att denna funktion kommer
så småningom att definieras, så småningom genomföras.
Det jag nu kan lämna ensam eftersom nu detta är definitionen, den
genomförande, sortera den sista milen av genomförandet av detta
viss funktion.
Så ärligt talat det är dumt, det är irriterande, men detta är det sätt C är, och det är
eftersom det tar väldigt bokstavligt och, som en dator uppriktigt sagt bör,
bara gör exakt vad du säger till göra, och så att beställning är viktigt.
>> Så ha det i åtanke och igen, börja märker återkommande mönster.
Oddsen är att du kommer, om du inte har redan, börja stöta meddelanden
som denna som vid första anblicken verkar helt kryptiskt, men om du börjar
att leta efter dessa nyckelord som "Implicit deklaration," tala om en
funktion i det här fallet - och ärligt talat, du ibland även få en liten grön
morot symbol som berättar var frågan är nog -
du kan börja arbeta dig igenom ännu osedda felmeddelanden.
Har du frågor om hur du skriver ditt egen funktion på detta sätt?
>> Låt oss göra något som är en lite mer övertygande.
Snarare än att bara göra något som har en bieffekt av utskrift, låt mig gå
framåt och spara en ny fil, och vi kommer kalla detta positive.c, även om det är
kommer att vara lite annorlunda jämfört med förra gången.
Och den här gången vill jag att åter genomföra sista gången s positive.C exempel, som
är att tvinga användaren att ge mig ett positivt heltal.
Men jag var tvungen att använda få int förra gången.
Skulle det inte ha varit trevligt om det fanns en funktion som kallas få positiv int
att jag bara kunde lägga ut detta bit funktionalitet?
Så skillnaden här är vi kommer genomföra få positiv int, men till skillnad från
print namn som hade en bieffekt - det inte tillbaka något till mig som
ett nummer eller en sträng -
få positiv int är naturligtvis att gå till återvända, förhoppningsvis, en positiv int.
>> Så låt oss göra det här.
Inkludera cs50.h, Inkludera standard io.h.
Int main tomrum.
Och nu i här, kommer jag att gå vidare och låt oss säga int, kalla det n, lika
få positiv int.
Och precis som att få int redan finns eftersom personalen skrev det, jag kommer
att för ett ögonblick anta att få positiv int existerar, och nu ska jag
att gå vidare och säga printf, tack för% i / n ", n.
>> Så nu om jag kompilera programmet, vad kommer att hända i mitt terminal
längst ned på skärmen?
Jag ska nog få det samma fel som tidigare.
Så låt oss prova det här.
Gör positivt.
Och återigen, implicit deklaration av funktion, få positiv int.
Så vi kan lösa detta i ett par olika sätt.
Jag kommer att hålla det enkelt och bara sätta min förklaring här uppe och få
positiv int.
Jag behöver den så kallade signatur.
Signaturen hänvisar bara till estetik
första raden i programmet.
Så vad bör få positiva int retur?
>> Så en int.
Jag menar Helst skulle det återgå något positivt int, men att
finns inte.
Vi har inte sett att det bland våra data typer, så vi måste ta itu med den
faktum att vi har väldigt få datatyper för att arbeta med.
Men vi kan returnera en int och bara litar på att det kommer att vara positivt.
Det kommer att kallas få positiv int.
>> Och nu hur om sina argument?
Tar det någon ingång?
Behöver det någon ingång?
Så det inte behöver veta i förväg något.
Få sträng inte får int inte.
Printf gör - det måste ha vissa input passerade in det - och skriv ut namnet
behövs vissa indata, men få positiv int inte.
Så jag ska uttryckligen tala om för kompilatorn ogiltig.
Void är frånvaron av något annat.
Så void betyder ingenting kommer innanför av dessa parenteser, semikolon.
>> Och nu på botten av min fil - och igen, jag bara vara typ av anal
Här sätter main upptill, vilket är god praxis eftersom det här sättet,
när du eller någon annan öppnar filen, den
funktionalitet är rätt där.
Du kan dyka i från ruta ett.
Så nu ska jag kopiera detta, få positiv int tomrum, men jag är inte
kommer att drabba ett semikolon nu.
Jag ska öppna klammerparenteser, och nu jag behöver låna
några idéer från måndag.
>> Så som ni minns, gjorde vi något vilja göra följande medan
något var sant.
Och vad gjorde jag?
Jag gjorde något som ger mig ett positivt heltal,
lite av en prompt.
Jag skulle kunna använda några ord som jag vill.
Och sedan jag använde vad?
Int n är lika få int, inga argument till det.
>> Och märker skillnaden.
När du ringer en funktion, när du använder en funktion, behöver du inte lägga in ogiltiga.
Du gör bara det när du deklarerar en funktion, undervisning kompilatorn vad
Det bör förvänta.
Så du behöver inte lägga ogiltigförklara det själv.
>> Och nu vad var mitt tillstånd?
Tja, är n inte lika positiv, men det är bara pseudo-kod.
Så hur gör jag uttrycka det renare?
Så mindre än eller lika med noll.
Så återigen, märker du kan göra mindre än eller lika med.
Även om det är två separata symboler, kan du göra det på
tangentbordet som sådan.
>> Men det finns fortfarande en bugg som Jag klantade mig förra gången också.
Jag måste förklara -
exakt.
Jag måste förklara n utanför av slingan.
Så jag måste sätta n här uppe, och jag gör inte vill åter förklara den här
så att jag får en ny variabel.
Jag vill bara att tilldela ett värde här.
>> Och nu är jag inte riktigt gjort här.
Låt mig få inför mig själv och låtsas att jag är klar.
Gör positivt, och nu det finns ett nytt fel.
Kontroll når slutet av icke-void funktion.
Så nytt felmeddelande, men om du typ av retas isär varje ord, det
förmodligen antyder vad som är fel.
>> Kontroll.
Kontroll betyder bara att ordern av verksamheten i ett program.
Datorn är i kontroll och något gick fel.
Så det når slutet av en icke-void funktion.
Vilken funktion är det uppenbarligen hänvisar till?
Vilken funktion är icke-void?
Så får positiv int, och lite förvirrande eftersom väl,
det är typ av tomrum.
Den har en specifikation av tomrum för dess argument, men dess effekt kommer att
vara av typ N.
Så ordet till vänster är så kallade returtyp.
Ordet på insidan här är noll eller flera argument
att en funktion tar.
>> Så vad behöver jag göra?
Vid denna punkt i min kod, rad 21 där den blinkande prompten är nu, jag
ha en positiv int inuti av variabeln kallade N.
Hur ger jag det tillbaka till main?
Bokstavligen.
Återgå n semikolon.
>> Så precis som Colton tillbaka en bit av papper med ett svar till mig genom att släppa
det papper i den lilla svarta box på bordet, för att göra det i
kod, du bokstavligen bara skriva, tillbaka n, och det är som om Colton var
gav mig något fysiskt tillbaka.
I det här fallet, vad som händer är att få positiv int kommer att lämna tillbaka
vad är förmodligen en positiv heltal till vem?
Var slutar det värdet upp?
Som hamnar i denna variabel, n, och då vi går vidare med linje nio.
>> Så med andra ord, i den ordning de verksamheten, startar detta program
verkställande, och kompilatorn inser, åh, vill du biblioteket?
Låt mig gå ta vad som finns inuti det.
Åh, vill du standard IO biblioteket?
Låt mig gå ta vad som finns inuti det.
Vad säger kompilatorn att själv när den träffar linjen fyra?
Åh, du lovade att genomföra Funktionen kallas få positiva, men
Vi återkommer till det senare, något i den stilen.
>> Int main void betyder just här är innanmätet av mitt program.
Rad sju är bara en klammerparentes.
Linje åtta säger till vänster, ge me 32 bitar för ett heltal, kalla det n.
På höger sida, det säger få positiv int.
Nu ska vi pausa den historien för nu Jag håller inte flytta min markören nedåt.
Min markören går nu här nere eftersom nu får positiva int exekverar.
Int n deklareras.
Gör följande.
Printf ger mig ett positivt heltal.
>> Få en int från användaren, förvara den i N, och kanske göra det igen och igen.
Denna slinga innebär att denna kod skulle kunna köra upp och ner så här igen
och igen, men när användaren slutligen samarbetar och ger mig en positiv
int, slog jag linje 21, vid vilken punkt antal lämnas tillbaka, och som ett
ska jag lyfta fram nu?
Nio.
Kontroll, så att säga, återgår att rada nio.
Det är den linje som nu är ansvarig.
>> Så det är vad som har hänt alla denna gång under huven, men
när vi har använt funktioner som printf eller ens få sträng som någon annan
skrev till dig, var kontroll som överlämnas iväg till någon annans kodrad
av rad för rad.
Det är bara att vi inte kunde se det och vi kunde inte riktigt beskriva det i detta
program eftersom det är i vissa andra fil på hårddisken
varken oss.
Så låt oss faktiskt sammanställa och kör detta nu.
>> Gör positivt.
Sammanställa, det är framsteg.
. / Positiv.
Ge mig ett positivt heltal.
Låt oss vara svårt.
Negativt 1.
Zero.
Låt oss ge det 50.
Tack för 50, och så kontroll har nu återvänt.
Alla frågor, då, på det?
Yeah?
>> [OHÖRBAR].
>> Säg igen.
Åh, bra fråga.
Så du kanske märker en parallell här som Jag är typ av skära ett hörn.
I linje 12, jag säger, få positiv int returnerar en int, men med samma
logik, står det nu att anledningen till att i linje sex, jag säger att främsta avkastning
en int, men vad har vi aldrig hade i något av våra program?
Vi har aldrig haft omnämnande av här nyckelordet avkastning.
>> Så visar det sig att i C, åtminstone den version av det som vi använder
gjordes 1999, tekniskt, är detta händer för dig automatiskt.
Varje gång du genomför ett program och du implementera en funktion som heter main,
att funktionen returnerar noll standard om du inte säger något annat,
och noll är bara en konvention.
Världen returnerar noll därigenom vilket indikerar att allt är bra,
effektivt lämnar oss med fyra miljarder möjliga saker som kan gå
fel så att om vi återvänder man, som skulle betyda en kod som innebär
sak gick fel.
Vi kunde återvända två, vilket innebär denna andra sak som gick fel.
Vi kunde återvända fyra miljarder, vilket innebär denna andra sak som gick fel.
>> Och om du nu tycker om din egen PC eller Mac, kanske ni minns att
ibland får du kryptiska felmeddelanden från program som du är
användning, och ibland har en mänsklig vänliga beskrivning, men det finns
ofta en kod eller ett nummer på skärmen?
Om detta inte kommer att tänka på, bara hålla utkik efter det.
Det är typiskt vad dessa koderna avser.
De ingår i Microsoft Word och andra program så att om du lämnar in en
felrapport med företaget, kan du berätta för dem, oh, fick jag felmeddelande nummer 45.
Och några programmerare tillbaka på företaget kan leta upp det i hans eller hennes
koden och säger, åh, det är därför jag gjorde denna bugg och det är därför användaren
fick detta meddelande.
>> Men ärligt talat, det är bara en liten störande och lite jobbigt att
dra slutsatsen att, åtminstone på vår första program, så vi har
varit att utelämna det.
Men hela denna tid var och en av dina funktioner main har i hemlighet haft detta
linjen läggs till automatiskt för dig genom kompilator, bara genom konvention till
spara lite tid.
>> [OHÖRBAR].
>> Du behöver inte inkludera det i main.
Det är bra.
Du behöver ta med det om du var genomföra en funktion som denna.
Annars funktionen platta ut skulle inte fungera.
Men i huvudsak är det inte nödvändigt.
I en vecka eller två, börjar vi få in i den vanan när vi vill starta
betyda fel.
Riktigt bra fråga.
>> Så snabb verbal rast nämna att denna fredag, kommer vi inte att ha lunch
per se, men vi ska ha middag med några av de elever och personal.
Om du vill gå med oss, känns fri att gå till cs50.net/rsvp.
06:00 på fredag.
Rymden är, som alltid, begränsad, men vi ska fortsätta att göra dessa på en nästan
veckobasis om rymden löper ut den här veckan.
>> Så cliffhanger som vi slutade på Måndag var att strängarna kan faktiskt
indexeras in, vilket betyder bara att du kan få på det första tecknet, den
andra tecknet, det tredje tecknet och så vidare, eftersom du kan
effektivt tänka på en sträng, som hej, som i detta fall fem
Bokstäverna i lådor.
Och du kan få vid varje av dessa lådor med vad syntax gjorde vi
införa på måndag?
Dessa hakparenteser på tangentbordet.
Det innebar bara att gå till platsen noll.
>> Vi börjar räkna på noll, så fäste noll betecknar h, fäste en
betecknar e, och så vidare.
Och så hela tiden när vi har varit använda strängar och skriva in "Hej"
och "världen" och andra saker på skärmen, det har lagrats
i rutor som denna.
Och ta en gissning.
Vad varje ruta representerar fysiskt insidan av din dator?
>> [OHÖRBAR].
>> Förlåt?
>> Tecken.
>> Så en karaktär, säkerligen i fallet av strängar, och ett tecken är precis
åtta bitar eller en byte.
Så du är förmodligen åtminstone vagt bekant med det faktum att din
dator har minne.
Det finns två typer av minne åtminstone.
En är hårddisken där du sparar grejer permanent, och det är
vanligtvis stora så att du kan få filmer och musik och så vidare.
>> Då har du en annan typ av minne kallas RAM, R-A-M, Random Access
Minne, och detta är den typ av minne som används när datorn är
kör men om du förlorar makt eller din batteriet dör, något som är lagrade
i RAM försvinner om du förlorar makten helt och hållet eftersom det inte är
ihållande.
Du har normalt, dessa dagar, en spelning av det, två spelningar, kanske fler.
Och uppsidan RAM är att det är mycket mycket, mycket snabbare än hårddiskar
eller ens Solid State Drives dessa dagar, men det är oftast dyrare så
du har mindre av det.
>> Så dagens samtal hänvisar egentligen till RAM, denna typ av minne som
existerar endast när det finns ström matas in i datorn.
Så när du skriver i H-E-L-L-O, Enter på tangentbordet, är H går i ett
bitgruppen i RAM, är den E går i en annan byte i RAM, är lika
resten av ordet.
Så minns vad vi kunde att göra förra gången var det.
Låt mig gå vidare och öppna upp filen som vi kallade string.c, och minns
att det såg lite ungefär så här.
Låt mig faktiskt rulla tillbaka och ändra det till exakt hur det såg ut,
sträng längd s.
>> Så titta på programmet här.
Vi inkluderar CS50 biblioteket så att vi kan använda få sträng.
Vi inkluderar standard io.h så att vi kan använda printf.
Varför har vi inkludera string.h?
Detta var nya på måndag.
Så vi ville sträng längd.
Str Leng.
Folk bestämde år sedan, låt oss bara vara kortfattad.
Istället för att kalla det "sträng längd," låt oss kalla det "Str Leng" och låt
världen lista ut, och så det är vad vi får tillgång till med string.h.
>> Detta är bekant.
Detta är bekant.
Detta är ett lite nytt.
I linje 22 - och vi ska återkomma till detta, men nu vet -
och du skulle bara veta detta från att ha läs dokumentationen eller om
du visste C redan -
hämta sträng ibland kan skruva upp.
Om användaren är verkligen kontradiktoriskt eller samarbetsvillig och han eller hon bara
inte skriver något på tangentbordet eller typer så mycket på tangentbordet som
Det överväldigar datorns minne, i teorin, få strängen kunde återvända
något annat än en teckensträng.
Det kan returnera ett speciellt värde som kallas NULL i versaler, N-U-L-L, och detta är
bara en så kallad vaktpostvärde.
Det är ett speciellt värde som betecknar hände något dåligt i det här fallet.
Det är avsaknaden av en sträng.
>> Så null Jag kollar efter helt enkelt så att, lång historia kort, str Leng och
andra funktioner som kommer med C om de förväntar sig en sträng men du passerar dem
avsaknaden av en sträng, om du klarar dem NULL, datorn eller programmet
kommer bara krascha direkt.
Det kommer att hänga.
Det kommer att kasta upp några felmeddelande.
Dåliga saker kommer att hända.
Så även om detta är fortfarande inte väldefinierad -
detta kommer att göra mer känsla i en vecka eller två - i linje 22, är detta bara en
exempel av själv defensiv felkontroll bara i fall en tid av
en miljon något går fel, till åtminstone mitt program inte kommer att krascha.
>> Så om s inte lika något dåligt, Jag har här för loop, och detta var
där vi hade den andra ny bit av syntaxen.
Jag har en for-loop iterera från noll på upp till längden på s.
Och så här, var jag en utskrift ut s fäste jag, men varför jag använder% c alla
en plötslig istället för% s ännu men s är en sträng?
Det är ett tecken, eller hur?
S är en sträng, men s fäste något, s fäste i där jag är noll
eller ett eller två, det är en individuell tecken i strängen, och så för
att printf måste informeras om att det är verkligen en karaktär att förvänta.
>> Och sedan minns, gjorde vad detta Programmet gör egentligen?
>> Skrivs det ut i kolumner.
>> Ja, exakt.
Det skrivs just det ord som jag skriver in en kolumn, ett tecken per rad.
Så låt oss se detta igen.
Så gör strängen.
Sammanställt OK. . / String.
Låt mig skriva i H-E-L-L-O, Enter, och ja jag får det, en per rad.
>> Så låt mig göra en optimering här.
Om du tänker på det, speciellt om du har programmerat tidigare, det finns
utan tvekan en ineffektivitet i linje 24.
Med andra ord, det är inte nödvändigtvis den bästa designen.
Okomplicerad, minst en gång du ihåg vad Str Leng är, men det är
göra något dumt potentiellt.
Vad kan det vara?
>> [OHÖRBAR].
>> Exakt.
Det kollar för längden på s varenda gång trots
H-E-L-L-O kommer alltid att vara fem tecken.
Varje gång genom denna slinga, de fem inte förändras.
Jag kanske uppräkning i, men vad är längden av s på varje
variant av denna loop?
Det är fem, det är fem, det är fem, och men jag ändå frågar detta
fråga igen och igen och igen.
Nu ärligt talat, är datorn så jävla snabbt, ingen kommer att märka en
skillnad i detta fall, men dessa typer av dåliga designbeslut kan
börja lägga upp om kompilatorn själv försöker inte att fixa detta för dig som
det skulle typiskt inte vid åtminstone i apparaten.
>> Så jag kommer att göra detta.
Jag kommer att lägga till ett kommatecken efter min första variabeln, jag.
Jag ska ge mig själv en annan variabel, kalla det n, bara genom
konvention för siffror, och så är jag kommer att tilldela n Värdet på strängen
längd s.
Och sen ska jag byta mitt tillstånd att vara vad?
Jag ska ändra mitt tillstånd att medan jag är mindre än n.
>> Så nu, hur många gånger jag kontrollera längden av s?
En gång, men det är OK att ta i mot n igen och igen eftersom nu de
värden faktiskt inte förändras.
Nu för nu, vet bara att när du anropa en funktion, det är lite av
overhead, inte tillräckligt för att avskräcka dig egentligen från att någonsin använda funktioner, men
säkert när det finns en kodrad gillar det - och linjerna kommer att få
mer intressant innan länge - där det finns en möjlighet att tänka, om jag
skriver denna kod, hur många gånger kommer det köra?
Du kommer att börja se över tid resultatet av dina program kan
faktiskt förändras.
>> I själva verket sätter en av de problem vi har gjort i år tidigare innebär
genomförande, som ni kanske minns från vecka noll, en stavningskontroll, men en
stavningskontroll som är utformad för att stödja en ordbok av 150.000 plus
ord som vi ger er.
Du måste skriva kod som laddar dessa ord i RAM, så till
rutor som vi såg på skärmen en stund sedan, och sedan så fort du
kan, måste du kunna svara på ett frågan om formen, är detta ord
felstavat?
Är detta ord felstavat?
>> Och i något liknande det vi har gjort i år förflutna förvandlat det till,
om än på en opt-in frivillig basis, ett konkurrens av slag, varvid
studenter som använder mindre RAM och mindre tid, färre CPU-cykler, hamnar
bubblar upp till toppen av en liten ledare ombord eller rangordning som vi sätter på
kursens hemsida som vi har gjort under tidigare år.
Så återigen, helt frivilligt, men detta talar till designmöjligheter
som är framåt när vi börjar bygga atop vissa av dessa
grundläggande byggstenar.
>> Så låt mig gå tillbaka till detta diagram för bara ett ögonblick och avslöjar lite
något mer.
Detta är verkligen en sträng, och vi har tagit utnyttjade ett bibliotek,
standard io.h som har -
>> Printf.
>> Printf, bland annat.
cs50.h, vilket har få int och få strängen och så vidare, string.h, som
hade Str Leng.
Men det visar sig att det finns ännu en.
Ärligt talat, det finns massor av header filer som deklarerar funktioner
för bibliotek, men detta ctype.h är faktiskt kommer att vara något
fördelaktigt eftersom jag ska att gå vidare och genomföra en
andra program här.
>> Låt mig gå vidare och öppna upp något Jag skrev i heter förväg
capitalize.c, och låt oss ta en titt på hur det fungerar.
Lägg märke till att jag använder, i denna version av den, tre välbekanta filer.
Lägg märke till att i linje 18, jag är att få en rad med text.
Meddelande i linje 21, jag hävdar att Följande kod kommer att
kapitalisera s, oavsett användaren skrivit in, och hur gör jag det?
Nåväl, jag tar -
lärdom från förra gången -
Jag förklarar i och n och iteration över tecken i strängen.
Och vad är då detta block av kod i linje 24 genom 27
gör i lekmannaspråk?
>> Liten bokstav tillbaka.
>> Exakt.
Om s fäste i - så om det i: te karaktären av s, som är en specifik
char i strängen, är större än eller lika med små bokstäver en och -
minns att dubbla ampersand betyder och -
och samma karaktär, s fäste i, är mindre än eller lika till gemener z,
det betyder att det är ett a eller ett b eller c eller dot, dot, dot, eller ett z, vilket innebär
det är gemener.
Vad vill jag göra i så fall?
Tja, kan jag göra detta något kryptiskt, men
Låt oss reta detta isär.
>> Jag ska ringa printf skriver% c eftersom jag vill skriva ut detta
tecken på skärmen.
Jag sedan kommer att ta s fäste i, den i: te tecknet i s, och varför
gör jag detta lilla trick här, gemener ett minus kapital A?
Vad är det som kommer att ge mig, generellt sett?
>> [OHÖRBAR].
>> Exakt.
Jag kommer inte riktigt ihåg -
det var 65 för kapital A. Jag vet inte riktigt ihåg vad gemener en är,
men oavsett.
Datorn vet.
Så genom att säga, gemener ett minus huvudstad A, är det konstigt att vara
subtrahera en röding från varandra, men vad är tecken under huven?
De är bara siffror.
Så oavsett vad dessa siffror är, låta datorn komma ihåg det
snarare än mig människa.
>> Så små bokstäver ett minus kapital A är kommer att ge mig en skillnad.
Det råkar vara 32, och det skulle vara fallet för gement b och kapital B
och så vidare.
Det stannar konsekvent, tack och lov.
Så jag i huvudsak menar, ta liten bokstav, subtrahera bort det
standard skillnad, och att effektivt förändringar s fäste i från
gemener till, naturligtvis, versaler, utan att jag verkligen tänka
om eller komma ihåg, vad var de siffror vi pratade om när åtta
volontärer kom upp på scenen?
Nu under tiden, i annars, om det inte en liten bokstav bestämd
av linje 24, bara skriva ut den.
Jag vill bara beröra tecken som var
faktiskt ursprungligen gemener.
>> Så låt oss se detta.
Gör nytta.
Sammanställt, OK.
. / Nytta.
Och låt mig skriva i H-E-L-L-O med gemener, Enter.
Och märker att det omvandlas i versaler.
Låt mig göra det här igen med ett annat ord.
Vad sägs om D-A-V-I-D med den första D aktiveras som ett namn är typiskt?
Enter.
Lägg märke till att det är fortfarande korrekt.
Det matas bara det första D oförändrad via det konstruera annat.
>> Så kom ihåg, då en par saker här.
En, om du någonsin vill se två förhållandena på en gång, kan du och dem
tillsammans som vi förutspådde.
Du kan jämföra tecken på detta sätt och effektivt behandla tecken som
siffror, men ärligt talat, är det så jävla kryptiskt Jag kommer aldrig att komma ihåg
hur att komma med detta från grunden utan motivering igenom det ganska
lite tid.
>> Skulle det inte ha varit trevligt om någon därute skrev en funktion som kallas är
sänka som kunde svara för mig sant eller falskt, är detta tecken gemener?
Jo tack och lov, den som skrev ctype.h gjorde precis det.
Låt mig gå upp hit och lägga ctyp för c typer, och nu vill jag gå ner hit och
skriva denna linje enligt följande.
>> Så om det kallas är lägre, jag hävdar, s fäste jag, då ska jag ta bort
dessa två linjer helt och hållet.
Så nu någon annan, jag hoppas, skrev en funktion som kallas är lägre, och det
Visar sig de gjorde och de förklarade det inne i ctype.h.
Och nu ska jag lämna linjen 27 ensam, kommer jag att lämna linjen 31
ensam, men märker hur mycket jag har skärpt min kod.
Det är nu renare.
Det är mindre svårt att titta igenom för nu funktionen för övrigt är
så härligt heter det bara gör vad den säger.
>> Så nu ska jag spara detta.
Jag kommer att zooma ut.
Och precis som i Scratch kan du ha Booleans, Booleska värden sant eller
falskt, det är precis det som är sänka effektivt avkastning.
Låt mig kompilera.
Låt mig repris.
Och nu ska vi prova det igen, H-E-L-L-O, Enter.
Det är ganska bra.
Och prova igen, se till att jag inte skruva upp något.
Det aktiveras också.
>> Men detta är inte bra nog, eftersom annan sak som jag aldrig tänker
minns inte jag arbeta igenom det verkligen noga på, säg, är papper
denna jävla linje.
Skulle det inte vara trevligt om det fanns en funktion som kallas för övre?
Jo det visar sig att det är i ctype.h också.
Jag ska gå vidare och skriva -
låt mig ta den linjen tillbaka.
Istället för det här, låt mig gå vidare och säga, ersätta den% C
resultat av att kalla denna funktion övre på den i: te karaktär s.
Och nu märker det blir lite balanserad.
Jag måste hålla reda på hur många parentes har jag öppnat och stängt.
>> Så nu är det ännu renare.
Nu är detta program blir bättre och bättre utformade utan tvekan eftersom det är
mycket, mycket mer läsbar men det låter inget stämmer.
Gör nytta.
. / Nytta.
H-E-L-L-O. Låt oss köra den igen, D-A-V-I-D. OK, så vi är fortfarande i
ganska bra form.
>> Men nu till övre.
Jag föreslår att det finns en mer förfining vi kunde göra som skulle vara
riktigt nice, som verkligen skulle kunna dra upp den här koden och verkligen ge oss fem
av fem för design, till exempel.
Vad skulle vara trevligt att bli av med?
Tja, titta hur jävla länge detta block av koden är bara att göra något enkelt.
>> Nu som en åt sidan, som ni kanske har sett i super avsnitt detta tidigare
helg, behöver du inte absolut behöver den Klammerparenteserna när du bara har en
kodrad, trots att vi föreslog hålla dem så att det gör mycket
mer tydliga, liksom i Scratch s U-formad block, vad som finns inne i grenen.
Men skulle det inte vara trevligt om till övre, när det ges dess ingång, förvandlas det till
versaler om det inte är, och vad som skulle vara underbart i det motsatta fallet om
det är redan versaler?
Bara för det genom och lämna den ensam.
>> Så kanske det gör det.
Jag kan försöka och hoppas bara att det gör, men låt mig
införa en annan sak.
Istället för att använda denna inbyggda terminal fönster här nere, minns att
detta torg svart ikon ger dig en större terminalfönster som jag kan fullt
skärmen om jag vill?
Så visar det sig att de är slags märkligt heter, men det finns dessa saker som kallas
man-sidor, manuella sidor, man för kort, och jag kan komma åt dessa genom
skriver man -
vad jag vill skriva?
Man till övre.
>> Och nu märker om det finns en fungera datorns insida, i
detta fall apparaten, som är bara operativsystemet Linux, det kommer
ge mig ett något kryptiskt uppsättning utgång, men du hittar över tiden som
det alltid är formaterad ganska mycket samma så du börjar vänja sig.
Lägg märke upptill till övre och tydligen är det samma dokumentation
för att sänka.
Den som skrev det var att klippa några hörn och sätta allt på en sida.
Dessa saker "syftet i livet är att omvandla en
brev till övre eller gemener.
>> Observera att enligt Synopsis, mannen sidan lär mig vilken fil jag har
att inkludera att använda denna sak.
Det ger mig signaturerna för dessa funktioner, båda av dem, även
även om vi just nu bara bryr sig om en.
Här är nu en beskrivning.
Till övre omvandlar bokstaven c till versaler om möjligt.
>> Fortfarande inte så lärorikt, men låt mig nu titta under returvärde, saken
som har lämnas tillbaka.
Så det returnerade värdet är det som konverterade bokstav eller c om
konvertering inte var möjligt.
Vad är c?
>> Den ursprungliga karaktären.
>> Den ursprungliga karaktär och vi vet att genom att, återigen, gå upp till
synopsis, och den som skrev detta funktion just beslutat att ingången
till att övre och nedre är bara godtyckligt kommer att kallas c..
De kunde ha kallat det mest något de vill, men de höll det
enkelt som c.
Så jag har hört mannen sidan.
Denna mening lugnar mig att om det är inte en liten bokstav, det är
kommer att bara ge mig tillbaka c, vilket är perfekt, vilket betyder att jag kan bli av
min annanstans skick.
>> Så låt mig gå tillbaka till gedit, och nu vill jag bara göra det här.
Jag kommer att kopiera min printf uttalande.
Jag ska gå vidare och höger innanför för loop utskrift som ut, och få
bli av nu denna helhet om konstruktion.
Var inte en dålig idé, och det var mycket mycket korrekt och konsekvent med
allt vi har predikat, men bara inte nödvändigt.
Så fort du inser att vissa bibliotek Funktionen finns att någon annan
skrev, eller kanske du skrev någon annanstans i filen, kan du använda det och verkligen
börja strama upp koden.
>> Och när jag säger saker som god stil, det faktum att denna person kallas
fungera till övre, eller tidigare är lägre är fantastiskt användbart eftersom
de är mycket beskrivande.
Du vill inte att ringa dina uppgifter x och y och z, som har
mycket, mycket mindre betydelse.
Eventuella frågor om denna serie av förbättringar?
>> Så det räcker att säga en av de hämtställen är även som ditt eget problem
set - kanske problemet set en, men säkerligen P satt två och framåt, även
när de är riktiga inte nödvändigtvis menar att de är perfekta precis
ännu eller särskilt väl utformade.
Det är den andra axeln till börja tänka.
Så detta var en sträng inne i din datorns minne, men om du har en
massa tecken som H-E-L-L-O insidan av RAM, och antag
att du i ditt program ringa hämta sträng flera gånger så att du
ring får strängen gång, då du ring får strängen igen.
Tja, vad som händer med ske över tiden?
>> Med andra ord, om du har en rad av kod, om än ur sitt sammanhang, liksom
string s blir -
Låt oss göra detta.
String namn är lika få strängen.
Så antar att kodrad menas att fråga användaren om hans eller hennes namn.
Denna nästa kodrad är tänkt att fråga användaren för hans eller hennes skola, och
denna nästa rad, och så vidare.
Antag att vi frågar användaren för en annan och
annan och en annan sträng.
De kommer att stanna i minnet på samma gång.
Man kommer inte att clobber den andra.
Skolan skriver inte den andra.
Men var gör de alla hamna i minnet?
>> Tja, om vi börjar att rita på skärmen, som vi kan använda denna sak
här som en tavla, om detta svarta rektangel representerar datorns
minne, kommer jag att godtyckligt starta dela upp den i små fyrkanter,
var och en representerar en byte med minne.
Ärligt talat, om du har en gigabyte RAM dessa dagar, har du en miljard byte
minne i datorn, så en miljard av dessa rutor.
Så det räcker att säga, detta är egentligen inte i skala.
>> Men vi kunde hålla rita alla dessa uppenbarligen inte skalenliga kvadrater, och detta
kollektivt representerar min dators minne.
Nu ska vi bara ska göra prick, prick, prick.
Så med andra ord, när jag frågar nu användare med hämta sträng för att ge mig en
sträng, vad händer?
Om användaren skriver i "hej", som slutar upp i H-E-L-L-O. Men anta att
Användaren skriver sedan in -
Egentligen borde jag inte ha gjort hej eftersom vi ber
dem för deras namn.
Så låt oss gå tillbaka om jag kan göra det här.
>> Så om jag skriver D-A-V-I-D för mitt namn, men minns att den andra raden
koden får strängen igen att få sin skola.
Där är det ord som användaren avfallsslag i kommer att gå nästa?
Tja, kanske det kommer att gå in i H-A-R-V-A-R-D. Så trots att jag har
dras det som två rader, är detta bara en hel massa byte i din
datorns RAM-minne.
Det finns ett problem nu för nu om jag med RAM i detta mycket rimliga
men slags naivt sätt, vad kan du uppenbarligen inte skilja?
När man börjar och där ena ändar, eller hur?
De är typ av oskärpa tillsammans.
>> Så visar det sig datorn gör inte detta.
Låt mig rulla faktiskt tillbaka i tiden få tecken, och i stället för Harvard
går omedelbart efter användarens namn, användaren får faktiskt, bakom
kulisserna, en speciell karaktär införd genom
dator för honom eller henne.
/ 0, annars känd som NUL-tecken annoyingly kallas N-U-L, inte
N-U-L-L, men du skriver det som / 0.
Det är bara alla nollbitar är en markör i mellan det första ordet som användarens
skrivit och den andra.
>> Så Harvard faktiskt nu hamnar eftersom detta teckensekvens
och en mer / 0.
Så med andra ord, genom att ha dessa sentinel värden, åtta sammanhängande noll
bitar, kan du börja nu att skilja ett tecken från en annan.
Så all denna tid vad "hej" är faktiskt "hej" med en / 0, och
under tiden, det kan mycket väl vara ganska lite mer RAM-minne
inuti datorn.
>> Låt mig göra en sak nu.
Det visar sig att alla dessa rutor vi har dragit, de är, ja,
strängar, men mer generellt, dessa saker är matriser.
En array är bara en bit av minnet det är rygg mot rygg mot rygg mot rygg,
och du brukar använda en array genom av denna hakparentes notation.
Så vi kommer att se dem en hel över tiden, men låt mig gå vidare och
öppna upp, låt oss kalla det åldrar.
Och märker vad vi kan göra med dessa samma trick, lite
lite mer syntax här.
>> Så i linje 17 i detta program - faktiskt, låt mig köra programmet först
så att vi kan se vad den här saken gör.
Låt mig kalla göra åldrar att kompilera programmet.
. / Åldrar.
Hur många människor är i rummet?
Kalla det tre.
Ålder på den första personen?
18, 19, och 20.
Och nu något löjligt, bara jag har gjort ett program som åldrar dem
tre personer.
>> Så det finns helt klart en möjlighet för lite kul aritmetiska här.
Tack och lov är det matte korrekt.
18 gick till 19, 19 gick till 20 och så vidare.
Men vad som verkligen tänkt att vara belysande här är hur vi lagrar
dessa tre människors åldrar.
Låt mig zooma in på vad som finns pågår här.
>> Så först, dessa första raderna bör att få ganska bekant.
Jag bara uppmanar användaren för Antalet personer i rummet.
Då jag använder få int och gör samtidigt att göra det igen och igen och igen.
Vi har sett detta mönster tidigare, men linje 27 är ny och faktiskt ganska
användbart kommer och bli allt mer användbara.
Lägg märke till att det som är annorlunda i linje 27 är att jag verkar vara att förklara en
int kallas åldrar, men vänta.
Det är inte bara int åldrar.
Det finns dessa hakparenteser, inuti vilken är n.
>> Så fästet n i detta sammanhang, inte insidan av en printf uttalande här men
i denna enda linje 27, är denna linje säger, ge mig n ints, vilka var
är av typen int.
Så detta är en hink, så att säga, av, i det här fallet, tre heltal tillbaka till
rygg mot rygg så att jag effektivt har tre variabler.
Alternativet, att vara klart, skulle vara så här.
>> Om jag ville ha den första studentens ålder, kan jag göra det här.
Om jag ville ha den andra studentens ålder jag kan göra det här.
Om jag ville ha den tredje studentens ålder, kan jag göra det här.
Och gud förbjude att vi behöver allas ålder i det här rummet -
Jag menar, detta är en fan av mycket av exemplar, klistra igen och igen och igen.
Och plus när jag kompilera detta program, Om en annan elev går in över ut
att dörren, nu mitt nummer variabler är felaktig.
>> Så vad är trevligt om en array är som snart du börjar känna dig själv
kopiera och klistra in, oddsen är att det är inte den bästa metoden.
En array är dynamisk potentiellt.
Jag vet inte i förväg hur många människor kommer att vara i rummet,
men jag vet att jag behöver n av dem, och jag ska räkna ut n när det är dags.
Denna kodrad nu betyder, ge mig en bit av minnet som ser ut så här
där antalet rutor på skärmen är helt beroende av n som
användaren skrivit i.
>> Så nu resten av detta program är faktiskt ganska lik vad vi
precis gjorde med tecken.
Märker jag har en for-loop med början på rad 30.
Så direkt efter jag får arrayen, jag upprepa från y är lika med noll på upp till n.
Jag har just denna lärorika printf Meddelandet säger bara, ge mig en ålder
person #% i, så nummer ett, nummer två, nummer tre.
Och varför gjorde jag det?
Ärligt talat, människor föredrar att räkna från ett på upp medan datavetare,
noll på upp.
datavetare kommer inte att använda denna typ av program, så vi är
ska bara börja räkna på en som normala människor.
>> Och nu i linje 33, märker något annan bit av syntaxen.
Den i: te ålder i denna variabel av typen array kommer att få en int.
Och nu slutligen, är detta bara aritmetiska här nere.
Jag bestämde i en separat slinga för att hävda viss tid passerar, och nu i detta
separat slinga, dessa rader exekvera.
>> Ett år från nu, personen jag kommer att vara i år gammal, men märker det inte är
variabeln i..
Detta är nu% i för int.
Och meddelandet som första platshållare, jag plug in i plus 1, så vi räknar som en
normal person.
Och sedan för värdet av deras ålder, för jag år gammal, jag tar evigheter fäste
Jag - och varför gör jag plus en här?
De åldriga precis.
Det är min dumma val av program.
De åldriga precis ett år.
Jag kunde skriva in valfritt antal som Jag vill verkligen det.
>> Så vad är egentligen alla relevans här?
Nåväl, låt mig faktiskt rulla tillbaka hit och måla en bild
om vad som väntar.
Vad vi ska göra med vår nästa Problem Set Two är plaska i
värld av kryptografi.
Så detta är en sträng av tecken, så en sekvens av flera tecken, och vad
säger detta?
Det är inte i den online-version av bilderna.
>> Så jag hävdar att detta är lika med detta, en dum annons från många år
sedan som faktiskt kan erinra en av dess ursprung.
Så detta är ett exempel på kryptering eller kryptografi.
Det visar sig att om man vill faktiskt skicka information eller dela
information med någon ordentligt, som ett budskap som detta, kan du
förvränga bokstäverna.
Men typiskt, orden är inte oordning slumpmässigt.
De är permuteras på något sätt eller ändrats på något sätt så att - OJ.
Det är en rolig spoiler för nästa gång.
>> Så du kan mappa det är tydligen O till B. Observera att linjerna upp
kapitalisering-wise.
Tydligen blir r e.
Tydligen F-H-E-R blir S-U-R-E. Så Det visar sig att det finns en kartläggning, och i
detta fall finns det en ganska dum kartläggning om någon har räknat ut det?
Detta är något som kallas Rot 13, Rotera 13.
Det är den dummaste av kryptering mekanismer eftersom det bokstavligen bara
adderar 13 till var och en av bokstäverna, dum i den meningen att om man bara
har lite ledig tid på dina händer och en penna, eller du tycker bara det
igenom i ditt huvud, du kan försöka alla möjliga tillägg - ett, två,
tre, dot, dot, dot, 25 till strax rotera hela alfabetet, och
Så småningom kommer du räkna ut Vad meddelandet är.
Så om du gjorde något liknande i grundskola skicka meddelanden till din
bästa vän, om din grundskolan Läraren läser helt enkelt genom
meddelandet och brute tvingade lösningen, du kanske har fått
ett svar av det.
>> Nu naturligtvis, i den verkliga världen, kryptografi är mer sofistikerad.
Detta är ett utdrag av text från en datorsystem som har användarnamn och
lösenord, som nästan alla av oss gör, och detta är vad ditt lösenord kanske
se ut om de lagras på din hårddisk köra men i krypterad form.
Detta är inte bara en vridning av bokstäver, A är B och B är C. Detta är
mycket mer sofistikerade, men den använder vad brukar kallas hemlig nyckel
kryptografi.
Denna bild berättar följande berättelse med några ikoner.
>> Till vänster har vi vad vi kallar vanlig text.
I en värld av kryptografi, slätt text är bara det ursprungliga meddelandet
skriven på engelska eller franska eller vilket språk som helst.
Om du vill kryptera det, kommer vi att passera det bildmässigt genom ett hänglås, så
några av typ av algoritm, någon funktion eller program som någon skrev
som förvränger bokstäverna förhoppningsvis mer komplicerat än att bara lägga 13
till var och en av dem.
>> Vad du får ut av denna process i mitten finns kallas cyphertext.
Så lite av en sexig ord.
Det betyder bara att det är den krypterade version av vanlig text.
Och bara om du har samma hemlighet, 13 eller minus 13, kan du
dekryptera ett meddelande som.
>> Så i Problem Set Two, bland de saker kommer du göra om i Hacker
Edition, måste du skriva koden till knäcka dessa lösenord, räkna ut
vad de var och hur de var krypterad, även om vi gör ger dig lite
av vägledning på vägen.
I Standard Edition, introducerar vi ett par av chiffer, kryptering
mekanismer, som kallas en Caesar, en kallas Vigenère, som fortfarande
roterande chiffer där A blir något, blir B något, men
du måste göra det programmatiskt eftersom det kommer verkligen att bli en hemlighet
nyckel inblandade som är vanligen ett antal eller ett sökord som enbart
avsändaren och mottagaren av dessa meddelanden ska förstå.
>> Nu har detta faktiskt inkarnationer i den verkliga världen.
Detta, till exempel, är lite föräldralösa Annies hemliga dekoder ringen, och du
kan faktiskt genomföra dessa roterande chiffer -
A blir något, blir B något - med ett par hjul,
en på utsidan, en på insidan så att om du vrider ratten eller
ringen, kan du rada faktiskt upp bokstäver med olika bokstäver,
få en hemlig kod.
Och så den cliffhanger för idag, vad jag trodde jag skulle göra är lite av
throwback att om du slår på TV den 24 december, kan du titta på
filmannons nauseum för 24 timmar i sträck.
Men för idag, jag ska öppna det här och ger oss bara två minuter av en
pedagogiskt relevant Christmas Story med en liten grabb som heter Ralphie.
>> [VIDEO SPELA]
>> -Var det känt för alla och envar att Ralph Parker utnämns till
medlem av Little Orphan Annie hemlighet cirkel och har rätt till alla
heder och förmåner förekommande därtill.
>> -Undertecknad, Little Orphan Annie.
Kontrasignerade, Pierre Andre i bläck.
Heder och förmåner som redan vid nio års ålder.
>> [SKRIKER PÅ RADIO]
>> Kom, låt oss gå vidare med det.
Jag behöver inte all that jazz om smugglare och pirater.
>> -Lyssna morgon kväll för avslutande äventyret i svart
piratskepp.
Nu är det dags för Annie hemlighet Meddelande till dig medlemmar
av den hemliga cirkeln.
Kom ihåg, barn.
Endast medlemmar i Annies Secret Circle kan avkoda Annies hemliga budskap.
Kom ihåg, är Annie beroende av dig.
Ställ dina stift till B2.
Här är meddelandet.
12, 11, 2 -
>> -Jag är i mitt första hemliga mötet.
>> -25, 14, 11, 18, 16 -
>> -Pierre var i stor röst ikväll.
Jag kan tala om att kvällens budskap var verkligen viktigt.
>> -3, 25.
Det är ett budskap från Annie själv.
Kom ihåg att inte berätta för någon.
>> -90 Sekunder senare, jag är i det enda rummet i huset där en pojke på nio
kunde sitta i avskildhet och avkoda.
Aha, gick B. I till nästa.
E. Det första ordet är "att vara." S. Det skulle komma lättare nu.
U. 25.
Det är R.
>> -Kom igen, Ralphie.
Jag måste gå.
>> -Jag är rätt ner, Ma.
Gee vina.
>> -T. O. Var noga med att.
Var noga med vad?
Vad var Little Orphan Annie försöker säga?
Var noga med vad?
>> -Ralphie, har Randy fått gå.
Kan du komma ut?
>> -Okej, Ma.
Jag kommer strax.
>> -Jag kom närmare nu.
Spänningen var hemskt.
Vad var det?
Den planetens öde kan i vågskålen.
>> -Ralphie, Randys gotta go.
>> -Jag är rätt ut för crying out loud.
>> -Nästan där.
Mina fingrar flög.
Mitt sinne var en stål fälla.
Varje por vibrerade.
Det var nästan klart.
Ja, ja, ja, ja, ja.
>> -Glöm inte att dricka ditt Ovaltine.
Ovaltine?
En crummy kommersiell?
Son of a bitch.
>> [END VIDEOAVSPELNING]
>> SPEAKER 1: Detta är CS50, och att blir Problem Set Two.
Vi ses nästa vecka.
>> TALARE 2: Vid nästa CS50, detta händer.
>> Högtalare 1: Så ett ämne vi har inte tittat på hittills är
som funktionspekare.
Nu är en funktion pekare bara adressen till en offentlig
funktion, men likt -
son till en -