DAVID Malan: Dobře. Tak tohle je CS50, a to je Nyní start tří týdnu. Takže až do teď, máme bylo psaní programů v jazyce C které vypadají trochu něco jako tohle. Takže máme pár ostré obsahuje v horní části. Máme int, hlavní, void, a pak se něco udělat ve středu, některá část kódu uvnitř této funkce. Ale klíč je skutečnost, že jsme se tu říká neplatné. Takže neplatné, všechny z této doby, specifikuje že tento program při spuštění, lze spustit pouze pomocí jeho názvu. Nelze zadat žádná jiná slova nebo Čísla za jménem programu, pokud spuštěním. Tak například, pokud program byl sestaveny do souboru s názvem Dobrý den, byste mohli udělat ./hello, ale to je vše. 

Jediný způsob, jak byste mohli přispívat k tomuto programu je voláním funkce. Například, co se funkce jsme používali doposud získat vstup od uživatele? 

Diváků: Získat řetězec. DAVID Malan: Chcete-li získat řetězec, nebo dostat int, nebo jste viděli ostatní, i když jste používali dosud, jako se dlouhé, dlouhé a podobně. Ale dejme tomu, že jsme opravdu chcete začít psaní programů, které jsou jen o málo více univerzální, a, upřímně řečeno, trochu víc jako příkazy, které jste Dostali, doufejme, trochu zvyklí. Stejně jako cd prostoru Dropbox. To, samozřejmě, změny adresář, za předpokladu, že jste na Johna Harvardu domova adresář, do vašeho Dropbox složky. Mezitím se příkaz jako je tento vytvoří nový adresář s názvem pset2, Jak jste si možná již ani bude brzy problém nastavit dva. Ujistěte se Dobrý den, samozřejmě, je příkaz že vytváří program s názvem ahoj ze souboru s názvem ahoj tečka c. A v každém z nich případy, teď jsme měli poskytnout argument na takzvaný příkazový řádek, blikání rychlé, takže make ví, co stavět, a tak že mkdir ví, co složku, kterou chcete vytvořit, a aby cd ví kam chcete jít. Ale až do teď, máme pořád říkáš že hlavním Vaše výchozí funkce, má void výraz uvnitř těchto závorkách, což znamená, že nemůže mít žádné argumenty. 

Tak začíná dnes, co budeme dělat se, jdeme na začátek podporovat takové věci ještě. Ve skutečnosti, v tomto případě, který vám nejsou obvykle ručně zadat, Ujistěte se dělá pro nás nejsou jeden, ale jeden, dva, tři další struny Po skončení programu je pojmenovaný zvonění. Tak jak toho dosáhnout? 

No, začíná dnes, v případech, kdy chceme poskytovat prostřednictvím vstupu takzvaný příkazový řádek, budeme začít přidávat zde to, co je v yellow-- výměnou za neplatné s int argc čárkou string argv závorka závorka. Nyní je to zajímavé pár důvodů. Za prvé, bude to nám napsat programy, které jsou o něco větší dynamiku. Ale více přesvědčivě, bude to otevřít nyní rozhovor, aby se co pole může opravdu být použity, za to, co řetězec Opravdu je pod kapotou, až do příštího týdne, kdy začneme potápění v ještě hlubší, jak je stroj aby všechny tyto věci práce. Ale teď, pojďme kreslit, Možná, obraz. 

Když napíšete program s hlavním prohlásil, tímto způsobem, tak, že hlavní přijímá dva argumenty, int a-- jaký typ dat je druhý argument? 

DIVÁKŮ: Array. DAVID Malan: Array. Takže to vypadá na první pohled jako by to string, ale všimněte si hranatých závorek. Připomeňme, minule jsme uvedli na trh Pojem pole. A pole používají hranaté závorky v několika souvislostech. Můžete použít na náměstí držáky jít do pole a získání určitého prvku, jako je držák 0 nebo 1 nebo držák držák 2. Ale viděli jsme, je-li krátce, minulý týden, že je také použít tyto hranaté závorky pro deklarovat velikost pole, pokud předem víte, kolik ints nebo kolik řetězce nebo cokoliv vlastně chtějí. Tak to dopadá tu třetina kontext zde která nemá číslo uvnitř z hranatých závorkách. Zadáte-li, jak jsem se zde, název něco jako argv, což je jen ozdobný způsob, jak říká argument, vektor, který je další ozdobný způsob, jak říká řadu argumentů, závorka závorka jen Znamená to, že nemusíte nutně vědět předem, jak velký pole bude, ale víte, že to bude pole. Takže pokud nevíte, číslo nedávejte to tam, pro závorka závorka znamená, že argv není řetězec, ale pole řetězců. Takže syntakticky, pokud máte vzpomínat minulý týden, je to velmi podobné, jako kdybychom řekli něco jako int věku otevřený držák, a pak něco později. Takže to, co to vypadá? Pojďme se vlastně nakreslit obrázek. Takže při spuštění tohoto programu s hlavními mít dva argumenty jsou definovány uvnitř z těch závorek, je v zásadě nejméně dva kusy paměti podal na vás pod kapotou. Jednou, když jsem si kreslí jako tento obdélník, se bude nazýván argc. A stejně jako rychlou rekapitulaci, co je typ dat argc? Takže je to int. Takže číslo bude jít argc-- zatáčkách na to, že je zkratka pro počet argumentů. Mezitím jsem vypracovány argv jako pole. A já opravdu nevím jak dlouho to bude, takže pro dnešní účely dot dot dot. To by mohlo dostat nějaké délky. Ale já jsem tady na obrázku nejméně čtyři obdélníky. Takže argv kus paměti, která uchovává string string string dot dot dot a argc je jen jeden kus paměti na celé číslo. 

Takže buďme trochu přesnější. Pokud když mám struny v tomto poli, nazvaný argv, chci, aby si na ně individuálně, stejně jako minulý týden, budeme používat notaci jako argv držáku 0 Chcete-li získat první věc pole. Argv držák 1, aby si Druhá věc, a tak dále. Klíčem je zde je, že jsme stále 0 indexed-- pořád počítat od 0. Takže teď pojďme skutečně dát něco na to. Pokud bych měl sestavit program s názvem Dobrý den ze souboru s názvem Dobrý den tečka c, a pak jsem se spustit tento program s tečkou lomítko Dobrý den, to, co dělá můj počítač, notebook, vypadat jako pod kapotou v okamžiku, kdy jsem běžet tečka lomítko ahoj a stiskněte klávesu Enter? Tak, to je možná co bychom mohli popsat jako obsah počítače paměti nebo na paměťové RAM-- Random Access. Jinými slovy, počítač, nějak pro vás jako mávnutím kouzelného proutku, uvádí číslo 1 v argc, AKA argcount, a to dá doslova řetězec ./hello v argv držáku 0. Nemám tušení, upřímně řečeno, to, co je v argv držáku 1 nebo 2 nebo 3, proto, že v případě, že uživatel nemá napsal cokoliv kromě ./hello, budeme předpokládat, že tyto jsou s největší pravděpodobností hodnoty na odpadky, abych tak řekl. Tyto kousky paměti existují, ale není to na nás dívat se na ně, protože argcount je jen jedna. 

Teď, mezitím, když jsem napsat spustit jiný program, cd, což je více vhodně příkaz, v blikajícím prompt-- cd prostoru Dropbox-- při spuštění, že efektivně, při spuštění cd program argc, vnitřní paměti svého počítače, je pro nejvíce nejkratší druhé číslo dvě. A pak argv držák o má cd, argv držák 1 má Dropbox, a pak samozřejmě příkaz dokončí, takže všechny tyto paměti v podstatě zmizí a se používá pro něco jiného. A to je důvod, proč říkám, jen zlomek vteřiny. 

Mezitím, když to uděláme mkdir pset2, obrázek vypadá téměř stejný, ale s různými šňůrky, uvnitř argv. Pokud se mi zvonění pomlčka ahoj ahoj tečka c, stejný nápad. Další věc je vyplněn pro argv a argc, samozřejmě, je 4. Takže jinými slovy, i když tohoto pole mohou být dot dot dot některých proměnné délky, abych tak řekl, budete vždy vědět, kde je jeho konec je, protože argc se ti to říct na jakém místě budete muset přestat při pohledu na prvky argv. Můžete se podívat jen na čtyři celkem v této věci. 

Takže pojďme se teď podívat na, Možná, jednoduchý program. Jeden, který jen říká, ahoj s někým, jako je Zamyla. Takže tvrdím, budu psát program za chvíli, přes který bych mohl udělat ./hello prostor Zamyla, a pak chci můj program vytisknout něco super-jednoduchý jako "ahoj, Zamyla." Nyní, v minulosti jsme použili getString. Takže v minulosti, a to i v případě, jste k programování nového, pravděpodobné, můžete vybičovat program, který používá getString a potom pomocí printf pozdravit Zamyla. Ale pojďme nepoužívejte getString tentokrát. Dovolte mi, abych místo toho jít do Appliant a to včetně standardního I O dot hodin. Dovolte mi, abych také zahrnovat CS50 dot hodin. Nyní int main, a teď jsem nebudu dělat neplatné dnes. Místo toho, budu dělat int argc string argv závorka závorka, není ani číslo. A teď je můj takzvaný dělat. Co budu dělat teď, je, že jsem dělat trochu skok víry, Budu předpokládat, že uživatel je bude správně používat tento program, a já jsem prostě jít do to printf Dobrý den,% Sn. Takže nic nového tam. Ale já chci, aby se dal co slovo uživatel zadá za jménem programu. Takže když jsem to ./hello prostor Zamyla jsem Chcete nějak programově přístup citovat konec citátu "Zamyla." tak jsem může jít do mého argumentu vektoru, moje pole řetězců, a je-li příkaz, opět, byl ./hello prostor Zamyla, jaké číslo to chci , aby zde v argv? Diváků: 1. DAVID Malan: 1, protože držák 0 dopadá bude název programu, jak jsme viděli. Takže držák 1 je první slovo že já, jako uživatel zadali. Chystám se jít dopředu a ušetřete to. Chystám se jít do mé složky kde jsem umístil tento soubor. Budu dělat, aby ahoj 3. Comp IO je v pořádku. ./hello Zamyla Enter. Co jsem udělal špatně? Byl jsem chycen překvapením já jen na chvíli tam. Co jsem udělal špatně? 

DIVÁKŮ: Name. 

DAVID Malan: Soubor je vlastně volal hello3.c. A já jsem to jen pro konzistence, protože jsme měli hello.c je v minulost v on-line kódu. Takže pojďme vyřešit tento ./hello Držák pomlčka 3 Zamyla. Enter. A teď máme ahoj, Zamyla. Zatím můžu změnit na je Rob, nebo opravdu jiné slovo. 

Ale uvažujme rohový případ. Co můžete očekávat, pokud se stane, Nechci psát název něčí vůbec? 

DIVÁKŮ: Chyba. 

DAVID Malan: chyba nějakého druhu, snad. Pojďme se podívat. Enter. Null. Takže printf je skutečně malý ochranný nás tu, a doslova tisk otevřené závorka null, ale i horší věci se může stát. A právě k prokázání něco, co absolutně neměli dělat, jdeme na zde a začít vrtat. Je to tak? Pokud já vím, že obraz v paměť je v podstatě to, argv držák 1 má Zamyla, argv Držák 0 je ./hello, nebo ./hello-3. Co je v držáku 2? Takže můžu odpovědět, že ptát sám sebe, že jo? Mohu jen změnit 1 na 2. Nyní mohu překompilovat ahoj 3, ./hello3 Pojďme přiblížit a stiskněte klávesu Enter. Jejda. No quote značka. Zajímavé. Tak to je docela v pohodě vidět, co ještě je tady. 

Takže co jiného je uvnitř mého notebooku? Zachraňme s držákem 3. Ujistěte se hello3, ./hello-3. Zvědavý. A teď pojďme opravdu bold-- 50. Tak to je opravdu potápění hluboko do paměti svého počítače. 50 indexy v. Tak, aby ahoj 3 ./hello-3. Zvědavý. Tak jo, teď jsem jen dostane bezohledné. Pojďme do 5000. V pořádku. Takže mi dovolte překompilovat. Ujistěte se hello3, ./hello-3. OK. Nyní někteří z vás, může se být žárovka bude vypnuto. Kolik z vás má viděl tuto zprávu? OK. Tak proč? 

Kurzy jsou-- a tam je jiný věci, které mohou způsobit to, a jasně, že jste v dobré company-- máme jasně způsobil, co se nazývá poruchy segmentace. A dlouhý příběh krátký pro dnešek, jsem se dotkly segment paměti že jsem neměl. V případě segmentu prostě znamená kus paměti, že bych neměl mít. Nyní je počítač zaručuje, že když jsem spustit ./helloZamyla, že mohu dotknout argv být držák 0 a argv držák 1. Ale argc je hodnota 2, to znamená, že jsem pouze allowed-- je to trochu cti system-- na dotek držák 0 a 1 držák. Mám-li jít dál, je tu absolutně bude existovat paměti. Můj RAM existuje fyzicky v počítači. Ale kdo ví, co je to? Ve skutečnosti, já jsem běh více programy najednou. Možná jsem seen-- kdybych nebyl dělá na Appliant tento ale na mém počítači Mac nebo PC-- bych mohl mít vidět obsah e-mailu. Možná jsem viděl na okamžik Zpráva Nedávno jsem poslal. Cokoliv, co by mohlo být přetrvávající kolem v paměti mohly být přístupné prostřednictvím Tento svévolný hranatá závorka notaci. Nebo ještě hůř, pravděpodobně budete muset našel jeden z mých hesel že jsem nedávno napsal v roce, který Program se uloží do paměti tak, aby mi ověřit, a pak jen tak nechal v paměti RAM, až jsem přestal tento program. 

A skutečně, to je jeden z nebezpečí a jeden pravomoci používání jazyka, jako je C Máte neomezený přístup na celý obsah paměti programu je, a co protivníci mohou dokonce dělat v těchto cases-- zvláště když jsme dostat do programování pro web ke konci semestru, budeme znovu tuto topic-- se hrabat kolem sebe, potenciálně někdo počítače paměti a najít takové podivné věci jak jsme tam viděli. Nebo dokonce ještě horší, hesla, že nebo ona pak mohou použít k dělat špatné věci. 

Tak jasně jsem neměl dělat to, protože divné věci začnou dít. Opravdu, toto je program shazovat. To by bylo ekvivalentní Mac OS nebo Windows okno programu právě mizí. Došlo k neočekávané chybě. V prostředí příkazového řádku vidíme něco takového. Ale to je důvod, proč se mi pouhým dotykem paměti, že nepatří ke mně. 

Takže pojďme se bránit proti tomuto A trochu jinak při pohledu na tento program naleznete zde. Takže, opět, kostra že jsme viděli earlier-- a já jsem se zvýrazní tentokrát int. A celou tu dobu hlavní má opravdu vrátil hodnotu. I když se ve většině naší přednášky Příklady jsme ani jednou použité vrátit něco v main. Právě jsme se napsat printf zavřít složená závorka a je to. Ale zdarma to, co kompilátor dělal pro vás, efektivně, se vrací 0 pro vás. Ukázalo out-- a je to trochu counterintuitive--, že 0 je dobrá. To neznamená, že falešný sobě. 0 je dobrá, a všechny non-0 hodnota, se svět rozhodl, může znamenat chybu. Takže pokud jste někdy zmatek něco, co se na vašem počítači, nebo program, který právě zemřel na vás a jste se dostali nějaké chybné okno na obrazovce, říká chyba Negativní 49 nebo chyba 23-- některé zdánlivě libovolný value-- to protože programátor se pevně hodnoty jako negativní nebo pozitivní 49 23 představují libovolný počet, troufám tvrdit, 4 miliardy možných věcí které by mohly pokazit v programu. 

Tak jak bych mohl vzít Výhodou sám? No, dovolte mi, abych otevřít program že jsem napsal v předstihu, a hrabat kolem on-line s názvem Hello 4. A je to téměř totožné, kromě toho, že jeho dostal trochu kontrolu chyb. V tomto případě jsem se znovu prohlásil Hlavní as ohledem dva argumenty, ale tentokrát na lince 17, oznámení Dělám trochu kontroly sanity. Já ujistěte se, že argc rovná se rovná 2. Vzhledem k tomu, je-li, že znamená, že můžete bezpečně dotknout nejen držáku 0, ale držák 1. A já jsem do toho pusťte a vytisknout, v tomto případě, Zamyla nebo Rob nebo co slovo, které jsem napsal ven. A teď jen proto, aby trochu správný, Chystám se výslovně návrat 0 znamenat vše je v pořádku. Nic zlého se nestalo. 

Ale konvencí, budu vrátí 1, nebo upřímně nějaké non-hodnota 0, kdyby se něco pokazilo. Nyní se uživatel nebude opravdu všimnete, co se děje. Ve skutečnosti, když půjdu do tohoto adresáře, jsme se přiblížit a dělat, aby ahoj 4, ./hello-4 Zamyla chová, jak jsem očekávat. Ale kdybych místo nezadávejte nic, se zdánlivě nic neděje, ale to není krach. A kdybych místo toho udělat něco jako Rob je prokurista v Thayer-- sdílení libovolné informace. Ale oznámení, argv 1, 2, 3, 4, a 5 by nyní existovat v paměti. To také není to, co můj program očekává, protože jsem zkontrolovat, zda argc rovná roven 2 nebo ne. Takže jsem teď bránit proti tomu. 

Nyní, stejně jako stranou, jsme programmer-- nebo spíše jsme users-- nikdy vidět, že 0 nebo 1, ale s použitím nástroj s názvem Debugger nebo jiné nástroje, jak uvidíme před dlouho jste programátor můžete skutečně vidět, co by mohlo být špatně uvnitř programu. 

Takže nějaké otázky týkající se argc? Jo. 

Diváků: Viděl jsem, kde neměl charakter, [neslyšitelné] právě řekl string hvězda d, jako je Znak hvězdička čárka. Jsou ekvivalentní tady? 

DAVID Malan: Jsou to. Takže otázka je, máte občas vidět programy takhle, že ne říci, string argv držák ale něco říct jako char hvězda argv držáku. A je tu ještě další varianty, které můžete vidět. Oni jsou opravdu ekvivalentní. Nyní máme tyto druh koleček na ve formě řetězce v CS50 knihovna, ale jen něco málo přes týden nebo tak budeme odstranit, aby dohromady a vlastně obstrukce Podívejte se, co char a hvězdy jsou, a jak ty se týkají paměti zastoupení obecně. Takže se vrátíme k tomu. 

Další otázky týkající se naší argv nebo argc? Jo. Diváků: Proč se to vrátí Chyba [neslyšitelné]? DAVID Malan: Proč to udělal vrátí chybu only-- oh! V předchozím případě, kdy byly futzing kolem s pamětí, proč se to jen vrátí chybu když jsem opravdu napsal velký počet? Stručná odpověď je, že jsme jen měli štěstí. Obecně řečeno, počítač přiděluje paměť v kusech, a to mi dal dost velký kus, který Jsem pryč, aniž by si všiml, dotyku držáku 2, držák 3, držák 50, ale jakmile jsem se tlačil moje štěstí, šel jsem za Hranice kus paměti operační systém dal mi. A to je, když je zakročil a řekl, ne. Chyba segmentace. Jo. 

Diváků: Jak funguje počítač znát hodnotu argc? 

DAVID Malan: Jak funguje počítač znát hodnotu argc? Při spuštění programu, tento program, podle povahy blikající řádku je podal řadu slova, které byly zadány na výzvu, která byla zadali na příkazovém řádku. A tak to je váš operační systém, který v podstatě naplní argumenty Hlavní je pro vás. Takže to je jedna ze služeb, že dostanete, tak nějak tajně pod kapotou operační systém. Další otázky? Jo. 

Diváků: Co core dump znamená? DAVID Malan: Co core dump znamená? Tak to je dobrá otázka. A dovolte mi vrátit se do tento adresář zde. A všimněte si, že Mám nový soubor tam. Je to opravdu nazývá jádro a to je ve skutečnosti obvykle slušné velikosti souboru. To je v podstatě snímek obsah paměti mého programu nebo RAM, když havaroval. A to bude užitečné, potenciálně diagnosticky, jakmile budeme mluvit v další přednášce a sekce o ladění, protože můžete skutečně dělat ekvivalent digitální pitvy v tomto souboru pomůže zjistit, to, co jste udělali špatně ve vašem programu. Jo. 

DIVÁKŮ: Je argc příkazu v sama o sobě, nebo můžete ji pojmenovat něco? 

DAVID Malan: Dobrá otázka. Je argc příkaz sám o sobě, nebo můžete ji pojmenovat něco? Rozhodně to není příkaz. Je to prostě proměnná je nebo název argument je, a tak naprosto jsme mohli nazvat tuto foo, bychom mohli nazvat tento bar, které mají tendenci jako go-to slovy, že počítač vědec jde. Ale konvence, budeme používat argc a argv. Ale to je jen člověk konvence, nic víc. V pořádku. Tak se ukázalo, byl jsem vyprávění trochu bílého lie-- a upřímně řečeno, v budoucnu uvidíte jsme říkali ostatní White Lies. Ale teď jedeme loupat se po jednom z nich. V tomto případě je zde, když jsem předtím běžel program, jako je ./hello nebo ./hello-3 Zamyla jsme měli obsah mého paměti počítače při pohledu zhruba jako to. Ale vzpomenout, co je řetězec. Co jsme si řekli před týdnem, co Řetězec je vlastně pod kapotou? Diváků: Pole znaků. DAVID Malan: Je to řada znaků, ne? Takže můžeme mít celou řadu řetězce, ale na druhou stranu, řetězec je pole znaků. Takže jestli opravdu chci být anální když kreslím tento obrázek, Měl bych opravdu kreslení to trochu jako je tento, , přičemž v každém z nich indexy mého argv pole, je sama o sobě celý řetězec který sám o sobě je v matici. A teď nevinná lež říkáme dnes je, že obraz není vypadají docela takhle. Ve skutečnosti, malé čtverce jsou obvykle mimo velkých obdélníků tam. Ale vrátíme se k tomu zanedlouho. Ale to je ./hello zpětné lomítko 0, že je speciální znak, který vymezuje konec řetězce, a máme ještě jeden po Zamyla jméno. Takže co to znamená? 

No, nech mě jít napřed a otevřít další dva příklady které jsou k dispozici on-line. Jeden se nazývá argv1.c a druhý je argv2. To je super-jednoduchý program, který se liší od předchozích programů v tom, že teď jsem pomocí argc a argv tady. A teď jsem integraci s pro smyčce v souladu 18, od i = 0 až na argc. A co mám dělat tento řádek kódu tady? V angličtině. To samozřejmě ukazuje použití argc. Ale v angličtině to, co dělá to dělat, když jsem spustit tento program? Jo? 

Diváků: Bude k tisku Obrazovka tolikrát, kolikrát chcete. DAVID Malan: Přesně tak. Takže bez ohledu na slova, která jsem zadejte na příkazový řádek, je to bude opakovat je na mě jeden na řádek. Tak pojďme do toho a to. Nech mě jít do mého seznamu a dělat, aby argv1 ./argv1. A teď pojďme držet to jednoduchý. Pojďme dělat nic na prvním místě. To přece vytisknout na jednu věc, a to je opravdu název programu, protože to je v závorce 0. Kdybych teď řekl foo, že to bude dělat ti dva, a když řeknu, foo bar, to bude říkat ty tři věci. Tak to je trochu zajímavé, možná. Ale připomenout, že argv je pole řetězců, ale řetězec je pole znaků, takže můžeme vzít věci do zářezu a platí, že základní logika a provést kód, který Vypadá trochu záhadné, nepochybně. Ale tím, že vnořený smyčka, něco jako na to, co by mohlo vyvolat od Mario, Například, pokud jste to udělal takhle. 

Takže teď zjistíte na lince 19, jsem znovu iterace přes mé argumenty, z 0 až na argc. A nyní v souladu 21-- jsem zapůjčení trik z loňského week-- Já jsem kontrolu toho, co je Délka argv držáku i. Já ukládání, že odpověď v n. A pak jsem integraci z j na až n, kde je inicializována na hodnotu 0 j. Takže, konvence pro počítání. Poté, co jste použili i pokud máte vnořené smyčky, nemůžete i znovu použít, jinak budete hadry, případně, hodnota mimo vnitřní smyčku. Takže jsem pomocí j konvencí. Mohli bychom použít k. Pokud máte více než k, budete pravděpodobně příliš mnoho hnízdění, typicky. Ale teď si všimněte, můj printf linka se mírně liší. Nejsem tisku% s, já jsem tisk% C, který, samozřejmě, je zástupný symbol pro char. 

A teď všimnete tuto syntaxi. Nové. Neviděli jsme už dříve. Ale logicky, to jen znamená, že se té řetězec argv a dostat j-té, co? DIVÁKŮ: Character. DAVID Malan: Znak v tomto řetězci. Takže pomocí hranatých závorek následuje v hranatých závorkách, To je první potápění do řetězce argv je, a pak druhý hranaté závorky s j je potápění do postav že konkrétní řetězec v argv. A pak, jen pro jistotu, Jsem tu tisku nový řádek. Takže teď nech mě jít napřed a otevřít až mírně větší okně a tak můžeme vidět v akci. Nech mě jít do této složky. A teď to, aby argv-2-- whoops-- aby argv-2, ./argv 2. Enter. A je to trochu těžké číst vertikálně, ale to je opravdu jméno Program, následovaný prázdným řádkem. A teď mě nech jít dál a dělat foo. Podobně špatně čitelný, ale je to opravdu tisku jeden znak na každém řádku. A když to udělám bar, je to teď tisk těch řádek po řádku. Takže stánek s jídlem zde není tolik že wow, podívejte se na tento elegantní nový trik kde můžete získat na obsah specifických znaků pole, je, ale jak jsme se s ohledem na tyto základní nápady, jako je indexace do pole, a indexování do pole, které je v tomto poli, a právě použití stejné myšlenky na poněkud složitější příklady. Ale základy opravdu není změnit, a to i od minulého týdne. 

Teď je to trochu včas, v tom, že vzpomínám, v týdnu nula jsme hráli s telefonním seznamu, jako je tato. A i když je to samozřejmě fyzické kusy papíru, můžete trochu myslet telefonní seznam jako pole. Jistě, pokud jste byli reimplement tento kousky Tyto kousky papíru v počítači, pravděpodobně měli byste použít něco jako pole pro uložení všech těch jména a čísla od A po vší cestě, díky Z. Tak to je pěkné, protože umožňuje nám příležitost, Možná, aby zvážila, jak byste mohli skutečně realizovat něco takového. Jako s řadou dveří zde. Takže když jsem mohli-- budeme potřebovat dobrovolně přijít nahoru. Pojďme se podívat. Neznámá tvář snad, možná neznámá tvář. Jak se o oranžovou barvou? Tady. Oranžová košile, pojď nahoru. 

Pojďme dál nyní a pohyb tyto dveře na stranu, přesunout to z cesty na chvíli. Jak se jmenujete? 

AJAY: 

DAVID Malan: Ajay. David. Těší mě. V pořádku. Takže máme za těchto šest Dveře digitálně na screen-- Nebo spíš sedm dveře na screen-- spoustu čísel. A já jsem ti nic v advance-- souhlasil? AJAY: Nic předem. DAVID Malan: Všechno, co chci, abys Nyní je třeba najít pro mě a pro nás, Opravdu, číslo 50, jeden krok v době. 

AJAY: Počet 50? 

DAVID Malan: číslo 50. A vy můžete odhalit, co je Za každou z těchto dveří jednoduše tím, že se jí dotknete prstem. Sakra. [SMÍCH] 

[APPLAUSE] 

Velmi dobře. OK. Máme krásný dárek cena pro Vás. Vyberte si z filmů jsme diskutovali minulý týden. 

AJAY: Oh, chlape. Oh, jsem nikdy neviděl Spaceballs. 

DAVID Malan: Spaceballs. V pořádku. Takže držet jen na okamžik. Jak-- udělejme to učenlivý moment-- jak se vám jít o najít číslo 50? AJAY: Vybral jsem náhodně. DAVID Malan: Takže jste si vybrali náhodně a měl jsem štěstí. AJAY: Ano. DAVID Malan: OK. Výborně. Takže teď, měl tě dostal štěstí, co ještě by se stalo, za těmito dveřmi? Takže když jsem se do toho pusťte a ukazují tato čísla zde, ve skutečnosti jsou v náhodném pořadí. A to nejlepší, co mohl mít udělal, upřímně řečeno, není v konečném důsledku v nejhorším případě, kontrola je všechny. Takže máš super-štěstí, které není to, co bychom zavolat algoritmus. Ano, gratulujeme. Ale teď let's-- humor mi, kdybys mohl. Pojďme se na této kartě zde. A tady jsou čísla v jasně co se zdá být náhodné pořadí, a oni byli. Ale teď, pokud místo toho jsem nárok že za těmito dveřmi jsou čísla, která jsou setříděny. Cílem je nyní také kde nás najdete číslo 50. Ale to algoritmicky a Řekněte nám, jak budete o tom. A pokud si ho najít, budete mít film. Nenajdete to, můžete dát zpět. AJAY: Tak jdu zkontrolovat konce nejprve zjistit, zda there's-- [Smích a APPLAUSE] DAVID Malan: Tady to je. Pojďme se podívat na jeden z Ajay předchůdců, Sean, který nebyl tak šťastný. OK, takže vaším úkolem zde, Seane, je následující. Jsem schovaný za těchto dveře číslo sedm, ale zastrčený v některé z těchto dveří jakož i jiné non-záporná čísla. A vaším cílem je myslet na to, horní řada čísel jen jako pole. Jsme jen sled kusů papíru s čísly za sebou. A vaším cílem je, pouze pomocí horní Pole tu, najděte mi číslo sedm. A my se pak bude kritika jak se vám jít o to dělá. Kde nás najdete číslo sedm, prosím. Ne 5, 19, 13. To není chyták. 1. V tomto okamžiku je vaše skóre není příliš dobře, takže si klidně dál. 3. Jdi na. Upřímně řečeno, nemohu si pomoci, ale zajímalo, to, co jste ještě myslet. 

SEAN: Dokážu se pouze z horní řady. DAVID Malan: pouze horní řádek. Takže máš tři vlevo. Tak mi najít 7. 

[Publikum křičí Návrh] Takže oba to byly úžasné z velmi rozdílných důvodů. Tak tohle je místo, kde jsme se skončili před chvílí, a Klíčovou myšlenkou zde se tyto dveře měly čísla za nimi, které byly tříděny, ideální stánek s jídlem, pro kterou je to, že byste mohli udělat podstatně lépe Tato druhá example-- a, opravdu, to byl Sean První pokus s náhodnými čísly stejně before-- ale jakmile jak tato čísla jsou tříděny, podobně jako v telefonním seznamu, co můžete samozřejmě udělat? Nebo jak můžete využít, že znalosti? Jo. 

Diváků: Jdete na půli cesty [neslyšitelné]. DAVID Malan: Jo. Přesně tak. Takže prvotní instinkt Ajay byl zkontrolovat konců, pokud si dobře vzpomínám, a pak jsme se trochu hotové Příklad rychle. Ale když jsme začali dělat to více metodicky v tomto směru, ale vycházeje možná v střední, protože jsou tříděny, jakmile se odhalí číslo 16, proto vím-- a pojďme dělat přesně že-- my Proto víme, že 50, v dnešním případě, má být doprava. Tak jako v prvním týdnu, kdy nula jsme se roztrhl telefonního seznamu na polovinu a hodil polovinu problém pryč, stejný nápad zde. Můžeme hodit to polovina problému pryč. A pravděpodobně to, co vás mohl udělat algoritmicky, Jakmile budete vědět, že 50 musí být vpravo, pokud je to kdekoliv, je zkusit tam, uprostřed ze zbývajících dveří. Samozřejmě, 50 je vyšší než 42, takže můžeme hodit to zbývající Čtvrtina problému pryč, a, konečně, jaké něco jako 50. Ale stejně jako u telefonní seznam, tato čísla byla nám dána již v tříděný pořadí, což nám ponechává s otázkou, jak se vám dát věci do seřazené pořádku? A upřímně řečeno, za jakou cenu? To je jedna věc, že ​​je podal telefonního seznamu a ohromit své přátele tím, že najde telefonní číslo opravdu rychle, že jo? Trhací 32 stran za účelem zjištění osoba z 4000000000 stran, jsme si řekli, byl jeden extrémní příklad. Ale jak dlouho to trvalo Verizon třídit, že telefonní seznam? Kolik času to trvalo nám seřadit těchto sedm čísel? To je otázka, kterou máme dosud zcela ignoroval. 

Takže pojďme odpovědět na tuto otázku teď. A všichni jsme z filmů nyní, ale máme nějaké stresové koule. Je-li, řekněme, osm dobrovolníků Nevadilo by nám připojila tady? Pojďme dál a dělat, co čtyři z vás, vy tři tady? Získat nějaké nové tváře. A čtyři z vás tam? A teď-- nesmíme zaujatost tady-- a číslo osm sem na konci. Pojď nahoru. V pořádku. Takže to, co jsme tady Každý z vás je číslo. Pokud byste chtěli jet dopředu, aby toto číslo. Jak se jmenujete? 

ARTIE: Artie. 

DAVID Malan: Artie, v pořádku. Jsi číslo jedna. 

AMIN: Amin. DAVID Malan: Amin. David. Vy jste číslo dvě. A do toho, jak jsem ruku si listy papíru, seřadit sami se před hudby stojí ve stejném pořadí, jako tam. 

ANDY: Ahoj, Andy. 

DAVID Malan: Andy, to je hezké, že tě vidím. Číslo 3. 

JACOB: Jacob. 

DAVID Malan: Jacob, číslo 4. Vítejte na palubě. GRANT: Grant. DAVID Malan: Grant. Číslo 5. 

Alanna: Alanna. 

DAVID Malan: Alanna, číslo 6. 

FRANCES: Frances. DAVID Malan: Frances, číslo 7. A? 

Rachel: Rachel. 

DAVID Malan: Rachel, číslo 8. V pořádku. Nestyď se a dostat se v tomto pořadí. Dovolte mi, abych dal jeden zbývající hudba stojí na místě. Kde budete potřebovat stojan? OK. Jděte do toho a jen dát své číslo kde publikum je vidět na, hudební stojan směrem ven. A doufejme, že naše první Kontrola rozum tady-- 4, 2, 6. Oh-oh. Počkej chvíli. Nemáme k 8. Musím k vám vypudit ze Příklad nějak. Ne Ne, to je v pořádku. Pojďme se podívat. Můžeme to udělat. Stand by. Jdeme na to. Správně. V pořádku. Tak, teď máme 8, 1, 3, 7 5. OK. Výborně. 

Takže otázka po ruce, je na jakou cenu, a pomocí jaké metody, můžeme vlastně tato čísla zde třídění takže můžeme trochu pozpátku, nakonec, a decide-- je to opravdu působivé, je to opravdu efektivní, že mohu rozdělit a dobýt telefonní seznam? Je to opravdu efektivnější, že Mohu rozděl a panuj tyto digitální ks papíru na palubě, pokud možná, že to bude stát nás štěstí v čase nebo energie, nebo CPU cyklů skutečně získat naše data do nějakého tříděném pořádku? Takže pojďme se zeptat na tuto otázku. 

Takže prvé, tato čísla jsou ve skoro náhodném pořadí, a budu navrhovat jeden algoritmus, nebo proces , podle kterého můžeme řadit tyto lidi. Chystám se blíží to docela naivně. A já si uvědomit že je to tak trochu hodně pro mě zabalit mou mysl kolem celý datový soubor najednou. Ale víte co? Chystám se udělat nějaký velmi jednoduché marginální opravy. 4 a 2 mimo provoz, v případě, že Cílem je přejít od 1 až na 8. Tak víš co? Budu mít vás kluci vyměnit, pokud přepnete fyzicky pozice a vaše kousky papíru. Nyní 4 a 6, to jsou v pořadí. Chystám se odejít ti být. 6 a 8, ty jsou v pořádku. Chystáte se nechat je být. 8 a1, mimo provoz. Pokud vy dva to nebude vadit, že vymění. Nyní 8 a 3, pokud byste mohli vyměnit. 8 a 7, pokud byste mohli vyměnit. A 8 a 5, pokud byste mohli vyměnit. 

Teď jsem to udělal? Ne, samozřejmě že ne. Ale já jsem dělal situace lepší, že jo? Jaká byla Vaše jméno znovu, číslo 8? 

Rachel: Rachel. DAVID Malan: Takže Rachel má účinně bublal pěkně daleko, celou cestu až do konce moje pole čísel zde. A tak, že problém je trochu vyřešen. Teď, jasně, 2 stále potřebuje pohybovat trochu, 4 a 6 a 1. Ale já jsem zdá se, že se dostali trochu blíž k řešení. Takže pojďme se vztahují ta samá opět naivní heuristické. 2 a 4, OK. 4 a 6, OK. 6 a 1, mm-mm. Pojďme výměnu. 6 a 3, mm-mm. Pojďme výměnu. 6 a 7 je v pořádku. 7 a 5, ani náhodou. Pojďme výměnu. A teď 7 a 8. A co se jmenuješ? FRANCES: Frances. DAVID Malan: Frances. Takže teď Frances je ještě lepší postavení, protože teď 7 a 8 jsou správně bublal až na vrchol. Tak 2 a 4, OK. 4 a 1, swap pojďme. 4 a 3, swap pojďme. 4 a 6, jsi v pořádku. 6 a 5, swap pojďme. A teď ti chlapi jsou dobré. Už tam skoro jsme. 2 a 1, mimo provoz, tak vyměnit. A teď mě nech dělat kontrolu zdravý rozum. 2 a 3, 3 a 4, 4 a 5, 5 a 6, 6 a 7, 8. OK, takže jsme hotovi. 

Ale za jakou cenu udělal já Tato čísla seřadit tady? No, kolik kroků nebo jo potenciálně se při řazení tyto lidi? No, tak se vrátíme na tuto otázku. Ale, upřímně řečeno, pokud máte nudit, je to druh odhaluje v tom, že to není možná nejefektivnější algoritmus. A skutečně, upřímně řečeno, potím všechny další chůzi sem a tam. To se necítil zvlášť efektivní. Tak pojďme zkusit něco jiného. Pokud byste mohli obnovit sami do těchto osmi hodnot. Dobrá práce. 

Pojďme se podívat digitálně, jen za před chvílí jsme se zkusit něco jiného, na to, co se právě stalo. Tady nahoře, ty jsi asi vidět vizualizace z těchto osmi lidí přičemž modré a červené sloupce představují čísla. Vyšší je sloupec, Čím vyšší je číslo. Čím kratší je bar, menší počet. A co budete vidět, je v náhodném pořadí více než osm z nich. Budeš vidět tyto tyče dostat řazeny podle stejného algoritmu, nebo sadu instrukcí, které zavoláme nadále bubble sort. Tak všimnout, každý druhý nebo tak, dva bary se rozsvítí červeně, jsou porovnávány s počítačem. A pak se v případě, že velký bar a malý bar jsou mimo provoz, oni jsou vyměněny za mě. 

Teď je to neuvěřitelně únavné se dívat na to, jistě, velmi dlouho, ale všimnete takeaway-- velké tyče pohybující se doprava, malé bary pohybující se doleva. Pojďme zrušit tento proces a urychlíte je mnohem rychlejší, takže můžeme si o tom, co na vysoké úrovni, opravdu, bublina trochu dělá. Ve skutečnosti, je to bublá až pravá strana seznamu, nebo pole, tím větší barů. A naopak, malé bary jsou bublající cestu dolů na levé straně, i když v rychlejším tempu než jsme dosud udělali. Takže těžší vidět s lidmi, ale vizuálně to je opravdu to, co se děje. 

Ale zkusme to zásadně Odlišný přístup teď. Zkusme jiný algoritmus, kdy jsme tě kluci začít v těchto původních místa, ve kterém byl tento příkaz zde. A pojďme do toho hned. A já jdu něco dělat ještě jednodušší, že jo? Ve zpětném pohledu, vyměňovat po dvou znovu a znovu, skoro trochu chytrý. Pojďme dělat věci ještě více naivně, kde, když chci řadit tyto lidi, dovolte mi, abych dál Pro nejmenší prvek. Takže teď, 4 je Nejmenší číslo jsem kdy viděl. Budu si to pamatovat. Ne, dva je lepší, a pamatujte, že. 1 je ještě menší. 3, 7, 5. OK. One-- co se jmenuješ? 

ARTIE: Artie. 

DAVID Malan: Artie. Takže, Artie, jděte do toho. Chystám se tě vytáhnout z linky. Pokud byste mohli přijít sem. A já potřebuji, aby se prostor pro něj. Máme bodu rozhodnutí zde. Jak můžeme vytvořit prostor pro Artie zde na začátku, kde číslo 1 patří? 

DIVÁKŮ: Shift. 

DAVID Malan: OK, mohly přesunout všechny. Ale navrhnout optimalizaci. Že se cítí trochu nepříjemné pro mě zeptat čtyři lidi přesunout celou cestu dolů. Co jiného jsem mohl dělat? 

Diváků: Přepínač je. 

DAVID Malan: je spínač. A co se jmenuješ? 

JACOB: Jacob. DAVID Malan: Jacob, pohybovat. Mnohem efektivnější, jen aby měli Místa swapové Jacob s Artie, na rozdíl nutí všechny čtyři z těchto lidí, děkuji moc, aby jejich správná poloha. Co je hezké o Artie nyní, že je ve své správné poloze. Pojďme to udělat znovu. 2, to je nejmenší číslo, co jsem viděl. 3, 7, 5. OK. 2 je určitě nejmenší. Nemusíte dělat žádnou práci. Udělejme to znovu. 6. Nejmenší? 8. Ne. 4? Ooh. Dovolte mi, abych pamatovat 4. 3. Dovolte mi, abych pamatovat 3. 7, 5. Nejmenší číslo jsem vidět na tomto průchodu je 3. Pokud byste pojď ven. Kam jdeme, aby vám? A Jak se jmenujete? 

Alanna: Alanna. 

DAVID Malan: Alanna jsme bude muset vystěhovat. Ale to je efektivnější, jen vyměnit dva lidi, než mít více lidí ve skutečnosti vyhnout všem. Nyní se pojďme to udělat znovu. Jdu vybrat 4, tak pojď ven. A kdo to bude pohybovat? Číslo 8, samozřejmě. Kdybych teď najít číslo 5, pojď ven. Číslo 8 se dostane opět vypuzen. Já jsem teď bude najít číslo 6 na místě. 7 na místě. 8 v místě. 

To, co jsme právě udělali je něco, co nazývá výběr třídit, a pokud si to představit, je to bude cítit trochu jinak. Pojďme do toho a z toho Nabídka zde tento visualization-- změňme to na-- pojď, Firefox. Pojďme to změnit do výběru druhu. A pojďme urychlí jako dříve, a spusťte vizualizaci teď. A tento algoritmus jiný pocit k tomu. V každé iteraci, upřímně řečeno, je to ještě jednodušší. Já jsem jen výběrem nejmenší prvek. A teď, upřímně řečeno, jsem trochu štěstí, že čas, v tom, že řazeny super-rychle. Tyto prvky byly náhodné. Není to, jak jsme si nakonec vidět, zásadně rychlejší. Ale podívejme se třetí a poslední přístup, který zde o tom, co se děje. Tak pojďme do toho pusťte a znovu vám kluci jeden poslední čas, aby se v tomto pořadí zde. 

A teď, budu být trochu chytřejší, jen završují naše algoritmy. Chystám se to udělat. Chystám se jít tam a zpět tak. Upřímně řečeno, už mě nebaví vše pojezdu. Jdu jen, aby se to, co jsem uveden na začátku seznamu, a budu třídit že tehdy a tam. Tak jsme tady. Číslo 4. Jdu vložit číslo 4 do seřazený seznam. Hotovo. Tvrdím nyní, a jen proto, aby to více jasné, tato část mého seznamu je řazen. Je to trochu hloupé tvrzení, ale ve skutečnosti 4 je seřazen v seznamu velikost jednoho. Teď, budu trvat na počtu 2. Číslo 2 Já jsem teď bude vložit na správné místo. Takže tam, kde se dva patří? Je zřejmé, že tady. Takže jděte do toho a vrátit, pokud mohl. A proč ne vy jen se vaše hudba stojí s vámi tentokrát. A pojďme násilně vložit vás do začátku seznamu. Tak trochu víc práce. Musel jsem se pohybovat kolem Jacoba, a Jak se jmenujete? 

AMIN: Amin. 

DAVID Malan: Amin. Ale aspoň jsem se tam a zpět. Jen jsem s věcí, jak jsem jít. Já jsem jen vložením na správném místě. 6, je to vlastně docela jednoduché. Pojďme vložit tě tam, pokud si chtěl přejít přes mírně. Číslo 8, a to i docela snadné. Támhle. Sakra. Číslo 1 můžeme nejen zaměnit s Amin zde protože, co se děje zkazit objednávky. Takže musíme být trochu chytřejší. Takže, Artie, kdybys mohl zálohovat na chvíli. Pojďme dál a posunout se, Na rozdíl od našich předchozích algoritmů, aby se vytvořil prostor pro Artie tady na začátku. Takže na konci dne, jsem trochu dělat to, co jsem chtěl, aby se zabránilo před. A tak se můj algoritmus je trochu z obrácené, intelektuálně, z toho, co to původně bylo. Dělám jen přesun na jiném místě. Teď jsem na tři. Oh, sakra. Musíme udělat více práce znovu. Takže pojďme tlačit ven. Pojďme 8, 6, 4-- oh Oh-- a 3 se chystá jít právě tam. Tak alespoň nepatrné úspory tentokrát. 7, není příliš mnoho práce je třeba udělat. Takže pokud chcete, aby pop zpět, pojďme vložte vás. A konečně, 5, pokud máte chci zaběhnout zpátky jsme Potřebuju tě posunout, ty, ty, do pěti, je na místě. 

Teď tak vidět na Vysoká úroveň graficky, pojďme tento algoritmus vizualizace jeden další čas. Takže to budeme nazývat vložení druhu. Uděláme to stejně jako rychle, a spusťte jej sem. A taky má jiný pocit. Je to trochu lepší a lepší, ale nikdy to není dokonalý dokud jsem jít a hladké v těchto mezer. Vzhledem k tomu, znovu, já jsem jen s tím, co Jsem dána zleva doprava. Tak jsem se nedostal tolik štěstí , že všechno bylo perfektní. To je důvod, proč jsme se to trochu mispositions že pevné v průběhu času. 

Takže všechny tyto algoritmy se zdají běží na mírně různým tempem. Ve skutečnosti, které by vám říci, nejlepší a nejrychlejší tak daleko? Bubble sort, první? Výběr třídění druhého? Vložení třídění, třetí? Slyšel jsem, že některé druhy výběru. Jiné myšlenky? 

Takže se ukazuje, že všech těchto algoritmů jsou v zásadě stejně účinný jako každý other-- nebo, naopak, stejně jako neefektivní jako každý jiný, protože můžeme dělat zásadně lepší než všechny tři z těchto algoritmů. A to je trochu bílé lži, taky. když říkám, že jako účinný nebo jako neúčinné, To je alespoň pro super-velké hodnoty n. Když máme jen osm lidí tady, nebo možná 50 nebo tak pruhy na obrazovce, budete naprosto všimnete rozdílů Mezi těmito třemi algoritmů. Ale jak n, počet osob, nebo počet čísel, nebo počet osob v telefonu kniha, nebo počet webových stránek v databázi Google dostane větší a větší, uvidíme, že všechny tři z nich algoritmy jsou vlastně docela špatné. A co můžeme udělat v podstatě lepší než to. 

Pojďme se podívat, konečně, na to, co tyto algoritmy by mohly zvuk jako v kontextu několika dalších jakož i prostřednictvím této vizualizace zde která nás zavede do počet algoritmů. Pojďme dál a pogratulovat naši účastníci tady, z nichž řazeny sami velmi dobře. Pokud byste chtěli, aby se dárek na rozloučenou. Můžete ponechat své číslo stejně. A to, co uvidíte, nebo spíše slyšet, teď, je to, že jak dát zvuky Do každé z těchto tyčí a spojit ji se softwarem, různé frekvence zvuku, můžete zabalit svou mysl více audioly kolem toho, co každá z těchto věcí vypadat. První z nich je vložení druh 

[TONES] 

Je to bublina druh. 

[TONES] 

Výběr sort. 

[TONES] 

Něco, co nazývá merge sort. 

[TONES] 

Gnome sort. 

[TONES] 

To je pro CS50. Uvidíme se ve středu. 

Vypravěč: A teď, "Hluboká Myšlenky, "od Daven Farnham. Proč je to pro smyčce? Proč ne, aby to lépe? Já bych udělat pět smyčku. 

[SMÍCH]