[Powered by Google Translate] [Návod - Problém Set 2]
[Zamyla Chan - Harvard University]
[To je CS50. CS50.TV]
Dobrá. Ahoj, všichni, a vítejte na Walkthrough 2.
Za prvé, chci ti pogratulovat pro dokončovací PSet 1.
Vím, že by to mohlo být trochu obtížné pro některé z vás,
mohla být vaše první počítačový program, který jsi napsal,
ale jen na paměti, že na konci tohoto, když se podíváte zpět na konci semestru,
budete vypadat na PSet 1 a řekneš: "Hej, jsem mohl udělat, že za 5 minut."
Takže vím, a věřím, že na konci tohoto, budete určitě najdete PSet 1 docela jednoduché.
Ale teď je to obrovský úspěch, a gratuluji k získání práce.
Nyní, i krátká poznámka, než se dostaneme do masa návodu.
Já jen chci, aby se rychle na vědomí, že jsem někdy nebude mít dostatek času
během návody projít každý způsob, jak dělat problému sadu
a spíše jen možná soustředit na 1 nebo 2 druhů implementací,
způsoby, které byste mohli udělat.
Ale to neznamená, že jste zakázáno dělat to jinak.
Tam jsou často, jako u počítačové vědy, četné způsoby, jak dělat věci,
a tak rozhodně neváhejte použít jiný typ řešení, než jsem mohla prezentovat.
[Pset 2: Crypto - Zamyla Chan - zamyla@cs50.net]
[Pset2 - 0. Oddíl otázek - 1. Caesar - 2. Vigenere]
Dobrá. Takže problém nastavit 2: Crypto je legrace jeden.
Opět, s každým PSet začnete s částí otázek
že se to provádí ve svých oddílech s účelově výuky kolegy.
Nebudeme chodit přes tyto přes návodu,
ale určitě vám pomohou dokončit PSet.
Takže první část problému souboru je Caesar.
A tak se v Caesar někdo projde vám klíč s integer,
a budete šifrovat řetězec textu, které poskytují vám
a dát je zpět šifrované věc.
Pokud někdo sledoval, A Christmas Story, je tu příklad, že.
Pak druhá část problému sady je Vigenere,
který je více pokročilý šifrovací techniky.
A tak budeme zašifrovat nějaký text,
s výjimkou místo toho se jen jedním celé číslo, my vlastně bude enkódovat
s klíčovým slovem, že uživatel bude poskytovat nás.
Dobře, takže první nástroj v panelu nástrojů je dnes skutečně bude aktualizace zařízení.
Na diskusní vývěsky bychom vidět věci jako, "Proč ne tuto práci?"
"Proč ne Pošlete 50 práci?"
a často řešení je ve skutečnosti jen aktualizovat svůj přístroj.
A tak pokud jste právě běží v okně terminálu ve vašem spotřebiče sudo yum-y -
to vlajka říká ano, aktualizujte všechno - aktualizace,
pak se váš spotřebič bude aktualizovat, pokud nebylo třeba.
A to není na škodu, když jste již na nejnovější verzi spotřebiče.
Pak to bude jen říct, žádné nové aktualizace k dispozici a můžete pokračovat v práci dál.
Ale to je dobré provést ještě při každém otevření spotřebiče
protože jsme stále hodně -
někdy, když jsme přišli do brouka - upevňovací ji do přístroje.
Takže se ujistěte, že máte nejnovější verzi spotřebiče
a spustit, že aktualizaci tam.
Dobrá. Takže od té doby máme co do činění s písmeny a mění, šifrováním věci,
budeme opravdu chtít, aby se stal nejlepší přátelé s naší ASCII tabulky.
Tam jsou četné ty on-line, pokud zjistíte, že. Možná dokonce vytvořit svůj vlastní.
V podstatě, s každým dopisem a každé číslo a každý charakter
je číslo s nimi,
, a tak je dobré, aby jejich hodnoty ASCII vedle skutečného dopisu.
To bude určitě pomůže v problému sadě.
Jedna věc, která mi opravdu pomohlo v tomto problému souboru byl skutečně vytisknout,
a jak jsem se procházel, bych skutečně kreslit na to,
psát, "Pokud to má jít do tam, a pak ..."
Druh čerpat na něj a označit ji, stanou nejlepšími přáteli s Vaší ASCII tabulky.
Pak máme ještě několik dalších nástrojů, které máme k dispozici.
Tentokrát místo skutečně by uživateli zobrazil výzvu pro všechny jejich vstupu
budeme dělat kombinaci.
Budeme výzvu je pro nějaký vstup,
ale my jsme také bude používat jen argumenty příkazového řádku.
Takže když běží svůj program, obvykle říkáte. / Hello, například,
pokud váš program byl hello.c.
Ale tentokrát ne jen říkat, že mohou dát slova, argumenty poté.
A tak budeme používat, co se jim předat k nám jako jejich vstup také,
tak dojemné, než jen výzvou pro celé číslo, ale také pomocí argumentů příkazové řádky.
A pak půjdeme do polí a řetězců, které budeme používat mnoho také.
Zde je jen příklad 1 mini ASCII tabulky.
Jak jsem již řekl, každý dopis odpovídá počtu,
a tak se seznámit s tím. To se bude hodit.
A později, když jsme začít dělat nějaké ASCIIMath zabývající se čísly -
sčítání, odčítání je - pak určitě dobré odkazovat se na tento graf.
Takže tady je příklad kódu Caesar - něco, co jste možná hráli s.
Je to jen kola. V podstatě je vnější abecedy a pak je vnitřní abeceda.
Takže tady je příklad kódu Caesar, ale s klíčem od 0.
V podstatě, je zarovnán s, B je sladěna s B, celou cestu až do Z.
Ale pak, že jsme chtěli klíč 3, například.
Pak bychom otočit vnitřní kolo tak, aby se vyrovnává s D, atd.
A tak je to v podstatě to, co budeme dělat.
Nemáme kola, ale to, co budeme dělat, je, aby náš program
druh posunout abecedu spolu s námi určitou čísel.
Tak jak jsem řekl dříve, budeme se zabývat argumenty příkazového řádku
, jakož i získání celé číslo.
Takže tak, že uživatel bude spusťte Caesar programu je říká. / Caesar
a zadáním čísla za to.
A toto číslo představuje klíč, řazení,
kolikrát budete se otáčením vnitřní kolo vašeho kódu Caesar.
A tak vidíte zde příklad.
Pokud jsme vstoupili do písmen od A do L na našem šifrou Caesar,
pak by vstup D bodem O, protože to je každý dopis posunula 3 krát,
stejně jako na příklad kola, které jsem vám ukázal.
Takže, pokud jste zadali, například, to je CS50!
pak by také přesunout všechna písmena.
A to je důležitá věc, jak Caesar a Vigenère
je to, že budeme přeskočit nějaké non-dopisy.
Takže žádné mezery, znaky, atd., čísla, budeme držet je stejný.
Jsme teprve ve chvíli, posunout písmena v tomto případě.
Takže jak vidíte na kola, máme pouze písmena máme k dispozici,
takže jsme jen chcete posunout písmena a šifrování dopisy.
Takže první věc dělat, jste viděli, že využití pro Caesara v problému nastavení 2
je spustit Caesara a zadejte číslo, pokud jej spustíte v terminálu.
Takže to, co potřebujete udělat, je nějak dostat, že klíč a přístup.
A tak chceme nějak vidět to to bude druhý argument příkazového řádku.
První z nich bude. / Caesar, a příští bude číslo klíče.
Takže než jsme měli int main (void) a proveďte naše C programy.
Budeme Sloupněte vrstvu trochu
a skutečně vidět, že místo toho, aby předávání v prázdnu na naši hlavní funkcí
jsme vlastně zabývá 2 parametry.
Máme int argc názvem a pak pole řetězců nazývá argv.
Takže argc je celé číslo,
a představuje počet argumentů předaných do svého programu.
A pak argv je vlastně seznam předaných argumentů.
Všechny argumenty jsou řetězce, a tak argv představuje pole, seznam, řetězců.
Pojďme se bavit o matice trochu.
Pole jsou v podstatě nová datová struktura.
Máme ints, jsme se zdvojnásobí, máme řetězce a teď máme pole.
Pole jsou datové struktury, které mohou obsahovat více hodnot stejného typu,
Takže v podstatě, seznam, co typ chcete.
V podstatě, pokud jste chtěli seznam celých čísel vše v 1 proměnné,
pak byste vytvořit novou proměnnou, která byla z pole typu int.
Takže pole jsou nulové indexované, což znamená, že první prvek pole je na indexu 0.
Pokud je pole délky 4, jako v tomto příkladu, pak se vaše poslední prvek bude na indexu 3,
který je 4-1.
Takže chcete-li vytvořit pole, byste něco takového.
Řekněme, že jste chtěli dvojí pole.
To platí pro všechny typy datového typu, ačkoli.
Takže říci, chcete dvojí pole. Řekněme, že chcete nazývat schránky.
Stejně jako byste inicializovat jiný dvojníka,
byste řekl double a pak jméno, ale tentokrát jsme dali hranaté závorky,
i pak množství se bude délka pole.
Poznamenejme, že v poli se nemůže nikdy měnit délku,
takže vždy budete mít definovat a zvolit, kolik políček,
kolik hodnot vaše pole bude držet.
Takže nastavit různé hodnoty ve vašem poli, budete používat tento následující syntaxi,
jak vidíte na snímku.
Máte schránka index 0 bude nastavena na 1,2,
schránky index 1 sada na 2,4, atd.
Takže teď, že jsme přezkoumat pole trochu, pojďme zpět k argc a argv.
Víme, že argv je nyní pole řetězců.
Takže když uživatel prochází - říkají, že používáte program -
říkají. / hello David Malan,
Co bude program dělat pro vás již skutečně přijít s tím, co argc a argv je.
Takže si nemusíte dělat starosti, že.
Argc v tomto případě by byla 3, protože to vidí 3 různé slov oddělených mezerami.
A tak pak pole v tomto případě by první index. / Ahoj,
příští David, příští Malan.
Má někdo vidět hned, jaký je vztah mezi argv,
pole, a argc je?
Jo. Dostaneme se do toho v příkladu v args.c.
Pojďme se podívat, jestli se nám podaří využít vztahu mezi 2.
Zde můžete zjistit, že v přístroji výchozí aplikace
na Otevřít. soubory je někdy Emacs.
Ale chceme jednat s gedit, takže to, co můžete udělat, je můžete kliknout pravým tlačítkem na soubor C,
přejít na Vlastnosti, Otevřít, a pak zvolte gedit, Nastavit jako výchozí,
a nyní váš program by měl otevřít v gedit místo Emacs.
Perfect.
Tak tady mám program, který chci vytisknout každý argument příkazového řádku.
Takže bez ohledu na uživatelské vstupy, chci hlavně vrátit zpět k nim na nový řádek.
Takže to, co je struktura, která můžeme použít k iteraci něco -
něco, co jste pravděpodobně zvyklí ve své PSet 1?
Pokud chcete projít nastaveném počtu věcí? >> [Student] Pro smyčky.
Pro smyčky. Přesně tak. Takže začněme s tím, pro smyčce.
Máme pro int i = 0. Pojďme začít s standardní inicializace proměnné.
Chystám se opustit podmínku pro soubor a pak říct, že jsem + +, bude dělat věci tam.
Dobrá.
Tak vzpomínal na argv, pokud argv je seznam argumentů předaných do programu
a argc je počet argumentů v programu,
pak to znamená, že je v podstatě argc délka argv, doprava,
protože se bude co nejvíce argumentů jako hodnotu argc.
Takže pokud chceme iteraci každý element v argv,
budeme chtít pokaždé přístup k proměnné v argv v daném indexu.
To může být reprezentován s tím, že jo?
Tato proměnná zde představuje určitý řetězec v tomto případě
protože je to string array - zejména řetězec v danou indexu.
Co chceme dělat, v tomto případě chceme vytisknout, takže řekněme printf.
A teď argv je řetězec, tak chceme, aby to symbol tam.
Chceme nový řádek jen, aby to vypadalo dobře.
Takže tady máme pro smyčku. Nemáme stav ještě.
Tak jsem začíná na 0, a pak pokaždé, když to bude tisknout daný řetězec
v tomto konkrétním indexu v poli.
Takže když chceme přestat tisknout z prvků v poli?
Když jsme hotovi, ne? Když jsme došli na konec pole.
Takže nechceme překročit kolem délka pole,
a my už víme, že to není nutné, aby skutečně aktivně zjistit, co délka argv je
protože je to stejně na nás, a co je to? Argc. Přesně tak.
Takže chceme dělat tento proces argc několikrát.
Nejsem v pravém adresáři.
Dobrá.
Nyní pojďme udělat args. Žádné chyby, což je skvělé.
Takže pojďme stačí spustit ARGUMENTY.
Co se to bude vracet k nám? Je to jen tak vytisknout ji zpět.
"Ty vloženy ARGUMENTY do programu, já dám ji zpět k vám."
Takže řekněme, že chceme říci ARGUMENTY pak foo bar.
Takže pak se vytiskne ji zpět k nám. Všechno v pořádku?
Takže tam je příkladem toho, jak lze použít argc a argv
vědomí, že argc představuje délku argv.
Ujistěte se, že jste to nikdy s polí přístupem jedna za délku pole
protože C určitě křičet na vás.
Získáte něco jako segmentation fault,
který není nikdy legrace, v podstatě říká, že se snažíte o přístup něco
že neexistuje, nepatří vám.
Takže se ujistěte, a to zejména s nulovou indexování, nechceme, aby -
Jako například, když se mají řadu délky 4,
že index pole 4 neexistuje, protože začínáme na 0, v nulového indexu.
To se stane druhou přirozeností, stejně jako pro vedení, když začneme na 0.
Takže jen na to myslet.
Nechcete, aby někdy přístup index pole, která je mimo váš dosah.
Takže můžeme vidět nyní, jak můžeme druh přístupu
argumenty příkazového řádku, které jsou předány palců
Ale jak jsi viděl řetězec, argv je vlastně řetězec pole.
Takže to vlastně není číslo ještě, ale Caesar chceme zabývat s celými čísly.
Naštěstí, tam je funkce vytvořená pro nás, že může skutečně převést řetězec na celé číslo.
Také tady se nejedná o uživatelského vstupu, kde jsme vybídnout je,
pro vstup zde pro klíč, takže nemůžeme vlastně reprompt a říct,
"Ach, dej mi další celé číslo, tedy pokud to není platné."
Ale my stále potřebujeme zkontrolovat správné použití.
Caesar jsou povoleny pouze projít v 1 řadě,
a proto mají spustit. / Caesar a pak vám dát číslo.
Takže argc musí být určité množství.
Jaké číslo by to mělo být, pokud mají projít Vám. / Caesar a pak klíč?
Co je argc? >> [Student] 2. Dva >>. Přesně tak.
Takže chcete, aby se ujistil, že argc je 2.
Jinak jste v podstatě odmítají spustit program.
V hlavní, že je to funkce, která říká, že int main,
takže pak jsme vždy v dobrém 0 praxi návratu na konci úspěšného programu.
Takže pokud, řekněme, že vám 3 argumenty příkazového řádku místo 2
nebo vám 1, například, pak to, co budete dělat, je budete chtít zkontrolovat, že
a pak se vrátit 1 říká, ne, nemohu pokračovat s tímto programem.
[Student] Nemůže být místa v textu. >> Promiňte?
[Student] Nemůže být prostor v textu, který se snažíte šifrování.
Ah!
Pokud jde o text, který se snažíme šifrování, které skutečně přijde později
když nám tento text.
Takže teď jsme jen přijímat jako řídicí argumenty skutečný počet,
skutečný posun pro šifrování Caesar.
[Student] Proč potřebujete 2 na rozdíl od pouhých 1 argc? Tam je určitě 1 číslo.
Právo. Důvodem, proč potřebujeme 2 pro argc namísto 1
je, že při spuštění programu a říkat. / caesar nebo. / hello,
skutečně počítá jako argument příkazového řádku.
Takže, že už zabírá 1, a tak pak jsme zadáním 1 přistýlka.
Takže jste vlastně zadání řetězec v argumentu příkazového řádku.
Co chcete udělat, pro Caesara chceme zabývat celé číslo,
takže můžete použít tuto funkci atoi.
A v podstatě, předáte jej v řetězci, a pak se vrátí zpět celé číslo
pokud je to možné, aby se tento řetězec na celé číslo.
Nyní si vzpomenout, kdy máme co do činění s printf nebo GetString, podobné věci,
zahrneme knihovny, které jsou specifické pro nás.
Takže na začátku jsme začít s hash tagem standardní I / O,. H, něco takového.
No, atoi není v jednom z těchto knihoven,
takže to, co musíme udělat, je, že jsme o právo knihovnu za to.
Takže připomenout zpět na Walkthrough 1, kde jsem se jednalo o ruční funkci.
Zadáte muže ve vašem terminálu a pak následuje název funkce.
A tak, aby přinese až celý seznam jeho použití,
ale stejně to bude vychovávat, které knihovna, která patří.
Tak jsem nechám na vás použít manuální funkci atoi
a zjistit, ve které knihovně je třeba zahrnout, aby mohli používat atoi funkci.
Takže máme klíč a teď to přijde k získání prostý text,
a tak, aby skutečně bude vstup uživatele, kde se výzva.
Jsme se zabývali GetInt a GetFloat, a tak ve stejném duchu
budeme jednat s GetString.
Ale v tomto případě nepotřebujeme dělat žádné dělat, zatímco nebo while pro kontrolu.
GetString určitě nám řetězec,
a budeme šifrovat, co uživatel zadá nás.
Takže si můžete předpokládat, že všechny z těchto řetězců uživatelských zadaných jsou správné.
Great.
Takže jakmile máte klíč, a jakmile máte text,
Nyní to, co zbylo, je nutné zašifrovat holý text.
Jen rychle pokrýt více než žargon, holý text je to, co uživatel zadá vám,
a ciphertext je to, co se k nim vracet.
Takže řetězce, aby mohli projít skutečně dopisu dopisem
protože musíme posunout každý dopis,
Chápeme, že řetězce, pokud jsme trochu kůry zadní vrstvy,
vidíme, že jsou opravdu jen seznam znaků.
Jeden přichází po druhé.
A tak můžeme léčit řetězce jako pole, protože jsou pole znaků.
Takže říci, že máte řetězec s názvem text,
av rámci této proměnné text je uložen To je CS50.
Pak textu na indexu 0 by být velké T, by index 1 je h, atd.
A potom s polem, v argc například v args.c,
jsme viděli, že jsme museli iteraci pole
a tak jsme museli přecházet od i = 0 až do i je menší než délka.
Takže potřebujeme nějaký způsob, jak přijít na to, jaká je délka našeho řetězce je
pokud budeme iterovat přes to.
Naštěstí znovu, tam je funkce tam pro nás, i když později v CS50
budete určitě schopni realizovat a vyrobit si vlastní funkci
které mohou vypočítat délku řetězce.
Ale pro teď budeme používat délku řetězce, takže strlen.
Předáte v řetězci, a pak se vrátí vám int představující délku vašeho řetězce.
Pojďme se podívat na příklad, jak bychom mohli být schopni iteraci každý znak v řetězci
a udělat něco s tím.
To, co chci udělat, je iteraci každý znak řetězce,
a to, co chceme udělat, je, že jsme tisk zpět každý znak 1 od 1
kromě přidáme něco vedle ní.
Takže začněme s tím, pro smyčce. Int i = 0.
Budeme ponechat prostor pro stav.
Chceme opakovat, než se dostaneme na konec řetězce, ne?
Tak co funkce nám dává délku řetězce?
[Neslyšitelné Student odpověď]
To je délka argumentů příkazového řádku.
Ale pro řetězec chceme používat funkce, které nám dává délku řetězce.
Tak to je délka řetězce.
A pak se budete muset projít v řetězci k ní.
Je třeba vědět, co řetězec je potřeba vypočítat délku.
Takže v tomto případě máme co do činění s string s.
Great.
Takže to, co chceme dělat, pojďme printf.
Nyní, chceme jednat s postavami. Chceme vytisknout každý individuální charakter.
Pokud chcete, aby vytisknout float, měli byste použít zástupný symbol jako% f.
S int, měli byste použít% d.
A tak podobně, s charakterem použít% c říct, že jsem bude tisk znaku
, který je uložen uvnitř proměnné.
Takže máme tohle, a dodejme období a prostor k němu.
Znak, který jsme používáte?
Budeme používat bez ohledu na charakter jsme na řetězce.
Takže budeme používat něco s řetězci,
ale chceme, aby se přístup k určité znak tam.
Takže pokud řetězec je jen pole, tak jak máme přistupovat prvky polí?
Máme ty hranaté závorky, a pak jsme dali index tam.
Takže máme hranatých závorek. Naše index v tomto případě stačí používat i. Přesně tak.
Takže tady říkáme my bude tisknout znak následovaný tečkou a mezerou,
a tento znak bude i-tý dopis v našem řetězce s.
Já jsem prostě jít tou výjimkou, že. Dobře.
Teď budu běžet délku řetězce.
Takže jsme měli řetězec s názvem OMG, a teď je to ještě více zdůraznil.
Podobně, řekněme, že skutečně chtějí dostat řetězec od uživatele.
Jak můžeme udělat?
Před, jak se dostaneme int?
Řekli jsme, že GetInt, že jo? Ale to není int, tak se pojďme GetString.
Pojďme udělat délku řetězce. Zde jsme nezadali konkrétní výzvy.
Tak já nevím.
Chystám se dát své jméno sem, a tak pak to můžu dělat jednu z těch věcí
kde jsem přiřadit slovo pro každé písmeno nebo něco takového. Cool.
Tak to je délka řetězce.
Takže jsme zpátky k Caesarovi.
Máme několik nástrojů, jak bychom iteraci řetězec,
jak jsme přístup každého jednotlivého prvku.
Takže teď se můžeme dostat zpět do programu.
Jak jsem již zmínil dříve, v ASCII tabulce, váš nejlepší přítel,
budete vidět čísla, které jsou spojeny s každým písmenem.
Tak tady že naše holý je, že jsem závrať!
Pak každý z těchto znaků bude mít číslo a ASCII hodnotu s ním spojené,
i apostrof, dokonce i prostor, i vykřičník,
takže budete chtít mít na paměti.
Takže říci, náš klíč, který uživatel zahrnuty do jejich argument příkazového řádku je 6.
To znamená, že na první písmeno, které je I, která je reprezentována 73,
Chcete-li se vrátit k nim bez ohledu na písmeno je reprezentováno ASCII hodnotou 73 + 6.
V tomto případě, že by bylo 79.
Teď chceme jít na další znak.
Takže další v indexu 1 holého textu bude apostrof.
Ale pamatujte si, my jen chceme zašifrovat dopisy.
Takže chceme, aby se ujistil, že apostrof skutečně zůstává stejná,
že se nemění od 39 do čehokoli 45 je.
Chceme, aby to jako apostrof.
Takže chceme pamatovat pouze zašifrovat písmena
proto, že chceme všechny ostatní symboly se nezmění v našem programu.
Další věc, která chceme, je zachovat písmen.
Takže když máte velké písmeno, mělo by zůstat jako velká.
Lowercasuje by měla zůstat jako malá písmena.
Takže některé užitečné funkce, které byly schopny se vyrovnat pouze s šifrováním dopisy
a udržet zachování kapitalizaci věcí
je isalpha, isupper, islower funkce.
A tak to jsou funkce, které vracejí vám booleovskou hodnotu.
V podstatě, true nebo false. Je to velká? Je to alfanumerický?
Je to dopis, v podstatě.
Takže zde jsou 3 příklady, jak byste použít tuto funkci.
V podstatě, můžete otestovat, zda hodnota vrácená pro Vás tuto funkci je pravdivé nebo nepravdivé
na základě tohoto vstupu.
Buď nemají zašifrovat něco nebo šifrovaných, nebo se ujistěte, že je to velká, atd.
[Student] Mohl bys vysvětlit, ty trochu víc a jak je používat? Jo >>, pro jistotu.
Takže když se podíváme zpátky, tady máme kapitál I, P?
Takže víme, že jsem dostal O, protože jsem + 6 je O.
Ale my chceme, aby se ujistil, že O bude kapitál O.
Takže v podstatě, že je tak trochu změní naše vstup.
Takže ať už je to velká, nebo ne vůle druh změnit tak, že jsme jí zabývat.
Takže pokud budeme používat isupper funkce na daném indexu,
tak isupper ("I"), která vrátí pro nás skutečné, takže víme, že je to horní.
Takže na základě toho, později půjdeme do vzorce
že budete používat k posunu věci Caesar,
takže pak v podstatě, že to bude mírně lišit vzorec, pokud je to velká
jak protichůdný na malá písmena. Smysl?
Jo. Žádné starosti.
Mluvil jsem trochu o přidání 6 na dopis, který není úplně smysl
kromě případů, kdy jsme trochu pochopili, že tyto znaky
jsou trochu zaměnitelné s celými čísly.
Co děláme je, že jsme způsob použití implicitní odlitku.
Půjdeme do licí trochu později, kde budete mít hodnotu a dáte ho do jiného typu
než byl původně.
Ale s tímto PSet budeme moci trochu zaměnitelně používají znaky
a jejich odpovídající celočíselné hodnoty.
Takže pokud si prostě obalit postavu jen s apostrofy,
pak budete moci pracovat s ním s celými čísly, vyrovnat se s ní jako celé číslo.
Takže kapitál C se vztahuje k 67. Malá f se týká 102.
Opět platí, že pokud chcete znát tyto hodnoty, podívejte se na ASCII tabulky.
Tak pojďme do některých příkladů, jak byste mohli být schopni odečíst a přidat,
jak můžete vlastně opravdu pracovat s těmito znaky, používat zaměnitelně.
Já říkám, že ASCIIMath bude výpočet přidání znaku na celé číslo
a potom zobrazí výsledný charakter, stejně jako výsledné ASCII hodnotu.
A tak tady říkám - Dáme se zabývají touto částí později -
ale v podstatě, já jsem řekl, že uživatel by měl říci, běžet ASCIIMath spolu s klíčem,
a já říkám, že ten klíč bude číslo
s nimiž budeme přidávat tento znak.
Tak tady si všimnout, že od té doby jsem náročný klíč,
protože jsem požadoval, aby Dáváš mi 1 věc,
Chci jen přijmout. / Asciimath a klíč.
Takže budu požadovat, aby argc je roven 2.
Pokud tomu tak není, pak budu vracet 1 a program se ukončí.
Takže říkám, není klíč bude první argument na příkazové řádce,
to bude druhý, a jak vidíte zde,
Budu se to mělo změnit na celé číslo.
Pak jdu nastavit znak být r.
Všimněte si, že typ proměnné CHR je vlastně číslo.
Způsob, jakým jsem mohl použít r jako celé číslo je ohraničením s těmito jednoduchými uvozovkami.
Takže zpět k našemu printf prohlášení, kde máme vyhrazené místo pro znak
a pak zástupný symbol pro celé číslo,
charakter je reprezentován chr, a celé číslo je klíč.
A pak se budeme ve výsledku přidat 2 spolu.
Takže budeme přidávat r + bez ohledu na klíč,
a pak budeme tisknout výsledek, který.
Takže pojďme se asciimath. Je to aktuální, tak se pojďme stačí spustit asciimath.
Oh, ale vidět, že nedělá nic, protože jsme neměli vlastně dát klíč.
Takže když jsem se právě vrátil 1, naším hlavním funkce, to se právě vrátil zpět k nám.
Takže pojďme projít v klíči. Někdo mi číslo. >> [Student] 4.
4. Dobře.
Takže r zvýšil o 4 bude nám v, která odpovídá ASCII hodnotu 118.
Takže pak to trochu dává smysl, že -
Vlastně, můžu se vás zeptat, co si myslíte, že ASCII hodnota r, je-li r + 4 je 118?
Tak jo, r je 114.
Takže, když se podíváte na ASCII tabulky a pak je nepochybné, že uvidíte, že r je zastoupena 114.
Takže teď víme, že můžeme přidat celá čísla znaků, se to zdá docela jednoduché.
Jsme jen tak iteraci řetězec, jako jsme viděli na příkladu před.
Podíváme se, jestli je to dopis.
Pokud je, pak budeme posouvat ji bez ohledu na klíč.
Docela jednoduché, kromě případů, kdy se dostanete do takhle,
zjistíte, že z, zastoupené 122, by pak vám jiný charakter.
My vlastně chceme, aby zůstali v naší abecedy, ne?
Takže musíme přijít na to, nějaký způsob, jak druhu obalu kolem.
Když se dostanete zed a chcete zvýšit o určitý počet,
nechcete jít do za ASCII abecedy části;
Chcete zabalit zpět celou cestu do A.
Ale mějte na paměti, že stále zachovat věc.
Tak s vědomím, že dopisy se nemůže stát symboly
stejně jako symboly se nebude měnit také.
V posledním PSet určitě nemusel,
ale volba byla pro implementaci chamtivý PSet pomocí modul funkce.
Ale teď jsme vlastně bude muset použít modul,
takže pojďme na to trochu.
V podstatě, když máte x modulo y, který vám dává zbytek x děleno y.
Zde jsou některé příklady zde. Máme 27% 15.
V podstatě, když si odečíst 15 z 27 tolikrát, kolikrát je to možné, aniž by se negativní
pak dostanete 12 zbyly.
Takže to je něco jako v matematickém kontextu, ale jak můžeme vlastně použít?
Bude to být užitečné pro naši wrapover.
Pro tento, řekněme, že jsem vás požádal, abyste všichni rozdělit do 3 skupin.
Někdy se to ve skupinách a něco podobného.
Řekněme, že jsem řekl: "Dobře, chci vám všem být rozdělena do 3."
Jak byste mohli udělat, že?
[Neslyšitelné Student odpověď] Jo, přesně tak. Odpočítat. Dobře.
Pojďme vlastně dělat, že. Chcete začít?
[Studenti počítání mimo] 1, 2, 3, 4.
Ale pamatujte si ... >> [Student] Oh, promiň.
To je opravdu dobrá připomínka.
Říkal jste, že 4, ale vlastně chceme vám říct, 1, protože chceme pouze 3 skupiny.
Takže, jak - Ne, to je opravdu dobrý příklad, protože pak, jak můžete říct, 1?
Jaký je vztah mezi 4 a 1?
No, 4 mod 3 je 1.
Takže pokud budete pokračovat, měli byste být 2.
Takže máme 1, 2, 3, 1, 2.
Opět, jste vlastně 5. osoba. Jak víte, říct 2 místo 5?
Říkáte, že 5 mod 3 je 2.
Chci vidět, kolik skupiny 3 ar zbylo, pak jakém pořadí am I.
A pak se, pokud jsme pokračovali podél celé místnosti,
pak bychom viděli, že jsme vždy skutečně používaných mod funkci pro sebe
na druh odpočítat.
To je více druhů hmotného příkladem toho, jak můžete použít modulo
protože jsem si jistý, že většina z nás pravděpodobně prošel tímto procesem
kde jsme museli odpočítat.
Jakékoliv dotazy týkající se modulo?
To bude dost důležité pochopit koncepty tohoto,
tak chci, aby se ujistil jste pochopili.
[Student] Není-li zbytek, to vám aktuální číslo?
Pokud jeden z prvních 3 z nich to udělal, bylo by to stejně jim, co vlastně byl,
nebo by to být stejně jim [neslyšitelné] >> To je dobrá otázka.
Není-li zbytek na modulo - tak, že máte 6 mod 3 -
že vlastně dává zpátky 0.
Budeme mluvit o tom, že o něco později.
Ach jo, například, 3rd person - 3 mod 3 je vlastně 0, ale řekla 3.
Takže je to něco jako vnitřní úlovek, například,
jako v pořádku, pokud mod je 0 pak budu mít 3rd person.
Ale dostaneme do druhu, jak bychom mohli chtít jednat s těmi, 0 je později.
Takže teď jsme si nějak mají způsob, jak mapuje zed na správném dopisu.
Takže teď jsme prošli těchto příkladech,
jsme trochu vidět, jak Caesar by mohlo fungovat.
Vidíte 2 abecedy a pak si na ně podívat řazení.
Tak pojďme zkusit a vyjádřit, že pokud jde o vzorce.
Tento vzorec je vlastně podává do spec,
ale pojďme trochu podívat skrze to, co každá proměnná znamená.
Naše konečný výsledek bude ciphertext.
Tak to říká, že i-tý charakter ciphertext
bude odpovídat té charakteru textu.
To dává smysl, protože chceme, aby vždy čekají tyto věci.
Takže to bude tého charakter šifrového plus K, která je naším hlavním -
to dává smysl - a pak jsme tento mod 26.
Vzpomínám si, když jsme měli zed
Nechtěli jsme se dostat do charakteru, tak jsme chtěli mod to
a druh obalu kolem abecedy.
Po zed byste jít, b, c, d, dokud jste se dostali na správné číslo.
Takže víme, že zet, pokud + 6, by nám f, protože po zet přichází, b, c, d, e, f.
Tak vzpomeňme víme jistě, že zed + 6 se bude dát nám f.
V ASCII hodnot, z je 122 a f je 102.
Takže musíme najít nějaký způsob, jak dělat svou Caesar vzorec nám 102
poté, co vzal v 122.
Takže když jsme stačí použít tento vzorec, ('z' + 6)% 26, které vlastně dává vám 24
protože 122 + 6 je 128, 128% 26 vám dává 24 zbytek.
Ale to není opravdu neznamená f. To rozhodně není 102.
To také není 6. písmeno v abecedě.
Tak samozřejmě, musíme mít nějaký způsob, jak štípat to trochu.
Pokud jde o pravidelné abecedy, víme, že z je 26. písmeno a f je 6..
Ale my jsme v informatice, takže budeme indexem 0.
Takže místo toho, aby z je počet 26, budeme říkat, že je to číslo 25
protože je 0.
Tak teď pojďme použít tento vzorec.
Máme z zastoupená 25 + 6, která vám dává 31.
A 31 mod 26 vám dává 5 jako zbytek.
To je ideální, protože víme, že f je 5. písmeno v abecedě.
Ale to ještě není f, P? To ještě není 102.
Takže pro tuto PSet, bude úkolem se snaží zjistit vztah
mezi konverze mezi těmito ASCII hodnotami a abecední rejstřík.
V podstatě to, co budete chtít dělat, chcete začít s ASCII hodnotami,
ale pak chcete nějak přeložit do indexu abecedy
pak vypočítat, jaké písmeno by mělo být - v podstatě, co jeho abecední index je
z šifry charakteru - a pak překládat, že zpět do ASCII hodnoty.
Takže pokud jste vytasit svůj ASCII tabulku, zkuste a najít vztahy mezi, řekněme, 102 a 5
nebo 122 a 25.
Dostali jsme náš klíč od argumentů příkazového řádku, jsme dostali holý text,
jsme zašifrován to.
Nyní vše, co zbývá udělat, je vytisknout.
Mohli bychom to několik různých způsobů.
To, co jsme mohli udělat, je skutečně vytisknout, jak jsme jít dál.
Jak jsme iteraci znaky v řetězci,
bychom mohli prostě jen vytisknout vpravo pak, když jsme spočítat.
Případně může také uložit do pole a mají řadu znaků
a na konci iteraci této celé pole a vytisknout.
Takže máte několik možností pro to.
A nezapomeňte, že% c bude zástupný symbol pro tisk charakter.
Tak tady to máme Caesara, a nyní přejdeme k Vigenère,
který je velmi podobný Caesar, ale jen o něco složitější.
Takže v podstatě se Vigenere je budete se procházet v klíčové slovo.
Takže místo čísla, budete mít řetězec,
a tak, že se to působit jako klíčové slovo.
Pak, jako obvykle, budete si výzva pro řetězec od uživatele
a pak zašifrovat a pak jim záda ciphertext.
Tak, jak jsem řekl, je to velmi podobné Caesara, s výjimkou místo posouvání určitého počtu,
číslo je vlastně změní pokaždé, když z charakteru k charakteru.
Představují, že skutečný počet se posunout, je to zastoupené na klávesnici písmena.
Takže pokud zadáte v posunu, například, pak to by odpovídalo posunu 0.
Takže je to zase zpátky do abecedního indexu.
Co by mohlo být užitečné, pokud jste viděl, že jsme skutečně zabývají ASCII hodnotami
jakož i písmena, stejně jako index abecedně,
Možná vás nebo si vytvořte vlastní ASCII tabulku, která ukazuje v abecedním indexu 0 až 25,
až z, a ASCII hodnoty, takže můžete trochu vidět vztah
a nastínit a pokusit se najít nějaké vzory.
Podobně, pokud jste byli řazení na některých stupni f -
a to je buď malá nebo velká f - pak by odpovídaly 5.
Jsme dobrý tak daleko?
Vzorec pro Vigenere je trochu jiný.
V podstatě, zjistíte, že je to jen jako Caesar,
kromě ne jen k máme k. index j.
Všimněte si, že jsme nepoužívají i proto, že v podstatě, délku klíčového slova
není nutně délku našeho ciphertext.
To bude trochu jasnější, když vidíme příklad, že mám trochu později.
V podstatě, pokud spustíte váš program s klíčovým slovem na ohai,
pak to znamená, že pokaždé, ohai bude vaše směna.
Takže v závislosti na jakou pozici jste ve vašem klíčové slovo,
budete změnit svůj určitý šifrový znak této částky.
Opět, stejně jako Caesar, chceme se ujistit, že jsme zachovat kapitalizaci věcí
a my jsme pouze zašifrovat písmena, nikoliv znaky nebo mezery.
Podívejte se tedy zpět k císaři o funkcích, které můžete použili,
tak, že jste se rozhodli, jak se posunout věci, a platí, že do svého programu zde.
Takže pojďme zmapovat tohle.
Máme holý, které jsme dostali od uživatele od GetString
říká to ... je CS50!
Pak máme klíčové slovo ohai.
První 4 znaky jsou poměrně jednoduchá.
Víme, že T se bude posunut o,
pak h se bude posunut h, i se bude posunut.
Zde můžete vidět, že představuje 0,
takže pak konečná hodnota je ve skutečnosti jen stejné písmeno jako předtím.
Pak s je posunut i.
Ale pak budete mít tyto doby zde.
Nechceme, aby zašifrovat, takže pak nemusíte měnit ničím
a jen vytisknout období beze změny.
[Student] Nechápu, jak víte, že to je posunut - Kde vás - >> Oh, promiň.
Na vrcholu zde můžete vidět, že argument příkazového řádku ohai zde,
že to bude klíčové slovo.
A tak v podstatě, jste na kole přes znaky v klíčové slovo.
[Student] Tak o se bude řazení stejné -
Takže o odpovídá určitému počtu v abecedě.
[Student] Právo. Ale kde jsi vzal CS50 část z?
Oh. To je v GetString, kde jste jako: "Dej mi řetězec kódování."
[Student] Chystají se vám tento argument přejít od
a pak se zeptám na první řetězec. Jo >>.
Takže při příštím spuštění programu, jdou zahrnout klíčové slovo
ve svých argumentů příkazového řádku při spuštění to.
Pak, jakmile jste četl, že jsem vlastně dal 1 a ne více, ne méně,
pak budete přiměli je pro řetězec, říká: "Dej mi řetězec."
Tak to je, kde v tomto případě, že jste stejně si to ... je CS50!
Takže pak budete používat, že a používat ohai a iteraci.
Všimněte si, že jsme tady přeskočil šifrování období,
ale z hlediska našeho postavení na ohai, příští jsme použili o.
V tomto případě je to trochu těžší vidět, protože to je 4,
takže pojďme pokračovat trochu. Jen držet se mnou.
Pak máme I a S, které jsou potom přeložen do O a H, resp.
Pak máme prostor, a tak víme, že jsme se nebude zašifrovat mezery.
Ale všimněte si, že místo toho, aby na tomto místě právě zde,
jsme šifrování by - já nevím, jestli je vidět, že - tady.
Takže to není jako jste vlastně předem, řekněme, o jde zde, h jde tady,
jde zde, i zde jde, o, h,, i, o, h,, i. Nemusíte dělat.
Stačí pouze změnit svůj postoj na klíčové slovo
když víte, že jste ve skutečnosti bude šifrování skutečný dopis.
Znamená to, že druh smysl?
Dobře.
Takže jen několik upomínek.
Chcete, aby se ujistil, že si jen postoupit na další písmeno v klíčovém slově
pokud postava v otevřeném textu, je dopis.
Takže říct, že jsme na o..
Jsme zjistili, že další znak, index i holého textu, je číslo, například.
Pak jsme nepostoupí j, index pro naše klíčové slovo, až se dostaneme další dopis.
Opět, budete také chtít, aby se ujistil, že jste Wraparound na začátek klíčového slova
když jste na konci.
Pokud vidíte tady jsme u i, ten příští musí být o.
Takže chcete najít nějaký způsob, jak být schopen wraparound na začátku svého klíčového slova
pokaždé, když se dostanete na konec.
A tak znovu, jaký druh subjektu je užitečné v tomto případě pro obal kolem?
Stejně jako v počítání off příkladu.
[Student] znak procenta. >> Jo, znak procent, což je modulo.
Takže modulo přijde vhod zde, pokud chcete zabalit přes index v ohai.
A právě rychlá nápověda: Zkuste myslet na balení nad klíčového slova trochu jako počítání mimo,
kde v případě, že je 3 skupiny, 4. osoba,
jejich počet, že oni říkali byl 4 mod 3, který byl 1.
Tak zkuste a myslím, že to takhle.
Jak jste viděli ve vzorci, kde máte CI a pak PI, ale pak kJ,
chcete, aby se ujistil, že budete mít přehled o nich.
Nemusíte volat to nejsem já, nemusíte volat, že j,
ale chcete, aby se ujistil, že jste sledovat pozice, že jste na v otevřeném textu
, jakož i na pozici, kterou jsme u v klíčové
protože tyto nejsou nutně bude stejný.
Nejen, že na základě klíčového slova - by to mohlo být úplně jiné délky než váš prostý text.
Také váš holý, tam jsou čísla a znaky,
takže to nebude dokonale ladí dohromady. Ano.
[Student] Je zde funkce pro změnu případ?
Můžete změnit na základním kapitálu A? >> Jo, tam určitě je.
Můžete se podívat na - Věřím, že je to toupper, vše 1 slovo.
Ale když se snažíte šifra věci a zachovat text,
je nejlepší v podstatě mít oddělené případy.
Pokud je to velká, pak se budete chtít posunout o této
protože ve vašem vzorci, když se podíváte zpátky, jak jsme se trochu cestách
zaměnitelně mezi ASCII způsobem reprezentovat čísla
a skutečný abecední rejstřík, chceme se ujistit,
tam to bude nějaká vzoru, který budete používat.
Další poznámka o vzoru, skutečně.
Budeš určitě práci s čísly.
Snažte se používat magická čísla, která je příkladem stylu.
Takže říct, že chcete každý něco časového posunu rád -
Dobře, tak náznak, další spoiler je, když jdete k posunutí něco
o určitou částku, snažte se představovat, že skutečné číslo
ale zkuste a uvidíte, jestli můžete použít ASCII hodnotu, která bude trochu větší smysl.
Další poznámka: Vzhledem k tomu, máme co do činění s formulí,
i když vaše TF bude trochu vědět, co vzor můžete používat,
nejlepší ve své komentáře druhu vysvětlit logiku, jako,
"Já používám tento vzor, ​​protože ..." a druh vysvětlit vzor stručně ve svých komentářích.
[To návod 2] Pokud tam nejsou nějaké další otázky, pak jsem si jen zůstat tady trochu.
Hodně štěstí s vaším PSet 2: Crypto a díky za příchod.
[Student] Děkuji. Díky >>.
[Media Offline intro]