[Powered by Google Translate] [§ 4] [menej komfortné] [Nate Hardison] [Harvard University] [To je CS50.] [CS50.TV] Dobre, vitajte späť do oddielu. V tomto týždni sa časti budeme robiť pár vecí. Budeme najprv nastaviť rekapitulácia Problém 2, ktorá je Caesar a Vigenère problém set. A potom budeme ponoriť sa do Quiz hodnotenie 0 a stráviť trochu času rekapituluje, čo sme hovorili o tom v každom z prednášok tak ďaleko, a my tiež urobiť niekoľko problémov z predchádzajúceho roka kvízy. Tak vy máte dobrý spôsob, ako sa pripraviť na to. Ak chcete začať, som naštartoval až na pár dobrých riešení pre predchádzajúce problému nastavenie, Problem Set 2, do tohto priestoru. Ak ste všetko hit odkaz, a ak kliknete moje meno a kliknite na svoje prvé revíziu uvidíte caesar.c, čo je presne to, čo som pri pohľade na. Poďme si o tom pohovoriť naozaj rýchlo. To je len ukážka riešenia. Toto nie je nevyhnutne dokonalé riešenie. Existuje mnoho rôznych spôsobov, ako napísať to, ale existuje niekoľko vecí, ktoré som chcel zdôrazniť že som videl, keď som bol triedenie, časté chyby, ktoré si myslím, že Toto riešenie má veľmi dobrú prácu manipuláciu. Prvý má nejaký hlavičke komentármi hore. Na tratiach 1 až 7 sa zobrazia podrobnosti, čo presne tento program robí. Dobrý bežná prax, keď píšete kód v jazyku C bez ohľadu na to, ak je váš program obsiahnuté v jednom súbore alebo či už je to rozdelené na viac súborov, je mať nejaký orientovať komentár hore. To je tiež pre ľudí, ktorí idú von a písať kód v reálnom svete. To je miesto, kde sa bude dať informácie o autorských právach. Nižšie sú # obsahuje. Na riadku 16 je tu tento # define, ktorá sa vrátime v len trochu. A potom ešte raz spustí funkcie, jednou hlavnou štartov, pretože tento program bol obsiahnuté v jedinom funkciu Úplne prvá vec, ktorá sa stane a to je veľmi frazeológie a typické programu C ktorý berie v príkazovom riadku argumentov, je to, že okamžite skontroluje pre počet argumentov, argc. Práve tu vidíme, že tento program ich čaká 2 argumenty presne. Pamätajte si, že to, že prvý argument, že je to výnimočný že je vždy názov programu, ktorý je prevádzkovaný, názov spustiteľného súboru. A tak, čo to robí, je, že zabráni užívateľovi spustenie programu s viac alebo menej argumentov. Dôvodom chceme skontrolovať tohto práva ďaleko je, pretože nemôžeme skutočne prístup k tejto ArGV poľa tu spoľahlivo kým som skontroloval, ako je veľký. Jedným zo spoločných chýb, ktoré som videl boli ľudia by okamžite ísť a drapák ArGV [1]. Oni si urvat kľúče argumentu z poľa a to sa aj kontrolu na to, a potom by urobiť test na argc, rovnako ako ďalší test, či je alebo nie je prvý argument bol skutočne celé číslo v rovnakom čase, a že nefunguje, pretože v prípade, že nie sú dodávané argumenty budete popada argument, že tam nie je, alebo sa pokúša chytiť ten, ktorý tam nie je. Ďalšia veľká vec, že ​​si všimnete, je, že vždy chcete vytlačiť nejaký užitočných chybové správy pre užívateľov orientovať je. Som si istý, že ste všetci spúšťať programy, kde zrazu spadne, a získajte tento smiešny malý dialóg, ktorý sa objaví a povie niečo hrozne tajomné a možno vám chybový kód alebo niečo také to nedáva zmysel. To je miesto, kde si naozaj chcete, aby niečo užitočného a cielené na užívateľa tak, že pri spustení to idú "Ach," tvár dlaň. "Viem presne, čo robiť. Viem, ako to opraviť." Ak nechcete vytlačiť správu, potom môžete skončiť v skutočnosti takže užívateľ ísť preskúmať svoj zdrojový kód prísť na to, čo sa stalo. Tam sú tiež niektoré časy, ktoré budete používať rôzne chybové kódy. Tu sme len použitý jeden povedať, že bola chyba, došlo k chybe, došlo k chybe. Väčšie programy, často programy, ktoré sú volány inými programami, vráti nejaký osobitný chybových kódov v rôznych situáciách programovo komunikovať to, čo by inak stačí použiť peknou anglickou správu pre. Cool. Pretože pracujeme sa, môžete vidieť, že vytiahnuť kľúč z Testujeme, či kľúč zapadá. Dostávame správu od užívateľa. Dôvod, prečo sme to v tom robiť, keď slučka-a to je niečo, čo sa budeme zaoberať v trochu, ale ukázalo sa, že ak zadáte ovládanie D keď sa dostanete, že GetString riadku na termináli čo to vlastne robí, je, že pošle špeciálny znak programu. Hovorí sa tomu ELF alebo koniec súboru znak. A v tomto prípade, bude naša správa reťazec je null, takže to nie je niečo, čo sme preverili v problému sama stanovila. Ale ako budeme pokračovať, teraz, keď sme začali hovoriť o ukazovatele a dynamické prideľovanie pamäte na haldy, kontrola null, kedykoľvek máte funkciu, ktorá by mohla vrátiť hodnotu null ako hodnota je niečo, čo budete chcieť dostať vo zvyku robiť. To je tu predovšetkým pre ilustráciu. Ale keď vidím GetString v budúcnosti, tak z problému Vytvoriť 4 na, budete chcieť, aby to na pamäti. Opäť, to nie je otázka pre problém Set 3 buď, pretože sme sa nevzťahuje to ešte. Nakoniec sme sa k tejto časti, kde sa dostaneme do hlavného šifrovanie slučky, a je tu pár vecí tu deje. Po prvé, sme sa určiť iteráciou cez celý reťazec správy samotnej. Tu sme držali strlen volanie v stave, ktoré mnohí z vás upozornili, nie je skvelý spôsob, ako ísť. Ukázalo sa, že v tomto prípade je to tiež nie je veľký, čiastočne preto, že sme modifikáciu obsahu samotnej správy vnútri slučky for, takže ak máme správu, ktorá je 10 znakov, prvýkrát sme kto, že pre vedenie strlen vráti čo? 10. Ale ak sme potom upraviť správu, že sme zmeniť jeho 5. charakter, a hodíme do \ 0 znak v 5. pozícii, na následné iterácii strlen (správa) sa nevráti to, čo urobil Vôbec prvýkrát sme zopakovali, ale namiesto toho vráti 5, pretože sme hodili v tomto null terminátor, a reťazec je dĺžka je definovaná podľa polohy tohto \ 0. V tomto prípade, je to skvelý spôsob, ako ísť, pretože sme úpravou na mieste. Ale zistíte, že je to vlastne prekvapivo jednoduché šifrovanie ak môžete získať matematika správne. Všetko, čo je potrebné je skontrolovať, či alebo nie list, ktorý ste pri pohľade na je veľká alebo malé písmená. Dôvod, prečo sme len pre kontrolu, že a nemáme pre kontrolu je alfa prípad je, pretože ak znak je veľká alebo, ak je to malé potom je to určite abecedný znak, pretože nemáme malá a veľká číslice. Ďalšia vec, ktorú robíme, a to je trochu zložitejšie, je sme upravili štandardný Caesara vzorca že sme dali v špecifikácii problému set. Aký je rozdiel tu je, že odpočíta v prípade veľkým kapitálom, a potom sme pridali kapitál A späť na konci. Viem, že niektorí z vás to urobil vo vašom kóde. Bolo niekto z vás to vo vašich príspevkov? To si urobil ty. Môžete mi vysvetliť, čo to robí, Sahb? Odpočítaním to, pretože ste mod hneď po ňom, budete musieť vziať to tak, že spôsob, akým sa dostať [kašeľ] pozície. A potom pridaním späť neskôr si prehodili ten, ktorý ste chceli. Jo, presne tak. What Sahb povedal, bolo, že keď budeme chcieť pridať naše posolstvo a naším hlavným spoločne a potom mod, že mod že NUM_LETTERS, ak sa nezhromažďujú našej správu do príslušnej 0-25 rozsahu ako prvý, potom by sme mohli skončiť dostať naozaj divný číslo pretože hodnoty, ktoré sme pri pohľade na, keď sa pozrieme na správy [i], keď sa pozrieme na tej charakteru našej prostý textové správy, je hodnota niekde v tomto rozsahu 65 až 122 na základe hodnôt ASCII pre veľké a až malé písmená z A tak, keď sme mod ju 26 alebo NUM_LETTERS, pretože to bol náš # define vpravo hore tu, , Čo sa deje, aby nám hodnotu, ktorá je v rozmedzí 0 až 25, a my potrebujeme spôsob, ako potom škálovanie, že zálohovať a dostať sa do príslušnej ASCII rozsahu. Najjednoduchší spôsob, ako to urobiť, je len mierka všetko dole do 0-25 rozmedzí začať, a potom sa posunie všetko späť až na konci. Ďalšou častou chybou, že som videl ľudí bežať do je, že ak nemáte skutočne urobiť škálovanie hneď pridať správu a kľúč dohromady a pridať ich, povedzme, do char premenné, problém s tým je od správy [i] je pomerne veľký počet začať s- pamätajte, že je to minimálne 65, ak je to veľká postava- Ak máte veľký kľúč, povedzme, niečo ako 100, a pridáte tie 2 spolu do podpísaná char budeš dostať pretečeniu. Budeš si hodnotu, ktorá je väčšia ako 127, čo je najväčšia hodnota, ktorú char premenná môže držať. Opäť platí, že je to dôvod, prečo by ste chceli robiť takéto veci začať. Niektorí ľudia dostali okolo tomto prípade tým, že robí ak inde a testovanie vidieť, keď by pretečeniu pred tým, že ale tento spôsob sa dostane okolo toho. A potom sa v tomto riešení sme vytlačiť celý reťazec až na samom konci. Ostatní ľudia vytlačiť znak v čase. Obaja sú úžasné. V tomto bode, to vy máte nejaké otázky, pripomienky ohľadne tejto? Čo sa vám páči, veci sa vám nepáči? Mal som otázku. Možno mi to uniklo počas vysvetlenie, ale ako sa tento program preskočiť medzery pre pripojenie kľúč k dĺžke textu? To je len Caesarovho šifra. >> Oh, prepáč, jo. Jo, uvidíme, že. V kóde Caesar sme okolo toho, pretože my len prevrátený znaky. Máme len otočil je, ak boli veľké alebo malé písmená. Vy pocit docela dobrý o tom? Neváhajte kopírovať tento domov, vezmite si ju, porovnaní s tým, čo ste napísal. Rozhodne neváhajte a pošlite otázky o tom taky. A opäť si uvedomiť, že cieľom tu so svojim problémom sety nie je dostať vy písať dokonalé kód pre vaše problémové súbory. Je to vzdelávacia skúsenosť. Jo. Späť na DO, kým slučka, ak sa rovná nula, takže null len znamená nič, jednoducho stlačte klávesu Enter? Null je špeciálny ukazovateľ hodnoty, a používame null, keď chceme povedať, máme ukazovateľ premennú, ktorá smerovala k ničomu. A tak typicky to znamená, že táto premenná, táto správa premenná je prázdny, a tu, pretože sme pomocou CS50 špeciálny typ reťazca, čo je CS50 string typ? Už ste videli, čo to je, keď Dávid vytiahol kapucni v prednáške? Je to funky-je to ukazovateľ, že jo? Dobre, jo. >> Je to char *. A tak naozaj sme mohli nahradiť tento tu s char * správy, a tak GetString funkcie, ak to nie je úspešne dostať reťazec od užívateľa, nemôže analyzovať reťazec, a jeden prípad, v ktorom sa nemôže analyzovať reťazec ak je užívateľ zadá koniec súboru znak, ovládacie D, čo nie je niečo, čo zvyčajne robia, ale keď sa to stane potom funkcia vráti túto hodnotu null ako spôsob, ako hovorí "Hej, ja som nedostal reťazec." Čo by sa stalo, keby sme nedávajte message = null, čo je niečo, sme to robili ešte? Prečo by to byť problém tu? Pretože viem, že sme spolu hovorili trochu v prednáške o pretečeniu pamäte. Jo, poďme to urobiť, a uvidíme, čo sa stane. Vasila Blaženého otázka bola, čo sa stane, ak nebudeme skutočne mať Táto správa = null test? Poďme prejdite až na vrchol. Vy môžete komentovať to. Vlastne, ja budem šetriť ho v revízii. To bude revízia 3. Čo budete musieť urobiť, aby spustenie tohto programu je budete musieť kliknúť na tento ikonu ozubeného kolieska tu, a budete musieť pridať argument k tomu. Budete musieť dať Kľúčovým argumentom, pretože chceme odovzdať argument príkazového riadku. Tu budem dávať mu číslo 3. Páči sa mi 3. Teraz zoom späť, spustenie programu. Je to beh, zostavovanie, stavebniny. Ideme na to. Je to čaká na vyzvanie. Ak píšem v niečom ako hello ak to šlo? Oh, môj program trvalo príliš dlho bežať. Bol som jawing príliš dlho. Tu to ide. Teraz som písať ahoj. Vidíme, že šifruje vhodne. Teraz, čo sa stane, keď budeme robiť rýchle GetString vrátiť null? Nezabudni, že povedať, že sme, že po stlačení ovládacieho D v rovnakom čase. Budem prechádzať sem. Urobíme to znova. Budova. Tam to ide. Teraz, keď som narazila ovládanie D Dostal som tento riadok, ktorý hovorí opt/sandbox50/bin/run.sh, Segmentation fault. Už ste videli, že predtým? [Študent] Prečo nie >> ľúto? [Študent] Prečo nie je core dump v tomto prípade? Jadro dump je-otázka je prečo nie je core dump tu? Otázka je, že môže byť, ale core dump je súbor , Ktorý sa uloží na pevný disk. V tomto prípade sme zakázaná core dump na úteku serveri tak, aby nemáme ľudí seg kritizovať a vybudovanie ton core dump. Ale môžete si ho. Základné skládok sú také veci, ktoré môžete často zakázať, a niekedy to. Segmentation fault, aby som odpovedal na vašu otázku, Basil, sa hovorí, že sme sa snažili pristupovať ukazovateľ , Ktorý nebol nastavený, aby ukazoval na čokoľvek. Nezabudnite Binky vo videu, kedy Binky sa snaží ísť prístup ukazovateľ, ktorý nie je smerujúce k ničomu? V tomto prípade myslím, že technicky ukazovateľ ukazuje na niečo. Je to ukazuje na null, čo je technicky 0, ale, ktorý je definovaný ako v segmente, ktorý nie je prístupný váš program, takže získate Segmentation fault pretože nie ste prístup pamäť, ktorá je v platnej segmente ako haldy segmentu alebo zásobníka segment alebo dátového segmentu. Cool. Nejaké ďalšie otázky o Caesarovi? Poďme ďalej. Poďme sa pozrieť na revízie 2 naozaj rýchlo. To je Vigenère. Tu v Vigenère prejdeme tento docela rýchlo, pretože znovu, Vigenère a Caesar sú veľmi podobné. Header komentár je skôr, # Define je pred vyhnúť sa používanie týchto magických čísel. Pekná vec je, že sme chceli prejsť na iný abeceda alebo niečo také. Skôr než by museli ísť ručne zmeniť všetky 26 rokov v kóde môžeme to zmeniť na 27 alebo pádu dole ak sme používali rôzne abecedy, rôzne jazyky. Opäť, máme túto kontrolu na počet argumentov, a naozaj môžete takmer brať ako šablónu. Skoro každý program, ktorý by mal mať zápis- keby to malo trvať argumentov na príkazovom riadku-niektoré sekvencie z liniek že číta takto na začiatku. To je jedna z prvých zdravý rozum testov, ktoré chcete robiť. Tu, čo sme urobili, bolo sme iste, že kľúčové slovo je platný, a že bol druhý kontrola, že sme urobili. Všimnite si, opäť, že sme sa rozišli to z argc a 2. Všimnite si, že v tomto prípade jedna vec, že ​​sme museli urobiť, bolo miesto použitie až aj my sme chceli overiť celý reťazec, a aby k tomu, že ste skutočne ísť znak po znaku cez reťazec. Neexistuje žiadny dobrý spôsob, ako volať niečo na ňom pretože aj, napríklad, až i vráti 0 , Pokiaľ nie je analyzovať celé číslo, tak, že sa ani pracovať. Opäť, pekný správa musí užívateľovi oznámiť, čo presne sa stalo. Potom tu, zase sme tiež zvládnuť prípad, kedy používateľ zadá do ovládacieho D náhodný charakter. A potom Charlotte mal otázku skôr, o tom, ako sa nám podarí preskočiť medzery v našom reťazci tu. To bolo trochu podobné tomu, čo sme robili s Myspace programu že sme v bode, a tak to fungovalo je to, že sme sledovali počet listov, ktoré sme videli. Keď sme šli cez správy reťazca, ako sme šli cez znak po znaku, sme sledovali index ako súčasť našej slučky for, a potom sme tiež sledovaná počet písmen, tak non-špeciálne znaky, non-číslice, non-white space že sme videli v samostatnej premennej. A potom toto riešenie upravuje kľúč získať aktuálne kľúč celé číslo, a to robí, že za behu, priamo pred to potom ide na zašifrovanie aktuálne správy charakter. Tam sú niektoré riešenia, ktoré boli dokonale taky skvelé ktoré by zmeniť kľúč sa pri testovaní pre kľúč platnosti. Okrem toho, že sa uistil, že charakter a kľúčové slovo bol znak abecedy tiež ukázalo, že na celé číslo v rozmedzí 0 až 25, aby potom prejdite majú čo do činenia, že neskôr v tomto pre slučke. Opäť, tu vidíte je to naozaj presne rovnaký kód že sme použili Caesar v tomto bode. Robíte presne to isté, takže skutočný trik je prísť na to, ako premeniť na základe kľúčového slova na celé číslo. Jedna vec, že ​​sme tu, že je málo hustá je, že sme zopakoval túto frázu, myslím, že by ste mohli nazvať, 3 samostatné časy na tratiach 58, 59, a 61. Môže mi niekto vysvetliť, čo presne táto fráza robí? Je to prístup postavu, ako si povedal. Jo, je to [nepočuteľné] znak na kľúčové slovo, a tak je to číslo videli písmen, pretože ste len pohybujúce sa kľúčové slovo, akonáhle ste videli ten list, tak, že sa to skutočne preskočiť medzery a tak podobne. Jo, presne tak. A potom, akonáhle ste videli kľúčové slovo prázdne stačí mod takže sa vrátiť okolo. Presne tak. To je perfektné vysvetlenie. To, čo Kevin povedal, je, že chceme, aby index do dané kľúčové slovo. Chceme sa dostať na num_letters_seen charakter, ak chcete, ale keď num_letters_seen presahuje dĺžku kľúčových slov, spôsob, akým sa dostať späť do náležitého rozsahu ich budeme používať mod operátora efektívne zabaliť okolo. Napríklad, rovnako ako v krátkej, naše kľúčové slovo je slanina, a je to 5 znakov dlhé. Ale my sme videli 6 písmen v našom formáte obyčajného textu v tomto bode a šifrované 6. Budeme skončiť prístup k num_letters_seen, čo je 6, mod dĺžka kľúčového slova, 5, a tak dostaneme 1, a tak čo budeme robiť, je stretneme prístup prvý znak vo vnútri nášho kľúčového slova v tomto bode. Dobre, nejaké otázky na Vigenère skôr než prejdeme? Vy pocit docela dobrý o tom? Cool, skvelé. Chcem sa uistiť, že vy ste dostať šancu vidieť kód že si myslíme, že vyzerá dobre a majú šancu učiť sa od neho. To bude posledná budeme pomocou medzier v súčasnej dobe, a budeme prechod teraz, a ja ísť na cs50.net/lectures takže môžeme urobiť trochu preskúmanie kvíz. Najlepší spôsob, ako si myslím, začať robiť kvíz recenzia je prísť na tejto stránke prednášky, cs50.net/lectures, a pod každou z týždňa čísel, takže keď som sa pozrieť tu v týždni 0, Vidím, že máme zoznam tém, ktoré sme prebrali v týždni 0. Ak niektorý z týchto tém sa zdá neznáme pre vás budete určite chcieť vrátiť späť a prečesať skriptá a možno dokonca preletieť prednášok, pozerať sa na ne znova, ak chcete získať pocit, pre to, čo sa deje s každým z týchto tém. Poviem navyše tento rok jeden z chladných zdrojov sme dostali je, že tieto šortky, ktoré sme vytvorili, a keď sa pozriete v týždni 0, nemáme všetky preberaných témach, ale máme docela málo z nich, niektoré zložitejšie, preto je sledovanie týchto krátkych znova je dobrý spôsob, ako sa dostať až do rýchlosti. Najmä, ja dám do zásuvky pre 3 na dne, pretože som robil ty. Ale ak ste zápasí s binárne, bity, šesťhranné, že druh veci, binárny je skvelé miesto pre štart. ASCII je ešte jeden, ktorý je dobrý pre zobrazenie príliš. Môžete dokonca sledovať ma na 1.5x rýchlosti, ak budem príliš pomalý pre vás. Pretože je to hodnotenie, neváhajte to urobiť. Stačí začať naozaj rýchlo, budeme prejsť pár týchto vedomostných problémov len rýchlo chrliť cez tieto. Napríklad, poďme sa pozrieť na problém 16, že mám priamo tu na stole. Máme tento nasledujúci výpočet v binárnej, a chceme ukázať nejakú prácu. Dobre, ja ti dám to výstrel. Vy by mala nasledovať spolu s papierom, a my urobíme to naozaj rýchlo. Ak chceme vykonávať nasledujúce výpočet v binárnom kóde. Mám 00110010. A budem sa pridať k nej 00.110.010. Pre matematiky géniov po spolu doma, je to skutočne vynásobením 2. Poďme začať. Budeme sledovať rovnaký sčítanie algoritmus, ktorý my keď pridáme desatinné čísla dohromady. Naozaj jediný rozdiel je, že sme slučka späť okolo akonáhle budeme mať 1 + 1 miesto, akonáhle sme sa dostali do 10. Ak vychádzame z práva, naozaj rýchlo, čo je prvá číslica? [Študent] 0. >> [Nate H.] 0. Skvelé, druhá číslica? [Študent] 1. [Nate H.] Je to 1? 1 + 1 je? [Študent] 10. [Nate H.] Presne tak, takže to, čo je číslica, že píšem priamo pod 2 tie sčítajú? [Študent] 1, 0, alebo 0 a potom niesť 1. [Nate H.] 0 a niesť 1, presne. Ďalej jeden hore, Basile, ty si hore. Čo je to tretie? >> [Basil] 1. [Nate H.] 1, perfektné. Kevin? [Kevin] 0. >> [Nate H.] 0, Charlotte? [Charlotte] 0. >> [Nate H.] Jo, a čo mám robiť? [Študent] 1. [Nate H.] A čo mám robiť? A potom som niesť 1. Perfektné, Sahb? >> [Sahb] Teraz máte 1. [Nate H.] A mám robiť tu niečo? [Sahb] Potom pre budúci máte 1, pretože ste robili znova 1. [Nate H.] Skvelé, takže tu môžeme dokončiť ju. Cool. [Študent] Má 0 + 0 = 0? 0 + 0 = 0. 1 + 1, ako si povedal, je 10, alebo 1, 0, skôr. 10 je chybný, pretože sa mi 10 znamená počet 10, a je to vtip, ako sme reprezentovať to, keď sme písanie. Zastupujeme číslo 2 v 1, 0, a číslo 10 je mierne odlišná. Čo je celkom pekné o binárny je, že tam naozaj nie je, že veľa prípadoch musíte naučiť. K dispozícii je 0 + 0 = 0, 0 + 1 = 1, 1 + 1 je 0, a potom niesť 1, a potom môžete vidieť tu na treťom stĺpci sprava sme mali 1, 1, a 1. A 1 + 1 + 1 je 1, a nosíte ďalšie 1. Keď robíte binárne sčítanie, veľmi jednoduchý. Ja by som to ešte pár z nich do sanity check sami predtým, než idete do systému, pretože je to Asi niečo, čo uvidíme na kvíz. Teraz poďme to urobiť budúci rovnako. Poďme urobiť problém 17. Budeme previesť nasledujúce binárne číslo na desiatkové. Mám 10100111001. Zapamätať si ma na binárne videu, že som to urobil Prešiel som pár príkladov, a som ukazoval, ako všetko funguje, keď robíte to v desiatkovej sústave. Keď pracujete v desiatkovej sústavy Myslím, že sme v tomto bode v našom živote tak plynule v tom, že je to celkom ľahké zakryť mechaniku, ako to vlastne funguje. Ale urobiť rýchlu rekapituláciu, keď mám číslo 137 to vlastne znamená a znova, je to v desiatkovej sústavy, číslo 137 v desiatkovej sústave znamená, že mám 1 x 100 + 3 x 10 + 7 x 1. To všetko je zostať na obrazovke. A potom, keď sa pozriete na týchto číslach tu, 100, 10 a 1, zistíte, že sú to vlastne všetky sily 10. Mám 10 m², 10 ¹, a 10 na nulu. Máme podobný druh veci v binárnej, okrem toho, že naša základňa, ako mu hovoríme, je 2 miesto 10. Tieto 10s, že som napísal tu na dne, Tento 10 ², 10 ¹, 10 k nulovej, 10 je naša základňa, a exponent, 0, 1, alebo 2, je naznačené na pozícii číslice v čísle, ktoré píšeme. 1, ak sa na neho pozrieme, to 1 v 2. pozícii. 3 je v prvej polohe, a 7 je v polohe 0.. To je, ako sme si rôzne exponentmi nižšie na našich základní. Po všetko Dáme-vlastne, vieš čo? Urobíme Ak sa môj tlačidlo Späť ísť? Tam to ide. I love this vrátiť vec. Po tomto Myslím, že aspoň pre mňa Najjednoduchší spôsob, ako začať konverziu binárne číslo alebo šestnástkovej číslo, kde základ je 16 a nie 10 alebo 2, je ísť dopredu a zapísať podklady a exponentmi pre všetky čísla v mojej binárne číslo na vrchole. Ak začneme zľava doprava znova, ktorý je tak trochu neintuitívne, Budem zmeniť späť na čiernu tu, máme 2 do 0. polohy, a potom máme 2 ¹, ² 2, a potom 2 na 3, 2 na 4, 2 na 5, 6, 7, 8, 9, a 10. Tieto čísla som napísal von, sú všetky exponenty. Len som napísal základy tu v prvej 3 len pre priestor. Na tomto mieste budem pokračovať, a ja som vlastne ísť zmazať veci, ktoré sme urobili v desiatkovej sústave, ak je to v poriadku. Vy ste všetci dostali to. Tí z vás, sledovanie on-line Som si istý, že bude môcť pretočiť ma, či by ste chceli. Prepnutie späť na pero. Teraz, čo sa dá robiť ak vy nie ste úplne až na rýchlosť na vašich právomocí 2, to je úplne v pohode. To sa stáva. Chápem. Raz som mal pohovor, kde mi bolo povedané, čo by som mal vedieť všetky sily 2 až cez 2 do 30.. Nebolo to práca, ktorú som dostal. Mimochodom, môžete vy choďte do toho a to spočítajte tu, ale s binárne nemá moc zmysel, a ani to zmysel s desiatkovej, alebo šestnástkovej buď, si to spočítajte, kde budete mať nuly. Môžete vidieť mám 0 tu, je tu 0, 0 tu, 0 tu, 0 tu, 0 tu. Prečo by to nemalo zmysel robiť skutočné matematiky pre výpočet zodpovedajúcej silu 2 pre túto pozíciu? Presne, ako povedala Charlotte, bude to 0. Pokojne ušetriť čas, ak výpočtu sily 2 nie je vaša silná stránka. V tomto prípade sa stačí spočítať pre 2 na 0, ktorý je-? [Študent] 1. [Nate H.] 1, 2 na 3, ktorá je-? [Študent] 8. >> [Nate H.] 8. 2 až 4? [Študent] 2. Je mi ľúto, 1. [Nate H.] 2 do 4 je 16, presne. 2 k 5, Kevin? >> 32. [Nate H.] 32, 2 na 8? [Študent] 32 x 8, 256. [Nate H.] Perfect. A 2 na 10? [Študent] 1024. [Nate H.] Jo, 1024. Akonáhle sme dostali tieto čísla môžeme zhŕňajú ich všetky. A to je miesto, kde je to naozaj dôležité, aby to pár vecí. Jedným z nich je ísť pomaly a skontrolovať svoju prácu. Môžete povedať, že je tu 1 na konci tohto čísla, tak som určite dostať nepárne číslo ako môj výsledok, pretože všetky tie ostatné sa bude aj čísla vzhľadom k tomu, že je to binárne číslo. Druhá vec, ktorú musíte urobiť, je, ak sa dostanete do tohto bodu na skúšky a vy ste to napísal tak ďaleko a máte málo času pozrieť sa na počet bodov, ktoré tento problém stojí. Tento problém, ako môžete vidieť, keď som otočiť späť do svojho notebooku naozaj rýchlo- tento problém je za 2 body, takže to nie je ten druh Okrem mali by ste ísť cez ak ste naozaj v časovej tiesni. Ale budeme prepnúť späť na iPad, a pôjdeme cez to naozaj rýchlo. Páči sa mi robiť malé množstvo prvého pretože som zistil, že jednoduchšie. Páči sa mi 32 a 8, pretože oni idú spolu celkom ľahko, a dostaneme 50. 16 a 1 dostane 17. Tam sme sa 57, a potom môžeme urobiť zvyšok tohto, tak môžeme urobiť 57, 156. Poď. Man, dobre, uvidíme. Mali sme 57, 256, a 1024. V tomto bode, by som radšej prejsť. Nemám tušenie. Jasne som potrebné, aby si prečítali na túto tému. 7, 6, a 4, dostanete 17. 1, 5, 5, 2, 13. Potom dostaneme 3, a potom sme si 1. 1337. Veľkonočné vajíčko, niekto? Niekto spoznať toto číslo? Chris rozpozná číslo. Čo to znamená, Chrisi? [Chris] Leet. Leet, takže keď sa pozriete na to, vyzerá to, že Leet. Hacker veci. Dajte si pozor na takéto veci na strednodobé alebo kvíz, skôr. Ak vidíte, že takéto veci a ste premýšľal "Hm," , Ktorý by mohol niečo znamenať. Neviem. David rád uvedenie dovnútra Je to dobrý spôsob, ako zdravý rozum skontrolovať. Rovnako ako v poriadku, môžem vidieť, čo sa deje. To je týždeň 0/Week 1 veci. Ak by sme prepnete späť do nášho notebooku teraz, oddialiť, a pár ďalších vecí. Tam je ASCII, ktoré sme robili veľa s problémovými sad. Tento pojem kapitálu A. Čo je to vlastne? Vedieť, že je to desatinné číslo. 65 je to, čo je mapovaná v ASCII tabuľke, a to preto, ako počítač píše to, a to je, ako sme sa dostať preč sa písaním charakter kapitálu a charakter malé písmená v niektorých z týchto riešení a problémov sád, ktoré ste robili. Pár ďalších vecí. Máme vyhlásenie, logické výrazy, podmienky, cykly, premenné a vlákien. Tí všetci Zdá sa, že zmysel pre najviac sa rozdeliť? Niektoré z tejto terminológie je trochu funky občas. Rád si o vyhlásenie ako najviac časť niečoho, čo končí bodkočiarkou. Vyhlásenie ako x = 7, ktorý stanovuje premenné, pravdepodobne len x = 7. Pravdepodobne x je tiež typ, ktorý je možné uložiť číslo 7, takže je to int prípadne float alebo krátky alebo char, niečo také. Boolean výraz je použitie týchto dvojníka sa rovná a prásk rovná alebo nie je rovná, menej než, väčšie ako, menšie alebo rovné, všetky takéto veci. Podmienky sú teda v prípade else. Ja by som si, že nemôžete mať else bez zodpovedajúcej, ak. Rovnako tak, nemôžete mať else ak je to bez zodpovedajúcej, ak. Slučky, pripomínajú 3 druhov slučiek sme boli kladivami do teba za posledných pár oddielov a problémových súborov. Použitie so zatiaľ čo keď ste sa dostal vstup od užívateľa, pomocou while kým určité podmienky, je pravda, a potom pomocou tým, pre slučky, ak potrebujete vedieť, ktorý iterácia slučky sa práve on je, ako som o tom premýšľať. Alebo ak robíte pre každý znak v reťazci by som chcel niečo urobiť, pre každý prvok poľa chcem urobiť niečo k tomuto prvku. Vlákna a udalosti. Tie sme nevzťahuje tak explicitne v C, pamätajte však že týmto od nuly. To je predstava mať rôzne skripty. To je tiež tento pojem vysielanie udalosť. Niektorí ľudia nemali používať vysielania vo svojich projektoch spočiatku, ktorá je úplne chladný, ale to sú 2 rôzne spôsoby zaobchádzania s týmto väčší problém tzv súbežnosti, ktoré je, ako sa vám programy spustiť alebo zdanlivo vykonať súčasne? Rôzne úlohy beží, zatiaľ čo ostatné úlohy sú tiež beží. To je, ako operačný systém vyzerá, že pracuje. To je preto, aj keď, napríklad, Ja som dostal môj prehliadač beží, môžem tiež obrátiť na Spotify a hrať pieseň. To je viac koncepčné veci pochopiť. Ja by som sa pozrieť na závity krátkych Ak sa chcete dozvedieť viac o tom. Poďme sa pozrieť, som presvedčený, že by mohol byť problém na to v jednej z nich. Opäť si myslím, že nite a akcie nie sú niečo, čo sa bude týkať v C len preto, že je to podstatne ťažšie ako v Scratch. Mali by ste si s tým starosti tam, ale rozhodne pochopiť pojmy, pochopiť, čo sa deje. Ešte než sa vrhneme na akékoľvek otázky týkajúce sa týždni 0 materiálu? Všetci cítia celkom dobre? Pochopenie premenné a čo je premenná? Ďalej. Týždeň 1. Pár vecí tu, že sa nijako zvlášť pokryté v kvíze preskúmania nutne a tiež sú viac koncepčné veci myslieť. Prvá z nich je táto predstava o tom, čo zdrojového kódu, prekladača a objektových kódov sú. Niekto? Basil. Je objektový kód, myslím zdrojový kód je to, čo ste vložili do Clang, a objektový kód je to, čo rinčať vyhlási tak, že váš počítač môže čítať program. Presne tak. Zdrojový kód je kód C, že ste vlastne písať hore. Objektový kód je to, čo dostanete z kovový zvuk. Je to 0s a 1s v tomto binárnom formáte. Tak čo sa stane, je, keď máte veľa objektových súborov, povedať, že ste zostavovaní projektu alebo programu, ktorý používa viac súborov zdrojového kódu, ktoré podľa konvencie sú uvedené na. C príponu. To je dôvod, prečo máme caesar.c, vigenère.c. Ak píšete Java programy, ktoré im rozšírenie. Java. Python programy majú príponu. Py často. Akonáhle budete mať viac. C súborov, môžete skompilovať. Rinčanie vypľuje všetko binárne haraburdie. Potom, pretože si chcete iba 1 programu máte linker odkaz všetkých týchto objektových súborov spoločne do 1 spustiteľného súboru. To je tiež to, čo sa stane, keď použijete CS50 knižnicu, napríklad. Knižnica CS50 je tak, že. H hlavičkový súbor že budete čítať, že # includecs50.h. A potom je to aj špeciálne binárny súbor knižnice , Ktorá bola zostavená, aby ich 0s a 1s, a že-l, takže ak sa vrátime k našim priestory a my sa naozaj rýchlo, na to, čo sa tu deje, keď sa pozrieme na našu rinčať príkaz, to, čo máme, je to náš zdrojový kód súboru tu. Jedná sa banda kompilátor. A potom sa na samom konci, to-l vlajky odkaz v skutočné binárne súbory pre tieto 2 knižnice, CS50 knižnica a potom matematická knižnica. Pochopenie každý typ účelu súborov ' v procese kompilácie je niečo, čo budete chcieť, aby sa mohli obsahovať aspoň na vysokej úrovni prehľad. Zdrojový kód vypovedaciu Object code vyjde. Objektové súbory kód prepojiť, a dostanete krásnu, spustiteľný súbor. Cool. To je tiež, kde môžete získať chyby na viacerých miestach v procese kompilácie. To je miesto, kde, napríklad, ak budete mať túto prepojenie vlajkou, CS50 vlajka, a ho vynecháte v priestoroch alebo keď vediete svoj kód, to je miesto, kde budete mať chybu v prepojení fáze, a linker bude hovoriť, "Hele, si volal funkcie GetString že je v CS50 knižnici. " "Povedal si mi, že je v CS50 knižnici, a nemôžem nájsť kód pre neho." To je miesto, kde budete musieť pripojiť do, a to zvlášť od kompilátora chyby, pretože kompilátor hľadá syntaxe a také veci. Je dobré vedieť, čo sa deje, keď. Ostatné veci vedieť. Povedal by som, že budete určite chcieť, aby sa pozrieť na krátky na obsadiť vykonáva Jordan rozumieť tomu, čo ints sú pod kapotou, what znaky sú pod kapotou. Keď hovoríme o ASCII a my skutočne pozrieť na ASCII tabuľky, čo to robí je, že nám pod kapotou vzhľad na to, ako počítač v skutočnosti predstavuje kapitál a číslice 7 a čiarka a otáznik. Počítač má tiež zvláštne spôsoby, ktoré reprezentujú číslo 7 ako celé číslo. To má zvláštny spôsob, ako reprezentovať číslo 7 ako číslo s plávajúcou čiarkou, a tie sú veľmi odlišné. Obsadiť je, ako povedať, že počítač "Hej, chcem previesť z jednej reprezentácie do inej reprezentácie. " Prečo by sme sa na to pozrieť. Tiež by som sa pozrieť na krátky, o knižniciach a krátke na prekladača. Tí hovoria o procese kompilácie, Čo je knižnica, a ísť cez niektoré z týchto otázok, ktoré by vás mohli pýtajú. Otázky týkajúce sa týždeň 1 materiálu? Existujú témy Tu, ktoré sa zdajú skľučujúca by ste chceli pokryť? Snažím sa vyhodiť väčšinu týchto predchádzajúcich tém tak, že sa môžeme dostať do ukazovatele a urobiť trochu rekurzie. Myšlienky? Niečo na pokrytie? Čas na nejaké čokolády možná? Vy pracujete cez to. Budem držať popíjanie kafe. 2. týždeň. Dobrý nápad, dobrá výzva. V týždni 2 sme si rozprávali trochu viac o funkciách. V prvých niekoľkých problémových setoch som naozaj písať žiadne funkcie vôbec iné než ktoré funkcie? [Študent] Hlavné. >> Hlavné, presne. A tak sme videli rôzne kostýmy, ktoré nosia hlavné. Tam je ten, v ktorom je neakceptuje žiadne argumenty, a povieme prázdnotu medzi zátvorky, a potom je tu druhý, kde sme si chcete vziať argumenty príkazového riadku, a ako sme videli, že je miesto, kde budete mať int argc a ArGV string array alebo teraz, keď sme skutočne vystavení reťazec byť char *, že je budeme začať písať ako char * ArGV a potom držiakov. V problému Set 3, vy videl veľa funkcií, a ste zaviedli veľa funkcií, kresliť, pozrite sa, ťahanice. Prototypy boli všetky napísané tu pre vás. Čo som chcel hovoriť o tom tu s funkciami naozaj rýchlo je to, že tam sú 3 diely, kedykoľvek sa budete napísať funkciu. Musíte zadať návratový typ funkcie. Musíte zadať názov funkcie, a potom sa budete musieť zadať zoznam argumentov alebo zoznam parametrov. Napríklad, keď som mal napísať funkciu zhrnul veľa celých čísel a potom sa vrátiť ku mne súčet toho, čo by môj návrat typ keby som chcel zhrnúť celé čísla a potom sa vrátiť čiastku? Potom názov funkcie. Ak by som do toho pustite a napíšte zelene, táto časť je návratový typ. Táto časť je názov. A potom v zátvorkách je miesto, kde som sa dať argumenty, často skrátil ako args, niekedy volal params pre parametre. A ak máte jeden, stačí zadať jeden. Ak máte viac oddeľte každý z nich s čiarkou. A pre každý argument si dať 2 veci, ktoré sú, Kevin? [Kevin] Musíte dať typ a potom meno. A potom meno, a meno je meno, ktoré budete používať odkazovať na tento argument v rámci súčtu funkcií, vo funkcii, že ste v súčasnej dobe písania. Nemusíte sa-napríklad, keď idem zhrnúť, hovoria, pole celých čísel-Dáme to int pole, a ja dávam nejaké zložené zátvorky tam- potom, keď som sa odovzdať pole na funkciu SUM Minul som ju na prvej pozícii v zozname argumentov. Ale pole, ktoré som odovzdať nemusí mať názov ARR. Arr bude, ako som odkazovať na tento argument v tele funkcie. Ďalšia vec, ktorá je potrebné vziať do úvahy, a to je mierne odlišné od funkcií, ale myslím, že je to dôležitý bod, je, že v C, keď píšem funkciu, ako je tento Ako mám vedieť, koľko prvkov je v tomto poli? To je trochu chyták. Hovorili sme o tom trochu minulý týždeň v oddiele. Ako mám vedieť, počet prvkov vo vnútri poľa v C? Je tam spôsob, ako? Ukazuje sa, že neexistuje žiadny spôsob, ako vedieť. Musíte prejsť do samostatne. Tam je trik, ktorý môžete robiť ak ste v rovnakej funkcii v ktorom pole bolo vyhlásené, a pracujete s zásobníka poľa. Ale to funguje len ak ste v rovnakej funkcii. Akonáhle odovzdať pole na inú funkciu, alebo ak ste vyhlásil poľa a dáte, že pole na halde, ktoré ste použili malloc  a tento druh vecí, potom sú všetky stávky sú preč. Potom ste skutočne prejsť okolo zvláštne tvrdenie alebo iný parameter, ktorý ti, aká veľká pole je. V tomto prípade, chcel by som použiť čiarky to ľúto, že to bude mimo obrazovku tu- a ja by som odovzdať v inom argumente  a nazývať to int ľan na dĺžku. Jedna vec, ktorá by mohla prísť na kvíz je výzvou na písanie alebo zaviesť určitú funkciu s názvom niečo. Ak sa vám nedávajú prototyp, tak celá táto vec tu, celý tento neporiadok je nazývaný deklarácie funkcie alebo funkčný prototyp, To je jedna z prvých vecí, ktoré budete chcieť donútiť, ak to nie je uvedený na vás hneď na kvíz. Ďalšie trik som sa naučil, je, že povedať, že sme to vám prototyp pre funkciu, a my hovoríme, "Hele, musíš napísať." Vnútri zložených zátvoriek, ktoré máte v kvíze ak si všimnete, že je návratový typ a zistíte, že návratový typ je niečo iné, než prázdna, čo znamená, že funkcia nevracia nič, potom jedna vec, budete určite chcieť urobiť, je napísať nejaký return na samom konci funkcie. Návrat, a v tomto prípade, dáme prázdne, pretože chceme, aby vyplniť prázdne. Ale to vás dostane myslenie správnym spôsobom o tom, ako budem pristupovať k tomuto problému? A to pripomína budete musieť vrátiť hodnotu k volajúcemu funkcie. Jo. >> [Študent] Má štýl použije, keď sme písať kód na kvíz? Ako je odsadenie a také veci? >> [Študent] Jo. Nie, nie toľko. Myslím, že veľa-to je niečo, čo budeme objasniť na kvíz v deň, ale zvyčajne starosti # obsahuje a tento druh vecí, je to trochu mimo. [Študent] Potrebujete, aby sa vyjadril svoje vlastnoručné kód? Potrebujete, aby sa vyjadril svoje vlastnoručné kód? V poznámkach je vždy dobré, ak máte obavy o čiastočné úveru alebo ak chcete oznámiť svoj zámer na porovnávač. Ale ja, zase, bude objasniť na teste sám a na deň kvízu, ale ja neverím, že budete musieť písať komentáre, no. Zvyčajne nie je, ale je to určite jedna z tých vecí, kde môžete komunikovať svoj zámer, ako "Hej, to je miesto, kde budem s ním." A niekedy, že vám môžu pomôcť s čiastočným úveru. Cool. Basil. [Basil] Aký je rozdiel medzi prehlasuje, povedzme, int LANG v argumentoch alebo parametre oproti deklarovaní premennej vo funkcii? Wow, káva išiel priedušnici. [Basil] Ako, ktoré veci chceme dať v argumentoch. Jo, to je veľká otázka. Ako si vybrať to, čo veci, ktoré chcete dať do argumentov proti aké veci by ste mali urobiť, vnútri funkcie? V tomto prípade sme zaradili obe tieto ako argumenty preto, že sú niečo, čo každý, kto sa bude používať funkciu SUM musí špecifikovať tie veci. Súčet funkcie, ako sme hovorili o tom, nemá žiadny spôsob, ako zistiť, aký veľký je pole sa dostane z jeho volajúceho alebo ten, kto je pomocou funkcie SUM. To má žiadny spôsob, ako zistiť, aké veľké toto pole je. Dôvod, prečo sme prejsť v tejto dĺžke tu ako argument Je tomu tak preto, že je to niečo, čo sme v podstate rozprávanie volajúci funkcie, kto ich bude používať funkciu SUM, "Hej, nielen že budete musieť dať nám poľa z ints, budete tiež musieť povedať nám, aký veľký je pole, ktoré ste nám je. " [Basil] Tí budú obe argumenty z príkazového riadku? Nie, to sú skutočné argumenty, ktoré by ste odovzdať funkciu. Dovoľte mi, aby som to novú stránku tu. [Basil] Ako meno by pass- [Nate H.] Ak mám int main (void), a ja dám v mojom návrate 0 sem v dolnej časti, a že chcem volať funkciu SUM. Chcem povedať, int x = sum (); Ak chcete použiť funkciu SUM musím prejsť v oboch pole, ktoré chcem zhrnúť a dĺžka poľa, takže ak je za predpokladu, že som mal celý rad ints, že som mal int numbaz [] = 1, 2, 3, druh použitia, ktoré nabúral do syntaxe tu, potom to, čo budem robiť, je v súčte by som chcel odovzdať ako numbaz a číslo 3 povedať sumu funkciu "Dobre, tu je pole chcem, aby ste spočítať." "Tu je jeho veľkosť." Dáva to zmysel? Znamená to, že odpoveď na vašu otázku? V mnohých ohľadoch to robí paralelne, čo robíme s hlavnou keď máme argumenty príkazového riadku. Program, ako Caesara, napríklad, že potreba Argumenty príkazového riadku nebudú môcť nič robiť. Nebolo by vedieť, ako šifrovať, ak ste si povedať, že to, čo kľúč na použitie alebo ak ste nepovedal to, čo ste chceli reťazec na zašifrovanie. Dopytovanie pre vstup, to je miesto, kde máme 2 rôzne mechanizmy pre prijatie vstup od užívateľa, pričom pre informácie od užívateľa. Pre Problém Set 1 sme videli tento GetInt, GetString, GetFloat cestu z výzvy pre vstup, a to je volaný pomocou štandardného vstupného prúdu. Je to trochu odlišné. Je to niečo, čo môžete urobiť, zrazu na rozdiel od pri vyvolaní programu, pri spustení program beží. Argumenty príkazového riadku všetci sú špecifikované pri spustení programu beh. Boli sme miešanie dva z nich. Keď používame argumenty funkcie, je to podobne ako argumenty príkazového riadku na hlavnej. Je to, keď vyvoláte funkciu, ktorú potrebujete oznámiť, čo presne potrebuje na plnenie svojich úloh. Ďalšia dobrá vec pozerať sa na a ja ťa nechám na to pozrieť vo svojom voľnom čase, a to bola pokrytá v kvíze, bol tento pojem pôsobnosti a lokálne premenné oproti globálnych premenných. Do venovať pozornosť. Teraz, keď sme stále na tejto inej veci, v týždni 3 sme začali hovoriť o vyhľadávanie a radenie. Vyhľadávanie a triedenie, aspoň v CS50, je veľmi úvod do niektorej z teoretickej časti výpočtovej techniky. Problém hľadanie, problém triedenie sú veľké, kanonické problémy. Ako si nájsť konkrétne číslo v poli miliárd celých čísel? Ako si nájsť konkrétne meno v telefónnom zozname , Ktorý je uložený na vašom notebooku? A tak sme zaviesť tento pojem asymptotickej doby behu naozaj kvantifikovať, ako dlho, ako ťažké to problém je, ako dlho berú riešiť. V, verím, 2011 v kvíze je tu problém, že som si zasluhuje pokrývajúci veľmi rýchlo, čo je tento, problém 12. O nie, je to Omega. Tu hovoríme o najrýchlejšom možnom behu k určitému algoritmu a potom najpomalší možné behu. Tento Omega a O sú naozaj len skratky. Sú notační skratky pre ostatné ako rýchlo v najlepší možný prípad bude náš algoritmus run, a ako pomaly v najhoršom možnom prípade bude náš algoritmus beží? Poďme urobiť pár z nich, a tie boli tiež zahrnuté v krátkej na asymptotickej notáciu, ktorá vrelo odporúčam. Jackson odviedol naozaj dobrú prácu. S binárne vyhľadávanie, hovoríme o binárne vyhľadávanie ako je algoritmus, a väčšinou si rozprávame o tom, pokiaľ ide o jeho veľké O. Čo je to veľký O? Čo je najpomalší možná doba chodu binárneho vyhľadávania? [Študent] N ²? Zavrieť, myslím, že podobne ako. Je to oveľa rýchlejšie, než to. [Študent] Binary? >> Jo, binárne vyhľadávanie. [Študent] Je to log n Prihlásiť n, takže to, čo robí prihlásiť n znamená? To polovičky pri každom opakovaní. Presne tak, v najpomalší možný prípad, povedať, či máte zoradené poľa milióna celých čísel a počet hľadáte je buď prvý prvok v poli, alebo posledný prvok v poli. Nezabudnite, binárne vyhľadávacie algoritmus pracuje tak, že pri pohľade na prostredný prvok, zistiť, či je to zápas, ktorý hľadáte. Ak je, potom skvelé, ste ju našli. V najlepšom možnom prípade, ako rýchlo sa binárny vyhľadávací beh? [Študenti] 1. 1, je konštantný čas, veľký O z 1.. Jo. [Študent] Mám dotaz. Keď sa povie log n, myslíš vzhľadom na základni 2, nie? Áno, tak to je iná vec. Hovoríme protokolu n, a myslím, že keď som bol na strednej škole Vždy som predpokladal, že log je základ 10. Jo, takže áno, prihláste základňa 2 je zvyčajne to, čo používame. Opäť platí, že návrat do binárneho vyhľadávania, ak hľadáte pre jeden prvok na samom konci, alebo prvok na samom začiatku, pretože začnete v stredu, a potom je vyhodíte podľa toho, čo polovica nespĺňa kritériá, ktoré hľadáte, a idete na ďalšiu polovicu a ďalšia polovica a ďalšia polovica. Ak som hľadal najväčší prvok v miliónoch integer poľa Idem na polovicu je nanajvýš protokolu 1000000 krát ako som sa konečne vyskúšať a uvidíte, že element Hľadám je v najväčšej alebo v najvyššej index poľa, a že bude trvať log n, prihláste 1 milión krát. Bubble sort. Myslíte si, chlapci si na bubliny radenie algoritmus? Kevin, môžete mi dať rýchly rekapituláciu toho, čo sa stalo v algoritme bubble sort? [Kevin] V podstate to ide cez všetko v zozname. Vyzerá to na prvé dva. Ak je prvý z nich je väčší ako druhý to swap nich. Potom sa porovnáva druhý a tretí, to isté, swapy, tretej a štvrtej, celú cestu dole. Väčšie čísla budú nasledovať až do konca. A po mnohých cykloch však máte hotovo. Presne tak, to, čo Kevin povedal, je, že budeme sledovať väčšie počty bublina až do konca poľa. Napríklad, nebude vám vadiť, pešia nám prostredníctvom tohto príkladu, ak je to naše pole? [Kevin] Budete mať 2 a 3. 3 je väčší ako 2, takže je swap. [Nate H.] Dobre, tak vymeníme tieto, a tak sme si 2, 3, 6, 4, a 9. [Kevin] Potom budete porovnávať 3 a 6. 3 je menší ako 6, tak ich necháte, a 6 a 4, mali by ste vymeniť, pretože 4 je menší ako 6. [Nate H.] Dobre, tak som si 2, 3, 4, 6, 9. [Kevin] A 9 je väčší ako 6, takže si nechajte ho. A vy by ste sa vrátiť cez to znova. [Nate H.] Mám urobiť na tomto mieste? >> [Kevin] č A prečo som nespravil v tejto chvíli? Vzhľadom k tomu, to vyzerá, že moja pole je radený. Pozerám sa na neho. [Kevin] Prejdite si to znova a uistite sa, že nie sú žiadne ďalšie swapy než budete môcť plne zastaviť. Presne, takže treba ísť ďalej až do konca a uistite sa, že nie sú žiadne swapy že je možné vykonať v tomto bode. Bolo to naozaj len šťastie, ako si hovoril, že sme skončili iba musel platiť 1 priechod a my zoradené. Ale urobiť to vo všeobecnom prípade budeme skutočne musieť urobiť to znova a znova. A v skutočnosti, to bolo príkladom najlepší možný prípad, ako sme videli v problému. Videli sme, že najlepší možný prípad bol n Išli sme cez pole 1 krát. Čo je najhorší možný prípad tohto algoritmu? [Kevin] N ². A čo to vyzerá? Čo by pole vyzerať, že by sa n? Čas? [Kevin] [nepočuteľné] zoradené. Presne, takže keď som mal pole 9, 7, 6, 5, 2, Najprv 9 by bublina celú cestu hore. Po 1 iterácii budeme mať 7, 6, 5, 2, 9. Potom 7 by bublina hore, 6, 5, 2, 7, 9, a tak ďalej, a tak ďalej. Museli by sme ísť cez celé pole n časy, a môžete skutočne dostať o niečo presnejšie ako toto pretože akonáhle sme presunuli 9 po celú cestu až do svojho posledného možného postavenie vieme, že nikdy nebudete musieť porovnať proti tomuto prvku znova. Akonáhle začneme buble na 7 až vieme, že sa môžeme zastaviť, akonáhle 7 je priamo pred 9 lebo sme už porovnali 9 k nemu. Ak to urobíte v inteligentným spôsobom, že to nie je naozaj, myslím, že veľa času. Nebudete porovnať všetky možné [nepočuteľné] kombinácie zakaždým prejsť každej iterácii. Ale napriek tomu, keď hovoríme o tom hornú hranicu môžeme povedať, že sa pozeráte na n ² porovnaní celú cestu cez. Vráťme sa späť, a od tej doby sme začínam trochu málo času Povedal by som, že by ste sa mali rozhodne ísť cez zvyšok tejto tabuľky, vyplniť to všetko von. Myslite na príkladoch. Myslite na konkrétnych príkladoch. To je naozaj šikovný a užitočné urobiť. Nakreslite to. Toto je druh tabuľky, ktoré, ako si prejsť v informatike mali by ste naozaj začať poznať tieto strany srdca. Jedná sa o druhy otázok dostanete v rozhovoroch. Ide o druhy vecí, ktoré sú dobré vedieť, a myslím, že na tie hrany prípadoch, naozaj prísť na to, ako premýšľať o s vedomím, že pre bubliny triediť najhoršie možnú poľa triediť s tým je ten, ktorý je v opačnom poradí. Ukazovatele. Poďme trochu pohovoriť o ukazovatele. V posledných niekoľkých minútach sme sa tu Ja viem, že to je niečo, čo spolu so súborom I / O, ktorá je pomerne nový. Keď hovoríme o ukazovateľoch dôvod chceme hovoriť o ukazovatele Je tomu tak preto, jeden, keď pracujeme v C sme naozaj na pomerne nízkej úrovni v porovnaní s väčšinou moderných programovacích jazykov. Sme skutočne schopní manipulovať premenné v pamäti, zistiť, kde oni sú v skutočnosti nachádza v našej pamäti RAM. Akonáhle ste sa rozhodli, aby prijal tried operačný systém, ktorý uvidíte že je opäť akýmsi abstrakcie. To nie je v skutočnosti pravda. Máme virtuálna pamäť, ktorá sa skrýva tieto údaje od nás. Ale teraz môžete predpokladať, že keď máte program, Napríklad, keď začnú svoj Caesara programu- Budem prepnúť späť do môjho iPad naozaj rýchlo- že na samom začiatku programu, ak máte, povedzme, 4 GB RAM na vašom notebooku, vám zrušil tento kus, a my Vám zavoláme túto RAM. A začína v mieste, budeme volať 0, a končí na mieste, ktoré budeme nazývať 4 GB. Ja naozaj nemôžem písať. Človek, sa hacknut, že. Keď váš program vykoná operačný systém vyrezáva pamäť RAM, a špecifikuje rôzne segmenty pre rôzne časti vášho programu žijete Tu dole táto oblasť je tak trochu zeme nikoho. Keď idete hore kúsok ďalej tu máte skutočne na miesto, kde kód pre umiestnenie programových život. Že skutočné binárny kód, v skutočnosti, že spustiteľný súbor sa nahrá do pamäte pri spustení programu, a to žije v kóde segmente. A ako váš program spustí procesor sa pozerá na tomto kóde segmente prísť na to, aký je ďalšie inštrukcie? Aký je ďalší riadok kódu musím spustiť? K dispozícii je tiež dátový segment, a to je tam, kde sa tieto reťazce konštanty sa uloží, ktoré ste doteraz používali. A potom ďalej tam je to miesto zvané haldy. Máme prístup k pamäti tam pomocou malloc, a potom smerom k vrcholu svojho programu je tu hromada, a to je, kde sme hrali po väčšinu začiatku. To nie je v mierke alebo tak niečo. Mnoho z toho je veľmi závislá na systéme, operačný systém závislý, ale to je pomerne, ako sa veci blokového up. Pri spustení programu a deklarovať premennú s názvom x- Budem čerpať ďalšie krabicu dole, a to sa bude RAM rovnako. A budem vyzerať. Budeme kresliť zubaté čiary uviesť toto je len malá časť pamäte RAM a nie všetci to, ako sme tomu v hornej časti. Ak Prehlasujem celočíselnú premennú nazvanú x, potom to, čo som vlastne si ich mapovanie , Ktorý je uložený v tabuľke symbolov svojho programu ktoré spája meno x do tejto oblasti pamäte, ktoré som vypracované tu medzi zvislými pruhmi. Keď budem mať riadok kódu v mojom programe, ktorý hovorí, že x = 7 procesor vie "Ach, áno, ja viem, že x žije v tejto lokalite v pamäti." "Chystám sa ísť dopredu a napísať 7 tam." Ako to vedieť, čo to je miesto v pamäti? No, to, že všetko je hotové v čase kompilácie. Kompilátor sa stará o prideľovaní, kde každé premenné sa chystáte ísť a vytvoriť špeciálne mapovanie či skôr pripojenie bodky medzi symbolom a, kde to bude, premenná je meno a, kde to bude žiť v pamäti. Ale ukázalo sa, že skutočne môžeme k nim pristupovať v našich programoch rovnako. To dostane dôležité, keď začneme hovoriť o niektorých dátových štruktúr, čo je pojem, ktorý budeme zavádzať neskôr. Ale teraz, čo môžete vedieť, je to, že môžem vytvoriť ukazovateľ na toto miesto, x. Napríklad, môžem vytvoriť premennú ukazovatele. Keď sme sa vytvoriť premennú ukazovatele používame hviezdy notáciu. V tomto prípade, to hovorí budem vytvoriť ukazovateľ na int. Je to typ, rovnako ako každý iný. Dávame mu premennú ako y, a potom nastaviť tak, rovná adresu, na adrese. V tomto prípade, môžeme nastaviť y poukázať na x tým, že adresu x, ktoré nesúvisia s týmto ampersand, a potom sme sa vydali y, aby ukazoval na neho. Čo to v podstate robí, je, keď sa pozrieme na našu RAM vytvára samostatnú premennú. Bude to hovoriť y, a keď tento riadok kódu vykoná to je vlastne chystáte vytvoriť malý ukazovateľ, ktorý sme zvyčajne čerpať ako šíp, a nastaví y poukázať na x. Áno. [Študent] Ak x je už ukazovateľ, by ste jednoducho int * y = x namiesto ampersand? Áno. Ak x je už ukazovateľ, potom si môžete nastaviť 2 ukazovatele vo výške rovnajúcej sa navzájom, v takom prípade by sa y poukázať na x, ale to by chcel poukázať na čokoľvek x ukazuje. Bohužiaľ, sme mimo čas. Čo by som povedal v tomto bode, môžeme sa o tom porozprávať režime offline, ale ja by som začať pracovať prostredníctvom tohto problému, # 14. Môžete vidieť, že je to už trochu vyplnený tu pre Vás. Môžete vidieť, že keď my deklarujeme 2 ukazovatele, int * x a y *, a všimnite si, že ukázal na * vedľa premenné bolo niečo, čo bolo vykonané v minulom roku. Ukazuje sa, že je to podobné tomu, čo robíme v tomto roku. Nezáleží na tom, kde ste napísať *, keď ste vyhlásil ukazovateľ. Ale my sme písali * vedľa typu preto, že je veľmi jasné, že ste deklarovať premennú ukazovatele. Môžete vidieť, že vyhlási 2 ukazovatele nám 2 krabičky. Tu, keď sme x sa rovná malloc čo to hovorí je zrušenie pamäte v halde. Tento malý box tu, to kruh, sa nachádza na halde. X ukazuje na neho. Všimnite si, že y je stále neukazuje na nič. Ak chcete získať pamäť na uloženie čísla 42 do x by sme použili čo notáciu? [Študent] * x = 42. Presne, * x = 42. To znamená, že za šípkou a hodiť 42 tam. Tu, kde sme sa vydali y a x sme y ukazuje na x. Opäť platí, že je to presne to, čo Kevin povedal, kde sme sa vydali y rovné x. Y neukazuje na x. Skôr, je to ukázal na to, čo x ukazuje na rovnako. A potom sa konečne v tomto poslednom okne sú 2 možné veci, ktoré by sme mohli robiť. Jedným z nich je dalo by sa povedať * x = 13. Druhá vec je, že sme mohli povedať: Alex, vieš, čo by sme mohli robiť? Dalo by sa povedať, * x = 13 alebo- [Študent] Dalo by sa povedať, int čokoľvek. [Nate H.] Ak bol odvolával sa na ako int premenné sme mohli urobiť. Mohli by sme tiež povedať, * y = 13, pretože sú obaja ukázal na rovnakom mieste, tak by sme mohli použiť buď premenná sa tam dostať. Jo. >> [Študent] Čo by to vyzeralo, keby sme len povedať, int x je 13? To by bolo deklarovať novú premennú s názvom x, ktorý by nefungoval. Mali by sme mať kolízii, pretože je deklarovaná x za ukazovateľ tu. [Študent] Keby sme mali toto vyhlásenie samo o sebe, čo by to vyzerať, pokiaľ ide o kruhu? Ak by sme mali x = 13 a potom budeme mať pole, a skôr než na šípku prichádza po vybalení z krabice by sme nakresliť ako len 13. [Študent] V poli. Dobre. Ďakujeme vám za sledovanie, a veľa šťastia na Quiz 0. [CS50.TV]