DAVID MALAN: Okay. Så det er CS50, og det er nu begyndelsen af ​​uge tre. Så indtil nu, har vi været at skrive programmer i C der ser lidt noget som dette her. Så vi har fået et par skarp omfatter foroven. Vi har int, vigtigste, ugyldige, og så er der noget at gøre i midten, nogle lidt kode inde af denne funktion. Men nøgle har været, at vi har sagt tomrum her. Så ugyldige, al den tid, specificerer at dette program, når det køres, kan kun køres via dets navn. Du kan ikke skrive eventuelle andre ord eller tallene efter programmets navn, når kører det. Så for eksempel, hvis programmet var samlet i en fil kaldet hej, du kunne gøre ./hello, men det er det. Den eneste måde, man kunne give input til dette program er ved at kalde en funktion. For eksempel, hvilken funktion har vi brugt hidtil at få input fra brugeren? Publikum: Få streng. DAVID MALAN: For at få streng, eller få int, eller du har set andre, selvom du ikke har brugt dem endnu, ligesom få lang, lang og lignende. Men formoder, at vi faktisk ønsker at starte skrive programmer, der er lidt mere alsidig, og helt ærligt, lidt mere ligesom de kommandoer, som du har været at få, forhåbentlig, lidt vant til. Ligesom cd plads Dropbox. Dette er naturligvis ændringer dit bibliotek, under forudsætning af du er i John Harvard hjem mappe til din Dropbox-mappe. I mellemtiden har en kommando som denne opretter en ny mappe kaldet pset2, som du måske allerede har eller vil snart til problemet indstille to. Gør Hej, selvfølgelig, er en kommando der bygger et program kaldet hej fra en fil kaldet hej dot C. Og i hver af disse tilfælde, nu har vi haft give et argument om den såkaldte kommandolinjen, den blinkende prompt, således at mærke ved, hvad at bygge, og så at mkdir ved, hvad mappe til at oprette, og således, at cd ved hvor du ønsker at gå. Men indtil nu, holder vi siger at main, din standard-funktion, har et tomrum udtryk indersiden af ​​disse parentes hvilket betyder, at det kan ikke tage nogen argumenter. Så starter i dag, hvad vi skal gøre er, vi kommer til at starte støtte ting som dette endnu. I virkeligheden, i dette tilfælde, som du typisk ikke manuelt skrive, Foretag har gjort dette for os, der ikke én, men en, to, tre yderligere strenge efter programmets navngivet klang. Så hvordan kan vi opnå dette? Nå, der starter i dag, i de tilfælde, hvor vi ønsker at give input via såkaldt kommandolinjen, vi kommer til at begynde at tilføje her hvad der er i yellow-- erstatte tomrum med int argc komma streng argv åbneparentes luk beslag. Nu er det interessant for et par grunde. One, det kommer til at lade os skrive programmer, der er lidt mere dynamisk. Men, mere overbevisende, det kommer til at åbne op nu en samtale, at hvad arrays virkelig kan anvendes, hvad en streng virkelig er under kølerhjelmen, indtil næste uge, når vi begynder at dykke i endnu dybere, hvordan maskinen er gør alle disse ting arbejde. Men for nu, lad os tegne, måske et billede. Når du skriver et program med de vigtigste erklærede på denne måde, således at hoved tager to argumenter, en int og-- hvilken datatype er det andet argument? Publikum: Array. DAVID MALAN: Array. Så det ser ud ved første øjekast ligesom det er en streng, men læg mærke til de firkantede parenteser. Husk sidste gang vi introducerede begrebet et array. Og arrays bruger firkantede parenteser i et par sammenhænge. Du kan bruge pladsen beslag til at gå ind i et array og få et bestemt element, ligesom beslag 0 eller beslag 1 eller beslag 2. Men vi så, hvis kortvarigt, sidste uge, at du også bruge disse firkantede parenteser til erklære størrelsen af ​​et array, hvis du på forhånd ved, hvor mange int'er eller hvor mange strenge eller hvad du faktisk ønsker. Så det viser sig at der er en tredje sammenhæng her der ikke har nogen tal indeni af de firkantede parenteser. Når du angiver, som jeg har her, navnet på noget som argv, der er bare en fancy måde siger argument vektor, som er en anden smart måde at siger en række argumenter, åbneparentes luk beslag bare betyder, at du ikke nødvendigvis vide på forhånd, hvor stor array bliver, men du ved, det kommer til at være et array. Så hvis du ikke kender nummer ikke sætte det i der, til åbneparentes luk beslag betyder, at argv er ikke en streng, men en vifte af strenge. Så syntaktisk, hvis du tænke tilbage i sidste uge, det er meget lig at sige noget lignende int aldre åbneparentes, og så noget derefter. Så hvad betyder det se ud? Lad os faktisk tegne et billede. Så når du kører dette program med Main have to argumenter defineret inde af disse parenteser, du væsentlige har mindst to stykker hukommelse udleveret til dig under hætten. En, som jeg vil trækplastre som denne rektangel, kommer til at hedde argc. Og ligesom en hurtig resumé, hvad er den datatype argc? Så det er en int. Så en række går at gå i argc-- sving ud, der står for argument tæller. I mellemtiden, jeg har tegnet argv som et array. Og jeg ved ikke rigtig, hvor lang tid det kommer til at være, så for nutidens formål prik prik prik. Det kan få nogle længde. Men jeg har afbilledet her mindst fire rektangler. Så argv en luns af hukommelse, der gemmer streng streng streng dot dot dot, og argc er blot en luns hukommelse til et heltal. Så lad os nu være lidt mere præcis. Hvis der, når jeg har strenge i dette array, kaldet argv, jeg ønsker at få ram på dem enkeltvis, ligesom i sidste uge, vi kommer til at bruge notation ligesom argv beslag 0 at få den første ting et array. Argv beslag 1 for at få den anden ting, og så videre. Nøglen her er vi stadig 0 indexed-- vi stadig tælle fra 0. Så lad os nu faktisk sætte noget i dette. Hvis jeg skulle udarbejde et program kaldet Hej fra en fil kaldet hej dot C, og så skal jeg køre dette program med prik skråstreg hej, hvad betyder min computer, min bærbare computer, ligne under hætten det øjeblik, jeg kører dot skråstreg goddag og trykke Enter? Nå, det er måske hvad vi kunne beskrive da indholdet af computerens hukommelse, eller RAM-- Random Access Memory. Med andre ord, computeren en eller anden måde for dig magisk, sætter nummer 1 i argc, AKA argcount, og det sætter bogstaveligt strengen ./hello i argv beslag 0. Jeg har ingen idé om, helt ærligt, hvad er i argv beslag 1 eller 2 eller 3, fordi hvis brugeren ikke har indtastet noget udover ./hello, vi kommer til at antage, at disse mest sandsynligt er skrald værdier så at sige. Disse klumper af hukommelse eksisterer, men det er ikke op til os til at se på dem, fordi den argcount er kun én. Nu, i mellemtiden, hvis jeg skrive køre et andet program, cd, hvilket er mere korrekt en kommando, i din blinkende prompt-- cd plads Dropbox-- når jeg kører det, effektivt, når CD-program er kørt, argc, inde i min computer hukommelse, er for mest korteste andet nummer 2. Og så argv beslag o har cd, argv beslag 1 har Dropbox, og så selvfølgelig kommandoen færdig, så alt dette hukommelse hovedsageligt går væk og bruges til noget andet. Og det er derfor, jeg siger bare et splitsekund. I mellemtiden, hvis vi gør mkdir pset2, ser billedet næsten det samme, men med forskellige strenge inde argv. Hvis jeg gør clang bindestreg hej hej dot C, samme idé. Flere ting er udfyldt for argv og argc naturligvis er 4. Så med andre ord, selvom dette array kunne dot prik prik, nogle variabel længde, så at sige, du altid ved, hvor i slutningen af ​​det er, fordi argc vil fortælle dig på hvilket tidspunkt du nødt til at stoppe ser på elementer i argv. Du kan kun se på fire i alt i denne sag. Så lad os nu tage et kig på, måske et simpelt program. En, der bare siger hej til en som Zamyla. Så jeg påstår jeg har tænkt mig at skrive et program på bare et øjeblik, via hvilket jeg kunne gøre ./hello plads Zamyla, og så vil jeg mit program til at udskrive noget super simpelt som "Hej, Zamyla." Nu vi tidligere har brugt getString. Så i fortiden, selv om du er ny til programmering, odds er du kunne piske en program, der bruger getString og bruger derefter printf for at sige hej til Zamyla. Men lad os ikke bruge getString denne gang. Lad mig i stedet gå ind i Appliant og inkludere standard I O prik time. Lad mig også omfatte CS50 prik time. Nu int main, og nu er jeg ikke vil gøre ugyldig i dag. I stedet vil jeg gøre int argc streng argv åbneparentes luk beslag, ikke at angive et nummer. Og nu her er min såkaldte at gøre. Hvad jeg har tænkt mig at gøre nu, er, jeg er kommer til at gøre lidt af et spring af tro, Jeg har tænkt mig at antage, at brugerens kommer til at bruge dette program korrekt, og jeg blot at gå til gøre printf hej,% sn. Så intet nyt der. Men jeg vil nu sætte hvad ord den brugertyper efter programmets navn. Så hvis jeg gør ./hello plads Zamyla, jeg ønsker at en eller anden måde programmatisk adgang citere citat slut "Zamyla." så jeg kan gå ind i mit argument vektor min vifte af strenge, og hvis kommandoen, igen, var ./hello plads Zamyla, hvad nummer jeg ønsker at sætte i argv her? PUBLIKUM: 1. DAVID MALAN: 1, fordi beslag 0 viser sig kommer til at være den programmets navn, som vi så. Så beslag 1 er det første ord at jeg, at brugeren har indtastet. Jeg har tænkt mig at gå videre og gemme denne. Jeg har tænkt mig at gå ind i min mappe hvor jeg har placeret denne fil. Jeg har tænkt mig at gøre gøre hej 3. Comp IO Interactives OK. ./hello Zamyla Enter. Hvad har jeg gjort forkert? Jeg blev fanget af overraskelse mig selv for bare et øjeblik. Hvad har jeg gjort forkert? PUBLIKUM: Navn. DAVID MALAN: Filens faktisk kaldt hello3.c. Og jeg gjorde det bare for konsistens, fordi vi har havde hello.c er i fortid i online kode. Så lad os løse dette ./hello beslag Dash 3 Zamyla. Enter. Og nu har vi goddag, Zamyla. I mellemtiden kan jeg ændre dette til være Rob, eller virkelig et andet ord. Men lad os overveje et hjørne sag. Hvad kan du forvente vil ske, hvis Jeg skriv ikke nogens navn på alle? PUBLIKUM: Fejl. DAVID MALAN: En fejl af en slags, måske. Lad os se. Enter. Null. Så printf er faktisk at være lidt beskyttende af os her, og bogstaveligt udskrivning åbne paren null, men endnu værre ting kan ske. Og blot at påvise noget du absolut ikke bør gøre, lad os gå i her og begynde at rode rundt. Right? Hvis jeg ved, at billedet i hukommelse er i det væsentlige dette, argv beslag 1 har Zamyla, argv beslag 0 har ./hello eller ./hello-3. Hvad er i konsol 2? Så jeg kan besvare dette spørgsmålstegn ved mig selv, ikke? Jeg kan bare ændre 1 til en 2. Jeg kan nu rekompilere goddag 3, ./hello3 Lad os zoome ind og trykke Enter. Whoops. Ingen anførselstegn. Interessant. Så det er lidt cool at se, hvad der ellers er i her. Så hvad der ellers er inde i min laptop? Lad os gemme det med konsol 3. Gør hello3, ./hello-3. Nysgerrig. Og lad os nu få virkelig bold-- 50. Så det er virkelig dykning dyb i computerens hukommelse. 50 indekser i. Så gør goddag 3 ./hello-3. Nysgerrig. Okay, nu er jeg bare kommer til at blive hensynsløs. Lad os gå til 5.000. Okay. Så lad mig genkompilere. Gør hello3, ./hello-3. OK. Nu er nogle af jer, kan der være en pære går ud. Hvor mange af jer har set denne besked før? OK. Så hvorfor? Odds are-- og der er anderledes ting, der kan forårsage dette, og klart du er i god company-- vi har klart forårsagede, hvad der kaldes en segmentering fejl. Og lang historie kort for i dag, jeg har rørt et segment af hukommelse at jeg ikke skulle have. Når et segment betyder blot en luns hukommelse, som jeg ikke skulle have. Nu computeren garanterer, at hvis jeg køre ./helloZamyla at jeg kan røre argv være beslag 0 og argv beslag 1. Men argc er værdi 2, som betyder, at jeg er kun allowed-- det er lidt af æren system-- at røre beslag 0 og beslag 1. Hvis jeg gå længere, er der absolut vil være hukommelse der. Min RAM eksisterer fysisk i computeren. Men hvem ved, hvad er der? Faktisk, jeg kører flere programmer på én gang. Jeg kunne have seen-- hvis jeg ikke var gør dette på Appliant men på min Mac eller PC-- jeg måske have set indholdet af en e-mail. Jeg har måske set et øjeblik budskab Jeg har for nylig sendt. Alt, hvad der kunne være dvælende rundt i hukommelsen kunne have været adgang til ved hjælp af denne vilkårlige firkantet beslag notation. Eller værre endnu, kan du have fundet en af ​​mine adgangskoder at jeg for nylig havde skrevet i, at en program var lagret i hukommelsen, så de at godkende mig, og så lige slags forladt det i RAM, indtil jeg forlade programmet. Og ja, det er en af faren og én beføjelser at anvende et sprog som C. Du har uhindret adgang for hele indholdet af et program hukommelse, og hvilke skurke kan endda gøre i disse cases-- især når vi komme til web programmering mod slutningen af ​​semestret, vil vi revidere denne topic-- er poke rundt, potentielt, nogen er computerens hukommelse og finde sådanne nysgerrige ting som vi så der. Eller endnu værre endnu, adgangskoder, som han eller hun kan derefter bruge til at gøre dårlige ting. Så klart jeg ikke skulle have gjort dette, fordi underlige ting begynder at ske. Faktisk er det et program bryder sammen. Dette ville være det samme af Mac OS eller Windows et program vindue bare forsvinde. Der er opstået en uventet fejl. I kommandolinjen miljø vi ser noget som dette. Men det er derfor, er jeg blot at berøre hukommelse, der ikke tilhører mig. Så lad os forsvare sig mod dette en lidt på en anden måde ved at kigge på dette program her. Så igen, skelettet at vi så earlier-- og jeg har fremhævet denne gang int. Og al denne tid vigtigste har faktisk returneres en værdi. Selv om der i de fleste af vores foredrag eksempler, vi har aldrig en gang anvendte returnere noget i main. Vi skriver bare printf tæt klammeparentes og det er det. Men gratis, hvad compiler gjort for dig, effektivt, vender tilbage 0 til dig. Slår out-- og det er lidt counterintuitive-- at 0 er god. Det betyder ikke falsk per se. 0 er god, og enhver ikke-0 værdi, verden har besluttet, kan betyde en fejl. Så hvis du nogensinde har rodet noget op på din computer, eller et program er netop døde på dig og du har fået nogle fejlagtige vindue på skærmen, siger fejl negativ 49 eller fejl 23-- nogle tilsyneladende vilkårlig value-- der er fordi en programmør har hard-kodet en værdi som negativ 49 eller positiv 23 til at repræsentere et vilkårligt antal, tør sige, 4 milliarder mulige ting der kan gå galt i et program. Så hvordan kan jeg tage fordel af dette selv? Nå, lad mig åbne et program at jeg skrev i forvejen, og sækken rundt på nettet kaldet hej 4. Og det er næsten identisk, bortset fra at dens fik en lille smule af fejl-kontrol. I dette tilfælde har jeg igen erklæret vigtigste som at tage to argumenter, men denne gang, på linje 17, meddelelse Jeg laver lidt af en tilregnelighed check. Jeg gør sikker på, at argc lig lig med 2. For hvis det er, at betyder, at jeg kan sikkert røre ikke kun beslag 0, men beslag 1. Og jeg gå videre og printe den ud i dette tilfælde, Zamyla eller Rob eller hvad ord jeg har skrevet ud. Og nu bare at få lidt mere korrekt, Jeg har tænkt mig at eksplicit tilbage 0 til betyde alt er godt. Intet dårligt skete. Men ved konvention, vil jeg returnere 1, eller helt ærligt ikke-0-værdi, hvis noget gik galt. Nu brugeren ikke kommer til at virkelig mærke til, hvad der foregår. Faktisk, hvis jeg går ind i denne mappe, vi zoome ind og gør goddag 4, ./hello-4 Zamyla opfører sig som jeg forventer. Men hvis jeg i stedet ikke skrive noget, intet synes at ske, men det gør ikke ned. Og hvis jeg i stedet gøre noget ligesom Rob er en Proctor i Thayer-- deling vilkårlige oplysninger. Men varsel, argv 1, 2, 3, 4, og 5 bør nu findes i hukommelsen. Det er også hvad ikke mit program forventer, fordi jeg har undersøgt, om argc lig lig med 2 eller ej. Så jeg nu forsvare mod dette. Nu, som en sidebemærkning, vi programmer-- eller rettere vi users-- aldrig se, at 0 eller 1, men ved hjælp af en værktøj kaldet debugger, eller andre redskaber, som vi skal se, før længe, ​​du programmøren rent faktisk kan se, hvad der kunne være går galt inde i dit program. Så spørgsmål om argc? Ja. Publikum: Jeg har set, hvor de ikke har haft karakter [uhørligt] sagde bare snor stjerne d, ligesom tegn stjerne komma. Er de tilsvarende her? DAVID MALAN: De er. Så spørgsmålet er, har du lejlighedsvis set programmer som dette, der ikke gør sige streng argv beslag men i stedet sige noget ligesom char stjerne argv beslag. Og der er endda andre varianter, som du måske se. De er faktisk ækvivalente. For nu har vi disse slags støttehjul på i form af streng i CS50 bibliotek, men i lidt over en uge eller så vi kommer til at fjerne det obstruktion helt og faktisk se på, hvad fjeldørred og stjernen er, og hvor de vedrører hukommelse repræsentation mere generelt. Så vi vil vende tilbage til. Andre spørgsmål om vores argv eller argc? Ja. Publikum: Hvorfor gik det tilbage en fejl [uhørligt]? DAVID MALAN: Hvorfor gjorde det returnere en fejl only-- oh! I den tidligere sag, når vi blev futzing rundt med hukommelse, hvorfor det kun returnere en fejl når jeg virkelig har skrevet et stort antal? Korte svar er, at vi fik lige heldige. Generelt en computer allokerer hukommelse i klumper, og det gav mig en stor nok luns der Jeg slap væk, uden at blive bemærket, af rørende beslag 2 beslag 3, beslag 50, men så snart jeg skubbede mit held, gik jeg ud over den grænser klump hukommelse operativsystemet havde givet mig. Og det er, når det fastspændt ned og sagde nej. Segmentering fejl. Ja. Publikum: Hvordan virker computeren kender værdien af ​​argc? DAVID MALAN: Hvordan computer kender værdien af ​​argc? Når du kører et program, dette program, af arten af ​​den blinkende hurtig, afleveres den vifte af ord, der blev indtastet ved prompten, det var indtastet ved prompten. Og så er det dit operativsystem system, der hovedsagelig udfylder væsentligste argumenter for dig. Så det er en af ​​de tjenester at du får, en slags hemmeligt under hætten af et operativsystem. Andre spørgsmål? Ja. Publikum: Hvad betyder core dump betyde? DAVID MALAN: Hvad betyder core dump betyde? Så det er et godt spørgsmål. Og lad mig gå tilbage til denne mappe her. Og du vil opdage, at Jeg har en ny fil der. Det er faktisk kaldes kerne, og det er faktisk typisk en anstændig mellemstore fil. Det er hovedsageligt et øjebliksbillede af indholdet af mit program hukommelse eller RAM, når det styrtede ned. Og det vil være nyttigt, potentielt diagnostisk, når vi taler i en fremtidig forelæsning og afsnit om fejlfinding, fordi du rent faktisk kan gøre det ækvivalent af en digital obduktion på filen for at hjælpe regne ud hvad du gjorde forkert i dit program. Ja. PUBLIKUM: Er argc en kommando i selv, eller kan du navngive det noget? DAVID MALAN: Godt spørgsmål. Er argc en kommando i sig selv, eller du kan kalde det noget? Det er bestemt ikke en kommando. Det er simpelthen en variabels navn eller et argument navn, og så absolut vi kunne kalde dette foo vi kunne kalde denne bar, som har en tendens at være den go-to ord, som en computer videnskabsmand går til. Men ved konvention, vi bruger argc og argv. Men det er bare et menneske konvention, intet mere. Okay. Så viser sig, jeg har været fortæller lidt af en hvid lie-- og helt ærligt, i fremtiden, vil du se vi har fortalt andre hvide løgne. Men for nu, vi skal at skrælle en af ​​disse. I dette tilfælde her, når jeg tidligere kørte et program som ./hello eller ./hello-3 Zamyla, havde vi indholdet af min computerens hukommelse ser omtrent ligesom dette. Men huske, hvad en streng er. Hvad gjorde vi sige en uge siden, hvad en streng faktisk er under kølerhjelmen? Publikum: Array af tegn. DAVID MALAN: Det er en vifte af tegn, ikke? Så vi kan have en bred vifte af strenge, men til gengæld en streng er en vifte af tegn. Så hvis jeg virkelig ønsker at være anal når jeg tegner dette billede, Jeg bør virkelig tegning det lidt mere som denne, hvorved i hver af disse indekser i min argv array, Der er i sig selv en hel række at selv i et array. Og nu den hvide løgn vi fortæller i dag er, at billedet ikke ser helt sådan ud. Faktisk er de små firkanter er typisk uden for de store rektangler der. Men vi vil vende tilbage til det inden længe. Men dette er ./hello omvendt skråstreg 0, at det at være det specialtegn, afgrænser enden af ​​en snor, og vi har fået en anden efter Zamyla navn. Så hvad betyder dette? Nå, lad mig gå videre og åbne to andre eksempler der er tilgængelige online. Den ene kaldes argv1.c og den anden er argv2. Det er en super-simpelt program, der er forskellig fra tidligere programmer i at nu jeg bruger argc og argv op her. Og nu er jeg integrere med en for-løkke på linje 18, fra i = 0 på op til argc. Og hvad skal jeg gøre med denne linje kode her? På engelsk. Dette viser klart anvendelsen af ​​argc. Men på engelsk, hvad betyder det gøre, hvis jeg køre dette program? Ja? PUBLIKUM: Det kommer til at udskrive screene så mange gange som du ønsker. DAVID MALAN: Præcis. Så uanset ord, jeg skrive ved prompten, det er vil regurgitate dem på mig én pr linje. Så lad os gå videre og gøre dette. Lad mig gå ind i min mappe og gør argv1 ./argv1. Og nu, lad os holde det simpelt. Lad os gøre noget i første omgang. Det gjorde udskrive én ting, og det er faktisk navnet på det program, fordi det er i konsollen 0. Hvis jeg nu sige foo, det kommer til at gøre de to, og hvis jeg siger foo bar, det vil sige disse tre ting. Nu det er lidt interessant, måske. Men huske på, at argv er en vifte af strenge, men en streng er en vifte af tegn, så vi kan tage tingene op et hak og anvende grundlæggende logik og gøre kode, ser lidt mere kryptisk, ganske vist. Men ved at have en indlejret løkke, noget beslægtet til hvad du måske husker fra Mario, for eksempel, hvis du gjorde det på denne måde. Så nu mærke på linie 19, er jeg igen iteration over mine argumenter, fra 0 på op til argc. Og nu på linje 21-- jeg låne et trick fra sidste week-- Jeg tjekker, hvad der er længde argv beslag i. Jeg lagring svaret i n. Og så er jeg integrere fra j på op til n, hvor j initialiseres til 0. Så konvention til tælling. Når du har brugt i, hvis du har en indlejrede loop, kan du ikke bruge i igen, ellers vil du tæske potentielt den værdi uden for det indre sløjfe. Så jeg bruger j ved konvention. Vi kan bruge k. Hvis du har mere end k, har du sandsynligvis har for meget nesting, typisk. Men nu mærke til min printf linje er lidt anderledes. Jeg er ikke udskriver% s, er jeg udskrivning% c, hvilket naturligvis er en pladsholder for en char. Og nu bemærke dette syntaks. Ny. Vi har ikke set det før. Men logisk, det betyder bare, få den i'te streng i argv og få den j'te hvad? Publikum: Tegn. DAVID MALAN: Tegn i denne streng. Så ved hjælp af firkantede parenteser efterfulgt af kantede parenteser, dette er dykning først i argv er strenge, og derefter det andet kantede parenteser med J er dykning i karakterer af at særlig streng i argv. Og så, bare for god foranstaltning, Jeg udskriver en ny linje her. Så lad mig gå videre og åbne en lidt større vindue så vi kan se det i aktion. Lad mig gå ind i denne mappe. Og nu gør argv-2-- whoops-- gøre argv-2, ./argv 2. Enter. Og det er lidt svært at læse vertikalt, men det er faktisk navnet på den programmet, efterfulgt af en blank linje. Lad mig nu gå videre og gøre foo. Tilsvarende svært at læse, men det er faktisk udskriver et tegn per linje. Og hvis jeg gør bar, er det nu udskrive dem linje for linje. Så takeaway her er ikke så meget at, wow, se på denne nydelige nye trick hvor du kan få på indholdet i et array specifikke tegn, men snarere hvordan vi tager disse grundlæggende ideer som indeksering i et array, og derefter indeksering i en array, der var i den matrix, og blot anvender de samme ideer til lidt mere sofistikerede eksempler. Men det grundlæggende har virkelig ikke ændret, også siden sidste uge. Nu er dette er sortering af rettidig, i at huske, i uge nul vi spillede med en telefon bog som denne. Og selvom dette er naturligvis fysiske stykker papir, du kan slags forestille en telefonbog som en matrix. Bestemt, hvis du skulle reimplement denne stykker disse stykker papir i en computer, sandsynligvis du ville bruge noget ligesom et array til at gemme alle de navne og numre fra et hele vejen gennem Z. Så det er rart, fordi det giver os en mulighed, måske at overveje, hvordan du kan rent faktisk at gennemføre noget lignende. Som med en række døre her. Så hvis jeg could-- vi har brug for en frivilligt til at komme videre op. Lad os se. En uvant ansigt måske uvant ansigt måske. Hvad med orange? Her. Orange skjorte, kom op. Lad os gå videre nu, og flytte disse døre end til siden, flytte disse ud af vejen for et øjeblik. Hvad er dit navn? AJAY: DAVID MALAN: Ajay. David. Rart at møde dig. Okay. Så vi har bag disse seks døre digitalt på screen-- eller rettere syv døre på screen-- en hel masse tal. Og jeg har fortalt dig noget i advance-- aftalt? AJAY: Intet i forvejen. DAVID MALAN: Alt hvad jeg ønsker dig til at gøre er nu at finde for mig, og for os, virkelig, det nummer 50, et skridt ad gangen. AJAY: Nummer 50? DAVID MALAN: Antallet 50. Og du kan afsløre, hvad der er bag hver af disse døre blot ved at røre det med en finger. Damn det. [Latter] [Applaus] Meget godt klaret. OK. Vi har en dejlig gave præmie til dig her. Din pick af film, vi diskuteret i sidste uge. AJAY: Åh, mand. Åh, jeg har aldrig set Spaceballs. DAVID MALAN: Spaceballs. Okay. Så hold på blot et øjeblik. Hvordan-- lad os gøre dette en lærenem moment-- hvordan har du gå om finde tallet 50? AJAY: Jeg valgte tilfældigt. DAVID MALAN: Så du valgte tilfældigt og fik heldig. AJAY: Ja. DAVID MALAN: OK. Fremragende. Så nu havde du ikke fået heldig, hvad ellers kunne være sket bag disse døre? Så hvis jeg går videre og afsløre disse numre her, de rent faktisk er i tilfældig rækkefølge. Og det bedste, du kunne have gjort, helt ærligt, er ved, i sidste ende, i værste fald, at kontrollere dem alle. Så du fik super heldig, som er ikke, hvad vi ville kalde en algoritme. Ja, congrats. Men nu let's-- humor mig, hvis du kunne. Lad os gå til denne fane her. Og her er tallene i klart hvad synes at være en tilfældig rækkefølge, og de var. Men nu, hvis jeg i stedet krav at bag disse døre er tal, der sorteres. Målet er nu at også finder os tallet 50. Men gør det algoritmisk, og fortælle os, hvordan du kommer over det. Og hvis du finder det, du holder filmen. Du behøver ikke finde det, du give det tilbage. AJAY: Så jeg har tænkt mig at kontrollere enderne først, hvis at bestemme there's-- [Latter og applaus] DAVID MALAN: Værsgo. Lad os tage et kig på en af Ajay forgængere, Søren, der ikke var helt så heldig. OK, så din opgave her, Sean er følgende. Jeg har skjult bag disse døre nummer syv, men gemt væk i nogle af disse døre samt andre ikke-negative tal. Og dit mål er at tænke på dette øverste række numre som bare et array. Vi er bare en sekvens af stykker papir med tal bag dem. Og dit mål er, kun at bruge toppen matrix her, finde mig det nummer syv. Og vi derefter gå til kritik hvordan du går om at gøre det. Find os på nummer syv, tak. Nej 5, 19, 13. Det er ikke et trick spørgsmål. 1. På dette tidspunkt din score er ikke meget godt, så du kan lige så godt holde ud. 3. Gå på. Helt ærligt, kan jeg ikke hjælpe, men spekulerer hvad du selv tænker på. SEAN: Jeg kan tage fra kun den øverste række. DAVID MALAN: Kun den øverste række. Så du har fået tre til venstre. Så find mig 7. [Audience råber FORSLAG] Så begge disse var forbløffende af meget forskellige årsager. Så dette er, hvor vi slap et øjeblik siden, og nøglen indsigt her blev disse døre havde numre bag dem, der blev sorteret, den ideelle takeaway for er, at du kan gøre fundamentalt bedre i denne anden example-- og, ja, det var Sean første forsøg med tilfældige tal lige så before-- men så snart eftersom disse numre er sorteret, meget gerne telefonbogen, hvad kan du selvfølgelig gøre? Eller hvordan kan du udnytte denne viden? Ja. Publikum: Du går halvvejs [uhørligt]. DAVID MALAN: Ja. Præcis. Så Ajay første indskydelse var at kontrollere enderne, så vidt jeg husker, og så vi slags færdige eksempel hurtigt. Men hvis vi begyndte at gøre dette mere metodisk langs disse linjer, men starter måske i midten, fordi de er sorteret, så snart vi afsløre nummer 16, vi derfor ved-- og lad os gøre præcis at-- vi derfor vide, at 50, i dagens tilfælde, har fået til at være til højre. Så ligesom i uge nul, når vi rev telefonbogen i halve og kastede halvdelen af problemet væk, samme idé her. Vi kan kaste denne halve af problemet væk. Og sandsynligvis, hvad du kan gøre algoritmisk, når du ved, at 50 skal være til højre, hvis det er overalt, er prøve der, i midten af de resterende døre. Selvfølgelig 50 er højere end 42, så vi kan smide dette resterende fjerdedel af problemet væk, og endelig at identificere noget lignende 50. Men ligesom med den telefonbog, disse numre blev givet til os allerede i sorteret orden, hvilket efterlader os med spørgsmålet, hvordan gør du få ting i ordnet rækkefølge? Og helt ærligt, til hvilken pris? Det er én ting at være udleveret telefonbogen og derefter imponere dine venner ved at finde et telefonnummer virkelig hurtigt, ikke? Rive 32 sider ud for at finde en person, ud af 4 milliarder sider, vi sagde var en ekstremt eksempel. Men hvor meget tid tog det Verizon at sortere telefonbogen? Hvor lang tid tog det os at sortere disse syv numre? Det er et spørgsmål, som vi har hidtil fuldstændig ignoreret. Så lad os besvare dette spørgsmål nu. Og vi er alle ud af film nu, men vi har nogle stress bolde. Hvis siger, otte frivillige ville ikke have noget imod at tilslutte os op her? Lad os gå videre og gøre, hvad med fire af jer, tre af jer her? Få nogle nye ansigter. Og fire af du der? Og nu-- lad os ikke partiskhed her-- og nummer otte herovre på enden. Kom op. Okay. Så hvad vi har her hver af jer er et tal. Hvis du gerne vil gå forude, tage dette nummer. Hvad er dit navn? Artie: Artie. DAVID MALAN: Artie, okay. Du er nummer 1. AMIN: Amin. DAVID MALAN: Amin. David. Du er nummer 2. Og gå videre, da jeg hånd dig de ark papir, line jer op foran musikken står i samme rækkefølge som deroppe. ANDY: Hej, Andy. DAVID MALAN: Andy, det er rart at se dig. Nummer 3. JACOB: Jakob. DAVID MALAN: Jacob, nummer 4. Velkommen ombord. GRANT: Grant. DAVID MALAN: Grant. Nummer 5. Alanna: Alanna. DAVID MALAN: Alanna, nummer 6. FRANCES: Frances. DAVID MALAN: Frances, nummer 7. Og? RACHEL: Rachel. DAVID MALAN: Rachel, nummer 8. Okay. Gå videre og få dig selv i denne rækkefølge. Lad mig sige én resterende nodestativ på plads. Hvor har du brug for et stativ? OK. Gå videre og bare sætte dine tal hvor publikum kan se dem på, musikken stå udad. Og forhåbentlig vores første tilregnelighed kontrol her-- 4, 2, 6. Oh-oh. Vent et øjeblik. Vi har ikke en 8. Jeg har brug for at sætte dig fra eksemplet måde. Nej Nej, det er OK. Lad os se. Vi kan gøre dette. Standby. Der vi går. Korrekt. Okay. Så nu har vi 8, 1, 3 7, 5. OK. Fremragende. Så Spørgsmålet er, på hvad det koster, og gennem hvilken metode, kan vi faktisk sortere disse numre her så vi slags kan arbejde baglæns, i sidste ende, og decide-- er det virkelig imponerende, er det virkelig effektiv, at jeg kan dele og erobre en telefonbog? Er det virkelig effektiv, at Jeg kan dele og erobre de digitale stykker papir på brættet, hvis måske det kommer til at koste os en formue i tid eller energi eller CPU-cyklusser til rent faktisk at få vores data ind i nogle sorteret orden? Så lad os bede om, at spørgsmål. Så første off, er disse tal i temmelig meget tilfældig rækkefølge, og jeg har tænkt mig at foreslå en algoritme, eller proces hvorved vi kan sortere disse folk. Jeg har tænkt mig at nærme denne smukke naivt. Og jeg har tænkt mig at genkende at det er lidt af en masse for mig at vikle mit sind omkring hele datasættet på én gang. Men ved du hvad? Jeg har tænkt mig at gøre nogle meget enkle marginale rettelser. 4 og 2 er ude af drift, hvis den Målet er at gå fra 1 på op til 8. Så ved du hvad? Jeg har tænkt mig at have dig fyre bytte, hvis du skifter fysisk positioner, og dine stykker papir. Nu 4 og 6, disse er i orden. Jeg har tænkt mig at forlade dem være. 6 og 8, der er i orden. Vil forlade dem være. 8 og1, ude af drift. Hvis du to ikke har noget imod at bytte. Nu 8 og 3, hvis du fyre kunne bytte. 8 og 7, hvis du fyre kunne bytte. Og 8 og 5, hvis du fyre kunne bytte. Nu er jeg færdig? Nej, naturligvis ikke. Men jeg har gjort det situationen bedre, ikke? Hvad var dit navn igen, nummer 8? RACHEL: Rachel. DAVID MALAN: So Rachel har effektivt boblede op temmelig langt, hele vejen til udgangen af min vifte af numre her. Og så problemet er slags løst. Nu tydeligt, 2 stadig behov for at flytte en smule, og 4 og 6 og 1. Men jeg synes at have fået en lidt tættere på løsningen. Så lad os anvende denne samme naiv heuristisk igen. 2 og 4, OK. 4 og 6, OK. 6 og 1 mm mm. Lad os bytte. 6 og 3, mm mm. Lad os bytte. 6 og 7 er OK. 7 og 5, nope. Lad os bytte. Og nu 7 og 8. Og hvad er dit navn igen? FRANCES: Frances. DAVID MALAN: Frances. Så nu Frances er i selv en bedre position, fordi nu 7 og 8 korrekt boblet op til toppen. Så 2 og 4, OK. 4 og 1, Lad os bytte. 4 og 3, Lad os bytte. 4 og 6, er du OK. 6 og 5, Lad os bytte. Og nu de fyre er gode. Vi er der næsten. 2 og 1, ud af drift, så bytte. Og lad mig gøre en sanity check. 2 og 3, 3 og 4, 4 og 5, 5 og 6, 6 og 7, 8. OK, så vi er færdige. Men til hvilken pris jeg gjorde sortere disse tal her? Tja, hvor mange skridt jeg gjorde potentielt tage, når sortering disse folk? Nå, vi kommer tilbage til det spørgsmål. Men helt ærligt, hvis du fik lidt kede, det er slags afslørende i at dette ikke var måske den mest effektive algoritme. Og ja, helt ærligt, jeg sveder desto mere gå frem og tilbage. Det føler sig ikke særlig effektiv. Så lad os prøve noget andet. Hvis du fyre kunne nulstille jer til disse otte værdier. Godt arbejde. Lad os tage et kig digitalt, for kun et øjeblik, før vi prøve noget andet, på, hvad der lige er sket. Heroppe, du er ved at se en visualisering af disse otte mennesker hvorved blå og rød søjler repræsenterer tal. Jo højere bar, jo større nummeret. Jo kortere baren, mindre antal. Og hvad du kommer til at se, er i tilfældig rækkefølge mere end otte af dem. Du kommer til at se disse stænger blive sorteret efter den samme algoritme, eller et sæt af instruktioner, som vi vil kalde fremover boble slags. Så mærke, hvert sekund eller deromkring, to barer belysning op i rødt, bliver sammenlignet ved computeren. Og hvis den store bar og lille bar er ude af drift, de bliver byttet for mig. Nu er utroligt trættende at se denne, i hvert fald, til meget længe, ​​men bemærk takeaway-- store søjler, der flytter til højre, små barer flytter til venstre. Lad os afbryde denne proces og fremskynde dette op til at være meget hurtigere, så vi kan få et højt niveau fornemmelse af, hvad, Faktisk er boble slags gør. Faktisk er det boblende op til højre side af listen, eller array, de større barer. Og omvendt, de små barer er boblende deres vej ned til venstre, omend i et hurtigere tempo end vi tidligere gjorde. Så sværere at se med mennesker, men visuelt det er hvad faktisk foregik. Men lad os prøve et fundamentalt anden tilgang nu. Lad os prøve en anden algoritme, hvor vi har dig fyre starter i disse originale holdninger, som var denne ordre her. Og lad os gå videre nu. Og jeg har tænkt mig at gøre noget endnu enklere, ikke sandt? Set i bakspejlet, bytte parvis igen og igen, næsten lidt smart. Lad os gøre tingene endnu mere naivt, hvor hvis jeg ønsker at sortere disse folk, lad mig bare holde udkig til det mindste element. Så lige nu, 4 er den mindste tal, jeg har set. Jeg har tænkt mig at huske på. Nej, 2 er bedre, og husk det. 1 er endnu mindre. 3, 7, 5. OK. En-- hvad er dit navn igen? Artie: Artie. DAVID MALAN: Artie. Så Artie, gå videre. Jeg har tænkt mig at trække dig ud af linjen. Hvis du kunne komme tilbage her. Og jeg har brug for at gøre plads for ham. Vi har en beslutning punkt her. Hvordan kan vi gøre plads til Artie her i begyndelsen, hvor nummer 1 hører? Publikum: Shift. DAVID MALAN: OK, vi kunne flytte alle. Men foreslå en optimering. Det føles lidt irriterende for mig at spørge fire personer at bevæge sig hele vejen ned. Hvad kunne jeg gøre? Publikum: Skift dem. DAVID MALAN: Skift dem. Og hvad er dit navn igen? JACOB: Jakob. DAVID MALAN: Jacob flytte. Meget mere effektivt blot at have Jacob swap steder med Artie, i modsætning til at tvinge alle fire af disse folk, mange tak, til deres korrekte position. Hvad er rart om Artie nu han er i sin korrekte position. Lad os gøre det igen. 2, det er det mindste tal, jeg har set. 3, 7, 5. OK. 2 er absolut den mindste. Må ikke nødt til at gøre noget arbejde. Lad os gøre det igen. 6. Mindste? 8. Nope. 4? Ooh. Lad mig huske 4. 3. Lad mig huske 3. 7, 5. Mindste antal jeg har ses på denne pass er 3. Hvis du ville komme på ud. Hvor skal vi sætte dig? Og hvad er dit navn? Alanna: Alanna. DAVID MALAN: Alanna, vi er nødt til at smide dig. Men der er mere effektiv, at bare bytte to personer, end at have flere folk faktisk undvige forbi. Lad os nu gøre det igen. Jeg har tænkt mig at vælge 4, så kom ud. Og hvem kommer til at flytte? Nummer 8, selvfølgelig. Hvis jeg nu finde nummer 5, kom ud. Nummer 8 kommer til at blive smidt ud igen. Jeg vil nu finde nummer 6 på plads. 7 på plads. 8 på plads. Det, vi gjorde lige nu noget, der hedder udvælgelse sortere, og hvis vi visualisere dette, er det kommer til at føle sig en smule anderledes. Lad os gå videre og fra dette Menuen her, det visualization-- Lad os ændre dette til-- kommer på, Firefox. Lad os ændre dette til udvælgelse slags. Og lad os fremskynde den som før, og start visualisering nu. Og denne algoritme har en anden føler det. På hver iteration, helt ærligt, Det er endnu mere ligetil. Jeg er bare at vælge det mindste element. Nu, helt ærligt, jeg fik en lidt heldig at tid, idet det sorteret superhurtig. Elementerne var tilfældigt. Det er ikke, som vi vil til sidst se fundamentalt hurtigere. Men lad os se et tredje og sidste nærme her, hvad der foregår. Så lad os gå videre og nulstille jer en sidste gang at være i denne rækkefølge her. Og nu, jeg har tænkt mig at være lidt mere smart, bare for at afrunde vores algoritmer. Jeg har tænkt mig at gøre dette. Jeg har tænkt mig at gå frem og tilbage så meget. Helt ærligt, jeg er træt af alt dette gennemkører. Jeg skal bare tage, hvad jeg givet i begyndelsen af ​​listen, og jeg har tænkt mig at sortere der derefter og dér. Så her er vi. Nummer 4. Jeg har tænkt mig at indsætte nummer 4 i en ordnet liste. Udført. Jeg hævder nu, og bare for at gøre det mere klar, er denne del af min liste sorteres. Det er lidt af en dum påstand, men faktisk 4 er sorteret på en liste over størrelse én. Nu, jeg har tænkt mig at tage på nummer 2. Nummer 2 Jeg vil nu indsætte i det rigtige sted. Så hvor 2 hører? Det er klart, herovre. Så gå videre og flytte tilbage, hvis du kunne. Og hvorfor du ikke fyre bare tage Deres musik står med dig denne gang. Og lad os med magt indsætte dig i begyndelsen af ​​listen. Så en lidt mere arbejde. Jeg havde til at flytte Jakob rundt, og hvad er dit navn? AMIN: Amin. DAVID MALAN: Amin. Men i det mindste jeg ikke gå frem og tilbage. Jeg tager tingene, som jeg går. Jeg er bare indsætte dem på det rigtige sted. 6, det er faktisk temmelig let. Lad os indsætte dig derovre, hvis du blot ønskede at bevæge sig over en smule. Nummer 8, også temmelig let. Lige derovre. Damn det. Nummer 1 Vi kan ikke bare bytte med Amin her, fordi der kommer at rod op ordren. Så vi er nødt til at være lidt mere smart. Så Artie, hvis du kunne sikkerhedskopiere et øjeblik. Lad os gå videre og flytte nu, i modsætning til vores tidligere algoritmer, at gøre plads til Artie lige her i starten. Så i slutningen af ​​dagen, jeg er lidt gøre, hvad jeg ønskede at undgå før. Og så min algoritme er sortering af vendes, intellektuelt, fra, hvad det oprindeligt var. Jeg laver bare flytning på et andet punkt. Nu er jeg ved 3. Åh, for fanden. Vi er nødt til at gøre mere arbejde igen. Så lad os skubbe dig ud. Lad os flytte 8, 6, 4-- oh oh-- og 3 kommer til at gå lige der. Så i det mindste små besparelser denne gang. 7, ikke for meget arbejde, der skal gøres. Så hvis du ønsker at pop tilbage, lad os indsætte dig. Og endelig, 5, hvis du ønsker at pop tilbage, vi nødt til at flytte dig, du, dig, indtil fem er på plads. Så nu at se dette på en højt grafisk, lad os gøre denne algoritme visualisering en ekstra gang. Så skal dette kalder vi indsættelse slags. Vi vil køre det lige så hurtigt, og starte det her. Og det, også har en anden føler. Det er lidt bedre og bedre, men det er aldrig perfekt indtil jeg går ind og glat i disse huller. Fordi, igen, jeg kun tage, hvad Jeg bliver givet fra venstre til højre. Så jeg ikke får så heldig at alt var perfekt. Det er derfor, vi havde disse lidt mispositions at vi faste over tid. Så alle disse algoritmer synes at køre på lidt forskellige gangarter. I virkeligheden, hvilket ville du sige, er den bedste eller den hurtigste hidtil? Bubble slags, den første? Valg sortere, den anden? Indsættelse slags, den tredje? Jeg hører nogle udvælgelse slags. Andre tanker? Så det viser sig, at alle disse algoritmer er fundamentalt lige så effektive som hver other-- eller omvendt, ligesom ineffektiv som hinanden, fordi vi kan gøre fundamentalt bedre end alle tre af disse algoritmer. Og det er lidt af en hvid løgn, også. når jeg siger så effektiv eller ineffektiv, der er i det mindste for super store værdier af n. Når vi har kun otte mennesker her, eller måske 50 eller deromkring barer på skærmen, du absolut mærke forskel blandt disse tre algoritmer. Men n, antallet af mennesker, eller antallet af numre, eller antallet af personer i telefonen bog, eller antallet af websider i Googles database bliver større og større, Vi vil se, at alle disse tre algoritmer er faktisk temmelig dårlig. Og vi kan gøre fundamentalt bedre end det. Lad os tage et kig endelig, på, hvad disse algoritmer måske lyde som i sammenhæng med et par andre samt ved hjælp af denne visualisering her som vil introducere os til et antal algoritmer. Lad os gå videre og lykønske vores deltagere her, som alle sorteres sig meget godt. Hvis du gerne vil tage en afsked gave. Du kan holde dine tal så godt. Og hvad du vil se, eller rettere høre, nu, er, at når vi sætter lyde til hver af disse søjler og forbinder det med softwaren, forskellig frekvens af lyd, du kan pakke dit sind mere audioly omkring, hvad hver af disse ting ligne. Den første er indsættelse slags [TONER] Dette er boble slags. [TONER] Udvælgelse slags. [TONER] Noget, der hedder sammenfletning slags. [TONER] Gnome slags. [TONER] Det er det for CS50. Vi vil se dig på onsdag. Fortæller: Og nu, "Deep Tanker, "af Daven Farnham. Hvorfor er det en for-løkke? Hvorfor ikke gøre det bedre? Jeg ville gøre en fem løkke. [Latter]