Davidas Malan: Gerai, pasveikinti atgal. Tai CS50. Tai savaitės septynių pradžia. Taigi tai buvo, o, taigi aš maniau, mes norime imtis viesulu kelionė, kurioje mes baigiau ir kur mes dabar vyksta. Taigi tai, ką čia gali turėti sukėlė baimės ne pirmas. Bet tikiuosi, jūs pradeda Aklimatizuojama ką tai reiškia čia - žvaigždučių atstovaujanti rodyklę, kuri yra ką, daugiau profanas sąlygomis? Taigi tai adresas. Taigi tai adresas kažkas atmintyje. Ir mes pradėjome Nulupkite sluoksnių Prieš porą savaičių, viskas patinka GetString ir kitas funkcijas, visą tą laiką nebuvo grąžinti adresai dalykų atminties, pavyzdžiui, adresas pirmos ženklu kai seka. Taigi mes taip pat pristatė Valgrind, kuris jūs pradėsite naudoti šią problemą nustatyti, ypač Kitas problema nustatyti, taip pat. Ir Valgrind ką daro už mus? Ji tikrina, Atminties nutekėjimas, ir tai taip pat tikrina, įžeidžiantį turinį atminties. Jis gali su tam tikra tikimybe, nustatyti, ar Jūsų kodas ketina paliesti atmintį kad jis tiesiog neturėtų. Taigi nebūtinai nutekėjimą, bet jei peržengti kai ribų masyvas, ir jūs iš tikrųjų paleisti Comment ir paskatinti tą elgesį, o Valgrind veikia jūsų programa yra veikia viduje ji, gausite žinutės kaip ši - "negalioja rašyti apie dydis 4 ", kuris, prisiminti porą savaites reiškė, kad aš netyčia kaip viena int per toli už masyvo ribų. Ir taip 4 dydžio tai čia dydį tos konkrečios int. Taigi imtis nuraminti tuo, kad Comment išvestis, jo formatą, yra tik žiaurus. Tai tikrai sunku pamatyti per netvarka už įdomią informaciją. Taigi, ką mes padarėme čia yra tik fragmentas kai daugiau pora įdomių linijų. Bet suprasti, kad 80% Valgrind ųjų produkcija bus iš šiek tiek išsiblaškymas. Tiesiog pažiūrėkite modelius, kaip šie - negalioja teisė, negaliojančių skaityti, 40 baitų ir kai kurie iš blokų skaičius yra tikrai prarastas, raktiniai žodžiai, pavyzdžiui, kad. Ir ką jūs tikiuosi pamatyti yra keletas rūšies pėdsako ką veikti klaida yra iš tikrųjų in Šiuo atveju čia, kokia linija mano kodas buvo klaida matyt? 26 į failą pavadinimu memory.c, kuris buvo Pavyzdžiui žaidėme su tuo metu. Taigi, tai tikriausiai ne malloc. Tai tikriausiai buvo mano kodas vietoj. Taigi, mes pamatysime dar kartą ir vėl netrukus. Taigi scanf, tai atėjo į pora formų iki šiol. Mes matėme sscanf trumpai. Tai buvo kažkas skaičius jūs nėrė į į jūsų pasirengimas viktorinoje. Ir Scanf iš tikrųjų ką CS50 biblioteka manimi naudoju po dangtis gana ilgą užsakymo metu gauti informacijos iš vartotojo. Pavyzdžiui, jei aš pereiti į CS50 Prietaisas čia, leiskite man atverti pavyzdys, kad šiandien vadinama Scanf-0.c Ir tai super paprasta. Tai tik keletas eilučių kodo. Bet tai rodo, tikrai, kaip getInt dirbo visą šį laiką. Šioje programoje Čia, atitinka 16 , Pranešimas, kad aš pareiškiu, int. Taigi, jokių patarimų, nieko stebuklingo ten, tik int. Tada 17 eilutės, aš greitai vartotojas už numerį, prašome. Tada pabaigoje 18, aš naudoju scanf čia. Ir aš nenurodyta, lyg printf, kad aš laukiu citata Unquote proc i. Taigi proc i, žinoma, reiškia int. Tačiau pastebėti, kas antra argumentas scanf yra. Kaip Jūs apibūdintumėte antra argumentas po kablelio? Kas tai? Tai iš x adresą. Taigi tai yra naudinga, nes teikiant Scanf su x adresą, ką kad suteikti šią funkciją daryti? Ne tik ten, bet ką daryti? Padaryti pakeisti jį. Kadangi jūs galite eiti ten, tai tarsi kaip žemėlapį į A ATMINTIES VIETA. Ir taip ilgai, kaip jūs pateikiate Scanf arba bet su tokia struktūra, kad funkcija funkcija gali eiti ten, ir ne tik pažvelgti į vertę, tačiau ji taip pat gali pakeisti tą vertę, kuri yra naudinga, jei gyvenimu scanf tikslas nuskaityti informacijos iš vartotojo, ypač iš klaviatūros. Ir f žymi suformatuotas, kaip printf, f reiškia formatuotas eilutę, kurią norite spausdinti. Taigi trumpai tariant, ši eilutė 18 tiesiog sako, bandyti skaityti iš vartotojo int klaviatūra ir laikyti jį viduje x, ne kokia adresas x atsitinka gyventi. Ir tada galiausiai linija 19 tiesiog sako, Ačiū už int, šiuo atveju. Taigi leiskite man eiti į priekį ir padaryti tai. Taigi, kad scanf 0. Leiskite man eiti į priekį ir priartinti Aš eisiu ir paleisti tai su taškų velniop scanf 0. Skaičius, prašau? 50. Ačiū už 50. Taigi, tai gana paprasta. Dabar ko jis nedaro? Tai ne daro visa krūva Klaidų tikrinimo. Pavyzdžiui, jei aš neturiu bendradarbiauti, ir nemanau, įveskite skaičių, bet o aš rašau kažką panašaus į "Labas" tai tiesiog rūšies keista. Ir taip vienas iš dalykų, CS50 biblioteka buvo padaryti mums kai laikas yra tai, kad reprompting ir reprompting. Bandykite dar kartą prisiminti mane buvo cs50.c, ir tai yra priežastis, kad getInt į CS50 biblioteka yra iš tikrųjų visa krūva linijų ilgio, nes mes tikrinant kvailas stuff like this. Ar vartotojas neduoda mums, tiesą sakant, int? Ar jis ar ji mums kažką kaip abėcėlės raide? Jei taip, mes norime nustatyti kad ir klykauti į juos. Bet viskas gauti daugiau įdomių Šiame Kitame pavyzdyje. Jei aš einu į Scanf-1.c, kas yra vienas dalykas, kad iš esmės pasikeitė tai kitą pavyzdys? Aš naudoju char *, žinoma, vietoj int. Taigi tai yra įdomi, nes char * pamenu, yra tikrai tik tas pats, kaip eilutę. Taigi ji mano, kaip gal tai super paprasta įgyvendinti GetString. Bet aš nulupus sluoksnį iš CS50 bibliotekoje, todėl aš raginama šį char * dabar. Taigi pažiūrėkime, kur, jei bet kur, mes suklysti. Line 17 - Aš dar kartą sakau, prašom duoti man ką nors, šiuo atveju eilutė. Ir tada į kitą eilutę, aš vadinu scanf, vėl, suteikiant jai formato kodą, bet šį kartą proc s. Ir tada šį kartą, aš suteikiant jai buferio. Dabar pastebėsite, aš ne naudojant ampersendas. Bet kodėl tai, kad tikriausiai Gerai čia? Nes tai, kas yra buferis jau? Tai jau rodyklę. Tai jau adresą. Ir tegul šis žodis "suklaidinti", leiskite man tiesiog paskambinkite ji s, pavyzdžiui, už paprastumas. Bet aš jį pavadino buferio, nes Apskritai, programavimo, jei turite riekė atmintis, kuri eilutė tikrai tiesiog yra, galite ją vadina buferio. Tai vieta, kurioje saugoma informacija. Panašus į dalykų, pavyzdžiui, "YouTube", kai jie buferio, todėl kalbėti, kad tiesiog reiškia tai atsisiųsti bitai nuo interneto ir saugoti juos vietos masyvas, vietos riekė atmintis taip kad jūs galite žiūrėti jį vėliau be tai praleidžiant arba kabinti ant jūs žaisdami atgal. Taigi, čia yra problema čia, nors, nes sakau scanf, tikėtis eilutė iš vartotojo. Štai adresas atminties riekė. Padėk eilutę ten. Kodėl tai jungiasi suteikti mums problemų, nors? Kas tai? Aš leidžiama naudotis kad atminties dalis? Žinai, aš nežinau. Kadangi buvo buferis buvo inicijuoti nieko? Tikrai ne. Ir todėl, ką mes buvo raginama šiukšlių vertė, kuri nėra formalus žodis. Tai tik reiškia, kad mes ne idėja, ką bitai viduje iš keturių baitų Aš paskirstomos buferio. Aš ne vadinamas malloc. Aš tikrai ne vadinamas GetString. Taigi, kas žino, kas yra iš tikrųjų viduje buferio? Ir dar sakau scanf aklai ten ir įdėti ką vartotojas turi įvesti. Taigi, kas gali sukelti mūsų kodekse, jeigu mes paleisti jį? Tikriausiai segfault. Gal ir ne, bet tikriausiai segfault. Ir aš sakau, o gal ir ne, nes kartais jūs, kartais jums nereikia gauti segfault. Kartais jūs tiesiog gauti pasisekė, bet tai vis dėlto bus mūsų programoje klaida. Taigi leiskite man eiti į priekį ir kaupti tai. Aš ruošiuosi tai padaryti senosios mokyklos būdas. Taigi Zaszczękać brūkšnys 0, Scanf-1, Scanf-1.c, Enter. Oi, per senas mokykla. Pažiūrėkime. Kur aš einu? O, char * buferis. O, ačiū - Išsaugoti Gerai - labai sena mokykla. Gerai, tai buvo o. Taigi, aš tiesiog išsaugoti failą po todėl, kad laikinas pakeisti šiuo metu senumo. Ir dabar aš turiu surinkti jį rankiniu būdu žvangėjimas. Ir dabar aš ruošiuosi eiti į priekį ir paleisti Scanf-1, Enter. Styginių prašom. Aš tipo "labas". Ir dabar, štai, kur, tiesą sakant, printf gali šiek tiek erzina. Tai nėra iš tikrųjų ketina segfault šiuo atveju. Printf yra šiek tiek ypatingas, nes tai taip super paprastai naudojami, kad iš esmės printf daro mums pritaria ir supranta, tai ne galioja rodyklę. Leiskite jį į save tiesiog atspausdinti iš skliausteliuose null, net nors tai nebūtinai tai, kas mes patys tikėtasi. Taigi, mes galime tikrai ne lengvai sukelti segfault su šia, bet aiškiai tai nėra elgesys norėjau. Taigi, kas yra paprastas sprendimas? Na, Scanf-2, leiskite man pasiūlyti, kad vietoj tikrųjų tik paskirstant char *, leiskite man būti šiek tiek protingesni apie tai, ir leiskite man skirti buferio kaip 16 simbolių seką. Taigi aš galiu tai padaryti įvairiais būdais pora. Galėčiau absoliučiai naudoti malloc. Bet aš galiu grįžti į savaitę du, kai Aš tiesiog reikia visa krūva simbolių. Tai tik matrica. Taigi leiskite man vietoj naujo buferio būti 16 simbolių masyvas. Ir dabar, kai galiu perduoti buferio - ir tai yra kažkas, mes ne kalbėti apie savaitę dvi - , bet jūs galite gydyti masyvą kaip nors tai adresas. Techniškai, kaip mes matėme, jie šiek tiek skiriasi. Bet Scanf bus ne tai, jei perduoti jį masyvo vardas, nes tai, ką Zaszczękać darys mums iš esmės gydyti masyvo, pavadinimą, kaip adresas su 16 baitų riekė. Taigi tai yra geriau. Tai reiškia, kad dabar galiu tikiuosi atlikite šiuos veiksmus. Leiskite nutolinti for a moment, ir padarysiu Scanf-2, rengiami Gerai. Dabar leiskite man nereikia turite velniop Scanf-2. Styginių prašom. "Labas". Ir tai atrodė, kad darbas šiuo metu. Bet ar gali kas nors pasiūlyti scenarijų , kurioje ji gali dar dirbti? Taip? Kažkas ilgesnis nei 16 simbolių. Ir iš tikrųjų, mes galime būti šiek tiek tiksliau. Kažkas ilgiau nei 15 simbolių, nes tikrai turime nepamiršti, kad mes turime tą Atgal nerijos velniop nulio netiesiogiai ne eilutės pabaigoje, kuris yra panaikinti Scanf paprastai rūpintis mums. Taigi leiskite man padaryti kažką panašaus - kartais mes galime tik palikti jį panašaus. Gerai, kad dabar mes sukeltas mūsų segmentavimo kaltės. Kodėl? Nes aš įvedėte daugiau nei 15 ženklai, ir todėl mes iš tikrųjų palietė atminties, kad aš iš tikrųjų neturėtų turėti. Taigi, kas iš tikrųjų sprendimas čia? Na, ką daryti, jei mes turime ilgesnį eilutę? Na, mes gal padaryti 32 baitų. Na, ką daryti, jei tai nėra pakankamai ilgas? Kaip apie 64 baitų? Ką daryti, jei tai nėra pakankamai ilgas? Kaip apie 128 arba 200 baitų? Kas iš tikrųjų yra sprendimas čia bendruoju atveju, jei mes neturime žinoti iš anksto, ką vartotojas ketina įvesti? Tai tiesiog rūšies didelis skausmas Oslas, būti sąžiningas, todėl CS50 biblioteka turi keletą dešimčių eilučių kodas, kuris bendrai įgyvendinti GetString eilutę taip, kad darome ne turi iš anksto žinoti, kas vartotojas ketina įvesti. Visų pirma, jei pažvelgti atgal cs50.c iš prieš dvi savaites, pamatysite kad GetString tiesų nenaudokite scanf tokiu būdu. Greičiau, jis nuskaito vieną simbolį metu. Kadangi vienas malonus dalykas, apie skaityti vieną simbolį yra mes galime garantuoti sau visada turėti bent vieną char. Galiu tiesiog paskelbti char, o tada imtis šie tikrai kūdikių žingsniai tik skaityti vieną simbolį ne laikas nuo klaviatūros. Ir tada, ką jūs pamatysite GetString ar yra kas kartą, kai jis baigsis, tarkim, 16 baitų atminties, ji naudoja malloc, ar pusbrolis dalį, į paskirstyti daugiau atminties, kopijavimo metai Atminties į naują, o tada nuskaityti kartu, gauti vieną simbolį vienu metu, ir kai jis baigsis, kad riekė atminties, meta jį šalin, griebtuvai didesnė riekė atminties, kopijuoja metai į naujas ir kartojasi. Ir tai tikrai skausmas iš tikrųjų įgyvendinti kažką taip paprasta, kaip gauti įvestis iš vartotojo. Todėl jūs galite naudoti scanf. Jūs galite naudoti kitas panašias funkcijas. Ir vadovėlių daug ir internete pavyzdžiai daryti, bet jie visi pažeidžiami problemas, kaip šis. Ir galiausiai, vis segfault rūšies erzina. Tai nėra gerai vartotojui. Tačiau blogiausiu atveju, ką jis iš esmės ĮDĖK kodas gresia? Kai atakos rūšis, potencialiai. Mes kalbėjome apie vieną tokį išpuolį - perpildyta kamino. Bet apskritai, jei jums leidžiama perpildymo buferis, kaip darėme pora savaičių atgal, o tik raštu daugiau nei "labas" ant kamino, jūs iš tiesų gali perimti potencialiai kompiuteris, arba bent jau gauti į duomenų, kurie nepriklauso jums. Taigi trumpai tariant, tai kodėl mes turime šių mokymo ratai. Bet dabar, mes pradėsime į juos išjungti, kaip mūsų programos nebereikia, nebūtinai, įėjimas iš vartotojo. Bet iš problemos atveju nustatyti šeši, Jūsų indėlis bus iš didžiulis žodynas failą su 150 kai keista tūkstančio žodžių. Taigi, jūs neturite jaudintis naudotojo savavališkai įėjimas. Mes suteiksime jums keletą prielaidų apie tą failą. Bet apie tai rodykles arba scanf klausimai arba naudotojo įvesties apskritai? Gerai, kad greitai pažvelgti tada vienu gale temą nuo prieš dvi savaites. Ir tai buvo tai iš struct sąvoka. Ne todėl, kad - tai sąvoka struct, kuris buvo ką? Ką konstrukto daryti mums? Nustatykite - atsiprašau? Nustatykite kintamojo tipą. Taigi rūšiuoti. Mes iš tikrųjų sujungus dvi temas. Taigi su Typedef, priminti, kad galime paskelbti mūsų pačių rūšį, pavyzdžiui, sinonimas, kaip eilutę char *. Tačiau naudojant Typedef ir struct, mes galime sukurti tikrai mūsų pačių duomenų struktūras. Pavyzdžiui, jei aš einu atgal į gedit čia tik akimirką, ir aš eiti į priekį ir padaryti kažką panašaus, leiskite man išsaugoti tai kaip, tarkim, structs.c laikinai, aš tik ketina eiti į priekį ir yra standardio.h, int main negalioja. Ir tada čia, tarkime, kad aš noriu parašyti programą, kuri saugo daug studentų iš daugelio namai, pavyzdžiui. Taigi tai tarsi registrarial duomenų bazė kai rūšiuoti. Taigi, jei man reikia vardo vienas studentas, aš galėtų padaryti kažką panašaus char * Vardas, ir aš padaryti kažką panašaus - iš tikrųjų, galime naudoti CS50 biblioteką tik akimirką, kad šis šiek tiek paprastesnis, todėl mes galime skolintis tie eilučių kodo dešimtys. Ir tegul tiesiog laikyti jį paprasta. Mes laikyti jį seka, ir dabar GetString. Taigi galiu reikalauti dabar, kad aš saugomas pavadinimas kai kurių studentų, ir namai kai studentas, tiesiog naudojant kintamuosius kaip tai darėme ir vieną savaitę. Bet manau, kad aš dabar norite paremti keli studentai. Gerai, kad mano instinktai yra padaryti styginių name2, gauna GetString, styginių house2 gauna GetString. Ir tada mūsų trečias studentas, darykime NAME3 GetString. Gerai, kad tai tikiuosi, ryškus jūs, kaip rūšies kvailas, nes šis procesas yra tikrai niekada baigsis, ir tik ketina kad mano kodas atrodo blogiau ir dar blogiau ir blogiau. Bet mes išspręsta ši per pirmąją savaitę du. Kas buvo mūsų gana švarus tirpalas kai mes turėjome kelis kintamuosius pats duomenų tipas, kurie visi yra susiję, tačiau mes nenorėjome šią žiaurią netvarka panašiai pavadintas kintamųjų? Ką mes darome vietoj? Taigi, manau, aš girdėjau keletą vietų. Mes turėjome masyvą. Jei norite keletą egzempliorių kažkas, kodėl ne mes išvalyti visa tai aukštyn ir tiesiog pasakyti, duok man masyve pavadinimai? Ir dabar, jau sunku kodekso 3. Ir tada man kitą masyvas vadinamas namus, ir tegul mane dabar sunku kodas 3. Ir aš masiškai išvalytos netvarka, kad aš ką tik sukūrėte. Dabar, aš vis dar sunkiai koduojami 3 dalių, tačiau net 3 gali dinamiškai iš vartotojas, ar argv ar pan. Taigi, tai jau švaresnis. Bet kas erzina apie tai, kad dabar, net jei vardas yra kažkaip iš esmės susijęs su studento namas - tai studentas, kad aš tikrai nori atstovauti - Dabar turiu dvi matricas, kurios yra lygiagrečios ta prasme, kad jie paties dydžio ir pavadinimai laikiklis 0 matyt žemėlapių namų laikiklio 0, ir pavadinimai laikiklis 1 žemėlapiai į namus laikiklis 1. Kitaip tariant, kad studentas gyvena tą namą, o kitas studentas gyvena toje kitoje namo. Bet tikrai tai gali būti padaryta dar švariai. Na, tai gali iš tikrųjų. Ir leiskite man eiti į priekį ir atidaryti iki structs.h, ir jūs pamatyti šią idėją čia. Atkreipkite dėmesį, kad aš naudojamas Typedef, kaip jūs užsiminė akimirką prieš paskelbti mūsų savo duomenų tipas. Bet aš taip pat naudojant šį kitą raktažodį vadinamas konstrukto, kuris suteikia man naują duomenų struktūra. Ir tai duomenų struktūra, galiu reikalauti vyksta turėti du dalykus viduje tai - eilutė vadinama vardas ir Styga vadinamas namas. Ir pavadinimas aš ruošiuosi duoti tai duomenų struktūra, vyksta būti vadinamas studentas. Galėčiau vadinti ką noriu, bet tai semantiškai padaryti jausti, kad man mano galvoje. Taigi dabar, jei aš atverti geresnę versiją Programos aš pradėjau rašyti ten, leiskite man slinkti į viršų. Ir dar šiek tiek daugiau eilučių kodo čia, bet leiskite man sutelkti dėmesį į viena akimirka. Aš paskelbė pastovus vadinamosios studentų ir sunkiai koduojami 3 dabar. Bet dabar, pastebėti, kaip švarus mano kodas prasideda gauti. Atsižvelgiant į 22, aš pareiškiu, masyvas studentams. Ir pastebėsite, kad studentas, matyt, dabar duomenų tipas. Nes bent šio failo viršuje, pranešimas, Aš įtraukti, kad antraštės failą kad aš išrautas tik prieš akimirką. Ir kad failo antraštės paprasčiausiai turėjo šis studentas apibrėžimas. Taigi dabar, aš sukūriau savo pasirinktinius duomenų tipo, kad C metų autoriai prieš nemanė anksto. Bet ne problema. Aš galiu padaryti jį sau. Taigi tai yra masyvas vadinamas studentų, kurių kiekvieno nariai yra studentas struktūra. Ir aš noriu, iš kurių trys masyve. Ir dabar, ką kiti Šios programos daryti? Man reikia kažką šiek tiek savavališkas. Taigi iš interneto 24 toliau, Aš kartoti 0-3. Aš tada prašyti vartotoją studento vardas. Ir tada aš naudoju GetString kaip ir anksčiau. Tada aš paprašyti studento namuose, ir aš naudoju GetString kaip ir anksčiau. Bet paskyrimas - šiek tiek nauja gabalas sintaksė - Aš vis dar gali indeksas i-ojo studentas, bet kaip man prie konkrečių duomenų lauko viduje struct? Na, ką, matyt, Naujas kūrinys sintaksė? Tai tiesiog dot operatorius. Mes tikrai matėme anksčiau. Jūs matėte jį pset penkių, jei jūs nėrė jau su bitmap failus. Bet taškas reiškia tiesiog viduje tai konstrukto ar kelis laukus, suteikti tašką pavadinimas arba duoti man dot namą. Tai reiškia, nueikite struct ir gauti tuos ypatingas sritis. Ką šios programos poilsio daryti? Tai ne viskas, kad seksuali. Atkreipkite dėmesį, kad aš kartoti 0-3 kartą, ir aš tiesiog sukurti Anglų frazė lyg taip ir taip yra tokia ir toks namas, einančios dot pavadinimą nuo i-osios studentų ir jų namas taip pat. Ir tada galiausiai, dabar mes pradėsime gauti analinis apie tai, kad dabar mes susipažinęs su tuo, ką malloc ir kitos funkcijos buvo daro visą šį laiką. Kodėl aš turiu atlaisvinti tiek vardą ir namai, nors aš neragino malloc? GetString padarė. Ir tai buvo purvinas maža paslaptis keletą savaičių, tačiau GetString turi yra nesandarus atmintį visame įdėti visą semestrą iki šiol. Ir valgrand pagaliau atskleisti tai mums. Bet tai nėra baisi, nes aš žinau, kad galiu paprasčiausiai išlaisvinti pavadinimą ir namas, nors techniškai, į būti super, super saugus, aš turėtų būti daryti kai kurių klaidų tikrinimo čia. Koks yra jūsų instinktai jums sakau? Ką aš turėčiau būti patikrinti kol aš išlaisvinti tai, kas eilutę, dar žinomas kaip kurie char *? Aš tikrai turėtų būti patikrinti, ar studentai laikiklis i dot pavadinimas nėra lygi NULL. Tada jis bus OK, kad eiti į priekį ir nemokamai kad rodyklė, ir tas pats arba kitas taip pat. Jei studentai laikiklis i dot namas nėra lygi null, tai dabar bus apsaugoti prieš kampe atveju, kai GetString grįžta kažką panašaus null. Ir mes matėme momentas prieš printf bus apsaugoti mus čia tiesiog pasakyti null, kuris ketina atrodo keistai. Bet bent jau nebus segfault, kaip matėme. Na, leiskite man padaryti vienas kitas dalykas čia. structs-0 yra tipo kvailas programos nes man reikia įvesti visus šiuos duomenis, ir tada jis prarado, kai programa baigiasi. Bet leiskite man eiti į priekį ir tai padaryti. Leiskite terminalą langas šiek tiek didesni. Leiskite structs-1, kuris yra nauja versija tai. Aš padidinti šiek tiek. O dabar leiskite man paleisti tašką velniop structs-1. Studento vardas, pavardė - Davidas Mather, darykime Rob Kirkland, darykime Lauren Leverett. Kas įdomu dabar paskyrimas - ir aš tik žinau tai, nes Parašiau programą - ten failas dabar mano dabartinis katalogas vadinama students.csv. Kai kurie iš jūsų galėjo matyti juos pateikti realiame pasaulyje. Kokia CSV failą? Kableliais atskirtų reikšmių. Tai tarsi vargšų portalo Excel failą. Tai eilučių ir stulpelių lentelė galite atidaryti, pavyzdžiui, "Excel" programa, arba numerius ant Mac. Ir jei aš atidaryti šį failą čia gedit, Skelbimas - ir skaičiai yra ne ten. Tai tik gedit pasakoja man eilučių numerius. Pranešimas apie pirmoje eilutėje ši failas yra Dovydas ir Mather. Kitą eilutę is Rob kablelis Kirkland. Ir trečia linija Lauren kablelis Leverett. Taigi, ką aš sukurta? Aš dabar parašyta C programą, kuri efektyviai gali generuoti skaičiuoklės kad galima atidaryti programa, kaip "Excel". Ne visi, kad įtikinamų duomenų rinkinys, bet jei turite daug didesnius gabaliukus duomenys, kad jūs iš tikrųjų nori manipuliuoti ir padaryti diagramas ir patinka, tai turbūt vienas būdas sukurti šių duomenų. Be to, CSV ataskaitose yra tikrai super dažnas tiesiog laikyti paprastus duomenis - "Yahoo" Finansai, pavyzdžiui, jei jūs gaunate akcijų kursus per savo vadinamąją API nemokama paslauga, kuri leidžia jums gauti dabartinę up-to-data atsargas citatos įmonėms, jie pateikti duomenis atgal super paprasta CSV formatu. Taigi, kaip mes tai darome? Na pastebėsite, dauguma šios programos beveik tas pats. Tačiau pastebėti žemyn čia, o ne spausdinti studentai out, on line 35 toliau, galiu reikalauti, kad aš taupyti mokiniai į diską, taip įrašant failą. Taigi pastebėti aš skelbiantis failą * - dabar, tai yra natūra asmuo, kuris pagal C anomalija Dėl kokios nors priežasties, failas yra visi dangteliai, kuris yra ne taip, kaip daugelyje kitų duomenų tipų į C. Bet tai yra built-in duomenų tipas, FILE *. Ir aš skelbiantis žymiklį į failą, kaip jūs galite galvoti apie tai. fopen reiškia atvirą failą. Ką failą norite atidaryti? Noriu atidaryti failą, kad aš savavališkai skambinti students.csv. Galėčiau skambinti, kad ką noriu. Ir tada imtis atspėti. Ką Antrasis argumentas į fopen tikriausiai reiškia? Teisingai, w rašyti, galėtų būti r skaityti. Nėra už Papildyti jei norite įterpti eilučių, o ne perrašyti visą dalykas. Bet aš tik noriu sukurti šį failą vieną kartą, todėl aš naudoti citata citatos w. Ir aš žinau, kad tik gražu skaityti dokumentus, ar vyras puslapis. Jei failas nėra lygus nuliui, - kitaip tariant, jei nieko nutiko ten - leiskite man pakartoti per studentai 0-3. Ir dabar pastebėsite, kad kažkas vis tiek šiek tiek skiriasi apie linijos 41 čia. Tai ne printf. Tai fprintf failui printf. Taigi, ji ketina rašyti į failą. Kuris failas? Tas, kurio žymeklis galite nurodyti kaip pirmojo argumento. Tada mes nurodyti format string. Tada mes nurodome, ką styginių norime įjunkite pirmą proc s ir tada kitas kintamasis arba antra proc s. Tada mes uždaryti su fclose failą. Nei aš atlaisvinti atminties, kaip ir anksčiau, nors Turėčiau grįžti ir pridėti kai for null patikrinimus. Štai ir viskas. fopen, fprintf, fclose suteikia man gebėjimas kurti tekstinius failus. Dabar jūs matysite problemą, penkių, kuri apima vaizdus, ​​jūs naudojate dvejetainiai failai vietoj. Bet iš esmės, idėja yra ta pati, nors funkcijos jums pamatyti, yra šiek tiek kitokia. Taigi viesulas kelionė, bet jūs gausite per daug susipažinę su byla I/O-- įvesties ir išvesties - su pset penkių. Ir visą informaciją apie klausimus pradiniai pagrindai čia? Taip? Ką daryti, jei bandysite atlaisvinti nulinę vertę? Manau, jei nemokamai pakliuvusiam šiek tiek patogesnis, galite potencialiai segfault. Perdavimai tai nulis yra blogai, nes aš ne mano, nemokama trukdo patikrinti jums, nes tai gali būti atliekos laiko dėl to daryti pati už kiekvienas pasaulyje. Geras klausimas, nors. Visos teisės, todėl šios rūšies gauna mums įdomi tema. Problemos rinkinio tema yra penki ekspertizės. Bent jau dalis šios problemos rinkinį. Teismai paprastai reiškia atkūrimas informaciją, kuri gali arba negali būti ištrintas sąmoningai. Ir taip aš maniau aš jums greitai skonis, kas iš tikrųjų vyksta visi tai po laiko dangtis kompiuterio. Pavyzdžiui, jei jūs turite viduje jūsų nešiojamas ar jūsų stalinis kompiuteris kietasis diskas, tai arba mechaninis prietaisas, kuris iš tikrųjų sukasi - ten apvalūs dalykų vadinamas plokšteles kad atrodo gana patinka tai, ką aš tiesiog turėjo ant ekrano čia, nors tai vis senosios mokyklos. Tai trijų su puse colių kietasis diskas. Ir tris ir puse colių reiškia iš su iš dalykas, kai jūs diegiate į kompiuterį. Daugelis iš jūsų vaikinai savo nešiojamus kompiuterius dabar turi kietojo kūno diskus, SSD, kurios nėra judančių dalių. Jie daugiau kaip RAM ir mažiau kaip šie mechaniniai įtaisai. Bet idėjos yra vis dar tas pats, tikrai, kiek jie susiję kad problema nustatyti penkis. Ir jei jūs manote apie dabar kietasis diskas yra yra apskritimas, kuris Aš atkreipti, kaip tai čia. Kai kuriate failą savo kompiuteryje, ar tai VSD, arba Šiuo atveju, vyresni mokyklos kietasis diskas, kad byla apima keletą bitai. Tarkime, kad tai tik 0 ir 1, visa krūva 0s ir 1s. Taigi tai yra mano visą kietąjį diską. Tai, matyt, gana didelis failas. Ir ji naudoja iki 0s ir 1s tuo dalis fizinio patiekalas. Na, kas tai yra fizinis dalis? Na, paaiškėja, kad kietajame diske, bent jau tokio tipo, yra šių mažų mažai magnetinių dalelių. Ir jie iš esmės turi į šiaurę ir pietinį polius jiems taip, kad jei įjungti vieną iš šių magnetinių dalelių Tokiu būdu, jūs galite sakyti, kad tai atstovaujančių 1. Ir jei jis aukštyn kojom į pietus iki į šiaurę, jūs galite sakyti, kad tai atstovaujančių 0. Taigi realiame fiziniame pasaulyje, tai kaip galima atstovauti kažką dvejetainis būklė 0 ir 1. Taigi, kad viskas failas. Yra visa krūva magnetinio dalelių, kurios jų šiuo būdu arba Tokiu būdu, kuriant modelius iš 0s ir 1s. Tačiau paaiškėja, kai įrašote failą, tam tikra informacija yra saugomi atskirai. Taigi tai yra staliukas, katalogas, taip sakant. Ir aš vadinu tai stulpelio pavadinimą ir Aš vadinu tai stulpelio vietą. Ir aš ruošiuosi pasakyti, tarkime, tai yra mano CV. Mano resume.doc yra saugomi vieta, tarkim 123. Aš visada eiti šiuo numeriu. Tačiau pakanka pasakyti, kad tiesiog patinka RAM, galite imtis kietąjį diską tai Gigabyte arba 200 GB arba terabaito, ir jūs galite skaičius visi baitai. Galite suskaičiuoti visus 8 bitai gabaliukus. Taigi, mes pasakyti, kad tai yra vieta 123. Taigi, šis katalogas viduje savo veiklos sistema prisimena, kad mano CV yra vietoje 123. Bet jis bus įdomus, kai ištrinti failą. Taigi, pavyzdžiui - ir, laimei, daugelyje pasaulio šalių yra sugauti ant to - kas atsitinka, kai jūs vilkite failą į savo "Mac OS šiukšliadėžę ar jūsų šiukšlinę Windows? Kas daro, kad tikslas? Tai akivaizdžiai atsikratyti failą, bet ką iš vilkdami aktas ir nuleisti į savo šiukšliadėžę arba jūsų Šiukšlių padaryti kompiuteryje? Absoliučiai nieko, tikrai. Tai tiesiog kaip aplanką. Tai specialų aplanką, būti tikri. Bet ji iš tikrųjų ištrinti failą? Na, ne, nes kai kurie iš jūsų turbūt buvę tarsi oh damn, tu ne tai daryti. Taigi jūs dukart spustelėkite Šiukšlių arba šiukšlinę. Jūs baksnodavo aplink ir jūs atsigavo tiesiog vilkite jį failą iš ten. Taigi aišku, tai nebūtinai jį pašalinti. Gerai, jūs protingesni nei tai. Jūs žinote, kad tiesiog vilkite jį į Šiukšlių arba šiukšlinė nereiškia jūs ištuštinti šiukšlinę. Taigi jums eiti į meniu, o jūs sakote, Ištuštintišiukšliadėžę ar Išvalyti šiukšlinę. Kas tada atsitiks? Taip, taip, jis bus ištrintas labiau. Bet visa tai atsitiks tai. Kompiuteris pamiršta, kur resume.doc buvo. Bet kas nepasikeitė, matyt, paveikslėlyje? Bitai, 0s ir 1s, kad galiu reikalauti yra vietoje kai kurių fizinis aspektas aparatūros. Jie vis dar ten. Tai tiesiog kompiuteris pamiršote, ką jie yra. Taigi tai iš esmės išlaisvino failo bitai, kad jie gali būti pakartotinai naudojamas. Bet ne iki jums sukurti daugiau failų, ir daugiau failų ir daugiau failai bus probabilistically, tie 0s ir 1s, tie magnetinės dalelės, gauti pakartotinai, aukštyn arba dešinėje pusėje aukštyn, už kitos bylos, 0s ir 1s. Taigi jūs turite tai laiko langas. Ir tai nėra nuspėjama ilgis, tikrai. Tai priklauso nuo jūsų kietajame dydžio vairuoti ir kiek failų turite ir kaip greitai jums padaryti naujus. Bet ten tai laiko langas metu kurioje tas failas vis dar puikiai atlygintinos. Taigi, jei jūs kada nors naudoti programas, pavyzdžiui, "McAfee" arba "Norton bandys susigrąžinti duomenys, visi jie daro bando susigrąžinti šį vadinamąjį katalogas išsiaiškinti, kur yra jūsų failas. Ir kartais Norton ir sakys: failas yra 93% atlygintinos. Na, ką tai reiškia? Tai tiesiog reiškia, kad kai kitų failų atsitiktinai galų gale naudojant, tarkim, tie iš jūsų originalaus failo bitai. Taigi, kas iš tikrųjų dalyvauja atgauti duomenis? Na, jei jūs neturite ką nors panašaus "Norton" iš anksto įdiegta jūsų kompiuteryje, geriausia, ką kartais gali padaryti, tai ieškoti ne visą kietąjį diską ieškote modelius bitai. Ir vienas iš probleminių temų rinkinys penkių, kad jums ieškoti ekvivalentas kietąjį diską, teismo vaizdas iš Compact Flash kortelė nuo skaitmeninis fotoaparatas, ieškant 0s ir 1s, paprastai, aukštos tikimybė, atstovauti pradžia JPEG vaizdas. Ir vaikinai gali susigrąžinti tuos vaizdus darant prielaidą, jei matau šį modelį bitai dėl teismo vaizdą, didelė tikimybė, kad prekių ženklai iš JPEG pradžia. Ir jei matau, tą patį modelį vėl, kad tikriausiai žymi pradžią kitas JPEG, o kitas JPEG, ir kitų JPEG. Ir tai paprastai kaip duomenų atkūrimo veiks. Kas yra malonu apie JPEG yra nors failo formatas pati yra šiek tiek sudėtingas, kiekvienas toks pradžia failas yra iš tikrųjų gana atpažįstami ir paprastas, kaip pamatysite, jei jūs neturite jau. Taigi, galime atidžiau pažvelgti apačioje kaip tiksliai kas buvo gaubtas vyksta, ir kas tai 0s ir 1s yra, kad duoti jums šiek tiek daugiau kontekstas šiuo konkrečiu iššūkiu. [VIDEO PLAYBACK] -Kur jūsų kompiuteryje saugo labiausiai jos nuolatinių duomenų. Norėdami tai padaryti, duomenys keliauja iš RAM kartu su programinės įrangos signalus, kad pasakyti kietasis diskas, kaip saugoti tuos duomenis. Kietojo disko grandinės išversti tos į įtampos signalus svyravimai. Tai, savo ruožtu, valdyti kietojo disko judančių dalių, kai kurie mažai judančios dalys liko modernus kompiuteris. Kai kurie iš signalus valdyti variklį kuris sukasi metalo dengtos plokšteles. Jūsų duomenys yra faktiškai saugojamas apie šias plokšteles. Kiti signalai judėti skaityti / rašyti vadovai skaityti arba įrašyti duomenis į plokšteles. Ši technika taip tiksliai, kad žmogaus plaukai net negalėjo praeiti tarp vadovai ir verpimo plokšteles. Tačiau visa tai veikia ne siaubingas greičiu. [PABAIGA VIDEO PLAYBACK] Davidas Malan: Padidinti mažai giliau dabar kas iš tikrųjų dėl šių plokšteles. [VIDEO PLAYBACK] -Pažvelkime, ką mes tik pamačiau sulėtintai. Kai trumpas impulsas elektros energijos siunčiami į skaitymo / rašymo galvutės, jei salto apie mažą elektromagnetinį už per sekundės dalį. Magnetas sukuria lauką, kuris pakeitimai yra maža, maža poliškumas dalis metalo dalelių, kurios sluoksnis kiekvieną patiekalas paviršiaus. Modelis serija šių mažų, už-up sritys diske atstovauja vieną bitą duomenys, kaip dvejetainis skaičius sistema, kurią naudoja kompiuterius. Dabar, jei srovė yra siunčiami į vieną pusę per skaitymo / rašymo galvutės, plotas yra poliarizuota viena kryptimi. Jei srovė yra siunčiami priešinga kryptimi, poliarizacija yra atstatomas. Kaip jūs gaunate duomenis išjungti kietąjį diską? Tiesiog pakeisti procesą. Taigi tai, kad diske dalelės kad gauti srovė skaitymo / rašymo galvutės juda. Sujungti milijonus šių įmagnetintame segmentai ir jūs turite failą. Dabar, iš vieno failo gabalai gali būti išsibarsčiusios visame disko plokšteles, lyg netvarka Straipsnių ant jūsų stalo. Taigi speciali papildoma failas stebi , kur viskas yra. Ar ne norite, turėjo kažkas panašaus? [PABAIGA VIDEO PLAYBACK] Davidas Malan: Gerai, tikriausiai ne. Taigi, kaip daugelis iš jūsų vaikinai užaugau su jais? Gerai, kad tai mažiau ir mažiau rankos kasmet. Bet aš džiaugiuosi, jūs bent susipažinę su jais, nes tai ir mūsų pačių knyga demo, deja, miršta labai nunykti čia familiarumo. Bet tai, ką aš, bent jau, dar aukštosios mokyklos, naudotos atsargines kopijas. Ir ji buvo nuostabi, nes jums galima laikyti 1,4 megabaitų tai ypač disko. Ir tai buvo didelio tankio versija, kaip rodo HD, kuris turi ty prieš šiandienos HD vaizdo įrašus. Standartinis tankis buvo 800 kilobaitų. Ir prieš tai, kad buvo 400-Kilobaitas diskai. Ir prieš tai, kad buvo 5 ir 1/4 colių diskus, kurie buvo tikrai diskelių, ir šiek tiek platesnė ir aukštesnė nei šių dalykų čia. Bet jūs iš tikrųjų galite pamatyti vadinamasis diskelių aspektas šių diskų. Ir funkciškai, jie iš tikrųjų gana panašus į kietuosius diskus, ne Bent tai tipo. Vėlgi, SSD naujesniuose kompiuteriuose dirbti šiek tiek kitaip. Bet jei jums judėti, kad mažai metalinę kilpelę, Jūs iš tikrųjų galite pamatyti šiek tiek slapuką, arba patiekalas. Tai ne metalo patiko šį vieną. Tai vienas iš tikrųjų kai pigiau plastiko. Ir jūs galite rūšies kraipyti ją. Ir jūs trully tiesiog nušluota kai bitų skaičius arba magnetinių dalelių iš šio disko. Taigi, laimei, nėra nieko ant jo. Jei tas dalykas tai taip, - ir padengti jūsų akys ir jūsų kaimynas - galite tiesiog rūšies traukti tai visas apvalkalas nuo panašaus. Bet yra šiek tiek pavasarį, todėl žino, kad savo akimis. Taigi, dabar jūs turite tikrai diskelį. Ir kas puikus apie tai yra tai, kad tiek, kiek tai nedidelio masto atstovavimas didesnis kietasis diskas, šie dalykai yra super, super paprasta. Jei suimkite jo dugną, dabar, kad kad metalo dalykas yra išjungti, ir žievelės juos atidaryti, viskas yra yra du gabalai veltinys ir vadinamasis diskelis su gabalėlio metalo į vidų. Ir ten eina pusė mano diske, kurių turinys. Čia eina vienas iš jų pusė. Bet tai visa tai sukosi viduje iš jūsų kompiuterio, pasekėjai. Ir vėl įdėti šią į perspektyvą, kaip didelis yra didžiąją dalį savo kietieji diskai šių dienų? GB 500, terabaito, gal stalinis kompiuteris, 2 terabaitų, 3 terabaitų, 4 terabaitų, tiesa? Tai yra vienas megabaitas, duoti ar priimti, kuris gali neatitikti tipiškų MP3 nebėra šių dienų, arba kai panašios muzikos failą. Taigi šiek tiek suvenyrų jums šiandien, ir taip pat padėti kontekstualizuoti ką mes atsižvelgiant savaime suprantamu dalyku dabar problema nustatyti penkių. Taigi tie, kurie tavo laikyti. Taigi leiskite man pereiti prie kur bus išleisti kitą pset taip pat. Taigi mes dabar nustatyti šį puslapį - oi, Skelbimų greitai pora. Šį penktadienį, jei norėtumėte prisijungti CS50 pietums, eikite į įprastą vietą, cs50.net/rsvp. Ir galutinis projektas - todėl už mokymo programą, mes parašė Baigiamoji projekto specifikacija jau. Suprantu, kad tai nereiškia, tai dėl itin greitai. Jis parašė, tikrai, tik gauti vaikinai galvoja apie tai. Ir iš tiesų, itin reikšmingas dalis jums bus kovoti galutiniai projektai medžiagų, kurias mes net ne Dotarłeś į klasę, bet bus ne anksčiau kaip kitą savaitę. Pranešimas, nors, kad spec ragina keli skirtingi komponentai galutinis projektas. Pirma, per kelias savaites, yra Išankstinis pasiūlymas, gana atsitiktinis laiškus elektrininiu paštu Jūsų TF pasakyti jam ar kas esate galvoju apie savo projektą, su jokių įsipareigojimų. Pasiūlymas bus jūsų pirma įsipareigojimas, sakydamas: čia tai, ką Norėčiau padaryti mano projektą. Ką manote? Per didelis? Per mažas? Ar tai įvykdoma? Ir pamatysite spec daugiau informacijos. Pora savaičių po to yra statusas ataskaita, kuri panašiai atsitiktinis siųsti savo TF pasakyti tik tai, kaip gerokai atsilieka esate jūsų galutinis Projekto įgyvendinimas, po CS50 Hackathon kurį kiekvienas yra kviečiami, kuris bus įvykis iš 20:00 viena vakare iki 07:00 AM kitą rytą. Pica, kaip aš galėjo paminėti savaitę nulis, wil būti įteiktas 9:00 PM, Kinų maisto 1:00 PM. Ir jei jūs vis dar atsibunda 05:00, mes priimsime jus į IHOP pusryčiams. Taigi Hackathon yra vienas iš labiau neužmirštamų įspūdžių klasėje. Tada įgyvendinimas lemia ir tada kulminacinis CS50 mugė. Daugiau informacijos apie visa tai per ateinančias savaites. Bet grįžkime į kažką senosios mokyklos - vėl masyvo. Taigi matrica buvo gražus, nes jis sprendžia problemų, kaip mes matėme tik prieš akimirką su studentų struktūrų gauti šiek tiek iš kontrolės, jei mes nori turėti studento vieną, studento du, studentas trijų, studentas taškas taškas taškas, kai savavališkai studentų skaičius. Taigi matricos, prieš kelias savaites, swooped į ir išspręsti visas mūsų problemas ne iš anksto žinant, kiek daug kai tipo mes norime. Ir mes matėme, kad structs gali padėti mums toliau organizuoti savo kodą ir išlaikyti konceptualiai panašūs kintamieji, pavyzdžiui, pavadinimas ir namo kartu, kad mes gali traktuoti jas kaip vieną subjektą, viduje kurių yra mažesnius gabalėlius. Bet matricos turi tam tikrų trūkumų. Kokie yra keletas trūkumų mes susidūrėme su matricomis iki šiol? Kas tai? Fiksuotas dydis - todėl, nors galbūt būtų galima skirti atminties masyvas, kai jūs žinote, kiek studentų turite, kiek simbolių turite nuo vartotojo, kai jūs skiriama masyvas, jūs rūšies dažytos save į kampą. Kadangi jūs negalite įterpti naujus elementus į masyvo viduryje. Jūs negalite įterpti daugiau elementų tuo masyvo pabaigos. Tikrai, jūs turite imtis kurti visiškai naujas masyvas, kaip mes aptarti, kopijavimo metai į naują. Ir vėl, tai yra galvos skausmas GetString kalbama jums. Bet vėl, jūs negalite net įterpti kažkas į masyvo viduryje jei palūkanų norma yra ne visiškai užpildyti. Pavyzdžiui, jei tai masyvas čia dydžio tik šešios turi penkis dalykus tai, gerai, galima tiesiog smeigtuko kažkas ant galo. Bet kas, jei norite įterpti kažką į vidurį masyvas, nors jis gali turėti penki iš šešių dalykų tai? Na, ką mes darome, kai mes turėjome viską mūsų savanoriais ant scenos savaites praeityje? Jei mes norėjome įdėti ką nors čia, arba šie žmonės, kaip perkelti šį būdu, arba šie žmonės, kaip perkelti šį būdas, ir kad tapo brangu. Perkelia žmonių viduje masyvas galų gale sudėjus ir kainuoja mums laiko, todėl daug mūsų n kvadratu veikia kartus kaip įterpimo rūšiuoti, už Pavyzdžiui, blogiausiu atveju. Taigi matricos yra puikus, tačiau jūs turite iš anksto žinoti, kaip didelis norite juos. Taigi gerai, čia yra sprendimas. Jeigu aš nežinau iš anksto, kiek studentai galiu turėti, ir aš žinau, kai Aš nuspręsti, nors, aš pakimba su tuo daug studentų, kodėl gi ne aš tiesiog visada skirti dvigubai daugiau erdvės, kaip galėčiau manau reikia? Ar tai ne protingas sprendimas? Realiai, aš nemanau, kad mes reikės daugiau nei 50 laiko tarpsnių nagrinėjant ieškinį dėl vidutinio dydžio klasės masyvas, todėl galime tik suapvalinti. Aš padarysiu 100 lizdus mano masyvas, tik kad mes tikrai gali gauti studentų skaičius tikiuosi būti tam tikru vidutinio dydžio klasėje. Tad kodėl gi ne tiesiog suapvalinti ir skirti daugiau atminties, paprastai, už masyvo nei jūs manote, kad galite net nereikia? Kas tai yra paprastas Pushback tos idėjos? Jūs tik eikvoti atmintį. Pažodžiui kiekviena programa rašote tada gal naudojant dvigubai daug atminties kaip jūs iš tikrųjų reikia. Ir tai tiesiog nesijaučia kaip ypač elegantiškas sprendimas. Be to, jis tiesiog mažėja tikimybė problemą. Jei atsitiktų, kad populiarus kursą vieną semestrą, ir jūs turite 101 studentų, jūsų programa yra vis dar iš esmės susiduria su ta pačia problema. Taigi, laimei, yra sprendimas tai ad visos mūsų problemos formos duomenų struktūrų, kurios yra sudėtingesnis nei tas, mes matėme iki šiol. Tai, galiu reikalauti, yra susijusi sąrašas. Tai numerių sąrašas - 9, 17, 22, 26 ir 34 - , kurios buvo sujungtos taip, , ką aš braižomos kaip rodyklėmis. Kitaip tariant, jei aš norėjau atstovauti masyvas, aš galėtų padaryti kažkas panašaus į tai. Ir aš įdėti šią Viršuje vos akimirką. Galėčiau padaryti - labas, viskas gerai. Budėjimo. Naujas kompiuteris čia aišku - Gerai. Taigi, jei aš turėti šiuos numerius masyvo - 9, 17, 22, 26, 24 - nebūtinai pagal mastelį. Gerai, kad čia yra mano masyvas - Oh my god. Gerai, kad čia yra mano masyvo. Oh my god. [Juokas] Davidas Malan: Pretend. Tai pernelyg daug pastangų grįžti ir nustatyti, kad taip nėra - 26. Taigi, mes turime šį masyvas 9, 17, 22, 26 ir 34. Tiems iš jūsų, galite pamatyti nepatogus klaida Aš ką tik atliko, ten yra. Taigi, aš teigti, kad tai yra labai efektyvus sprendimas. Aš skirta tiek Ints kaip Man reikia - Vienas, du, trys, keturių, penkių arba šešių - ir aš tada saugomi skaičiai viduje šio masyvo. Bet tarkime, tada, aš noriu įterpti kaip numeris 8 vertė? Na, kur ji eiti? Tarkime, aš noriu įterpti kaip skaičius 20. Na, kur ji eiti? Kažkur per vidurį, ar skaičius 35 turi eiti kažkur pabaigoje. Bet aš visiems išretinti. Ir todėl tai yra pagrindinis iššūkis iš masyvų, kuris yra sprendimas. Aš teigė šiuo metu senumo, GetString sprendžia šią problemą. Jei norite įterpti šeštąjį numeris į šio masyvo, kas yra bent vienas sprendimas jums gali vėl kristi ant tikrai, kaip mes darome su GetString? Kas tai? Na, kad ji didesnė yra lengviau pasakyti nei padaryti. Mes ne visada gali padaryti masyvas didesnis, bet ką mes galime padaryti? Sukurti naują masyvą, kad yra didesnis, pagal savo dydį 6, o gal dydis 10, jei norime gauti į priekį dalykų, ir tada nukopijuokite Esu masyvas į Naujas, tada nemokamai seną masyvo. Bet kas važiavimo laikas dabar šio proceso? Tai didelis O n, nes kopijavimas kainuos jums keletą vienetų laiką, todėl ne taip idealu, jei mes turime skirti naują masyvą, kuris vyksta vartoti dvigubai daugiau atminties laikinai. Kopijuoti metai į naują - Aš turiu galvoje, tai tik galvos skausmas, kuris yra, vėlgi, kodėl mes parašėme GetString už jus. Taigi, ką galėtume padaryti vietoj? Na, ką daryti, jei mūsų duomenų struktūra iš tikrųjų turi jos spragas? Tarkime, kad aš atsipalaiduoti savo tikslą turėti gretimi gabaliukus atminties, jei 9 yra šalia 17, kuris yra šalia 22 ir pan. Ir manyti, kad 9 gali būti per čia RAM ir 17 gali būti per daug čia, RAM, ir 22 gali būti per daug čia RAM. Kitaip tariant, aš jų nereikia net atgal atgal nebėra. Aš tiesiog kažkaip siūlų adata pagal kiekvieną iš šių numerių, ar kiekvienas Šių mazgų, kaip mes vadiname stačiakampiai, kaip aš traukti jų, Prisimenu, kaip gauti naujausia toks mazgas nuo pirmosios. Taigi, kas yra programavimas statyti mes matėme gana neseniai, su kuria aš gali įgyvendinti šią temą, arba rengia čia, su kuriais galiu įgyvendinti šias rodykles? Taigi patarimų, tiesa? Jei aš skirti ne tik int, bet mazgas - ir mazgas, aš tiesiog reiškia konteinerį. Ir vizualiai, aš tai stačiakampis. Taigi mazgas, matyt, reikia kad yra dvi reikšmes - LC pati, o tada, kaip teigiama apatinė stačiakampio, pakankamai vietos int. Taigi, tiesiog galvoju į priekį čia kaip didelis yra šis mazgas, tai Pakuotę klausimą? Kiek baitų int? Matyt 4, jei tai kaip įprasta pats. Ir tada kiek baitų už rodykle? 4. Taigi tai konteineris, ar tai mazgas, yra bus 8 baito struktūra. Oh, ir tai laimingas sutapimas, kad mes tiesiog pristatė šią sąvoką konstrukto ar gelžbetonio konstrukcijos. Taigi galiu reikalauti, kad aš noriu žengti žingsnį į tai vis sudėtingesnės įgyvendinimas numerių sąrašą, į susiję sąrašas numerius, man reikia padaryti šiek tiek daugiau mąstymo priekyje ir paskelbti ne tik int, bet STRUCT kad aš vadinu, tradiciškai čia mazgas. Mes galime vadinti ką norime, bet mazgas bus teminio daug iš dalykų, mes pradėti ieškoti dabar. Viduje Šis mazgas yra int n. Ir tada šį sintaksė, šiek tiek keista iš pirmo žvilgsnio - konstrukto mazgas * kito. Na pavaizduotomis piktogramo, kas tai? Tai yra apatinėje stačiakampis, kad mes matėme tik prieš akimirką. Bet kodėl aš sakau struct mazgas * o ne tik mazgas *? Nes jei, kad rodyklė būtų nukreipta kitame mazge, tai tik adresas mazgas. Tai atitinka tai, ką mes diskutuojama apie rodykles iki šiol. Tačiau kodėl, jei galiu reikalauti ši struktūra yra vadinama mazgas, turiu pasakyti struct mazgas viduje čia? Būtent. Tai tarsi kvailas tikrovės C. Typedef, taip sakant, yra ne atsitiko dar. C Super pažodinis. Jis skaito jūsų kodą viršų į apačioje, iš kairės į dešinę. Ir kol ji hitai kad kabliataškį dėl Esmė, manau, kas ne egzistuoti kaip duomenų tipą? Mazgas, citata citatos mazgas. Bet kadangi daugiau neaiški deklaracija aš pirmoje eilutėje - Typedef struct mazgas - nes atėjo pirmas, prieš garbanotas petnešos, kad tarsi kaip prieš šviesti Zaszczękać, kad jūs Žinai ką, man struct vadinamas struct mazgas. Atvirai kalbant, man nepatinka telefono dalykų konstrukto mazgas, konstrukto mazgas visi per mano kodas. Bet aš ją naudoti tik vieną kartą, tik viduje, kad galėčiau efektyviai sukurti apykaitinės nuoroda rūšiuoti, o ne rodyklę į save per se, bet rodyklė į kitą identiški tipas. Taigi paaiškėja, kad dėl duomenų struktūros kaip tai, yra keletas operacijos, kurios gali būti domina mus. Mes galime norite įterpti į panašaus sąrašą. Mes galime norite ištrinti iš panašaus sąrašą. Mes galime norite ieškoti už sąrašą vertė, arba apskritai, ėjimas. Ir ėjimas yra tik išgalvotas būdas sakydamas prasideda į kairę ir perkelti visus Kelias į dešinę. Ir pastebėkite, net tai šiek tiek daugiau sudėtingos duomenų struktūros, leiskite man pasiūlyti, kad mes galime skolintis kai pastarųjų dviejų savaičių idėjas ir įgyvendinti funkcija vadinama ieškoti, kaip šis. Ji ketina grįžti true arba klaidingas, prireikus nurodydama, "taip" arba ne, n sąraše. Jo Antrasis argumentas yra rodyklė į paties sąrašo, todėl rodyklė mazgas. Viskas, ką aš ruošiuosi tada padaryti, tai paskelbti laikinas kintamasis. Mes jį vadiname PTR pagal susitarimą rodykliniams. Ir aš ją priskirti lygūs pradžioje sąrašo. Ir dabar pastebėsite, o linijos. Kol žymiklis nėra lygus nulis, aš ruošiuosi patikrinti. Ar rodyklė rodyklė N lygų n, kuris buvo priimtas? Ir laukti minučių - naujas gabalas sintaksė. Kas yra rodyklė visi staiga? Taip? Būtent. Todėl nors prieš kelias minutes, mes panaudojome taško žymėjimas pasiekti kažką viduje struct, jei kintamasis jūs ne konstrukto pati, bet Rodyklė į struct, laimei, sintaksės vienetas, pagaliau tampa intuityvus jausmas. Rodyklė reiškia sekti rodyklę kaip mūsų rodykles paprastai reiškia pavaizduotomis piktogramo ir eiti duomenų laukas viduje. Taigi rodyklė tas pats, kaip taškas, tačiau jūs jį naudoti, kai jūs turite rodyklę. Taigi tiesiog Priminti tada, jei nanotechnologijų srityje viduje struct vadinamas rodyklę lygus lygus n return true. Priešingu atveju, ši eilutė čia - rodyklė lygus rodyklę šalia. Taigi, kas tai daro, pranešime, yra, jei aš šiuo metu nukreiptos į atitinkamą struct , kurių sudėtyje yra 9, o 9 nėra skaičius Aš ieškau - tarkime, aš ieškau Apie n lygus 50 - Aš ruošiuosi atnaujinti savo laikiną žymeklį ne atkreipti šiuo mazgas nebėra, bet rodyklė rodyklė kitą, kuris ketina įtraukti mane čia. Dabar supratau, yra viesulas Įvadas. Trečiadienį, mes iš tikrųjų tai padaryti su kai kuriais žmonėmis ir su šiek tiek daugiau kodas lėčiau. Bet suprasti, mes dabar padaryti savo duomenis struktūros sudėtingesnė todėl, kad mūsų algoritmai gali gauti efektyviau, kuris bus būtina sąlyga pset šešių, kai mes pakrauti, vėlgi, tie 150.000 žodžių, bet reikia tai daryti efektyviai, o idealiu atveju, sukurti programa, kuri veikia mūsų vartotojams nėra linijinis, o ne n kvadratu, bet pastovus laikas, o idealas. Dar pasimatysime trečiadienį. GARSIAKALBIS: Kitame CS50, David pamiršta savo bazę bylą. Davidas Malan: Ir tai, kaip jūs siųsti tekstinius prane ¹ imus su C. Kas - [ĮVAIRIŲ tekstinį pranešimą PRANEŠIMAS SOUNDS]