DAVID Malan: Dobře, vítej zpět. Toto je CS50. To je začátek týdne sedm. Takže je to nějakou dobu, tak jsem si myslel, že bych se vichřice turné, kde jsme přestali a kde jsme teď bude. Takže to, co tady může mít způsobilo nějaké úzkosti na prvním místě. Ale doufejme, že začínáš aklimatizovat, co to znamená tady - hvězdička představuje ukazatel, který je jen to, co ve více laicky řečeno? Takže je to adresa. Takže je to adresa něco v paměti. A začali jsme Sloupněte vrstvy Před pár týdny, věci jako GetString a jiné takové funkce Celou tu dobu byli návratu Adresy věcí v paměti, jako adresa prvního znaku některé sekvence. Tak jsme také představil Valgrind, které začnete používat tohoto problému nastavit, a to zejména pro další problém nastavit stejně. A valgrind co dělá pro nás? Kontroluje úniky paměti, a to také kontroluje za zneužití paměti. Je možné, s určitou pravděpodobností, zjistit, zda Váš kód bude dotýkat paměť že to prostě neměl. Takže ne nutně únik, ale pokud přesahují hranice některých pole, a vy vlastně běží Valgrind a vyvolat takové chování při valgrind běží v programu je běžící uvnitř ní, dostanete zprávy, jako je tato - "neplatný psát velikost 4 ", což připomínají pár týdny znamenalo, že jsem měl náhodou jako na jeden int příliš daleko za hranice pole. A tak velikost 4 zde znamená velikost této konkrétní int. Tak se ujištění v tom, že Valgrind je výstup ve formátu tom, je prostě otřesné. Je to opravdu těžké vidět skrz nepořádek na zajímavé informace. Takže to, co jsme udělali tady je jen ukázka některé z několika více zajímavé linky. Ale uvědomit, že 80% je Valgrind Výstup bude trochu rozptýlení. Stačí se podívat na vzory, jako jsou tyto - neplatné pravdu, neplatné číst, 40 bajtů a určitý počet bloků jsou určitě ztratil, klíčová slova, jako je to. A co budete vidět snad je nějaký druh stopy, jakou funkci chyba je vlastně palců V tomto případě je tady, v tom, co řada můj kód byl zřejmě chyba? 26 v souboru nazvaném memory.c, který byl příklad jsme si hráli se v té době. Takže to asi není v malloc. To bylo pravděpodobně v mém kódu místo. Tak uvidíme to ještě jednou a znovu zanedlouho. Takže scanf, to přišlo až v roce pár formulářů tak daleko. Viděli jsme sscanf krátce. To bylo něco, co řada jste skočil do ve vaší Přípravy na kvíz. A scanf je vlastně to, co CS50 knihovna se používá pod kapuce pro docela nějaký čas, aby získat vstup od uživatele. Například, když jsem přejít na CS50 Spotřebič tady, dovolte mi otevřít Například dnes se tomu říká scanf-0.c A je super jednoduché. Je to jen pár řádků kódu. Ale je to opravdu ukazuje, jak GetInt pracuje celou dobu. V tomto programu zde, v souladu 16 Všimněte si, že jsem deklarovat int. Takže žádné ukazatele, nic magického tam, jen int. Pak v řádku 17, jsem výzvu uživatel na číslo, prosím. Pak na konci roku 18, já používám scanf zde. A já uvedeno, něco jako printf, že jsem očekával citát konec citátu procent i.. Tak i procenta, samozřejmě, označuje int. Nevšimnout, co druhý argument scanf je. Jak byste popsal druhý Argument se po čárce? Co je to? Je to adresa x. Což je výhodné proto, že tím, že scanf s adresou X, co který zmocní tuto funkci dělat? Nejen tam, ale i to, co? Proveďte změnu na něj. Vzhledem k tomu, můžete tam jít, je to trochu jako mapy na místo v paměti. A tak dlouho, jak si zajistit scanf nebo nějaká funkce se takové mapy, že funkce může tam jít, a to nejen podívejte se na hodnotu, ale také to může změna této hodnoty, což je užitečné, pokud smysl života scanf je skenování vstup od uživatele, a to konkrétně z klávesnice. A f označuje formátovaný, stejně jako printf, f označuje formátovaný řetězec, který chcete vytisknout. Takže ve zkratce, tato linka 18 jednoduše říká, snažím číst int od uživatele klávesnice a uložit do x, u co se stane, adresa x žít na. A pak konečně, linka 19 jen říká, díky za int, v tomto případě. Tak mě nech jít dál a dělat to. Tak, aby scanf 0. Nech mě jít dopředu a zoom palců Půjdu a spustit to s tečky lomítko scanf 0. Číslo, prosím? 50. Díky za padesát. Takže je to docela jednoduché. Teď, co se nedělá? Není to dělá spoustu z kontroly chyb. Například, když nebudu spolupracovat, a já nemám zadání čísla, ale Místo toho jsem napsat něco jako "ahoj" to je prostě divné. A tak jedna z věcí, CS50 Knihovna byla pro nás dělá pro některé Čas je to, že reprompting a reprompting. Opakování fráze odvolání bylo v cs50.c, a to je důvod, proč v GetInt knihovna CS50 je vlastně celá banda linek dlouho, protože jsme kontrola hloupé věci, jako je tento. Věděli uživatel nedal us, ve skutečnosti, int? Věděli on nebo ona nám něco jako písmeno z abecedy? Pokud ano, chceme zjistit že a křičet na ně. Ale věci se dostat mnohem zajímavější V tomto dalším příkladu. Když jdu do scanf-1.C, co je ten věc, která je zásadní změna v Další příklad? Já používám char *, samozřejmě, místo int. Tak to je zajímavé, protože char *, vzpomínám, je opravdu jen totéž jako řetězec. Takže to vypadá, možná to je super jednoduchá realizace getString. Ale já jsem stáhl vrstvy na CS50 knihovny, takže jsem volání této char * teď. Takže pojďme se podívat, kde, pokud kdekoliv, jdeme špatně. Řádek 17 - Bych znovu, prosím, dej mi něco, V tomto případě, řetězec. A pak na dalším řádku, volám scanf, znovu dávat to formátovací kód, ale tentokrát s procent. A pak tentokrát jsem dávat to buffer. Nyní nevšiml, nejsem s použitím ampersand. Ale proč je to, že pravděpodobně v pořádku tady? Protože to, co je vyrovnávací paměť už? Je to již ukazatel. Je to už adresu. A nechť je to slovo "zmást", dovolte mi, abych jen zavolat, že je, například, pro jednoduchost. Ale já jsem to nazval proto, že v bufferu Obecně platí, programování, pokud máte kus paměti, který řetězec skutečně jen je, že můžete říkat vyrovnávací paměti. Je to místo pro ukládání informací. Podobně jako věci, jako je YouTube, kdy oni ukládání do vyrovnávací paměti, abych tak řekl, že jen znamená, že je stahování kousky od internetu a jejich ukládání v místní pole, místní kus paměti, které můžete sledovat jej později bez je skákání nebo visí na si při hraní zpátky. Takže je tu problém i když, protože Říkám scanf lze očekávat, že řetězec od uživatele. Tady je adresa kus paměti. Dej to retezec. Proč je to, že vázaný dát nám potíže, i když? Co je to? Smím přístup že část paměti? Víte, já nevím. Protože má vyrovnávací paměť byla inicializována k něčemu? Ne tak docela. A tak to, co jsme byli volání odpadky hodnota, která není formální slovo. To prostě znamená, že nemám ponětí, co bitů jsou uvnitř ze čtyř bajtů Jsem vymezila jako vyrovnávací paměť. Jsem nezavolal malloc. Určitě jsem nezavolal GetString. Takže kdo ví, co je vlastně vnitřní vyrovnávací paměti? A přesto říká scanf naslepo, tam a dejte, co uživatel napsal. Takže to, co je pravděpodobně způsobí v našem kódu, pokud se jej spustit? Pravděpodobně segfault. Možná ne, ale asi segfault. A já říkám, možná ne, protože někdy vy, někdy nemusíte dostat segfault. Někdy prostě štěstí, ale to však bude chyba v našem programu. Tak mě nech jít do toho a sestavit to. Chystám se to udělat ze staré školy způsobem. Takže zvonění pomlčka 0, scanf-1, scanf-1.c, Enter. Jejda, příliš staré školy. Pojďme se podívat. Kde jsem jít? Oh, char * buffer. Oh, děkuji - Uložit, OK - velmi stará škola. Dobře, je to už nějaký čas. Tak jsem právě uložili soubor po by to dočasné změnit před chvílí. A teď jsem si ji pořídil ručně Clang. A teď budu pokračovat a spusťte scanf-1, Enter. String prosím. Budu psát v "ahoj". A teď, právě tady, upřímně řečeno, printf Můžete je trochu nepříjemné. Není to vlastně bude segfault v tomto případě. Printf je trochu zvláštní, protože je to tak super, že běžně používané printf podstatě dělá nám laskavost a realizace, že to není platný ukazatel. Dovolte mi, abych to na sebe jen vytisknout v závorkách null, a to i i když to není nutně to, co jsme sami očekávali. Tak jsme si to moc jednoduše vyvolat segfault s tím, ale je jasné, toto není chování jsem chtěl. Takže to, co je jednoduché řešení? No, scanf-2, dovolte mi navrhnout, aby místo vlastně jen přidělování char *, nech mě být trochu chytřejší to, a dovolte mi, abych přidělit vyrovnávací paměť jako posloupnost 16 znaků. Tak jsem si to v několika směrech. Mohl bych absolutně použít malloc. Ale můžu vrátit do týdne dvou, kdy Jen jsem potřeboval spoustu znaků. Je to jen pole. Takže dovolte mi, abych místo předefinovat vyrovnávací paměti se pole 16 znaků. A teď, když jsem se projít buffer - a to je něco, co my ne mluvit v týdnu dvě - ale můžete léčit matici jako když je to adresa. Technicky vzato, jak jsme viděli, jsou trochu jinak. Ale scanf nebude vadit, když si ji přenést název pole, protože to, co Zvonění udělá pro nás je v podstatě léčbě název tohoto pole jako adresa bloku 16 bajtů. Tak to je lepší. To znamená, že nyní mohu snad proveďte následující kroky. Dovolte mi, abych se vzdálíte na chvíli dělat, aby scanf-2, zkompilovaný OK. Nyní mi dovolte se dostal lomítko scanf-2. String prosím. "Dobrý den." A Zdálo se, že tentokrát nevyšla. Ale může někdo navrhnout scénář , ve kterém se nemusí ještě fungovat? Jo? Něco delší než 16 znaků. A skutečně, můžeme být trochu přesnější. Něco delší než 15 znaků, protože ve skutečnosti musíme mít na paměti, že musíme, že zpětné lomítko nula implicitně na konci řetězce, který je stranou scanf, typicky postarat se o pro nás. Takže dovolte mi, abych něco takového - Někdy se můžeme jen nechat to takhle. OK, takže jsme teď vyvolané naše segmentace chyba. Proč? Protože jsem napsal více než 15 postavy, a tak máme vlastně dotkl vzpomínka, že jsem vlastně neměl. Takže to, co je opravdu řešení tady? No, co když budeme potřebovat delší řetězec? No, možná, aby to 32 bajtů. No, a co když to není dost dlouho? Jak se o 64 bytů? Co když to není dost dlouho? Jak asi 128 nebo 200 bajtů? Co je opravdu řešení zde obecný případ, pokud nebudeme vědět, předem, co uživatel bude psát? Je to jen trochu velké osina v zadku, Abych byl upřímný, což je důvod, proč CS50 knihovna má několik desítek řádků kód, který společně realizovat GetString řetězec tak, že nemáme vědět předem, co uživatel bude psát. Zejména, když se podíváte zpátky na cs50.c před dvěma týdny, uvidíte že GetString vlastně dělá nelze použít scanf tímto způsobem. Spíše to přečte jeden znak najednou. Protože jedna pěkná věc, o čtení jednoho znaku je můžeme zajistit, abychom se vždy mít alespoň jeden char. Mohu jen prohlásit char, a pak se Tyto skutečně krůčky k právě číst jeden znak na čas z klávesnice. A potom, co uvidíte GetString dělá, je pokaždé, když se vyčerpá, řekněme, 16 bajtů paměti, používá malloc nebo bratranec, po němž alokovat více paměti, kopírování starý paměti do nového, a pak plazil spolu, jak jeden znak v době, a když se spustí z toho kus paměti, hodí ho, drapáky větší kus paměti, kopíruje starý do nových a opakování. A je to opravdu bolest skutečně implementovat něco tak jednoduchého jako jak vstup od uživatele. Takže můžete použít scanf. Můžete použít i jiné podobné funkce. A spousta učebnic a on-line Příklady dělat, ale všichni jsou náchylné k problémům, jako je tento. A nakonec, jak se segfault je docela otravné. Není to dobré pro uživatele. Ale v nejhorším případě, co dělá je zásadně dát svůj kód hrozí? Nějaký druh útoku, potenciálně. Mluvili jsme o jednom takovém útoku - přetékání stack. Ale obecně, pokud máte povoleno přetečení vyrovnávací paměti, jako my Před pár týdny se jen psaní více než "ahoj" na zásobníku, budete může skutečně převzít, případně, počítače, nebo alespoň se na údaje, které nepatří k vám. Takže ve zkratce, to je důvod, proč jsme těchto koleček. Ale teď, začneme si je sundat, jak naše programy již nepotřebujete, nutně, vstup od uživatele. Ale v případě problému nastavit šest, váš vstup bude pocházet z velké slovník soubor s některými 150 liché tisíc slov. Takže nebudete muset starat o uživatele libovolný vstup. Dáme vám některé předpoklady o tomto souboru. Jakékoliv dotazy týkající se ukazatelů nebo scanf nebo vstup uživatele obecně? Dobře, takže rychlý pohled a pak na jednom koncové téma před dvěma týdny. A to byl tento pojem z struct. Ne, že by - tato představa struct, což bylo to, co? Co struct udělat pro nás? Definovat - Cože? Definujte typ proměnné. Tak nějak. Jsme vlastně kombinací dvou témat. Takže s typedef, můžeme připomenout, že deklarovat typ vlastní, stejně jako synonymum jako řetězec pro char *. Ale s použitím typedef struct a můžeme vytvořit skutečně vlastních datových struktur. Například, když jsem se vrátit do gedit Zde jen na chvíli, a já jdu do toho a udělat něco jako, dovolte mi, abych ušetřit to jako, řekněme, structs.c dočasně, já jsem prostě jít jít dopředu a patří standardio.h, int main neplatné. A pak tady, předpokládám, že chci napsat program, který ukládá více studentů z více domy, například. Je to jako registrarial databáze nějakého druhu. Takže když budu potřebovat název jednoho studenta, jsem mohl udělat něco jako char * jméno, a já udělám něco jako - skutečnosti, využijme CS50 knihovnu jen na chvíli, aby se tento trochu jednodušší, takže můžeme půjčit ty desítky řádků kódu. A řekněme, aby to jednoduché. Budeme to řetězec, a teď GetString. Takže tvrdím, teď, když jsem uložené jméno nějakého studenta, a dům nějaký student, jednoduše pomocí proměnných jako my av prvním týdnu. Ale předpokládejme, že bych chtěl, aby podporovaly více studentů. Dobře, takže moje instinkty jsou k tomu string name2 dostane GetString, řetězec house2 dostane GetString. A pak naše třetí student, pojďme jméno3 GetString. Dobře, takže je to snad zarážející, vy jako druh hloupý, protože tento proces je ve skutečnosti nikdy skončí, a je to jen tak aby můj kód vypadat hůř a horší a horší. Ale řešili jsme to taky v týdnu dva. Jaké bylo naše relativně čisté řešení když jsme měli více proměnných stejného typu dat, které se všechny týkají, ale Nechtěli jsme to úděsný nepořádek podobně pojmenovaných proměnných? Co jsme udělali místo? Takže myslím, že jsem slyšel několik míst. Měli jsme celou řadu. Chcete-li více instancí něco, co kdybychom to všechno vyčistit a jen říct, dej mi Pole s názvem jména? A teď pojďme pevný kód 3. A pak mi dej ještě řadu volal domů, a dovolte mi, abych na nyní těžko kód 3. A já jsem masivně uklidila nepořádek, který jsem právě vytvořili. Teď jsem stále pevně zakódovány 3, ale i 3 může dynamicky pocházejí z Uživatel nebo argv, nebo podobně. Tak to už je čistší. Ale co to nepříjemné na tom je, že Nyní, i když název je jaksi zásadně spojena s studenta dům - je to student, který opravdu chtějí reprezentovat - Nyní mám dvě pole, která jsou rovnoběžné v tom smyslu, že jsou stejné velikosti a jména držák 0 Pravděpodobně se mapuje na domy držáku 0, a jména držák 1 mapy domů na držák 1. Jinými slovy, že studentské žije v ten dům, a že ostatní studenti žije v tomto druhém domě. Ale určitě by to mohlo být udělal ještě čistěji. No, je to možné, ve skutečnosti. A nech mě jít dopředu a otevřete nahoru structs.h, a budete viz tento nápad zde. Všimněte si, že jsem použil typedef, jak jste zmínil před chvílí na prohlašujeme, že náš vlastní datový typ. Ale já jsem vždy používal tuhle jiné klíčové slovo tzv. struct, který mi dává nový datové struktury. A to datová struktura Tvrdím se děje mít dvě věci uvnitř to - řetězec s názvem jméno a řetězec s názvem dům. A jméno jdu dát Tato datová struktura bude být nazýván studentem. Mohl bych říkat, co chci, ale sémanticky, aby smysl pro mě, v mé mysli. Takže teď, když otevřu lepší verzi programu jsem začal psát tam, dovolte mi přejít na začátek. A je tu několik dalších řádků kódu zde, ale dovolte mi zaměřit se na v okamžiku, kdy na jednoho. Já jsem prohlásil, konstantní zvané studenty a pevně zakódovány 3 nyní. Ale teď, všimněte si, jak čisté můj kód začíná dostat. V souladu 22 Prohlašuji, Řada studentů. A zjistíte, že žák je zřejmě nyní datový typ. Vzhledem k tomu, v horní části tohoto souboru, oznámení Uvedl jsem, že hlavičkový soubor že jsem vytáhl před chvílí. A že hlavičkový soubor prostě musel tato definice studenta. Takže teď jsem vytvořil své vlastní údaje Typ že autoři let C Před nemyslel předem. Ale žádný problém. Mohu to udělat sám. Tak tohle je pole s názvem studenti, každý, jehož členové je student strukturu. A chci, aby tři z nich v poli. A teď, co dělá zbytek tohoto programu dělat? Potřeboval jsem něco trochu svévolné. Takže z on-line 24 kupředu, I iterovat od 0 do 3. Pak jsem se dotáže uživatele jméno studenta. A pak jsem použít getString jako předtím. Pak jsem požádat o studenta domu, a používám getString jako předtím. Ale Oznámení zadávacího řízení - relativně nový kus syntaxe - Pořád indexu i-tého studenta, ale jak to mám dostat na konkrétních údajů pole uvnitř struct? No, co je zřejmě nový kus syntaxe? Je to jen operátor tečky. Jsme opravdu viděli předtím. Viděli jste to v Pset pět, pokud jste skočil již s bitmapovými soubory. Ale tečka znamená jen uvnitř tohoto struct nebo více polí, dát tečku název, nebo mi dot dům. To znamená jít dovnitř na struct a dostat ty konkrétní oblasti. Co zbytek tohoto programu dělat? To není všechno, sexy. Všimněte si, že jsem přecházet od 0 do 3 znovu, a já jsem jednoduše vytvořit English fráze jako tak, a tak je v takové a takový dům, předáním dot název od i-tý student a jejich dům také. A pak konečně, teď začneme dostat anální o tom, teď, když jsme obeznámeni s tím, co malloc a další funkce byly dělal celou tu dobu. Proč musím osvobodit i jméno a dům, i když jsem nevolal malloc? GetString udělal. A to bylo malé špinavé tajemství pro několik týdnů, ale má GetString byl únik paměti v celé umístit všechny semestr tak daleko. A konečně valgrand ukazují nám to. Ale není to velký problém, protože vím, že mohu jednoduše uvolnit jméno a dům, i když technicky, aby je super, super bezpečný, měl bych být dělat nějaké kontroly chyb zde. Jaké jsou vaše instinkty ti? Co bych měl být kontrola než jsem se uvolnit, co je řetězec, který aka char *? Měl jsem opravdu kontrolovat, zda studenti držák i tečka název není rovna null. Pak to bude v pořádku jít dopředu a zdarma že ukazatel, a stejné nebo jiné také jedním z nich. Pokud studenti držák i tečka dům není roven null, teď bude chránit o roh případu, ve kterém GetString vrátí něco jako null. A my jsme viděli před chvílí, printf bude chránit nás tady jen říkám, null, která bude vypadat divně. Ale aspoň to nebude segfault, jak jsme viděli. No, dovolte mi udělat jednu věc zde. struct-0 je trochu hloupé programu protože jsem zadat všechny tyto údaje, a pak je to jednou ztratil program končí. Ale nechte mě jít dál a dělat to. Dovolte mi, abych terminálu Okno trochu větší. Dovolte mi, abych Struktury-1, což je nová verze tohoto. Budu přiblížit trochu. A teď mi dovolte běžet tečku lomítko struct-1. Jméno studenta - David Mather, pojďme dělat Rob Kirkland, pojďme Lauren Leverett. Co je zajímavější je nyní Oznámení zadávacího řízení - a já jen vím to, protože Napsal jsem program - existuje soubor se na můj současný adresář s názvem students.csv. Někteří z vás mohli vidět nich v reálném světě. Co je to CSV souboru? Hodnot oddělených čárkou. Je to něco jako chudý člověk je Verze souboru aplikace Excel. Je to tabulka řádků a sloupců, které můžete otevřít v programu, jako je Excel, nebo čísla v počítači Mac. A když otevřu tento soubor zde na gedit, Oznámení zadávacího řízení - a čísla tam nejsou. To je jen gedit vyprávění mi čísla řádků. Všimněte si na prvním řádku tohoto Soubor je David a Mather. Další řádek je Rob čárka Kirkland. A třetí řádek je Lauren čárka Leverett. Takže to, co jsem vytvořil? Já jsem teď napsal program v C, který účinně mohou vytvářet tabulky který lze otevřít v program, jako je Excel. Ne vše, co přesvědčivý soubor dat, ale Pokud máte mnohem větší kusy údaje, které jste skutečně chcete manipulovat a dělat grafy a jako, to je asi jedna způsob, jak vytvořit tato data. Navíc, CSVŠ jsou skutečně výborný společné jen pro ukládání dat jednoduchých - Yahoo Finance, například, pokud se dostanete ceny akcií prostřednictvím svých tzv. API, bezplatná služba, která vám umožní získat aktuální up-to-aktuální zásoby citace pro podniky, které aby údaje v roce Super jednoduchý formát CSV. Tak jak to uděláme? No nevšiml, většina z tohoto programu je téměř stejný. Povšimněme si ale tady dole, spíše než tisk Studenti ven, na lince 35 kupředu, tvrdím, že šetřím studenti na disk, takže ukládání souboru. Tak zjistíte jsem prohlásil soubor * - Nyní, to je druh anomálie v C. Z nějakého důvodu je soubor všech čepice, který není jako většina ostatních typů dat v C. Ale to je vestavěný datový typ, FILE *. A já deklarovat ukazatel na soubor, je to, jak si můžete myslet, že. fopen znamená otevřený soubor. Jaky soubor, který chcete otevřít? Chci otevřít soubor, který budu libovolně volat students.csv. Bych mohl zavolat, že něco chci. A pak se hádat. Co druhý argument na fopen asi znamená? Jasně, w pro zápis, by být r pro čtení. Je tu pro append, pokud Chcete přidat řádky a ne přepsat celou věc. Ale já jen chci, aby tento soubor vytvořit jednou, takže budu používat citační konec citátu w. A vím, že jen z přečtení dokumentace, nebo manuálové stránky. Pokud soubor není null - jinými slovy, pokud se nic nepovedlo se - dovolte mi, abych iteraci Studenti 0-3. A teď zjistíte, že je něco někdy tak trochu jinak o linka 41 zde. Není to printf. Je to fprintf pro soubor printf. Takže to bude zapisovat do souboru. Který soubor? , Jejíž ukazatel zadáte jako první argument. Pak jsme se určit formátovací řetězec. Pak jsme se určit, jaký řetězec chceme připojit na první procent s, a pak další proměnná nebo druhý procent s. Pak jsme zavřete soubor s fclose. Pak jsem uvolnit paměť jako dříve, i když Bych se měl vrátit a přidat Některé kontroly na NULL. A je to. fopen, fprintf, fclose mi dává schopnost vytvářet textové soubory. Nyní uvidíte v problému pět set, která zahrnuje obrazy, budete používat binární soubory místo. Ale podstatnější je, že myšlenka je stejná, i když funkce, budete jsou vidět trochu jinak. Takže vichřice turné, ale budete mít příliš obeznámeni se souborem I/O-- vstup a výstup - s Pset pět. A případné otázky počáteční základy tady? Jo? Co když se pokusíte uvolnit nulovou hodnotu? Věřím, že pokud se dostal zdarma trochu více uživatelsky přívětivé, můžete potenciálně segfault. Absolvování je null, je špatné, protože já ne věří zdarma obtěžuje zkontrolovat, pro vás, , protože by mohly být považovány za odpady času na to udělat sám pro všichni na světě. Dobrá otázka, ačkoli. Dobře, takže tento druh dostane nám zajímavé téma. Téma problémového souboru pět je forenzní. Alespoň to je část z problémového souboru. Forenzní obecně se odkazuje na využití informací, které mohou nebo nesmí byly odstraněny záměrně. A tak mě napadlo, že vám rychle chuť toho, co se skutečně děje na všech tentokrát pod kapuce počítače. Například, pokud máte uvnitř vašeho notebook nebo stolní počítač, pevný disk, je to buď mechanické zařízení, které vlastně točí - je tu kruhové věci zvané mísy které vypadají docela líbí, co jsem jen měl na obrazovce zde, i když je to stále stará škola. Jedná se o tři a půl palce pevný disk. A tři a půl palce odkazuje na se té věci, když ji nainstalovat v počítači. Mnoho z vás ve vašich notebooků nyní mají polovodičové disky nebo SSD, které nemají žádné pohyblivé části. Jsou spíš jako RAM a méně jako tato mechanická zařízení. Ale myšlenky jsou stále stejné, jistě, které se vztahují na problém nastavit pět. A pokud si myslíte, že teď pevný disk představuje, že kruh, který Budu kreslit jako tohle. Když vytvoříte soubor v počítači, ať už je to SSD, nebo v V tomto případě, starší školní pevný disk, tento soubor obsahuje více bitů. Řekněme, že je to 0 a 1, celá parta 0s a 1s. Tak tohle je můj celý pevný disk. To je zřejmě docela velký soubor. A to je s použitím až 0s a 1s na to část fyzické talíři. No, co je to fyzická část? No, ukázalo se, že na pevném disku, alespoň z tohoto typu, že je Tyto malinké magnetických částic. A oni mají v zásadě na sever a jižní póly k nim, takže pokud zase jeden z těchto magnetických částic tímto způsobem, dalo by se říct, že je to představuje 1. A jestli je to vzhůru nohama na jih do sever, dalo by se říct, že je to představuje 0. Takže v reálném fyzickém světě, je to jak byste mohli představovat něco binární stav 0 a 1.. Tak to je vše, je soubor. Je tu celá parta magnetické částice, které jsou v jejich tímto způsobem, nebo Tímto způsobem se vytváří vzory na 0s a 1s. Ale to dopadá když soubor uložíte, některé informace je uložena odděleně. Takže to je stolek, adresář, abych tak řekl. A já budu nazývat název sloupce a Zavolám tomto sloupci umístění. A já řeknu, předpokládám, to je můj životopis. Můj resume.doc je uložen na umístění, řekněme 123. Vždycky jsem jít na toto číslo. Ale stačí říct, že stejně jako v paměti RAM, můžete si vzít pevný disk to je gigabyte nebo 200GB nebo terabyte a můžete počet všech bytů. Můžete očíslovat všechny kusy 8 bitů. Takže budeme říkat, že to 123 je umístění. Takže tento adresář uvnitř svého provozu Systém si pamatuje, že moje životopis je na místě 123 |. Ale to bude zajímavé, když Odstranění souboru. Tak například - a naštěstí, většina světa je chytil na to - co se stane, když můžete přetáhnout soubor do vašeho Mac OS koše nebo vaše Windows Koš? Jaký je účel toho docílit? Je to samozřejmě, jak se zbavit souboru ale co akt přetažením pád do koše nebo se obraťte na Koš dělat na počítači? Absolutně nic, opravdu. Je to jen jako složky. Je to speciální složka, to je jisté. Ale to vlastně soubor smazat? No, ne, protože někteří z vás asi byli jako, oh sakra, ty ne neznamená to udělat. Takže dvakrát kliknete Koš nebo Koš. Jsi tropil kolem a vy jste zpět soubor pouhým přetažením odtamtud. Tak jasně, že to není nutně odstranění. OK, ty jsi chytřejší než to. Víte, že právě jeho přetažením do Koš nebo Koš, neznamená, jste vyprazdňování koše. Takže jdete do menu a říkáte Empty Trash nebo Vysypat koš. Poté, co se stane? Jo, tak to je odstraněn víc. Ale všechno, co se děje, je to. Počítač zapomene, kde resume.doc bylo. Ale to, co se nezměnila zřejmě na obrázku? Bity, 0s a 1s, že tvrdím, jsou na místě nějaké fyzické aspektu hardware. Jsou tam pořád. Je to jen má počítač zapomněl, co oni jsou. Takže je to v podstatě osvobodil souboru bitů tak, aby mohly být znovu použity. Ale ne, dokud vytvořit více souborů, a další soubory a další soubory pravděpodobnostně, které 0s a 1s, tyto magnetické částice, se znovu, vzhůru nebo pravé strany, aby pro další soubory, 0 a 1S. Takže máte toto okno času. A není to o předvídatelné délka, opravdu. Záleží na velikosti pevného pohon a kolik souborů, které máte a jak rychle si nové. Ale je to okno, během které tento soubor je stále dokonale nenahrazují. Takže pokud jste někdy použít programy jako McAfee nebo Norton zkusit obnovit údaje, všechny dělají se snaží obnovit tuto tzv. adresář zjistit, kde váš soubor je. A někdy Norton a budou říkat, soubor je 93% obnovitelná. No, co to znamená? To prostě znamená, že nějaký jiný soubor shodou okolností nakonec skončil, řekněme, ty kousky z vašeho původního souboru. Takže to, co je ve skutečnosti podílí na obnovu dat? No, pokud nemáte něco jako Norton pre-nainstalovány na vašem počítači, nejlepší, co můžete udělat, je dívat se někdy na celý pevný disk hledá vzory bitů. A jedním z témat problémového souboru pět je, že budete hledat ekvivalent pevného disku, forenzní Obraz Compact Flash kartu z digitální fotoaparát, hledá 0s a 1s, které obvykle s vysokou pravděpodobnost, představují začátek JPEG obraz. A vy můžete získat tyto snímky podle za předpokladu, když vidím tento model bitů na forenzní obraz s vysoká pravděpodobnost, že označí začátek ve formátu JPEG. A když vidím stejný vzorec znovu, které pravděpodobně počátkem další JPEG, a další JPEG a další JPEG. A obvykle je to jak obnova dat bude fungovat. Co je hezké o JPEG je i přesto, formát souboru je sám o sobě poněkud složité, počátek každé takové Soubor je vlastně docela identifikovatelný a jednoduché, jak uvidíte, pokud jste tak již neučinili. Takže pojďme se blíže podívat pod kapuce, aby se přesně to, co bylo děje, a co to 0s a 1s jsou, aby vám trochu více kontext pro tento konkrétní úkol. [PŘEHRÁVÁNÍ] -Kde je váš počítač ukládá většinu jeho trvalá data. K tomu, aby údaje cestuje z RAM spolu se softwarovými signály, které říkají, pevný disk, jak ukládat tato data. Na pevném disku obvody překládat tyto signály do napětí výkyvy. Tito, podle pořadí, kontrola pevného disku pohyblivé části, některé z mála pohyblivé části zůstaly v moderní výpočetní. Některé ze signálů ovládání motoru které se točí pokovená talíře. Vaše data jsou ve skutečnosti uložena na těchto mís. Ostatní signály přesunout čtení / zápis hlavy ke čtení nebo zapisovat data na plotnách. Toto zařízení tak přesné, že člověk vlasy by neprošel ani mezi hlavy a předení talíře. Přesto to všechno funguje v úžasné rychlosti. [END PŘEHRÁVÁNÍ] DAVID Malan: mírné přiblížení teď hlouběji na to, co je vlastně na těchto mís. [PŘEHRÁVÁNÍ] -Pojďme se podívat na to, co jsme právě viděl jako ve zpomaleném filmu. Když krátký elektrický impulz je zaslána čtecí / zapisovací hlavy, pokud proletí na malé elektromagnetické pro zlomek vteřiny. Magnet vytváří pole, které změní polarita malý, malý část kovových částic, které Srst každý talíř povrch. Vzor řada z nich malý, platí-up oblasti na disku představuje jeden bit data v binární číslo používaný systém počítače. Nyní, v případě, že proud je zaslána jedním ze způsobů přes čtecí / zapisovací hlavy plochu je polarizované v jednom směru. V případě, že proud je odeslána do opačný směr, polarizace je obráceno. Jak získat data z pevného disku? Jen zvrácení procesu. Tak, že je to, že částice na disku že se proud v čtecí / zapisovací hlavy v pohybu. Dejte dohromady miliony těchto zmagnetizované segmenty, a máte soubor. Nyní může kusů v jednom souboru být roztroušeny po celém disku, mísy, něco jako ten nepořádek papírů na stole. Takže Speciální, extra soubor udržuje o tom, kde co je. Copak Přejete si měli něco takového? [END PŘEHRÁVÁNÍ] DAVID Malan: OK, pravděpodobně ne. Tak kolik z vás Vyrůstal s nimi? OK, tak je to méně a méně ruce každý rok. Ale jsem rád, že jste alespoň obeznámeni s nimi, protože to a naše vlastní Kniha demo, bohužel, umírají velmi pomalé smrti zde známosti. Ale to je to, co jsem, alespoň v roce vysoké školy, který se používá pro zálohování použití. A bylo to úžasné, protože mohl uložit na 1,4 MB. Tento disk. A to byla vysoká hustota provedení, jak je uvedeno na HD, který má znamená před dnešními HD videa. Standardní hustota byla 800KB. A než to, že tam bylo 400 kilobyte disky. A než to, že tam bylo 5 a 1/4 palcové disky, které byly skutečně disketa, a trochu širší a vyšší než tyto věci zde. Ale můžete skutečně vidět tzv. floppy aspekt z těchto disků. A funkčně, jsou ve skutečnosti dost podobné pevných disků na Alespoň to typ. Opět SSD v novějších počítačů pracovat trochu jinak. Ale pokud budete pohybovat, že malý kovový výstupek, můžete skutečně vidět malý cookie, nebo talíř. Není to kov, jako je tento. Tohle je vlastně nějaký levnější plast. A můžete trochu třást IT. A ty jsi děvka jen setřít některé počet bitů nebo magnetických částic z tohoto disku. Takže naštěstí, nic na něm. Pokud to, co je v cestě - a pokrytí vaše oči a ti svého souseda - můžete jen tak vytáhnout to Celý plášť off takhle. Ale je to trochu jaro, a tak se si vědom, že na vlastní oči. Takže nyní máte opravdu disketu. A co je pozoruhodné o tom je, že stejně jako je to malé zastoupení větší pevný disk, tyto věci jsou super, Super jednoduché. Pokud sevřete spodní něj teď, že kovová věc je pryč, a kůra je otevřené, všechno tam je, je dva kusy plsti a tzv. diskety s kusem kovu na vnitřní straně. A tam jde polovina mého disku je obsah. Tam jde další polovina z nich. Ale to je vše, co se točí uvnitř počítače v dávných. A opět, aby to do souvislostí, jak velká je nejvíce ze svého pevné disky v těchto dnech? 500 GB, terabajtových, možná počítač desktop, 2 TB, 3 TB, 4 TB, ne? To je jeden megabajt, dávat nebo brát, které ani vhodný typický MP3 anymore v těchto dnech, nebo některé podobné hudební soubor. Tak trochu suvenýr pro vás dnes, a také pomoci souvislostí, co budeme brát za samozřejmost nyní v problému pět set. To jsou jen na vás, aby. Dovolte mi tedy přechod, kde bude výdaje na další Pset stejně. Takže jsme se nastavit tuto stránku - ach, pár oznámení rychle. Tento pátek, pokud chcete přidat CS50 na oběd, jít na obvyklém místě, cs50.net/rsvp. A konečný projekt - takže dle osnov, jsme zaslali Závěrečný projekt specifikace již. Uvědomte si, že to neznamená, že je to způsobeno zejména brzy. Je vyslán, opravdu, jen proto, aby vy o tom přemýšlet. A opravdu, super významný procento z vás bude řešit závěrečných prací na materiálu, který jsme se ani nedostal na ve třídě, ale bude již příští týden. Všimněte si však, že spec volá po několik různých složek závěrečný projekt. První z nich, během několika týdnů, je pre-návrh, docela neformální e-mail Váš TF mu říct, nebo to, co jste přemýšlet o tom, pro svůj projekt, s žádný závazek. Návrh bude váš konkrétní závazek, řekl, tady je to, co Chtěl bych udělat pro můj projekt. Co si myslíte? Příliš velké? Příliš malý? Je to zvládnutelné? A vidíte, spec pro více informací. Pár týdnů poté, co je stav Zpráva, která je podobně neformální e-mail k vašemu TF říci, jak pozadu jste v posledním realizace projektu, po němž následuje CS50 Hackathon, které každý je pozván, která bude událost od 20:00 Na jeden večer až do 07:00 AM příští ráno. Pizza, jak jsem mohla uvedeny v týdnu nula, bude Wil podává v 21:00, Čínské jídlo v 01:00. A pokud jste ještě vzhůru v 05:00, Vezmeme vás na IHOP k snídani. Takže Hackathon je jeden z více nezapomenutelné zážitky ve třídě. Pak provedení, což se projevuje i pak vrcholný CS50 veletrhu. Více informací o všech těchto v příštích týdnech. Ale vraťme se k něčemu old school - opět, pole. Takže pole bylo hezké, protože řeší problémy, jako jsme viděli jen Před chvílí se studentskými struktur jak se trochu vymkla kontrole, kdybychom chcete mít student, jeden, student, dva Student tři, student dot dot dot, některé libovolný počet studentů. Takže pole, před několika týdny, Přiletěl a vyřešit všechny naše problémy, že není ví předem, kolik věcí některých typů bychom mohli chtít. A my jsme viděli, že struct nám může pomoci dále organizovat náš kód a udržet koncepčně podobných proměnných, jako je jméno a dům, dohromady, aby se Můžete s nimi zacházet jako s jedním subjektem, vnitřní z nichž jsou menší kousky. Ale pole mají některé nevýhody. Jaké jsou některé nevýhody jsme se setkali s poli tak daleko? Co je to? Pevná velikost - takže i když si možná možné přidělit paměť pro pole, až budete vědět, kolik studentů máte, kolik znaků máte od uživatele, jakmile jste přiděleny pole, jste trochu maloval si do kouta. Protože nemůžete vložit nové prvky do středu pole. Nemůžete vložit více prvků na konci pole. Opravdu, musíte se uchýlit k vytvoření zcela nové pole, jak jsme diskutovali, kopírování starého do nového. A opět, že je bolest hlavy, která GetString se zabývá pro vás. Ale znovu, nemůžete ani vložit něco do středu pole v případě, že rychlost není zcela naplněn. Například, je-li toto pole zde o velikosti šest má pouze pět věcí v něm, No, stačí připnout něco na konec. Ale co když chcete vložit něco do středu pole, i když by to mohlo mít pět z šesti věcí v něm? No, co jsme dělali, když jsme měli všichni našich lidských dobrovolníků na pódiu v týdnů minulosti? Pokud bychom chtěli dát někoho tady, a to buď tito lidé, jak přesunout způsobem, nebo tito lidé, jak přesunout způsobem, a který se stal drahé. Přesun lidí uvnitř Pole skončil sečtením a kalkulace nám čas, a proto mnoho z našich n čtvercový doby chodu jako vložení druhu, pro instance, v nejhorším případě. Takže pole jsou skvělé, ale musíte předem vědět, jak velký chcete mít. Takže OK, tady je řešení. Pokud nemám vědět předem, kolik Studenti bych mohl mít, a vím, že jednou Rozhodl jsem se, i když, jsem uvízl s tím mnoho studentů, proč ne Vždycky jsem si přidělit dvakrát tolik místa jak jsem si myslet, budu potřebovat? Není to rozumné řešení? Realisticky, nemyslím si, že jsme bude potřebovat více než 50 sloty v poli pro střední velikostní třídy, tak ať to prostě sehnat. Udělám 100 slotů v mém poli, jen takže rozhodně můžeme získat počet studentů očekávám, že být v některých středně velké třídy. Tak proč ne jen zaokrouhlit nahoru a přidělit více paměti, obvykle na poli než si myslíte, že budete ještě potřebovat? Co je to jednoduchá pushback k tomuto nápadu? Vy jste jen ztrácíš paměť. Doslova každý program, který pak napsat je třeba používat dvakrát tolik paměti, kolik budete skutečně potřebovat. A to prostě nemá pocit, zvláště elegantní řešení. Kromě toho, je to jen snižuje pravděpodobnost problému. Pokud se vám stalo, že populární kurz jeden semestr a máte 101 studenti, váš program je stále zásadně čelí stejnému problému. Takže naštěstí, je tu řešení tento inzerát všechny naše problémy v podobě datových struktur, které jsou složitější, než ty, které jsme viděli doposud. To tvrdím, je propojený seznam. Toto je seznam čísel - 9, 17, 22, 26, a 34 - , které jsou navzájem propojeny prostřednictvím z toho, co jsem kresleny jako šipky. Jinými slovy, kdybych chtěl reprezentovat pole, jsem mohl dělat něco takového. A já dám to na stropě za chvíli. Co jsem mohl udělat - Dobrý den, v pohodě. Stand by. Nový počítač tady, jasný - v pohodě. Takže když mám tato čísla v poli - 9, 17, 22, 26, 24 - ne nutně v měřítku. Dobře, takže tady je moje pole - ach můj bože. Dobře, takže tady je moje pole. Ach můj bože. [Smích] DAVID Malan: Předstírat. Je to příliš mnoho úsilí vrátit a opravit to, takže - 26. Takže máme tuto řadu 9, 17, 22, 26, a 34. Pro ty z vás, můžete vidět chybou, jsem udělal, tady to je. Takže tvrdím, že je to velmi efektivní řešení. Jsem přidělen tolik jako ints Potřebuji - jeden, dva, tři, čtyři, pět, nebo šest - a já jsem pak uloženy na čísla Uvnitř tohoto pole. Ale předpokládám, pak chci vložit hodnota jako číslo 8? No, pokud to jde? Dejme tomu, že chcete vložit číslo jako 20. No, pokud to jde? Někde uprostřed, nebo č. 35, musí jít někde na konci. Ale já jsem všechno z vesmíru. A tak to je zásadní výzvou polí, která jsou řešení. Jsem tvrdil před chvílí, getString tento problém řeší. Pokud chcete vložit šestina číslo do tohoto pole, to, co je alespoň jedna Řešení můžete opřít o jisté, stejně jako my s getString? Co je to? No, aby to větší je snadněji řekne, než udělá. Nemůžeme nutně pole větší, ale co můžeme dělat? Vytvořte nové pole, které je větší, o velikosti 6, nebo možná velikost 10, pokud chceme dostat se před věcmi, a pak zkopírujte staré pole do nové, a pak uvolnit staré pole. Ale co je to doba chodu se tohoto procesu? Je to velký O n, protože kopírování je to bude stát nějaké jednotky čas, takže není tak ideální, pokud máme přidělit nové pole, které se děje konzumovat dvakrát tolik paměti pouze dočasně. Zkopírujte staré do nové - Myslím, že je to jen bolest hlavy, která je opět důvod, proč jsme psali GetString pro vás. Takže to, co bychom mohli dělat místo toho? No, a co když naše datová struktura ve skutečnosti má mezery v něm? Dejme tomu, že jsem si odpočinout svého cíle s souvislé kusy paměti, kde 9 se nachází přímo u 17, který je přímo u 22, a tak dále. A předpokládám, že 9 může být tady v RAM a 17 může být tady v paměti RAM, a 22 mohou být tady v RAM. Jinými slovy, nepotřebuji je i zády k sobě ještě. Jen musím nějak navléknout jehlu přes každou z těchto čísel, nebo každý z těchto uzlů, jako zavoláme obdélníky, jak jsem je nakreslil, na Vzpomínám si, jak se dostat na poslední jako uzel od té první. Takže to, co je programová konstrukce Viděli jsme docela nedávno, se kterými jsem mohou realizovat toto vlákno, nebo tažené zde se kterým mohu provedení těchto šipek? Takže ukazatele, ne? Kdybych přidělit nejen int, ale uzel - a uzel, Chci jen říct kontejneru. A vizuálně, myslím obdélník. Takže uzel zřejmě nutné obsahuje dvě hodnoty - int sám, a pak, jak vyplývá z Spodní polovina obdélníku, dostatek prostoru pro int. Takže stačí myslet dopředu zde jak velký je tento uzel, tento nádoba otázku? Kolik bajtů pro int? Pravděpodobně 4, je-li to jako obvykle. A pak, kolik bajtů pro ukazatele? 4. Takže ukažte tento obal nebo tento uzel je bude 8-byte struktury. Jo, a to je šťastná náhoda, že jsme právě představil tento pojem struct nebo konstrukce C. Takže tvrdím, že chci udělat krok k této sofistikovanější implementace seznamu čísel, na spojový seznam čísel, musím udělat trochu více přemýšlet dopředu a prohlásit nejen int, ale struct že zavolám, konvenčně zde uzel. Mohli bychom říkat, co chceme, ale uzel bude tematicky hodně z věcí, začneme hledat teď. Uvnitř tohoto uzlu je int n. A pak tato syntaxe, trochu divné na první pohled - struct node * další. No obrazově, co to je? , Že je spodní polovina obdélník, který jsme viděli před chvílí. Ale proč to říkám struct uzel * jak protilehlý k jen uzlu *? Vzhledem k tomu, že pokud ukazatel ukazuje na jiném uzlu, je to jen adresa uzlu. To je v souladu s tím, co máme diskutovali o ukazatele tak daleko. Ale proč, když tvrdím, je tato struktura tzv. uzel, musím říci, struct uzel tady uvnitř? Přesně tak. Je to jakýsi stupidní reality C. Typedef, abych tak řekl, nemá nestalo. C je super doslovný. To zní kódový vrchol na dolů, zleva doprava. A dokud nenarazí že středník na Sečteno a podtrženo, hádej co ne existovat jako datový typ? Uzel, cituji konec citátu uzel. Ale protože kompletnější prohlášení jsem na prvním řádku - typedef struct uzel - , protože to bylo dřív, než Složené závorky, to je něco jako pre-vzdělávání zvonění to, že jste Víte co, dejte mi struct tzv. struct uzel. Upřímně řečeno, nemám rád nazývat věci pravými struct uzel, uzel struct všechny po celém mém kódu. Ale budu používat jen jednou, jen uvnitř, takže mohu efektivně vytvořit jakýsi cyklický odkaz, není ukazatel na sebe sama o sobě, ale ukazatel na druhou stejného typu. Tak se ukazuje, že na datové struktury jako je toto, tam je málo operace, které by mohly být zajímat nás. Mohli bychom vložit do seznamu, jako je tento. Mohli bychom odstranit ze seznamu, jako je tato. Mohli bychom vyhledávat v seznamu pro hodnoty, nebo obecněji, traverz. A traverz je jen fantazie způsob říká začátek na levé straně a přesunout všechny úplně doprava. A upozornění, i když to o něco více sofistikované datové struktury, ať já navrhuji, abychom si půjčit některé z myšlenky v posledních dvou týdnech a implementovat funkci s názvem hledat takhle. Bude to vrátí hodnotu true nebo false, což znamená, ano, nebo no, n je v seznamu. Druhým argumentem je ukazatel na samotný seznam, aby ukazatel na uzel. Všechno, co budu do té doby dělat, je prohlásit, dočasné proměnné. Nazveme to PTR konvence, pro ukazatel. A já přiřadit je rovna na začátku seznamu. A teď si všimněte while. Tak dlouho, jak ukazatel není rovno na hodnotu null, jdu zkontrolovat. Je ukazatel šipka n rovno n, který byl schválen v roce? A čekat minutu - nový kus syntaxe. Co je šipka najednou? Jo? Přesně tak. Takže zatímco před pár minutami jsme použili tečkové notaci pro přístup k co uvnitř struct, je-li proměnná jste není struct sama o sobě, ale ukazatel na struct, naštěstí kus syntaxi, která Konečně je intuitivní smysl. Šipka znamená následovat ukazatel, jako naše šípy obvykle znamená obrazově a přejděte na Datové pole uvnitř. Takže šipka je totéž jako tečka, ale jej použít, když máte ukazatel. Tak jen shrnout pak, v případě, že pole n uvnitř struct tzv. ukazatel rovná se rovná n, vrátí hodnotu true. Jinak tento řádek zde - ukazatel rovná ukazatel další. Takže co to dělá, oznámení, je-li I V současné době ukázal na struct obsahující 9 a 9 není číslo Hledám - předpokládám, Hledám pro n se rovná 50 - Chystám se aktualizovat dočasný ukazatel nemluvě v tomto uzlu už ne, ale ukazatel šipku vedle, což bude, aby mě tady. Teď jsem si uvědomil, je vichřice úvod. Ve středu budeme vlastně dělat to s některými lidmi a některé další Kód pomalejším tempem. Ale uvědomit, budeme nyní dělat naše data složitější struktury, aby naše algoritmy mohou získat efektivnější, což bude podmínkou pro pset šest, když načteme do opět ti, 150.000 slov, ale potřebují k tomu, aby efektivně, a ideálně, vytvářet program, který běží pro naše uživatele není lineární, a to v n na druhou, ale v konstantní čas, v ideálu. Uvidíme se ve středu. SPEAKER: Na další CS50, David zapomene na své základní případ. DAVID Malan: A to je, jak posílat textové zprávy s C. Co - [VARIOUS textovou zprávu Zvuky oznámení]