PROFESSOR: Så dagordningen för den här veckan, inte så mycket grejer. Men förhoppningsvis mycket, mycket bra och relevant för er denna vecka. Men vi kommer att tillbringa kanske 15, 20 minuter bara snabbt talar om länklista. Länklistor kommer att täckas på testet. Så kanske det skulle vara till stor hjälp att lära sig lite om vad det är. Vi kommer att tillbringa den stora Majoriteten av dagens avsnitt gå över quiz noll övningsproblem. Och sedan ska vi spara kanske 20, 30 minuter i slutet för eventuella kvardröjande frågor någon har. Och sedan, den sista fem minuter, jag kommer att ge en pump upp tal för testet. Ni alla vill vara för det här. Eftersom det kommer att bli en bra tid. Okej, så vissa material på länklista. Hur de är oftast strukturerade är du har vad som kallas en nod, eller hur? Du har dessa saker som kallas noder, som är structs. Jag ska gå igenom hur man skapar en nod i nästa bild. Men i huvudsak alla kopplade listor är är data som har uppträdda tillsammans via pekare. Och så fördelen vi har för att använda en länkad lista över, kanske, som en matris, är det faktum att i en array du behöver ett sammanhängande block av minne alla på samma plats, en efter den andra, för att kunna ha det. En länkad lista, du kan har slumpmässiga små bitar av minne hela datorn uppträdda tillsammans med pekare. Och på detta sätt kan få tillgång till information som kommer en efter andra, efter den andra utan att behöva bara en stor del av minne i datorn någonstans. Och så detta är en av de stora anledningar till varför vi använder länklista. För det andra är det väldigt lätt att dynamiskt ändra storlek på länklistan eftersom array, när du deklarerar en array, du har en viss uppsättning värde. Låt oss säga att jag ville skapa en array av 10 heltal. Jag skapar en rad 10 heltal, och det är det. Det är 10. Jag vet inte vad jag ska göra efter det. Om jag ville göra det 11, kan inte göra det. Om jag vill göra det 9, inte kan göra det. Medan i en länklista, kan du lägga till och radera och infoga var du vill. Du kan dynamiskt ändra storlek på din strukturera här, din datastruktur. Och det ger oss en hel del mer ökad flexibilitet att vi inte vanligtvis har med matriser. Någon förvirrad på grund struktur för hur en länklista är eller varför vi måste använda ett över en array? Ja, vi ska gå över i detalj hur man faktiskt skapa en. Men detta är bara typ av den allmänna känslan just nu. Häftigt. Och så arrayer sätts ihop av dessa underbara små saker som kallas noder. Allt en nod är en typ av struct. Kom ihåg att en struct är om du ville för att skapa en viss typ av variabel i C som inte redan finns du, som programmerare, kan faktiskt skapa det själv. Och så denna typ av data struktur kallas en nod, faktiskt har skapats av oss, att existerar inte inom C på egen hand. Och det sätt som du skapa en är att du måste huvudet av typedef struct, som berättar kompilatorn jag på väg att skapa en struct. Vi ska name it "nod." Och inuti vi ska att deklarera en variabel i, som kommer att lagra ett värde. Och då vi också kommer att har en pekare som heter "nästa" som pekar på nästa nod i länklistan. Och sedan du är klar att off genom att bara upprepa noden igen så kompilatorn vet, OK det är slutet av min struct. Och så på det här sättet, vi är typ att skapa en söt liten array sånt med en värde och med en pekare. Och du kan länka dem alla tillsammans med dessa pekare. Så att de alla slag kan vara uppträdda tillsammans i en kedja. Häftigt. Kan du höra att lite bättre? PUBLIK: Ja. PROFESSOR: Okej. Så det sätt att, som ni ser, en typisk länklista är strukturerad är du har ett huvud. Du har huvudet värde som inte som pekade av någon annan pekare. Men det kommer att peka på, eller referens, en annan nod. Noden efter kommer att referera till nod efter det, och så vidare och så vidare tills du så småningom hit i slutet av din länklista. Och du bara inte kommer att ha en pekare där. Och så, tänka som, på en kedja, eller till och med Om någon av er gjort, jag vet inte, som med frukt slingor när du var liten. Du skulle sträng ihop dem och bära dem runt halsen. Tycker det är exakt samma sak. Du har dessa små saker som du kan koppla ihop som pekar på en efter denna till ett efter det, och så vidare och så vidare tills du har en kedja av en datastruktur som du kan använda hur du vill. Så det sätt som detta skulle vi typiskt infoga eller ta bort varje nod från en länk Listan är mycket olika beroende på var den noden är. Så, till exempel, därför att pekare är alltid pekar på ett specifikt värde, när du tar bort eller sätter i en nod, du vill vara säker på att pekaren är allt pekar på rätt saker. Så om du ville potentiellt infoga en ny nod med värdet på en inuti en sorterad länk lista, vi vet alla här från den bild som kommer att gå in mellan huvudet och två, eller hur? Eftersom en passar just där. Men det sätt på vilket vi skulle göra det är genom att först Återgång pekaren från huvudet och skicka det till en. Men vi kommer i ett problem här. Kan någon se vad problemet är om vi skulle första dereference pekaren från huvudet till en? Vilket problem kan vi stöter på om vi försöker att lägga detta på framsidan av vår array? PUBLIK: [OHÖRBAR] PROFESSOR: Exakt. Så här har vi en pekare som var en gång pekar från huvudet till två. Men om du bli av med det pekaren, pekar du det till en, Vi har nu ingen aning vart den ska gå att hitta två. För som jag sa tidigare, har du fått en jätte bit av minne i datorn. Alla dessa noder kunde slumpmässigt varvat var som helst i din dator. Och du inte vet hur att gå om att hitta det. Och så måste du ha tips pekar på alla noder i slutet. Eller så om du råkar dereference en utan att först tilldelning först ett värde, du är bara kommer att förlora allt efteråt. Så vad vi ska gör är, du skulle först vill skapa en pekare på noden du vill infoga. Peka där du vill infoga det till, och sedan efteråt kunde peka huvudet bakåt till ett. Innebär det vettigt att alla här? Bra. Tänk på det som precis som en kedja. Om du lägger till en kedja, det är typ av intuitiva hur skulle du gå om hur du sätter det. OK, så det är faktiskt mycket kortare än jag trodde det skulle vara, en fem minuters spiel på länklistor. Bara så ni har grundläggande uppfattning om vad det är. Här har vi dagordningen för frågesport noll. Låt inte detta skrämma dig. Jag vet att det är en hel del information. Det ser mycket skrämmande. Det är också en hel del, jag tror, ​​CSC slags termer. Saker som hexadecimala strängar, pekare, avsättningar dynamiskt minne är mycket skrämmande klingande termer. Men vi kommer att bryta dem ner, göra några praktiska problem så att ni alla är redo för detta test. Hur många av er har redan börjat studera? OK, ni förmodligen vill att börja komma igång på det, eftersom testet är i morgon. Eller torsdag för vissa av er. Ja, så vi kommer att gå över några praktiska problem. Om ni vill att alla att ta ut ett pappersark, en penna. Vi ska bara tillbringa stora majoriteten av dagens avsnitt gå över en del av det så ni har en idé om vad som väntar på frågesporten. OK. Ett par logistiska detaljer också, för vem som helst som inte har varit att som länkar där, om du går till cs50.yale.edu, på framsidan denna sida finns en länk som säger "Om Quiz Zero." Link tar dig dit. Om du inte har läst den, läs den. Eftersom det säger du verkligen viktigt information om testet. Jag kommer att dra ut det från att bara för att, fysiskt, Om ni inte vet var att gå, kommer vi att ha problem. Och så om din sista i termer med A till N, gå till lagen skolans aula. Och om din senaste börjar med P till Z, gå till Davies Auditorium. Och detta gäller endast för människor i onsdag avsnittet. Om du tar frågesport på Torsdag, du går till SSS 114 där din föreläsning är typiskt. PUBLIK: [OHÖRBAR] PROFESSOR: O Z, du kommer att gå till Davies auditorium. Jag kommer att ändra på det, eller hur? Oh, ja, du bara misslyckas automatiskt. Oh yeah, det är du Christa. Ja, min dåliga. Japp, O Z, du kommer att gå till Davies Auditorim. Jag ska fixa det här när jag ladda upp. Ja. Och sedan också något viktigt att tänka är att onsdag, om du är officiellt inskrivna i onsdag avsnittet, du måste ta din frågesport på onsdag. Och om du är inskriven i torsdag, du måste ta din frågesport torsdag. Och det är under lektionstid. Där tror jag att det är 1:00 till 02:15 på onsdagar och 2:30 till 3:45 på torsdagar. Om du har en oförsonliga konflikter, Dean: s ursäkter är det enda, Tyvärr kan vi ta. Eftersom vi har haft en allra flesta begäranden att byta från onsdag till torsdag. Som vi kan inte hedra inte Vi har en Dean begäran. OK. Så innan vi sätter igång på en par av problemen praxis, Jag kommer bara att gå över Andys användbara tips för framgång. Ni, när man studerar, du verkligen vill öva att skriva kod för hand. Första gången jag någonsin tog en CS frågesport, hade jag inte praxis att skriva kod för hand innan och det var mycket chockerande på hur svårt det var. När ni inte komma in i vana att skriva ut allt, det kommer helt naturligt att kunna ha autocompleted fästen och semikolon där. När du skriver ut hand, ibland är det mycket, mycket lätt att glömma ett semikolon, eller glömmer att stänga en konsol, eller glömmer att stänga ett kolon, eller något sådant. Så när du skriver kod för hand, Det är en helt annan känsla. Så ni, när du arbetar genom några av de problem praxis, det skulle bra att verkligen öva idag. Eller i morgon, antar jag, om du är ta frågesport på torsdagen. För det andra har vi den sista, som, åtta års värde av praktik quizzes på nätet. Årets quiz kommer förmodligen att vara mycket, mycket lik dem alla. De är alla mycket lika. Du slags komma in i stil av den typ av frågor att vi ber, vilken typ av funktioner som vi kommer att skriva det, et cetera, et cetera. Så ta övningsfrågesporter, särskilt under tidspress. 75 minuter för att göra testet är inte mycket tid. Det är mycket, mycket länge. Och så ni verkligen vill att se till att ni är för vana att skriva kod för hand snabbt. Eftersom du inte vill att den första tid för att se en frågesport av den längden vara på din frågesport. Ni verkligen vill vara säker att du tränar i förväg. För det fjärde vill granska föreläsnings och sektions diabilder. Du behöver inte memorera saker. Egentligen är alla får en ett vitt papper anteckningar, fram och bak. Ni kan skriva eller skriva. Om du befinner dig behöver memorera något, lägg ner på detta blad. Jag garanterar dig, vill du inte att fastnat i mitten av denna frågesport att vara som, oh ja, vad är det runtime av detta slag gentemot denna typ. Bara lägga den ner och kopiera det direkt från din anteckning blad. Sedan kan du faktiskt bara använda din hjärna att tänka på de problem i stället för att återkalla fakta. Och så verkligen dra nytta av någon nisch detaljer att du tror att du behöver för att memorera, plopp ner om översynen bladet. OK, några frågor logistiskt om frågesporten innan vi börjar några frågesport problem öva? Ja? PUBLIK: Jag har inte haft en chans att titta på frågesport [OHÖRBAR] men det kommer att bli ansökan mestadels, eller finns det också kommer att bli, liknande, kunskapsfrågor? PROFESSOR: Det är en hel del. Så, det sätt som jag skulle beskrev frågesport är-- jag satte ihop vissa praktiska problem att jag drog från alla frågesporter. Men du kommer att se att det finns två huvudsakliga typer av frågor som vi kommer att be dig. Den ena är en mycket låg detaljnivå av saker. Vi ger dig en liten bit av kod och säga, är det ett fel här? Vad skulle skriva ut här? Vad kommer denna kod producerar, et cetera. Så mycket låg nivå informationsuppgifter. Och på steken, kommer vi att ha mycket hög nivå kunskapsbaserade frågor. Kan du förklara vad skillnaden mellan en binär sökning och en linjär sökning är? Varför skulle vi vilja Använd en framför den andra? Kanske, vad är GDB? Varför vill vi att använda GDB? Högre nivå, mer grundläggande förståelse frågor. Så du ser en blandning av två av dem på din frågesport. Något annat innan vi huvudet rakt in i det? OK. PUBLIK: En mer. PROFESSOR: Åh, en mer. Förlåt. Målgrupp: Ja, det är okej. Så du säger 75 minuter är för kort, som om det är osannolikt att vi kommer att avsluta? Eller, som, 75 minuter är precis så mycket tid som vi skulle behöva om vi var lämplig beredning? PROFESSOR: OK, så quiz är en utmaning. Det är definitivt en utmaning. Du kommer att hitta dig själv kort om tid. Du förmodligen kommer att slå, som 10, 15 minuter att gå, och att vara som, skit. Jag har så mycket kvar att göra. Och det är helt bra. Alla kommer att känna på samma sätt. Bara vara mycket medvetna om hur mycket tid du har. Och så det är därför jag berätta killar gör praktiska frågor. Eftersom det ger verkligen en stor känsla vad testet kommer att se ut. Så om du hittar dig själv som kunna avslutat praxis frågesporter i en bra mängd tid, kan du takten själv väl, kommer du inte har ett problem på onsdag eller torsdag. Häftigt. Så om alla wants-- jag tror de flesta människor har pappersark ut redan. Jag kommer att i huvudsak bara ge dig exempel på frågor, ge er, som en några minuter att göra dem. Och vi ska gå över som en klass vad svaren på dem är. Så det här är en mycket typisk tidigt fråga vi ska frågar dig, bara konvertera tal mellan olika baser. Binära, som ni kan minns, är basen två. Decimal är bas 10, eller vad vi som människor tolkar normalt. Hexadecimal är basen 16, som är noll genom nio samt A till F. Så det finns fyra siffror jag förmiddag frågar ni att konvertera här. Jag ska ge dig gillar, tre till fyra minuter att tänka igenom hur vi skulle gå att lösa detta. PUBLIK: Är vi tillåtna räknare? PROFESSOR: Du kommer inte behöver räknemaskiner, ja. Jag tror grundläggande tillägg, tror jag, är alla ni kommer att bli ombedda att göra. Och bara så jag slags har en känsla av när alla är klar, leta upp, våg, jag vet inte, leende, ser glad om du är klar. Ja. Kanske ett par minuter. OK, låt oss ta det. Jag avsiktligt gå till ge er mindre tid än du behöver antagligen göra en del av dessa problem, bara för att jag vill vara säker på att vi få igenom en massa problem. Så inga bekymmer om du inte har en chans att avsluta. Helt OK så länge du har en idé om hur man ska gå om detta. Så låt oss gå vidare och göra den första. Så först, är det någon som vill berätta för mig i binär, vad gör var och en av dessa siffror representerar i termer av deras värderingar? Ja? PUBLIK: Två till strömmen noll, 2 till en. PROFESSOR: Exakt. Så. Höger, så typiskt när vi är i botten 10 alla dessa representerar är, liksom, 10 till basen på noll, eller hur? Det är det enda ställe. Alla dina 10 plats är är 10 upphöjt till ett. Du 100 plats är 10 upphöjt till två. Oavsett bas du i går att göra med exakt samma sak, bara med en annan bas. Så binär, är allt som är basen två. Du kommer att konvertera alla siffror i två till vad makt av den siffran. Och så i denna mening, vi kan ha ett enklare sätt av att kunna lägga upp eller summera alla talen för konvertera till basen 10. Så är det någon som vill berätta vad Svaret på den första är i basen tio? Publik: Två [OHÖRBAR] PROFESSOR: Ja. PUBLIK: 42. PROFESSOR: 42, där du går. Så hur vi fick detta svar var gör två första, vilket är två. Plus två tredje, vilket är åtta. Plus två till den femte, som är allt som är kvar. Du sammanfatta dem och det är 42. Är det någon förvirrad om hur vi fick det? Så basiskt additions, som Jag sa, du bör vara OK. Om inte, ja, kan vi träna det också. Men det är okej. Häftigt. Finns det någon som vill ge mig svara på den andra också? 50? Bra. Någon förvirrad om hur vi fick det heller? Cool, I have svar på nästa bild. Så inga bekymmer om du behöver kopiera det. OK, hexadecimal är så lite svårare. men jag ska visa er en genväg för hur man gör det. Så hexadecimal, som ni kom ihåg, det är ju vara 16. Och eftersom vi som människor gör faktiskt inte har 16 siffror för att representera det, Vi går från noll till nio, som vår första 10-värden, och sedan gör vi A till F, vilka är de kommande sex värden. Och så det enklaste sättet att gå från varje binärt tal till hexadecimalt är att bryta upp dem i halvor. Och så alla binära tal vi ska ge du kommer antagligen behöva åtta siffror. Du kan bara bryta dem i mitten. Så den första en-- en en, en en, en, en, en en. Typ av tror det upp, du vet, rita ett snedstreck eller ett komma mellan dem. Och du kan bara konvertera direkt oavsett detta är att den första antal hexadecimala, och allt vad här är att den andra av hexadecimal. Så kom ihåg från vanliga notation, vad gör hexadecimalvärden börja med? PUBLIK: Zero. PROFESSOR: 0X. Så vi vet att varje gång ber vi dig att konvertera alla nummer till hexadecimal, eller någon gång du ser någon nummer som börjar med 0X, du vet att det är ett hexadecimalt värde. Och då du kommer att bli ombedd att avgöra vad dessa två siffror är. Och hur du gör det, avprickning upp att hälften och avprickning upp att hälften. Så i detta exempel, vad skulle man, en, ett, en vara? Vilket värde skulle det vara? Det skulle vara F, eller hur? Det skulle vara 15. Så det skulle vara F. One, en, en, en här är också F. Så en, ett, ett, ett, ett, ett, ett, en i hexadecimal, allt är är 0xFF. Eftersom Halv representerade F, värdet av 15, och Halv representerade F, värdet 15. Eftersom ihåg, vi är räknat från noll till nio. A är som 10, B är som 11, F är 15. Låter det vettigt för alla hur vi fick från binär till hexadecimalt? PUBLIK: Och så hur vi fick 15 från en, ett, ett, ett? PROFESSOR: Ja, det är binärt, eller hur? Tänk dig detta är bara ett binärt tal. Så du har två till nollte, som är ett. Målgrupp: Åh, OK. Så du bara totalt ut. PROFESSOR: Ja, och sedan du bara totalt ut det. Det är allt det är. PUBLIK: OK. PROFESSOR: OK. PUBLIK: Så du går från binär till decimal till hexadecimal? PROFESSOR: Det är enklaste sättet att göra det, ja. Du kommer inte att decimal eftersom decimal har endast noll till nio. Vi är bara typ av dela upp detta i två delar. PUBLIK: [OHÖRBAR] med hjälp av decimal för att hitta vad den matchar upp till hexadecimalt. PROFESSOR: Jag menar, du är avprickning upp med grundläggande matematik. PUBLIK: Ja. PROFESSOR: Ja, ganska mycket. Det är lite förvirrande. Men bara vet att du kan dela upp vad detta värde är i bara halvor. Titta, vad är det i binär? Vilket nummer är det? Det kommer att bli något från noll till F. Här kommer också att vara något från noll till F. Och då kan du bara lägga dessa två rätt där. PUBLIK: OK. PROFESSOR: Japp. OK. Så ni vill prova nästa man då? Noll, ett, noll ett, en, noll, en nolla. Jag ska ge er som 30 sekunder, eftersom du förmodligen inte visste tricket att hur man gör detta tidigare. OK, någon vill få det här en chans? 0X5A. PROFESSOR: 0X5A. 5a. Bra. Så detta här skulle be-- du vill att berätta hur du fick det? Först, hur fick du fem? PUBLIK: Eftersom noll, ett, noll, är en fem. PROFESSOR: Förstår alla varför noll, ett, noll, en är fem? Du har en här. Du har inget i två till den första. I två till den andra, du har en, vilket är fyra. Så du lägger till fyra plus den, har du fem. Alla bra? OK. Och vad detta vara och varför? Vilket nummer gör A motsvarar? PUBLIK: 10. PROFESSOR: Och vad detta i basen två? PUBLIK: [OHÖRBAR] PROFESSOR: Exakt. Så detta andra värde här skulle vara 0X5A. Alla bra om hur du konverterar? Det är mycket enklare än du tror att det är. Jag vill bara se till att du vet tips och tricks för hur man gör det. PUBLIK: Varför kan du bara dela den i mitten som? Bara vara som, OK, jag kommer bara att bryr sig om dessa första [OHÖRBAR]? PROFESSOR: Eftersom det är faktiskt sätt hexadecimala värden är representerade. 0X, som faktiskt betyder inget annat än att berätta att det är ett hexadecimalt tal. Och detta alltid representerar de fyra första siffrorna. Och detta alltid representerar de fyra sista siffrorna. Och så dessa två siffror bara motsvarar olika bitar. PUBLIK: Så vi kommer always-- PROFESSOR: Du är alltid kommer att få åtta värdebitar. PUBLIK: Är det precis som en sak här eller att en sak överallt? PROFESSOR: Det är bara en sak i datorer, yep. PUBLIK: OK. Fantastisk. Professor: Också, så i detta exempel vi omvandlas från binär till decimal, och från binär till hexadecimal. Ni vill se till att du också öva går tvärtom. Så om jag gav dig 0xFF, du kunde dra ut det i binär, eller hur? Du konvertera F till binär, som är ett, ett, ett, ett, konvertera F till binär, som är ett, ett, ett, en. Så vi kan be dig att göra tvärtom. Så decimal till binär, eller hexadecimal till binärt. Så du vill göra att du vet åt båda hållen. Vi kommer förmodligen att be dig en kombination av de två. Ja, har du en fråga? Jag kan see-- du är bra? PUBLIK: Ja. PROFESSOR: OK. Är jag bra att radera det här? Bra. Okej, så svaren är här om någon är nyfikna senare och blir förvirrade. OK. PUBLIK: Spelar det någon roll om vi sätter våra brev i huvudstaden eller gemener? PROFESSOR: Det gör, eftersom i hexadecimal, enligt konvention, alla tecken är versaler. Så A till F är kommer att vara versaler. Om du sätter ett gement a, jag vet inte om vi nödvändigtvis skulle märka det fel. Men teoretiskt, det är inte tekniskt hur man ska få det. Så de bör alla vara versaler. Ja, bra fråga. OK. Den andra frågan. Tänk på detta underbara program här. Jag ska ställa frågan, Jag ska komma tillbaka redan. Så, för det första, vad som finns inuti standard io.h det är av intresse för programmet? För det andra, vad gör ogiltig betyda i linje tre? Och för det tredje, vad återvänder noll från main, som linje sex, i allmänhet betyda? Om ni vill skriva dem ner, eftersom jag måste gå tillbaka till bilden bara så att du kan se koden. Detta är ett exempel på, liksom, kanske en högre fråga nivå där vi ber dig vad saker betyder i ett program. Alla bra för mig att gå tillbaka till bilden? OK bra. Så jag ska ge er som kanske tre minuter att titta på detta en riktigt snabbt. OK, så detta är som ganska lätt, konceptuellt. Finns det någon som vill berätta vad som är först inuti genom hash inklusive vår standard io.h bibliotek fil? Varför behöver vi att biblioteket ingår för det här programmet? Vad här behöver vi det för? Ja? PUBLIK: Är det när du sätter det printf? PROFESSOR: Exakt. Så printf, när du ta en inmatning från användaren och skriva ut något till skärmen, det är standard input, output bibliotek. Tänk på det som way-- input, output. Har jag en utgång? Ja det gör jag. Så jag vet att jag alltid kommer att behöver standardisera i.o biblioteket. Så printf är funktionen genom vilket vi behöver komma åt och hashtag inkluderar standard i.o bibliotek. OK. För det andra vad void betyda? Vi har int main (void), vad gör ogiltig här menar här på rad tre? Ja, i ryggen. PUBLIK: [OHÖRBAR] PROFESSOR: Exakt. Så kom ihåg, vi har lärt oss börjar med vår pset att du kan faktiskt ange kommandoraden argument som ditt program, som du huvudsakliga funktion, tar du, användaren, kalla det. Om vi ​​har tomrum, betyder det att du kunde bara köra programmet direkt utan kommandoradsargument. Alla tydliga på den punkten? OK. Och slutligen varför vi bry gör denna avkastning noll sak här? Varför har vi även en int main? Varför kan vi inte bara void main tomrum? Ja? PUBLIK: Bara så att vi kan vara säker på att programmet är spännande framgångsrikt, som motsats till om det var räknade. Och vi skulle veta att det är en annan typ av fel. PROFESSOR: Ja, exakt. Detta är bara ett mycket konventionell sak som vi gör, är att precis i slutet av ditt program, bara för att se att din huvudsakliga funktion körs på rätt sätt, vi alltid vill göra retur noll. Även om vi får nödvändigtvis inte att skrivas ut som helst. För som programmerare, du vet, om du har många olika rader kod och du inte vet var dessa går fel, och om ett fel inträffar som du vill se till att du får detta fel. Och så typiskt om något går fel vi kommer att ha en avkastning på en bara att se till att vi vet att det är. Så om du ser en återgång noll, som typiskt innebär att ditt program är avrättades framgångsrikt. Bra? Häftigt. OK, andra program här. Tänk på att. Och om ni ser en flyta, ni kan förmodligen ha en god uppfattning om vad Jag är på väg att be er. Så när det här programmet körs, som ni kan se, Jag förklara en flottör i min huvudsakliga funktion. Jag namnge det "svara" och jag inställning som är lika med ett delat med 10. Jag skrivs ut, till en decimal, som flyter. Och då jag återvänder noll. Så när programmet körs, tänker tillbaka på giriga nu, Programmet skriver 0.0. Som vi alla vet, förhoppningsvis vi alla vet, ett delat med 10 är inte en 0,00, det är 0,1. Men förklara varför detta program tänker att ett dividerat med 10 utskrifter till 0,1 andra än 0,1? Jag ska ge er kanske gillar 30 sekunder för att bara snabbt tänka på det och jag ska gå tillbaka till programmet. OK. Någon som vill ge det en chans? I tre meningar eller mindre, eftersom det vanligtvis är vi kommer att begränsa alla svar till tre meningar eller mindre så att du inte bara regurgitate slumpmässiga saker på dina frågesport. Ja, ta ett skott. PUBLIK: Så jag tror att det är det här som kallas, liksom, [OHÖRBAR] Så det kan vara, till exempel, det kan finnas, liksom, 0,09, att om du skriver ut första siffra, skulle det vara till 0,0? PROFESSOR: Stäng inte riktigt. Chris? PUBLIK: Du dela en och 10, och de är båda heltal. Och så sätt att det kommer att lagra den är som ett heltal. Och så det närmaste heltal skulle vara 0,0. Och så det är 0,1. PROFESSOR: Ja, det är riktigt bra. Det är det rätta svaret. Så det här är ett mycket förvirrande koncept för många barn. Och jag vill verkligen se till att Detta förstärks i allas huvud. Så vad vi kallar flytande punkt inexakthet, där orsaken till att en hel del av dina program i giriga fungerade inte från början var att du har glömt att lägga din variabel. Så vad Chris sa var helt korrekt. En flottör är till sin natur oprecisa. För i en dator, rätt, vi har en ändlig mängd av bitar av minnet vi kan använda för att representera tal. Så, till exempel, denna CS50 ID är-- Jag tror att det är en 64-bitarsdator. En flottör kan endast representeras med en begränsad mängd av dessa bitar. Och så 0,1 med oändliga nollor, att var 0,1 är, eller hur? Men vi kan inte faktiskt lagra det numret i vår dator. Vi har helt enkelt inte tillräckligt med minne för att göra så. Och så den närmaste tillnärmning av vad lagras i minnet är faktiskt något liknande 0,000 något, något, något, något. Som, när du trunkerar det, avrundar ner till 0,0. Och så det här exemplet är bara en som visar massor av frågor vi har när vi är försöker felaktigt göra matte utan gjutning som en annan heltal. Så bara vara försiktig med att detta händer. På frågesporter, om vi ger dig en kodblock och det är, Vad skrivs ut i slutet? Och om det är något slumpmässigt värde som du killar bör veta varför det händer. Ja? PUBLIK: Trunkera är att bli av med allt efter en viss punkt? [OHÖRBAR] PROFESSOR: Ja, så faktiskt Detta är ett riktigt dåligt exempel, eftersom 0,100 oavsett faktiskt skulle stympa ner till 0,1. Men om du skulle köra det-- jag inte minns, eftersom förra året körde den på ett annat program. De körde det i något som kallas den CS50 Appliance, som skiljer sig från den ID. Det var en 32-bitarssystem, tror jag. Och så fanns det olika nummer. Men i huvudsak vet bara att hela konceptet med stympning och hur det bara skär saker. Och så om det rounds-- PUBLIK: Utan avrundning. PROFESSOR: Exakt. Ja. Häftigt. Hej, i ryggen. Vi ska bara över några quiz omdöme frågor. Okej. Så överväga ett annat program här. Jag ska ge er en par minuter att läsa över detta. Detta är något som var för en mycket nyligen att jag tror blåste en hel del av er killar sinnen. Men vi kommer att prata genom detta igen bara se till att du förstår det helt. OK. OK. Någon behöver mer tid att läsa igenom denna kod? OK. Så det tycks mig som om i detta program jag skapa två strängar med hjälp getString. En kallas s och en kallas t. Och om de är lika lika med varandra, Det ska skriva "Du skriver samma sak. " Men elsewise, skulle det ut: "Du skrivit olika saker, "rätt? Verkar väldigt, väldigt enkelt. Men, men, om jag faktiskt försök att skriva det här programmet, det verkar som även när jag mata in exakt samma strängar, det fortfarande skrivs ut, "Du skrivit olika saker! " Finns det någon som vill ta en skott på varför detta program alltid svarar att ingångarna är olika, även när orden själva är densamma? Så om jag skulle input-- David kärlek att använda ett exempel som mamma, rätt? Gemener M-O-M för S, T lika gemener M-O-M. Om jag körde detta genom denna kod, varför skulle det skriva ut "du skrivit olika saker?" Finns det någon som behöver mer tid att tänka på det här? OK, jag tror att vi är bra. Ja? Målgrupp: OK, så det är något om där det lagras i minnet, eller hur? PROFESSOR: Japp. PUBLIK: Om det är som, om detta string s lagras på minnet spot-- Jag uppfinna this-- är noll. PROFESSOR: Visst. PUBLIK: Och string t lagras vid minnespunkt, liknande, 167, och därefter noll inte är lika 167. PROFESSOR: Exakt. OK, så kom ihåg denna otroliga uppenbarelse vi förklarat för er den senaste veckan, att strängar egentligen inte existerar? När vi skapar något som kallas sträng vi är, i verkligheten, skapa något som kallas röding stjärna. Som allt är det är en pekare till en sträng eller till en matris av tecken. Och så i detta exempel, om jag var att mata in M-O-M vägen att min dator skulle förvara det är i minnet backslash noll, eller hur? Dessa fyra tecken, tecken, skulle lagras någonstans. Och då dessa fyra tecken, omvänt snedstreck noll, lagras någon annanstans, eller hur? Jag har ingen aning om adresserna är, de är någonstans i min dator. Men jag vet inte exakt var de befinner sig. När jag skapar en sträng s, allt som verkligen är är en pekare till start av denna sträng. Och när jag skapar denna t-värdet, allt som är en pekare till här. Och så när du försöker att likställa och kontrollera för att se om s är jämlikar lika till t, datorn är egentligen bara återvänder till du adressen till denna m och adressen för den m. Och eftersom de är två separata delar av data som är lagrade i två olika adresser i din dator, datorn kommer aldrig att erkänna dem som samma. Finns det någon som vill ge ett skott på vad vi skulle behöva göra om vi ville korrigera detta och har en korrekt pågående program i stället? Tänk på att för ett par sekunder. Vad behöver vi byta till få det här programmet fungerar det sätt vi vill att det ska fungera? Ja, vill ta ett hugg på det? PUBLIK: Kan vi försöker dereference den pekare och kolla igenom arrayen? PROFESSOR: Det är ett sätt att göra det. Så, vad är ditt namn igen? Jag är ledsen, påminna mig. Zee: Zee. PROFESSOR: Ja, så vad Zee föreslog skulle absolut fungera. Höger? Vi kunde dereference pekaren och faktiskt gå och tillgång fysiska data i härifrån. Och vi kan bara jämföra hela skärmen. Vi kan säga, OK, pekare, ge mig vad som finns inuti här. Det skulle återvända en m. Och jag skulle säga, pekare, ge mig vad som finns inuti här. Returnera en m. Gör de matchen? Ja. Då kan vi gå vidare. Vi håller kontroll av hela två strängar hela vägen fram till slutet och se om de är lika, Om alla värden är lika. Och om alla värden är lika, då vet vi strängarna är sanna. Absolut, det är hur vi skulle göra det? Finns det någon förvirrad på något av detta? Hela tanken med hur strängar i verkligheten bara pekare, och hur de egentligen inte existerar? Och varför vi får fel gillar hur vi får det? Eftersom jag garanterar att du killar, pekare och sträng tilldelning och minne kommer att komma upp. Ja? PUBLIK: [OHÖRBAR] dereference det, du bara sätta en stjärna [OHÖRBAR] PROFESSOR: Rätt. Så för att derererence en pekarorgan för att gå till den adressen för pekaren och få de uppgifter, värdet där. Och sättet att göra det är stjärn pekare. Förväxla inte det. PUBLIK: [OHÖRBAR]. PROFESSOR: Ja. PUBLIK: Så du kan bara skriva Om stjärnan s lika jämlikar stjärna t. PROFESSOR: Tja, nej. Nej. PUBLIK: Det är inte bra nog, eller hur? PROFESSOR: Det är inte för att du är bara kontrollera den första bokstaven. Du förmodligen kommer att behöver någon form av en slinga som itererar genom varje enskild karaktär i båda strängarna. Ja. Så om du ville bara kolla att se om de började med samma sak, du kan göra om, stjärna s är lika med stjärnan t. Då vet du att åtminstone de började med samma tecken. Ja? PUBLIK: Så sätt du gör det skulle vara som en inbäddad for-loop eller pekare? PROFESSOR: Ja. Ganska mycket bara en for-loop. Kom ihåg att David i klassen nämnt den fria syntaktiska socker? Och han hade denna mycket förvirrande sak stjärna t plus ett, där det skulle integrera igenom och det flyttar pekaren? Ju enklare sätt att göra detta är bara ton i. Så det är bara en array. Det sätt som du skulle ha en för loop som sprang från noll till i, där i är längden av den sträng, kunde du bara skriver att istället för att göra det Hela pekare, referens sak. Så dessa saker är exakt motsvarande i din dator. Ni förmodligen inte måste veta att, men det är bra att bara typ av har i ryggen ditt sinne. Bara vet att datorn erkänner olika block av kod som samma sak. Eftersom detta är bara långt mer användar vänliga för oss att presentera det som det är en array. Det är bara lättare. PUBLIK: Så använd strlen att gilla, get-- PROFESSOR: Ja. PUBLIK: OK. PROFESSOR: Du kunde använda strlen eller om du hade inte strlen du kan bara göra upp tills du träffar bakstreck noll för båda. Antingen skulle fungera. Ja. PUBLIK: Så det är att dereference varje enstaka tecken om vi var faktiskt skriva denna kod, vi bara kunde göra t parentes i gillar med stjärnan framför den? PROFESSOR: Ja, lika likar s fäste i, och sedan hålla sig i rörelse i down up tills du träffar slutet. Ja, det är vad du skulle göra. Och jag ska faktiskt ha en nästa exempel på när vi faktiskt skriva strlen så ni kommer slag av få leka med den lite. Så är alla klart på bara minne, strängar, pekare, kvalitets adresser? Vissa begrepp högre nivå som du kommer säkert behov av att veta på frågesporten i morgon. Okej. Bra. Japp. OK, så en sak som vi ska också be du, som vi gör varje år på en frågesport, är, Anta att du har glömt (som Vi tycks glömma att göra årligen) där rubrikfil strlen deklareras. Och så måste vi skriva det själva. Här är en lista över riktlinjer att vi kan presentera dig killar där du får anta att s strängen kommer inte att vara noll. Du kan anta att s kommer att vara avslutas med ett omvänt snedstreck noll. Så du vet att det är vad det kommer att sluta med. Och, till exempel, att den längd hello skulle vara fem. Så du kan anta att hello kommer att vara fem, H-E-L-L-O. Du behöver inte anta att backside noll står för längden. Denna sista här, inte oroa heltalsspill. Kommer någon ihåg vad heltalsspill är? PUBLIK: Går bortom längden på [OHÖRBAR]. PROFESSOR: Ja, kan du förklara lite, vad betyder det? Målgrupp: Så, jag antar att det går tillbaka till trunkera exempel tidigare. Men om du har bara så många siffror som går utöver det antal bitar att du faktiskt kan tilldela den att det kommer bara typ av avskurna. PROFESSOR: Ja, så på en typisk dator, hur många bitar har vi? PUBLIK: 32? PROFESSOR: Ja, 32, till höger. Och så det är, vad, fyra miljarder, två miljarder? Fyra miljarder, upp till fyra miljarder positiva heltal, eller hur? Två miljarder negativ, två miljarder positiv, beror på hur du vill göra det. Och så i princip kan vi ha tillräckligt heltal som kan gå upp till två till 31 minus 1, eller hur? På grund när vi slog två till den 32: a, gör vi inte har så mycket minne i vår dator. Och så, teoretiskt, jag kunde komma med ett antal det vill säga, liksom, två till den 46: e. Det är en enorm-ass nummer, men teoretiskt du kunde. Och så heltalsspill är om du försöker skapa ett heltal som går utöver vad datorn kan lagra. Och så du killar för detta exempel har inte oroa sig för oss att ge dig en jätte sträng som är två till den 32: a tecken lång. Det skulle verkligen innebära. Okej, så jag ska bara ge ni basstrukturen av detta. Du kommer att skapa en Funktionen kallas int strlen där ett pass i en röding stjärna eller sträng, pekare till strängen som kallas s. Okej, alla kopiera den ner. Häftigt. Oops-- annat sätt. Så det här är ungefär som en hårdare bit av problem, så jag ska ge er kanske fem till sex minuter till slags brain och skriva denna funktion ut. PUBLIK: Vi gör inte redogöra för [OHÖRBAR] vi behöver inte använda heltal? PROFESSOR: Nej, det gör du inte. Jag ska ge er en ledtråd. En while-slinga kan vara mycket användbar här. Ja. Här är godis. Candy kommer också att finnas tillgängliga för frågesport, tror jag. Så ni kommer att bli sockrade upp i morgon. Kan Jag-- du fick den. PUBLIK: OK. PROFESSOR: Ja. Kanske 30 sekunder eller så. Okej, om du är inte gjort, inga bekymmer. Vi kommer att gå igenom det här tillsammans. OK. Så jag ska bara layouten på grundläggande strukturen för denna funktion här. Int strlen. Först, någon som vill berätta mig vad som int betyder? Vi måste ha denna funktion. PUBLIK: strlen [OHÖRBAR]. PROFESSOR: Exakt. Så oavsett vad som händer här, vi behöver gå tillbaka ett heltal. Och enligt vad som anges i spec, vi vill return-- Go for it killar, bara fortsätta. Allt är bra. Ät det hela så jag inte har att ta det tillbaka, faktiskt. Int betyder bara att du är kommer att vara tillbaka ett heltal. Vad är detta char stjärna s? Vad betyder det? Målgrupp: Precis, vad som matas in. PROFESSOR: Exakt. Och vad är nästan Samma sak som char stjärna? PUBLIK: String? PROFESSOR: Exakt. Så allt vi gör är att ge detta är en pekare till en sträng. OK. Häftigt. Dessutom, glöm inte, om vi glömmer för att ge dig dessa konsoler, Glöm inte att skriva dem själv. Eftersom teoretiskt, är din kod felaktigt om du glömmer att skriva dem. Bara alltid uppmärksamma. Liksom, småsaker att du inte märker när du programmerar på din bärbara dator, eftersom din bärbara dator gör det åt dig? Glöm inte när du skriver för hand. Ja? PUBLIK: Men hur fel? Liksom, får vi hela problemet fel? PROFESSOR: Nej, nej. Oroa dig inte. Det är faktiskt teoretiskt möjligt för dig att få full poäng på en fråga även om din kod kommer kör aldrig i verkligheten. Jag föreslår att du inte försöker för att förverkliga detta. Till exempel, som om allt det är här är rätt, men du glömmer ett kolon eller en konsol, koden kommer faktiskt inte köra. Men vi kan vara barmhärtiga. Ja? PUBLIK: Måste man kommentera vår handstil? PROFESSOR: Nej, nej, nej bekymmer om detta. Nr kommentera. Stil bör vara god. Liksom, inte Smush allt på en rad. Vi kommer inte att vara lycklig med dig om du gör det. Finns det någon som vill ge mig den första raden? Tips, är det väldigt enkelt. Ja? ÅHÖRARNA: Int, n är lika med noll. Bara ställa in räknaren. PROFESSOR: Så vi vill ha sorts en räknare, eller hur? Jag kommer bara att nämna den "räkna" till förmån för läsbarheten. Vad vill vi ställa in den lika med? PUBLIK: Zero. PROFESSOR: Japp. Semikolon. Det är också mycket konstiga ritningssemikolon. Bara öva att göra det. Så vi vill först ha en räknare av typen int. Eftersom vi vill räkna upp hur många tecken eller bokstäver är i denna sträng, eller hur? Mycket lätt första steg. OK, kanske lite mer komplex nu, hur ska vi göra det? Finns det någon som vill ge mig kodraden som kanske kan hjälpa slinga genom vad det här är? Ja, modig själ i ryggen? Målgrupp: OK, så medan punkt asterisker, den ja, stjärna av s, är inte lika med noll, sedan göra något? PROFESSOR: Det är riktigt, riktigt nära. Riktigt nära. Så jag kommer att ta itu med två saker med det. Först av allt, det är inte exakt noll. Vad är det? Det är noll terminatorn, vilket är omvänt snedstreck noll. Så de är olika i när det gäller hur de ska lagras. Så du är riktigt nära. Och för det andra, vill vi inte att bara flytta pekaren. Vi vill faktiskt åtkomst till värden, eller hur? Och så hur gör vi det? Väldigt enkelt. Tänk inte på pekare, tycker inte om minnen. Gå tillbaka till vecka två av kursen. PUBLIK: [OHÖRBAR]. PROFESSOR: Såsom av, minns du? Vad är strängar? Hur lagras de i minnet? PUBLIK: De är upp. Professor: De föds upp. Så hur gör vi tillgång varje tecken inne? PUBLIK: [OHÖRBAR]. PROFESSOR: Exakt. Så while-- vad som händer här inne? S av - AUDIENCE: I. PROFESSOR: Åh, inte existerar i, eller hur? Målgrupp: Åh, räknas? PROFESSOR: Vi kan bara Använd räkna, kan inte vi? Målgrupp: Tyvärr, jag kallade det i. PROFESSOR: Ja, det är allt bra. Vi har en variabel upp här som är redan förklarats som vår disk. Så varför inte vi bara använda det att gå igenom while-slingan? Betyder det vettigt? Så medan tals count-- någon som vill att ge mig vad som händer efter här? PUBLIK: Det inte är lika. PROFESSOR: Inte lika, eller hur? Det är bang lika, utropstecken är lika, vad ni vill kalla det inte equal-- PUBLIK: [OHÖRBAR]. PROFESSOR: Ja. Kom ihåg enda anbud är en röding, citattecken är för en sträng. Var försiktig när du använder dem. Så när vi letar igenom arrayen, det sista tecknet, vi vet att vi inte vill ha det ska vara omvänt snedstreck noll. Så tag. Vi är inte i slutet av strängen. Vad vill vi göra där inne? PUBLIK: Vi vill lägga till disk så det räknar plus plus? PROFESSOR: Exakt. Så här är vi ska göra räkna, räkna plus plus. Saknas en mer lina. Vi är nästan där. Vad är det vi glömmer att göra? PUBLIK: Åter noll? Professor: Du vill returnera noll? Målgrupp: Nej, återvänder till strlen. Vänta. PROFESSOR: Vilket är lagrat i? PUBLIK: Räkna. Räkna. PROFESSOR: Exakt. Så här vi kommer att återvända räkningen. För vad vi är gör här ultimately-- Vi har en räknare variabel som är kommer att inkrementera genom vår sträng. Vi kommer att fortsätta hålla går, runt och runt i denna loop. Och medan vi är inte på slutet av denna sträng, som är noll terminator. Och varje gång vi går igenom det, vi lägga till vår disk. Och vi gå längre tillsammans i denna array. Och i slutet, när vi träffade null terminator, vi vet, åh, vi kan bryta tillbaka räkningen. Vi har vår strlen. Får alla människor hur Detta genomfördes? Medan loops-- Jag vet att vi har inte gjort för mycket med dem, men de är oftast mycket, mycket användbart om du vet inte vad du stoppar tillstånd med nödvändighet att vara. Fråga? PUBLIK: Kan vi skriver null på så länge villkor? PROFESSOR: Medan? Ja, så i det här problemet jag hade dig killar antar att s inte kommer att vara noll. Eftersom minns, teoretiskt, om jag gav dig en pekare som var för stort minne, Det skulle ge dig noll, eller hur? Det är vad den operativa system skulle göra. Så om jag inte berätta för dig att anta s skulle vara null, måste du kontrollera. Så här uppe, skulle du göra om s lika är lika med noll, tillbaka en. Något sådant. PUBLIK: [OHÖRBAR] noll. PROFESSOR: OK, jag ska berätta varför vi inte kan göra det. Eftersom minns i minnet, rätt här. Vi kommer att gå här. Du har jätte block minne alla med galler att lagra olika värden, eller hur? Och så alla en sträng är-- för exempel, om vi ska kunna input hej, det skulle vara H-E-L-L-O bakstreck noll, eller hur? Och vem vet, som slumpvis saker som är i här efter det. Vi vet faktiskt inte vad som finns där. Och så om du skulle göra i stället för omvänt snedstreck noll, null, kan det inte vara null. Eftersom det bara kan betyda några slumpmässiga annat som inte hör hemma i din sträng. Och så sätt att vi alltid vet att en sträng slutar är med ett omvänt snedstreck noll. Och så det är alltid hur vi kontrollera för att se änden av en sträng. Null, är allt som betyder att om du har en icke-existerande pekare, först och främst, eller om ditt minne är bara så stor att du kan inte lämna tillbaka den, så det skulle vara noll. Så vara mycket försiktig när differentiering skillnaden mellan noll och det omvända snedstrecket noll. Ja. Alla OK med detta? OK. Så jag hade ni skriver ut strlen. Feasibly kan vi också be du skriver ut A till I, kom ihåg att "Atwoa" eller vad ni vill kalla det? Denna funktion i Vigenère och Caesar, som omvandlar ett ASCII-värdet till ett heltal? Det har också kommit upp tidigare frågesporter funktioner vi har bett dig att skriva. Ganska mycket någon funktion att du har använt och är mycket lätt att skriva själv, sensorer gillar är lägre, är övre, sänka, till den övre. Funktioner som skulle omvandla en sträng från gemener till versaler. Vi vet alla hur man gör det, eller hur? Det är ganska lätt. Vill bara vara säker på att du can-- det är samma tankeprocess. Du iterera bara genom och du vända saker. Du antingen räkna eller när du vända saker annorlunda. Jag skulle suggest-- I vet inte om vi ska be dig att memorera vad kapital A eller kapital Z, eller gemener A eller gemener z är i Ascii, men jag skulle föreslå kanske skriva ner det i fallet vi gör. Bara så ni har en referens. Liksom versaler A är, vad, 197? Och sedan gemener är som 50 något. 65, ja, där du går. Så bara ganska mycket vet Skillnaden mellan dem är 32. Det är ganska viktigt. Ja. Är jag bra på detta? OK. PUBLIK: Vi kunde teoretiskt skriva några av dessa ned samt på vår little-- PROFESSOR: Du teoretiskt kunde bara kopiera funktionen ner. Det är sant. PUBLIK: Inte [OHÖRBAR]. Professor: Ni har ett blad. Ni har en anteckning blad. Du kan skriva det. Du kan skriva det. Du kan göra vad du vill med den. Ja. Så teoretiskt, om du vill, gå till. PUBLIK: [OHÖRBAR] men vi vet inte riktigt nödvändigtvis måste komma ihåg värdet, vi kan bara Använd till övre eller nedre funktion, eller hur? PROFESSOR: Ja. Men om vi gav dig en fråga som säger skriva till övre då skulle du behöva skriva det. Så ni kan anta att du killar har tillgång till alla funktioner, men om du vill använda för att övre eller lägre, vad har du också att göra? PUBLIK: [OHÖRBAR] använd CS50 [OHÖRBAR] PROFESSOR: Är det CS50.h? Var försiktig där. Så för att övre, sänka, är övre, lägre, funktioner som involverar string manipulation är alla inom antingen Ascii eller inom matematik biblioteket eller inom strängen biblioteket. Så om ni använder dem funktioner, vara noga med att komma ihåg att inkludera den rubriken. Så kanske också något som du vill ha med i bladet, vad är huvudet? Vilka är biblioteken du har använt? Vilka funktioner är inom dessa bibliotek? Det är viktigt. Ja? PUBLIK: Kan vi bara cop ut och göra hashtag genom den absolut varje bokstav som vi någonsin sett som på alla frågor? PROFESSOR: Du kunde. Jag vet inte hur lycklig vi kommer att vara att grad att quiz när varje bit kod är dubbelt så lång som den behöver vara. Jag vet inte, vi kanske ta bort en poäng för stil. Men teoretiskt din koden skulle vara rätt. Ni kunde cop ut och bara inkludera allt. Det är också bra, ja. PUBLIK: [OHÖRBAR]. PROFESSOR: Ja. Jag föreslår inte att göra det ändå. Ja. PUBLIK: Cool. PROFESSOR: Bra fråga. Målgrupp: Så, det värsta scenariot. Professor: Det värsta fallet. Om du helt har glömt, du kunde göra det. Ja. Japp, är koden direkt. Jag använde n istället för räkning, men du vet, oavsett flyter din båt. Målgrupp: Vänta, så vi skulle inte behöva Hashtag inkluderar eftersom vi är med början vid int? PROFESSOR: Ja, jag bara anta att blev vi ombedda att skriva funktionen. Om du vill vara säker, du skulle förmodligen lägga den där. Men jag bara inte bry, ja. Jag vet inte ens om du behöver någon bibliotek för detta. Eftersom du inte riktigt utskrift ut någonting eller något, eller hur? Ja, jag vet inte om du behöver ett bibliotek. OK. Detta är också lite mer tillsammans linjerna av minnesmanipulering. Denna typ av lite knepigt. Tänk på detta. Du har en funktion som kallas funk. Jag kunde ha namngett det vad, men jag väljer att kalla den funk. Jag har det ovanför mitt huvud. Kom ihåg att du vill ha en funktion efter din huvudsakliga, du vill vara säker på att du inkluderar prototypen för toppen. Men i detta fall det var så kort att jag kände att jag kunde bara inkludera det ovanpå viktigaste. Jag behövde inte ha prototypen, eftersom det är redan skrivet ovan. Så allt jag gör i min huvudfunktion skapar heltal x är lika 10. Jag ringer min funk funktion, och sedan skriva upp något. Och då är det faktiskt vad funk gör. Ni vill tänka igenom det här. Eftersom det är lite knepigt. Det är mycket, mycket svårt, faktiskt. Tänk igenom vad detta Programmet skulle vara utmatning. Jag ska ge er två minuter. Bra diskussioner? PUBLIK: Ja. PROFESSOR: Ja. Okej, så det här är knepigt för en anledning. Och det är därför jag ville föra detta för allas uppmärksamhet. Finns det någon som vill ge mig ett förslag, ett försök? Vad skulle detta skriva ut? Helt bra om du har fel. Ja? PUBLIK: Jag tror att det är 100 och sedan 10 på två separata rader. PROFESSOR: Och en 10? Finns det någon som har några andra gissningar? Ja? PUBLIK: Kanske bara 10 eftersom funk inte tillbaka någonting? PROFESSOR: OK, så vi har gissa nummer ett är att gissa nummer två är bara att skriva ut 10. Finns det någon som har några andra gissningar? OK. Så låt oss gå igenom det här, eller hur? När du får en bit kod, inte bara titta på det och vara, ah, det är så mycket grejer! Jag är så förvirrad! Liksom, lugna ner dig själv. Bara vet att du kunde bara titta igenom koden rad för rad. Det är allt det är. Det är som att läsa en bok. Så med någon funktion, Vi börjar alltid vid huvud. Så vi kommer att starta vid int main tomrum, även programmets redan kör ned, eller hur? Börja på i huvud tomrum. Int x motsvarar 10. Så jag kommer att radera detta. Jag kommer att dra minnet bara så att du killar kan typ av se vad som händer. Kom ihåg här nere vi har vår stack? Här uppe har vi vår heap någonstans här uppe. Stack växer upp, eller hur? Och inom stacken, har du elnätet fungera så bra som alla elnätet lokala variabler. Så här, int x motsvara 10. Inom vår huvuduppgift är vi skapa en variabel som heter x. Vi inställning som är lika med 10. Här har du några x, och du är inställning som är lika med 10, höger, inom huvud. Alla bra? Fungera. Så nu, i våran funktionen, vi kallar funktionen som vi har skrivit ovan. Så vi nu går in i den andra funktionen. Vi kommer att skapa en ny variabel int x är lika med 100. Vad händer här på traven? Vad händer när du ringer ett funktion som skapar nya variabler? Vad händer här på traven? PUBLIK: [OHÖRBAR] högar på toppen? PROFESSOR: Ja. Så det faktiskt skapar en kopia. Och det slags högar ovanpå. Tänk på stack-- en stapel böcker, en bunt någonting. Högar på toppen, först i förra ut, sist in, först ut. Så det kommer att skapa en x här. Det kommer att ha alla funcs variabler. Bra. Så nu har vi två olika kryssen att representerar två helt olika saker. Sen ska vi ut ut heltalet för x. Så låt oss skriva ut 100, eller hur? För här är det 100. Så det är det första att det kommer att skriva ut. Eftersom denna funktionen returnerar ingenting, nu denna funktion, att linjen i huvud är klart. Alla bra med mig så här långt? Så vi är nu till två av de tre rader av vår huvuduppgift. Nu ska vi till den tredje raden. Vi kommer att printf. Vad är detta x inom huvud? Vad som representerar? Vilket värde är x nu? PUBLIK: 100. PROFESSOR: Det är 100? PUBLIK: Still 10. PROFESSOR: Still 10. Ja. Eftersom minns, inom vår funk, x är lika med 100. Men om vi återvänder tillbaka till vår huvuduppgift, den variabeln lagras i en annan plats på vår stack. Så nu måste vi gå tillbaka till Huvud stack, nät lokala variabler. Och här x är lika med 10. Och så ska vi skriva ut 10. Så hon var helt rätt. Vi kommer att ha Utsignalen från 100 och 10. Ja? PUBLIK: När du malloc, är det heap eller stack som är [OHÖRBAR]? PROFESSOR: När du malloc, du tar minne från högen och fördela det. Så att du inte har bråka med något av detta. Så jag antar att större takeaway här är något som kallas omfattning. För er som var på översynen sessionen i går kväll, Vi pratade kort om detta. Räckvidd definierar hur och när dina variabler existerar. Eller inom vilka ramar gör dina variabler existerar. Ganska mycket tumregeln i allmänhet är din variables-- om du skapar dem inuti lockigt braces-- de finns endast inom dessa klammerparentes. Så till exempel i vår funktion funk, ser du dessa två hängslen. Om du skapar något inuti det, chanserna är allt du gör är skapa en stapel och lagra det där. Samma sak i main. Det är bara förvaras inuti huvud. Även du vill vara mycket, mycket försiktig här. Eftersom omfattningen lånar också sig till olika exempel. Så t ex en för loop, för int i lika med 0. Jag är mindre än, jag vet inte, 10. Jag plus plus. Och du har koden inne i den, eller hur? Var gör denna variabel, i, egentligen bara existerar? Bara insidan av för loop. Så jag satsade många av er har förmodligen stött på detta fel när du gör program i din psets. Hur många av er har försökt att använda i utanför en for-loop och hade ett fel? Liknande en orefererade heltal eller något sådant? Anledningen till det händer är för här är skapa något som bara finns inom din for-loop. Och om du försöker använda det, gör jag inte faktiskt existerar utanför det. Så i princip en dator säger jag vet inte vad du pratar om. Allt jag vet är att en jag var här, men nu inte längre. Så om jag skulle skapa en för slinga inne, eller hur? Och jag kommer att skapa en ny, som int j, och har den gör vad som helst. Och du har en kod inuti denna slinga, j existerar endast här. Men det finns även inom i. Och så j endast existerar inom detta för loop, medan jag finns i det hela. Alla klart? Samma sak med villkorssatser Om du vill skapa någonting. Samma sak med while-slingor i förekommande du vill skapa någonting. Det är något att vara mycket, mycket försiktig. Så det här var ett riktigt bra problem i avkänna att det visade två saker. Det visade först, omfattning. Och det visade även minnesallokering. Eftersom ni bör veta att funktioner växer uppåt i stapeln. Och att när du ringer funktioner, skapar du i huvudsak en ny stapel av minnet. Detta är mycket annorlunda från vad din huvudminne är. Ja. Puh! Alla OK om det? Det var förvirrande. Mycket bra ämnen att gå över, eftersom du förmodligen kommer att få några knepiga saker som på frågesport. Ja. Häftigt. Jag ska sätta dig att få 100 på en linje och sedan 10 på den andra. Ja, mycket bra. OK, nu ni kommer att få chansen att vara resebyråerna. Du får svara på alla härliga e-postmeddelanden som jag får ibland. Så, kära Andi, jag ser att jag tror att något är gå fel med min kompilator. Jag är säker på att min kod är korrekt, men jag får hela tiden en segmentering fel varje gång jag kör. Vad händer? Snälla hjälp, massor av kärlek. Om ni fick något liknande att hur skulle du reagera? Dessa är faktiskt mycket vanligt frågor som vi kommer att be dig. Är om vi ska ge er en scenario, ger vi oss din bästa gissning på vad som händer. Någon har en stab på vad som händer? Ja? PUBLIK: Kanske dereferenced den null, något som pekaren pekar på något null. PROFESSOR: Ja, det skulle vara en exempel på när det skulle hända. Men vad är större bild om vad som händer här? PUBLIK: Är det du försöker att få tillgång till minne som du inte ska ha tillgång till? PROFESSOR: Exakt. Så tänk på en seg fel, en off gränser, begränsat område i minnet att du inte ska röra. Så ganska mycket när du försöker att index-- som t.ex. du har deklarerat en array från noll till nio. Men du försöker röra den 10: e värde, har du inte tillgång till den. Eftersom du inte har förklarat det. Och så att datorn går att titta på det vara, uh oh, du försöker gå utanför gränserna för ett index. Jag kommer att ge dig en segmentering fel. Tänk på som segment, eller hur? En extra segment, är felet när du försöker bryta något och du bör inte vara där. Segmente fel är när som helst du försöker röra saker att du inte ska röra. Så vanliga exempel är ett index. Självklart, om du försöker att röra det var noll, som också skulle fungera lika bra. Om pekaren försökte röra saker som inte borde röra, som skulle också kunna fungera lika bra. Mest typiskt du kommer se detta i en matris. Alla bra? PUBLIK: Så om du vill att få tillgång till den 10: e punkten och det finns bara en gräns nio eller något. PROFESSOR: Ja, exakt. Ganska mycket. Häftigt. Kära Andi. Så vi har fått dessa underbara saker som kallas sorterar. Om Merge sort-- som vi sågen i exempel när David gjorde hela sak class-- varför, Om det är så mycket snabbare än någon av de andra slag, varför vi bry ens veta någon av de andra slag? Vad är denna fråga verkligen frågar dig? Vad är tre word-- PUBLIK: Vad är trade-off? PROFESSOR: Exakt. Det är vad frågan frågar. Vad är avvägningen mellan Merge sort verser andra typer? PUBLIK: Tar minnet, eller hur? PROFESSOR: Har du förklara det lite mer? Först ska vi förklara Merge butik. Hur fungerar merge sort fungerar? PUBLIK: Så det fungerar genom att dela allt i halv och sedan sätta ihop och omfördela det i ordning, som varje gång du kopplar uppsättningar. PROFESSOR: Ganska mycket. Så jag kan dra ut det här, men det skulle ta mig fem minuter att dra ut. Titta tillbaka på sektions bilderna där vi täckt Merge slag. Exakt. Så sätt merge sort fungerar är den delar saker i halv, och då är det bara tittar på första värdena av alla av dem och sorterar bara det. Kontinuerligt skapar nya arrayer och sätter saker mer och mer i ordning. Och så medan det är riktigt, riktigt snabbt eftersom it's-- du vet, en binär sökning är n log n. Du skapar så många olika matriser som du är med hjälp av en stor mängd minne. Och så medan det är snabbare, den avvägning här är att du använder mer minne. Och så, tips, sorterar och sökningar täcktes mycket mer i år än vad de har varit i år tidigare. Ni bör se till att återspeglas på testet. Jag skulle definitivt spendera tid att gå över vad alla de olika slag är, hur binär sökning, hur linjär sökning arbete. Hur man kanske pseudo koda de ut. Vilka är drifttider? Något liknande drifttider är mycket lätt att kopiera ner på en lapp ark, höger? Det är verkligen svårt när du är i mitten testet och du måste lista ut det. Kopiera den ner. Jag garanterar att du är kommer att behöva veta det. Vilka är de avvägningar? Värsta fall bästa fall för dem alla, mycket få veta. Ja? PUBLIK: Behöver vi vet hur att koda merge sort? Precis, behöver vi minns den rekursiva? PROFESSOR: Jag tvivlar starkt det, bara eftersom det är som ganska komplicerat. Men det kan inte vara omöjligt om vi be dig att använda pseudokod ut. Ja. Japp, OK, det ena mer. Detta kan ha kommit upp i du sista biten i en bit. Ja? Gjorde alla höra det? OK, så ganska mycket först allt, vilken typ av program skulle ge dig en utgång som denna? Kom ihåg att vi har bett dig att lära sig om denna nya typ av felsökning verktyg? Vad hette det? Valgrind, höger Det var ett program där du kan kalla det kunde hålla koll på allt minne du använder i ditt program och pågick. Så om du har något, som, definitivt förlorat, 40 bytes i ett block. Förmodligen du inte kom ihåg att befria den. För om du använder byte minne, som innebär att du har åtkomst till att minnet, men du har inte kunnat frigöra. Så du vill göra Se till att du är också använder free-- det är en function-- att befria alla av minnet omfördelas genom malloc. Häftigt. Så den här bilden, jag har det. Det är överallt i en hel del föreläsningar, i en hel del avsnitt diabilder. Du vill verkligen vara säker på du bara vet allt detta. Antingen i din anteckning blad eller om du vill memorera det, gärna. Det är verkligen, verkligen, verkligen viktigt. Också en mycket bra fråga som vi kan begära. Varför är Selection sort-- titta på Urval sort-- alla drifttider är n i kvadrat. Oavsett hur listan kommer till du som, så varför är Selection sort-- Jag ska ge er 30 andra tycker om detta. Eftersom det är typ av förvirrande. Det innebär en viss begrepps tanke. Varför skulle de körtider vara densamma i både de värsta och bästa fall? Ja? PUBLIK: Eftersom val Sortera varje position eller plats i denna lilla samling sak eller något annat. Så även i bästa fall, även om det är perfekt sorteras, det skulle fortfarande behöva vara, OK, en. I min första plats jag har en. Och gå igenom dem alla. OK, en den minsta. Och sedan går igen och är som, OK, två är den minsta av alla de saker. Men det återstår att kontrollera var och en. PROFESSOR: Ja. Så till exempel, låt oss bara säga Vi har en lista, redan sorteras, en matris en till fem. Det sätt som urvals slag är att det går igenom, det kontrollerar dessa två. Då kontrollerar dessa två. Och sedan kontrollerar och kontrollerar. Det håller kontrollera alla av dem, oberoende av om eller inte det är faktiskt sortering. Eftersom det är enkelt vägen sorteringen fungerar. Och så denna fråga är ungefär som en konceptuell fråga kommer vi att be. Var först, du vet vad val Sortera är rätt, för att kunna att besvara frågan. Du måste kunna förstå konceptuellt vad som händer. Och då kan du använda den och tänker, OK låt oss bara föreställa värsta scenariot. De är alla i fallande ordning. Hur skulle det påverka det? Tänk om det är stigande ordning? Om det redan är sorterade? Hur skulle det påverka drifttider? Och sedan val Sortera, kommer du att märka att det faktiskt inte spelar någon roll. Eftersom du kollar alla värden oavsett vad som händer. Och så bra saker att komma ihåg. Varför vissa typer skiljer sig från andra och hur man bäst och värsta scenarier skulle påverka dem alla. Jag ska verkligen hit i sorterar eftersom det kommer att vara på testet. Ja. OK. Det finns sex minuter kvar. Jag kan ta tre minuter av frågor. Jag kan också hänga för som 20 minuter efter avsnitt Om du vill ställa frågor samt. Har någon bara riktigt kort frågor eller konceptuella frågor de är oklart om just nu? Ja? PUBLIK: Kan du berätta lite lite om bitvisa operatörer? PROFESSOR: Ja. Så bitvisa operatörer är något som du förmodligen kanske bara vill sätta på bladet. Så quickly-- jag inte vill att gå för mycket på djupet eftersom Harvard, i sin granskning session täckte det ganska bra. Bitvis operatör, det finns fem av dem, eller hur? Det är det här som är x eller funktion, det finns et-tecken, som är och. Rör, som är eller. Och sedan har de två olika typer av skift. Om jag ger dig två värden, om Jag ger dig, som, en och en. Vad skulle det utvärderas till? Om jag ger dig sann och sann, sant? Vad sägs om sant eller falskt? Fortfarande sant, eller hur? Eftersom det finns en eller. Vi kommer troligen att ge dig siffror. Så kom ihåg, en lika sant, noll är lika falskt. Och vi kan ge dig dessa saker och ber dig att berätta för oss vad som händer. Harvard täcker det inom den första 10 minuter av deras studie session riktigt, riktigt bra. Så ni vill göra att du ser tillbaka på det. PUBLIK: Är pisa5 kommer att vara på frågesport? PROFESSOR: Nej Inte ens titta på pisa5 just nu. Det är svårt. Bara inte ens bry tittar på pisa5. Eftersom några tips och förslag, jag skulle föreslår att du börjar pisa5 så snart som testet är över. Detta kommer att bli den svåraste vecka, men då ni kommer att vidarebefordras det på kullarna av böljande gröna och valpar, och det är bra. Denna klass får betydande lättare efter den femte pset. PUBLIK: Kontorstider är söndag, måndag? PROFESSOR: Ja, så kontorstid kommer söndag till måndag för pset. Kontorstid ikväll väsentligen kommer bara vara översyn för testet. Om någon vill komma in och fråga Tas en fråga, kommer vi att vara där. Jag tar kanske en fråga om någon har en fråga? Ja? PUBLIK: När du är definierande noderna, [OHÖRBAR] om du säger nod stjärna och sedan nästa, gör datorn automatiskt förstår att du är hänvisar till en annan pekare? PROFESSOR: Nej PUBLIK: Du måste länka det [OHÖRBAR]? PROFESSOR: Så i princip struct av en nod, kom ihåg, det är som du skapar noden och så har du en pekare som heter nästa. Allt du gör är att ha strukturen där. Du måste tilldela att pekaren någonstans. Så datorerna inte vet vad den gör ännu. Du måste faktiskt tilldela den när du skapar din länkad lista. Och det är vad huvudsakligen pset 5 kommer att vara på. Så ingen oro något av det just nu. PUBLIK: Så vi behöver inte fokuserar för mycket på länklistan, precis den allmänna uppfattningen? PROFESSOR: Bara ganska mycket stackar, köer, länklistor, träd, hashtabeller. Bara att kunna veta vad de är. Vi kommer inte att fråga du något särskilt eftersom vi inte har verkligen gjort ett pset att täcka något av det ännu. Så i de sista två minuter innan Jag ställa dig fri att döda det här testet. Ganska mycket, liksom, tänk på hur långt ni har kommit i denna klass. Jag minns när vecka två i denna klass, en del av er spendera tre timmar att skriva vatten. Hur lång tid skulle det ta dig killar att skriva vatten nu? 30 sekunder, kanske? Tänk på hur mycket ni har lärt sig. CS är en riktigt, riktigt hårt ämne. Det är ingen tvekan om det. Det är svårt, det är därför ingen man studerar det. Det är bara svårt. Och det är helt bra. Och jag är verkligen stolt över att alla har gjort det här långt. Psets är inte lätt. De tar en hel del tid. Ni kommer jag aldrig att be dig att skriva spelet 15 eller Vigenère på pset. Du behöver inte bara galen om det. Allt vi testar här är att utvärdera din konceptuella kunskaper, samt som några av dina grundläggande färdigheter i kodning. Testet är utformat för att vara riktigt utmanande. Precis, det är utformat för dig att inte få 100. Det är också utformad för dig att förmodligen inte att kunna avsluta i 75 minuter. Och det är helt bra. Jag är en student själv. Jag vet, jag hatar det när jag går av en frågesport vara, skit. Det var verkligen svårt. Förmodligen vad som kommer att happen-- och det är helt bra, Jag säger er just nu. Medlen på dessa saker är inte hög alls. Och för er som har fått, liksom, treor på dina problem uppsättningar, det betyder inte att du är kommer att få en 60 procent i denna klass. Om du får 60% på quiz, som inte menar du kommer att få en D i denna klass. Vi ser, speciellt jag, för de av er i min avdelning, Jag ser hur hårt ni arbetar alla. Och jag håller koll på det. Ni kommer att bli bra. Det finns inget institutionellt minne av lycka i slutet av terminen. Eftersom alla Harvard barnen berättar deras vänner, åh, ska du vara fina. Ingen säger er det här. Så jag måste berätta för er att här. Ni kommer att bli bra. Jag är så stolt över alla er. Testet kommer att bli svårt. Studera för det, och efteråt bara kasta bort det. Gör dig redo att lära sig nya saker. Och äta godis. Vi har har massor av godis. Få en god natts sömn. Inte inte sova, eftersom det skulle vara riktigt dåligt. CS är en hel del logik. Om du inte sover, kan du inte fungera, och din hjärna kan inte fungera. Och jag kommer att vara här för nästa 20 minuter om någon vill hänga. Ni kommer att döda den. Lycka till.