[Powered by Google Translate] § Problém Set 2: Hacker Edition Rob Bowden, Harvard University To je CS50. CS50.TV Takže, já jsem Rob. Jsem senior na Kirkland. To je můj třetí rok TFing CS50. Je to poprvé, co jsme se při přechodu od tradiční přednáška stylu oddílu, kde jsme tak nějak přezkumu, co se stalo v přednášce a pak vy klást otázky, nyní je mnohem více problémů na bázi, kde využíváme prostory, a - Oh, tak nápad je jít do tohoto odkazu jsem vás poslal, a pak budete mít v mém vesmíru. Má někdo nemá notebook? Dobře. Takže budeme používat toto, a my bude dělat problémy žít v sekci a diskutovat o nich, a přijít na to, co se děje a já bych mohl vytáhnout některé z kódu, a mohl bych diskutovat o své nápady. Takže má někdo měl potíže? Můžete chatovat na straně, já nevím, jestli budeme mít důvod pro to. Nyní, stejně jako v předchozím supersection, pokud jste byli v té třídě, víte, co to je asi tak. Na všech množin P tam to bude tyto oddíly. Takže P-set 2, specifikace, myslím, že jsi to viděl na P-set 1 již. Ale můžeme se podívat na P-set 2 za to, co budeme jít přes dnes. A uvidíte část otázek. Takže to bude ve všech P-množin; tam bude část otázky. Zatím jsme řekli, "Považuji to příležitost k praxi." Nebudete vyzváni k předložení tohoto programu. Myšlenka je, že tyto mají druh vám pomůže začít s problémového souboru. Myslím, že na Hacker vydání, jsou hodně z nich má být jen nové, zajímavé věci se učit. Nesmějí být přímo použitelné na problém sadě. A právě teď se nemá odešlete je, ale v teorii, pro pozdější problémové soubory, můžete předložit je, a tak můžete buď přijít na části nebo sledovat sekci získat odpovědi, nebo můžete jen získat je na své vlastní Pokud nemáte pocit, že se těší mou přítomnost. Takže - myslím, že to je první z nich. Oh. Také, podle těchto oddílů otázek jsme také kladete otázky ohledně šortek. Takže myslím, že v zásadě jste měl sledovat, před příchodem do oddílu, ale to je v pořádku, pokud nechcete, půjdeme na ně stejně. Takže můžeme začít s těmito: "Jak while liší od do-while? Pokud je to ten druhý zvláště užitečné? " Takže někdo nějaký -? [Student] Co dělat, zatímco smyčka bude vždy provádět alespoň jednou. Ano. Tak, že je rozdíl. While - budu jen to tady - smyčce while, máme podmínku tady, vzhledem k tomu, do-while, nemáte podmínku, dokud jsme sem dolů. A tak, když váš program je realizovat, a to se dostane do smyčky while, okamžitě zkontroluje, zda je tato podmínka pravdivá. Pokud tato podmínka není pravda, bude to jen přeskočit smyčku úplně. Do-while, protože program je realizovat, se dostane do "dělat." Nic se neděje v tomto bodě, jen pokračuje v provádění. Pak, když to udeří do "chvíli", v případě, že je podmínka splněna, bude to smyčka zpět a udělat to znovu a znovu a znovu, dokud se podmínka není pravda, a pak už jen padá. Takže, s tím rozdílem,, že to může přeskočit rovnou od samého začátku. To nutně provádí jednou a poté se může spustit vícekrát, pokud je podmínka stále platí. Takže zatímco smyčka bude jen to, že jednou, nebo - while smyčky - my se nemusí dělat vůbec, protože jakmile se dostaneme k tomu, pokud je podmínka nepravdivá, budeme prostě přeskočit přímo nad ním. Vzhledem k tomu, do-while smyčky, budeme ji provést jednou, nutně. Pak, když se dostaneme do stavu, zkontrolujeme, jestli je to pravda, nebo ne. Pokud je to pravda, my to uděláme znovu, pokud je to false, budeme jen pokračovat dál. Takže když je tato zvláště užitečné? Takže mohu říci, že v plném rozsahu na 4 roky, 3 roky, bez ohledu, že jsem byl programování, použil jsem to jako, pod 10 krát. A pravděpodobně 5 z nich jsou v CS50, když jsme zavádění do-while. Takže když se vám použít do-while smyčky? Kdy je - jo? [Student] Když se snažíte dostat vstup uživatele, nebo něco chcete zkontrolovat - Jo. Takže do-while smyčky, vstup uživatele je velký. To je důvod, proč na první sady pár problémů, pokud chcete požádat uživatele, jako, "Dej mi řetězec," nemůže pokračovat, dokud vám, že řetězec. A tak si, nutně, je třeba požádat o řetězec alespoň jednou. Ale pak v případě, že odpověď něco špatného, ​​pak se budete muset smyčky zpět a požádat znovu. Ale jiné, než vstup uživatele, to je velmi vzácné, že jsem se setkat s případem tam, kde chci smyčky "alespoň jednou", ale možná i více. Dotazy nebo -? Má někdo používá do-while někde jinde? Dobře. Takže další z nich je, "Co nehlášené identifikátor obvykle označují, zda výstup by kovový zvuk? " Takže, jaký druh kódu bych mohl napsat dostat "neohlášené identifikátor?" [Student] To x = 2? Takže můžeme to zkusit tady, x = 2. Uděláme to - oh, jsem se na něj. Takže tady máme - v pořádku. "Použití nedeklarovaný identifikátor x." Tak to je nedeklarovaný identifikátor, proměnná. To bude často volat proměnnou identifikátor. Takže to nemusí vědět, že je to vlastně proměnná, ale neví, co to je. Takže je to identifikátor. Tak proč je nedeklarovaný? Jo. Tak aby bylo jasno na terminologii, prohlášení o proměnné je, když řeknete "int x," nebo "string y," Cokoliv. Inicializace proměnné, nebo přiřazení proměnné, je kdykoliv řeknete "x = 2." Takže můžeme provést v samostatných krocích, int x, x = 2, a dokud - můžeme mít spoustu věcí tady - ale dokud tato položka stane, je x ještě inicializována, ale byl prohlášen. A tak můžeme samozřejmě udělat v 1 řadě, a teď jsme deklarovat a inicializaci. Otázky? A konečně, "Proč je Cipher Caesar nepříliš bezpečné?" Takže první, někdo chce říct, co Cipher Caesar je? [Student] Caesar Cipher jen je, že si zmapovat, posunete každý dopis, určitý počet písmen projít, a přesunout zpět přes, a to není moc bezpečné, protože tam je jen 26 možných variant, a stačí to zkusit každý 1 z těch, dokud si to. Oh. Takže, mám opakovat? Caesar Cipher, to - myslím, budete se s tím vyrovnat na problémy, které vás - nebo myslím, že standardní edici problémového souboru, který není na hackerské vydání. Takže na standardní verzi na problém sady, dostanete zprávu jako, "Hello, world" a máte také číslo jako 6, a budete mít tuto zprávu, a každý jednotlivý znak, otočíte ji 6 pozic v abecedě. Takže "h" v ahoj stane h-i-j-k-l-m-n. Takže první písmeno bude n. Děláme totéž s e. Máme-li, rád, z nebo něco, pak zabalíme zpět k "." Ale každá postava dostane cykluje 6 znaků později v abecedě, a to není moc bezpečné protože tam jsou jen 26 možností, jak mnoho způsobů, jak byste mohli zabalit jedno písmeno. Takže si můžete prostě zkuste všech 26 z nich, a pravděpodobně, na dostatečně dlouhé zprávy, pouze 1 z těchto možných 26 věcí, bude čitelná, a čitelné z nich je bude původní zpráva. Takže to není moc dobrý způsob šifrování vůbec nic. Nesouvisí s krátkých filmů, "Co je to funkce?" Takže to, co je funkce? Ano. [Student] Je to jako samostatný kus kódu, který můžete volat projít a pak si návratovou hodnotu čehokoliv. Jo. Takže budu na ni odpovědět tím, že také odpovědi na další - nebo opakování tím, že také jen odpovědí na příští. Můžete použít funkce, ne jen kopírování a vkládání kódu znovu a znovu. Jen se tento kód, vložte ho do fuction, a pak byste mohl jen zavolat funkci všude tam, kde jste byli kopírování a vkládání. Takže funkce jsou užitečné. Takže teď budeme dělat skutečné problémy. První z nich. A tak vznikla myšlenka na první z nich je, předat to řetězec, a bez ohledu na - nebo to říká všude malá písmena? Neříká všechny malá písmena. Takže zpráva může být cokoli, a - oh no. To dělá. "Pro jednoduchost, můžete předpokládat, že uživatel bude pouze vstupní malá písmena a mezery." Tak jsme předat zprávu s pouze malými písmeny a pak jsme střídat mezi kapitálem a malými písmeny - jsme změnit řetězec k hlavním a malá písmena, střídavé. Takže předtím, než jsme vám druhý dokonce ponořit do problému, Co je první věc, kterou musíme udělat? Oh, co jsem právě klikněte na? Oh, jsem klikl na e-mailu v zde. Takže první věc, kterou musíme udělat, - jsem při pohledu na nepravou? Je to součást tohoto jednoho? Ne, ty jsou stále tam, ačkoli. Dobře, pořád tady. Nyní nemůžeme předpokládat -? Ano. Zde nemůžeme předpokládat, že je to jen malá a prostory. Takže teď máme co do činění s tím, že dopisy mohou být, co chceme, aby byli. A tak první věc, kterou chcete udělat, je jen dostat zprávu. My jen potřebujeme dostat řetězec, řetězec s = GetString, v pořádku. Nyní tento problém, existuje několik způsobů, jak to udělat. Ale budeme chtít použít bitové operátory zde. Existují lidé, kteří buď nebyli na supersection, nebo tak něco, a nevím, co bitové operátory jsou? Nebo, jak se vztahují na ASCII v žádném případě? [Student] jsem nebyl na supersection, ale já vím, co bitové operátory jsou. Dobře. Takže nemám jít přes základy z nich, ale já ti to vysvětlím to, co budeme chtít použít zde. Takže "A": Binární reprezentace kapitálu A, počet je 65. Já jsem prostě jít se podívat na - 41 se bude 01000001. Takže by mělo být 65 v desítkové soustavě, takže to je binární reprezentace znaku hlavního města A. Nyní, binární reprezentace znaku malá "" bude to samé, skoro. Je to - 6, jo. To je správné. Takže binární kapitálu, binární malá "." Takže si všimnout, že rozdíl mezi A a "a" je to jediný bit. A to se stane, že 32 bit, bit představuje počet 32. A to dává smysl, protože je 65, "" je 97. Rozdíl mezi nimi je 32. Takže teď víme, že můžeme převést od A do "a" tím, že a bitové ORing to, s - to vypadá jako 1. To je bitový součet, s 00100000, a že nám dá "." A můžeme dostat z "A" od doplnku ANDing s 11, 0 na tomto místě, 11111. Takže to bude pak dát nám přesně to, co "bylo, ale zrušit tuto individuální bit, takže budeme muset 01000001, já nevím, jestli jsem počítal správně. Ale tato technika doplnku Oring se dostat z hlavního města na malá písmena, a bitové ANDing dostat se z malých písmen na základním kapitálu není exkluzivní k A. Všechny dopisy, K vs K, Z vs z, všechny z nich se právě chystá se liší od tohoto jediného bitu. A tak můžete použít pro změnu z jakéhokoli malým písmenem na jakoukoli velkým písmenem a naopak. Dobře. Tak snadný způsob, jak se dostat z toho - a tak místo toho, aby musel napsat cokoliv 1011111 je - snadný způsob, jak reprezentovat toto číslo, a toto není jeden že jsem šel přes v supersection, ale tilda (~) je další bitový operátor. Co ~ dělá, je, že se dívá na bitovou reprezentaci. Pojďme se libovolný počet. To je jen některé binární číslo, a to, co ~ se je to jen převrátí všechny bity. Takže je to 1, nyní 0, to je 0, nyní 1, 010100. Takže to je vše ~ dělá. Takže 32 bude číslo - zbavit toho - takže 32 bude číslo 00100000, a tak ~ z toho se bude Toto číslo se tady, že jsem AND 'a' s. Má každý vidět, že? To je docela běžné, jako když chcete zjistit, pro pozdější věci, které bychom mohli být svědky, když chceme zjistit, zda - nebo chceme, aby všechno, každý bit set s výjimkou 1 Máte sklon dělat ~ kousku, který nechceme nastavit. Takže nechceme 32 bit set, a tak jsme se ~ 32. Dobře. Takže můžeme použít všechny ty tady. Dobře, tak je to v pořádku, pokud jste neučinili, budeme pomalu pěšky přes dohromady, nebo pěšky přes to, tak - přes to. Procházka to. Takže máme řetězec, a chceme smyčku každého znaku v tomto řetězci a udělat něco k tomu. Tak jak my smyčku provázku? Co bychom měli použít? Nebudu to dělat tady. Jo. Takže mám iterátor, a řekl to, ale jak to mám vědět, kolik znaků v řetězci? Strlen (s), pak i + +. Takže to, co jsem tady udělal, není nejlepší způsob, jak dělat věci. Ví někdo, proč? Protože máte kontrolu jazyk řetězce pokaždé. Takže se budeme chtít pohybovat strlen, mohl bych říct tady, int length = strlen (s), a pak se i > 1 bit. To by mohlo být více než 1 bit, tak dlouho, dokud všechny bity pod této poloze jsou stejné. Takže potřebujeme alespoň 26 znaků - nebo, je jich tam 26 znaků. Takže potřebujeme alespoň 26 čísel představují rozdíl - Rozdíl mezi a "a" musí být minimálně 26, jinak bychom neměli zastoupeny všechny kapitálové čísla. To znamená, že pokud začneme na 1, bude to používat všechny tyto kousky, všechny tyto prvních 5 bitů pro reprezentaci všechno do Z. To je důvod, proč další bit, nebo tento bit, další bit je ten, který si vybrala rozlišovat mezi a "." To je také důvod, proč v ASCII tabulce, existuje 5 symboly oddělující velká písmena z malých písmen. Vzhledem k tomu, to jsou symboly, navíc 5, která přináší až se 32 je rozdíl mezi nimi. [Student] Tak jsme mohli udělat to, protože ASCII je navržen tak. Ano. Ale ASCII - rozdíl by mohl být také obou těchto bitů. Stejně jako v případě byli 10000001, a "" bylo 11100001 - zapomněl jsem, co. Ale pokud to bylo to, pak bychom mohli i nadále používat 'a' - A. Je to právě rozdíl mezi A a "" je stále tyto 2 bity. Myslím, že je to napsáno 48. Je to 32 + 64? Myslím, že to je? Bylo by ještě 2 bity, každý znak, jako, Z a Z, K a K, stále by mít stejné přesné bity nastaveny, kromě těch 2 bity. Takže pokud je to vždy pravda, bez ohledu na to, jestli jsme pomocí ASCII nebo jiný systém, tak dlouho, jak je jen stanovený počet bitů, které jsou odlišné pro každý znak, pak to funguje. Je to jen, že 32 byla zřízena, protože je to první, kdo bychom mohli případně použít. >> Cool. I upřednostňují, v případě, že nejsou vidět, v případě, že blok je jen jediný řádek, můžete zbavit složených závorek, takže mám tendenci preferovat dělá. Také víte, jak můžeme dělat věci, jako s [i] + = 1? Můžete si také udělat s [i] bitové operace AND = 32. A bitový soucet = 32. Také, počítat mod 2 == 0. Takže pamatujte, že - nebudu psát - žádné nenulová hodnota je pravda, a 0 je false. Takže "pokud Počet mod 2 == 0" je stejné, jako říkat "ne-li počítat mod 2." Asi bych jen obrátil linky a řekl, "pokud počet mod 2, se liší OR 1, jinak si AND 1, "takže jsem neměl potřebovat" ne. " Ale to funguje stejně dobře. A co jiného mohu dělat? Dalo by se kombinovat s ternární, pokud jste chtěli, ale pak to právě dělat věci Messier a pravděpodobně obtížnější číst, takže nebudeme dělat. Každý, kdo má nějaké další návrhy? Je to všechno problém požádal? Ach jo. Takže jak se zbavit těchto prázdných řádků, teď budeme tisknout f,% s je jeden pro řetězce, Budeme tisknout F, S. Nyní pojďme spustit. Udělal jsem něco špatně? To je \ "; Chci n. Dobře. Nyní budeme jej spustit. Je to pravděpodobně na mě křičet. Strlen je v string.h. Tak to je pěkná věc, o Clang je vám řekne, co je to v, místo GCC, které jen říká, "Hej, ty na něco zapomněl, já nevím, co to bylo." Ale to mi řekne, "Ty chtěl zahrnout string.h." Tak jsem se výzvu pro cokoli, tak to nic neříká. Ale uděláme jejich příkladu, "děkuje 4 doplňku". To vypadá dobře. Hurá. Takže návratu do své hlavní, jsem téměř nikdy to. Je to volitelné. A hlavní je jediná funkce, pro které je volitelný. Pokud nemáte nic nevrací z hlavní, je to předpokládá, že jste měl na mysli vrátit 0. Otázky? Dobře. Takže teď druhý problém. "Vzpomeňte si, týden 2 druhého přednášky, které vyměňovat hodnoty 2 proměnné" předáním tyto 2 proměnné do funkce (i když tzv. swapu) není přesně fungovat, alespoň ne bez "ukazatelů." A ignorovat ukazatele, až se dostaneme k nim. Chceme vyměnit 2 proměnné, nejsme pomocí funkce na to. Jsme stále dělat to v hlavním jak to říká. Ale použít tyto 2 proměnné, nechceme používat dočasnou proměnnou. Existují 2 způsoby, jak toho dosáhnout. Můžete to udělat pomocí tradiční binární operátory. Takže nevíte někdo rychlý a špinavý způsob, jak to, že? To by mohlo ve skutečnosti trvat minutu myšlení. Mám-li - Budu nastavit problému se, jako by se zeptat. Takže pokud jsem 2 proměnné,, což je jen číslo že mi dají, a součet variabilní B, což je další číslo, které jsem stejně. Takže pokud jsem tyto 2 proměnné, teď chci vyměnit je. Tradiční, pomocí pravidelné binární operátory, myslím, stejně jako +, -, ÷. Ne bitové operátory, které působí na binární. Takže pomocí -, +, ÷, a všichni ti. Jsme mohli vyměnit tím něco jako = a + b, a, b = - b, = a - b. Takže, zdravý rozum zkontrolujte, a pak uvidíme, proč to funguje. Řekněme = 7, b = 3, pak a + b bude 10. Takže jsme teď nastavení = 10, a pak děláme b = a - b. Takže děláme b = - b, která bude 7, a b = - b znovu, nebo = a - b. Která bude 10-7 což je o 3. Takže teď, správně, "" bylo 7, b je 3, a teď b je 7 a 'a' je 3. Takže druh dává smysl, "" je kombinací 2 čísel. V tomto bodě, "" je kombinace, a pak jsme odečtením z původní b, a pak jsme se odečte to, co bylo původní "." Ale to nefunguje u všech čísel. Chcete-li vidět, uvažujme systém, takže obvykle uvažujeme celá čísla jako 32 bitů. Pojďme pracovat na něčem, co je jen jako 4 bity. Doufám, že přijít s dobrým příkladem právě teď. Takže, já vím, to bude snadné. Řekněme, že naše 2 čísla jsou 1111, a 1111, takže jsme v binárním teď. V aktuální desetinná místa, pokud chcete myslet na to, že způsob, = 15 a b = 15. A tak jsme čekali, poté, co jsme je swap - oni nemají ani být stejná čísla, ale já jsem to takhle. Pojďme udělat jim není stejná čísla. Pojďme udělat 1111 a 0001. Tak = 15 a, b = 1. Poté, co jsme je swap, očekáváme "" na 1 a b je 15. Takže prvním krokem je = a + b. Naše čísla jsou jen 4 bity široký, takže "", což je 1111, + b, který je 0001, bude skončit 10000, ale máme jen 4 bity. Takže teď = 0. A teď chceme nastavit b = a - b - ve skutečnosti, to stále funguje perfektně. = a - b - uvidíme, jestli to funguje perfektně. Takže b = 0 - 1, což by ještě 15, a pak = - b, která by byla 1. Možná, že to funguje. Mám pocit, že je tu důvod to nefunguje pomocí pravidelné. Dobře, takže práce na předpokladu, že nepracuje s pravidelnými binárními operacemi, a budu hledat - budu Google, aby viděli, zda to je pravda. Takže chceme udělat pomocí bitové operátory, a záchytný bod tady je XOR. Takže, zavedení XOR (^), pokud jste ho ještě neviděli ještě. Je to opět, provozovatel bitový, takže to působí kousek po kousku, a to - Pokud máte bity 0 a 1, pak to bude 1. Pokud máte bity 1 a 0, bude to 1, máte bitů 0 a 0 to bude 0, a pokud máte bity 1 a 1, že to bude 0. Takže je to jako OR. Pokud je některý z bitů je pravda, je to 1, ale na rozdíl od OR, nemůže to být oba bity, které jsou pravdivé. NEBO by to být 1, by XOR mít to být 0. Takže budeme chtít použít XOR zde. Zamyslete se nad tím na chvíli, já jdu na Google. No, nemůžete přečíst, že, jsem v současné době na algoritmu XOR odkládací stránce. Doufejme, že to bude vysvětlovat, proč Nemůžu - To je přesně ten algoritmus, který jsme právě udělali. Pořád nechápu, proč - jsem musel jen vybral špatný příklad, ale v tomto případě, kdy "" se stalo, aby se stal 0, poté, co dostal na 5 bitů, takže teď '"je 0, to je to, co se nazývá "integer overflow." Podle Wikipedie: "Na rozdíl XOR swapu, tato varianta vyžaduje, aby používá několik metod, zaručit, že x + y nezpůsobí přetečení celého čísla. " Tak to dělá problémy, je to integer overflow, ale já jsem dělal něco špatně. Nejsem si jistý. Budu se snažit přijít s jinou. [Student] No, není integer overflow, když se snažíte dát číslo tam větší než množství bitů, které byly přiděleny? Jo. Máme 4 bity. To je - měli jsme 4 bity, jsme pak zkuste přidat 1 k němu, a tak jsme skončili s 5 bitů. Ale pátý bit jen dostane odříznout, jo. Mohlo by skutečně - [Student] Znamená to, že házet vám chybu, nebo to dělá - to by bylo hodit chybu? Ne tedy, že to žádná chyba. Když se dostanete na úrovni sestavy, speciální bit někde je nastavit, aby řekl, že byl přepad, ale v C tak nějak prostě se s tím vypořádat. Vy vlastně nemůžete se s tím vyrovnat, pokud použijete speciální montážní návody v C. Pojďme se zamyslet nad XOR swapu. A já si myslím, že Wikipedia článek mohl také říkal, že - Takže to také vychoval modulární aritmetiku, takže myslím, že jsem byl, teoreticky, tím modulární aritmetiku když jsem řekl, že 0-1 je 15 znovu. Takže, které by mohly ve skutečnosti - na pravidelné procesor, který dělá 0-1 = 15. Vzhledem k tomu, jsme se nakonec na 0, odečteme 1, tak pak to prostě zabalí zpět k 1111. Takže tento algoritmus může ve skutečnosti fungovat, a + b je - b, b -;, které by mohly být v pořádku. Ale je tu některé procesory, které nedělají to, a tak by nebylo v pořádku v těchto specifických ty. XOR swapu bude fungovat na libovolném procesoru. Dobře. Myšlenka je, že to má být stejné, ačkoli. Kde jsme pomocí XOR nějak získat informace o jak do 1 proměnných, a pak vytáhněte informace o jednotlivých proměnných znovu. Takže má někdo nápady / odpověď? [Student odpověď, nesrozumitelným] Takže by to mělo fungovat, a také, XOR je komutativní. Bez ohledu na to, která, aby se tyto 2 čísla stalo, že se v tady, Tento výsledek se bude stejná. Tak ^ b je b ^. Můžete také vidět to psaný jak ^ = b, b ^ =, ^ = b znovu. Tak tohle je správné, a proč to funguje, myslím, že z kousků. Pomocí nevelkého množství, řekněme 11001, a 01100. Tak to je "", což je b. Tak ^ = b. Budeme se nastavení 'A' = k XOR těchto 2 věcí. Takže 1 ^ 0 je 1, 1 ^ 1 je 0, 0 ^ 1 je 1, a 0 ^ 0 je 0, 1 ^ 0 je 1. Takže "," když se podíváte na desetinné číslo, to bude - nebudete vidět hodně o vztahu mezi původním "A" a nový "," ale při pohledu na kousky, "" je nyní jako spleti informací jak původní "A" a původní b.. Takže pokud vezmeme b ^, vidíme, že skončíme na originál "." A vezmeme-li v původní "" ^ nového "," vidíme, skončí na původní b. Takže (^ b) ^ b = originál "." A (^ b) ^ = původní b. Tam je - další způsob, jak vidět to je něco, XOR sám o sobě je vždy 0. Takže 1101 ^ 1101, všechny bity se bude stejná. Takže se to nikdy být případ, kdy 1 je 0, a druhý je 1. Tak tohle je 0000. Totéž s tím. (^ B) ^ b je jako ^ (b ^ b). (B ^ b) bude 0, ^ 0 je prostě bude "," protože všechny bity jsou 0. Takže jediné, které se chystáte být tam, kde "" je původně 1 - měl ty. A totéž nápad tady, jsem si docela jistý, že je to také komutativní. Jo. Řekl jsem před tím to bylo komutativní. Znaky ^ "," a to je asociativní, takže teď (b ^) ^. A my můžeme udělat b ^ (^). A tak znovu, dostaneme původní b. Takže "" je nyní kombinace 'a' a b dohromady. Pomocí naší nové combo "" říkáme b = combo '"^ původní b, dostaneme původní". " A teď = combo '"^ nový b, což byl původní - nebo který je nyní to, co je" "nebo b. To je v tomto případě tady dole. To je = b, starý b. Takže nyní je vše opět v pořádku vyměnil. Pokud se skutečně podíval na kousky, b = a ^ b, bude XOR tyto 2, a odpověď bude to, a pak = ^ b je XORing tyto 2 a odpověď je tato. Otázky? Dobře. Takže poslední je poněkud podstatně obtížnější. [Student] Myslím, že je otázka o tom. >> Oh, omlouvám se. [Student] Co je to vlastně rychlejší? Pokud použijete tento XOR, nebo je to v případě deklarovat novou proměnnou? Takže to, co je vlastně rychlejší, deklarovat novou proměnnou, nebo pomocí XOR vyměnit? Odpověď je, se vší pravděpodobností, dočasné proměnné. A to proto, že jakmile je kompilován dolů - tak na úrovni sestavy, tam žádná taková věc jako lokální proměnné nebo žádné dočasné proměnné nebo jakékoliv z těchto věcí. Jsou stejně jako - tam je paměť, a tam jsou registry. Registry jsou, kde se věci aktivně děje. Nemusíte přidat 2 věci v paměti, můžete přidat 2 věci v registrech. A vám přinese věci z paměti do registrů pak přidat, a pak můžete dát je zpět do paměti, ale celá akce se děje v registrech. Takže, když jste pomocí dočasného proměnné přístup, obvykle to, co se stane, je tyto 2 čísla jsou již v registrech. A pak z toho bodu na, poté, co jste vyměnili je, to bude jen začít používat jiný registr. Kdekoliv jste byli pomocí b, bude to jen používat registr, který byl již ukládání "." Takže to nemusí udělat nic, co by skutečně udělat swap. Jo? [Student] Ale to také zabere více paměti, že jo? To bude trvat jen více paměti, pokud je třeba uložit tuto dočasnou proměnnou. Jako když později použít tuto dočasnou proměnnou zase někde, pak - nebo přiřadit něco k tomuto dočasné proměnné. Takže pokud v každém okamžiku "," b v teplotě mají odlišné hodnoty, nebo tak něco, pak to bude mít odlišné umístění v paměti, ale je pravda, že existuje mnoho lokálních proměnných, které bude existovat pouze v registrech. V takovém případě, je to nikdy dát do paměti, a tak jste nikdy ztrácet paměť. Dobře. Poslední otázka je trochu víc. Takže zde, v tomto CS50 zařízení, je zde slovník. A důvodem je to, že [? B66] je kontrola pravopisu, kde budete psát pomocí hash tabulky nebo se snaží, nebo nějaké datové struktury. Budeš se psát kontrolu pravopisu, a budete používat tento slovník k tomu, že. Ale pro tento problém, jsme jen bude vypadat, aby se podívala, pokud jediné slovo ve slovníku. Takže místo uložení celého slovníku v některých datové struktury a pak dívá přes celý dokument, jestli se něco chybně, chceme jen najít 1 slovo. Takže můžeme jen skenovat přes celý slovník a pokud nikdy najít slovo v celém slovníku, pak tam nebyl. Pokud se skenování v celém slovníku a vidím slovo, pak jsme v pohodě, jsme ho našli. Je zde říká, že chceme začít hledat na file-funkcí pro zpracování C je, protože chceme číst slovník, ale dám si nápovědu zde, na které funkce byste měli myslet. Budu psát je na Spaces. Takže ty hlavní, že budete chtít podívat na jsou f otevřený a pak, nevyhnutelně, f uzavřena, které jdou na konci programu, a f skenování f. Dalo by se také použít f číst, ale pravděpodobně nebudete chtít proto, že - nemusíte skončit potřebovat, že. F skenování f je to, co budete používat ke skenování přes slovník. A tak nemusíte kódovat roztok se, ať to zkusí a jako pseudo-kód cestu k řešení, a pak budeme diskutovat. A vlastně, protože jsem už dal jsi ty, když jdete do libovolného terminálu nebo vašeho spotřebiče shell, Já bych - já obvykle - pokud jste ještě neviděli, já nevím, jestli jste ve třídě, ale člověk, takže manuálové stránky, jsou velmi užitečné pro hledání v skoro žádné funkce. Tak jsem si to, jako, MAN F, skenování f. To je nyní informace o rodině f skenování funkcí. Mohl bych také udělat MAN F, otevřené, a že mi dáš detaily, které. Takže pokud víte, co funkce, kterou používáte, nebo jste čtení kódu a vidíte nějakou funkci a jste rádi, "Co to dělá?" Jen člověk, který název funkce. Existuje několik podivných případů, kdy se budete muset říct jako. man 2, že název funkce, nebo man 3, že název funkce, ale máte jen k tomu, že pokud člověk název funkce se tak nestane do práce poprvé. [Student] Tak jsem čtení manuálové stránky pro otevřenou, ale já jsem stále zmatená o tom, jak ji používat a programu. Dobře. Mnoho manuálových stránek jsou méně než užitečné. Jsou více užitečné, pokud již víte, co dělají a pak stačí si pamatovat pořadí argumentů, nebo tak něco. Nebo se vám může dát obecný přehled, ale některé z nich jsou velmi zdrcující. Stejně jako f skenování f, také. To vám dává informace o všech těchto funkcí, a 1 řádek dolů zde stane říct, "F skenování f čte řetězec bodu nebo potok." Ale f otevřít. Tak, jak bychom používat f open? Myšlenka programu, který potřebuje udělat soubor I / O je, že musíte nejprve otevřít soubor, který chcete dělat věci, a nevyhnutelně, číst věci z tohoto souboru a dělat věci s nimi. F otevřená, je to, co jsme použít k otevření souboru. Co se vrátíme, tak to, co soubor chceme otevřít, to nám dává - tady se říká "/ user / share / dict / words." To je soubor, který chceme otevřít, a chceme jej otevřít - musíme explicitně zadat, zda chceme otevřít ji přečíst, nebo chceme-li jej otevřít psát. Je tu pár kombinací a tak, ale chceme to otevřít pro čtení. Chceme číst ze souboru. Takže to, co dělá tento návrat? To vrátí souboru hvězdičku (*), a já si jen ukázat vše v proměnné f, tak *, znovu, je to ukazatel, ale nechceme se zabývat s ukazateli. Můžete myslet na f as, f je nyní proměnná, kterou budete používat k reprezentaci souboru. Takže pokud si chcete přečíst ze souboru, budete číst od f. Pokud chcete zavřít soubor, zavřete f. Takže na konci programu, kdy jsme nevyhnutelně chcete zavřít soubor, co bychom měli udělat? Chceme ukončit f. Takže teď poslední soubor funkce, které budeme chtít použít, je skenování f, f skenování f. A co to dělá, je to skenuje přes soubor hledá vzor, ​​aby odpovídal. Při pohledu na manuálové stránce zde, vidíme int f skenování f, ignorovat návratové hodnoty pro teď. První argument je soubor * stream, takže první argument budeme chtít předat, je f. Jsme skenování přes f. Druhý argument je formátovací řetězec. Dám vám formátovací řetězec teď. Myslím, že jsme se náhodou říci, 127s \ n, hodně z toho je zbytečné. Myšlenka na to, co tento formát je řetězec, je, že můžete myslet na f skenování jako protiklad tiskové f. Takže tisk f, tisk f můžeme také použít tento typ formátu parametru, ale v tiskové f, co děláme, je - pojďme se podívat na ekvivalentu. Takže tisknout f, a je to vlastně i f f tisk, kde první argument bude f. Při tisku f, dalo by se říci něco jako, "tisk 127s \ n", a pak, pokud jsme se projít to nějaký řetězec, to bude tisknout tento řetězec a pak nový řádek. Co znamená 127, jsem si docela jistý, ale nikdy jsem omezen jsem na to, Ty by ani třeba říkat 127 "v tiskové f, ale to, co to znamená, je vytisknout prvních 127 znaků. Takže jsem si jistý, že je to tento případ. Můžete Googlu za to. Ale v příští Jsem téměř jistá, znamená to, že. Tak tohle je vytisknout prvních 127 znaků, následuje nový řádek. F skenování f nyní, místo toho, aby při pohledu na proměnné a jeho tisk, to bude vypadat na nějakém řetězci, a uložte vzor do proměnné. Pojďme vlastně použít skenování f v jiném příkladu. Takže řekněme, že jsme měli nějaké int, x = 4, a chtěli jsme vytvořit řetězec vyrobený z - chtěl vytvořit řetězec to bylo jako, to přijde až mnohem později, něco, co je stejně jako 4.jpg. Takže to může být program, kde budete mít součet čítač, Celkově proti i, a chcete ušetřit spoustu obrázků. Takže chcete ušetřit I.jpg, kde i je někteří iterace vaší smyčky. Tak jak jsme se tuto řetězec pro tuto JPEG? Pokud byste chtěli vytisknout 4.jpg, mohli bychom prostě říci, tisk f,% d.jpg, a pak by vytisknout pro tento JPEG. Ale chceme-li zachránit řetězce 4.jpg, používáme skenování f. Takže string s - vlastně jsme nemůžu - znak, char s, pojďme 100. Tak jsem deklaroval nějakou nabídku 100 znaků, a to je to, co jsme nevyhnutelně bude ukládání tohoto JPEG a. Takže budeme používat skenování f, a formát, jak bychom řekli% d.jpg aby bylo možné tisknout 4.jpg, formát to bude% d.jpg. Takže je formát% d.jpg, co chceme nahradit% d s je x, a teď musíme uložit tento řetězec někde. A kde budeme ukládat tento řetězec je pole s. Takže po tomto řádku kódu, s, pokud budeme tisknout f,% s variabilní s, to bude tisknout 4.jpg. Takže f skenování f je stejný jako skenování f, s výjimkou teď to vypadá na tento soubor za to, co pro ukládání v §. To je to, co je poslední argument bude. Chceme uložit - "Scan f rodinu funkce prověřování jak podle formátu snažil níže. Pokud některý jsou uloženy v umístění bodů, které může vrátit - " Ne, můžeme být dobré. Nechte mě přemýšlet o vteřinu. Takže skenování f není - co to sakra je funkce, která dělá, že? Takže skenování f nebude, aby se celé číslo, a to tečka JPG. Bude to [Mumbles]. Uložit int proměnné v řetězci int C. Co je tato proměnná, nebo to, co je tato funkce jmenuje? Ano. To je - ano. Takže to, co jsem byl vymezení vám bylo dříve s print f, které - které dává mnohem větší smysl, proč jsem řekl, to bylo mnohem více jako tiskové f. Scan f je stále něco jako tiskové f, ale s print f bude skenovat ji a nahradit proměnné a nyní uložte jej v řetězci. Místo tisku to, uloží jej v řetězci. Takže ignorovat úplně. Stále můžete myslet specifikátoru formátu jako takového tiskového f. Takže teď, když jsme chtěli udělat 4.jpg věc, že ​​my s Print F, X tohoto. Takže to, co skenování f dělá - co se vaše otázka bude? [Student] Jsem jen zmatená o tom, co se snažíme dělat tady s tímto JPEG. Můžete mi vysvětlit, že 1 více času? Tak to bylo - to je méně relevent až f skenování f nyní, doufejme, že se to vázat znovu v nějakém způsobu. Ale to, co jsem původně měla v úmyslu ukázat se - je to vlastně přímo souvisí s těmito [? F5] Budete používat s Print f, kde, že máme 100 obrázků, a chcete přečíst disk 1.jpg 2.jpg, 3.jpg,. Tak, aby se to, že budete muset F Otevřete, a pak se budete muset projít v řetězci, který chcete otevřít. Takže bychom chtěli otevřít 1.jpg, s cílem vytvořit řetězec, který je 1.jpg, děláme s print f z% d.jpg--jsme neudělali pro int i = 0. i <40, i + +. Takže s print f% d.jpg I. Takže po této lince, nyní proměnná nebo pole s bude 1.jpg. Nebo, 0.jpg, 1.jpg, 2.jpg. A tak můžeme otevřít, zase, každý obraz pro čtení. Takže to je to, co je vytisknout f dělá. Líbí se vám, co s tisknout f je teď dělá? [Student] Dobře, takže to trvá - vytváří řetězec, something.jpg, a uloží jej. Ano. Vytváří - to je jiný formát řetězce, stejně jako f skenování a tisku f, kde se vloží všechny proměnné do druhého argumentu, může být s na rozdíl od i. Snad - myslím, že je to případ. Ale ať už pořadí argumentů je. Bude to vložit všechny proměnné do formátu řetězce a pak uložit do naší paměti, říkáme, že vyrovnávací paměť, je to, kde jsme uložení řetězec. Takže jsme se skladování uvnitř s správně-formátovaný řetězec, co% d byla nahrazena 4. [Student] Takže pokud jsme to udělali, je proměnná f prostě bude převelena? Ano. Takže bychom měli uzavřít původní f před provedením tohoto. Ale - a pak také, kdyby nebylo f otevřít tady, pak bychom třeba říkat - Jo. Ale to by otevřelo sto různých souborů. [Student] Ale my bychom nebyli schopni přistupovat nebo - v pořádku. Dobře. Takže skenování f, f skenování f, je druh stejné myšlenky, ale místo toho, místo uložení do řetězce, je to spíš jako teď jít přes bodnutí a vzor odpovídající proti tomuto řetězci a ukládání výsledků do proměnných. Můžete použít skenování f analyzovat nad něčím jako 4.jpg, a uložit celé číslo 4 do x součet int. To je to, co můžeme použít skenování f pro. F skenování f je dělat, že na příkazovém řádku. Jsem vlastně docela jistý, že tohle je to, co knihovna CS50 dělá. Takže když říkáte, "dostat int," to je skenování f-ing po - scan f je způsob, jak dostat vstup od uživatele. F skenování f bude dělat to samé, ale pomocí souboru ke skenování přes. Tak tady jsme se skenování přes tento soubor. Vzor se snažíme, aby odpovídaly určité řetězec, který je 127 znaků následuje nový řádek Takže jsem si jistá, že bychom mohli dokonce jen říct, "odpovídá s," protože ve slovníku máme se stalo, že, my jsme zaručena žádné slovo je tak dlouho, a také f skenování f, myslím, se zastaví na novém řádku bez ohledu na to, co. Ale budeme zahrnovat nový řádek v zápase, a - [Student] Pokud bychom neměli zahrnovat nový řádek, nebylo by to najít části slova? Je - každá - při pohledu na slovníku - Takže ve slovníku, jsou všechny naše slova. Každý z nich je na novém řádku. F skenování bude vyzvednout toto slovo. Pokud se nezahrnují nový řádek, pak je možné, že příští skenování f bude jen číst nový řádek. Ale včetně nového řádku pak bude prostě ignorovat nový řádek. Ale my nikdy dostat část slova, protože jsme vždy čtení až na nový řádek, bez ohledu na to, co. [Student] Ale co když jste vyhledat slovo "Cissa," jako Cissa. Bude to najít to, a říkat, že je to zápas? Tak tady - to bude číst v - je to vlastně dobrý bod. My se nikdy pomocí proudu - slovo, co hledáme, je první argument na příkazové řádce. Takže string, slovo = argv 1. Takže řetězec hledáme, je argv 1. Nejsme hledat slovo vůbec v našem skenování f. To, co jsme dělali se skenovacím f je stále každé slovo ve slovníku, a pak ještě jednou máme, že slovo jdeme použít strcmp porovnat je. Budeme porovnávat naše slovo a to, co jsme právě přečetli dovnitř Takže nevyhnutelně, budeme nakonec dělat spoustu skenování fs dokud to jen tak se stane, že scan f vrátí - vrátí jeden, tak dlouho, jak to bylo uzavřeno nové slovo, a vrátí něco jiného, ​​jakmile to nedržel slovo. Čteme v celém slovníku, skladování řádek po řádku každé slovo do proměnné s. Poté jsme se srovnáním slovo s s, a v případě, že srovnání == 0, strcmp stane, aby 0, pokud zápas byl vyroben. Takže pokud to bylo 0, pak můžeme vytisknout f, uzavřeno, nebo slovo ve slovníku, nebo co chcete tisknout f. A pak - nechceme, aby f zavřít znovu a znovu. To je ten druh věcí, co chceme udělat, a my nejsme jen hledáte slovo ve slovníku. Takže bychom mohli udělat to, že pokud bychom se chtěli podívat na jejich vzoru, Cissa, jak jsi říkal předtím, pokud bychom chtěli hledat za tímto vzorem, pak by to selhání v případě protože to není vlastně slovo, ale jedno ze slov ve slovníku se stane, že, že v něm. Tak to by odpovídalo toto slovo, ale to podmnožina slova není slovo samo o sobě. Ale to není, jak jsme používat, budeme číst v každém slově a následné porovnání slovo máme s tímto slovem. Takže jsme pořád porovnání plných slov. Mohu odeslat definitivní řešení později. To je druh téměř na správnou odpověď, myslím. [Student komentář, nesrozumitelným] Oh, jsem se zbavit dřív, než? Char s, myslím, že jsme si řekli, 127 - zapomněl jsem, co největší je. Budeme prostě dělat 128, takže nyní je dost dlouhá. Nepotřebujeme tisknout cokoliv. Jsme také bude chtít bude muset ukončit svou soubor, a které by měly být o správnou odpověď. CS50.TV