[MUSIK SPELA] ALLISON Buchholtz-AU: Hej alla. Välkommen till din första officiell CS50 avsnitt. Som du kan se detta är avsnitt CS50-liknande, bara att dra upp vår agenda för idag. Så, vem är jag, som jag är säker ni alla undrar. Jag är din TF. Jag är inte bara en slumpmässig elev vem personifierar din TF. Och jag kommer att gå igenom slags ha sektioner kommer att flöda, förväntningar vi har, resurser, så vidare och så vidare. Vi kommer att prata om arrayer, ASCII funktioner, kommandoradsargument, och det är inte här, men Jag kommer också att hjälpa du slags tänka igenom nästa pset för denna vecka. Som jag är säker på att ni alla uppskattar. Så först question-- vem är jag, förutom din sprudlande TF här. Jag är Alison Buchholtz-Au. Detta är mitt andra år TFing CS50. Jag också TF CS51 under våren. Du kan se igen det om du väljer att ta den. Jag är också en PAF, så alla Freshmen-- och om du inte är en nybörjare, Detta är mitt tredje år som rådgivning karl. Jag är mycket väl insatt i ge dig råd om livet och kurser inom CS och inte inom CS. Jag är en datavetenskap Concentrator. Jag är en senior i Adams House, bästa hus. Och innan jag bytte till CS mitt andra Spring, Jag var faktiskt en medicintekniker. Jag hade tänkt att gå till Med skolan. Jag skulle bli en traumakirurg. Och det har helt förändrats sedan jag tog CS50. Jag tog naturligtvis min Sophomore Fall. Det var min första introduktion till CS någonsin. Jag var en av de 78% av er som hade noll erfarenhet kommer in, och det helt förändrat mitt liv. Och nu jobbar jag på Microsoft, och din vackra TF. Och CS50 är förmodligen en av de bästa upplevelserna som jag har haft här på Harvard-- både ta klassen och att kunna hjälpa lära eleverna som du. Så jag är verkligen glada att ni är alla här. Om du kom in sent, det finns godis, som du bör känna fri att komma greppa, eller skicka någon annan att ta tag i det för dig. det är OK. Jag vill inte äta det. Mitt rum har tillräckligt choklad, så y'all bör försöka avsluta det. Jag vet att det finns 100 stycken, men liksom, 04:00 på en måndag, Jag tror att alla kan använda lite socker. Så alla ni som är officiellt i mitt avsnitt borde ha fått ett e-postmeddelande från mig med mitt telefonnummer, email address-- gärna lägga mig på Gchat, gärna lägga mig på Facebook, och även för resten av er, Du kan maila mig här. Det finns två H s. Alla alltid gör som två L's eller två C: s. Två H-tal i efternamnet. Annars det kommer att studsa, och Jag kommer inte att få din e-post. Så tveka inte att maila mig, att kontakta mig när som helst. Jag får inte komma tillbaka till dig inom 24 minuter, men jag lovar att komma tillbaka till dig inom 24 timmar. Om du kallar mig en halvtimme innan din pset beror, att du är något liknande, Jag har ingen aning om vad jag gör Allison. Hjälp mig. Jag kommer att lugna ner dig, men vid slutet av dagen, om du ringer mig en halvtimme innan din pset beror med någonting skrivet, Jag kommer att vara som, ja, kanske det är dags att använda den sena dagen. Så jag kommer att svara på alla dina förfrågningar på ett mycket lämpligt sätt. Min telefon är oftast fäst vid mina händer. Jag svarar oftast mycket snabbare än 24 timmar, men jag kan bara garanti en 24 timmars reaktion. Okej. Så varför är vi här? Dessutom, om du har frågor på helst, låt mig veta. Jag pratar mycket. Jag pratar fort, men snälla tveka inte att avbryta mig. Det ger mig andrum också. Så sektioner är en tid för oss att egentligen bara dyka in, få lite praktisk erfarenhet, till gå igenom frågor som vi nämnde i klassen eller läromedel som Vi rekommenderar att ni på nätet. Och vi ska faktiskt gå igenom vissa av dessa resurser i en bit. Så några anteckningar om supportavdelning. CS50-- en av sakerna som gör det en av mina favorit klasser är känslan av att du är aldrig ensam. Vi har en personalstyrka på över 100 människor som är här för att hjälpa dig. Vi har kontorstid Måndag till torsdag. Så det finns så många människor som älskar klassen lika mycket som jag gör och vem är verkligen här för att de vill vara här. De flesta av oss är studenter, och detta är som en femte klass utöver till resten av vårt arbete. Och det är en hel del arbete, men Vi gör det för att vi älskar det, och vi älskar verkligen att lära dig och hjälpa till att dela vår spänning för detta ämne och denna klass. Så ta fördel. Kom och prata med oss. Jag blir ensam när mina elever inte prata med mig, så om du vill, kommer umgås med mig. Det kommer att vara stor. Så avsnitt är naturligtvis en av dina största saker. Vi ska gå igenom saker att du lärt dig i föreläsning, göra några korta exempel när vi har tid, och i allmänhet typen av få en uppfattning om saker du bör tänka om för din problembild. Shorts-- hur många som faktiskt såg videon från scratch kort? Någon känner igen mig? Så de är mycket bra. Du bör definitivt titta på dessa. Mycket arbete har lagts ned på dem. Och de är bara tänkt att vara bite-storlek bitar för dig att bara titta för tre eller fyra minuter och få en bättre förståelse av ett begrepp. Gå throughs-- hur många människor har sett de genomgångar för tidigare? Zamyla är fantastiskt, eller hur? Precis, jag önskar att jag vore Zamyla ibland. Så definitivt använda dina genomgångar. Hon kommer att dela upp det i liten, bite-storlek bitar. Och när du har dessa enorma specifikationer från dina problemsamlingar, det kommer att bli riktigt viktigt att kunna bara hitta någonstans att starta och arbeta långsamt genom den. Okej, har vi också Study50, vilket är study50.harvard.edu, tror jag. Du kan bara Google studera, och det kommer att komma upp. Detta är en av de bästa resurser vi har. Det är Powerpoints med noter och öva problem för dig med lösningar som du kan faktiskt gå igenom. Så om du någonsin vill ha mer praktik, mer än vi gör i sektioner eller fler än dina problemsamlingar, detta verkligen en plats jag dig att gå. Den byggdes förra sommaren genom några av mina riktigt goda vänner. Och det är fantastiskt. Faktum är att en hel del av bilderna att jag kommer att använda för avsnitt kommer från Study50. Så mycket av TF: er använda den. Och slutligen, som jag nämnda, kontorstid. Om du har problem med med läxor, du är har problem med en koncept, kom till kontorstid. Gå tidigt i veckan om du kan. Ut till quad, eftersom det är typ av långt. Ingen tycker om att gå ut där. Men det är till din fördel, för då är du kommer att ha alla dessa TF, [OHÖRBAR] omger dig. Och särskilt nu, bara ett tips, torsdagar är väldigt chill just nu i Mather eftersom dina psets beror på torsdagar. Och vetande vill använda dina sena dagar än. Så om du har problem med begreppen, det finns massor av TF: er som är där för att hjälpa dig. Så kom ut till Mather på torsdagen. Om du vill se mig, Jag kommer att vara där. Jag vanligtvis gör min egen hemläxa, eftersom ingen vill min hjälp. Så kom och se oss. Träffa oss på halva vägen. Så hur många har deltagit föreläsning eller sett det på nätet? Hur många människor gick till super avsnittet förra veckan? Cool. Det är faktiskt en hel del. Hur många av er har läst din spec för denna vecka, för ditt pset? Ooh, jag är stolt över er! Mer godis för y'all. Bra, så vad vi menar "Möta oss halvvägs," är det avsnittet är egentligen bara kommer att bli super bra för dig om du kommer i att ha läst ditt specifikation för din pset. För när jag går igenom en översikt saker du bör hålla utkik efter, det kommer inte att göra så mycket meningsfullt om du vet inte vad ditt problem inställd kommer att be er att göra. Om du inte kommer till avsnittet, uppenbarligen Jag kan inte vara så användbart för dig. Jag tänker inte ta det personligt om du behöver inte komma till min avdelning just nu, men definitivt du borde. Om du inte kan, titta på dem på nätet. De är där av en anledning. Mine kommer att vara där. Som du märker, vi spelas in, så det ska bli rätt för er. Vad bra, kommer att lectures-- det är självklart där du får det start av ditt material här. Så jag kommer definitivt försöka och hjälpa dig så mycket jag kan, men jag kan bara träffa dig så här långt. Du måste slags möta oss halvvägs där. Grading-- så, alla ni som fick ett mail från mig, du är min officiella sektionen. Jag kommer att klassificera dina psets. Och jag vill bara säga en sak som du verkligen bör vara uppmärksamma på är kommentarerna. Kommentarerna är ofta mer användbar än den faktiska poängen vi dig. Och kommentarerna är faktiskt där jag tillbringar mycket av min tid när jag är betygssättning. Så jag skulle uppskatta det om du läser dem. Och de är faktiskt hur du ska att lära sig mer om design och stil och saker som är en lite mindre snitt och torr. Så egentligen uppmärksamma dessa synpunkter. Om du har frågor om dem, eller frågor om din poäng, kom gärna och prata med mig antingen före avsnitt, Jag kommer förmodligen att umgås i lobbyn, eller efteråt. Om du vill schemalägga en-mot-en möten om hur du kan hjälpa till att förbättra senare problemsamlingar, så låt mig veta. Och sedan bara ett par tips för er killar. Så en av de största saker Jag har alltid understryka att min avdelning När du lär dig hur koden är att skriva ut saker på papper först. Om du har en spelplan för där koden måste gå och vad den behöver för att gör och det är uppdelat i små bitar av pseudokod kod du har skrivit ut, du kommer att bli mindre sannolikt att göra syntaxfel eller skapa en if loop som har inte en annan. Om du vet var du är kommer totalt sett, du är mindre benägna att göra dessa små misstag som ibland tar dig timmar att fixa, eftersom du är som, där jag saknar detta fäste? Alltså, använd Style50. Speciellt när du är gå till kontorstid, Om din kod är allt kopplas över till en sida, Det är naturligtvis politik att vi kan säga, fixa det så att det ser ut som Style50 säger det borde, och då hjälper vi dig. Så det kommer att göra ditt liv enklare. Det kommer att göra våra liv enklare. Alla är gladare. Alla får bättre betyg. Är inte det vad vi alla vill? Så skriver ut saker på papper innan du någonsin röra din dator. Talk saker ut på en hög nivå, och se till att du vet vart du ska. Och om du är osäker, sitta ner med någon och gå dem genom steg för steg vad din kod är tänkt att göra. Och nio gånger av 10, kommer du att liksom, åh, jag glömde en if villkor eller jag har glömt ett semikolon här eller Jag uppdaterar denna variabel fel. Så de är mina tips för framgång. Så eftersom ungefär hälften av er ser som om du gått super avsnitt, Jag ska bara mycket kortfattat gå igenom öglor, som inte var på vår ursprungliga dagordning. Men de är verkligen viktigt. Och så ska jag typ av hastighet genom dessa innan vi får in våra faktiska avdelning. Innan jag gör det, är det någon questions-- logistiskt, personligen är det något annat du vill ha att veta om mig eller om avsnitt eller klass i allmänhet? Alla bra? OK, cool. Lovely. Så loops-- ni bör alla känner igen dessa bitar från grunden. Så slingor är i princip bara ett sätt för oss att göra något några antal gånger, några upprepade åtgärder på grundval av vissa villkorade. Så vi har tre olika typer. Vi har till slingan, medan, och gör-stund. Så för loops-- vi bara har en mycket allmänna utformningen här av en for-loop. Och det är bra för när du vet hur många gånger något måste utföra. När vi talar om andra loopar, du ska se varför det är en viktig skillnad. Men för slingor är för något set. Du vet att du kan antingen beräkna antalet eller om du vet hur många gånger du vill att detta upprepas i början. Så om du ser här, vi har bara en allmän sort av skelett ram för en for-loop här. Så för-initiering, det är här dina variabler initieras. Med Mario, jag är säker på att ni gjorde något som int jag lika med 0. Det är där som skulle hända i blått. Du har ditt tillstånd, vilket är vad som kontrolleras varje gång. Om detta villkor är sant, då resten av koden körs. Sedan ska det köras igen-- och fråga. Och så har vi uppdatering, där du uppdaterar din variabel. Så, återigen, med som Mario, jag är säker på ni gjorde något som jag plus plus. Så varje gång slingan sprang, jag fick uppdateras så att när vi checkar den mot något villkor, var det förändras. För om du bara har en statisk variabel, om det utför första gången är det bara att köra oändligt. Så du måste se till att du uppdatera din variabel ordentligt. Och vi har också bara en visuell representation där. Alla bra? För slingor. Borde ha sett dessa i ditt pset. Cool. Så här är bara en enkel exempel. Skriv ut detta är CS50! 10 gånger. Och så har vi vår initiering, som vi ser det, med int i är lika med 0, för i är mindre än 10, och jag plus plus. Och det kommer att skrivas ut som 10 gånger. Så medan loops-- medan slingorna är bra när du inte nödvändigtvis måste veta hur många gånger är det kommer att uppdatera i början. Du har bara några tillstånd som är markerad. Och det kan bli något liknande while-- Låt oss ta ett exempel från din pset. Om Mario, du försöker mata in ett negativt tal. Rätt? Du skulle åter uppmana ditt användarnamn. Så du kan säga, ja, om användaren matar in något mindre än noll, åter prompt dem. Och jag är säker på att kan ha varit något som vissa av er används i koden. Så det är en enkel sak. Du har samtidigt, en del villkor som kontrolleras varje gång koden går att utföra. Om det utvärderas till true vi kör den. Annars gör vi inte. Och vad är egentligen important-- något jag tror att David pratade om i lecture-- är hängslen. Oavsett är inom hängslen är vad som exekveras. Om du har glömt dem hängslen, det kommer bara vara linjen direkt efter while avrättades. Så om du har tre saker som är tänkta att hända när detta villkoret utvärderas till true, och du inte har dessa hängslen, bara det första som kommer att hända. Så var mycket medvetna om där du sätter dina hängslen. Om du håller dig med Style50, Detta kommer definitivt att hjälpa dig. Cool. Så det här är en nedräkning från 10 till noll. Och som ni ser här, vi initiera någon disk utanför den. En sak som är annorlunda är vi är inte initierar vår variabel inom vår while-slinga. Det har initierats utanför den. Vi är helt enkelt bara sätta tillstånd för vår tid. Så i detta fall är det samtidigt räkningen är större än noll. Och vi skriva ut vad vår räkna är, och sedan stega vi vår variabel. Och det är också en annan sak att lägga märke till. Vår uppdatering sker inte inom den första delen av while-slingan. Det kommer att hända inom hängslen, kroppen av din text. Så gör-while loops-- do-while loopar är bra för validering användaren. Så en del av er kanske har använde också detta i din pset. Man kan säga, göra, som, uppmana användaren för inmatning. Och sedan när du, typ, ingång är mindre än ett visst antal. Så för en explicit fallet med Mario, det skulle göra printf anger ett heltal, och sedan några heltal lika getInt. Och då ska faktiskt exekvera den koden först. Du kommer faktiskt att ha någon form av heltal. Och då kan man säga, medan som heltal är mindre än noll. Så vad det kommer att göra är att det är kommer att utföra åtminstone en gång. Det kommer att kontrollera tillståndet. Om villkoret är sant, det ska köras igen. Så gör-while loopar är bra för validering användaren, eftersom du vet koden kommer att utföra åtminstone en gång, medan med medan loopar, du är inte garanteras att det är kommer att utföra en gång. Det kommer att kontrollera tillståndet först och sedan bestämmer sig för att köra den, medan en gör-tag kommer köra koden först och sedan kontrollera om du behöver upprepa det. Gör det skillnad vettigt för alla? OK. Cool. Så i detta fall, är denna typ om vad jag pratade om, denna re-anvisningarna tills du få ett positivt tal. Så vi vet att printf "Ange ett positivt tal" och faktiskt ber om att ingång kommer att hända minst en gång. Om användaren är ond och håller anger ett negativt tal, som vet hur många gånger det ska köras. Men den här koden garanteras att utföra åtminstone en gång. Och det är därför det är bra för validering ingång. Och du kommer att använda den en hel del. Okej, några frågor hittills? Vi är alla bra? Pratar jag för fort? Vi är bra? OK. Toppen Så vi kommer att gå vidare och prata om matriser. Cool. Så arrayer finns i princip bara datastrukturer som tillåter oss att lagra saker av samma typ. Så om du någonsin har en matris, är det antingen bara ha ints eller det bara kommer att ha flottörer eller det bara kommer att ha tecken. Du kommer inte att ha en int med en röding med en flottör med en dubbel. En sak. Arrayer är bara en storlek, eller de är bara en typ. Så här har vi en rad storlek tre med tre heltal i den. De kunde flytande men vi är kommer att säga att de är ints. Så en sak att inse är att arrayer är en uppsättning storlek när du initierar dem, och de är inte easily-- eftersom ni alla är mindre bekväm, Du bör bara tänka på dem som att inte kunna sträcka sig i storlek. Men stort du ställer ut arrayen i början, det är storleken det kommer att stanna, eftersom arrayer är kontinuerliga block av minne. Och när ni får in lite mer hur minnet har faktiskt lagt ut på diskar och i högen och stack, Det ska göra lite mer meningsfullt. Men du kan bara tänka på liknande, det är bara en rad av utrymmen på din disk. Och du kan inte garantera att det finns kommer att vara fria utrymmet efter det. Du kan initiera en array tre och sedan kanske du initiera en annan uppsättning av fem senare, och det är rätt efter det. Så om du skulle gå förbi platsen tre i det första uppsättningen, du skulle skriva över något annat. Så arrayer är-- för er, precis tänka på dem som en fast storlek. Så skapar du ett array-- du ska att behöva göra detta en hel del. Så på samma sätt som vi har en allmänna strukturen för vår för loopar, Vi har en fin allmän struktur för vår array. Eftersom de är av en typ, hela element i en array är av en typ, du behöver för att initiera vad den typen är. Så, som ni ser här, vi har en trevlig liten typ fäste uppgifter. Så om vi ska skapa en int array, kommer det att vara int. Om vi ​​skapar en röding array, det blir röding. Om vi ​​skapar en sträng array, det ska vara sträng. Och sedan namnet på din array, vad du vill att det ska vara. Så kanske är det provresultat eller kanske det är studenter eller kanske det är godis. Oavsett vad du väljer att namnge din array, det är vad det ska vara. Och sedan i parentes, du ska har den storlek du vill ha. Så vi lagrar 10 studenter eller Vi lagrar 15 sorters godis? Vad inte. Så i vårt exempel här, vi skapar en array storlek tre, som ni se här till höger. Och när vi först initiera det, allt är inställd på noll. Så det är bara tänkt av som ett oskrivet blad. Vi har alla dessa utrymmen, vi har alla dessa rutor vi kunde sätta våra data i, men de är bara tomt för tillfället. Så om vi vill faktiskt tilldela dem dessa värden, Vi gör så rätt under här visar. Så du har vad namnet på din array är och vad index du vill. Så indexet hänvisar bara till, ut, vad slits vi tittar på. Och en viktig sak att lägga märke till är att arrayer är nollindexerade. Så om vi vill det första utrymmet i minnet av vår samling, det kommer att vara noll. Om vi ​​vill ha det andra, det ska vara en. Om vi ​​vill ha den tredje, det ska vara två. Så vidare och så vidare. Vilket också är anledningen till, konventionellt, När vi gör för loops-- jag är säker ni undrar, varför ska vi börja vid 0 mot 1? Och det beror på att när vi övergången till att använda arrayer, kartor det på rätt sätt. Så om du vill iterera i en array, det gör mycket mer meningsfullt att gör jag lika med 0, eftersom vi vet att kommer att motsvara till den första platsen i minnet. Alla bra med det? Cool. Och sedan på botten här är bara ett annat sätt att initiera en array. Du har fortfarande din datatyp och namnet, men i stället för att faktiskt sätta en storlek där, Du kan bara göra tomma fästen. Och sedan med dessa lockigt hängslen vid botten, Du kan bara mata in data som du vill separeras med kommatecken. Och det automatiskt säger, OK, jag ser att du har tre saker i dessa hängslen. Så jag vet att jag måste avsätta tre block av minne och sedan lagra dem. Så den första versionen som du kan använda Om du frågar din användar att mata värden så att du kan iterera igenom arrayen och ask-- få lite int att mata dem. Om du vet värdena på förhand, det gör mycket mer känsla att använda den andra vägen. Men i de flesta fall kan du inte vet vad dessa värden kommer att bli. Cool. Fler frågor? Okej. Så åtkomst elements-- så en av de bästa sakerna med arrayer är att de är slumpmässiga tillträde, vilket innebär att du behöver inte titta igenom varje block. Om du vet att du vill vad som finns i blocket två, Du kan bara säga, ge mig blocket två. Och det är därför dessa index är så viktiga, och det är hur vi faktiskt åt dem. Så i detta fall, som vi såg tidigare när vi tilldela värden, i den ena tidigare hade vi namn och index som vi ville komma åt, eller hur? Så på samma sätt, det är allt vi göra för att verkligen dra dessa data ut. Vi har namn och vi har det index som vi vill ha. Så i detta fall, för loop här nere på botten, någon vet vad den gör, vad det skulle skriva ut? Mmhmm? Exakt. Så ja, det är bara att iterera igenom. i är lika med zero-- vi kan gå igenom koden bara snabbt. i är lika med noll, i är mindre än tre på denna punkt, eller hur? Så det stämmer. Och vi säger, OK, skriv ut f vad är temperaturen i. i är noll just här när vi först iterera, så vi går till denna första plats, och vi säger, OK, är 65 nummer vi vill skriva ut. Så det kommer att skriva ut 65 och gör sedan en ny rad. Jag kommer att uppdatera, så det skrivs 87. Den uppdaterar igen, och det kommer att skriva ut 30. Alla coolt? Grymt. Okej. Så här är typ av en jag sa hur du kan hålla reda på någons poäng och varför du skulle använda den första sätt initierade den i stället för det andra sättet. Och detta bara går igenom. Och märker att vi har en klasstorlek på 30. Och vi initierar detta array med ints som är av storlek 30. Och då är vi iteration igenom och vi är ber användaren att mata in poängen för var och en av dessa och sedan koppla den till en särskild plats i minnet någonstans i denna matris. Cool? Betyder det vettigt för alla? Mmhmm? Så hashtag definiera klasstorlek 30 är ett direktiv preprocessor, vilket bara innebär att det gets-- den har att göra som sammanställningen processen. Du kan tänka på det som en global variabel. Hur vi gör det är typically-- det gör att din kod För att vara mer lätt ändras. Så låt oss säga att vår klasstorlek plötsligt blir 30-15, om jag inte hade definierat det här sättet, skulle jag måste gå igenom min hela programmet och ändra alla förekomster av 30-15. Men med detta, får jag ändra en plats, och allt annat förändras. Om du någonsin vill göra en hash definiera i ett fall där du håller koll på vissa ange antal poäng för en klass eller om du använder ett nummer som kommer att användas, liksom, under en mycket lång program, är det bättre att definiera det i början så att om någonsin den ändras, får du att ändra en plats i stället för 100. Ja? STUDENT: Mellan göra det och bara förklara [OHÖRBAR] över upptill. ALLISON Buchholtz-AU: Så det har att göra med efficient-- det är typ av utanför vad vi kan täcka i detta avsnitt. Det har att göra mer med effektivitet och hur det faktiskt arbeta i sammanställningen processen. Om du verkligen vill veta om det, jag är glad att skicka dig ett mail med resurser om det. Hash definiera tenderar att vara föredragna för saker. Och som du koda mer, du typ av lära sig nyanserna om när du ska använda en global kontra hash definiera. Men för närvarande, du behöver verkligen inte bry dig om det är att det korta svaret. Alla bra med det? Och även om du vill att använda en hash definiera, det är verkligen viktigt att notera att namnet ska skrivas med stora bokstäver. Vi är inte bara göra Klasstorlek vara dramatisk. Det borde egentligen skrivas med stora bokstäver. Cool. Något annat där? Vi är bra? Lovely. Välkommen. OK, så jag vill att ni ska ta en titt på detta och se om du kan hitta felet. Jag ska ge er en ledtråd. Det är någonstans i det för-slinga. Mmhmm? STUDENT: Bör vara mindre än lika med 2. ALLISON: Så det kan vara mindre än eller lika med 2, eller det kan vara mindre än 3. Och vad är motiveringen till det? STUDENTEN Den [OHÖRBAR], 0, 1, 2. ALLISON: Exakt. Så i en matris av storlek n, vi endast har indexen n minus ett. Cool. Och då kan vi få riktigt galen och få flerdimensionella arrayer. Ett av problemen när jag tog den i min år krävs flerdimensionella arrayer, och jag tror att en av dem kan kräva det här året, så var bekväm. Wrap huvudet runt det nu. Det kommer att komma tillbaka för att hemsöka dig, men på ett coolt sätt. Så du kan egentligen bara tänka av flerdimensionella arrayer som arrayer av arrayer. Så du kan sorts tänka på detta toppen ror som första bit av minnet. Och här är den andra bit av minnet, och den sista raden är den tredje bit av minnet. Och inom det, det finns en matris. Men naturligtvis är det lättare att skildra så här. Så du initierar det på samma sätt. Detta är ett tecken Styrelsen för tre och tre. Så du har tre rader och tre kolumner. Vi företräder det här sättet. Och du vill komma åt det samma sätt kolumn för rad. Och så 1,1 som vi ser här. Vi utser en nolla, noll uppe. 2,0 och 0,2. Så du vill bara komma åt them-- om någon någonsin gjort linjär algebra, på samma sätt som du komma åt ett element i en matrice, det är samma idé här. Så du kan relatera det tillbaka till matte. Du behöver inte oroa sig alltför mycket om detta just nu. Det är bra att ha exponering, att veta att du kan göra det. Du kan skapa en del galen number-- du kan skapa galna arrayer är allt jag kommer att säga. [OHÖRBAR] Det blir lite galen, men det är riktigt coolt. Grymt. Och sedan, så vi har ett exempel här. Den beräknar en stränglängd. Så hur många människor visste att de strängar som du använder är bara kedjor av tecken? OK, ja. Så ni kanske tror att du inte har begagnade arrayer innan, men helst du använda getString i CSView bibliotek, du är egentligen bara ber om en array av tecken. Och vi tar hand om alla att i back-end för dig. Men du har använt arrayer sedan du startade. Du bara inte vet det än. Och när du har en karaktär array eller en matris som är lagring av en sträng, det sista är alltid vad som är kallas en null terminator, som är det här. Och det är vid slutet av varje ord som du vill lagra. Så om vi vill ta reda på längden på en sträng, kan vi säga, ja, du vet, den Innehållet i detta block är inte lika med vår null terminator. Det betyder att det inte finns några karaktär där som vi faktiskt bryr sig om det är en del av ordet. Du ökar din längd. Och sedan när vi faktiskt får i slutet av ordet, kommer den att gälla och det ska tillbaka vår längd för oss. Mmhmm? STUDENT: Har utrymme räknas som noll terminator? ALLISON: Så en plats är inte ett null terminator. Så om du har multiple-- ett utrymme är faktiskt en specifik ASCII-värde. STUDENT: Vad är utrops lika igen? ALLISON: Så, är detta vad du hänvisar till. Om du någonsin hör mig i kontorstid, Jag alltid kallar det, som, lika bang. Så bang är det inte. Så detta är inte lika. Så om du försöker se om något är falskt, du vet alltid gör, bang helst variabeln är, och om det är falskt, det utvärderas till true och du kan göra coola saker med det. Mer om det senare. Cool. Allt bra där? Grymt. Så nu är det dina killar "tid till fungerar, eftersom jag har pratat. Så jag vill att du bara skapa en array med heltalen ett, två och tre, och sedan låta trycka ut. Du behöver inte göra, typ, viktigaste, bla, bla, bla, vad som helst. Jag vill bara att du ska initiera arrayen och sedan skapa en for-loop för att skriva ut dem out-- eller en while-slinga, upp till dig. Jag ska bara ge er ett par minuter för att arbeta med det. Jag ska vila min röst. Om du har några frågor, jag är glad att komma runt och prata med er. Känn dig fri att prata med varandra. Få mer godis. Faktum är att jag ska bara gå runt med godis. Hur är det? Vill du ha något? Någon annan i det här rummet vill ha godis? Du kan också ta mer än en, grabbar. Ta en handfull om man vill. Maj också. Alla andra bra? OK. Dessutom kommer jag att skapa en anonym Google Form, och ni kan bara skicka återkoppling efter varje avsnitt om det är något du vill förbättra eller något du vill ha gjort. Om jag är lite för sprallig för dig, kan jag tona ner det. Jag ska skapar det och skicka det ut till er alla efteråt. Okej. Så låt oss börja i liten skala. Hur skulle vi initiera vår array? Vad är det för typ av vår array? En int, eller hur? OK, så vad vill du att ringa din array? Int array, cool. Okej, så vi har int int array lika, och vad har vi efter det? STUDENTEN [OHÖRBAR] parentes. ALLISON: Hängslen. Och sedan innanför hängslen? Ett kommatecken två kommatecken tre. Cool. Så det är okej. Så nu har vi vår for-loop. Så i den första delen av vår för loop, vad har vi? Elev: Jag är lika med 0? ALLISON: Så int jag lika med 0, och vad är vårt tillstånd? Vad jag kommer att vara mindre än? Mindre än tre, och hur vi uppdaterar vi i? Jag plus plus, uppdatera den med ett. Och sen ska vi ha några printf av heltal, och vad är det sista del som faktiskt ska säga vad vi ska skriva ut? Det skulle vara namnet på den array, vilket är int array, eller hur? Och vad är i fästena för int array? i. [? Så jag?] Ringde min exempel, men det du gå. Inte så illa. Alla bra? Cool. Så vi är klara med matriser. Grattis. Ni lyckades iterera genom alla the-- ja? STUDENTEN [OHÖRBAR] ALLISON: Ja. STUDENT: Jag har en fråga. Ska man indrag hängslen? ALLISON: Så hängslen ska ligga med for-slingan, och sedan allt innanför hängslen ska vara indragen. STUDENT: OK, bör det för loop vara indragen? ALLISON: Den för slingan inte måste vara indragen vid denna punkt. Om du var i main, om vi faktiskt hade en huvuduppgift här, det skulle vara indragen från main. Men i detta fall, det är bra. Ja, fråga. STUDENT: Har du behöver ha konsolerna efter exempel? ALLISON: Ja, om du är initiering det på det sättet. Så kom ihåg, detta är den andra sätt för initialisering av en array där vi har hängslen och sedan våra faktiska uppgifter separerade med komma inom. STUDENT: Jag trodde fanns fästen för det exemplet. ALLISON: Nej, de är tandställning. De är hängslen. Om du initierade den det andra sättet, det är hängslen. Om vi ​​skulle säga, int example-- om Vi ville bara en tom array för ints, det skulle vara int exempel konsoler tre. Konsolerna representerar storleken. När du har tandställning, det är de faktiska uppgifter du lägger in det på det här sättet. Vi kan bläddra tillbaka riktigt snabbt. Så i den här, det är bara vår initial array, initiering. Och här är vi individuellt tilldela fläckar på dem, så detta representerar index för vår array, vilket är varför vi har konsoler. Men här, om du märker, vi har lämnat våra konsoler utan en storlek, och vi initiera den med faktiska data all-in-one med hängslen. STUDENT: Så varför har vi inte fästen i detta exempel? ALLISON: Så, i vilken del? STUDENT: Skulle inte vi säg, int exempel fästen lika med hängslen [OHÖRBAR] parentes till exempel. ALLISON: Åh, förlåt. Du har rätt. Vi har fästen där. Sorry guys, min dåliga. Ja, ska du ha parentes efter exempel. Du har helt rätt. STUDENTEN [OHÖRBAR] att inte göra det. ALLISON: Nej, du måste ha parentes, eftersom det annars finns inte kommer att deklarera en array. STUDENTEN [OHÖRBAR]. Ledsen för det. ALLISON: Tyvärr behöver du parentes efter exempel. Stavfel. God fångst, guldstjärna till dig. Dessutom, om du ställer en fråga, om ni skulle bara berätta ditt namn, Jag skulle älska det. Jag skulle älska att kunna vet alla dina namn. Jag tänker inte kalla ringa dig, jag faktiskt vill bara vill veta ditt namn. Så snälla faktiskt berätta ditt namn. LEAH: Leah. ALLISON: Leah. OK, så functions-- jag vet i korthet De pratade om detta under föreläsningen. Så fungerar är liksom bara som dessa små bite-storlek saker där du passerar i insatsmaterial, något som magiska händer, och du får resultat. Cool. Så du faktiskt använt en många av dessa redan. Få int, få sträng, skriv ut f. Dessa är alla funktioner där du bara kalla dem, det finns massor av magiska saker pågår i bakgrunden att du inte nödvändigtvis ser, och du får ut vad du vill. Eller åtminstone få dig vad du hoppas att du vill. Och i grund och botten den grad av funktioner, och en av de huvudteman CS, är att bryta din kod i hanterbara bitar. När du börjar skriva dessa riktigt långa program, eller i Scratch när du hade denna storslagna idé för ett spel, du behöver för att kunna bryta den ner till, liksom, OK, hur ska jag börja? Vilka är de små bitar som jag behöver? Åh, jag måste be användaren för något. Nu måste jag skriva ut något. Åh, jag måste beräkna detta värde. Och lära sig att bryta upp din kod och de stora problem som du har in i dessa små bitar och skapa funktioner är faktiskt ett av de stora hörnstenarna i CS. Så du kan tänka dig en funktion på samma sätt som som en svart låda, en magisk svart låda, att du sätter saker i och du får lite utgång. Och resten av programmet behöver inte nödvändigtvis vet vad som händer inom den svarta lådan. Allt som bryr sig om är vad går in och vad som kommer ut. Cool. Så varför fungerar? Organization-- som sagt, när du är hantera mycket stora kod baser, hur du organiserar din kod kommer att vara mycket enklare om du använder funktionerna. Eftersom du kommer att kunna att vara, som, OK, detta är vad den här funktionen gör och Här är vad en annan gör. Och du kan lätt se hur de alla hänger ihop. Så bryter upp den i allt dessa hanterbara underdelar. Så simplification-- Jag är säker på att ni allt såg detta, som sagt, med Scratch. Du har denna stora idé, och du är som, hur fungerar allt detta arbete? Men om du närmar dig det bit för bit, säger du, OK, hur gör jag en sprite flyta över skärmen? Det är lite lättare. Så bra användning av funktions fabrikat koden mycket lättare att läsa. Det gör det lättare att felsöka vilken som du får in din senare problemsamlingar, du kommer att verkligen vill kunna göra. Och de är också lättare att utforma och genomföra. Du kan koda upp en liten fungera relativt snabbt och se till att det fungerar kontra försöka att skapa denna hela långa programmet och sedan typ av gå igenom och se vad som fungerar och vad som inte. Och sedan återanvändbarhet. Så fungerar endast behöver som ska skrivas en gång, och sedan kan du använda dem så många gånger som möjligt. Så det är, liksom, miljövänlig i en mening. Om du hade saker som print f, där man var tvungen att skriva ut det magiska som går bakom ut f varenda gång du ville skriva ut något, du skulle vara ganska trött på det vid slutet. En av de saker som du kommer lära sig i senare CS klasser, eller en av de bästa råd jag får är, om du kopierar och klistrar in kod, bör det förmodligen vara en funktion. Om du har exakt samma linjer alla i hela din kod, om du räknade ut dem, din kod skulle förmodligen vara, typ, fem gånger kortare och vara mycket mer lättläst. Och istället för att försöka felsöka alla dessa olika platser där saker kan gå fel, du har en funktion att du får felsöka. Och jag lovar, en hel del av detta kan tyckas slags abstrakt nu, men när du kommer in senare och senare problem ställer, det ska göra mycket mer känsla och verkligen drivas hem. Finns det några frågor om funktioner hittills? Varför vi använder dem? Jag vet att vi har inte fått till Nitty Gritty än. Så definierar en function-- precis som arrayer, vi behöver någon form of-- här är bara den allmänna utgången. Så det här är en funktion som är bara att kub lite input. Och på nästa sida, faktiskt, vi har alla dessa awesome små saker här. Så kan alla läsa att, av nyfikenhet? Jag vet att lila och svart kan vara lite svårt. Men stora saker att veta-- så den första en här är vår returtyp. Så det här talar om utgången av denna funktion när, i detta fall, vi lägger i vissa nummer, vad vi är få är att antalet kubik. Så det borde vara en int i detta fall. Kanske skulle det vara en dubbel eller något annat senare, men i detta fall, det är en int. Med c behöver du alltid en returtyp. Det blir en int. Det blir en flottör. Det blir en dubbel. Men du måste specificera vad Denna funktion kommer att återvända. Annars kommer det att skrika på dig, och det kommer inte att kompilera. Du kommer att vara ledsen, och jag ska vara ledsen. Och det är inte bra. OK. Och så har vi vår funktionsnamn. Och som ni kan se här, med c finns det här mycket konsekvent paradigm. Vad är din typ, vad heter, och lite annan sak i slutet. Så vi har vår returtypen, vår funktionsnamn, och sedan vi har vår header med vår parameterlista. Så parameterlistan är, vad som är denna funktion kommer att ta in? En parameterlista är helt enkelt en synonym för, vad är våra ingångar? Och på samma sätt som vi måste definiera vår funktion och ge det en återgång typ, var och en av våra insatsvaror måste ha en typ associerad med den. Så vi vet vad vår funktion kan faktiskt jobba med. Så i detta fall, har vi några int input. Så återigen, det blir typ och vad du kallar det. Och sedan, när du ser Här har vi vår kropp. Så vi har några int utgång, att är bara våra insatstider själv gånger själv, som bara kuber det. Och sedan återvänder vi denna produktion. Så som ni ser här har vi en int gånger en int gånger en int, så den returnerar en int, som har förklarats där. Så allt är sammanhängande. Allting är lycklig. Din funktion kommer att köras. Och detta är bara den allmänna sak. Så alltid ha returtypen, namn, och din parameterlista. Varje sak i ditt parameterlistan, eller input, måste ha en typ associerad med den. Och då har du din kropp här med vad du vill göra med din input. Och då är det uppenbart att du vill returnera något. Ibland fungerar kommer bara tillbaka. De egentligen inte tillbaka något för dig att använda. Men du måste gå tillbaka på något sätt. Och när du gör egna funktioner, Vi kan komma in i det lite djupare. Personligen, om du vill, det finns en hel del olika saker du kan göra där. Alla bra? Något på denna lista som du vill ha mig att gå över, att du inte förstod? Alla är bra där? Cool. Grymt. OK, så vi sätter allt detta tillsammans nu. Så vi har några int kub-ingång, så Detta är ett komplett program här. Fram till nu, har jag sorts gett dig killar snuttar som kanske att gå i ett program. Vi har precis tittat på funktioner. Men här är ett helt program. Så hur många av er minns Ordet prototyp från föreläsning? Cool. Vi har en. Vad heter du? STEPH: Steph. ALLISON: Steph? OK, awesome. Så, kommer du ihåg vad en prototyp är? STUDENT: Du säger [OHÖRBAR] innan du faktiskt ta itu med det. ALLISON: Minns du varför? STUDENT: Nej. ALLISON: OK. Guldstjärna. Så ja, en prototyp som vi har i förväg, därför att annars, vår kompilator kommer att skrika på oss. Det kommer att säga, OK, vad är denna kub funktion? Precis, du bokstavligen har berättade ingenting om detta. Det är som när du gå in i ett klassrum, och någon är som, finns det en frågesport i dag. Och du är som du aldrig berättade för mig om detta. Jag är inte nöjd med oss. Prototypen är i princip som din kursplan säga, titta. Heads up. Det kommer att bli en frågesport på denna dag. Inte freak out när du kommer till den. Du kommer att bli bra. Så alla prototypen gör är att berätta viktigaste, jag kommer att använda denna funktion. Jag lovar att jag definierar det senare. Inte galen på mig. Bara sammanställa och göra som jag säger till. Så vi har en prototyp där bara för att göra vår kompilator lycklig. Och det är i princip ett löfte om att du har definierat denna funktion senare och att du inte bara ringa detta slumpmässiga sak som det vet inte vad du är kommer att göra. Så i detta fall, har vi stora här. Vi initiera något heltal x. Det är två. Vi kommer att skriva ut vad x är. Vi kommer att kub x. Som ni ser, vi har vår funktionsdeklarationen här nere att vi pratade om tidigare. Det kommer kub x, och sedan, om vi minns, kuben funktionen faktiskt returnerar ett heltal till oss, som lagras ix igen så att vi kan skriva ut ut åtta eller kub x just nu. Betyder det vettigt för alla? Vi är bra? Okej. Grymt. Okej. Hur många av er kom ihåg detta så här är i grunden bara din stapeln och din hög, bara en visualisering av hur minnet lagras här. Så vi vill bara göra Se till att du förstår hur dessa representeras i minnet. Om du ta klasser som CS61 och grejer senare, du får lära dig så här långt mer på djupet, och det är riktigt coolt. Jag rekommenderar den. Men just nu, jag ska ge du den breda översikten så du inte behöver vet Nitty Gritty. Så toppen bara en textsegment som innehåller de faktiska nollor och ettor, den binära för detta. Och detta används för att lagra globala variabler om du har någon. När du flyttar ner, vi har, som ni ser här, initialiseras data oinitialiserad data och sedan högen. Så vi vet inte riktigt prata om högen just nu. Vi kommer till det senare. För nu, jag ska bara våg mina händer och vara som, du behöver inte veta om det här nu. Men vi kommer att prata lite lite om stacken. Så stack är where-- vi zooma in. Detta är faktiskt hur programmet Vi tittade bara på förekommer i minnet. Så vad som händer är, varje När vi kallar en funktion, vi får vad som kallas en stapel ram, som är en av dessa. Så viktiga parametrar. Så de är de saker att vi passerar in main. Så de är här på botten, eftersom det är det första vi kallar. Och sedan får vi huvud s lokalbefolkningen, och när vi säger att, vi menar de lokala variablerna som lagras i main. Så lokalbefolkningen här skulle vara, typ, x är lika med två i detta fall. Därför att det är lokaliserad till huvud. Har alla minns omfattning, gå över det i föreläsning? OK. Så, bara de variabler som initieras inom main. Så det är därför vi har huvud [? sång. ?] Och sedan inom huvud, kallar vi kub. Rätt? Så vi får en annan ram med kub parametrar. Så i detta fall, kubens parametrar är nu x som vi passerade, de två som vi passerade. Och sedan kubens lokalbefolkningen, som är där själva cubing händer. Och sedan återvänder. Så vad som händer är som kub faktiskt gör vad den ska göra, returneras. När den återvänder, denna ram blad, och återvände ner till main. Och sedan inom huvud, vi kan faktiskt skriva ut den. Så när du återvänder något, när funktionen returnerar, det är som att förmedla dessa värden till ramen under det och sedan lämnar. Och saker måste utföra för. Och när du kommer till större program, vi kan göra svalare och mer komplicerad diagram. Men för tillfället är det här bara en allmän översikt så du har typ av en förståelse av vad händer när du ringer en funktion och hur det faktiskt ser ut i minnet. Cool? Alla bra? Grymt. Så detta är ett som är försöker bara byta saker. Som vi ser här, vi har vår funktion prototyp så att vår kompilatorn inte skrika åt oss. Vi har en del stora, och vi vill byta x och y. De har inte gjort denna demo i föreläsning ännu, de har? De har inte? OK. Så vi kommer att gå över detta mycket kort. Du får in detta exempel mer på djupet, tror jag, den här veckan. Och sedan nästa vecka kan vi verkligen dyka in i varför det inte fungerar. Så vi har detta tomrum Funktionen här-- swap. Så void betyder bara att ingenting returneras. Och vi har swap int a och int f. Och vi har några tillfälliga variabel som är en. en blir tilldelad till b, och sedan b får tilldelas till temp så att A och B: s värden stängs nu. Men, plot twist, det fungerar inte. Och en del av det faktiskt har att göra med det faktum att en och b här, de som blir passerade i här, är faktiskt kopior av x och y. Så när funktionen faktiskt återvänder, den växlar kopiorna, men inte den verkliga x och y s. Så ett sätt att tänka på det är that-- låtsas dessa är swap. OK? Så i huvudsak har vi x och y initieras. Men när vi faktiskt gå upp dessa ramar med swap, vi passerar värdena över till det, och de är initierad. Och de alltid bara bor här. Så a och b bor här. Och de får bytte. Men när vi kommer tillbaka, det gör vi inte göra något med a och b. en b ledighet med vår funktion. Och så x och y förbli densamma. Du får mer in hur man rättar till det och hur vi faktiskt hantera det senare. Men det är bara en sak att sorts tänka. Använd den för framtiden. Oroa dig inte om det inte gjorde all känsla i världen. De är kopior är den största sak. Om du ska ta något bort från det, du gick på kopior. Så originalen förbli densamma. Alla bra? Cool. Så kommandoradsargument. Jag är säker på i början ni alla hade dessa stora, liksom, int main håligheter. Och du är som, OK cool. Jag bryr mig egentligen inte. Detta är precis vad jag har att skriva. Men i ditt nya program, särskilt i denna pset, och varför är det krita på marken? Med din nästa pset, du kommer att få se detta. Int main, int arg c, sträng båge v, konsoler. Så från det vi just lärt sig idag, vad tror vi att andra parameter eller det andra elementet är här? Det är en matris. Vilken typ av array? String array, ja. Cool. Så det är hur du ska att förklara dessa nu. Kommer någon ihåg vad dessa står för? Nej? Hmm? STUDENTEN arg c. ALLISON: Så arg c håller en räknare. Det är en int. Det är ett nummer, eller hur? Så vad tror du att antalet är för? Yeah. Så arg c är antalet strängar som utgör kommandoraden. Så om vi skulle do-- faktiskt, det finns exempel efter detta, så jag ska inte komma före mig själv. Det är ett antal strängar som bara göra upp din kommandorad. Så när du gör, gillar, dot slash Mario, det är en sträng som gör det. I detta stycke kommer du faktiskt vara matning saker i kommandoraden, som jag är säker på att ni som har läst spec sågen. Så i dessa fall kanske du kommer har två eller tre argument. Det kommer att bli en bra sak att använda. Och sedan arg v, som sagt, är bara en sträng array. Så att faktiskt lagrar vad du matar in i kommandoraden. Så vi har dessa. Du har någon prick snedstreck kopiera infil utfil. Så, om arg c antalet strängar att vi passerar in kommandot linje, vad är vår arg c i detta fall? Tre. Exakt. Så vad är arg v noll? Så vad är det första vi har lagrat? Dot slash kopiera, exakt. Och sedan den andra skulle vara infil. Den tredje skulle vara utfil. Så hur är arg v tre? Det skulle vara noll, eftersom det är I slutet av vår samling, eller hur? Cool. Och sen hur är den sjätte en? Det är lite av en kuggfråga. Ish. Vet vi vad det är? Det är odefinierad. Vi har ingen aning om vad det kunde vara. Det är det som är rätt efter matrisen i minnet, och vi har ingen aning om vad det är. Och det är farligt att röra dem saker, eftersom för allt du vet, det är en del av minnet som du bör inte komma åt eller null. Och det kan göra galna saker. Det kallas över indexering ditt bundna till din array. Gå inte utanför gränserna för din array eller dåliga saker kan hända. Du kommer tillbaka och liksom, lagar i fysik har förstörts eller något. Cool. Betyder det vettigt för alla? Inte så illa. Så nu är alla favorit del, pset översyn. Yay! OK. Så för er som har inte läst pset spec, du gör några riktigt coola saker med kryptografi. Du kommer att skapa en Ceasar Chiffer och en Vigenère Cipher. Du bör definitivt läsa spec för att se hur dessa arbeten. Och om du har några problem om vad det egentligen borde göra, kom gärna prata med mig, maila mig eller text mig. Jag är runt. Så det finns tre huvud saker här som vi vill prata about-- bara typ av en förlängning av föreläsning. Saker som du kanske inte vet om, användbara tips och verktyg. Så vi kommer att göra en snabb genomgång av ASCII, eftersom det kommer att bli super viktigt för Vigenère s Cipher. Vi kommer att omvandling av kommandolinjeingångar, vilket kommer att vara till stor hjälp för Caesar Cipher. Och sedan modulo. Cool. Så, ASCII kartor bokstäver till siffror. Detta är en stor diagram. Du bör ha detta bokmärkt någonstans. Du kommer att ha det för ditt första halva tiden. Jag är ganska säker på att alla har det diagram på deras mid-term sheet. Så lär det. Älskar det. Håll det praktiskt. Det kommer att vara användbart. Och allt det är en kodning som mappar alfabetiska, numeriska, och andra tecken på siffror för vår dator. Eftersom naturligtvis, i det slut, allt vi lagrar kommer att bli konverterade ner till ettor och nollor, så vi behöver något sätt att representera text och tecken som vi alla van att se som ett slags tal. Så som vi ser här, vi har versaler A, vilket är rätt där. Det är 65. Och gemener A är 97. Så du kan räkna out-- som jag sa tidigare, om du hade matris med flera strängar, vad var och en av dem har ett null terminator. Det skulle vara ett utrymme. Utrymme har sin egen special-- Jag har glömt var det är här. Ah. 32 är utrymmet. Så allt kartor till den. Så vi har ASCII matte. Pro tip-- i Vigenère s, du kan frestas konvertera dina nummer till heltal, men det är faktiskt bättre praxis att kunna använda karaktärer som denna när du faktiskt manipulera dem. Så om du vill använda siffror, kan du. Men ett bättre sätt eller ett sätt som vi tenderar att vilja att ni killar att göra det, är på detta sätt där du är faktiskt subtrahera tecken. Så jag vill att ni till slags räkna ut dessa. Varför inte prova alla andra? Så gör det första en, den tredje och femte. Eftersom jag vill vara säker på att vi talar om allt vi behöver prata om. Jag kommer bara att säga, en av de viktiga saker att-- oh vänta, ni har inte sett det här. OK så gör de tre första. Låt oss göra det. Eftersom vi har att prata om modulo. Jag vet. Math är hård. Du kan använda en miniräknare. Det är OK. Eller dra upp en ASCII tabellen eftersom du förmodligen kommer att vilja det. Cool. Så jag kommer att snabbt gå ni genom dessa. Så folk har ASCII tabeller drog upp? Vilken är vår numeriska nummer för gemener A? STUDENTEN Seven. ALLISON: Så gemener A är 97 och versaler A är 65 år. Så 97 minus 65? PUBLIK: 32? ALLISON: 62, ja. Så i detta fall, vad skulle skriva ut? Den första? Om vi ​​har procent d, vad skulle det tyda på? STUDENT: Ett nummer. ALLISON: Vi skriver ut ut ett faktiskt antal. Så vi faktiskt kommer att skriva ut 32 här. Och om detta var procent c, 32 skulle ge oss ett utrymme. Så förstå att tecken kan skrivas både som tal och som de faktiska tecken är verkligen viktigt, och betala uppmärksamma de faktiska typer att vi gör här. Cool. Så för varannan en av dessa, Vad ska vi skriva ut? STUDENT: En karaktär. ALLISON: Ett tecken. Cool. Så om ni vill veta, du kan arbeta dessa ut på egen hand. Om du har problem, maila mig. Men den andra kommer skriva ut ett gement b. Den tredje kommer att skriva ut en versaler B. Den fjärde kommer att skriva ut ett versalt C, och sista kommer att vara ett gement A. Och den sista en-- vi faktiskt kommer att komma in i vad den galna procent Tecknet innebär även i ett par bilder. Så prova dem på egen hand. Om du har problem, kom gärna och prata med mig. Om du är normalt i Adams D hall, du kommer förmodligen hitta mig runt. Så, atoi. Hur många av er har sett detta funktion eller hört talas om det alls? Någon? Cool. Så vad det egentligen står efter är ASCII till heltal. Så vad du kan göra är, med Caesar, för de som läser spec, du kommer att göra punkt snedstreck Caesar när du skriver ditt program, och då du kommer att input några nummer som du vill koda din hemliga budskap med. Men, om vi kommer ihåg, alla våra ingångarna lagras som strängar. Rätt? Vi har en arg v array det är allt typ sträng. Så om du bara försöker dra att en, skulle det tror att det ena eller vad numret du använde är faktiskt ett tecken. Så du kommer att få några galna resultat. Så om du verkligen vill göra detta till ett heltal som du kan använda för att manipulera ditt ord eller ditt budskap, du kommer att vilja använda atoi. atoi bara omvandlar din sträng till en int. Så om vi har en sträng av 12, om vi kallar atoi den 12, eller vad den ingången är, det faktiskt kommer att återvända till dig heltal. Inte tecknet eller strängen 12. Vilket, när du startar tillägga att i tal, kommer att vara mycket olika, eftersom strängen 12 är några galna tal i ASCII, men heltalet 12 är faktiskt 12, vilket är vad du vill. Så du vill vara säker på att använda atoi. Du kommer att ha den här i Caesar, eftersom du behöver den int tillhandahålls av användaren på kommandoraden. Men när de uttryckte det i kommandot linje, det lagras som en sträng till att börja med. Är det vettigt? Du behöver inte nödvändigtvis behöver det här för Vigenère. Med Vigenère, som jag sa tidigare, bör du försöka använda ASCII matematik som ser mer ut som detta, där du faktiskt med hjälp av de tecken som vi gett till dig. Cool. Alla bra där? Grymt. Så modulo. Så vad händer om du gett detta enorma antal för Caesar? Du har den här idén att om du är på Z och du är ges ett nummer två, det betyder att du need-- Z blir den andra brev efter sig själv, eller hur? Så du måste på något sätt linda runt, och modulo är sättet att göra det. Så allt det gör är att det ger dig resten av divisionen av den första numret av den andra. Och vi har några exempel på göra det lite mer konkret. Men i grund och botten använder du modulo när du vill göra något linda runt. Så om du bara vill ha den nummer ett till åtta, Du kan använda modulo på någon annan nummer, och det kommer alltid returnera ett tal från noll till åtta. Så vissa examples-- om Vi har 55 modulo 10, det bara ger dig resten av 55 delat med 10, vilket skulle vara 5. Och sedan tre modulo fem, någon gissa vad det skulle vara? Tre. Så om du har ett mindre antal före modulo, kan det inte gå in jämnt. Det är noll. Så det bara returnerar antalet själv. Så åtta modulo åtta skulle vara? STUDENTEN Zero. ALLISON: Zero. Eftersom det går i jämnt. 16 modulo 15? PUBLIK: One. ALLISON: Cool. Och då detta sista är bara visa du-- du kanske undrar, OK, vad är ordningen på verksamheten här? Gör delar vi först? Har vi modulo först? Så modulo håller samma prioritet som division eller multiplikation, och dess vänstra associativ. Så det är på samma sätt. Du skulle alltid göra parenteser, sedan multiplikation, division, och modulo i ordning från vänster till höger. Så standardregler. Bara lägga den i samma kategori som division och multiplikation. Så i detta fall, skulle vi har 1 plus 2 ger oss 3. Vi multiplicerar det med 2, så vi får 6. Vi modulo det med 2, vilket ger oss? STUDENTEN 0. ALLISON: 0. Och då kommer vi lägga till två, så vi få 2 i det senare fallet. Så modulo-- du definitivt kommer att fundera på sätt att integrera att när du inslag runt alfabetet. Om du är på Z och du behöver flytta vidarebefordra tre platser för att komma till C, Det är det hela konceptet av omslag runt. Så jag kommer att lämna det till ni att räkna ut exakt hur du ska använda den. Men definitivt ett användbart verktyg för din pset denna vecka. Jag gillar verkligen det här. Detta är en av mina favorit psets. Sedan efter att du gör det, om du har vänner, du kan, vill, skicka varandra hemlighet meddelanden och se till att det fungerar. Eftersom det kommer att dekryptera det eller vad som helst. Massor av skoj. Och det är i slutet av avsnitt. Jag slutade tidigt. Jag har fortfarande 15 minuter med ni, så om det finns något som du vill gå över vidare, skulle jag gärna göra det. Alla andra frågor om din pset för dig som har startat eller läst spec. Allt som vi har pratat om under den senaste timmen och 15 minuter som du vill att jag till typ av uppkok, skulle jag vara glad att. Eller vi kan kalla det avslutas, och du kan alla lämna och ta mer godis med dig när du går. Men om det finns några kvardröjande frågor, låt mig veta. Du kan också komma upp och prata med mig efteråt. Jag lovar att jag inte bita. Något annat? Alla är bra? Allas känsla som de kan hantera detta pset? Du kommer att vara fina killar. Kontorstider är där av en anledning. Cool. Okej. Tja, i så fall, tack alla så mycket för att ni kom. Jag hoppas att vi ses nästa vecka. Det kommer att finnas mer godis. Det kan finnas andra coola saker. Och jag ser fram emot att få att känna er alla i år.