[Powered by Google Translate] [2. týden, pokračování] [David J. Malan, Harvard University] [To je CS50. - CS50.TV] Dobrá. To je CS50, a to je konec 2. týden. Pokud očekáváte, že hlad po této době zítra, vím, že budeme svolávat jako malé skupiny zítra, ve čtvrtek, 13:15. Tam je to URL zde, pokud chcete RSVP. Prostor je omezený, proto prosím omluvte, pokud byl formulář vyplněn až v době, kdy vyplníte na to. Další URL, ale, že by mohlo být zajímavé je to. V téměř za měsíc, kurz se bude k dispozici všechny obecněji přes EDX, přes které lidé na internetu budou moci sledovat spolu, zapojit se do kurzu poměrně aktivně, ve skutečnosti. Budou používat CS50 Appliance a CS50 Diskutovat a většina z různých softwarových nástrojů, které jsme již používali tento semestr. A jednou z iniciativ bychom chtěli, aby se na jako experiment v letošním roce je vidět, kolik obsahu můžeme přeložit do jiných mluvené a psané jazyky. Takže pokud byste mohli mít zájem o účast v tomto projektu kdy budeme poskytovat anglické přepisy a titulky pro kurz je přednáškách a šortky a semináře a profily a podobně, pokud mluvíte plynule nebo psát plynně nějaký jiný jazyk, rádi bychom vtáhnout vás do tohoto projektu, kdy budete mít na jednom nebo více videí, převést je do jazyka znáte docela dobře. Chcete-li dát vám pocit rozhraní, tam je to web-based uživatelské rozhraní že budeme používat, že vytvoří v podstatě uživatelské rozhraní, jako je tento. Toto bylo mi učil některé Halloween před, a na pravé straně tam v černém vedle těchto časových razítek, uvidíte různé věci, které vyšly z mých úst, že den, a pak pod ním budete moci převést do nějakého jiného jazyka přesně to, co je mapování mezi, v tomto případě, angličtina a, řekněme, španělsky. Takže je to vlastně velmi uživatelsky příjemný nástroj. Můžete přetáčet vpřed velmi rychle pomocí klávesových zkratek. Takže pokud byste chtěli zúčastnit tohoto experimentu a mít vaše slova vidět a číst by potenciálně tisíce lidí tam, prosím, neváhejte se zúčastnit. Jedno slovo o kotě od pondělí. Lest jsme poslali příliš děsivé zprávy, si uvědomit, že, jak úřední hodiny naznačují a jak částí naznačují, konstrukce předmětu je velmi k studenti spolupracovat a mluvit do práce přes problémové soubory a problémy společně, a opravdu linka právě přichází do, znovu, měl práci, kterou nakonec odeslat být vaše vlastní. A tak docela upřímně, v úředních hodinách, že je to úplně normální, je to úplně očekávat ani, bude chatování s nějakým přítelem vedle vás. Jestliže on nebo ona se potýká s nějakým tématem a jste rádi, "No, dobře, dovolte mi, abych vám pohled některých řádek kódu, který jsem napsal," to je v pořádku, že se stane, a to je velmi příznivé, myslím, s procesem učení. Pokud je linka dostane přešel je, když hlava je trochu nakloněná sem na příliš mnoho sekund nebo min, které opravdu byly právě odblokování příležitost pro svého přítele, a jistě, kdy se věci vyměňují prostřednictvím e-mailu a Dropbox a podobně, tam taky je linka. Takže všemi prostředky cítit pohodlně a cítí se vyzývají, aby chatovat s přáteli a spolužáci o psets a více a jen si uvědomit, že to, co jste nakonec předloží by měl opravdu být produkt vaší tvorby a ne někdo jiný. A tak jeden z domény specifických problémů pro pset2, který přijde pozdě zítra večer, je ponořit se do světa kryptografie, která je umění šifrování nebo kódování informace, a to nakonec se týká světa bezpečnosti. Nyní, bezpečnost pro většinu z nás přichází v podobě poměrně světských mechanismů. Každý z nás má uživatelská jména a hesla, a každý z nás má velmi špatné uživatelská jména a hesla, s největší pravděpodobností. Pokud je heslo stejné na několika webových stránkách, že to asi není nejlepší nápad, jak budeme diskutovat k semestr konci. Pokud heslo je napsané na lepicí poznámku - není vtip - na vašem monitoru, To také není nutně nejlepší design, ale docela běžným jevem. A pokud si nejste s použitím kryptografie k šifrování hesel, jsou obzvláště zranitelné. Takže pokud si myslíte, že jste byl výborný chytrá mající skrytou dokument aplikace Word někde na pevném disku, který má všechna vaše hesla ale je to ve složce, která nikdo to bude vypadat v, že příliš není moc bezpečné mechanismus. A tak to, co pset2 představí je toto umění kryptografie a míchat informace tak, že věci jako hesla jsou bezpečnější. Kontext je, že s nezajištěnými údajů přichází příležitost k šifrování ho a škrábat ho. A tak to, například, je příklad šifrované zprávě. To vlastně říká, že něco v angličtině, ale to zjevně není zcela zřejmé. A my přijdeme kruh dnes šprýmaři odděleně, co to tajný vzkaz zde. Ale v reálném světě počítačů, věci se ani nepodíval, jako by mohly být anglické věty. Například, to je to, co můžete najít na standardního Linux nebo Mac nebo počítač se systémem UNIX v souboru, který byl kdysi nazýván soubor s hesly. V současné době je to už se stěhoval do jiných míst. Ale když se podíváte na správném místě v systému, uvidíte nejen své uživatelské jméno nebo jiných lidí na systému, ale uvidíte šifrované verzi své heslo. Opravdu, slovo krypta se navrhuje, aby následující věci jsou šifrována, a tato série zdánlivě náhodných písmen a znaků a čísel a tak dále lze dešifrovat pouze obecně znát nějaké tajemství - Tajné slovo, tajné číslo - a tak opravdu, umění kryptografie v konečném důsledku se scvrkává věřit nějakého druhu a věděl něco, co někdo jiný nemá. Takže budeme zkoumat to v trochu podrobněji dnes v PSet přijít. A nyní slovo na Pass / Fail. Zvlášť když někteří z vás se ponořila do pset1, spotřebiče, a zcela nový svět pro sebe, uvědomit si, že frustrace a zmatek a jen technické potíže jsou poměrně lze očekávat, zejména s prvním Pset, kde je to jen tolik nové, jen seznámení s ls a cd a všechny tyto tajemné příkazy a nové prostředí, a to je oddělená od skutečného materiálu a programování sám. Takže si uvědomit, že i tam jsou určitě úřední hodiny, které existují jako podpůrné struktury. Sekce začít letos v neděli. Ale co je nejdůležitější, pokud máte pocit, prostě, že to není svět pro tebe, si uvědomit, že je to opravdu jen nějakou dobu trvat. A byl to ne pro tuto příležitost před lety pro mne vezme třídy vyhovuje / nevyhovuje, upřímně, nikdy bych si dokonce nastavit nohu ve třídě. A můžete změnit až do, řekněme, pátý pondělí kurzu, takže pokud jste na okraji teď si uvědomit, že spíše než hlava do některých jiných vod dohromady, si jistě považovat jen změnou k přijetí / zamítnutí. Opět platí, že to není opravdu to kultura zde na Harvardu braní věcí vyhovuje / nevyhovuje protože všichni opravdu chce dosáhnout lepších výsledků, nebo, ale upřímně řečeno, je to skvělý způsob, jak se snaží něco které nemusí být obeznámeni s vámi, a vy skončíte dělat, ve většině případů, docela dobře, možná hodně k svému překvapení. A v Konkrétněji, co si myslím, vyhověl / nevyhověl obecně dělá, zejména pokud jste si mohli zkušenosti s pset0, když dáte v 10 hodin, 15 hodin, 25 hodin do nějakého PSet a ty jsi prostě bouchání hlavou proti zdi a je to čím dál Super pozdě v noci ale vy jste vzali PSet 90% cesty a vy prostě nemůžete přijít na jednu věc, vyhověl / nevyhověl opravdu bere zmírnilo třídy, jako je tato, kde si můžete nějak šťastně říká: "Dobře, já vím, že to není dokonalé, ale pracoval jsem prdel na to, jsem docela spokojený s tím, kde to skončilo, " a že bude splňovat očekávání vyhovuje / nevyhovuje. Takže se mějte na paměti, že. Dobrá. Takže ti z vás, kteří se usilovně snaží využít Harvardskou univerzitu Wi-Fi, vím, že je tu CS50 SSID, Wi-Fi připojení, vznášející se kolem že byste mohli mít větší štěstí pro. Je to trochu paradoxní, že heslo pro to, pokud byste chtěli zkusit připojit k tomuto pro lepší rychlosti - a dejte nám vědět, pokud to není lepší - je 12345, celou cestu až do 8 protože 8 je bezpečnější než 5. Takže pokud potřebujete Wi-Fi hesla, připojit se k CS50 bezdrátově tady, 12345678, a příspěvek na CS50 Diskutovat pokud máte stále přerušované problémy s připojením, a necháme pravomoci, které budou znát pro tento prostor. Dobrá. Tak rychlý teaser, zejména pro ty z vás, kteří jsou ventilátor chlapců a dívek všech věcí Apple. To, co jsem vyhrabal z několik let zpět byla tento soubor zde, iUnlock.c, jen trochu, aby konkrétnější a složitější některé z více základních programů v jazyce C jsme psali. Tak jsem otevřel tento soubor, iUnlock.c. Je k dispozici na stránce přednášky pro dnešek. Na levé straně se zobrazí dlouhý seznam funkcí. Takže ten chlapík, který napsal tento sepsal mnoho funkcí, víc než jen hlavní. Použil spoustu knihoven tady, a pokud začneme rolování, co to vlastně je, je úplně první, věřím, crack na původní iPhone. Pokud byste chtěli na útěk z vězení původní iPhone, což znamená, že untether to od AT & T a skutečně nainstalovat speciální software na to a dělat věci, které Apple nechtěl, aby lidé udělali, někdo vzal čas, aby zjistili, jak přesně by mohl zneužít softwarové chyby, chyby, chyby v softwaru, Apple, a tak se narodil iUnlock.c-- , že pokud ji pořídil do svého počítače a nainstalovat jej na iPhone , který byl připojen k počítači prostřednictvím, řekněme, kabelu USB, To by vám správce nebo uživatel root oprávnění na vašem iPhone a nechat si udělat skoro cokoliv chcete. A tak tam bylo to fascinující hra na kočku a myš mezi Apple a zbytkem světa, zejména pokud jde, stejně jako mnoho firem, ve snaze zajistit své věci stanoví, takže můžete dělat jen s tím, co mají v úmyslu. Ale díky lidem, jako je tento a porozumění nízkoúrovňových detailů - a v tomto případě C programování - a mnoho známých konstrukcí že jsme začali hrát s, jste schopni skutečně využívají hardware způsobem uznáte za vhodné, a ne nutně nějaký právnické osoby. Tak například, nemám tušení, co to všechno dělá, ale getVersion zní docela jednoduché, a vypadá to, že je to funkce, která tato osoba napsala. To trvá nějakou integer jako argument, nic nevrací, ale zdá se, smyčky pro smyčce zde a pokud podmínka, pokud stav přestávky, a nějak souvisí s čísly verzí, pokud jsme se posunout dolů, i když mnoho z těchto klíčových slov se bude nové. A je tu spousta funkcí v tu jsme nikdy neviděli a možná nikdy neuvidíš v průběhu semestru. Na konci dne, to se řídí stejnými pravidly a logiku, že jsme hráli s tím daleko. Tak tohle je příliš starý na to bezva váš iPhone 3s nebo 4s nebo 5s brzy tyto dny, ale vím, že je to všechno moc pochází z tohoto světa, že jsme se ponořila do. Pojďme se podívat na trochu jednoduchý příklad: tenhle, jen proto, aby si ohřát nějakou syntaxí a také některé další údaje typ že jsme mluvili o ale opravdu neviděl v C. To je soubor s názvem positive1.c, a za připomínky nahoře, to jen požaduje, aby uživatel zajistit kladné číslo. Takže je to příklad do-while, což je hezké programů uživatelských interaktivní kde je třeba sdělit uživateli dělat něco, a pokud nespolupracují jste křičet na ně, nebo odmítnout jejich vstup. Věc v bodě: budu dělat linky 19 až 24 tak dlouho, dokud uživatel mi nedala kladné číslo. Tento detail zde na řádku 18, proč jsem určil n nad touto celou konstrukce cyklu na rozdíl od hned vedle řádku 22, kde jsem vlastně jedno, dostat n? Jo. [Student] Rozsah. >> Jo, tak to otázka rozsahu. A v Laicky řečeno, co se rozsahu vztahuje? Jo. >> [Neslyšitelné Student odpověď] >> Můžeš mluvit trochu hlasitěji? [Student] Kde můžete přistupovat k této proměnné. >> Perfect. Kde můžete získat přístup k dané proměnné. A obecně, pravidlo bylo dosud, že rozsah působnosti některých proměnné je definována nejnovějších složených závorek, které jste viděli. A tak v tomto případě, když jsem udělal chybu deklarovat n na lince 22, to by linka fungovat. Já bych si int, a já bych dal to do té proměnné n v řádku 22, ale řádek kódu by teď netuším, co mluvím? >> [Student] 25. [Malan] 25, a to dopadá 24 i proto, že v tomto případě to padá mimo složených závorek. Takže jen trochu na obtíž, ale velmi snadno vyřešit tím, že prostě prohlásil proměnná mimo funkci samotné. Uvidíme ještě dnes můžete jít ještě o krok dále a můžete dokonce získat trochu líný. A to není možné doporučit obecně, ale dokonce líní a dát proměnnou globálně, abych tak řekl, a ne uvnitř funkce, ne uvnitř smyčky, ale v samotném souboru, mimo všechny funkce, které jste napsal, jak jsem to udělal tady na lince 15. Toto je obecně odsuzována, ale uvědomit je to řešení někdy další problémy, jak budeme nakonec vidět. Takže teď necháme to takhle, ale uvidíme, jestli můžeme přepsat toto jen začít vyjadřovat sami sebe trochu jinak. Tento program, jen aby bylo jasno, je positive1. Nech mě jít napřed tady a ve svém terminálovém okně, aby positive1, Enter. Kompiluje v pořádku. Chystám se spustit positive1, stiskněte klávesu Enter. Žádám, abyste mi celé kladné číslo. Řeknu -1. To nefungovalo. 0, 99. Zdá se, že funguje. Možná ne nejpřísnější test, ale alespoň je to pěkné sanity check že jsme na správné cestě. Takže teď mě nech jít dopředu a otevřete verzi 2 tohoto, a co je odlišné už? Provádí se to samé, ale to, co skáče tak, jak je zřetelně jiný tentokrát? Tento bool zeleně. To je zvýrazněna zeleně, to klíčové slovo známé jako bool, který je datového typu. To není to, postavený v roce pro všechny verze C. Musíte zahrnout konkrétní knihovnu. V našem případě, jsem zahrnul CS50 knihovnu tak, že máme přístup k bool. Ale v řádku 18, se zdá, že mají logickou hodnotu zde nazývá vděčný. Mohl jsem volal to něco, ale já jsem to nazval vděčný jen druh sdělit nějaký sémantický význam. Tak zpočátku na lince 18, nejsem zřejmě vděčný protože Boolean hodnota vděčný je inicializován na hodnotu false v řádku 18. A pak se zdá, to, co jsem tady udělal v řádcích 21 až 23 je, že jsem to prostě přepsat můj logiku. Takže ne funkčně odlišná, ale v řádku 22 teď zda int uživatel poskytl je větší než 0, pak jsem jednoduše změnit hodnotu vděčný true. A proč jsem to udělal? Vzhledem k tomu, v souladu 25, zřejmě budu kontrolovat stav. Do této smyčky, zatímco vděčná je false. Tak jsem navrhl to jako alternativu k verzi 1 protože je to alespoň trochu více intuitivní možná, že je to trochu více uzemněný v angličtině. Takže proveďte následující, když si nejste vděční, nebo když vděčný je false. A i tentokrát jsem zřejmě nezajímá vzpomenout, co uživatel napsal v protože oznámení není proměnná n, takže vlastně, malá bílá lež tam. Funkčně, program je trochu jiný, jakmile se dostaneme na dno toho Protože nejsem si vzpomněl, co n je. Ale já jsem chtěl ukázat i zde, že i když jsme viděli GetInt a GetString se používá na pravé straně rovnítka tak daleko tak, že si pamatujeme hodnotu, technicky, to není nezbytně nutné. Pokud z nějakého důvodu prostě nezajímá uložit hodnotu, si jen chcete zkontrolovat hodnotu, zjistíte, že můžeme jednoduše napsat toto jako GetInt, open paren, close paren. Tato funkce bude vracet hodnotu, jak jsme říkali. Bude to vám zpět int. A tak pokud jste psychicky myslíte že se to stává, když jsem zadejte 99, GetInt vrátí číslo 99, a tak koncepčně, je to jako by můj kód byl ve skutečnosti to. Takže pokud 99 je opravdu větší než 0, pak vděčný stává pravdou, pak se seřadí 25 uvědomí ooh, už jsme to udělali, protože jsem teď vděčná, a je v souladu 26, jsme jednoduše říci: "Díky za pozitivní celé číslo!" co se to stalo, že je. Nyní se pojďme udělat mírný syntaktický cukr zde, abych tak řekl. Pojďme se podívat, jestli se nám podaří vyčistit tento řádek 25 s touto třetí a poslední variantě v positive3. Všimněte si, jediný rozdíl je, co řádek kódu? >> [Student] 25. >> [Malan] Jo, 25. A jsme opravdu viděli tuto trik ještě ne, ale my jsme to vidět vykřičník v pondělí, který označuje, co? >> [Student] Not. Není >> nebo negace. Tak se booleovskou hodnotu a otočit jeho hodnotu. Pravda se stává false, false se stává pravdou. Takže to, navrhuji, je ještě trochu více intuitivní způsob, jak psát kód protože jsem stále ještě inicializovat vděčný false, pořád to následující, Nastavil jsem vděčný na hodnotu true, když přijde čas, ale nyní můžete opravdu jen přeložit tento kód slovně zleva doprava, while (vděčná!), protože bang nebo vykřičník označuje pojem není, takže i když není vděčná. Takže znovu, jsme nezavedly žádné nové koncepty na sobě. Mluvili jsme o Booleans zpátky, když jsme hráli s Scratch, ale uvědomit, nyní můžeme jen začít psát náš kód v mnoha různými způsoby. Takže zejména v pset1 pokud jste trochu snaží přijít na to, jak psát nějaký program, Diskusní jste štěstí, protože tam může být libovolný počet řešení že se může stát na. Například, je to jen 3 ani pro nejjednodušší programů. Dobrá. A nyní odvolává na pondělí jsme opustili na tuto notu s návratových hodnot. Takže poprvé jsme napsali program, který není jen mít hlavní; má také svou vlastní funkci, která jsem napsal tady. Takže v souladu 31 až 34 jsem provedla krychle funkci. Není to složité. Je to jen * a * v tomto případě. Ale co je důležité, na tom je, že jsem při vstupu ve formě a já se vracím výstup v podobě * *. Takže teď mám možnost, stejně jako jsem se prinf osamocený, na tuto funkci volat voláním krychle funkce. A krychle funkce má nějaký vstup, a krychle vrátí funkce nějaký výstup. Naopak, printf jen něco udělal. To se nic nevrací, že jsme záleželo, i když, jak zrušit to vrátí hodnotu; stačí obvykle ignorovat. Printf jen něco udělal. To mělo vedlejší účinek tisku na obrazovce. Naopak zde, máme krychle funkci, která skutečně vrátí něco. Takže pro ty, kteří znají toto, je to poměrně jednoduché nápad. Ale pro ty méně obeznámeni s touto myšlenkou předávání na vstupech a dostat zpět výstupy, Zkusme jen něco super jednoduchý. Je někdo pohodlný přichází na pódium krátce? Musíte být pohodlné s kamerou na vás stejně. Jo? Dobře. Jak se jmenujete? >> [Student] Ken. >> Ken. Dobrá. Ken, jít nahoru. Ken bude funkce druhů zde. Pojďme dál a udělat to. Pojďme si trochu fantazie. Rád Vás vidím. Vítejte na středu zájmu. Dobrá. Jdeme na toto tlačítko tady. Dobrá. Tak tady máte moderní tabuli, a co jsem je hlavní funkce, například, a já nemám iPad v ruce. Nemám opravdu vzpomenout, jak se - No, nemůžu říct, že. Já opravdu nemám dobrý rukopis, a tak proto chci tisknout něco na obrazovce pro mě. Jsem byl hlavní program, a já budu muset říct to písemně v mém kuřecím začátku a pak předá vám vstup. Takže hloupé ačkoli toto cvičení je, pojem funkcí a volání funkce a vrácení funkci opravdu scvrkává na to. Já jsem hlavní, jsem právě napsal printf, quote-konec citátu něco na obrazovce, Jsem spuštění tohoto programu, a jakmile printf volána, trvá jeden argument, nebo jeden parametr někdy mezi uvozovkami. Zde je to, že argument. Já předáním do Ken. Je to černá skříňka písemné určitý počet let ago , který zřejmě ví, jak tisknout věci na obrazovce. Tak provést. To není špatné. Velmi dobrá. Takže teď Ken se provádí spuštěním. Ví třeba Podej mi něco zpět? Ne, že jsme viděli doposud. Opět platí, že printf se skutečně vrátí číslo, ale budeme ignorovat, že pro tuto chvíli protože jsme nikdy používal to. Tak to je to pro Kena. A tak teď hlavní přebírá kontrolu programu znovu proto, že řádek kódu, printf, se provádí spuštěním. A jdeme o naší cestě, kterou se provádějí bez ohledu na jiné linky jsou tam. Takže teď zkusme trochu jiný příklad. Tentokrát zde pojďme se nejprve vymazat obrazovku, a tentokrát budeme dělat Cubing funkci, ale tentokrát jsem očekávat, že výstupní hodnoty. Tak pojďme do toho a udělat to. Teď mám řádek kódu, který říká, že x dostane kostku x. Řádek kódu, stažení, vypadá takto: x = kostka (x); Tak jak se to bude fungovat? Pojďme dál a dá vám bílou obrazovku znovu. Chystám se napsat nyní hodnotu x, které v této chvíli se stane, že je, řekněme, 2, aby to jednoduché. Napsal jsem na kus papíru hodnota 2, což je moje hodnota x. Podal jsem ji Ken. >> A já jen napsat odpověď? Jo >>, pojďme stačí napsat odpověď. Dobře. A teď se musí vrátit mi něco. Perfect. Pěkný SEGUE. Takže teď podá mi hodnotu 8 v tomto případě, a co s tím mám dělat? Vlastně - uvidíme, si toto právo. Co mám dělat s tím? Teď budu brát tuto hodnotu a skutečně ukládat jej ve stejných bitů v paměti. Ale nevšiml jsem trochu zápasí zde. Jsem trochu zmatený, protože kam jsem vlastně psát hodnotu x, protože to, co jsem právě udělal, je fyzicky ručně Ken kus papíru, který měl hodnotu 2, který byl x, a opravdu, to je přesně to, co se stalo. Tak to dopadá, že při volání funkce a předáte v argumentu jako hello, world nebo předáte argument jako 2, obecně, jste předáním kopie tohoto argumentu. A tak stejně jako jsem napsal číslo 2 zde a podal ho Ken, že musí znamenat, že jsem ještě kopii hodnoty 2 někde protože to opravdu, teď, když jsem se dostal zpět hodnotu 8, musím se vrátit do RAM a skutečně zapsat 8, kde jsem kdysi měl číslo 2. Takže vizuálně, zapamatovat si tuto představu předáním, doslova, kopii hodnoty. Ken dělá to jeho věc, podá mi něco - v tomto případě hodnotu jako 8 - a pak jsem musel udělat něco s touto hodnotou, pokud chci, aby to kolem. Takže tohle všechno vrátí se až příliš dobře, než dlouhý. Mockrát vám děkuji za tuto demo zde, Kena. [Potlesk] Velmi dobře. Pojďme se podívat, jak to nakonec se vztahuje k některé z volání funkcí, které jsme už tady. Nech mě jít napřed a přivést nás zpět k Cubing například zde. Všimněte si, že pokud chceme, aby skutečně začít užívat to dále, budeme muset být si vědom skutečnosti, že číslo x, která je momentálně prošel v zde se liší od toho, co je skutečně předán do funkce. Takže znovu, je toto heslo by kopie se stane docela germane za chvíli. Pojďme se podívat na něco, co není úplně správně pracovat ještě. Chystám se jít dopředu a otevřete třetiny buggy příklad, který je vadný povahy, a je to tzv. buggy3 a implementuje vyměňovat funkci. Zde máme hlavní funkci, která x a y libovolně inicializován 1 a 2, resp. Mohli bychom použít GetInt, ale my prostě potřebujeme jednoduché cvičení, takže je to pevně jako 1 a 2. V řádcích 21 a 22, my zřejmě vytisknout X a Y, 1 na řádek. Pak na lince 23, tvrdím já vyměňovat tyto hodnoty, tečka, tečka, tečka. I zdánlivě zavolat funkci v souladu 24 tzv. swap, který trvá 2 argumenty. Je to naprosto důvěryhodně pro funkce, aby se 2 argumenty. Viděli jsme printf to už. Takže výměna zřejmě trvá x a y, a jak již název napovídá, Doufám, že to bude vyměnit tyto 2 hodnoty. Tak jsem tvrdit, on-line 25 "vyměnil!" a já dotisk x a y za předpokladu, že jsem opravdu byl vyměnil. Ale když jsem vlastně tento program spustit - dovolte mi, abych otevřít okno terminálu, dovolte mi, abych buggy3 - jak již název napovídá, je to neskončí dobře protože když jsem Enter, zjistíte, že x je 1, y je 2, a přesto na konci programu, jsou stále ještě ve skutečnosti, stejný. Takže na základě prokázání právě s Kenem, co se vlastně děje? Pojďme se ponořit do tohoto swapu funkce. Je to super krátký. Je to jen pár řádků kódu dlouho. Ale co je to zásadní problém založen na jednoduchém příběhu řekl sem s Kenem? Proč je výměna vadné? [Student] Jste ukládání na kopii, ne proměnné. Přesně tak. Jsme ukládání na kopii, není proměnná sám. Jinými slovy, swap zřejmě trvá 2 argumenty, int, a to libovolně nazývá a a b, a tady jsem prošel v X a Y, které jsou příslušně 1 a 2, ale já ne doslova kolem x, já ne doslova procházet v y, Já jsem kolem kopii X a kopie y. Je to skoro, jako by si zkopírovat a vložit do swapu hodnoty, které chcete, aby skutečně manipulovat. Takže pokud je to ten případ, kdy jsem se start programu vykonávající řádek 35 pak 36, když jsem si na řádku 37, v tomto bodě v příběhu, co je hodnota? V tomto bodě příběhu, linka 37, jaká je hodnota v tomto bodě? >> [Student] 1. [Malan] To by mělo být jen 1, vpravo, protože x je předána jako první argument, a tato funkce prostě svévolně volá svou první argument je. Podobně je y druhý argument, a to je jen svévolně volá druhý argument b. Tato dichotomie je vlastně docela jednoduché vysvětlení. Přemýšlejte o tom. Nikdo z nás se setkal osobu, která napsal printf, tak jistě, on nebo ona nemá tušení, co naše proměnné o 30 let později se chystáte být nazýván. Takže tam musí být rozdíl mezi tím, co říkáte proměnné ve funkcích píšete a co říkáte proměnné ve funkcích voláte nebo pomocí. Takže jinými slovy, napsal jsem své proměnné jako x a y, ale pokud napsal někdo jiný odkládací funkci, on nebo ona určitě nebude vědět, co moje proměnné se bude nazýván, takže si uvědomit, že to je důvod, proč jste tuto dualitu jmen. Technicky, jsem mohl dělat to náhodou, ale stále by být předávány jako kopie. Bylo by to čistě náhoda, esteticky případě, že osoba, která napsala swapu použil stejné názvy. Takže v tomto bodě příběhu, linka 37, je 1, b = 2, a teď mám postupovat, aby swap. Nejprve mi dovolte, abych vlastně dělat to mnohem jednodušeji. Já nevím, co ty 3 řádky kódu dělají. Dovolte mi, abych to: b =, = b; udělal. Proč je tento zlomený, logicky? Je to druh intuitivní věc, ne? Tak se stává b a b stává, ale problém je, že jakmile linka 37 provádí, co je hodnota a b? Totéž, 1, protože jste clobbered, abych tak řekl, jste změnili b rovnat. Takže jakmile linka 37 provedl, to je skvělé, máte nyní 2 kopie číslem 1 Uvnitř této funkce, takže pak, když řekneš v souladu 38 = b, jste trochu šroubované, protože jste právě přiřazení 1-1. Jste trochu ztratila hodnotu, kterou záleželo. Takže v původní verzi tohoto, zjistíte, co jsem udělal. Jsem místo toho měla třetina řádek kódu, který vypadal jako toto. Prohlašuji, dočasnou proměnnou. Tmp je velmi obecný název pro dočasné proměnné, a to int proto, že musí odpovídat tomu, co chci udělat kopii. I uložit kopii uvnitř tmp, tak jednou linka 37 je proveden, hodnota je - rychlá příčetnost kontrola - 1, hodnota b je 2, a hodnota tmp je také 1. Takže teď jsem spustit linku 38. Jakmile linka 38 provede, má na hodnotu b. A b je 2, takže je nyní 2. Takže v tomto bodě příběhu, je 2, b je 2, a tmp je 1, takže teď logicky, můžeme jen plop TMP je hodnota do B a jsme hotovi. Takže jsme vyřešili tento problém. Bohužel, když jsem spustit tento program v této podobě, to dělá ne vlastně zaměnit žádné hodnoty. Ale aby bylo jasno, proč? Opravil jsem logický problém z před chvílí, ale zase, když jsem spustit tento program, x a y se nemění do konce programového popravě. [Neslyšitelné Student komentář] >> jsme vrátili nic, tak je to pravda. Ale ukazuje se, že je tu trochu problém, protože tady dosud, Jediné, co jsme byli schopni se vrátit, je jedna věc, a to je omezení C. Můžete vrátit pouze skutečně jednu hodnotu, v tom případě jsem trochu trčet protože jsem se mohl vrátit novou hodnotu x nebo bych mohl vrátit novou hodnotu y, ale já chci oba zpátky. Takže návratu není jednoduché řešení zde. Ale problém zásadně je důvod, proč? Co jsme vlastně vyměnili? [Student] a, b. >> A b. Ale i b jsou kopie x a y, což znamená, že jsme právě udělali všechny tyto práce, jsme trávili právě 3 minut mluvit o virtuální funkci a všechny 3 těchto proměnných, a to je skvělé, naprosto správný izolaci, ale A a B je rozsah pouze je v těchto liniích zde. Tak jako pro smyčce, pokud jste deklarovat integer i uvnitř smyčky for, podobně, pokud jste se prohlašuje, a b uvnitř funkce, které jste napsal, jsou platné pouze uvnitř této funkce, což znamená, že jakmile swap je provedeno spuštění a půjdeme ř. 24 až linii 25, x a y se nemění vůbec. Právě jste zbytečně spoustu času vyměňovat kopie proměnných. Tak to dopadá, že řešení je to vlastně non-zřejmé. To není zcela dostačující pro návrat hodnoty, protože se můžeme vrátit pouze 1 hodnotu, a já opravdu chci vyměnit oba X a Y současně, takže budeme muset vrátit k tomu. Ale teď si uvědomit, že problém zásadně odvozen od skutečnosti, že a a b jsou kopie a jsou ve svém vlastním rozsahu. Zkusme vyřešit tento nějakým způsobem. Dovolte mi, abych skutečně přejděte sem a otevřít, řekněme, čtvrtina variantu tohoto, buggy4. Co třeba tohle? To je podobný, ale jednodušší problém podívat se na předtím, než jsme se stab na jeho vyřešení. Tento program se nazývá přírůstek, a to zřejmě inicializuje celé číslo x na 1 v řádku 18. I pak tvrdí, x je 1, potom jsem si tvrdit, "Zvyšování ..." Pak jsem zavolat přírůstek, ale pak v řádcích 22 a 23, tvrdím, že to bylo zvýšeno, Tvrdím x je nyní, co to je - 2, pravděpodobně - ale tento program je buggy. V čem je problém? Jo. >> [Neslyšitelné Student odpověď] >> Přesně tak. Takže x byl vyhlášen, samozřejmě, na řádku 18. To je uvnitř složených závorek hlavní je. Takže jednoduchá odpověď je, že zatímco x existuje zde, neexistuje v souladu 32, takže tento program vlastně se ani sestavit. Kompilátor když se snažím sestavování tento kód bude na mě křičet o nějaké nehlášené identifikátoru nebo něco v tom smyslu. Ve skutečnosti, zkusme to. To je, aby buggy4. Tady to je. Použití nedeklarovaný identifikátor "x" v souladu 32. A skutečně, buďme konkrétnější zde dnes tak, že je to užitečné v úředních hodinách i doma. Všimněte si, že je to trochu záhadně písemná. Ale skutečnost, že zvonění je na nás řvali, řka buggy4.c: 32:5, je ve skutečnosti užitečné. To znamená, že je chyba na řádku 32 na znaku 5. Takže 1, 2, 3, 4, 5. To je, ve skutečnosti, kde je problém. A také, taky, mějte na paměti, úřední hodiny a doma, budu mít štěstí tady. Mám jednu chybu. Bude to poměrně snadno opravit. Ale pokud se dostanete celou obrazovku plnou ohromujících chybových zpráv, znovu si uvědomit, že nejspodnější jeden by mohl být jen projevem vrchní jednoho. Takže vždy honit své chyby shora dolů protože tam může být jen řetěz sedmikráska efekt že navrhuje máte tak více problémů, než jste vlastně dělat. Tak jak bychom mohli opravit, pokud je mým cílem zvýšit x? >> [Student] Udělat x globální. Dobře, takže můžeme x globální. Pojďme se na zástupce, kterého jsem varoval již dříve, ale sakra, my prostě potřebujeme rychlou opravu, takže řekněme, že int x tady. To dělá x globální. Takže teď hlavní má k němu přístup a přírůstek k němu má přístup, a tak nech mě jít napřed a zkompilovat to teď. Udělejte buggy4, Enter. Zdá se, že sestavení teď. Pojďme běžet buggy4. A zdá se, že skutečně funguje. To je jedna z těch věcí, které je dělají, co říkám, ne jako já, jak jsem právě udělal zde, protože obecně naše programy se dostaneme mnohem zajímavější a mnohem déle, než to, a pokud vaše řešení životních problémů je jen dát všechny proměnné v horní části souboru, velmi rychle se programy se strašlivě obtížné řídit. To je těžší vymyslet nové názvy proměnných, je stále těžší pochopit, co je proměnná dělá to, co, a tak obecně, to není dobré řešení. Takže jdeme na to lepší. Nechceme používat globální proměnnou zde. Já chci zvýšit x, takže jsem mohl samozřejmě - na konci dne, to je trochu hloupé příběhu protože právě to - ale když jsem nevěděl o tom provozovatele, nebo jsem nesměl změnit v main sám, jak jinak bych mohl implementovat Ken tady tentokrát není kostka, ale můžete zvyšovat? Jak mohu změnit tuto věc tady? Jo. [Student] Pass v x a pak se vrátit [neslyšitelné] >> Dobře, dobře. Tak proč bych projít v X a pak se spíše než ji vrátí proč ne já prostě vrátit x + 1. Pár dalších věcí, muset změnit zde. Jsem na správné cestě. Co ještě musím trik? Někdo jiný. Jo. [Neslyšitelné Student odpověď] Potřebuji změnit návratový typ přírůstku, protože to není neplatné. Void nic neznamená se vrátil, ale teď jasně, že je, tak to musí změnit - >> [studentka] int. int musí být v souladu s tím, co jsem vlastně vrací. Nyní něco jiného je stále buggy tady. Jo. [Neslyšitelné Student odpověď] >> [Malan] Tak jsem třeba zvýšit x? [Neslyšitelné Student odpověď] >> [Malan] Aha, tak musím projít x. Tak jsem třeba udělat tady. >> [Neslyšitelné Student komentář] [Malan] Tak prototyp, musím to změnit tady. Tak to má stát int, to se musí stát - hmm, jsem skutečně chybu tady. Pojďme opravit tenhle první. Co by to vlastně být? Je to být int něco. Mohlo by to být x, ale upřímně řečeno, pokud začnete volat všechny své proměnné x, to dostane méně a méně jasné, který je který. Takže řekněme, libovolně vybrat jiný konvence pro mé pomocné funkce, funkce píšu. Nazveme to, nebo bychom mohli nazvat - Říkejme tomu číslo ještě jasněji. Tak jsem se musel vrátit, co je číslo plus 1, a teď musím změnit 1 další věc, tady a ještě jedna věc tady. Co mám změnit na řádku 21 jako první? >> [Neslyšitelné Student odpověď] [Malan] Mám přiřadit ji k x. Nemůžu jen tak zavolat přírůstek (x). Musím si pamatovat odpověď změnou hodnoty x na levé straně. A i když x je nyní na levé a pravé, že je naprosto v pořádku protože pravá strana se provede, první pak dostane svalil do levého věc - x v tomto případě. A pak konečně, je to snadné opravit teď. To by mělo jen odpovídat, co je dole, int číslo. Takže celá parta změn pro opravdu stupidní funkce ale zástupce z věcí, které budeme stále chtějí dělat. Tak, aby buggy4. Já jsem podělal někde. Ach, můj Bože. Pět chyb v 6-line programu. Takže to, co se děje na lince 18, znak 5? Tak jsem si určil, že tento, int. Pojďme se podívat,. Existuje celá parta dalších chyb. Ach, můj Bože - 19, 18, 21 - ale opět, řekněme, vymazat obrazovku, Control L tady, a znovu zvonit. Takže 5 problémů je vlastně jen, že 1. Tak teď pojďme běžet buggy4, Enter. Páni, je x byl zvýšen správně. Dobrá. Jakékoliv dotazy na to, jak zvýšit počty? Jo. [Neslyšitelné Student otázka] >> Dobrá otázka. Jak to, že jsem si jen změnit x na číslo a program bude ihned vědět? Opět, myslete na to, jak tuto abstrakci. Takže když jsem hlavní a Ken je přírůstek, upřímně řečeno, je mi jedno, co Ken volá jeho iPad. Nezajímá mě, co říká něco, co má co do činění s jeho prováděním této funkce. Toto je implementační detail, že jsem, hlavní, nemusíte se starat o. A tak prostě mění důsledně ji uvnitř funkce - číslo sem a číslo zde - je vše, to trvá tak dlouho, jak jsem překompilovat. Je to něco jako když si myslíte, že o tom mnozí z nás, ty z vás, řidičských průkazů kteří řídí, nebo pokud jste dokonce řízený v autě, většina z nás nemá ponětí, jak auto funguje pod kapotou. A doslova, když otevřete kapotu, většina z nás - včetně mě - se nebude opravdu vědět, co se díváme na, něco jako se můžete cítit s věcmi, jako je tohle teď. Ale my opravdu nemáme starat, jak auto funguje, nemáme se starat, co všechno z tyčí a pístů a kabelů uvnitř vozu vlastně dělají. Takže něco jako to, co říkáte pístu nezáleží zde v tomto případě. Stejný nápad. Jo. >> [Neslyšitelné Student otázka] Pokud existuje více použití variabilního chvíli xa před, vy, programátor, by musely změnit je všude. Nebo byste mohli doslova dělat Soubor, Nabídka, a pak Najít, Nahradit - něco takového - ale budete muset udělat těchto změn sami. Musíte být v souladu. >> [Student] Pokud existuje více proměnných [neslyšitelné] Zejména, aby jako tady, kdyby to byla int jiné číslo? >> [Student] Správně. [Malan] Jo. Objednejte záleží, když voláte funkci. Takže pokud bych se volat přírůstek zde něco něco čárka, je tu přímé mapování. První proměnná, jak se to jmenuje, je vyroben kopii prvního argumentu sem. Promiňte. To by nemělo být závorka. Druhý argument se seřadí s druhým. Takže pořadí, ano, záleží. Dobrá. Promiňte. Vzal jsem si dlouhou cestu, aby se tam dostat. Další otázky? Dobrá. Tak uvidíme, jestli nemůžeme namalovat obraz o tom, co se vlastně děje pod pokličku, abych tak řekl. To je obdélník, který by mohl představovat paměti počítače. I když nemáte tušení, jak paměť funguje a jak funguje RAM, alespoň předpokládat, že máte kytice z ní v těchto dnech. Máš megabajtů to, máte gigabajty toho, a my víme, týden od 0, že byte je právě to, co? >> [Student] 8 bitů. 8 bitů, ne? Takže 8 nuly a 1. Takže pokud váš počítač má koncert RAM, 2 giga RAM v těchto dnech, máte miliard 2000000000 bajtů paměti nebo zhruba 8 miliard nebo 16 miliard bitů uvnitř počítače. Na rozdíl od malého Chmýřitý například Willy, to není magnetické částice obvykle už. Stále větší míře - v noteboocích nejméně - to je SSD disky, SSD že právě nemají žádné pohyblivé části. Je to všechno elektronické. Je to všechno elektřiny založené. Takže myslíte, že z tohoto obdélníku, jak jen zastupující 1 nebo 2 GB paměti, které máte. Takže je to kus paměti. Svět počítačové vědě nějak rozdělený off kousky paměti dělat různé věci. Například, je-li to vašeho počítače RAM, jak navrhl obdélníku, ukazuje se, že podle konvence, v horní části paměti RAM, abych tak řekl, je obecně to, co se nazývá textový segment. Ti jsou 0s a 1s, které jste sestavili. Takže když jsme se podíval pod pokličku, co a.out je, všechny tyto 0s a 1s, při spuštění programu, ty 0s a 1s jsou načítány z vašeho pevného disku do něčeho s názvem RAM, a v RAM to dali na vrcholu. Mezitím, budete mít jiné věci: inicializovat dat, inicializaci dat. Tyto 2 řádky paměti odkazují na globální proměnné, které nejsou často používají ale někdy, když to uděláte, skončí tam stejně. Pak je tu některé další věci: proměnné prostředí, které nebudeme trávit tolik času na, ale pak 2 důležité věci, které se vrátí v průběhu semestru, zásobník a halda. Takže většina z paměti počítače je vyhrazen při spuštění programu pro takzvaný balíček, a něco, co nazývá haldy. Nebudeme mluvit o haldy dnes, ale budeme hovořit o zásobníku. Zásobník je určen k vykouzlit vizuální z jídelny zásobníků haly jídlo v Mather domě nebo tam, kde se stalo, že tam, kde jídelna pracovníci čistit každý den, oni vyskládat až od podlahy nahoru, a podobně, v paměti, že je to myšlenka na něco na zásobníku, uvedení něco na stacku, uvedení něco na zásobníku. A co máme na mysli toto? Pojďme zvětšit pouze na dolní polovině obrázku, paměti RAM vašeho počítače, navrhnout následující. Ukazuje se, že při spuštění programu, jako je a.out nebo Hello - bez ohledu na program, je to, že jste napsali - znovu, 0s a 1s ty jsou načítány z vašeho pevného disku, který je dlouhodobé skladování, zůstane tam, i když zatáhněte za konektor, vloženého do paměti RAM. RAM je rychlejší než pevné disky - je to menší, než pevné disky - ale to je místo, kde žijí programy, zatímco vy používáte je. Takže jste dvakrát klikněte na program, na Mac nebo PC, je načtena z pevného disku do operační paměti RAM. Jakmile je načten do paměti RAM, 0s a 1s go na cestě nahoru, tzv. textu segment, ale pak, jakmile váš program ve skutečnosti spustí, hlavní funkce je volána, a hlavní, jak jsme viděli, často lokální proměnné, a to má ints a řetězce a připaluje a podobně. Takže pokud váš program, který jste napsali, nebo program, který jste poklepání používá některé proměnné uvnitř of main, skončí na dně svého stacku paměti, abych tak řekl. Konkrétněji, co to vlastně znamená? To prostě znamená, že pokud jsme se chystali počet bajtů paměti RAM v počítači, si všimnout, že to může být bajt číslo 0, může to být byte číslo 1, 2, 3, 4, 5, 6, celou cestu až 2 miliardy by se celou cestu tam nahoře. Takže jinými slovy, když mluvíme o paměti RAM nebo paměti, pokud jde o bytech, znamená to, že se někdo rozhodl, co očíslovat každý z těchto bloků paměti. Takže když budete potřebovat 32 bitů pro int nebo budete potřebovat 8 bitů pro char, kde se jim skončí v paměti? Koncepčně, prostě skončí na konci této věci zvané zásobník. Ale co je zajímavé, teď je, když hlavní volá funkce - Předpokládám, že funkci nazvanou foo, jen libovolný název - co se stane, je hlavní je v dolní části tohoto zásobníku paměti; foo nyní je kladen na vrcholu hlavní paměti. Takže nějaké lokální proměnné, které foo má skončit druh pojmově vyšší než v hlavním. Pokud foo volá jinou funkci nazvanou bar, tyto proměnné skončí tady. Pokud bar volá něco jiného, ​​zde, zde, zde. Takže to, co je na tom zajímavé spuštění programu je to, že jak volat funkce a jelikož tyto funkce volat funkce a jak tyto funkce volat funkce, si vybudovat tento balík funkcí v paměti. A jen jednou za funkce vrátí se můžete začít se, že paměť vrátit. Takže jedním z nejjednodušších způsobů, jak běží z paměti v počítačovém programu je psát funkce, které se nikdy nevrátí. Tak například, pojďme prokázat až se úmyslně buggy programu. Nech mě jít napřed a nenechám # include , int main (void), a budu dělat, když (2> 1), který pravděpodobně nebude nikdy měnit na nás, a nech mě jít napřed teď a dělat printf. Vlastně, že to bude méně vizuálně zajímavé. Pojďme to. Pro int i = 0; i> 0 - pojďme udělat stejnou chybu - i + +. A ať to není printf zde. Pojďme praktikovat to, co jsem kázal. Pojďme mít metodu tady, void refrén, a řekneme int i, a pak jsem chtěl říct printf - ne, pojďme udělat to zajímavější. Pojďme vlastně nevytiskne vůbec nic. Řekněme to: chorus (i). Dobrá. Tak to je buggy protože proč? Já jsem to vymyslela, jak jsem jít, protože program není vlastně dělat něco zajímavého. Ale to není cílem. Cílem je napsat program, jehož hlavní funkcí je co dělá, očividně? Zavolejte sám. A skutečně, nepotřebujeme smyčku. Pojďme ještě zjednodušit tím, jen tak, abychom neztratili ze zřetele opravdu základní chybu. Hlavní vyzývá sbor zpívat nějaký refrén, pak jsem udělal něco hloupého, a měl jsem refrén refrén volání protože jsem předpokládal, někdo jiný se bude implementovat možná, a teď to nebude sestavovat ještě. Musím udělat, co? Potřebuju prototyp, nezapomeňte. Tak jsem třeba mít tady void chór (int i); Takže teď když jdu tady - ve skutečnosti, pojďme použijte větší okno. Pojďme dál a udělat sbor. Pojďme dál a udělat sbor. Použití nehlášené identifikátor i. Oh, to bylo hloupé. Nepotřebujeme argument. Prostě to. Přeji si, abychom začali tímto způsobem. Bylo by to mnohem jednodušší program psát. Tam. Nyní pojďme na moji terminálovém okně, spusťte řinčet, a jdeme na to. To byl opravdu rychlý. Co se vlastně právě stalo, když? No, teď budu přidávat tiskovou linku, takže můžeme vidět. Dovolte mi, abych printf ("Jsem tady") - žádné proměnné. Necháme to takhle. Dovolte mi, abych znovu spustit make. Dovolte mi, abych znovu spusťte refrén. A ... no. Jen tak dál. Jak stranou, proč se nezhroutil? Segmentation fault stalo super rychlý předtím. [Neslyšitelné Student odpověď] >> Přesně tak. Tak to trvá dobu tisku, že jo? Je to jen má více práce na počítači v rámci. A je to tady: Segmentation fault. Tak zjistíte, jak rychle programy běží. Pokud si nejste tisku nic, super rychlý. Ale my pořád tuto segmentation fault, protože to, co se děje? Pokud si myslíte, že o tom, jak je váš počítač paměť stanoven, to se stane být hlavní, ale tady pojďme nazývat refrén, a říkejme této chór. A teď když to udělám své estetiku právo, je to jen říct chorus, chorus, chorus, chorus, chorus, chorus, chorus, ad nauseum, a nakonec, co se bude dít? Pokud velký obrázek, doslova, je to, co se právě děje koncepčně? Stoh přejíždí haldy. Nebo ještě hůř, stačí překročení všechno, včetně textového segmentu, který je 0 a 1, které představují svůj program. Stručně řečeno, je to prostě super, super špatný. Váš program se vymkla kontrole. Používáte způsobem více paměti, než jste zamýšleli všechno kvůli hloupé chyby v tomto případě, nebo v tomto případě velmi záměrně provádí funkce volat sebe. Nyní, to není tak špatné. Funkce volání se vlastně má velkou sílu, když ji použijete správně. Osobně jsem nepoužil správně zde. Takže to není zase tak špatné, ale fakt, že jsem vlastně nikdy přestat volat sám je základní slabina zde tohoto programu. Tak kam jdeme s tím vším? Co se vlastně děje? Když říkám přírůstek funkce, jako jsme dělali v těch příkladech, Mám hodnotu jako 1, že jsem se projít dovnitř I předat kopii čísla 1, takže se stane následující. Pojďme do přírůstku příkladu, ten chlap támhle. Zde je to, co se vlastně děje. Když jsem se zavolat přírůstek a já předat x, obrazově, co se děje tady, je to. Pokud budu mít hodnotu 1 uloženou tady a já jsem vlastně volat přírůstek, která se nyní nazývá sbor - iPad hází mě tady. Říkejme této přírůstek, a my nevíme, co to další funkce bude. Takže co se vlastně děje, je tady někde v hlavní mám kus paměti , který je ukládání číslo 1. Když říkám, přírůstek, já jsem s použitím jiného kus paměti, ale teď mám kopii 1. Když jsem zvyšte tuto hodnotu, to se stává 2, ale co se stane pak, jakmile přírůstu vrátí? Tato paměť jen dostane předán zpět do operačního systému, což znamená, že vše, co jste udělal, je nic užitečného. 1, která byla původně obsažena v main je stále ve skutečnosti neexistují. Tak kam půjdeme s tím? Ukazuje se, že v paměti máte tuto back-to-back posloupnost bajtů které si můžete dát věci do, a ukázalo se, že jsme už viděli něco která zahrnuje uvedení věci zpět k sobě, aby se zády k sobě. Co je řetězec založený na týden 1 a teď týden 2? Je to jen sbírka postav. Tak to dopadá, stejně jako si můžete dát čísla v paměti, podobně si můžete dát znaky v paměti. A jakmile začneme putting znaky v paměti zpět k sobě, aby zády k sobě, ukazuje se, že s nejjednodušší věci, jako pro vedení nebo smyčky while, můžeme iterovat zleva doprava přes znaky v řetězci a začít masírovat do různých postav úplně - se může stát b, mohl b stát c - takže nakonec můžeme mít anglickou větu, která skutečně dává smysl a převést každý z těchto dopisů jeden po druhém pěšky přes naší paměti počítače zleva doprava skutečně zašifrovat. Takže pojďme se náš pětiminutovou přestávku tady, a až se vrátíme, začneme tento proces zakódování informací. Dobrá. Než jsme se ponořit do nějakého crypto a tyto věci tzv. pole, dovolte mi, abych pauza pro případné dotazy, protože mám pocit, že jsem opravdu trochu zmatené některé z těchto témat. Takže pojďme opravit hned, jestli můžeme. Právě jsme mluvili o návratových hodnot, jsme hovořili o argumenty, a mluvili jsme o tomto pojmu, který se vrátíme v příštích týdnech, nahlížení paměti jako celou partou těchto skládané zásobníků, abych tak řekl, zdola nahoru, tak, že každý zásobník, který se dal na stack představuje funkci, která je v současné době s názvem. Nějaké otázky? Dovolte mi, abych na něco zeptat zde. Dovolte mi, abych zjednodušit to zpět k tomu, co bylo předtím, než některé z našich dřívějších Q & A. Skutečnost, že přírůstek má otevřené závorky, int číslo, uzavřená závorka - co int číslo představuje? [Student] argument. >> Argument. Dobře. Ale co je to argument? [Neslyšitelné Student odpověď] >> Co je to? >> [Student] Něco, co vám projít dovnitř Dobře, tak něco, co vám projít dovnitř a obecněji, je to jen vstup. Pokud jste psali funkci a tuto funkci je smysl života je to něco trochu jiného každém použití ji, pak jediný způsob, jak k tomu může dojít skutečně se zdá být, aby to se vstupem tak, že to může udělat něco s tím vstupem pokaždé. Takže budete muset zadat dvě věci, když funkce má vstup. Musíte zadat jméno, které chcete, aby k tomuto vstupu čistě pro své vlastní pohodlí, takže můžete odkazovat se na to ve funkci, že vy sami píšete, jak jsem zde v souladu 32. Ale také je třeba zadat její typ, protože C je programovací jazyk že jen vyžaduje, že pokud chcete proměnnou, budete muset říct počítači, co datový typ je, z velké části tak, že to ví, kolik bitů se přidělit pro uvedené proměnné protože by to mohlo být 6 - sorry, to nebude 6. To může být 16, může to být 8, může to být 32, a to i 64, ale počítač potřebuje vědět. Nyní, int na levé straně představuje to, co naopak? [Neslyšitelné Student odpověď] >> Co je to? >> [Student] Typ funkce. Typ funkce, a konkrétněji, typ své produkce. Přesně tak. Takže vzhledem k tomu, věc v závorce představuje jeho vklad, pokud existují, věc vlevo představuje jeho výstupu. A v tomto případě, přírůstek zřejmě vrátí int, a tak int je návratový typ této funkce. Co to znamená vrátit? Doslova, můžete použít klíčové slovo návrat a pak, pokud jste, co jste vrací vpravo klíčového slova je celé číslo, pak je to skutečně v souladu s tím, co jsme slíbili. Dalo by se to udělat něco takového - ahoj, svět - protože to je řetězec. Je zřejmé, že se nejedná o celé číslo. Takže ve zkratce, zátěž je opravdu na nás, programátor, být konkrétní na to, co se vracíme a pak vlastně jít o vracení. Kontext zde nyní je, že počítače paměť je gigabyte, 2 GB - cokoliv - možná je to víc, možná je to méně, ale počítač považuje to, že mají různé oddíly. Něco jde tam, něco jde tam, různé věci jde ve středu, a dnes jsme prostě začít vyprávět příběh, ale vrátíme k tomuto v průběhu času. Pro tuto chvíli, jen kousek paměti opravdu záleží, je text segmentu proto, že právě představuje 0s a 1s, že zvonění je na výstupu. Takže při spuštění příkazu na klávesnici, jako a.out nebo poklepáním na ikonu na Mac OS nebo Windows, Váš program je nabitý z pevného disku do paměti RAM a to svalil na vrcholu RAM počítače, abych tak řekl. Mezitím, jak váš program spustí a hlavní volána v programu, který psal nebo program Microsoft nebo Apple napsal, kterýkoli z jejích lokálních proměnných skončí tam dole na dně paměti vašeho počítače. Ale pokud hlavní vyzývá další funkce, které samo o sobě má proměnné nebo argumenty, které skončily nad ním. A pokud tato funkce volá něco, oni skončí nad ním, nad ním, nad ním. A pouze jednou funkcí se provádí spuštěním se stoh přihrádek, abych tak řekl, začít se dostat nižší a nižší. A to je to, co pak, v kostce, vysvětluje, proč při volání kostku nebo volejte přírůstek, jste předáním kopie hodnoty. A co to znamená, obrazově je to, že jste doslova psaní číslo 1 v jiné části paměti, měnící se, že 1-2 v případě přírůstku nebo na 8 v případě krychle a pak házení, že paměť pryč jakmile přírůstku nebo vrátí krychle funkce. Otázka. [Student] Kde jsou globální proměnné uloženy? Globální proměnné jsou uloženy v tom, co se v současné době nazývá inicializovat data nebo neinicializované dat, Rozdíl je, pokud máte globální proměnnou a přiřadit ji okamžitě hodnotu s rovnítko, skončí na vrcholu, a pokud si jen říct, int x, bez hodnoty, skončí o něco nižší v paměti RAM prostě konvencí. Další otázky? Dobrá. Takže tento obrázek vrátí, jak jsme si silnější s tím, co můžeme dělat s počítačem, ale teď, pojďme se krátce intro na kryptografii, specifický typ kryptografie, která neřeší všechny problémy světa ale vyřešit některé z nich. V tomto případě zde máme něco, co nazývá tajný klíč kryptografie. Secret-klíčová kryptografie, jak již název napovídá, pochází jeho zabezpečení z tajemství. Například, pokud jste byli zpátky na základní škole a jste míjeli malou tajnou milostný dopis na chlapce nebo dívku jste drtily na, pokud byste chtěli projít, aby na vědomí prostřednictvím publika, pravděpodobně by se napsat takový poznámku v angličtině nebo jaký je váš rodný jazyk je. Spíše, můžete zašifrovat, nebo můžete jen poslat textovou zprávu v těchto dnech. Ale možná ve skutečnosti předat jim vzkaz v celé třídě. A k tomu bezpečně takovým způsobem, aby vaši přátelé a učitel Nevím, co píšete, můžete přijít s poměrně jednoduchým algoritmem, mladý, že jste mohl být, jen tahanice slova. Takže místo psaní můžete psát b, místo b můžete psát C, místo c můžete napsat d, a tak dále. Nebo byste mohli přijít s sofistikovanější překladu dopisů do různých písmen. Ale úlovek je chlapec nebo dívka, které posíláte na vědomí potřebuje něco vědět, což je to, co, samozřejmě? >> [Student] Co posíláte. Jaký je váš tajemství je, stejně jako to, co je, že mapování mezi tyto a B a C je a d's. Je to jen přidává 1 pro každý z dopisů jít z bodu A do B, B na C? Je to složitější, než to? Takže vy a vaše rozdrtit potřebujete mít tuto tajnou informaci, ale je tu trochu catch-22 zde. Pokud je to vůbec poprvé posíláte milostný dopis prostřednictvím třídy, Jak je to, že chlapec či dívka bude vědět, co je tajemství ještě je? Takže tajný šifrovací klíč není vyřešit všechny problémy světa, a je to vlastně vztah, zde se vrátíme k na semestr konci. Podobně se většina z nás neví někdo, že pracuje, například na Amazon.com, a přesto mnozí z nás pravděpodobně koupil věci na Amazon.com, a my jsme se učili předpokládat, že tyto e-commerce transakce jsou bezpečné. URL pravděpodobně říká https, je to možná hloupá ikona visacího zámku někde, tam je nějaký druh kryptografie zabezpečení informací o kreditní kartě mezi vámi a Amazon.com. A přesto, pokud kryptografie znamená vědět, nějaké tajemství, a přesto jsem nikoho neznám na Amazon, a já jsem rozhodně nejsou uspořádány jakékoliv tajemství s někým na Amazon, jak je můj počítač, nebo můj prohlížeč dělat tohle? Ukazuje se, že je to jiné typy kryptografie celkem, že tento problém vyřešit. Ale pro dnešek, budeme soustředit na jednoduchá kde si můžete zařídit v předstihu vědět nějaké tajemství, jako 1 nebo nějaké mapování mezi tyto a b je. A proces kryptografie obecně zahrnuje to. Máte nějaký prostý text, je znázorněno zde na levé straně, jej spustit přes nějaký druh algoritmu nebo postupu pro šifrování ho - Možná, že to jen stane b, b stává c - a pak skončit s ciphertext. Mezitím, jakmile váš rozdrtit obdrží tuto tajnou poznámku, on nebo ona má pak dešifrovat to tím, že obecně změny tohoto algoritmu tak, jak se dostat zpět prostý text. Tam jsou fyzické inkarnace tohoto. Například, to je malé tajemství dekodér kroužek, a to je kroužek v tom smyslu, že jsou dva vytočí zde. Na vnější okraji této věci, je tu písmena A až Z, i když to v náhodném pořadí, a na vnitřní straně, je to vlastně některá čísla takové, že se tohoto kroužku můžete druh obrátit zvenčí, ale ne v aby se seřadí čísla s písmeny. Z filmu s názvem Vánoční příběh, budete vidět, že malý Ralphie byl tak dychtivý zjistit, co Little Orphan Annie tajný vzkaz byl pro něj které byly předány, myslím, ve formě číselných zpráv na obilovin krabici a vy jste museli shromažďovat všechny ty malé karty, které byly dodány v krabici obilovin, jste měli na e-mail je v, museli jste se vrátit tajný dekodér kroužek takže si můžete konečně zjistit, co je mapování mezi písmeny a číslicemi nebo písmena a písmena. Jak v počítači můžeme jít o zavádění nebo zastupující takové věci? Potřebujeme způsob, jak vyjádřit sebe trochu pružněji než naše proměnné, doposud dovoleno. Jsme měli Ints, jsme měli znaky, měli jsme plováky a dvoulůžkových a několika dalšími, ale ty jsou jednotlivé kusy paměti, které nejsou opravdu nám umožňují vyjádřit věci jako slov a vět a frází. Opravdu, jsme jen takové věci, řetězce, ale slibujeme, že je to opravdu jen zjednodušení v CS50 knihovně že jsme v úmyslu slupkou zpět. A tak pojďme začít dělat, že tady. Nech mě jít dál a otevřít soubor - Všechny tyto soubory jsou k dispozici, jako obvykle, online - tzv. array.c vyřešit problém nesouvisí s řetězci, ale že maluje obrázek zde o tom, jak bychom mohli použít něco jako pole. Pole je datový typ. Je to typ proměnné druhů, který má více menších datových typů uvnitř ní zády k sobě, aby se zády k sobě. Tak například, pokud bychom chtěli napsat malý program, který vám dává váš kvíz průměr do kurzu jako 50, který má 2 vyslýchá, můžete velmi snadno napsat tento program založený i na některé z minulého týdne materiálu pomocí GetInt a pár proměnných: int quiz1, int quiz2. A je to docela jednoduché. Možná je to 10, 20 řádky kódu max. provádět program že žádá uživatele o 2 kvizů skóre a poté vypočítá jejich průměr přidáním dohromady, dělení 2, a pak tisk výsledků. Bychom pravděpodobně mohli udělat docela snadno se po nějakém počtu minut. Ale problém je, že předpokládám, že 50 měl 3 kvízy nebo 4. Předpokládejme, že jste chtěli použít stejný program pro třídu, která měla týdenní kvízy. Přemýšlejte o třídy, která se jednou týdně kvízy. Pokud je 16 nebo tak týdnů v semestru, nyní máte 16 proměnných: int quiz1, int quiz2, int quiz3, int quiz4. Jakmile začnete vidět tuto redundanci, tento kopírování a vkládání kódu, by měla začít, aby se vám, aby tu bylo lepší způsob. A naštěstí, protože z polí je. Takže jdeme na to. Za prvé, dovolte mi představit velmi jednoduchou věc, že ​​jsme se nepoužívá tak daleko, ale uvidíte to občas v kódu. To je to, co se obecně nazývá konstanta. Takže je to konstanta v tom smyslu, že tato hodnota nikdy se mění. Lidská konvence při vytváření konstantní je používají všechna velká písmena jen proto, že to opravdu vyniká v kódu, a speciální klíčové slovo, které používáte v C je # define. Takže říkáme # define, pak mezeru, pak slovo, které chcete použít pro konstantní jméno a pak je hodnota konstanty. Všimněte se, že se liší od přiřazení něco proměnné. Není rovnítko, není středník. To je to, co je všeobecně známo jako preprocesoru směrnice, ale o tom až jindy. Pro tuto chvíli, to vytváří neměnný hodnotu s názvem kvízy jehož skutečná číselná hodnota je 2. Takže kdekoli vidíte kvízy, kvízy, kvízy v tomto souboru, že je to jen číslo 2. Když se podívám na hlavní teď, pojďme se podívat, jak to funguje. Nejprve to vypadá trochu záhadný, ale je to všechno věci od týdne 1. Požádejte uživatele, pro stupně. Jak to uděláme? V řádku 22 - to je opravdu šťavnaté část - Prohlašuji, plovák ale ne jen jediný plovák. Jsem prohlašuje, spíše pole s plovoucí desetinnou čárkou. Že proměnná se bude nazýván stupně, jak vyplývá tady, ale jediný kus nové syntaxi pak jsou tyto hranaté závorky. Skutečnost, že jsem řekl, float stupně a pak otevřete konzolu a pak řada - výpovědní lhůty, pokud je to konstanta je to stejně jako jsme to udělali - to znamená, "Hey počítač, dej mi 2 plováky a pojďme společně nazývají stupně." Toto je v kontrastu k mnohem nudnější procesu, jako je toto: float grade1; plavat grade2, a tak dále. Takže pole nám umožňuje realizovat tuto myšlenku, ale mnohem méně ledabyle, takovým způsobem, že můžeme napsat 1 řádek kódu místo, říci, 16 pro 16 týdnů semestru. Nechtěl jsem, aby hard-kód 2, protože pokud si myslíte, že o tom teď logicky, Předpokládám, že příští rok CS50 změny 3 kvízy místo a měl jsem číslo 2 zde, měl jsem číslo 2 tady, Měl jsem číslo 2 tady, číslo 2 zde. To se stává velmi únavné a velmi snadno zkazit a náhodně změnit hodnotu 1 až 3, a přichází jinou hodnotu 2. Takže budu místo abstraktní toto pryč a použít tato konstanta, která, jak již název napovídá, se nikdy nezmění. A teď bez ohledu na to, zda máme různé kvízy Letos nebo příští rok, Musím se změnit v jednom místě se zde na vrchol. Takže to je vše, konstanta je. Mezitím, nová pojmovým znakem je to, že z pole. Takže hranaté závorky mi tolik plováky a mě nechá společně nazývají stupně zde. Takže teď se podíváme, co budu dělat. Tady v souladu 24 je začátek smyčky for. To je opravdu nic vymyšleného. Je to jen pomocí kvízů místo hard-kódované číslo. Ale nic intelektuálně jinak, tam z minulého týdne. To je jen printf, takže printf ("Kvíz #% d% d:") protože já jen chci vytisknout dej mi kvíz číslo 1 z 2 a pak 2 z 2. Tak tohle je čistě estetického věc. Ale zajímavá část je nyní v souladu 27. Aby bylo možné vyplnit v jednom ze dvou zástupných symbolů s desetinnou hodnotou, můžete znovu použít hranaté závorky. V tomto případě, já jsem s použitím i proto, že to pro smyčce začala s i rovná, jakou hodnotu, zřejmě? [Student] 0. >> [Malan] 0. Tak na první iteraci tohoto smyčky, je to, jako jsem napsal v kódu, ale na druhé iteraci tohoto smyčky, je to, jako jsem napsal ve svém kódu. Ale fakt, že jsem pomocí proměnné je perfektní, protože, jak již název napovídá, je to různé její hodnotu na každé iteraci, tak jsem vyplnění tohoto pole jeden bod v čase. Co to pole vypadá? Důvod, proč jsem čerpal super jednoduchý obdélník na obrazovce ještě před Právě z tohoto důvodu. Pole je jen kus paměti následuje další kus paměti následuje další kus paměti, a tak dále. Takže pokud má pole je velikosti 2 v tomto případě tady, všechno, co bude dělat zadáním v mých kvizů skóre jako tady - jsem 100 na tohle a pak jsem dostal 99 na tento jeden - pak tato paměť nemusí být použit i proto, že jsem se jen zeptal počítač pro pole o velikosti 2. Tyto čtverce jsou stále tam, že jo? Stále máte 2 GB paměti RAM, i když jste jen dotazem na 2 plováky. Takže myšlenka polí je, že počítač prostě vezme kus paměti a pak rozděluje menší kusy zády k sobě, aby se zády k sobě. A tak to je vše, pole je. Je to souvislá kus paměti uvnitř, které si můžete dát věci. To se děje do té doby přece jen trochu nudný aritmetiku. Kdybych přejděte tady, to je místo, kde jsem se pak iterovat přes pole. I přicházejí s součtu všech hodnot v poli, a pak jsem používat kolo funkce zde skutečně udělat součet děleno kvízy. Ale dovolte mi, abych mávat ruku na to jako jakýsi dost aritmetiky pro teď. Ale všechno, co dělá pro mě nakonec je výpočet průměru. Takže první kvíz a druhý kvíz děleno 2 a pak tisk to jako int. Ale pojďme teď přechod na jiný příklad s názvem string1, který maluje podobný obraz, ale pomocí řetězce. Nech mě jít napřed a zjednodušit tím, jen na chvíli. Odpusťte odsazení pro teď. Oznámení v souladu 19 tohoto příkladu, mám řetězec od uživatele. Povšimněme si ale to, co jsem dělal další v řadách 22 vpřed. Já jsem vlastně iterace od i do - a to je nový trik - strlen, délka řetězce. To je funkce, která přichází s C, že pokud předat řetězec, to vám řekne, kolik znaků v tomto řetězci. To je vše. A skutečnost, že je to strlen místo řetězce délky je jen proto, že je to stručnější. Před třiceti lety, se líbila psát věci jako stručně, jak je to možné, takže jsme stále tuto úmluvu zde. i + + znamená jen zvyšovat i v každé iteraci. A teď si toho všimnout, což je opravdu zajímavé. V souladu 24, říkám, "Počítači, dej mi charakter, 8 bitů, a nazývat to c." Ale co je to na pravé straně říká? V angličtině, co to představuje? [Student] První znak v poli. Přesně tak. Dej mi první znak v poli. Nebo obecněji, dej mi-té znak v poli. A uvědomit si, že je to důležité dnes, jako počítačoví vědci, jsme vlastně počítat od 0. Nemáte prostor pro uvážení, nyní začít dělat to. Nyní se mají chovat v souladu s počítačem očekávání a počítat z 0 protože [0] bude první znak v řetězci, [1] bude druhý, [2] bude třetí a tak dále. Takže tento program, když jsem jej zkompilovat to je opět string1, takže se string1, a teď jsem běžet string1 v mém terminálovém okně. Je to čekání na vstup, takže budu psát v Davidovi, Enter, a teď se vytiskne Davidovi všecko na různých tratích, protože soupis toho, co dělám. Já tisku jeden znak v čase. Nebudeme zacházet do detailů dnes na to, ale jsem smazal před chvílí této kontroly zde. Ukazuje se, že v případě, že uživatel se nechová, nepřátelský, nebo jen zmatený, můžete skutečně nedávají řetězec obšírněji. Pokud stisknete špatné tlačítko na klávesnici, můžete dát žádnou řetězec vůbec, nebo pokud jste škodlivý, můžete zkusit vložit do společnosti GIGABYTE, to stojí eseje vyplnit tento řetězec, a v případě, že počítač běží z paměti, ukazuje se, že budeme dostat zpět tuto speciální hodnotu s názvem NULL. Takže teď, jen vím, že tam je to speciální hodnota zvaná NULL že nám umožní zkontrolovat, kdy jsme z paměti, mimo jiné. Ale když otevřu se nyní řetězec2, všimnete jeden rozdíl zde. Všimněte si, jeden rozdíl tu s string2. S string2, to pro smyčce je trochu jiný. Dovolte mi, abych odstranit NULL, takže můžeme hovořit o těch někdy jindy. Jaký je rozdíl asi pro smyčce tentokrát? Můžu se vrátit k předchozímu příkladu. Tak to je verze 2, toto je verze 1. 1, 2. 1, 2. The strlen volání je kde? Je to v první části smyčky for. Jakékoli myšlenky, proč to dělám? Jo. [Student] Takže se nemusíte volat funkce pokaždé. [Malan] Takže nemáme volání funkce pokaždé. Přesně tak. Vzpomeňte si na smyček, které jsou super jednoduchý jakmile trochu pochopili, že to je inicializace, podmínka, a aktualizace. Problémem je, že tento stav se děje na každé iteraci smyčky. A tak v tomto příkladu zde, co je špatného na tom, že tento je moje podmínka? [Student] Voláš strlen. [Malan] Voláš strlen znovu a znovu a znovu. Ale poté, co jsem napsal v Davidovi, délka tohoto řetězce je 5, a to nebude měnit na každé iteraci smyčky protože řetězec je stále D--v-i-d. Tak to je náznak, co se děje, aby se stal stále důležitější myšlenka známý jako konstrukční rozhodnutí, kde právě nedávají počítač dělat zbytečnou práci. Stejně jako plížit náhled pset2, pset2 ve standardní edici bude výzvou, abyste skutečně provádět určitý počet šifer, některé číslo šifrovací algoritmy, takže je možné jak šifrování a dešifrovat tajné zprávy hodně jako jedné Ralphie tam dekódovat. V hackerské vydání pset2, budeme jít trochu dál. Budeme vám předá soubor od skutečného počítačového systému , který obsahuje spoustu uživatelských jmen a skutečných zašifrovaných hesel, a výzvou pro hackera vydání bude bezva těchto hesel a zjistit, co kryptografie nebo co tajné byla použita skutečně generování těchto hesel. A budeme-li to provést pomocí nové funkce zde o C že ti dám jen demo známý jako argumenty příkazového řádku. Ukazuje se, jak si někteří z vás možná viděli v oddílu nebo v učebnicích, Hlavním nemusí vždy být neplatné v závorkách. Ukazuje se, že hlavní může také být psán jako to, se dvěma argumenty, argc a argv, kde argc je počet slov které zadáte po programu jménem na příkazovém řádku a argv je skutečná slova. A jak hranaté závorky tam naznačují, argv je zřejmě pole. Je to bude řetězec za řetězec po řetězec v paměti. Takže to, co budeme moci dělat počínaje PSet 2 je něco jako toto. Pokud udělám argv1, což je příklad vrátíme do pondělí, a spusťte jej, Všimněte si, že to nevypadá na nic zatím. Je to jen vytiskne jeho vlastní jméno. Ale když řeknu sbohem třídy, všimněte si, že tento program zřejmě opakuje nad každým ze slov, které byly zadány na příkazovém řádku. A prostředky, které získáme přístup k slovech, která uživatel zadal na příkazovém řádku je změnou Hlavním východiskem tento víkend od int main (void) int main (argc, argv) a tak se narodí argumenty příkazového řádku. A jakmile se dostanete opravdu sofistikovaný na to, budete moci psát opravdu trippy programy jako tenhle tady, který jde nad rámec některé funkce, že jsme udělali tak daleko, ale všechno docela silný. Takže necháme to s tím na obrazovce, a uvidíme se v pondělí. [CS50.TV]