[Powered by Google Translate] [§ 4] [méně komfortní] [Nate Hardison] [Harvard University] [To je CS50.] [CS50.TV] Dobře, vítejte zpět do oddílu. V tomto týdnu se části budeme dělat pár věcí. Budeme nejprve nastavit rekapitulace Problém 2, která je Caesar a Vigenère problém set. A pak budeme ponořit se do Quiz hodnocení 0 a strávit trochu času rekapituluje, co jsme mluvili o v každém z přednášek tak daleko, a my také udělat několik problémů z předchozího roku kvízy. Tak vy máte dobrý způsob, jak se připravit na to. Chcete-li začít, jsem nastartoval až na pár dobrých řešení pro předchozí problému nastavení, Problem Set 2, do tohoto prostoru. Pokud jste vše hit odkaz, a pokud kliknete moje jméno a klikněte na své první revizi uvidíte caesar.c, což je přesně to, co jsem při pohledu na. Pojďme si o tom promluvit opravdu rychle. To je jen ukázka řešení. Toto není nutně dokonalé řešení. Existuje mnoho různých způsobů, jak napsat to, ale existuje několik věcí, které jsem chtěl zdůraznit že jsem viděl, když jsem byl třídění, časté chyby, které si myslím, že Toto řešení má velmi dobrou práci manipulaci. První má nějaký záhlaví komentáři nahoře. Na tratích 1 až 7 se zobrazí podrobnosti, Co přesně tento program dělá. Dobrý běžná praxe, když píšete kód v jazyce C bez ohledu na to, pokud je váš program obsaženy v jediném souboru nebo ať už je to rozděleno na více souborů, je mít nějaký orientovat komentář nahoře. To je také pro lidi, kteří jdou ven a psát kód v reálném světě. To je místo, kde se bude dát informace o autorských právech. Níže jsou # obsahuje. Na řádku 16 je tu tento # define, která se vrátíme v jen trochu. A pak, jakmile se spustí funkce, jednou hlavní startů, protože tento program byl obsaženy v jediném funkci Úplně první věc, která se stane a to je velmi frazeologie a typické programu C který bere v příkazovém řádku argumentů, je to, že okamžitě zkontroluje pro počet argumentů, argc. Právě zde vidíme, že tento program je čeká 2 argumenty přesně. Pamatujte si, že to, že první argument, že je to výjimečný to je vždy název programu, který je provozován, je název spustitelného souboru. A tak to, co to dělá, je, že zabrání uživateli spuštění programu s více nebo méně argumentů. Důvodem chceme zkontrolovat tohoto práva daleko je, protože nemůžeme skutečně přístup k této argv pole tady spolehlivě dokud jsem zkontroloval, jak je velký. Jedním ze společných chyb, které jsem viděl byli lidé by okamžitě jít a drapák argv [1]. Oni si urvat klíče argumentu z pole a se liší až i kontrolu na to, a pak by udělat test na argc, stejně jako další test, zda je či není první argument byl skutečně celé číslo ve stejnou dobu, a že nefunguje, protože v případě, že nejsou dodávané argumenty budete popadat argument, že tam není, či se pokouší chytit ten, který tam není. Další velkou věc, kterou byste měli všimnout, je, že vždy chcete vytisknout nějaký užitečných chybové zprávy pro uživatele orientovat je. Jsem si jistý, že jste všichni spouštět programy, kde najednou spadne, a stáhni směšný malý dialog, který se objeví a řekne něco hrozně tajemné a možná vám chybový kód nebo něco takového to nedává smysl. To je místo, kde si opravdu chcete, aby něco užitečného a cílené na uživatele tak, že při spuštění to jdou "Ach," tvář dlaň. "Vím přesně, co dělat. Vím, jak to opravit." Pokud nechcete vytisknout zprávu, pak můžete skončit ve skutečnosti takže uživatel jít prozkoumat svůj zdrojový kód přijít na to, co se stalo. Tam jsou také některé časy, které budete používat různé chybové kódy. Zde jsme jen použit jeden říct, že byla chyba, došlo k chybě, došlo k chybě. Větší programy, často programy, které jsou volány jinými programy, vrátí nějaký zvláštní chybových kódů v různých situacích programově komunikovat to, co byste jinak stačí použít pěknou anglickou zprávu pro. Cool. Protože pracujeme se, můžete vidět, že vytáhnout klíč z. Testujeme, zda klíč zapadá. Dostáváme zprávu od uživatele. Důvod, proč jsme to v tom dělat, když smyčka-a to je něco, co se budeme zabývat v trochu, ale ukázalo se, že pokud zadáte ovládání D když se dostanete, že GetString řádku na terminálu co to vlastně dělá, je, že pošle speciální znak programu. Je to tzv. ELF nebo konec souboru znak. A v tomto případě, bude naše zpráva řetězec je null, takže to není něco, co jsme prověřili v problému sama stanovila. Ale jak budeme pokračovat, teď, když jsme začali mluvit o ukazatele a dynamické přidělování paměti na haldě, kontrola null, kdykoli máte funkci, která by mohla vrátit hodnotu null jako hodnota je něco, co budete chtít dostat ve zvyku dělat. To je zde především pro ilustraci. Ale když vidím GetString v budoucnu, tak z problému Vytvořit 4 na, budete chtít, aby to na paměti. Opět, to není otázka pro problém Set 3 buď, protože jsme se nevztahuje to ještě. Nakonec jsme se k této části, kde se dostaneme do hlavního šifrování smyčky, a je tu pár věcí tady děje. Za prvé, jsme se iterovat přes celý řetězec zprávy samotné. Zde jsme drželi strlen volání ve stavu, které řada z vás poukázali, není skvělý způsob, jak jít. Ukázalo se, že v tomto případě je to také není velký, částečně proto, že jsme modifikaci obsahu samotné zprávy uvnitř smyčky for, takže pokud máme zprávu, která je 10 znaků, poprvé jsme kdo, že pro vedení strlen vrátí co? 10. Ale pokud jsme pak upravit zprávu, že jsme změnit jeho 5. charakter, a hodíme do \ 0 znak v 5. pozici, na následné iteraci strlen (zpráva) se nevrátí to, co udělal Vůbec poprvé jsme zopakovali, ale místo toho vrátí 5, protože jsme hodili v tomto null terminátor, a řetězec je délka je definována podle polohy tohoto \ 0. V tomto případě, je to skvělý způsob, jak jít, protože jsme úpravou na místě. Ale zjistíte, že je to vlastně překvapivě jednoduché šifrování pokud můžete získat matematika správné. Vše, co je nutné je zkontrolovat, zda nebo ne dopis, který jste při pohledu na je velká nebo malá písmena. Důvod, proč jsme jen pro kontrolu, že a nemáme pro kontrolu je alfa případ je, protože pokud znak je velká nebo, pokud je to malé pak je to určitě abecední znak, protože nemáme malá a velká číslice. Druhá věc, kterou děláme, a to je trochu složitější, je jsme upravili standardní Caesara vzorce že jsme dali ve specifikaci problému set. Jaký je rozdíl tady je, že odečte v případě velkým kapitálem, a pak jsme přidali kapitál A zpět na konci. Vím, že někteří z vás to udělal ve vašem kódu. Bylo někdo z vás to ve vašich příspěvků? To jsi udělal ty. Můžete mi vysvětlit, co to dělá, Sahb? Odečtením to, protože jste mod hned po něm, budete muset vzít to tak, že způsob, jakým se dostat [kašel] pozice. A pak přidáním zpět později si přehodili ten, který jste chtěli. Jo, přesně tak. Co Sahb řekl, bylo, že když budeme chtít přidat naše poselství a naším hlavním společně a pak mod, že mod že NUM_LETTERS, pokud se neshromažďují naší zprávu do příslušné 0-25 rozsahu jako první, pak bychom mohli skončit dostat opravdu divný číslo protože hodnoty, které jsme při pohledu na, když se podíváme na zprávy [i], když se podíváme na té charakteru naší prostý textové zprávy, je hodnota někde v tomto rozsahu 65 až 122 na základě hodnot ASCII pro velká a až malá písmena z.. A tak, když jsme mod ji 26 nebo NUM_LETTERS, protože to byl náš # define vpravo nahoře tady, , co se děje, aby nám hodnotu, která je v rozmezí 0 až 25, a my potřebujeme způsob, jak pak škálování, že zálohovat a dostat se do příslušné ASCII rozsahu. Nejjednodušší způsob, jak to udělat, je jen měřítko všechno dolů do 0-25 rozmezí začít, a pak se posune vše zpět až na konci. Další častou chybou, že jsem viděl lidi běžet do je, že pokud nemáte skutečně udělat škálování hned a přidat zprávu a klíč dohromady a přidat je, řekněme, do char proměnné, problém s tím je od zprávy [i] je poměrně velký počet začít s- pamatujte, že je to minimálně 65, pokud je to velká postava- Pokud máte velký klíč, řekněme, něco jako 100, a přidáte ty 2 spolu do podepsána char budeš dostat přetečení. Budeš si hodnotu, která je větší než 127, což je největší hodnota, kterou char proměnná může držet. Opět platí, že je to důvod, proč byste chtěli dělat takové věci začít. Někteří lidé dostali kolem tomto případě tím, že dělá-li jinde a testování vidět, když by přetečení před tím, že ale tento způsob se dostane kolem toho. A pak se v tomto řešení jsme vytisknout celý řetězec až na samém konci. Ostatní lidé vytisknout znak v čase. Oba jsou úžasné. V tomto bodě, to vy máte nějaké dotazy, připomínky ohledně této? Co se vám líbí, věci se vám nelíbí? Měl jsem otázku. Možná mi to uniklo během vysvětlení, ale jak se tento program přeskočit mezery pro připojení klíč k délce textu? To je jen Caesarova šifra. >> Oh, promiň, jo. Jo, uvidíme, že. V kódu Caesar jsme kolem toho, protože my jen převrácený znaky. Máme jen otočil je, pokud byli velká nebo malá písmena. Vy pocit docela dobrý o tom? Neváhejte kopírovat tento domov, vezměte si ji, porovnání s tím, co jste napsal. Rozhodně neváhejte a pošlete otázky o tom taky. A opět si uvědomit, že cílem zde se svým problémem sety není dostat vy psát dokonalé kód pro vaše problémové soubory. Je to vzdělávací zkušenost. Jo. Zpět dělat, zatímco smyčka, pokud se rovná nula, takže null jen znamená nic, prostě stiskněte klávesu Enter? Null je speciální ukazatel hodnoty, a používáme null, když chceme říci, máme ukazatel proměnnou, která směřovala k ničemu. A tak typicky to znamená, že tato proměnná, tato zpráva proměnná je prázdný, a tady, protože jsme pomocí CS50 speciální typ řetězce, co je CS50 string typ? Už jste viděli, co to je, když David vytáhl kapuci v přednášce? Je to funky-je to ukazatel, že jo? Dobře, jo. >> Je to char *. A tak opravdu jsme mohli nahradit tento tady s char * zprávy, a tak GetString funkce, pokud to není úspěšně dostat řetězec od uživatele, nemůže analyzovat řetězec, a jeden případ, v němž se nemůže analyzovat řetězec je-li uživatel zadá konec souboru znak, kontrolní D, což není něco, co obvykle dělají, ale když se to stane pak funkce vrátí tuto hodnotu null jako způsob, jak říká "Hele, já jsem nedostal řetězec." Co by se stalo, kdybychom nedávejte message = null, což je něco, jsme to dělali ještě? Proč by to být problém tady? Protože vím, že jsme spolu mluvili trochu v přednášce o nevracení paměti. Jo, pojďme to udělat, a uvidíme, co se stane. Vasila Blaženého otázka byla, co se stane, když vlastně nemáte Tato zpráva = null test? Pojďme přejděte až na vrchol. Vy můžete komentovat to. Vlastně, já budu šetřit ho v revizi. To bude revize 3. Co budete muset udělat, aby spuštění tohoto programu je budete muset kliknout na tento ikonu ozubeného kolečka tady, a budete muset přidat argument k tomu. Budete muset dát Klíčovým argumentem, protože chceme předat argument příkazového řádku. Tady budu dávat mu číslo 3. Líbí se mi 3. Nyní zoom zpět, spuštění programu. Je to běh, sestavování, stavebniny. Jdeme na to. Je to čeká na vyzvání. Pokud píšu v něčem jako hello-li to šlo? Oh, můj program trvalo příliš dlouho běžet. Byl jsem jawing příliš dlouho. Tady to jde. Teď jsem psát ahoj. Vidíme, že šifruje vhodně. Teď, co se stane, když budeme dělat rychlé GetString vrátit null? Nezapomeň, že říci, že jsme, že po stisknutí ovládacího D ve stejnou dobu. Budu procházet sem. Uděláme to znovu. Budova. Tam to jde. Teď, když jsem narazila ovládání D Dostal jsem tento řádek, který říká opt/sandbox50/bin/run.sh, segmentation fault. Už jste viděli, že předtím? [Student] Proč není->> líto? [Student] Proč není core dump v tomto případě? Jádro dump je-otázka je proč není core dump tady? Otázkou je, že může být, ale jádro dump soubor , který se uloží na pevný disk. V tomto případě jsme zakázána core dump na útěku serveru tak, aby nemáme lidi seg kritizovat a vybudování tun core dump. Ale můžete si ho. Základní skládek jsou takové věci, které můžete často zakázat, a někdy to. Segmentace chyba, abych odpověděl na vaši otázku, Basil, se říká, že jsme se snažili přistupovat ukazatel , který nebyl nastaven, aby ukazoval na cokoliv. Nezapomeňte Binky ve videu, kdy Binky snaží jít přístup ukazatel, který není směřující k ničemu? V tomto případě myslím, že technicky ukazatel ukazuje na něco. Je to ukazuje na null, což je technicky 0, ale, který je definován jako v segmentu, který není přístupný váš program, takže získáte segmentation fault protože nejste přístup paměť, která je v platné segmentu jako haldy segmentu nebo zásobníku segment nebo datového segmentu. Cool. Nějaké další otázky o Caesarovi? Pojďme dál. Pojďme se podívat na revize 2 opravdu rychle. To je Vigenère. Tady v Vigenère projdeme tenhle docela rychle, protože znovu, Vigenère a Caesar jsou velmi podobné. Header komentář je dříve, # Define je před vyhnout se používání těchto magických čísel. Pěkná věc je, že jsme chtěli přejít na jiný abeceda nebo něco takového. Spíše než by museli jít ručně změnit všechny 26 let v kódu můžeme to změnit na 27 nebo pádu dolů pokud jsme používali různé abecedy, různé jazyky. Opět, máme tuto kontrolu na počet argumentů, a opravdu můžete téměř brát jako šablonu. Skoro každý program, který by měl mít zápis- kdyby to mělo trvat argumentů na příkazovém řádku-některé sekvence z linek že čte takhle na začátku. To je jedna z prvních zdravý rozum testů, které chcete dělat. Zde, co jsme udělali, bylo jsme jisti, že klíčové slovo je platný, a že byl druhý kontrola, že jsme udělali. Všimněte si, opět, že jsme se rozešli to z argc a 2. Všimněte si, že v tomto případě jedna věc, že ​​jsme museli udělat, bylo místo použití až i my jsme chtěli ověřit celý řetězec, a aby k tomu, že jste skutečně jít znak po znaku přes řetězec. Neexistuje žádný dobrý způsob, jak volat něco na něm protože i, například, až i vrátí 0 , pokud není analyzovat celé číslo, tak, že se ani pracovat. Opět, pěkný zpráva musí uživateli sdělit, co přesně se stalo. Pak tady, zase jsme také zvládnout případ, kdy uživatel zadá do ovládacího D náhodný charakter. A pak Charlotte měl otázku dříve, o tom, jak se nám podaří přeskočit mezery v našem řetězci zde. To bylo trochu podobné tomu, co jsme dělali s Myspace programu že jsme v bodě, a tak to fungovalo je to, že jsme sledovali počet dopisů, které jsme viděli. Když jsme šli přes zprávy řetězce, jak jsme šli přes znak po znaku, jsme sledovali index jako součást naší smyčky for, a pak jsme také sledována počet písmen, tak non-speciální znaky, non-číslice, non-white space že jsme viděli v samostatné proměnné. A pak toto řešení upravuje klíč získat aktuální klíč celé číslo, a to dělá, že za běhu, přímo před to pak jde k zašifrování aktuální zprávy charakter. Tam jsou některá řešení, které byly dokonale taky skvělé které by změnit klíč se při testování pro klíč platnosti. Kromě toho, že se ujistil, že charakter a klíčové slovo byl znak abecedy rovněž ukázalo, že na celé číslo v 0-25 rozsahu, aby pak přejděte museli dělat, že později v tomto pro smyčce. Opět, zde vidíte je to opravdu přesně stejný kód že jsme použili Caesar v tomto bodě. Děláte přesně to samé, takže skutečný trik je přijít na to, jak proměnit klíčové slovo do celé číslo. Jedna věc, že ​​jsme zde, že je málo hustá je, že jsme zopakoval tuto frázi, myslím, že byste mohli nazvat, 3 samostatné časy na tratích 58, 59, a 61. Může mi někdo vysvětlit, co přesně tato fráze dělá? Je to přístup postavu, jak jsi řekl. Jo, je to [neslyšitelné] znak na klíčové slovo, a tak je to číslo viděli písmen, protože jste jen pohybující se klíčové slovo, jakmile jste viděli ten dopis, tak, že se to skutečně přeskočit mezery a tak podobně. Jo, přesně tak. A pak, jakmile jste viděli klíčové slovo prázdné stačí mod takže se vrátit kolem. Přesně tak. To je perfektní vysvětlení. Co Kevin řekl, je, že chceme, aby index do klíčové slovo. Chceme získat num_letters_seen charakter, chcete-li, ale když num_letters_seen přesahuje délku klíčových slov, tak, jak jsme se dostali zpět do náležitého rozsahu je budeme používat mod operátora efektivně zabalit kolem. Například, stejně jako v krátkém, naše klíčové slovo je slanina, a je to 5 znaků dlouhé. Ale my jsme viděli 6 písmen v našem formátu prostého textu v tomto bodě a šifrované 6. Budeme skončit přístup k num_letters_seen, což je 6, mod délka klíčového slova, 5, a tak dostaneme 1, a tak to, co budeme dělat, je potkáme přístup první znak uvnitř našeho klíčového slova v tomto bodě. Dobře, nějaké otázky na Vigenère dříve než přejdeme? Vy pocit docela dobrý o tom? Cool, skvělé. Chci se ujistit, že vy jste dostat šanci vidět kód že si myslíme, že vypadá dobře a mají šanci učit se od něj. To bude poslední budeme pomocí mezer v současné době, a budeme přechod teď, a já jít na cs50.net/lectures takže můžeme udělat trochu přezkum kvíz. Nejlepší způsob, jak si myslím, začít dělat kvíz recenze je přijít na této stránce přednášky, cs50.net/lectures, a pod každou z týdne čísel, takže když jsem se podívat tady v týdnu 0, Vidím, že máme seznam témat, která jsme probrali v týdnu 0. Pokud některý z těchto témat se zdá neznámé pro vás budete určitě chtít vrátit zpět a pročesat skripta a možná dokonce proletět přednášek, dívat se na ně znovu, pokud chcete získat pocit, pro to, co se děje s každým z těchto témat. Řeknu navíc letos jeden z chladných zdrojů jsme dostali je, že tyto šortky, které jsme vytvořili, a když se podíváte v týdnu 0, nemáme všechny probíraných tématech, ale máme docela málo z nich, některé složitější, proto je sledování těchto krátkých znovu je dobrý způsob, jak se dostat až do rychlosti. Zejména, já dám do zásuvky pro 3 na dně, protože jsem dělal ty. Ale pokud jste zápasí s binární, bity, šestihranné, že tyhle věci, binární je skvělé místo pro start. ASCII je ještě jeden, který je dobrý pro zobrazení příliš. Můžete dokonce sledovat mě na 1.5x rychlosti, pokud budu příliš pomalý pro vás. Protože je to hodnocení, neváhejte to udělat. Stačí začít opravdu rychle, budeme projít pár těchto vědomostních problémů jen rychle chrlit přes tyto. Například, pojďme se podívat na problém 16, že mám přímo tady na stole. Máme tento následující výpočet v binární, a chceme ukázat nějakou práci. Dobře, já ti dám to výstřel. Vy by měla následovat spolu s papírem, a my uděláme to opravdu rychle. Chceme-li provádět následující výpočet v binárním kódu. Mám 00110010. A budu se přidat k ní 00.110.010. Pro matematiky géniů po spolu doma, je to skutečně vynásobením 2. Pojďme začít. Budeme sledovat stejný sčítání algoritmus, který my když přidáme desetinná čísla dohromady. Opravdu jediný rozdíl je, že jsme smyčka zpět kolem jakmile budeme mít 1 + 1 místo, jakmile jsme se dostali do 10. Vyjdeme-li z práva, opravdu rychle, co je první číslice? [Student] 0. >> [Nate H.] 0. Skvělé, druhá číslice? [Student] 1. [Nate H.] Je to 1? 1 + 1 je? [Student] 10. [Nate H.] Přesně tak, takže to, co je číslice, že píšu přímo pod 2 ty sčítají? [Student] 1, 0, nebo 0 a pak nést 1. [Nate H.] 0 a nést 1, přesně. Dále jeden nahoru, Basile, ty jsi vzhůru. Co je to třetí? >> [Basil] 1. [Nate H.] 1, perfektní. Kevin? [Kevin] 0. >> [Nate H.] 0, Charlotte? [Charlotte] 0. >> [Nate H.] Jo, a co mám dělat? [Student] 1. [Nate H.] A co mám dělat? A pak jsem nést 1. Perfektní, Sahb? >> [Sahb] Nyní máte 1. [Nate H.] A mám dělat tady něco? [Sahb] Pak pro příští máte 1, protože jste prováděli znovu 1. [Nate H.] Skvělé, takže zde můžeme dokončit ji. Cool. [Student] Má 0 + 0 = 0? 0 + 0 = 0. 1 + 1, jak jsi řekl, je 10, nebo 1, 0, spíše. 10 je chybný, protože se mi 10 znamená počet 10, a je to vtípek, jak jsme reprezentovat to, když jsme psaní. Zastupujeme číslo 2 v 1, 0, a číslo 10 je mírně odlišná. Co je to docela hezké o binární je, že tam opravdu není, že mnoho případech musíte naučit. K dispozici je 0 + 0 = 0, 0 + 1 = 1, 1 + 1 je 0, a pak nést 1, a pak můžete vidět zde na třetím sloupci zprava jsme měli 1, 1, a 1. A 1 + 1 + 1 je 1, a nosíte další 1. Když děláte binární sčítání, velmi jednoduchý. Já bych to ještě pár z nich do sanity check sami předtím, než jdete do systému, protože je to Asi něco, co uvidíme na kvíz. Nyní pojďme to udělat příští stejně. Pojďme udělat problém 17. Budeme převést následující binární číslo na desítkové. Mám 10100111001. Zapamatovat si mě na binární videu, že jsem to udělal Prošel jsem pár příkladů, a jsem ukazoval, jak vše funguje, když děláte to v desítkové soustavě. Když pracujete v desítkové soustavy Myslím, že jsme v tomto bodě v našem životě tak plynně v tom, že je to docela snadné zakrýt mechaniku, jak to vlastně funguje. Ale udělat rychlou rekapitulaci, když mám číslo 137 to vlastně znamená a znovu, je to v desítkové soustavy, číslo 137 v desítkové soustavě znamená, že mám 1 x 100 + 3 x 10 + 7 x 1. To vše je zůstat na obrazovce. A pak, když se podíváte na těchto číslech tady, 100, 10 a 1, zjistíte, že jsou to vlastně všechny síly 10. Mám 10 m², 10 ¹, a 10 na nulu. Máme podobný druh věci v binární, kromě toho, že naše základna, jak mu říkáme, je 2 místo 10. Tyto 10s, že jsem napsal tady na dně, Tento 10 ², 10 ¹, 10 až nulové, 10 je naše základna, a exponent, 0, 1, nebo 2, je naznačeno na pozici číslice v čísle, které píšeme. 1, pokud se na něj podíváme, to 1 je v 2. poloze. 3 je v první poloze, a 7 je v poloze 0.. To je, jak jsme si různé exponenty níže na našich základen. Po vše Dáme-vlastně, víš co? Uděláme-li se můj tlačítko Zpět jít? Tam to jde. I love this vrátit věc. Po tomto Myslím, že aspoň pro mě Nejjednodušší způsob, jak začít konverzi binární číslo nebo šestnáctkové číslo, kde základ je 16 a ne 10 nebo 2, je jít dopředu a zapsat podklady a exponenty pro všechna čísla v mé binární číslo na vrcholu. Pokud začneme zleva doprava znovu, který je tak trochu neintuitivní, Budu změnit zpět na černou tady, máme 2 do 0. polohy, a pak máme 2 ¹, ² 2, a pak 2 na 3, 2 na 4, 2 na 5, 6, 7, 8, 9, a 10. Tato čísla jsem napsal ven, jsou všechny exponenty. Jen jsem napsal základy tady v první 3 jen pro prostor. Na tomto místě budu pokračovat, a já jsem vlastně jít smazat věci, které jsme udělali v desítkové soustavě, pokud je to v pořádku. Vy jste všichni dostali to. Ti z vás, sledování on-line Jsem si jistý, že bude moci přetočit mě, jestli byste chtěli. Přepnutí zpět na pero. Teď, co se dá dělat-li vy nejste úplně až na rychlost na vašich pravomocí 2, to je úplně v pohodě. To se stává. Chápu. Jednou jsem měl pohovor, kde mi bylo řečeno, co bych měl vědět všechny síly 2 až přes 2 do 30.. Nebylo to práce, kterou jsem dostal. Každopádně, může vy jděte do toho a to spočítejte tady, ale s binární nemá moc smysl, a ani to smysl s desítkové, nebo šestnáctkové buď, si to spočítejte, kde budete mít nuly. Můžete vidět mám 0 tady, je tady 0, 0 tady, 0 tady, 0 tady, 0 zde. Proč by to nemělo smysl dělat skutečné matematiky pro výpočet odpovídající sílu 2 pro tuto pozici? Přesně, jak řekla Charlotte, bude to 0. Klidně ušetřit čas, pokud výpočtu síly 2 není vaše silná stránka. V tomto případě se stačí spočítat pro 2 na 0, který je-? [Student] 1. [Nate H.] 1, 2 na 3, která je-? [Student] 8. >> [Nate H.] 8. 2 až 4? [Student] 2. Je mi líto, 1. [Nate H.] 2 do 4 je 16, přesně. 2 k 5, Kevin? >> 32. [Nate H.] 32, 2 na 8? [Student] 32 x 8, 256. [Nate H.] Perfect. A 2 na 10? [Student] 1024. [Nate H.] Jo, 1024. Jakmile jsme dostali tato čísla můžeme shrnují je všechny. A to je místo, kde je to opravdu důležité, aby to pár věcí. Jedním z nich je jít pomalu a zkontrolovat svou práci. Můžete říct, že je tu 1 na konci tohoto čísla, tak jsem určitě dostat liché číslo jako můj výsledek, protože všechny ty ostatní se bude i čísla vzhledem k tomu, že je to binární číslo. Druhá věc, kterou musíte udělat, je, pokud se dostanete do tohoto bodu na zkoušky a vy jste to napsal tak daleko a máte málo času podívat se na počet bodů, které tento problém stojí. Tento problém, jak můžete vidět, když jsem otočit zpět do svého notebooku opravdu rychle- tento problém je za 2 body, takže to není ten druh Kromě měli byste jít přes pokud jste opravdu v časové tísni. Ale budeme přepnout zpět na iPad, a půjdeme přes to opravdu rychle. Líbí se mi dělat malé množství prvního protože jsem zjistil, že jednodušší. Líbí se mi 32 a 8, protože oni jdou spolu docela snadno, a dostaneme 50. 16 a 1 dostane 17. Tam jsme se 57, a pak můžeme udělat zbytek tohoto, tak můžeme udělat 57, 156. Pojď. Man, dobře, uvidíme. Měli jsme 57, 256, a 1024. V tomto bodě, bych raději projít. Nemám tušení. Jasně jsem třeba, aby si přečetli na toto téma. 7, 6, a 4, dostanete 17. 1, 5, 5, 2, 13. Pak dostaneme 3, a pak jsme si 1. 1337. Velikonoční vajíčko, někdo? Někdo poznat toto číslo? Chris rozpozná číslo. Co to znamená, Chrisi? [Chris] Leet. Leet, takže když se podíváte na to, vypadá to, že leet. Hacker věci. Dejte si pozor na takové věci na střednědobé nebo kvíz, spíše. Pokud vidíte, že takové věci a jste přemýšlel "Hm," , který by mohl něco znamenat. Nevím. David rád uvedení dovnitř Je to dobrý způsob, jak zdravý rozum zkontrolovat. Stejně jako v pořádku, mohu vidět, co se děje. To je týden 0/Week 1 věci. Pokud bychom přepnete zpět do našeho notebooku teď, oddálit, a pár dalších věcí. Tam je ASCII, které jsme dělali hodně s problémovými sad. Tento pojem kapitálu A. Co je to vlastně? Vědět, že je to desetinné číslo. 65 je to, co je mapována v ASCII tabulce, a to proto, jak počítač píše to, a to je, jak jsme se dostat pryč se psaním charakter kapitálu a znak malá písmena v některých z těchto řešení a problémů sad, které jste dělali. Pár dalších věcí. Máme prohlášení, logické výrazy, podmínky, cykly, proměnné a vláken. Ti všichni vypadají, že smysl pro nejvíce se rozdělit? Některé z této terminologie je trochu funky občas. Rád si o prohlášení jako nejvíce část něčeho, co končí středníkem. Prohlášení jako x = 7, který stanoví proměnné, pravděpodobně jen x = 7. Pravděpodobně x je také typ, který je možné uložit číslo 7, takže je to int případně float nebo krátký nebo char, něco takového. Boolean výraz je použití těchto dvojníka se rovná a prásk rovná nebo není rovná, méně než, větší než, menší nebo rovno, všechny takové věci. Podmínky jsou tedy v případě else. Já bych si, že nemůžete mít else bez odpovídající, pokud. Stejně tak, nemůžete mít else pokud je to bez odpovídající, pokud. Smyčky, připomínají 3 druhů smyček jsme byli kladivy do tebe za posledních pár oddílů a problémových souborů. Použití se zatímco když jste se dostal vstup od uživatele, pomocí while dokud určité podmínky, je pravda, a pak pomocí těm, pro smyčky, pokud potřebujete vědět, který iterace smyčky se právě on je, jak jsem o tom přemýšlet. Nebo pokud děláte pro každý znak v řetězci bych chtěl něco udělat, pro každý prvek pole chci udělat něco k tomuto prvku. Vlákna a události. Ty jsme nevztahuje tak explicitně v C, pamatujte však že tímto od nuly. To je představa mít různé skripty. To je také tento pojem vysílání událost. Někteří lidé neměli používat vysílání ve svých projektech zpočátku, která je zcela chladný, ale to jsou 2 různé způsoby zacházení s tímto větší problém tzv. souběžnosti, které je, jak se vám programy spustit nebo zdánlivě provést současně? Různé úkoly běží, zatímco ostatní úkoly jsou také běží. To je, jak operační systém vypadá, že pracuje. To je proto, i když, například, Já jsem dostal můj prohlížeč běží, mohu také obrátit na Spotify a hrát píseň. To je víc koncepční věci pochopit. Já bych se podívat na závity krátkých Pokud se chcete dozvědět více o tom. Pojďme se podívat, jsem přesvědčen, že by mohl být problém na to v jedné z nich. Opět si myslím, že nitě a akce nejsou něco, co se bude týkat v C jen proto, že je to podstatně obtížnější než v Scratch. Měli byste si s tím starosti tam, ale rozhodně pochopit pojmy, pochopit, co se děje. Ještě než se vrhneme na jakékoliv otázky týkající se týdnu 0 materiálu? Všichni cítí docela dobře? Pochopení proměnné a co je proměnná? Dál. Týden 1. Pár věcí tady, že se nijak zvlášť pokryty v kvízu přezkumu nutně a také jsou více koncepční věci myslet. První z nich je tato představa o tom, co zdrojového kódu, překladače a objektových kódů jsou. Někdo? Basil. Je objektový kód, myslím zdrojový kód je to, co jste vložili do Clang, a objektový kód je to, co řinčet vyhlásí tak, že váš počítač může číst program. Přesně tak. Zdrojový kód je kód C, že jste vlastně psát nahoru. Objektový kód je to, co dostanete z kovový zvuk. Je to 0s a 1s v tomto binárním formátu. Tak co se stane, je, když máte spoustu objektových souborů, říct, že jste sestavování projektu nebo programu, který používá více souborů zdrojového kódu, které podle konvence jsou uvedeny na. C příponu. To je důvod, proč máme caesar.c, vigenère.c. Pokud píšete Java programy, které jim rozšíření. Java. Python programy mají příponu. Py často. Jakmile budete mít více. C souborů, můžete zkompilovat. Řinčení vyplivne všechno binární harampádí. Pak, protože si chcete pouze 1 programu máte linker odkaz všech těchto objektových souborů společně do 1 spustitelného souboru. To je také to, co se stane, když použijete CS50 knihovnu, například. Knihovna CS50 je tak, že. H hlavičkový soubor že budete číst, že # includecs50.h. A pak je to také speciální binární soubor knihovny , která byla sestavena, aby je 0s a 1s, a že-l, takže pokud se vrátíme k našim prostory a my se opravdu rychle, na to, co se tady děje, když se podíváme na naši řinčet příkaz, to, co máme, je to náš zdrojový kód souboru tady. Jedná se banda kompilátor. A pak se na samém konci, to-l vlajky odkaz v skutečné binární soubory pro tyto 2 knihovny, CS50 knihovna a pak matematická knihovna. Pochopení každý typ účelu souborů ' v procesu kompilace je něco, co budete chtít mít možnost obsahovat alespoň na vysoké úrovni přehled. Zdrojový kód vypovídací Object code vyjde. Objektové soubory kód propojit, a dostanete krásnou, spustitelný soubor. Cool. To je také, kde můžete získat chyby na více místech v procesu kompilace. To je místo, kde, například, pokud budete mít tuto propojení vlajkou, CS50 vlajka, a jej vynecháte v prostorech nebo když vedete svůj kód, to je místo, kde budete mít chybu v propojení fázi, a linker bude říkat, "Hele, jsi volal funkce GetString že je v CS50 knihovně. " "Řekl jsi mi, že je v CS50 knihovně, a nemůžu najít kód pro něj." To je místo, kde budete muset připojit do, a to zvlášť od kompilátoru chyby, protože kompilátor hledá syntaxe a takové věci. Je dobré vědět, co se děje, když. Ostatní věci vědět. Řekl bych, že budete určitě chtít podívat na krátký na obsadit provádí Jordan rozumět tomu, co ints jsou pod kapotou, Co znaky jsou pod kapotou. Když mluvíme o ASCII a my skutečně podívat na ASCII tabulky, co to dělá je, že nám pod kapotou vzhled na to, jak počítač ve skutečnosti představuje kapitál a číslice 7 a čárka a otazník. Počítač má také zvláštní způsoby, které reprezentují číslo 7 jako celé číslo. To má zvláštní způsob, jak reprezentovat číslo 7 jako číslo s plovoucí čárkou, a ty jsou velmi odlišné. Obsadit je, jak říct, že počítač "Hej, chci převést z jedné reprezentace do jiné reprezentace. " Proč bychom se na to podívat. Také bych se podívat na krátký, o knihovnách a krátké na překladače. Ti hovoří o procesu kompilace, Co je knihovna, a jít přes některé z těchto otázek, které by vás mohly ptají. Otázky týkající se týden 1 materiálu? Existují témata Tady, které se zdají skličující byste chtěli pokrýt? Snažím se vyhodit většinu těchto dřívějších témat tak, že se můžeme dostat do ukazatele a udělat trochu rekurze. Myšlenky? Něco na pokrytí? Čas na nějaké čokolády možná? Vy pracujete přes to. Budu držet popíjení kafe. 2. týden. Dobrý nápad, dobrá výzva. V týdnu 2 jsme si povídali trochu více o funkcích. V prvních několika problémových setech jsem opravdu psát žádné funkce vůbec jiné než které funkce? [Student] Hlavní. >> Hlavní, přesně. A tak jsme viděli různé kostýmy, které nosí hlavní. Tam je ten, v němž je neakceptuje žádné argumenty, a řekneme prázdnotu mezi závorky, a pak je tu druhý, kde jsme si chcete vzít argumenty příkazového řádku, a jak jsme viděli, že je místo, kde budete mít int argc a argv string array nebo teď, když jsme skutečně vystaveni řetězec být char *, že je budeme začít psát jako char * argv a pak držáků. V problému Set 3, vy viděl spoustu funkcí, a jste zavedli spoustu funkcí, kreslit, podívejte se, tahanice. Prototypy byly všechny napsané tu pro vás. Co jsem chtěl mluvit o tom tady s funkcemi opravdu rychle je to, že tam jsou 3 díly, kdykoli se budete napsat funkci. Musíte zadat návratový typ funkce. Musíte zadat název funkce, a pak se budete muset zadat seznam argumentů nebo seznam parametrů. Například, když jsem měl napsat funkci shrnul spoustu celých čísel a pak se vrátit ke mně součet toho, co by můj návrat typ kdybych chtěl shrnout celá čísla a pak se vrátit částku? Pak je název funkce. Pokud bych do toho pusťte a napište zeleně, tato část je návratový typ. Tato část je název. A pak v závorkách je místo, kde jsem se dát argumenty, často zkrátil jako args, někdy volal params pro parametry. A pokud máte jeden, stačí zadat jeden. Pokud máte více oddělte každý z nich s čárkou. A pro každý argument si dát 2 věci, které jsou, Kevin? [Kevin] Musíte dát typ a pak jméno. A pak jméno, a jméno je jméno, které budete používat odkazovat na tento argument v rámci součtu funkcí, ve funkci, že jste v současné době psaní. Nemusíte se-například, když jdu shrnout, říkají, pole celých čísel-Dáme to int pole, a já dávám nějaké složené závorky tam- pak, když jsem se předat pole na funkci SUMA Minul jsem ji na první pozici v seznamu argumentů. Ale pole, které jsem předat nemusí mít název arr. Arr bude, jak jsem odkazovat na tento argument v těle funkce. Další věc, která je třeba vzít v úvahu, a to je mírně odlišné od funkcí, ale myslím, že je to důležitý bod, je, že v C, když píšu funkci, jako je tento Jak mám vědět, kolik prvků je v tomto poli? To je poněkud chyták. Mluvili jsme o tom trochu minulý týden v oddílu. Jak mám vědět, počet prvků uvnitř pole v C? Je tam způsob, jak? Ukazuje se, že neexistuje žádný způsob, jak vědět. Musíte projít do samostatně. Tam je trik, který můžete dělat pokud jste ve stejné funkci ve kterém pole bylo prohlášeno, a pracujete s zásobníku pole. Ale to funguje pouze pokud jste ve stejné funkci. Jakmile předat pole na jinou funkci, nebo pokud jste prohlásil pole a dáte, že pole na haldě, které jste použili malloc  a tento druh věcí, pak jsou všechny sázky jsou pryč. Pak jste skutečně projít kolem zvláštní argument nebo jiný parametr, který ti, jak velká pole je. V tomto případě, chtěl bych použít čárky to líto, že to bude mimo obrazovku zde- a já bych předat v jiném argumentu  a nazývat to int len ​​na délku. Jedna věc, která by mohla přijít na kvíz je výzvou k psaní nebo zavést určitou funkci s názvem něco. Pokud se vám nedávají prototyp, tak celá tahle věc tady, celý tento nepořádek je nazýván deklarace funkce nebo funkční prototyp, To je jedna z prvních věcí, které budete chtít donutit, pokud to není uveden na vás hned na kvíz. Další trik jsem se naučil, je, že říct, že jsme to vám prototyp pro funkci, a my říkáme, "Hele, musíš napsat." Uvnitř složených závorek, které máte v kvízu pokud si všimnete, že je návratový typ a zjistíte, že návratový typ je něco jiného, ​​než prázdna, což znamená, že funkce nevrací nic, pak jedna věc, budete určitě chtít udělat, je napsat nějaký return na samém konci funkce. Návrat, a v tomto případě, dáme prázdné, protože chceme, aby vyplnit prázdné. Ale to vás dostane myšlení správným způsobem o tom, jak budu přistupovat k tomuto problému? A to připomíná budete muset vrátit hodnotu k volajícímu funkce. Jo. >> [Student] Má styl použije, když jsme psát kód na kvíz? Jako odsazení a takové věci? >> [Student] Jo. Ne, ne tolik. Myslím, že hodně-to je něco, co budeme vyjasnit na kvíz v den, ale obvykle starosti # obsahuje a tento druh věcí, je to trochu mimo. [Student] Potřebujete, aby se vyjádřil své vlastnoruční kód? Potřebujete, aby se vyjádřil své vlastnoruční kód? V komentáři je vždy dobré, pokud máte obavy o částečné úvěru nebo chcete-li sdělit svůj záměr na srovnávač. Ale já, zase, bude vyjasnit na testu sám a na den kvízu, ale já nevěřím, že budete muset psát komentáře, no. Obvykle není, ale je to určitě jedna z těch věcí, kde můžete komunikovat svůj záměr, jako "Hej, to je místo, kde budu s ním." A někdy, že vám mohou pomoci s částečným úvěru. Cool. Basil. [Basil] Jaký je rozdíl mezi prohlašuje, řekněme, int LANG v argumentech nebo parametry oproti deklarování proměnné ve funkci? Wow, káva šel průdušnici. [Basil] Jako, které věci chceme dát v argumentech. Jo, to je velká otázka. Jak si vybrat to, co věci, které chcete dát do argumentů proti jaké věci byste měli udělat, uvnitř funkce? V tomto případě jsme zařadili obě tyto jako argumenty proto, že jsou něco, co každý, kdo se bude používat funkci SUMA musí specifikovat ty věci. Součet funkce, jako jsme mluvili o tom, nemá žádný způsob, jak zjistit, jak velký je pole se dostane z jeho volajícího nebo komukoliv používá součet funkce. To má žádný způsob, jak zjistit, jak velké toto pole je. Důvodem míjíme v této délce tady jako argument Je tomu tak proto, že je to něco, co jsme v podstatě vyprávění volající funkce, kdo je bude používat funkci SUMA, "Hej, nejen že budete muset dát nám pole z ints, budete také muset říct nám, jak velký je pole, které jste nám je. " [Basil] Ti budou obě argumenty z příkazové řádky? Ne, to jsou skutečné argumenty, které byste předat funkci. Dovolte mi, abych to novou stránku zde. [Basil] Jako jméno by pass- [Nate H.] Pokud mám int main (void), a já dám v mém návratu 0 sem v dolní části, a že chci volat funkci SUMA. Chci říct, int x = sum (); Chcete-li použít funkci SUMA musím projít v obou pole, které chci shrnout a délka pole, takže je-li za předpokladu, že jsem měl celou řadu ints, že jsem měl int numbaz [] = 1, 2, 3, druh použití, které naboural do syntaxe tady, pak to, co budu dělat, je v součtu bych chtěl předat jak numbaz a číslo 3 říci částku funkci "Dobře, tady je pole chci, abyste sečíst." "Tady je jeho velikost." Dává to smysl? Znamená to, že odpověď na vaši otázku? V mnoha ohledech to dělá paralelně, co děláme s hlavní když máme argumenty příkazového řádku. Program, jako Caesara, například, že potřeba Argumenty příkazového řádku nebudou moci nic dělat. Nebylo by vědět, jak šifrovat, pokud jste si říct, že to, co klíč k použití nebo pokud jste neřekl to, co jste chtěli řetězec k zašifrování. Dotazování pro vstup, to je místo, kde máme 2 různé mechanismy pro přijetí vstup od uživatele, přičemž pro informace od uživatele. Pro Problém Set 1 jsme viděli tento GetInt, GetString, GetFloat cestu z výzvy pro vstup, a to je volán pomocí standardního vstupního proudu. Je to trochu odlišné. Je to něco, co můžete udělat, najednou na rozdíl od při vyvolání programu, při spuštění program běží. Argumenty příkazového řádku všichni jsou specifikovány při spuštění programu běh. Byli jsme míchání dva z nich. Když používáme argumenty funkce, je to podobně jako argumenty příkazového řádku pro hlavní. Je to, když vyvoláte funkci, kterou potřebujete sdělit, co přesně potřebuje k plnění svých úkolů. Další dobrá věc dívat se na a já tě nechám na to podívat ve svém volném čase, a to byla pokryta v kvízu, byl tento pojem působnosti a lokální proměnné oproti globálních proměnných. Do věnovat pozornost. Teď, když jsme stále na této jiné věci, v týdnu 3 jsme začali mluvit o vyhledávání a řazení. Vyhledávání a třídění, alespoň v CS50, je velmi úvod do některé z teoretické části výpočetní techniky. Problém vyhledávání, problém třídění jsou velké, kanonické problémy. Jak si najít konkrétní číslo v poli miliard celých čísel? Jak si najít konkrétní jméno v telefonním seznamu , který je uložený na vašem notebooku? A tak jsme zavést tento pojem asymptotické doby běhu opravdu kvantifikovat, jak dlouho, jak těžké to problém je, jak dlouho berou řešit. V, věřím, 2011 v kvízu je tu problém, že jsem si zasluhuje pokrývající velmi rychle, což je tento, problém 12. O ne, je to Omega. Zde mluvíme o nejrychlejším možném běhu pro konkrétní algoritmus a pak nejpomalejší možné běhu. Tento Omega a O jsou opravdu jen zkratky. Jsou notační zkratky pro ostatní jak rychle v nejlepší možný případ bude náš algoritmus run, a jak pomalu v nejhorším možném případě bude náš algoritmus běží? Pojďme udělat pár z nich, a ty byly také zahrnuty v krátké na asymptotické notaci, která vřele doporučuji. Jackson odvedl opravdu dobrou práci. S binární vyhledávání, mluvíme o binární vyhledávání jako je algoritmus, a většinou si povídáme o tom, pokud jde o jeho velké O. Co je to velký O? Co je nejpomalejší možná doba chodu binárního vyhledávání? [Student] N ²? Zavřít, myslím, že podobně jako. Je to mnohem rychlejší, než to. [Student] Binary? >> Jo, binární vyhledávání. [Student] Je to log n. Přihlásit n, takže to, co dělá přihlásit n znamená? To půlky při každém opakování. Přesně tak, v nejpomalejší možný případ, říct, jestli máte seřazena pole milionu celých čísel a počet hledáte je buď první prvek v poli, nebo poslední prvek v poli. Pamatujte si, že binární vyhledávací algoritmus pracuje tak, že při pohledu na prostřední prvek, zjistit, jestli je to zápas, který hledáte. Pokud je, pak skvělé, jste ji našli. V nejlepším možném případě, jak rychle se binární vyhledávací běh? [Studenti] 1. 1, je konstantní čas, velký O ze dne 1.. Jo. [Student] Mám dotaz. Když se řekne log n, myslíš s ohledem na základně 2, ne? Ano, tak to je jiná věc. Říkáme protokolu n, a myslím, že když jsem byl na střední škole Vždycky jsem předpokládal, že log je základ 10. Jo, takže ano, přihlaste základna 2 je obvykle to, co používáme. Opět platí, že návrat do binárního vyhledávání, pokud hledáte pro jeden prvek na samém konci, nebo prvek na samém začátku, protože začnete ve středu, a pak je vyhodíte podle toho, co polovina nesplňuje kritéria, která hledáte, a jdete na další polovinu a další polovina a další polovina. Pokud jsem hledal největší prvek v milionech integer pole Jdu na polovinu je nanejvýš protokolu 1000000 krát než jsem se konečně vyzkoušet a uvidíte, že element Hledám je v největší nebo v nejvyšší index pole, a že bude trvat log n, přihlaste 1 milion krát. Bubble sort. Myslíte si, kluci si na bubliny řazení algoritmus? Kevin, můžete mi dát rychlý rekapitulaci toho, co se stalo v algoritmu bubble sort? [Kevin] V podstatě to jde přes všechno v seznamu. Vypadá to na první dva. Je-li první z nich je větší než druhý to swap nich. Pak se porovnává druhý a třetí, to samé, swapy, třetí a čtvrté, celou cestu dolů. Větší čísla budou následovat až do konce. A po mnoha cyklech však máte hotovo. Přesně tak, to, co Kevin řekl, je, že budeme sledovat větší počty bublina až do konce pole. Například, nebude vám vadit, pěší nám prostřednictvím tohoto příkladu, pokud je to naše pole? [Kevin] Budete mít 2 a 3. 3 je větší než 2, takže je swap. [Nate H.] Dobře, tak vyměníme tyto, a tak jsme si 2, 3, 6, 4, a 9. [Kevin] Pak budete porovnávat 3 a 6. 3 je menší než 6, tak je necháte, a 6 a 4, měli byste vyměnit, protože 4 je menší než 6. [Nate H.] Dobře, tak jsem si 2, 3, 4, 6, 9. [Kevin] A 9 je větší než 6, takže si nechte ho. A vy byste se vrátit přes to znovu. [Nate H.] Mám udělat na tomto místě? >> [Kevin] č. A proč jsem neudělal v této chvíli? Vzhledem k tomu, to vypadá, že moje pole je řazen. Dívám se na něj. [Kevin] Projděte si to znovu a ujistěte se, že nejsou žádné další swapy než budete moci plně zastavit. Přesně, takže je třeba jít dál až do konce a ujistěte se, že nejsou žádné swapy že je možné provést v tomto bodě. Bylo to opravdu jen štěstí, jak jsi říkal, že jsme skončili pouze musel platit 1 průchod a my seřazeny. Ale udělat to v obecném případě budeme skutečně muset udělat to znovu a znovu. A ve skutečnosti, to bylo příkladem nejlepší možný případ, jak jsme viděli v problému. Viděli jsme, že nejlepší možný případ byl n. Šli jsme přes pole 1 krát. Co je nejhorší možný případ tohoto algoritmu? [Kevin] N ². A co to vypadá? Co by pole vypadat, že by se n? Čas? [Kevin] [neslyšitelné] seřazeny. Přesně, takže když jsem měl pole 9, 7, 6, 5, 2, Nejprve 9 by bublina celou cestu nahoru. Po 1 iteraci budeme mít 7, 6, 5, 2, 9. Pak 7 by bublina nahoru, 6, 5, 2, 7, 9, a tak dále, a tak dále. Museli bychom jít přes celé pole n časy, a můžete skutečně dostat o něco přesnější než toto protože jakmile jsme přesunuli 9 po celou cestu až do svého posledního možného postavení víme, že nikdy nebudete muset porovnat proti tomuto prvku znovu. Jakmile začneme bublá na 7 až víme, že se můžeme zastavit, jakmile 7 je přímo před 9 neboť jsme už porovnali 9 k němu. Pokud to uděláte v inteligentním způsobem, že to není opravdu, myslím, že moc času. Nebudete porovnat všechny možné [neslyšitelné] kombinace pokaždé projít každé iteraci. Ale přesto, když mluvíme o tom horní mez můžeme říci, že se díváte na n ² srovnání celou cestu přes. Vraťme se zpátky, a od té doby jsme začínám trochu málo času Řekl bych, že byste se měli rozhodně jít přes zbytek této tabulky, vyplnit to všechno ven. Myslete na příkladech. Myslete na konkrétních příkladech. To je opravdu šikovný a užitečné udělat. Nakreslete to. Toto je druh tabulky, které, jak si projít v informatice měli byste opravdu začít znát tyto strany srdce. Jedná se o druhy otázek dostanete v rozhovorech. Jedná se o druhy věcí, které jsou dobré vědět, a myslím, že na ty hrany případech, opravdu přijít na to, jak přemýšlet o věděl, že pro bubliny třídit nejhorší možné spektrum třídit s tím je ten, který je v opačném pořadí. Ukazatele. Pojďme trochu pohovořit o ukazatele. V posledních několika minutách jsme se zde Já vím, že to je něco, co spolu se souborem I / O, která je poměrně nový. Když mluvíme o ukazatelích důvod chceme mluvit o ukazatele Je tomu tak proto, jeden, když pracujeme v C jsme opravdu na poměrně nízké úrovni v porovnání s většinou moderních programovacích jazyků. Jsme skutečně schopni manipulovat proměnné v paměti, zjistit, kde oni jsou ve skutečnosti nachází v naší paměti RAM. Jakmile jste se rozhodli, aby přijal tříd operační systém, který uvidíte že je opět jakýmsi abstrakce. To není ve skutečnosti pravda. Máme virtuální paměť, která se skrývá tyto údaje od nás. Ale teď můžete předpokládat, že když máte program, Například, když začnou svůj Caesara programu- Budu přepnout zpět do mého iPad opravdu rychle- že na samém začátku programu, pokud máte, řekněme, 4 GB RAM na vašem notebooku, vám zrušil tento kus, a my Vám zavoláme tuto RAM. A začíná v místě, budeme volat 0, a končí na místě, které budeme nazývat 4 GB. Já opravdu nemohu psát. Člověk, se hacknutý, že. Když váš program provede operační systém vyřezává paměť RAM, a specifikuje různé segmenty pro různé části vašeho programu žijete Tady dole tato oblast je tak trochu země nikoho. Když jdete nahoru kousek dál zde máte skutečně na místo, kde kód pro umístění programových život. Že skutečné binární kód, ve skutečnosti, že spustitelný soubor se nahraje do paměti při spuštění programu, a to žije v kódu segmentu. A jak váš program spustí procesor se dívá na tomto kódu segmentu přijít na to, jaký je další instrukce? Jaký je další řádek kódu musím spustit? K dispozici je také datový segment, a to je tam, kde se tyto řetězce konstanty se uloží, které jste dosud používali. A pak dál tam je to místo nazývá haldy. Máme přístup k paměti tam pomocí malloc, a pak směrem k vrcholu svého programu je tu hromada, a to je, kde jsme hráli po většinu začátku. To není v měřítku nebo tak něco. Mnoho z toho je velmi závislá na systému, operační systém závislý, ale to je poměrně, jak se věci blokového up. Při spuštění programu a deklarovat proměnnou s názvem x- Budu čerpat další krabici dole, a to se bude RAM stejně. A budu vypadat. Budeme kreslit zubaté čáry uvést toto je jen malá část paměti RAM a ne všichni to, jak jsme tomu v horní části. Pokud Prohlašuji celočíselnou proměnnou nazvanou x, pak to, co jsem vlastně si je mapování , který je uložen v tabulce symbolů svého programu které spojuje jméno x do této oblasti paměti, které jsem vypracovány tady mezi svislými pruhy. Když budu mít řádek kódu v mém programu, který říká, že x = 7 procesor ví "Ach, ano, já vím, že x žije v této lokalitě v paměti." "Chystám se jít dopředu a napsat 7 tam." Jak to vědět, co to je místo v paměti? No, to, že vše je hotovo v době kompilace. Kompilátor se stará o přidělování, kde každé proměnné se chystáte jít a vytvořit speciální mapování či spíše připojení tečky mezi symbolem a, kde to bude, proměnná je jméno a, kde to bude žít v paměti. Ale ukázalo se, že skutečně můžeme k nim přistupovat v našich programech stejně. To dostane důležité, když začneme mluvit o některých datových struktur, což je pojem, který budeme zavádět později. Ale teď, co můžete vědět, je to, že mohu vytvořit ukazatel na toto místo, x. Například, mohu vytvořit proměnnou ukazatele. Když jsme se vytvořit proměnnou ukazatele používáme hvězdy notaci. V tomto případě, to říká budu vytvořit ukazatel na int. Je to typ, stejně jako každý jiný. Dáváme mu proměnnou jako y, a pak nastavit tak, rovná adresu, na adrese. V tomto případě, můžeme nastavit y poukázat na x tím, že adresu x, které nesouvisí s tímto ampersand, a pak jsme se vydali y, aby ukazoval na něj. Co to v podstatě dělá, je, když se podíváme na naši RAM vytváří samostatnou proměnnou. Bude to říkat y, a když tento řádek kódu provede to je vlastně chystáte vytvořit malý ukazatel, který jsme obvykle čerpat jako šíp, a nastaví y poukázat na x. Ano. [Student] Pokud x je již ukazatel, byste prostě int * y = x namísto ampersand? Ano. Pokud x je již ukazatel, pak si můžete nastavit 2 ukazatele ve výši rovnající se navzájem, v takovém případě by se y poukázat na x, ale to by chtěl poukázat na cokoliv x ukazuje. Bohužel, jsme mimo čas. Co bych řekl v tomto bodě, můžeme si o tom promluvit režimu offline, ale já bych začít pracovat prostřednictvím tohoto problému, # 14. Můžete vidět, že je to už trochu vyplněn tu pro Vás. Můžete vidět, že když my deklarujeme 2 ukazatele, int * x a y *, a všimněte si, že nasměrování * vedle proměnné bylo něco, co bylo provedeno v loňském roce. Ukazuje se, že je to podobné tomu, co děláme v tomto roce. Nezáleží na tom, kde jste napsat *, když jste prohlásil ukazatel. Ale my jsme psali * vedle typu proto, že je velmi jasné, že jste deklarovat proměnnou ukazatele. Můžete vidět, že prohlásí 2 ukazatele nám 2 krabičky. Zde, když jsme x se rovná malloc co to říká je zrušení paměti v haldě. Tento malý box tady, to kruh, se nachází na haldě. X ukazuje na něj. Všimněte si, že y je stále neukazuje na nic. Chcete-li získat paměť k uložení čísla 42 do x bychom použili co notaci? [Student] * x = 42. Přesně, * x = 42. To znamená, že za šipkou a hodit 42 tam. Zde, kde jsme se vydali y a x jsme y ukazuje na x. Opět platí, že je to přesně to, co Kevin řekl, kde jsme se vydali y rovno x. Y neukazuje na x. Spíše, je to ukázal na to, co x ukazuje na stejně. A pak se konečně v tomto posledním okně jsou 2 možné věci, které bychom mohli dělat. Jedním z nich je dalo by se říci * x = 13. Druhá věc je, že jsme mohli říct: Alex, víš, co bychom mohli dělat? Dalo by se říci, * x = 13 nebo- [Student] Dalo by se říci, int cokoliv. [Nate H.] Pokud byl odkazoval se na jako int proměnné jsme mohli udělat. Mohli bychom také říci, * y = 13, protože jsou oba ukázal na stejném místě, tak bychom mohli použít buď proměnná se tam dostat. Jo. >> [Student] Co by to vypadalo, kdybychom jen říct, int x je 13? To by bylo deklarovat novou proměnnou s názvem x, který by nefungoval. Měli bychom mít kolizi, protože je deklarována x za ukazatel tady. [Student] Kdybychom měli toto prohlášení samo o sobě, co by to vypadat, pokud jde o kruhu? Pokud bychom měli x = 13 a pak budeme mít pole, a spíše než na šipku přichází po vybalení z krabice bychom nakreslit jako jen 13. [Student] V poli. Dobře. Děkujeme vám za sledování, a hodně štěstí na Quiz 0. [CS50.TV]