[Powered by Google Translate] [Walkthrough - Problem Indstil 2] [Zamyla Chan - Harvard University] [Dette er CS50. CS50.TV] Ok. Hej, alle sammen, og velkommen til Walkthrough 2. Først vil jeg gerne lykønske dig til efterbehandling Pset 1. Jeg ved, at det kunne have været en smule hård for nogle af jer, kunne have været din første computer program, du skrev, men bare husk, at ved udgangen af ​​dette, når man ser tilbage i slutningen af ​​semestret, du vil se på Pset 1, og du vil sige, "Hey, jeg kunne have gjort det i 5 minutter." Så kender og stoler på, at ved udgangen af ​​dette, vil du helt sikkert finde Pset 1 ganske enkel. Men for nu er det en kæmpe bedrift, og tillykke til at få gjort. Nu også en hurtig note, før vi kommer ind i kødet på walkthrough. Jeg ønsker blot at gøre en hurtig bemærkning, at jeg nogle gange ikke vil have tid nok under walkthroughs til at gå igennem hver eneste måde at gøre det problem sæt og snarere blot måske fokusere på 1 eller 2 slags implementeringer, måder, du kan gøre dette. Men det er ikke til at sige, at du er forbudt fra at gøre det på en anden måde. Der er ofte, som med datalogi, utallige måder at gøre tingene på, og så absolut velkommen til at bruge en anden type løsning end jeg måtte have fremlagt. [Pset 2: Crypto - Zamyla Chan - zamyla@cs50.net] [Pset2 - 0. En sektion af spørgsmål - 1. Cæsar - 2. Vigenere] Ok. Så problem sæt 2: Crypto er en sjov én. Igen, med hver Pset du vil starte med et afsnit med spørgsmål der kommer til at ske i dine afsnit med dit tildelte undervisning fyr. Vi vil ikke gå igennem disse over walkthrough, men de helt sikkert vil hjælpe dig fuldføre Pset. Så den første del af problemet sættet er Cæsar. Og så i Cæsar nogen vil passere dig en nøgle med et heltal, og du vil kryptere en tekststreng, at de giver dig og give dem tilbage en krypteret ting. Hvis nogen så A Christmas Story, der er et eksempel på, at der. Derefter den anden del af problemet sættet Vigenere, som er en mere avanceret kryptering teknik. Og så vil vi kryptografere et stykke tekst, undtagen i stedet med blot et enkelt heltal, vi faktisk kommer til at indkode det med et søgeord, som brugeren vil give os. Okay, så det første værktøj i værktøjskassen i dag rent faktisk vil være en opdatering af apparatet. På diskussionsforummet vi ville se ting som, "Hvorfor ikke dette arbejde?" "Hvorfor ikke Indsend 50 arbejde?" og ofte er løsningen faktisk bare at opdatere dit apparat. Og så hvis du bare køre i en terminal vindue i apparatet sudo yum-y - det er et flag siger ja, opdatere alt - opdatering, så apparatet vil opdatere hvis det er nødvendigt. Og det gør ikke ondt, hvis du allerede er på den seneste version af apparatet. Så vil det bare sige ingen nye opdateringer tilgængelige, og du kan fortsætte med at arbejde sammen. Men det er godt at udføre selv hver gang du åbner apparatet fordi vi er stadig meget - nogle gange, hvis vi kommer ind i en bug - fastsættelse det i apparatet. Så sørg for at du har den seneste version af apparatet og køre der opdateres der. Ok. Så da vi har at gøre med breve og forandring, enciphering ting, vi vil virkelig ønsker at blive bedste venner med vores ASCII diagram. Der er talrige dem online, hvis du finder. Måske endda lave dine egne. Dybest set, med hvert brev og hver nummer, og hvert tegn der er et tal forbundet med dem, og så det er godt at se deres ASCII-værdier siden af ​​den egentlige bogstav. Det vil helt sikkert hjælpe dig i problemet sæt. En ting, der virkelig hjalp mig i dette problem sæt var til rent faktisk at printe det ud, og da jeg gik igennem, ville jeg faktisk trække på det, skrive, "Hvis dette skal gå til der, så ..." Kind of trække på det og mærke det op, bliver bedste venner med din ASCII-tabellen. Så har vi et par andre værktøjer til vores rådighed. Denne gang i stedet for rent faktisk at spørge brugeren for alle deres input vi vil gøre en kombination. Vi vil bede dem for nogle input, men vi vil også bare bruge de kommandolinjeargumenter. Så når de kører deres program, du normalt siger. / Hej, for eksempel, hvis dit program var hello.c. Men denne gang i stedet for bare at sige, at de kan sætte ord, argumenter bagefter. Og så vi kommer til at bruge, hvad de passerer ind til os som deres input så godt, så gå videre end blot at spørge til heltal, men også anvende kommandolinjeargumenter. Og så vil vi gå ind i arrays og strenge, som vi kommer til at bruge en masse så godt. Her er bare et eksempel på 1 mini ASCII diagram. Som jeg sagde, hvert bogstav svarer til et nummer, og så sætte dig ind i det. Det vil komme i handy. Og senere, når vi begynder at gøre noget ASCIIMath beskæftiger sig med numre - tilføjer, subtraktion dem - så absolut gode til at henvise til denne oversigt. Så her er et eksempel på en Caesar cipher - noget, som du kan have spillet med. Det er bare et hjul. Det væsentlige, er der et ydre alfabet og så er der en indre alfabet. Så her er et eksempel på Caesar cipher men med en nøgle fra 0. Det væsentlige er en linie med A, B på linie med B, hele vejen op til Z. Men så siger vi ønskede en nøgle på 3, for eksempel. Så ville vi dreje den indvendige hjul, således at A nu flugter med D osv. Og så dette er væsentligt, hvad vi skal gøre. Vi har ikke et hjul, men hvad vi vil gøre, er at gøre vores program slags flytte alfabetet sammen med os en vis mængde numre. Så som jeg sagde før, vi kommer til at beskæftige sig med kommandolinjeargumenter samt få et heltal. Så den måde, at en bruger vil køre din Cæsar program er ved at sige. / Caesar og derefter indtaste et nummer efter det. Og det nummer repræsenterer nøglen, skiftet, hvor mange gange du vil komme til at dreje den indvendige hjul på din Cæsar cipher. Og så kan du se her et eksempel. Hvis vi indtastet bogstaver fra A til L i vores Cæsar cipher, Så ville det input D gennem O, fordi det er hvert bogstav skiftet over 3 gange, ligesom eksemplet med hjul, som jeg viste dig. Så hvis du har indtastet, for eksempel, er dette CS50! så ville det også flytte alle bogstaverne. Og det er en vigtig ting i både Cæsar og Vigenere er, at vi kommer til at springe over alle ikke-breve. Så eventuelle mellemrum, tegn, osv, tal, vi kommer til at holde dem det samme. Vi kun kommer til at flytte bogstaverne i dette tilfælde. Så som du kan se i hjulet, vi kun har bogstaverne vi har til rådighed, så vi kun ønsker at flytte bogstaverne og kryptere breve. Så den første ting at gøre, så du at anvendelsen til Cæsar i problem sæt 2 er at drive Cæsar og derefter indtaste et nummer, når du kører det i terminalen. Så hvad vi skal gøre, er at en eller anden måde få denne nøgle og få adgang til det. Og så vil vi en eller anden måde se det kommer til at være den anden kommandolinje argument. Den første vil være. / Caesar, og den næste vil være nøglen nummer. Så før vi havde int main (void) for at starte vores C-programmer. Vi kommer til at skrælle tilbage et lag lidt og faktisk se at i stedet for at passere i tomrum til vores vigtigste funktion Vi er faktisk beskæftiger sig med 2 parametre. Vi har en int opkaldt argc og derefter en vifte af strenge kaldet argv. Så argc er et helt tal, og det repræsenterer antallet af argumenter, der sendes til dit program. Og derefter argv er faktisk en liste over de passerede argumenter. Alle argumenter er strenge, og så argv repræsenterer et array, en liste af strenge. Lad os tale om arrays en lille smule. Arrays er hovedsagelig en ny datastruktur. Vi har int'er, har vi fordobler, har vi strenge, og nu har vi arrays. Arrays er datastrukturer, der kan indeholde flere værdier af samme type, så væsentlige, en liste af enhver art, du ønsker. Væsentlige, hvis du ønskede en liste af heltal alt i 1 variabel, så ville du oprette en ny variabel, der var af typen int array. Så arrays er nul-indekseret, hvilket betyder, at det første element i array ligger på indeks 0. Hvis matrixen har længden 4, som i dette eksempel, så det sidste element ville være ved indeks 3, som er 4-1. Så for at skabe array, ville du gøre noget som dette. Sig du ønskede en dobbelt array. Det gælder for enhver form for datatype, selv om. Så siger du ønsker et dobbelt array. Sig du vil kalde det postkasse. Ligesom du ville initialisere nogen anden dobbelt, ville du sige dobbelt og derefter navnet, men denne gang vi sætter de firkantede parenteser, og derefter tallet vil der være længden af ​​array'et. Bemærk, at i arrays kan vi aldrig ændre længden, så du altid nødt til at definere og vælge, hvor mange kasser, hvor mange værdier dit array kommer til at holde. Så for at indstille forskellige værdier i dit array, du vil bruge denne følgende syntaks, som du kan se på diaset. Du har postkasse indeks 0 vil blive sat til 1,2, postkasse indeks 1 sæt til 2,4, etc. Så nu, at vi har gennemgået arrays lidt, lad os gå tilbage til argc og argv. Vi ved, at argv er nu et array af strenge. Så når en bruger går på - siger, at de kører et program - de siger. / hej David Malan, hvad programmet vil gøre for dig allerede er faktisk kommet op med, hvad argc og argv er. Så du behøver ikke at bekymre dig om det. Argc i dette tilfælde ville være 3, fordi det ser 3 forskellige ord adskilt af mellemrum. Og så derefter array i dette tilfælde, ville det første indeks være. / Hej, den næste David, den næste Malan. Er der nogen se med det samme, hvad forholdet mellem argv,  array, og argc er? Yeah. Vi vil komme ind på dette i et eksempel i args.c. Lad os se, om vi kan drage fordel af forholdet mellem 2. Her kan du måske finde, at i apparatet standardprogrammet til at åbne. C-filer er nogle gange Emacs. Men vi ønsker at beskæftige sig med gedit, så hvad du kan gøre er, kan du højreklikke på dit C-fil, gå til Egenskaber, Åbn med og derefter vælge gedit, som standard, og nu dit program skal åbne i gedit stedet for Emacs. Perfekt. Så her har jeg et program, som jeg ønsker at udskrive hver Kommandolinjeargumentet. Så uanset bruger inputs, jeg ønsker at væsentlige leverer det tilbage til dem på en ny linje. Så hvad er en struktur, som vi kan bruge til at gentage over noget - noget, som du sikkert brugt i din Pset 1? Hvis du ønsker at gå igennem et bestemt antal ting? >> [Studerende] For løkke. For loop. Præcis. Så lad os starte med for-løkken. Vi har for int i = 0. Lad os bare starte med en standard initialisering variabel. Jeg har tænkt mig at forlade betingelse for et sæt, og derefter sige jeg + +, vil gøre tingene der. Ok. Så tænker tilbage til argv, hvis argv er listen over argumenter, der overføres på programmet og argc er antallet af argumenter i programmet, så betyder, at argc i det væsentlige længden af ​​argv, højre, fordi der vil være så mange argumenter som værdien af ​​argc. Så hvis vi ønsker at gentage over hvert element i argv, vi vil ønsker at hver gang adgang til variabel i argv ved den givne indeks. Det kan være repræsenteret med dette, right? Denne variabel her repræsenterer særlig streng i dette tilfælde fordi det er en streng array - den særlige streng på det givne indeks. Hvad vi ønsker at gøre, i dette tilfælde ønsker vi at printe det ud, så lad os sige printf. Og nu argv er en streng, så vi ønsker at sætte denne pladsholder der. Vi ønsker en ny linje bare for at gøre det til at se godt ud. Så her har vi en for-løkke. Vi har ikke den betingelse endnu. Så jeg starter på 0, og derefter hver gang det kommer til at udskrive den givne streng på det pågældende indeks i arrayet. Så når vi ønsker at stoppe udskrive elementer i array? Når vi er færdige, ikke? Når vi har nået slutningen af ​​array. Så vi ønsker ikke at overskride forbi længden af ​​array, og vi ved allerede, at vi ikke behøver at faktisk aktivt finde ud af, hvad længden af ​​argv er fordi det er givet os, og hvad er det? Argc. Præcis. Så vi ønsker at gøre denne proces argc antal gange. Jeg er ikke i den rigtige mappe. Ok. Nu lad os gøre args. Ingen fejl, som er stort. Så lad os bare køre args. Hvad er dette vil vende tilbage til os? Det er bare at udskrive det igen. "Du påtrykkes args i programmet, jeg har tænkt mig at give det tilbage til dig." Så lad os sige at vi vil sige args så foo bar. Så det udskriver det tilbage til os. Okay? Så der er et eksempel på, hvordan du kan bruge argc og argv ved, at argc repræsenterer længden af ​​argv. Sørg for, at du ikke nogensinde med arrays adgang en ud over længden af ​​array fordi C helt sikkert vil råbe på dig. Du får noget, der hedder en segmenteringsfejl, der er aldrig sjovt, dybest set siger, du forsøger at få adgang til noget , der ikke eksisterer, ikke tilhører dig. Så sørg for, og især med nul-indeksering, ønsker vi ikke at - Ligesom for eksempel, hvis vi har en bred vifte af længde 4, at arrayindeks 4 ikke eksisterer, fordi vi starter på 0, ved nul indeks. Det bliver anden karakter ligesom for loops, når vi starter på 0. Så bare holde det i tankerne. Du ønsker ikke at nogensinde adgang indekset for et array, der er uden for din rækkevidde. Så vi kan se nu, hvordan vi kan slags adgang de kommandolinjeargumenter, der er gået i. Men da du så strengen, argv er faktisk en streng array. Så det er faktisk ikke et heltal endnu, men i Cæsar vi ønsker at beskæftige sig med heltal. Heldigvis er der en funktion, som oprettes for os, der rent faktisk kan konvertere en streng til et heltal. Også her er vi ikke beskæftiger sig med brugerinput, hvor vi tilskynder dem for input her for nøglen, så vi kan faktisk ikke reprompt og sige, "Åh, giv mig en anden heltal, sige, hvis det ikke er gyldigt." Men vi behøver stadig nødt til at tjekke for korrekt brug. I Caesar de kun lov til at passere i 1 nummer, og så de er nødt til at køre. / caesar og derefter de nødt til at give dig et nummer. Så argc skal være et vist antal. Hvilket nummer ville det være, hvis de er nødt til at passere dig. / Cæsar og derefter en nøgle? Hvad er argc? >> [Studerende] 2. >> Two. Præcis. Så du vil være sikker på, at argc er 2. Ellers kan du dybest set nægte at køre programmet. I main det er en funktion, der siger int main, så da vi altid i god praksis return 0 ved afslutningen af ​​et vellykket program. Så hvis, siger, de giver dig 3 kommandolinjeargumenter i stedet for 2 eller give dig 1, for eksempel, så hvad du vil gøre, er at du vil få lyst til at kontrollere for det og derefter vende tilbage 1 siger, nej, jeg kan ikke gå videre med dette program. [Studerende] Der kan ikke være et mellemrum i din tekst. >> Undskyld mig? [Elev] Der kan ikke være et mellemrum i teksten, du forsøger at kryptere. Ah! Med hensyn til den tekst, vi forsøger at kryptere, faktisk, der kommer senere når vi giver denne tekst. Så lige nu er vi bare acceptere som kommando argumenter det faktiske antal, den faktiske skifte for Cæsar kryptering. [Studerende] Hvorfor har du brug for 2 i modsætning til blot 1 argc? Der er helt sikkert 1 tal. Right. Grunden til at vi har brug for 2 for argc i stedet for 1 er fordi, når du kører et program og sige. / Cæsar eller. / hej, der faktisk tæller som en kommandolinje argument. Så der allerede fylder 1 og så derefter vi indtaster 1 ekstra. Så du indtaster faktisk en streng i Kommandolinjeargumentet. Hvad du vil gøre, for Cæsar vi ønsker at beskæftige sig med et heltal, så du kan bruge denne atoi funktion. Og dybest set, du passerer det i en snor, og så vil du gå tilbage et heltal om det er muligt at foretage denne streng til et heltal. Nu huske, da vi har at gøre med printf eller GetString, ting som det, Vi inkluderer de biblioteker, der er specifikke for os. Så i begyndelsen starter vi med en hash tag standard I / O,. H, noget i den retning. Nå, atoi er ikke under et af disse biblioteker, så hvad vi skal gøre, er vi nødt til at omfatte retten bibliotek til det. Så huske tilbage til Walkthrough 1, hvor jeg diskuterede den manuelle funktion. Du skriver mand i din terminal og derefter efterfulgt af navnet på en funktion. Og så vil bringe en hel liste af dens brug, men så godt det vil bringe op, hvilket bibliotek, der hører til. Så jeg vil overlade det til dig at bruge den manuelle funktion med atoi og finde ud af hvilket bibliotek du skal inkludere at være i stand til at bruge atoi funktionen. Så vi har fået nøglen, og nu det kommer til at få den almindelig tekst, og så rent faktisk bliver brugerinput, hvor du bede. Vi behandlet GetInt og GetFloat, og så i samme ånd vi kommer til at beskæftige sig med GetString. Men i dette tilfælde har vi ikke behøver at gøre noget gøre, mens eller mens løkker til at kontrollere. GetString vil helt sikkert give os en streng, og vi vil kryptere hvad brugeren giver os. Så du kan antage, at alle disse bruger indlæste strenge er korrekte. Great. Så når du har fået nøglen og når du har fået teksten, nu, hvad der er tilbage, er du nødt til at kryptere klarteksten. Blot for at hurtigt at dække over lingo, alm er, hvad brugeren giver dig, og ciphertext er hvad du vender tilbage til dem. Så strenge, være at kunne gå igennem faktisk bogstav for bogstav fordi vi er nødt til at flytte hvert bogstav, vi forstå, at strengene, hvis vi slags skrælle laget, vi se, at de er bare virkelig en liste over tegn. Den ene kommer efter den anden. Og så vi kan behandle strenge som arrays, fordi de er arrays af tegn. Så siger du har en streng ved navn tekst, og inden for denne variabel tekst lagres Dette er CS50. Så tekst på indeks 0 ville være en stort T, ville indeks 1 være h, osv. Og så med arrays, i det argc eksempel i args.c så vi, at vi var nødt til at gentage over et array og så havde vi til at gentage fra i = 0 indtil i er mindre end længden. Så vi har brug for en måde at finde ud af hvad længden af ​​vores streng er hvis vi kommer til at gentage over det. Heldigvis igen, er der en funktion der for os, selv om senere i CS50 du vil helt sikkert være i stand til at implementere og lave din egen funktion der kan beregne længden af ​​en streng. Men for nu vil vi bruge streng længde, så strlen. Du passerer i en snor, og så vil det sende dig en int, der repræsenterer længden af ​​din streng. Lad os se på et eksempel på, hvordan vi kan være i stand til at gentage over hvert tegn i en streng og gøre noget med det. Hvad vi ønsker at gøre, er at gentage over hvert tegn af strengen, og hvad vi ønsker at gøre, er vi printer tilbage hvert tegn 1 af 1 medmindre vi tilføjer noget ved siden af. Så lad os starte med for-løkken. Int i = 0. Vi kommer til at efterlade plads til den betingelse. Vi ønsker at gentage, indtil vi når til slutningen af ​​strengen, ikke? Så hvilken funktion giver os længden af ​​strengen? [Uhørlig student svar] Det er længden af ​​de kommandolinjeargumenter. Men for en streng vi ønsker at bruge en funktion, der giver os længden af ​​strengen. Så det er streng længde. Og så så er du nødt til at passere i en streng til den. Det er nødvendigt at vide, hvad streng det er nødvendigt at beregne længden af. Så i dette tilfælde har vi at gøre med snor s. Great. Så hvad vi ønsker at gøre, lad os printf. Nu ønsker vi at beskæftige sig med tegn. Vi ønsker at udskrive hver individuel karakter. Når du vil have det til at udskrive en float, ville du bruge pladsholderen ligesom% f. Med en int du ville bruge% d. Og så på samme måde, med et tegn, du bruger% c til at sige jeg har tænkt mig at udskrive en karakter , der er gemt inde i en variabel. Så vi har det, og lad os tilføje en periode og et rum til det. Hvilke tegn bruger vi? Vi skal bruge uanset karakter vi er ved af strengen. Så vi skal bruge noget med snor, men vi ønsker at være adgang til visse tegn der. Så hvis en streng er bare et array, så hvordan kan vi få adgang til elementer af arrays? Vi har de kantede parenteser, og derefter sætter vi indekset derinde. Så vi har firkantede parenteser. Vores indeks i dette tilfælde kan vi bare bruge i. Præcis. Så her vi siger at vi vil komme til at udskrive et tegn efterfulgt af et punktum og et mellemrum, og at karakter vil være den i'te bogstav i vores string s. Jeg vil bare redde det. Okay. Nu jeg har tænkt mig at køre streng længde. Så havde vi en streng kaldet OMG, og nu er det understreget endnu mere. Tilsvarende, lad os sige, at vi rent faktisk ønsker at få en snor fra brugeren. Hvordan kan vi gøre det? Før vidste hvordan vi får en int? Vi sagde GetInt, right? Men det er ikke int, så lad os GetString. Lad os gøre streng længde. Her har vi ikke indtaste en bestemt prompt. Så jeg ved det ikke. Jeg har tænkt mig at sætte mit navn ind her og så så jeg kan gøre en af ​​de ting hvor jeg tildele et ord for hvert bogstav eller noget lignende. Cool. Så det er streng længde. Så vi er tilbage til Cæsar. Vi har et par værktøjer til, hvordan vi gentage over en snor, hvordan vi få adgang til hver enkelt element. Så nu kan vi komme tilbage til programmet. Som jeg nævnte før, i ASCII-tabellen, din bedste ven, du kommer til at se de tal, der er forbundet med hvert bogstav. Så her sige vores klartekst er jeg svimmel! Derefter blev hver af disse figurer vil have et antal og ASCII værdi knyttet til sig, selv apostrof, selv den plads, selv udråbstegn, så vil du ønsker at holde det i tankerne. Så siger vores nøgle, som brugeren indgår i deres Kommandolinjeargumentet er 6. Det betyder for det første bogstav, som er mig, der er repræsenteret med 73, du ønsker at vende tilbage til dem, hvad bogstav er repræsenteret ved ASCII værdi på 73 + 6. I dette tilfælde vil være 79. Nu vil vi gå til det næste tegn. Så den næste i indeks 1 i alm ville være apostrof. Men husk at vi kun ønsker at kryptere bogstaverne. Så vi ønsker at sikre, at den apostrof faktisk forbliver den samme, at vi ikke ændres fra 39 til hvad 45 er. Vi ønsker at beholde den som en apostrof. Så vi ønsker at huske at kun kryptografere bogstaverne fordi vi ønsker alle de andre symboler for at forblive uændret i vores program. En anden ting, som vi ønsker, er at bevare kapitalisering. Så når du har et stort bogstav, bør det forblive som et stort. Lowercases bør forblive som små bogstaver. Så nogle nyttige funktioner til at være i stand til at håndtere kun enciphering bogstaver og holde bevare kapitalisering af ting er de isalpha, isupper, islower funktioner. Og så disse er funktioner, der returnerer du en boolesk værdi. Dybest set, sandt eller falsk. Er det et stort? Er det alfanumeriske? Er dette et brev, væsentlige. Så her er 3 eksempler på, hvordan du ville bruge denne funktion. Dybest set, kan du teste, om værdien returneret til dig af denne funktion er sand eller falsk baseret på denne indgang. Enten ikke omsætning til kode noget eller Cipher det eller sørg for, at det er store bogstaver osv. [Studerende] Kan du ikke bare forklare dem lidt mere, og hvordan du bruger dem? >> Ja, helt sikkert. Så hvis vi ser tilbage, her har vi en kapital jeg, ikke? Så vi ved, at jeg går til O, fordi jeg + 6 er O. Men vi ønsker at sikre, at O ​​bliver et stort O. Så dybest set, det er slags kommer til at ændre vores input. Så uanset om det er store eller ikke vil slags ændre den måde, vi håndterer det. Så hvis vi bruger isupper funktionen på det pågældende indeks, så isupper ("I"), der returnerer for os sande, så vi ved, at det er øverste. Så baseret på det, vi senere vil gå ind i en formel at du skal bruge til at flytte tingene i Cæsar, ja så dybest set, er der vil være en lidt anden formel, hvis det er store bogstaver i modsætning til små bogstaver. Give mening? Yeah. Ingen bekymringer. Jeg snakkede lidt om at tilføje 6 til et brev, som ikke helt giver mening undtagen når vi slags forstår, at disse tegn er slags udskiftes med heltal. Hvad vi gør, er vi slags brug implicit støbning. Vi vil gå ind i støbning lidt senere på hvor du tager en værdi, og du gøre den til en anden type end det oprindeligt var. Men med denne Pset vi vil være i stand til at slags flæng bruge tegn og deres tilsvarende heltalsværdier. Så hvis du blot omslutte en karakter med blot de enkelte anførselstegn, så vil du være i stand til at arbejde med det med heltal, der beskæftiger sig med det som et heltal. Så hovedstaden C vedrører 67. Lowercase f vedrører 102. Igen, hvis du ønsker at vide disse værdier, kig på din ASCII-tabellen. Så lad os gå ind i nogle eksempler på, hvordan du kan være i stand til at trække og tilføje, hvordan du kan faktisk virkelig arbejde med disse tegn, bruge dem på skift. Jeg siger, at ASCIIMath vil beregne tilsætning af et tegn til et heltal og viser den resulterende karakter og den resulterende ASCII værdi. Og så her jeg siger - we'll beskæftige sig med denne del senere - men dybest set, jeg siger, at brugeren skal sige løbe ASCIIMath sammen med en nøgle, og jeg siger, at nøglen vil være antallet som vi er ved at tilføje denne karakter. Så her bemærke, at da jeg kræver en nøgle, da jeg kræver, at de giver mig 1 ting, Jeg ønsker kun at acceptere. / Asciimath og en nøgle. Så jeg har tænkt mig at kræve, at argc er lig med 2. Hvis det ikke er, så jeg har tænkt mig at returnere 1, og programmet vil afslutte. Så jeg siger nøglen ikke vil være den første kommandolinie argument, Det vil være den anden, og som du kan se her, Jeg har tænkt mig at vende det til et heltal. Så jeg har tænkt mig at sætte et tegn til at være r. Bemærk, at typen af ​​den variable chr er faktisk et helt tal. Den måde, at jeg er i stand til at bruge r som et heltal er ved at omslutte den med disse enkle citationstegn. Så tilbage til vores printf erklæring, hvor vi har en pladsholder for et tegn og derefter en pladsholder for et heltal, karakter er repræsenteret ved den chr, og det heltal er nøglen. Og så så vi vil i resultat tilføje 2 sammen. Så vi vil tilføje r + hvad nøglen er, og så vi kommer til at udskrive resultatet af det. Så lad os gøre asciimath. Det er op til dato, så lad os bare køre asciimath. Åh, men se, det ikke gøre noget, fordi vi faktisk ikke give det en nøgle. Så når det netop vendt tilbage 1, vores vigtigste funktion, det netop vendt tilbage tilbage til os. Så så lad os gå i en nøgle. Nogen give mig et nummer. >> [Studerende] 4. 4. Okay. So r steg 4 vil give os v, som svarer til ASCII værdien af ​​118. Så den slags giver mening, at - Faktisk kan jeg spørge dig, hvad tror du ASCII værdi af r er hvis r + 4 er 118? Så yeah, r er 114. Så hvis du ser på den ASCII-tabellen så sikker nok, vil du se, at r er repræsenteret med 114. Så nu, hvor vi ved, at vi kan tilføje tal til tegn, dette synes temmelig enkel. Vi vil bare gentage over en streng som vi så i et eksempel før. Vi vil se, om det er et brev. Hvis det er, så vil vi flytte det uanset nøglen er. Temmelig enkel, undtagen når du kommer til at kunne lide dette, du se, at z, repræsenteret ved 122, vil derefter give dig en anden karakter. Vi har faktisk ønsker at bo i vores alfabet, right? Så vi er nødt til at finde ud af en måde at slags indpakning rundt. Når du når zed og du ønsker at stige med et bestemt antal, du ikke ønsker at gå ind over den ASCII alfabet sektionen; du vil automatisk gå tilbage hele vejen til A. Men husk du stadig bevare sagen. Så vel vidende, at breve ikke kan blive symboler ligesom symboler vil ikke ændre sig så godt. I det sidste Pset du absolut ikke har brug for, men en mulighed var at implementere din grådige Pset ved hjælp af modulus-funktionen. Men nu skal vi faktisk kommer til at bruge modulus, så lad os bare gå over dette en lille smule. Væsentlige, når du har x modulo y, der giver dig den resterende del af x divideret med y. Her er nogle eksempler her. Vi har 27% 15. Dybest set, når du trækker 15 fra 27 så mange gange som muligt uden at få negativ så får du 12 til venstre over. Så det er lidt ligesom i math sammenhæng, men hvordan kan vi egentlig bruge dette? Det kommer til at være nyttige for vores wrapover. Til dette, lad os bare sige, jeg bad jer alle til at opdele i 3 grupper. Sommetider du gøre dette i grupper og sådan noget. Sig Jeg sagde: "Okay, jeg vil have jer alle til at være opdelt i 3". Hvordan kan du gøre det? [Uhørlig student svar] Yeah, præcis. Tælle. Okay. Lad os rent faktisk gør det. Ønsker du at starte? [Studerende tælle off] 1, 2, 3, 4. Men husk ... >> [Studerende] Åh, undskyld. Det er en rigtig god pointe. Du sagde 4, men vi faktisk ønsker du at sige 1, fordi vi kun ønsker 3 grupper. Altsaa, hvordan - Nej, det er et rigtig godt eksempel, fordi så hvordan kan du sige 1? Hvad er forholdet mellem 4 og 1? Nå, 4 mod 3 er 1. Så hvis du fortsætter, vil du være 2. Så vi har 1, 2, 3, 1, 2. Igen, du er faktisk den 5. person. Hvordan kan du vide at sige 2 i stedet for 5? Du siger 5 mod 3 er 2. Jeg ønsker at se, hvor mange grupper af 3 til overs, så hvilken rækkefølge am I. Og så så hvis vi fortsatte langs hele rummet, så ville vi se, at vi altid er faktisk anvender MOD-funktionen til os selv at slags tælle. Det er en mere slags håndgribeligt eksempel på, hvordan du kan bruge modulo fordi jeg er sikker på de fleste af os har sikkert været igennem denne proces hvor vi har haft til at tælle. Eventuelle spørgsmål om modulo? Det vil være temmelig vigtigt at forstå begreberne dette, så jeg vil være sikker på du fyre forstår. [Elev] Hvis der ikke er resterende, betyder det giver dig det faktiske antal? Hvis en af ​​de første 3 af dem havde gjort det, ville det have givet dem, hvad de rent faktisk var, eller ville det have givet dem [uhørligt] >> Det er et godt spørgsmål. Når der ikke er resten til modulo - så sige du har 6 mod 3 - der faktisk giver dig tilbage 0. Vi vil tale om dette lidt senere. Oh yeah, for eksempel den 3. person - er 3 mod 3 faktisk 0, men hun sagde 3. Så det er lidt ligesom en indre fangst, for eksempel, ligesom okay, I, hvis mod er 0, så har tænkt mig at være den 3. person. Men vi vil komme ind på slags hvordan vi måske ønsker at beskæftige sig med, hvad 0 er senere. Så nu har vi en eller anden måde har en måde at kortlægge den zed til det rigtige bogstav. Så nu har vi gået gennem disse eksempler, vi slags se, hvordan Cæsar kunne arbejde. Du kan se de 2 alfabeter og så skal du se dem flytte. Så lad os prøve og udtrykke at med hensyn til formel. Denne formel er faktisk givet til dig i spec, men lad os slags udseende gennem hvad hver variabel betyder. Vores slutresultatet vil være ciphertext. Så dette siger, at den i'te karakter ciphertext vil svare til den i'te karakter klartekst. Det giver mening, fordi vi ønsker at altid blive kø disse ting op. Så det vil være den i'te karakter ciphertext plus k, som er vores nøgle - der giver mening - og så har vi dette mod 26. Husk tilbage, når vi havde den zed Vi ønskede ikke at komme ind i karakter, så vi ønskede at mod det og art wrap around alfabetet. Efter zed du vil gå til a, b, c, d, indtil du fik til det rigtige nummer. Vi ved, at zed, hvis + 6, ville give os f fordi efter zed kommer a, b, c, d, e, f. Så lad os huske, vi ved med sikkerhed, at zed + 6 vil give os f.. I ASCII-værdier, er z 122 og f er 102. Så vi er nødt til at finde en måde at gøre vores Cæsar formel giver os 102 efter at have taget i 122. Så hvis vi bare anvende denne formel, ('z' + 6)% 26, der faktisk giver dig 24 fordi 122 + 6 er 128, 128% 26 giver dig 24 resterende. Men det betyder ikke virkelig betyder f.. Det er bestemt ikke 102. Det er heller ikke det 6. bogstav i alfabetet. Så selvfølgelig skal vi have en måde at tweaking dette en lille smule. Med hensyn til den regelmæssige alfabet, ved vi, at z er den 26. brev og f er den 6.. Men vi er i datalogi, så vi vil indeksere ved 0. Så i stedet for z er antallet 26, vi kommer til at sige, det er nummer 25 idet a er 0. Så lad os nu anvende denne formel. Vi har z repræsenteret ved 25 + 6, som giver dig 31. Og 31 mod 26 giver dig 5 som en rest. Det er perfekt, fordi vi ved, at f er den 5. bogstav i alfabetet. Men det er stadig ikke f, right? Det er stadig ikke 102. Så for denne Pset, vil en udfordring være at forsøge at finde ud af forholdet mellem konvertering mellem disse ASCII værdier og det alfabetiske indeks. Væsentlige, hvad du ønsker at gøre, du ønsker at starte ud med ASCII-værdier, men så du ønsker at en eller anden måde omsætte det til et alfabetisk indeks derefter beregne, hvad brev det bør være - dybest set, hvad dens alfabetisk indeks er af cipher karakter - så oversætte det tilbage til ASCII-værdier. Så hvis du pisk ud af din ASCII-tabellen, så prøv og finde sammenhænge mellem fx 102 og 5 eller 122 og 25. Vi har fået vores nøgle fra de kommandolinjeargumenter, har vi fået den klartekst, vi har krypteres det. Nu er alt vi har tilbage at gøre, er at udskrive det. Vi kunne gøre dette et par forskellige måder. Hvad vi kunne gøre er faktisk udskrives som vi hen ad vejen. Som vi gentage over de tegn i strengen, Vi kunne simpelthen bare udskrive helt så når vi beregner det. Alternativt kan du også gemme den i et array, og har en vifte af karakterer og i slutningen gentage over at hele array og printe det ud. Så du har et par muligheder for det. Og husk, at% c vil være pladsholderen til udskrivning af et tegn. Så der har vi Cæsar, og nu går vi videre til Vigenere, hvilket er meget lig Cæsar men blot en smule mere kompliceret. Så det væsentlige med Vigenere er du kommer til at være passerer på et nøgleord. Så i stedet for et nummer, er du nødt til at have en streng, og så der kommer til at fungere som dit søgeord. Så som sædvanlig, er du nødt til at få en prompt for en streng fra brugeren og derefter kryptere det og derefter give dem ciphertext tilbage. Så som jeg sagde, er det meget lig Cæsar, undtagen i stedet for at flytte med et bestemt antal, nummeret er faktisk kommer til at ændre hver gang fra tegn til tegn. Til at repræsentere det faktiske antal at skifte, er det repræsenteret af tastaturets bogstaver. Så hvis du indtaster i en forskydning af en, for eksempel, så ville det svare til et skift på 0. Så det er igen tilbage til det alfabetiske indeks. Hvad der kunne være nyttigt, hvis du ser, at vi faktisk har at gøre med ASCII-værdier samt de bogstaver, samt det alfabetiske indeks, måske finde eller lave dine egne ASCII tabel, der viser det alfabetiske indeks på 0 til 25, A til Z, og de ASCII-værdier, så du kan slags se forholdet og skitsere og forsøge at finde nogle mønstre. Tilsvarende, hvis du var at flytte på den vis eksempel ved f - og det er enten små eller store f - så det ville svare til 5. Er vi godt indtil videre? Formlen for Vigenere er en smule anderledes. Dybest set, du kan se, at det er ligesom Cæsar, undtagen i stedet for blot k vi k indeks j. Bemærk, at vi ikke bruger i, fordi det væsentlige, længden af ​​søgeordet er ikke nødvendigvis længden af ​​vores ciffertekst. Dette vil være en smule klarere, når vi ser et eksempel, som jeg har en smule senere. Dybest set, hvis du kører dit program med et søgeord på OHAI, så det betyder, at hver gang, der er OHAI vil være din vagt. Så afhængigt af, hvilken stilling du er i dit søgeord, du vil flytte din bestemte ciphertext karakter med dette beløb. Igen, ligesom Cæsar, ønsker vi at sikre, at vi bevarer kapitalisering af tingene og vi kun kryptografere bogstaver, ikke tegn eller mellemrum. Så ser tilbage til Cæsar på de funktioner, som du måske har brugt, den måde, at du har besluttet, hvordan man ændre tingene, og anvende det til dit program her. Så lad os kortlægge dette. Vi har en alm, som vi har fået fra den bruger GetString siger dette ... er CS50! Så har vi et søgeord på OHAI. De første 4 tegn er ret enkle. Vi ved, at T vil blive forskudt med o, så h vil blive flyttet af h, er jeg vil blive ændret med et. Her ser du at et repræsenterer 0, ja så slutværdien er faktisk bare det samme bogstav som før. Derefter s forskydes med i. Men så har du disse perioder her. Vi ønsker ikke at kryptere det, så så vi ikke ændre den ved noget og bare udskrive perioden uændret. [Studerende] Jeg forstår ikke, hvordan du ved, at dette forskydes med - Hvor har du - >> Åh, undskyld. Øverst her kan du se, at Kommandolinjeargumentet OHAI her, der kommer til at være nøgleordet. Og så dybest set, er du cykle over tegn i søgeordet. [Studerende] So o vil være at flytte den samme - Så o svarer til en række i alfabetet. [Studerende] Right. Men hvor har du fået den CS50 del fra? Oh. Det er i GetString hvor du er ligesom, "Giv mig en streng at indkode." [Studerende] De kommer til at give jer dette argument til at skifte med og så skal du bede om din første streng. >> Yeah. Så når de kører programmet, kommer de til at inkludere søgeordet i deres kommandolinjeargumenter, når de kører det. Så når du har kontrolleret, at de rent faktisk har givet dig 1 og ikke mere, ikke mindre, så du kommer til at bede dem for en streng, siger: "Giv mig en streng." Så det er der i dette tilfælde de har givet dig dette ... er CS50! Så du kommer til at bruge det og bruge OHAI og gentage over. Bemærk, at vi her sprunget over kryptering de perioder, men i forhold til vores position til OHAI, den næste vi brugte o. I dette tilfælde er det en smule sværere at se, fordi det er 4, så lad os fortsætte lidt. Bare holde med mig her. Så har vi i og s, som derefter oversat af o og h hhv. Så har vi en plads, og så ved vi, at vi ikke kommer til at kryptere rummene. Men bemærk, at i stedet for at gå til en i denne plet lige her, vi kryptere en - jeg ved ikke, om du kan se det - lige her. Så det er ikke ligesom du faktisk forudbestemt, siger, o går her, h går her, en går her, jeg går her, o, h, a, i, o, h, a, dvs. Du behøver ikke gøre det. Du skal kun flytte din position i søgeordet når du ved, at du rent faktisk vil komme til at kryptere en egentlig brev. Betyder den slags mening? Okay. Så bare nogle påmindelser. Du vil være sikker på, at du kun videre til det næste bogstav i dit søgeord hvis karakter i din klartekst er et brev. Så siger vi er på o. Vi bemærker, at det næste tegn, i-indekset på klartekst, er et tal, for eksempel. Så vi ikke går videre j, indekset for vores søgeord, indtil vi når et andet brev. Igen, du også vil være sikker på, at du wraparound til begyndelsen af ​​søgeordet når du er i slutningen af ​​det. Hvis du ser her er vi ved i, den næste skal være o. Så du ønsker at finde en måde at være i stand til wraparound til begyndelsen af ​​dit søgeord hver gang du når slutningen. Og så igen, hvilken slags operatør er nyttig i dette tilfælde til indpakning rundt? Ligesom i optællingen off eksempel. [Studerende] The procenttegn. >> Yeah, procenttegn, der er modulo. Så modulo vil komme i handy her, når du ønsker at ombryde over indekset i dit OHAI. Og bare en hurtig tip: Prøv at tænke på indpakning over søgeordet lidt ligesom at tælle fra, hvor hvis der er 3 grupper, den 4. person, deres nummer, som de sagde var 4 mod 3, hvilket var 1. Så prøv og tænk på det på den måde. Som du så i formlen, hvor du har ci og derefter pi men derefter kj, du vil være sikker på, at du holder styr på dem. Du behøver ikke at kalde det i, behøver du ikke at kalde det j, men du vil være sikker på, at du holder styr på den holdning, at du er i din klartekst samt den holdning, at du er på i dit søgeord fordi dem ikke nødvendigvis vil være den samme. Ikke alene nøgleordet - det kunne være en helt anden længde end din alm. Også din klartekst, der er tal og tegn, så det kommer ikke til perfekt match op sammen. Ja. [Studerende] Er der en funktion til at ændre sagen? Kan du ændre en til kapital A? >> Ja, der absolut er. Du kan tjekke ud - Jeg tror, ​​det er toupper, alle 1 ord. Men når du forsøger at cifferliste tingene og bevare teksten, er det bedst dybest set at have separate sager. Hvis det er et stort, så du ønsker at skifte med dette fordi i din formel, når man ser tilbage, hvordan vi er nødt til at slags gå flæng mellem ASCII måde at repræsentere tallene og de faktiske alfabetisk indeks, vi ønsker at sikre, der kommer til at være en slags mønster, du vil bruge. Et andet notat om det mønster, faktisk. Du kommer til at absolut beskæftige sig med tal. Prøv ikke at bruge magiske tal, der er et eksempel på stil. Så siger du ønsker at hver gang shift noget ved lignende - Okay, så hint, er en anden spoiler, når du kommer til at flytte noget med en vis mængde, så prøv ikke at repræsentere denne ved en faktiske antal men snarere prøve og se om du kan bruge den ASCII værdi, hvilket vil slags give mere mening. En anden bemærkning: Fordi vi har at gøre med formler, selvom din TF vil slags vide, hvad mønster, du bruger måske, bedst til i din kommentar slags forklare logikken, ligesom, "Jeg bruger dette mønster, fordi ..." og art forklare mønsteret kortfattet i dine kommentarer. [Dette var walkthrough 2] Hvis der ikke er nogen andre spørgsmål, så vil jeg bare blive her for en lille smule. Held og lykke med din Pset 2: Crypto og tak for at du kom. [Studerende] Tak. >> Tak. [Media Offline intro]