[Powered by Google Translate] § Problém Set 2: Hacker Edition Rob Bowden, Harvard University To je CS50. CS50.TV Takže, ja som Rob. Som senior na Kirkland. To je môj tretí rok TFing CS50. Je to prvýkrát, čo sme sa pri prechode od tradičnej prednáška štýlu oddielu, kde sme tak nejako preskúmania, čo sa stalo v prednáške a potom vy klásť otázky, teraz je oveľa viac problémov na báze, kde využívame priestory, a - Oh, tak nápad je ísť do tohto odkazu som vás poslal, a potom budete mať v mojom vesmíre. Má niekto nemá notebook? Dobre. Takže budeme používať toto, a my bude robiť problémy žiť v sekcii a diskutovať o nich, a prísť na to, čo sa deje a ja by som mohol vytiahnuť niektoré z kódu, a mohol by som diskutovať o svoje nápady. Takže má niekto mal problémy? Môžete chatovať na strane, ja neviem, či budeme mať dôvod pre to. Teraz, rovnako ako v predchádzajúcom supersection, ak ste boli v tej triede, viete, čo to je asi tak. Na všetkých množín P tam to bude tieto oddiely. Takže P-set 2, špecifikácie, myslím, že si to videl na P-set 1 už. Ale môžeme sa pozrieť na P-set 2 za to, čo budeme ísť cez dnes. A uvidíte časť otázok. Takže to bude vo všetkých P-množín; tam bude časť otázky. Zatiaľ sme povedali, "Považujem to príležitosť k praxi." Nebudete vyzvaní na predloženie tohto programu. Myšlienka je, že tieto majú druh vám pomôže začať s problémového súboru. Myslím, že na Hacker vydania, sú veľa z nich má byť len nové, zaujímavé veci sa učiť. Nesmú byť priamo uplatniteľné na problém sade. A práve teraz sa nemá odošlite je, ale v teórii, pre neskoršie problémové súbory, môžete predložiť ich, a tak môžete buď prísť na časti alebo sledovať sekcii získať odpovede, alebo môžete len získať ich na svoje vlastné Ak nemáte pocit, že sa teší moju prítomnosť. Takže - myslím, že to je prvý z nich. Oh. Tiež, podľa týchto oddielov otázok sme tiež kladiete otázky ohľadom šortiek. Takže myslím, že v zásade ste mali sledovať, pred príchodom do oddielu, ale to je v poriadku, ak nechcete, pôjdeme na ne rovnako. Takže môžeme začať s týmito: "Ako while líši od do-while? Pokiaľ je to ten druhý obzvlášť užitočné? " Takže niekto nejaký -? [Študent] do-while bude vždy vykonávať aspoň raz. Áno. Tak, že je rozdiel. While - budem len to tu - slučke while, máme podmienku tu, vzhľadom k tomu, do-while, nemáte podmienku, kým sme sem dole. A tak, keď váš program je realizovať, a to sa dostane do slučky while, okamžite skontroluje, či je táto podmienka pravdivá. Ak táto podmienka nie je pravda, bude to len preskočiť slučku úplne. Do-while, pretože program je realizovať, sa dostane do "robiť." Nič sa nedeje v tomto bode, len pokračuje v realizácii. Potom, keď to udrie do "chvíľu", v prípade, že je podmienka splnená, bude to slučka späť a urobiť to znova a znovu a znovu, kým sa podmienka nie je pravda, a potom už len padá. Takže, s tým rozdielom,, že to môže preskočiť rovno od samého začiatku. To nutne vykonáva raz a potom sa môže spustiť viackrát, ak je podmienka stále platí. Takže zatiaľ čo slučka bude len to, že raz, alebo - while slučky - my sa nemusí robiť vôbec, pretože akonáhle sa dostaneme k tomu, ak je podmienka nepravdivá, budeme jednoducho preskočiť priamo nad ním. Vzhľadom k tomu, do-while slučky, budeme ju vykonať raz, nutne. Potom, keď sa dostaneme do stavu, skontrolujeme, či je to pravda, alebo nie. Ak je to pravda, my to urobíme znova, ak je to false, budeme len pokračovať ďalej. Takže keď je táto zvlášť užitočné? Takže môžem povedať, že v plnom rozsahu na 4 roky, 3 roky, bez ohľadu, že som bol programovanie, použil som to ako, pod 10 krát. A pravdepodobne 5 z nich sú v CS50, keď sme zavádzanie do-while. Takže keď sa vám použiť do-while slučky? Kedy je - jo? [Študent] Keď sa snažíte dostať vstup užívateľa, alebo niečo chcete skontrolovať - Jo. Takže do-while slučky, vstup užívateľa je veľký. To je dôvod, prečo na prvý sady pár problémov, ak chcete požiadať užívateľa, ako, "Daj mi reťazec," nemôže pokračovať, kým vám, že reťazec. A tak si, nutne, je potrebné požiadať o reťazec aspoň raz. Ale potom v prípade, že odpoveď niečo zlé, potom sa budete musieť slučky späť a požiadať znovu. Ale iné, ako vstup užívateľa, to je veľmi zriedkavé, že som sa stretnúť s prípadom tam, kde chcem slučky "aspoň raz", ale možno aj viac. Otázky alebo -? Má niekto používa do-while niekde inde? Dobre. Takže ďalší je, "Čo nelegálnej identifikátor zvyčajne označujú, či výstup by kovový zvuk? " Takže, aký druh kódu by som mohol napísať dostať "neohlásené identifikátor?" [Študent] To x = 2? Takže môžeme to skúsiť tu, x = 2. Urobíme to - oh, som sa na neho. Takže tu máme - v poriadku. "Použitie nedeklarovaný identifikátor x." Tak to je nedeklarovaný identifikátor, premenná. To bude často volať premennú identifikátor. Takže to nemusí vedieť, že je to vlastne premenná, ale nevie, čo to je. Takže je to identifikátor. Tak prečo je nedeklarovaný? Jo. Tak aby bolo jasno na terminológiu, vyhlásenie o premenné je, keď poviete "int x," alebo "string y," Čokoľvek. Inicializácia premennej, alebo priradenie premenné, je kedykoľvek poviete "x = 2." Takže môžeme vykonať v samostatných krokoch, int x, x = 2, a kým - môžeme mať veľa vecí tu - ale kým táto položka stane, je x ešte inicializovaná, ale bol vyhlásený. A tak môžeme samozrejme urobiť v 1 rade, a teraz sme deklarovať a inicializácii. Otázky? A konečne, "Prečo je Cipher Caesar nepríliš bezpečné?" Takže prvé, niekto chce povedať, čo Cipher Caesar je? [Študent] Caesar Cipher len je, že si zmapovať, posuniete každý list, určitý počet písmen prejsť, a presunúť späť cez, a to nie je moc bezpečné, pretože tam je len 26 možných možností, a vy jednoducho musíte vyskúšať každý 1 z tých, kým si to. Oh. Takže, mám opakovať? Caesar Cipher, to - myslím, budete sa s tým vyrovnať na problémy, ktoré vás - alebo myslím, že štandardné edícii problémového súboru, ktorý nie je na hackerské vydanie. Takže na štandardnej verzii na problém sady, dostanete správu ako, "Hello, world" a máte aj číslo ako 6, a budete mať túto správu, a každý jednotlivý znak, otočíte ju 6 pozícií v abecede. Takže "h" v ahoj stane h-i-j-k-l-m-n. Takže prvé písmeno bude n Robíme to isté s e Ak máme, rád, z alebo niečo, potom zabalíme späť k "." Ale každá postava dostane cykluje 6 znakov neskôr v abecede, a to nie je moc bezpečné pretože tam sú len 26 možností, ako veľa spôsobov, ako by ste mohli zabaliť jedno písmeno. Takže si môžete jednoducho skúste všetkých 26 z nich, a pravdepodobne, na dostatočne dlhé správy, iba 1 z týchto možných 26 vecí, bude čitateľná, a čitateľné z nich ich bude pôvodná správa. Takže to nie je moc dobrý spôsob šifrovania vôbec nič. Nesúvisí s krátkych filmov, "Čo je to funkcia?" Takže to, čo je funkcia? Áno. [Študent] Je to ako samostatný kus kódu, ktorý môžete volať prejsť a potom si návratovú hodnotu čohokoľvek. Jo. Takže budem na ňu odpovedať tým, že aj odpovede na ďalšie - alebo opakovanie tým, že tiež len odpoveďou na budúci. Môžete použiť funkcie, nie len kopírovanie a vkladanie kódu znova a znova. Len sa tento kód, vložte ho do fuction, a potom by ste mohol len zavolať funkciu všade tam, kde ste boli kopírovanie a vkladanie. Takže funkcie sú užitočné. Takže teraz budeme robiť skutočné problémy. Prvý z nich. A tak vznikla myšlienka na prvý z nich je, odovzdať to reťazec, a bez ohľadu na - alebo to hovorí všade malé písmená? Nehovorí všetky malé písmená. Takže správa môže byť čokoľvek, a - oh no. To robí. "Pre jednoduchosť, môžete predpokladať, že užívateľ bude iba vstupné malé písmená a medzery." Tak sme odovzdať správu s iba malými písmenami a potom sme striedať medzi kapitálom a malými písmenami - sme zmeniť reťazec k hlavným a malé písmená, striedavé. Takže predtým, než sme vám druhý dokonca ponoriť do problému, Čo je prvá vec, ktorú musíme urobiť? Oh, čo som práve kliknite na? Oh, som klikol na e-mailu v tu. Takže prvá vec, ktorú musíme urobiť, - som pri pohľade na nepravú? Je to súčasť tohto jedného? Nie, tie sú stále tam, hoci. Dobre, stále tu. Teraz nemôžeme predpokladať -? Áno. Tu nemôžeme predpokladať, že je to len malá a priestory. Takže teraz máme čo do činenia s tým, že listy môžu byť, čo chceme, aby boli. A tak prvá vec, ktorú chcete urobiť, je len dostať správu. My len potrebujeme dostať reťazec, reťazec s = GetString, v poriadku. Teraz tento problém, existuje niekoľko spôsobov, ako to urobiť. Ale budeme chcieť použiť bitové operátory tu. Existujú ľudia, ktorí buď neboli na supersection, alebo tak niečo, a neviem, čo bitové operátory sú? Alebo, ako sa vzťahujú na ASCII v žiadnom prípade? [Študent] som nebol na supersection, ale ja viem, čo bitové operátory sú. Dobre. Takže nemám ísť cez základy z nich, ale ja ti to vysvetlím to, čo budeme chcieť použiť tu. Takže "A": Binárne reprezentácie kapitálu A, počet je 65. Ja som jednoducho ísť sa pozrieť na - 41 sa bude 01000001. Takže by malo byť 65 v desiatkovej sústave, takže je to binárny reprezentácie znaku hlavného mesta A. Teraz, binárne reprezentácie znaku malá "" bude to isté, skoro. Je to - 6, jo. To je správne. Takže binárne kapitálu, binárne malá "." Takže si všimnúť, že rozdiel medzi A a "a" je to jediný bit. A to sa stane, že 32 bit, bit predstavuje počet 32. A to dáva zmysel, pretože je 65, "" je 97. Rozdiel medzi nimi je 32. Takže teraz vieme, že môžeme previesť od A do "a" tým, že a bitové ORing to, s - to vyzerá ako 1. To je bitový súčet, s 00100000, a že nám dá "." A môžeme dostať z "A" od doplnkov ANDing s 11, 0 na tomto mieste, 11111. Takže to bude potom dať nám presne to, čo "bolo, ale zrušiť túto individuálnu bit, takže budeme musieť 01000001, ja neviem, či som počítal správne. Ale táto technika doplnkov Oring sa dostať z hlavného mesta na malé písmená, a bitové ANDing dostať sa z malých písmen na základnom imaní nie je exkluzívna k A. Všetky listy, K vs K, Z vs z, všetky z nich sa práve chystá sa líši od tohto jediného bitu. A tak môžete použiť pre zmenu z akéhokoľvek malým písmenom na akúkoľvek veľkým písmenom a naopak. Dobre. Tak jednoduchý spôsob, ako sa dostať z toho - a tak namiesto toho, aby musel napísať čokoľvek 1011111 je - jednoduchý spôsob, ako reprezentovať toto číslo, a toto nie je jeden že som išiel cez v supersection, ale tilda (~) je ďalší bitový operátor. Čo ~ robí, je, že sa pozerá na bitovú reprezentáciu. Poďme sa ľubovoľný počet. To je len niektoré binárne číslo, a to, čo ~ sa je to len prevráti všetky bity. Takže je to 1, teraz 0, to je 0, teraz 1, 010100. Takže to je všetko ~ robí. Takže 32 bude číslo - zbaviť toho - takže 32 bude číslo 00100000, a tak ~ z toho sa bude Toto číslo sa tu, že som AND 'a' s Má každý vidieť, že? To je celkom bežné, ako keď chcete zistiť, pre neskoršie veci, ktoré by sme mohli byť svedkami, keď chceme zistiť, či - alebo chceme, aby všetko, každý bit set s výnimkou 1 Máte sklon robiť ~ kúsku, ktorý nechceme nastaviť. Takže nechceme na 32 bit set, a tak sme sa ~ 32. Dobre. Takže môžeme použiť všetky tie tu. Dobre, tak je to v poriadku, ak ste neurobili, budeme pomaly pešo cez dohromady, alebo pešo cez to, tak - cez to. Prechádzka to. Takže máme reťazec, a chceme slučku každého znaku v tomto reťazci a urobiť niečo k tomu. Tak ako my slučku povrázku? Čo by sme mali použiť? Nebudem to robiť tu. Jo. Takže mám Iterator, a povedal to, ale ako to mám vedieť, koľko znakov v reťazci? Strlen (s), potom i + +. Takže to, čo som tu urobil, nie je najlepší spôsob, ako robiť veci. Vie niekto, prečo? Pretože máte kontrolu jazyk reťazca zakaždým. Takže sa budeme chcieť pohybovať strlen, mohol by som povedať tu, int length = strlen (s), a potom sa aj > 1 bit. To by mohlo byť viac ako 1 bit, tak dlho, kým všetky bity pod tejto polohe sú rovnaké. Takže potrebujeme aspoň 26 znakov - alebo, je ich tam 26 znakov. Takže potrebujeme aspoň 26 čísel predstavujú rozdiel - Rozdiel medzi a "a" musí byť minimálne 26, inak by sme nemali zastúpené všetky kapitálové čísla. To znamená, že ak začneme na 1, bude to používať všetky tieto kúsky, všetkých týchto prvých 5 bitov pre reprezentáciu všetko prostredníctvom Z. To je dôvod, prečo ďalšie bit, alebo tento bit, ďalšie bit je ten, ktorý si vybrala rozlišovať medzi A a '. " To je tiež dôvod, prečo v ASCII tabuľke, existuje 5 symboly oddeľujúce veľké písmená z malých písmen. Vzhľadom k tomu, to sú symboly, navyše 5, ktorá prináša až sa 32 je rozdiel medzi nimi. [Študent] Tak sme mohli urobiť to, pretože ASCII je navrhnutý tak. Áno. Ale ASCII - rozdiel môže byť tiež oboch týchto bitov. Rovnako ako v prípade boli 10000001, a "" bolo 11100001 - zabudol som, čo. Ale ak to bolo to, potom by sme mohli aj naďalej používať 'a' - A. Je to práve rozdiel medzi A a "" je stále tieto 2 bity. Myslím, že je to napísané 48. Je to 32 + 64? Myslím, že to je? Bolo by ešte 2 bity, každý znak, ako, Z a Z, K a K, stále by mať rovnaké presné bity nastavené, okrem tých 2 bity. Takže ak je to vždy pravda, bez ohľadu na to či sme použili ASCII alebo nejaký iný systém, tak dlho, ako je len stanovený počet bitov, ktoré sú odlišné pre každý znak, potom to funguje. Je to len, že 32 bola zriadená, pretože je to prvá by sme mohli prípadne použiť. >> Cool. Aj uprednostňujú, v prípade, že nie sú vidieť, v prípade, že blok je len jediný riadok, môžete zbaviť zložených zátvoriek, takže mám tendenciu preferovať robí. Tiež viete, ako môžeme robiť veci, ako s [i] + = 1? Môžete si tiež urobiť s [i] bitové operácie AND = 32. A bitový sucet = 32. Tiež, počítať mod 2 == 0. Takže pamätajte, že - nebudem písať - žiadne nenulové hodnota je pravda, a 0 je false. Takže "ak Počet mod 2 == 0" je rovnaké, ako hovoriť "ak nie počítať mod 2." Asi by som len obrátil linky a povedal, "ak počet mod 2, sa líšia OR 1, inak si AND 1, "takže som nemal potrebovať" nie. " Ale to funguje rovnako dobre. A čo iného môžem robiť? Dalo by sa kombinovať s ternárnu, ak ste chceli, ale potom to práve robiť veci Messier a pravdepodobne ťažšie čítať, takže nebudeme robiť. Každý, kto má nejaké ďalšie návrhy? Je to všetko problém požiadal? Ach jo. Takže ako sa zbaviť týchto prázdnych riadkov, teraz budeme tlačiť f,% ​​s je jeden pre reťazce, Budeme tlačiť F, S. Teraz poďme spustiť. Urobil som niečo zle? To je \ "; Chcem n Dobre. Teraz budeme ho spustiť. Je to pravdepodobne na mňa kričať. Strlen je v string.h. Tak to je pekná vec, o Clang je vám povie, čo je to v, miesto GCC, ktoré len hovorí, "Hej, ty na niečo zabudol, ja neviem, čo to bolo." Ale to mi povie, "Ty chcel zahrnúť string.h." Tak som sa výzvu pre čokoľvek, tak to nič nehovorí. Ale urobíme ich príklade, "ďakuje 4 doplnku". To vyzerá dobre. Hurá. Takže návrate do svojej hlavnej, som takmer nikdy to. Je to voliteľné. A hlavné je jediná funkcia, pre ktorú je voliteľný. Ak nemáte nič nevracia z hlavnej, je to predpokladá, že ste mal na mysli vrátiť 0. Otázky? Dobre. Takže teraz druhý problém. "Spomeňte si, týždeň 2 druhého prednášky, ktoré vymieňať hodnoty 2 premennej" odovzdaním tieto 2 premenné do funkcie (aj keď tzv swapu) nie je presne fungovať, aspoň nie bez "ukazovateľov." A ignorovať ukazovatele, až sa dostaneme k nim. Chceme vymeniť 2 premenné, nie sme pomocou funkcie na to. Sme stále robiť to v hlavnom ako to hovorí. Ale použiť tieto 2 premenné, nechceme používať dočasnú premennú. Existujú 2 spôsoby, ako to dosiahnuť. Môžete to urobiť pomocou tradičnej binárne operátory. Takže neviete niekto rýchly a špinavý spôsob, ako to, že? To by mohlo v skutočnosti trvať minútu myslenia. Mám-li - Budem nastaviť problému sa, ako by sa opýtať. Takže ak som 2 premenné,, čo je len číslo že mi dajú, a súčet variabilný B, čo je ďalšie číslo, ktoré som rovnako. Takže ak som tieto 2 premenné, teraz chcem vymeniť je. Tradičné, pomocou pravidelné binárne operátory, myslím, rovnako ako +, -, ÷. Nie bitové operátory, ktoré pôsobia na binárne. Takže pomocou -, +, ÷, a všetci tí. Sme mohli vymeniť tým niečo ako = a + b, a, b = - b, = a - b Takže, zdravý rozum skontrolujte, a potom uvidíme, prečo to funguje. Povedzme = 7, b = 3, potom a + b bude 10. Takže sme teraz nastavenie = 10, a potom robíme b = a - b Takže robíme b = - b, ktorá bude 7, a b = - b znova, alebo = a - b Ktorá bude 10-7 čo je o 3. Takže teraz, správne, "" bolo 7, b je 3, a teraz b je 7 a 'a' je 3. Takže druh dáva zmysel, "" je kombináciou 2 čísel. V tomto bode, "" je kombinácia, a potom sme odpočítaním z pôvodnej b, a potom sme sa odpočíta to, čo bolo pôvodné "." Ale to nefunguje u všetkých čísel. Ak chcete vidieť, uvažujme systém, takže zvyčajne uvažujeme celé čísla ako 32 bitov. Poďme pracovať na niečom, čo je len ako 4 bity. Dúfam, že prísť s dobrým príkladom práve teraz. Takže, ja viem, to bude ľahké. Povedzme, že naše 2 čísla sú 1111, a 1111, takže sme v binárnom teraz. V aktuálnej desatinné miesta, ak chcete myslieť na to, že spôsob, = 15 a b = 15. A tak sme čakali, potom, čo sme ich swap - oni nemajú ani byť rovnaké čísla, ale ja som to takto. Poďme urobiť im nie je rovnaké čísla. Poďme urobiť 1111 a 0001. Tak = 15 a, b = 1. Potom, čo sme je swap, očakávame "" na 1 a b je 15. Takže prvým krokom je = a + b Naše čísla sú len 4 bity široký, takže "", čo je 1111, + b, ktorý je 0001, bude skončiť 10000, ale máme len 4 bity. Takže teraz = 0. A teraz chceme nastaviť b = a - b - v skutočnosti, to stále funguje perfektne. = A - b - uvidíme, či to funguje perfektne. Takže b = 0 - 1, čo by ešte 15, a potom = - b, ktorá by bola 1. Možno, že to funguje. Mám pocit, že je tu dôvod to nefunguje pomocou pravidelné. Dobre, takže práca na predpoklade, že nepracuje s pravidelnými binárnymi operáciami, a budem hľadať - budem Google, aby ste zistili, či je to pravda. Takže chceme urobiť pomocou bitovej operátormi, a záchytný bod tu je XOR. Takže, zavedenie XOR (^), ak ste ho ešte nevideli ešte. Je to opäť, prevádzkovateľ bitový, takže to pôsobí kúsok po kúsku, a to - Ak máte bity 0 a 1, potom to bude 1. Ak máte bity 1 a 0, bude to 1, máte bitov 0 a 0 to bude 0, a ak máte bity 1 a 1, že to bude 0. Takže je to ako OR. Ak je niektorý z bitov je pravda, je to 1, ale na rozdiel od OR, nemôže to byť obaja bity, ktoré sú pravdivé. ALEBO by to byť 1, by XOR mať to byť 0. Takže budeme chcieť použiť XOR tu. Zamyslite sa nad tým na chvíľu, ja idem na Google. No, nemôžete prečítať, že, som v súčasnej dobe na algoritme XOR odkladací stránke. Dúfajme, že to bude vysvetľovať, prečo Nemôžem - To je presne ten algoritmus, ktorý sme práve urobili. Stále nechápem, prečo - som musel len vybral zlý príklad, ale v tomto prípade, kedy "" sa stalo, aby sa stal 0, potom, čo dostal na 5 bitov, takže teraz '"je 0, to je to, čo sa nazýva "integer overflow." Podľa Wikipédie: "Na rozdiel XOR swapu, táto varianta vyžaduje, aby používa niektoré metódy zaručiť, že x + y nespôsobí pretečeniu celého čísla. " Tak to robí problémy, je to integer overflow, ale ja som robil niečo zle. Nie som si istý. Budem sa snažiť prísť s inou. [Študent] No, nie je integer overflow, keď sa snažíte dať číslo tam väčšie ako množstvo bitov, ktoré boli pridelené? Jo. Máme 4 bity. To je - mali sme 4 bity, sme potom skúste pridať 1 k nemu, a tak sme skončili s 5 bitov. Ale piaty bit len ​​dostane odrezať, jo. Mohlo by skutočne - [Študent] Znamená to, že hádzať vám chybu, alebo to robí - to by bolo hodiť chybu? Nie teda, že to žiadna chyba. Keď sa dostanete na úrovni zostavy, špeciálne bit niekde je nastaviť, aby povedal, že bol prepad, ale v C tak nejako jednoducho sa s tým vysporiadať. Vy vlastne nemôžete sa s tým vyrovnať, ak použijete špeciálny montážne návody v C. Poďme sa zamyslieť nad XOR swapu. A ja si myslím, že Wikipedia článok mohol tiež hovoril, že - Takže to tiež vychoval modulárny aritmetiku, takže myslím, že som bol, teoreticky, tým modulárny aritmetiku keď som povedal, že 0-1 je 15 znova. Takže, ktoré by mohli v skutočnosti - na pravidelné procesor, ktorý robí 0-1 = 15. Vzhľadom k tomu, sme sa nakoniec na 0, odpočítame 1, tak potom to jednoducho zabalí späť k 1111. Takže tento algoritmus môže v skutočnosti pracovať, a + b, - b, b -;, ktoré by mohli byť v poriadku. Ale je tu niektoré procesory, ktoré nerobia to, a tak by nebolo v poriadku v týchto špecifických ty. XOR swapu bude fungovať na ľubovoľnom procesore. Dobre. Myšlienka je, že to má byť rovnaké, hoci. Kde sme pomocou XOR nejako získať informácie o ako do 1 premenných, a potom vytiahnite informácie o jednotlivých premenných znovu. Takže má niekto nápady / odpoveď? [Študent odpoveď, nezrozumiteľným] Takže by to malo fungovať, a tiež, XOR je komutatívnej. Bez ohľadu na to, ktorá, aby sa tieto 2 čísla stalo, že sa v tu, Tento výsledok sa bude rovnaká. Tak ^ b je b ^. Môžete tiež vidieť to písaný ako ^ = b, b ^ =, ^ = b znovu. Tak toto je správne, a prečo to funguje, myslím, že z kúskov. Pomocou neveľkého množstva, povedzme 11001, a 01100. Tak to je "", čo je b Tak ^ = b Budeme sa nastavenia 'A' = k XOR týchto 2 vecí. 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 "," keď sa pozriete na desatinné číslo, to bude - nebudete vidieť veľa o vzťahu medzi pôvodným "A" a nový "," ale pri pohľade na kúsky, "" je teraz ako spleti informácií ako pôvodný "A" a pôvodné b. Takže ak vezmeme b ^, vidíme, že skončíme na originál "." A ak vezmeme v pôvodnej "" ^ nového "," vidíme, skončí na pôvodnú b Takže (^ b) ^ b = originál "." A (^ b) ^ = pôvodnej b Tam je - ďalší spôsob, ako vidieť to je niečo, XOR sám o sebe je vždy 0. Takže 1101 ^ 1101, všetky bity sa bude rovnaká. Takže sa to nikdy byť prípad, kedy 1 je 0, a druhý je 1. Tak toto je 0000. To isté s tým. (^ B) ^ b je ako ^ (b ^ b). (B ^ b) bude 0, ^ 0 je jednoducho bude "," pretože všetky bity sú 0. Takže jediné, ktoré sa chystáte byť tam, kde "" je pôvodne 1 - mal ty. A to isté nápad tu, som si celkom istý, že je to tiež komutatívnej. Jo. Povedal som pred tým to bolo komutatívnej. Znaky ^ "," a to je asociatívne, takže teraz (b ^) ^. A my môžeme urobiť b ^ (^). A tak znova, dostaneme pôvodnú b Takže "" je teraz kombinácia 'a' a b dohromady. Pomocou našej novej combo "" hovoríme b = combo '"^ pôvodnej b, dostaneme pôvodné". " A teraz = combo '"^ nový b, čo bol pôvodný - alebo ktorý je teraz to, čo je" "alebo b To je v tomto prípade tu dole. To je = b, starý b Takže teraz je všetko opäť v poriadku vymenil. Ak sa skutočne pozrel na kúsky, b = a ^ b, bude XOR tieto 2, a odpoveď bude to, a potom = ^ b je XORing tieto 2 a odpoveď je táto. Otázky? Dobre. Takže posledný je trochu podstatne ťažšie. [Študent] Myslím, že je otázka o tom. >> Oh, ospravedlňujem sa. [Študent] Čo je to vlastne rýchlejší? Ak použijete tento XOR, alebo je to v prípade deklarovať novú premennú? Takže to, čo je vlastne rýchlejší, deklarovať novú premennú, alebo pomocou XOR vymeniť? Odpoveď je, so všetkou pravdepodobnosťou, dočasné premenné. A to je preto, že akonáhle to zostavujú sa - tak na úrovni zostavy, tam žiadna taká vec ako lokálne premenné alebo žiadne dočasné premenné alebo akejkoľvek z týchto vecí. Sú rovnako ako - tam je pamäť, a tam sú registre. Registre sú, kde sa veci aktívne deje. Nemusíte pridať 2 veci v pamäti, môžete pridať 2 veci v registroch. A vám prinesie veci z pamäti do registrov potom pridať, a potom môžete dať ich späť do pamäte, ale všetky akcie sa stane v registroch. Takže, keď ste pomocou dočasného premennej prístup, zvyčajne to, čo sa stane, je tieto 2 čísla sú už v registroch. A potom z toho bodu na, potom, čo ste vymenili je, to bude len začať používať iný register. Kdekoľvek ste boli pomocou b, bude to len používať register, ktorý bol už ukladania "." Takže to nemusí urobiť nič, čo by skutočne urobiť swap. Jo? [Študent] Ale to tiež zaberie viac pamäte, že jo? To bude trvať len viac pamäte, ak je potrebné uložiť túto dočasnú premennú. Ako keď neskôr použiť túto dočasnú premennú zase niekde, potom - alebo priradiť niečo k tomuto dočasné premenné. Takže ak v každom okamihu "," b v teplote majú odlišné hodnoty, alebo tak niečo, potom to bude mať odlišné umiestnenie v pamäti, ale je pravda, že existuje veľa lokálnych premenných, ktoré bude existovať len v registroch. V takom prípade, je to nikdy dať do pamäte, a tak ste nikdy strácať pamäť. Dobre. Posledná otázka je trochu viac. Takže tu, v tomto CS50 zariadení, je tu slovník. A dôvodom je to, že [? B66] je kontrola pravopisu, kde budete písať pomocou hash tabuľky alebo sa snaží, alebo nejaké dátové štruktúry. Budeš sa písať kontrolu pravopisu, a budete používať tento slovník k tomu, že. Ale pre tento problém, sme len bude vyzerať, aby sa pozrela, ak jediné slovo v slovníku. Takže miesto uloženia celého slovníka v niektorých dátové štruktúry a potom pozerá cez celý dokument, či sa niečo chybne, chceme len nájsť 1 slovo. Takže môžeme len skenovať cez celý slovník a ak nikdy nájsť slovo v celom slovníku, potom tam nebol. Ak sa skenovanie v celom slovníku a vidím slovo, potom sme v pohode, sme ho našli. Je tu hovorí, že chceme začať hľadať na súbor-funkcií pre spracovanie C je, pretože chceme, aby si slovník, ale dám si nápovedu tu, na ktoré funkcie by ste mali myslieť. Budem písať je na Spaces. Takže tie hlavné, že budete chcieť pozrieť na sú f otvorený a potom, nevyhnutne, f uzavretá, ktoré idú na konci programu, a f skenovanie f Dalo by sa tiež použiť f čítať, ale pravdepodobne nebudete chcieť preto, že - nemusíte skončiť potrebovať, že. F skenovanie f je to, čo budete používať na skenovanie cez slovník. A tak nemusíte kódovať roztok sa, nech to skúsi a ako pseudo-kód cestu k riešeniu, a potom budeme diskutovať. A vlastne, pretože som už dal si ty, keď idete do ľubovoľného terminálu alebo vášho spotrebiča shell, Ja by som - ja zvyčajne - ak ste ešte nevideli, ja neviem, či ste v triede, ale človek, takže manuálové stránky, sú veľmi užitočné pre hľadanie v skoro žiadne funkcie. Tak som si to, ako, MAN F, skenovanie f To je teraz informácie o rodine f skenovanie funkcií. Mohol by som tiež urobiť MAN F, otvorené, a že mi dáš detaily, ktoré. Takže ak viete, čo funkcia, ktorú používate, alebo ste čítanie kódu a vidíte nejakú funkciu a ste radi, "Čo to robí?" Len človek, ktorý názov funkcie. Existuje niekoľko podivných prípadov, kedy sa budete musieť povedať ako. man 2, že názov funkcie, alebo man 3, že názov funkcie, ale máte len k tomu, že ak človek názov funkcie sa tak nestane do práce prvýkrát. [Študent] Tak som čítania manuálové stránky pre otvorenú, ale ja som stále zmätená o tom, ako ju používať a programu. Dobre. Mnoho manuálových stránok sú menej ako užitočné. Sú viac užitočné, ak už viete, čo robia a potom stačí si pamätať poradí argumentov, alebo tak niečo. Alebo sa vám môže dať všeobecný prehľad, ale niektoré z nich sú veľmi zdrvujúce. Rovnako ako f skenovanie f, tiež. To vám dáva informácie o všetkých týchto funkcií, a 1 riadok dole tu stane povedať, "F skenovanie f číta reťazec bodu alebo potok." Ale f otvoriť. Tak, ako by sme používať f open? Myšlienka programu, ktorý potrebuje urobiť súbor I / O je, že musíte najprv otvoriť súbor, ktorý chcete robiť veci, a nevyhnutne, čítať veci z tohto súboru a robiť veci s nimi. F otvorená, je to, čo sme použiť na otvorenie súboru. Tá vec sa vrátime, tak to, čo súbor chceme otvoriť, to nám dáva - tu sa hovorí "/ user / share / dict / words." To je súbor, ktorý chceme otvoriť, a chceme ho otvoriť - musíme explicitne zadať, či chceme otvoriť ju prečítať, alebo ak chceme ho otvoriť písať. Je tu pár kombinácií a tak, ale chceme to otvoriť na čítanie. Chceme čítať zo súboru. Takže to, čo robí tento návrat? Vracia súboru hviezdičku (*), a ja si len ukázať všetko v premennej f, tak *, znova, je to ukazovateľ, ale nechceme sa zaoberať s ukazovateľmi. Môžete myslieť na f as, f je teraz premenná, ktorú budete používať na reprezentáciu súboru. Takže ak si chcete prečítať zo súboru, môžete si od f Ak chcete zatvoriť súbor, zatvorte f Takže na konci programu, keď sme nevyhnutne chcete zatvoriť súbor, čo by sme mali urobiť? Chceme ukončiť f Takže teraz posledný súbor funkcie, ktoré budeme chcieť použiť, je skenovanie f, f skenovanie f A čo to robí, je to skenuje cez súbor hľadá vzor, ​​aby zodpovedal. Pri pohľade na manuálové stránke tu, vidíme int f skenovanie f, ignorovať návratové hodnoty pre teraz. Prvý argument je súbor * stream, takže prvý argument budeme chcieť odovzdať, je f Sme skenovanie cez f Druhý argument je formátovací reťazec. Dám vám formátovací reťazec teraz. Myslím, že sme sa náhodou povedať, 127s \ n, veľa z toho je zbytočné. Myšlienka na to, čo tento formát je reťazec, je, že môžete myslieť na f skenovanie ako protiklad tlačovej f Takže tlač f, tlač f môžeme tiež použiť tento typ formátu parametra, ale v tlačovej f, čo robíme, je - poďme sa pozrieť na ekvivalentu. Takže tlačiť f, a je to vlastne aj f f tlač, kde prvý argument je bude f Pri tlači f, dalo by sa povedať niečo ako, "tlač 127s \ n", a potom, ak sme sa prejsť to nejaký reťazec, to bude tlačiť tento reťazec a potom nový riadok. Čo znamená 127, som si celkom istý, ale nikdy som obmedzený som na to, Tie by ani potrebné hovoriť 127 "v tlačovej f, ale to, čo to znamená, je vytlačiť prvých 127 znakov. Takže som si istý, že je to tento prípad. Môžete Googlu za to. Ale v budúcej Som takmer istá, znamená to, že. Tak toto je vytlačiť prvých 127 znakov, nasleduje nový riadok. F skenovanie f teraz, namiesto toho, aby pri pohľade na premenné a jeho tlač, to bude vyzerať na nejakom reťazci, a uložte vzor do premennej. Poďme vlastne použiť skenovanie f v inom príklade. Takže povedzme, že sme mali nejaké int, x = 4, a chceli sme vytvoriť reťazec vyrobený z - chcel vytvoriť reťazec to bolo ako, to príde až oveľa neskôr, niečo, čo je rovnako ako 4.jpg. Takže to môže byť program, kde budete mať súčet čítač, Celkovo proti i, a chcete ušetriť veľa obrázkov. Takže chcete ušetriť I.jpg, kde i je niektorí iterácia vašej slučky. Tak ako sme sa túto reťazec pre túto JPEG? Ak by ste chceli vytlačiť 4.jpg, mohli by sme jednoducho povedať, tlač f,% d.jpg, a potom by vytlačiť pre tento JPEG. Ale ak chceme zachrániť reťazca 4.jpg, používame skenovanie f Takže string s - vlastne sme nemôžem - znak, char s, poďme 100. Tak som deklaroval nejakú ponuku 100 znakov, a to je to, čo sme nevyhnutne bude ukladanie tohto JPEG a Takže budeme používať skenovanie f, a formát, ako by sme povedali% d.jpg aby bolo možné tlačiť 4.jpg, formát to bude% d.jpg. Takže je formát% d.jpg, čo chceme nahradiť% d s je x, a teraz musíme uložiť tento reťazec niekde. A kde budeme ukladať tento reťazec je pole s Takže po tomto riadku kódu, s, ak budeme tlačiť f,% ​​s variabilnou s, to bude tlačiť 4.jpg. Takže f skenovanie f je rovnaký ako skenovanie f, s výnimkou teraz to vyzerá na tento súbor za to, čo pre ukladanie v §. To je to, čo je posledný argument bude. Chceme uložiť - "Scan f rodinu funkcie preverovanie ako podľa formátu snažil nižšie. Ak niektorý sú uložené v umiestnení bodov, ktoré môže vrátiť - " Nie, môžeme byť dobré. Nechajte ma premýšľať o sekundu. Takže skenovanie f nie je - čo to sakra je funkcia, ktorá robí, že? Takže skenovanie f nebude, aby sa celé číslo, a to bodka JPG. Bude to [Mumbles]. Uložiť int premenné v reťazci int C. Čo je táto premenná, alebo to, čo je táto funkcia volá? Áno. To je - áno. Takže to, čo som bol vymedzenie vám bolo skôr s print f, ktoré - ktoré dáva oveľa väčší zmysel, prečo som povedal, to bolo oveľa viac ako tlačové f Scan f je stále niečo ako tlačové f, ale s print f bude skenovať ju a nahradiť premenné a teraz uložte ho v reťazci. Miesto tlače to, uloží ho v reťazci. Takže ignorovať úplne. Stále môžete myslieť špecifikátory formátu ako takého tlačového f Takže teraz, keď sme chceli urobiť 4.jpg vec, že ​​my s Print F, X tohto. Takže to, čo skenovanie f robí - čo sa vaša otázka bude? [Študent] Som len zmätená o tom, čo sa snažíme robiť tu s týmto JPEG. Môžete mi vysvetliť, že 1 viac času? Tak to bolo - to je menej relevent až f skenovanie f teraz, dúfajme, že sa to viazať znovu v nejakom spôsobe. Ale to, čo som pôvodne mala v úmysle ukázať sa - je to vlastne priamo súvisí s týmito [? F5] Budete používať s Print f, kde, že máme 100 obrázkov, a chcete prečítať disk 1.jpg 2.jpg, 3.jpg,. Tak, aby sa to, že budete musieť F Otvorte, a potom sa budete musieť prejsť v reťazci, ktorý chcete otvoriť. Takže by sme chceli otvoriť 1.jpg, s cieľom vytvoriť reťazec, ktorý je 1.jpg, robíme s print f z% d.jpg--sme neurobili pre int i = 0. i <40, i + +. Takže s print f% d.jpg I. Takže po tejto linke, teraz premenná alebo pole s bude 1.jpg. Alebo, 0.jpg, 1.jpg, 2.jpg. A tak môžeme otvoriť, zase, každý obraz pre čítanie. Takže to je to, čo je vytlačiť f robí. Páči sa vám, čo s tlačiť f je teraz robí? [Študent] Dobre, takže to trvá - vytvára reťazec, something.jpg, a uloží ho. Áno. Vytvára - to je iný formát reťazca, rovnako ako f skenovania a tlače f, kde sa vloží všetky premenné do druhej tvrdenie, by mohlo byť to na rozdiel od i Snáď - myslím, že je to prípad. Ale nech už poradí argumentov je. Bude to vložiť všetky premenné do formátu reťazca a potom uložiť do našej pamäti, hovoríme, že vyrovnávacia pamäť, je to, kde sme uloženie reťazec. Takže sme sa skladovanie vnútri S správne-formátovaný reťazec, čo% d bola nahradená 4. [Študent] Takže ak sme to urobili, je premenná f jednoducho bude prevelená? Áno. Takže by sme mali uzavrieť pôvodné f pred vykonaním tohto. Ale - a potom tiež, keby nebolo f otvoriť tu, potom by sme mali hovoriť - Jo. Ale to by otvorilo sto rôznych súborov. [Študent] Ale my by sme neboli schopní pristupovať alebo - v poriadku. Dobre. Takže skenovanie f, f skenovanie f, je druh rovnaké myšlienky, ale namiesto toho, miesto uloženia do reťazca, je to skôr ako teraz ísť cez bodnutie a vzor zodpovedajúce proti tomuto reťazcu a ukladanie výsledkov do premenných. Môžete použiť skenovanie f analyzovať nad niečím ako 4.jpg, a uložiť celé číslo 4 do x súčet int. To je to, čo môžeme použiť skenovanie f pre. F skenovanie f je robiť, že na príkazovom riadku. Som vlastne celkom istý, že toto je to, čo knižnica CS50 robí. Takže keď hovoríte, "dostať int," to je skenovanie f-ing po - scan f je spôsob, ako dostať vstup od užívateľa. F skenovanie f bude robiť to isté, ale pomocou súboru na skenovanie cez. Tak tu sme sa skenovanie cez tento súbor. Vzor sa snažíme, aby zodpovedali určitej reťazec, ktorý je 127 znakov nasleduje nový riadok Takže som si istá, že by sme mohli dokonca len povedať, "odpovedá s," pretože v slovníku máme sa stalo, že, my sme zaručená žiadne slovo je tak dlho, a tiež f skenovanie f, myslím, sa zastaví na novom riadku bez ohľadu na to, čo. Ale budeme zahŕňať nový riadok v zápase, a - [Študent] Ak by sme nemali obsahovať nový riadok, nebolo by to nájsť časti slova? Je - každá - pri pohľade na slovníku - Takže v slovníku, sú všetky naše slová. Každý z nich je na novom riadku. F skenovanie bude vyzdvihnúť toto slovo. Ak sa nezahŕňajú nový riadok, potom je možné, že budúci skenovanie f bude len čítať nový riadok. Ale vrátane nového riadku potom bude jednoducho ignorovať nový riadok. Ale my nikdy dostať časť slova, pretože sme vždy čítania až na nový riadok, bez ohľadu na to, čo. [Študent] Ale čo keď ste vyhľadať slovo "Cissa," ako Cissa. Bude to nájsť to, a hovoriť, že je to zápas? Tak tu - to bude čítať v - je to vlastne dobrý bod. My sa nikdy používať existujúce - slovo, ktoré hľadáte, je prvý argument na príkazovom riadku. Takže string, slovo = ArGV 1. Takže reťazec hľadáme, je ArGV 1. Nie sme hľadať slovo vôbec v našom skenovanie f To, čo sme robili so skenovacím f je stále každé slovo v slovníku, a potom ešte raz máme, že slovo ideme použiť strcmp porovnať ich. Budeme porovnávať naše slovo a to, čo sme práve prečítali dovnútra Takže nevyhnutne, budeme nakoniec robiť veľa skenovanie fs kým to len tak sa stane, že scan f vráti - vráti jeden, tak dlho, ako to bolo uzatvorené nové slovo, a vráti niečo iné, akonáhle to nedržal slovo. Čítame v celom slovníku, skladovanie riadok po riadku každé slovo do premennej s Potom sme sa porovnaním slovo s s, a v prípade, že porovnanie == 0, strcmp stane, aby 0, ak zápas bol vyrobený. Takže ak to bolo 0, potom môžeme vytlačiť f, uzavreté, alebo slovo v slovníku, alebo čo chcete tlačiť f A potom - my nechceme f zavrieť znova a znova. To je ten druh vecí, čo chceme urobiť, a my nie sme len hľadáte slovo v slovníku. Takže by sme mohli urobiť to, že ak by sme sa chceli pozrieť na ich vzoru, Cissa, ako si hovoril predtým, ak by sme chceli hľadať za týmto vzorom, potom by to zlyhanie v prípade pretože to nie je vlastne slovo, ale jedno zo slov v slovníku sa stane, že, že v ňom. Tak to by zodpovedalo toto slovo, ale to podmnožina slova nie je slovo samo o sebe. Ale to nie je, ako sme používať, budeme čítať v každom slove a následné porovnanie slovo máme s týmto slovom. Takže sme stále nákupný plných slov. Môžem odoslať definitívne riešenie neskôr. To je druh takmer na správnu odpoveď, myslím. [Študent komentár, nezrozumiteľným] Oh, som sa zbaviť skôr, než? Char s, myslím, že sme si povedali, 127 - zabudol som, čo najväčší je. Budeme jednoducho robiť 128, takže teraz je dosť dlhá. Nepotrebujeme tlačiť čokoľvek. Sme tiež bude chcieť bude musieť ukončiť svoju súbor, a ktoré by mali byť o správnu odpoveď. CS50.TV