[Powered by Google Translate] [Walkthrough - Problem Set 2] [Zamyla Chan - Harvard University] [Dette er CS50. CS50.TV] OK. Hei, alle sammen, og velkommen til Walkthrough 2. Først vil jeg gratulere deg for etterbehandling pset en. Jeg vet at det kunne ha vært litt tøft for noen av dere, kunne ha vært den første dataprogram som du skrev, men bare husk at på slutten av dette, når du ser tilbake på slutten av semesteret, du skal se på pset 1, og du vil si: "Hei, jeg kunne ha gjort det i 5 minutter." Så kjenner og stoler på at på slutten av dette vil du definitivt finne pset en ganske enkel. Men for nå er det en stor prestasjon, og gratulerer med å få gjort. Nå også en rask notat før vi kommer inn i kjøtt av walkthrough. Jeg vil bare gjøre en rask oppmerksom på at jeg noen ganger ikke har nok tid i løpet av de walkthroughs å gå gjennom hver enkelt måte å gjøre oppgavesettet og heller bare kanskje fokusere på en eller to slags implementeringer, måter du kan gjøre dette. Men det er ikke å si at du er forbudt fra å gjøre det på en annen måte. Det er ofte, som med informatikk, mange måter å gjøre ting, og så definitivt gjerne bruke en annen type løsning enn jeg kan ha presentert. [Pset 2: Crypto - Zamyla Chan - zamyla@cs50.net] [Pset2 - 0. En del av spørsmål - 1. Caesar - 2. Vigenere] OK. Så problemet ligger 2: Crypto er en morsom en. Igjen, med hver pset vil du begynne med en del av spørsmålene som kommer til å bli gjennomført i seksjonene dine med din tildelte undervisning kar. Vi kommer ikke til å gå gjennom disse over walkthrough, men de definitivt vil hjelpe deg å fullføre pset. Så den første delen av oppgavesettet er Caesar. Og så i Caesar noen vil passere deg en nøkkel med et heltall, og du vil kryptere en tekststreng som de gir deg og gi dem tilbake en kryptert ting. Hvis noen så A Christmas Story, det er et eksempel på at det. Deretter den andre delen av problemet sett er Vigenere, som er en mer avansert kryptering teknikk. Og så skal vi chiffrering et stykke tekst, bortsett fra i stedet med bare en enkelt heltall, vi faktisk kommer til å kode den med et søkeord som brukeren vil gi oss. Ok, så det første verktøyet i verktøykassen i dag er faktisk kommer til å være å oppdatere maskinen. På diskusjonsforumet vil vi se ting som "Hvorfor ikke dette arbeidet?" "Hvorfor ikke Send 50 arbeid?" og ofte løsningen er egentlig bare for å oppdatere enheten. Og så hvis du bare kjøre i et terminalvindu i apparatet sudo yum-y - det er et flagg som sier ja, oppdatere alt - oppdateringen, da apparatet vil oppdatere hvis behovet være. Og det gjør ikke vondt hvis du allerede er på den nyeste versjonen av apparatet. Da vil det bare si ingen nye oppdateringer tilgjengelig, og du kan fortsette å jobbe sammen. Men dette er bra til å utføre selv hver gang du åpner apparatet fordi vi er fortsatt veldig mye - noen ganger hvis vi kommer inn i en bug - fikse det i apparatet. Så sørg for at du har den nyeste versjonen av apparatet og kjøre som oppdaterer det. OK. Så siden vi har å gjøre med bokstaver og endring, enciphering ting, vi kommer til å virkelig ønsker å bli bestevenn med vår ASCII diagram. Det er mange som på nettet, hvis du finner. Kanskje til og med lage din egen. I utgangspunktet, med hver bokstav og hvert tall og hver karakter det er et tall forbundet med dem, og så det er godt å se sine ASCII-verdier langs selve brevet. Det vil definitivt hjelpe deg i oppgavesettet. En ting som virkelig hjalp meg i dette problemet settet var å faktisk skrive det ut, og som jeg gikk gjennom, ville jeg faktisk trekke på den, skrive: "Hvis dette har å gå til der, da ..." Slags tegne på den og merke det opp, blir bestevenner med ASCII-tabellen. Så har vi et par andre verktøy til rådighet. Denne gangen i stedet for å faktisk spørre brukeren for alle innspill vi kommer til å gjøre en kombinasjon. Vi kommer til å be dem for noen innspill, men vi kommer også til å bare bruke kommandolinjeargumentene. Så når de kjører sitt program, vanligvis du sier. / Hallo, for eksempel, hvis programmet var hallo.c. Men denne gangen i stedet for bare å si det, de kan sette ord, argumenter etterpå. Og så vi kommer til å bruke det de passerer inn til oss som innspill deres også, så gå utover bare å spørre for heltall, men også ved hjelp av kommandolinjeargumenter. Og så vil vi gå inn i matriser og strenger, som vi skal bruke mye også. Her er bare et eksempel på en mini ASCII diagram. Som jeg sa, tilsvarer hver bokstav til et tall, og så bli kjent med det. Det vil komme godt med. Og senere når vi begynner å gjøre noe ASCIIMath håndtere tallene - legge til, trekke dem - så definitivt godt å referere til denne figuren. Så her er et eksempel på en Cæsar chiffer - noe som du kanskje har spilt med. Det er bare et hjul. I hovedsak er det en ytre alfabetet og så er det en indre alfabetet. Så rett her er et eksempel på Caesar cipher men med en nøkkel fra 0. I hovedsak er en linje med A, B på linje med B, hele veien opp til Z. Men så sier vi ønsket en nøkkel på 3, for eksempel. Da ville vi roter indre hjulet slik at A nå justert med D, etc. Og så dette er egentlig hva vi skal gjøre. Vi har ikke et hjul, men hva vi skal gjøre er å gjøre vårt program slags skifte alfabetet sammen med oss ​​en viss mengde tall. Så som jeg sa tidligere, vi kommer til å være håndtere kommandolinjeargumenter så vel som å få et heltall. Så måten at en bruker vil kjøre Caesar programmet er ved å si. / Caesar og deretter skrive inn et tall etter det. Og at antallet representerer nøkkelen, skiftet, hvor mange ganger du kommer til å være roterende indre hjulet på Caesar cipher. Og så du ser her et eksempel. Hvis vi angitt bokstaver fra A til L i vår Caesar cipher, da ville det inngang D gjennom O fordi det er hver bokstav flyttet over tre ganger, akkurat som eksempel på hjulet som jeg viste deg. Så hvis du har lagt inn, for eksempel, er dette CS50! så det ville også flytte alle bokstavene. Og det er en viktig ting i både Cæsar og Vigenere er at vi kommer til å hoppe over noen ikke-bokstaver. Så noen mellomrom, tegn, osv., tall, vi kommer til å holde dem samme. Vi kommer bare til å skifte bokstavene i dette tilfellet. Så som du ser i hjulet, vi har bare bokstavene tilgjengelig for oss, slik at vi bare ønsker å skifte bokstavene og kryptere bokstavene. Så det første du må gjøre, så du at bruken for Caesar i problemet sett 2 er å kjøre Cæsar og deretter skrive inn et tall når du kjører den i terminalen. Så det vi trenger å gjøre er å liksom få det nøkkel og tilgang til den. Og så ønsker vi å liksom se det kommer til å bli den andre kommandolinje argument. Den første kommer til å bli. / Caesar, og den neste kommer til å være nøkkelen nummer. Så før vi hadde int main (void) for å starte våre C-programmer. Vi kommer til å trekke tilbake et lag litt og faktisk se at i stedet for å sende i tomrommet til våre viktigste funksjon vi faktisk arbeider med to parametere. Vi har en int heter argc og deretter en rekke strenger som kalles argv. Så argc er et heltall, og det representerer antall argumenter som sendes inn til programmet. Og så argv er faktisk listen over de argumenter som sendes. Alle av argumentene er strenger, og så argv representerer en matrise, en liste, av strenger. La oss snakke om arrays litt. Arrays er egentlig en ny datastruktur. Vi har ints, vi har dobler, har vi strenger, og nå har vi arrays. Arrays er datastrukturer som kan holde flere verdier av samme type, så egentlig en liste over hva du vil bruke. Egentlig, hvis du ville ha en liste av heltall alt i en variabel, så ville du lage en ny variabel som var av type int array. Så arrays er null-indeksert, noe som betyr at det første elementet i matrisen er på indeks 0. Hvis matrisen er av lengde 4, som i dette eksempel, så den siste elementet ville være på indeks 3, som er 4-1. Så for å lage array, ville du gjøre noe som dette. Si at du ønsket en dobbel array. Dette gjelder for alle typer data type, skjønt. Så si at du ønsker en dobbel array. Si at du ønsker å kalle det postkasse. Akkurat som du ville sette opp et annet dobbel, du ville si dobbel og deretter navnet, men denne gangen vi sette hakeparenteser, og deretter nummeret vil være lengden av tabellen. Merk at i arrays ikke vi noen gang kan endre lengden, slik at du alltid må definere og velge hvor mange bokser, hvor mange verdier arrayet kommer til å holde. Så for å sette forskjellige verdier i arrayet, du kommer til å bruke denne følgende syntaks, som du ser på lysbildet. Du har postkassen indeks 0 vil bli satt til 1,2, postboks indeks 1 sett til 2,4, etc. Så nå som vi har anmeldt arrays litt, la oss gå tilbake til argc og argv. Vi vet at argv er nå en rekke strenger. Så når en bruker går i - sier de kjører et program - de sier. / hallo David Malan, hva programmet vil gjøre for deg allerede er faktisk kommet opp med hva argc og argv er. Så du trenger ikke å bekymre deg for det. Argc i dette tilfellet ville være 3 fordi det ser tre forskjellige ord adskilt med mellomrom. Og så da array i dette tilfellet, vil den første indeksen være. / Hallo, den neste David, den neste Malan. Ser noen gang hva forholdet mellom argv,  rekken, og argc er? Ja. Vi vil komme inn som i et eksempel i args.c. La oss se om vi kan dra nytte av forholdet mellom to. Her kan du finne at i apparatet standardprogrammet å åpne. c-filer er ofte Emacs. Men vi ønsker å håndtere gedit, så hva du kan gjøre er at du kan høyreklikke på C-filen, gå til Egenskaper, Åpne med, og velg deretter gedit, Angi som standard, og nå programmet skal åpnes i gedit stedet for Emacs. Perfekt. Så her har jeg et program som jeg ønsker å skrive ut hver kommandolinje argument. Så uansett hva brukeren innganger, jeg ønsker å hovedsak returnere den tilbake til dem på en ny linje. Så hva er en struktur som vi kan bruke til å iterere over noe - noe som du sannsynligvis brukt i pset 1? Hvis du ønsker å gå gjennom et visst antall ting? >> [Student] For loop. For loop. Akkurat. Så la oss starte med for loop. Vi har for int i = 0. La oss bare begynne med en standard initialisering variabel. Jeg kommer til å forlate forutsetning for et sett, og deretter si jeg + +, kommer til å gjøre ting der. OK. Så tenker tilbake til argv, hvis argv er listen over argumenter som sendes inn til programmet og argc er antall argumenter i programmet, så det betyr at argc er egentlig lengden på argv, høyre, fordi det kommer til å være så mange argumenter som verdien av argc. Så hvis vi ønsker å iterere over hvert element i argv, vi kommer til å ønske å hver gang få tilgang til variabelen i argv ved den gitte indeksen. Som kan representeres med dette, ikke sant? Denne variabelen her representerer bestemt streng i dette tilfellet fordi det er en streng array - den spesielle strengen på det gitte indeks. Hva vi ønsker å gjøre, i dette tilfellet ønsker vi å skrive den ut, så la oss si printf. Og nå argv er en streng, så vi ønsker å sette det plassholder der. Vi ønsker en ny linje bare for å gjøre det ser bra ut. Så her har vi en for løkke. Vi har ikke tilstanden ennå. Så jeg starter på 0, og deretter hver gang det kommer til å skrive den gitte strengen på det aktuelle indeksen i tabellen. Så når vi ønsker å stoppe å skrive ut elementer i array? Når vi er ferdig, ikke sant? Når vi har nådd slutten av tabellen. Slik at vi ikke ønsker å overskride forbi lengden av tabellen, og vi allerede vet at vi ikke trenger å faktisk aktivt finne ut hva lengden på argv er fordi det er gitt til oss, og hva er det? Argc. Akkurat. Så vi ønsker å gjøre denne prosessen argc antall ganger. Jeg er ikke i riktig katalog. OK. Nå la oss gjøre args. Ingen feil, og det er flott. Så la oss bare kjøre args. Hva dette kommer til å gå tilbake til oss? Det er bare kommer til å skrive den tilbake. "Du inputted args inn i programmet, jeg kommer til å gi den tilbake til deg." Så la oss si at vi ønsker å si args deretter foo bar. Så da er det så skrives det ut tilbake til oss. Greit? Så det er et eksempel på hvordan du kan bruke argc og argv vite at argc representerer lengden argv. Pass på at du ikke noen gang med arrays tilgang en utover lengden av tabellen fordi C vil definitivt rope på deg. Du får noe som kalles en segmentering feil, som er aldri morsomt, i utgangspunktet si at du prøver å få tilgang til noe som ikke finnes, ikke tilhører deg. Så sørg for at, og spesielt med null-indeksering, ønsker vi ikke å - Som for eksempel, hvis vi har en rekke lengde 4, at datatabellindekser 4 eksisterer ikke fordi vi starter på 0, null-indeksen. Det vil bli andre natur akkurat som for løkker når vi starter på 0. Så bare holde det i bakhodet. Du ønsker ikke å stadig gå til indeks av en matrise som er utenfor rekkevidde. Så vi kan se nå hvordan vi kan slags tilgang kommandolinjeargumentene som er gått i. Men som du så streng, er argv faktisk en streng array. Så det er faktisk ikke et heltall ennå, men i Caesar ønsker vi å håndtere heltall. Heldigvis er det en funksjon som er opprettet for oss som faktisk kan konvertere en streng til et heltall. Også her har vi å gjøre med brukerens input der vi spørre dem for innspill her for nøkkelen, slik at vi ikke kan faktisk reprompt og si, "Å, gi meg et annet heltall, si, hvis det ikke er gyldig." Men vi trenger fortsatt å se etter riktig bruk. I Caesar de bare lov til å passere i en rekke, og slik at de må løpe. / caesar og deretter må de gi deg et nummer. Så argc må være et visst antall. Hvilket nummer ville det være hvis de må passere deg. / Caesar og deretter en nøkkel? Hva er argc? >> [Student] 2. >> Two. Akkurat. Så du vil være sikker på at argc er to. Ellers kan du i utgangspunktet nekte å kjøre programmet. I main er det en funksjon som sier int main, så da vi alltid i god praksis return 0 på slutten av et vellykket program. Så hvis si, de gir deg 3 kommandolinjeargumenter i stedet for 2 eller gi deg en, for eksempel, så hva du skal gjøre er at du vil se etter at og deretter tilbake 1 sa nei, jeg kan ikke fortsette med dette programmet. [Student] Det kan ikke være et mellomrom i teksten. >> Unnskyld meg? [Student] Det kan ikke være et mellomrom i teksten du prøver å kryptere. Ah! I form av tekst som vi prøver å kryptere, kommer det faktisk senere når vi gir teksten. Så akkurat nå er vi bare akseptere som kommando argumenter det faktiske antallet, selve skiftet for Caesar kryptering. [Student] Hvorfor trenger du to i motsetning til bare en argc? Det er definitivt en nummer. Høyre. Grunnen til at vi trenger 2 for argc stedet for en er fordi når du kjører et program og si. / caesar eller. / hallo, som teller faktisk som en kommandolinje argument. Så da tar allerede opp 1 og så da vi innrykker en ekstra. Så du skriver inn faktisk en streng i kommandolinjen argument. Hva du ønsker å gjøre, for Caesar ønsker vi å håndtere et heltall, slik at du kan bruke denne atoi funksjonen. Og i utgangspunktet, passerer du den i en streng og deretter vil det kommer du tilbake et heltall om det er mulig å gjøre det streng til et heltall. Nå husker da vi arbeider med printf eller GetString, ting som det, vi inkluderer bibliotekene som er spesifikke for oss. Så i begynnelsen starter vi med en hash tag standard I / O,. H, noe sånt. Vel, er atoi ikke innen ett av disse bibliotekene, så hva vi trenger å gjøre er vi nødt til å inkludere retten bibliotek for det. Så husker tilbake til Walkthrough 1 hvor jeg diskutert den manuelle funksjonen. Du skriver mannen i terminalen og deretter etterfulgt av navnet til en funksjon. Og slik at det vil få opp en hel liste av bruken sin, men også det vil få opp hvilket bibliotek som hører til. Så jeg skal la det til deg å bruke den manuelle funksjonen med atoi og finne ut hvilke bibliotek du trenger å inkludere for å kunne bruke atoi funksjonen. Så vi har nøkkelen og nå det gjelder å få den ren tekst, og slik at faktisk kommer til å være brukerens input der du be. Vi har jobbet med GetInt og GetFloat, og så i samme retning vi kommer til å være håndtere GetString. Men i dette tilfellet trenger vi ikke å gjøre noe gjøre mens eller mens sløyfer for å sjekke. GetString vil definitivt gi oss en streng, og vi kommer til å kryptere hva brukeren gir oss. Så du kan anta at alle disse bruker lagt inn strengene er riktige. Flott. Så da når du har fått nøkkelen, og når du har fått teksten, nå det som er igjen er du nødt til chiffrering klarteksten. Bare for å raskt dekke over lingo, er klarteksten hva brukeren gir deg, og den krypterte teksten er hva du gå tilbake til dem. Så strenger, for å være i stand til å gå gjennom faktisk bokstav for bokstav fordi vi må skifte hver bokstav, Vi forstår at strenger, hvis vi slags skrelle tilbake på laget, Vi ser at de er bare virkelig en liste over tegn. En kommer etter hverandre. Og så kan vi behandle strenger som arrays fordi de er matriser av tegn. Så si du har en streng som heter tekst, og innen den variabelen tekst lagres Dette er CS50. Så tekst på indeks 0 ville være en stor T, ville indeks 1 være h, etc. Og deretter med matriser, i argc eksempel i args.c, Vi så at vi måtte iterere over en rekke og så vi måtte veksle fra i = 0 opp før jeg er mindre enn lengden. Så vi trenger en måte å finne ut hva lengden på strengen vår er hvis vi skal iterere over det. Heldigvis igjen, det er en funksjon det for oss, men senere i CS50 vil du definitivt være i stand til å implementere og lage din egen funksjon som kan beregne lengden av en streng. Men for nå skal vi bruke streng lengde, så strlen. Du passerer i en streng, og deretter vil det returnere deg en int som representerer lengden på strengen din. La oss se på et eksempel på hvordan vi kan være i stand til å iterere over hvert tegn i en streng og gjøre noe med det. Hva vi ønsker å gjøre er iterere over hvert tegn i strengen, og hva vi ønsker å gjøre er å skrive ut vi tilbake hvert tegn 1 til 1 bortsett fra vi legge til noe ved siden av. Så la oss starte med for loop. Int i = 0. Vi kommer til å forlate rommet for tilstanden. Vi ønsker å veksle til vi kommer til slutten av strengen, ikke sant? Så hva funksjonen gir oss lengden på strengen? [Uhørlig student respons] Det er lengden på kommandolinjeargumentene. Men for en streng ønsker vi å bruke en funksjon som gir oss den lengden på strengen. Så det er streng lengde. Og så så må du passere i en streng til det. Den trenger å vite hva streng det er behov for å beregne lengden på. Så da i dette tilfellet er vi arbeider med streng s. Flott. Så hva vi ønsker å gjøre, la oss printf. Nå ønsker vi å håndtere tegn. Vi ønsker å skrive ut hver enkelt karakter. Når du vil den skal skrive ut en flåte, vil du bruke plassholderen som% f. Med en int ville du bruke% d. Og så på samme måte, med en karakter du bruker% c for å si at jeg kommer til å skrive ut et tegn som er lagret inne i en variabel. Så vi har dette, og la oss legge en periode og en plass til den. Hvilken karakter bruker vi? Vi kommer til å bruke uansett karakter vi er på av strengen. Så vi kommer til å bruke noe med streng, men vi ønsker å være tilgang til viss karakter der. Så hvis en streng er bare en matrise, så hvordan kan vi oppleve elementer av arrays? Vi har disse hakeparenteser, og da vi satte indeksen i det. Så vi har hakeparenteser. Vår indeksen i dette tilfellet kan vi bare bruke jeg. Akkurat. Så her vi sier vi skal skrive et tegn etterfulgt av et punktum og et mellomrom, og at karakteren skal være i. brevet i vårt bånd s. Jeg bare kommer til å redde det. Okay. Nå skal jeg kjøre streng lengde. Så vi hadde en streng som heter OMG, og nå er det understreket enda mer. Tilsvarende, la oss si at vi faktisk ønsker å få en streng fra brukeren. Hvordan kan vi gjøre dette? Før, visste hvordan vi får en int? Vi sa GetInt, ikke sant? Men dette er ikke int, så la oss GetString. La oss lage hyssinglengde. Her har vi ikke angi et bestemt spørsmål. Så jeg vet ikke. Jeg kommer til å sette navnet mitt her, og så kan jeg gjøre en av de tingene hvor jeg tilordne et ord for hver bokstav eller noe sånt. Cool. Så det er streng lengde. Så vi er tilbake til Caesar. Vi har noen få verktøy på hvordan vi iterere over en streng, hvordan vi tilgang til hver enkelt element. Så nå kan vi komme tilbake til programmet. Som jeg nevnte tidligere, i ASCII-tabellen, din beste venn, du kommer til å se tallene som er forbundet med hver bokstav. Så her si vår klartekst er jeg svimmel! Deretter hver av disse tegnene kommer til å ha et nummer og ASCII-verdi forbundet med det, selv apostrof, selv plassen, selv utropstegn, slik at du ønsker å holde det i bakhodet. Så si vår nøkkel som brukeren inkluderes i deres Kommandolinjeargumentet er 6. Det betyr for den første bokstaven, som er I, som er representert med 73, du vil gå tilbake til dem hva brevet er representert ved ASCII-verdi på 73 + 6. I dette tilfellet som ville være 79. Nå ønsker vi å gå til neste tegn. Så neste i indeks 1 av klarteksten ville være apostrof. Men husk vi bare ønsker å chiffrering bokstavene. Så vi ønsker å være sikker på at apostrof faktisk forblir den samme, at vi ikke endrer fra 39 til hva 45 er. Vi ønsker å beholde den som en apostrof. Så vi ønsker å huske å bare chiffrering bokstavene fordi vi vil at alle andre symboler for å forbli uendret i vårt program. En annen ting som vi ønsker er å bevare store bokstaver. Så når du har en stor bokstav, bør det holde som en stor. Lowercases bør holde som små bokstaver. Så noen nyttige funksjoner for å kunne forholde seg til bare enciphering bokstaver og holde bevare kapitalisering av ting er de isalpha, isupper, islower funksjoner. Og så disse er funksjoner som returnerer du en boolsk verdi. I utgangspunktet, sant eller usant. Er dette en stor? Er dette alfanumerisk? Er dette et brev, i hovedsak. Så her er 3 eksempler på hvordan du ville bruke denne funksjonen. I utgangspunktet kan du teste om verdien returnert til deg av den funksjonen er sant eller usant basert på at innspill. Enten ikke chiffrering noe eller Cipher det eller sørge for at det er store bokstaver, etc. [Student] Kan du bare forklare dem litt mer og hvordan du bruker dem? >> Ja, sikkert. Så hvis vi ser tilbake, her har vi en hovedstad jeg, ikke sant? Så vi vet at jeg går til O fordi jeg + 6 er O. Men vi vil være sikker på at det O kommer til å bli en stor O. Så i utgangspunktet, er den slags kommer til å endre våre innspill. Så enten det er store eller ikke vil slags endre måten vi håndtere det. Så hvis vi bruker isupper funksjon på den aktuelle indeksen, så isupper ("I"), som returnerer for oss sant, så vi vet at det er øvre. Så da basert på det, senere vil vi gå inn i en formel at du skal bruke til å skifte ting i Caesar, så da utgangspunktet, kommer det til å være en litt annen formel hvis det er store i motsetning til små bokstaver. Fornuftig? Ja. Ingen grunn til bekymring. Jeg snakket litt om å legge 6 til et brev, som ikke helt fornuftig bortsett fra når vi slags forstå at disse tegnene er slags utbyttbare med heltall. Hva vi gjør er vi type bruk implisitt casting. Vi vil gå inn i casting litt senere på hvor du tar en verdi og du slår den inn i en annen type enn den opprinnelig var. Men med denne pset vil vi være i stand til å slags hverandre bruke tegn og deres tilsvarende heltallsverdier. Så hvis du bare encase en karakter med bare enkle anførselstegn, så vil du være i stand til å jobbe med det med heltall, som arbeider med det som et heltall. Så hovedstaden C gjelder til 67 år. Små bokstaver f relaterer til 102. Igjen, hvis du ønsker å vite disse verdiene, se på din ASCII-tabellen. Så la oss gå inn i noen eksempler på hvordan du kan være i stand til å trekke og legge til, hvordan du faktisk kan virkelig jobbe med disse tegnene, kan du bruke dem om hverandre. Jeg si at ASCIIMath skal beregne tillegg av et tegn til et heltall og viser deretter den resulterende karakter samt den resulterende ASCII verdi. Og så her jeg sier - vi vil håndtere denne delen senere - men innerst inne, jeg sier at brukeren skal si kjøre ASCIIMath sammen med en nøkkel, og jeg sier at den tasten skal være nummer som vi kommer til å legge dette tegnet. Så her legge merke til at siden jeg krevde en nøkkel, siden jeg krever at de gir meg en ting, Jeg vil bare godta. / Asciimath og en nøkkel. Så jeg kommer til å kreve at argc er lik 2. Hvis det ikke er det, så jeg kommer til å returnere en og programmet vil avslutte. Så jeg sier nøkkelen ikke kommer til å være den første kommandolinjen argument, det kommer til å bli den andre, og som du ser her, Jeg kommer til å slå den inn i et heltall. Så jeg kommer til å sette en karakter å være r. Legg merke til at den type av variabelen chr faktisk et heltall. Slik at jeg er i stand til å bruke r som et heltall er av encasing det med disse enkle anførselstegn. Så tilbake til vår printf uttalelse der vi har en plassholder for et tegn og deretter en plassholder for et heltall, tegnet er representert ved CHR, og heltallet er nøkkelen. Og så så vi kommer til å i resultatet legge 2 sammen. Så vi kommer til å legge r + uansett nøkkelen er, og vi kommer til å skrive ut resultatet av det. Så la oss gjøre asciimath. Det er opp til dato, så la oss bare kjøre asciimath. Oh, men se, det gjør ikke gjøre noe fordi vi ikke egentlig gi den en nøkkel. Så når det nettopp returnert 1, vår viktigste funksjon, det har nettopp returnert tilbake til oss. Så da la oss passere i en nøkkel. Noen gi meg et nummer. >> [Student] 4. 4. Okay. So r økte med 4 kommer til å gi oss v, som svarer til den verdi av ASCII 118. Så da er det slags fornuftig at - Egentlig kan jeg spørre deg, hva tror du ASCII verdien av r er hvis r + 4 er 118? Så ja, er r 114. Så hvis du ser på ASCII-tabellen da, sikkert nok, vil du se at r er representert med 114. Så nå som vi vet at vi kan legge heltall til tegn, synes dette ganske enkelt. Vi er bare nødt til iterere over en streng som vi så i et eksempel før. Vi skal sjekke om det er et brev. Hvis det er, så får vi skifte den ved hva nøkkelen er. Ganske enkelt, bortsett fra når du kommer til å like dette, du ser at z, representert ved 122, ville da gi deg en annen karakter. Vi egentlig ønsker å holde seg innenfor alfabetet vår, ikke sant? Så vi må finne ut noen måte å slags innpakning rundt. Når du kommer zed og du ønsker å øke med et visst antall, du ikke ønsker å gå inn utover ASCII alfabetet delen; du ønsker å pakke tilbake hele veien til A. Men husk du fortsatt bevare saken. Så vet at bokstavene ikke kan bli symboler akkurat som symboler kommer ikke til å være i endring også. I det siste pset definitivt du ikke trenger å, men et alternativ var å implementere grådig pset ved hjelp av modulus funksjonen. Men nå er vi faktisk nødt til å bruke modulus, så la oss bare gå over denne litt. I hovedsak, når du har x modulo y, som gir deg resten av x delt på y. Her er noen eksempler her. Vi har 27% 15. I utgangspunktet, når du trekker 15 fra 27 så mange ganger som mulig uten å få negative så får du 12 venstre over. Så det er typen som i regnestykket sammenheng, men hvordan kan vi faktisk bruke dette? Det kommer til å være nyttig for taklist vår. For dette, la oss bare si at jeg ba dere alle til å dele inn i tre grupper. Noen ganger du gjør dette i grupper og noe sånt. Si Jeg sa: "OK, jeg vil at dere skal deles inn i tre." Hvordan kan du gjøre det? [Uhørlig student respons] Nettopp. Telle. Okay. La oss faktisk gjør det. Vil du begynne? [Studenter telling av] 1, 2, 3, 4. Men husk ... >> [Student] Oh, beklager. Det er en virkelig godt poeng. Du sa 4, men vi faktisk ønsker å si en, fordi vi bare vil tre grupper. Så, hvordan - Nei, det er et virkelig godt eksempel fordi så hvordan kan du si en? Hva er forholdet mellom 4 og 1? Vel, er 4 mod 3 1. Så hvis du fortsetter, vil du være 2. Så vi har 1, 2, 3, 1, 2. Igjen, er du faktisk den femte personen. Hvordan vet du si 2 i stedet for 5? Du si 5 mod 3 er to. Jeg ønsker å se hvor mange grupper på 3 er igjen, så hvilken rekkefølge am I. Og så så hvis vi fortsatte langs hele rommet, da ville vi se at vi alltid faktisk påføre mod-funksjonen for oss selv å slags telle. Det er en mer slags konkret eksempel på hvordan du kan bruke modulo fordi jeg er sikker på at de fleste av oss har sikkert gått gjennom denne prosessen hvor vi har måttet telle. Eventuelle spørsmål om modulo? Det vil være ganske viktig å forstå begrepene dette, så jeg vil være sikker på at dere forstår. [Student] Hvis det ikke er resten, gir det deg den faktiske tall? Hvis en av de første 3 av dem hadde gjort det, ville det ha gitt dem det de faktisk var, eller ville det ha gitt dem [hørbar] >> Det er et godt spørsmål. Når det ikke er resten for modulo - så si at du har seks mod 3 - som faktisk gir deg tilbake 0. Vi skal snakke om det litt senere. Oh yeah, for eksempel 3. person - er 3 mod 3 faktisk 0, men hun sa tre. Så det er typen som en indre fangst, for eksempel, som greit, hvis mod er 0 så jeg kommer til å være den tredje personen. Men vi får inn slag av hvordan vi kanskje vil håndtere det 0 er senere. Så nå har vi en eller annen måte har en måte å kartlegge zed til riktig bokstav. Så nå har vi gått gjennom disse eksemplene, Vi slags se hvordan Caesar kan fungere. Du ser de to alfabeter og deretter se dem skiftende. Så la oss prøve og uttrykke det i form av formelen. Denne formelen er faktisk gitt til deg i spec, men la oss slags utseende gjennom hva hver variabel betyr. Vår sluttresultatet kommer til å bli den krypterte teksten. Så dette sier at i. karakter chifferteksten skal tilsvare ith karakter klarteksten. Det er fornuftig fordi vi ønsker å alltid stå i kø disse tingene opp. Så det kommer til å bli den i. karakter chifferteksten pluss k, som er vår nøkkel - det er fornuftig - og så har vi denne mod 26. Husker tilbake når vi hadde zed Vi ønsker ikke å komme inn i karakter, så vi ønsket å mod det og hva slags sjal rundt alfabetet. Etter zed ville du gå til a, b, c, d, før du kom til riktig nummer. Så vi vet at zed, hvis + 6, ville gi oss f fordi etter Zed kommer a, b, c, d, e, f. Så la oss huske vet vi med sikkerhet at zed + 6 kommer til å gi oss f. I ASCII-verdier, er z 122 og f er 102. Så vi må finne en måte å gjøre vår Caesar formel gir oss 102 etter å ha tatt i 122. Så hvis vi bare bruke denne formelen, ('z' + 6)% 26, som faktisk gir deg 24 fordi 122 + 6 er 128, 128% 26 gir deg 24 resten. Men det betyr ikke at virkelig f. Det er definitivt ikke 102. Det er heller ikke den 6. bokstaven i alfabetet. Så åpenbart, må vi ha noen måte å tilpasse dette litt. I form av den vanlige alfabetet, vet vi at z er 26. brev og f er sjette. Men vi er i informatikk, så vi kommer til å indeksere ved 0. Så da i stedet for z å bli nummer 26, vi kommer til å si det er nummer 25 fordi en er 0. Så la oss nå bruke denne formelen. Vi har z representert ved 25 + 6, som gir deg 31. Og 31 mod 26 gir deg 5 som en rest. Det er perfekt, fordi vi vet at f er femte bokstaven i alfabetet. Men det er fortsatt ikke f, ikke sant? Det er fortsatt ikke 102. Så da for denne pset, vil en utfordring være å prøve å finne ut av forholdet mellom konvertere mellom disse ASCII-verdier og den alfabetiske indeksen. Hovedsak, hva du ønsker å gjøre, vil du starte med de ASCII-verdier, men da vil du liksom oversette det til en alfabetisk indeks deretter beregne hvilken bokstav det skal være - i utgangspunktet, hva det alfabetiske indeksen er av chiffer karakter - så oversette det tilbake til ASCII-verdier. Så hvis du piske ut din ASCII-tabellen, og deretter prøve og finne sammenhenger mellom for eksempel 102 og 5 eller 122 og 25. Vi har fått vår nøkkel fra kommandolinjeargumentene, har vi fått klartekst, Vi har enciphered det. Nå er alt vi har igjen å gjøre er å skrive den. Vi kunne gjøre dette et par forskjellige måter. Hva vi kan gjøre er å skrive faktisk som vi går langs. Som vi iterere over tegnene i strengen, Vi kan ganske enkelt bare skrive akkurat da når vi beregner det. Alternativt kan du også lagre den i en matrise, og har en rekke tegn og på slutten iterere over at hele array og skrive det ut. Så har du et par alternativer for det. Og husk at% c kommer til å være plassholder for å skrive ut en karakter. Så det har vi Caesar, og nå går vi over til Vigenere, som er svært lik Caesar, men bare litt mer komplisert. Så egentlig med Vigenere er du kommer til å være bestått i et søkeord. Så i stedet for et tall, du kommer til å ha en streng, og så det kommer til å fungere som søkeordet ditt. Da, som vanlig, du kommer til å få en ledetekst for en streng fra brukeren og deretter chiffrering det og deretter gi dem den krypterte teksten tilbake. Så som jeg sa, det er veldig likt til keiseren, unntatt i stedet for skiftende av et visst antall, antallet er faktisk kommer til å endres hver gang fra karakter til karakter. Å representere det faktiske antallet til å skifte, er det representert ved tastaturet bokstaver. Så hvis du angir i en forskyvning av en, for eksempel, så som ville tilsvare en forskyvning av 0. Så det er igjen tilbake til den alfabetiske indeksen. Hva som kan være nyttig hvis du ser at vi faktisk arbeider med ASCII-verdier samt brev, samt som alfabetisk indeks, kanskje finne eller lage din egen ASCII-tabellen som viser den alfabetiske indeksen fra 0 til 25, A til Z, og de ASCII-verdier, slik at du kan slags se sammenhengen og skissere og prøve og finne noen mønstre. Tilsvarende, hvis du var skiftende på visse forekomsten ved f - og dette er enten små eller store bokstaver f - så det ville tilsvare 5. Er vi bra så langt? Formelen for Vigenere er litt annerledes. I utgangspunktet, ser du at det er akkurat som Caesar, bortsett fra i stedet for bare k har vi k-indeksen j. Legg merke til at vi ikke bruker jeg fordi egentlig, lengden på søkeordet er ikke nødvendigvis lengden på chiffertekst vår. Dette vil være en litt klarere når vi ser et eksempel på at jeg har litt senere. I utgangspunktet, hvis du kjører programmet med et nøkkelord for ohai, så det betyr at hver gang, er ohai kommer til å være din skift. Så avhengig av hva stilling du er i søkeordet ditt, du kommer til å skifte viss chiffertekst karakter ved dette beløpet. Igjen, akkurat som Caesar, vil vi sørge for at vi bevarer kapitaliseringen av ting og vi bare chiffrering bokstaver, ikke tegn eller mellomrom. Så se tilbake til Caesar på funksjoner som du kan ha brukt, den måten at du besluttet hvordan å skifte ting, og bruke det til programmet her. Så la oss kartlegge dette. Vi har en klartekst at vi har fått fra brukeren GetString sier dette ... er CS50! Da har vi et søkeord ohai. De første fire tegnene er ganske enkel. Vi vet at T kommer til å bli forskjøvet av o, da h kommer til å bli forskjøvet av h, er jeg kommer til å bli forskjøvet med en. Her ser du at en står for 0, så da sluttverdien er faktisk akkurat det samme brevet som før. Deretter s skiftes ved jeg. Men da har du disse periodene her. Vi ønsker ikke å chiffrering det, så da vi ikke endre den ved noe og bare skrive ut perioden uendret. [Student] Jeg forstår ikke hvordan du vet at dette er forskjøvet ved - Hvor gjorde du - >> Beklager. På toppen her ser du at Kommandolinjeargumentet ohai her, som kommer til å være nøkkelordet. Og så i utgangspunktet, du sykle over karakterene i søkeordet. [Student] Så o kommer til å være skiftende det samme - Så o tilsvarer et visst antall i alfabetet. [Student] Høyre. Men hvor har du fått den CS50 del fra? Oh. Det er i GetString der du er som: "Gi meg en streng å kode." [Student] De kommer til å gi deg som argument for å skifte etter og da vil du be om din første strengen. >> Ja. Så når de kjører programmet, de kommer til å inkludere søkeord i sine kommandolinjeargumenter når de kjører den. Så når du har sjekket at de faktisk har gitt deg en og ikke mer, ikke mindre, så du kommer til å be dem for en streng, sier: "Gi meg en streng." Så det er der i dette tilfellet har de gitt deg dette ... er CS50! Så da du kommer til å bruke den og bruke ohai og iterere over. Legg merke til at vi her hoppet over kryptere perioder, men i form av vår posisjon for ohai, den neste brukte vi o. I dette tilfellet er det litt vanskeligere å se fordi det er 4, så la oss fortsette litt. Bare stokk med meg her. Da har vi i og s, som deretter oversettes av o og h hhv. Da har vi en plass, og så da vet vi at vi ikke kommer til å chiffrering mellomrom. Men legg merke til at i stedet for å gå til en i denne situasjonen akkurat her, vi kryptere av en - Jeg vet ikke om du kan se det - akkurat her. Så det er ikke som du faktisk forhåndsbestemt, sier, o går her, går h her, en går her, går jeg her, o, h, a, i, o, h, a, i. Du trenger ikke gjøre det. Du bare skifte stilling i søkeordet når du vet at du faktisk kommer til å bli kryptere en faktisk brev. Gjør den slags fornuftig? Okay. Så bare noen påminnelser. Du vil være sikker på at du bare gå videre til neste bokstav i søkeordet ditt Hvis tegnet i klartekst din er et brev. Så sier vi på o. Vi legger merke til at det neste tegnet, på i indeksen av klarteksten, er et tall, for eksempel. Da vi ikke før j, indeksen for søkeordet vår, før vi kommer til et annet brev. Igjen, du også ønsker å være sikker på at du wraparound til begynnelsen av søkeordet når du er på slutten av den. Hvis du ser her er vi på jeg har den neste til å være o. Så du ønsker å finne noen måte å være i stand til å wraparound til begynnelsen av søkeordet hver gang du kommer til enden. Og så igjen, hva slags operatør er nyttig i så fall for innpakning rundt? Som i opptellingen off eksempel. [Student] The prosenttegn. >> Ja, et prosenttegn, som er modulo. Så modulo vil komme godt med her når du ønsker å bryte over indeksen i ohai din. Og bare en rask hint: Prøv å tenke på innpakning over søkeord litt som å telle på, der hvis det er tre grupper, 4. person, sine tall som sa de var fire mod 3, som var en. Så prøv og tenk på det på den måten. Som du så i formelen, hvor du har ci og deretter pi men da kj, du vil være sikker på at du holder styr på dem. Du trenger ikke å kalle det jeg, trenger du ikke å kalle det j, men du vil være sikker på at du holder styr på den posisjonen at du er på i klartekst ditt samt den posisjonen at du er på i søkeordet ditt fordi de er ikke nødvendigvis kommer til å være den samme. Ikke bare søkeordet - det kan være en helt annen lengde enn klartekst din. Også din klartekst, er det tall og tegn, så det kommer ikke til å passer perfekt opp sammen. Ja. [Student] Er det en funksjon for å endre saken? Kan du endre en til kapital A? >> Ja, det er definitivt. Du kan sjekke ut - jeg tror det er toupper, alle 1 ord. Men når du prøver å chiffer ting og bevare teksten, det er best i utgangspunktet å ha separate tilfeller. Hvis det er en stor, så du vil skifte av dette fordi i formelen, når du ser tilbake hvordan vi må slags go hverandre mellom ASCII måte å representere tallene og den faktiske alfabetiske listen, ønsker vi å sørge for at det kommer til å være en slags mønster som du kommer til å bruke. Et annet notat på mønsteret, faktisk. Du kommer til å definitivt være å håndtere med tall. Prøv å ikke bruke magiske tall, som er et eksempel på stilen. Så si at du vil hver time shift noe av like - Ok, så hint, er en annen spoiler når du skal skifte noe av et bestemt beløp, prøv å ikke representere det ved en faktisk nummer men heller prøve og se om du kan bruke ASCII-verdi, noe som vil slags gjør mer fornuftig. Et annet notat: Fordi vi arbeider med formler, selv om din TF vil slags vet hva mønster du kanskje bruker, beste i din kommentar slags forklare logikken, som, "Jeg bruker dette mønsteret fordi ..." og hva slags forklare mønsteret konsist i dine kommentarer. [Dette var walkthrough 2] Hvis det ikke er noen andre spørsmål, så jeg vil bare bo her for en liten bit. Lykke til med pset 2: Crypto og takk for at du kom. [Student] Thank you. >> Takk. [Media Offline intro]