>> 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]