David Malan: Alle reg, welkom terug. Dit is CS50. Dit is die begin van die week sewe. So dit was 'n rukkie, so het ek gedink ons ​​wil neem 'n warrelwind-toer waar ons opgehou het en waar ons nou gaan. So hierdie ding hier kan hê veroorsaak dat sommige angs by die eerste. Maar hopelik, jy begin om te acclimatiseren wat hierdie dui hier - ster wat 'n wyser, wat net wat, in meer leketaal? So dit is 'n adres. So dit is die adres van iets in die geheue. En ons het begin om te skil terug die lae 'n Paar weke gelede het dinge soos GetString en ander sulke funksies al hierdie tyd is terug adresse van die dinge wat in die geheue, soos die adres van die eerste karakter in 'n ry. So het ons ook bekendgestel valgrind, wat jy begin om te gebruik vir hierdie probleem stel, veral vir die volgende probleem stel as well. En valgrind doen wat vir ons? Dit gaan vir die geheue lekkasies, en dit ook tjeks vir die misbruik van die geheue. Dit kan met 'n paar waarskynlikheid, spoor indien jou kode gaan geheue te raak dat dit moet net nie. So nie noodwendig 'n lek, maar as jy gaan verder as die grense van 'n paar skikking, en jy eintlik loop valgrind en veroorsaak dat die gedrag terwyl valgrind loop in jou program is hardloop binnekant van dit, sal jy boodskappe soos hierdie - "ongeldig skryf van grootte 4, "wat herinner aan 'n paar weke gelede het beteken dat ek per ongeluk gehad graag op een int te ver buite die grense van 'n skikking. En so groot 4 beteken hier om die grootte van daardie spesifieke int. So neem gerusstelling in die feit dat valgrind se uitset, die formaat daarvan, is net gruwelike. Dit is regtig moeilik om te sien deur middel van die gemors vir die interessante inligting. So wat ons hier gedoen het, is net uittreksel 'n paar van die paar meer interessante lyne. Maar besef dat 80% van valgrind se uitset gaan 'n bietjie van 'n wees afleiding. Kyk net vir patrone soos hierdie - ongeldig reg, ongeldig te lees, 40 grepe en 'n paar aantal blokke is beslis verloor het, sleutelwoorde soos dit. En wat jy sal hopelik sien, is 'n paar soort spoor van wat die funksie fout is eintlik in In hierdie geval is hier, in watter lyn van my-kode was die fout glo? 26 in 'n lêer genaamd memory.c, wat die voorbeeld wat ons speel met in die tyd. So is dit waarskynlik nie in malloc. Dit was waarskynlik in my kode plaas. So ons sal sien dit weer en weer voor lank. So Wikipediabespreking, dit het in 'n paar vorms tot dusver. Ons het gesien sscanf kortliks. Dit was iets wat 'n aantal jy duik in in jou voorbereidings vir die toets. En Wikipediabespreking is eintlik wat die CS50 Biblioteek se al met behulp van onder die kap vir 'n geruime tyd in orde insette te kry van die gebruiker. Byvoorbeeld, as ek oorskuif na die CS50 toestel hier, laat my oop te maak 'n byvoorbeeld vandag dat is genoem Wikipediabespreking-0.C En dit is super eenvoudig. Dit is net 'n paar reëls van die kode. Maar dit bewys regtig hoe getint is besig om al hierdie tyd. In hierdie program hier, in lyn 16 , Kennis dat ek verklaar 'n int. Sodat daar geen wysers, niks magies is daar net 'n int. Dan in lyn 17, het ek gevra om die gebruiker vir 'n aantal, asseblief. Toe ek in die laat 18, ek gebruik Wikipediabespreking hier. En ek verskaf, soort van soos printf, wat verwag ek quote unquote persent i. So persent i, natuurlik, dui op 'n int. Maar let op wat die tweede argument te Wikipediabespreking is. Hoe sou jy die tweede argument na die komma? Wat is dit? Dit is die adres van x. So, dit is nuttig, want deur die verskaffing Wikipediabespreking met die adres van x, wat beteken wat bemagtig daardie funksie te doen? Nie net daar gaan nie, maar ook doen wat? Maak 'n verandering om dit te. Want jy kan daar gaan, is dit soort van soos 'n kaart na 'n plek in die geheue. En so lank as wat jy voorsien Wikipediabespreking, of enige funksie met so 'n kaart, wat funksie kan daarheen te gaan, en nie net kyk na die waarde, maar dit kan ook verander dat die waarde, wat nuttig is wanneer die doel in die lewe van Wikipediabespreking is om te scan insette van die gebruiker, spesifiek vanaf die sleutelbord. En die f dui formaat, net soos printf, die f dui op 'n formaat string wat jy wil druk. Dus, in kort, hierdie lyn 18 net sê, probeer om 'n int van die gebruiker se te lees sleutelbord en stoor dit binnekant van x, by alles adres x gebeur om te lewe op. En dan laastens, lyn 19 net sê, Dankie vir die int, in hierdie geval. So laat my gaan voort en maak dit. So maak Wikipediabespreking 0. Laat my gaan voort en zoom in Ek sal gaan en uit te voer dit met kolle streep Wikipediabespreking 0. Nommer, asseblief? 50. Dankie vir die 50. So dit is baie eenvoudig. Nou wat is dit nie te doen? Dit is nie besig met 'n hele klomp foutkontroles. Byvoorbeeld, as ek saam nie, en ek tik nie in 'n nommer, maar plaas ek skryf iets soos "Hallo," dit is net 'n soort van die vreemde. En so het een van die dinge wat die CS50 biblioteek is vir ons doen vir 'n paar tyd is dat reprompting en reprompting. Die weer probeer frase herroep was in cs50.c, en dit is die rede dat getint in die CS50 biblioteek is eintlik 'n hele n klomp van die lyne lank nie, want ons is kontrole vir dom dinge soos hierdie. Het die gebruiker nie gee nie ons, in werklikheid, 'n int? Het hy of sy gee vir ons iets soos 'n alfabetiese brief? As dit so is, wil ons op te spoor dat en gil op hulle. Maar dinge meer interessant in die volgende voorbeeld. As ek gaan na Wikipediabespreking-1.c, wat is die een ding wat fundamenteel verander in die volgende voorbeeld? Ek gebruik char *, natuurlik, in plaas van int. So, dit is interessant, want char *, onthou, is eintlik net die dieselfde ding as string. So dit voel miskien is dit 'n super eenvoudige implementering van GetString. Maar ek het geskil terug die laag van die CS50 biblioteek, so ek is noem hierdie char * nou. So laat ons sien waar, indien enige plek, ons verkeerd gaan. Line 17 - Ek sê weer, gee asseblief vir my iets, in hierdie geval, 'n string. En dan in die volgende lyn, ek noem Wikipediabespreking, weer, gee dit 'n formaat kode, maar hierdie keer persent s. En dan is dit tyd, ek is gee dit buffer. Nou sien, ek is nie die gebruik van die ampersand. Maar hoekom is dit waarskynlik OK hier? Want wat is buffer reeds? Dit is reeds 'n wyser. Dit is reeds 'n adres. En laat ons die woord "verwar," laat my noem dit net s, byvoorbeeld, vir eenvoud. Maar ek het dit genoem buffer, want in algemeen in programme, as jy 'n stuk van die geheue, wat 'n string regtig net is, kan jy noem dit 'n buffer. Dit is 'n plek om inligting te stoor. Soortgelyk aan dinge soos YouTube, wanneer hulle buffer, om so te praat, wat beteken net dit stukkies is die aflaai van die internet en stoor dit in 'n plaaslike skikking, 'n plaaslike stuk van die geheue, sodat wat jy kan kyk hoe dit later sonder dit draai of hang op jy, terwyl speel terug. So is daar 'n probleem hier al is, want ek sê vir Wikipediabespreking, verwag 'n string van die gebruiker. Hier is die adres van 'n stuk van die geheue. Sit dit string daar. Hoekom is dit gebonde gee ons moeilikheid, al is? Wat is dit? Ek is toegelaat om toegang te verkry dat 'n deel van die geheue? Jy weet, ek weet nie. Omdat het buffer geïnisialiseer na iets? Nie regtig nie. En so het dit is wat ons het 'n beroep 'n gemors waarde, wat is nie 'n formele woord. Dit beteken net ons het nie 'n idee wat stukkies is binnekant van die vier grepe Ek het toegeken as buffer. Ek het nie geroep malloc. Ek het beslis nie genoem GetString. So wie weet wat is eintlik binnekant van buffer? En tog vertel Wikipediabespreking blindelings, daar gaan en sit alles wat die gebruiker getik. So, wat is geneig om te veroorsaak in ons kode as ons loop dit? Waarskynlik 'n segfault. Miskien nie, maar waarskynlik 'n segfault. En ek sê miskien nie want soms jy dit doen, soms jy kry nie 'n segfault. Soms kry jy net gelukkig is, maar dit is tog gaan wees 'n fout in die program. So laat my gaan voort en stel hierdie. Ek gaan om dit te doen die ou skool manier. So klang stamp 0, Wikipediabespreking-1, Wikipediabespreking-1.c, Tik. Oeps, te oud skool. Kom ons kyk. Waar het ek gaan? O, char * buffer. Ag, dankie - Red, OK - baie ou skool. Alle reg, dit was 'n ruk. So ek het net die lêer gestoor na maak dat tydelike verander 'n oomblik gelede. En nou het Ek dit saamgestel hand met klang. En nou is ek gaan om voort te gaan en hardloop Wikipediabespreking-1, Tik. String asseblief. Ek sal tik in "hallo." En nou, hier is waar, eerlik, printf kan 'n bietjie irriterend. Dit is eintlik nie van plan om segfault in hierdie geval. Printf is 'n bietjie spesiale want dit is so super algemeen gebruik word wat wese printf doen ons 'n guns en besef, dit is nie 'n geldige wyser. Laat my toe om dit op myself om net te druk in hakies nul, selfs al is dit nie noodwendig wat ons onsself verwag. So kan ons regtig nie maklik oorreed om 'n segfault met hierdie, maar dit is duidelik hierdie is nie die gedrag wat ek wou hê. So, wat is die eenvoudige oplossing? Wel, in Wikipediabespreking-2, laat my stel voor dat in plaas van werklik net die toekenning van 'n char *, laat my 'n bietjie slimmer oor hierdie, en laat my buffer toeken as 'n reeks van 16 karakters. So ek kan dit doen in 'n paar maniere. Ek kan absoluut gebruik malloc. Maar ek kan terug gaan na week twee wanneer Ek het net nodig om 'n hele klomp van die karakters. Dit is net 'n skikking. So laat my plaas herdefinieer buffer om 'n skikking van 16 karakters. En nou, toe ek slaag buffer in - en dit is iets wat ons nie praat in week twee - maar jy kan hanteer 'n verskeidenheid as al is dit 'n adres. Tegnies, soos ons gesien het, hulle is 'n bietjie anders. Maar Wikipediabespreking sal nie omgee as jy verby dit die naam van 'n skikking, want wat Klang sal vir ons kan doen is in wese behandel die naam van die skikking as die adres van die stuk van 16 grepe. So dit is beter. Dit beteken nou dat ek kan hopelik doen die volgende. Laat my zoom uit vir 'n oomblik en doen maak Wikipediabespreking-2, saamgestel OK. Nou laat my streep Wikipediabespreking-2 doen gekry het. String asseblief. "Hello." En dit was dit tyd om te werk. Maar kan iemand stel 'n scenario waarin dit kan nog steeds nie werk nie? Ja? Iets meer as 16 karakters. En eintlik, kan ons 'n bietjie meer presies. Iets meer as 15 karakters, want regtig ons moet in gedagte hou dat ons moet besef dat agteroorskuisstreep nul implisiet aan die einde van die tou, Dit is 'n eenkant Wikipediabespreking tipies sorg vir ons. So laat my so iets doen - Soms kan ons net laat dit soos dit. OK, so ons het nou veroorsaak ons segmentering skuld. Hoekom? Omdat ek getik tot meer as 15 karakters, en so het ons het eintlik aangeraak geheue dat ek eintlik moet nie. So, wat is regtig die oplossing hier? Wel, wat as ons het 'n langer tou? Wel, ons het miskien maak dit 32 grepe. Wel, wat as dit is nie lank genoeg? Hoe oor 64 grepe? Wat as dit is nie lank genoeg? Hoe oor die 128 of 200 grepe? Wat is werklik die oplossing hier in die algemene geval, as ons nie weet in bevorder wat die gebruiker gaan om te tik? Dit is net 'n soort van 'n groot pyn in die gat, om eerlik te wees, wat is die rede waarom die CS50 biblioteek het 'n paar dosyn lyne van kode wat gesamentlik implementeer GetString string in 'n manier wat ons nie doen nie het om vooraf te weet wat die gebruiker gaan tik. In die besonder, as jy kyk terug op cs50.c van twee weke gelede, sal jy sien dat GetString nie eintlik gebruik nie Wikipediabespreking op hierdie manier. Inteendeel, dit lees een karakter op 'n tyd. Omdat die een nice ding oor lees 'n karakter is wat ons kan waarborg ons altyd ten minste een kar. Ek kan net verklaar dat 'n kar, en dan neem hierdie werklik baba stappe om net lees 'n karakter in 'n tyd vanaf die sleutelbord. En dan, wat jy sal sien GetString doen, is om elke keer as dit loop uit, sê, 16 grepe van die geheue, is dit gebruik malloc, of 'n neef daarvan, te ken meer geheue, die kopiëring van die ou geheue in die nuwe, en dan kruip saam, om een ​​karakter op 'n tyd, en wanneer dit loop uit van daardie stuk van die geheue, gooi dit weg, spel 'n groter deel van die geheue, afskrifte van ou in 'n nuwe, en herhaal. En dit is werklik 'n pyn om werklik implementeer iets so eenvoudig soos om insette van 'n gebruiker. So jy kan gebruik Wikipediabespreking. Jy kan gebruik om ander soortgelyke funksies. En 'n baie handboeke en aanlyn voorbeelde te doen, maar hulle is almal kwesbaar vir probleme soos hierdie. En uiteindelik, kry 'n segfault is 'n soort van irriterende. Dit is nie goed vir die gebruiker. Maar in die ergste geval, doen wat dit fundamenteel sit jou kode aan die risiko van? 'N soort van aanval, moontlik. Ons het gepraat oor een so 'n aanval - oorstroom die stapel. Maar in die algemeen, as jy toegelaat word om te oorloop 'n buffer, soos ons gedoen het 'n n paar weke gelede, met net skryf meer as "hallo" op die stapel, het jy kan inderdaad oor te neem, potensieel, 'n rekenaar, of ten minste kry op data wat behoort nie aan jou. Dus, in kort, dit is hoekom ons 'n die opleiding wiele. Maar nou, het ons begin om hulle af te neem, as ons programme nie meer nodig het nie, noodwendig nie, die insette van die gebruiker. Maar in die geval van die probleem wat ses, jou insette sal kom uit 'n groot woordeboek lêer met 150 paar vreemd duisend woorde. So sal jy nie hoef te bekommer oor die gebruiker se arbitrêre insette. Ons sal jou 'n paar aannames oor die lêer. Enige vrae oor verwysings of Wikipediabespreking of toevoer van die gebruiker in die algemeen? Alle reg, so 'n vinnige kyk dan op 'n sleep onderwerp van twee weke gelede. En dit was die idee van 'n struct. Nie dat - die idee van 'n struct, wat was wat? Wat het struct vir ons kan doen? Definieer - jammer? Definieer 'n veranderlike tipe. So soort van. Ons is eintlik die kombinasie van twee onderwerpe. So met typedef, onthou dat ons kan verklaar 'n tipe van ons eie, soos 'n sinoniem, soos string vir char *. Maar met behulp van typedef en struct, kan ons skep werklik ons ​​eie data strukture. Byvoorbeeld, as ek gaan terug na gedit hier vir 'n oomblik, en ek gaan voort en iets te doen, laat my red hierdie as, kom ons sê, structs.c tydelik, is ek net gaan om voort te gaan en sluit standardio.h, int main nietig. En dan in hier, veronderstel dat ek wil hê 'n program wat winkels te skryf meer studente uit verskeie huise, byvoorbeeld. So dit is soos 'n registrarial databasis van 'n soort. So as ek nodig het om die naam een ​​student, het ek kon doen nie iets soos char * naam, en ek sal so iets doen - eintlik, laat ons gebruik maak van die CS50 biblioteek vir net 'n oomblik dit 'n te maak bietjie eenvoudiger, sodat ons kan leen diegene dekades van reëls van die kode. En laat ons net hou dit eenvoudig. Ons sal dit string hou, en nou GetString. So ek eis nou dat ek die naam het gestoor van 'n paar student, en die huis van 'n student, net die gebruik van veranderlikes soos ons gedoen het en in een week. Maar dink ek nou wil ondersteun veelvuldige studente. Alle reg, sodat my instink is om te doen string NAME2 kry GetString, string house2 kry GetString. En dan is ons derde student, Kom ons doen name3 GetString. Alle reg, so hierdie is hopelik treffende jy as soort van dom, Omdat hierdie proses is nog nooit werklik gaan eindig, en dit is net gaan om te maak my kode lyk erger en erger en erger. Maar ons opgelos dit ook in week twee. Wat was ons relatief skoon oplossing toe ons moes verskeie veranderlikes van die dieselfde data tipe wat almal verband hou, maar Ons wou nie hierdie gruwelike gemors van die gelyknamige veranderlikes? Wat het ons gedoen plaas? So ek dink ek het 'n paar plekke. Ons het 'n skikking. As jy wil verskeie gevalle van iets, waarom nie ons skoon te maak dit alles en net sê, gee my verskeidenheid name genoem? En vir nou, laat ons hard kode 3. En dan gee my 'n skikking om genoem huise, en laat my vir nou hard kode 3. En ek het op groot skaal skoongemaak die gemors wat ek nou net gemaak het. Nou, ek het nog steeds hard gekodeer 3, maar selfs die 3 kan dinamiese kom uit die gebruiker, of bevat SPASIES, of die wil. So dit is reeds skoner. Maar wat is irriterend oor hierdie is dat Nou, selfs al is 'n naam is een of ander manier fundamenteel gekoppel aan 'n student se huis - dit is 'n student wat ek regtig wil stel - Ek het nou twee skikkings wat parallel in die sin dat hulle die dieselfde grootte, en name bracket 0 vermoedelik kaarte te huise bracket 0, en name bracket 1 kaarte om huise bracket 1. Met ander woorde, dat die student lewens in daardie huis, en dat ander student lewens in daardie ander huis. Maar seker dit kan wees gedoen word selfs meer skoon. Wel, kan dit, in werklikheid. En laat my gaan voort en oop up structs.h, en jy sal kyk na hierdie idee hier. Let daarop dat ek gebruik typedef, as jy verwys na 'n oomblik gelede te verklaar ons eie data tipe. Maar ek het ook die gebruik van hierdie ander navraag genoem struct wat gee my 'n nuwe data struktuur. En hierdie data struktuur Ek eis gaan twee dinge te hê binnekant van dit - 'n string genoem naam, en 'n string genoem huis. En die naam wat ek gaan gee om hierdie data struktuur gaan genoem te word student. Ek kon noem dit iets wat ek wil hê, maar dit semanties maak sin vir my in my gedagtes. So nou, as ek oop te maak 'n beter weergawe van die program het ek begin skryf daar is, laat my gaan na die top. En daar is 'n paar meer reëls van die kode hier, maar laat my fokus vir die oomblik op die een. Ek het verklaar dat 'n konstante sogenaamde studente en hard gekodeer 3 vir nou. Maar nou, let op hoe skoon my kode begin te kry. In lyn 22, verklaar ek skikking van die studente. En sien dat student is blykbaar nou 'n data tipe. Want op die top van hierdie lêer, let Ek het ingesluit dat die kop lêer dat ek opgetrek net 'n oomblik gelede. En dat header lêer eenvoudig moes hierdie definisie van 'n student. So nou, ek het my eie persoonlike data tipe wat die skrywers van C jaar gelede nie dink vooruit. Maar geen probleem nie. Ek kan dit self. So dit is 'n skikking met die naam studente, elk van wie se lede is 'n student struktuur. En ek wil drie van dié in die skikking. En nou, wat doen die res van hierdie program? Ek nodig het om iets 'n bietjie arbitrêr. So van online 24 af, Ek Itereer van 0 tot 3. Ek vra dan die gebruiker vir die student se naam. En dan gebruik ek GetString as tevore. Dan vra ek vir die student se huis, en ek gebruik GetString as tevore. Maar kennisgewing - effens nuwe stuk van sintaksis - Ek kan nog indeks tot die i-de student, Maar hoe kry ek by die spesifieke data gebied binnekant van die struct? Wel, wat is blykbaar die nuwe stuk van die sintaksis? Dis net die dot operateur. Ons het regtig nie gesien voor. Jy het gesien dat dit in pset vyf as jy het duik in reeds met bitmap lêers. Maar die dot beteken net binne hierdie struct of meer velde, gee dot naam, of gee my dot huis. Dit beteken gaan binnekant van die struct en kry die spesifieke velde. Wat beteken die res van hierdie program? Dit is nie al wat sexy. Let daarop dat ek Itereer van 0 tot 3 weer en ek het net skep 'n Engelse woorde soos so en so is in so 'en so 'n huis, verby in dot naam uit die i-de student en hul huis so goed. En dan laastens, nou gaan ons begin om te kry anale oor hierdie, nou dat ons vertroud is met wat malloc en ander funksies is doen al hierdie tyd. Hoekom het ek albei naam te bevry en die huis, selfs al het ek het nie bel malloc? GetString het. En dit was die vuil klein geheim 'n paar weke, maar GetString het is lekkende geheue oor die hele plaas al semester tot dusver. En valgrand sal uiteindelik openbaar dit aan ons. Maar dit is nie 'n groot deal, want ek weet dat ek kan eenvoudig bevry die naam en die huis, al is tegnies, te wees super, super veilig, sou ek wees doen 'n paar fout kontrole hier. Wat is jou instink wat jy vertel? Wat moet ek beheer word vir voordat ek bevry wat is 'n string, aka wat 'n kar *? Ek moet regtig beheer word indien die studente bracket i dot naam nie gelyk null. Dan sal dit OK om voort te gaan en gratis dat pointer, en dieselfde of die ander een so goed. Indien studente bracket i dot huis is nie gelyk aan nul, dit nou sal beskerm teen die hoek saak waarin GetString terug iets soos null. En ons het 'n oomblik gelede, printf sal beskerm ons hier by sê maar net nul, is wat gaan om te kyk vreemd. Maar ten minste sal dit nie segfault, soos ons gesien het. Wel, laat ek doen 'n ander ding hier. structs-0 is 'n soort van 'n stupid program omdat ek in al hierdie data, en dan dit verlore raak sodra die program eindig. Maar laat my gaan voort en doen dit. Laat my toe om die terminale venster 'n bietjie groter. Laat my toe om structs-1, wat is 'n nuwe weergawe van hierdie. Ek sal vergroot in 'n bietjie. En nou, laat ek hardloop dot streep structs-1. Student se naam - David Mather, laat ons doen Rob Kirkland, Kom ons doen Lauren Leverett. Wat interessant is, is nou kennisgewing - en ek weet net dit, want Ek het die program - daar is 'n lêer nou op my huidige gids genoem students.csv. Sommige van julle mag dalk gesien het dit in die werklike wêreld. Wat is 'n CSV-lêer? Komma geskei waardes. Dit is soort van soos 'n arm man se weergawe van 'n Excel-lêer. Dit is 'n tafel van die rye en kolomme wat jy kan maak in 'n program soos Excel, of nommers op 'n Mac. En as ek dit oopmaak van die lêer hier op gedit, kennisgewing - en die nommers is nie daar nie. Dit is net gedit vertel my lyn nommers. Let op die eerste lyn van hierdie lêer is David en Mather. Die volgende reël is Rob komma Kirkland. En die derde lyn is Lauren komma Leverett. So wat het ek geskep het? Ek het nou geskryf het 'n C program wat effektief te kan genereer sigblaaie wat oopgemaak kan word in 'n program soos Excel. Nie alles wat dwingende 'n stel data, maar as jy het veel groter stukke data wat jy eintlik wil manipuleer en maak grafieke van en die hou nie, is dit dalk een manier waarop data te skep. Verder, CSVs is eintlik super algemene net vir die berging van eenvoudige data - Yahoo Finansies, byvoorbeeld, as jy voorraadkwotasies via hul sogenaamde API, die gratis diens wat kan jy kry huidige up-to-die-date voorraad kwotasies vir maatskappye, het hulle gee die data terug in die super eenvoudige CSV formaat. So hoe het ons dit doen? Wel, sien, die meeste van hierdie program se byna dieselfde. Maar let hier, eerder as gedrukte die studente uit, on line 35 af, ek beweer dat ek die is spaar studente te skyf, so spaar 'n lêer. So sien ek 'n lêer * is verklaar - Nou, dit is 'n soort van 'n anomalie in C. Vir watter rede ook al, lêer is al pette, Dit is nie soos die meeste ander data tipes in C. Maar dit is 'n ingeboude data tipe, lêer *. En ek verklaar 'n verwysing na 'n lêer, is hoe jy kan dink dat. fopen beteken oop lêer. Wat lêer wil jy oop te maak? Ek wil 'n lêer oop te maak wat ek wil arbitrêr noem students.csv. Ek kan noem dat enigiets wat ek wil. En dan 'n raaiskoot. Wat beteken die tweede argument te fopen waarskynlik beteken? Reg, w vir skryf, kan wees r vir lees. Daar is 'n vir append as jy wil rye en nie by te voeg vervang die hele ding. Maar ek wil net hierdie lêer te skep een keer, so ek sal gebruik quote unquote w. En ek weet dat net van dit gelees die dokumentasie, of die man bladsy. Indien lêer is nie nietig nie - met ander woorde, asof niks verkeerd geloop het daar - laat my Itereer oor die studente van 0 tot 3. En nou sien daar is iets ooit so effens verskillende oor die lyn 41 hier. Dit is nie printf. Dit is fprintf vir die lêer printf. So dit gaan skryf in te dien. Watter lêer? Die een wie se wyser wat jy spesifiseer as die eerste argument. Dan sal ons spesifiseer 'n formaat string. Dan sal ons presies weet wat ons wil string plug in vir die eerste persent s, en dan nog 'n veranderlike of die tweede persent s. Toe ons naby die lêer met fclose. As ek bevry van die geheue soos voorheen, al is Ek moet gaan terug in en voeg 'n paar tjeks vir null. En dit is dit. fopen, fprintf, fclose gee my die vermoë om teks lêers te skep. Nou, sien jy in probleem stel vyf, wat behels die beelde, sal jy gebruik word binêre lêers plaas. Maar fundamenteel, die idee is dieselfde, selfs al is die funksies sal jy sien, is 'n bietjie anders. So warrelwind-toer, maar jy sal kry al te bekend is met die lêer I/O-- toevoer en afvoer - met pset vyf. En enige vrae oor die aanvanklike basiese beginsels hier? Ja? Wat gebeur as jy probeer om 'n nul waarde te bevry? Ek glo nie, tensy gratis gekry het 'n bietjie meer gebruiker-vriendelike, jy kan potensieel segfault. Om dit nul is sleg, want ek doen nie glo gratis pla om te kyk vir jou, want dit sou moontlik wees om 'n vermorsing van die tyd vir dit self te doen vir almal in die wêreld. Goeie vraag, al is. Alle reg, sodat hierdie soort van kry ons 'n interessante onderwerp. Die tema van die probleem stel vyf is forensiese ondersoeke. Ten minste is dit 'n gedeelte van die probleem stel. Forensiese algemeen verwys na die herstel van inligting wat kan of mag gewees het nie verwyder doelbewus. En so het ek gedink ek wil gee jou 'n vinnige voorsmakie van wat werklik aan die gang al hierdie tyd onder die kap van jou rekenaar. Byvoorbeeld, as jy die binnekant van jou laptop of jou rekenaar 'n hardeskyf, dit is óf 'n meganiese toestel wat eintlik draai - daar is omsendbrief dinge genoem borde wat graag heel Kyk wat ek moes net op die skerm hier, al dit is al hoe meer ou skool. Dit is 'n drie-en-'n-half-duim hardeskyf. En drie en 'n half duim verwys van met die ding wanneer jy dit installeer in 'n rekenaar. Baie van julle ouens in jou skootrekenaars nou het vaste-toestand dryf, of SSDs, wat geen bewegende dele. Hulle is meer soos geheue en minder soos hierdie meganiese toestelle. Maar die idees is nog steeds dieselfde, seker as dit verband hou om probleme op te stel vyf. En as jy dink oor die nou 'n hardeskyf verteenwoordig 'n sirkel, wat Ek sal trek soos hierdie hier. As jy 'n lêer op jou rekenaar, of dit nou 'n SSD, of in hierdie geval, 'n ouer skool hardeskyf, die lêer bestaan ​​uit verskeie stukkies. Kom ons sê dat dit is die 0 en 1, 'n hele klomp van 0'e en 1'e. So dit is my hele hardeskyf. Dit is blykbaar 'n redelik groot lêer. En dit is die gebruik van die 0e en 1e op daardie gedeelte van die fisiese skinkbord. Wel, wat is dat die fisiese gedeelte? Wel, dit blyk dat op 'n hardeskyf, ten minste van hierdie tipe, is daar hierdie klein bietjie magnetiese deeltjies. En hulle in wese het noord en Suid-pale met hulle, so dat as jy draai een van daardie magnetiese deeltjies hierdie manier, kan jy sê dat dit verteenwoordig 'n 1. En as dit onderstebo suid na noorde, kan jy sê dat dit wat 'n 0. So in die werklike fisiese wêreld, wat hoe jy kan verteenwoordig iets in binêre toestand van die 0 en 'n 1. So dit is al 'n lêer is. Daar is 'n hele klomp van die magnetiese deeltjies wat hulle op hierdie manier of hierdie manier, die skep van patrone van 0'e en 1'e. Maar dit blyk uit wanneer jy 'n lêer stoor, Sommige inligting is apart gestoor word. So dit is 'n klein tafel, 'n gids, om so te spreek. En Ek sal hierdie kolom naam noem, en Ek bel hierdie kolom plek. En ek gaan om te sê, veronderstel dit is my CV. My resume.doc gestoor word op plek, kom ons sê 123. Ek het altyd gaan vir dat die getal. Maar is dit voldoende om te sê dat net soos in die geheue, kan jy 'n hardeskyf dit is 'n GB of 200 GB of 'n terabyte, en jy kan Nommer al die grepe. Jy kan Nommer al die stukke van 8 stukkies. So sal ons sê dat hierdie is plek 123. So hierdie gids binnekant van my bedryfstelsel stelsel onthou dat my CV is by die plek 123. Maar dit raak interessant wanneer jy 'n lêer verwyder. So byvoorbeeld - en gelukkig, die meeste van die wêreld het gevang op hierdie - wat gebeur wanneer jy sleep 'n lêer op jou Mac OS asblik of jou Windows Recycle Bin? Wat is die doel om dit te doen? Dit is natuurlik om ontslae te raak van die lêer, maar wat nie die daad van sleep en val in jou asblik of jou Recycle Bin doen op 'n rekenaar? Absoluut niks nie, regtig. Dit is net soos 'n gids. Dit is 'n spesiale gids, om seker te wees. Maar dit maak nie eintlik verwyder die lêer? Wel, nee, want sommige van julle waarskynlik gewees het soos, ag damn, jy het nie beteken dat te doen. Sodat jy dubbel kliek op die Asblik of Recycle Bin. Jy het rondom steek en jy het verhaal die lêer net deur dit te sleep daar uit. So duidelik, is dit nie noodwendig om dit te verwyder. OK, jy is slimmer as dit. Jy weet dat net sleep dit in die Asblik of Recycle Bin beteken nie jy die leegmaak van die asblik. So jy gaan na die spyskaart, en jy sê: Leë asblik of leë asblik. Dan wat gebeur? Ja, so dit is meer so verwyder. Maar al wat gebeur is nie. Die rekenaar vergeet waar resume.doc was. Maar wat het nie verander nie glo in die prentjie? Die stukkies, die 0e en 1e dat ek beweer is op die terrein van 'n fisiese aspek van die hardeware. Hulle is nog steeds daar. Dis net die rekenaar vergeet wat hulle is. So is dit in wese bevry die lêer se stukkies so dat hulle kan hergebruik word. Maar dit is nie totdat jy meer lêers, en meer lêers, en meer lêers probabilistically, diegene 0e en 1e, die magnetiese deeltjies, hergebruik kry, onderstebo of regterkant, vir ander lêers, 0e en 1e. So jy het die venster van die tyd. En dit is nie van voorspelbare lengte, regtig. Dit hang af van die grootte van jou harde ry en hoeveel lêers wat jy het en hoe vinnig jy maak nuwes. Maar daar is die venster van die tyd gedurende wat die lêer is nog steeds perfek verhaalbaar is nie. So as jy ooit gebruik programme soos McAfee of Norton om te probeer om te herstel data, is al wat hulle doen probeer om herstel van hierdie sogenaamde gids te uit te vind waar jy die lêer was. En soms Norton en sal sê: lêer is 93% verhaal. Wel, wat beteken dit? Dit beteken net dat 'n ander lêer toevallig beland met behulp van, sê, daardie stukkies uit jou oorspronklike lêer. So, wat werklik betrokke is in die herstel van data? Wel, as jy nie iets soos Norton pre-geïnstalleer op jou rekenaar, die beste wat jy kan doen, is soms kyk aan die hele hardeskyf op soek na patrone van stukkies. En een van die temas van die probleem stel vyf is dat jy sal soek op die ekwivalent van 'n hardeskyf, 'n forensiese beeld van 'n kompakte flits kaart van 'n digitale kamera, op soek na die 0s en 1s wat tipies, met 'n hoë waarskynlikheid, verteenwoordig die begin van 'n JPEG beeld. En julle kan herstel die beelde deur aanvaarding, as ek sien hierdie patroon van stukkies van die forensiese beeld, met hoë waarskynlikheid, dat die punte die begin van 'n JPEG. En as ek sien dieselfde patroon weer dat die punte waarskynlik die begin van 'n ander JPEG, en 'n ander JPEG, en 'n ander JPEG. En dit is tipies hoe data herstel sal werk. Wat is lekker om oor JPEG is selfs al die lêer formaat self is ietwat kompleks, die begin van elke sodanige lêer is eintlik redelik identifiseerbare en eenvoudig, soos jy sal sien, As jy nie reeds het. So kom ons neem 'n nader kyk onder die kap as om presies wat was gaan op, en wat hierdie 0e en 1e is, te gee jou 'n bietjie meer van 'n konteks vir hierdie besondere uitdaging. [Video speel] -Waar jou rekenaar stoor mees van sy permanente data. Om dit te doen, die data reis van RAM saam met sagteware seine wat vertel die hardeskyf hoe die data te stoor. Die harde skyf kringe vertaal daardie seine in spanning skommelinge. Hierdie, op sy beurt, beheer oor die hardeskyf se bewegende dele, 'n paar van die min bewegende dele het in die moderne rekenaar. Sommige van die seine beheer oor 'n motor wat draai metaal-bedekte borde. Jou data is eintlik gestoor op hierdie borde. Ander seine beweeg die lees / skryf koppe te lees of skryf data op die borde. Dit masjinerie so akkuraat is dat 'n mens hare kan selfs nie slaag tussen die koppe en draai borde. Tog, dit werk al by geweldige spoed. [Einde video-vertoning] David Malan: Zoom in 'n bietjie dieper nou na wat eintlik op die borde. [Video speel] -Kom ons kyk na wat ons net sien in slow motion. Wanneer 'n kort pols van elektrisiteit gestuur word aan die lees / skryf hoof, as flips op 'n klein elektromagnetiese vir 'n fraksie van 'n sekonde. Die Magnet skep 'n gebied, wat verander die polariteit van 'n klein, klein gedeelte van die metaal deeltjies wat rok elke skottel oppervlak. 'N patroon reeks van hierdie klein, gehef-up areas op die skyf verteenwoordig 'n enkele bietjie data in die binêre getal stelsel wat gebruik word deur rekenaars. Nou, as die huidige gestuur is een manier deur die lees / skryf kop, die gebied gepolariseer is in een rigting. As die huidige gestuur word in die teenoorgestelde rigting, die polarisasie omgekeer word. Hoe jy data van die hardeskyf? Net reverse die proses. So dit is die deeltjies op die skyf wat kry die stroom in die lees / skryf kop beweeg. Saam miljoene van hierdie gemagnetiseerde segmente, en jy het 'n lêer. Nou, die stukke van 'n enkele lêer word versprei oor 'n stasie se borde, soort van soos die gemors papiere op jou lessenaar. So 'n spesiale ekstra lêer hou van waar alles is. Moet nie jy wens jy het iets soos dit? [Einde video-vertoning] David Malan: OK, waarskynlik nie. So hoeveel van julle ouens grootgeword het met hierdie? OK, so dit is al hoe minder hande elke jaar. Maar ek is bly jy is ten minste vertroud saam met hulle, want dit en ons eie boek demo, ongelukkig, is om te sterf 'n baie stadige dood hier van bekendheid. Maar dit is wat ek, ten minste, terug in hoë skool, wat gebruik word gebruik vir rugsteun. Dit was wonderlik, want jy kon slaan 1,4 megagrepe op hierdie spesifieke skyf. En dit was die hoë digtheid weergawe, soos aangedui deur die HD, wat beteken voor vandag se HD videos. Standard digtheid was 800 kilogrepe. En voor dit, was daar 400 kilogrepe skywe. En voor dit, was daar 5 en 1/4 duim-skywe, wat was werklik floppy, en 'n bietjie wyer en langer as hierdie dinge hier. Maar jy kan eintlik sien die sogenaamde floppy aspek van hierdie skywe. En funksioneel, hulle is eintlik redelik soortgelyk aan hardeskywe van ten minste hierdie tipe. Weereens, SSDs in nuwer rekenaars werk 'n bietjie anders. Maar as jy beweeg dat min metaal blad jy kan eintlik sien 'n klein koekie, of bord. Dit is nie 'n metaal soos hierdie een. Hierdie een is eintlik 'n paar goedkoper plastiese materiaal. En jy kan soort dit wikkel. En jy het net trully afgevee sommige aantal stukkies of magnetiese deeltjies van hierdie skyf. So gelukkig, daar is niks op dit. As die ding in die pad - en dek jou oë en dié van jou naaste - jy kan net soort van trek hierdie hele skede af soos dit. Maar daar is 'n bietjie lente, so wees bewus van wat met jou oë. So nou het jy werklik 'n slapskyf. En wat is merkwaardig van hierdie is dat in so veel as dit is 'n kleinskaalse voorstelling van 'n groter hardeskyf, hierdie dinge is super, super eenvoudig. As jy knyp die onderkant van dit, nou dat dat metal ding is af, en skil hulle oop te maak, al is daar is twee stukke gevoel en die sogenaamde diskette met 'n stukkie van die metaal aan die binnekant. En daar gaan die helfte van my skyf se inhoud. Daar gaan 'n ander helfte van hulle. Maar dit is al wat spin binne van jou rekenaar in weleer. En weer na hierdie in perspektief te stel, hoe groot is die meeste van jou hard dryf deesdae? 500 GB, 'n terabyte, miskien in 'n rekenaar, 2 teragrepe, 3 teragrepe, 4 teragrepe, reg? Dit is een megabyte, gee of neem, wat kan selfs nie pas 'n tipiese MP3 meer hierdie dae, of 'n soortgelyke musiek lêer. So 'n bietjie aandenking vir jou vandag, en ook om te help kontekstualiseer wat neem ons as vanselfsprekend aanvaar nou in probleem stel vyf. So dit is joune om te hou. So laat my oorgang na waar sal wees spandeer die volgende pset as well. So het ons nou 'hierdie bladsy vir - o, 'n paar van die aankondiging vinnig. Hierdie Vrydag, as jy wil graag aansluit by CS50 vir middagete, gaan na die gewone plek, cs50.net/rsvp. En finale projek - so per die leerplan, het ons gepos word om die finale projek spesifikasie reeds. Besef dat dit beteken nie dat dit is as gevolg van veral gou. Dit opgelaai, regtig, net om te kry julle ouens te dink oor dit. En inderdaad, 'n super beduidende persentasie van julle sal aanpak word finale projekte op materiaal wat ons het nie eens gekry het om in die klas, maar sal so vroeg as volgende week. Kennisgewing, al is, dat die spec oproepe vir 'n paar verskillende komponente van die finale projek. Die eerste, in 'n paar weke, is 'n pre-voorstel, 'n mooi gemaklik e-pos aan jou TF om hom te vertel of wat jy dink oor vir jou projek, met geen verbintenis. Voorstel sal wees om jou spesifieke toewyding, sê, hier, dit is wat Ek wil graag om te doen vir my projek. Wat dink jy? Te groot? Te klein? Is dit hanteerbaar? En jy sien die spec vir meer besonderhede. Paar weke daarna is die status verslag, wat 'n soortgelyke gemaklik e-pos aan jou TF te sê presies hoe ver agter jy is in jou finale projek se implementering, gevolg deur die CS50 Hackathon waaraan almal is genooi, wat sal 'n geleentheid wees vanaf 20:00 op een aand tot 07:00 IS die volgende oggend. Pizza, as ek mag genoem het in week nul, wil gedien word op 09:00, Chinese kos by 01:00. En as jy nog wakker op 05:00, ons sal jou neem na IHOP vir ontbyt. So het die Hackathon is een van die meer onvergeetlike ervaring in die klas. Toe het die implementering verskuldig is, en dan die klimaks CS50 Fair. Meer besonderhede oor al hierdie in die komende weke. Maar laat ons gaan terug na iets wat ou skool - weer, 'n skikking. So 'n skikking was lekker, want dit los probleme soos ons gesien het net 'n oomblik gelede met student strukture om 'n bietjie buite beheer as ons wil student een student twee te hê, student drie, student dot dot dot, 'n arbitrêre aantal studente. So skikkings, 'n paar weke gelede, toegeslaan en opgelos almal van ons probleme nie weet vooraf hoe baie dinge van 'n soort wat ons dalk wil. En ons het gesien dat structs ons kan help verder organiseer ons kode en hou konseptueel soortgelyke veranderlikes, soos 'n naam en 'n huis saam, sodat ons kan behandel hulle as een entiteit, binne waarvan daar kleiner stukke. Maar skikkings het 'n paar nadele. Wat is 'n paar van die nadele ons teëgekom het met skikkings tot dusver? Wat is dit? Vaste grootte - so selfs al sou jy in staat wees om geheue vir 'n te ken skikking, as jy weet hoe baie studente jy het, hoeveel karakters jy van die gebruiker, wanneer jy toegeken die skikking, het soort wat jy geverf jouself in 'n hoek. Want jy kan nie voeg nuwe elemente in die middel van 'n skikking. Jy kan nie voeg meer elemente aan die einde van 'n skikking. Regtig, jy het 'n beroep op die skep van 'n hele nuwe skikking, soos ons bespreek het, kopiëring van die ou na die nuwe. En weer, dit is die hoofpyn wat GetString hanteer vir jou. Maar weereens, kan jy nie eens voeg iets wat in die middel van die skikking indien die koers is nie heeltemal gevul. Byvoorbeeld, as die reeks hier van grootte ses het net vyf dinge in dit, Wel, jy kan net ryg iets op die einde. Maar wat as jy iets wil voeg in die middel van die skikking, selfs al is dit dalk ' Vyf van die ses dinge in dit? Wel, wat ons doen wanneer ons al van ons menslike vrywilligers op die verhoog in weke verlede? As ons wou iemand hier te plaas, óf hierdie mense hoe om dit te beweeg manier, of hierdie mense hoe om dit te beweeg manier, en dit was baie duur. Die verskuiwing van mense binne 'n verskeidenheid beland optel en kos ons tyd, daarom is baie van ons n geruite hardloop tye soos voeg soort, vir Byvoorbeeld, in die ergste geval. So skikkings is groot, maar jy het om te vooraf weet hoe groot jy wil hê hulle. So OK, hier is 'n oplossing. As ek weet nie vooruit hoeveel studente kan ek het, en ek weet wanneer Ek het besluit om, al is, ek is vas met wat baie studente, hoekom ek nie net altyd ken twee keer soveel ruimte as ek kan dink dat ek nodig? Is dit nie 'n redelike oplossing? Realisties, dink ek nie dat ons gaan meer as 50 slots nodig in 'n skikking vir 'n medium-grootte klas, So laat ons net rond. Ek sal 100 slots in my skikking, net sodat ons kan beslis die aantal studente verwag ek te wees in 'n medium-grootte klas. So hoekom nie net rond en ken meer geheue, tipies, vir 'n verskeidenheid as jy dink jy kan selfs nodig? Wat is dit eenvoudig agterstoot om die idee? Jy is net mors geheue. Letterlik elke program wat jy skryf dan Miskien is die gebruik twee keer soveel geheue soos jy werklik nodig het. En dit is net nie voel soos 'n veral elegante oplossing. Verder, dit verminder net die waarskynlikheid van 'n probleem. As jy toevallig 'n gewilde kursus te hê een semester en jy het 101 studente, die program is nog steeds fundamenteel in die gesig staar dieselfde probleem. So gelukkig is, is daar 'n oplossing te hierdie advertensie al ons probleme in die vorm van data strukture wat meer kompleks as dié het ons tot dusver gesien het. Hierdie, ek eis, is 'n gekoppelde lys. Hierdie is 'n lys van die nommers - 9, 17, 22, 26, en 34 - wat reeds met mekaar verbind is deur middel van wat ek geteken as pyle. Met ander woorde, as ek wou te verteenwoordig 'n skikking, kon ek doen iets soos hierdie. En ek sal dit op die oorhoofse in net 'n oomblik. Ek kon doen nie - hallo, alles reg. Staan. Nuwe rekenaar hier, duidelik - alles reg. So as ek hierdie getalle in verskeidenheid - 9, 17, 22, 26, 24 - nie noodwendig volgens skaal. Alle reg, so hier is my verskeidenheid - O my God. Alle reg, so hier is my skikking. Oh my god. [Gelag] David Malan: voorgee. Dit is te veel moeite om terug te gaan en op te los, so daar - 26. So het ons hierdie reeks 9, 17, 22, 26, en 34. Vir dié van julle kan sien die verleentheid fout wat ek nou net gemaak het, daar is dit. So ek beweer dat dit 'n baie doeltreffende oplossing. Ek het toegeken soveel as ints Ek nodig het - een, twee, drie, vier, vyf of ses - en ek het dan gestoor die nommers binnekant van die skikking. Maar dink nie, dan wil ek voeg 'n waarde soos die nommer 8? Wel, waar dit gaan? Dink ek wil in te voeg 'n aantal soos 20. Wel, waar dit gaan? Iewers in die middel, of die getal 35 het om te gaan iewers aan die einde. Maar ek is al uit die ruimte. En so is dit 'n fundamentele uitdaging van skikkings wat nie is die oplossing. Ek beweer dat 'n oomblik gelede, GetString hierdie probleem oplos. As jy wil 'n sesde nommer in te voeg in hierdie skikking, wat ten minste een oplossing wat jy kan terugval op vir seker, net soos ons met GetString? Wat is dit? Wel, maak dit groter is makliker gesê as gedaan. Ons kan nie noodwendig maak die skikking groter, maar wat kan ons doen? Maak 'n nuwe skikking wat groter is, van die grootte 6, of dalk grootte 10, as ons wil om voor dinge te kry, en dan kopieer die ou verskeidenheid in die nuwe, en dan bevry die ou skikking. Maar wat is die loop van die tyd nou van die proses? Dit is 'n groot O van N, omdat die kopiëring gaan kos jou 'n paar eenhede tyd, so nie so ideaal as ons moet ken 'n nuwe skikking, wat gaan twee keer soveel verbruik geheue tydelik. Kopieer ou in 'n nuwe - Ek bedoel, dit is net 'n hoofpyn, wat is, weer, hoekom het ons geskryf GetString vir jou. So wat kan ons plaas doen? Wel, wat as ons data struktuur eintlik het gapings in dit? Veronderstel dat ek ontspan my doelwit om aangrensende stukke van die geheue, waar 9 is reg langs tot 17, wat reg langs tot 22, en so aan. En veronderstel dat 9 kan wees hier in Geheue, en 17 kan hier asseblief In geheue, en 22 kan hier wees oor in die geheue. Met ander woorde, ek het nie nodig om hulle selfs tot meer terug. Ek het net een of ander manier ryg n naald deur middel van elkeen van hierdie getalle, of elke van hierdie nodes, as ons bel die reghoeke as ek het hulle getrek, te onthou hoe om te kry tot die laaste so knoop van die eerste. So, wat is die ontwikkeling rig Ons het onlangs gesien waarmee ek kan daardie draad te implementeer, of getrek hier, met wat ek kan implementeer die pyle? So wysers, reg? As ek ken nie net 'n int, maar 'n knoop - en deur knoop, ek het net bedoel houer. En visueel, ek bedoel 'n reghoek. So 'n knoop moet glo twee waardes te bevat - die int self, en dan, soos geïmpliseer deur die onderste helfte van die reghoek, genoeg ruimte vir 'n int. So dink net voor hier, hoe groot is hierdie knoop, hierdie houer in die vraag? Hoeveel grepe vir die int? Vermoedelik 4, al is dit dieselfde as gewoonlik. En dan hoeveel bytes vir die wyser? 4. So hierdie houer, of die node, is gaan 'n 8-byte struktuur wees. O ja, en dit is 'n gelukkige toeval dat Ons het net het hierdie idee van 'n struct, of 'n C-struktuur. So ek beweer dat ek wil 'n stap te neem na hierdie meer gesofistikeerde implementering van 'n lys van getalle, 'n gekoppel lys van getalle, ek moet 'n om te doen bietjie meer dink aan die voorkant en verklaar nie net 'n int, maar 'n struct wat ek sal noem, konvensionele hier, knoop. Ons kon noem dit iets is wat ons wil hê nie, maar knoop gaan wees tematiese in 'n baie van die dinge wat ons begin kyk na nou. Binnekant van die knoop is 'n int n. En dan is dit sintaksis, 'n bietjie vreemd op die eerste oogopslag - struct node * langs. Wel picturaal, wat is dit? Dit is die onderste helfte van die reghoek wat ons gesien net 'n oomblik gelede. Maar hoekom ek sê struct node * eerder as om net knoop *? Want as dit wyser wys by 'n ander knoop, dit is net die adres van 'n knoop. Dit is in ooreenstemming met wat ons het bespreek oor die wysers tot dusver. Maar hoekom, as ek beweer hierdie struktuur is genoem knoop, moet ek struct om te sê node binnekant hier? Presies. Dit is soort van 'n dom werklikheid van C. Die typedef, om so te praat, het nie gebeur het nie. C is super letterlik. Dit lui die kode bo na onder, van links na regs. En totdat dit treffers wat op die kommapunt Bottom line, raai wat nie bestaan ​​as 'n data tipe? Knoop, kwotasie unquote knoop. Maar as gevolg van die meer verbose verklaring wat ek gedoen het op die eerste lyn - typedef struct knoop - want dit het eerste gekom, voordat die krulhakies, dit is soort van soos pre-opvoeding klang dat jy weet wat, gee my 'n struct genoem struct knoop. Eerlik, ek hou nie van 'n beroep dinge struct knoop, struct knoop al Dwarsdeur my kode. Maar ek sal net gebruik om dit een keer, net binne, sodat ek kan effektief skep 'n soort van omsendbrief verwys, nie 'n verwysing na myself per se nie, maar 'n wyser na 'n ander van 'n identiese tipe. So dit blyk dat op 'n data struktuur soos hierdie, daar is 'n paar bedrywighede wat dalk van belang is vir ons. Ons wil dalk te voeg in 'n lys soos hierdie. Ons mag dalk wil om te verwyder uit 'n lys soos hierdie. Ons wil dalk die lys vir 'n te soek waarde, of meer algemeen, deurkruis. En deurkruis is net 'n fancy manier sê begin aan die linkerkant en beweeg al die pad na regs. En kennis, selfs met hierdie effens meer gesofistikeerde data struktuur, laat my voor dat ons 'n paar van kan leen die idees van die afgelope twee weke en implementering van 'n funksie genoem soek soos hierdie. Dit gaan om terug te keer waar of vals is, wat aandui, ja of Nee, n is in die lys. Die tweede argument is 'n wyser aan die lys self, so 'n wyser na 'n knoop. Al wat ek gaan doen dan is verklaar 'n tydelike veranderlike. Ons noem dit ptr deur konvensie, vir wyser. En ek gee dit gelyk is aan die die begin van die lys. En nou op die while loop. So lank as wat wyser is nie gelyk aan nul, ek gaan om te kyk. Is wyser pyl n gelyk aan die n wat in geslaag is? En wag 'n minuut - nuwe stukkie van die sintaksis. Wat is pyl al van 'n skielike? Ja? Presies. So, terwyl 'n paar minute gelede, ons gebruik die dot-notasie iets om toegang te verkry binnekant van 'n die struct, as die veranderlike jy is nie die struct self nie, maar 'n verwysing na 'n struct, gelukkig, 'n stukkie van die sintaksis wat Ten slotte maak intuïtief sin. Die pyl beteken die wyser om te volg, soos ons pyle tipies beteken picturaal, en gaan data gebied binne. So pyl is dieselfde ding as dot, maar jy dit gebruik wanneer jy 'n muis. So net om dan vat, as die n veld binnekant van die struct genoem wyser gelyk is gelyk aan n, terug waar. Anders, hierdie lyn hier - wyser gelyk wyser volgende. So wat dit doen, kennisgewing, is as ek is tans te wys op die struct met 9, en 9 is nie die aantal Ek is op soek na - dink ek is op soek na vir n gelyk aan 50 - Ek gaan my tydelike wyser te werk om nie te wys op hierdie node nie, maar wyser pyl volgende, wat gaan my sit hier. Nou, ek besef is 'n warrelwind inleiding. Op Woensdag, sal ons werklik te doen om hierdie met 'n paar mense en met 'n paar meer kode teen 'n stadiger tempo. Maar besef, ons is nou die maak van ons data meer komplekse strukture sodat ons algoritmes kan kry meer doeltreffend, wat gaan wees vereiste vir pset ses, toe ons laai in, weer, dié 150,000 woorde nie, maar moet dit doen doeltreffend en ideaal, skep 'n program wat loop vir ons gebruikers nie in lineêre, nie in N-kwadraat, maar in konstante tyd, in die ideale. Ons sal sien dat jy op Woensdag. Spreker: By die volgende CS50, David vergeet sy basis geval. David Malan: En dit is hoe jy stuur SMS-boodskappe met C. Wat die - [Verskeie SMS-boodskap Kennisgewingsklanke]