[Powered by Google Translate] [Walk Through - Probleem Set 2] [Zamyla Chan - Harvard Universiteit] [Hierdie is CS50. CS50.TV] Alles reg. Hallo, almal, en welkom by Walk Through 2. Eerstens, ek wil jou geluk te wens vir die afwerking van pset 1. Ek weet dat dit kon gewees het 'n bietjie moeilik vir sommige van julle, jou eerste rekenaar program wat jy geskryf het kon gewees het, maar onthou net dat op die einde van hierdie, wanneer jy terug kyk na die einde van die semester, jy kyk na pset 1 en jy sal sê, "Hey, ek kon gedoen het dat in 5 minute." So ken en vertrou dat jy aan die einde van hierdie sal beslis pset 1 heel eenvoudig. Maar vir nou is dit 'n groot prestasie, en baie geluk vir die kry gedoen. Nou ook 'n vinnige nota voor ons kry in die vleis van die instruksies. Ek wil net 'n vinnige nota om te maak dat ek soms nie genoeg tyd gedurende die ipv om te gaan deur middel van elke enkele manier van doen van die probleem stel en eerder net miskien fokus op die 1 of 2 soort van implementasies, maniere waarop jy dit kan doen. Maar dit is nie te sê dat jy word verbied om dit te doen 'n ander manier. Daar is dikwels, soos met rekenaarwetenskap, talle maniere om dinge te doen, en so beslis voel vry om 'n ander tipe van die oplossing as wat ek aangebied mag het om te gebruik. [Pset 2: Crypto - Zamyla Chan - zamyla@cs50.net] [Pset2 - 0. 'N Artikel van die vrae - 1. Caesar - 2. Vigenere] Alles reg. So die probleem stel 2: Crypto is 'n prettige een. Weereens, met elke pset wat jy sal begin met 'n gedeelte van die vrae wat gaan in jou artikels met jou opgedra onderrig mede. Ons is nie van plan om te gaan deur middel van hierdie oor die instruksies, maar hulle sal beslis help jy die pset voltooi. Dus is die eerste deel van die probleem stel is die keiser. En so in die keiser iemand sal verby jou 'n sleutel met 'n heelgetal, en jy sal 'n string van die teks wat hulle bied jou enkripteer en gee hulle terug 'n geënkripteerde ding. As iemand gekyk A Christmas Story, daar is 'n voorbeeld van dat daar. Dan is die tweede deel van die probleem stel is Vigenere, wat is 'n meer gevorderde enkripsie tegniek. En so gaan ons 'n stuk van die teks te versleutelen, behalwe plaas met net 'n heelgetal, ons eintlik gaan om dit te enkodeer met 'n navraag wat die gebruiker sal ons. Goed, so die eerste instrument in die toolbox vandag is eintlik gaan word afhangende van die toestel. Op die discussion board ons sal sien dinge soos, "Waarom nie hierdie werk?" "Hoekom Dien 50 werk nie?" en dikwels die oplossing is eintlik net jou toestel te werk. En so, as jy net loop in 'n terminale venster in jou toestel sudo yum-y - wat is 'n vlag wat ja sê, werk alles - update, dan is jou toestel sal werk as dit nodig is. En dit maak nie seer as jy reeds by die mees onlangse weergawe van die toestel. Dan sal dit net sê Geen nuwe bywerkings beskikbaar en jy kan voortgaan om saam te werk. Maar dit is goed elke keer wat jy die toestel oopmaak om selfs uit te voer want ons is nog steeds baie - soms as ons in 'n bug tot vaststelling van dit in die toestel. So maak seker dat jy die mees onlangse weergawe van die toestel en uit te voer dat daar werk. Alles reg. So, aangesien ons te doen het met briewe en verander, geheimschrift dinge, ons gaan regtig wil die beste vriende met ons ASCII tabel. Daar is talle aanlyn, as jy. Miskien selfs jou eie maak. Basies, met elke brief en elke en elke karakter daar is 'n aantal wat verband hou met hulle, en so dit is goed om hulle ASCII waardes te sien saam met die werklike brief. Dit sal beslis help om jou in die probleem stel. Een ding wat my regtig gehelp het in hierdie probleem stel om werklik druk dit uit, en as ek gaan deur, ek sou eintlik trek op dit, skryf: "As hierdie het om te gaan na daar, dan ..." Soort trek op en merk dit op, word die beste vriende met jou ASCII tabel. Dan het ons 'n paar ander instrumente tot ons beskikking. Hierdie tyd in plaas van werklik waarna die gebruiker vir al hul insette ons gaan om 'n kombinasie te doen. Ons gaan hulle te vinnig vir 'n paar insette, maar ons gaan ook net gebruik maak van die command line argumente. So wanneer hulle hul program loop, gewoonlik sê jy / Hello, byvoorbeeld, as jou program hello.c was. Maar hierdie keer in plaas van net te sê dat, kan hulle die woorde, argumente daarna. En so gaan ons om te gebruik wat hulle by ons in te slaag sowel as hul insette, so beweeg verder as net te vra vir heelgetal, maar ook die gebruik van command line argumente. En dan sal ons gaan in skikkings en snare, wat ons sal gebruik word om 'n baie goed. Hier is net 'n voorbeeld van 1 mini ASCII tabel. Soos ek sê, elke brief moet stem ooreen met 'n aantal en so vergewis jouself met dit. Dit sal handig te pas kom. En later, toe ons begin doen n ASCIIMath die hantering van die getalle - optelling, aftrekking hulle dan beslis goed om te verwys na hierdie grafiek. So hier is 'n voorbeeld van 'n keiser cipher - iets wat jy kan gespeel het. Dit is net 'n wiel was. Wese, daar is 'n buitenste alfabet en dan is daar 'n innerlike alfabet. So reg hier is 'n voorbeeld van die keiser cipher, maar met 'n sleutel van 0. A wese, in lyn met A, B is in lyn met B, al die pad tot by Z. Maar dan sê ons wou 'n sleutel van 3, byvoorbeeld. Dan sal ons die binneste wiel draai sodat 'n nou ooreenstem met D, ens En so het dit is in wese wat ons gaan doen. Ons het nie 'n wiel, maar wat ons gaan doen, is ons program soort skuif die alfabet saam met ons 'n sekere bedrag van getalle. Dus soos ek vantevore gesê het, gaan ons doen met die command line argumente sowel as om 'n heelgetal. So het die manier waarop 'n gebruiker sal jou Caesar program hardloop, is deur te sê / Caesar en dan die begin van 'n nommer na. En dat die getal verteenwoordig die sleutel, die verskuiwing, hoeveel keer jy gaan om die draai van die binneste wiel van jou Caesar-cipher. En so sien jy hier 'n voorbeeld. As ons in die letters van A tot L in ons Caesar cipher, dan sou dit insette D deur O want dit is elke letter verskuif meer as 3 keer, net soos die voorbeeld van die wiel wat Ek julle getoon. Daarom dan, as wat jy ingevoer het, byvoorbeeld, Dit is CS50! dan sou dit beweeg ook al die briewe. En dit is 'n belangrike ding in beide Caesar en Vigenere is dat ons gaan om te slaan enige nie-briewe. So enige spasies, karakters, ens, getalle, gaan ons hulle dieselfde te hou. Ons is net gaan om die letters te skuif in hierdie geval. So soos jy kan sien in die wiel, ons het net die letters tot ons beskikking, sodat ons wil net die letters te skuif en die letters te enkripteer. Dus is die eerste ding om te doen, jy sien dat die gebruik vir Caesar in die probleem wat 2 is die keiser te hardloop en dan 'n nommer gee wanneer jy dit loop in die terminale. So, wat ons nodig het om te doen is om op een of ander manier kry die sleutel en dit toegang. En so het ons wil om een ​​of ander manier te sien dit gaan om die tweede command line argument. Die eerste een gaan wees / keiser., En die volgende een gaan die sleutel getal wees. So voordat ons moes int main (void) ons C programme te begin. Ons gaan 'n lagie skil terug 'n bietjie en eintlik sien dat in plaas van verbygaande leemte aan ons hooffunksie ons eintlik die hantering van 2 parameters. Ons het 'n int genoem argc en dan 'n skikking van stringe genoem bevat SPASIES. So argc 'n heelgetal is, en dit verteenwoordig die aantal argumente geslaag het in jou program. En dan bevat SPASIES is eintlik die lys van die argumente geslaag. Al die argumente is stringe, en so bevat SPASIES verteenwoordig 'n skikking, 'n lys van stringe. Kom ons praat oor skikkings 'n bietjie. Skikkings is in wese 'n nuwe data struktuur. Ons het ints, ons het verdubbel, ons het stringe, en nou het ons skikkings. Skikkings is data strukture wat verskeie waardes van dieselfde tipe kan hou, so in wese, 'n lys van watter tipe wat jy wil. Wese, as jy wou 'n lys van heelgetalle in 1 veranderlike, dan sou jy die skep van 'n nuwe veranderlike van tipe int array was. So skikkings is zero-geïndekseer, wat beteken dat die eerste element van die skikking is op die werf 0. Indien die skikking van lengte 4, soos in hierdie voorbeeld, dan is jou laaste element sou wees by index 3, wat is 4 - 1. So skikking te skep, sal jy iets soos hierdie. Sê jy wou 'n dubbele-skikking. Dit geld vir enige tipe van data tipe, though. So sê jy wil 'n dubbele-skikking. Sê wat jy wil om dit te noem posbus. Net soos jy sou inisialiseer enige ander dubbel, sou jy dubbel en dan sê die naam, maar hierdie keer het ons die vierkantige hakies, en dan die nommer daar sal die lengte van die skikking. Let daarop dat ons in skikkings ooit kan verander nie die lengte, So het jy altyd Hoeveel bokse te definieer en te kies, hoeveel waardes jou skikking gaan om vas te hou. So verskillende waardes in die skikking te stel, gaan jy die volgende sintaks wat gebruik word, as jy sien op die slide. Jy het posbus indeks 0 gestel word tot 1,2, posbus indeks 1 stel tot 2,4, ens. So nou dat ons het nagegaan skikkings 'n bietjie, laat ons gaan terug na argc en bevat SPASIES. Ons weet dat bevat SPASIES nou is 'n verskeidenheid van snare. So wanneer 'n gebruiker gaan in - sê dat hulle 'n program loop - sê hulle. / Hello Dawid Malan, wat die program sal doen vir jou reeds is eintlik vorendag gekom met wat argc en bevat SPASIES is. So jy hoef nie te bekommerd wees oor wat. Argc in hierdie geval sou wees 3 want dit sien 3 verskillende woorde geskei deur spasies. En so het dan die skikking in hierdie geval, sou die eerste indeks / hello. die volgende een Dawid die volgende een Malan. Nie almal dadelik sien wat die verhouding tussen bevat SPASIES,  die skikking, en argc is? Ja. Ons kry in wat in 'n voorbeeld in args.c. Kom ons kyk of ons kan neem voordeel van die verhouding tussen die 2. Hier jy dalk vind dat die standaard in die toestel aansoek c lêers oop te maak is soms Emacs. Maar ons wil om te gaan met gedit, so wat jy kan doen, kan jy regs kliek op jou C lêer, gaan na Properties, Open met, en kies dan gedit Stel as verstek, en nou jou program moet oopmaak gedit in plaas van Emacs. Perfect. Ek het so hier is 'n program wat ek wil uit te druk elke command line argument. Dus, wat die gebruiker insette, ek wil in wese gee dit terug aan hulle op 'n nuwe lyn. So, wat is 'n struktuur wat ons kan gebruik om oor iets te itereer - iets wat jy waarskynlik in jou pset 1? As jy wil om te gaan deur middel van 'n sekere aantal van die dinge? >> [Student] For-lus. For-lus. Presies. So laat ons begin met die for-lus. Ons het vir int i = 0. Kom ons begin met 'n standaard inisialisering veranderlike. Ek gaan die voorwaarde vir 'n stel te verlaat en dan sê ek + +, gaan dinge daar te doen. Alles reg. So dink terug bevat SPASIES, indien bevat SPASIES is die lys van argumente oorgedra tot die program en argc is die getal van die argumente in die program, dan beteken dit dat argc is in wese die lengte van bevat SPASIES, reg, want daar gaan wees as baie argumente as die waarde van argc. So as ons wil itereer oor elke element in bevat SPASIES, ons gaan wil elke keer toegang tot die veranderlike bevat SPASIES by die gegewe indeks. Dit kan voorgestel word met dit, reg? Hierdie veranderlike hier verteenwoordig die spesifieke string in hierdie geval want dit is 'n string array - die spesifieke string op daardie gegewe indeks. Wat ons wil doen, in hierdie geval het ons wil om dit uit te druk, so kom ons sê printf. En nou bevat SPASIES is 'n string, sodat ons wil hê dat die plekhouer daar te vestig. Ons wil 'n nuwe lyn net om dit te laat goed lyk. So hier is ons het 'n for-lus. Ons het nie die toestand nie. , Sodat ek begin by 0, en dan elke keer as dit gaan om die gegewe string te druk op daardie betrokke indeks in die skikking. So wanneer wil ons om uit te druk van elemente in die skikking te stop? Wanneer ons klaar is, reg? Wanneer ons die einde van die skikking bereik het. So wil ons nie verby die lengte van die skikking te oorskry, en ons weet reeds ons nie nodig het om werklik aktief uit te vind wat die lengte van bevat SPASIES is want dit is aan ons gegee, en wat is dit? Argc. Presies. Daarom wil ons hierdie proses argc aantal kere wat om te doen. Ek is nie op die regte directory. Alles reg. Nou laat ons argumente. Geen foute, wat is 'n groot. So laat ons net hardloop argumente. Wat is dit gaan om terug te keer na ons? Dit is net gaan om dit terug te druk. "Jy ingevoer argumente in die program, ek gaan om dit terug te gee aan jou." So laat ons sê ons wil argumente dan sê Foo Bar. So hang dit dan druk dit terug aan ons. Alles reg? So daar is 'n voorbeeld van hoe jy kan gebruik argc en bevat SPASIES wetende dat argc verteenwoordig die lengte van bevat SPASIES. Maak seker dat jy nie ooit met skikkings toegang het buite die lengte van die skikking want C sal beslis op jou skree. Kry jy iets genoem 'n segmentering skuld, wat is nooit pret, basies sê jy probeer om iets te bekom wat nie bestaan ​​nie, behoort nie aan jou nie. So maak seker, en veral met die zero-indeksering, ons wil nie - Soos byvoorbeeld, as ons 'n verskeidenheid van lengte 4, dat array indeks 4 bestaan ​​nie omdat ons begin by 0 op nul indeks. Dit sal tweede natuur geword net soos vir loops wanneer ons begin by 0. So hou dit in gedagte. Jy nie wil hê om ooit toegang tot die indeks van 'n skikking wat buite jou bereik is. So ons kan nou sien hoe ons kan soort van toegang die command line argumente wat geslaag is. Maar as jy gesien het, die tou, die bevat SPASIES is eintlik 'n string array. So dit is eintlik nie 'n heelgetal nie, maar in die Caesar ons wil om te gaan met heelgetalle. Gelukkig is daar is 'n funksie vir ons geskep het, wat eintlik 'n string omskakel na 'n heelgetal. Ook hier is ons nie hier te doen met die toevoer van die gebruiker, waar ons waardeur hulle vir insette hier vir die sleutel, so ons kan eintlik nie reprompt en sê, "Ag, gee my 'n ander heelgetal, sê, as dit is nie geldig nie." Maar ons moet nog steeds om te kyk vir die korrekte gebruik. In die keiser het hulle slegs toegelaat om te slaag in 1 nommer, en so het hulle / keiser uit te voer en dan sal hulle vir jou gee om 'n aantal. So argc het 'n sekere aantal wees. Wat sou dit wees as hulle het om te slaag jy die / die keiser en dan 'n sleutel? Wat is argc? >> [Student] 2. >> Twee. Presies. So jy wil om seker te maak dat argc is 2. Anders sal jy basies weier om die program uit te voer. In die hoof dit is 'n funksie wat sê int main, so dan moet ons altyd in 'n goeie praktyk terugkeer 0 aan die einde van 'n suksesvolle program. So as, sê, hulle gee jou 3 command line argumente in plaas van 2 of gee jou 1, byvoorbeeld, dan wat jy doen is, jy wil om te kyk vir en dan terug 1 sê, nee, ek kan nie voortgaan met hierdie program. [Student] Daar kan nie 'n ruimte in jou teks. >> Verskoon my? [Student] Daar kan nie 'n ruimte in die teks wat jy probeer om te enkripteer. Ah! In terme van die teks wat ons probeer om te enkripteer, wat kom later wanneer ons dat die teks gee. So nou het ons is net te aanvaar as opdrag argumente die werklike getal, die werklike verskuiwing vir die Caesar encryption. [Student] Hoekom dink jy het 2 in teenstelling met net 1 argc? Daar is beslis 1 nommer. Reg. Die rede hoekom ons nodig het 2 vir argc in plaas van 1 is omdat wanneer jy 'n program en sê / keiser / of hallo. wat eintlik as 'n command line argument tel. So dan is dit vind reeds op 1 en so dan is ons die skryf van 1 ekstra. So jy is eintlik die skryf van 'n string in die command line argument. Wat jy wil doen, vir Caesar ons wil om te gaan met 'n heelgetal, sodat jy kan gebruik om hierdie atoi funksie. En basies, jy slaag dit in 'n tou en dan sal dit terugkeer jy 'n heelgetal terug of dit moontlik is dat die string te maak in 'n heelgetal. Nou onthou wanneer ons te doen het met printf of GetString, dinge soos dat, sluit ons die biblioteke wat spesifiek is aan ons. So aan die begin het ons begin met 'n hash tag standaard I / O, h, iets soos dit. Wel, atoi is nie binne een van daardie biblioteke, so wat ons hoef te doen, is ons het die regte biblioteek in te sluit vir wat. So terug te herinner aan Walk Through 1 waar ek die handleiding funksie bespreek. Jy tik man in jou terminale en dan gevolg deur die naam van 'n funksie. En dat 'n hele lys van die gebruik daarvan sal bring, maar so goed dit sal bring wat biblioteek wat behoort aan. So ek sal laat dit aan u die handleiding funksie met atoi te gebruik en uitvind watter biblioteek wat jy nodig het in te sluit om in staat wees om die atoi funksie te gebruik. So ons het die sleutel en nou het dit kom om die plain text, en so wat eintlik gaan om die toevoer van die gebruiker wees waar jy gevra word. Ons hanteer getint en GetFloat, en so in dieselfde trant ons gaan die hantering van GetString. Maar in hierdie geval het ons nie nodig het om dit te doen terwyl of terwyl loops om seker te maak. GetString sal beslis gee ons 'n string, en ons gaan te enkripteer wat die gebruiker gee ons. Sodat jy kan aanvaar dat al hierdie gebruiker ingevoer snare is korrek. Groot. So dan weer jy het die sleutel en sodra jy het die teks, nou wat se links is jy die skoonteks te versleutelen. Net om vinnig te dek die skoonteks is oor lingo, wat die gebruiker gee jou, en die kriptoteks is wat jy na hulle terugkeer. So snare, in staat wees om deur te gaan eintlik letter per brief want ons het elke letter te skuif, ons verstaan ​​dat die snare, as ons soort van skil terug die laag, ons sien dat hulle is net regtig 'n lys van karakters. Een kom na die ander. En so kan ons behandel stringe as skikkings want hulle is skikkings karakters. So sê jy het 'n string met die naam van teks, en binne daardie veranderlike teks gestoor word Dit is CS50. Dan teks indeks 0 'n hoofstad T, sou indeks 1 h, ens En dan met skikkings, in die argc voorbeeld in args.c, ons sien wat ons gehad het om oor 'n skikking te itereer en so ons moes itereer van i = 0 tot ek is minder as die lengte. So ons moet een of ander manier van die uitzoeken wat die lengte van die string is as ons gaan om meer as dit te itereer. Gelukkig weer, daar is 'n funksie daar vir ons, hoewel later in CS50 jy sal beslis in staat wees om te implementeer en maak jou eie funksie wat kan bereken die lengte van 'n string. Maar vir nou is ons gaan string lengte, so strlen te gebruik. Jy slaag in 'n tou, en dan sal dit gee jou 'n int wat verteenwoordig die lengte van jou string terug. Kom ons kyk na 'n voorbeeld van hoe ons dalk in staat wees om te itereer oor elke karakter in 'n string en iets te doen met dit. Wat ons wil doen is itereer oor elke karakter van die string, en wat ons wil doen, is ons druk elke karakter terug 1 deur 1 tensy ons iets langs dit. So laat ons begin met die for-lus. Int i = 0. Ons gaan om ruimte te laat vir die toestand. Ons wil om te itereer totdat ons aan die einde van die tou, reg? So dan watter funksie gee ons die lengte van die tou? [Onhoorbaar student reaksie] Dit is die lengte van die command line argumente. Maar vir 'n string wat ons wil 'n funksie te gebruik wat gee ons die lengte van die string. So dis string lengte. En so dan moet jy in 'n string om dit te slaag. Wat dit nodig het om te weet watter string wat dit nodig het om te bereken die lengte van. So dan in hierdie geval het ons te doen met 'n tou s. Groot. So dan wat ons wil doen, se printf laat. Nou, ons wil om te gaan met die karakters. Ons wil elke individuele karakter uit te druk. Wanneer jy wil uit te druk 'n float, sou jy gebruik om die plaatsaanduiding soos% f. Met 'n int jy sal% d gebruik. En so soortgelyk, met 'n karakter wat jy gebruik% c om te sê ek gaan die druk van 'n karakter wat binne-in 'n veranderlike gestoor. So ons het dit, en laat ons voeg 'n tydperk en 'n ruimte om dit te. Watter karakter gebruik ons? Ons gaan om te word deur gebruik te maak van watter karakter ons is van die tou. So dan moet ons gaan om te word deur gebruik te maak van iets wat met 'n tou, maar ons wil word toegang tot die bepaalde karakter. So as 'n string is net 'n skikking, dan hoe toegang ons elemente van skikkings? Ons het daardie vierkantige hakies, en dan het die indeks in daar. So het ons 'n vierkantige hakies aangedui. Ons indeks in hierdie geval kan ons net gebruik i. Presies. So hier is ons sê ons gaan die druk van 'n karakter, gevolg deur 'n punt en 'n spasie, en dat die karakter gaan die ith brief in ons string s. Ek gaan net dat te red. Okay. Nou gaan ek string lengte te voer. So ons het 'n string met die naam OMG, en nou is dit beklemtoon selfs meer. Net so, laat ons sê dat ons eintlik 'n string van die gebruiker te kry. Hoe kan ons dit doen? Voor, hoe het ons 'n int? Ons het gesê getint, reg? Maar dit is nie int, so laat GetString. Kom ons maak string lengte. Hier het ons het nie 'n spesifieke prompt. So ek weet nie. Ek gaan my naam hier te sit en so dan het ek een van daardie dinge kan doen waar Ek dra 'n woord vir elke brief of iets soos dit. Cool. So dis string lengte. So ons is terug na die keiser. Ons het 'n paar tools oor hoe ons oor 'n string itereer, hoe ons toegang tot elke element. So ons kan nou terug te kry tot die program. Soos ek voorheen genoem, in die ASCII-tabel, jou beste vriend, jy gaan die getalle wat geassosieer word met elke letter te sien. So hier sê ons skoonteks is ek duiselig! Dan elkeen van hierdie karakters is gaan 'n nommer en ASCII-waarde wat verband hou met dit te hê, selfs die afkappingsteken, selfs die ruimte, selfs die uitroepteken, sodat jy sal wil hê om dit in gedagte te hou. So sê ons sleutel wat die gebruiker ingesluit in die command line argument is 6. Dit beteken dat vir die eerste brief, wat ek, wat verteenwoordig word deur 73, jy wil om terug te keer na hulle watter letter is verteenwoordig deur die ASCII-waarde van 73 + 6. In hierdie geval sou wees 79. Nou het ons wil om te gaan na die volgende karakter. Sodat die volgende in die indeks 1 van die skoonteks die afkappingsteken sou wees. Maar onthou ons wil net die letters te versleutelen. Sodat ons wil hê om seker te maak dat die apostrof eintlik dieselfde bly, dat ons nie verander nie van 39 tot wat ook al 45 is. Ons wil dit as 'n toespraak te hou. So ons wil om te onthou om slegs die letters versleutelen want ons wil al die ander simbole om te bly onveranderd in ons program. Nog 'n ding wat ons wil hê, is om kapitalisasie te bewaar. So wanneer jy 'n hoofletter, moet dit bly soos 'n hoofletter. Kleinletters moet bly as kleinletters. So 'n paar nuttige funksies in staat wees om te gaan met net geheimschrift letters en hou die behoud van die kapitalisering van dinge is die isalpha, isupper, islower funksies. En so het dit is funksies wat u laat terugkeer 'n Boolese waarde. Basies, waar of vals is. Is dit 'n hoofletter? Is hierdie alfanumeriese? Is dit 'n brief, in wese. So hier is 3 voorbeelde van hoe jy wil hê dat die funksie gebruik. Basies, kan jy toets of die waarde aan u teruggestuur word deur daardie funksie is waar of vals gebaseer op daardie inset. Doen óf nie versleutelen iets of becijferen dit of maak seker dat dit is hoofletters, ens. [Student] Kan jy net verduidelik diegene wat 'n bietjie meer en hoe jy hulle gebruik? >> Ja, vir seker. So as ons terug kyk, hier het ons 'n kapitale ek, reg? Sodat ons weet dat ek gaan na O want ek + 6 is O. Maar ons wil om seker te maak dat O gaan wees 'n kapitale O. So basies, wat is 'n soort van die gaan ons insette te verander. So of dit hoofletters of nie sal soort verander die manier waarop ons dit hanteer. Daarom dan, as ons gebruik maak van die isupper funksie op daardie spesifieke indeks, so isupper ("ek"), wat vir ons ware terug, sodat ons weet dat dit die boonste. So dan op grond van dat, later sal ons gaan in 'n formule wat jy sal gebruik word om dinge te skuif in die keiser, so dan basies, daar gaan 'n effens ander formule as dit hoofletters eerder as onderkas. Sin maak? Ja. Geen sorge. Ek het 'n bietjie gepraat oor die byvoeg van 6 tot 'n brief, wat nie heeltemal sin maak behalwe wanneer ons soort van verstaan ​​wat hierdie karakters is soort van verwissel met heelgetalle. Wat ons doen is ons soort van gebruik implisiete giet. Ons gaan 'n bietjie later in beslissende waar jy 'n waarde en jy draai dit in 'n ander tipe as wat dit oorspronklik was. Maar met hierdie pset ons sal in staat wees om soort uitruilbaar gebruik karakters en hul ooreenstemmende heelgetal waardes. So indien jy dit eenvoudig omsluiten 'n karakter met net die enkele aanhalings, dan sal jy in staat wees om te werk met dit met heelgetalle, dit te hanteer as 'n heelgetal. So die hoofstad C tot 67. Kleinletters f betrekking tot 102. Weer, as jy wil om hierdie waardes te leer ken, kyk op jou ASCII tabel. So laat ons gaan in 'n paar voorbeelde van hoe jy dalk in staat wees om af te trek en voeg, hoe jy regtig met hierdie karakters kan eintlik werk, gebruik hulle uitruilbaar. Ek sê dat ASCIIMath is die toevoeging van 'n karakter te bereken tot 'n heelgetal en vertoon dan die gevolglike karakter sowel as die gevolglike ASCII-waarde. En so hier ek sê - we'll deal met hierdie gedeelte later - maar basies, ek sê dat die gebruiker moet loop ASCIIMath sê saam met 'n sleutel, en ek sê dat sleutel gaan om die nommer te wees wat ons gaan om hierdie karakter te voeg. So hier opmerk dat sedert ek eis 'n sleutel, want ek eis dat hulle gee my 1 ding, Ek wil net / asciimath. Te aanvaar en 'n sleutel. So ek gaan om te eis dat argc is gelyk aan 2. As dit is nie, dan gaan ek 1 om terug te keer en die program sal verlaat. So ek sê die sleutel gaan nie na die eerste command line argument wees, dit gaan om die tweede een te wees, en as jy hier sien, Ek gaan om dit te omskep in 'n heelgetal. Dan gaan ek 'n karakter te stel om te wees r. Let daarop dat die tipe van die veranderlike chromosoom eintlik 'n heelgetal is. Die manier wat ek is in staat om r te gebruik as 'n heelgetal is deur dit met hierdie aanhalingstekens te encasing. So terug na ons printf verklaring waar ons 'n plekhouer vir 'n karakter en dan 'n plekhouer vir 'n heelgetal, die karakter word verteenwoordig deur die chromosoom en die heelgetal is die sleutel. En so dan gaan ons in die resultaat voeg die 2 saam. So ons gaan te voeg r + wat die sleutel is, en dan gaan ons die resultaat van daardie te druk. So laat ons asciimath. Dit is up to date, so laat ons net hardloop asciimath. O, maar sien nie, beteken dit nie iets te doen, want ons het eintlik nie gee dit 'n sleutel. So wanneer dit pas teruggekeer 1, ons vernaamste funksie, dit pas teruggekeer terug na ons. So dan moet ons in 'n sleutel. Iemand gee my 'n nommer. >> [Student] 4. 4. Okay. So r deur 4 gaan gee ons v, wat ooreenstem met die ASCII-waarde van 118 toegeneem. So dan is dit soort van sin dat - Eintlik kan ek jou vra, wat dink jy die ASCII waarde van r is as r + 4 118? Dan ja, r is 114. So as jy kyk op die ASCII tabel dan seker genoeg, sal jy sien dat r word verteenwoordig deur 114. So nou dat ons weet dat ons heelgetalle kan byvoeg tot karakters, dit lyk redelik eenvoudig. Ons is net gaan om te itereer oor 'n string soos ons gesien het in 'n voorbeeld voor. Ons sal kyk of dit 'n brief. As dit is, dan sal ons skuif dit deur wat die sleutel is. Redelik eenvoudig, behalwe wanneer jy dit te hou, jy sien dat z, verteenwoordig deur 122, dan sou gee jou 'n ander karakter. Ons eintlik wil om te bly in ons alfabet, reg? Sodat ons nodig het om uit te vind die een of ander manier van die soort wikkel rond. Wanneer jy by Zed en wat jy wil te verhoog deur 'n sekere aantal, jy nie wil hê om te gaan na buite die ASCII alfabet; jy wil om te draai al die pad terug na A. Maar hou in gedagte jy nog steeds die behoud van die saak. So wetende dat letters kan nie 'simbole net soos simbole is nie van plan om so goed te verander. In die laaste pset jy beslis nie nodig gehad om, maar 'n opsie was om jou gulsig pset uit te voer deur gebruik te maak van die modulus funksie. Maar nou is ons eintlik gaan nodig modulus te gebruik, so laat ons net gaan oor dit 'n bietjie. Wese, wanneer jy x modulo y, wat gee jou die res van x gedeel deur y. Hier is 'n paar voorbeelde hier. Ons het 27% 15. Basies, wanneer jy aftrek 15 van 27 soveel keer as moontlik sonder om negatiewe dan kry jy 12 linker oor. So, dit is soort van soos in die wiskunde konteks, maar hoe ons kan eintlik gebruik van hierdie? Dit gaan nuttig te wees vir ons wrapover. Vir hierdie, laat ons net sê ek het jou gevra om te verdeel in 3 groepe. Soms doen jy in groepe en iets soos dit. Sê ek het gesê, "Ja, ek wil julle almal verdeel word in 3." Hoe kan jy dit doen? [Onhoorbaar student reaksie] Ja, presies. Aftel. Okay. Kom ons werklik doen dat. Doen wat jy wil om te begin? [Studente toe af] 1, 2, 3, 4. Maar onthou ... >> [Student] O, jammer. Dit is 'n baie goeie punt. Jy het gesê 4, maar ons eintlik wil hê jy 1 om te sê, want ons het net 3 groepe wil. Daarom dan, hoe - Nee, dit is 'n baie goeie voorbeeld, want dan hoe kan jy sê 1? Wat is die verhouding tussen 4 en 1? Wel, 4 mod 3 is 1. So as jy voortgaan, sal jy 2. So ons het 1, 2, 3, 1, 2. Weereens, jy eintlik die 5de persoon. Hoe weet jy 2 in plaas van 5 om te sê? Jy sê 5 mod 3 is 2. Ek wil om te sien hoeveel groepe van 3 bly oor, dan watter volgorde is ek En so dan as ons voortgegaan om langs die hele vertrek, dan sal ons sien dat ons eintlik is altyd die toepassing van die mod-funksie vir onsself soort tel. Dit is 'n soort van 'n tasbare voorbeeld van hoe jy kan gebruik modulo want ek is seker die meeste van ons het waarskynlik deur die proses waar ons moes af te tel. Enige vrae oor modulo? Dit sal baie belangrik om te verstaan ​​die konsepte van hierdie, so ek wil om seker te maak julle ouens verstaan. [Student] As daar niks oorbly nie, beteken dit gee jou die werklike getal? As een van die eerste 3 van hulle gedoen het nie, sou dit gegee het vir hulle wat hulle eintlik was, of sal dit hulle gegee het [onhoorbaar] >> Dis 'n goeie vraag. Wanneer daar niks oorbly vir die modulo - so sê jy het 6 mod 3 - wat gee eintlik jou terug 0. Ons sal praat oor dat 'n bietjie later. O ja, byvoorbeeld, die 3de persoon - 3 mod 3 is eintlik 0, maar sy het gesê 3. So dit is soort van soos 'n innerlike vangs, byvoorbeeld, soos okay, as die mod is dan 0 Ek gaan na die 3de persoon te wees. Maar ons sal kry in die soort van hoe ons kan hê om te gaan met wat 0 is later. So nou het ons een of ander manier 'n manier van die kartering van die Zed na die regte letter. So nou het ons weg deur hierdie voorbeelde, ons soort sien hoe die keiser kan werk. Jy sien die 2 alfabette en dan sien jy hulle verskuif. So kom ons probeer en druk dat in terme van die formule. Hierdie formule is eintlik wat aan jou gegee in die spec maar laat se soort van kyk deur wat elke veranderlike beteken. Ons eindresultaat gaan wees op die kriptoteks. So dit sê dat die met karakter van die kriptoteks gaan om ooreen te stem met karakter van die skoonteks. Dit maak sin omdat ons wil altyd langs hierdie dinge. So dit gaan die met karakter van die kriptoteks plus k, wat is die sleutel - wat sin maak - en dan het ons hierdie mod 26. Onthou terug toe ons die Zed ons wou nie te kry in die karakter, sodat ons wou dit te mod en die aard van die wrap rondom die alfabet. Na Zed jy wil gaan na 'n, b, c, d, totdat jy het die regte nommer. Dus weet ons dat Zed, indien + 6, gee ons f want na Zed kom 'n, b, c, d, e, f. So laat ons onthou dat ons weet vir seker dat Zed + 6 gaan gee ons f. In ASCII waardes, z 122 en f is 102. So ons het een of ander manier te vind om ons Caesar formule gee ons 102 nadat hy in 122. So as ons net hierdie formule toe te pas, die ('z' + 6)% 26, wat eintlik gee jou 24 omdat 122 + 6 128; 128% 26 gee jou 24 res. Maar dit beteken regtig nie dat f. Dit is beslis nie 102. Dit is ook nie die 6de letter in die alfabet. So natuurlik, ons moet een of ander manier van die opstel van dit 'n bietjie te hê. In terme van die gewone alfabet, ons weet dat z is die 26ste letter en f is die 6de. Maar ons is in rekenaar wetenskap, dus gaan ons na die indeks by 0. So dan in plaas van z synde die getal 26, ons gaan om te sê dit se nommer 25 omdat 'n 0. So laat ons nou hierdie formule toe te pas. Ons het z verteenwoordig deur 25 + 6, wat gee jou 31. En 31 mod 26 gee jou 5 as 'n res. Dit is ideaal omdat ons weet dat f die 5de letter in die alfabet. Maar dit is nog nie f, reg? Dit is nog nie 102. So dan vir hierdie pset, sal 'n uitdaging probeer om uit te vind die verhouding tussen die herleiding tussen hierdie ASCII waardes en die alfabetiese indeks. Wese, wat jy sal wil hê om dit te doen, wat jy wil om te begin met die ASCII-waardes, maar dan moet jy wil om een ​​of ander manier te vertaal in 'n alfabetiese indeks bereken dan watter letter dit behoort te wees - basies, wat sy alfabetiese indeks is van die cipher karakter - dan vertaal dit terug na die ASCII-waardes. So as jy sweep jou ASCII tabel, dan probeer en vind verhoudings tussen, sê, 102 en 5 of die 122 en 25. Ons het ons sleutel gekry het uit die opdrag lyn argumente, het ons verwerf die skoonteks, ons het dit enciphered. Nou al wat ons verlaat het om te doen is om te druk. Ons kan dit doen 'n paar verskillende maniere. Wat ons kan doen is eintlik druk as ons gaan saam. Soos ons itereer oor die karakters in die string, ons kon net eenvoudig druk dan wanneer ons dit bereken. Alternatiewelik, kan jy ook stoor dit in 'n skikking en 'n verskeidenheid van karakters en aan die einde oor daardie hele verskeidenheid itereer en druk dit uit. So jy het 'n paar opsies vir daardie. En onthou dat% c gaan na die plaatsaanduiding vir die druk van 'n karakter. So daar het ons keiser toekom, en nou is ons skuif op na Vigenere, wat is baie soortgelyk aan die keiser nie, maar net 'n bietjie meer kompleks. So in wese met Vigenere jy gaan om te word wat in 'n navraag. So in plaas van 'n nommer, jy gaan 'n string te hê, en so wat gaan om op te tree as jou navraag. Dan, soos gewoonlik, jy gaan 'n vinnige te kry vir 'n string van die gebruiker en dan omzetten en dan gee hulle die kriptoteks terug. So soos ek gesê het, dit is baie soortgelyk aan die keiser, behalwe in plaas van om te skuif deur 'n sekere aantal, die nommer is eintlik van plan om elke keer te verander van karakter te karakter. Dat die werklike getal te stel om te skuif, is dit verteenwoordig deur die sleutelbord letters. So as jy in 'n verskuiwing van 'n, byvoorbeeld, dan nie wat jou sal stem ooreen met 'n verskuiwing van 0. So is dit weer terug na die alfabetiese indeks. Wat sou nuttig wees as jy sien dat ons eintlik te doen het met 'n ASCII waardes sowel as die briewe, asook die alfabetiese indeks, miskien vind of maak jou eie ASCII tabel wat toon die alfabetiese indeks van 0 tot 25, 'n deur z, en die ASCII-waardes sodat jy kan soort van die verhouding en skets uit en probeer om 'n paar patrone. Net so, as jy verskuiwing by die bepaalde geval deur f - en dit is of onderkas of hoofletters f - dan sou dit ooreenstem met 5. Is ons goed so ver? Die formule vir Vigenere is 'n bietjie anders. Basies, sien jy dat dit is net soos Caesar, behalwe in plaas van net k ons ​​k indeks j. Let op dat ons nie met behulp van i want in wese, die lengte van die term is nie noodwendig die lengte van ons kriptoteks. Dit sal 'n bietjie duideliker wees wanneer ons 'n voorbeeld sien dat ek 'n bietjie later. Basies, as jy die program loop met 'n navraag van ohai, dan beteken dit dat elke keer ohai gaan jou skof. So afhangende op watter posisie jy in jou navraag, jy gaan jou sekere kriptoteks karakter deur daardie bedrag te skuif. Weer, net soos Caesar, ons wil hê om seker te maak dat ons die behoud van die kapitalisasie van die dinge wat en ons net versleutelen letters, nie karakters of spasies. So terug te kyk na die keiser op die funksies wat jy kan gebruik, die manier waarop jy besluit hoe om dinge te skuif, en toe te pas dat jou program hier. So laat se kaart dit uit. Ons het 'n skoonteks wat ons gekry het van die gebruiker uit GetString sê dit ... is CS50! Dan het ons 'n navraag van ohai. Die eerste 4 karakters is redelik eenvoudig. Ons weet dat T verskuif gaan word deur O, dan h verskuif gaan word deur h, i verskuif gaan word deur 'n. Hier kan jy sien dat 'n stel 0, so dan sal die einde waarde is eintlik net die dieselfde letter as voorheen. Dan s is verskuif deur i. Maar dan moet jy hierdie tydperke hier. Ons wil nie versleutelen dat, so dan is ons nie dit verander nie deur enigiets en net die druk van die tydperk onveranderd. [Student] Ek verstaan ​​nie hoe jy weet dat dit geskuif word deur - Waar het u> O, jammer. Hier aan die bokant jy sien dat die command line argument ohai hier, dit gaan om die navraag te wees. En so basies, jy fietsry oor die karakters in die navraag. [Student] So o gaan word verskuif dieselfde - So o stem ooreen met 'n sekere aantal van die alfabet. [Student] Reg. Maar waar het jy die CS50 deel van? Oh. Dit is in GetString waar jy soos, "Gee my 'n string enkodeer nie." [Student] Hulle gaan gee jou 'n argument te skuif deur en dan sal jy vra vir jou eerste string. >> Ja. En toe hulle die program uitvoer, gaan hulle die sleutelwoord in te sluit wanneer hulle in hul command line argumente voer dit uit. Dan wanneer jy het bewys dat hulle eintlik aan julle gegee het 1 en nie meer nie, nie minder nie, dan is jy gaan om hulle te vra vir 'n string, sê: "Gee my 'n string." So dit is waar in hierdie geval het hulle gegee het julle dit ... is CS50! So dan is jy gaan om dit te gebruik en ohai gebruik en itereer oor. Let op dat ons hier oorgeslaan oor die versleutelen van die tydperke, maar in terme van ons posisie vir ohai, die volgende een wat ons gebruik het. In hierdie geval is dit 'n bietjie moeiliker om te sien, want dit is 4, so laat ons voortgaan om 'n bietjie. Net bly saam met my hier. Dan het ons i en s, wat dan vertaal deur o en h onderskeidelik. Dan het ons 'n ruimte, en so dan weet ons dat ons nie gaan om die spasies in te versleutelen. Maar let op dat in plaas van gaan na 'n reg hier in hierdie plek, ons versleutelen deur 'n - ek weet nie of jy kan sien dat - reg hier. Sodat dit nie is soos wat jy eintlik voorafbepaalde, sê, o kom hier, h hier gaan, 'n hier gaan, ek gaan hier, o, h, 'n, i, o, h, 'n, i. Jy dit nie doen nie. Jy moet net verskuif jou posisie in die sleutelwoord wanneer jy weet dat jy eintlik gaan word versleutelen van 'n werklike brief. Is daardie soort van sin maak? Okay. Sodat net 'n paar herinneringe. Jy wil om seker te maak dat jy net bevorder na die volgende brief in jou navraag indien die karakter in jou skoonteks is 'n brief. So sê ons is op die o. Ons sien dat die volgende karakter, die i-indeks van die skoonteks, is 'n getal, byvoorbeeld. Dan sal ons bevorder nie j, die indeks vir ons navraag, totdat ons bereik 'n ander brief. Weereens, jy wil ook om seker te maak dat jy wraparound aan die begin van die term wanneer jy aan die einde van dit. As jy hier sien ons op i, die volgende een te wees o. So jy wil 'n manier om uit te vind van die staat om wraparound aan die begin van jou navraag elke keer dat jy die einde bereik. En dit weer doen, watter soort van die operateur is nuttig in daardie geval vir die wikkel rond? Soos in die aftel voorbeeld. [Student] Die procent teken. >> Ja, die persentasie teken, wat modulo. So modulo hier handig te pas sal kom wanneer jy wil om te draai oor die indeks in jou ohai. En net 'n vinnige wenk: Probeer om te dink van die wikkel oor die term 'n bietjie soos die aftel, waar indien daar is 3 groepe, die 4de persoon, hulle getal wat hulle gesê het, was 4 mod 3, wat 1. So probeer en dink dat die manier van dit. Soos jy gesien het in die formule, waar jy ci en dan pi, maar dan kj, jy wil om seker te maak dat jy hou van daardie. Jy nie nodig het om dit te noem i, het jy nie nodig het om dit te noem j, maar jy wil om seker te maak dat jy hou van die posisie wat jy in jou skoonteks sowel as die posisie wat jy in jou navraag want dit is nie noodwendig dieselfde te wees. Nie net die term - dit kan 'n heeltemal verskillende lengte as jou skoonteks. Ook jou skoonteks, daar is getalle en karakters, so dit gaan nie perfek ooreenstem saam. Ja. [Student] Is daar 'n funksie om die saak te verander? Kan jy 'n hoofletter A? >> Ja, daar is beslis. Jy kan check out - ek glo dit is toupper, alle 1 woord. Maar wanneer jy probeer om dinge te becijferen en die teks te bewaar, dit is die beste basies afsonderlike gevalle te hê. As dit is 'n hoofletter, dan kan jy wil om te skuif deur hierdie want in jou formule, wanneer jy terug kyk hoe ons 'n soort van go afwisselend tussen die ASCII manier van die getalle en die werklike alfabetiese indeks, ons wil hê om seker te maak daar gaan 'n soort van die patroon wat jy gaan om te gebruik. Nog 'n nota op die patroon, eintlik. Jy gaan om te beslis wat handel met getalle. Probeer om nie magic nommers te gebruik, wat is 'n voorbeeld van die styl. So sê jy wil elke keer verskuiwing iets deur wil - Okay, so wenk, 'n ander spoiler is wanneer jy gaan om te word verskuif iets deur 'n sekere bedrag, probeer om nie voor te stel deur 'n werklike getal maar eerder probeer en kyk of jy kan die ASCII-waarde, wat soort van meer sin maak. 'N ander noot: Omdat ons te doen het met formules, selfs al sal jou TF soort van weet watter patroon wat jy kan gebruik word, die beste om te verduidelik die logika, soos in jou kommentaar soort, "Ek is die gebruik van hierdie patroon, want ..." en soort van die patroon te verduidelik bondig in jou kommentaar. [Dit was walkthrough 2] As daar nie enige ander vrae, dan sal ek net hier bly vir 'n bietjie. Sterkte met jou pset 2: Crypto en dankie vir die komende. [Student] Dankie. >> Dankie. [Media Offline intro]