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 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? Ä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 -