DAVID Malan: Dobre, vitaj späť. Toto je CS50. To je začiatok v týždni sedem. Takže je to nejaký čas, tak som si myslel, že by som sa víchrica turné, kde sme prestali a kde sme teraz bude. Takže to, čo tu môže mať spôsobilo nejaké úzkosti na prvom mieste. Ale dúfajme, že začínaš aklimatizovať, čo to znamená tu - hviezdička predstavuje ukazovateľ, ktorý je len to, čo vo viacerých laicky povedané? Takže je to adresa. Takže je to adresa niečo v pamäti. A začali sme Zlúpnite vrstvy Pred pár týždňami, veci ako GetString a iné takéto funkcie Celú tú dobu boli návratu Adresy vecí v pamäti, ako adresa prvého znaku niektoré sekvencie. Tak sme tiež predstavil Valgrind, ktoré začnete používať tohto problému nastaviť, a to najmä pre ďalší problém nastaviť rovnako. A valgrind čo robí pre nás? Kontroluje úniky pamäte, a to kontroluje aj za zneužitie pamäti. Je možné, s určitou pravdepodobnosťou, zistiť, či Váš kód bude dotýkať pamäť že to jednoducho nemal. Takže nie nevyhnutne únik, ale ak presahujú hranice niektorých pole, a vy vlastne beží Valgrind a vyvolať takéto správanie pri valgrind beží v programe je bežiaci vo vnútri nej, dostanete správy, ako je táto - "neplatný písať veľkosť 4 ", čo pripomínajú pár týždne znamenalo, že som mal náhodou ako na jeden int príliš ďaleko za hranice poľa. A tak veľkosť 4 tu znamená veľkosť tejto konkrétnej int. Tak sa uistenia v tom, že Valgrind je výstup vo formáte tom, je jednoducho otrasné. Je to naozaj ťažké vidieť skrz neporiadok na zaujímavé informácie. Takže to, čo sme urobili tu je len ukážka niektoré z niekoľkých viac zaujímavé linky. Ale uvedomiť, že 80% je Valgrind Výstup bude trochu rozptýlenie. Stačí sa pozrieť na vzory, ako sú tieto - neplatné pravdu, neplatné čítať, 40 bajtov a určitý počet blokov sú určite stratil, kľúčové slová, ako je to. A čo budete vidieť snáď je nejaký druh stopy, akú funkciu chyba je vlastne palcov V tomto prípade je tu, v tom, čo rada môj kód bol zrejme chyba? 26 v súbore nazvanom memory.c, ktorý bol príklad sme si hrali sa v tej dobe. Takže to asi nie v malloc. To bolo pravdepodobne v mojom kóde miesto. Tak uvidíme to ešte raz a onedlho znova. Takže scanf, to prišlo až v roku pár formulárov tak ďaleko. Videli sme sscanf krátko. To bolo niečo, čo rad ste skočil do vo vašej Prípravy na kvíz. A scanf je vlastne to, čo CS50 knižnica sa používa pod kapucňa pre docela nejaký čas, aby získať vstup od užívateľa. Napríklad, keď som prejsť na CS50 Spotrebič tu, dovoľte mi otvoriť Napríklad dnes sa tomu hovorí scanf-0.c A je super jednoduché. Je to len pár riadkov kódu. Ale je to naozaj ukazuje, ako GetInt pracuje celý čas. V tomto programe tu, v súlade 16 Všimnite si, že som deklarovať int. Takže žiadne ukazovatele, nič magického tam, len int. Potom v riadku 17, som výzvu užívateľ na číslo, prosím. Potom na konci roka 18, ja používam scanf tu. A ja uvedené, niečo ako printf, že som očakával citát koniec citátu percent i. Tak aj percentá,, samozrejme, označuje int. Nevšimnúť, čo druhý argument scanf je. Ako by ste opísali druhý Argument sa po čiarke? Čo je to? Je to adresa x. Čo je výhodné preto, že tým, že scanf s adresou X, čo ktorý zmocní túto funkciu robiť? Nielen tam, ale aj to, čo? Vykonajte zmenu na neho. Vzhľadom k tomu, môžete tam ísť, je to trochu ako mapy na miesto v pamäti. A tak dlho, ako si zaistiť scanf alebo nejaká funkcia sa také mapy, že funkcie môže tam ísť, a to nielen pozrite sa na hodnotu, ale tiež to môže zmena tejto hodnoty, čo je užitočné, ak zmysel života scanf je skenovanie vstup od užívateľa, a to konkrétne z klávesnice. A f označuje formátovaný, rovnako ako printf, f označuje formátovaný reťazec, ktorý chcete vytlačiť. Takže v skratke, táto linka 18 jednoducho hovorí, snažím čítať int od užívateľa klávesnice a uložiť do x, u čo sa stane, adresa x žiť na. A potom konečne, linka 19 len hovorí, vďaka za int, v tomto prípade. Tak ma nechaj ísť ďalej a robiť to. Tak, aby scanf 0. Nechaj ma ísť dopredu a zoom palcov Pôjdem a spustiť to s bodky lomítko scanf 0. Číslo, prosím? 50. Vďaka za päťdesiat. Takže je to celkom jednoduché. Teraz, čo sa nerobí? Nie je to robí veľa z kontroly chýb. Napríklad, keď nebudem spolupracovať, a ja nemám zadanie čísla, ale Namiesto toho som napísať niečo ako "ahoj" to je proste divné. A tak jedna z vecí, CS50 Knižnica bola robí pre nás pre niektoré Čas je to, že reprompting a reprompting. Opakovanie frázy odvolanie bolo v cs50.c, a to je dôvod, prečo v GetInt knižnica CS50 je vlastne celá banda liniek dlho, pretože sme kontrola hlúpe veci, ako je tento. Vedeli užívateľ nedal us, v skutočnosti, int? Vedeli on alebo ona nám niečo ako písmeno z abecedy? Ak áno, chceme zistiť že a kričať na ne. Ale veci sa dostať oveľa zaujímavejšie V tomto ďalšom príklade. Keď idem do scanf-1.C, čo je ten vec, ktorá je zásadná zmena v Ďalší príklad? Ja používam char *, samozrejme, miesto int. Tak to je zaujímavé, pretože char *, spomínam, je naozaj len to isté ako reťazec. Takže to vyzerá, možno to je super jednoduchá realizácia getString. Ale ja som zlúpnuť vrstvu na CS50 knižnice, takže som volanie tejto char * teraz. Takže poďme sa pozrieť, kde, ak kdekoľvek, ideme zle. Riadok 17 - By som znova, prosím, daj mi niečo, V tomto prípade, reťazec. A potom na ďalšom riadku, volám scanf, znovu dávať to formátovacie kód, ale tentoraz s percent. A potom tentoraz som dávať to buffer. Teraz nevšimol, nie som s použitím ampersand. Ale prečo je to, že pravdepodobne v poriadku tu? Pretože to, čo je vyrovnávacia pamäť už? Je to už ukazovateľ. Je to už adresu. A nech je to slovo "pliesť," dovoľte mi, aby som len zavolať, že je, napríklad, pre jednoduchosť. Ale ja som to nazval preto, že v bufferi Všeobecne platí, programovanie, ak máte kus pamäti, ktorý reťazec skutočne len je, že môžete hovoriť vyrovnávacej pamäte. Je to miesto pre ukladanie informácií. Podobne ako veci, ako je YouTube, keď oni ukladanie do vyrovnávacej pamäte, tak povediac, že len znamená, že je sťahovanie kúsky od internetu a ich ukladanie v miestnej polia, miestna kus pamäti, ktoré môžete sledovať ho neskôr bez je skákanie alebo visí na môžete počas prehrávania. Takže je tu problém aj keď, pretože Hovorím scanf očakávať, reťazec od užívateľa. Tu je adresa kus pamäte. Daj to retazec. Prečo tomu tak je viazaný dať nám problémy, aj keď? Čo je to? Smiem prístup že časť pamäte? Viete, ja neviem. Pretože má vyrovnávaciu pamäť bola inicializovaná k niečomu? Nie tak celkom. A tak to, čo sme boli volaní odpadky hodnota, ktorá nie je formálne slovo. Znamená to len, že nemáme potuchy, čo bitov sú vnútri zo štyroch bajtov Som vymedzila ako vyrovnávacia pamäť. Som nezavolal malloc. Určite som nezavolal GetString. Takže kto vie, čo je vlastne vnútornej vyrovnávacej pamäte? A predsa hovorí scanf naslepo, tam a dajte, čo užívateľ napísal. Takže to, čo je pravdepodobné, že spôsobí v našom kóde, ak sa ho spustiť? Pravdepodobne segfault. Možno nie, ale asi segfault. A ja hovorím, možno nie, pretože niekedy vy, niekedy nemusíte dostať segfault. Niekedy proste šťastie, ale to však bude chyba v našom program. Tak ma nechaj ísť do toho a zostaviť to. Chystám sa to urobiť zo starej školy spôsobom. Takže zvonenie pomlčka 0, scanf-1, scanf-1.c, Enter. Jejda, príliš starej školy. Poďme sa pozrieť. Kde som ísť? Oh, char * buffer. Oh, ďakujem - Uložiť, OK - veľmi stará škola. Dobre, je to už nejaký čas. Tak som práve uložili súbor po by to dočasné zmeniť pred chvíľou. A teraz som si ju vydal ručne Clang. A teraz budem pokračovať a spustite scanf-1, Enter. String prosím. Budem písať v "ahoj". A teraz, práve tu, úprimne povedané, printf Môžete ich trochu nepríjemné. Nie je to vlastne bude segfault v tomto prípade. Printf je trochu zvláštne, pretože je to tak super, že bežne používané printf podstate robí nám láskavosť a realizácia, že to nie je platný ukazovateľ. Dovoľte mi, aby som to na seba len vytlačiť v zátvorkách null, a to aj aj keď to nie je nevyhnutne to, čo sme sami očakávali. Tak sme si to moc jednoducho vyvolať segfault s tým, ale je jasné, toto nie je správanie som chcel. Takže to, čo je jednoduché riešenie? No, scanf-2, dovoľte mi navrhnúť miesto vlastne len prideľovanie char *, nechaj ma byť trochu múdrejší to, a dovoľte mi, aby som prideliť vyrovnávacia pamäť ako postupnosť 16 znakov. Tak som si to v niekoľkých smeroch. Mohol by som absolútne použiť malloc. Ale môžem vrátiť do týždňa dvoch, kedy Len som potreboval veľa znakov. To je len polia. Takže dovoľte mi, aby som miesto predefinovať vyrovnávacej pamäti sa pole 16 znakov. A teraz, keď som sa prejsť buffer - a to je niečo, čo my nie hovoriť v týždni dve - ale môžete liečiť maticu ako keď je to adresa. Technicky vzaté, ako sme videli, sú trochu inak. Ale scanf nebude vadiť, keď si ju preniesť názov poľa, pretože to, čo Zvonenie urobí pre nás je v podstate liečbe názov tohto poľa ako adresa bloku 16 bajtov. Tak to je lepšie. To znamená, že teraz môžem snáď vykonajte nasledujúce kroky. Dovoľte mi, aby som sa vzdialite na chvíľu robiť, aby scanf-2, skompilovaný OK. Teraz mi dovoľte sa dostal lomítko scanf-2. String prosím. "Dobrý deň." A Zdalo sa, že tentoraz nevyšla. Ale môže niekto navrhnúť scenár , V ktorom sa nemusia ešte fungovať? Jo? Niečo dlhšie ako 16 znakov. A skutočne, môžeme byť trochu presnejšie. Niečo dlhší ako 15 znakov, pretože v skutočnosti musíme mať na pamäti, že musíme, že spätné lomítko nula implicitne na konci reťazca, ktorý je stranou scanf, typicky postarať sa o pre nás. Takže dovoľte mi, aby som niečo také - Niekedy sa môžeme len nechať to takto. OK, takže sme teraz vyvolané naše segmentation fault. Prečo? Pretože som napísal viac ako 15 postavy, a tak máme vlastne dotkol spomienka, že som vlastne nemal. Takže to, čo je naozaj Riešením? No, čo keď budeme potrebovať dlhší reťazec? No, možno, aby to 32 bajtov. No, a čo keď to nie je dosť dlho? Ako sa o 64 bytov? Čo keď to nie je dosť dlho? Ako asi 128 alebo 200 bajtov? Čo je naozaj riešenie tu všeobecný prípad, ak nebudeme vedieť, vopred, čo užívateľ bude písať? Je to len niečo ako veľká bolesť v zadku, Aby som bol úprimný, čo je dôvod, prečo CS50 knižnica má niekoľko desiatok riadkov kód, ktorý spoločne realizovať GetString reťazec tak, že nemáme vedieť vopred, čo užívateľ bude písať. Najmä, keď sa pozriete späť na cs50.c pred dvoma týždňami, uvidíte že GetString vlastne robí nemožno použiť scanf týmto spôsobom. Skôr to prečíta jeden znak naraz. Pretože jedna pekná vec, o čítanie jedného znaku ich môžeme zabezpečiť, aby sa vždy mať aspoň jeden char. Môžem len vyhlásiť char, a potom sa Tieto skutočne krôčiky k práve čítať jeden znak na čas z klávesnice. A potom, čo uvidíte GetString robí, je zakaždým, keď sa vyčerpá, povedzme, 16 bajtov pamäti, používa malloc alebo bratanec, po ktorom alokovať viac pamäte, kopírovanie starý pamäte do nového, a potom plazil spolu, ako jeden znak v čase, a keď sa spustí z toho kus pamäti, hodí ho, drapáky väčší kus pamäti, kopíruje starý do nových a opakuje. A je to naozaj bolesť skutočne implementovať niečo tak jednoduchého ako ako vstup od užívateľa. Takže môžete použiť scanf. Môžete použiť aj iné podobné funkcie. A veľa učebníc a on-line Príklady robiť, ale všetci sú náchylné k problémom, ako je tento. A nakoniec, ako sa segfault je docela otravné. Nie je to dobré pre užívateľa. Ale v najhoršom prípade, čo robí je zásadne dať svoj kód hrozí? Nejaký druh útoku, potenciálne. Hovorili sme o jednom takom útoku - pretekaniu stack. Ale všeobecne, ak máte povolené pretečeniu vyrovnávacej pamäte, ako my Pred pár týždňami sa len písanie viac než "ahoj" na zásobníku, budete môže skutočne prevziať, prípadne, počítače, alebo aspoň sa na údaje, ktoré nepatrí k vám. Takže v skratke, to je dôvod, prečo sme týchto koliesok. Ale teraz, začneme si ich dať dole, ako naše programy už nepotrebujete, nutne, vstup od užívateľa. Ale v prípade problému nastaviť šesť, váš vstup bude pochádzať z veľkej slovník súbor s niektorými 150 nepárne tisíc slov. Takže nebudete musieť starať o užívateľa ľubovoľný vstup. Dáme vám niektoré predpoklady o tomto súbore. Akékoľvek otázky týkajúce sa ukazovateľov alebo scanf alebo vstup užívateľa všeobecne? Dobre, takže rýchly pohľad a potom na jednom koncové téma pred dvoma týždňami. A to bol tento pojem z struct. Nie, že by - táto predstava struct, čo bolo to, čo? Čo struct urobiť pre nás? Definovať - Čože? Definovať premenné typu. Tak nejako. Sme vlastne kombináciou dvoch tém. Takže s typedef, pripomínajú, že môžeme deklarovať typ vlastné, rovnako ako synonymum ako reťazec pre char *. Ale s použitím typedef struct a môžeme vytvoriť skutočne vlastných dátových štruktúr. Napríklad, keď som sa vrátiť do gedit Tu len na chvíľu, a ja idem do toho a urobiť niečo ako, dovoľte mi, aby som ušetriť to ako, povedzme, structs.c dočasne, ja som jednoducho ísť ísť dopredu a patrí standardio.h, int main neplatné. A potom tu, predpokladám, že chcem napísať program, ktorý ukladá viac študentov z viacerých domy, napríklad. Je to ako registrarial databázy nejakého druhu. Takže keď budem potrebovať názov jedného študenta, som mohol urobiť niečo ako char * meno, a ja urobím niečo ako - skutočnosti, využime CS50 knižnicu len na chvíľu, aby sa tento trochu jednoduchšie, takže môžeme požičať tie desiatky riadkov kódu. A povedzme, aby to jednoduché. Budeme to reťazec, a teraz GetString. Takže tvrdím, teraz, keď som uložené meno nejakého študenta, a dom nejaký študent, jednoducho pomocou premenných ako my av prvom týždni. Ale čo by som chcel, aby podporovali viac študentov. Dobre, takže moja inštinkty sú k tomu string name2 dostane GetString, reťazec house2 dostane GetString. A potom naše tretie študent, poďme meno3 GetString. Dobre, takže je to snáď zarážajúce, vy ako druh hlúpy, pretože tento proces je v skutočnosti nikdy skončí, a je to len tak aby môj kód vyzerať horšie a horšie a horšie. Ale riešili sme to taky v týždni dva. Aké bolo naše relatívne čisté riešenie keď sme mali viac premenných rovnakého typu dát, ktoré sa všetky týkajú, ale Nechceli sme to tuhý neporiadok podobne pomenovaných premenných? Čo sme urobili namiesto? Takže myslím, že som počul niekoľko miest. Mali sme poľa. Ak chcete viac inštancií niečo, čo keby sme to všetko vyčistiť a len povedať, daj mi Pole s názvom mená? A teraz poďme pevný kód 3. A potom mi daj ešte rad volal domov, a dovoľte mi, aby som na teraz ťažko kód 3. A ja som masívne upratala neporiadok, ktorý som práve vytvorili. Teraz som stále pevne zakódované 3, ale aj 3 môže dynamicky pochádzajú z Užívateľ alebo argv, alebo podobne. Tak to už je čistejšie. Ale čo to nepríjemné na tom je, že Teraz, aj keď názov je akosi zásadne spojená s študenta dom - je to študent, ktorý naozaj chcú reprezentovať - Teraz mám dve polia, ktoré sú rovnobežné v tom zmysle, že sú rovnakej veľkosti a mená držiak 0 Pravdepodobne sa mapuje na domy držiaku 0, a mená držiak 1 mapy domov na držiak 1. Inými slovami, že študentské žije v ten dom, a že ostatní študenti žije v tomto druhom dome. Ale určite by to mohlo byť urobil ešte čistejšie. No, je to možné, v skutočnosti. A nechaj ma ísť dopredu a otvorte hore structs.h, a budete pozri tento nápad tu. Všimnite si, že som použil typedef, ako ste zmienil pred chvíľou deklarovať naše vlastný dátový typ. Ale ja som vždy používal túto iné kľúčové slovo tzv struct, ktorý mi dáva nový dátové štruktúry. A to dátová štruktúra Tvrdím sa deje mať dve veci vnútri to - reťazec s názvom meno a reťazec s názvom dom. A meno idem dať Táto dátová štruktúra bude byť nazývaný študentom. Mohol by som hovoriť, čo chcem, ale sémanticky, aby zmysel pre mňa, v mojej mysli. Takže teraz, keď otvorím lepšiu verziu programu som začal písať tam, dovoľte mi prejsť na začiatok. A je tu niekoľko ďalších riadkov kódu tu, ale dovoľte mi zamerať sa na v okamihu, keď na jedného. Ja som vyhlásil, konštantný zvané študentmi a pevne zakódované 3 teraz. Ale teraz, všimnite si, ako čisté môj kód začína dostať. V súlade 22 Prehlasujem, Rad študentov. A zistíte, že žiak je zrejme teraz dátový typ. Vzhľadom k tomu, v hornej časti tohto súboru, oznámenia Uviedol som, že hlavičkový súbor že som vytiahol pred chvíľou. A že hlavičkový súbor jednoducho musel táto definícia študenta. Takže teraz som vytvoril svoje vlastné údaje Typ že autori rokov C Pred nemyslel vopred. Ale žiadny problém. Môžem to urobiť sám. Tak toto je pole s názvom študenti, každý, ktorého členovia je študent štruktúru. A chcem, aby tri z nich v poli. A teraz, čo robí zvyšok tohto programu robiť? Potreboval som niečo trochu svojvoľné. Takže z on-line 24 vpred, Aj iterovat od 0 do 3. Potom som sa opýta užívateľa študenta menom. A potom som použiť getString ako predtým. Potom som požiadať o študenta domu, a používam getString ako predtým. Ale Pridelenie zmluvy - relatívne nový kus syntaxe - Stále indexu i-teho študenta, ale ako to mám dostať na konkrétnych údajov poľa vnútri struct? No, čo je zrejme nový kus syntaxe? Je to len operátor bodky. Sme naozaj videli predtým. Videli ste to v pset päť, ak ste skočil už s bitmapovými súbormi. Ale bodka znamená len vnútri tohto struct alebo viacerých polí, dať bodku názov, alebo mi dot dom. To znamená, že dovnútra na struct a dostať tie konkrétne oblasti. Čo zvyšok tohto programu urobiť? To nie je všetko, sexi. Všimnite si, že som prechádzať od 0 do 3 znova, a ja som jednoducho vytvoriť English frázy ako tak, a tak je v takej a taký dom, odovzdaním dot názov od i-tý študent a ich dom tiež. A potom konečne, teraz začneme dostať análny o tom, teraz, keď sme oboznámení s tým, čo malloc a ďalšie funkcie boli robil celú tú dobu. Prečo musím oslobodiť aj meno a dom, aj keď som nevolal malloc? GetString urobil. A to bolo malé špinavé tajomstvo pre niekoľko týždňov, ale má GetString bol únik pamäte v celej umiestniť všetky semester tak ďaleko. A konečne Valgrande ukazujú nám to. Ale nie je to veľký problém, pretože viem, že môžem jednoducho uvoľniť meno a dom, aj keď technicky, aby je super, super bezpečný, mal by som byť robiť nejaké kontroly chýb tu. Aké sú vaše inštinkty tí? Čo by som mal byť kontrola než som sa uvoľniť, čo je reťazec, ktorý aka char *? Mal som naozaj kontrolovať, či študenti držiak aj bodka názov nie rovná null. Potom to bude v poriadku ísť dopredu a zadarmo že ukazovateľ, a rovnaké alebo iné tiež jedným z nich. Ak študenti držiak aj bodka dom nie je rovný null, teraz bude chrániť o roh prípadu, v ktorom GetString vráti niečo ako null. A my sme videli pred chvíľou, printf bude chrániť nás tu len hovorím, null, ktorá bude vyzerať divne. Ale aspon to nebude segfault, ako sme videli. No, dovoľte mi urobiť jednu vec tu. struct-0 je trochu hlúpe programu pretože som zadať všetky tieto údaje, a potom je to raz stratil program končí. Ale nechajte ma ísť ďalej a robiť to. Dovoľte mi, aby som terminálu Okno trochu väčšie. Dovoľte mi, aby som Štruktúry-1, čo je nová verzia tohto. Budem priblížiť trochu. A teraz mi spustiť bodku lomítko struct-1. Meno študenta - David Mather, poďme robiť Rob Kirkland, poďme Lauren Leverett. Čo je zaujímavé, je teraz Pridelenie zmluvy - a ja len viem to, pretože Napísal som program - existuje súbor s na môj súčasný adresár s názvom students.csv. Niektorí z vás mohli vidieť nich v reálnom svete. Čo je to CSV súboru? Hodnôt oddelených čiarkou. Je to niečo ako chudobný človek je Verzia súboru programu Excel. Je to tabuľka riadkov a stĺpcov, ktoré môžete otvoriť v programe, ako je Excel, alebo čísla v počítači Mac. A keď otvorím tento súbor tu na gedit, Oznámenie o vyhlásení verejného obstarávania - a čísla tam nie sú. To je len gedit rozprávania mi čísla riadkov. Všimnite si na prvom riadku tohto Súbor je Dávid a Mather. Ďalší riadok je Rob čiarka Kirkland. A tretí riadok je Lauren čiarka Leverett. Takže to, čo som vytvoril? Ja som teraz napísal program v C, ktorý účinne môžu vytvárať tabuľky ktorý možno otvoriť v program, ako je Excel. Nie všetko, čo presvedčivý súbor dát, ale Ak máte oveľa väčšie kusy údaje, ktoré ste skutočne chcete manipulovať a robiť grafy a ako, to je asi jedna spôsob, ako vytvoriť tieto dáta. Navyše, CSVŠ sú skutočne výborný spoločné len pre ukladanie dát jednoduchých - Yahoo Finance, napríklad, ak sa dostanete Ceny akcií prostredníctvom svojich tzv API, bezplatná služba, ktorá vám umožní získať aktuálne up-to-aktuálne zásoby citácie pre podniky, ktoré aby údaje v roku Super jednoduchý formát CSV. Tak ako to urobíme? No nevšimol, väčšina z tohto programu je takmer rovnaké. Všimnime si ale tu dole, skôr než tlač Študenti von, na linke 35 dopredu, tvrdím, že šetrím študenti na disk, takže ukladaní súboru. Tak zistíte som vyhlásil súbor * - Teraz, to je druh anomálie v C. Z nejakého dôvodu je súbor všetkých čiapky, ktorý nie je ako väčšina ostatných typov dát v C. Ale to je vstavaný dátový typ, FILE *. A ja deklarovať ukazovateľ na súbor, je to, ako si môžete myslieť, že. fopen prostriedky otvoriť. Jaky súbor, ktorý chcete otvoriť? Chcem otvoriť súbor, ktorý budem ľubovoľne volať students.csv. By som mohol zavolať, že niečo chcem. A potom so hádať. Čo druhý argument na fopen asi znamená? Jasne, w pre zápis, by byť r pre čítanie. Je tu pre append, ak Chcete pridať riadky a nie prepísať celú vec. Ale ja len chcem, aby tento súbor vytvoriť raz, takže budem používať citačné koniec citátu w. A viem, že len z prečítania dokumentácie, alebo manuálové stránky. Ak súbor nie je null - inými slovami, ak sa nič nepodarilo sa - dovoľte mi, aby som iterácii Študenti 0-3. A teraz zistíte, že je niečo niekedy tak trochu inak o linka 41 tu. Nie je to printf. Je to fprintf pre súbor printf. Takže to bude zapisovať do súboru. Ktorý súbor? , Ktorej ukazovateľ zadáte ako prvý argument. Potom sme sa určiť formátovací reťazec. Potom sme sa určiť, aký reťazec chceme pripojiť na prvý percent s, a potom ďalšie premenná alebo druhý percent s Potom sme zatvorte súbor s fclose. Potom som uvoľniť pamäť ako predtým, aj keď By som sa mal vrátiť a pridať Niektoré kontroly na NULL. A je to. fopen, fprintf, fclose mi dáva schopnosť vytvárať textové súbory. Teraz uvidíte v probléme päťsto, ktorá zahŕňa obrazy, budete používať binárne súbory namiesto. Ale podstatnejšie je, že myšlienka je rovnaká, aj keď funkcie, budete sú vidieť trochu inak. Takže víchrica turné, ale budete mať príliš oboznámení so súborom I/O-- vstup a výstup - s pset päť. A prípadné otázky počiatočné základy tu? Jo? Čo keď sa pokúsite uvoľniť nulovú hodnotu? Verím, že ak sa dostal zadarmo trochu viac užívateľsky prívetivé, môžete potenciálne segfault. Absolvovanie ich null, je zlé, pretože ja nie verí zadarmo obťažuje skontrolovať, pre vás, , Pretože by mohli byť považované za odpady času na to urobiť sám pre všetci na svete. Dobrá otázka, hoci. Dobre, takže tento druh dostane nám zaujímavé tému. Téma problémového súboru päť je forenznú. Aspoň, že je to časť z problémového súbore. Forenzná všeobecne sa odkazuje na využitie informácií, ktoré môžu alebo nesmie boli odstránené zámerne. A tak som si myslel, že by som vám rýchlo chuť toho, čo sa skutočne deje na všetkých tentoraz pod kapucňa počítača. Napríklad, ak máte vo vnútri vášho notebook alebo stolný počítač, pevný disk, je to buď mechanické zariadenie, ktoré sa v skutočnosti točí - je tu kruhové veci zvanej misy ktoré vyzerajú celkom páči, čo som len mal na obrazovke tu, aj keď je to stále starej školy. Jedná sa o tri a pol palca pevný disk. A tri a pol palca odkazuje na sa na vec, keď ju nainštalovať v počítači. Mnoho z vás vo vašich notebookov teraz majú polovodičové disky alebo SSD, ktoré nemajú žiadne pohyblivé časti. Sú skôr ako RAM a menej ako táto mechanické zariadenia. Ale myšlienky sú stále rovnaké, iste, ktoré sa vzťahujú na problém nastaviť päť. A ak si myslíte, že teraz pevný disk predstavuje, že kruh, ktorý Budem kresliť ako toto. Keď vytvoríte súbor v počítači, či už je to SSD, alebo v V tomto prípade, starší školský pevný disk, tento súbor obsahuje viac bitov. Povedzme, že je to 0 a 1, celá partia 0s a 1s. Tak toto je môj celý pevný disk. To je zrejme celkom veľký súbor. A to je s použitím až 0s a 1s na to časť fyzickej tanieri. No, čo je to fyzická časť? No, ukázalo sa, že na pevnom disku, aspoň z tohto typu, že je Tieto malinké magnetické častice. A oni majú v zásade na sever a južné póly na ne, takže ak zase jeden z týchto magnetických častíc týmto spôsobom, dalo by sa povedať, že je to predstavuje 1. A či je to hore nohami na juh do sever, dalo by sa povedať, že je to predstavuje 0. Takže v skutočnom fyzickom svete, je to ako by ste mohli predstavovať niečo binárne stav 0 a 1.. Tak to je všetko, je súbor. Je tu celá partia magnetické častice, ktoré sú v ich týmto spôsobom, alebo Týmto spôsobom sa vytvára vzory na 0s a 1s. Ale to dopadá keď uložíte súbor, niektoré informácie je uložená oddelene. Takže to je stolík, adresár, aby som tak povedal. A ja budem nazývať názov stĺpca a Zavolám tomto stĺpci umiestnenia. A ja poviem, predpokladám, to je môj životopis. Môj resume.doc je uložený na umiestnenie, povedzme 123. Vždy som ísť na toto číslo. Ale stačí povedať, že rovnako ako v pamäti RAM, môžete si vziať pevný disk to je gigabyte alebo 200GB alebo terabyte a môžete počet všetkých bytov. Môžete očíslovať všetky kusy 8 bitov. Takže budeme hovoriť, že to je umiestnenie 123 |. Takže tento adresár vnútri svojho prevádzky Systém si pamätá, že moja životopis je na mieste 123. Ale to bude zaujímavé, keď Odstránenie súboru. Tak napríklad - a našťastie, väčšina sveta je chytil na to - čo sa stane, keď môžete pretiahnuť súbor do vášho Mac OS koša alebo vaše Windows Kôš? Aký je účel to docieliť? Je to samozrejme, ako sa zbaviť súboru ale čo akt pretiahnutím pád do koša alebo sa obráťte na Kôš robiť na počítači? Absolútne nič, naozaj. Je to len ako zložky. Je to špeciálna zložka, to je isté. Ale to vlastne súbor zmazať? No, nie, pretože niektorí z vás asi boli ako, oh sakra, ty nie neznamená to urobiť. Takže dvakrát kliknete Kôš alebo Kôš. Si tropil okolo a vy ste späť súbor jednoduchým pretiahnutím odtiaľ. Tak jasne, že to nie nutne odstránenie. OK, ty si múdrejší než to. Viete, že práve jeho pretiahnutím do Kôš alebo Kôš, neznamená, ste vyprázdňovania koša. Takže idete do menu a hovoríte Empty Trash alebo Vysypať kôš. Potom, čo sa stane? Jo, tak to je odstránený viac. Ale všetko, čo sa deje, je to. Počítač zabudne, kde resume.doc bolo. Ale to, čo sa nezmenila zrejme na obrázku? Bity, 0s a 1s, že tvrdím, sú na mieste nejaké fyzické aspektu hardware. Sú tam stále. Je to len má počítač zabudol, čo oni sú. Takže je to v podstate oslobodil súbore bitov tak, aby mohli byť znovu použité. Ale nie, kým vytvoriť viac súborov, a ďalšie súbory a ďalšie súbory pravdepodobnostne, ktoré 0s a 1s, tieto magnetické častice, sa znova, nahor alebo pravej strany, aby pre iné súbory, 0s a 1s. Takže máte toto okno času. A to nie je z predvídateľné dĺžka, naozaj. Záleží na veľkosti pevného pohon a koľko súborov, ktoré máte a ako rýchlo si nové. Ale je to okno, počas ktoré tento súbor je stále dokonale nenahrádzajú. Takže ak ste niekedy použiť programy ako McAfee alebo Norton pokúsiť obnoviť údaje, všetky robia sa snažia získať túto tzv adresára na zistiť, kde váš súbor je. A niekedy Norton a budú hovoriť, súbor je 93% obnoviteľná. No, čo to znamená? To jednoducho znamená, že nejaký iný súbor zhodou okolností nakoniec skončil, povedzme, tie kúsky z vášho pôvodného súboru. Takže to, čo je v skutočnosti podieľa na obnovu dát? No, ak nemáte niečo ako Norton pre-nainštalované na vašom počítači, najlepšie, čo môžete urobiť, je pozerať sa niekedy na celý pevný disk hľadá vzory bitov. A jednou z tém problémového súboru päť je, že budete hľadať ekvivalent pevného disku, forenznú Obraz Compact Flash kartu z digitálny fotoaparát, hľadá 0s a 1s, ktoré zvyčajne s vysokou Pravdepodobnosť, predstavujú začiatok JPEG obraz. A vy môžete získať tieto snímky podľa za predpokladu, keď vidím tento model bitov na forenznú obraz s vysoká pravdepodobnosť, že označí začiatok vo formáte JPEG. A keď vidím rovnaký vzorec znovu, ktoré pravdepodobne začiatkom ďalšie JPEG, a ďalšie JPEG, JPEG a ďalšie. A zvyčajne je to ako obnova dát bude fungovať. Čo je pekné o JPEG je aj napriek tomu, formát súboru je sám o sebe trochu zložité, počiatok každé také Súbor je vlastne celkom identifikovateľný a jednoduché, ako uvidíte, ak ste tak už neurobili. Takže poďme sa bližšie pozrieť pod kapucňa, aby sa presne to, čo bolo deje, a čo to 0s a 1s sú, aby vám trochu viac kontext pre tento konkrétny úlohu. [PLAYBACK] -Kde je váš počítač ukladá väčšinu jeho trvalá dáta. K tomu, že údaje cestuje z RAM spoločne so softvérovými signály, ktoré hovoria, pevný disk, ako ukladať tieto dáta. Na pevnom disku obvody prekladať tieto signály do napätia výkyvy. Títo, podľa poradia, kontrola pevného disku pohyblivé časti, niektoré z mála pohyblivé časti zostali v modernej výpočtovej. Niektoré zo signálov ovládanie motora ktoré sa točí pokovovaná taniere. Vaše dáta sú v skutočnosti uložené na týchto mís. Ostatné signály presunúť čítanie / zápis hlavy na čítanie alebo zapisovať dáta na platniach. Toto zariadenie tak presné, že človek vlasy by neprešiel ani medzi hlavy a pradenie taniere. Napriek tomu, že všetko funguje v úžasnej rýchlosti. [END PLAYBACK] DAVID Malan: mierne priblíženie teraz hlbšie na to, čo je vlastne na týchto mís. [PLAYBACK] -Poďme sa pozrieť na to, čo sme práve videl ako v spomalenom filme. Keď krátky elektrický impulz je zaslaná čítacie / zapisovacie hlavy, ak preletí na malé elektromagnetické pre zlomok sekundy. Magnet vytvára polia, ktoré zmení polarita malý, malý časť kovových častíc, ktoré Srsť každý tanier povrch. Vzor rad z nich malý, platí-up oblasti na disku predstavuje jeden bit dáta v binárnej číslo používaný systém počítača. Teraz, v prípade, že prúd je zaslaná jedným zo spôsobov cez čítacie / zapisovacie hlavy plochu je polarizované v jednom smere. V prípade, že prúd je odoslaná do opačný smer, polarizácia je obrátené. Ako získať dáta z pevného disku? Len zvrátenie procesu. Tak, že je to, že častice na disku že sa prúd v čítacie / zapisovacie hlavy v pohybe. Dajte dohromady milióny týchto zmagnetizovanej segmenty, a máte súbor. Teraz môže kusov v jednom súbore byť roztrúsené po celom disku, misy, niečo ako ten neporiadok papierov na stole. Takže Špeciálne, extra súbor udržuje o tom, kde čo je. Vari Prajete si mali niečo takéto? [END PLAYBACK] DAVID Malan: OK, pravdepodobne nie. Tak koľko z vás Vyrastal s nimi? OK, tak je to menej a menej ruky každý rok. Ale som rád, že ste aspoň oboznámení s nimi, pretože to a naše vlastné Kniha demo, bohužiaľ, umierajú veľmi pomalej smrti tu známosti. Ale to je to, čo som, aspoň v roku vysokej školy, ktorý sa používa pre zálohovanie použitie. A bolo to úžasné, pretože mohol uložiť na 1,4 MB. Tento disk. A to bola vysoká hustota prevedenie, ako je uvedené v HD, ktorý má čo znamená skôr, než dnešné HD videa. Štandardná hustota bola 800kB. A ako to, že tam bolo 400 kilobyte disky. A ako to, že tam bolo 5 a 1/4 palcové disky, ktoré boli skutočne disketa, a trochu širšie a vyššie ako tieto veci tu. Ale môžete skutočne vidieť tzv floppy aspekt z týchto diskov. A funkčne, sú v skutočnosti dosť podobné pevných diskov na Aspoň to typ. Opäť SSD v novších počítačov pracovať trochu inak. Ale ak budete pohybovať, že malý kovový výstupok, môžete skutočne vidieť malý cookie, alebo tanier. Nie je to kov, ako je tento. Toto je vlastne nejaký lacnejší plast. A môžete trochu triasť IT. A ty si suka len zotrieť niektoré počet bitov alebo magnetických častíc z tohto disku. Takže našťastie, nič na ňom. Ak to, čo je v ceste - a pokrytie vaše oči a tí svojho suseda - môžete len tak vytiahnuť to Celý plášť off takhle. Ale je to trochu jar, a tak sa si vedomý, že na vlastné oči. Takže teraz máte naozaj disketu. A čo je pozoruhodné o tom je to do tej miery, ako je to malé zastúpenie väčšie pevný disk, tieto veci sú super, Super jednoduché. Ak zovrite spodnú neho teraz, že kovová vec je preč, a kôra je otvorené, všetko tam je, je dva kusy plsti a tzv diskety s kusom kovu na vnútornej strane. A tam ide polovica môjho disku je obsah. Tam ide ďalšia polovica z nich. Ale to je všetko, čo sa točí vnútri počítače v minulosti. A opäť, aby to do súvislostí, aká veľká je najviac zo svojho pevné disky v týchto dňoch? 500 GB, terabajtových, možno počítač desktop, 2 TB, 3 TB, 4 TB, nie? To je jeden megabajt, dávať alebo brať, ktoré ani vhodný typický MP3 anymore v týchto dňoch, alebo niektoré podobné hudobný súbor. Tak trochu suvenír pre vás dnes, a tiež pomôcť súvislostí, čo budeme brať za samozrejmosť teraz v probléme päťsto. To sú len na vás, aby. Dovoľte mi teda prechod, kde bude výdavky na ďalšie pset rovnako. Takže sme sa nastaviť túto stránku - ach, pár oznámenia rýchlo. Tento piatok, ak chcete pridať CS50 na obed, ísť na obvyklom mieste, cs50.net/rsvp. A konečný projekt - takže podľa osnov, sme zaslali Záverečný projekt špecifikácia už. Uvedomujeme si, že to neznamená, je to spôsobené najmä čoskoro. Je vyslaný, naozaj, len preto, aby vy o tom premýšľať. A naozaj, super významný percento z vás bude riešiť záverečných prác na materiáli, ktorý sme sa ani nedostal na v triede, ale bude už budúci týždeň. Všimnite si však, že spec vyžaduje niekoľko rôznych zložiek záverečný projekt. Prvý z nich, v priebehu niekoľkých týždňov, je pre-návrh, celkom neformálne email Váš TF mu povedať, alebo to, čo ste premýšľať o tom, pre svoj projekt, s žiadny záväzok. Návrh bude váš konkrétny záväzok, povedal, tu je to, čo Chcel by som urobiť pre môj projekt. Čo si myslíte? Príliš veľké? Príliš malý? Je to zvládnuteľné? A vidíte, spec pre viac informácií. Pár týždňov po tom, čo je stav Správa, ktorá je podobne neformálne e-mail k vášmu TF povedať, ako pozadu ste v poslednom realizácie projektu, po ktorom nasleduje CS50 hackathon, ktoré každý je pozvaný, ktorá bude udalosť od 20:00 Na jeden večer až do 07:00 AM budúci ráno. Pizza, ako som mohla uvedené v týždni nula, bude Wil podáva v 21:00, Čínske jedlo v 01:00. A ak ste ešte hore v 05:00, Vezmeme vás na IHOP na raňajky. Takže hackathon je jeden z viacerých nezabudnuteľné zážitky v triede. Potom prevedenie, čo sa prejavuje aj potom vrcholný CS50 veľtrhu. Viac informácií o všetkých týchto v najbližších týždňoch. Ale vráťme sa k niečomu old school - opäť, polia. Takže pole bolo pekné, pretože rieši problémy, ako sme videli len Pred chvíľou sa študentskými štruktúr ako sa trochu vymkla kontrole, keby sme chcete mať študent, jeden, študent, dva Študent tri, študent dot dot dot, niektoré ľubovoľný počet študentov. Takže poľa, pred niekoľkými týždňami, Priletel a vyriešiť všetky naše problémy, že nie vie vopred, koľko vecí niektorých typov by sme mohli chcieť. A my sme videli, že struct nám môže pomôcť ďalej organizovať náš kód a udržať koncepčne podobných premenných, ako je meno a dom, dohromady, aby sa Môžete s nimi zaobchádzať ako s jedným subjektom, vnútorné z ktorých sú menšie kúsky. Ale polia majú niektoré nevýhody. Aké sú niektoré nevýhody sme sa stretli s poľami tak ďaleko? Čo je to? Pevná veľkosť - takže aj keď si možno možné prideliť pamäť pre poľa, až budete vedieť, koľko študentov máte, koľko znakov máte od užívateľa, akonáhle ste pridelené pole, ste trochu maľoval si do kúta. Pretože nemôžete vložiť nové prvky do stredu poľa. Nemôžete vložiť viac prvkov na konci poľa. Naozaj, musíte sa uchýliť k vytvoreniu úplne nové pole, ako sme diskutovali, kopírovanie starého do nového. A opäť, že je bolesť hlavy, ktorá GetString sa zaoberá pre vás. Ale na druhú stranu, môžete si dokonca ani vložiť niečo do stredu poľa v prípade, že rýchlosť nie je celkom naplnený. Napríklad, ak je toto pole tu o veľkosti šesť má iba päť vecí v ňom, No, stačí pripnúť niečo na koniec. Ale čo keď chcete vložiť niečo do stredu pole, aj keď by to mohlo mať päť zo šiestich vecí v ňom? No, čo sme robili, keď sme mali všetci našich ľudských dobrovoľníkov na pódiu v týždňov minulosti? Ak by sme chceli dať niekoho tu, a to buď títo ľudia, ako presunúť spôsobom, alebo títo ľudia, ako presunúť spôsobom, a ktorý sa stal drahé. Presun ľudí vnútri Polia skončil sčítaním a kalkulácie nám čas, a preto mnoho z našich n štvorcový doby chodu ako vloženie druhu, pre inštancie, v najhoršom veci. Takže polia sú skvelé, ale musíte vopred vedieť, aký veľký chcete mať. Takže OK, tu je riešením. Ak nemám vedieť vopred, koľko Študenti by som mohol mať, a viem, že raz Rozhodol som sa, aj keď, som uviazol s tým mnoho študentov, prečo nie Vždy som si prideliť dvakrát toľko miesta ako som si myslieť, budem potrebovať? Nie je to rozumné riešenie? Realisticky, nemyslím si, že sme budete potrebovať viac než 50 sloty v poli pre strednej veľkostnej triedy, tak nech to jednoducho zohnať. Urobím 100 slotov v mojom poli, len takže rozhodne môžeme získať počet študentov očakávam, že byť v niektorých stredne veľké triedy. Tak prečo nie len zaokrúhliť nahor a prideliť viac pamäte, zvyčajne na poli než si myslíte, že budete ešte potrebovať? Čo je to jednoduchá pushback k tomuto nápadu? Vy ste len strácaš pamäť. Doslova každý program, ktorý potom napísať je potrebné používať dvakrát toľko pamäte, koľko budete skutočne potrebovať. A to jednoducho nemá pocit, obzvlášť elegantné riešenie. Okrem toho, že znižuje len pravdepodobnosť problému. Ak sa vám stalo, populárny kurz jeden semester a máte 101 študentov, váš program je čoraz zásadne čelí rovnakému problému. Takže našťastie, je tu riešenie tento inzerát všetky naše problémy v podobe dátových štruktúr, ktoré sú zložitejšie, než tie, ktoré sme videli doteraz. To tvrdím, je prepojený zoznam. Toto je zoznam čísel - 9, 17, 22, 26, a 34 - , Ktoré sú navzájom prepojené prostredníctvom z toho, čo som kresleny ako šípky. Inými slovami, keby som chcel reprezentovať pole, som mohol robiť niečo také. A ja dám to na strope za chvíľu. Čo som mohol urobiť - Dobrý deň, v pohode. Vydržte. Nový počítač tu, jasný - v pohode. Takže keď mám tieto čísla v poli - 9, 17, 22, 26, 24 - nie nevyhnutne v mierke. Dobre, takže tu je moja poľa - ach môj bože. Dobre, takže tu je moje pole. Ach môj bože. [Smiech] DAVID Malan: Predstierať. Je to príliš veľa úsilia vrátiť a opraviť to, takže - 26. Takže máme túto sériu 9, 17, 22, 26, a 34. Pre tých z vás, môžete vidieť chybou, som urobil, tu to je. Takže tvrdím, že je to veľmi efektívne riešenie. Som rozdelila mnohých ints ako Potrebujem - jeden, dva, tri, štyri, päť, alebo šesť - a ja som potom uložené na čísla Vnútri tohto poľa. Ale predpokladám, potom chcem vložiť hodnota ako číslo 8? No, ak to ide? Dajme tomu, že chcete vložiť číslo ako 20. No, ak to ide? Niekde uprostred, alebo č 35, musí ísť niekde na konci. Ale ja som všetko z vesmíru. A tak to je zásadnou výzvou polí, ktoré sú riešenie. Som tvrdil pred chvíľou, getString tento problém rieši. Ak chcete vložiť šestina číslo do tohto poľa, to, čo je aspoň jedna Riešenie môžete oprieť o isté, rovnako ako my s getString? Čo je to? No, aby to väčšia je ľahšie povie, ako urobí. Nemôžeme nutne polia väčšie, ale čo môžeme robiť? Vytvorte nové pole, ktoré je väčšie, o veľkosti 6, alebo možná veľkosť 10, ak chceme dostať so pred vecami, potom skopírujte staré poľa do novej, a potom uvoľniť staré poľa. Ale čo je to doba chodu sa tohto procese? Je to veľký O n, pretože kopírovanie je to bude stáť nejaké jednotky čas, takže nie je tak ideálny, ak máme prideliť nové pole, ktoré sa deje konzumovať dvakrát toľko pamäte iba dočasne. Skopírujte starej do novej - Myslím, že je to len bolesť hlavy, ktorá je opäť dôvod, prečo sme písali GetString pre vás. Takže to, čo by sme mohli robiť namiesto toho? No, a čo keď naše dátová štruktúra v skutočnosti má medzery v ňom? Dajme tomu, že som si oddýchnuť svojho cieľa s súvislé kusy pamäti, kde 9 sa nachádza priamo pri 17, ktorý je priamo pri 22, a tak ďalej. A predpokladám, že 9 môže byť tu v RAM a 17 môže byť tu v pamäti RAM, a 22 môže byť tu v RAM. Inými slovami, nepotrebujem je aj chrbtom k sebe ešte. Len musím nejako navliecť ihlu cez každú z týchto čísel, alebo každý z týchto uzlov, ako zavoláme obdĺžniky, ako som ich nakreslil, na Spomínam si, ako sa dostať na poslednú ako uzol z prvej. Takže to, čo je programová konštrukcia Videli sme celkom nedávno, s ktorými som môžu realizovať toto vlákno, alebo ťahané tu, s ktorými môžem vykonanie týchto šípok? Takže ukazovatele, nie? Keby som prideliť nielen int, ale uzol - a uzol, Chcem len povedať kontajnera. A vizuálne, myslím obdĺžnik. Takže uzol zrejme nutné obsahuje dve hodnoty - int sám, potom, ako vyplýva z Spodná polovica obdĺžnika, dostatok priestoru pre int. Takže stačí myslieť dopredu tu aký veľký je tento uzol, tento nádoba otázku? Koľko bajtov pre int? Pravdepodobne 4, ak je to ako obvykle. A potom, koľko bajtov pre ukazovatele? 4. Takže ukážte tento obal alebo tento uzol je bude 8-byte štruktúry. Jo, a to je šťastná náhoda, že sme práve predstavil tento pojem struct alebo konštrukcie C. Takže tvrdím, že chcem urobiť krok k tejto sofistikovanejšie implementácie zoznamu čísiel, na spájať zoznam čísel, musím urobiť trochu viac premýšľať dopredu a vyhlásiť nielen int, ale struct že zavolám, konvenčne tu uzol. Mohli by sme hovoriť, čo chceme, ale uzol bude tematicky veľa z vecí, začneme hľadať teraz. Vnútri tohto uzla je int n A potom táto syntaxe, trochu divné na prvý pohľad - struct node * ďalšie. No obrazovo, čo to je? , Že je spodná polovica obdĺžnik, ktorý sme videli pred chvíľou. Ale prečo to hovorím struct uzol * ako protiľahlý k len uzla *? Vzhľadom k tomu, že ak ukazovateľ ukazuje na inom uzle, je to len adresa uzla. To je v súlade s tým, čo máme diskutovali o ukazovatele tak ďaleko. Ale prečo, keď tvrdím, je táto štruktúra tzv uzol, musím povedať, struct uzol tu vnútri? Presne tak. Je to akýsi stupídny reality C. Typedef, aby som tak povedal, nemá nestalo. C je super doslovný. To znie kódový vrchol na nadol, zľava doprava. A kým nenarazí, že bodkočiarku na Sčítané a podčiarknuté, hádaj čo nie existovať ako dátový typ? Uzol, citujem koniec citátu uzol. Ale pretože kompletnejší vyhlásenie som na prvom riadku - typedef struct uzol - , Pretože to bolo skôr, než Zložené zátvorky, to je niečo ako pre-vzdelávanie zvonenie to, že ste Viete čo, dajte mi struct tzv struct uzol. Úprimne povedané, nemám rád nazývať veci pravými struct uzol, uzol struct všetky po celom mojom kóde. Ale budem používať len raz, len vo vnútri, takže môžem efektívne vytvoriť akýsi cyklický odkaz, nie je ukazovateľ na seba sama o sebe, ale ukazovateľ na druhú rovnakého typu. Tak sa ukazuje, že na dátové štruktúry ako je toto, tam je málo operácie, ktoré by mohli byť zaujímať nás. Mohli by sme vložiť do zoznamu, ako je tento. Mohli by sme odstrániť zo zoznamu, ako je táto. Mohli by sme vyhľadávať v zozname pre hodnoty, alebo všeobecnejšie, traverz. A traverz je len fantázia spôsob hovorí začiatok na ľavej strane a presunúť všetky úplne doprava. A upozornenie, aj keď to o niečo viac sofistikované dátové štruktúry, nech ja navrhujem, aby sme si požičať niektoré z myšlienky v posledných dvoch týždňoch a implementovať funkciu s názvom hľadať takhle. Bude to vráti hodnotu true alebo false, čo znamená, áno, alebo no, n je v zozname. Druhým argumentom je ukazovateľ na samotný zoznam, aby ukazovateľ na uzol. Všetko, čo budem dovtedy robiť, je vyhlásiť, dočasné premenné. Nazveme to PTR konvencie, pre ukazovateľ. A ja priradiť je rovná na začiatku zoznamu. A teraz si všimnite while. Tak dlho, kým nie je ukazovateľ rovný na hodnotu null, idem skontrolovať. Je ukazovateľ šípka n rovné n, ktorý bol schválený v roku? A čakať minútu - nový kus syntaxe. Čo je šípka naraz? Jo? Presne tak. Takže zatiaľ čo pred pár minútami sme použili tečkové notáciu pre prístup k čo vnútri struct, v prípade, že premenná ste nie struct sama o sebe, ale ukazovateľ na struct, našťastie kus syntax, ktorá Konečne je intuitívne zmysel. Šípka znamená nasledovať ukazovateľ, ako naše šípy zvyčajne znamená obrazovo a prejdite na Dátové pole vnútri. Takže šípka je to isté ako bodka, ale ho použiť, keď máte ukazovateľ. Tak len zhrnúť potom, v prípade, že pole n vnútri struct tzv ukazovateľ rovná sa rovná n, vráti hodnotu true. Inak tento riadok tu - ukazovateľ rovná ukazovateľ ďalšie. Takže čo to robí, oznámenia, ak je I V súčasnej dobe ukázal na struct obsahujúci 9 a 9 nie je číslo Hľadám - predpokladám, Hľadám pre n sa rovná 50 - Chystám sa aktualizovať dočasný ukazovateľ nehovoriac v tomto uzle už nie, ale ukazovateľ šípku vedľa, čo bude, aby ma tu. Teraz som si uvedomil, je víchrica úvod. V stredu budeme vlastne robiť to s niektorými ľuďmi a niektoré ďalšie Kód pomalším tempom. Ale uvedomiť, budeme teraz robiť naše dáta zložitejšie štruktúry, aby naše algoritmy môžu získať efektívnejšie, čo bude podmienkou pre pset šesť, keď načítame do opäť tí, 150.000 slov, ale je potrebné k tomu, aby efektívne, a ideálne, vytvárať program, ktorý beží pre našich užívateľov nie je lineárne, a to v n na druhú, ale v konštantný čas, v ideálu. Uvidíme sa v stredu. SPEAKER: Na ďalší CS50, David zabudne na svoje základné prípad. DAVID Malan: A to je, ako posielať textové správy s C. Co - [VARIOUS textovú správu Zvuky oznámení]