[Powered by Google Translate] [Walkthrough - Probleem Set 2] [Zamyla Chan - Harvard University] [Dit is CS50. CS50.TV] Oke. Hallo, iedereen, en welkom bij Walkthrough 2. Ten eerste wil ik u feliciteren voor het afwerken van PSET 1. Ik weet dat het zou zijn geweest een beetje moeilijk voor sommigen van jullie, had kunnen zijn uw eerste computer programma dat u schreef, maar alleen niet vergeten dat aan het einde van deze, als je terug kijkt naar het einde van het semester, je kijkt naar PSET 1 en u zult zeggen: "He, ik had kunnen doen, dat in 5 minuten." Dus kennen en vertrouwen, dat aan het eind van deze je zeker zult PSET 1 vinden heel simpel. Maar voor nu is het een enorme prestatie, en gefeliciteerd met het krijgen van gedaan. Nu, ook een snelle notitie voordat we in het vlees van de walkthrough. Ik wil gewoon een snelle notitie maken dat ik soms niet genoeg tijd hebben tijdens de walkthroughs om te gaan door elke manier van doen het probleem set en eerder heel misschien focussen op 1 of 2 soorten implementaties, manieren waarop u kunt dit doen. Maar dat wil niet zeggen dat je verboden van het doen van het op een andere manier. Er zijn vaak, net als bij informatica, tal van manieren om dingen te doen, en dus zeker voel je vrij om een ​​ander soort oplossing dan ik heb gepresenteerd gebruiken. [PSET 2: Crypto - Zamyla Chan - zamyla@cs50.net] [Pset2 - 0. Een deel van de vragen - 1. Caesar - 2. Vigenere] Oke. Dus probleem set 2: Crypto is een leuke een. Nogmaals, met alle PSET start je met een doorsnede van vragen dat gaat worden uitgevoerd in uw secties met uw aangestelde leerkrachten kerel. We zijn niet van plan om door middel van deze gaan over de walkthrough, maar ze zal zeker helpen bij het voltooien van de PSET. Dus het eerste deel van het probleem set is Caesar. En dus in Caesar iemand passeert u een sleutel met een geheel getal, en je zal coderen een tekenreeks die ze u te voorzien en geef ze terug een versleutelde ding. Als iemand keek A Christmas Story is er een voorbeeld van dat er. Dan het tweede deel van het probleem set Vigenere, dat is een meer geavanceerde encryptie techniek. En dus gaan we een stuk tekst vercijferen, behalve in plaats met slechts een enkel geheel getal, we eigenlijk gaan om het te coderen met een trefwoord dat de gebruiker ons. Oke, dus de eerste in de werkset vandaag daadwerkelijk gaat updaten van het apparaat. Op het discussion board zouden we zien dingen als: "Waarom werkt dit niet?" "Waarom niet Indienen 50 werk?" en vaak de oplossing is eigenlijk alleen maar om te werken uw apparaat. En dus als je alleen nog maar in een terminal venster in uw apparaat sudo yum-y - dat is een vlag ja zeggen, bij te werken alles - update, dan is uw apparaat wordt bijgewerkt indien nodig. En het doet geen pijn als je al op de meest recente versie van het apparaat. Dan zal alleen maar zeggen geen nieuwe updates beschikbaar zijn en u kunt verder werken mee. Maar dit is goed om nog uit te voeren elke keer dat u het apparaat te openen want we zijn nog steeds erg veel - Soms als we komen in een bug - vaststelling van het in het apparaat. Dus zorg ervoor dat u de meest recente versie van het apparaat hebben en uit te voeren dat er te werken. Oke. Dus omdat we te maken hebben met brieven en veranderen, encryptieapparatuur dingen, we gaan echt willen worden beste vrienden met onze ASCII grafiek. Er zijn tal van degenen online, als u vindt. Misschien zelfs uw eigen. Kortom, met elke letter en elk nummer en elke karakter er is een nummer dat hoort bij hen, en dus is het goed om hun ASCII-waarden te zien naast de eigenlijke brief. Die zeker zal u helpen bij het probleem set. Een ding dat me echt geholpen in dit probleem set was om daadwerkelijk print het uit, en toen ik ging door, zou ik eigenlijk op tekenen, schrijven: "Als dit moet naar daar, dan ..." Kind of er op tekenen en markeer het op, beste vrienden geworden met uw ASCII-tabel. Dan hebben we een paar andere instrumenten tot onze beschikking. Deze keer in plaats van daadwerkelijk dat de gebruiker voor al hun inbreng gaan we een combinatie doen. We gaan hen vragen bij sommige input, maar we gaan ook gewoon gebruik maken van de command line argumenten. Dus als ze hun programma uit te voeren, meestal zeg je. / Hello, bijvoorbeeld, Als uw programma was hello.c. Maar deze keer in plaats van alleen maar te zeggen dat, kunnen ze daarbij aansluitend woorden, argumenten. En dus gaan we gebruiken wat ze passeren om ons als hun input ook, zo ontroerend verder dan alleen het vragen om integer, maar ook met behulp van command line argumenten. En dan gaan we naar arrays en strings, die we zullen worden met behulp van een partij als goed. Hier is slechts een voorbeeld van een mini-ASCII-tabel. Zoals ik al zei, iedere letter correspondeert met een nummer, en zo vertrouwd te raken met dat. Het zal van pas komen. En later, toen we gaan doen wat ASCIIMath het omgaan met de nummers - optellen, aftrekken hen - dan zeker goed om te verwijzen naar deze grafiek. Dus hier is een voorbeeld van een Caesar cipher - iets dat je kan hebben gespeeld. Het is gewoon een wiel. Het betreft in wezen een buitenste alfabet en er is een binnenste alfabet. Meteen is hier een voorbeeld van de Caesar cipher maar met een sleutel van 0. Wezen is uitgelijnd met een A, B is afgestemd B, helemaal tot Z. Maar dat we wilden een sleutel 3, bijvoorbeeld. Dan zouden we draaien het binnenste wiel, zodat A nu uitgelijnd met D, enz. En dus dit is eigenlijk wat we gaan doen. We hebben geen een wiel, maar wat we gaan doen is ons programma maken soort verschuiving het alfabet met ons een zekere getallen. Dus zoals ik al eerder zei, we gaan te maken hebben met command line argumenten alsook het een integer. Dus de manier waarop een gebruiker uw Caesar programma uit te voeren is door te zeggen. / Caesar en vervolgens een aantal daarna. En dat nummer vertegenwoordigt de sleutel, de verschuiving, hoe vaak je gaat worden het draaien van de binnenste wiel van uw Caesar cipher. En dus zie je hier een voorbeeld. Als we de letters van A tot L ingegeven in ons Caesar cipher, dan zou het ingang D door middel van O want dat is elke letter verschoven meer dan 3 keer, net zoals het voorbeeld van het wiel dat ik je liet zien. Daarom dan, indien u hebt ingevoerd, bijvoorbeeld, Dit is CS50! dan zou ook bewegen alle letters. En dat is een belangrijk ding in zowel Caesar en Vigenere is dat we gaan springen over een niet-letters. Dus elke spaties, tekens, etc, cijfers, we gaan om hen hetzelfde. We alleen maar de letters verschuiven in dit geval. Dus zoals je ziet in het wiel, we hebben alleen de letters voor ons beschikbaar, dus we willen alleen de letters verschuiven en de letters te versleutelen. Dus het eerste wat je moet doen, je zag dat het gebruik voor Caesar in probleem 2 genoemde is om Caesar te voeren en vervolgens een nummer in te voeren wanneer u het uit te voeren in de terminal. Dus wat we moeten doen is een of andere manier die sleutel en toegang te krijgen. En dus willen we een of andere manier zien dat het gaat om de tweede opdrachtregelargument zijn. De eerste gaat worden. / Caesar, en de volgende gaat naar de sleutel nummer. Dus voordat we hadden int main (void) om onze C-programma's te starten. We gaan te schillen terug een laag een beetje en eigenlijk zien dat in plaats van het doorgeven in leegte van onze belangrijkste functie we eigenlijk te maken met 2 parameters. We hebben een int genaamd argc en daarna een array van strings genaamd argv. Dus argc een geheel getal, en het vertegenwoordigt het aantal argumenten dat in uw programma. En dan argv is eigenlijk de lijst van de genomen argumenten. Alle argumenten zijn snaren, en dus argv is een array, een lijst, van strings. Laten we praten over arrays een beetje. Arrays zijn in wezen een nieuwe datastructuur. We hebben ints, we hebben verdubbelt, hebben we snaren, en nu hebben we arrays. Arrays zijn gegevensstructuren die kan bevatten meerdere waarden van hetzelfde type, dus in wezen, een lijst van wat u wilt. In wezen, als je wilde een lijst van gehele getallen alle in 1 variabele, dan zou je een nieuwe variabele die was van het type int array. Dus arrays zijn nul-geïndexeerde, wat betekent dat het eerste element van de array is op index 0. Als de matrix is ​​van de lengte 4, zoals in dit voorbeeld dan laatste element zou op index 3, namelijk 4 - 1. Dus om array te maken, doe je dan iets als dit. Zeggen dat je wilde een dubbele array. Dit geldt voor elk type van data-type, dat wel. Dus zeggen dat je wilt een double array. Stel dat je wilt noemen mailbox. Net zoals je zou initialiseren andere dubbele, je zou dubbel en dan zeggen de naam, maar deze keer zetten we de vierkante haakjes, en de cijfertoets zal de lengte van de array. Merk op dat in arrays we niet altijd de lengte veranderen zodat u altijd te definiëren en te kiezen hoeveel dozen, hoeveel waarden uw array gaat houden. Dus om verschillende waarden in uw array te stellen, zul je dit volgende syntaxis te gebruiken, zoals je ziet op de dia. Je hebt mailbox index 0 wordt ingesteld op 1,2, mailbox index 1 set tot 2,4, enz. Dus nu hebben we beoordeeld arrays een beetje, laten we terug gaan naar argc en argv. We weten dat argv nu een array van strings. Dus wanneer een gebruiker gaat in - zeggen dat ze een programma dat - zeggen ze. / hello David Malan, wat het programma voor u zal doen al is eigenlijk gekomen met wat argc en argv zijn. U hoeft dus geen zorgen te maken over dat. Argc in dit geval zou 3 want zij ziet 3 verschillende woorden gescheiden door spaties. En dus dan de array in dit geval, zou de eerste index. / Hello, de volgende David, de volgende Malan. Ziet iemand meteen wat de relatie tussen argv,  de array, en argc is? Ja. We zullen daar in een voorbeeld in args.c. Laten we eens kijken of we kunnen profiteren van de relatie tussen de twee. Hier kunt u bijvoorbeeld vinden dat in het apparaat de standaard toepassing te openen. c-bestanden is soms Emacs. Maar we willen om te gaan met gedit, dus wat je kunt doen is je rechts klikken op uw C-bestand, ga naar Eigenschappen, Openen met en kies vervolgens gedit, Instellen als standaard, en nu je programma moet openen in gedit in plaats van Emacs. Perfect. Dus hier heb ik een programma dat ik wil afdrukken elke command line argument. Dus wat de gebruiker voert, wil ik in wezen terug naar hen terug op een nieuwe regel. Dus wat is een structuur die we kunnen gebruiken om itereren over iets - iets dat u waarschijnlijk in uw PSET 1? Als je wilt gaan door middel van een bepaald aantal dingen? >> [Student] For-lus. For-lus. Precies. Dus laten we beginnen met de for-lus. We hebben voor int i = 0. Laten we beginnen met een standaard initialisatie variabele. Ik ga aan de voorwaarde voor een set dan te verlaten en i + +, gaan om daar te doen dingen te zeggen. Oke. Dus dacht terug aan argv, als argv is de lijst met argumenten doorgegeven aan het programma en argc is het aantal argumenten in het programma, dan betekent dat argc is in wezen de lengte van argv, rechts, want er zullen zijn zoveel argumenten als de waarde van argc. Dus als we willen itereren over elk element in argv, we gaan willen elke keer toegang tot de variabele in argv bij de opgegeven index. Die kan worden weergegeven met deze, toch? Deze variabele geeft hier de bijzondere string in casu want het is een string array - de tekst in op dat gegeven index. Wat wij willen doen, in dit geval willen we het af te drukken, dus laten we zeggen printf. En nu argv is een string, dus we willen dat tijdelijke aanduiding daar te zetten. We willen een nieuwe lijn alleen maar om het er goed uitzien. Hier hebben we dus een for-lus. We hebben nog de aandoening heeft. Dus ik begint bij 0, en vervolgens elke keer als het gaat om de gegeven string af te drukken op dat index in de array. Dus als we willen stoppen met het afdrukken van elementen in de array? Als we klaar zijn, toch? Als we het einde van de array. Dus we willen niet hoger zijn dan langs de lengte van de array, en we weten al dat we niet nodig om daadwerkelijk actief te weten te komen wat de lengte van argv is want het is ons gegeven, en wat is dat? Argc. Precies. Dus we willen dit proces argc aantal keren doen. Ik ben niet in de juiste directory. Oke. Nu laten we args. Geen fouten, wat goed is. Dus laten we gewoon args uit te voeren. Wat gaat dit aan ons te retourneren? Het zal alleen maar af te drukken terug. "Je ingevoerd args in het programma, ik ga het terug te geven aan u." Dus laten we zeggen dat we willen dan zeggen args foo bar. Dus, dan print het uit terug naar ons. Oke? Er is dus een voorbeeld van hoe je kunt gebruiken argc en argv wetende dat argc is de lengte van argv. Zorg ervoor dat u niet ooit met arrays toegang krijgt tot een buiten de lengte van de array omdat C zal zeker schreeuwen naar je. Je krijgt zoiets als een segmentatie fout, dat is nooit leuk, eigenlijk te zeggen dat je probeert om iets te openen dat niet bestaat, niet van jou. Zorg er dus voor, en vooral met de nul-indexering, we willen niet - Zoals bijvoorbeeld, als we een array van lengte 4, die array index 4 bestaat niet, omdat we beginnen bij 0, op nul index. Het zal een tweede natuur geworden, net als voor loops wanneer we beginnen bij 0. Dus hou dat in gedachten. Je wilt niet steeds toegang tot de index van een array die is buiten je bereik. Dus we kunnen nu zien hoe we kunnen soort van toegang de commandoregel argumenten die worden doorgegeven inch Maar als je zag de string, de argv is eigenlijk een string array. Dus het is eigenlijk niet een geheel getal nog niet, maar in Caesar we willen om te gaan met gehele getallen. Gelukkig is er een functie voor ons gecreëerd die een tekenreeks daadwerkelijk converteren naar een integer. Ook hier zijn we niet te maken met input van de gebruiker waar we heen wordt gevraagd ze voor de input hier voor de sleutel, dus we kunnen niet echt reprompt en zeggen: "Oh, geef me nog een geheel getal, zeg, als het niet geldig is." Maar we moeten nog steeds om te controleren op het juiste gebruik. In Caesar ze alleen doorgelaten in 1 nummer, en dus ze moeten. / caesar rennen en dan moeten ze je een nummer. Dus argc moet een bepaald aantal. Welk nummer zou dat zijn als ze moeten aan je voorbij de. / Caesar en daarna op een toets? Wat is argc? >> [Student] 2. >> Twee. Precies. Dus wilt u ervoor zorgen dat argc is 2. Anders zou je in principe weigeren om het programma te starten. In het hoofd is het een functie die zegt int main, dus dan hebben we altijd in goede praktijken return 0 aan het einde van een succesvol programma. Dus als, laten we zeggen, ze geven je 3 command line argumenten in plaats van 2 of geef je 1, bijvoorbeeld, dan wat u wilt doen is dat je wilt controleren dat en dan terug 1 zeggen, nee, ik kan niet verder met dit programma. [Student] Er kan geen ruimte in uw tekst. >> Pardon? [Student] Er kan geen ruimte in de tekst die u probeert te versleutelen. Ah! In termen van de tekst die we proberen te versleutelen, dat komt eigenlijk later als we die tekst te geven. Dus nu zijn we gewoon accepteren als commando argumenten het werkelijke aantal, de werkelijke verschuiving voor de Caesar encryptie. [Student] Waarom heb je 2 in tegenstelling tot slechts 1 argc? Er is zeker een nummer. Juist. De reden waarom we 2 nodig hebben voor argc in plaats van 1 is omdat wanneer u een programma uitvoert en zegt. / caesar of. / hello, dat telt eigenlijk als een command line argument. Dus toen dat neemt al op 1 en dus dan gaan we het invoeren van 1 extra. Dus je eigenlijk het invoeren van een string in de command line argument. Wat u wilt doen, voor Caesar willen we om te gaan met een geheel getal, dus je kunt deze atoi functie. En eigenlijk, passeert u het in een string en dan gaat u terug terug een geheel getal of het mogelijk is om die string in een integer. Nu herinneren wanneer we te maken hebben met printf of GetString, dat soort dingen, we zijn de bibliotheken die specifiek zijn voor ons. Dus in het begin dat we beginnen met een hash tag standaard I / O,. Uur, zoiets. Nou, atoi is niet binnen een van deze bibliotheken, dus wat we moeten doen is moeten we de juiste bibliotheek bevatten voor. Dus terug te roepen naar Walkthrough 1 waar ik gesproken over de handmatige functie. U typt man in je terminal en dan gevolgd door de naam van een functie. En dus dat zal een hele lijst van het gebruik ervan, maar goed het zal brengen welke bibliotheek die behoort tot. Dus dat laat ik aan jou om de handmatige functie met atoi gebruiken en erachter te komen welke bibliotheek u nodig hebt om te kunnen de atoi functie te gebruiken. Dus we hebben de sleutel en nu het gaat om het verkrijgen van de platte tekst, en zodat daadwerkelijk zal input van de gebruiker zijn waar u wordt gevraagd. We behandelen GetInt en GetFloat, en dus in dezelfde geest we gaan maken te hebben met GetString. Maar in dit geval hebben we niet nodig om een ​​doe doen terwijl of terwijl loops te controleren. GetString zal zeker geven ons een string, en we gaan voor het coderen wat de gebruiker ons geeft. Zo kunt u ervan uitgaan dat al deze gebruiker ingevoerde tekenreeksen correct zijn. Geweldig. Dus dan als je eenmaal hebt de sleutel en als je eenmaal hebt de tekst, wat nu overblijft is moet je de platte tekst vercijferen. Gewoon om snel bedekken lingo, het leesbare is wat de gebruiker die u geeft, en de cijfertekst is wat je terug naar hen. Dus strings, om te kunnen door middel van daadwerkelijk brief gaan per brief want we moeten elke letter verschuiven, we begrijpen dat strings, als we soort van schil terug de laag, zien we dat ze gewoon echt een lijst van tekens. Men komt na de andere. En dus kunnen we behandelen strings als arrays, omdat ze zijn arrays van karakters. Dus zeggen dat je een string genaamd tekst, en binnen die variabele tekst wordt opgeslagen Dit is CS50. Dan tekst op index 0 zou een hoofdletter T, zou index 1 is h, enz. En vervolgens met arrays in de argc voorbeeld in args.c, zagen we dat we moesten itereren over een reeks en dus moesten we herhalen van i = 0 tot i kleiner is dan de lengte. Dus we moeten een manier uitzoeken wat de lengte van onze string is Als we gaan itereren over het. Gelukkig is er opnieuw een functie er voor ons, maar later in CS50 zul je zeker in staat zijn om te implementeren en maak uw eigen functie berekenen die de lengte van een string. Maar voor nu gaan we tekstlengte, dus strlen gebruiken. U passeert in een string, en dan gaat u terug een int dat de lengte van de string vertegenwoordigt. Laten we eens kijken naar een voorbeeld van hoe we zouden kunnen itereren over elk teken in een string en daar iets mee doen. Wat wij willen doen is itereren over elk teken van de string, en wat we willen doen is drukken we terug elk karakter 1 voor 1 behalve dat we iets toevoegen ernaast. Dus laten we beginnen met de for-lus. Int i = 0. We gaan om ruimte te laten voor de conditie. We willen herhalen totdat we aan het einde van de string, toch? Dus dan welke functie geeft ons de lengte van de snaar? [Onverstaanbaar student reactie] Dat is de lengte van de command line argumenten. Maar voor een string willen we een functie die geeft ons de lengte van de string te gebruiken. Dus dat is tekenreekslengte. En dus dan moet je gaan in een string aan. Het moet weten welke snaar het moet in de lengterichting. Dus dan in dit geval hebben we hier te maken met een touwtje s. Geweldig. Dus wat we willen doen, laten we printf. Nu, we willen om te gaan met tekens. We willen printen elk individueel karakter. Als je wilt dat het afdrukken van een vlotter, gebruikt u de tijdelijke aanduiding als% f. Met een int die u zou gebruiken% d. En dus op dezelfde wijze, met een teken dat u gebruikt% c om te zeggen ik ga worden afdrukken van een karakter die is opgeslagen in een variabele. Dus we hebben dit, en voegen we een punt en een spatie aan. Welk personage gebruiken we? We gaan worden met behulp van welke aard ook wij aan van de string. Dus dan gaan we gebruiken iets met touw, maar we willen gebruikmaakt van de bepaalde karakter daar. Dus als een string is gewoon een array is, dan hoe kunnen we toegang krijgen tot elementen van arrays? We hebben die vierkante haakjes, en dan zetten we de index in. Dus we hebben vierkante haken. Onze index in dit geval kunnen we gewoon gebruik maken van i. Precies. Dus hier zijn we zeggen dat we gaan worden afdrukken van een teken, gevolgd door een punt en een spatie, en dat karakter zal de i-de letter in onze string s zijn. Ik ga gewoon om dat op te slaan. Oke. Nu ga ik naar lengte van de string uit te voeren. Dus we hadden een string genaamd OMG, en nu is het nog meer benadrukt. Ook laten we zeggen dat we eigenlijk willen een string te krijgen van de gebruiker. Hoe kunnen we dat doen? Voordat, hoe krijgen we een int? We zeiden GetInt, toch? Maar dit is niet int, dus laten we GetString. Laten we lengte van de string. Hier hebt geen specifieke prompt. Dus ik weet het niet. Ik ga mijn naam hier in en zo is dan kan ik een van die dingen waar ik wijs een woord voor elke letter of iets dergelijks. Cool. Dus dat is tekenreekslengte. Dus zijn we terug bij Caesar. We hebben een paar tools over hoe we itereren over een string, hoe we elk afzonderlijk element te openen. Dus nu kunnen we terug naar het programma. Zoals ik al zei, in de ASCII-tabel, je beste vriend, je gaat naar de nummers die zijn gekoppeld aan elke letter te zien. Dus hier zeggen dat onze plaintext is dat ik duizelig ben! Dan elk van deze personages zal een nummer en ASCII-waarde verbonden aan, zelfs de apostrof, zelfs de ruimte, zelfs het uitroepteken, dus je zult willen dat in gedachten te houden. Dat zeggen onze belangrijkste dat de gebruiker opgenomen in hun command line argument is 6. Dat betekent voor de eerste letter, die I, dat wordt voorgesteld door 73, u wilt terugkeren naar ze wat letter wordt vertegenwoordigd door de ASCII-waarde van 73 + 6. In dit geval is dat 79. Nu willen we gaan naar het volgende teken. Dus de volgende in de index 1 van de platte tekst zou de apostrof zijn. Maar vergeet niet dat we willen alleen de letters vercijferen. Dus we willen ervoor zorgen dat de apostrof eigenlijk hetzelfde blijft, dat we niet veranderen van 39 tot wat 45 is. We willen het houden zoals een apostrof. Dus we willen onthouden om alleen vercijferen de letters want we willen alle andere symbolen om ongewijzigd blijven in ons programma. Een ander ding dat we willen is het behouden van hoofdletters. Dus als u een hoofdletter hebben, moet het blijven als een hoofdletter. Kleine letters moet blijven als kleine letters. Dus een aantal nuttige functies om te kunnen omgaan met alleen encryptieapparatuur letters en houd het behoud van de kapitalisatie van de dingen de isalpha, isupper, islower functies. En dus dit zijn functies die u terug een Booleaanse waarde. Kortom, waar of onwaar. Is dit een hoofdletter? Hierdoor alfanumerieke? Is dit een brief, in wezen. Dus hier zijn 3 voorbeelden van hoe je zou die functie te gebruiken. In principe kun je testen of de waarde die wordt geretourneerd door die functie waar of onwaar is gebaseerd op die ingang. Ofwel niet coderen, iets of versleutelen het of ervoor te zorgen dat het hoofdletters, enz. [Student] Kun je even uitleggen die een beetje meer, en hoe je ze gebruikt? >> Ja, zeker. Dus als we terugkijken, hier hebben we een hoofdletter I, toch? We weten dus dat ik gaat O, want ik + 6 is O. Maar we willen ervoor zorgen dat O zal worden een kapitaal O. Dus eigenlijk, dat is een soort van naar onze ingang te wijzigen. Dus of het nu hoofdletters of niet wil soort veranderen de manier waarop wij omgaan met het. Daarom dan, indien we de isupper functie te gebruiken op die specifieke index, dus isupper ("I"), die terugkeert voor ons waar is, dus we weten dat het bovenste is. Dus dan op basis van dat, later gaan we in een formule dat u zult gebruiken om dingen te veranderen in Caesar, dus dan in principe, is er gaat een iets andere formule als het hoofdletters in tegenstelling tot kleine letters. Logisch? Ja. Geen zorgen. Ik sprak een beetje over het toevoegen van 6 tot en met een brief, die niet helemaal logisch behalve wanneer we soort van begrijpen dat deze tekens zijn soort uitwisselbaar met gehele getallen. Wat we doen is dat we soort van gebruik impliciete casting. We gaan in het gieten van een beetje later op, waar je een prijs en je zet hem in een ander type dan het oorspronkelijk was. Maar met deze PSET zullen we in staat zijn om dergelijke door elkaar gebruiken tekens en de bijbehorende gehele getallen. Dus als je gewoon een teken omsluiten met alleen de enkele aanhalingstekens, dan zul je in staat zijn om met het werken met gehele getallen, het omgaan met het als een geheel getal. Dus de hoofdstad C heeft betrekking op 67. Kleine letters f heeft betrekking op 102. Nogmaals, als je wilt deze waarden weten, kijk naar je ASCII-tabel. Dus laten we gaan in een paar voorbeelden van hoe u in staat zijn om af te trekken en toe te voegen, hoe je daadwerkelijk kan echt werken met deze tekens, uitwisselbaar. I dat ASCIIMath zal de toevoeging van een karakter berekenen een integer en vervolgens de resulterende karakter en de resulterende ASCII waarde. En dus even ik zeg - we zullen omgaan met dit deel later - maar in principe, ik zeg dat de gebruiker moet worden uitgevoerd ASCIIMath zeggen samen met een sleutel, en ik zeg dat die sleutel gaat om het nummer te waarmee we gaan dit karakter toe te voegen. Dus hier opmerken dat sinds ik ben veeleisend een sleutel, aangezien ik eisen dat ze geven me 1 ding, Ik wil alleen. / Asciimath en een sleutel te accepteren. Dus ik ga om te eisen dat argc is gelijk aan 2. Als het niet, dan ga ik naar 1 terug te keren en het programma zal verlaten. Dus ik zeg de sleutel is niet van plan om de eerste command line argument, het gaat om de tweede, en zoals je hier ziet, Ik ga dat veranderen in een geheel getal. Dan ga ik naar een tekenset te r. Merk op dat het type van de variabele chr eigenlijk een integer. De manier waarop ik ben in staat om r te gebruiken als een geheel getal is door het inkapselen van het met deze enkele aanhalingstekens. Dus terug naar onze printf statement waar we een tijdelijke aanduiding voor een karakter en dan een tijdelijke aanduiding voor een geheel getal, het karakter wordt gerepresenteerd door de CHR en integer is de sleutel. En dus dan gaan we in het resultaat samen voeg de 2. Dus we gaan naar r toevoegen + wat de sleutel is, en dan gaan we het resultaat van deze af te drukken. Dus laten we asciimath. Het is up-to-date, dus laten we gewoon asciimath uit te voeren. Oh, maar zie, is het niet doen omdat we niet echt geef het een sleutel. Dus als het gewoon 1, onze belangrijkste functie terug, het is gewoon weer terug naar ons. Dus laten we dan gaan in een sleutel. Iemand geef me een nummer. >> [Student] 4. 4. Oke. Dus r met 4 zal ons v, die overeenkomt met de ASCII-waarde van 118. Dus dan is het soort van logisch dat - Eigenlijk mag ik je, wat denk je dat de ASCII-waarde van r is als r + 4 is 118? Dan ja, r 114. Dus als je kijkt op de ASCII-tabel, dan zeker genoeg, zult u zien dat r wordt vertegenwoordigd door 114. Dus nu we weten dat we kunnen gehele getallen toevoegen aan personages, lijkt dit vrij eenvoudig. We gaan gewoon naar itereren over een string, zoals we zagen in een voorbeeld voor. We zullen nagaan of het een brief. Zo ja, dan zullen we verschuiven het door wat de sleutel is. Vrij eenvoudig, behalve als je naar dit willen, zie je dat z, vertegenwoordigd door 122, dan zou je een ander karakter. We willen eigenlijk blijven binnen ons alfabet, toch? Dus we moeten een manier bedenken van soort verpakking rond. Wanneer u zed te bereiken en u wilt verhogen met een bepaald aantal, u niet wilt gaan naar buiten het ASCII alfabet sectie; u wilt wikkelen helemaal terug naar A. Maar houd in gedachten dat je nog steeds het geval is behoud. Dus wetende dat letters niet kan worden symbolen net als symbolen worden niet van plan om ook te veranderen. In de laatste PSET je zeker niet nodig om, maar een optie was om je gulzige PSET te implementeren met behulp van de modulus functie. Maar nu zijn we echt gaat nodig hebben om modulus te gebruiken, dus laten we gewoon gaan over deze een klein beetje. In wezen, als je x modulo y, die u de rest van x gedeeld door y. Hier zijn enkele voorbeelden. We hebben 27% 15. In principe, als je aftrekken 15 van 27 zo vaak als mogelijk zonder dat negatieve dan krijg je 12 overgebleven. Dus dat is net zoiets als in de wiskunde context, maar hoe kunnen we eigenlijk gebruiken? Het zal nuttig zijn voor onze overslag. Voor deze, laten we gewoon zeggen ik vroeg jullie allemaal te verdelen in 3 groepen. Soms doe je dit in groepen en iets dergelijks. Zeg Ik zei: "Oke, ik u allen willen worden onderverdeeld in 3." Hoe zou je dat doen? [Onverstaanbaar student reactie] Ja, precies. Tel uit te schakelen. Oke. Laten we eigenlijk doen. Wilt u beginnen? [Studenten aftellen] 1, 2, 3, 4. Maar vergeet niet ... >> [Student] Oh, sorry. Dat is een heel goed punt. Je zei 4, maar we eigenlijk willen dat je een zeggen, want we willen alleen maar 3 groepen. Zo dan, hoe - Nee, dat is echt een goed voorbeeld, want dan hoe zou je kunnen zeggen 1? Wat is de relatie tussen de 4 en 1? Nou, 4 mod 3: 1. Dus als u doorgaat, zou je 2. We hebben dus 1, 2, 3, 1, 2. Nogmaals, je bent eigenlijk de 5e persoon. Hoe weet u tot en met 2 in plaats van 5 zeggen? Je zegt 5 mod 3 is 2. Ik wil zien hoeveel groepen van 3 overblijven, dan welke volgorde ben ik En zo dan, als we verder langs de hele kamer, dan zouden we zien dat we altijd zijn eigenlijk de MOD-functie van toepassing zijn op onszelf van de soort af te rekenen met. Dat is een meer soort tastbaar voorbeeld van hoe je zou kunnen gebruiken modulo want ik weet zeker dat de meesten van ons hebben waarschijnlijk gegaan door dat proces waar we hebben om te tellen uit. Eventuele vragen over modulo? Het zal erg belangrijk om de concepten van dit te begrijpen, dus ik wil er zeker van dat jullie begrijpen. [Student] Als er geen rest, is het geven u het werkelijke aantal? Als een van de eerste 3 van hen had gedaan, zou het gegeven hebben wat ze eigenlijk waren, of zou het hun gegeven heb [onverstaanbaar] >> Dat is een goede vraag. Wanneer er geen rest voor de modulo - dus zeggen dat je 6 mod 3 - dat geeft eigenlijk je terug 0. We praten over dat wat later. Oh ja, bijvoorbeeld, de 3e persoon - 3 mod 3 is eigenlijk 0 maar ze zei 3. Dus dat is net zoiets als een innerlijke vangst, bijvoorbeeld, zoals oke, als de mod is dan 0 Ik ga naar de 3e persoon. Maar we zullen krijgen in vorm te blijven van hoe we zouden willen om te gaan met wat 0 is later. Dus nu hebben we een of andere manier een manier van in kaart brengen van de zed om de juiste letter. Dus nu we hebben meegemaakt deze voorbeelden, we soort van zien hoe Caesar zou kunnen werken. Je ziet de 2 alfabetten en dan zie je ze verschuiven. Dus laten we proberen en uit te drukken dat in termen van de formule. Deze formule is eigenlijk aan u gegeven in de spec, maar laten we soort look door wat elke variabele betekent. Onze eindresultaat gaat worden deze gecodeerde tekst. Dus dit zegt dat de i-karakter van de cijfertekst zal voldoen aan de i karakter van de klare tekst. Dat is logisch, want we willen altijd in de rij die dingen op. Dus het gaat om de i-karakter van de cijfertekst plus k, dat is onze belangrijkste zijn - dat is logisch - en dan hebben we deze mod 26. Herinner me terug toen we de zed we hadden geen zin om in het personage, dus we wilden het mod en soort van de wikkel rond het alfabet. Na zed je zou gaan naar a, b, c, d, totdat je moet het juiste nummer. Dus we weten dat zed indien + 6, zou ons f want na zed komt a, b, c, d, e, f. Dus laten we niet vergeten dat we zeker weten dat zed + 6 gaat geven ons f. In ASCII waarden z 122 en f 102. Dus moeten we een of andere manier van het maken van onze Caesar formule te vinden ons 102 na het nemen van in 122. Dus als we alleen van toepassing deze formule, de ('z' + 6)% 26, die eigenlijk geeft u 24 omdat 122 + 6 is 128; 128% 26 geeft u 24 rest. Maar dat betekent niet echt f. Dat is zeker niet 102. Dat is ook niet de 6e letter van het alfabet. Dus natuurlijk, moeten we een manier tweaken dit een beetje te hebben. In termen van de reguliere alfabet, weten we dat z de 26e letter en f is de 6e. Maar we zijn in de informatica, dus we gaan naar index op 0. Dus dan in plaats van z zijnde de nummer 26, we gaan het is nummer 25 zeggen omdat a 0. Dus laten we nu van toepassing van deze formule. We hebben z vertegenwoordigd door 25 + 6, die geeft je 31. En 31 mod 26 geeft u 5 als een restant. Dat is perfect, want we weten dat f is de 5e letter van het alfabet. Maar het is nog niet f, toch? Het is nog niet 102. Dus dan voor deze PSET, zal een uitdaging proberen te weten te komen van de relatie tussen het omzetten tussen deze ASCII-waarden en de alfabetische index. In wezen, wat je wilt doen, wil je om te beginnen met de ASCII-waarden, maar dan moet je wilt een of andere manier die zich vertalen in een alfabetische index dan berekenen wat het zou moeten zijn brief - in principe, wat de alfabetische index is van de cipher karakter - dan vertalen dat naar de ASCII-waarden. Dus als je zweep uit uw ASCII-tabel, dan proberen en vind de relaties tussen bijvoorbeeld 102 en 5 of 122 en 25. We hebben onze belangrijkste gekregen vanaf de command line argumenten, hebben we gekregen van de platte tekst, we hebben vercijferde het. Nu alles wat we hebben te doen is afdrukken. We kunnen dit doen een paar verschillende manieren. Wat we kunnen doen is eigenlijk af te drukken als we verder gaan. Zoals we itereren over de karakters in de string, kunnen we simpelweg gewoon uitprinten recht dan wanneer wij die berekenen. Als alternatief kunt u ook opslaan in een array en een array van karakters en herhalen aan het einde over dat hele array en print het uit. Dus je hebt een paar opties voor. En vergeet niet dat% c gaat om de tijdelijke aanduiding voor het afdrukken van een teken te zijn. Dus daar hebben we Caesar, en nu gaan we naar Vigenere, die zeer vergelijkbaar Caesar maar net iets complexer. Dus in wezen met Vigenere is je gaat passeren in een trefwoord. Dus in plaats van een nummer, zul je een string te hebben, en zo dat gaat fungeren als uw zoekwoord. Dan, zoals gewoonlijk, zul je een prompt te krijgen voor een string van de gebruiker en dan vercijferen en dan geven ze de cijfertekst terug. Dus zoals ik al zei, het is zeer vergelijkbaar met Caesar, behalve in plaats van het verschuiven van een aantal, het nummer er werkelijk gaande is om elke keer te veranderen van karakter naar karakter. Om dat werkelijke aantal vertegenwoordigen te verschuiven, het is vertegenwoordigd door het toetsenbord letters. Als u in een verschuiving van een, bijvoorbeeld, dan zou overeenkomen met een verschuiving van 0. Dus het is weer terug naar de alfabetische index. Wat zou handig zijn als je ziet dat we eigenlijk te maken hebben met ASCII-waarden evenals de letters, en de alfabetische index Misschien vinden of maak je eigen ASCII-tabel die de alfabetische index van 0 tot en met 25 toont, a tot en met z en de ASCII-waarden, zodat u kunt soort zien de relatie en schetsen en proberen te vinden sommige patronen. Ook als je het verschuiven op het bepaalde instantie door f - en dit is ofwel kleine letters of hoofdletters f - dan zou dat overeenkomen met 5. Zijn we goed tot nu toe? De formule voor Vigenere is een beetje anders. In principe zie je dat het is net als Caesar, behalve in plaats van alleen k hebben we k index j. Merk op dat we niet i gebruikt omdat in wezen de lengte van het zoekwoord is niet per se de lengte van onze cijfertekst. Dit zal een beetje duidelijker zijn wanneer zien we een voorbeeld dat ik een beetje heb later. Kortom, als u uw programma uit te voeren met een sleutelwoord van ohai, dan betekent dat dat elke keer, ohai gaat om uw shift te zijn. Dus afhankelijk van welke positie u bent in uw zoekwoord, je gaat je bepaalde cijfertekst karakter veranderen met dat bedrag. Nogmaals, net als Caesar, willen we ervoor zorgen dat we de kapitalisatie van de dingen te bewaren en we alleen coderen, letters, geen tekens of spaties. Dus terugkijken op Caesar op de functies die u heeft gebruikt, de manier waarop je hebt besloten hoe je dingen verschuiven, en dat toepassen op uw programma hier. Dus laten we in kaart dit uit. We hebben een platte tekst die we hebben gekregen van de gebruiker van getString zeggende: Deze ... is CS50! Dan hebben we een sleutelwoord van ohai. De eerste 4 karakters zijn vrij eenvoudig. We weten dat T zal worden verschoven o, Vervolgens h zal worden verschoven h, i zal worden verschoven naar een. Hier zie je dat er een 0 staat, dus dan is de eindwaarde is eigenlijk alleen maar dezelfde letter als voorheen. Dan s wordt verschoven door i. Maar dan heb je deze periodes hier. We willen niet vercijferen dat, dus dan hebben we het niet te veranderen door iets en net uit te printen in de periode ongewijzigd. [Student] Ik begrijp niet hoe je weet dat dit wordt verschoven door - Waar heb je - >> Oh, sorry. Op de top hier zie je dat de command line argument ohai hier, dat gaat het zoekwoord te zijn. En dus in principe, je fietst over de personages in het zoekwoord. [Student] Dus o gaat verschuiven hetzelfde - Dus o komt overeen met een bepaald aantal in het alfabet. [Student] Juist. Maar waar heb je het CS50 deel uit? Oh. Dat is in getString waar je bent zoals, "Geef me een string te coderen." [Student] Ze zullen u dat argument te verschuiven door en dan zul je vragen voor je eerste string. >> Ja. Dus als ze het programma uit te voeren, gaan ze het zoekwoord bevatten in hun command line argumenten wanneer ze het uit te voeren. Dan als je eenmaal hebt gecontroleerd dat ze eigenlijk heb u 1 en niet meer, niet minder, dan zul je ze vragen om een ​​string, zeggen: "Geef me een string." Dus dat is waar in dit geval hebben ze jou gegeven Dit ... is CS50! Dus dan ga je gebruiken en ohai gebruiken en itereren over. Merk op dat we hier overgeslagen versleutelen van de periode, maar in termen van onze positie voor ohai, de volgende gebruikten we o. In dit geval is het een beetje moeilijker om te zien want dat is 4, dus laten we blijven een beetje. Gewoon hier blijven met mij. Dan hebben we i en s, die vervolgens worden vertaald respectievelijk o en h. Dan hebben we een ruimte, en dus dan weten we dat we niet naar de ruimtes vercijferen. Maar merk op dat in plaats van naar een op deze plek hier, we versleutelen door een - ik weet niet of je kunt zien dat - hier. Dus het is niet zo dat u eigenlijk vooraf bepaalde, laten we zeggen, o gaat hier, h gaat hier, een gaat hier, ik gaat hier, o, u, a, i, o, u, a, i. Je hoeft niet doen. Je hoeft alleen verschuiven uw positie in het trefwoord als je weet dat je eigenlijk gaat worden versleutelen van een echte brief. Is dat soort van logisch? Oke. Dus gewoon enkele aandachtspunten. U wilt ervoor zorgen dat u alleen door te gaan naar de volgende letter in uw zoekwoord als het teken in uw tekst zonder opmaak is een brief. Dat zeggen we op de o. We merken dat het volgende teken, de i-index van de platte tekst, een getal, bijvoorbeeld. Dan hebben we niet vooruit j, de index voor onze trefwoord, tot we bij een andere brief. Nogmaals, je wilt ook zeker van zijn dat u wraparound leveren aan het begin van het zoekwoord als je aan het eind van het. Als je hier ziet zijn we op i, het volgende moet men o. Dus je wilt een of andere manier te kunnen wraparound vinden aan het begin van uw zoekwoord elke keer dat je het einde bereikt. En zo ja, wat voor soort gebruiker is handig in dat geval voor het verpakken in de buurt? Net als in het tellen af ​​voorbeeld. [Student] Het percentage teken. >> Ja, het percentage teken, dat is modulo. Dus modulo zal hier van pas komen wanneer u wilt strak langs de index in uw ohai. En net een snelle hint: Probeer te denken aan verpakken op het zoekwoord een beetje op de tellen af, waar als er 3 groepen, de 4de persoon, hun aantal, dat ze zeiden dat was 4 mod 3, dat was 1. Dus probeer en denk aan het op die manier. Zoals je zag in de formule, waar u ci en dan pi, maar dan kj, wilt u ervoor zorgen dat u bijhouden van die. U hoeft niet te noemen i, hoeft u niet te noemen j, maar wilt u ervoor zorgen dat u bijhouden van de positie die je op in je platte tekst evenals de positie die je op een zoekwoord omdat deze niet noodzakelijkerwijs naar dezelfde. Niet alleen het trefwoord - het kan een heel andere lengte dan uw platte tekst. Ook uw platte tekst, zijn er cijfers en letters, dus het is niet van plan om perfect op elkaar overeenkomen. Ja. [Student] Is er een functie om te wisselen? Kunt u een kapitaal A? >> Ja, er is zeker. U kunt controleren - Ik geloof dat het toupper, alle 1 woord. Maar als je probeert om dingen te versleutelen en de tekst te behouden, is het het beste in feite neer op aparte gevallen. Als het een hoofdletter, dan wil je veranderen door deze want in uw formule, als je terugkijkt hoe we moeten soort go elkaar tussen de ASCII manier om de getallen en de werkelijke alfabetische index, we willen ervoor zorgen dat Er gaat een soort patroon dat je gaat gebruiken. Een andere opmerking over het patroon, eigenlijk. Je gaat zeker het omgaan met getallen. Probeer niet te magische getallen te gebruiken, dat is een voorbeeld van de stijl. Dus zeggen dat je wilt elke keer shift iets van wilt - Oke, dus hint, een andere spoiler is wanneer je gaat te verschuiven iets met een bepaald bedrag, probeer niet dat vertegenwoordigen een werkelijke aantal maar proberen en kijk of je kunt de ASCII-waarde, die soort van meer zin te gebruiken. Nog een opmerking: Omdat we te maken hebben met formules, ook al is uw TF zal soort van weten welk patroon je zou kunnen gebruiken, beste in uw commentaar soort verklaren de logica, zoals, "Ik gebruik dit patroon omdat ..." en de aard van bondig uit te leggen het patroon in uw commentaar. [Dit was walkthrough 2] Als er geen andere vragen, dan zal ik gewoon hier blijven voor een beetje. Veel succes met je PSET 2: Crypto en bedankt voor uw komst. [Student] Dank je wel. >> Bedankt. [Media Offline intro]