>> DAVID MALAN: Rendben, szívesen vissza.
Ez CS50.
Ez a kezdete a hét hét.
Szóval ez már egy ideje, így azt gondoltam, hogy hogy egy forgószél túra, ahol
abbahagyta, és ahol mi vagyunk most megy.
>> Tehát ez a dolog itt lehet, hogy okozott némi szorongás először.
De remélhetőleg, akkor kezd hozzászokik, hogy ez mit jelöl itt -
csillag képviselő mutató, amely csak mi, több laikus szempontból?
Szóval ez egy cím.
>> Szóval ez a címe valami a memóriában.
És elkezdtünk húzza vissza a rétegek Néhány héttel ezelőtt, a dolgok, mint
GetString és más hasonló funkciók egész idő alatt már visszatérő
címét dolgok a memóriában, mint a címét az első karakter
bizonyos sorrendben.
>> Így is bevezette valgrind, amely akkor elkezdi használni ezt a problémát
állítva, különösen a következő probléma meg is.
És valgrind mit értünk?
Ellenőrzi a memóriavesztés, és is ellenőrzi visszaélés memóriát.
>> Ez, bizonyos valószínűséggel, érzékeli, ha A kód fog érinteni memória
hogy egyszerűen nem.
Tehát nem feltétlenül a szivárgást, de ha túlmutatnak határain egyes
tömb, és a ténylegesen megtett valgrind és rávenni, hogy a viselkedését, miközben
valgrind fut a program belül futó, akkor kapsz
üzenetek, mint ez - "érvénytelen írnak 4-es méretű, "ami, felidézni egy-két
héttel ezelőtt azt jelentette, hogy volt véletlenül mint egy int túl messze
határain túl egy tömb.
És így 4-es méretű itt azt jelenti, a méret az adott int.
>> Tehát hogy megnyugtató, hogy az a tény, valgrind kimeneti, a formátum is,
csak kegyetlen.
Nagyon nehéz átlátni a rendetlenség az érdekes információkat.
Szóval, mit tettünk itt csak részlet néhány több pár
érdekes vonalak.
De észre, hogy 80%-a az valgrind kimenet lesz egy kis
figyelemelterelés.
>> Csak nézd minták, mint ezek - érvénytelen jobb, érvénytelen olvasni, 40 bájt
és egyes blokkok száma egyértelműen elveszett, kulcsszavak ilyesmi.
És mit fog remélhetőleg látni egy kis egyfajta nyoma, hogy mi működik a
hiba valójában be
Ebben az esetben is, milyen sorban a kód volt a hiba nyilvánvalóan?
>> 26 nevű fájlt memory.c, ami A példában játszottak
abban az időben.
Tehát valószínűleg nem a malloc.
Valószínűleg az én kódot.
Szóval majd meglátjuk ezt újra és ismét nemsokára.
>> Tehát scanf, ez jött fel egy Pár formák eddig.
Láttuk sscanf röviden.
Olyan volt, mintha a több Ön fejest ugrott a
felkészülés a teszt.
És scanf valójában mi a CS50 könyvtár használta alatt
Hood jó ideje, hogy hogy adatokat kér a felhasználótól.
>> Például, ha áttérni a CS50 készülék itt, hadd nyit egy
Például ma, hogy hívják scanf-0.c És ez végtelenül egyszerű.
Ez csak néhány sornyi kódot.
De ez azt mutatja, hogy tényleg getInt dolgozott egész ebben az időben.
>> Ebben a programban itt, a 16. sorban Figyelje meg, hogy kijelentem, int.
Tehát nem mutató, semmi mágikus ott, csak egy int.
Aztán a 17. sorban, azt kéri a felhasználó egy számot, kérem.
Aztán késő 18, azt használja scanf itt.
És én meg, olyan, mint printf, hogy várom idézet
Unquote százalék i.
>> Tehát százalék i, persze, jelöli egy int.
De észre, mi a második érv, hogy a scanf.
Hogyan jellemezné a második érvelés után a vessző?
Mi ez?
>> Ez a cím az x.
Tehát ez hasznos, mert azáltal, hogy scanf a címét x, mit
amelyek képessé teszik ezt a funkciót, hogy nem?
Nem csak ott, hanem az, amit?
>> Készíts egy változás is.
Mert akkor ott, ez a fajta mint egy térkép, hogy a hely a memóriában.
És mindaddig, amíg az Ön által megadott scanf vagy minden funkció olyan térképet, amely
funkció ott, és nem csak a nézd meg az értéket, de ez is
át az értékeket, ami hasznos, ha a célja az életben, hogy scanf
szkennelés adatokat kér a felhasználótól, különösen a billentyűzetről.
És a f jelöli formázott, mint printf, a f jelöli a formázott
karakterláncot szeretne nyomtatni.
>> Tehát röviden, ez a sor 18 egyszerűen azt mondja, próbálja olvasni egy int a felhasználó
billentyűzet és tárolja belsejében x, a bármi cím x lesz élni.
És akkor végül, a 19 csak azt mondja, köszönöm a int, ebben az esetben.
>> Hadd megy előre, és ezt.
Tehát, hogy scanf 0-ra.
Hadd menjek előre, és nagyításhoz
Megyek, és futtassa ezt pont perjel scanf 0-ra.
Szám, kérem?
50..
Köszönöm a 50.
Tehát ez nagyon egyszerű.
>> Most mi van az nem csinál?
Ez nem csinál egy csomó hiba ellenőrzése.
Például, ha nem működnek együtt, és nem írja be a számot, de a
ehelyett írok valamit, mint a "hello," ez csak furcsa.
És az egyik dolog, a CS50 könyvtár már csinál nekünk egy kis
idő, hogy reprompting és reprompting.
>> Az Újra kifejezés visszahívás volt cs50.c, és ez az oka annak, hogy a getInt
A CS50 könyvtár valójában egy egész csomó sor hosszú, mert mi vagyunk
ellenőrzi a buta dolgok, mint ez.
Vajon a felhasználó nem ad minket, sőt, egy int?
Vajon ő ad nekünk valamit mint az ABC szerinti rendezést?
Ha igen, szeretnénk észlelni ezt, és kiabálni őket.
>> De a dolgok sokkal érdekesebb ebben a következő példában.
Ha elmegyek scanf-1.c, mi az, dolog, hogy alapvetően megváltozott
A következő példa?
Én vagyok a char *, persze, helyett int.
>> Szóval ez azért érdekes, mert char * emlékszem, tényleg csak a
ugyanaz, mint a szöveg.
Olyan érzés, mint lehet, hogy ez egy szuper egyszerű végrehajtása getString.
De én hámozott vissza a réteg A CS50 könyvtár, úgyhogy
hívja a char * most.
Lássuk, hol, ha bárhol, mi baj.
>> Line 17 -
Megint mondom, kérek valamit, ebben az esetben egy string.
Majd a következő sorban, hívom scanf, újra, így ez a formátum kód
de ezúttal százalék s.
És akkor ez az idő, én vagyok így ez puffer.
>> Most veszi észre, nem vagyok a a jel.
De miért van az, hogy az valószínűleg rendben itt?
Mert ami buffer már?
Ez már a mutató.
Ez már egy címet.
>> És nézzük ezt a szót "megzavarja" Hadd csak ez s, például az, hogy
egyszerűség.
De én nevezte puffer, mert Általánosságban elmondható, programozás, ha van egy
darab memória, amely egy sor igazán csak az, hogy lehet, hogy ez egy puffer.
Ez egy olyan hely az adatok tárolására.
>> Hasonló a dolgokat, mint a YouTube, amikor ők pufferelés, hogy úgy mondjam, hogy a
csak azt jelenti, hogy ez le bitet az interneten, és tárolja azokat egy
helyi tömb helyi darab memória, így hogy meg lehet nézni, hogy később nem
az ugró vagy lóg Ön lejátszása közben.
>> Szóval van egy probléma, bár, mert én mondom scanf, várnak
húr a felhasználó.
Itt a címét egy darab memóriát.
Tedd, hogy a húr van.
Miért van az, hogy a kötött adjon mi baj, igaz?
>> Mi ez?
Vagyok szabad hozzáférés azt a részét, a memória?
Tudod, én nem tudom.
Mivel a puffer inicializálása valamit?
Nem igazán.
És ez az, amit mi már hívás egy szemetes értéket, amely
nem formális szót.
Ez csak azt jelenti, hogy fogalmunk sincs, mi bitek belül van a négy byte
Én felosztása a puffer.
>> Nem hívott malloc.
Én biztosan nem hívott getString.
Szóval, ki tudja, mi az valójában belső puffer?
És mégis azt mondta scanf vakon, ott és tedd, amit a felhasználó beírt.
>> Tehát mi okozhat a kódunk, ha elindul?
Valószínűleg segfault.
Talán nem, de valószínűleg a segfault.
És azt mondom, lehet, hogy nem, mert néha igen, néha
nem kap a segfault.
Néha egyszerűen csak szerencsés, de ez azonban lesz
egy hiba a programban.
>> Hadd megy előre, és lefordításával.
Fogom csinálni a régi iskola módon.
Így csattanással kötőjel 0, scanf-1, scanf-1.c, Enter.
Hoppá, túl öreg iskola.
Lássuk.
Hol megyek?
Ó, char * buffer.
Ó, köszönöm -
Mentés, OK -
nagyon régi iskolában.
Rendben, ez már egy ideje.
>> Szóval már csak mentette a fájlt, miután teszi, hogy az ideiglenes
változtatni egy perce.
És most már össze is kézzel csenget.
És most megyek előre és fuss scanf-1, Enter.
Karakterlánc kérem.
Majd írja be "hello".
>> És most, itt, ahol, őszintén szólva, printf tud egy kicsit bosszantó.
Ez valójában nem fog segfault ebben az esetben.
Printf egy kicsit különleges, mert ez annyira szuper elterjedt, hogy
lényegében printf csinál nekünk egy szívességet, és felismerve,
ez nem érvényes pointer.
Hadd vegye fel magam, hogy csak nyomtatni out zárójelben null, még
bár ez nem feltétlenül, amit mi magunk várható.
>> Tehát nem igazán könnyen váltanak ki segfault ezzel, de egyértelműen ez a
nem az a viselkedés, amit akartam.
Szóval mi az egyszerű megoldás?
Nos, scanf-2, hadd javasoljuk, hogy ahelyett, hogy valójában csak egy kiosztása
char *, hadd legyek egy kicsit okosabb a ezt, és hadd osztja puffer
mint egy sorozata 16 karakter.
>> Így meg tudom csinálni ezt egy pár módon.
Én is teljesen használni malloc.
De én vissza a két hétig, amikor Csak kellett egy csomó
karakter.
Ez csak egy tömb.
Hadd inkább újra puffer hogy egy sor 16 karakter.
>> És most, amikor elmegyek puffer -
és ez az, amit mi nem beszélni a héten két -
de kezelésére tömb bár ez a cím.
Technikailag, mint láttuk, ők egy kicsit más.
De scanf nem bánja, ha adsz meg a nevét egy sor, mert amit
Clang fog tenni nekünk alapvetően kezeli a nevét, hogy a tömb, mint a
címe darab 16 bájt.
>> Tehát ez jobb.
Ez azt jelenti, most, hogy remélhetőleg tegye a következőket.
Hadd kicsinyíteni egy pillanatra, és megcsináljuk scanf-2 összeállított OK.
Most hadd ne lett perjel scanf-2.
Karakterlánc kérem. "Hello." És ez úgy tűnt, működik ebben az időben.
>> De valaki javasolni a forgatókönyvet amely lehet, hogy nem mindig működik?
Igen?
Valami hosszabb, mint 16 karakter.
És tényleg, mi lehet egy kicsit pontosabb.
Valami hosszabb, mint 15 karakter, mert tényleg meg kell szem előtt tartani
, amire szükségünk van, hogy a backslash nulla hallgatólagosan a végén a húr,
amely félre scanf általában vigyázni számunkra.
>> Hadd ilyesmit -
Néha csak hagyja így.
OK, így már jelenleg indukált szegmentációs hiba.
Miért?
Mert gépelt, hogy több mint 15 karakterek, és így most már tényleg
megérintette memória, hogy én valóban nem kellett volna.
>> Szóval, ami igazán a megoldás itt?
Nos, mi van, ha szükségünk van egy hosszabb szöveg?
Nos, lehet, hogy 32 bájt.
Nos, mi van, ha ez nem elég hosszú?
Mit szólnál 64 byte?
Mi van, ha ez nem elég hosszú?
Mit szólnál 128 vagy 200 bájt?
Ami igazán a megoldás itt a Általános esetben, ha nem tudjuk a
előre, amit a felhasználó fog gépelni?
>> Ez csak elég nagy fájdalom a csacsi, hogy őszinte legyek, ezért a
CS50 könyvtár néhány tucat sornyi kód együttes végrehajtása
GetString karakterláncot úgy, hogy mi nem kell tudni előre, mi a
felhasználó fog beírni.
Különösen, ha megnézi vissza cs50.c két héttel ezelőtt, akkor megjelenik
hogy getString valójában nem scanf nem használhatja ezen a módon.
Inkább olvas egy karakter egy időben.
>> Mivel az egyetlen jó dolog olvasás egy karakter tudunk
biztosítani magunkat, hogy mindig legalább egy char.
Én is csak egy char kijelentem, majd vegye Ezen igazán baba lépéseket csak
olvasni egy karakter egy időt a billentyűzeten.
És akkor mit fog látni getString tesz, minden alkalommal, amikor elfogy a,
mondjuk 16 byte memóriát, használ malloc vagy unokatestvére annak, hogy
Több memória másolás a régi memóriát az új, majd a csúszó
mentén, szerzés egy karaktert egy időben, és amikor elfogy, hogy a
darab memória, dobja el, megragadja egy nagyobb darab memória, másolatok régi
új, és megismétli.
És ez valóban a fájdalom, hogy ténylegesen végre valami olyan egyszerű, mint
kapok be a felhasználó.
>> Így használhatja scanf.
Használhatja más hasonló funkciók.
És sok a tankönyvek és az online példák, de ezek mind
téve a problémák, mint ez.
És végül, kapok egy segfault a fajta idegesítő.
Ez nem jó, a felhasználó számára.
>> De a legrosszabb esetben, mit alapvetõen tedd
kód veszélyeztetett?
Valamilyen támadás, esetleg.
Beszéltünk egy ilyen támadást - túláradó a verem.
De általában, ha szabad túlcsordulás a puffer, mint tettük azt a
Néhány héttel ezelőtt, és csak írásban több, mint "hello" a verem, akkor
valóban átveszi, potenciálisan a számítógép, vagy legalább kap az adatok
nem a tiéd.
>> Tehát röviden, ezért van a képzés kerekek.
De most kezd levenni, mint a programok már nem kell,
szükségszerűen, adatokat kér a felhasználótól.
De abban az esetben a problémát meg hat, A bemenet jön egy hatalmas
szótár fájl 150 néhány furcsa ezer szónál.
>> Szóval nem kell aggódni a felhasználó tetszőleges bemenet.
Adunk néhány feltételezés az a fájl.
Bármilyen kérdése van, vagy mutatók scanf vagy felhasználói általában?
>> Rendben, egy gyors pillantást, majd egy záró témát két héttel ezelőtt.
És ez volt ez a fogalom a struct.
Nem mintha - ezt a fogalmat a struct, ami volt?
Mit struct tenni értünk?
>> Határozza meg -
Tessék?
Határozza meg a változó típusát.
Tehát egyfajta.
Mi tulajdonképpen ötvözi két témát.
Tehát typedef, emlékeztetni arra, hogy mi is kijelentik egyfajta saját, mint a
szinonimája, mint a karakterlánc char *.
De a typedef struct és, mi is létre igazán saját adatszerkezeteket.
>> Például, ha visszamegyek a gedit itt egy pillanatra, és megy előre
is valami hasonlót, hadd mentse ezt, mondjuk, structs.c
átmenetileg, Elmegyek , hogy menjen előre, és egy olyan
standardio.h, int main semmis.
És akkor itt, tegyük fel, hogy azt akarom, írni egy programot, amely tárolja
több diák több házak, például.
Szóval, ez olyan, mint egy registrarial adatbázis valamilyen.
>> Tehát, ha szüksége van a név az egyik diák, én lehet csinálni valamit, mint char * name,
és én ilyesmit -
valójában, vegyünk a CS50 könyvtár csak egy pillanatra, hogy ez a
kicsit egyszerűbb, így kölcsönözhetnek a több tucat sornyi kódot.
És nézzük csak tartsa egyszerű.
Majd tartsa string, és most getString.
>> Tehát azt állítom, most, hogy már tárolt a nevét néhány diák, és a ház a
Néhány diák, csak a változó mint mi, és az első héten.
De tegyük fel, most szeretnék támogatni több diák.
Rendben, én ösztönök kell tennünk karakterlánc name2, kap getString, string
house2 lesz getString.
És akkor a harmadik diák, lássuk név3 getString.
>> Rendben, ez remélhetőleg feltűnő Ön, mint a fajta ostoba,
mert ez a folyamat valóban nem lesz a vége, és ez csak úgy
hogy a kód a valósnál és ami még rosszabb és rosszabb lesz.
De ezt is megoldotta a héten kettő.
Milyen volt a viszonylag tiszta megoldás amikor már több változó a
Ugyanezeket az adatokat típus, mind összefügg egymással, de mi nem akarjuk, hogy ez szörnyű rendetlenség
A hasonló nevű változó?
Mit csinálunk helyette?
>> Szóval azt hiszem, hallottam egy pár helyen.
Volt egy tömb.
Ha azt szeretné, több példányban valamit, miért nem tiszta ez az egész
, és csak azt mondom, hogy nekem nevű tömböt neveket?
>> És most, most kemény 3-as kód.
Aztán adj még egy tömb hívott házak, és hagyd, hogy a
most nehéz 3-as kód.
És én már masszívan kitakarította a rendetlenség, hogy én csak teremtett.
Nos, én még mindig nehéz kódolású 3, de még a 3 is dinamikusan jönnek a
felhasználó vagy argv, vagy hasonlók.
Szóval ez már tisztább.
>> De mi bosszantó ez, hogy Most, bár a név valahogy
alapvetően a egy diák háza -
ez egy diák, hogy igazán szeretné, hogy képviselje -
Most már két tömböt, amely párhuzamos abban az értelemben, hogy ők a
azonos méretű, és neveket konzol 0 feltehetően térképek házak konzol 0,
és neveket konzol 1 térképek a házak konzol 1.
Más szóval, hogy a diák él hogy a ház, és hogy más diák
lakik a másik házban.
De biztosan ez lehet tenni, még tisztábban.
>> Nos, lehet, sőt.
És hadd menjen előre, és nyitott fel structs.h, és akkor
látja ezt az ötletet itt.
Figyeljük meg, hogy én is használtam typedef, ahogy utalt az imént, hogy állapítsa meg a
saját adattípus.
De én is ezzel a másik kulcsszó nevezett struktúra, ami nekem egy új
adatstruktúra.
>> És ez adatstruktúra azt állítják megy hogy a két dolog belsejében
ez - egy string nevű nevet, és egy string nevű házat.
És a neve fogok adni ez az adat struktúra megy
hogy hívják diák.
Nevezhetném, amit csak akarok, de szemantikailag teszi
értelme számomra a fejemben.
>> Tehát most, ha nyit egy jobb változat A program elkezdtem írni
ott, hadd lépjünk a csúcsra.
És van néhány sornyi kódot itt, de hadd összpontosítani a
a pillanatban az egyik.
Már kijelentette, állandó úgynevezett diák és kemény kódolású 3 most.
De most, észre, hogy tiszta a kód kezd kap.
>> A vonal 22, kijelentem tömb diákok.
És észre, hogy a diákok látszólag most egy adattípust.
Mivel a tetején ezt a fájlt, észre Én már bele, hogy header fájlt
hogy húztam fel, csak egy perce.
És header fájlt egyszerűen volt Ez a meghatározás egy diák.
>> Tehát most, amit létre saját egyéni adatok írja, hogy a szerzők a C év
ezelőtt nem gondol előre.
De nem gond.
Én lehet, hogy én magam.
Tehát ez egy tömb nevű diákok, Minden amelynek tagjai
egy diák struktúrát.
És azt akarom, a három említett a tömbben.
>> És most mi a többit a program nem?
Kellett valami, egy kicsit önkényes.
Így az online 24-től, Azt hajtogat 0-3.
Én majd felkéri a felhasználót a a hallgató nevét.
Aztán használjon getString, mint korábban.
Aztán kérje a hallgató házába, és tudom használni getString, mint korábban.
>> De vegyük észre - némileg új darab szintaxis -
Még mindig index az i-edik diák, de hogyan jutok el a konkrét adatok
területén belül a struktúra?
Nos, mi úgy tűnik, a új darab szintaxis?
Ez csak a pont operátor.
>> Már nem igazán láttam ilyet.
Láttad azt a Pset öt, ha már lebukott a már a bitmap kép.
De a dot csak azt jelenti, belül a struct vagy több területen, hogy pont
név, vagy adj dot házat.
Ez azt jelenti, menj be a struct és kap az egyes területeken.
>> Mit jelent a többi a program nem?
Ez még nem minden, hogy szexi.
Figyeljük meg, hogy én hajtogat 0-3 ismét és hozzon létre egy angol
kifejezés, mint olyan, és így az ilyen, és egy ilyen ház, átadva dot nevét
Az i-edik diák és ház is.
>> És akkor végül, most kezdjük, hogy anális erről, most, hogy
tisztában azzal, mi malloc és egyéb funkciókat
mindezt alkalommal.
Miért kell szabadítani a két név és a ház, bár én
Nem hívja malloc?
>> GetString volt.
És ez volt a piszkos kis titka néhány hét, de van getString
már szivárog memória az egész hely minden félévben eddig.
És valgrand majd végül mutatják ezt velünk.
>> De ez nem egy nagy dolog, mert tudom, , hogy én is csak szabad a nevét
és a ház, hiába, hogy szuper, szuper biztonságos, azt kell
csinál valami hiba ellenőrzés itt.
Mi az ösztöneid mondom?
Mire kell hogy ellenőrzik mielőtt szabad, ami a
string, amely más néven a char *?
>> Én tényleg ellenőrzik, ha a diákok konzol i pont neve nem
egyenlő null.
Akkor lesz baj, hogy menjen előre és ingyenes hogy a mutató, és azonos vagy más
egy is.
Ha a tanulók konzol i dot ház nem egyenlő null, ezt most megvédi
szemben a sarokban ügyben, amelyben GetString visszatér valami ilyesmi null.
És láttunk egy perce printf majd megvédeni minket itt csak azt
null, ami fog nézni furcsa.
De legalább nem fog segfault, mint láttuk.
>> Nos, hadd tegye egy másik dolog itt. Struktúrák-0 egyfajta ostoba programot
mert én meg ezeket az adatokat, majd a ez elveszett, ha a program véget ér.
De hadd menjek előre, és erre a célra.
Engedjék meg, hogy a terminál ablak egy kicsit nagyobb.
Engedjék meg, hogy struktúrákat-1, amely egy új változata a.
>> Én nagyítani egy kicsit.
És most hadd futni dot slash Struktúrák-1.
Student neve -
David Mather, csináljuk Rob Kirkland, lássuk Lauren Leverett.
Milyen érdekes most felhívás -
és én csak azt tudom, mert Én írtam a programot -
van egy kép most a jelenlegi elnevezésű könyvtárat students.csv.
Néhányan lehet, hogy láttam ezeket a valós világban.
>> Mi az a CSV fájlt?
Vesszővel elválasztott értékek.
Ez a fajta, mint a szegény ember verziója egy Excel fájl.
Ez egy tábla a sorok és oszlopok meg tudja nyitni a programot, mint az Excel,
vagy számok egy Mac.
>> És ha kinyitom ezt a fájlt itt gedit, felhívás - a számok nincsenek ott.
Ez csak gedit mondja nekem sorszámok.
Figyeljük meg az első sorban a fájl David és Mather.
A következő sor Rob vessző Kirkland.
A harmadik vonal Lauren vessző Leverett.
>> Szóval, mit hoztam létre?
Már most írt egy C program hatékonyan tud generálni táblázatok
meg lehet nyitni a program, mint például az Excel.
Nem olyan vonzó egy adathalmaz, de ha sokkal nagyobb darabokat
adatokat, amit valóban szeretne manipulálni, és grafikonok, valamint a
tetszik, ez talán az egyik módja, hogy az adatok.
Sőt, CSVs valóban szuper gyakori csak tárolására egyszerű adat -
Yahoo Finance, például, ha kap tőzsdei keresztül az úgynevezett
API, az ingyenes szolgáltatás, amely lehetővé teszi, hogy kap a jelenlegi up-to-the-date állomány
idézi a cégek, adja az adatokat vissza a
szuper egyszerű CSV formátumban.
>> Szóval hogyan tesszük ezt?
Hát észre, a legtöbb a program majdnem ugyanaz.
De észre itt, ahelyett, print A diákok ki, on line 35
tovább, azt állítom, hogy én vagyok a megtakarítás diákok a lemezre, így a mentés egy fájlba.
>> Így észre én nyilvánított FILE * -
Most, ez a fajta anomália a C Bármilyen okból, FILE minden sapkák,
ami nem olyan, mint a legtöbb más adattípusok C-ben, de ez a beépített
adattípus, FILE *.
És én nyilvánított mutató egy fájlba, az, hogy hogyan lehet gondolni, hogy az.
>> fopen: nyitott fájlt.
Milyen fájlt akarsz megnyitni?
Szeretnék nyitni egy fájlt, amit majd önkényesen hívás students.csv.
Tudtam hívni, hogy amit csak akarok.
>> És akkor egy tipp.
Mit jelent a második argumentum az fopen valószínűleg azt jelenti?
Jobb, w az írás, lehetne lesz r olvasni.
Van egy hozzáfűzés, ha hozzáadni kívánt sorokat, és nem
felülírja az egészet.
>> De én csak azt szeretném, hogy létrehozza ezt a fájlt egyszer, úgyhogy használni quote unquote w.
És tudom, hogy csak olvastam a dokumentáció, vagy a man oldalt.
Ha a fájl nem null - más szóval, ha semmi baj nincs -
hadd hatunk végig tanulók 0-3.
>> És most észre, hogy van valami alig észrevehetően eltérő
a line 41 itt.
Ez nem printf.
Ez fprintf a fájlok printf.
Így fog írni a fájlba.
Melyik fájlt?
Akinek mutató megadott az első érv.
>> Aztán meg a format string.
Aztán meg, hogy milyen szöveg akarunk csatlakoztassa az első százalékos s, és
majd egy másik változót vagy a második százalék s.
Ezután zárjuk a fájlt fclose.
Mint én szabad a memória, mint korábban, de Menjek vissza, és adjunk hozzá
Néhány ellenőrzi null.
>> És ennyi.
fopen, fprintf, fclose ad nekem képes létrehozni szöveges fájlokat.
Most, akkor látni probléma meg öt, amely magában foglalja a képeket, akkor használja
bináris fájlok helyett.
De alapvetően az ötlet ugyanaz, még akkor is, ha a funkció azt is megtudhatod
hogy egy kicsit más.
>> Tehát forgószél túra, de akkor kap is ismeri fájl I/O--
be-és kimenet - a Pset öt.
És bármilyen kérdése van az kezdeti alapokat itt?
Igen?
>> Mi van, ha megpróbálja kiszabadítani a null érték?
Azt hiszem, hacsak nem szabad ütött kicsit több felhasználóbarát, akkor
potenciálisan segfault.
Halad null rossz, mert nem hisz szabadon zavar, hogy ellenőrizze az Ön számára,
mivel ez potenciálisan a hulladék Az idő, hogy ezt maga a
mindenki a világon.
Jó kérdés, mégis.
>> Rendben, így ez a fajta lesz minket egy érdekes téma.
A téma a probléma meg Ötös kriminalisztika.
Legalábbis ez a része a megoldásokat.
Törvényszéki általában utal, hogy a helyreállítási információ, hogy lehet,
Lehet, hogy nem törölték szándékosan.
És azt gondoltam, hogy egy gyors ízelítőt, hogy mi is történik valójában az összes
ezúttal alatt Hood a számítógép.
>> Például, ha van benne a laptop vagy az asztali számítógépen a
merevlemez, ez akár egy mechanikus eszköz, amely valóban forog -
ott kerek dolgokat az úgynevezett tálak úgy néz nagyon tetszik, amit
most volt a képernyőn van, mégis ez inkább a régi iskolában.
Ez egy három-és egy-fél hüvelyk merevlemez.
És három és fél hüvelyk utal a az a dolog, ha telepíti
egy számítógép.
>> Sokan közületek srácok a laptopok már van szilárdtest-meghajtók és SSD,
amelyek nem tartalmaz mozgó alkatrészeket.
Ők inkább RAM-ot és kevesebb, mint a ezek a mechanikus eszközök.
De az ötlet még mindig ugyanaz, Természetesen, mint azok
a probléma meg öt.
>> És ha úgy gondolja, van most egy merevlemezt jelenti, hogy egy kör, amely
Én felhívni így itt.
Amikor létrehoz egy fájlt a számítógépen, hogy ez egy SSD, vagy
Ebben az esetben egy régebbi iskola merevlemez, ez a fájl tartalmazza több bit.
Tegyük fel, hogy ez a 0 és 1, egy csomó 0s és 1s.
Szóval ez az egész merevlemezt.
Ez nyilvánvalóan egy nagyon nagy fájlt.
És ez a fel a 0s és 1s abban része a fizikai tál.
>> Nos, mi az, hogy a fizikai része?
Nos, kiderült, hogy a merevlemezen, legalább egy ilyen típusú, van
ezek az apró kis mágneses részecskéket.
És lényegében az Északi-és a déli pólus nekik, hogy ha
viszont egy ilyen mágneses részecskék Ily módon, ha azt mondják, hogy ez
ami 1.
És ha ez fejjel lefelé délre észak, lehet mondani, hogy ez
ami 0-ra.
>> Így a valós fizikai világban, ez hogyan jelenthet valamit
bináris állapotot a 0 és a 1.
Szóval ez az egész egy fájl.
Van egy csomó mágneses részecskék, amelyek az így vagy
Ily módon, ami minták A 0s és 1s.
>> De kiderül, amikor elment egy fájlt, néhány információt tárolja külön.
Tehát ez egy kis asztal, a könyvtár, hogy úgy mondjam.
És én hívom az oszlop nevét, Hívom ezt az oszlopot helyre.
>> És azt fogom mondani, feltételezni ez az én folytatódik.
My resume.doc tárolja a helyre, mondjuk 123.
Én mindig megy ez a szám.
De elég annyit mondani, hogy csakúgy, mint a RAM-ban, akkor egy merevlemez
ez egy gigabyte vagy 200 GB vagy egy terabájt, és akkor
száma az összes bájt.
Lehet szám Minden darabokat 8 bit.
>> Ezért mondom, hogy ez a Van hely 123.
Tehát ez a könyvtár belsejében az operációs rendszer megjegyzi, hogy a
önéletrajz a következő helyen: 123..
De ez lesz érdekes, ha töröl egy fájlt.
>> Így például -
és szerencsére, a legtöbb a világ fogott erre -, hogy mi történik, ha
húzza a fájlt a Mac OS Kuka , vagy a Windows Recycle Bin?
Mi a célja ennek, hogy?
Ez nyilvánvalóan, hogy megszabaduljon a fájlt, de mit jelent a cselekmény fogd és
csökken be a szemetet, vagy a Recycle Bin csinál a számítógépen?
>> Abszolút semmi, tényleg.
Olyan ez, mint egy mappát.
Ez egy különleges mappa, az biztos.
De vajon ez tényleg törli a fájlt?
>> Nos, nem, mert néhányan talán volt, mint, ó fenébe, hogy nem
azt jelenti, hogy ezt tegyük.
Szóval kattintson duplán a Trash, vagy Lomtár.
Már kidugta a környéken, és már vissza A fájl csak húzással
onnan.
Tehát egyértelműen, ez nem feltétlenül törli azt.
>> OK, te okosabb.
Tudod, hogy csak húzza be a Trash, vagy Lomtár nem jelenti azt,
akkor ürítse ki a szemetet.
Szóval menj fel a menüt, és azt mondod Empty Trash vagy Lomtár ürítése.
Akkor mi lesz?
>> Igen, ezért törlésre inkább.
De minden, ami történik ez.
A számítógép elfelejti, hol resume.doc volt.
>> De mi nem változott látszólag a képen?
A bitek a 0s és 1s, hogy állítják, A helyszínen néhány fizikai szempontból
a hardver.
Ők mindig ott vannak.
Ez csak a számítógép elfelejtette, mik azok.
>> Szóval ez lényegében felszabadította a fájl bit úgy, hogy újra fel lehet használni.
De amíg még több kép, és fájlokat, és a több fájl lesz
valószínűségi azok 0s és 1s, a mágneses részecskéket, kap újra,
fejjel vagy jobb oldalon felfelé, a egyéb fájlokat, 0s és 1s.
>> Szóval van ez az ablak az idő.
És ez nem a kiszámítható hosszú, de tényleg.
Ez attól függ, mekkora a merevlemez meghajtót, és hogy hány kép van, és
milyen gyorsan újakat.
De ez idő-ablak alatt amely a fájl még mindig tökéletesen
hasznosítható.
>> Tehát, ha valaha is használni programok, mint a McAfee vagy Norton hogy megpróbálja visszaállítani
adatokat, az összes csinálnak próbál vissza az úgynevezett könyvtár
kitalálni, ahol a fájl volt.
És néha Norton és azt mondja, fájl 93%-ban újrahasznosítható.
Nos, mit jelent ez?
Ez csak azt jelenti, hogy az egyéb fájl véletlenül végül a, mondjuk,
ezeket a biteket ki az eredeti fájl.
>> Tehát mi tulajdonképpen szó visszaszerzés adat?
Nos, ha nincs valami hasonló Norton előre telepítve a számítógépre,
A legjobb, amit tehetünk, néha meg A teljes merevlemezt keresnek
minták bit.
És az egyik témája a probléma meg öt az, hogy megkeresi a
felel meg a merevlemez, a törvényszéki kép egy compact flash kártya a
digitális fényképezőgép, keresi a 0s 1s és jellemzően, mivel nagy
valószínűség képviselik kezdete egy JPEG képet.
>> És ti is vissza a képek feltételezve, ha látom, ezt a mintát a
bit a törvényszéki képet, nagy a valószínűsége, hogy a védjegyek
kezdetét a JPEG.
És ha látom ugyanazt a mintát újra, hogy valószínűleg kezdetét a
másik JPEG, és egy másik JPEG, JPEG és egy másik.
És ez tipikusan milyen adat visszaszerzés fog működni.
Mi a jó a JPEG még ha A fájlformátum is némileg
komplex, az elején minden olyan fájl valójában meglehetősen azonosítható
és egyszerű, mint látni fogjuk, ha már nem tette meg.
>> Szóval vessünk egy közelebbi pillantást alatt a motorháztetőt, hogy pontosan mi volt
folyik, és amit ezek a 0-ák és 1-esek van, hogy egy kicsit több a
összefüggésben ez különösen nagy kihívást jelent.
>> [VIDEÓ LEJÁTSZÁS]
>> -Ahol a számítógép tárolja a legtöbb Az állandó adatokat.
Ehhez az adatok utazik RAM valamint a szoftver, azt jelzi, hogy elmondja
a merevlemez, hogyan kell tárolni az adatokat.
A merevlemez áramkörök fordítás ezeket a jeleket a feszültség
ingadozások.
Ezek viszont ellenőrzik a merevlemez mozgó alkatrészek, néhány a néhány
mozgó alkatrészek maradt a modern számítógép.
>> Egyes jelek vezérlésére motor amely forog fémmel bevont tálak.
Az adatok ténylegesen tárolt ezeken a tálak.
Más jelek mozgassa az írási / olvasási fejek olvasni, vagy
írni az adatokat a tálak.
Ez a gép olyan pontosak, hogy az emberi haj nem is adja át az
fej és forgó tálak.
Mégis, minden működik félelmetes sebességgel.
>> [END VIDEÓ LEJÁTSZÁS]
>> DAVID MALAN: Nagyítás egy kicsit mélyebb most mi van
valójában a tálak.
>> [VIDEÓ LEJÁTSZÁS]
>> -Nézzük meg, amit most látott lassított.
Ha a rövid impulzus villamos küldött az író / olvasó fej, ha fejtetőre
egy kis elektromágneses számára egy töredéke a második.
A mágnes létrehoz egy mezőt, amely megváltoztatja a polaritását egy apró, pici
részét a fém részecskék, amelyek kabát minden tál felület.
>> A minta sorozat ezen apró, feltöltött területek a lemezen
jelentése egy egyetlen bit adatokat a bináris szám
rendszer által használt számítógépek.
Most, ha a jelenlegi küldi egyik módja keresztül az író / olvasó fej, a terület
polarizált az egyik irányba.
Ha az aktuális kerül elküldésre ellenkező irányba, a
polarizáció megfordul.
>> Hogy kap az adatok le a merevlemezt?
Csak visszafordítani a folyamatot.
Így a részecskék a lemezen hogy mindig a legfrissebb, a
író / olvasó fej mozog.
Össze millió ilyen mágnesezett szegmensek és
van egy fájl.
>> Most, a darab egyetlen fájl szétszórva az egész egy meghajtó
tálak, olyan, mint a rendetlenség A papírok az asztalon.
Tehát egy speciális extra fájlt nyilvántartja Az hol van.
Nem szeretném, ha volna valami ilyesmi?
>> [END VIDEÓ LEJÁTSZÁS]
>> DAVID MALAN: OK, talán nem.
Szóval hány a srácok nőtt fel ezeket?
OK, így egyre kevesebb kezet minden évben.
De örülök, hogy te legalább ismerős velük, mert ez és a saját
könyv demo sajnos halnak nagyon lassú halál itt közismertek.
>> De ez az, amit én, legalábbis, vissza középiskolában, használt felhasználás mentést.
És csodálatos volt, mert lehet tárolni 1.4 megabájt on
az adott lemezt.
És ez volt a nagy sűrűségű verzió, ahogy azt a HD, amely
ami azt jelenti, mielőtt a mai HD videók.
>> Szabványos sűrűség 800 kilobyte.
És előtte voltak 400 kilobájtos lemezek.
És előtte voltak 5 és 1/4 os lemezek, amelyek igazán floppy,
és egy kicsit szélesebb és magasabb mint ezek a dolgok itt.
De valóban látni az úgynevezett floppy szempontból ezeket a lemezeket.
>> És funkcionálisan, ők valójában nagyon hasonló a merevlemezek az at
legalábbis ez a fajta.
Ismét SSD újabb számítógépek a munka egy kicsit másképp.
De ha mozog a kis fém fület, akkor valóban látni egy kicsit süti,
vagy tál.
>> Nem fémből, mint ez.
Ez valójában néhány olcsóbb műanyag.
És akkor milyen kígyózik is.
És te kurva, csak letörölni néhány bitek száma vagy mágneses részecskék
az ezen a lemezen.
>> Így szerencsére, nincs rajta semmi.
Ha ez dolog az úton -, és fedjük a szemét, és azok a szomszéd -
akkor csak ilyen húzni ezt az egész hüvely ki, mint ezt.
De van egy kis tavaszi, ezért Tudatában a szemed.
Tehát most már tényleg egy floppy lemezen.
>> És mi figyelemre méltó ebben az, hogy, amennyire csak ez egy
kis léptékű ábrázolása egy nagyobb merevlemez, ezek a dolgok szuper,
szuper egyszerű.
Ha csipetnyi alján, most, hogy az hogy a fém dolog nem stimmel, és húzza
őket nyitva, ami van két darab nemez és az úgynevezett floppy disk
egy darab fém a belseje.
>> És ott megy a fele a lemez tartalmát.
Ott megy egy másik fele.
De ez minden, ami forgott benne a számítógép a múlt.
>> És ismét, hogy ezt a szempontból, mekkora a legtöbb
merevlemezek manapság?
500 GB, a terabájt, talán egy asztali számítógép, 2 terabájt, 3
terabájt, 4 terabájt, igaz?
Ez egy megabájt, ide vagy oda, ami nem is illik a tipikus MP3
már ezekben a napokban, vagy valamilyen hasonló zenei fájlt.
>> Így egy kis emlék ma, és is, hogy segítsen kontextusba milyen
fogunk vesz biztosra most probléma meg öt.
Tehát azok a tiéd tartani.
Hadd átmenet, ahol lesz kiadások a következő Pset is.
Tehát már most meg ezt az oldalt, - ó, pár bejelentések gyorsan.
>> Ezen a pénteken, ha szeretne csatlakozni CS50 ebédre, megy a szokásos helyen,
cs50.net/rsvp.
És a projekt végső -
így egy a tananyag, már írt a végleges projekt specifikáció már.
Ismerd fel, hogy ez nem jelenti azt, ez miatt különösen hamarosan.
Ez írt, tényleg, csak azért, hogy srácok rágondolok.
És valóban, a szuper jelentős százalékos lesz leküzdése
végső projektek anyagot, hogy nem is ütött, hogy az osztályban,
de már a jövő héten.
>> Közlemény azonban, hogy a spec kéri néhány különböző összetevői
végleges projekt.
Az első néhány hét, egy pre-javaslat egy szép alkalmi e-mail
A TF elmondani neki, vagy mi te gondolkodtam a projekt, és
Nem elkötelezettség.
Javaslat lesz az adott elkötelezettség, mondván, itt, ez az, amit
Szeretnék csinálni a projektet.
Mit gondolsz?
Túl nagy?
Túl kicsi?
Ez kezelhető?
És látod a spec a részletekért.
>> Pár héttel azután, hogy az az állapot, jelentést, amely egy hasonlóan
alkalmi e-mail a TF mondani, hogy milyen messze van a végső
projekt megvalósítása, majd a A CS50 Hackathon melyet mindenki
felkérést kap, ami lehet egy esemény 20:00 egy este 07:00-ig
AM másnap reggel.
Pizza, ahogy én is említettem a héten nulla, wil szolgálnak fel 09:00,
Kínai étel 01:00.
És ha még mindig ébren 5:00, akkor elviszi IHOP reggelire.
>> Tehát az egyik Hackathon annál élmények az osztályban.
Akkor a végrehajtás miatt, és akkor az éghajlati CS50 Vásár.
További részletek az összes ilyen az elkövetkező hetekben.
>> De térjünk vissza valamit old school -
ismét egy tömb.
Így egy sor jó volt, mert megoldja probléma, mint láttuk, csak egy
pillanattal ezelőtt a diákok struktúrák Kicsit ki a kezéből, ha
szeretné, hogy a hallgató egy, két diák, diák három diák dot dot dot,
néhány tetszőleges számú diák.
>> Tehát tömbök, néhány héttel ezelőtt, lecsapott a és megoldani minden problémánk, hogy nem
tudván előre, hogy sok mindent bizonyos típusú is érdemes.
És láttam, hogy a struktúrákat segíthet tovább szervezzük kódot, és folyamatosan
fogalmilag hasonló tulajdonságokkal, mint például a nevét és a ház, valamint, hogy mi
kezelni őket, mint egy szervezet, belső amelynek vannak kisebb darabokra.
>> De tömbök van néhány hátránya.
Melyek azok a hátrányok már találkozott
A tömbök eddig?
Mi ez?
Rögzített méret - így annak ellenére, hogy lehet, hogy képes a memóriát egy
tömb, ha tudja, hogy hány diák van, hogy hány karakter van
a felhasználó, ha egyszer már kiutalt a tömb, amit a fajta festett
magát egy sarokban.
>> Mert nem lehet be új elemeket a közepén egy tömb.
Nem lehet beszúrni több elemet végén egy tömb.
Tényleg, kénytelenek létrehozása teljesen új tömb, ahogy már említettük,
másolás a régi az új.
És ismét, ez a fejfájás, GetString foglalkozik az Ön számára.
>> De ismétlem, ha nem is be valamit a közepén a tömb
ha az arány nem teljesen töltve.
Például, ha ez a tömb mérete itt hat csak öt dolog benne,
Nos, akkor most tack valamit rá a végén.
De mi van, ha szeretnénk beszúrni valamit a közepén a
tömb, bár lehet, hogy öt a hatból, ami benne van?
>> Nos, mit teszünk, ha már az összes Az emberi önkéntesek színpadon
hét múlt?
Ha akartuk, hogy itt valaki, vagy ezek az emberek, hogyan kell mozogni a
módon, vagy ezek az emberek, hogyan kell mozogni a megtervezésében, és vált drága.
A változó az emberek belsejében egy array végül összeadjuk és költségszámítás
nekünk időt, ezért sok a mi n négyzetes futó időkben behelyezés sort, a
Például, a legrosszabb esetben.
Tehát tömbök nagy, de van, hogy előre tudni, hogy milyen nagy szeretné őket.
>> Tehát OK, itt a megoldás.
Ha nem tudja előre, hogy hány diákok Talán van, és tudom, hogy egyszer
Döntök, bár én megragadt, hogy az sok diák, miért nem én csak mindig
osztják kétszer annyi helyet mint én is hiszem, szükségem van?
Ez nem a megfelelő megoldás?
>> Reálisan, nem hiszem, hogy mi vagyunk lesz szükség több mint 50 hely
A tömb egy közepes méretű osztály, úgyhogy csak felhajt.
Csinálok 100 nyílások a tömbben, csak azért, hogy nem feltétlenül kap a
hallgatók száma elvárom, hogy hogy néhány közepes méretű osztályban.
Akkor miért nem csak a kerek, és osztja több memória, jellemzően egy tömb
mint azt gondolja, talán még szükség?
Mi ez az egyszerű pushback hogy ezt az ötletet?
>> Te csak pazarlás memória.
Szó szerint minden programot írsz, akkor A talán a kétszer annyi memóriát
valóban szükség van.
És ez csak nem úgy, mint egy különösen elegáns megoldás.
Sőt, ez csak csökkenti a valószínűsége, hogy a probléma.
Ha véletlenül van egy népszerű kurzus egy szemeszter, és van 101
diákok, a program továbbra is alapvetően szembe ugyanezzel a kérdéssel.
>> Így szerencsére, van egy megoldás, hogy ez ad minden problémát formában
adatstruktúrák, amelyek bonyolultabb, mint azok,
láttunk eddig.
Ez, azt állítják, a láncolt lista.
Ez a lista a szám -
9., 17., 22., 26., és 34. -
, amelyek kapcsolódnak egymáshoz útján Az, amit én készült a nyíl.
>> Más szóval, ha azt akartam, hogy képviselje egy sor, nem tudtam csinálni
valami ilyesmi.
És teszem ezt a felső csak egy pillanat.
Tudtam csinálni -
hello, rendben.
Készenlét.
Új számítógép itt, tiszta -
Rendben van.
>> Tehát, ha már ezek a számok tömb -
9., 17., 22., 26., 24 -
nem feltétlenül arányos.
Rendben, itt van a sor -
oh my god.
Rendben, itt van a tömb.
Ó, Istenem.
>> [Nevetés]
>> DAVID MALAN: mintha.
Ez túl sok erőfeszítést, hogy menjen vissza és rögzíteni, hogy, így -
26..
Tehát itt van ez a sor 9., 17., 22., 26., és 34..
Azoknak, láthatjuk a kínos hiba, amit most tett,
ott van.
>> Szóval azt állítják, hogy ez a nagyon hatékony megoldás.
Már kiosztott annyi ints mint Szükségem van - egy, kettő, három,
négy, öt, vagy hat -
és én majd tárolja a számokat belül a tömb.
De tegyük fel, akkor azt a beszúrni kívánt érték, mint a 8-as szám?
Nos, hova megy?
Tegyük fel, hogy szeretné szúrni több, mint 20.
Nos, hova megy?
Valahol a közepén, vagy a szám 35 mennie kell
valahol a végén.
De én vagyok a hely.
>> És így ez egy alapvető kihívás A tömbök ez a megoldás.
Azt állította, egy perce, getString megoldja ezt a problémát.
Ha szeretné szúrni a hatodik számot ebbe a tömb, ami legalább egy
megoldás is esik vissza, az biztos, , mint mi a getString?
Mi ez?
>> Nos, hogy a nagyobb, könnyebb mondani, mint megtenni.
Nem feltétlenül, hogy a tömb nagyobb, de mit tehetünk?
Készíts egy új tömböt, ami nagyobb, mérete 6, esetleg 10-es méret, ha akarjuk
hogy előre a dolgok, majd másolja A régi az új tömb, majd
szabad a régi tömb.
>> De mi a működési idő Most, hogy a folyamat?
Ez elég nagy O n, mivel a másolás fog kerülni néhány egység
idő, így nem annyira ideális, ha kell hozzárendel egy új tömböt, ami megy
fogyasztani kétszer annyi memória átmenetileg.
Másolás régi új -
Úgy értem, ez csak egy fejfájás, amely az, hogy ismét, hogy miért írtam
GetString az Ön számára.
>> Szóval mit is csinálunk helyette?
Nos, mi van, ha az adatstruktúra valójában hiányosságok benne?
Tegyük fel, hogy én pihenni a cél, amelyek összefüggő darabokban a memóriát, ahol a 9
közvetlen közelében 17, ami közvetlenül a 22, és így tovább.
>> És tegyük fel, hogy lehet több mint 9 itt RAM, és 17 is itt a RAM,
és 22 is itt a RAM-ban.
Más szóval, nem kell őket még vissza vissza többé.
Csak meg kell valahogy menet a tűt egyes rendszereken keresztül ezeket a számokat, vagy az egyes
Ezen csomópontok, hívjuk a téglalapok ahogy már készült őket, hogy
emlékszem, hogyan lehet eljutni az utolsó az ilyen csomópont az első.
>> Tehát mi a programozási konstrukció láttuk egészen a közelmúltban, amit
végre, hogy a menet, vagy húzott itt, amit lehet
végre a nyilak?
Tehát mutatók, igaz?
Ha osztja nem csak egy int, de a csomópont - és
node, most értem tartályba.
És vizuálisan, úgy értem egy téglalapot.
Tehát egy csomópont nyilvánvalóan szüksége van tartalmaz két érték -
Az int is, és aztán, jelentette az alsó felét a téglalap,
elegendő hely egy int.
>> Tehát csak előre gondolkodás itt, milyen nagy ez a csomópont, a
konténer-e?
Hány byte az int?
Feltehetően 4, ha ez ugyanaz, mint a szokásos.
És akkor, hogy hány bájt a mutató?
4..
Szóval ez a tartály, vagy a csomópont, az lesz egy 8 bájtos struktúra.
Ja, és ez egy szerencsés egybeesés, hogy Mi csak be ezt a fogalmat a
egy struct vagy C struktúrát.
>> Tehát azt állítom, hogy szeretnék, hogy egy lépést felé a kifinomultabb
végrehajtása számok listája, a láncolt lista a számok, azt kell tennie,
kicsit több gondolkodás elöl és Kijelentem, nem csak egy int, de a struktúra
hogy fogom hívni, hagyományosan Itt, csomópont.
Nevezhetnénk, amit csak akarunk, de csomópont lesz a sok tematikus
A dolog, amit kezdeni most.
>> Belül, hogy a csomópont egy int n.
És akkor ez a szintaxis, egy kicsit furcsa első ránézésre -
struct node * mellett.
Nos képszerűen, mi ez?
Ez az alsó fele A téglalap láttunk
csak egy perce.
>> De miért is mondok struct node * szemben a csak node *?
Mert ha ez mutató mutat egy másik node, ez csak a
Egy csomópont címét.
Ez egyezik azzal, amit tárgyalt a mutatók eddig.
De miért, ha azt állítom, ez a struktúra néven csomópont, akkor azt kell mondanom, struktúra
node idebent?
>> Pontosan.
Ez egyfajta ostoba valóság a C. A typedef, hogy úgy mondjam, még nem
történt meg.
C szuper szó.
Így hangzik a kódot felső lefelé, balról jobbra.
És addig, amíg eléri, hogy a pontosvessző lényeg, tudod mit nem
léteznek adattípus?
Node, idézet idézet vége csomópont.
>> Hanem azért, mert a nagyobb bőbeszédű nyilatkozat Én az első sorban -
typedef struct csomópont -
mert ez volt előbb, mielőtt a zárójelek, ez a fajta, mint
pre-nevelése csenget, te Tudod mit, adj egy struct
nevű struct csomópont.
Őszintén szólva, én nem szeretem a dolgokat hív struct csomópont, csomópont struktúra minden
az egész az én kódot.
De én csak akkor használja, egyszer csak belül, így tudok hatékonyan
létrehoz egyfajta körkörös hivatkozást, nem a mutató magamnak önmagában, hanem a
mutató másik azonos típusú.
>> Így kiderül, hogy egy adatstruktúra mint ez, van egy pár
műveleteket lehet érdekes számunkra.
Talán szeretné szúrni egy lista, mint ez.
Azt érdemes törölni Egy ilyen lista.
Azt érdemes keresni a listát a érték, vagy általánosabban, áthalad.
És áthalad csak egy divatos módon mondván, kezdődik a bal és helyezze át az összes
az utat a jobb.
>> És vegyük észre, még ezzel a valamivel több kifinomult adatstruktúra, legyen
én javaslom, hogy lehet kölcsönözni néhány az ötleteket az elmúlt két hétben, és
végre egy funkciót nevű keresés, mint ez.
Ez lesz igaz értéket ad vissza, vagy hamis, jelezve, igen vagy
nem, n értéke a listában.
A második érv a mutató hogy maga a lista, így egy
mutató egy csomópont.
>> Minden fogom majd tennie, hogy kijelentik, átmeneti változót.
Hívjuk meg PTR megállapodás szerint, a mutató.
És rendelje megegyezik a a lista elején.
>> És most észre a while ciklus.
Mindaddig, amíg a mutató nem azonos null, megyek, hogy ellenőrizze.
Az egérmutató n egyenlő n, amit elfogadott?
És egy pillanat - új darab szintaxis.
Mi nyíl hirtelen?
Igen?
>> Pontosan.
Tehát mivel a néhány perccel ezelőtt használt a pont jelölés eléréséhez valamit
belsejében egy a struct, ha a változó még nem a struktúra
, hanem egy mutató a struct, Szerencsére egy darab szintaxist
végül teszi logikus.
A nyíl azt jelenti, hogy kövesse a mutatót, mint a mi nyilak általában azt jelenti,
képszerűen, és menj a adatmező belül.
Tehát nyíl ugyanaz, mint a dot, de akkor használja, ha van egy mutató.
>> Tehát csak bedugni, majd ha az n terület belül a struct nevű mutató
egyenlő értéke n, vissza igaz.
Ellenkező esetben ez a sor itt - mutató egyenlő mutató a következő.
Szóval mi ez csinál, értesítés, ha én vagyok jelenleg mutatott a struct
tartalmazó 9 és 9 nem a számot Keresem - hiszem, keresek
n értéke 50 -
Fogom frissíteni a mutató átmeneti hogy nem pont ebben a csomópont
már, de a mutató nyílra, amely megy, hogy nekem itt.
>> Nos, rájöttem, egy forgószél bevezetés.
Szerdán, akkor ténylegesen ezt néhány ember és néhány további
kód lassabb ütemben.
De észre, mi ma már az adatok bonyolultabb struktúrákat, hogy a mi
algoritmusok kap a hatékonyabb, amely lesz szükséges a
Pset hat, amikor betölteni, ismét az 150000 szavak, de szükség van erre
hatékonyan, és ideális esetben, hozzon létre egy program fut, a felhasználók nem
lineáris, négyzetes n nem, de állandó idő, az ideális.
>> Találkozunk szerdán.
>> SPEAKER: A következő CS50, David elfelejti alapeset.
>> DAVID MALAN: És ez hogyan küld szöveges üzenetek C. Mi a -
>> [KÜLÖNBÖZŐ szöveges üzenet Értesítési hangok]