>> DAVID MALAN: Okei, tervetuloa takaisin.
Tämä on CS50.
Tämä on alku viikolla seitsemän.
Joten se on ollut jonkin aikaa, joten ajattelin olimme ottaa tornado kiertueen, jossa olemme
jäit ja missä olemme nyt menossa.
>> Joten tämä asia täällä voisi olla aiheutti ahdistusta aluksi.
Mutta toivottavasti alatte sopeutua mitä tämä tarkoittaa täällä -
tähden edustavat osoitin, joka on juuri, enemmän maallikon termein?
Joten se osoite.
>> Joten se osoite jotain muistiin.
Ja aloimme kuori takaisin kerrokset pari viikkoa sitten, asioita, kuten
GetString ja muita tällaisia ​​toimintoja Koko tämän ajan on palaamassa
osoitteet asioita muistiin, kuten osoite ensimmäisen merkin
Joissakin sekvenssi.
>> Joten me esitteli myös valgrind, joka voit alkaa käyttää tähän ongelmaan
set, etenkin seuraavaan Harjoitus samoin.
Ja valgrind tekee mitä meille?
Se etsii muistivuotoja, ja se tarkistaa myös väärin muistin.
>> Se voi tietyllä todennäköisyydellä, havaita, jos koodi tulee koskettaa muistia
että se ei yksinkertaisesti ole.
Joten ei välttämättä vuoda, mutta jos ylittävät rajoja joidenkin
array, ja olet todella ajaa valgrind ja aiheuttaa, että käyttäytymisestäsi
valgrind on käynnissä ohjelma on käynnissä sen sisällä, saat
tällaista viestiä - "virheellinen kirjoittavat koon 4 ", joka muistuttaa pari
viikkoa sitten tarkoitti, että minulla oli vahingossa kuin yhden int liian pitkälle
rajojen ulkopuolelle array.
Ja niin koko 4 tarkoittaa tässä koko että erityisesti int.
>> Joten ota varmuuden siinä, että valgrind tuotannosta, muoto se,
on vain kamalaa.
On todella vaikea nähdä läpi sotku ja mielenkiintoista tietoa.
Joten mitä olemme tehneet täällä on vain ote jotkut pari lisää
mielenkiintoinen linjat.
Mutta ymmärtää, että 80% valgrind n lähtö tulee olemaan hieman
häiriötekijä.
>> Vain etsiä malleja, kuten nämä - virheellinen oikea, virheellinen lukea, 40 tavua
ja jotkut lohkojen määrä on varmasti menetetty, avainsanoja, kuten että.
Ja mitä tulee toivottavasti nähdä jonkin verran Tällainen jälki mikä funktio
virhe on todella sisään
Tässä tapauksessa täällä, missä linja minun koodi oli virhe ilmeisesti?
>> 26-tiedostoon memory.c, joka oli Esimerkiksi me leikimme
tuolloin.
Joten se on luultavasti ole malloc.
Se oli luultavasti minun koodin sijasta.
Niin näemme tämän uudelleen ja jälleen ennen pitkää.
>> Joten scanf, tämä tuli esille pari muotoja toistaiseksi.
Näimme sscanf lyhyesti.
Se oli jotain määrä olet sukeltanut oman
valmistelut tietokilpailu.
Ja scanf on oikeastaan ​​mitä CS50 Kirjasto on käyttänyt alla
huppu jo jonkin aikaa, jotta saada käyttäjän syötettä.
>> Esimerkiksi jos muutan yli CS50 laite täällä, haluaisin avata
Esimerkiksi tänään, että kutsutaan scanf-0.c Ja se on erittäin yksinkertaista.
Se on vain muutaman rivin koodia.
Mutta se osoittaa todella, miten getInt on toiminut koko tämän ajan.
>> Tässä ohjelmassa täällä line 16 , Huomaa, että julistan int.
Joten ei viitteitä, ei mitään maagista siellä, vain int.
Sitten linja 17, I pyytää käyttäjän numero, kiitos.
Sitten loppuvuodesta 18, käytän scanf täällä.
Ja olen täsmentänyt, ikään kuin printf, että olen odottanut viestiä
listatut prosenttia i.
>> Joten prosenttia i, tietenkin, tarkoittaa int.
Mutta huomaa, mitä toinen argumentti scanf on.
Miten kuvailisit toinen argumentti pilkun jälkeen?
Mikä se on?
>> Se on osoite x.
Joten tämä on hyödyllistä, koska tarjoamalla scanf osoite x, mitä
jotka antavat että toiminto tehdä?
Ei vain mennä sinne, mutta myös mitä?
>> Tee muutos siihen.
Koska voit mennä sinne, se on eräänlainen kuten kartan sijainti muistiin.
Ja niin kauan kuin annat scanf tai mitään toimintoa sellainen kartta, joka
toiminto voi mennä sinne, eikä vain katsokaa arvoa, mutta se voi myös
muuttaa tätä arvoa, mikä on hyödyllistä, jos tarkoitusta elämään scanf on
skannata käyttäjän syötettä, erityisesti näppäimistöltä.
Ja F tarkoittaa alustettu, kuten printf, F tarkoittaa alustettu
merkkijono, jonka haluat tulostaa.
>> Joten lyhyt, tämä linja 18 yksinkertaisesti sanoo, yritä lukea int käyttäjän
näppäimistö ja säilytä se sisällä x kello mitä osoite x sattuu asumaan.
Ja sitten lopuksi, linja 19 sanoo vain, kiitos int, tässä tapauksessa.
>> Joten anna minun mennä eteenpäin ja tehdä tämän.
Joten tee scanf 0.
Anna minun mennä eteenpäin ja zoomata sisään
Menen ja ajaa tämän kanssa pisteitä slash scanf 0.
Numero, kiitos?
50.
Kiitos 50.
Joten se on melko yksinkertainen.
>> Nyt mitä se ei tee?
Se ei tee koko joukko Virheen tarkistus.
Esimerkiksi, jos en yhteistyötä, enkä kirjoittaa numeron, mutta
vaan minä kirjoitan jotain "hei" se on vain outoa.
Ja niin yksi niistä asioista CS50 kirjasto on tehnyt meille jostain
aika on, että reprompting ja reprompting.
>> Yritä lause muistaa oli cs50.c, ja se on syy, että getInt vuonna
CS50 kirjasto on itse asiassa koko nippu riviä pitkä, koska olemme
tarkistamalla tyhmä tavaraa kuten tämä.
Ei käyttäjä ei anna Meidän mielestämme, int?
Oliko hän antaa meille jotain kuten aakkosellinen kirje?
Jos näin on, haluamme havaita että ja huutaa heille.
>> Mutta asiat saavat enemmän mielenkiintoista tässä seuraavassa esimerkissä.
Jos menen scanf-1.c, mikä on yksi asia, joka on perusteellisesti muuttunut
tämä seuraava esimerkki?
Käytän char *, tietenkin, sijasta int.
>> Joten tämä on mielenkiintoinen, koska char *, muistaa, on oikeastaan ​​vain
sama asia kuin merkkijono.
Joten se tuntuu ehkä tämä on erittäin yksinkertaisen toteutuksen getString.
Mutta olen kuoriutui kerros ja CS50 kirjaston, joten olen
kutsumalla tätä char * nyt.
Katsotaanpa missä, jos missä, me mennä pieleen.
>> Line 17 -
Sanon taas, antakaa minulle jotain, Tässä tapauksessa merkkijono.
Ja sitten seuraavalle riville, pyydän scanf, uudelleen, jolloin se muoto koodi,
mutta tällä kertaa prosenttia s.
Ja sitten tällä kertaa, olen ja antaa sen puskuriin.
>> Nyt huomaa, en käytä et-merkki.
Mutta miksi se on todennäköisesti OK täällä?
Sillä mitä puskuri jo?
Se on jo osoitin.
Se on jo osoite.
>> Ja antaa tämän sanan "hämmentää" haluan vain kutsua sitä s, esimerkiksi sen,
yksinkertaisuus.
Mutta olen sitä kutsui puskuri koska Yleensä ohjelmointi, jos sinulla on
kimpale muisti, joka merkkijono todella vain on, voit kutsua sitä puskuria.
Se on paikka tallentaa tietoja.
>> Samanlaisia ​​asioita, kuten YouTube, kun he puskurointi, niin sanoakseni, että
vain tarkoittaa sitä lataamalla bittiä Internet-ja tallentamalla ne
paikallisten joukko, paikallinen kimpale muistia, joten että voit katsella sitä myöhemmin ilman
se ohitetaan tai roikkuu voit toiston aikana.
>> Joten siellä ongelma tässä kuitenkin, koska Kerron scanf, odottaa
merkkijonon käyttäjä.
Tässä osoite kimpale muisti.
Laita merkkijonon siellä.
Miksi näin on sidottu antaa harmia, vaikka?
>> Mikä tuo on?
Voinko käyttää että osa muistia?
Tiedäthän, en tiedä.
Koska on puskuri ole alustettu mitään?
Ei oikeastaan.
Ja niin se mitä olemme kutsuneet roskat arvo, joka
ei ole virallista sanaa.
Se vain tarkoittaa, että meillä ei ole aavistustakaan, mitä bittiä ovat sisällä neljä tavua, että
Olen varattu puskurina.
>> En ole soittanut malloc.
Olen ehdottomasti ei kutsuttu getString.
Joten kuka tietää, mikä on todella sisällä puskuri?
Ja vielä kertoa scanf sokeasti, mene sinne ja laittaa mitä käyttäjä kirjoittaa.
>> Joten mikä on omiaan aiheuttamaan meidän koodi, jos otamme sen?
Luultavasti segfault.
Ehkä ei, mutta luultavasti segfault.
Sanon ehkä ei, koska joskus teet, joskus
et saa segfault.
Joskus vain onnekas, mutta se kuitenkin tulee olemaan
bug ohjelmaamme.
>> Joten anna minun mennä eteenpäin ja koota tähän.
Aion tehdä sen vanhan koulun tavalla.
Joten kalahtaa viiva 0, scanf-1, scanf-1.c, Anna.
Hups, liian vanha koulu.
Katsotaanpa.
Minne menen?
Voi, char * puskuri.
Kiitos -
Tallenna, OK -
hyvin vanha koulu.
Okei, se on ollut jonkin aikaa.
>> Joten olen juuri tallentanut tiedoston jälkeen tehdä, että väliaikainen
muuttaa hetki sitten.
Ja nyt olen koonnut sen manuaalisesti kalahtaa.
Ja nyt aion mennä eteenpäin ja ajaa scanf-1, Anna.
String kiitos.
Tulen kirjoittamaan "hei."
>> Ja nyt, tässä kun suoraan sanottuna printf voi on hieman ärsyttävää.
Se ei oikeastaan ​​tule segfault tässä tapauksessa.
Printf on hieman erityinen, koska se on niin erittäin yleisesti käytetty, että
lähinnä printf tekee meille palveluksen ja ymmärtämättä,
se ei ole voimassa osoitin.
Otan sen itselleni vain tulostaa out suluissa null, jopa
vaikka se ei ole välttämättä mitä me itse odottaa.
>> Joten emme todellakaan voi helposti aiheuttaa segfault tämän, mutta selvästi tämä
ei ole käyttäytymistä halusin.
Joten mitä yksinkertainen ratkaisu?
No, scanf-2, haluaisin ehdottaa, että eikä oikeastaan ​​vain jaettaessa
char *, anna minun olla hieman älykkäämpiä tämän ja haluan varata puskuria
jaksona 16 merkkiä.
>> Joten en voi tehdä tämän pari tapaa.
Voisin ehdottomasti käyttää malloc.
Mutta voin palata viikon kaksi, kun Tarvitsin vain koko joukko
merkkiä.
Se on vain joukko.
Joten haluan sen sijaan uudelleen puskuri on joukko 16 merkkiä.
>> Ja nyt, kun kuljen puskuri -
ja tämä on jotain emme puhua viikolla kaksi -
mutta voit hoitaa array vaikka se on osoite.
Teknisesti kuten olemme nähneet, he hieman erilainen.
Mutta scanf ei pahastu, jos ohitat sen nimi array, sillä mitä
Kalahtaa tekee meille on olennaisesti hoitoon nimi, että levyjärjestelmän
osoite kimpale 16 tavua.
>> Joten tämä on parempi.
Tämä tarkoittaa nyt, että voin toivottavasti toimi seuraavasti.
Saanen loitontaa hetki ja tekevät scanf-2, koottu OK.
Nyt haluan tehdä sai slash scanf-2.
String kiitos. "Hei." Ja se näytti toimivan tällä kertaa.
>> Mutta voiko joku ehdottaa skenaario jossa se ei ehkä vielä toimi?
Niin?
Jotain yli 16 merkkiä.
Ja todella, voimme olla hieman tarkempi.
Jotain enää sitten 15 merkkiä, koska todellakin meidän täytyy pitää mielessä
että me tarvitsemme kenoviiva nolla implisiittisesti lopussa merkkijonon,
joka on varattu scanf tyypillisesti hoitaa meille.
>> Joten anna minun tehdä jotain -
Joskus voimme vain jätä se niin.
OK, joten olemme nyt aiheuttama meidän segmentointi vika.
Miksi?
Koska olen kirjoittanut yli 15 merkkejä, joten olemme todella
kosketti muisti, että olen itse ei pitäisi olla.
>> Joten mitä todella ratkaisu tähän?
No, mitä jos me tarvitsemme enää merkkijono?
No, me ehkä tehdä 32 tavua.
No, mitä jos se ei ole tarpeeksi pitkä?
Entä 64 tavua?
Mitä jos se ei ole tarpeeksi pitkä?
Entä 128 tai 200 tavua?
Mikä oikeastaan ​​on ratkaisu täällä Yleisessä tapauksessa, jos emme tiedä
etukäteen, mitä käyttäjän tulee kirjoittaa?
>> Se on vain sellainen iso riesa, Ollakseni rehellinen, minkä vuoksi
CS50 kirjastossa on muutamia kymmeniä rivejä koodi, joka yhdessä toteuttaa
GetString merkkijonon siten, että emme on tiedettävä etukäteen, mitä
käyttäjän tulee kirjoittaa.
Erityisesti jos katsomme taaksepäin cs50.c kaksi viikkoa sitten, näet
että getString todella tekee ei käytä scanf tällä tavalla.
Pikemminkin se lukee yhden merkin kerrallaan.
>> Koska yksi kiva juttu lukee yhden merkin on voimme
taata itsemme aina on ainakin yksi merkkiä.
Voin vain todeta nieriää, ja sitten ottaa nämä todella askelin vain
lukea jokin merkki on aika näppäimistöltä.
Ja sitten, mitä näet getString tekee, on aina se loppuu,
sanovat, 16 tavua muistia, se käyttää malloc tai serkku sekä että
jakaa enemmän muistia, kopiointi vanha muistin uuteen, ja sitten indeksoinnin
pitkin, saada yksi merkki kerrallaan, ja kun se loppuu, että
kimpale muisti, heittää sen pois, nappaa isompi kimpale muisti, kopioi vanha
uusiin, ja toistaa.
Ja se on todella tuskaa todella toteuttaa jotain niin yksinkertaista kuin
saada panosta käyttäjä.
>> Voit siis käyttää scanf.
Voit käyttää muita vastaavia toimintoja.
Ja paljon oppikirjoja ja online- esimerkkejä tehdä, mutta ne ovat kaikki
alttiita tämänkaltaisia ​​ongelmia.
Ja lopulta saada segfault on tavallaan ärsyttävää.
Se ei ole hyvä käyttäjälle.
>> Mutta pahimmassa tapauksessa, mitä se pohjimmiltaan laittaa
koodi vaarassa?
Jonkinlainen hyökkäys, mahdollisesti.
Puhuimme yksi tällainen hyökkäys - täynnä pino.
Mutta yleensä, jos et saa ylivuoto puskuri, kuten teimme
pari viikkoa sitten, vain kirjallisesti enemmän kuin "Hello" pinoon, et
voi todellakin ottaa, mahdollisesti tietokoneen, tai ainakin päästä käsiksi tietoihin, jotka
ei kuulu sinulle.
>> Joten lyhyt, siksi olemme ne apupyörät.
Mutta nyt alamme ottaa niitä pois, meidän ohjelmia ei enää tarvitse,
välttämättä, käyttäjän syötettä.
Mutta jos ongelma asetettu kuusi, syöte tulevat valtava
sanastotiedostoa 150 joidenkin outoa tuhat sanaa.
>> Joten sinun ei tarvitse huolehtia käyttäjän mielivaltainen tulo.
Annamme sinulle joitakin oletuksia siitä tiedoston.
Kysyttävää viitteitä tai scanf tai käyttäjä syöttää yleensä?
>> Okei, joten vilkaista sitten yksi perään aihe kaksi viikkoa sitten.
Ja se oli tämä käsite struct.
Ei siksi, että - tämä käsite struct, joka oli mitä?
Mitä struct tehdä meille?
>> Määrittele -
Anteeksi?
Määritä muuttujan tyyppi.
Joten tavallaan.
Olemme itse asiassa yhdistämällä kaksi aihetta.
Joten typedef, muistaa, että voimme julistaa tyyppi omaa, kuten
synonyymi, kuten merkkijonon char *.
Mutta käyttämällä typedef ja struct, voimme luoda aidosti omia tietorakenteita.
>> Esimerkiksi, jos menen takaisin gedit täällä vain hetken, ja menen eteenpäin
ja tehdä jotain, haluan säästää tämä, sanotaanko, structs.c
tilapäisesti, olen juuri menossa mennä eteenpäin ja sisältää
standardio.h, int main mitätön.
Ja sitten täällä, olettaa, että haluan kirjoittaa ohjelma, joka tallentaa
useita opiskelijoita useista taloja, esimerkiksi.
Joten se on kuin registrarial tietokanta jonkinlaisia.
>> Joten jos tarvitsen nimensä yksi opiskelija, I voisi tehdä jotain char * nimi,
ja minä teen jotain -
Oikeastaan ​​nyt käyttää CS50 kirjasto vain hetken tehdä tästä
hieman yksinkertaisempi, jotta voimme lainata niitä kymmeniä rivejä koodia.
Ja haluan vain pitää asiat yksinkertaisina.
Pidämme sitä merkkijono, ja nyt getString.
>> Joten Väitän nyt, että olen tallennettu nimi Joidenkin opiskelijoiden ja talon
Joissakin opiskelija, yksinkertaisesti käyttämällä muuttujia kuten teimme ja viikolla yksi.
Mutta kai nyt halua tukea useita opiskelijoita.
Okei, joten minun vaistoni tehdä string nimi2 saa getString, string
house2 saa getString.
Ja sitten meidän kolmas opiskelija, Tehdään nimi3 getString.
>> Okei, joten tämä on toivottavasti silmiinpistävää te typerää,
koska tämä prosessi on oikeastaan ​​koskaan tulee päättymään, ja se on juuri menossa
tehdä minun koodi näyttää pahempi ja pahemmaksi.
Mutta me ratkaisi liian viikolla kaksi.
Mikä oli meidän suhteellisen puhdasta ratkaisu kun meillä oli useita muuttujia
samaa tietotyyppiä, jotka kaikki liittyvät, mutta emme halua tätä kamalaa sotkua
samalla tavoin nimetty muuttujia?
Mitä me teimme sen sijaan?
>> Joten Taisin kuulla muutamia paikkoja.
Meillä oli jono.
Jos haluat useita esiintymiä jotain, miksi emme puhdista kaikki
ja vain sanoa, anna minulle array kutsutaan nimillä?
>> Ja nyt, nyt kova koodi 3.
Ja sitten antaa minulle toisen array kutsutaan taloa, ja anna minulle
nyt kova koodi 3.
Ja olen massiivisesti siivonnut sotkea, että olen juuri luonut.
Nyt olen edelleen kova koodattu 3, mutta vielä 3 voisi dynaamisesti tulevat
käyttäjän, tai argv tai vastaavia.
Joten tämä on jo puhtaampaa.
>> Mutta mikä on ärsyttävää tässä on, että nyt, vaikka nimi on jotenkin
liittyviä peruskysymyksiä opiskelijan talo -
se on opiskelija, että olen todella haluavat edustaa -
Minulla on nyt kaksi paneelit, jotka ovat rinnakkaisia siinä mielessä, että he
samankokoisia, ja nimet kiinnike 0 oletettavasti karttoja talot kiinnike 0,
ja nimet kiinnike 1 karttoja taloja kiinnike 1.
Toisin sanoen, että opiskelija asuu että talo, ja että muut opiskelija
asuu, että muut talossa.
Mutta varmasti tämä voisi olla tehdään entistä puhtaammin.
>> No, se voi itse asiassa.
Ja anna minun mennä eteenpäin ja avata up structs.h, ja voit
katso tätä ajatusta täällä.
Huomaa, että olen käyttänyt typedef, kun viittasi hetki sitten julistaa meidän
oma tietotyyppi.
Mutta olen myös tällä muita avainsanan nimeltään struct joka antaa minulle uuden
tietorakenne.
>> Ja tämä tietorakenne Väitän on menossa on kaksi asiaa sisällä
se - merkkijono kutsutaan nimellä, ja merkkijono kutsutaan talon.
Ja nimi aion antaa Tämä tietorakenne on menossa
kutsua opiskelija.
Voisin kutsua sitä mitä haluan, mutta semanttisesti tehdä
järkeä minulle mielessäni.
>> Joten nyt, jos en avaa parempi versio Ohjelman aloin kirjoittaa
siellä, haluan selaa alkuun.
Ja siellä on joitakin riviä koodia täällä, mutta haluan keskittyä varten
hetki yhdessä.
Olen ilmoittanut jatkuvasti kutsuttu opiskelijoita ja kova koodattu 3 nyt.
Mutta nyt, huomaa kuinka puhdas minun koodi alkaa saada.
>> Linjassa 22, julistan joukko opiskelijoita.
Ja huomaa, että opiskelija on ilmeisesti nyt tietotyyppi.
Koska yläreunassa olevan tiedoston, huomaa Olen mukana, että otsikkotiedoston
että olen vetänyt ylös juuri hetki sitten.
Ja että header-tiedosto yksinkertaisesti ollut tämä määritelmä opiskelija.
>> Joten nyt olen luonut omia tietoja tyyppi, joka laatijat C vuotta
sitten ei ajattele etukäteen.
Mutta ei ole ongelma.
Voin tehdä sen itse.
Joten tämä on joukko nimeltään opiskelijoita, jokainen, jonka jäsenet
on opiskelija rakenne.
Ja haluan kolme näistä pakassa.
>> Ja nyt, mitä muualla Tämän ohjelman tehdä?
Tarvitsin jotain hieman mielivaltainen.
Joten verkossa 24 lähtien Olen toistaa 0-3.
Sitten kysyä käyttäjältä opiskelijan nimi.
Ja sitten käytän getString kuin ennen.
Sitten pyydän opiskelijan talossa, ja käytän getString kuin ennen.
>> Mutta ilmoitus - hieman uutta pala syntaksin -
En voi silti indeksi i. opiskelija, mutta miten saan at erityisiä tietoja
alan sisällä struct?
No, mitä ilmeisesti uusi pala syntaksin?
Se on vain piste operaattori.
>> Olemme oikeastaan ​​nähnyt tätä ennen.
Olet nähnyt sen PSET viisi, jos olet syöksyi jo kanssa bittikarttatiedostoja.
Mutta piste tarkoittaa vain sitä sisällä tämän struct tai useita kenttiä, antaa piste
nimi, tai antaa minulle dot talo.
Tämä tarkoittaa mennä sisälle struct ja saada ne tietyt kentät.
>> Mitä loput tämän ohjelman tehdä?
Se ei ole kaikki, että seksikäs.
Huomaa, että en kerrata 0-3 uudelleen, ja minä yksinkertaisesti luoda Englanti
lause kuten niin ja niin on niin ja kuten talo, kulkee pisteen nimi
i: nnen opiskelijoiden ja niiden talon samoin.
>> Ja sitten lopuksi, nyt alamme saada anaali tästä, nyt kun olemme
perehtynyt mitä malloc ja muut toiminnot ovat olleet
tekee kaiken tämän ajan.
Miksi minun täytyy vapauttaa molemmat nimi ja talon, vaikka en
ei soita malloc?
>> GetString teki.
Ja se oli likainen pikku salaisuus useita viikkoja, mutta getString on
vuotanut muistin koko sijoittaa kaikki lukukauden toistaiseksi.
Ja valgrand lopulta paljastaa tämän meille.
>> Mutta se ei ole iso juttu, koska tiedän että en voi yksinkertaisesti vapauttaa nimi
ja talon, vaikka teknisesti, jotta olla super, super turvallinen, minun pitäisi olla
tekee joitakin virheentarkistusta täällä.
Mitä vaistosi kertovat sinulle?
Mitä minun pitäisi olla tarkistamatta ennen kuin vapauttaa mikä on
merkkijono, alias joka char *?
>> Olisin todella tarkistaa, jos opiskelijat kiinnike i dot nimi ei ole
yhtä null.
Sitten se tulee olemaan OK mennä eteenpäin ja vapaa että osoitin, ja sama tai muiden
yhtä hyvin.
Jos opiskelijat kiinnike i dot talo ei ole sama null, tämä nyt suojaa
kulmaa vasten tapaus, jossa GetString palauttaa jotain null.
Ja näimme hetki sitten, printf tulee suojella meitä täällä vain sanomalla
null, joka on menossa katsomaan outoa.
Mutta ainakin se ei segfault, kuten olemme nähneet.
>> No, anna minun tehdä yksi asia täällä. structs-0 on sellainen tyhmä ohjelma
koska en anna kaiken tämän tiedon, ja sitten se menetetään, kun ohjelma päättyy.
Mutta haluan mennä eteenpäin ja tehdä tämän.
Haluan tehdä terminaalin ikkuna vähän isompi.
Haluan tehdä structs-1, joka on uusi versio.
>> Minä suurentaa hieman.
Ja nyt haluan ajaa piste slash structs-1.
Opiskelijan nimi -
David Mather, tehdään Rob Kirkland, Tehdään Lauren Leverett.
Mielenkiintoista on nyt ilmoitus -
ja minä vain tiedän tämän, koska Kirjoitin ohjelman -
siellä on tiedosto nyt minun nykyinen hakemistoon students.csv.
Jotkut teistä ehkä nähnyt Näiden todellisessa maailmassa.
>> Mikä on CSV-tiedosto?
Comma erotetut arvot.
Se on tavallaan kuin köyhän miehen versio Excel-tiedoston.
Se taulukko rivien ja sarakkeiden voit avata kuten Excel,
tai Numerot Mac.
>> Ja jos avaan tiedoston täällä gedit, ilmoitus - ja numerot eivät ole siellä.
Se on vain gedit kertoo minua linja numerot.
Huomaa ensimmäisellä rivillä tämän tiedosto on David ja Mather.
Seuraava rivi on Rob pilkulla Kirkland.
Ja kolmas rivi on Lauren pilkku Leverett.
>> Joten mitä olen luonut?
Olen nyt kirjoittanut C-ohjelma, joka tehokkaasti voi tuottaa taulukkolaskenta
että voidaan avata kuten Excel.
Ei kaikki, että pakottavia tietokokonaisuus, mutta jos sinulla on paljon suurempi paloina
tietoja, joita et itse halua manipuloida ja tehdä kuvaajia ja
kuten, tämä on ehkä yksi tapa luoda tietoihin.
Lisäksi CSVs ovat todella erittäin yleinen vain tallentaa yksinkertaisia ​​tietoja -
Yahoo Finance, esimerkiksi jos saat osakekursseja kautta ns
API, ilmainen palvelu, jonka avulla voit get ajan tasalla varastossa
lainauksia yrityksille, ne antaa tietoja takaisin
Super yksinkertainen CSV-muodossa.
>> Joten miten me sen teemme?
No huomata, suurin osa tämän ohjelman lähes sama.
Mutta huomaa täällä, eikä tulosta oppilaat ulos, on line 35
eteenpäin, Väitän, että olen säästö opiskelijat levylle, joten säästää tiedoston.
>> Niin huomaa olen julistamisesta FILE * -
nyt tämä on sellainen epäkohta C. Jostain syystä FILE on kaikki korkit,
joka ei ole kuten useimmat muut tietotyypit in C. Mutta tämä on sisäänrakennettu
tietotyyppi, FILE *.
Ja olen julistamisesta osoitin tiedoston, Näin voit ajatella, että.
>> fopen tarkoittaa open file.
Mitä tiedosto haluat avata?
Haluan avata tiedoston minä mielivaltaisesti soittaa students.csv.
Voisin soittaa että jotain haluan.
>> Ja sitten ottaa arvaus.
Mitä toinen argumentti to fopen luultavasti tarkoittaa?
Oikea, w kirjoittamista varten, voisi olla r lukea.
Siellä on append jos haluat lisätä rivejä eikä
korvata koko juttu.
>> Mutta haluan luoda tämän tiedoston kerran, niin minä käytän quote lainaus w.
Ja tiedän, että vain lukeneeni asiakirjoja tai man-sivulta.
Jos tiedosto ei ole nolla - toisin sanoen, jos mitään meni pieleen -
haluan kerrata yli opiskelijat 0-3.
>> Ja nyt huomaa jotain koskaan niin hieman eri
noin line 41 täällä.
Se ei ole printf.
Se fprintf tiedostojen printf.
Joten se tulee kirjoittaa tiedostoon.
Mitä tiedostoa?
Yksi, jonka osoitin voit määrittää ensimmäisenä argumenttina.
>> Sitten määrittää muotomerkkijonoa.
Sitten määrittää, mitä merkkijono haluamme plug in ensimmäinen prosenttia s, ja
sitten toinen muuttuja tai Toinen prosenttia s.
Sitten suljemme tiedoston fclose.
Kuin minä vapauttaa muistia kuin ennen, vaikka Minun pitäisi mennä takaisin ja lisää
Joissakin tarkistaa null.
>> Ja siinä se.
fopen, fprintf, fclose antaa minulle kyky luoda tekstitiedostoja.
Nyt näet ongelmatilanteissa asetettu viisi, joka liittyy kuvia, voit käyttää
binääritiedostot sijaan.
Mutta pohjimmiltaan, idea on sama, vaikka toimintoja will
nähdä ovat hieman erilainen.
>> Joten pyörremyrsky kiertue, mutta saat liiankin tuttuja tiedosto I/O--
tulo ja lähtö - kanssa PSET viisi.
Ja kysyttävää aluksi perusasiat täällä?
Niin?
>> Mitä jos yrität vapauttaa nolla?
Uskon, ellei vapaa on saanut hieman enemmän käyttäjäystävällinen, voit
mahdollisesti segfault.
Kulkee sen null on huono, koska en uskovat ilmaiseksi viitsii tarkistaa sinulle,
koska se olisi mahdollisesti jätettä aikaa se tehdä itselleen
kaikki maailman.
Hyvä kysymys.
>> Okei, joten tällainen saa meitä kiinnostava aihe.
Teema Harjoitus viisi on tutkintaan.
Ainakin se osa Ongelman asetettu.
Forensics viitataan yleensä elpyminen tietoa, joka voi tai
ei ehkä ole poistettu tarkoituksella.
Ja niin ajattelin kertoa teille nopeasti maku mitä todella tapahtuu kaikilla
tällä kertaa alla huppu tietokoneen.
>> Esimerkiksi, jos sinulla on sisäpuolelle kannettavan tai pöytätietokoneen
kovalevy, se on joko mekaaninen laite, joka todella pyörii -
siellä on pyöreä asioita kutsutaan Platters jotka näyttävät aivan kuten mitä
juuri ruudulle täällä, vaikka Tämä on yhä vanha koulu.
Tämä on kolmen ja puolen tuuman kiintolevylle.
Ja kolme ja puoli tuumaa viittaa of kanssa on asia, kun asennat sen
ja tietokone.
>> Monet teistä kaverit kannettavat tietokoneet nyt on solid-state drives tai SSD,
jossa ei ole mitään liikkuvia osia.
Ne ovat paremminkin RAM ja vähemmän kuin Nämä mekaaniset laitteet.
Mutta ideat ovat edelleen samat, varmasti kuin ne liittyvät
ongelmaan asettaa viisi.
>> Ja jos ajattelee nyt kovalevy edustaa on ympyrä, jonka
Minä piirtää täällä näin.
Kun luot tiedosto tietokoneeseen, onko se SSD, tai
Tällöin vanhempi koulun kiintolevy, että tiedosto sisältää useita bittejä.
Sanotaan, että se on tämän 0 ja 1, koko joukko 0 ja 1 s.
Joten tämä on minun koko kiintolevyn.
Tämä on ilmeisesti aika iso tiedosto.
Ja se käyttää jopa 0 ja 1 s tuohon osa fyysisen lautasella.
>> No, mitä se on fyysinen osa?
No, käy ilmi, että kiintolevylle, ainakin tämän tyyppinen, siellä on
nämä pikku magneettisia hiukkasia.
Ja he pohjimmiltaan ovat pohjois-ja etelänavat heille niin, että jos
puolestaan ​​yksi niistä magneettisia hiukkasia Näin voisi sanoa, että se on
edustaa 1.
Ja jos se on ylösalaisin etelään pohjoiseen, voisi sanoa, että se on
eli 0.
>> Joten todellisessa fyysisessä maailmassa, joka on miten voisi edustaa jotain
binary tila 0 ja 1.
Niin, että kaikki tiedosto on.
On koko joukko magneettinen hiukkasia, jotka ovat niiden tällä tavalla tai
Tällä tavoin luodaan malleja 0 ja 1 s.
>> Mutta näyttää siltä, ​​kun tallennat tiedoston, joitakin tietoja on tallennettu erikseen.
Joten tämä on pieni pöytä, hakemistoon, niin sanoakseni.
Ja Soitan tämän sarakkeen nimi, ja Soitan tämän sarakkeen sijainti.
>> Ja aion sanoa, kai tämä on minun jatkaa.
Oma resume.doc varastoidaan sijainti, sanokaamme 123.
Olen aina mennä, että numero.
Mutta riittää sanoa, että aivan kuten RAM, voit ottaa kiintolevyn
se gigatavu tai 200 gigatavua tai teratavu, ja voit
määrä koko tavua.
Voit numeroida kaikki paloina 8 bittiä.
>> Joten me sanomme, että tämä on paikka 123.
Joten tämän hakemiston sisällä minun käyttöjärjestelmä järjestelmä muistaa, että minun
ansioluettelosi on paikalla 123.
Mutta se saa mielenkiintoista, kun poistat tiedoston.
>> Joten esimerkiksi -
ja onneksi suurin osa maailman on kiinni kiinni tämän - mitä tapahtuu, kun
vedät tiedoston Mac OS Trash tai Windowsin roskakorin?
Mikä tarkoitus tehdä se?
Se on tietysti päästä eroon tiedoston, mutta mitä teko vetämällä ja
tippu roskakoriin tai Roskakori tehdä tietokoneella?
>> Ei yhtään mitään, oikeastaan.
Se on aivan kuin kansio.
Se on erityinen kansio, on varma.
Mutta se todella poistaa tiedoston?
>> No, ei, koska jotkut teistä luultavasti ollut kuin, oh damn, et ole
tarkoita tehdä.
Joten kaksoisnapsauttamaasi Roskakoriin tai roskakoriin.
Olet pisti ympäri ja olet takaisin tiedosto vetämällä se
pois sieltä.
Niin selvästi, se ei ole välttämättä poistamista.
>> OK, olet fiksumpi.
Tiedät, että vain vetämällä sen Roskakoriin tai roskakorin ei tarkoita
olet tyhjennys roskakoriin.
Joten voit mennä jopa valikkoon ja sanot Tyhjennä roskakori tai Tyhjennä roskakori.
Mitä sitten tapahtuu?
>> Niin, niin se poistetaan enemmän.
Mutta kaikki tämä tapahtuu, on tämä.
Tietokone unohtaa missä resume.doc oli.
>> Mutta mitä ei ole muuttunut ilmeisesti kuvassa?
Bittiä, 0 ja 1 s joka Väitän ovat paikan päällä joidenkin fysikaalisten
laitteisto.
He ovat yhä olemassa.
Se on vain tietokone on unohtanut, mitä ne ovat.
>> Joten se on lähinnä vapautti tiedoston bittejä niin, että ne voidaan käyttää uudelleen.
Mutta ei ennen kuin luoda enemmän tiedostoja, ja enemmän tiedostoja, ja lisää tiedostot
toden-näköisesti, ne 0 ja 1 s, nämä magneettiset partikkelit, saavat uudelleen,
ylösalaisin tai oikein päin, sillä muita tiedostoja, 0 ja 1 s.
>> Joten sinulla on tämä aikaikkuna.
Ja se ei ole ennustettavissa pituus, todella.
Se riippuu koosta kiintolevyn ajaa ja kuinka monta tiedostoa olet ja
kuinka nopeasti voit tehdä uusia.
Mutta on tämä aikaikkuna aikana kyseinen tiedosto on edelleen täysin
kerrytettävissä.
>> Joten jos joskus käyttää ohjelmia, kuten McAfee tai Norton yrittää palauttaa
tiedot, kaikki he tekevät yrittää palauttaa tämän ns hakemiston
selvittää, missä tiedosto oli.
Ja joskus Norton ja sanon, tiedosto on 93% kerrytettävissä.
No, mitä se tarkoittaa?
Se tarkoittaa vain sitä, että jonkin toisen tiedoston sattumalta päätyi käyttämällä vaikkapa
ne bittiä alkuperäinen tiedosto.
>> Joten mitä todella mukana tietojen palauttaminen?
No, jos sinulla ei ole jotain Norton valmiiksi asennettu tietokoneeseen,
parasta mitä voi joskus tehdä on katsoa klo koko kiintolevyn etsimässä
bittikuvioina.
Ja yksi teemoista Harjoitus viisi on, että voit etsiä
vastaa kiintolevyn, oikeuslääketieteen kuva compact flash kortti
digitaalikamera, etsivät 0s ja 1s, että tyypillisesti korkea
todennäköisyys, edustavat alku JPEG-kuvan.
>> Ja te voi palauttaa niitä kuvia olettaen, jos näen tätä mallia
bittiä rikosteknisen kuvan, jossa suuri todennäköisyys, että merkit
alku JPEG.
Ja jos näen saman kuvion uudestaan, että luultavasti merkitsee alkua
toinen JPEG, ja toinen JPEG, ja toinen JPEG.
Ja tämä on tyypillisesti miten tietojen palauttamista toimii.
Mitä mukavaa noin JPEG on vaikka tiedostomuoto itsessään on hieman
monimutkainen, alussa jokaisen tällaisen tiedosto on oikeastaan ​​melko tunnistettavissa
ja yksinkertainen, kuten näette, Jos et ole saanut jo.
>> Joten lähemmin alla huppu siitä, mitä on ollut
meneillään, ja mitä nämä 0 ja 1 s ovat, antaa sinulle vähän enemmän
yhteydessä tähän nimenomaiseen haasteeseen.
>> [VIDEOTOISTOSTA]
>> -Jos tietokone tallentaa eniten sen pysyvä tietojen.
Voit tehdä, että data kulkee RAM ohjelman kanssa signaaleja, jotka kertovat
kovalevy, miten säilyttää tietoihin.
Kovalevy piirit kääntää nämä signaalit jännite
vaihtelut.
Nämä puolestaan ​​hallita kiintolevyn liikkuvat osat, joitakin harvoja
liikkuvat osat jäljellä moderni tietokone.
>> Osa signaaleista ohjata moottoria joka pyörii metallipäällysteisten Platters.
Tietosi on tosiasiallisesti varastoitu Näiden Platters.
Muut signaalit siirtää lukea / kirjoittaa päät lukea tai
kirjoittaa tietoja Platters.
Tämä kone niin tarkka, että ihmisen hiukset voinut edes kulua
päätä ja spinning Platters.
Silti se kaikki toimii loistava nopeuksilla.
>> [END VIDEOTOISTOSTA]
>> DAVID MALAN: Suurenna hieman syvemmälle nyt mitä
itse asiassa nämä Platters.
>> [VIDEOTOISTOSTA]
>> -Katsotaan mitä vain näki hidastettuna.
Kun lyhyt pulssi sähköä lähetetään luku / kirjoituspää, jos kääntää
on pieni sähkömagneettinen varten sekunnin murto-osassa.
Magneetti luo kentän, joka muutoksia napaisuus pieni, pieni
osa metalli-hiukkaset, jotka takki jokaisen vati pinta.
>> Kuvio sarja näitä pieniä, ladattu-alueilla levylle
edustaa yhtä vähän tietoja binääriluku
käyttämän tietokoneita.
Nyt, jos nykyinen on lähetetty yksi tapa läpi luku / kirjoituspää, alue
on polarisoitu yhteen suuntaan.
Jos nykyinen lähetetään vastakkaiseen suuntaan,
polarisaatio on päinvastainen.
>> Miten saat tietoja pois kiintolevyltä?
Vain kääntää prosessi.
Joten se on hiukkasia levyn jotka saavat virran
luku / kirjoituspää liikkuu.
Kokoa miljoonia tällaisia magneettisia segmentit, ja
sinulla tiedoston.
>> Nyt palaset yhteen tiedostoon voi olla hajallaan ympäri aseman
Platters, ikään kuin sotku papereita pöydällä.
Joten erityinen extra tiedosto pitää kirjaa , missä kaikki on.
Etkö halua sinulla oli jotain?
>> [END VIDEOTOISTOSTA]
>> DAVID MALAN: OK, luultavasti ei.
Joten kuinka moni teistä kaverit Kasvoin nämä?
OK, joten se on vähemmän ja vähemmän omistajaa joka vuosi.
Mutta olen iloinen, että olet ainakin tuttuja niiden kanssa, koska tämä ja oman
Varaa demo valitettavasti kuolevat hyvin hidas kuolema täällä tuntemus.
>> Mutta tämä on mitä olen ainakin takaisin lukion, käytetään käyttö varmuuskopioita.
Ja se oli mahtavaa, koska voisi tallentaa 1,4 megatavua
tässä levylle.
Ja tämä oli suuri tiheys versio, kuten on osoitettu HD, joka on
eli ennen tämänpäiväistä HD-videoita.
>> Standard tiheys oli 800 kilotavua.
Ja sitä ennen oli 400 kilotavun levyjä.
Ja sitä ennen oli 5 ja 1/4 tuuman levyt, jotka olivat todella levyke,
ja hieman leveämpi ja korkeampi kuin nämä asiat täällä.
Mutta voit itse nähdä niin sanotut floppy osa näistä kiekoista.
>> Ja toiminnallisesti, he todella melko samanlainen kuin kovalevyt at
ainakin tätä tyyppiä.
Jälleen SSD uudemmissa tietokoneissa toimivat hieman eri tavalla.
Mutta jos siirrät että pieni metalli-välilehti, voit itse nähdä hieman evästeen,
tai vati.
>> Se ei ole metallia kuin tämä yksi.
Tämä on todella jokin halvempi muovia.
Ja voit sellaista heiluminen sitä.
Ja olet trully vain pyyhkiä pois joitakin bittien määrä tai magneettisia hiukkasia
Tämän levyn.
>> Joten onneksi ei ole mitään sitä.
Jos tämä asia on sillä tavalla - ja kattavat silmäsi ja ne teidän naapuri -
voit vain sellainen vetää tämän koko vaippa pois niin.
Mutta on hieman keväällä, joten tietoinen, että silmäsi.
Joten nyt sinulla on todella levyke.
>> Ja mitä merkillistä tästä on se, että niin paljon kuin se on
pienimuotoinen esitys suurempi kovalevy, nämä asiat ovat super,
Super yksinkertainen.
Jos hyppysellinen pohjaan se nyt, että metalli asia on pois ja kuori
ne auki, kaikki on on kaksi kappaletta huopa ja ns levyke
kanssa pala metallia sisäpuolella.
>> Ja siellä menee puolet minun levyn sisällöstä.
Siinä menee toinen puolet.
Mutta se kaikki pyöri sisällä käyttävän tietokoneen menneen.
>> Ja vielä, että tämä oikeisiin mittasuhteisiin, kuinka suuri on irti
kovalevyt näinä päivinä?
500 gigatavua, teratavu, ehkä pöytätietokone, 2 teratavua, 3
teratavua, 4 teratavua, eikö?
Tämä on yksi megatavu, antaa tai ottaa, joita ei edes sovi tyypillinen MP3
enää näinä päivinä, tai joidenkin samankaltaisia ​​musiikkitiedoston.
>> Joten pieni matkamuisto sinulle tänään ja myös auttaa contextualize mitä
me voidaan ottaa itsestäänselvyytenä nyt ongelma asettaa viisi.
Joten ne ovat sinun omiasi.
Joten anna minun siirtyminen, jossa on viettää seuraavan PSET samoin.
Joten olemme nyt asetettu tälle sivulle - oh, pari ilmoitukset nopeasti.
>> Tänä perjantaina, jos haluat liittyä CS50 lounaalle, mene paikkakunta,
cs50.net/rsvp.
Ja opinnäytetyön -
niin per oppimäärän, olemme julkaisseet Opinnäytetyö erittely jo.
Ymmärtäkää, että se ei tarkoita se johtuu erityisesti pian.
Se on lähetetty, todella, vain saada te ajatellut sitä.
Ja todellakin, erittäin merkittävä prosenttiosuus sinun tulee puuttua
lopullinen hankkeiden aineistosta, että ei ole edes mennyt luokassa,
mutta jo ensi viikolla.
>> Ilmoitus kuitenkin, että spec vaatii muutama eri osien
opinnäytetyön.
Ensimmäinen, muutaman viikon, on alustava ehdotus, melko rento sähköpostia
oman TF kertoa hänelle tai mitä olet miettiä projektin, jossa
ei sitoudu.
Ehdotus on sinun sitoutuminen, sanoi täällä, tämä on mitä
Haluaisin tehdä projektiini.
Mitä mieltä olet?
Liian iso?
Liian pieni?
Onko se hallittavissa?
Ja näet spec lisätietoja.
>> Pari viikkoa sen jälkeen, että on tilaa mietintö, joka on samalla
casual sähköpostia oman TF sanoa, kuinka kaukana olet lopulliseen
hankkeen toteuttamiseen, jonka jälkeen CS50 Hackathon joka antaa kaikille
on kutsuttu, joka on tapahtuman 20:00 yhtenä iltana asti 07:00
AM seuraavana aamuna.
Pizza, kuten olen saattanut mainita viikolla nolla, wil tarjoillaan 21:00,
Kiinalaista ruokaa 01:00.
Ja jos olet vielä hereillä 05:00, otamme sinut IHop aamiaiseksi.
>> Joten hackathon on yksi enemmän elämyksiä luokassa.
Sitten täytäntöönpano johtuu, ja sitten huipussaan CS50 Fair.
Lisätietoja kaikista näistä vuonna lähiviikkoina.
>> Mutta mennään takaisin jotain old school -
uudelleen, array.
Joten array oli mukavaa, koska se ratkaisee ongelmia, kuten näimme
hetki sitten opiskelija-rakenteet saada vähän käsistä, jos me
haluavat olla opiskelija yhden, opiskelija kaksi, Opiskelija kolme, opiskelija dot dot dot,
Joissakin mielivaltainen joukko opiskelijoita.
>> Joten paneelit, muutama viikko sitten, swooped ja ratkaista kaikki ongelmamme, ettei
tietäen etukäteen, kuinka paljon tietyntyyppinen saatamme haluta.
Ja olemme nähneet, että structs voi auttaa meitä edelleen järjestää meidän koodi ja pitää
käsitteellisesti samankaltaisia ​​muuttujia, kuten nimi ja talon yhdessä, jotta voimme
voi käsitellä niitä yhtenä kokonaisuutena sisällä joita on pienempiä paloja.
>> Mutta paneelit on joitakin haittoja.
Mitkä ovat joitakin haittoja olemme kohdanneet
jossa ryhmät tähän mennessä?
Mikä tuo on?
Kiinteä koko - joten vaikka saatat voitava varata muistia
array, kun tiedät kuinka monta opiskelijaa sinulla on, kuinka monta merkkiä on
käyttäjältä, kun olet varattu array, olet sellainen maalattu
itsesi nurkkaan.
>> Koska et voi lisätä uusia osia keskelle array.
Et voi lisätä enemmän elementtejä lopussa array.
Oikeasti, sinun täytyy turvautua luoda kokonaan uusi joukko, kuten olemme keskustelleet,
kopioimalla vanha uuteen.
Ja vielä, että on päänsärky, joka GetString käsittelee sinulle.
>> Mutta jälleen kerran, et voi jopa lisätä jotain keskelle array
jos korko ei ole täysin täytetty.
Esimerkiksi, jos tämä joukko tässä koon kuusi on vain viisi asiaa siinä,
Voisit vain tack jotain kiinni loppuun.
Mutta entä jos haluat lisätä jotain keskelle
array, vaikka se voisi olla viisi kuudesta asioita se?
>> No, mitä me teemme, kun meillä oli kaikki meidän vapaaehtoisilla ihmisillä lavalla
viikkoa aiemmin?
Jos halusimme laittaa joku täällä, joko nämä ihmiset miten siirtää tämän
tavalla, tai nämä ihmiset miten siirtää tämän tavalla, ja että tuli kalliiksi.
Siirtämällä ihmisiä sisällä array päätyi laskemalla ja kustannuslaskenta
meille aikaa, joten paljon meidän n potenssiin käynnissä aikoina lisäyslajittelu varten
Esimerkiksi, pahimmassa tapauksessa.
Joten ryhmät ovat suuria, mutta sinun on tietää etukäteen, kuinka suuri haluat.
>> Joten OK, tässä on ratkaisu.
Jos en tiedä etukäteen, kuinka monta opiskelijat Saatan olla, ja tiedän kerran
Päätän kuitenkin olen juuttunut, että monet opiskelijat, miksi en vain aina
jakaa kaksi kertaa niin paljon tilaa niin voisin mielestäni tarvitse?
Eikö tämä ole järkevä ratkaisu?
>> Realistisesti, en usko, että olemme menossa on yli 50 paikkaa
in array keski-kokoluokan joten haluan vain pyöristää ylöspäin.
Teen 100 paikkaa minun array, vain jotta voimme varmasti saada
opiskelijoiden määrä Odotan olla joissakin keskisuurten luokassa.
Joten miksi ei vain koota ja jakaa enemmän muistia, Tyypillisesti array
kuin uskot edes tarvitse?
Mitä tämä yksinkertainen pushback tätä ajatusta?
>> Olet vain tuhlaa muistia.
Kirjaimellisesti jokainen ohjelma kirjoitat sitten on ehkä käyttää kaksi kertaa enemmän muistia kuin
todella tarvitset.
Ja se vain ei tunnu Erityisen tyylikäs ratkaisu.
Lisäksi se vain laskee todennäköisyys ongelma.
Jos sinulla sattuu olemaan suosittu kurssi yhden lukukauden ja sinulla on 101
opiskelijoita, ohjelma on vielä pohjimmiltaan edessään sama ongelma.
>> Joten onneksi on olemassa ratkaisu Tämän mainoksen kaikki ongelmamme muodossa
tietorakenteita, jotka ovat monimutkaisempia kuin ne,
olemme nähneet tähän mennessä.
Tämä Väitän, on linkitetty lista.
Tämä on luettelo numerot -
9, 17, 22, 26, ja 34 -
, jotka on yhdistetty toisiinsa tavalla mitä olen piirretään nuolet.
>> Toisin sanoen, jos halusin edustaa array, voisin tehdä
jotain tällaista.
Ja laitan tämän riippukuljettimella vain hetken.
Voisin tehdä -
Hei, kaikki hyvin.
Valmiustila.
Uusi tietokone täällä, kirkas -
Selvä.
>> Joten jos minulla on nämä numerot array -
9, 17, 22, 26, 24 -
ei välttämättä mittakaavassa.
Okei, joten tässä on minun array -
oh my god.
Okei, joten tässä on minun array.
Oh my god.
>> [Naurua]
>> DAVID MALAN: Pretend.
Se on liian paljon vaivaa mennä takaisin ja korjata se, joten -
26.
Joten meillä on tämä joukko 9, 17, 22, 26, ja 34.
Niille näet kiusallista virhe Olen juuri tehnyt,
siellä se on.
>> Olen siis väittävät, että tämä on erittäin tehokas ratkaisu.
Olen myönnetty yhtä monta ints kuin Tarvitsen - yksi, kaksi, kolme,
neljä, viisi tai kuusi -
ja olen sitten tallennetaan numerot sisällä tämän taulukon.
Mutta oletetaan, sitten haluan lisätä arvo, kuten numero 8?
No, jos se menee?
Oletetaan Haluan lisätä numero kuin 20.
No, jos se menee?
Jossain keskellä, tai numero 35 on mennä
jossain lopussa.
Mutta olen kaikki loppui.
>> Ja niin tämä on keskeinen haaste Taulukoiden, että ei ole ratkaisu.
Väitin ​​hetki sitten, getString ratkaisee tämän ongelman.
Jos haluat lisätä kuudennella numerolla tähän array, mikä on ainakin yksi
ratkaisu voi turvautua varmasti, aivan kuten me teemme getString?
Mikä tuo on?
>> No, tee se isompi on helpommin sanottu kuin tehty.
Emme voi välttämättä tehdä array isompi, mutta mitä voimme tehdä?
Tee uusi joukko, joka on isompi, kooltaan 6, tai ehkä koko 10, jos haluamme
päästä eteenpäin asioita, ja sitten kopioida vanha array uuteen, ja sen jälkeen
vapauttaa vanha array.
>> Mutta mitä käyntiaika nyt tätä prosessia?
Se on iso O n, koska kopiointi tulee maksamaan sinulle yksikköä
aikaa, joten ei niin hyvä, jos meillä on jakaa uuden array, joka on menossa
kuluttaa kaksi kertaa niin paljon tilapäisesti muistiin.
Kopioi vanha uusiksi -
Tarkoitan, se on vain päänsärky, joka on, jälleen, miksi me kirjoitimme
GetString sinulle.
>> Joten mitä voisimme tehdä sen sijaan?
No, mitä jos meidän tietorakenne todella on aukkoja se?
Oletetaan, että olen rentoutua minun tavoite saada peräkkäisiä paloina muistia, jossa 9
on aivan 17, joka on aivan 22, ja niin edelleen.
>> Ja olettaa, että 9 voi olla yli täällä RAM ja 17 voi olla yli täällä RAM,
ja 22 voi olla yli täällä RAM.
Toisin sanoen, en tarvitse niitä edes takaisin takaisin enää.
Minulla on vain jotenkin lanka neulan läpi jokaisen näistä numeroista tai kukin
Näiden solmut, kuten me kutsumme suorakulmioissa Olen laatinut heitä,
Muistan miten päästä viimeinen kuten solmun ensin.
>> Joten mikä on ohjelma rakentaa olemme nähneet viime aikoina, joista en
voi toteuttaa, että kierre, tai piirretään täällä, jolla voin
panemaan ne nuolet?
Joten viitteitä, eikö?
Jos minä kohdentaa ole vain int, mutta solmu - ja
solmu, en tarkoita vain astiaan.
Ja visuaalisesti, tarkoitan suorakulmio.
Joten solmu ilmeisesti tarvitsee sisältää kaksi arvoa -
int itse, ja sitten, kuten ehdotetun alaosassa suorakulmion,
tilaa int.
>> Joten ajatellen täällä, kuinka suuri on tämä solmu, tämä
kontti kyseessä?
Kuinka monta tavua int?
Oletettavasti 4, jos se on yhtä paljon kuin tavallisesti.
Ja sitten kuinka monta tavua että osoitin?
4.
Joten tämä pakkaus, tai tämän solmun, on olemaan 8-tavun rakenne.
Niin, ja se on onnellinen sattuma, että me vain esitteli tämän käsitteen
struct, tai C-rakenne.
>> Niin väitän, että haluan ottaa askel tätä kohti kehittyneempiä
täytäntöönpano lukuluettelosta linkitetty lista numeroita, minun täytyy tehdä
hieman ajattelua edessä ja julistaa ei vain int, mutta struct
että soitan, tavanomaisesti täällä, solmu.
Voisimme kutsua sitä mitä haluamme, mutta solmu tulee olemaan temaattinen paljon
asioita, alamme nyt.
>> Sisällä että solmu on int n.
Ja sitten tämä syntaksin, hieman outo ensi silmäyksellä -
struct solmu * seuraavaksi.
No kuvallisesti, mikä se on?
Tämä on alaosa suorakulmion näimme
vain hetki sitten.
>> Mutta miksi minä puhun struct solmu * toisin kuin vain solmuun *?
Koska jos näin osoitin osoittaa toisessa solmussa, se on vain
osoite, solmun.
Se vastaa sitä, mitä olemme keskustelivat viitteitä toistaiseksi.
Mutta miksi, jos väitän, tämä rakenne on nimeltään solmu, minun on sanottava struct
solmun täällä sisällä?
>> Täsmälleen.
Se on tavallaan typerä todellisuus C. Typedef, niin sanotusti, ei ole
vielä tapahtunut.
C on super kirjaimellisesti.
Se lukee koodin ylhäältä alas, vasemmalta oikealle.
Ja kunnes se osuu, että puolipiste on bottom line, arvaa mitä ei
olemassa tietotyyppi?
Solmu, lainaus lainaus solmu.
>> Mutta koska Pidempi ilmoitus tein ensimmäisellä rivillä -
struct solmu -
koska se oli ensin, ennen aaltosulkeita, että on tavallaan kuin
pre-kouluttamalla kalahtaa, että olet Tiedätkö mitä, anna minulle struct
nimeltään struct solmu.
Suoraan sanottuna, en pidä soittaa asioita struct solmu, struct solmu kaikki
koko minun koodi.
Mutta minä käyttää sitä vain kerran, vain sisällä, niin että voin tehokkaasti
luoda eräänlainen kehäviittauksen, ei osoitin itselleni sinänsä, mutta
osoitin toiseen sama tyyppi.
>> Niin on käynyt ilmi, että tietorakenne näin, siellä on muutama
toiminnot, jotka voivat olla kiinnostaa meitä.
Meidän kannattaa lisätä osaksi listan näin.
Meidän kannattaa poistaa luettelosta näin.
Meidän kannattaa etsiä luettelosta arvo, tai yleisemmin kulkea.
Ja Traverse on vain hieno tapa sanomalla alkavat vasemmalle ja siirtää kaikki
aivan oikealle.
>> Ja ilmoitusta, vaikka tätä hieman hienostunut tietorakenne, anna
minulle ehdottaa, että voimme lainata joitakin ajatuksia viimeisen kahden viikon aikana ja
toteuttaa toiminto nimeltään etsiä näin.
Se tulee palauttaa true tai väärä, osoittaa kyllä ​​tai
no, n on luettelossa.
Sen toinen argumentti on osoitin luetteloon itse, niin
osoitin solmuun.
>> Kaikki aion niin tehdä, on ilmoittaa väliaikainen muuttuja.
Me kutsumme sitä PTR Sopimuksen mukaan osoitintoimintoihin.
Ja voin liittää se sama listan alussa.
>> Ja nyt huomaa kun silmukka.
Niin kauan kuin osoitin ei ole yhtä suuri null, aion tarkistaa.
Onko osoitin nuoli n yhtä n, joka hyväksyttiin vuonna?
Ja odota hetki - uusi pala syntaksin.
Mikä on nuoli yhtäkkiä?
Niin?
>> Täsmälleen.
Joten taas muutama minuutti sitten, käytimme dot merkintätapa käyttää jotain
sisällä struct, jos muuttuja et ole struct
itse, mutta osoitin struct, Onneksi pala syntaksin
lopulta tekee vaistomaisesti järkevältä.
Nuoli tarkoittaa seurata osoitin, kuten meidän nuolet tyypillisesti tarkoittaa
kuvallisesti, ja mennä tiedot alan sisällä.
Joten nuoli on sama asia kuin piste, mutta voit käyttää sitä, kun olet osoittimen.
>> Joten vain kertaus sitten, jos n alalla sisällä struct kutsutaan osoitin
vastaa yhtä n, return true.
Muuten, tämä linja täällä - osoitin vastaa osoittimen vieressä.
Joten mitä tämä tekee, ilmoitusta, on, jos olen Olen tällä hetkellä suunnattu struct
, joka sisältää 9, ja 9 ei ole numero Etsin - kai Etsin
for n = 50 -
Aion päivittää väliaikainen osoitin ja osoita tässä solmu
enää, mutta osoitin nuolta, joka aikoo laittaa minut tänne.
>> Nyt tajusin on tornado käyttöönottoa.
Keskiviikkona me itse tehdä tämän joidenkin ihmisten ja joidenkin enemmän
koodi hitaammin.
Mutta ymmärtää, olemme nyt tekemässä tietomme rakenteet monimutkaisempi niin, että
algoritmeja voidaan saada tehokkaampia, joka tulee olemaan edellytys
PSET kuusi, kun lataudu, taas ne, 150000 sanaa, mutta täytyy tehdä niin
tehokkaasti, ja mieluiten luoda ohjelma, joka toimii meidän käyttäjät eivät
lineaarinen, ei N potenssiin, mutta jatkuva aikaan, ihanteellinen.
>> Nähdään keskiviikkona.
>> SPEAKER: Seuraavassa CS50, David unohtaa hänen base tapauksessa.
>> DAVID MALAN: Ja se miten lähettää tekstiviestejä C. Mikä -
>> [ERI TEKSTIVIESTI Ilmoituksen ääniä]