[Powered by Google Translate] [Viikko 4]
[David J. Malan] [Harvardin yliopisto]
[Tämä on CS50.] [CS50.TV]
>> Selvä, tämä on CS50, ja tämä on alku viikolla 4,
ja tämä on yksi hitain mahdollista lajittelualgoritmeja.
Kumpi oli se, että me vain katselin siellä?
Se oli kupla lajitella, jotta iso O (n ^ 2) + summa,
ja olemme todella ole ainoita tässä maailmassa tunnu tietävän
mikä kupla lajitella on tai sen käyntiaika.
Itse asiassa tämä oli haastattelun Eric Schmidt Google
ja entinen senaattori Barack Obama vain muutama vuosi sitten.
>> Nyt, senaattori, olette täällä Google,
ja haluan ajatella puheenjohtajuuskauden työhaastattelu.
Nyt on vaikea saada työtä presidenttinä, ja olet menossa läpi jäykkyys nyt.
On myös vaikea saada työtä Google.
Meillä on kysymyksiä, ja pyydämme ehdokkaita kysymyksiä,
ja tämä yksi on Larry Schwimmer.
Te kaverit ajattelevat olen tosissasi? Se on täällä.
Mikä on tehokkain tapa lajitella miljoonaa 32-bittisiä kokonaislukuja?
[Naurua]
Hyvin
Olen pahoillani. >> Ei, ei, ei, ei.
Mielestäni kupla lajitella olisi väärä tapa edetä.
>> Tule, joka kertoi hänelle tästä?
Viime viikolla muistaa otimme tauon koodin, ainakin päivä,
ja alkoi keskittyä jonkin korkeamman tason ideoita ja ongelmanratkaisu yleisemmin
yhteydessä etsiminen ja lajittelu,
ja me otettiin jotain, emme läimäyttää tätä nimeä viime viikolla,
mutta asymptoottinen notaatio, Big O, Big Omega,
ja joskus Big Theta notaatio, ja nämä olivat vain tapoja
kuvata käyntiaika algoritmeja,
kuinka paljon aikaa kuluu algoritmin ajaa.
>> Ja ehkä muistaa, että puhuitte käyntiaika suhteen koko
tulon, jota yleensä kutsumme n riippumatta ongelma voi olla,
missä n on ihmisten määrä huoneessa,
sivumäärä puhelinluettelosta, ja aloimme kirjoittaa asioita
kuten O (n ^ 2) tai O (n) tai O (n log n),
ja vaikka matematiikka ei oikein toiminut niin täydellisesti
ja se oli n ² - n / 2 tai jotain
me sen sijaan vain heittää pois joitakin alemman asteen termit,
ja motivaatio on, että me todella haluamme
eräänlainen objektiivinen tapa arvioida
ohjelmien suorituskykyä tai suorituskyvyn algoritmit
että loppujen lopuksi ei ole mitään tekemistä, esimerkiksi
kanssa tietokoneen nopeudesta tänään.
>> Esimerkiksi, jos toteuttaa kupla lajitella,
tai voit toteuttaa yhdistää lajitella tai valinta lajitella tänään tietokoneella,
2 GHz tietokone, ja käytät sitä,
ja se vie jonkin määrän sekunnissa, ensi vuonna siellä 3 GHz
tai 4 GHz tietokone, ja saatat sitten väittää, että "Vau, minun algoritmi
on nyt kaksi kertaa niin nopeasti ", kun todellisuudessa se ei tietenkään pidä paikkaansa.
Se on vain laitteisto on saanut nopeammin, mutta tietokone
ei ole, ja niin me todella haluamme heittää pois asioita, kuten
2 kerrannaisina tai 3 kerrannaisina, kun se tulee kuvataan
kuinka nopeasti tai kuinka hidas algoritmi on ja oikeastaan ​​vain keskittyä
n: tai jokin tekijä niiden
Joissakin voiman kuin tapauksessa lajittelee viime viikolla.
Ja muistuttaa, että sen avulla merge sort
pystyimme tekemään niin paljon paremmin kuin kupla lajitella ja valinta lajitella
ja jopa lisäys lajitella.
>> Saimme alas n log n, ja jälleen,
Muistutan, että log n tarkoittaa yleensä jotain, joka kasvaa
hitaammin sitten n, joten n log n tähän asti oli hyvä
koska se oli pienempi kuin n ².
Mutta saavuttamaan n log n kanssa Merge sort
Mikä oli perus alkio ajatus, että meillä oli hyödyntää
että me myös velkarahalla takaisin viikolla 0?
Miten voimme ratkaista lajittelu ongelma taitavasti Yhdistäminen tavallaan?
Mikä oli avain näkemystä, kenties?
Kuka tahansa.
Okei, ota askel taaksepäin.
Kuvaile yhdistää lajitella omin sanoin.
Miten se toimii?
Okei, me soutaa takaisin viikossa 0.
Okei, joo.
[Äänetön-opiskelija]
Okei, hyvä, joten jaoimme joukko numeroita 2 kpl.
Meillä lajitellaan kukin näistä kappaletta, ja sitten yhdistimme ne,
ja olemme nähneet tätä ajatusta ennen ottaa ongelma, että tämä on iso
ja pilkkominen se ylös ongelma, että tämä on iso tai näin iso.
>> Recall puhelinluettelon esimerkki.
Muistuttaa itsestään laskenta algoritmin viikkoa sitten
niin yhdistää lajitella teki yhteenvedon tämän pseudokoodilla täällä.
Kun olet antanut n osia, ensin se oli järki tarkistaa.
Jos n <2, niin älä tee yhtään mitään
koska jos n <2, niin n on luonnollisesti 0 tai 1,
joten jos se on joko 0 tai 1 ei ole mitään lajitella.
Olet valmis.
Luettelo on jo triviaalisti lajitellaan.
Mutta muuten jos sinulla 2 tai useampia elementtejä mennä eteenpäin ja jakaa ne
osaksi 2 puolikkaat, vasemmalle ja oikealle.
Lajittele kukin näistä puolikkaat, ja sitten yhdistää lajiteltu puolikkaat.
Mutta ongelma tässä on se, että ensi silmäyksellä tämä tuntuu olemme punting.
Tämä on pyöreä määritelmän, että jos olen pyytänyt sinua lajitella nämä n elementtiä
ja sanot "Hyvä on, me lajitella ne n / 2 ja nuo n / 2 elementtiä"
Sitten minun seuraava kysymys tulee olemaan "Hieno, miten lajitella n / 2 alkiota?"
>> Mutta koska rakenne tämän ohjelman
koska on perustapauksen, niin sanotusti,
tämä erityinen tapaus, joka sanoo jos n <jokin kiinteä arvo kuin 2 paluun välittömästi.
Älä vastaa tähän samaan pyöreä vastaus.
Tämä prosessi, tämä syklisyys lopulta päättyy.
Jos pyydän teitä "Järjestys nämä n elementit" ja te sanotte, "Hieno, lajitella nämä N / 2"
Sitten te sanotte, "Hieno, lajitella nämä n / 4, N / 8, n/16"
lopulta sinun jaat tarpeeksi iso joukko
että sinulla on vain 1 elementti vasemmalle, jolloin voit sanoa,
"Tässä, tässä on lajiteltu yksittäinen tekijä."
Sitten loisto tämän algoritmin tänne on peräisin siitä
että kun sinulla on kaikki nämä erikseen lajiteltu luettelot,
jotka kaikki ovat kooltaan 1, joka näyttää olevan hyödytön,
kun aloitat ne yhdistetään ja että ne yhdistetään
voit rakentaa vihdoin kuten Rob teki videon vihdoin lajiteltu luettelo.
>> Mutta tämä ajatus ulottuu kauas lajittelua.
On tämä ajatus upotettu ohjelmaan kutsutaan rekursio,
ajatus jonka olet ohjelmaa,
ja ratkaisemaan joitakin ongelmia soitat itse,
tai laittaa yhteydessä ohjelmointikieliä olet funktio,
ja jotta voidaan ratkaista ongelma, olet funktion kutsut itseäsi
uudestaan ​​ja uudestaan ​​ja uudestaan, mutta toiminto
ei voi kutsua itseäsi äärettömän monta kertaa.
Lopulta sinun täytyy pohja pois, niin sanotusti,
ja joitakin kovakoodatuilla base edellyttäen, että sanoo
tässä vaiheessa lopettaa kutsua itseäsi niin että koko prosessi
Lopuksi ei itse lopeta.
Mitä tämä oikeastaan ​​tarkoittaa, että recurse?
>> Katsotaanpa, jos voimme tehdä yksinkertaisen, triviaali esimerkki vaikkapa
3 ihmistä kanssani täällä lavalla, jos joku on mukava.
1, tule ylös, 2 ja 3.
Jos 3 haluavat tulla tänne.
Jos haluat seistä vieressä minulle täällä linja, olettaa, että ongelma käsillä
on hyvin triviaalisti laskea joukko ihmisiä, jotka ovat täällä.
Mutta rehellisesti, olen kyllästynyt kaikkien näiden laskenta esimerkit.
Tämä vie jonkin aikaa, 1, 2, ja piste, piste, piste.
Se tulee kestää ikuisesti.
Olen mieluummin vain punt tämän ongelman kokonaan avulla-mikä on nimesi?
Sara. >> Sara, okei.
Kelly. >> Kelly ja?
>> Willy. >> Willy, Sara, Kelly, ja Willy.
Juuri nyt olen ollut kysyi joku
kuinka monet ihmiset ovat jopa tässä vaiheessa, ja minulla ei ole aavistustakaan.
Tämä on todella pitkä lista, joten sen sijaan aion tehdä tämän tempun.
Aion kysyä henkilölle viereeni tekemään suurimman osan työstä,
ja kun hän on tehnyt tekee suurimman osan työstä
Aion tehdä vähiten työtä mahdollista ja vain lisää 1
mihin tahansa hänen vastaus on, joten tässä mennään.
Minulta on kysytty, kuinka monet ihmiset ovat lavalla.
Kuinka monta ihmistä lavalla vasemmalla sinä?
Vasen minua? >> Okei, mutta älä huijaa.
Se on hyvä, se on oikein, mutta jos haluamme jatkaa tätä logiikkaa
Oletetaan, että olet samalla haluat punt tämän ongelman vasemmalla teitä,
niin kuin vastauksen suoraan mennä eteenpäin ja vain sysätä.
Voi, kuinka monet ihmiset ovat vasemmalla minua?
Kuinka monet ihmiset ovat vasemmalle?
1.
[Naurua]
Okei, joten 0, joten mitä nyt Willy on tehnyt
on olet palannut vastauksesi tähän suuntaan sanomalla 0.
Nyt, mitä teidän pitäisi tehdä? >> 1.
Okei, joten olet 1, niin sanot, "Okei, aion lisätä 1
mihin tahansa Willy n määrä oli "niin 1 + 0.
Olet nyt 1 niin vastauksesi oikealla on nyt-
1. >> Ja minun olisi 2.
Hyvä, niin otat edellinen vastaus on 1,
lisäämällä pieni määrä työtä haluat tehdä, mikä on +1.
Sinulla on nyt 2, ja voit sitten ojentaa minulle mikä arvo?
3, tarkoitan, anteeksi, 2.
Hyvä.
>> No, meillä oli 0 vasemmalle.
Sitten meillä oli 1, ja sitten lisätään 2,
ja nyt olet ojentamassa minulle numero 2,
ja niin minä sanon, okei, +1, 3.
On tosiaan 3 henkilöä vieressäni minua tässä vaiheessa,
jotta olisimme voineet tietysti tehdä tämän hyvin lineaarisesti,
erittäin paljon ilmeinen muoti, mutta mitä me todella?
Otimme ongelma koko 3 aluksi.
Sitten purettiin se ongelma koko 2,
Sitten ongelma koko 1, ja sitten lopulta perustapauksessa
oli todella, oh, siellä ei ole ketään,
jolloin Willy palasi tehokkaasti kovakoodatuilla vastaus pari kertaa,
ja toinen sitten kuplina ylös, kuplina ylös, kuplina ylös,
ja sitten lisäämällä tähän vielä yksi 1
olemme toteuttaneet tätä perusajatusta rekursion.
>> Nyt, tässä tapauksessa se ei todellakaan ratkaise ongelmaa
yhtään tehokkaammin silloin olemme nähneet tähän mennessä.
Mutta ajattele algoritmit olemme tehneet lavalle toistaiseksi.
Meillä oli 8 paperinpaloja tauluun
video kun Sean oli etsimässä numero 7, ja mitä hän oikeasti tekee?
No, hän ei tee minkäänlaista hajota ja hallitse.
Hän ei tee minkäänlaista rekursion.
Pikemminkin hän vain teki tämän lineaarinen algoritmi.
Mutta kun esittelimme ajatuksen lajiteltu numeroita lavalla elää viime viikolla
Sitten meillä oli tämä vaisto menee keskelle,
jolloin meillä oli pienempi luettelon koon 4 tai toisen luettelon koon 4,
ja sitten meillä oli täsmälleen sama ongelma, joten toistuva, toistetaan, toistetaan.
Toisin sanoen, me recursed.
Paljon kiitoksia meidän 3 Vapaaehtoiset osoittamiseksi rekursion kanssamme.
>> Katsotaan jos emme voi tehdä tätä nyt vähän konkreettisempaa,
ratkaista ongelma, joka jälleen voisimme tehdä melko helposti,
mutta käytämme sitä ponnahduslautana täytäntöön tätä perusajatusta.
Jos haluan laskea summattu joukko numeroita,
Esimerkiksi, jos ohitat määrä 3,
Haluan antaa teille arvon sigma 3,
niin summa 3 + 2 + 1 + 0.
Haluan saada takaisin vastauksen 6,
niin me täytäntöön tämän sigma toimintoa, tämä summattu toiminto
että, jälleen, vie tulo ja palauttaa sitten summattu
tuosta määrästä kaikki alas 0.
Voisimme tehdä melko yksinkertaisesti, eikö?
Voisimme tehdä tästä jonkinlainen kiehkura rakenteen,
joten anna minun mennä eteenpäin ja saada tämä alkoi.
>> Sisällytä stdio.h.
Otan itseni tärkein työskennellä täällä.
Säästetään tätä sigma.c.
Sitten aion mennä tänne, ja aion julistaa int n,
ja aion tehdä seuraavat, kun käyttäjä ei tee yhteistyötä.
Vaikka käyttäjä ei ole antanut minulle positiivinen luku
anna minun mennä eteenpäin ja pyytää heitä n = GetInt,
ja haluan antaa heille joitakin ohjeita siitä, mitä tehdä,
joten printf ("Positiivinen kokonaisluku please").
Just jotain suhteellisen yksinkertaista, kuten tämä, niin että kun me osuma linja 14
meillä on nyt positiivinen kokonaisluku oletettavasti n..
>> Nyt asialle jotain.
Anna minun mennä eteenpäin ja laske summattu, joten int summa = sigma (n).
Sigma on vain summattu, joten olen vain kirjallisesti sitä harrastaja tavalla.
Me vain kutsumme sitä sigma siellä.
Tuo summa, ja nyt aion tulostaa tuloksen,
printf ("summa on% d, \ n", summa).
Ja sitten palaan 0 hyvä toimenpide.
Olemme tehneet kaiken tämän ohjelma vaatii paitsi mielenkiintoinen osa,
joka on todella toteuttaa sigma toimintoa.
>> Päästä minut tänne pohjaan, ja haluan julistaa toiminnon sigma.
Se sai ottaa muuttuja on tyyppiä Integer,
ja mitä tietotyyppi haluan palata oletettavasti Sigma?
Int, koska haluan sen vastaamaan odotuksia linjalla 15.
Täällä haluan mennä eteenpäin ja toteuttaa tämän
vuonna melko mutkattomasti.
>> Mennään eteenpäin ja sanoa int summa = 0,
ja nyt aion mennä on hieman for silmukka täällä
että menee sanoa jotain tällaista,
for (int i = 0; i <= luku; i + +) summa + = i.
Ja sitten aion palata summa.
Olisin voinut toteuttaa tämän monin tavoin.
Olisin voinut käyttää while-silmukka.
Olisin voinut ohittaa käyttämällä summamuuttuja jos halusin,
mutta lyhyesti sanottuna meillä vain on tehtävä, että jos en hölmö vakuuttaa summa on 0.
Sitten se toistetaan alkaen 0. läpi numero,
ja jokaisen iteraation se lisää, että käypä arvo on summa ja palaa sitten summa.
>> Nyt siellä on hieman optimointi täällä.
Tämä on luultavasti hukkaan askel, mutta olkoon niin. Se on hieno nyt.
Olemme ainakin on perusteellinen ja menee 0 koko matkan ylös.
Ei kovin kova ja melko yksinkertainen,
mutta se osoittautuu, että sigma toiminnon meillä on samat mahdollisuudet
kuten teimme täällä lavalla.
Lavalla me vain laskea kuinka monta ihmistä oli vierelläni,
vaan jos haluaisimme laskea numero 3 + 2 + 1
siitä alas 0 voisimme samalla ruuhi toiminnon
että minä sen sijaan kuvailla olevan rekursiivinen.
Täällä Tehdään nopea järki tarkistaa ja varmista En hölmö.
>> Tiedän, että ainakin yksi asia tässä ohjelmassa että tein väärin.
Kun Löin kirjoita aion saada minkäänlaista huutaa minua?
Mitä minä olla huusi noin?
Joo, unohdin prototyyppi, joten olen käyttäen toiminto nimeltään Sigma linjalla 15,
mutta se ei ilmoitettu vasta linja 22, joten olen paras ennakoivasti mennä tänne
ja julistaa prototyyppi, ja sanon int sigma (int numero), ja se on siinä.
Se on toteutettu alareunassa.
>> Tai toinen tapa voisin ratkaista,
Voisin siirtää toiminnon siellä, mikä ei ole huono,
mutta ainakin kun ohjelmat alkavat saada pitkä, rehellisesti,
Minusta siinä on jotain arvoa aina ottaa pääasiassa yläreunassa
niin että te lukija voi avata tiedostoa ja sitten heti nähdä
mitä ohjelma tekee ilman etsiä sitä
etsivät että päätehtävä.
Mennään alas minun pääteikkunaa täällä, yritä tehdä sigma tehdä sigma,
ja minä mokasin täälläkin.
Implisiittiset ilmoitus toiminnan GetInt tarkoittaa olen unohtanut tehdä mitä muuta?
[Äänetön-opiskelija]
Hyvä, joten ilmeisesti yleinen virhe, joten katsotaanpa laittaa tämän tänne,
cs50.h, ja nyt mennään takaisin minun pääteikkuna.
>> Minä tyhjentää näytön, ja minä uusintana tehdä sigma.
Se näyttää koottu. Saanen nyt ajaa sigma.
Minä kirjoita numero 3, ja sain 6, joten ei tiukkaa tarkastus,
mutta ainakin se näyttää toimivan ensi silmäyksellä, mutta nyt mennään repiä sen lisäksi,
ja mennään todella hyödyntää ajatusta rekursio, jälleen
on hyvin yksinkertainen tilanteessa niin, että muutaman viikon kuluttua
kun alamme tutkia harrastaja tietorakenteita kuin ryhmät
meillä on toinen työkalu työkalupakin, jonka kanssa
käsitellä tietoa rakenteita kuten näemme.
Tämä on iteratiivinen lähestymistapa, loop-lähestymistapaa.
>> Saanen sen sijaan nyt tähän.
Saanen sen sijaan sanoa, että summattu numero
alas 0 ei todellakaan ole sama asia kuin
numero + sigma (numero - 1).
Toisin sanoen, kuten lavalla I punted kullekin ihmiset viereeni,
ja ne puolestaan ​​pidetty punting kunnes vihdoin pohjansa Willy,
joka joutui palaamaan kovakoodatuilla vastaukseksi esimerkiksi 0.
Täällä nyt olemme samalla punting sigma
Sama toiminto kuin oli alun perin nimeltään, mutta avain käsityksen tästä
on, että emme ole vaatimassa sigma identtisesti.
Emme ohimennen n.
Olemme selvästi ohimennen - 1,
joten hieman pienempi ongelma, hieman pienempi ongelma.
>> Valitettavasti tämä ei ole aivan vielä ratkaisua, ja ennen kuin korjata
mitä voidaan hyppäämällä ulos ilmeinen jossain teistä
anna minun mennä eteenpäin ja uusintana tehdä.
Vaikuttaa koota kunnossa.
Saanen uusintana Sigma 6.
Oho, haluan uusinta Sigma 6.
Olemme nähneet tämän ennenkin, vaikkakin vahingossa viime kerralla samoin.
Miksi saan tämän arvoituksellinen segmentointi vika? Joo.
[Äänetön-opiskelija]
Ei ole pohja tapauksessa ja erityisesti, mitä todennäköisesti tapahtui?
Tämä on oire mitä käyttäytymistä?
Sano se hieman kovempaa.
[Äänetön-opiskelija]
Se on loputon silmukka tehokkaasti, ja ongelma ääretön silmukat
kun niihin liittyy rekursiota tässä tapauksessa funktio kutsuu itseään,
mitä tapahtuu joka kerta kun soittaa funktio?
No, muistelen miten säädettyihin muistin tietokoneen.
Sanoimme, että tämä kimpale muistia kutsutaan pino, joka on alareunassa,
ja joka kerta kun soittaa funktio hieman muistia saa laittaa
tätä ns pino sisältää funktion paikallinen muuttujia tai parametreja,
joten jos sigma puhelut sigma puhelut sigma vaatii sigma
kehottaa Sigma Mihin tämä tarina päättyy?
>> No, se lopulta ylitykset yhteensä
muistia että sinulla on käytettävissä tietokoneen.
Voit ylivuoto segmentin että sinun pitäisi pysyä sisällä,
ja saat tämän segmentointi vika, ydin polkumyynnillä,
ja mitä ydin polkumyynnillä tarkoittaa, että minulla on nyt tiedosto nimeltä ydin
joka on tiedosto, joka sisältää nollia ja ykkösiä
että oikeastaan ​​tulevaisuudessa diagnostisesti hyödyllisiä.
Jos se ei ole selvää, missä teidän kuoriainen
voit itse tehdä vähän rikosteknisen analyysin, niin sanotusti,
tämän core dump tiedoston, joka taas on vain koko joukko nollia ja ykkösiä
että pohjimmiltaan edustaa valtion oman ohjelman muistiin
hetkellä kaatui tällä tavalla.
>> Fix tässä on, että emme voi vain sokeasti palata sigma,
numero + sigma on hieman pienempi ongelma.
Meidän on jonkinlainen pohja tässä tapauksessa,
ja mitä pitäisi perustapaus lienee?
[Äänetön-opiskelija]
Okei, niin kauan kuin numero on positiivinen meidän pitäisi oikeastaan ​​palauttaa tämän,
tai toisin sanoin, jos numero on, eli <= 0
Tiedätkö mitä, minä menen eteenpäin ja palaa 0,
aivan kuten Willy teki, ja muuten, aion mennä eteenpäin
ja palauta, joten se ei ole niin paljon lyhyempi
kuin iteratiivinen versio me lyöty jopa ensin käyttämällä varten silmukka,
mutta huomaa, että siellä on tällainen eleganssia sitä.
Sen sijaan palauttaa joidenkin määrän ja suorittaa kaikki tämä matematiikka
ja lisäämällä asioita paikallisia muuttujia
sinä sen sijaan sanomalla "Okei, jos tämä on erittäin helppo ongelma,
kuten numero on <0, haluan heti palata 0 ".
>> Emme vaivautuisi tukemiseen negatiivisia lukuja,
joten aion kova koodi arvo 0.
Mutta muuten toteuttaa tämän ajatuksen yhteenlaskua
kaikki nämä numerot yhteen voit tehokkaasti ottaa pikkupurtavaa
pois ongelman, aivan kuten me teimme täällä lavalla,
Sitten punt loput ongelman seuraava henkilö,
mutta tässä tapauksessa seuraava henkilö itse.
Se samannimistä toimintoa.
Vain siirtää sitä pienempiä ja pienempiä ongelma joka kerta,
ja vaikka meillä ei aivan virallisesti asioita koodi tähän
tämä on juuri sitä, mitä oli tekeillä viikolla 0 ja puhelinluettelosta.
Tämä on juuri sitä, mitä oli tekeillä viimeisen viikon Sean
ja meidän mielenosoituksia etsiä numeroita.
Se vie ongelman ja jakamalla se uudestaan ​​ja uudestaan.
>> Toisin sanoen, on olemassa tapa nyt kääntää
Tämän reaalimaailman rakenteen, tämän korkeamman rakenteen
hajota ja hallitse ja tehdä jotain uudestaan ​​ja uudestaan
koodin, joten tämä on jotain näemme jälleen ajan.
Nyt, sivuun, jos olet uusi rekursio sinun pitäisi ainakin ymmärtää nyt
miksi tämä on hauska.
Aion mennä google.com,
ja aion etsiä vinkkejä ja niksejä rekursio, kirjoita.
Kerro henkilö vieressäsi jos niitä ei nauraa juuri nyt.
Tarkoititko rekursio?
Did you mean-ah, siellä mennään.
Okei, nyt on loput kaikille.
Pieni pääsiäismuna upotettu jossain siellä Google.
Sivuhuomautuksena, yksi linkeistä laitamme kurssin verkkosivuilla
tänään on juuri tämä ruudukon eri lajittelualgoritmeja,
joista me katsoimme viime viikolla, mutta mitä mukavaa tästä visualisointi
kuin yrität wrap mieltäsi noin erilaisia ​​asioita, jotka liittyvät algoritmit
tietää, että voit helposti nyt aloittaa erilaisilla tuloa.
Tulot kaikki käänteinen, tulot enimmäkseen lajiteltu, tulot satunnainen ja niin edelleen.
Kun yrittää jälleen erottaa nämä asiat mielessäsi
ymmärtävät, että tämä URL kurssin verkkosivuilla Luennot sivulla
saattaa auttaa syystä läpi joitakin niistä.
>> Tänään vihdoin ratkaista tämän ongelman taas takaisin,
mikä oli tämän swap toiminto ei vain toiminut,
ja mikä oli perustavanlaatuinen ongelma tämän toiminnon swap,
jonka tavoitteena oli jälleen vaihtaa arvon täällä ja täällä
siten, että tämä tapahtuu?
Tämä ei oikeastaan ​​toimi. Miksi?
Joo.
[Äänetön-opiskelija]
Aivan, selitystä tälle bugginess
yksinkertaisesti ollut, koska kun soitat toiminnot C
ja nämä funktiot argumentteja, kuten ja b täällä,
olet ohimennen kopioita arvosta riippumatta olet tarjoamalla tälle tehtävälle.
Et ole tarjota alkuperäiset arvot itse,
joten näimme tämän yhteydessä buggyc,
buggy3.c, joka näytti vähän jotain tällaista.
>> Muistaa, että meillä oli x-ja y-alustetaan 1 ja 2, vastaavasti.
Sitten tulostaa mitä ne olivat.
Sitten väitti että olin vaihtamalla niitä soittamalla swap x, y.
Mutta ongelma oli, että vaihtava toimi,
mutta vain soveltamisalaan Swap-toiminto itse.
Heti kun osuimme line 40 ne vaihtoivat arvot
heitettiin pois, ja niin mikään
Alkuperäisen funktion tärkeimmät todella muuttunut lainkaan,
joten jos ajattelet tuolloin, mitä tämä näyttää kannalta meidän muisti
jos tämä vasemmalla puolella Hallitus edustaa-
ja minä teen parhaani kaikkien nähdä tämä, jos tämä vasemmalla puolella hallituksen
edustaa, eli muistin, ja pino tulee kasvamaan edelleen aina tällä tavalla,
ja me kutsumme toiminto, kuten pää-, ja pääasialliset on 2 paikallisia muuttujia, x ja y,
mennään kuvaamaan niitä kuin x täällä, ja mennään kuvaamaan näitä kuin y täällä,
ja mennään laittaa arvot 1 ja 2, joten tämä tässä on tärkein,
ja kun tärkeimmät kutsuu swap toiminto käyttöjärjestelmä
antaa swap toiminnon oman väylä muistia pinon,
oman runko pinoon, niin sanotusti.
Se myös allokoi 32 bittiä näistä ints.
Se tapahtuu soittaa heille ja b, mutta se on täysin mielivaltainen.
Se olisi voinut kutsua heitä mitä haluaa, mutta mitä tapahtuu, kun pääasiallinen
kehottaa swap se vie tämän 1, laittaa kopio siellä laittaa kopio sinne.
>> On 1 muu paikallinen muuttuja swap kuitenkin nimeltään mitä? >> Tmp.
Tmp, joten annan itselleni toisen 32 bittiä täällä,
ja mitä minä tein tämän toiminnon?
Sanoin int tmp saa, joten on 1, joten tein tämän, kun olemme viimeksi toistettu tämän esimerkin.
Sitten saa b, niin b on 2, joten nyt tämä tulee 2,
ja nyt b saa lämpötila, joten lämpötila on 1,
joten nyt B tulee tämän.
Se on hienoa. Se toimi.
Mutta sitten heti kun funktio palauttaa
Vaihdetaan muistiin tehokkaasti katoaa, niin että sitä voidaan käyttää uudelleen
jokin muu toiminto tulevaisuudessa, ja tärkein on tietenkin täysin ennallaan.
Tarvitsemme tapa pohjimmiltaan ratkaista tämän ongelman,
ja tänään me viimein tapa tehdä tämä, jossa
voimme esitellä jotain kutsutaan osoittimen.
On käynyt ilmi, että voimme ratkaista tämän ongelman
ei ohimennen kopioita x ja y
vaan läpäisemällä mitä, luuletko, että swap-toiminto?
Joo, entä osoitteen?
Emme ole puhuneet osoitteita paljon yksityiskohtia,
mutta jos tämä liitutaulu edustaa tietokoneeni muistiin
Voisimme varmasti aloittaa numerointi tavua minun RAM
ja sanoa, tavu # 1, tämä on tavu # 2, tavu # 3,
tavu # 4, tavu # ... 2000000000 jos minulla on 2 gigatavua RAM-
jotta voisimme varmasti keksiä jokin mielivaltainen numerointi
Kaikkien yksittäisten tavujen tietokoneen muistiin.
>> Mitä jos sen sijaan kun soitan swap
eikä kulkea kopiot x ja y
miksi en vaan kulkea osoitteen x täällä,
osoite y täällä, lähinnä postiosoite
x ja y koska silloin vaihtaa, jos hän ilmoitti
osoitteen muistiin x: n ja y,
sitten vaihtaa, jos koulutettu häntä hieman,
hän voisi mahdollisesti ajaa kyseiseen osoitteeseen, niin sanotusti,
x, ja vaihda numero siellä sitten ajaa osoitteeseen y,
Muuta numero siellä, vaikka ei oikeastaan ​​saada jäljennökset näistä arvoista itsensä,
joten vaikka puhuimme tästä olevan tärkein muistia
ja tämä on swap muistin voimakas ja vaarallinen osa C
on se, että mikä tahansa toiminto voi koskettaa muistia missä tahansa tietokoneessa,
ja tämä on voimakas, että voit tehdä hyvin fancy asioita tietokoneohjelmien C.
Tämä on vaarallista, koska voit myös tyriä helposti.
Itse asiassa yksi yleisimmistä tavoista ohjelmia nykyään voidaan hyödyntää
vielä on ohjelmoija ei ymmärrä
että hän sallii data
kirjoitetaan paikkaan muistissa, joka ei ollut tarkoitettu.
>> Esimerkiksi, hän ilmoittaa joukko koko 10
mutta sitten vahingossa yrittää sijoittaa 11 tavua, että joukko muistia,
ja aloitat koskettaa osia muistin jotka eivät ole enää voimassa.
Vain asiayhteyteen tähän, jotkut teistä ehkä tietävät, että
ohjelmiston usein kysyy sarjanumeroita tai rekisteröinti avaimet,
Photoshop ja Word ja ohjelmat, kuten tämä.
On olemassa halkeamia, kuten jotkut teistä tietävät, verkossa, jossa voit ajaa pieni ohjelma,
ja voila, enää pyyntöä sarjanumero.
Miten se toimii?
Monissa tapauksissa nämä asiat ovat yksinkertaisesti toteamus tietokoneet
Tekstin segmentit tietokoneen todellinen nollia ja ykkösiä
missä on se toiminto, jossa sarjanumero pyydetään,
ja te korvata tähän tilaan, tai kun ohjelma on käynnissä
voit selvittää missä avain on tosiasiallisesti varastoitu
käyttämällä jotain kutsutaan debuggeri, ja voit crack-ohjelmiston tavoin.
Tämä ei tarkoita sitä, että tämä on meidän tavoite lähipäivinä,
mutta se on hyvin reaalimaailman seurauksia.
Tämä sattuu ottamaan varkaus ohjelmisto,
mutta siellä on myös kompromissi koko koneita.
>> Itse asiassa, kun sivustot näinä päivinä hyödynnetään
ja heikentynyt ja tietojen on vuotanut ja salasanoja on varastettu
Tämän hyvin usein liittyy huono hallinta oman muistin
tai, jos kyseessä on tietokantoja, ettei ennakoida
kontradiktorista tulo, niin lisää, että tulevina viikkoina,
mutta nyt vain esimakua sellainen vahinko, että voit tehdä
se ei aivan ymmärtää miten asiat toimivat alla huppu.
Mennään siitä ymmärtää, miksi tämä on rikki
työkalulla, joka tulee enemmän ja enemmän hyötyä
koska ohjelmamme saavat monimutkaisempi.
Toistaiseksi kun olet ollut bugi ohjelma
miten olet mennyt noin debuggaamista?
Mitkä ovat sinun tekniikoita olleet tähän mennessä, joko opettanut teidän TF
tai vain itseoppinut?
[Student] printf.
Printf, joten printf on luultavasti ollut ystäväsi, että jos haluat nähdä
mitä tapahtuu sisällä ohjelman
vain laittaa printf tänne, printf täällä, printf täällä.
Sitten voit käyttää sitä, ja saat koko joukko tavaraa ruudulla
että voit sitten päätellä, mitä todella vialla ohjelman.
>> Printf taipumus olla hyvin voimakas asia,
mutta se on hyvin manuaalinen prosessi.
Sinun täytyy laittaa printf täällä, printf täällä,
ja jos laitat sen sisällä silmukan saatat saada 100 riviä
tuotannon että sinulla on sitten käydä läpi.
Se ei ole kovin käyttäjäystävällinen tai vuorovaikutteinen mekanismi Ohjelmointivirheiden,
mutta onneksi on olemassa vaihtoehtoja.
Siellä on ohjelma, esimerkiksi, nimeltään GDB, GNU Debugger,
joka on hieman mystistä, miten käytät sitä.
Se on vähän monimutkaista, mutta suoraan sanottuna,
Tämä on yksi niistä asioista, joissa jos laitat tällä ja ensi viikolla
ylimääräinen tunti ymmärtää jotain GDB
se säästää luultavasti kymmeniä tunteja pitkällä aikavälillä,
Niin, että, minä annan sinulle teaser, miten tämä asia toimii.
>> Olen minun pääteikkunassa.
Anna minun mennä eteenpäin ja kääntää tämän ohjelman buggy3.
Se on jo ajan tasalla.
Saanen käyttää sitä aivan kuten teimme taas takaisin, ja todellakin, se on rikki.
Mutta miksi tämä on? Ehkä mokasin swap-toiminto.
Ehkä se on ja b. En ole aivan siirtämällä niitä oikein.
Anna minun mennä eteenpäin ja tehdä tätä.
Sen sijaan vain ajaa buggy3 anna minun sijasta suorittaa tämän ohjelman GDB,
ja aion kertoa sen toimimaan buggy3,
ja aion sisällyttää komentorivin argumentti,-TUI-
ja laitamme tätä tulevaisuudessa ongelmat spec muistuttaa.
Ja nyt tämä mustavalkoinen käyttöliittymä piipahti jopa, että jälleen kerran,
on hieman ylivoimainen aluksi, koska siellä on kaikkea tätä
takuutietoja tänne, mutta ainakin siellä on jotain tuttua.
Vuonna ikkunan yläosassa on minun todellista koodia
ja jos minä siirry tänne haluan siirtyä hyvin alkuun minun tiedoston,
ja todellakin, siellä buggy3.c, ja ilmoitus alareunassa tämän ikkunan
Minulla on tämä GDB nopeasti.
>> Tämä ei ole sama kuin minun normaali John Harvardin nopeasti.
Tämä on nopea että menee saanen ohjata GDB.
GDB on debuggeri.
Debuggeri on ohjelma, jonka avulla voit kävellä läpi
toteuttaminen ohjelmasi rivi rivi riviltä,
matkan varrella tehdä mitä haluat ohjelman
jopa soittaa toimintoja tai etsivät vielä tärkeämpää,
eri muuttujan arvoja.
Mennään eteenpäin ja tehdä tämän.
Aion mennä eteenpäin ja kirjoita run GDB: n kehotteeseen
niin huomaa alareunassa näytön vasemmassa olen kirjoittanut juosta,
ja olen Enter, ja mitä se tekee?
Se kirjaimellisesti juoksi minun ohjelma, mutta en oikeastaan ​​näe paljon mennä tänne
koska en ole oikeastaan ​​kertonut debuggeri
keskeyttää tietyllä hetkellä.
Kirjoittamalla run käynnistää ohjelman.
En oikeastaan ​​näe mitään. En voi manipuloida sitä.
>> Sen sijaan haluan tehdä tämän.
Tällä GDB kehotteeseen haluan vaan kirjoittaa tauko, kirjoita.
Se ei ole mitä aioin kirjoittaa.
Mennään vaan kirjoita tauko tärkein.
Toisin sanoen, en halua asettaa jotain kutsutaan keskeytyskohdan,
joka on osuvasti nimetty, koska se rikkoo tai keskeyttää
toteuttaminen ohjelman tuohon tiettyyn paikkaan.
Tärkein on nimi minun tehtävä.
Huomaa, että GDB on aika fiksu.
Se tajunnut että tärkeimmät sattuu aloittaa noin rivillä 18
sekä buggy3.c, ja sitten huomaa täällä ylhäällä vasemmalla
b + on aivan linjan 18.
Se on muistuttaa minua siitä, että olen asettanut keskeytyskohdan linjan 18.
Tällä kertaa kun kirjoitan aikavälillä, aion ajaa minun ohjelma
kunnes se osuu että murtuessa,
niin ohjelma pysähtyy minulle rivillä 18.
Täällä mennään, juosta.
Mikään ei näytä tapahtuneen, mutta ilmoituksen alareunassa jäljellä
alkaen ohjelma, buggy3, keskeytyskohta 1 Tärkeimpien klo buggy3.c linjan 18.
Mitä voin tehdä nyt?
>> Ilmoitus voin alkaa kirjoittaa asioita, kuten tulostus,
ei printf, print x, ja nyt se on outoa.
$ 1 on vain uteliaisuus, kuten näemme
joka kerta, kun painan jotain saat uuden $ arvo.
Se on niin, että voit palata edelliseen arvoja vain siinä tapauksessa,
mutta nyt mitä tulosta kertoo minulle, että arvo x tässä vaiheessa tarina
on ilmeisesti 134514032.
Mitä? Mistä tuo edes tulevat?
[Äänetön-opiskelija]
Itse asiassa tämä on mitä me kutsumme roskat arvo, ja olemme ole puhunut tästä vielä,
mutta syy, että olet alustaa muuttujat
On ilmeisesti niin, että heillä on jonkinlaista arvoa, että haluat heidän olla.
Mutta saalis on muistaa, että voit julistaa muuttujia
kuten tein hetki sitten minun sigma esimerkissä
ilman todella heille arvoa.
Recall mitä tein täällä Sigma.
Olen ilmoittanut n, mutta mikä arvo annoin sen?
Ei ole, koska tiesin, että muutaman seuraavan linjat
GetInt hoitaisi ongelman laittamalla arvon sisällä n..
>> Mutta tässä vaiheessa tarina linjan 11
ja linja 12 ja linja 13 sekä linja 14
kauttaaltaan näiden useita rivejä, mikä on n: n arvo?
C et vain tiedä.
Se on yleensä joitakin roskat arvo, jotkut täysin satunnaisluku
on jäljellä yli lähinnä joidenkin aiempien toiminto
jotka on ajaa, niin ohjelma toimii
Muistutan, että funktio saa funktio, toiminto, funktio.
Kaikki nämä kehykset saada laittaa muistiin, ja sitten ne toiminnot paluuta,
ja aivan kuten ehdotin kanssa pyyhekumia niiden muisti on lopulta uudelleen.
No, se vain on niin, että tämä muuttuja x tähän ohjelmaan
näyttää sisälsi joitakin roskaa arvo kuin 134514032
Joidenkin edelliseen toimintoon, ei yksi, että olen kirjoittanut.
Se voisi olla jotain, joka tulee tehokkaasti käyttöjärjestelmä,
jokin funktio alla huppu.
>> Okei, se on hienoa, mutta katsotaanpa nyt edetä seuraavalle riville.
Jos kirjoitan "seuraava" minun GDB nopeaa ja osuin enter
huomaa, että korostus siirtyy alas linja 19,
mutta looginen seuraus on, että linja 18
on nyt päättynyt täytäntöönpanovaltiossa, joten jos en kerran kirjoitat "print x"
Minun pitäisi nyt nähdä 1, ja todellakin, en.
Jälleen $ tavaraa on tapa GDB muistuttaa sinua
mitä historia tulosteita ovat, että olet tehnyt.
Nyt haluan mennä eteenpäin ja tulostaa y ja todellakin, y on joitakin hulluja arvo samoin,
mutta no big deal, koska budjettikohtaan 19 aiomme antaa sen
arvo 2, joten haluan kirjoittaa "Seuraava" uudelleen.
Ja nyt me olemme printf rivillä.
Anna minun tehdä tulosta x.
Anna minun tehdä tulosta y. Rehellisesti, Saan hieman kyllästynyt tulostaa tästä.
Saanen sen sijaan kirjoittaa "näyttö x" ja "näyttö Y"
ja nyt joka kerta kun kirjoitat komennon tulevaisuudessa
Aion muistutetaan mitä x ja y, mitä x ja y, mitä x ja y.
>> Voin myös sivuhuomautuksena, kirjoita "info paikallisia."
Info on erityinen komento.
Paikalliset tarkoittaa se näyttää minulle paikallisia muuttujia.
Vain jos unohdan tai tämä on hullu, monimutkainen toiminto
että minä tai joku muu kirjoitti info paikalliset kertovat
mitkä ovat kaikki paikalliset muuttujat sisälle paikalliseen toiminto
että saatat välität jos haluat penkoa.
Nyt printf on aikeissa toteuttaa, joten anna minun mennä eteenpäin ja kirjoita "Seuraava".
Koska olemme tässä ympäristössä emme oikeastaan ​​näe sitä
suorittaa täällä, mutta huomaa se alkaa hieman sekavaa täällä.
Mutta huomaa se ohittaa ruudun siellä,
joten se ei ole täydellinen ohjelma täällä, mutta se on okei, koska en voi aina penkoa
tulostusmateriaalien jos haluan.
>> Saanen kirjoittaa ensi kerran, ja nyt täällä on mielenkiintoinen osa.
Tässä vaiheessa tarina y on 2, ja x on 1,
ehdottivat täällä, ja taas,
Syy tähän on automaattisesti näyttää nyt, koska käytin komento
näyttö x ja näytön y, joten tällä hetkellä en kirjoita seuraava
teoriassa x ja y tulisi vaihtaa.
Nyt tiedämme jo, että ei aio olla,
mutta näemme hetken miten voimme sukeltaa syvemmälle selvittää, miksi se on totta.
Seuraavaksi, ja valitettavasti, y on edelleen 2 ja x on edelleen 1, ja voin vahvistaa niin paljon.
Tulosta x, tulostaa y.
Itse asiassa ei vaihtamalla on todella tapahtunut, joten aloitetaan tämän yli.
Selvästi swap on rikki.
Mennään vaan kirjoita "run" uudelleen.
Sanon kyllä, haluan käynnistää sen alusta, kirjoita.
>> Nyt olen takaisin ylös rivillä 18.
Nyt huomaa x ja y ovat roskaa arvot uudelleen.
Seuraavaksi, seuraavaksi, seuraavaksi, seuraavaksi.
Jos minä kyllästy voin myös kirjoittaa n. ensi.
Voit lyhentää sen lyhin mahdollinen merkkijono.
Swap on nyt rikki.
Mennään sukellus, joten kirjoittamisen sijaan ensi-
nyt aion kirjoittaa askel niin että olen tehostaminen sisällä tätä toimintoa
niin että voin kävellä sen läpi, joten osuin askeleen ja kirjoita.
Huomaa, että esiin hyppää alas alempi minun ohjelma linjaa 36.
Nyt mitä paikallisia muuttujia?
Info paikalliset.
Mikään aivan vielä, koska olemme ei mennyt että linja,
joten mennään eteenpäin ja sanoa "seuraava".
Nyt näyttää olevan tmp, tulostaa tmp.
Garbage arvo, eikö? Luulen niin.
Miten tulostaa, tulostaa b, 1 ja 2?
Hetken kun kirjoitan ensi kerran
tmp vie on arvo 1, toivottavasti
koska tmp aiotaan saama arvo.
>> Nyt ei tulostu, tulosta b,
mutta nyt tulostaa tmp, ja se on todellakin 1.
Anna minun tehdä seuraavaksi. Anna minun tehdä seuraavaksi.
Olen valmis swap-toiminto.
Olen silti sisällä sen linjan 40, joten haluan tulostaa,
Print b, enkä välitä mitä tmp on.
Se näyttää swap on oikea, kun se tulee vaihtava ja b.
Mutta jos minä nyt kirjoittaa seuraavaksi, hyppään takaisin linja 25,
ja tietysti, jos en kirjoita x ja tulostaa y
he silti ennallaan, joten emme ole korjannut ongelman.
Mutta diagnostisesti nyt ehkä tähän GDB ohjelmaan
olemme ainakin saaneet askeleen lähempänä ymmärrystä
Mikä vialla ilman pentueen meidän koodia laittamalla printf täällä,
printf täällä, printf täällä ja sitten käynnissä sen uudestaan ​​ja uudestaan
yrittää selvittää, mitä tapahtuu pieleen.
>> Aion mennä eteenpäin ja lopettaa pois tästä kokonaan pois sulkea.
Se tulee sitten sanoa, "Lopeta kummiskin?" Kyllä.
Nyt olen takaisin minun normaali nopeaa, ja olen tehnyt käyttäen GDB.
Sivuhuomautuksena, sinun ei tarvitse käyttää tätä-TUI lippua.
Itse asiassa, jos jätät sen saat lähinnä alaosassa näytön.
Jos minä kirjoita taukoa tärkein ja suorita sitten
Voin silti ajaa minun ohjelma, mutta mitä se tekee on enemmän sanallisesti
vain näytä olevan rivin kerrallaan.
-TUI, tekstuaalisen käyttöliittymä,
vain näyttää enemmän ohjelman kerralla, mikä on todennäköisesti hieman käsitteellisesti helpompaa.
Mutta todellakin, voin vain tehdä seuraavaksi, seuraavaksi, seuraavaksi,
ja aion nähdä yksi rivi kerrallaan, ja jos haluan todella nähdä mitä tapahtuu
Voin kirjoittaa listan ja nähdä koko joukko naapurimaiden linjat.
>> On video, että olemme pyytäneet, että te katsella ongelma asettaa 3
jossa Nate kattaa joitakin koukerot GDB,
ja tämä on yksi niistä asioista, rehellisesti, jos joitakin ei-triviaaleja osuus sinua
koskaan kosketa GDB, ja se tulee olemaan huono asia
koska kirjaimellisesti voit päätyä menoja enemmän aikaa myöhemmin tänä lukukautena
jahtaavat alas bugeja niin voisitte jos laitat että puoli tuntia / tunti
tällä ja ensi viikolla oppimisen totutella GDB.
Printf oli ystäväsi.
GDB pitäisi nyt olla ystäväsi.
>> Kysyttävää GDB?
Ja tässä on nopea lista joistakin tehokkain ja hyödyllisiä komentoja.
Joo. >> Voitko tulostaa merkkijonon?
Voitko tulostaa merkkijonon? Ehdottomasti.
Se ei tarvitse vain olla kokonaislukuja.
Jos muuttuja s on merkkijono kirjoita vain tulostaa s.
Se näyttää, mitä se merkkijono muuttuja on.
[Äänetön-opiskelija]
Se antaa sinulle osoitteen ja merkkijono itse.
Se näyttää teille molemmille.
Ja viimeinen asia, vain koska ne ovat hyvä tietää liikaa.
Backtrace ja runko, haluan sukeltaa tämän viimeisen kerran,
täsmälleen sama ohjelma GDB.
Anna minun mennä eteenpäin ja ajaa tekstuaalinen käyttöliittymän versio,
rikkoa tärkein.
Anna minun mennä eteenpäin ja ajaa uudestaan. Tässä olen.
Nyt haluaisin mennä seuraavaksi, seuraavaksi, seuraavaksi, seuraavaksi, seuraavaksi, askel, kirjoita.
>> Ja nyt kai olen nyt swap tarkoituksella, mutta minä olen kuin "Hitto, mikä oli arvo x?"
En voi tehdä x enää.
En voi tehdä y koska he eivät laajuudeltaan.
He eivät yhteydessä, mutta ei ole ongelma.
Voin kirjoittaa backtrace.
Se näyttää minulle kaikki toiminnot, jotka ovat toteuttaneet jopa tässä vaiheessa.
Huomaa, että yksi pohjassa, pääasiassa linjojen kanssa tärkeimpien
ollessa pohjassa meidän kuva täällä.
Se, että swap on sen yläpuolella linjojen kanssa swap on sen yläpuolella muistiin tänne,
ja jos haluan päästä takaisin päävalikkoon tilapäisesti voin sanoa "runko".
Mikä numero? Tärkein on kehyksen # 1.
Aion mennä eteenpäin ja sanoa "runko 1."
>> Nyt olen takaisin tärkein, ja voin tulostaa x, ja voin tulostaa y,
mutta en voi tulostaa tai b.
Mutta voin jos sanon, "Okei, odota hetki. Missä oli swap?"
Anna minun mennä eteenpäin ja sanoa "frame 0".
Nyt olen takaisin minne haluan olla, ja sivuun,
olemassa muita komentoja minäkin jos olet todella saada kyllästynyt kirjoittamalla seuraava, seuraava, seuraava, seuraava,
voit yleensä sanoa asioita, kuten "seuraava 10" ja joka selata seuraavan 10 riviä.
Voit myös kirjoittaa "jatka", kun todella kyllästyä tehostamalla sen läpi.
Jatka ajaa ohjelman keskeytyksettä, kunnes se osuu toiseen murtuessa,
onko silmukka tai laske alas teidän ohjelmassa.
>> Tässä tapauksessa jatkoimme loppuun, ja ohjelma poistui normaalisti.
Tämä on hieno tapa, huonompi prosessi.
Vain ohjelman lähtenyt normaalisti.
Lisää, että video ja virheenkorjaus istunnoissa tulla.
Se oli paljon.
Otetaan meidän 5 minuutin tauko täällä, ja me palata tietueet ja tiedostot.
>> Jos olet sukeltanut tämän viikon PSET jo
tiedät että käytämme jakelu koodin,
lähdekoodi, että voimme tarjota sinulle lähtökohta, joitakin uusia tekniikoita.
Erityisesti toimme uuden avainsanan nimeltään struct, rakenteelle,
jotta voimme luoda mukautettuja muuttujia tapaisena.
Olemme myös käyttöön käsite tiedoston I / O, tiedosto tulo ja lähtö,
ja tämä on niin, että voimme pelastaa tilan
oman Scramble aluksella tiedoston levylle
niin että opetus kaverit ja voin ymmärtää
mitä tapahtuu sisällä ohjelman ilman käsin pelata
kymmeniä pelejä Scramble.
Voimme tehdä tämän enemmän automatedly.
>> Tämä ajatus struct ratkaisee melko vakuuttava ongelma.
Oletetaan, että haluamme toteuttaa joitakin ohjelmaan
että jotenkin pitää kirjaa tietoa opiskelijoiden,
ja opiskelijoiden voi olla, esimerkiksi, ID, nimi
ja talo paikassa kuten Harvard, joten nämä ovat 3 paloja tiedot
haluamme pitää sen, niin haluan mennä eteenpäin ja alkaa kirjoittaa pieni ohjelma täällä,
kuuluu stdio.h.
Anna minun tehdä sisältyy cs50.h.
Ja sitten alkaa minun tärkein tehtävä.
En viitsi mitään komentoriviargumentteja,
ja tässä haluan olla opiskelija, joten aion sanoa
Opiskelijan on nimi, joten aion sanoa "merkkijonon nimi."
Sitten aion sanoa Opiskelijalla on tunnus, joten int id,
ja opiskelija on talossa, joten olen myös menossa sanoa "merkkijono talo."
Sitten minä tilata hieman puhtaammin kuin tämä.
Okei, nyt minulla on 3 muuttujien joka edustaa opiskelija, joten "opiskelija".
>> Ja nyt haluan asuttamaan näitä arvoja, joten anna minun mennä eteenpäin ja sanoa jotain
"Id = 123".
Nimi on menossa David.
Sanotaan talo menossa Mather,
ja sitten aion tehdä jotain mielivaltaisesti kuten printf ("% s,
jonka tunnus on% d, asuu% s.
Ja nyt, mitä haluan kytkeä täällä, yksi toisensa jälkeen?
Nimi, id, house, return 0.
Okei, ellei Mokasin jossain täällä
Mielestäni meillä on aika hyvä ohjelma, joka tallentaa yksi opiskelija.
Tietenkin, tämä ei ole kovin kiinnostava. Mitä jos haluan olla 2 opiskelijaa?
Se ei ole iso juttu. Voin tukea 2 henkilöä.
Anna minun mennä eteenpäin ja korostaa tätä ja mennä tänne,
ja voin sanoa "id = 456" kaltaiselleni Rob asuva Kirkland.
>> Okei, odota, mutta en voi kutsua näitä sama asia,
ja se näyttää aion pitää kopioida tämän,
niin haluaisin sanoa, että nämä ovat Daavidin muuttujia,
ja haluaisin saada kopioita näistä Rob.
Me kutsumme näitä Rob, mutta tämä ei tule toimimaan nyt
koska olen-odottaa, katsotaanpa muuttaa minua ID1, NAME1 ja house1.
Rob on 2, 2.
Minun täytyy muuttaa tänne, täällä, täällä, täällä, täällä, täällä.
Odota, entä Tommy? Tehdään tämä uudestaan.
Ilmeisesti jos olet edelleen sitä mieltä tämä on hyvä tapa tehdä tämä, se ei ole,
niin kopioi / liitä huono.
Mutta me ratkaisi viikko sitten.
>> Mikä oli meidän ratkaisu, kun halusimme olla useita esiintymiä samaa tietotyyppiä?
[Opiskelijat] array.
Array, joten haluaisin yrittää puhdistaa tämän.
Haluan tehdä jonkin verran itse yläreunassa, ja haluan sen sijaan tehdä tätä täällä.
Me kutsumme näitä ihmisiä, vaan aion sanoa "int tunnukset"
ja aion tukea 3 meistä nyt.
Aion sanoa "merkkijonoa" ja minä tukea 3 meistä,
ja sitten aion sanoa "string taloja" ja aion tukea 3 meistä.
Nyt täällä Daavidin sijaan saada oman paikallisia muuttujia
voimme päästä eroon näistä.
Se tuntuu hyvältä, että olemme puhdistamista tähän asti.
Voin sanoa sitten David tulee olemaan [0] ja nimet [0]
ja talot [0].
Ja sitten Rob voimme samalla pelastaa tämän.
Laitetaan tähän täällä, joten hän tulee mielivaltaisesti ids [1].
Hän tulee olemaan nimet [1],
ja sitten lopuksi, talot [1].
>> Vielä vähän tylsiä, ja nyt minun täytyy miettiä tätä,
niin sanotaan "nimet [0], id [0], talot [0]
ja katsotaanpa pluralize tätä.
Ids, ids, ids.
Ja vielä, minä teen sen, niin taas, olen jo turvautua kopioi / liitä uudelleen,
joten kertoimet ovat olemassa toinen ratkaisu täällä.
Voin ehkä puhdistaa tähän asti pidemmälle silmukka tai jotain,
niin lyhyt, se on vähän parempi, mutta silti tuntuu
Olen turvautuminen kopioi / liitä, mutta tämäkin, väitän,
ei oikeastaan ​​pohjimmiltaan oikea ratkaisu, koska
Mitä jos joskus päätämme tiedätkö mitä?
Meidän olisi todellakin pitänyt varastointia sähköpostiosoitteet David ja Rob
ja kaikki muut tässä ohjelmassa.
Meidän pitäisi myös tallentaa puhelinnumeroita.
Meidän pitäisi myös tallentaa hätätilanteessa numerot.
Meillä on kaikki nämä palaset tietojen haluamme tallentaa,
joten miten edetä tee sitä?
>> Voit ilmoittaa toisen array yläreunassa, ja sitten manuaalisesti lisätä
sähköpostiosoite [0], sähköpostiosoite [1]
David ja Rob ja niin edelleen.
Mutta on oikeastaan ​​vain oletus taustalla tämä malli
että olen käyttäen kunnia järjestelmä tietää, että
[I] kussakin useita matriiseja
sattuu viittaamaan samalle henkilölle,
joten [0] IDS on numero 123,
ja aion olettaa, että nimet [0]
on sama henkilön nimi ja talot [0]
on sama henkilö taloon ja niin edelleen kaikille eri matriisit luon.
Mutta huomaa, että ei ole perustavanlaatuisia yhteys
joukossa 3 kpl tiedon, id, nimi ja talon,
vaikka yhteisö yritämme mallia tässä ohjelmassa ei ole taulukoita.
Paneelit ovat vain tällä ohjelmallinen tapa tehdä tämä.
Mitä todella haluamme mallintaa meidän ohjelma on henkilö
kuten David, henkilö kuten Rob jonka sisällä
tai kapselointi on nimi ja tunnus sekä talon.
>> Voimmeko jotenkin ilmaista tätä ajatusta kapselointi
jolloin henkilö on tunnus, nimi ja talon
eikä turvautua todella tätä hakata jonka me juuri
luottaa kiinnike jotain
viittaa samaan ihmisen yksikön kussakin näiden eri matriiseja?
Voimme todella tehdä tämän.
Anna minun mennä yli tärkein nyt, ja haluan luoda oman tietotyypin
varten todella ensimmäistä kertaa.
Käytimme tätä tekniikkaa Scramble,
mutta täällä aion mennä eteenpäin ja luoda tietotyyppi,
ja tiedätkö mitä, aion kutsua sitä opiskelija tai henkilö,
ja aion käyttää typedef varten määritellä tyyppiä.
Aion sanoa, että tämä on rakenne,
ja sitten tämä rakenne tulee olla tyyppiä opiskelija, me sanoa,
vaikka se hieman päivätty nyt minulle.
Me sanomme "int id."
Me sanomme "merkkijonon nimi."
Sitten me sanomme "string talo"
joten nyt loppuun mennessä näiden muutaman rivin koodia
Olen juuri opettanut clang että on olemassa
tietotyyppi lisäksi ints lisäksi jouset, paitsi tuplaa lisäksi kellukkeet.
>> Koska tätä hetkeä rivillä 11, on nyt uusi tietotyyppi nimeltään opiskelijoita,
ja nyt voin julistaa opiskelija muuttuja mihin haluan,
joten haluan selaa tänne ihmisiä.
Nyt voin päästä eroon tästä, ja voin mennä takaisin alas David täällä
ja David voin todella sanoa, että David,
voimme kirjaimellisesti nimetä muuttuja itsestäni,
tulee olla tyyppiä opiskelija.
Tämä saattaa näyttää hieman oudolta, mutta tämä ei ole kaikki, että eri
ilmoittamasta niinkin int tai merkkijono tai float.
Sattui vain niin kutsua opiskelija nyt,
ja jos haluan laittaa jotain sisällä tämän rakenteen
Olen nyt käyttää uutta pala syntaksin, mutta se on melko yksinkertainen,
david.id = 123, david.name = "David" pääoman D,
ja david.house = "Mather,"
ja nyt voin päästä eroon tästä kamaa täällä.
Ilmoituksessa olemme nyt uudistaneet ohjelma todella paljon parempi tapa
että nyt meidän ohjelma heijastaa reaalimaailman.
>> Siellä reaalimaailman käsitteestä henkilö tai opiskelija.
Täällä meillä on nyt C-version henkilön tai tarkemmin opiskelija.
Inside tämän henkilön nämä asiaankuuluvat ominaisuudet,
Tunnus, nimi ja talon, joten Rob olennaisesti muuttuu samaa täällä,
niin opiskelija rob, ja nyt rob.id = 456,
rob.name = "Rob."
Se, että muuttuja on nimeltään Rob on tavallaan merkityksetön.
Olisimme voineet kutsuneet sitä x tai y tai z.
Me vain nimesi sen Rob on semanttisesti johdonmukaisia,
mutta oikeastaan ​​nimi on sisällä että alan itse
joten nyt olen tässä.
Myöskään tämä ei tunnu parasta suunnittelua että olen kova koodattu David.
Olen kova koodattu Rob.
Ja minulla on vielä turvautumaan joitakin kopioida ja liittää aina kun haluan uusia muuttujia.
Lisäksi minulla on ilmeisesti antaa jokaiselle näistä muuttujista nimi,
vaikka olisin paljon mieluummin kuvata näitä muuttujia
lisää yleisesti opiskelijat.
>> Nyt voimme yhdistää ajatuksia, jotka ovat työskennelleet hyvin meille
ja sen sijaan sanovat, "Tiedätkö mitä, anna minulle muuttuja nimeltä opiskelijoita,
ja Katsotaan se olla kooltaan 3 ", joten nyt voin tarkentaa tätä vielä,
päästä eroon käsin julisti David,
ja voin sen sijaan sanoa jotain opiskelijoita [0] täällä.
Voin sitten sanoa opiskelijat [0] täällä,
opiskelijat [0] täällä, ja niin edelleen, ja voin mennä noin
ja siivota Rob.
Voisin myös mennä nyt ehkä lisäämällä silmukan
ja käyttämällä GetString ja GetInt todella saada nämä arvot käyttäjältä.
Voisin mennä lisäämällä vakio, koska tämä on yleensä huono käytäntö
koviin koodi jotkut mielivaltaisen määrän kuin 3 täällä
ja sitten vain muistaa, että sinun pitäisi laittaa enintään 3 opiskelijaa siinä.
Se olisi todennäköisesti parempi käyttää # define yläreunassa minun tiedosto
ja kerroin että ulos, niin todellakin haluan mennä eteenpäin ja yleistää tätä.
>> Saanen avata esimerkki, joka on kesken päivän
esimerkkejä etukäteen, structs1.
Tämä on enemmän täydellinen ohjelma joka käyttää # define täällä
ja sanoo aiomme olla 3 opiskelijaa oletuksena.
Täällä olen julistamisesta luokan verran opiskelijoita,
niin luokkahuoneessa opiskelijoita, ja nyt olen käyttäen silmukka
vain tehdä koodia hieman tyylikäs, kansoittavat luokka
käyttäjän panosta, joten iteroida alkaen i = 0 asti opiskelijoita, mikä on 3.
Ja sitten minä pyytää käyttäjältä tämän version
mitä opiskelijan tunnus, ja saan sen GetInt.
Mikä opiskelijan nimi, ja sitten saan sen GetString.
Mikä opiskelijan talossa? Saan sitä GetString.
Ja sitten alaosassa täällä olen vain päättänyt vaihtaa
miten olen tulostamista nämä ulos ja itse käyttää silmukka,
ja kuka olen tulostamista?
Mukaan kommentin olen tulostamista ketään Mather,
ja se on siinä niin Rob ja Tommy jne.-itse Tommy on Mather.
Tommy ja David olisi painettu tässä tapauksessa, mutta miten tämä toimii?
Emme ole nähneet tätä toimintoa ennen, mutta arvata, mitä tämä tekee.
Vertaa merkkijonoja.
>> Se on vähän kuin selvää, miten se vertaa merkkijonoja koska se kääntyy pois
jos se palauttaa 0, joka tarkoittaa jouset ovat yhtä.
Jos se palauttaa -1, joka tarkoittaa yhtä tulee aakkosjärjestyksessä ennen toista,
ja jos se palaa +1 joka tarkoittaa toinen sana tulee aakkosjärjestyksessä
ennen muita, ja voit katsoa verkossa tai man-sivu
nähdä tarkalleen mihin suuntaan on joka, mutta kaikki tämä on nyt tekemässä se sanoo
jos [i]. talo on yhtä "Mather"
sitten mennä eteenpäin ja tulostaa niin ja niin on Mather.
Mutta tässä on jotain emme ole ennen nähneet, ja me palaamme tähän.
En muista koskaan tarvitse tehdä missään minun ohjelmia.
Ilmainen on ilmeisesti viittaa muistiin, mikä vapauttaa muistia,
mutta muisti olen ilmeisesti vapauttaa tämän silmukka alareunassa tämän ohjelman?
Näyttää siltä, ​​olen vapauttaa henkilön nimi
ja henkilön luona, mutta miksi?
>> On käynyt ilmi, kaikki nämä viikkoja, että olet käyttänyt GetString
olemme tavallaan ottaneet käyttöön bugi osaksi jokaisen ohjelmia.
GetString suunnittelun varaa muistia, jotta se voi palata sinulle merkkijono,
kuten David, tai Rob ja voit tehdä mitä haluat
kanssa merkkijono ohjelman, koska olemme varattu muisti sinulle.
Ongelmana on koko ajan aina soittaa GetString
me, laatijat GetString, ovat kyselleet käyttöjärjestelmä
antaa meille vähän RAM tätä merkkijono.
Antakaa meille vähän muistia tähän ensi merkkijono.
Antakaa meille vähän lisää muistia tähän ensi merkkijono.
Mitä sinä, ohjelmoija, ole koskaan tehneet
antaa meille, että muisti takaisin,
joten nämä useita viikkoja kaikki ohjelmat olet kirjoittanut
on ollut mitä kutsutaan muistin harppaus jossa ne pitää käyttää
enemmän ja enemmän muistia aina soittaa GetString, ja se on hienoa.
Olemme tietoisesti tehdä sen ensimmäisen viikon, koska se ei ole niin kiinnostavaa
on huolehtia siitä, missä merkkijono on peräisin.
Kaikki haluamasi on sana Rob palata kun käyttäjä sitä sisään
>> Mutta eteenpäin meidän on nyt alkaa saada enemmän kehittyneempiä tästä.
Aina me varata muistia olemme parempia lopulta luovuttaa sitä takaisin.
Muuten reaalimaailmassa Macin tai PC saatat olla joskus kokeneet
oireita jos tietokone on pysähtymässä lopulta
tai tyhmä spinning rantapallo on vain miehittää tietokoneen
koko huomiota ja et voi tehdä asioita.
Tämä voidaan selittää minkä tahansa määrän bugeja, mutta joukossa mahdolliset bugit
ovat asioita kutsutaan muistivuotoja jossa joku kirjoitti, että ohjelmisto
käytät ei muistanut vapaata muistia
että hän kysyi käyttöjärjestelmä,
ei käytössä GetString, koska se CS50 juttu, mutta käyttäen samankaltaisia ​​tehtäviä
että kysy käyttöjärjestelmän muistin.
Jos sinä tai he tyriä ja koskaan palaa, että muisti
oire, joka voi olla se, että ohjelma hidastuu ja hidastuu ja hidastaa
jos muistat soittaa ilmaiseksi.
>> Tulemme takaisin milloin ja miksi te soittaa ilmaiseksi,
mutta mennään eteenpäin vain hyvä toimenpide ja kokeile käynnissä kyseistä ohjelmaa.
Tätä kutsuttiin structs1, kirjoita.
Anna minun mennä eteenpäin ja ajaa structs1, 123, David Mather,
456, Rob Kirkland, 789,
Tommy Mather, ja näemme Davidin kaupungista Mather, Tommy on Mather.
Tämä on vain pieni järki tarkistaa, että ohjelma toimii.
Nyt valitettavasti tämä ohjelma on hieman turhauttavaa, että
En kaiken työn, olen kirjoittanut 9 eri jouset, enteriä,
kerrottiin joka oli Mather, mutta ilmeisesti tiesin kuka oli Mather jo, koska olen kirjoittanut sen.
Olisi ainakin mukavaa, jos tämä ohjelma on enemmän kuin tietokanta
ja se todella muistaa mitä olen kirjoittanut
joten en koskaan enää tarvitse syöttää nämä elevbokföring.
Ehkä se on kuin registrarial järjestelmä.
>> Voimme tehdä tämän käyttämällä tätä tekniikkaa kutsutaan tiedoston I / O, tiedosto tulo ja lähtö,
hyvin yleinen tapa sanoa milloin haluat lukea tiedostoja tai kirjoittaa tiedostoja
Voit tehdä tämän tietty joukko toimintoja.
Anna minun mennä eteenpäin ja avata tässä esimerkissä structs2.c,
joka on lähes identtinen, mutta katsotaanpa mitä se nyt tekee.
Ylimpänä tiedoston julistan opiskelijaryhmiä.
Sitten kansoittavat luokassa käyttäjän panos,
joten ne koodiriviä ovat juuri ennen.
Sitten jos selaa täällä voin tulostaa kaikille on Mather mielivaltaisesti kuten ennen,
mutta tämä on mielenkiintoinen uusi ominaisuus.
Nämä koodiriviä ovat uusia, ja ne otetaan käyttöön jotain,
KUVA, kaikki lippikset, ja se on * täällä samoin.
Jatkan tätä tänne, * täällä samoin.
>> Tämä toiminto emme ole ennen nähneet, fopen,
mutta se tarkoittaa tiedostoa auki, joten katsotaanpa lukaista läpi nämä,
ja tämä on jotain tulemme takaisin tulevaisuudessa psets,
mutta tämä linja tässä pohjimmiltaan avaa tiedosto nimeltä tietokanta,
ja se koskee erityisesti avaa sen siten, että se voi tehdä mitä se?
[Äänetön-opiskelija]
Oikea, joten "w" vain tarkoittaa se kertoo käyttöjärjestelmä
avaa tämä tiedosto niin, että voin kirjoittaa sitä.
En halua lukea sitä. En halua vain katsoa sitä.
Haluan muuttaa ja lisätä tavaraa mahdollisesti siihen,
ja tiedosto on menossa kutsutaan tietokantaan.
Tätä voitaisiin kutsua mitään.
Tämä voisi olla database.txt. Tämä voisi olla. Db.
Tämä voisi olla sana kuten foo, mutta mielivaltaisesti päätti nimetä tiedosto tietokantaan.
Tämä on pieni järki tarkistaa, että tulemme takaisin hyvin yksityiskohtaisesti ajan,
jos fp, tiedostojen osoitin, ei ole sama NULL se tarkoittaa, että kaikki on hyvin.
>> Pitkä tarina lyhyt, toimii kuin fopen joskus epäonnistua.
Ehkä tiedostoa ei ole olemassa. Ehkä olet poissa levytilaa.
Ehkä sinulla ei ole oikeuksia kansion,
joten jos fopen palauttaa null jotain pahaa tapahtui.
Toisaalta, jos fopen ei palauta null kaikki on hyvin
ja voin alkaa kirjoittaa tähän tiedostoon.
Tässä uusi temppu.
Tämä on for-silmukka, joka on iteroimalla yli jokaisen oppilaani
ja tämä näyttää niin samankaltaisia, mitä olemme tehneet aiemmin,
mutta tämä toiminto on serkku printf vaati fprintf tiedostojen printf,
ja huomaa se on erilainen vain 2 tapaa.
Yksi, se alkaa f sijasta p,
mutta sen ensimmäinen väite on ilmeisesti mitä?
[Opiskelijat] Tiedosto. >> Se tiedostoa.
Tämä juttu nimeltä fp, jonka me lopulta erottaa toisistaan, mikä tiedoston osoitin on,
mutta nyt FP yksinkertaisesti edustaa tiedosto olen avannut,
joten fprintf tässä sanoo tulostaa tämän käyttäjän ID tiedoston, eikä näyttöön.
Tulosta käyttäjän nimen tiedoston, eikä näyttöön,
talon tiedostoa, ei näytön, ja sitten tänne, tietenkin,
sulje tiedosto, ja sitten täällä vapaata muistia.
>> Ainoa ero tässä versio 2 ja versio 1
on käyttöönotto fopen ja tämän tiedoston *
ja tämä käsite fprintf, joten katsotaanpa mitä lopputulos on.
Anna minun mennä minun pääteikkuna.
Saanen juosta structs2, kirjoita.
Näyttää kaikki on hyvin. Katsotaanpa uusintana structs2.
123, David Mather, 456, Rob Kirkland,
789, Tommy Mather, kirjoita.
Näyttää se käyttäytyi samalla, mutta jos en nyt tee ls
huomaa, mitä tiedosto on täällä kaikkien minun koodi, tietokanta,
joten katsotaanpa avaa, gedit tietokannan, ja katso sitä.
Se ei ole seksikkäin tiedostomuotoja.
Se on todellakin yksi kappale datajohdin rivillä kohti,
mutta ne teistä, jotka käyttävät Excel tai CSV-tiedostoja, pilkulla erotetut arvot,
Voisin varmasti käyttää fprintf sen sijaan ehkä tehdä jotain tällaista
niin että voisin itse luoda vastaava Excel-tiedoston
erottamalla asiat pilkuilla, ei vain uusia linjoja.
>> Tässä tapauksessa, jos olisin sen sijaan käyttää pilkkuja sijaan uusien linjojen
Voisin kirjaimellisesti avata tietokantatiedoston Excelissä jos olen sen sijaan tehnyt näyttää tältä.
Lyhyesti sanottuna, nyt meillä on valta kirjoittaa tiedostoja
voimme nyt aloittaa jatkuva tiedon, pitää se noin levyllä
jotta voimme pitää tietoa ympäri uudestaan ​​ja uudestaan.
Ilmoitus pari muuta asiaa, jotka ovat nyt hieman tutumpi.
Ylimpänä tämän C tiedoston meillä typedef
koska halusimme luoda tietotyyppi edustaa sana,
joten tämä tyyppiä kutsutaan sana, ja sisällä tämän rakenteen
se on vähän harrastaja nyt.
Miksi sana koostuu ilmeisesti array?
Mikä on sana vain intuitiivisesti?
>> Se on erilaisia ​​merkkejä.
Se on merkkijono takaisin takaisin takaisin.
Isot kirjaimet sattuu olemaan meidän mielivaltaisesti sanoa maksimipituus
tahansa sana sanakirjasta että käytämme varten Scramble.
Miksi minulla on +1?
Nollamerkki.
Recall kun teimme Bananagrams esimerkki tarvitsimme erityinen arvo
lopussa sanan jotta seurata
, missä sanat tosiasiallisesti päättynyt, ja koska ongelmana asetettu spesifikaatio sanoo
täällä me liitytään tiettyä sanaa boolean arvo,
lippu, niin sanoakseni, tosi tai epätosi.
Oletko löytänyt tämän sanan jo, koska ymmärrämme,
me todella tarvitsemme tapa muistaa paitsi mitä sana on Scramble
mutta vai et, ihmisen, löytäneet sen
joten jos et löydä sanaa "" ei voi vain kirjoittaa, kirjoita,, anna, antamalla
ja saada 3 pistettä, 3 pistettä, 3 pistettä, 3 pistettä.
Haluamme pystyä mustalle listalle, että sana asettamalla bool
true jos olet jo löytänyt sitä, joten siksi olemme
kapseloitu se tässä rakenteessa.
>> Nyt täällä on Scramble on tämä muu struct nimeltään sanakirja.
Absent tässä on sana typedef koska tässä tapauksessa
meidän piti kiteyttää ajatukseen sanakirja,
ja sanakirja sisältää koko joukko sanoja,
koska ymmärtää tämä jono, ja kuinka moni noista sanoista ovat siellä?
No, mitä tämä muuttuja nimeltä kokoa sanoo.
Mutta meidän on vain sanakirja.
Emme tarvitse tietotyyppiä kutsutaan sanakirja.
Meidän täytyy vain yksi niistä, niin se kääntyy pois C
että jos et sano typedef, sanoit struct, niin sisällä aaltosulkeita
laitat muuttujia, niin laitat nimen.
Tämä on julistaa yhden muuttujan nimeltään sanakirja
joka näyttää tältä.
Sen sijaan nämä linjat luovat uudelleen tietorakenne kutsutaan sana
että voit luoda useita kopioita, aivan kuten olemme luoneet
useita kopioita opiskelijoille.
>> Mitä tämä lopulta antaa meille mahdollisuuden tehdä?
Anna minun mennä takaisin, sanokaamme, yksinkertaisempi esimerkki yksinkertaisempaa kertaa,
ja anna minun avata, sanotaanko, compare1.c.
Ongelmana tässä käsillä on todella Taitat
kerros merkkijonon ja aloitat pois näistä apupyörät
koska osoittautuu, että merkkijono koko tämän ajan
on kuten lupasimme viikolla 1 oikeastaan ​​vain lempinimi,
synonyymi alkaen CS50 kirjastosta jotain, joka näyttää hieman arvoituksellisesti,
char *, ja olemme nähneet tämän tähden ennen.
Näimme sen yhteydessä tiedostoista.
>> Katsotaanpa nyt, miksi olemme olleet piilossa tähän yksityiskohtaisesti jo jonkin aikaa.
Täällä on tiedosto nimeltä compare1.c,
ja se ilmeisesti pyytää käyttäjältä 2 jouset, s ja t,
ja sitten se yrittää verrata näitä Kielet tasa rivi 26,
ja jos he yhtä sanotaan, "Kirjoitit sama asia"
ja jos he eivät yhtä se sanoo, "Kirjoitit eri asioita."
Anna minun mennä eteenpäin ja suorita tämä ohjelma.
Anna minun mennä minun lähde hakemistoon, tee compare1. Se laaditaan okei.
Saanen juosta compare1.
Minä zoomata, kirjoita.
Sano jotain. HELLO.
Sanon jotain uudestaan. HELLO.
En todellakaan ole kirjoittaa eri asioita.
>> Yritän tässä uudelleen. BYE BYE.
Ehdottomasti ei eri, niin mitä täällä tapahtuu?
No, mitä todella verrataan linjassa 26?
[Äänetön-opiskelija]
Kyllä, niin se kääntyy pois että merkkijono, tietotyyppi, on eräänlainen valkoinen valhe.
Merkkijono on char *, mutta mikä on char *?
Char *, kuten sanotaan, on osoitin,
ja osoitin on tehokkaasti osoite,
summa sijainti muistissa, ja jos sinulla sattuu olemaan kirjoitettu sana kuten HELLO,
muistuttaa aiemmista keskusteluista merkkijonoja
Tämä on kuin sana HELLO.
Muista, että sanan HELLO voidaan esittää
kuten erilaisia ​​merkkejä kuten tämä
ja sitten erikoismerkki lopussa kutsutaan nollamerkki,
kuten \ tarkoittaa.
Mikä on oikeastaan ​​merkkijono?
Huomaa, että tämä on useita paloina muistia,
ja itse asiassa pää on tiedossa vasta kun näytät läpi koko merkkijono
etsivät erityistä nollamerkki.
Mutta jos tämä on kimpale muisti tietokoneen muistista,
Oletetaan mielivaltaisesti sanoa, että tämä jono vain onnekas,
ja se sai sijoitettu alusta tietokoneeni RAM.
Tämä on tavu 0, 1, 2, 3, 4, 5, 6 ...
>> Kun sanon jotain GetString ja minä string s = GetString
mitä oikeastaan ​​palautetaan?
Näiden viime viikkojen mitä todella on tallennettu s
ei tämä merkkijono sinänsä, mutta tässä tapauksessa, mitä on tallennettu on
numero 0, koska mitä GetString oikeastaan ​​tekee
ei se ole fyysisesti palauttaa merkkijonon.
Se ei edes oikeastaan ​​tee käsitteellistä järkeä.
Mitä se tekee paluun numero.
Tämä numero on osoite HELLO muistiin,
ja merkkijono s sitten, jos kuori takaisin tämän kerroksen merkkijono ei todellisuudessa ole olemassa.
Se on vain yksinkertaistaa CS50 kirjastossa.
>> Tämä todellakin on jotain kutsutaan char *.
Char järkevää, koska mikä sana, kuten HELLO?
No, se on sarja merkkiä, useita merkkejä.
Char * tarkoittaa osoitteen luonne,
niin mitä se tarkoittaa palauttaa merkkijonon?
Kiva, yksinkertainen tapa palauttaa merkkijonon
on pikemminkin kuin yrittää selvittää, miten palata 5 tai 6 eri tavua
Saanen palata osoite, joka tavun?
Ensimmäinen.
Toisin sanoen, minä annan sinulle osoitteen merkin muistiin.
Sitähän char * edustaa, osoite yhden merkin muistiin.
Soita se muuttuja s.
Säilytä s kyseisen osoite, jota mielivaltaisesti sanonut on 0,
vain pitää asiat yksinkertaisina, mutta todellisuudessa se on yleensä isompi numero.
>> Hetkinen.
Jos olet vain antaa minulle osoitteen ensimmäisen merkin, mistä tiedän, mikä osoite on
toinen merkki, kolmas, neljäs ja viides?
[Äänetön-opiskelija]
Et vain tiedä missä merkkijonon lopussa on tapa tämän kätevä temppu,
joten kun käytät jotain printf, mitä printf kirjaimellisesti tekee sen väitteen,
muistuttaa, että käytämme tätä% s paikkamerkkiä, ja sitten kulkea
muuttuja, joka on varastointi merkkijono.
Mitä olet todella kulkee on osoite ensimmäinen merkki merkkijonon.
Printf sitten käyttää for-silmukka tai kun silmukka saatuaan että osoite,
Esimerkiksi, 0, joten haluan tehdä sen nyt,
printf ("% s \ n" s);
Kun Kutsun printf ("% s \ n" s), mitä olen todella antaa printf kanssa
on osoite ensimmäisen merkin s, joka tässä mielivaltaisesti tapauksessa on H.
>> Miten printf tietävät mitä näyttää ruudulla?
Henkilö, joka toteutettiin printf toteutetaan while-silmukka tai for-silmukka
joka sanoo tämä merkki yhtä erityistä nollamerkki?
Jos ei, tulostaa sen. Entäs tämä?
Jos ei tulosta se, tulosta se, tulosta se, tulostaa sen.
Voi, tämä on erikoinen. Pysäytä tulostus ja palaa käyttäjälle.
Ja se on kirjaimellisesti kaikki on tapahtunut alla huppu,
ja että on paljon sulattaa ensimmäisenä päivänä luokan,
mutta nyt se on todella rakennuspalikka ymmärryksen kaikesta
joka on jatkunut sisällä meidän tietokoneen muistiin,
ja lopulta me kiusata tätä erilleen hieman apua
yhdeltä ystävämme Stanfordissa.
>> Professori Nick Parlante Stanfordin on tehnyt tämän ihanan videon järjestyksessä
alkaen kaikenlaisia ​​eri kieliä käyttöön
tämä pieni claymation merkin Binky.
Ääni olet aikeissa kuulla vain muutaman sekunnin ennakkoesitys
on, että Stanfordin professori, ja saat
vain 5 tai 6 sekuntia tämän juuri nyt,
mutta tämä on huomautus, joka me tehdä tänään
ja alkavat keskiviikkona.
Annan teille Pointer Fun with Binky, esikatselu.
[♪ Music ♪] [Professori Parlante] Hei, Binky.
Herää. On aika osoittimen hauskaa.
[Binky] Mikä tuo on? Lisätietoja viitteitä?
Voi goody!
>> Tulemme näkemään sinut keskiviikkona.
[CS50.TV]