[MUSIC SPILLE] DAVID MALAN: All right. Dette er CS50, og denne er i slutten av uke 2. Jeg er så lei for at jeg ikke kunne være der med dere alle i dag, men du er i veldig gode hender. Tillat meg å presentere CS50 egen Rob Bowden. ROB BOWDEN: Og selvfølgelig, deretter vi har å gjøre narr av det faktum at han sendte oss en vertikal video og vise dette. [VIDEO PLAYBACK] [MUSIC SPILLE] [Fotspor] -Dette Video gjorde ikke nødt til å se på denne måten. Det kunne ha vært forhindret. Si nei til vertikale videoer. -Vertikal Videoer skje når du Hold kameraet på feil måte. Videoen vil ende opp som ser ut som dritt. - [GRYNT] -Det Er flere og flere mennesker er avhengige å lage vertikale videoer hver dag. Det er ikke sprekke eller ingenting, men det er fortsatt veldig dårlig. Det finnes to forskjellige typer mennesker som er rammet med VVS. Den første gruppen behandler videoer de skyter like bilder. De mener ikke noe vondt. De forstår bare ikke at mens du kan slå et bilde, du kan egentlig ikke slå en video. [CRASH] - [MONKEY LYDER] -Den Andre gruppen er mennesker som ikke gir en [bleep]. -Vertikal Video syndrom er farlig. Filmindustrien har alltid vært horisontal. TV er horisontal. Dataskjermer er horisontale. Folks øyne er horisontale. Vi er ikke bygd for å se vertikale videoer. -Jeg Elsker vertikale videoer. -Nobody Bryr seg om deg. -Hvis Dette problemets venstre ukontrollert, du også vil begynne å vise fire videoer på en gang bare for å spare båndbredde. -Letterboxed Vertikale videoer ville være på størrelse med et frimerke. -Og Det vil spre seg overalt. Film skjermer har alltid vært horisontal. Hvis vertikale videoer blir aksepterte, kinoer blir nødt til å være høy og tynn. -Og Alle kinoene ville må bli revet og gjenoppbygget. Og etter den tid de ble gjenoppbygd, Mila Kunis ville være gammel og stygg. -Birds Vil krasje inn i dem og dø. -Vi Alle få stiv nakker fra å se opp. -Og Ingen vil sitte i første rad igjen. -George Lucas vil re-release stjerne Wars igjen-- den magre utgaven. -Jeg Var egentlig aldri i stand til å fortelle historien at jeg ønsket å fortelle. Dette var en stor sjanse for meg å eksperimentere med en ny teknologi. -Du En dust. -hver Gang en mobilenhet blir brukt til å spille inn video, er fristelsen der. Bare si nei. Si nei til George Lucas. Si nei til gamle Mila Kunis. Si nei til vertikale videoer. -Og Hvis du ser noen gjør det, si: "du er ikke fotograferer det riktig dummy!" [MUSIC SPILLE] [END PLAYBACK] [APPLAUSE] [AUDIO OUT] ROB BOWDEN: --simple form for kryptografi, som er utgangspunktet kryptering og dekryptering av hemmelige meldinger. Så her har vi en veldig enkel leketøy. Og tanken er den ytre ringen roterer rundt den indre ringen. Og du kan se, kanskje hvis jeg zoome i, at-- det er vanskelig å se. Men, som er antallet 1-- vel, som flyttet. Nummer 1 er tilordnet bokstaven X, nummer 2 kart til punkt og prikke J. Utrolig vanskelig ikke hoppe fremover. Letter to kart til J. Nummer tre maps til D. Så med denne ringen kan du gi noen en melding 1, 2, 3. For en eller annen grunn ønsker å fortelle dem XJD. Men du kan gi dem noen melding av tall, og så lenge som de har denne ring, de kan dekryptere hva du prøver å si. Så du kan ha sett dette spesielt eksempel på kryptografi før hvis rundt jula du har sett A Christmas Story. Hvis du aldri har sett det før, så bare slå på TBS ved bokstavelig helst på julaften, fordi de bare viser det back to back til rygg mot rygg mot rygg hele dagen. Og den aktuelle video dette. [VIDEO PLAYBACK] -Vær Det kjent for alle og enhver at Ralph Parker er herved oppnevnt et medlem av den lille Orphan Annie Secret Circle og har krav på alle æresbevisninger og fordeler som skjer i dette. Signert Little Orphan Annie. Kontra Pierre Andre i blekk! Honors og fordeler allerede i en alder av ni! [Roping fra RADIO] -Kom igjen. La oss fortsette med det. Jeg trenger ikke all that jazz om smuglere og pirater. Lytt morgen kveld med den avsluttende eventyr av Black Pirate Ship. Nå er det tid for Annie hemmelige budskap for dere medlemmer av Secret Circle. Husk barn, bare medlemmer av Annie Secret Circle kan dekode Annie hemmelige budskap. Husk, er Annie avhengig av deg. Still dine pins til B2. Her er budskapet. 12. 11. 2. -Jeg Er i min første hemmelig møte. -25. 14. 11. 18. 16. -Å, Er Pierre i stor stemme i kveld. Jeg kunne fortelle at kveldens Meldingen var veldig viktig. -3. 25. Det er en melding fra Annie selv. Husk, ikke si det til noen. -Fem Sekunder senere, jeg er i den eneste rom i huset hvor en gutt på ni kunne sitte uforstyrret og dekode. Aha! B! Jeg gikk til den neste. E. Det første ordet er "være". S. Det kom lettere nå. U. 25. Det er R. -Kom Igjen, Ralphie! Jeg har må gå! -Jeg Være rett ned, Ma! Jøss. T. O. "Sørg for å" - være sikker på hva? Hva var Little Orphan Annie prøver å si? Vær sikker på hva? -Randy Har fått til å gå! Kan du komme ut? -Alle Rett, mamma! Jeg skal være rett ut! Jeg begynte å bli nærmere nå. Spenningen var forferdelig. Hva var det? Skjebnen til planeten kan henge i balanse! -Ralphie, Randy må jo gå! -Jeg Være rett ut, for roper høyt! Nesten der! Fingrene mine fløy. Mitt sinn var en stål felle. Hver pore vibrerte. Det var nesten klar! Ja. Ja. Ja. Ja. Pass på å drikke din Ovaltine. Ovaltine? En crummy kommersiell? Son of a bitch. [END PLAYBACK] ROB BOWDEN: Så det er slik Ovaltine gjelder kryptografi. I utgangspunktet CS50 nettopp annonsert Ovaltine, slik at vi kunne være en crummy reklamefilm for Ovaltine. Greit. Så nå selve informatikk. Husk på mandag vi slapp dykking dypere inn strenger. Så vi arbeider med strengen "Zamyla." Og vi ble gjenkjenne det faktum at vi kan behandle "Zamyla" som en sekvens av tegn. Og husk at vi har lært braketten notasjon. Så hvis dette var lagret i en streng "s" og deretter hvis vi sa s brakett 0, ville det indikerer bokstaven hovedstaden Z. Og hvis vi sa s brakett 1, som skulle tilsi det første små bokstaver a, og så videre opp til s braketten 5, som skulle tilsi det siste en. Nå må du huske at Lengden av denne strengen er 6, men indeksene i strengen er 0 til 5, Z gjennom det vare. Så dette passer nå inn i et større bilde av datamaskinens minne, RAM. Så et eller annet sted i programmet som du kjører datamaskinen trenger å huske Zamyla et eller annet sted i minnet. Så kan jeg ha en frivillig? Ja takk. Og hva er ditt navn? DEAN: Dean. ROB BOWDEN: Dean? Hyggelig å møte deg, Dean. Så kom over her, og vi kommer til å ha du tegner på vår hyggelig kjekk liten layout minne. Nå liker jeg å tenke på minne som en lang stripe av bytes, men bare for visning formål vi vil bare gjør venstre til høyre, øverst til nederst. OK? Så jeg kommer til å vise en program-- Getstrings.c. Og så alt dette programmet er gjør ber om fire strenger fra brukeren med GetString og deretter utskrift uansett hva det første angitte strengen var. Vi ignorerer to til fire. OK. Så over her now-- når Jeg første forespørselen s1. Så du er datamaskinen. Og du gjennomfører GetString. Så du ber om en streng fra meg, og jeg sier, OK, Dean. Gi strengen "Dean". Så et eller annet sted i minnet du må huske "Dean". Så skriv det inn i minnet et sted. Perfekt. OK. Så nå har vi S2. Og s2 kommer til å bli en forespørsel til GetString. Så jeg kommer til å legge inn en streng. Jeg kommer til å skrive inn "Hannah." Så skriver du "Hannah" et sted i minnet. Yeah. A-H. OK, så nå s3. Og det kommer til å være en annen be om å GetString. Og så nå skriver du "Maria". Greit. Og så er det en siste forespørsel til GetString, s4. Så, jeg vet ikke. Hva om vi går med antidisestablishmentarianism. Så skriv det inn i minnet. Yeah. Så bare gjøre "Rob". OK. Så nå explain-- hvorfor gjorde du lar disse områder? Hvorfor har du denne blank plass her, her og her oppe? Ja. Så legger merke til når jeg går å skrive ut s1-- så hvis vi hadde "Hannah" løpe rett opp ved siden av "Dean" hvordan vet vi når strengen "Dean" slutter? Så skriver strengen s1 kan ha bare trykt "DeanHannahMariaRob" hvis den ikke har noen anelse av når "Dean" faktisk ender. Greit. Så i minnet måten vi faktisk representerer denne enden av en streng er med backslash null. Så dette rommet er nøyaktig hva vi ønsket. Det bør være en skråstrek null. Dette vil være en omvendt skråstrek null, og dette vil være en backslash null. Og du kan ha en fabelaktig premie for å være en perfekt frivillig. Ta en stress ball! OK. Så dette tegnet backslash null er hvordan vi angi slutten av en streng. Det er hvordan når et gitt program ønsker å skrive ut en streng, det er how-- husker vi lærte den strlen funksjon i forrige uke? String lengde? Det er hvordan strenglengde er i stand til å bestemme hvor lenge en streng er. Det holder bare itera over tegn til den finner backslash null karakter. Så det viktigste er å innse om backslash null karakter er det representert av alle nuller i biter. Så merker at dette er forskjellig fra null-tegn. Så null karakter, hvis du husker i eksemplet at han ga ved slutten av foredrag der karakterene kart to-- som kapital A maps til 65. Små bokstaver et kart til 97. Små bokstaver b ville være 98. Så nummer 0 kartene to-- jeg ikke vet av toppen av hodet mitt. 44 eller 45. Et sted i den regionen. Så tegnet 0 er en faktisk nummer. Men backslash null kart til alle null biter. Så det er en forskjell mellom backslash null, som vi kaller det null terminator. Det er et skille mellom backslash null og karakteren null. Greit. Så snakker litt mer om strenger. Så da ser vi her dette er hvordan ville det være lagt ut i minnet. Så denne ideen om strenger som en sekvens av characters-- så den offisielle datamaskin sciency begrep for sekvensen er en matrise. Så vi vil kalle en streng en rekke tegn. Og det er faktisk andre data typer som vi kan gjøre arrays ut av. Så for å motivere dette, se på et eksempel. Vi kaller det ages0.c jeg skal kopiere og lime vår mal. OK. Så i dette programmet hva vi ønsker å gjøre er å ta tak i alder av tre studenter i kurset. Så vi vet int age-- og nå kommer jeg til å si 0. Så vil du kanskje si alder1, men til formål vil vi se veldig kort tid, Jeg vil si int age0 lik GetInt. Så det samme kallet til GetInt at vi har brukt jeg ikke tilfeldigvis være å spørre sa: "gi meg den alderen." Men bare ber om det. Og alder1 tilsvarer GetInt. Og int age2 tilsvarer GetInt. Så, igjen, tre studenter, men Til syvende og variable indekser er age0 gjennom age2. OK. Så dette programmet vil gjøre hva vi vil med age0, alder1, og age2, men dette programmet slutt fungerer for tre studenter. OK. Så nå hva om jeg vil ha fire studenter? Vel, jeg er nødt til å gå tilbake inn koden min, endre kommentaren, og nå har vi en int age3 lik GetInt. OK. Så som ser problemet her? Hva er problemet med denne typen oppsett? Yeah. Yeah. Så vi oppretter en variabel for hver elev. Nå som fungerer, men til slutt hva om jeg nå si: "Jeg ønsker å ta tak i en alder av åtte studenter eller 16 elever eller de imidlertid mange studenter av de hundrevis av studenter i CS50 eller tusenvis av studenter på campus eller de milliarder av mennesker i verden? Så til slutt dette ikke er bærekraftig. Hver gang du ser deg selv kopierer og lime inn kode som dette, bør du generelt føler at det er en bedre måte. Så det er her vi introdusere en rekke erklæring. Så når du deklarerer en array, dette er hva den generelle formatet kommer til å se ut. Vi kommer til å si hvilken type. og så skal vi gi navnet på den oppstillingen, akkurat som vi definerer enhver variabel. Og så til slutt vi bruker Denne braketten notasjonen igjen men i en annen sammenheng fra hvordan vi bruker den tidligere. Så her ser det ut som en normal variable erklæring om at vi har sett. Så vi har sett int x semikolon før. Vel nå vi kan se noe som int x brak 5. Og sette denne ideen inn i GetInt program som vi have-- slik at vi kan implementere dette på samme måte. La oss si at i CS vi pleier å bruke n som antallet noe. Så her vi kommer til å lagre fire studenter. Og nå kan vi si int alder braketten N- ikke helt får det yet-- å erklære en rekke av fire studenter. Så hvordan dette vil se ut i minne vil være lik denne. Klare dette. Og vi kommer til å ha et sted i memory-- vil jeg sette dette opp der. Slik at et eller annet sted i minnet. En to tre fire. Vi har fire heltall på rad for denne matrisen av fire heltall. Så, for tiden, hva er størrelsen av en av disse boksene? Yeah. Det er fire bytes. Det er 32 biter. Så nå er dette annerledes fra tabellen at vi så tidligere, rekken av tegn. I en streng hver boks var bare én byte, fordi et tegn er bare en byte. Men med en rekke tall, hver boksen må være fire byte i orden å passe en hel heltall. Så dette er hva en rekke fire ints ville se ut. Og deretter tilbake til koden. Nå ønsker vi å faktisk butikken heltall i den oppstillingen. Så nå er dette en veldig, veldig, veldig felles mønster som vil på et tidspunkt bli muskel minne. Så int i lik 0. jeg mindre enn n. jeg pluss pluss. Aldersgruppen jeg er lik GetInt. Så dette for loop, dette formatet, Du bør få veldig vant til. Så dette er generelt hvordan vi vil iterere over nesten alle array. Legg merke til nå denne typen forklarer hvorfor fra begynnelsen vi har ikke for løkker går for int i er lik 1, i mindre enn eller lik 10. Årsaken er at fra null gjør dette arbeidet godt med arrays. Så arrays er null indeksert. Hvis denne matrisen er av lengde 4, indeksene er 0 til 3. Så gjennom den første gjentakelse av dette for loop vi kommer til å være å sette alders brakett 0 lik en oppfordring til GetInt. Så uansett hva jeg skjedd å gå inn på tastaturet. I den andre pass, er vi innstilling alder1 lik GetInt. Tredje pass, age2. Endelige pass age3. Så hvis i det første gjennomløp av sløyfen Jeg går inn i nummer 4 på tastaturet, så får vi sette inn en 4 her. Hvis på den andre passet jeg skriver 50, vil vi sette en 50 her. På det tredje passet jeg kanskje skriv negative en negativ en, og så til slutt går jeg inn 0-- og Nå må du huske at dette var indeksen tre. Etter at vi sløyfe tilbake, er jeg kommer til å økes til fire. i er ikke lenger mindre enn n, som er fire. Og vi bryte ut av loopen. Så hva ville være galt med dette? [Uhørbart]? PUBLIKUM: [uhørbart] Ja. Slik at matrisen bare har fire steder, som betyr så indekser 0 til 3. Så hvis dette var tilfelle, ville jeg ta verdien 4 på enkelte punkt. aldersgruppe 4 skal sette uansett hva som skjer til å være over her til hva jeg har å si, skriv 6. Det vil være å sette dette til seks. Men vi vet ikke hva som er over her. Dette er ikke minnet at vi hadde tilgang til. Så hvis du husker fra forrige forelesning, han skrive ut verdier av Zamyla og på et tidspunkt han traff denne segmenter utsette. Så vil du sannsynligvis bli seende mange segmentering feil som du gjennomføre noen av de oppgavesett. Men dette er en av de måtene som du kan støte på en segmentering utsette, når du begynner å få tilgang minne på måter som du ikke bør være. Slik at vi ikke har tilgang til denne plasseringen, og dette er en feil. Så dette er bedre. Nå er det fortsatt en liten Problemet med denne koden. Og det er i utgangspunktet at vi er fortsatt fast på fire studenter. Nå hvis jeg ønsker å bruke åtte studenter, OK. Det er ikke så stor en avtale. Jeg kan gå inn, endre kommentere og endre n. Nå vil dette fungere med åtte studenter. Hvis jeg kompilere dette og kjøre dette, vil det vise me-- det vil be om heltall for åtte studenter og det vil bare fungere. Men det er mindre enn ideell til å trenge å rekompilere programmet hver eneste gang Jeg ønsker å endre antall studenter at jeg ønsker å gå inn i evigheter for. Så den endelige forbedring på dette, så vi får se her-- vi er kommer til å be om antall personer. Her har vi en rekke av folk i rommene eller eventuelle aldre mennesker i rommet. Men vi kommer til å be om antall av mennesker i rommet fra brukeren. Så dette er nøyaktig samme do-while løkke som vi har sett før. Det er nøyaktig samme gjør-mens loop som du kan implementere på problemet sett. Så så lenge de er går inn i en n mindre enn 1, så det er nødt til å være på Minst én person i rommet. Så lenge de er går inn i en n mindre enn 1, så vi kommer til å fortsette å spørre igjen. Oppgi antall av mennesker i rommet. Nå, når vi har nummeret mennesker i rommet-- så jeg kan gå inn på at det er 200 personer i dette rommet. Deretter ned her vi kommer til å komme og erklære en rekke størrelse 200. Vi erklærer array som er stor nok til å romme 200 aldre. Kommer ned, er det for loop at du vil få veldig vant til. Så gjentar over denne tabellen, tildele til hvert sted ved at matrisen er et heltall, og så til slutt her er vi bare å få et eksempel på itera over det array, for ikke å tilordne verdier, men for å få tilgang verdier. Så over her ser vi at vi sier, et år fra nå, person% jeg vil være% i år, der den første% i er i pluss 1. Så jeg er denne indeksen variabel. Og den andre% i kommer til å være den verdi som er lagret i alderen matrisen pluss en. Så dette pluss en er bare fordi vi er saying-- dette pluss en, aldre jeg pluss 1. Dette pluss en er bare fordi vi er sier, et år fra nå personen vil være denne gamle. Så hvorfor er dette jeg pluss en? Derfor har vi et pluss 1 er det? Yeah. Ja. Så husk arrays er null indeksert. Så hvis vi skal skrive ut dette for noen å bare lese utgang, da trolig de ønsker å se noe som person en, person nummer én, vil være 20 år gammel. Person nummer to vil være 15 år gammel. De vil heller ikke se person tallet null er 15 år gammel. Så sammenstille dette, og bare se hva det ser like-- Lag litt plass. Gjør aldre kompilerer. Kjører aldre. Vi ser antall personer i rommet. Så jeg vil si det er tre personer i rommet. Age of person nummer én, la oss si 15, 20, 25. Og nå skal jeg si et år fra Nå vil de være 16, 21, 26. La oss se at dette fungerer med en n som ikke er lik tre. Så hvis jeg sier antall mennesker er 5, en, to, tre, to, en, et år fra nå de vil være to, tre, fire, tre, to år gammel. Så jeg kunne like lett ha n være 10.000. Nå vil jeg bli sittende her for ganske en mens du taster inn aldre, men dette fungerer. Så nå i minnet et sted vi har en matrise av størrelse 10 000, så til slutt 40 000 bytes, fordi det finnes fire byte for hver av de hele tall. Så det er en rekke størrelse 10 000 der vi kan lagre alderen disse 10.000 mennesker. Greit. Spørsmål om noe av dette? Yeah. Hva hvis du ga et negativt tall? La oss se hva som skjer. Så i denne case-- nummer av mennesker i rommet, negativt. Det avviste det, fordi her oppe vi skje som skal håndtere det faktum at hvis n er mindre enn en vi kommer til å spørre igjen. Hvis du prøver å erklære en rekke negative størrelse, det vanligvis ikke fungerer. Så la oss prøve. La oss se bort uansett verdien de innspill for n og bare si int aldre negativ en. La oss se om det enda kompilerer. Jeg er ikke sikker. Nei. Så aldre er erklært som en matrise med en negativ størrelse. Så upfront den gjenkjenner en matrise kan ikke være av negativ størrelse og avviser det. Nå, hvis vi ikke håndterer dette do-while-loop riktig, hvis vi ikke sjekker hvis n er mindre enn 1-- la oss si at vi bare ikke har dette i det hele tatt og i stedet vi bare ta et heltall. Uansett hva som heltall er, vi erklærer en matrise av denne størrelsen. Så kompilatoren kan ikke muligens klage nå. Hvis jeg kompilere dette-- så det kan ikke klage, fordi det kan ikke vite at jeg er kommer til å legge inn et negativt tall, som kan være ugyldig. For alle vet det, jeg kan angi et positivt tall, som er helt gyldig. Så jeg kan tenke meg hvis jeg skriver negative 1 mennesker i rommet, segmentering feil. Så ok. Så la oss legge denne tilbake bare holde det hva det opprinnelig var. Så gjør aldre. Nå hvis jeg ønsker å prøve en negative age-- så la oss sier det er fem personer i rommet. Age of person nummer én er negativ 4, person tre- er null, personen three-- OK. Så her, et år fra nå, person nummer en vil være negativ 3 år gammel. Så sannsynligvis ikke fornuftig. Men det er bare fordi jakt på koden alt vi gjør ber GetInt. Nå, hvis vi hadde hatt GetPositiveInt funksjon eller vi hadde bare rett og slett gjort dette liksom samme stund loop der nede, da dette ville fungere helt greit. Men i dette spesielle tilfellet, vi bare ikke tilfeldigvis håndtere negative verdier. Andre spørsmål om arrays? OK. Så vi har nå sett arrays. Og vi kommer til å trenge å bruke dette for kommandolinjeargumenter. Så i oppgavesettet two-- Jeg vet at mange av dere kan fortsatt være i arbeid på problemet sett en, men problemet satt to er kommer opp. I oppgavesettet to, kommer du til å må håndtere strenger, tabeller, og kommandolinjeargumenter. Så hva er kommandolinjeargumenter? Nå kan du se her nede en liten teaser for nøyaktig hva som er kommer til å skje. Vi ser int main, inc argc, string argv parentes. Så først la oss prøve å tolke hva som prøver å si. Nå, OK. Så på kommandolinjen bør du være å venne seg til noen av disse kommandoene nå, og du har sikkert kjørt cd i terminalen før. Så hvis vi sier cd pset1, du vet at det burde være endring i den pset1 katalogen. Nå merker at du har aldri skrevet et program som dette før. Hvert program som du har skrevet, du ville kjøre, sier dot slash Mario, dot slash grådig, og da er det kan be deg om innspill. Nå, det er ikke det change directory gjør. Når du kjører cd, betyr det ikke så si, hvilken katalog du ønsker å cd inn? I stedet, du bare si, cd pset1, og det bare går inn i pset1 katalogen. Så på samme måte har vi andre eksempler. gjøre hei. Når du kjører gjør, betyr det ikke så si, hvilket program ønsker du å gjøre? Du bare si, på kommandolinje gjøre hei. Move er et annet eksempel. Denne ene vi skal flytte mario.c sende opp en katalog. Så nå vet vi med dette eksemplet vi virkelig passerer to argumenter. Det er mario.c som første argument, og dot dot er det andre argumentet. Og så når du kjører gjør, du se at veldig lang kommando line-- som virkelig lang kommando trykt på kommandolinjen. Så det lenge command-- dette er bare en kort del av den, men nå har vi tre kommandolinjeargumenter. Dot dash null, hei, og hello.c. Så disse er kommandolinje argumenter, argumenter at du passerer på kommandolinjen slik at det trenger ikke å bli spurt når du kjører programmet. Det ville være frustrerende hvis når du kjørte clang det sagt, "OK, som program-- som filen du kompilere? Hello.c. Hva flagg ville du liker å gå inn? dash o. Hva vil du ha filen til å bli kalt? Hallo. Nei, du bare kjøre klang dash o hallo hello.c. Så ser tilbake på dette. Nå argc-- argc er argumentet teller. Det er antall kommandolinje argumenter angitt på kommandolinjen. Vel, argv-- teknisk v står for vektor, som i utgangspunktet betyr array. Men du kan ignorere det. Argv-- vi har streng argv, så streng argv parentes. Så dette er en annen form for brak du ikke har sett før. Så vi har sett braketten notasjon når vi har sagt, lignende, string s tilsvarer Zamyla. s brakett 0 aksesserer karakter Z. Vi har også sett parentes når vi sa int aldre brakett 5. Det erklærte en rekke størrelse 5. Så her er en versjon av parentes vi ikke har sett før. Så denne typen streng argv som ville være helt fortrolig at det ville bare være en streng. Nå parentes angir at dette er en matrise. Så streng argv brak hjelp at argv er en rekke strenger. Nå teknisk en streng er en rekke tegn. Så dette er nå en matrise av en rekke tegn. Men det er mye lettere å tenke på dette som bare en rekke strenger. Så hvorfor kan parentes være tom? Liker, hvorfor kan ikke vi si, brakett 5, brakett n? Yeah. Yeah. Vi vet ikke hvor mange innganger der kommer til å være. Så hvis vi ser på klang eksempel vi sier clang dash o hallo hello.c. I dette spesielle tilfellet er det skje å være tre kommandolinjeargumenter. Og så brackets-- vi får se i en andre ville det ikke være tre. Det teknisk ville være fire. Men brakettene, ville vi si, det er tre. Men nå hvis vi så på farten mario.c dot dot, brakettene vi ønsker å sette to i dem. Og det er mange av kommandoene som har et variabelt antall kommandolinje argumenter. Hva denne versjonen av brakett notasjon indikerer er at argv er en rekke strenger. Men vi vet ikke hvor mange strenger er i denne matrisen. Og hvordan vet vi hvordan mange strenger er i rekken? Det er hele poenget argc. argc forteller oss hvor lenge argv er. Så det siste for å holde i tankene er at, teknisk, kommandoen selv teller som ett av kommandolinjeargumenter. Så cd pset1, er det to kommandolinjeargumenter. Programmet i seg selv, cd, og deretter selve argumentet del av det, pset1. Alle programmer som du har skrevet så langt har hatt et kommandolinje argument-- dot slash Mario. Det er den eneste kommandolinje argument. Så nå ser på klang dash o hallo hello.c. Så hva er argc? 4. Så argc er 4. Klang, så argv braketten 0 er klang. argv braketten en er dash 0. argv brakett 2 er hei, og argv brakett 3 er hello.c. Ok, så spørsmål om dette, og så får vi se på noen programmatiske eksempler. OK. Så vi tar en titt på hello3.c. Så dette bør være kjent fra en av de første c eksemplene vi hadde der vi ville bare si hei verden, men nå er dette mer generelt. Så her er vi si hei % s backslash n argv braketten en. Notice-- så opp til dette punktet, er dette hva min malfil har sett ut. Jeg hadde int main (void), og så ville jeg gjøre noe i den viktigste funksjonen. Nå i stedet, når vi begynner å gjøre med kommandolinjeargumenter, vi trenger å oppgi en annen form for main. Så se på hello3 igjen, det viktigste som skjer å ta to argumenter now-- int argc, antall kommandolinjeargumenter, og streng argv parentes, selve strenger kom inn på kommandolinjen. Så jeg kommer til å endre det mal for å gjenspeile det faktum. Nå når du skriver et program, hvis du ikke gjør det trenger å ta noen kommandolinje argumenter, så bare bruker int main (void). Men nå når du skriver kommandolinje argument programmer, som du kommer til å gjøre for problem satt two-- så nå at du kjører programmer som må ta kommandolinjeargumenter, du må ha hoved av dette skjemaet. Så her-- dette er den store bruken av kommandolinje argument. Så skriver argv en. OK så la oss kompilere og kjøre dette programmet. Gjør hello3. Kompilerer. Dot slash hello3. Og la oss si, "Rob". Hei Rob. Hvis jeg sier, "Hei Maria," Hei Maria. Hei Maria. Hannah fortsatt sier "hei Maria, "fordi jeg ikke gjør noe med vår argv to. Argv to nå ville være "Hannah." Argc ville være tre. Hva om jeg gjorde dette? Så hei null. Han såvidt det faktum at teknisk, GetString kan returnere null, men vi får en mye mer inn i hva null faktisk er. Men ta det som et spørsmål om faktum at ingen er generelt dårlig. Vi gjorde noe galt hvis det er å skrive "hallo null." Og grunnen til at vi gjorde noe galt er-- godt, når jeg kjørte dot slash hello3, argc var en. Så det betyr at lengden av argv var en. Hvis en matrise er av lengde 1, den eneste gyldige indeksen er lik null. Og så her argv en er utenfor omfanget av denne matrisen. Det var omtrent som før når jeg prøvde å lagre 6 utenfor enden av rekken. Så jeg prøver å få tilgang til noe utsiden av argv teller, og vi får null. Så en bedre versjon av dette er en forbedring, eksplisitt sjekker argc. Så hvis argc lik 2, betyr at vi kjørte noe som dot slash hello3 Rob. Og det vil skrive "hallo Rob." Hvis argc ikke lik 2, så er det bare å gå å ignorere hva du putter på kommandolinjeargument som kommandolinjeargumenter. Eller hvis du ikke har satt noen i det hele tatt, det er bare kommer til å ignorere det og bare si: "Hei du." Så kompilering dette. Gjør hello4. Og kjører hello4. Kjører det på denne måten, hva som skal skrives ut? "Hei du." Hei du. Hva om hello4 Rob? "Hello Rob." Og til slutt, hallo Rob Maria er bare "hei du" igjen, fordi du egentlig ikke inn noe som det forventes. Du kom inn flere navn enn det kunne håndtere, så det bare misligholdt til hallo du oppførsel. Så spørsmål om dette? Eller kommandolinjeargumenter? OK, så ta en titt på en par flere eksempler på bruk kommandolinje arguments-- først vi har argv dash en prikk c. Så kommentarene gi bort det dette programmet bør gjøre. Men legg merke til now-- dette for loop, Dette samsvarer nøyaktig mønster Jeg sa før. Vi bare måtte være hjelp argc stedet for n. Nå argc er virkelig n. Det er lengden av argv matrisen. Så er itera over argv matrise printf-ing hver argv verdi. Så hvis jeg gjør dette. Gjør argv en. Det kompilerer. Dot slash argv en. Bare å kjøre dette, det utskrifter dot slash argv 1 siden det var den eneste kommandolinje argument-- programnavnet. Det vil alltid være på least-- argc kan ikke være mindre enn én, Siden det alltid vil minst være programnavnet for å kjøre. Så argv en Rob vil skrive argv 1 og deretter på den nye linjen "Rob". Så i første iterasjon av denne sløyfen, jeg er 0. Argv 0 er programnavnet. Dot slash argv en. Og så argv en er min første kommandolinje argument, som er Rob. På dette punktet, er vi lik argc. Vi bryte ut av loopen og vi er ferdige. Så dette vil fungere for en vilkårlig antall kommandolinjeargumenter. Legg merke til det skrives argv 0, argv 1, argv 2, argv 3, argv 4. Og det er ingen argv 5. argc er lik fem. Så på argc-- på jeg er lik 5, vi bryter ut av loopen. OK. Så spørsmål om det før vi se på et mer komplekst eksempel? Så argv to. Greit. Så vi er fortsatt utskrift kommandolinjeargumenter. Men nå merker vi har en nestet for loop. Så hva er dette å gjøre? Så den første sløyfen gjør nøyaktig hva det gjorde før. Vi er fortsatt looping løpet hver kommandolinje argument, men nå er dette andre loop-- vi har også sett noe som dette før. Da han ble gjentar løpet Zamyla utskrift av Z-A-M-Y-L-A. Så denne andre sløyfen for int j lik 0, n er lik strlen av argv brakett i. Så la oss først tenke for the-- la oss gå gjennom. La oss tenke hva maskinen ville hvis jeg kjørte dette programmet som bare prikken slash argv dash 2. Så hvis jeg kjørte denne koden, og deretter argc kommer til å være lik 1. Og streng argv-- det er bare kommer til å være ett indeksen i argv, og som kommer til å være lik dot slash argv 2-- programnavnet. OK, så nå jeg er lik 0, i mindre enn 1, jeg pluss pluss for int j lik 0, n er lik strlen av argv braketten 0, så i den første iterasjon av denne sløyfen. argv braketten 0 er dot slash argv to. Så hva er lengden på denne strengen? Vel, dot slash A-R-G-V dash 2. Så strlen som vil være åtte. Så j lik 0, n er lik 8. Så lenge j er mindre enn 8, j ++. Og med det kommer vi til å være utskrift av en enkelt karakter, som er argv brakett i braketten j. Derfor er den eneste i er null. Vi har fortsatt bare har én kommandolinje argument. I den første iterasjon av for loop, vi er kommer til å være utskrift argv brakett 0 braketten 0. Og så j kommer til å øke. Og vi kommer til å skrive ut argv brakett 0 braketten en. Og så argv brakett 0 brakett 2. Så dette er vårt første møte av flerdimensjonale matriser. Husk tidligere at jeg sa at argv er teknisk en rekke matriser av tegn. Så her hvis jeg sa noe sånt string s tilsvarer argv brakett i, og så sa jeg, s braketten j, dette ville være å oppnå det samme. Nå har du før sett s braketten j. Det er bare å få tilgang til j-th karakteren av denne strengen. Så med dette, vi får det j-th karakter av i-te argv. Så hva bør dette til slutt utgang? Gjør argv to. Det kompilerer. Dot slash argv to. "Rob Maria Hannah," og gi oss noen rom. Så vi ser at dette er å gi ut prikk på en egen linje og slash på en egen linje og en på sin egen linje. Det å skrive ut hver individuell karakter av hver kommandolinje argument. Og deretter i mellom dem, på grunn av denne nye linje vi skal skrive ned her, i mellom dem vil det skrive ut en ny linje. Så dette er lik den tidligere argv dash 1, som skrives hver kommandolinje argument, men nå er vi skriver kommandolinjeargumenter og deretter gjentar gjennom hver karakter av hver kommandolinjeargument å få denne produksjonen. OK? Så spørsmål om dette? En ting å merke seg er at kommandolinje arguments-- slik at de er atskilt med mellomrom som du ville naturligvis forventer at de skal være. Så en streng kan ha mellomrom i den. Det er ikke super viktig, men hvis jeg ønsket tredje kommandolinjeargument å ha en plass i den, så jeg kunne si noe sånt som dette. OK? Så dette nå fortsatt bare har tre- kommandolinje arguments-- vel fire. Dot slash argv dash 2, Rob, Maria og Hannah Bloomberg. OK. Spørsmål om dette? Det er ikke noe spesielt om plass karakter. Det bare skjer for å være at kommandolinje behandler mellomromstegnet som hvordan du skille hver argument. Greit. Så da Problem sett two-- du kommer til å være ser på hemmelig nøkkel kryptografi. Så, i likhet med det eksempelet vi så fra A Christmas Story, du kommer til å bli å implementere noen algoritmer som, gitt en melding, du kommer til å være i stand å kryptere meldingen at bare noen med at hemmelig nøkkel, med det dekoder ring, skal være i stand til å dekryptere. Så det er standardutgaven. Du kommer til å implementere to forskjellige versjoner. Hvis du tilfeldigvis ta en titt på hacker utgave nå, vi kommer til å gi du en streng som dette, som representerer et kryptert passord. Så målet er å finne ut hva dekryptert passordet er. Nå er dette faktisk hvordan passord er lagret i en rekke datamaskiner, og det bare lagrer dette tilfeldig streng med tegn. Du må finne ut hvordan du får fra dette tilfeldig rekke med tegn til hva det opprinnelige passordet var. Og til slutt, etter dette Problemet sett, bør du kunne forstå hva dette betyr. Så du vil lære å dekryptere denne typen tilfeldig streng. Tilsvarende, hvis du husker fra uke 0, har du kanskje sett denne nettadressen. Og du bør være i stand til å dekryptere dette til slutt. Du kan ikke være fornøyd når du dekryptere den, og klikk på linken. Greit. Det var det for i dag. Så se deg neste uke! [Elektronisk musikk SPILLE]