[Powered by Google Translate] [Walkthrough - Problem Set 2] [Zamyla Chan - Harvarduniversitetet] [Detta är CS50. CS50.TV] Okej. Hej, alla, och välkomna till Walkthrough 2. Först vill jag gratulera dig för efterbehandling pset 1. Jag vet att det kunde ha varit lite tufft för en del av er, kunde ha varit din första datorprogram som du skrev, men kom ihåg att i slutet av detta, när man ser tillbaka i slutet av terminen, du ser på pset 1 och du säger: "Hej, jag kunde ha gjort det i 5 minuter." Så vet och litar på att vid slutet av detta du definitivt hittar pset 1 ganska enkelt. Men nu är det en enorm prestation, och grattis för att få gjort. Nu även en snabb anteckning innan vi kommer in i köttet på genomgången. Jag vill bara göra en snabb anteckning om att jag ibland inte har tillräckligt med tid under genomgångar för att gå igenom varenda sätt att göra problemet inställda och ganska bara kanske fokusera på 1 eller 2 slag av implementeringar, sätt som du kan göra detta. Men det är inte att säga att du är förbjudna från att göra det på ett annat sätt. Det finns ofta, som med datavetenskap, många sätt att göra saker, och så definitivt gärna använda en annan typ av lösning än jag kan ha fram. [Pset 2: Crypto - Zamyla Chan - zamyla@cs50.net] [Pset2 - 0. En del av frågorna - 1. Caesar - 2. Vigenère] Okej. Så problemet som 2: Crypto är en rolig en. Återigen, med varje pset du börjar med ett avsnitt med frågor det kommer att ske i dina sektioner med din tilldelade undervisning karl. Vi kommer inte att gå igenom dessa över genomgång, men de kommer definitivt att hjälpa dig att slutföra pset. Så den första delen av problemet uppsättningen är Caesar. Och så i Caesar någon passerar dig en nyckel med ett heltal, och du kommer att kryptera en textsträng som de ger dig och ge dem tillbaka en krypterad sak. Om någon såg A Christmas Story, det är ett exempel på att det finns. Sedan den andra delen av problemet uppsättningen är Vigenère, vilket är en mer avancerad krypteringsteknik. Och så ska vi chiffrera ett textstycke, utom i stället med bara en enda heltal, vi kommer faktiskt att koda det med ett sökord som användaren kommer att ge oss. Okej, så det första verktyget i verktygslådan idag faktiskt kommer att uppdatera apparaten. På diskussionsforumet skulle vi se saker som: "Varför inte det här arbetet?" "Varför inte lämnar in 50 arbete?" och ofta lösningen är faktiskt bara att uppdatera din apparat. Och så om du kör bara i ett terminalfönster i apparaten sudo yum-y - det är en flagga säga ja, uppdatera allt - uppdatering, då apparaten kommer att uppdatera om så behövs. Och det gör ont om du redan är på den senaste versionen av apparaten. Då kommer det att bara säga några nya uppdateringar tillgängliga och du kan fortsätta att arbeta tillsammans. Men det är bra att köra med varje gång du öppnar apparaten eftersom vi är fortfarande väldigt mycket - ibland om vi kommer in i en bugg - fastställande av det i apparaten. Så se till att du har den senaste versionen av apparaten och köra den uppdatera där. Okej. Så eftersom vi har att göra med bokstäver och ändra, chiffrering saker, vi kommer att verkligen vill bli bästa vänner med vår ASCII diagram. Det finns många sådana på nätet, om du hittar. Kanske till och med göra din egen. I grund och botten, med varje bokstav och varje nummer och varje tecken Det finns ett antal associerade med dem, och så är det bra att se sina ASCII-värden vid sidan av själva brevet. Som definitivt kommer att hjälpa dig i problemet set. En sak som verkligen hjälpte mig i detta problem set var att faktiskt skriva ut den, och när jag gick igenom, skulle jag dra faktiskt på det, skriva: "Om detta har att gå till där, då ..." Typ av rita på den och markera den upp, blir bästa vänner med din ASCII tabellen. Sedan har vi några andra verktyg till vårt förfogande. Denna gång i stället för att tillfrågas faktiskt användaren för alla deras bidrag Vi ska göra en kombination. Vi ska få dem för några ingång, men vi kommer även att bara använda kommandoradsargumenten. Så när de kör sina program, brukar du säga. / Hej, till exempel, Om ditt program var hej.c. Men den här gången istället för att bara säga att de kan sätta ord, argument efteråt. Och så ska vi använda vad de passerar in till oss som deras bidrag också, så gå längre än bara att fråga efter heltal, men också med hjälp kommandoradsargument. Och sedan går vi in ​​i matriser och strängar, som vi kommer att använda mycket också. Här är bara ett exempel på 1 mini ASCII diagram. Som jag sa, motsvarar varje bokstav till ett antal, och så bekanta dig med det. Det kommer att komma väl till pass. Och senare när vi börjar göra lite ASCIIMath behandlar siffrorna - addition, subtraktion dem - då definitivt bra att hänvisa till denna tabell. Så här är ett exempel på en Caesar chiffer - något som du kanske har spelat med. Det är bara ett hjul. I huvudsak finns det en yttre alfabet och sedan finns det en inre alfabet. Så rätt här är ett exempel på Caesar chiffer, men med en nyckel 0. I huvudsak är en linje med A, B i linje med B, ända upp till Z. Men sedan säger vi ville ha en nyckel 3, till exempel. Då skulle vi rotera det inre hjulet så att A nu ligger i linje med D, etc. Och så detta är i huvudsak vad vi ska göra. Vi har inte ett hjul, men vad vi ska göra är att vårt program slags skifta alfabetet tillsammans med oss ​​en viss mängd siffror. Så som jag sa tidigare, vi kommer att ha att göra med kommandoradsargument samt få ett heltal. Så sätt som en användare kommer att köra din Caesar programmet är genom att säga. / Caesar och sedan ange ett nummer efter det. Och att antalet är nyckeln, skiftet, hur många gånger du kommer att vara rotera det inre hjulet i din Caesar chiffer. Och så du ser här ett exempel. Om vi ​​angett bokstäverna från A till L i vår Caesar chiffer, då skulle ingång D genom O eftersom det är varje brev flyttas över 3 gånger, precis som exempel hjulet som jag visade dig. Så då om du angett, till exempel, är här CS50! då skulle det också flytta alla bokstäver. Och det är en viktig sak i både Caesar och Vigenère är att vi kommer att hoppa över alla icke-bokstäver. Så blanksteg, tecken, etc, siffror, vi kommer att hålla dem samma. Vi ska bara flytta bokstäverna i detta fall. Så som du ser i hjulet har vi bara de bokstäver som finns tillgängliga för oss, så vi vill bara flytta bokstäverna och kryptera bokstäverna. Så det första du ska göra, du såg att användningen av Caesar i problemet som 2 är att köra Caesar och ange ett nummer när du kör den i terminalen. Så vad vi behöver göra är att på något sätt få den knappen och komma åt den. Och så vill vi på något sätt se att det kommer att bli den andra kommandoraden argument. Den första kommer att bli. / Caesar, och nästa kommer att vara den viktigaste nummer. Så innan vi hade int main (void) för att starta vår C-program. Vi kommer att skala tillbaka ett lager lite och faktiskt se att istället för att passera i tomrum till vår huvuduppgift vi faktiskt att göra med 2 parametrar. Vi har en int som heter argc och sedan en array med strängar som kallas argv. Så argc är ett heltal, och det representerar antalet argument som skickas in till programmet. Och då argv är faktiskt en lista över de passerade argumenten. Alla argumenten är strängar, och så argv representerar en grupp, en lista, av strängar. Låt oss tala om arrayer lite. Arrayer är i huvudsak en ny datastruktur. Vi har Ints har vi dubblar, har vi strängar, och nu har vi arrayer. Arrayer är datastrukturer som kan hålla flera värden av samma typ, så i huvudsak en lista över vad du vill ha. I huvudsak, om du ville ha en lista av heltal All in 1 variabel, då du skulle skapa en ny variabel som var av typen int array. Så arrayer är noll-indexerad, vilket innebär att det första elementet i arrayen vid index 0. Om matrisen är av längd 4, som i detta exempel, då din sista delen skall vara på index 3, vilket är 4 - 1. Så för att skapa array, skulle du göra något liknande. Säg att du ville ha en dubbel uppsättning. Detta gäller för alla typer av datatyp, dock. Så säger du vill ha en dubbel uppsättning. Säg att du vill kalla det brevlåda. Precis som du skulle initiera någon annan dubbel, du skulle säga dubbel och sedan namnet, men den här gången vi sätta hakparenteser, och sedan numret kommer det att finnas längden av uppsättningen. Notera att i matriser vi aldrig kan ändra längden, så du måste alltid definiera och välja hur många lådor, hur många värden din matris kommer att hålla. Så för att ställa in olika värden i arrayen, du kommer att använda denna följande syntax, som du ser på bilden. Du har brevlåda index 0 kommer att sättas till 1,2, brevlåda index 1 set till 2,4 mm Så nu när vi har granskat arrayer lite, låt oss gå tillbaka till argc och argv. Vi vet att argv nu en array med strängar. Så när en användare går in - säger att de kör ett program - säger de. / hej David Malan, vad programmet kommer att göra för dig redan faktiskt komma med vad argc och argv är. Så du behöver inte oroa dig för det. Argc i detta fall skulle vara 3 eftersom det ser 3 olika ord separerade med mellanslag. Och så då gruppen i detta fall skulle den första indexet vara. / Hej, nästa David nästa Malan. Ser någon direkt vad förhållandet mellan argv,  matrisen och argc är? Ja. Vi kommer få in den i ett exempel i args.c. Låt oss se om vi kan dra nytta av förhållandet mellan 2. Här kanske du upptäcker att i apparaten standardprogrammet att öppna. C-filer ibland Emacs. Men vi vill ta itu med gedit, så vad du kan göra är att du rätt kan klicka på C-fil, Gå till Egenskaper, Öppna med och välj sedan gedit, Ange som standard, och nu ditt program ska öppnas i gedit istället för Emacs. Perfekt. Så här har jag ett program som jag vill skriva ut varje argument kommandoraden. Så oavsett användarinmatningar, jag vill i huvudsak tillbaka den tillbaka till dem på en ny rad. Så vad är en struktur som vi kan använda för att iterera över något - något som du förmodligen används i din pset 1? Om du vill gå igenom ett visst antal saker? >> [Elev] För loop. För loop. Exakt. Så låt oss börja med for-slingan. Vi har för int i = 0. Låt oss börja med bara en vanlig initiering variabel. Jag ska lämna tillstånd för en uppsättning och sedan säga att jag + +, kommer att göra saker där. Okej. Så tänker tillbaka till argv om argv är listan över argument som skickas in till programmet och argc är antalet argument i programmet, då betyder det att argc är i huvudsak längden på argv, höger, eftersom det kommer att bli så många argument som värdet av argc. Så om vi vill att iterera över varje element i argv, vi kommer att vilja varje gång tillgång till variabeln i argv på givet index. Som kan representeras med detta, eller hur? Denna variabel här representerar särskilda strängen i detta fall eftersom det är en sträng array - den speciella strängen vid det givet index. Vad vi vill göra, i det här fallet vill vi skriva ut det, så låt oss säga printf. Och nu argv är en sträng, så vi vill sätta den platshållaren där. Vi vill ha en ny linje bara för att få det att se bra ut. Så här har vi en for-slinga. Vi har inte tillstånd ännu. Så jag börjar på 0 och sedan varje gång det kommer att skriva den givna strängen på den särskilda index i arrayen. Så när vi vill stoppa skriva ut element i arrayen? När vi är klara, eller hur? När vi har kommit till slutet av arrayen. Så vi vill inte överskrida förbi längden av uppsättningen, och vi vet redan att vi inte behöver faktiskt aktivt ta reda på vad längd argv är eftersom det har gett oss, och vad är det? Argc. Exakt. Så vi vill göra detta antal process argc gånger. Jag är inte i rätt katalog. Okej. Nu ska vi göra args. Inga fel, vilket är bra. Så låt oss bara köra args. Vad kommer detta att återvända till oss? Det kommer bara att skriva ut den tillbaka. "Du matas args i programmet, jag ska ge det tillbaka till dig." Så låt oss säga att vi vill säga args sedan foo bar. Så då skriver ut tillbaka till oss. Okej? Så det är ett exempel på hur du kan använda argc och argv att veta att argc representerar längden på argv. Se till att du inte någonsin med arrayer tillgång en bortom längden på arrayen eftersom C kommer definitivt att skrika på dig. Du får något som kallas ett segmenteringsfel, vilket är aldrig roligt, i princip säger att du försöker komma åt något som inte existerar, inte tillhör dig. Så se till att, och särskilt med noll-indexering, vi vill inte - Som till exempel, om vi har en array med längden 4, att fältindex 4 finns inte för att vi börjar på 0, noll index. Det kommer att bli en andra natur precis som för slingor när vi börjar på 0. Så bara ha det i åtanke. Du vill inte att någonsin komma åt index för en array som är bortom räckhåll. Så vi kan nu se hur vi kan typ av tillgång de kommandoradsargument som skickas in Men som ni såg strängen är argv faktiskt en sträng array. Så det är faktiskt inte ett heltal ännu, men i Caesar vill vi ta itu med heltal. Lyckligtvis finns det en funktion som skapats för oss som faktiskt kan konvertera en sträng till ett heltal. Också här vi inte har att göra med användarinmatning där vi uppmanar dem för inmatning här nyckeln, så vi kan inte faktiskt Fråga igen och säga, "Åh, ge mig en annan heltal, säg, om det inte är giltigt." Men vi måste fortfarande kontrollera korrekt användning. I Caesar de bara tillåts passera i 1 nummer, och så de måste köra. / caesar och då de måste ge dig ett nummer. Så argc måste vara ett visst antal. Vilket tal skulle det vara om de måste passera dig. / Caesar och sedan en nyckel? Vad är argc? >> [Elev] 2. >> Två. Exakt. Så du vill vara säker på att argc är 2. Annars kan du vägra princip att köra programmet. I främsta det är en funktion som säger int main, så vi alltid i god praxis retur 0 vid slutet av ett framgångsrikt program. Så om, säg, de ger dig 3 kommandoradsargument istället för 2 eller ge dig 1, till exempel, vad du ska göra är att du vill söka efter den och sedan återvända 1 sade nej, jag kan inte fortsätta med det här programmet. [Elev] Det kan inte finnas en plats i din text. >> Ursäkta mig? [Elev] Det kan inte finnas ett utrymme i texten du försöker kryptera. Ah! När det gäller den text som vi försöker att kryptera, kommer som faktiskt senare när vi ger den texten. Så just nu är vi bara acceptera som kommando argument det verkliga antalet, själva skiftet för Caesar kryptering. [Elev] Varför behöver du 2 i motsats till bara 1 argc? Det är definitivt en siffra. Rätt. Anledningen till att vi behöver 2 för argc istället för 1 beror på att när du kör ett program och säga. / caesar eller. / hej, som räknas faktiskt som ett argument. Så då tar redan upp 1 och så då vi mata 1 extra. Så du matar faktiskt en sträng på kommandoraden argument. Vad du vill göra, för Caesar vill vi ta itu med ett heltal, så du kan använda den här Atoi funktionen. Och i princip, passerar du den i en sträng och sedan kommer du tillbaka tillbaka ett heltal om det är möjligt att göra den strängen till ett heltal. Nu minns när vi har att göra med printf eller GetString, saker, Vi inkluderar bibliotek som är specifika för oss. Så i början vi börjar med en hash tagg standard I / O,. H nåt sånt. Tja, Atoi inte inom en av dessa bibliotek, så vad vi måste göra är att vi måste ha med rätt biblioteket för det. Så minns tillbaka till Walkthrough 1 där jag diskuterade den manuella funktionen. Du skriver man i din terminal och sedan följt av namnet på en funktion. Och så att kommer att ta upp en hel lista med dess användning, men även det kommer att ta upp vilka bibliotek som tillhör. Så jag lämnar det till dig att använda den manuella funktionen med Atoi och räkna ut vilka bibliotek du vill inkludera för att kunna använda Atoi funktionen. Så vi har fått nyckeln och nu det gäller att få vanlig text, och så som faktiskt kommer att vara användarvänlig ingång, där du uppmanas. Vi behandlat getInt och getFloat, och så i samma anda vi kommer att ha att göra med GetString. Men i detta fall behöver vi inte göra något DO WHILE eller medan slingor för att kontrollera. GetString kommer definitivt ge oss en sträng, och vi kommer att kryptera allt användaren ger oss. Så du kan anta att alla dessa användare inmatade strängar är korrekta. Jättebra. Så då när du har fått nyckeln och när du har fått texten, nu vad som är kvar är att du måste chiffrera klartexten. Bara snabbt för att täcka över fikonspråk är klartexten vad användaren ger, och chiffertexten är vad du återvänder till dem. Så strängar, för att kunna gå igenom faktiskt bokstav för bokstav eftersom vi måste flytta varje bokstav, vi förstår att strängar, om vi typ av skal tillbaka lagret, Vi ser att de är bara verkligen en lista med tecken. Man kommer efter den andra. Och så kan vi behandla strängar som matriser för att de är kedjor av tecken. Så säger du har en sträng som heter text, och inom den variabel text lagras här är CS50. Då text på index 0 skulle vara en stort T, skulle index 1 vara h, etc. Och därefter med arrayer i argc exempel args.c, Vi såg att vi var tvungna att iterera över en array och så var vi tvungna att iterera från i = 0 fram tills jag är mindre än längden. Så vi behöver något sätt att räkna ut vad längden på vår sträng är Om vi ​​ska iterera över den. Lyckligtvis igen, det är en funktion där för oss, även om senare under CS50 kommer du definitivt att kunna genomföra och göra din egen funktion som kan beräkna längden på en sträng. Men nu ska vi använda stränglängd, så strlen. Du passerar i en sträng, och sedan kommer du tillbaka en int som representerar längden på din sträng. Låt oss titta på ett exempel på hur vi skulle kunna iterera över varje tecken i en sträng och göra något med det. Vad vi vill göra är att iterera över varje tecken i strängen, och vad vi vill göra är att vi trycka tillbaka varje tecken 1 av 1 förutom att vi lägga till något bredvid. Så låt oss börja med for-slingan. Int i = 0. Vi kommer att lämna utrymme för tillståndet. Vi vill iterera tills vi når slutet av strängen, eller hur? Så vad funktionen ger oss längden på strängen? [Ohörbart elev svar] Det är längden på kommandoradsargumenten. Men för en sträng som vi vill använda en funktion som ger oss strängens längd. Så det är stränglängd. Och så måste du passera en sträng till den. Det måste veta vad sträng som behövs för att beräkna längden på. Så då i detta fall vi har att göra med snöre s. Jättebra. Så vad vi vill göra, låt oss printf. Nu vill vi ta itu med tecken. Vi vill skriva ut varje tecken. När du vill skriva ut en flottör, skulle du använda platshållare som% f. Med en int du skulle använda% d. Och så samma sätt, med en karaktär du använder% c för att säga att jag kommer att skriva ett tecken som lagras inuti en variabel. Så vi har det här, och låt oss lägga till en tid och en plats för den. Vilken karaktär använder vi? Vi kommer att använda allt tecken vi är på den strängen. Så då ska vi använda något med snöre, men vi vill vara tillgång till viss karaktär där. Så om en sträng är bara en array, hur kommer jag åt vi delar av matriser? Vi har dessa hakparenteser, och sedan sätter vi indexet där. Så vi har hakparenteser. Vårt index i det här fallet kan vi bara använda i. Exakt. Så här vi säger att vi kommer att skriva ett tecken följt av en punkt och ett mellanslag, och att karaktären kommer att vara det i: te bokstaven i vår sträng är. Jag ska bara rädda. Okej. Nu ska jag köra stränglängd. Så vi hade en sträng som heter OMG, och nu är det betonas ännu mer. Likaså, låt oss säga att vi verkligen vill få en sträng från användaren. Hur kan vi göra detta? Före, hur vi får en int? Vi sa getInt, eller hur? Men detta är inte int, så låt oss GetString. Låt oss göra stränglängd. Här har vi inte ange ett specifikt snabb. Så jag vet inte. Jag ska sätta mitt namn här och så då kan jag göra en av dessa saker där jag tilldelar ett ord för varje bokstav eller något liknande. Cool. Så det är stränglängd. Så vi är tillbaka till Caesar. Vi har några verktyg på hur vi iterera över en sträng, hur vi åt varje enskilt element. Så nu kan vi komma tillbaka till programmet. Som jag nämnde tidigare, i ASCII tabellen, din bästa vän, du kommer att se de nummer som är kopplade till varje bokstav. Så här säger vår klartext är jag yr! Då var och en av dessa tecken kommer att ha ett nummer och ASCII-värdet i samband med det, även apostrofen, även utrymmet, även utropstecken, så du vill ha det i åtanke. Så säger vår nyckel som användaren ingår i deras kommandoraden argument är 6. Det innebär för det första brev, som är jag, som representeras av 73, du vill återgå till dem oavsett bokstav representeras av ASCII-värdet 73 + 6. I det här fallet skulle det vara 79. Nu vill vi gå till nästa tecken. Så nästa i index 1 i klartext skulle vara apostrof. Men kom ihåg att vi bara vill kryptera bokstäverna. Så vi vill se till att apostrofen faktiskt förblir densamma, att vi inte ändras från 39 till vad 45 är. Vi vill hålla det som en apostrof. Så vi vill komma ihåg att endast chiffrera bokstäverna eftersom vi vill att alla andra symboler för att förbli oförändrad i vårt program. En annan sak som vi vill är att bevara bokstäver. Så när du har en stor bokstav, ska det vara som ett versalt. Gemena bokstäver ska stanna som gemener. Så några användbara funktioner för att kunna hantera endast chiffrering bokstäver och hålla bevara aktivering av saker är isalpha, isupper, islower funktioner. Och så dessa funktioner som returnerar du ett booleskt värde. I grund och botten, sant eller falskt. Är detta ett versaler? Är alfanumeriska? Är detta ett brev, i huvudsak. Så här är 3 exempel på hur du skulle använda denna funktion. I grund och botten kan du testa om värdet som returneras till dig av den funktionen är sant eller falskt baserat på denna ingång. Antingen inte chiffrera något eller chiffrera det eller se till att det är versaler etc. [Elev] Kan du förklara bara de lite mer och hur du använder dem? >> Ja, säkert. Så om vi ser tillbaka, här har vi ett kapital jag, eller hur? Så vi vet att jag går till O eftersom jag + 6 är O. Men vi vill se till att att O kommer att bli en huvudstad O. Så i princip är den typen av kommer att förändra vår ingång. Så om det är versaler eller inte kommer slags ändra sättet som vi handskas med det. Så då om vi använder isupper funktion på visst index, så isupper ("I"), som returnerar för oss sant, så vi vet att det är den övre. Så då utifrån det senare går vi in ​​i en formel att du kommer att använda för att flytta saker i Caesar, så då grunden, det kommer att bli en något annorlunda formel om det är versaler i motsats till gemener. Vettigt? Ja. Inga bekymmer. Jag pratade lite om att lägga 6 till ett brev, som inte riktigt vettigt utom när vi sorts förstå att dessa tecken är typ av utbytbara heltal. Vad vi gör är att vi typ av användning implicit gjutning. Vi kommer att gå in i gjutning lite senare där du tar ett värde och du förvandla den till en annan typ än den ursprungligen var. Men med denna pset vi kommer att kunna slags omväxlande använda tecken och deras motsvarande heltalsvärden. Så om du bara innesluta en karaktär med bara enkla citattecken, då kommer du att kunna arbeta med det med heltal, som handlar om det som ett heltal. Så Capital C avser 67. Gement f avser 102. Återigen, om du vill veta dessa värden, titta på din ASCII tabellen. Så låt oss gå in några exempel på hur du skulle kunna dra och lägga till, hur du faktiskt verkligen kan arbeta med dessa tecken, växla mellan dem. Jag säger att ASCIIMath kommer att beräkna tillägget av ett tecken till ett heltal och visar sedan den resulterande karaktär samt det resulterande ASCII-värdet. Och så här jag säger - we'll hantera denna del senare - men i grunden, jag säger att användaren ska säga köra ASCIIMath tillsammans med en nyckel, och jag säger att den nyckeln kommer att vara nummer som vi kommer att lägga till denna karaktär. Så här märker att eftersom jag kräver en nyckel, eftersom jag kräver att de ger mig en sak, Jag vill bara att acceptera. / Asciimath och en nyckel. Så jag kommer att kräva att argc är lika med 2. Om det inte, så jag kommer att återvända 1 och programmet kommer att avslutas. Så jag säger nyckeln inte kommer att vara den första kommandoraden argument det kommer att vara den andra en, och som ni ser här, Jag ska vända det till ett heltal. Sen ska jag ställa ett tecken att vara r.. Observera att den typ av variabeln chr är faktiskt ett heltal. Det sätt som jag kan använda r som ett heltal är genom att innesluta det med dessa enkla citattecken. Så tillbaka till våra printf uttalande där vi har en platshållare för ett tecken och sedan en platshållare för ett heltal, tecknet representeras av chr, och heltalet är nyckeln. Och så då ska vi i resultat lägga till 2 tillsammans. Så vi kommer att lägga R + vad nyckeln är, och då ska vi skriva ut resultatet av det. Så låt oss göra asciimath. Det är upp till datum, så låt oss bara köra asciimath. Åh, men se, det gör det inte något eftersom vi inte faktiskt ge det en nyckel. Så när det just återvänt 1, vår huvudsakliga funktion, återvände det bara tillbaka till oss. Så så låt oss gå i en nyckel. Någon ge mig ett nummer. >> [Elev] 4. 4. Okej. Så R ökat med 4 kommer att ge oss v, vilket motsvarar ASCII-värdet på 118. Så då är det slags logiskt att - Egentligen kan jag be er, vad tror du ASCII värdet för r om r + 4 är 118? Då ja, r 114. Så om du tittar på ASCII tabellen då, mycket riktigt, ser du att R representeras av 114. Så nu när vi vet att vi kan lägga heltal till tecken, verkar detta ganska enkelt. Vi ska bara iterera över en sträng som vi såg i ett exempel tidigare. Vi ska kolla om det är en bokstav. Om det är så kommer vi flytta den på något nyckeln är. Ganska enkelt, förutom när du kommer att gilla detta, du ser att z, företrädd av 122, då skulle ge dig en annan karaktär. Vi vill faktiskt bo i vårt alfabet, eller hur? Så vi måste ta reda på ett sätt att typ av omslag runt. När du når Zed och du vill öka med ett visst antal, du vill inte gå in mer än ASCII alfabetet sektionen; du vill linda tillbaka ända till A. Men kom ihåg att du fortfarande är att bevara fallet. Så vet att brev inte kan bli symboler precis som symboler inte kommer att förändras också. I den sista pset du definitivt inte behöver, men ett alternativ är att genomföra din giriga pset med modulen funktionen. Men nu är vi faktiskt kommer att behöva använda modulen, så låt oss bara gå över denna lite. I huvudsak, när du har X modulo y, som ger dig resten av x dividerat med y.. Här är några exempel här. Vi har 27% 15. I grund och botten, när du subtrahera 15 från 27 så många gånger som möjligt utan att bli negativ då får du 12 kvar. Så det är ungefär som i matte sammanhang, men hur kan vi faktiskt använder det? Det kommer att vara till nytta för vår wrapover. För detta, låt oss bara säga att jag bad er alla att dela in i 3 grupper. Ibland kan du göra detta i grupper och något liknande. Säg jag sa: "Okej, jag vill att ni alla ska delas upp i 3." Hur kan du göra det? [Ohörbart elev svar] Ja, exakt. Räkna bort. Okej. Låt oss verkligen göra det. Vill du börja? [Studenter räkna ut] 1, 2, 3, 4. Men kom ihåg ... >> [Elev] Åh, förlåt. Det är en riktigt bra plats. Du sa 4, men vi faktiskt vill att du ska säga 1 eftersom vi vill bara 3 grupper. Alltså, hur - Nej, det är en riktigt bra exempel för då hur kan du säga 1? Vad är förhållandet mellan 4 och 1? Tja, 4 mod 3 1. Så om du fortsätter, skulle du vara 2. Så vi har 1, 2, 3, 1, 2. Återigen, du faktiskt den 5: e personen. Hur vet du att säga 2 istället för 5? Du säger 5 mod 3 är 2. Jag vill se hur många grupper av 3 lämnas över, sedan vilken ordning är jag Och så då om vi fortsatte längs hela rummet, då skulle vi se att vi alltid faktiskt är tillämpar MOD-funktionen till oss till typ av räkna ut. Det är en mer typ av konkret exempel på hur du kan använda modulo eftersom jag är säker på de flesta av oss har nog gått igenom den processen där vi har haft att räkna ut. Eventuella frågor om modulo? Det kommer att vara ganska viktigt att förstå begreppen detta, så jag vill se till att ni förstår. [Elev] Om det inte finns någon resterande ger det dig det verkliga antalet? Om en av de 3 första av dem hade gjort det, skulle det ha gett dem vad de faktiskt var, eller skulle det ha gett dem [ohörbart] >> Det är en bra fråga. När det inte finns någon rest för modulo - så att du har 6 mod 3 - som ger faktiskt tillbaka 0. Vi pratar om det lite senare. Åh ja, till exempel den 3: e person - är 3 mod 3 faktiskt 0 men hon sa 3. Så det är ungefär som en inre fångst, till exempel, Liksom okej, om mod är 0 så kommer jag att vara den 3: e person. Men vi får in typ av hur vi kan vill ta itu med det som 0 är senare. Så nu har vi något ett sätt att kartlägga Zed till rätt bokstav. Så nu har vi gått igenom dessa exempel, vi typ av se hur Caesar kan fungera. Du ser 2 alfabet och sedan se dem flytta. Så låt oss försöka uttrycka det i termer av formel. Denna formel är faktiskt ges till dig i spec, men låt oss typ av utseende genom vad varje variabel betyder. Vår slutresultatet kommer att bli chiffertexten. Så detta säger att den i: te karaktär chiffertexten kommer att motsvara den i: te karaktär klartexten. Det är klokt att vi vill alltid vara kö dessa saker upp. Så det kommer att bli den i: te karaktär chiffertexten plus k, som är vår nyckel - som är vettigt - och då har vi denna mod 26. Tänk tillbaka när vi hade Zed Vi ville inte komma in i karaktären, så vi ville mod den och typ av linda runt alfabetet. Efter zed du skulle gå till a, b, c, d, tills du kom till rätt nummer. Så vi vet att Zed om + 6, skulle ge oss f för efter zed kommer a, b, c, d, e, f. Så låt oss komma ihåg att vi vet att zed + 6 kommer att ge oss f.. I ASCII-värden är z 122 och f är 102. Så vi måste hitta ett sätt att göra vår Caesar formel ger oss 102 efter att i 122. Så om vi tillämpar just denna formel, ('Z' + 6)% 26, som faktiskt ger 24 eftersom 122 + 6 är 128, 128% 26 ger 24 återstoden. Men det betyder inte riktigt f.. Det är definitivt inte 102. Det är inte heller den 6: e bokstaven i alfabetet. Så uppenbarligen måste vi ha någon form av justeringar detta lite. När det gäller den vanliga alfabetet, vet vi att z är den 26: e bokstaven och f är den 6: e. Men vi är i datavetenskap, så vi kommer att index på 0. Så då istället för z är antalet 26, vi kommer att säga att det är nummer 25 eftersom en är 0. Så nu ska vi tillämpa denna formel. Vi har z representeras av 25 + 6, vilket ger dig 31. Och 31 mod 26 ger 5 som en rest. Det är perfekt eftersom vi vet att f är den 5: e bokstaven i alfabetet. Men det är fortfarande inte f, eller hur? Det är fortfarande inte 102. Så då detta pset kommer en utmaning att försöka ta reda på sambandet mellan att konvertera mellan dessa ASCII-värden och den alfabetiska index. I huvudsak, vad du vill göra, vill du börja med ASCII-värden, men då du vill på något sätt översätta det till ett alfabetiskt register sedan beräkna vilken bokstav det ska vara - i grund och botten, vad det alfabetiska index av chiffer karaktär - sedan översätta det tillbaka till ASCII-värden. Så om du piska ut din ASCII tabellen och sedan försöka hitta samband mellan, säg, 102 och 5 eller 122 och 25. Vi har fått vår nyckel från kommandoradsargumenten har vi fått i klartext, Vi har chiffreras det. Nu är allt vi har kvar att göra är att skriva ut det. Vi kan göra det här ett par olika sätt. Vad vi kan göra är att skriva ut faktiskt när vi går tillsammans. När vi iterera över tecknen i strängen, Vi kunde helt enkelt bara ut just då när vi beräknar den. Alternativt kan du även lagra den i en matris och har en rad tecken och i slutet iterera över den hel rad och skriva ut den. Så du har ett par alternativ för det. Och kom ihåg att% c kommer att vara platshållaren för utskrift av en karaktär. Så där har vi Caesar och nu går vi vidare till Vigenère, som är mycket lik Caesar men bara något mer komplex. Så i huvudsak med Vigenère är att du kommer att vara passerar i ett sökord. Så istället för ett nummer, du kommer att ha en sträng, och så det kommer att fungera som ditt sökord. Då, som vanligt, du kommer att få en snabb för en sträng från användaren och sedan chiffrera den och sedan ge dem chiffertexten tillbaka. Så som jag sa, det är mycket likt Caesar, utom i stället för att flytta på ett visst antal, Antalet faktiskt kommer att ändras varje gång från karaktär till karaktär. För att representera detta verkliga antalet att flytta, det representeras av tangentbordet bokstäver. Så om du skriver i en förskjutning av en, till exempel, då skulle motsvara en förskjutning av 0. Så det är återigen tillbaka till det alfabetiska registret. Vad kan vara användbart om du ser att vi faktiskt har att göra med ASCII-värden liksom bokstäver, liksom den alfabetiska index, kanske hitta eller skapa din egen ASCII tabell som visar det alfabetiska indexet 0 till 25, A till Z, och de ASCII-värden så att du kan typen av se förhållandet och skissa på och försöka hitta några mönster. Likaså om du flytta på den säkra instans av F - och detta är antingen gemener eller versaler f - då skulle motsvara 5. Är vi bra så här långt? Formeln för Vigenère är lite annorlunda. I grund och botten, ser du att det är precis som Caesar, utom i stället för bara k vi har k index j. Observera att vi inte använder i grund huvudsak längden på sökordet är inte nödvändigtvis längden på vår chiffertext. Detta kommer att vara lite tydligare när vi ser ett exempel på att jag har lite senare. I grund och botten, om du kör programmet med nyckelordet ohai, då det betyder att varje gång är ohai kommer att bli ditt skift. Så beroende på vilken position du befinner dig i ditt sökord, du kommer att flytta din vissa chiffertexten karaktär med motsvarande belopp. Igen, precis som Caesar, vill vi se till att vi bevarar kapitaliseringen av saker och vi bara chiffrera bokstäver, inte tecken eller mellanslag. Så se tillbaka till Caesar på de funktioner som du kan ha använt, det sätt som du bestämt hur att flytta saker, och tillämpa det till ditt program här. Så låt oss kartlägga detta. Vi har en klartext som vi har fått från användaren från getString säger detta ... är CS50! Sedan har vi ett sökord i ohai. De första 4 tecknen är ganska enkel. Vi vet att T kommer att skiftas med O, då h kommer att skiftas med h, jag kommer att flyttas med en. Här ser du att en representerar 0, så då slutvärdet är faktiskt precis samma bokstav som tidigare. Sedan s skiftas av i. Men då har du dessa perioder här. Vi vill inte att chiffrera det, så vi inte ändra det genom något och bara skriva ut den period oförändrad. [Eleven] Jag förstår inte hur ni vet att detta förskjuts med - Var har du - >> Förlåt. På toppen här ser du att kommandoraden argumentet ohai här, det kommer att bli nyckelordet. Och så i princip, du cykla över karaktärerna i sökordet. [Eleven] Så o kommer att flytta densamma - Så o motsvarar ett visst antal i alfabetet. [Elev] Rätt. Men där fick du CS50 del från? Åh. Det är i getString där du är som, "Ge mig en sträng att koda." [Eleven] De kommer att ge dig det argumentet att flytta med och då kommer du be om din första strängen. >> Ja. Så när de kör programmet, kommer de att inkludera sökordet i sina kommandoradsargument när de kör det. Sen när du har kontrollerat att de faktiskt har gett dig 1 och inte mer, inte mindre, då du kommer att få dem efter en sträng, säger: "Ge mig en sträng." Så det är där i det här fallet har de gett dig här ... är CS50! Så då du kommer att använda den och använda ohai och iterera över. Lägg märke till att vi här hoppat över kryptering perioder, men när det gäller vår position för ohai, nästa vi använde o.. I det här fallet är det lite svårare att se eftersom det är 4, så låt oss fortsätta lite. Bara hålla med mig här. Sedan har vi i och s, som sedan översätts av O och H resp. Sedan har vi ett utrymme, och så då vet vi att vi inte kommer att chiffrera utrymmen. Men märker att istället för att gå till en i denna plats här, vi kryptering med - jag vet inte om du kan se det - här. Så det är inte som du faktiskt förutbestämd, säg, O går här går h här, en går här, går jag här, o, h, a, I, O, H, A, I. Man gör inte det. Du ändrar bara din position i sökordet när du vet att du faktiskt kommer att kryptera en verklig brev. Gör en sådan känsla? Okej. Så bara några påminnelser. Du vill vara säker på att du bara vidare till nästa bokstav i sökordet Om tecknet i klartext är en bokstav. Så säger vi är på o. Vi märker att nästa tecken, i-index för klartext, är ett nummer, till exempel. Då vi överför inte j, index för vår sökord, tills vi når en annan bokstav. Återigen, vill du också se till att du wraparound till början av sökordet när du är i slutet av den. Om du ser här vi på i, har nästa att vara o. Så du vill hitta något sätt att kunna wraparound till början av sökordet varje gång du når slutet. Och så igen, vilken typ av operatör är användbar i detta fall för att slå runt? Liksom i räkningen av exempel. [Elev] Den procenttecken. >> Ja, procenttecken, vilket är modulo. Så modulo kommer väl till hands här när du vill avsluta över index i ohai. Och bara en snabb ledtråd: Försök att tänka på omslag över sökordet lite som räknar ut, där om det finns 3 grupper, den 4: e person, deras antal att de sade var 4 mod 3, vilket var 1. Så försök och tänka på det sättet. Som du såg i formeln, där du har CI och sedan pi men då KJ, du vill vara säker på att du hålla reda på dem. Du behöver inte kalla det jag behöver du inte kalla det j, men du vill vara säker på att du håller koll på den position som du är på i din klartext liksom den position som du är på i ditt sökord eftersom dessa inte nödvändigtvis kommer att vara samma. Inte bara sökordet - det kan vara en helt annan längd än din klartext. Också, din klartext, det finns siffror och tecken, så det kommer inte att perfekt matcha upp tillsammans. Ja. [Eleven] Finns det en funktion för att ändra skiftläge? Kan du ändra en till kapital A? >> Ja, det definitivt är. Du kan kolla in - jag tror det är toupper, alla 1 ord. Men när du försöker chiffrera saker och bevara texten, Det är bäst i grunden att ha separata fall. Om det är ett versalt, då du vill flytta genom denna eftersom din formel, när man ser tillbaka på hur vi ska typ av go omväxlande mellan ASCII sätt att representera siffrorna och den faktiska alfabetiskt index vill vi se till att Det kommer att bli någon form av mönster som du kommer att använda. En annan anmärkning på mönstret, faktiskt. Du kommer att definitivt att göra med siffror. Försök att inte använda magi tal, vilket är ett exempel på stil. Så säga att du vill varje gång skift något av vill - Okej, så tips är en annan spoiler när du kommer att flytta något med ett visst belopp, försök att inte representera det genom ett faktiskt antal utan försök och se om du kan använda ASCII-värdet, vilket slags vettigare. En annan anmärkning: Eftersom vi har att göra med formler, även om din TF kommer slags vet vad mönster du kanske använder, bäst till i din kommentar slags förklara logiken, liksom, "Jag använder detta mönster eftersom ..." och typ av förklara mönstret kortfattat i dina kommentarer. [Detta var genomgång 2] Om det inte finns några andra frågor, så jag ska bara stanna här lite. Lycka till med din pset 2: Crypto och tack för att du kom. [Elev] Tack. >> Tack. [Media Offline intro]