DAVID MALAN: All right. Så dette er CS50, og dette er nå i starten av uke tre. Så frem til nå, har vi vært å skrive programmer i C som ser litt noe sånt som dette her. Så vi har fått et par skarp omfatter på toppen. Vi har fått int, main, ugyldig, og deretter noe å gjøre i midten, noen bit av koden inne av denne funksjon. Men nøkkelen har vært det faktum at har vi vært å si ugyldig her. Så ugyldig, alle av denne tiden, spesifiserer at dette programmet, når det kjøres, kan bare kjøres via sitt navn. Du kan ikke skrive andre ord eller Tallet bak programmets navn når kjører den. Så, for eksempel, dersom programmet var samlet i en fil som heter hello, du kunne gjøre ./hello, men det er det. Den eneste måten du kunne gi innspill til dette programmet er ved å kalle en funksjon. For eksempel, hva funksjon vi har brukt så langt å få input fra brukeren? PUBLIKUM: Få streng. DAVID MALAN: For å få streng, eller få int, eller du har sett andre, selv om du ikke har brukt dem ennå, som får lang, lang og lignende. Men anta at vi faktisk ønsker å starte skrive programmer som er litt mer allsidig, og, ærlig, litt mer som kommandoene som du har fått, forhåpentligvis, litt vant til. Som cd plass Dropbox. Dette er selvfølgelig endringer katalogen din, forutsatt du er i John Harvard hjem katalog, til din Dropbox-mappen. I mellomtiden, en kommando som dette oppretter en ny katalog kalt pset2, som du kanskje allerede har eller vil snart for oppgavesettet to. Gjør Hei, selvfølgelig, er en kommando som bygger et program som heter hallo fra en fil som heter hallo dot c. Og i hver av disse tilfeller nå, vi har hatt gi et argument på den såkalte kommandolinjen, den blinkende teksten, slik at make vet hva du skal bygge, og så at mkdir vet hvilken mappe for å opprette, og slik at cd vet hvor du ønsker å gå. Men frem til nå, holder vi sier at hoved, standardfunksjon, har et tomrom uttrykk innsiden av disse parentes, hvilket betyr at den kan ikke ta noen argumenter. Så starter i dag, hva vi skal gjøre er, kommer vi til å starte støtte ting som dette selv. Faktisk, i dette tilfellet, som du ikke vanligvis manuelt skrive, Gjør har gjort dette for oss, det er ikke en, men en, to, tre ekstra strenger etter programmets oppkalt klang. Så hvordan oppnår vi dette? Vel, som starter i dag, i tilfeller der vi ønsker til å gi innspill via såkalte kommandolinjen, vi kommer til å begynne å legge her hva som er i yellow-- erstatte tomrommet med int argc komma streng argv åpen brakett nær braketten. Nå er dette interessant for et par grunner. En, det kommer til å la oss skrive programmer som er litt mer dynamisk. Men, mer overbevisende, det kommer til å åpne opp nå en samtale som til hva arrays kan virkelig benyttes, for hva en streng virkelig er under panseret, til neste uke når vi begynner å dykke i enda dypere om hvordan maskinen er gjør alt dette ting fungerer. Men for nå, la oss tegne, kanskje et bilde. Når du skriver et program med hoved erklærte på denne måten, slik at hoved tar to argumenter, en int og-- hva datatype er det andre argumentet? PUBLIKUM: Array. DAVID MALAN: Array. Så det ser ut ved første øyekast ut som det er en streng, men legge merke til hakeparenteser. Husker siste gang vi introduserte oppfatningen av en matrise. Og arrays bruker hakeparenteser i et par sammenhenger. Du kan bruke plassen braketter for å gå inn i en matrise og få et bestemt element, som brakett 0 eller brakett 1 eller brakett to. Men vi så, hvis kort, forrige uke at du også bruke disse hakeparenteser til erklære størrelsen på en array, hvis du vet på forhånd hvor mange ints eller hvor mange strenger eller hva du faktisk ønsker. Så det viser seg at det er en tredje sammenheng her som ikke har noen tall på innsiden av hakeparenteser. Når du angir, som jeg har her, navnet noe sånt som argv, som er bare en fancy måte å sier argument vektor, som er en annen fancy måte sier en rekke argumenter, åpen brakett nær braketten bare betyr at du ikke nødvendigvis vet på forhånd hvor stor matrisen kommer til å være, men du vet det kommer til å bli en matrise. Så hvis du ikke kjenner antall ikke sette det inn der, for åpen brakett nær brakett betyr at argv ikke er en streng, men en rekke strenger. Så syntaktisk, hvis du tenker tilbake forrige uke, det er svært lik si noe sånt int aldre åpen brakett, og deretter noe etterpå. Så hva betyr dette se ut? La oss faktisk tegne et bilde. Så når du kjører dette programmet med Hoved Å ha to argumenter definert inne av disse parentes, du egentlig ha minst to biter minne levert til deg under panseret. En, som jeg skal trekker da dette rektangel, kommer til å bli kalt argc. Og akkurat som en rask oppsummering, hva er datatypen argc? Så det er en int. Så mange kommer å gå i argc-- svinger ut som står for argumentet teller. I mellomtiden har jeg trukket argv som en matrise. Og jeg vet egentlig ikke hvor lang tid det kommer til å bli, så for dagens formål dot dot dot. Det kan komme av litt lengde. Men jeg har avbildet her minst fire rektangler. Så argv en mengde minne som lagrer string string string dot dot dot, og argc er bare en del av hukommelse for et heltall. Så nå, la oss være litt mer presis. Hvis, når jeg har strenger i denne matrisen, kalt argv, ønsker jeg å få på dem individuelt, akkurat som i forrige uke, vi kommer til å bruke notasjon som argv brakett 0 å få det første en matrise. Argv brakett 1 for å få den andre ting, og så videre. Nøkkelen her er vi fortsatt 0 indexed-- vi fremdeles telle fra 0. Så nå la oss faktisk sette noe i dette. Hvis jeg var å kompilere et program som heter Hei fra en fil som heter hallo dot c, og da jeg kjøre dette programmet med dot slash hello, hva gjør datamaskinen min, min laptop, se ut under panseret For øyeblikket kjører jeg dot slash hei og trykk Enter? Vel, dette er kanskje hva vi kunne beskrive som innholdet i datamaskinens minne, eller RAM-- Random Access Memory. Med andre ord, datamaskinen en eller annen måte for deg magisk, setter nummer 1 i argc, AKA argcount, og det setter bokstavelig talt strengen ./hello i argv brakett 0. Jeg aner ikke, ærlig talt, hva er i argv brakett 1 eller 2 eller 3, fordi hvis brukeren har ikke skrevet noe i tillegg ./hello, vi kommer til å anta at disse er mest sannsynlig søppel verdier, så å si. Disse biter av minne eksisterer, men det er ikke opp til oss å se på dem, fordi den argcount er bare én. Nå, i mellomtiden, hvis jeg skrive kjøre et annet program, cd, som er mer riktig en kommando, i din blinker prompt-- cd plass Dropbox-- når jeg kjører det, effektivt, når cd-programmet kjører, argc, innsiden av datamaskinens minne, er for den mest briefest andre nummer 2. Og så argv brakett o har cd, argv brakett 1 har Dropbox, og da selvfølgelig kommandoen er fullført, slik at alt dette minnet hovedsak går bort og brukes til noe annet. Og det er derfor jeg sier bare et brøkdels sekund. I mellomtiden, hvis vi gjør mkdir pset2, bildet ser nesten det samme, men med forskjellige strenger inne argv. Hvis jeg gjør klang dash hallo hei dot c, samme idé. Flere ting er fylt ut for argv, og argc, selvfølgelig, er fire. Så med andre ord, selv om denne matrisen kan bli dot dot dot, av noen variabel lengde, så å si, vet du alltid hvor slutten av det er, fordi argc kommer til å fortelle deg på hvilket punkt du må stoppe å se på elementer i argv. Du kan bare se på fire totalt i dette tilfellet. Så la oss nå ta en titt på, kanskje et enkelt program. En som bare sier hei til noen som Zamyla. Så jeg hevder jeg kommer til å skrive et program i bare et øyeblikk via hvor jeg kunne gjøre ./hello plass Zamyla, og da vil jeg mitt program for å skrive ut noe super-enkel som "hallo, Zamyla." Nå i det siste har vi brukt getstring. Så i det siste, selv om du er ny på programmering, oddsen er at du kan piske opp en program som bruker getstring og deretter bruker printf å si hei til Zamyla. Men la oss ikke bruke getstring denne gangen. La meg i stedet gå inn i Appliant og inkluderer standard I O dot h. La meg inkluderer også CS50 dot h. Nå int main, og nå er jeg ikke kommer til å gjøre ugyldig i dag. I stedet kommer jeg til å gjøre int argc streng argv åpen brakett tett brakett, ikke å angi et tall. Og nå her er min såkalte å gjøre. Hva jeg skal gjøre nå er, er jeg kommer til å gjøre litt av en porsjon tro, Jeg kommer til å anta at brukerens kommer til å bruke dette programmet riktig, og jeg bare kommer til å gjøre printf hallo,% sn. Så ikke noe nytt der. Men jeg vil nå plassere hva ordet brukertyper etter programmets navn. Så hvis jeg gjør ./hello plass Zamyla, jeg vil liksom programmatisk tilgang sitere unquote "Zamyla." så jeg kan gå inn i mitt argument vektor, min tabell med strenger, og hvis kommandoen, igjen, var ./hello plass Zamyla, hvilket nummer ønsker jeg å sette i argv her? PUBLIKUM: 1. DAVID MALAN: 1, fordi brakett 0 slår ut kommer til å være den programmets navn, som vi så. Så trinn 1 er det første ordet at jeg, brukeren, har skrevet. Jeg kommer til å gå videre og lagre dette. Jeg kommer til å gå inn i mappen min hvor jeg har plassert denne filen. Jeg kommer til å gjør hallo tre. Comp IO er OK. ./hello Zamyla Enter. Hva gjorde jeg galt? Jeg ble fanget opp av overraskelse meg selv for bare et øyeblikk der. Hva gjorde jeg galt? PUBLIKUM: Navn. DAVID MALAN: Filen er faktisk kalt hello3.c. Og jeg gjorde det bare for konsistens, fordi vi har hadde hello.c tallet i fortid i den elektroniske kode. Så la oss fikse dette ./hello brakett dash 3 Zamyla. Enter. Og nå har vi hello, Zamyla. I mellomtiden kan jeg endre dette til være Rob, eller egentlig et annet ord. Men la oss vurdere et hjørne tilfelle. Hva kan du forvente vil skje hvis Jeg vet ikke skrive noen navn i det hele tatt? PUBLIKUM: Feil. DAVID MALAN: En feil av noe slag, kanskje. La oss se. Enter. Null. Så printf er faktisk å være litt beskyttende av oss her, og bokstavelig talt skrive åpne paren null, men enda verre ting kan skje. Og bare for å demonstrere noe du absolutt ikke bør gjøre, la oss gå i her og begynne å rusle rundt. Høyre? Hvis jeg vet at bildet i minne er egentlig dette, argv brakett 1 har Zamyla, argv brakett 0 har ./hello, eller ./hello-3. Hva er i braketten 2? Så jeg kan svare på det spørre meg selv, ikke sant? Jeg kan bare endre en til en 2. Jeg kan nå rekompilere hallo 3, ./hello3 La oss zoome inn og trykk Enter. Whoops. Ingen mark sitat. Interessant. Så det er litt kult å se hva annet er i her. Så hva annet er inne i min laptop? La oss lagre det med brakett tre. Gjør hello3, ./hello-3. Nysgjerrig. Og nå la oss få virkelig bold-- 50. Så det er virkelig et dypdykk inn i datamaskinens minne. 50 indekser i. Så gjør hallo 3 ./hello-3. Nysgjerrig. Greit, nå er jeg bare kommer til å få uvøren. La oss gå til 5000. Greit. Så la meg rekompilere. Gjør hello3, ./hello-3. OK. Nå er noen av dere, det kan være en lyspære går av. Hvor mange av dere har sett denne meldingen før? OK. Så, hvorfor? Odds er-- og det er annerledes ting som kan forårsake dette, og tydelig du er i god company-- vi har klart forårsaket det som kalles en segmentering feil. Og lang historie kort for i dag, jeg har rørt et segment av minne at jeg ikke burde ha. Der et segment betyr bare en blings minne som jeg ikke burde ha. Nå datamaskinen garanterer at hvis jeg kjøre ./helloZamyla at jeg kan røre argv være brakett 0 og argv brakett 1. Men argc er verdi 2, betyr at jeg er bare allowed-- det er liksom æren system-- å røre brakett 0 og brakett 1. Hvis jeg går noen lenger, det er absolutt kommer til å bli minnet der. Min RAM finnes fysisk i datamaskinen. Men hvem vet hva som er der? Ja, jeg kjører flere programmer på en gang. Jeg kan ha seen-- hvis jeg ikke var å gjøre dette på Appliant men på min Mac eller PC-- kanskje jeg har sett innholdet i en e-post. Jeg har kanskje sett en umiddelbar Melding Jeg har nylig sendt. Noe som kan være dvelende rundt i minnet kunne ha vist ved hjelp av denne vilkårlig hakeparentes notasjon. Eller, enda verre, kanskje du har funnet en av mine passord at jeg nylig skrev i, at en programmet hadde lagret i minnet slik at å godkjenne meg, og deretter bare slags forlot det i RAM før jeg avslutter det programmet. Og ja, dette er en av faren og ett krefter for å bruke et språk som C. Du har uhemmet tilgang til hele innholdet av et program minne, og hva skurkene kan gjøre selv i de cases-- spesielt når vi komme til web-programmering mot slutten av semesteret, vil vi se dette topic-- er rote rundt, potensielt, er noen datamaskinens minne og finne slike nysgjerrige ting som vi så der. Eller enda verre ennå, passord som han eller hun kan deretter bruke til å gjøre dårlige ting. Så klart jeg ikke burde ha gjort dette, fordi rare ting begynner å skje. Ja, dette er et program krasjer. Dette ville være det samme av Mac OS eller Windows et programvindu bare forsvinner. Det har oppstått en uventet feil. I kommandolinjemiljø vi ser noe som dette. Men det er derfor, er jeg rett og slett rørende minne som ikke tilhører meg. Så la oss forsvare seg mot dette en litt på en annen måte ved å se på dette programmet her. Så, igjen, skjelettet at vi så earlier-- og jeg har fremhevet denne gangen int. Og hele denne tiden har hoved faktisk returnerte verdi. Selv om det i de fleste av våre foredrag eksemplene vi har aldri en gang brukt tilbake noe i hoved. Vi bare skrive printf nær klammeparentes og det er det. Men gratis, hva kompilatoren gjort for deg, effektivt, returnerer 0 for deg. Slår out-- og det er litt counterintuitive-- at 0 er bra. Det betyr ikke falsk per se. 0 er god, og eventuelle ikke-0 verdi, har verden bestemt seg, kan betegne en feil. Så hvis du noen gang har messed noe opp på datamaskinen din, eller et program har nettopp dødd på deg og du har fått noen feilaktige vindu på skjermen, og sa feil negative 49 eller feil 23-- noen tilsynelatende vilkårlig value-- som er fordi en programmerer har hardkodet en verdi som negativ 49 eller positiv 23 til å representere et tall, tør si, av 4 milliarder mulige ting som kan gå galt i et program. Så hvordan kan jeg ta nytte av dette selv? Vel, la meg åpne opp et program som jeg skrev på forhånd, og rote rundt på nettet kalt hallo fire. Og det er nesten identiske, bortsett fra at sin har en liten bit av feilsjekking. I dette tilfellet, har jeg igjen erklærte Hoved som tar to argumenter, men denne gangen, på linje 17, varsel Jeg gjør litt av en mental helse sjekk. Jeg gjør at argc lik lik to. Fordi hvis det er, at betyr at jeg kan trygt berører ikke bare brakett 0, men brakett 1. Og jeg gå videre og skrive ut, i dette tilfellet, Zamyla eller Rob eller hva ord jeg skrev ut. Og nå bare for å få litt mer riktig, Jeg kommer til å eksplisitt gå tilbake 0 til betegne alt er bra. Ikke noe dårlig skjedde. Men etter konvensjonen, kommer jeg til å returnere en eller ærlig enhver ikke-0-verdi, hvis noe gikk galt. Nå kan brukeren ikke kommer til å virkelig legge merke til hva som skjer. Faktisk hvis jeg går inn i denne katalogen, vi zoome inn og gjør hallo 4, ./hello-4 Zamyla oppfører seg som jeg forventer. Men hvis jeg i stedet må du ikke skrive noe, ingenting synes å skje, men det ikke krasjer. Og hvis jeg i stedet gjøre noe som Rob er en Proctor i Thayer-- deling vilkårlig informasjon. Men legg merke til, argv 1, 2, 3, 4, og 5 skal nå eksisterer i minnet. Det også, er ikke hva mitt program forventer, fordi jeg har sjekket om argc tilsvarer equals 2 eller ikke. Så jeg nå forsvare mot dette. Nå, som en side, vi programmer-- eller snarere vi users-- aldri ser at 0 eller 1, men ved hjelp av en verktøy kalt Debugger, eller andre verktøy, så vi får se før lang, du programmerer faktisk kan se hva som kan være går galt inne i programmet. Så, noen spørsmål om argc? Yeah. PUBLIKUM: Jeg har sett hvor de har ikke hatt karakter, [uhørbart] bare sa streng stjerne d, som karakter stjerne komma. Er de tilsvarende her? DAVID MALAN: De er. Så spørsmålet er, har du tidvis sett programmer som dette som ikke gjør det si streng argv brakett men i stedet si noe som røye stjerners argv braketten. Og det er enda andre varianter som du kan se. De er faktisk tilsvarende. For nå har vi disse slags trening hjul på i form av streng i CS50 bibliotek, men i litt over en uke eller så vi kommer til å fjerne det obstruksjon helt og faktisk se på hva røye og stjernen er, og hvordan de er relatert til minne representasjon mer generelt. Så får vi komme tilbake til det. Andre spørsmål om vår argv eller argc? Yeah. PUBLIKUM: Hvorfor måtte det returnere en feil [uhørbart]? DAVID MALAN: Hvorfor gjorde det returnere en feil only-- oh! I det foregående tilfellet, når vi ble futzing rundt med minne, hvorfor gjorde det bare returnere en feil når jeg egentlig skrevet et stort antall? Korte svaret er, vi bare hadde flaks. Generelt sett, en datamaskin tildeler minne i biter, og det ga meg en stor nok del som Jeg slapp unna, uten å bli lagt merke til, rørende brakett 2, brakett 3, brakett 50, men så snart jeg presset min flaks, gikk jeg utenfor grensene av mengde minne operativsystemet hadde gitt meg. Og det er da det klemmes ned og sa nei. Segmentering feil. Yeah. PUBLIKUM: Hvordan fungerer datamaskin kjenner verdien av argc? DAVID MALAN: Hvordan fungerer datamaskin vet verdien av argc? Når du kjører et program, det programmet, av natur av den blinkende teksten, leveres rekken av ordene som ble skrevet ved ledeteksten, som var skrevet i ledeteksten. Og slik er det operativsystemet system som i det vesentlige fyller viktigste argumenter for deg. Så det er en av tjenestene at du får, liksom hemmelighet under panseret et operativsystem. Andre spørsmål? Yeah. PUBLIKUM: Hva betyr kjerne dump? DAVID MALAN: Hva betyr kjerne dump? Så det er et godt spørsmål. Og la meg gå tilbake til denne katalogen her. Og du vil merke at Jeg har en ny fil der. Det er faktisk kalt kjerne, og det er faktisk vanligvis en anstendig størrelse fil. Det er egentlig et øyeblikksbilde av innholdet i min program hukommelse eller RAM da det krasjet. Og dette vil være nyttig, potensielt, diagnostisk, når vi snakker i en fremtidig foredrag og avsnittet om feilsøking, fordi du faktisk kan gjøre tilsvarer et digitalt obduksjon på denne filen for å hjelpe finne ut hva du gjorde galt i programmet. Yeah. PUBLIKUM: Er argc en kommando i seg selv, eller kan du kalle det noe? DAVID MALAN: Godt spørsmål. Er argc en kommando i seg selv, eller kan du kalle det noe? Det er definitivt ikke en kommando. Det er rett og slett en variabel navn eller et argument navn, og så helt vi kan kalle dette foo, vi kan kalle denne baren, som har en tendens å være farten til ord som en datamaskin vitenskapsmann går til. Men etter konvensjonen, bruker vi argc og argv. Men det er bare et menneske konvensjonen, ikke noe mer. Greit. Så viser seg, har jeg vært fortelle en bit av en hvit lie-- og ærlig, i fremtiden, vil du se vi har vært å fortelle andre hvite løgner. Men for nå, vi kommer å skrelle tilbake en av disse. I dette tilfellet her når jeg tidligere kjørte et program som ./hello eller ./hello-3 Zamyla, hadde vi innholdet i min datamaskinens minne ser omtrent ut som dette. Men huske hva en streng er. Hva sa vi en uke siden hva en strengen faktisk er under panseret? PUBLIKUM: Array of tegn. DAVID MALAN: Det er en rekke tegn, ikke sant? Så vi kan ha en rekke strenger, men i sin tur en streng er en rekke tegn. Så hvis jeg virkelig ønsker å være anal når jeg tegner dette bildet, Jeg burde egentlig være tegning det litt mer som dette, hvorved i hver av disse indekser av min argv array, Det er i seg selv en hel streng som i seg selv er i en matrise. Og nå den hvite løgnen vi forteller i dag er at bildet ikke ser ganske som dette. Faktisk, de små rutene er vanligvis utenfor de store rektangler der. Men vi skal komme tilbake til det før lenge. Men dette er ./hello backslash 0, at det å være spesialtegnet som avgrenser slutten av en streng, og vi har fått en annen etter Zamyla navn. Så hva betyr dette? Vel, la meg gå videre og åpne seg to andre eksempler som er tilgjengelig på nettet. Det ene er kalt argv1.c og den andre er argv2. Det er en super-enkel program som er forskjellig fra tidligere programmer i at nå jeg bruker argc og argv opp her. Og nå er jeg integrere med en for løkke i ledningen 18, fra i = 0 på opptil argc. Og hva skal jeg gjøre med denne linjen med kode her? På engelsk. Dette viser åpenbart bruk av argc. Men på engelsk, hva gjør det gjøre hvis jeg kjører dette programmet? Yeah? PUBLIKUM: Det kommer til å skrive ut skjermen så mange ganger du vil. DAVID MALAN: Nettopp. Så uansett hva ordene jeg skriver ved ledeteksten, det er kommer til å gulpe dem på meg en per linje. Så la oss gå videre og gjøre dette. La meg gå inn i min katalog og gjør argv1 ./argv1. Og nå, la oss holde det enkelt. La oss gjøre noe med det første. Det gjorde skrive ut en ting, og det er faktisk navnet på programmet, fordi det er i braketten 0. Hvis jeg nå si foo, det kommer til å gjøre disse to, og hvis jeg sier foo bar, det kommer til å si disse tre tingene. Nå det er noe interessant, kanskje. Men husker at argv er en matrise av strenger, men en streng er en rekke tegn, slik at vi kan ta ting opp et hakk og bruke det grunnleggende logikk og lage kode som ser litt mer kryptisk, riktignok. Men ved å ha en nestet loop, noe beslektet til hva du kanskje husker fra Mario, for eksempel, hvis du gjorde det på denne måten. Så nå merke på linje 19, jeg er igjen itera over mine argumenter, fra 0 på opptil argc. Og nå på linje 21-- jeg er låne et triks fra siste week-- Jeg sjekker hva som er lengde på argv brakett jeg. Jeg lagrer det svaret i n. Og så er jeg integrere fra j på opp til n, hvor j er initialisert til 0. Så, konvensjon for telling. Når du har brukt i, hvis du har en nestet løkke, kan du ikke bruke i på nytt, ellers vil du clobber, potensielt, verdien utsiden av den indre sløyfe. Så jeg bruker j etter konvensjonen. Vi kan bruke k. Hvis du har mer enn k, har du sannsynligvis har for mye hekkende, typisk. Men legg nå merke til min printf linjen er litt annerledes. Jeg er ikke ut% s, jeg er utskrift% c, som, selvfølgelig, er en plassholder for en røye. Og nå merker dette syntaks. Ny. Vi har ikke sett det før. Men logisk, dette betyr bare få ith strengen i argv og få jth hva? PUBLIKUM: Character. DAVID MALAN: Character i denne strengen. Så ved å bruke hakeparenteser etterfulgt av hakeparenteser, dette er dykking først inn argv er strenger, og deretter den andre hakeparenteser med j er dykke inn tegnene den aktuelle strengen i argv. Og så, bare for godt mål, Jeg skriver ut en ny linje her. Så nå la meg gå videre og åpne opp en litt større vindu så vi kan se dette i aksjon. La meg gå inn i den mappen. Og nå gjør argv-2-- whoops-- gjøre argv-2, ./argv to. Enter. Og det er litt vanskelig å lese vertikalt men det er faktisk navnet på program, etterfulgt av en blank tråd. Nå la meg gå videre og gjøre foo. Tilsvarende vanskelig å lese, men det er faktisk skrive ett tegn per linje. Og hvis jeg gjør bar, er det nå skriver de linje for linje. Så takeaway her er ikke så mye at, wow, se på denne ryddig nytt triks hvor du kan få på innholdet av en rekke spesifikke tegn, men heller hvordan vi tar disse grunnleggende ideer som indeksering inn i en matrise, og deretter å indeksere inn i et array som var i denne matrisen, og bare bruke de samme ideene til litt mer avanserte eksempler. Men det grunnleggende virkelig har ikke endret, selv siden forrige uke. Nå er dette slags tidsriktig, i det, husker, i uke null vi spilte med en telefon bok som dette. Og selv om dette er åpenbart fysiske papirlapper, du kan slags tenke på en telefonbok som en matrise. Gjerne, hvis du skulle reimplement dette stykker disse bitene av papir i en datamaskin, sannsynligvis du ville bruke noe som en matrise for å lagre alle de navn og numre fra A hele veien gjennom Z. Så dette er fint, fordi det gir oss en mulighet, kanskje, for å vurdere hvordan du kan faktisk gjennomføre noe sånt. Som med en serie av dørene her. Så hvis jeg kunne-- vi trenger en frivillig til å komme videre opp. La oss se. Et ukjent ansikt kanskje, ukjent ansikt kanskje. Hva med oransje? Her. Oransje skjorte, kom opp. La oss gå videre nå og flytte disse dørene over til siden, flytte disse ut av veien for et øyeblikk. Hva heter du? AJAY: DAVID MALAN: Ajay. David. Hyggelig å møte deg. Greit. Så har vi bak disse seks dører digitalt på screen-- Eller, rettere sagt, syv dører på screen-- en hel haug med tall. Og jeg har fortalt deg ingenting i advance-- enige? AJAY: Ingenting på forhånd. DAVID MALAN: Alt jeg vil du skal gjøre nå er å finne for meg, og for oss, virkelig, nummer 50, ett skritt av gangen. AJAY: Nummer 50? DAVID MALAN: Tallet 50. Og du kan avsløre hva som er bak hver av disse dørene ganske enkelt ved å berøre den med en finger. Pokker. [Latter] [APPLAUSE] Veldig godt gjort. OK. Vi har en nydelig gave premien for deg her. Velg og vrak i filmene vi diskutert i forrige uke. AJAY: Oh, mann. Å, jeg har aldri sett Spaceballs. DAVID MALAN: Spaceballs. Greit. Så hold på bare et øyeblikk. How-- la oss gjøre dette en lærevillig moment-- Hvordan klarte du går om finne nummer 50? AJAY: Jeg valgte tilfeldig. DAVID MALAN: Så du valgte tilfeldig og hadde flaks. AJAY: Ja. DAVID MALAN: OK. Utmerket. Så nå, hadde du ikke fått heldige, hva annet kan ha skjedd bak disse dørene? Så hvis jeg går videre og avdekke disse tallene her, de faktisk er i tilfeldig rekkefølge. Og det beste du kunne ha gjort, ærlig, er ved, til slutt, i verste fall sjekke dem alle. Så du fikk super-heldig, som er ikke det vi vil kalle en algoritme. Ja, gratulerer. Men nå let's-- humor meg, hvis du kunne. La oss gå til denne kategorien her. Og her er tallene i klart hva synes å være en tilfeldig rekkefølge, og de var. Men nå hvis jeg i stedet krav at bak disse dørene er tall som er sortert. Målet er nå å også finne oss nummeret 50. Men gjør det algoritmer, og fortelle oss hvordan du går om den. Og hvis du finner det, holde deg filmen. Du ikke synes det, du gir den tilbake. AJAY: Så jeg kommer til å sjekke endene først, for å finne ut om there's-- [Latter og applaus] DAVID MALAN: Her går. La oss ta en titt på en av Ajay forgjengere, Sean, som ikke var fullt så heldig. OK, så din oppgave her, Sean, er følgende. Jeg har skjult bak disse dører nummer syv, men gjemt bort i noen av disse dørene i tillegg er andre ikke-negative tall. Og målet ditt er å tenke på dette øverste raden med tall som bare en matrise. Vi er kun en sekvens av biter av papir med tall bak dem. Og målet ditt er, bare ved hjelp av toppen matrise her, finne meg tallet syv. Og vi så kommer til kritikk hvordan du går om å gjøre det. Finn oss på nummer syv, takk. Nei 5, 19, 13. Det er ikke et lurespørsmål. 1. På dette punktet poengsummen din er ikke veldig bra, så du kan like godt holde det gående. Tre. Gå på. Ærlig talt, jeg kan ikke hjelpe, men lurer hva du selv tenker. SEAN: Jeg kan ta fra bare den øverste raden. DAVID MALAN: Bare den øverste raden. Så du har tre igjen. Så finn meg 7. [Publikum roper FORSLAG] Så begge disse var fantastisk svært forskjellige grunner. Så det er her vi slapp et øyeblikk siden, og nøkkelen innsikt her ble disse dørene hadde tall bak dem som ble sortert, den ideelle takeaway som er at du kan gjøre fundamentalt bedre i denne andre example-- og, ja, det var Seans første forsøk med tilfeldige tall like before-- men så snart som disse tallene er sortert, mye som telefonboken, hva kan du selvsagt gjøre? Eller hvordan kan du utnytte denne kunnskapen? Yeah. PUBLIKUM: Du går halvveis [uhørbart]. DAVID MALAN: Yeah. Nettopp. Så Ajay opprinnelige instinkt var å sjekke endene, som jeg husker, og da er vi liksom ferdig eksemplet raskt. Men hvis vi begynte å gjøre dette mer metodisk langs disse linjene, men starte kanskje i midten, fordi de er sortert, så snart vi avsløre nummer 16, vi derfor vet-- og la oss gjøre akkurat at-- vi derfor vet at 50, i dagens sak, må være til høyre. Så akkurat som i uke null når vi tore telefonboken i halvparten og kastet halvparten av problemet borte, samme ideen her. Vi kan kaste denne halv av problemet bort. Og sannsynligvis det du kan gjøre algoritmer, når du vet at 50 må være til høyre, hvis det er noe, er prøve der, i midten av de resterende dører. Selvfølgelig 50 er høyere enn 42, så vi kan kast denne rester fjerdedel av problemet bort, og endelig, identifisere noe sånt som 50. Men på samme måte som med den telefonboken, disse tallene ble gitt oss allerede sortert rekkefølge, noe som etterlater oss med spørsmålet, hvordan gjør du få ting inn i sortert orden? Og, ærlig talt, til hvilken pris? Det er én ting å være levert telefonboken og deretter imponere vennene dine ved å finne et telefonnummer virkelig fort, ikke sant? Rivende 32 sider ut for å finne en person ut av 4 milliarder sider, vi sa var en ekstremt eksempel. Men hvor mye tid tok det Verizon å sortere at telefonboken? Hvor mye tid tok det oss å sortere disse syv tallene? Det er et spørsmål som vi har hittil fullstendig ignorert. Så la oss svare på dette spørsmålet nå. Og vi er alle ut av filmer nå, men vi har noen stress baller. Dersom, si, åtte frivillige Ville ikke tankene å bli med oss ​​opp her? La oss gå videre og gjøre, hvor om dere fire, tre av dere her? Få noen nye ansikter. Og fire av deg der? Og now-- la oss ikke skjevhet her-- og nummer åtte over her på slutten. Kom opp. Greit. Så det vi har her i hver av dere er et tall. Hvis du ønsker å gå igjen, ta dette nummeret. Hva heter du? Artie: Artie. DAVID MALAN: Artie, ok. Du er nummer 1. AMIN: Amin. DAVID MALAN: Amin. David. Du er nummer to. Og gå videre, så jeg hånden du papirarkene, linje dere opp foran musikken står i samme rekkefølge som der oppe. ANDY: Hei, Andy. DAVID MALAN: Andy, er det fint å se deg. Nummer 3. JACOB: Jacob. DAVID MALAN: Jacob, nummer fire. Velkommen om bord. GRANT: Grant. DAVID MALAN: Grant. Nummer fem. ALANNA: Alanna. DAVID MALAN: Alanna, nummer 6. FRANCES: Frances. DAVID MALAN: Frances, nummer 7. Og? RACHEL: Rachel. DAVID MALAN: Rachel, nummer 8. Greit. Gå videre og få deg i denne rekkefølgen. La meg sette en gjenværende notestativet på plass. Hvor trenger du et stativ? OK. Gå videre og bare sette dine tall der publikum kan se dem på, musikken stå vendt utover. Og forhåpentligvis, vår første tilregnelighet sjekk her-- 4, 2, 6. Oh-oh. Vent et minutt. Vi har en 8. Jeg trenger å kaste deg fra eksempelet eller annen måte. Nei Nei, det er OK. La oss se. Vi kan gjøre dette. Stand by. Det vi går. Riktig. Greit. Så nå har vi 8, 1, 3 7, 5. OK. Utmerket. Så spørsmålet på hånden er, på hvilken pris, og via hvilken metode kan vi faktisk sortere disse tallene her slik at vi kan slags jobbe bakover, slutt, og decide-- er det egentlig imponerende, er det virkelig effektivt, at jeg kan dele og erobre en telefonkatalog? Er det virkelig effektivt at Jeg kan splitt og hersk de digitale brikker papir på bordet, om kanskje det kommer til å koste oss en formue i tid eller energi eller CPU-sykluser å faktisk få våre data inn i noen sortert rekkefølge? Så la oss stille det spørsmålet. Så først av, disse tallene er i ganske mye tilfeldig rekkefølge, og jeg kommer til å foreslå en algoritme, eller prosess som vi kan sortere disse folkene. Jeg kommer til å nærme seg dette ganske naivt. Og jeg kommer til å kjenne igjen at det er litt mye for meg å vikle meg rundt hele datasettet på en gang. Men vet du hva? Jeg kommer til å gjøre noen svært enkle marginale rettinger. 4 og 2 er ute av drift, hvis Målet er å gå fra 1 på opptil 8. Så vet du hva? Jeg kommer til å ha deg gutta bytte, hvis du bytter fysisk posisjoner og dine biter av papir. Nå 4 og 6, disse er i orden. Jeg kommer til å la de være. 6 og 8, de er i orden. Kommer til å la dem være. 8 and1, ute av drift. Hvis dere to ville ikke tankene å bytte. Nå 8 og 3, om dere kunne bytte. 8 og 7, om dere kunne bytte. Og 8 og 5, om dere kunne bytte. Nå er jeg ferdig? Nei, selvsagt ikke. Men jeg har gjort situasjonen bedre, ikke sant? Hva var navnet ditt igjen, nummer 8? RACHEL: Rachel. DAVID MALAN: Rakel har effektivt boblet opp ganske langt, hele veien til enden av mitt utvalg av tall her. Og slik at problemet blir slags løst. Nå, tydelig, trenger to fortsatt til bevege seg litt, og 4 og 6, og en. Men jeg synes å ha fått et litt nærmere til oppløsningen. Så la oss bruke dette samme naiv heuristisk igjen. 2 og 4, OK. 4 og 6, OK. 6 og 1, mm-mm. La oss swap. 6 og 3, mm-mm. La oss swap. 6 og 7 er OK. 7 og 5, nope. La oss swap. Og nå 7 og 8. Og hva heter du igjen? FRANCES: Frances. DAVID MALAN: Frances. Så nå Frances er i enda bedre stilling, fordi nå 7 og 8 er fullstendig boblet opp til toppen. Så 2 og 4, OK. 4 og 1, la oss swap. 4 og 3, la oss swap. 4 og 6, er du OK. 6 og 5, la oss swap. Og nå de gutta er gode. Vi er nesten der. 2 og 1, i rekkefølge, så bytte. Og nå la meg gjøre en mental helse sjekk. 2 og 3, 3 og 4, 4 og 5, 5 og 6, 6 og 7, 8. OK, så vi er ferdige. Men til hvilken pris jeg gjorde sortere disse tallene her? Vel, hvor mange skritt gjorde jeg potensielt ta når sortering disse folkene? Vel, vil vi komme tilbake til det spørsmålet. Men, ærlig talt, hvis du fikk litt lei, det er slags avslørende at dette ikke var Kanskje den mest effektive algoritmen. Og ja, ærlig, jeg svetter alle mer vandre frem og tilbake. Som ikke føler spesielt effektiv. Så la oss prøve noe annet. Hvis dere kunne tilbakestille dere til disse åtte verdier. God jobb. La oss ta en titt digitalt, for bare et øyeblikk før vi prøve noe annet, på hva som nettopp skjedde. Opp her, er du i ferd med å se en visualisering av disse åtte mennesker der blått og rødt søylene representerer tall. Den høyere baren, jo større antall. Jo kortere bar, jo mindre tall. Og hva du kommer til å se er i tilfeldig rekkefølge mer enn åtte av dem. Du kommer til å se disse barene bli sortert etter at samme algoritme, eller et sett med instruksjoner, som vi kaller heretter boble slag. Så legger merke til, hvert sekund eller så, to barer er å lyse opp i rødt, blir sammenlignet med datamaskinen. Og så hvis den store baren og liten bar er ute av drift, de blir byttet for meg. Nå er dette utrolig kjedelig å se på dette, i hvert fall, på veldig lenge, men legger merke til takeaway-- store barer flytte til høyre, små barer flytter til venstre. La oss avbryte denne prosessen og hastighet opp dette å være mye raskere, så vi kan få et høyt nivå følelse av hva, faktisk er boble slags gjør. Faktisk er det bobler opp til høyre side av listen, eller matrisen, jo større barer. Og omvendt, de små barer er boblende vei ned til venstre, om enn i et raskere tempo enn vi tidligere gjorde. Så, vanskeligere å se med mennesker, men visuelt det er det faktisk som foregikk. Men la oss prøve en fundamentalt annen tilnærming nå. La oss prøve en annen algoritme slik vi har deg Gutta starter i disse opprinnelige posisjoner, som var denne rekkefølgen her. Og la oss gå videre nå. Og jeg kommer til å gjøre noe enda enklere, ikke sant? I ettertid, bytte parvis igjen og igjen, nesten litt smart. La oss gjøre ting enda mer naivt, der hvis jeg vil sortere disse folkene, la meg bare holde utkikk for den minste element. Så akkurat nå, er fire av minste tallet jeg har sett. Jeg kommer til å huske det. Nei, to er bedre, og husk at. 1 er enda mindre. 3, 7, 5. OK. One-- hva heter du igjen? Artie: Artie. DAVID MALAN: Artie. Så, Artie, gå videre. Jeg kommer til å trekke deg ut av linjen. Hvis du kunne komme tilbake hit. Og jeg trenger å gjøre plass for ham. Vi har et beslutningspunkt her. Hvordan kan vi gjøre plass til Artie her i begynnelsen, hvor tallet 1 hører? PUBLIKUM: Shift. DAVID MALAN: OK, vi kunne skifte alle. Men foreslå en optimalisering. Det føles litt irriterende for meg å spørre fire personer å flytte hele veien ned. Hva annet kan jeg gjøre? PUBLIKUM: Slå dem. DAVID MALAN: Slå dem. Og hva heter du igjen? JACOB: Jacob. DAVID MALAN: Jacob, flytte. Mye mer effektiv bare for å ha Jacob swap steder med Artie, i motsetning til å tvinge alle fire av disse folkene, tusen takk, til deres riktige stilling. Hva er fint om Artie nå, han er i sin riktige posisjon. La oss gjøre dette igjen. 2, det er det minste tallet jeg har sett. 3, 7, 5. OK. 2 er definitivt den minste. Trenger ikke å gjøre noe arbeid. La oss gjøre det igjen. 6. Minste? 8. Nope. 4? Ooh. La meg huske fire. Tre. La meg huske tre. 7, 5. Minste tallet jeg har sett på denne pass er tre. Hvis du ville komme på ut. Hvor skal vi sette deg? Og hva heter du? ALANNA: Alanna. DAVID MALAN: Alanna, er vi nødt til å kaste deg. Men det er mer effektiv, å bare bytte to personer, enn å ha flere personer faktisk omgå over. Nå la oss gjøre dette igjen. Jeg kommer til å velge 4, så kom ut. Og hvem kommer til å flytte? Nummer 8, selvfølgelig. Hvis jeg nå finne nummer fem, kom ut. Nummer 8 kommer til å bli kastet ut igjen. Jeg er nå kommer til å finne nummer 6 på plass. 7 på plass. 8 på plass. Det vi gjorde nå er noe som kalles utvalg sortere, og hvis vi visualisere dette, er det kommer til å føle seg litt annerledes. La oss gå videre og fra dette menyen her, dette visualization-- la oss endre dette til-- kom igjen, Firefox. La oss endre dette til valget slag. Og la oss fart opp som før, og start visualisering nå. Og denne algoritmen har en annen føler for det. På hver iterasjon, ærlig, det er enda mer direkte. Jeg er bare å velge det minste elementet. Nå, ærlig, fikk jeg litt heldig at tid, ved at det sorteres super-hurtig. Elementene var tilfeldig. Det er ikke, som vi vil til slutt se, fundamentalt raskere. Men la oss se en tredje og siste nærme her om hva som skjer. Så la oss gå videre og nullstille dere en siste gang å være i denne rekkefølgen her. Og nå, jeg kommer til å være litt mer flink, bare for å runde ut våre algoritmer. Jeg kommer til å gjøre dette. Jeg skal ikke gå frem og tilbake så mye. Oppriktig, jeg er lei av alt dette traversering. Jeg skal bare ta det jeg er gitt i begynnelsen av listen, og jeg kommer til å sortere som der og da. Så her er vi. Nummer fire. Jeg kommer til å sette inn nummer 4 inn i en sortert liste. Ferdig. Jeg hevder nå, og bare for å gjøre dette mer klart, er dette en del av min liste sortert. Det er litt av en dum påstand, men faktisk 4 er sortert i en liste av størrelse én. Nå skal jeg ta på nummer 2. Nummer to er jeg nå kommer til å sette inn i rett sted. Så hvor kommer to hører hjemme? Selvfølgelig, over her. Så gå videre og flytte tilbake, hvis du kunne. Og hvorfor ikke dere bare ta musikken står med deg denne gangen. Og la oss med makt setter deg inn i begynnelsen av listen. Så litt mer arbeid. Jeg måtte flytte Jacob rundt, og hva heter du? AMIN: Amin. DAVID MALAN: Amin. Men minst jeg ikke gå frem og tilbake. Jeg bare tar ting som jeg går. Jeg bare setter dem på rett sted. 6, dette er faktisk ganske enkelt. La oss sette deg over det, hvis du ville bare flytte over litt. Nummer 8, også ganske enkelt. Rett der borte. Pokker. Nummer 1 Vi kan ikke bare bytte med Amin her, fordi det kommer å rote opp rekkefølgen. Så vi må være litt mer smart. Så, Artie, hvis du kunne sikkerhetskopiere et øyeblikk. La oss gå videre og skifte nå, i motsetning til våre tidligere algoritmer, å gi plass til Artie akkurat her i begynnelsen. Så på slutten av dagen, jeg er slags gjøre det jeg ønsket å unngå før. Og så min algoritmen er liksom av reversert, intellektuelt, fra hva det opprinnelig var. Jeg bare gjør det skiftende på et annet punkt. Nå er jeg på tre. Å, faen. Vi må gjøre mer arbeid igjen. Så la oss presse deg ut. La oss gå 8, 6, 4-- oh oh-- og 3 kommer til å gå rett der. Så i det minste liten besparelse av denne tiden. 7, ikke for mye arbeid som må gjøres. Så hvis du ønsker å pop tilbake, la oss sette deg. Og til slutt, fem, hvis du ønsker å komme tilbake, vi trenger å skifte deg, deg, du, inntil fem er på plass. Så nå for å se dette på en høyt nivå grafisk, la oss gjøre denne algoritmen visualisering en ekstra gang. Så skal dette vi kaller innsetting slag. Vi skal kjøre det like fort, og starte den her. Og det også, har en annen stemning. Det er liksom bedre og bedre, men det er aldri perfekt før jeg går inn og glatt i disse hullene. Fordi, igjen, jeg bare tar det Jeg blir gitt fra venstre til høyre. Så jeg fikk ikke så heldig at alt var perfekt. Det er derfor vi hadde disse små mispositions at vi fast over tid. Så alle disse algoritmene synes å kjøre på litt forskjellige skritt. Faktisk, som vil du si er den beste eller den raskeste så langt? Boble sortere, den første? Utvalg sortere, den andre? Sortering ved innsetting, den tredje? Jeg hører noen utvalgs sorterer. Andre tanker? Så det viser seg at alle disse algoritmene er fundamentalt like effektiv som hver other-- eller omvendt, akkurat som ineffektiv som hverandre, fordi vi kan gjøre fundamentalt bedre enn alle tre av disse algoritmer. Og det er litt av en hvit løgn, også. når jeg sier så effektiv eller som ineffektiv, det er i hvert fall for super-store verdier av n. Når vi har bare åtte mennesker her, eller kanskje 50 eller så stolpene på skjermen, vil du absolutt merke forskjeller Blant disse tre algoritmer. Men som n, antall personer, eller antall tall, eller antall personer i telefon bok, eller antall websider i Googles database blir større og større, vi får se at alle disse tre algoritmer er faktisk ganske dårlig. Og vi kan gjøre fundamentalt bedre enn. La oss ta en titt, til slutt, på hva disse algoritmene kanskje høres ut som i sammenheng med noen andre så vel ved hjelp av denne visualisering her som vil introdusere oss til en rekke algoritmer. La oss gå videre og gratulere våre deltakere her, alle av dem sortert seg svært godt. Hvis du ønsker å ta en avskjedsgave. Du kan holde tallene også. Og hva du vil se, eller rettere sagt høre, nå, er at når vi setter lyder til hver av disse stenger og knytte den sammen med programvaren, forskjellig frekvens av lyden, du kan vikle hjernen din mer audioly rundt hva hver av disse tingene se ut. Den første av disse er innsetting slags [TONES] Dette er boble slag. [TONES] Utvalg slag. [TONES] Noe som kalles flette slag. [TONES] Gnome slag. [TONES] Det er det for CS50. Vi vil se deg på onsdag. FORTELLER: Og nå, "Deep Tanker, "av Daven Farnham. Hvorfor er det en for loop? Hvorfor ikke gjøre det bedre? Jeg ville lage en fem loop. [Latter]