DAVID Malan: Bone, bonvenigas dorso. Ĉi tiu estas CS50. Ĉi tiu estas la komenco de semajno sep. Do jam pasis iom da tempo, do mi pensis ke ni preni trombo tour de kie ni cxesis kaj kie ni nun iras. Do tiun aferon ĉi tie povus havi kaŭzis iujn angoro en komenco. Sed mi esperas, ke vi komencas alklimatigi al kio tio signifas tie - stelo reprezentas pointer, kiu estas nur kio, en pli lego la terminoj? Do ĝi estas adreso. Do estas la adreso de io en la memoro. Kaj ni komencis senŝeligi reen la manteloj paro de semajnoj, aĵoj ŝati GetString kaj aliaj tiaj funkcioj tiu tuta tempo ili reveni adresoj de aferoj en la memoro, kiel la adreso de la unua signo en iu vico. Do ni ankaŭ enkondukis valgrind, kiu vi komencos uzi por ĉi tiu problemo aro, aparte por la venonta problemo starigis kiel bone. Kaj valgrind faras kion por ni? Ĝi kontrolas por memoro fugoj, kaj ĝi Ankaŭ kontrolas por misuzo de memoro. Ĝi povas, kun iu probablo, detekti se via kodo tuj tuŝi memoro ke simple ne devus. Do ne nepre liko, sed se vi iri preter la limojn de iuj tabelo, kaj vi efektive kuri valgrind kaj instigi ke la konduto dum valgrind kuras en via programo estas kurante ene de ĝi, vi ricevos mesaĝoj kiel tiu - "malvalida skribi de grandeco 4 ", kiu, memoru paro de semajnoj signifis ke mi havis hazarde kiel sur unu int tro malproksime trans la limoj de tabelo. Kaj tiel grandeco 4 signifas tie la grandeco de tiu aparta int. Do prenu konsilojn en la fakto ke valgrind eligo, la formato de ĝi, estas nur abomena. Estas vere malfacile vidi tra la salaton por la interesa informo. Do kion ni faris ĉi tie estas nur ekstrakto kelkaj el la paro de pli interesaj linioj. Sed rimarkas ke 80% de valgrind la eligo tuj estos iom de distro. Nur serĉi tekson tiuj - nevalida pravas, nevalida legis, 40 bitokoj kaj iu numero de blokoj estas definitive perdita, ŝlosilvortoj tiel. Kaj kion vi espereble vidos estas iuj ia spuro de kio funkcii la eraro estas fakte in En tiu kazo ĉi tie, en kio linio de mia kodo estis la eraro ŝajne? 26 en dosiero nomata memory.c, kiu estis la ekzemplo ni ludis kun en tiu momento. Do ĝi estas probable ne en malloc. Ĝi estis probable en mia kodo anstataŭe. Do ni vidos ĉi denove kaj denove post nelonge. Do scanf, ĉi tiu venis en paro de formoj tiom. Ni vidis sscanf mallonge. Estis iu numero de vi plonĝis en en via preparoj por la kvizo. Kaj scanf estas fakte kion la CS50 biblioteko estas estinta uzante sub la kapuĉo por sufiĉe tempo por akiri eniron de la uzanto. Ekzemple, se mi movas super la CS50 aparato tie, permesu al mi malfermi la Ekzemple hodiaŭ ke nomiĝas scanf-0.c Kaj ĝi estas super simpla. Estas nur malmultaj linioj de kodo. Sed ĝi pruvas vere kiel getInt estis laborante ĉio ĉi tempo. En ĉi tiu programo ĉi tie, en linio 16 , Avizo kiu deklaras la Int. Do ne montriloj, nenio magia tie, nur int. Tiam en linio 17, mi instigas la uzanton por nombro, bonvolu. Tiam fine 18, mi uzas scanf tie. Kaj mi specifita, ia kiel printf, ke mi atendis citaĵo unquote procento i. Do procento i, kompreneble, signas la int. Sed rimarki kion la dua argumento por scanf estas. Kiel vi priskribus la dua argumento post la komo? Kio estas tio? Ĝi estas la adreso de x. Do tiu estas utila ĉar per provizi scanf kun la adreso de x, kion faras ke plifortigi tiun funkcion por fari? Ne nur iri tien, sed ankaŭ fari kion? Fari ŝanĝon al ĝi. Ĉar vi povas iri tien, estas speco de kiel mapon al loko en la memoro. Kaj tiel longe kiel vi provizis scanf, aŭ iu funkcio kun tia mapo, ke funkcio povas iri tie, kaj ne nur rigardi la valoro, sed ĝi povas ankaŭ ŝanĝi tiun valoron, kiu estas utila se la celo en la vivo de scanf estas skani enigon el la uzanto, specife de la klavaro. Kaj la f signifas formatan, samkiel printf, la f signifas formatan kordo, kiun vi volas presi. Do, en mallonga, tiu linio 18 simple diras, provu legi int de la uzanto klavaro kaj stoki ĝin ene de x, ĉe kion ajn adreso x okazas vivi ĉe. Kaj poste persiste, linio 19 simple diras, dankon pro la int, en tiu kazo. Do lasu min antaŭeniri kaj realigi ĉi. Do fari scanf 0. Lasu min antaŭeniri kaj zomi in Mi iros kaj kuri ĉi kun dots slash scanf 0. Nombro, mi petas? 50. Dankon por la 50. Do estas sufiĉe simpla. Nun kio ĝi ne faras? Tio ne faras tutan faskon de eraro checking. Ekzemple, se mi ne kunlaboras, kaj mi ne tajpas en nombro, sed anstataŭe mi skribas ion kiel "saluton", tio estas nur ia stranga. Kaj tial unu el la aĵoj la CS50 biblioteko estis farante por ni por kelkaj tempo estas ke reprompting kaj reprompting. La reprovi frazo revokon estis en cs50.c, kaj tio estas la kialo ke getInt en la CS50 biblioteko estas fakte ĉiu faskon da linioj longaj, ĉar ni estas kontrolanta por stultaj aĵoj kiel ĉi tio. Ĉu la uzanto ne donos ni, fakte, int? Ĉu li aŭ ŝi donu al ni ion kiel alfabeta litero? Se jes, ni volas detekti tio kaj krii al ili. Sed tion akiri pli interesa en la sekva ekzemplo. Se mi iras al scanf-1.c, kio estas la kiu estas fundamente ŝanĝis en ĉi sekva ekzemplo? Mi uzas char *, kompreneble, anstataŭ int. Do tiu estas interesa, ĉar char *, memori, estas vere nur la sama afero kiel kordo. Do li sentas kiel eble tiu estas super simpla apliko de GetString. Sed mi senŝeligis reen la mantelo de la CS50 biblioteko, do mi estas nomante tiun char * nun. Do ni vidu kie, se ie, Ni iras malbone. Linio 17 - Mi denove diras, bonvolu doni al mi ion, en ĉi tiu kazo, kordoj. Kaj poste en la sekva linio, mi vokas scanf, denove, donante al ĝi formato kodo, sed tiu tempo procento s. Kaj tiam tiu tempo, mi estas donante buffer. Nun rimarkos, mi ne uzas la kaj-signo. Sed kial estas tiu probable OK tie? Ĉar kio estas buffer jam? Estas jam puntero. Estas jam adreso. Kaj let estas tio vorto "konfuzi," lasu min nur nomas ĝin j, ekzemple, por simpleco. Sed mi nomis ĝin buffer ĉar en Ĝenerale, en programado, se vi havas eron de memoro, kiun kordoj vere nur estas, eble vi nomas ĝin buffer. Ĝi estas loko por stoki informo. Similaj al aĵoj kiel YouTube, kiam ili estas buffering, por tiel diri, ke nur signifas ĝi estas elŝutanta bitoj de la interreto kaj stoki ilin en lokaj tabelo, loka eron de memoro por ke vi povas rigardi ĝin poste sen ĝin saltante aŭ pendis sur vi dum reprodukti. Do tie estas problemo ĉi tie, tamen, ĉar mi diras scanf, atendi kordoj de la uzanto. Jen la adreso de eron de memoro. Meti ke kordo tie. Kial estas ke bara doni ni afliktigxas, kvankam? Kio estas tio? Ĉu mi rajtas aliri al tiu parto de memoro? Vi scias, mi ne scias. Pro tio bufro estis inicializado al nenio? Ne vere. Kaj tial estas kion ni estis nomante de rubo valoro, kiu ne estas formala vorto. Ĝi simple signifas ke ni ne havas ideon kion bitoj estas ene de la kvar bajtojn ke Mi destinis kiel bufro. Mi ne nomas malloc. Mi certe ne nomas GetString. Do kiu scias, kio estas fakte ene de buffer? Kaj tamen dirante scanf blinde, iru tie kaj metis ajn la uzanto tajpas. Do kio estas verŝajna kaŭzi en nia kodo se ni ruli ĝin? Probable segfault. Eble ne, sed probable segfault. Kaj mi diras eble ne ĉar kelkfoje vi faras, kelkfoje vi ne ricevas segfault. Kelkfoje vi ĵus ricevas sorton, sed ĝi estas tamen tuj estos cimon en nia programo. Do lasu min antaŭeniri kaj kompili ĉi. Mi tuj faros la malnova lernejo vojo. Do clang haltostreko 0, scanf-1, scanf-1.c, Enter. Oops, tro malnova lernejo. Ni vidu. Kien mi eniru? Ho, char * buffer. Ho, dankon - Konservi, OK - tre malnova lernejo. Bone, jam pasis iom da tempo. Do mi ĵus savis la dosieron post farante ke temporal ŝanĝi antaŭ momento. Kaj nun mi kompilis ĝin permane kun Clang. Kaj nun mi tuj iros antaŭen kaj kuri scanf-1, Enter. String bv. Mi tajpas en "saluton." Kaj nun, jen kie, sincere, printf povas estas iom ĝena. Ĝi fakte ne tuj segfault en ĉi tiu kazo. Printf estas iom speciala ĉar estas tiel super komune uzis tiun esence printf faras ni favoron kaj realigante, tio ne estas valida puntero. Lasu min preni tion sur min al ĝuste presi el en krampoj nula, eĉ kvankam tio ne nepre kion ni mem atendis. Do ni ne povas vere facile indukti segfault kun ĉi tio, sed klare tiu ne estas la konduto mi volis. Do kio estas la simpla solvo? Nu, en scanf-2, lasu min proponas ke anstataŭ fakte ĝuste atribui al char *, lasu min esti iom pli inteligenta pri ĉi tio, kaj lasu min atribui buffer kiel vico de 16 signoj. Do mi povas tion fari en kelkaj manieroj. Mi povus uzi absolute malloc. Sed mi povas reiri al semajno du kiam Mi nur bezonis tutan faskon da gravuloj. Tio estas nur tabelo. Do mi anstataŭ redifini buffer esti tabelo de 16 signoj. Kaj nun, kiam mi pasas bufro en - kaj tio estas io, kion ni ne raporti en semajno du - sed vi povas trakti tabelo kiel kvankam ĝi estas adreso. Teknike, kiel ni jam vidis, ili estas iomete malsamaj. Sed scanf ne gravas se vi pasas ĝin la nomo de tabelo, ĉar kion Clang faros por ni estas esence trakti la nomon de tiu tabelo kiel la adreso de la bloko de 16 bajtoj. Do tiu estas preferinda. Tio signifas, ke nun mi povos espereble faru la sekvajn. Lasu min malzomi dum momento kaj farata scanf-2, kompilita OK. Nun mi ne havas oblikvo scanf-2. String bv. "Saluton." Kaj ŝajnis funkcii ĉi tiu tempo. Sed povas iu proponas scenaro en kiun ĝi eble ne estas ankoraŭ funkcias? Jes? Io pli longa ol 16 signoj. Kaj efektive, ni povas esti iom pli precizan. Io plu tiam 15 karakteroj, ĉar vere ni bezonas havi en menso ke ni bezonas ke backslash nulo implice fine de la kordo, kiu estas flanken scanf volo tipe prizorgi por ni. Do mi faru ion kiel - kelkfoje ni povas nur lasi gxin tiel. Bone, do ni nun induktita nia segmentación kulpo. Kial? Ĉar mi tajpis al pli ol 15 karakterojn, kaj tiel ni vere tusxis memoron, ke mi efektive ne devus havi. Do kio estas vere la solvo ĉi tie? Nu, kio se ni bezonas pli longan ĉenon? Nu, ni eble faros 32 bajtoj. Nu, se tio ne sufiĉe longe? Kion pri 64 bitokoj? Kio se tio ne sufiĉe longe? Kiel ĉirkaŭ 128 aŭ 200 bitokoj? Kio vere estas la solvo ĉi tie en la ĝenerala kazo, se ni ne scias antaŭi kion la uzanto tuj tajpi? Estas nur speco de granda doloro en la azeno, por esti honesta, tial la CS50 biblioteko havas kelkdek linioj de kodo kiu kolektive implemento GetString kordo en maniero, ke ni ne devas scii anticipe, kion la uzanto tuj tajpi. En aparta, se vi retrorigardas al cs50.c de du semajnoj, vi vidos ke GetString fakte faras Ne uzu scanf en tiamaniere. Pli ĝuste, ĝi legas unu signo samtempe. Pro la agrabla afero pri legante unu signo estas ni povas garantii nin al ĉiam havi almenaŭ unu char. Mi povas nur deklari char, kaj poste prenu tiuj vere bebo paŝojn por ĝuste legi unu signo en ĉe fojo de la klavaro. Kaj tiam, kion vi vidos GetString faras estas ĉiufoje ĝi kuras el, diri, 16 bajtoj de memoro, ĝi uzas malloc, aŭ kuzo gxiajn al atribui pli da memoro, kopiante la malnova memoro en la nova, kaj poste rampis kune, atingi unu signo samtempe, kaj kiam ĝi kuras el tiu eron de memoro, ĵetas ĝin for, kroĉas pli grandan eron de memoro, kopias malnovan en novajn, kaj ripetas. Kaj estas vere doloron al reale apliki io ​​tiel simpla kiel ricevas enigon el la uzanto. Do vi povas uzi scanf. Vi povas uzi aliajn similajn funkciojn. Kaj multe da lernolibroj kaj rete ekzemploj faru, sed ili ĉiuj estas vundebla al problemoj kiel ĉi tio. Kaj fine, getting a segfault estas ia ĝena. Ĝi ne estas bona por la uzanto. Sed en la plej malbona kazo, kion faras ĝi fundamente meti vian kodo riskas? Ia atako, potenciale. Ni parolis pri unu tia atako - superfluas la stako. Sed ĝenerale, se vi permesas troplenigxis buffer, kiel ni faris kelkaj semajnoj, kun nur skribi pli ol "saluton" en la pilo, vi povas ja transpreni, potenciale, oni komputilo, aŭ almenaŭ atingi datumojn kiuj ne apartenas al vi. Do, en mallonga, tio estas kial ni havas tiuj trejnado radoj. Sed nun, ni komencas preni ilin, kiel niaj programoj ne plu bezonas, nepre, enigo de la uzanto. Sed en la kazo de problemo starigis ses, via enigo venos de grandega vortaro-dosiero kun 150 iom nepara mil vortoj. Do vi ne devos maltrankviligi la uzanto arbitrajn enigo. Ni donos al vi kelkajn supozojn pri tiu dosiero. Ajna demandojn sur montriloj aŭ scanf aŭ uzanto enigo ĝenerale? Bone, do rapida rigardo tiam je unu trenante temon de du semajnoj. Kaj tio estis jena nocio de struct. Ne tio, - tiu nocio de struct, kio estis kion? Kion struct faru por ni? Difini - sorry? Difini variablon tipo. Do ordigi de. Ni efektive kombini du temojn. Do kun typedef, memoru, ke ni povas deklari tipo de nia propra, kiel sinonimo, kiel ĉenon por char *. Sed uzante typedef kaj struct, ni povas krei vere nia propra datumstrukturoj. Ekzemple, se mi reirus en gedit ĉi tie dum nur momento, kaj mi iras antaŭen kaj faru ion kiel, lasu min konservi ĉi tiel, diru, structs.c provizore, mi nur irante iri antaŭen kaj inkluzivas standardio.h, int ĉefa malplena. Kaj tiam en tie, supozu, ke mi volas verki programon kiu stokas multnombraj studentoj de multnombraj domoj, ekzemple. Tiel estas kiel registrarial datumbazo de iu varo. Do se mi bezonas la nomon unu studento, mi povus fari ion kiel char * nomon, kaj Mi faros ion kiel - fakte, ni uzas la CS50 biblioteko por nur momenton por fari ĉi tion iom pli simpla, do ni povas prunti tiujn dekojn da linioj de kodo. Kaj ni simple teni ĝin simpla. Ni tenu gxin ĉenon, kaj nun GetString. Do mi asertas nun ke mi stokis la nomo de iu studento, kaj la domo de iu studento, simple uzante variabloj kiel ni faris en la semajno unu. Sed supozas ke mi nun volas subteni multnombraj studentoj. Bone, do mia instinktoj devas fari kordo name2, ricevas GetString, kordo house2 gets GetString. Kaj tiam nia tria studento, ni faru name3 GetString. Bone, do ĉi tiu estas espereble okulfrapa vi kiel speco de stulta, ĉar ĉi tiu procezo estas vere neniam tuj finos, kaj ĝi estas nur tuj fari mian kodo aspektas malbone kaj pli granda malbono. Sed ni solvis ĉi tro en semajno du. Kio estis nia relative pura solvo kiam ni havis plurajn variablojn de la sama datumtipo estas ĉiuj rilataj, sed ni ne volas ke tiu terura katastrofo de simile, variabloj? Kion ni faru anstataŭ? Do mi kredas ke mi aŭdis kelkajn lokojn. Ni havis tabelo. Se vi volas multnombraj kazoj de io, kial ni ne purigas tiun tutan supren kaj ĝuste diri, donu al mi tabelo nomis nomojn? Kaj por nun, ni forte kodo 3. Kaj tiam donu al mi alian tabelo vokis domoj, kaj lasu min por nun forte kodo 3. Kaj mi amase purigis la salaton, ke mi ĵus kreis. Nun, mi ankoraŭ malfacile koditaj 3, sed eĉ la 3 povus dinamike venas de la uzanto, aŭ argv, aŭ simila. Do tiu estas jam pli pura. Sed kio estas pri tiu ĝena estas ke nun, eĉ se nomo estas iel fundamente ligita al studento domo - ĝi estas studento, ke mi vere volas reprezenti - Mi nun havas du tabeloj kiuj estas paralela en la senco ke ili estas la sama amplekso, kaj nomoj krampo 0 supozeble mapojn al domoj krampo 0, kaj nomoj krampo 1 mapoj al domoj krampo 1. En aliaj vortoj, kiuj studento loĝas en tiun domon, kaj tiu alia studento loĝas en tiu alia domo. Sed verŝajne ĉi tiu povus esti faris eĉ pli pure. Nu, ĝi povas, fakte. Kaj lasu min antaŭeniri kaj malfermi supren structs.h, kaj vi instruos vin vidu tiun ideon tie. Rimarku, ke mi uzis typedef, kiel vi aludas antaŭ momento deklari nian propra datumtipo. Sed mi ankaŭ uzas tiun ĉi alia ŝlosilvorto vokis struct kiu donas al mi novan datumstrukturo. Kaj ĉi tiu datumstrukturo mi asertas tuj havi du aferoj ene de it - ĉenon nomis nomon, kaj ĉeno nomata domo. Kaj la nomo Mi tuj donos al tiu datumstrukturo tuj esti nomita studento. Mi povus nomi ion mi volas, sed ĉi semantike fari senti min en mia menso. Do nun, se mi malfermos pli bona versio de la programo mi komencis skribi tie, lasu min rulumi al la supro. Kaj kelkaj pliaj linioj de kodo ĉi tie, sed permesu al mi koncentri por Nuntempe sur unu. Mi jam deklaris konstanta nomita studentoj kaj hard coded 3 por nun. Sed nun, rimarki kiom puraj mia kodo komencas akiri. En linio 22, mi deklaras tabelo de studentoj. Kaj rimarki ke lernanto estas ŝajne nun datumtipo. Ĉar ĉe la supro de ĉi tiu dosiero, rimarki Mi komprenis ke header dosieron ke mi tiris supren nur antaŭ momento. Kaj tio header dosieron tutsimple havis tiu difino de studento. Do nun, mi kreis mian propran datumoj tipo, ke la aŭtoroj de C jaroj antaŭe ne pensis antaŭe. Sed neniu problemo. Mi povas fari tion mem. Do tiu estas tabelo nomata studentoj, ĉiu el kies membroj estas studento strukturo. Kaj mi volas tri el tiuj en la tabelo. Kaj nun, kion faras la reston de tiu programo faras? Mi bezonis iu iom arbitra. Tuj kiam de linio 24 pluen, Mi persisti de 0 al 3. Mi tiam demandas al la uzanto por la studenta nomo. Kaj tiam mi uzas GetString kiel antaŭe. Do mi petos la studenta domo, kaj mi uzas GetString kiel antaŭe. Sed avizo - iomete nova peco de sintakso - Mi povas ankoraŭ indekso al la i-a studento, sed kiel Mi alvenas ĉe la specifa datumoj kampo ene de la struct? Nu, kio estas ŝajne la nova peco de sintakso? Estas nur la skalara operatoro. Ni ne vere vidis tiun antaŭe. Vi jam vidis gxin en pset kvin se vi havas eniĝis en la jam kun bitmap dosierojn. Sed la skalara nur signifas ene de ĉi struct aŭ multnombraj kampoj, donu dot nomo, aŭ doni al mi dot domo. Tio signifas iras ene de la struct kaj akiri tiujn apartajn kampojn. Kion faras la reston de tiu programo faras? Ne ĉiuj kiuj sexy. Rimarku, ke mi persisti de 0 al 3 denove, kaj mi simple krei la angla frazo kiel tia kaj tia estas en tiaj kaj tia domo, pasante en dot nomon de la i-a lernanto kaj lia domo tiel. Kaj poste persiste, nun ni komencu akiri anal pri tio, nun ke ni estas familiara kun kio malloc kaj aliaj funkcioj estis faras ĉiu ĉi tempo. Kial mi devas liberiĝi ambaŭ nomo kaj domo, kvankam mi ne nomis malloc? GetString faris. Kaj tiu estis la malpura malgranda sekreto por kelkaj semajnoj, sed GetString havas iris filtrante memoro tra la tuta meti ĉiuj semestro tiom. Kaj valgrand volo fine malkaŝi tion al ni. Sed tio ne estas granda interkonsento, ĉar mi scias, ke mi povas simple liberigi la nomo kaj la domo, kvankam teknike, al estu super, super sekuraj, mi devus esti faras iun eraron kontrolinte tie. Kio estas via instinktoj diras al vi? Kion mi povas kontroli por antaŭ ol mi liberigi kio estas kordo, aka kiu char *? Mi devus vere esti kontrolanta se studentoj krampo i dot nomo ne egala nula. Tiam estos bone por antaŭeniri kaj libera ke pointer, kaj sama aŭ alian tiu siavice. Se lernantoj krampo i dot domo ne estas egala al nula, tiu nun protektos kontraŭ la angulo kazo en kiu GetString revenas iun kiel nula. Kaj ni vidis antaŭ momento, printf volo protekti nin ĉi tien ĝuste dirante nula, kiu tuj serĉos stranga. Sed almenaŭ ĝi ne segfault, kiel ni jam vidis. Nu, lasu min fari unu alia afero ĉi tie. structs-0 estas speco de stulta programo ĉar mi eniras tiun tutan datumojn, kaj poste ĝi estas perdita fojo la programo finiĝas. Sed lasu min antaŭeniri kaj fari ĉi tion. Lasu min fari la fina fenestro iom pli granda. Lasu min fari structs-1, kiu estas nova versio de ĉi. Mi zomi iomete. Kaj nun mi kuros dot slash structs-1. Studenta nomo - Davido Mather, ni faru Rob Kirkland, ni faru Lauren Leverett. Kio estas interesa nun estas avizo - kaj mi nur scias tion, ĉar Mi skribis la programon - ekzistas dosiero nun en mia aktuala dosierujon nomita students.csv. Iuj el vi eble vidis tiuj en la reala mondo. Kio estas CSV-dosiero? Komo-disigita valoroj. Estas iel kiel malriĉa homo, versio de Excel dosiero. Ĝi estas tablo de vicoj kaj kolumnoj, ke vi povas malfermi en programo kiel Excel, aŭ Nombroj sur Mac. Kaj se mi malfermas tiun dosieron ĉi tie sur gedit, avizo - kaj la numeroj ne estas tie. Tio nur gedit diri mi linio nombroj. Rimarku en la unua linio de tiu dosiero estas David kaj Mather. La sekva linio estas Rob komo Kirkland. Kaj la tria linio estas Lauren komo Leverett. Do kion mi kreis? Mi nun skribas C programon kiu efektive povas generi ŝtono kiu povas esti malfermita en programon kiel Excel. Ne ĉiuj kiuj konvinka datumoj aro, sed se vi havas multe pli grandaj pecoj de datumoj, ke vi efektive volas manipuli kaj fari grafikaĵoj de kaj la kiel, ĉi tiu estas eble unu maniero krei tiun datumoj. Cetere, CSVs estas fakte super komuna nur por stoki simpla datumo - Yahoo Financoj, ekzemple, se vi ricevas stock quotes tra iliaj tn API, la libera servo kiu permesas akiri aktualan supren-al-la-dato stoko citaĵojn por entreprenoj, ili doni la datumojn tie en la super simpla CSV formato. Do kiel ni faros tion? Nu rimarki, la plejparto de ĉi tiu programo preskaŭ la sama. Sed rimarkos cxi tie, anstataŭ presi la studentoj ekstere, sur linio 35 antaŭen, mi asertas ke mi ŝparas la lernantoj al disko, do ŝpari dosieron. Do rimarki min deklari DOSIERO * - Nun, ĉi tiu estas speco de anomalio en C. Ial ajn DOSIERO estas ĉiuj kaskedoj, kiu ne estas kiel plej parto de aliaj datumtipoj en C. Sed ĉi tiu estas integrita datumtipo, DOSIERO *. Kaj mi deklari puntero al dosiero, Estas kiel vi povas pensi pri tio. fopen signifas malferma dosiero. Kio dosieron vi volas malfermi? Mi volas malfermi dosieron kiun mi volas arbitre nomas students.csv. Mi povus nomi kiun ajn mi volas. Kaj poste preni konjekton. Kion faras la dua argumento al fopen probable signifas? Ĝuste, w por skribi, ĉu esti r por legado. Tie estas por append se vi volas aldoni vicoj kaj ne anstataŭigi la tuta afero. Sed mi nur volas krei tiun dosieron fojon, do mi uzos citaĵo unquote w. Kaj mi scias, ke nur de esti legitaj la dokumentadon, aŭ la homo paĝo. Se dosiero estas ne nulaj - alivorte, se nenio misokazis tie - lasu min persisti pri la studentoj de 0 al 3. Kaj nun rimarkas ke estas io iam tiel iomete malsamajn pri linio 41 ĉi tie. Ĝi ne estas printf. Estas fprintf por dosiero printf. Do tuj skribi al dosiero. Kiun dosieron? La unu kies puntero vi specifas kiel la unua argumento. Tiam ni specifi formato kordo. Tiam ni precizigi kion string ni volas plug in por la unua procento s, kaj tiam alia variablo aŭ la dua procento s. Tiam ni fermas la dosieron kun fclose. Ol mi liberigi la memoron kiel antaŭe, kvankam Mi devas iri reen en kaj aldoni iuj ĉekojn por nula. Kaj tio estas ĝi. fopen, fprintf, fclose donas al mi la kapablo krei tekstaj dosieroj. Nun, vi vidos en problemo aro kvin, kiu engaĝas bildoj, vi uzos duumajn dosierojn anstataŭe. Sed fundamente, la ideo estas la sama, eĉ se la funkcioj vi instruos vin vidas estas iomete malsamaj. Do trombo tour, sed vi akiros tro familiara kun dosieron I/O-- enigo kaj eligo - kun pset kvin. Kaj demandojn pri la komenca fundamentojn tie? Jes? Kio se vi provas liberigi nulan valoron? Mi kredas, krom libera alvenis al iom pli uzantamika, vi povas potenciale segfault. Pasante ĝin nula estas malbone ĉar mi ne kredu libera tedas por kontroli vin, ĉar estus potenciale esti restaĵoj de tempo por ĝin fari sin por ĉiuj en la mondo. Bona demando, kvankam. Bone, do ĉi tiu speco de gets nin al interesa temo. La temo de problemo aro kvin estas forensics. Almenaŭ tio estas parto de la problemo aro. Forensics ĝenerale rilatas al la reakiro de informo kiu povas aŭ povas ne esti forigita intence. Kaj do mi pensis mi volus doni al vi rapidan gusto de kio vere okazas ĉiu tiu tempo sub la kapuĉo de via komputilo. Ekzemple, se vi havas ene de via portebla aŭ via labortablo komputilo malmola disko, estas ĉu mekanika aparato kiu fakte ŝpinas - tie estas cirkla aĵoj nomata pladoj kiuj aspektas sufiĉe ŝatas kion mi nur havis sur la ekrano tie, kvankam ĉi tiu estas pli malnova lernejo. Tio estas tri-kaj-al-duono coloj malmola disko. Kaj tri kaj duona coloj raportas de kun de la afero kiam vi instalu ĝin en komputilo. Multaj el vi infanoj en viaj komputiloj nun havas solida stato diskoj, aŭ unuecoj SSD, kiuj ne movi partojn. Ili estas pli kiel RAM kaj malpli kiel tiuj mekanikaj aparatoj. Sed la ideoj daŭre estas la sama, certe kiel ili rilatas al problemo starigis kvin. Kaj se vi pensas nun malmola disko reprezentas esti rondo, kiu Mi desegnas kiel ĉi tie. Kiam vi kreas dosieron en via komputilo, ĉu ĝi estas SSD, aŭ en tiu kazo, plej granda lernejo malmola disko, tiu dosiero komprenas multnombraj bitoj. Diru ke temas pri tiu ĉi 0 kaj 1, tutan faskon de _0s_ kaj 1s. Do ĉi tiu estas mia tuta malmola disko. Tio estas ŝajne sufiĉe granda dosiero. Kaj oni uzas ĉe la _0s_ kaj 1s en tiu parton de la fizika plado. Nu, kio estas fizika parto? Nu, tio rezultas ke la malmola disko, almenaŭ de tiu tipo, ne estas tiuj etaj iom magnetaj eroj. Kaj ili esence havas nordo kaj suda polusoj al ili, tiel ke se vi turni unu el tiuj magnetaj eroj tiu formo, vi povus diri ke ĝi estas reprezentante 1. Kaj se ĝi estas renversita suden al nordo, vi povus diri ke ĝi estas reprezentante 0. Do, en la reala fizika mondo, jen kiel vi povis reprezenti ion duuma stato de la 0 kaj 1. Do jen ĉio dosiero estas. Ekzistas tuta amaso de magneta eroj kiuj estas iliaj tiu maniero aŭ tiamaniere, kreante ŝablonoj de _0s_ kaj 1s. Sed ĝi rezultas kiam vi konservos dosieron, iuj informoj estas savita aparte. Do tiu estas malgranda tablo, dosierujo, por tiel diri. Kaj Mi vokos tiu kolumno nomo, kaj Mi nomas tiun kolumnon loko. Kaj mi tuj diros, supozi ĉi tiu estas mia vivresumo. Mia resume.doc estas stokita en situo, diru 123. Mi ĉiam iras por tiu numero. Sed sufiĉas diri, ke nur ŝatis en RAM, vi povas preni malmolan diskon tio estas gigabajto aŭ 200 gigabajtoj aŭ terabajto, kaj vi povas numeron ĉiuj bajtoj. Vi povas kalkuli ĉiujn pecojn el 8 bitoj. Do ni diru ke tiu Estas situo 123. Do tiu ĉi dosierujo ene de mia mastruma Sistemo memoras, ke mia vivresumo estas je situo 123. Sed metas interesa kiam vi forviŝi dosieron. Do ekzemple - kaj dankeme, la plejparto de la mondo havas kaptita sur tio - kio okazas kiam vi treni dosieron al via Mac OS Trash aŭ via Windows Reutiliga Bin? Kio estas la celo de fari tion? Estas evidente por forigi la dosieron, sed kion faras la akto de trenante kaj delasante en viajn Trash aŭ vian Reutiliga Bin fari per komputilo? Absolute nenio, vere. Estas nur kiel dosierujo. Ĝi estas speciala dosierujo, certe. Sed tio ĝi efektive forigi la dosieron? Nu, ne, ĉar kelkaj el vi verŝajne estis kiel, oh damn, vi ne intencas fari tion. Do vi duoble klaku la Trash aŭ Reutiliga Bin. Vi poked ĉirkaŭe kaj vi reakiris la dosieron nur trenante ĝin el tie. Do klare, ne nepre viŝi ĝin. OK, vi estas pli inteligenta ol tio. Vi scias, ke ĝuste trenante ĝin en la Trash aŭ Reutiliga Bin ne signifas vi malplenigi la rubujon. Do vi iru al la menuo, kaj vi diras Malplena Trash aŭ Malplena Reutiliga Bin. Tiam kio okazas? Jes, do ĝi estas forigita pli. Sed cxio, kio okazas estas tiu. La komputilo forgesas kie resume.doc estis. Sed kio ne ŝanĝis ŝajne en la bildo? La bitoj, la _0s_ kaj 1s ke mi asertas estas en la loko de iu fizika aspekto de la aparataro. Ili estas ankoraŭ tie. Estas nur la komputilo havas forgesis, kio ili estas. Do ĝi estas esence liberigis la dosiero bitojn por ke ili povas reuzi. Sed ne ĝis vi krei pli dosierojn, kaj pli dosierojn, kaj pli dosierojn volo probabilísticamente, tiuj _0s_ kaj 1s, tiuj magnetaj eroj, get reuzi, upside aŭ dekstra flanko, cxar aliaj dosieroj, _0s_ kaj 1s. Do vi havas ĉi fenestro de tempo. Kaj ne de antaŭvideblaj longitudo, vere. Ĝi dependas de la grandeco de via malmola drive kaj kiom da dosieroj vi havas kaj kiel rapide vi faru novajn. Sed estas ĉi fenestro de tempo dum kiu tiu dosiero estas ankoraŭ perfekte recuperable. Do, se vi iam uzi programojn kiel McAfee aŭ Norton por provi reakiri datumoj, ĉiuj ili faras provas reakiri ĉi tn dosierujo eltrovi kie estas via dosiero estis. Kaj kelkfoje Norton kaj diros: dosiero 93% recuperable. Nu, kion tio signifas? Tio nur signifas, ke iu alia dosiero hazarde finis uzante, ekzemple, tiuj bitoj el via originala dosiero. Do kio estas reale implikita en reakiri datumoj? Nu, se vi ne havas ion kiel Norton antaŭ-instalita sur via komputilo, la plej bona vi povas iam fari estas rigardi en la tuta malmola disko serĉi mastroj de bitoj. Kaj unu el la temoj de problemo aro kvin estas ke vi sercxos la ekvivalento de malmola disko, kun jura bildo de kompakta flash karto de cifereca fotilo, serĉante la _0s_ kaj 1s kiu tipe, kun altaj probablo, ili reprezentas la komenci de JPEG-bildon. Kaj vi infanoj povas reakiri tiujn bildojn de supozante, se mi vidas tiun bildon de bitoj en la jura bildo, kun alta probablo, kiu markas la komenco de JPEG. Kaj se mi vidas la saman desegnon denove, ke probable markas la komencon de alia JPEG, kaj alia JPEG, kaj alia JPEG. Kaj jen estas tipe kiel datumoj reakiro funkcios. Kio estas agrable pri JPEG-oj estas kvankam la formato de dosiero mem estas iom kompleksa, la komenco de ĉiu tia dosiero estas fakte sufiĉe identigebla kaj simpla, kiel vi vidos, se vi havas ne jam. Do ni prenu pli proksiman rigardon sube la kapuĉo pri ekzakte kio estis oni iris kaj kion tiuj _0s_ kaj 1s estas, por doni al vi iom pli ol kunteksto por tiu aparta defio. [VIDEO reprodukto] -Kie via PC stokas plej el lia permanenta datumoj. Por fari tion, la datumoj vojaĝas de RAM kune kun la programaro signalojn kiuj rakontas la malmola disko kiel memori ke la datumoj. La malmola disko cirkvitoj traduki tiujn signalojn en tensio fluktuoj. Tio, siavice, kontroli la malmola disko de movi partojn, iuj el la malmultaj movi partojn restigis en la moderna komputilo. Kelkaj el la signaloj kontroli motoro kiuj ŝpinas metalo-kovrita pladoj. Viaj datumoj estas vere stokita sur ĉi tiuj pladoj. Aliaj signaloj movi la legado / skribo kapoj por legi aŭ skribi datumojn sur la pladoj. Ĉi maŝinaro tiel preciza ke homa hararo eĉ ne povis pasi inter la kapojn kaj ŝpini pladoj. Tamen, ĉio laboras en terura rapidoj. [FINO reprodukto de vídeo] DAVID Malan: Zoom en iom profunda nun kio estas fakte en tiuj pladoj. [VIDEO reprodukto] -Ni rigardu kion ni ĵus vidis en malrapida movado. Kiam mallonga premas de elektro estas sendita al la legado / skribi kapo, se klakas sur eta elektromagneta por frakcio de sekundo. La magneto kreas kampo, kiu ŝanĝas la polarity de eta, eta parton de la metalo eroj kiuj coat ĉiu plado surfaco. Al ŝablono serio de tiuj etaj, akuzita-supren areoj sur la disko reprezentas unuopa bito de datumojn en la duuma nombro sistemo uzita de komputiloj. Nun, se la nuna estas sendita unu vojo tra la legado / skribo kapo, la areo estas polarizita en unu direkto. Se la nuna estas sendita en la kontraŭa direkto, la polarizo estas inversa. Kiel vi akiras datumoj sur la fiksa disko? Nur inversigi la procezo. Do estas la eroj en la disko kiu alvenas la fluo en la legi / skribi kapo moviĝas. Kunmetis milionojn da tiuj imantado segmentoj, kaj vi havas dosieron. Nun, la pecoj de sola dosiero eble disigxos ĉie unueco de pladoj, speco de kiel la katastrofo de paperoj sur via skribotablo. Do speciala ekstra dosieron sekvadon de kie ĉiu. Ĉu vi ne deziras, ke vi havis io simila? [FINO reprodukto de vídeo] DAVID Malan: Bone, verŝajne ne. Do kiel multaj el vi infanoj kreskis kun tiuj? Bone, do ĝi estas malpli kaj malpli manoj ĉiu jaro. Sed mi ĝojas ke vi estas almenaŭ familiara kun ili, ĉar ĉi tiu kaj nia propra libro demo, malfeliĉe, mortas tre malrapida morto tie de familiareco. Sed ĉi tiu estas kion mi, almenaŭ, tie en alta lernejo, uzis uzon por kopioj. Kaj estis mirinda, ĉar vi povus stoki 1.4 megabajtoj sur tiu aparta disko. Kaj tio estis la alta denseco versio, kiel indikitaj de la HD, kiu havas signifas antaŭ la hodiaŭa HD filmetoj. Norma denseso 800 kilobajtoj. Kaj antaŭ tio, estis 400-kilobajto diskoj. Kaj antaŭ tio, estis 5 kaj 1/4 colo diskojn, kio estis vere disketon, kaj iom pli larĝa kaj pli altkreska ol tiuj aĵoj ĉi tie. Sed vi povas fakte vidi la tn disketon aspekto de tiuj diskoj. Kaj funkcie, ili estas efektive sufiĉe simila al malmolaj diskoj de ĉe Almenaŭ tiu tipo. Denove, unuecoj SSD en pli novaj komputiloj labori iom malsame. Sed se vi movas ke iom metalo langeto, vi povas fakte vidi iom kuketo, aŭ plado. Ne estas metalo kiel ĉi tiu. Ĉi tiu fakte iuj malkaraj mola materialo. Kaj vi povas ia movi ĝin. Kaj vi trully ĵus forviŝis de sur kelkaj nombro de bitoj aŭ magneta eroj el tiu ĉi disko. Do dankeme, estas nenio en ĝi. Se tio afero estas en la maniero - kaj kovru viaj okuloj kaj tiuj de via proksimulo - vi povas nur ia tiri tiun tuta ingon ekstere tiel. Sed estas iom printempo, do estu konscias pri tio kun viaj okuloj. Do nun vi havas vere disketo. Kaj kio estas rimarkinda pri tiu estas ke en tiom kiom tio estas malgrandskala reprezento de pli granda malmola disko, tiuj aferoj estas super, super simpla. Se vi pinĉi la fundo de tio, nun ke ke metalo afero estas for, kaj senŝeligi ilin malfermi, la tuta estas estas du pecojn de sentis kaj la tn disketo kun peco de metalo sur la enen. Kaj iras duono de mia disko la enhavo. Tie iras alia duono de ili. Sed tio estas cxio, kion ŝpinis ene de via komputilo en la pasintaj tempoj. Kaj denove, por meti ĉi tion en perspektivon, kiom granda estas la plimulto de via malmola pelas tiuj tagoj? 500 gigabajtoj, oni terabajto, eble en labortabla komputilo, 2 terabytes, 3 terabytes, 4 terabytes, ĉu ne? Tiu estas unu megabajto, donos nek prenos, kio povas eĉ persvadis tipa MP3 plu tiujn tagojn, aŭ iu simila muziko dosiero. Do iom memoraĵo por vi hodiaŭ, kaj ankaŭ por helpi contextualizar kio ni prenos por sentado nun en problemo starigis kvin. Tuj kiam tiuj estas via gardi. Do mi transiro al kie estos elspezante la sekvanta pset tiel. Do ni nun povas tion paĝon por - oh, kelkaj anoncoj rapide. Ĉi tiu vendredo, se vi ŝatus aliĝi CS50 por tagmanĝi, iru al la kutima loko, cs50.net/rsvp. Kaj fina projekto - tiel por la Syllabus, ni eldonis la fina projekto specifo jam. Konscii, ke tio ne signifas ĝi estas pro aparte frue. Ĝi estas eldonita, vere, nur por akiri you guys pensante pri ĝi. Kaj efektive, la super signifa procento de vi estos pritrakti fina projektojn en materialo, ke ni eĉ ne alvenis al la klaso, sed volo kiel frua kiel venontan semajnon. Rimarku, tamen, ke la spec vokas kelkaj diversaj komponantoj de la fina projekto. La unua, en kelkaj semajnoj, estas antaŭ-propono, bela hazarda retpoŝton al via TF por diri al li, kaj kion vi estas pensi pri via projekto, kun neniu devontigo. Propono estos via aparta devontigo, dirante, tie, tio estas kio Mi ŝatus fari por mia projekto. Kion vi opinias? Tro granda? Tro malgranda? Ĉu regebla? Kaj vi vidos la spec por pli da detaloj. Paro de semajnoj post tio estas la statuso raporto, kiu estas simile hazardaj retmesaĝon al via TF diri kiom malproksime malantaŭ vi estas en via fina projekto efektivigo, sekvate de la CS50 Hackathon al kiu ĉiuj estas invitita, kiu estos evento de 8:00 PM sur unu vesperon ĝis 7:00 AM la sekva mateno. Pico, kiel mi menciis en la semajno nulo, wil utili je 9:00 PM, Ĉina manĝo je 1:00 AM. Kaj se vi estas ankoraŭ viglaj je 5:00 AM, ni prenos vin al IHOP por matenmanĝo. Do la Hackathon estas unu el la plej memorindaj travivaĵoj en la klaso. Tiam la efektivigo estas pro, kaj tiam la klimataj CS50 Foiro. Pliaj detaloj sur ĉiuj de ĉi tiuj en la semajnoj venonta. Sed ni reiru al io malnova lernejo - denove, tabelo. Do tabelo estis bela, ĉar ĝi solvas problemoj kiel ni vidis nur antaŭ momento kun studento strukturoj ricevas iom ekstere de kontrolo, se ni volas havi studento unu, studento du, studento tri, studento dot dot dot, iuj arbitraj nombro de studentoj. Do arrays, kelkajn semajnojn, abrupte malsuprenflugis en kaj solvitaj ĉiuj niaj problemoj de ne sciante anticipe kiom da aferoj de iu tipo ni volas. Kaj ni vidis ke structs povas helpi nin plu organizi niajn kodo kaj teni koncepte simila variabloj, kiel nomo kaj domo, kune, tiel, ke ni povas trakti ilin kiel unu enton, ene de kiuj estas pli malgrandaj pecoj. Sed arrays havas iujn malfacilaĵojn. Kio estas kelkaj el la malavantaĝoj ni renkontis kun arrays tiel multe? Kio estas tio? Fiksa grandeco - do eĉ kvankam vi povus povos rezervi memoron por tabelo, unufoje vi scias, kiel multaj studentoj vi havas, kiom da signoj vi havas de la uzanto, unufoje vi jam asignitaj la tabelo, vi ia pentrita vin en angulon. Ĉar vi ne povas enmeti novajn elementojn en la mezo de tabelo. Vi ne povas enigi pli elementoj fine de tabelo. Vere, vi devas veni al kreante tute nova tabelo, kiel ni diskutis, kopiante la malnova al la nova. Kaj denove, tio estas la kapdoloro, ke GetString traktas por vi. Sed denove, vi ne povas eĉ enmeti io en la mezo de la tabelo se la ritmo ne tute plenigis. Ekzemple, se ĉi tiu tabelo tie de grandeco ses nur havas kvin aĵojn en ĝi, bone, vi povus simple Tack io sur la fino. Sed kion se vi volas enmeti ion en la mezo de la tabelo, kvankam tio povus havi kvin el ses aferoj en ĝi? Nu, kion ni faros kiam ni havis ĉiujn de nia homa volontuloj scenejo en semajnoj estinteco? Se ni volis meti iun ĉi tie, ĉu tiuj homoj kiel movi ĉi vojo, aŭ tiuj homoj kiel movi ĉi maniero, kaj tio fariĝis multekosta. La movo de homoj ene de tabelo finis adicianta supren kaj kostante ni tempon, do multaj el niaj n kvadratoj kurante tempoj kiel inserción varon, por Ekzemple, en la plej malbona kazo. Do arrays estas grandaj, sed devas scii anticipe kiel granda vi volas ilin. Do okej, jen solvo. Se mi ne scias anticipe kiom da lernantoj mi havu, kaj mi scias unufoje Mi decidas, kvankam, mi ne scias kie trovi kun tiu multaj lernantoj, kial mi ne ĝuste ĉiam destini duoble da spaco kiel mi povis pensi mi bezonas? Ĉu tio ne estas racia solvo? Realisme, mi ne pensas ke ni estas tuj bezonos pli ol 50 fendoj en tabelo por meza grandeco klaso, do ni nur rondigi supren. Mi faros 100 fendoj en mia tabelo, nur tiel ke ni povos definitive akiri la nombro de studentoj mi anticipas esti en iu meza grandeco klaso. Do kial ne simple rondigi supren kaj destini pli memoro, tipe, por tabelo ol vi kredas ke vi povus eĉ bezonas? Kio estas tio simpla pushback al tiu ideo? Vi simple malŝparas memoro. Laŭvorte ĉiu programo skribas tiam Estas eble uzi duoble da memoro kiel vi fakte bezonas. Kaj tio simple ne sentas min kiel aparte eleganta solvo. Cetere, nur malpliigas la probablo de problemo. Se vi hazarde havas popularan kurson unu semestro kaj vi havas 101 studentoj, via programo estas ankoraŭ fundamente alfrontante la saman temon. Do dankeme, estas solvo por ĉi tiun anoncon ĉiuj niaj problemoj en la formo de datumstrukturoj, kiuj estas pli kompleksaj ol tiuj, ni vidis tiom. Tio, mi asertas, estas lerta kunligita. Jen listo de nombroj - 9, 17, 22, 26, kaj 34 - kiuj estis kunligitaj per vojo de kio mi desegnita kiel sagoj. En aliaj vortoj, se mi volis reprezenti tabelo, mi povis fari iu kiel ĉi tio. Kaj Mi metos tion en la superkape en nur momento. Mi povus fari - saluton, tute certe. Stand by. Nova komputilo tie, klara - tute certe. Do, se mi havas ĉi tiujn numerojn en tabelo - 9, 17, 22, 26, 24 - ne nepre por grimpi. Bone, do jen mia tabelo - oh my god. Bone, do jen mia tabelo. Ho, mia dio. [Ridado] DAVID Malan: ŝajnigi. Ĝi estas tro multa peno reiri kaj fiksi ke, tial tie - 26. Do ni havas ĉi tiun tabelo de 9, 17, 22, 26, kaj 34. Por tiuj el vi povas vidi la hontinda eraro mi ĵus faris, tie ĝi estas. Do mi asertas ke ĉi tiu estas tre efika solvo. Mi destinis kiel multaj ints kiel Mi bezonas - unu, du, tri, kvar, kvin, ses aŭ - kaj mi tiam stokitaj la numeroj ene de ĉi tabelo. Sed supozu, do, mi volas enmeti valoro kiel la numero 8? Nu, kie ĝi iras? Supozu mi volas enmeti nombro kiel 20. Nu, kie ĝi iras? Ie tie, en la mezo, aŭ la nombro 35 havas iri ie ĉe la fino. Sed mi estas ĉiu el la spaco. Kaj tiel tio estas fundamenta defio de arrays tio estas la solvo. Mi asertis antaŭ momento, GetString solvas tiun problemon. Se vi volas enmeti sesa nombro en ĉi tiu tabelo, kio estas almenaŭ unu solvo povas refalis sur sekura, same kiel ni faras kun GetString? Kio estas tio? Nu, fari ĝin pli granda estas facile dirite ol farite. Ni ne povas nepre fari la tabelo pli grandaj, sed kion ni povas fari? Faru nova tabelo kiu estas pli granda, de grandeco 6, aŭ eble grandeco 10, se ni volas eliri antaŭeniras de aferoj, kaj poste kopii la malnova tabelo en la nova, kaj poste liberigi la malnova tabelo. Sed kio estas la rula tempo nun de tiu procezo? Estas granda O de n, ĉar la kopio tuj kostos al vi kelkajn ekzemplerojn de , do ne tiel ideala se ni devas destini nova tabelo, kiu tuj konsumi duoble pli memoro provizore. Kopiu malnova en novajn - Mi volas diri, estas nur kapdoloron, kiu estas, denove, kial ni skribis GetString por vi. Do kio povus ni faru anstataŭ? Nu, se nia datumstrukturo reale havas truojn en ĝi? Supozu, ke mi malstreĉiĝi mia celo de havi apudaj pecoj de memoro, kie 9 Estas tuj apud 17, kiu estas dekstra flanko de 22, kaj tiel plu. Kaj supozu, ke 9 povas esti super tie en RAM, kaj 17 povas esti super tie en RAM, kaj 22 povas esti super tie en RAM. Alivorte, mi ne bezonas ilin eĉ kun malantaŭo al malantaŭo plu. Mi nur devas iel enhebrar kudrilo tra ĉiu el tiuj numeroj, aŭ ĉiu de ĉi tiuj nodoj, kiel ni nomas la ortanguloj kiel mi desegnis ilin, memori pri kiel atingi la lastan tiaj nodo de la unua. Do kio estas la programado konstrui ni vidis sufiĉe ĵus kun kiu mi povas apliki tiu fadeno, aŭ desegnita tie, kun kiu mi povas apliki tiujn sagoj? Do montriloj, ĉu ne? Se mi malŝparas ne nur int, sed nodo - kaj por nodo, mi simple signifas ujo. Kaj vide, mi volas diri rektangulo. Do nodo ŝajne bezonas enhavi du valoroj - la int mem, kaj tiam, kiel implicita de la fundo de la duono de la ortangulo, sufiĉa spaco por int. Do nur pensante antaŭen tie, kiom granda estas ĉi tiu nodo, tiu ujo en demando? Kiom da bajtoj por la int? Supozeble 4, se estas la sama kiel kutima. Kaj tiam, kiom da bitokoj por la puntero? 4. Do ĉi ujo, aŭ ĉi tiu nodo, estas tuj estos 8-bajto strukturo. Ho, kaj tio estas feliĉa hazardo ke ni simple enkondukis tiun nocion de oni struct, aŭ C strukturo. Do mi asertas ke mi volas doni paŝon kun tiu pli kompleksa efektivigo de listo de nombroj, oni ligitaj listo de nombroj, mi bezonas fari iom pli pensado ĉe fronto kaj deklari ne nur int, sed struct ke mi vokos, konvencie ĉi tie, nodo. Ni povus nomi ion ni volas, sed nodo tuj estos temáticas en amaso de la aĵoj ni komencas rigardi nun. Ene de tiu nodo estas int n. Kaj tiam tiu sintakso, iom weird unuavide - struct nodo * proksimaj. Nu pictóricamente, kio estas tio? Tio estas la malsupera duono de la ortangulo, kiun ni vidis nur antaŭ momento. Sed kial mi diras struct nodo * kontraste al nur nodo *? Ĉar se tiu puntero notas en alia nodo, estas nur la adreso de nodo. Tio estas konsekvenca kun kion ni diskutis pri montriloj tiom. Sed kial, se mi pretendas tiu strukturo estas vokis nodo, mi devas diri struct nodo ene tie? Ekzakte. Estas iel stulta realaĵo de C. La typedef, por tiel diri, ne havas okazis ankoraŭ. C Super laŭvorta. Ĝi legas vian kodon supre fundo, maldekstre dekstren. Kaj ĝis batas ke punktokomo en la funda linio, divenu kion ne ekzisti kiel datumtipon? Nodo, citaĵo unquote nodo. Sed pro la pli abundajn deklaro mi faris sur la unua linio - typedef struct nodo - ĉar tio venis unue, antaŭ ol la krispa krampoj, jen speco de kiel antaŭ-eduki Clang ke, vi scias kion, donu al mi struct vokis struct nodo. Sincere, mi ne ŝatas nomi aĵojn struct nodo, struct nodo ĉiuj laŭlonge de mia kodo. Sed mi nur uzos ĝin unu fojon, nur ene, por ke mi povas efike krei specon de cirkla referenco, ne puntero al mi mem per, sed puntero al alia de identa tipo. Do rezultas ke sur datumstrukturo kiel tiu, ke estas kelkaj operacioj kiuj povus esti de intereso al ni. Ni eble volas enmeti en lerta kiel ĉi tio. Ni eble volas forviŝi el listo ŝatas tion. Ni eble volas sercxi la listo por valoro, aŭ pli ĝenerale, través. Kaj través estas nur ornama metodo de dirante komencas je la maldekstra kaj movi ĉiujn la vojon al la dekstra. Kaj rimarki, eĉ kun tiu iomete pli kompleksa datumstrukturo, lasu mi proponas ke ni povas prunti iom da la ideoj de la lastaj du semajnoj kaj apliki funkcio nomata serĉi ŝatas tion. Ĝi tuj revenos vera aŭ falsa, indikante, jes aŭ ne, n estas en la listo. Lia dua argumento estas puntero al la listo mem, tial puntero al nodo. Ĉiuj mi tuj poste fari estas deklari portempan variablo. Ni nomas ĝin ptr per konvencio, por puntero. Kaj mi atribui ĝin egala al la komencante de la listo. Kaj nun rimarkas dum buklo. Tiel longe kiel puntero ne estas egala al nula, mi tuj kontroli. Ĉu puntero sago n egala al la n kiu pasis en? Kaj atendi minuton - nova peco de sintakso. Kio estas sago subite? Jes? Ekzakte. Do dum kelkaj minutoj, oni uzas la skalara skribmaniero por aliri ion ene de la struct, se la variablo Vi ne estas la struct mem, sed puntero al struct, dankeme, peco de sintakso ke fine faras intuicia senco. La sago signifas sekvi la puntero, kiel niaj sagoj tipe signifas pictóricamente kaj iru ĉe datumoj kampo ene. Do sago estas la sama afero kiel punkto, sed vi uzas ĝin kiam vi havas puntero. Do nur por recap tiam, se la n kampo ene de la struct nomata puntero egalas egalas n, revenu vera. Alie, tiu linio tie - puntero egalas puntero proksimaj. Do kio estas tiu faras, avizo, estas se mi mi nuntempe fingromontrante la struct enhavanta 9, kaj 9 ne estas la numero Mi serĉas - supozi Mi serĉas por n egalas 50 - Mi tuj ĝisdatigi mian temporal puntero por ne atentigi en ĉi tiu nodo plu, sed puntero sago sekva, kiu tuj metis min tie. Nun, mi rimarkis estas ventego enkonduko. Merkrede, ni vere faras ĉi kun kelkaj homoj kaj kun iu pli kodo en malrapida ritmo. Sed realigi, ni nun faras niaj datumoj strukturoj pli kompleksaj por ke nia algoritmoj povas akiri pli efika, kiu tuj estos bezonata por pset ses, kiam ni montru in, denove, tiuj 150.000 vortojn, sed bezonas fari tiel kompetente, kaj ideale, krei programo kiu kuras por niaj uzantoj ne en lineara, ne en n kvadrataj, sed en konstanta tempo, en la idealo. Ni vidos vin merkredon. Parolanto: Je la sekvanta CS50, Davido forgesas sian bazon kazo. DAVID Malan: Kaj tio estas kiel vi sendos teksto mesaĝojn kun C. Kion la - [DIVERSAJ TEKSTO MESAĜO Sciigo SOUNDS]