>> [Musiikki soi]
>> ROB BODEN: Selvä.
Joten, ensimmäinen asia ensin, video alkaen tutut kasvot.
>> [VIDEOTOISTOSTA]
>> -Selvä.
Tämä on CS50, ja tämä on alussa viikolla kolme.
Olen pahoillani, etten voinut olla siellä teidän kanssanne tänään, mutta saanen esitellä
CS50 oma Rob Boden.
>> [END VIDEOTOISTOSTA]
>> [APPLAUSE ja kippis]
>> ROB BODEN: filmografia in että video on fantastinen.
Selvä.
Ensin on toinen lounas.
Se on huomenna klo 01:15.
Ei ole lounasta perjantaina.
Se on kanssa Quora.
Tommy ei ole täällä vielä, mutta yksi ihmiset on entinen CF
Tommy McWilliam.
Joten hän on hauska kaveri.
Sinun pitäisi tulla.
>> Selvä.
Joten viime viikolla, aloimme rikkomatta toisistaan mitä merkkijono todella on.
Olemme tienneet alusta lähtien, että se merkkijono.
Mutta viime viikolla eläytyä siihen, että mikä on todella sekvenssi
merkkiä, hyvin, meillä on nyt ryhmät merkkiä.
Ja tiedämme, että merkkijono, se on array merkkejä, aivan lopussa,
meillä on tämä erityinen null tavu, tämä backslash 0, joka ilmaisee pää
merkkijono.
>> Ja niin merkkijono on joukko merkkiä, mutta voimme olla yli
vain erilaisia ​​merkkejä, meillä voi olla erilaisia ​​tahansa
tyyppinen asia haluamme.
Joten, jos muistatte viime viikolla, Aikuisten ohjelma, David käyttöön
todella nopeasti.
Joten ensimmäinen asia aiomme tehdä, on kysyä käyttäjältä kokonaisluku,
joukko ihmisiä huoneeseen.
Kun meillä on tuo kokonaisluku, me julistaa array.
Huomata tämän kiinnike syntaksin.
Olet menossa tottua siihen.
>> Joten olemme julistamalla joukko kokonaislukuja nimeltään ikäisille, ja siellä on n
kokonaislukuja tässä array.
Joten tämä kuvio täällä, tämä 4 int i on 0, i on pienempi kuin n, i plus
plus, joka on myös olemaan malli että saat hyvin tottunut.
Koska se on aika paljon, miten olet aina menossa kerrata yli paneelit.
Niin muista, että n on pituus meidän array.
Ja niin täällä, me pyytävät toistuvasti iän henkilö i huoneessa.
>> Tämän jälkeen menemme alas, ja jostain mielivaltainen syy, me sitten
tulostaa kuinka vanhoja he aikovat olla vuoden päästä.
Ja käynnissä ohjelman, katsotaanpa tehdä ikäisille, piste slash ikäisille.
Joten ihmisten määrä huoneeseen, sanokaamme on kolme.
Ja sanoa, ensimmäinen henkilö on 13, seuraava on 26, ja viimeinen on 30.
Niin sitten se tulee kerrata yli nämä kolme ihmiset, tulostaa 14, 27 ja 31.
>> Muista siis, että kun julistamme taulukon koko n, indeksit että
array, array on arvojen ja indeksit 0, 1, 2, aina
enintään n miinus 1.
Joten kun sanoimme, että kolme ihmistä huoneessa, ja me laittaa tänne
ensimmäistä iterointia kautta silmukka, i tulee olemaan 0.
Joten indeksi 0.
Olemme osoitetaan ensin ikä käyttäjä syöttää.
Sitten seuraava, olemme syöttämällä Toinen n käyttäjä syöttää ja
vieressä kaksi, n viimeksi.
>> Niin huomaa, että taulukon koko kolme ei ole mitään
indeksissä kolme.
Tämä ei ole voimassa.
Selvä.
Joten, menee takaisin tänne.
Joten nyt olemme kohdanneet paneelit, meillä on joitakin tuttuus.
Nyt aiomme siirtyä komento argumentteja, jotka tulevat olemaan
melko vaikutusta tähän ongelmakenttään asettaa.
>> Joten asti, kun olet julisti teidän päätehtävä, olemme
sanoi int main void.
Joten void vain sitä, että emme ohimennen mitään
argumentteja tätä toimintoa.
Nyt aiomme nähdä, että tärkeimmät voi kestää joitakin perusteluja.
Täällä kutsumme heitä int argc ja merkkijono argv suluissa.
Suluissa jälleen kerran osoittaa, että olemme tekemisissä paneelit.
Joten tässä, merkkijono argv suluissa, olemme käsittelevät Merkkijonotaulukko.
Niin argc, että menee ilmoittamaan kuinka monta argumenttia olemme
kulunut tähän ohjelmaan.
Ja nähdä, mitä se tarkoittaa, , hoidetaan tämä.
>> OK.
Joten asti, Teimme kaikki Ohjelma kuten piste slash ikäisille.
Voimme myös komentoriville ohi argumentteja, mikä termi, komento
argumentteja.
Joten ensimmäinen väite, hello world.
Joten tässä, argc olisi kolme.
Se on määrä argumentteja komentoriviltä.
Argc on aina vähintään 1, koska piste slash ikäisille, itse, lasketaan yhdeksi
komentoriviargumentteja.
>> Sitten hei on ensimmäinen.
Jos piste slash ikäisille on zeroth sitten hei on ensimmäinen, ja maailma on
Toinen komentorivillä.
Joten merkkijono argv, aiomme nähdä, sisältää jouset, piste slash
ikäisille, hei, ja maailma.
Ja David pyynnöstä olemme menossa pelata video käyttöön että.
>> [VIDEOTOISTOSTA]
>> -Tähän asti ohjelmissa olemme kirjoitettu, olemme julistaa
Tärkein int main void.
Ja koko tämän ajan, että mitätön on yksinkertaisesti täsmennetään, että
Ohjelma ei ota mitään komentoriviargumentteja.
Toisin sanoen, kun käyttäjä suorittaa ohjelmaa, hän voi antaa komennon
argumentteja kirjoittamalla lisää sanoja tai lauseita jälkeen ohjelman
nimi kehoitteeseenexit.
>> No, jos et haluat ohjelman ottaa komentoriviargumentteja, yksi tai
enemmän sellaisia ​​sanoja, meidän on korvattava mitätöidä pari argumentteja.
Tehdäänpä että.
Sisällytä CS50.h.
Ovat standardin io.h.
Int main.
Ja nyt, sen sijaan mitätön, aion määrittää int nimeltään argc, ja
Merkkijonotaulukko kutsutaan argv.
Nyt argc ja argv ovat yksinkertaisesti yleissopimukset.
>> Olisimme voineet nimeltään nämä väitteet melkein mitä haluamme.
Mutta mikä on tärkeää on, että argc on int koska määritelmän, se on
menossa sisältää väitteen määrä, sanojen määrä yhteensä, että
käyttäjä on kirjoitettuna hänen ajallaan.
argv puolestaan ​​argumentti vektori, on menossa todella array tallentaa
kaikki sanat, jotka käyttäjä on kirjoitettuna hänen ajallaan.
>> Katsotaanpa edetä tehdä jotain nyt jossa on yksi tai useampi näistä
komentoriviargumentteja.
Erityisesti, mennään eteenpäin ja tulosta mitä sana käyttäjätyyppeihin
jälkeen ohjelman nimi kehoitteeseenexit.
Alkusulkumerkki.
Loppusulkumerkki.
Printf prosenttia s kenoviiva ja pilkku.
Ja nyt minun täytyy kertoa printf mitä arvoa liittämisen että paikkamerkkiin.
Haluan ensimmäinen sana, joka käyttäjällä on kirjoitit jälkeen ohjelman nimi,
ja niin aion määritellä argv kiinnike 1, lähellä
suluissa, puolipiste.
>> Nyt, miksi kannatin 1 eikä kiinnike 0?
No, se kääntyy pois, tallennetaan automaattisesti in argv 0 tulee olemaan
Ohjelman varsinainen nimi.
Joten ensimmäinen sana, että käyttäjä tyypit jälkeen ohjelman nimi on, by
yleissopimus, olemaan tallennettu argv 1.
Katsotaanpa nyt koota ja suorita tämä ohjelma.
>> Tee argv 0, dot slash argv 0.
Ja nyt sana kuin hei.
Enter.
Ja siellä meillä on, hei.
>> [END VIDEOTOISTOSTA]
>> ROB BODEN: Selvä.
Sulje tämä.
Joten vilkaisemalla kyseisessä ohjelmassa, jossa me vain esitteli meille hyvin, vain
näyttää, jos me painamme argv 0, tee, nyt mitä se on, argv 0, dot slash argv 0.
Joten, odotetusti, se tulostaa Ohjelman nimi, koska argv 0 on
aina olemaan Ohjelman nimi.
Mutta tehdään jotain hieman mielenkiintoisempaa.
>> Joten ongelma asetettu, voit olla otettu käyttöön tämän toiminnon, atoi.
Joten mitä me käytämme atoi varten?
Se menee muuntaa merkkijono kokonaisluku.
Joten jos kuljen merkkijono, yksi kaksi kolme, to atoi, joka tulee muuntaa että
on kokonaisluku, yksi kaksi kolme.
Menemme siis muuntaa ensin komentorivin argumentti kokonaisluku,
ja sitten vain tulostaa että kokonaisluku.
>> Joten periaatteessa, olemme tavallaan reimplementing getint, vain
kokonaisluku on kirjattu komento linja sijaan ohjelmaan
vuorovaikutteisesti.
Joten sitten, jolloin argv 0, tehdään se tänne, ja sulje se.
Joten käynnissä argv 0, ja lähdetään kirjoita kokonaisluku, yksi kaksi kolme neljä yksi kaksi.
Joten se tulostaa kokonaisluku, yksi kaksi kolme neljä yksi kaksi.
On joitakin hienouksia ja atoi että se tulee lakata huolehtimasta mitään
pidemmälle voimassa numeerinen merkki, mutta se ei haittaa.
>> Joten mitä luulet tapahtuu jos en tee tätä?
Segmentointi vika.
Niin miksi?
Jos katsot takaisin ohjelmaamme, olemme muuntaa argv 1, ensimmäinen argumentti
ohjelman nimen perään, että kokonaisluku.
Mutta ei ole argumentti ohitettiin ohjelman nimen perään.
Joten tässä me näemme, että tämä on buginen ohjelma, koska, jos yritämme käyttää sitä
ilman mitään perusteluja, se vain kaatuu.
>> Joten toinen yhteinen malli näet on jotain, jos argc on vähemmän
kuin kaksi, mikä osoittaa, että ei ollut ainakin ohjelman nimi ja
Ensimmäisen väitteen, niin me teemme jotain kuten printf, ei riitä
komentoriviargumentteja.
Se ei todennäköisesti hyvä tulostaa, se on luultavasti jotain, kuten
kirjoitettava kokonaisluku komentoriviltä.
Otan vain lopettaa se siellä.
Ja palata sitten 1.
Niin muista, että lopussa meidän ohjelma, jos palaamme 0, että sellainen
osoittaa menestystä.
Ja tärkeimmät myös automaattisesti palauttaa 0 jos et.
>> Joten tässä, me retuning 1 osoittamaan että se ei ole menestystä.
Ja voit palauttaa mitä haluat, vain, 0 osoittaa menestystä ja
mitään muuta ilmaisee epäonnistumista.
Joten suorita tämä versio asioista.
Joten nyt, jos emme anna komentoriviltä argumentti, se tulee oikein kertoa
Meille ei riitä komentoriviltä.
Eikö lopettaa lauseen.
Else, jos todella välittää se yksi, se voi suorittaa ohjelman.
Joten tämä on, miten käyttäisit argc vuonna Voidakseen vahvistaa määrä
komentoriviargumentteja että tosiasiallista siirtämistä.
>> Joten tehkäämme tämä ohjelma hieman monimutkainen, ja katsoa toista
iterointia asioita.
Joten nyt, emme vain tulostus Ensimmäinen komentorivillä.
Täällä olemme iteroimalla alkaen int i tasavertaisina 0, i on pienempi kuin argc, i plus
plus, ja tulostus argv, indeksi i.
Joten tämä kuvio, jälleen, tämä on sama mallineuletta kuten aiemmin, lukuun ottamatta sen sijaan
kutsuvan muuttujan n, käytämme argc.
>> Joten tämä on iteroimalla yli kukin indeksi pakassa, ja tulostettavaksi joka
elementti, että jono.
Ja niin, kun otamme tämän ohjelman hyvin, En anna mitään komentoriviltä
argumentteja, niin se vain tulostaa ohjelman nimi.
Jos astun joukko asioita, niin sitten tulostaa yhden, kukin omalla rivillään.
>> OK.
Joten ottakaamme tämä askeleen pidemmälle.
Ja sen sijaan tulostus jokaisen argumentin omalla rivillään, nyt tulostaa jokaisen
että kukin argumentti omalla rivillään.
Niin muista, että argv on Merkkijonotaulukko.
Joten mikä on merkkijono, mutta joukko merkkejä?
Niin se tarkoittaa, että argv on todella joukko erilaisia ​​merkkejä.
Joten hyödyntää, että Katsotaanpa sivuuttaa tätä nyt.
Toivotaan vain harkita merkkijono argv 0.
>> Joten jos haluamme tuoda kukin merkki argv 0 omalla rivillään, sitten haluan
tehdä mallia olemme tottuneet, i on vähemmän kuin pituus array,
joka täällä on strlen on, se on ei mitä haluan tehdä, string
s vastaa argv 0.
Joten i on pienempi kuin pituus meidän array, joka tässä tapauksessa on matriisi
Merkkien, i plus plus.
Ja niin, kuten näimme viime viikolla, se on ihanteellinen Jos me siirrymme että strlen ulkopuolella
kunnossa, sillä n lisäämme strlen s kerta menemme
silmukan läpi, ja se on aio olla muuttumassa.
Joten me asettaa se suuruudeltaan n tänne.
>> OK.
Joten nyt olemme iteroimalla yli kukin indeksi array.
Ja niin, jos haluamme tulostaa jokaisen merkki, että jono, prosenttia c on
lipun haluamme käyttää merkeille.
Ja nyt kiinnike i tulee olemaan string, indeksi merkki i, joten jos
string olivat hei.
Sitten s 0 tulee olemaan h, s kiinnike 1 on e, ja niin edelleen.
>> Joten nyt haluamme yhdistää nämä kaksi asiaa.
Haluamme tulostaa kunkin merkin Kunkin komentorivillä.
Joten aiomme olla sisäkkäisiä silmukka.
Ja tavanomaisesti, ensimmäisen laskurin on i, seuraava tulee olemaan j, n
on strlen ja argv i, i on pienempi kuin n, i plus plus.
Ja nyt sen sijaan tulostus argv i, joten argv kiinnike i on menossa index -
että tulee olemaan i. komentoriviltä argumentti, argv i, j on menossa
olla nnen luonne i. argumentti.
Minä päästä eroon tästä täällä nyt koska voimme toteuttaa sitä, että silmukka.
Joten vastaa merkkijono vertaisuuden argv i, ja sitten s kiinnike j.
>> No, meidän ei tarvitse julistaa tämä muuttuja s.
Sen sijaan meidän täytyy vain yhdistää nämä kaksi, mitä meillä oli, ARGV i, j.
>> SPEAKER 1: [kuultavissa].
>> ROB BODEN: Hyvä veto.
Joten tämä on rikki.
Jos minä itse juoksi sitä, olisimme ovat ymmärtäneet tämän.
Joten laskuri välitän tässä erityisesti
silmukka on j, iteraattoria.
Joten olisit joutunut kysymyksiä, luultavasti päättymättömään silmukkaan, jos me
ei ollut vahvistanut sitä.
Siksi me myös puhumme noin virheenkorjaus tänään.
>> OK.
Joten suorita tämä ohjelma.
Ja lähdetään itse lisätä erillinen printf täällä joka vain tulostaa
toinen viiva, koska tämä tarkoittaa, kun me suorita ohjelma, siellä tulee olla tyhjä
linjassa niiden välillä kukin merkki Kunkin komentorivillä.
No, katsotaan mitä se tarkoittaa.
Oop.
Sai joitakin bug.
Virhe epäsuorasti julistamisesta kirjaston funktion strlen.
>> Niin menee takaisin ohjelmaamme, I Unohdin hash kuuluu string.h.
Joten string.h tulee olemaan header-tiedosto, joka ilmoittaa
toiminto strlen.
OK, se kokoaa.
Nyt, suorita se.
Niin juuri näin.
Se tulee tulostaa meidän ohjelman nimi, hello world.
Se tulee tulostaa jokaisen asia, jokainen merkki, omalla rivillään.
OK.
>> Joten todella ottaa tämän askeleen pidemmälle.
Ja sen sijaan käyttää string.h, katsotaanpa miettiä, miten olisimme toteuttaa omia
strlen toiminto.
Niin minä annan heti toiminto allekirjoitus.
Joten soittaa my_strlen, ja se on vie narua argumentti,
ja odotamme palata pituus merkkijonon.
Joten, jos hän on?
Kyllä.
OK.
Muista siis aikaisemmasta dian oli myös viime viikolla, että
joukko hahmoja, hyvin, merkkijono, joten haluan sanoa, tämä on meidän merkkijono s.
Joten jos s on merkkijono, hei sitten, H-E-L-L-O, muisti, että menee
olla, ja sitten tämä kenoviiva 0 luonnetta.
>> Joten miten saamme pituus s?
No, temppu etsii tätä välyksetön 0 luonnetta, tämä null
terminaattori.
Niin algoritmi on menossa olla jotain muutaman
tarpeeksi merkkejä -
Katsotaan tämän käden edustavat noin laskuri, kutsukaamme tätä int pituus.
Joten, alkaen tänne, olemme menossa kerrata yli meidän merkkijono.
>> Joten ensimmäinen merkki, se on H, ja se ei ole kenoviivan 0, joten
pituus on 1.
Kerrata seuraavan merkin, E, ja se ei ole kenoviiva 0.
Pituus on 2.
L, 3.
L, 4.
O, 5.
Ja lopuksi, pääsemme kenoviiva 0, ja niin se tarkoittaa, no,
Tämä merkkijono on ohi.
Joten palata 5.
>> Niin todellisessa täytäntöönpanossa ensinnäkin, minun n pituus on 0, minun oikea käteni.
Ja aiomme kerrata -
>> SPEAKER 1: [kuultavissa]
>> ROB BODEN: Hitto.
Hyvä soittaa.
Puomi.
Joten n pituus vastaa 0.
Joten nyt, kun s pituus ei yhtä ja sitten kenoviiva 0.
Joten muistakaa, tämä kenoviiva 0, se on todellinen luonne, ja se osoittaa
merkkijonon loppuun.
Aivan kuten, myös, kenoviiva n on todellinen luonne.
Backslash 0 tulee osoittamaan Lopussa meidän merkkijonon.
En halua laittaa, että siellä.
Ja vaikka s indeksoitu pituus ei ole on yhtä suuri kuin nolla-terminaattorin, sitten
olemme juuri menossa kasvattaa pituutta.
Joten sitten, lopussa meidän ohjelma, pituus on lopulta menossa
olla 5 tässä tapauksessa.
Ja me vain palata pituus.
>> OK.
Joten nyt tänne, en do my_strlen.
Katsotaanpa kääntää sen varmista kaikki sujuu hyvin.
On onnistun 2?
Vai oliko se 1?
Että pitäisi tehdä.
Selvä.
Joten tämä on argv 2.
Toimii ennakoidusti, joskin oli se, että yksi tein sen?
Kyllä.
OK.
Tämä versio asioista ei ole printf uudelle viivalle, mutta se
ei tee mitään eroa.
OK.
Joten toimi odotetusti.
>> Nyt voimme jopa yhdistää tämän askeleen Lisäksi, jos ilmoitusta täällä, hyvin,
Ensimmäinen, olemme tarttumalla strlen of argv i, ja sitten olemme iteroimalla yli
kunkin merkin merkkijonon.
Joten sen sijaan tehdä, että mitä jos me vain yhdistää tätä logiikkaa odottaa
kunnes osuimme kenoviiva 0 oikea tähän silmukka?
Joten kerrata taas argv i, j ei ei yhtä kenoviiva 0.
Joten käyttää sitä ensin.
>> Selvä.
Joten tässä, tämä ehto sanoo -
Katsotaanpa selvää, että.
Joten nyt, olkoon tämä meidän argv.
Joten kun minä vain juoksin että ohjelma ennen, argv on Merkkijonotaulukko.
Ja niin, jos en suorita sitä dot slash argv 2, hello world, sitten argv
itse on pituus 3, ja argv nolla, hei, ja maailma.
>> Ja jokaisen sisällä näiden indeksien on, itse array, jos tämä tulee olemaan
dot, tämä on slash, en tiedä jos se oli oikeaan suuntaan, I
usko, että se oli.
-R-V ajatusviiva, tarvitsevat enemmän tilaa.
Leikataan tähän array.
-R-V viiva 0, ja sitten kenoviiva 0.
Ja sitten sekasorrossa on hei.
Sanotaan, H-E kenoviiva 0.
Ja lopuksi, W-O kenoviiva 0.
>> Niin algoritmi, että me vain kirjoitti, sisäkkäisiä silmukoita, mitä he
tekemässä on, meidän on ensin counter i ja sitten j.
Tämä olisi helpompaa koodi näyttö, Mennään takaisin tähän.
OK.
Niin huomaa, että i on iteraattori joka on iteroimalla yli jokaisen komennon
argumentti.
Ja j on iteraattoria iteroimalla yli kunkin merkin, että
komentorivillä.
Joten mitä tämä sisin printf tekee on, olemme printf argv 0 0, printf
argv 0 1, printf argv 0 2, 0 3, 0 4, 0 5, 0 6, mutta nyt argv 0 7 on menossa
yhtä kenoviiva 0.
>> Niin sitten me poistua että silmukka, ja nyt olen iteroi 1.
Ja nyt me aiomme tulosta argv 1 0, argv 1 1 -
No, nyt, koska leikkasin hei lyhyt, argv 1 2 jälleen olemaan
kenoviiva 0.
Ja niin, lisäys i ja jatkaa, ja niin edelleen, kunnes me tulostaa kaikki
maailman, ja ne ovat kolme komentoriviltä argumentteja, ja me poistumiseen
syrjäisimpien silmukka, ja loppuun ohjelmaamme.
OK.
>> Joten tulkaa takaisin.
Joten voit saada joitakin perehtyneisyyttä komentoriviargumentteja tästä
Erityisenä ongelmana asetettu.
>> Nyt, virheenkorjaus.
Niin olet todennäköisesti jo joutunut tekemään jotkut testaajat aikaisempia
Harjoitus.
Ja yksi erittäin helppo tapa virheenkorjaus, ensimmäinen, katsotaanpa buginen ohjelma.
No, kävely läpi tämän ohjelman aiomme kysyä käyttäjältä
kokonaisluku, napata että kokonaisluku, ja sitten, mielivaltaisesti, meillä on taas silmukka, joka
on juuri menossa dekrementoidaan i kunnes se on yhtä suuri kuin 10.
Katsotaanpa vain olettaa Olen kirjoittamalla kokonaisluku suurempi kuin 10.
Joten dekrementoidaan i kunnes se on yhtä suuri kuin 10.
>> Ja sitten meillä on toinen kun silmukka että vaikka minulla ei ole 0, olemme
menossa dekrementoidaan I 3.
Joten jos näet tarkoitus bug täällä, se on, että tämä tulee dekrementoidaan I
olla 10, ja sitten tämä, kun silmukka vähenemä i 10, 7, 4, 1,
negatiiviseksi 2, negatiiviseen 5, ja niin edelleen, negatiiviseksi ääretön, koska aion
oikeastaan ​​koskaan 0.
Ja sitten lopussa tämän ohjelman meillä foo toiminto, joka on
meneillään tulostaa että olen.
>> Joten tämä on lyhyt ja triviaali ohjelma, ja vika on ilmeinen,
varsinkin kun olen juuri sanoi mitä bug oli.
Mutta tarkoitus tässä, hyvin, tämä voisi todella näyttää joku
ratkaisuja ahne viimeisestä Harjoitus, ja ehkä et ole
Joissakin päättymättömään silmukkaan oman ohjelman, ja sinulla ei ole aavistustakaan
mikä aiheuttaa sen.
Joten erittäin hyödyllinen virheenkorjaus tekniikka on vain lisätä printfs
koko koodi.
>> Joten tässä haluan printf ulkopuolella Ensimmäinen kun silmukka.
Ja tässä haluan printf, ja minä vain tulostaa i.
Minä jopa tehdä ensin while-silmukka, i.
Ulkopuolella, toinen taas silmukka.
Jälleen kerran, tulosta sisällä täältä arvo i.
Ja juostaan ​​tätä.
>> Joten dot slash debug.
Anna kokonaisluku.
Tehdään 13.
Ja puomi.
Näemme, että olemme äärettömän silmukoiminen sisällä toisen while-silmukka.
Joten nyt me tiedämme, mitä vika on.
Mutta printf virheenkorjaus on täysin suuri, mutta kun ohjelmat saavat
pidempi ja monimutkaisempi, on kehittyneempiä ratkaisuja
saada homma.
Joten poistaa kaikki nämä printfs.
Ja varmistetaan että en riko mitään.
OK.
>> Joten ohjelma aiomme esitellä kutsutaan
GDB, GNU Debugger.
No, itse asiassa, nyt poistaa debug varten Toinen, ja tehdä debug uudelleen.
No, itse asiassa ensimmäinen, hyvä oppitunti vuonna komentoriviargumentteja.
Huomaa, että tämä kalahtaa komento, joka on koota kaikki on ohi
komentoriville, nämä komentoriviargumentteja.
Joten kuinka aiot käyttää komentoriviargumentteja, kuten me
ennenkin, ja kun tahtoa PSET 2, näin kalahtaa käyttää niitä.
>> Niin huomaa, että tämä ensimmäinen lippu, viiva ggdb3, mitä se on sanoa on, kalahtaa,
sinun pitäisi koota tämän tiedoston tarkoitusta varten, että me lopulta
täytyy debug sitä.
Niin kauan kuin sinulla on, että lippu, Sitten voimme GDB debug.
Ja se tulee avata GNU Debugger.
>> Niin on olemassa paljon komentoja että sinun täytyy tottua.
Ensimmäinen, joka luultavasti heti tarvitsemme Run.
Joten mitä Run aikoo tehdä?
Se tulee aloittaa ohjelmaamme.
Joten ajaa, alkaa ohjelma, ohjelma pyytää meiltä kokonaisluku, 13.
Ja sitten se on ääretön silmukoiminen kuin odotettavissa, paitsi poistin
printfs, joten emme edes huomaa.
Lähtenyt normaalisti.
Oh.
On mahdollista, että se kääritty kaikki päin, takaisin - välittämättä siitä.
Oletetaan se ei poistu normaalisti.
Siellä on monimutkainen vastaus tähän.
>> Joten nyt, että ei ole kovin hyödyllinen.
Joten juuri käynnissä meidän ohjelma sisällä Tämän debuggeri ei auta meitä millään
tavalla, koska olisimme voineet juuri tehneet dot slash debug ulkopuolelta GDB.
Joten yksi komento Luultavasti -
ja lopetan tähän.
Ohjaus-d tai lopettaa, niin työssä.
Joten avaa sen uudelleen.
>> Toinen komento, että luultavasti heti halua
tottua, on murtaa.
Niin me murtaa tärkeimmistä nyt, ja sitten selitän että.
No, tässä näemme asetimme breakpoint Tämän linjan debug.c.
Joten mikä tauko keino on, että kun kirjoita tähtäimellä ohjelma on menossa
jatkaa toimintaansa, kunnes Löin murtuessa.
Joten kun lyön tähtäimellä ohjelma käynnistyy, ja sitten se hajoaa heti, kun se
tulee päätehtävä.
Rikkoa tärkein tulee olemaan jotain olet aika usein tehdä.
>> Ja nyt esitellä teille Joidenkin enemmän komentoja.
Huomaa täällä, että se sanoo me murtui line 11, joka on
printf, syötä kokonaisluku.
Joten komento Seuraava tulee olemaan, miten menemme seuraavan rivin koodia.
Tämä on menossa, jotta voimme astua ohjelmamme kautta rivi riviltä.
Joten seuraavaksi.
>> Nyt linja 12, aiomme saada kokonaisluku.
Seuraava.
Ja jos painaa vain Enter uudelleen, se tulee redo viimeinen asia teit.
Joten en tarvitse kirjoittaa ensi kerta.
Joten anna kokonaisluku, 13.
Joten nyt, linja 14, kun i on suurempi kuin 10, ja minä teen seuraavaksi.
Ja me näemme aiomme dekrementoidaan i.
Menemme siis dekrementoidaan i uudelleen.
>> Joten nyt toinen hyödyllinen komento on Tulosta.
Joten Tulosta tulee tulostaa Muuttujan arvo.
Katsotaanpa tuoda esiin arvo muuttujan i.
Katsotaanpa tulostaa i.
Se aikoo sanoa i on 11.
Nyt Seuraava uudelleen, kun i on suurempi kuin 10.
Joten en vielä suurempi kuin 10, koska se on 11.
i minus minus.
Katsotaanpa tulostaa i uudelleen.
Kuten odotettua, se on 10.
>> Joten nyt seuraavaksi.
Se tulee takaisin kunnossa, i on suurempi kuin 10, mutta i on nyt 10, joten
se ei ole suurempi kuin 10, joten odotamme sen pudota pois kun silmukka.
Ja nyt olemme alle Koodirivin.
Ja toinen komento, List, on juuri menossa näyttää edellisen ja seuraavan
pari riviä koodia, vuonna Jos olet menettänyt itse.
Joten me vain lähtenyt tästä kun silmukka, ja nyt olemme tulleet tähän
while-silmukka, linja 18.
Joten vaikka i = 0, ei.
Ja seuraavaksi, i on yhtä suuri kuin i miinus 3, ja me huomaa, tämä täytyy vain jatkaa eteenpäin.
Ja voimme painaa i.
>> Jokainen komento tavallaan on oikoteitä.
Joten p on lyhyt Tulosta.
Joten voimme p i.
Vain pitää holding n, tai pitää tehdä Next.
Tulosta i uudelleen.
Näet nyt se on negatiivinen 167.
Joten tämä jatkuu loputtomiin, mutta ei todella ikuisesti, koska olet juuri nähnyt, se
todella päättyy jossain vaiheessa.
>> Niin että alkaa GDB.
Mutta katsotaanpa vielä yhden asia GDB.
Uh, debug.
Niin, tässä nimenomaisessa tapauksessa, päättymättömään silmukkaan sattui olemaan sisällä
päätehtävä.
Ja nyt, vain hyväksyä, että olen siirrymme päättymättömään silmukkaan osaksi
foo toiminto.
Vain muistaa, että lopussa tämän ohjelma, no, tämä oli alun perin
kutsuvan foo, joka oli juuri painoon i.
Mutta nyt soitat foo, joka on menossa dekrementoidaan i kunnes se on 0, ja
sitten tulostaa muuttuja.
OK.
Paitsi että.
Make debug.
Ja nyt, gdb debug.
OK.
>> Joten jos olen vain ajaa niin en aio pystyä todella selata minun
ohjelma rivi-line.
Joten tauko tärkein, ja kirjoita sitten ajaa.
Joten mene läpi tämän, printf, kirjoita kokonaisluku, saat kokonaisluku, 13.
Joten aiomme pitää decrementing kunnes i on suurempi kuin 10.
Sitten olemme putoamassa läpi while-silmukka, ja saada linja -
katsotaanpa avaa sen erilliseen ikkunaan.
Joten me pienennetään, kunnes en enää suurempi kuin 10, ja sitten me
nimeltään toiminto, foo.
>> Mitä tapahtui, kun osuin funktio foo, no, minä foo, ja
Sitten en enää ollut määräysvaltaa GDB.
Niin heti kun osuin Seuraava tältä riviltä asioita jatkui kunnes tämä tapahtui,
jossa ohjelma saadessaan -
olettaa sitä ei ollut lopulta.
Näit sen pysähtyä vähän kuitenkin.
Joten miksi olen menettää valvoa Ohjelman tässä vaiheessa?
No, kun kirjoitan seuraavan, joka menee kirjaimellinen seuraava rivi koodia, että
tulee suorittaa.
Niin sen jälkeen linja 21, seuraava rivi koodia joka suorittaa on line 22,
joka on, joka poistuu tärkein.
Joten en halua vain mennä seuraavalle riville koodia.
Haluan mennä toiminto, foo, ja sitten myös selata
nämä riviä koodia.
>> Niin, että meillä on vaihtoehto.
Lopetetaan se uudestaan.
Rikkoa tärkein.
Uh, 1, seuraava, seuraava, 13, seuraava, seuraava, seuraava huolellisesti,
ennen osuimme linja foo.
OK.
>> Joten nyt me olemme linja 21, jossa kutsumme foo.
Emme halua kirjoittaa seuraavaksi, koska tämä vain soittaa toiminto foo, ja
Siirry seuraavalle riville koodia.
Mitä haluamme käyttää on Step.
Joten ei eroa Step ja Seuraava, jos vaihe astuu
toimiakseen, ja Seuraava menee yli-toiminto.
Se vain toteuttaa kokonaisuudessaan toimintaa ja pitää menossa.
>> Joten Step aikoo tuoda meille osaksi toiminto, foo.
Ja me näemme täällä, nyt olemme takaisin tämä taas silmukka, joka on teoriassa
tulee jatkumaan ikuisesti.
Ja jos osut vaiheessa, kun se ei ole edes toiminto soittaa, niin se on
identtinen Seuraava.
Joten se on vain kun olet linja, joka soittaa toiminto Step
aikoo poiketa Seuraava.
Joten Step tuo meidät tänne.
Askel, askel, askel, askel, askel, askel, ja me vain loputon silmukka ikuisesti.
>> Joten saatat tottua sitä oman tapa tunnistaa ääretön silmukoita, on
vain tilalla tämän Enter nähdä, missä jäät jumiin.
On olemassa parempia tapoja tehdä sitä, mutta nyt, että on täysin riittävä.
Ja tyylillisesti, noudattaa Style 50, minun olisi pitänyt tehdä tätä.
OK.
>> Joten viimeisen komennon käyttöön.
No, gdb debug sisään
Joten sen sijaan, rikkomatta kohdallaan, jos en tietää foo toiminto on myös
ongelma, niin voisin olla vain sanoi, tauko foo sijaan.
Sanotaan rikon at sekä pää-foo.
Joten voit asettaa niin monta breakpoints kuin haluat.
Kun kirjoitan aikavälillä, se tulee pysähtyä -
ooh, nyt kääntää, koska Olen muuttanut asioita.
Näet tämän linjan, Varoitus, lähde tiedosto on uudempi kuin suoritettavan.
Niin se tarkoittaa, että olen vain meni täällä ja muutti nämä mukaiseksi Style
50, mutta en uudelleenkääntää ohjelma.
Joten GDB saa minut tietoisia siitä.
Lopetan, tee debug uudelleen, osuma GDB debug.
OK.
>> Joten nyt takaisin siihen, mitä olin tekemässä.
Rikkoa tärkein, break foo.
Nyt jos en suorita ohjelma, joten se on tulee jatkumaan, kunnes osuu
murtuessa.
Että breakpoint sattuu olla ensimmäinen yksi tärkeimmistä.
Nyt sen sijaan tehdä seuraavaksi, seuraavaksi, seuraavaksi, seuraava, seuraava, kunnes osuin foo, I
voi kirjoittaa jatkaa, joka jatkaa kunnes osut seuraavaan murtuessa.
Minun täytyy syöttää kokonaisluvun ensin.
Jatka jatkuu kunnes osuin Seuraavan murtuessa, jonka mukaan
funktio foo.
>> Joten Run jatkuu osut murtuessa, mutta sinulla on vain kirjoitat aikavälillä, kun
olet alkanut ohjelma, ja sitten lähtien, se on edelleen.
Jos tein rikkoa pää-ja sitten juoksi, se tulee tauko
Tärkein, ja jatka sitten.
Koska minulla ei ole taitekohta klo foo, Syötä kokonaisluku, niin nyt olen
aio rikkoa klo foo.
Se on vain olemaan ääretön silmukka kunnes.
OK.
>> Niin, että Intro GDB.
Sinun pitäisi alkaa käyttää sitä teidän ongelma sarjaa.
Se voi olla hyvin hyödyllinen tunnistaa vikoja.
Jos todella vain, rivi riviltä, ​​go läpi koodin, ja vertailla, mitä on
todella tapahtuu, mitä odotat tapahtua, niin se on aika
vaikea kaipaamaan vikoja.
OK.
>> Joten viime viikolla David vienyt tämän salaisen avaimen salausta juttuja
ensimmäistä kertaa, jos emme halua salasanat vain olla tallennetussa
tietokone joissakin tekstitiedosto, jossa joku voi tulla yli ja vain
avaa sen ja lukea niitä.
Ihannetapauksessa, ne salataan jollain tavalla.
Ja Harjoitus 2, voit olla tekemisissä yhden tavan salauksen,
tai, no, kaksi menetelmää, mutta ne eivät ole niin suuria.
Jos et hakkeri painos, olet Lisäksi aiotaan käsitellä
salauksen joitakin asioita.
>> Joten kysymys on nyt hyvin, vaikka meillä on vahvin salaus
algoritmi maailmassa, jos valitset erityisen heikko salasana, niin se
ei auta sinua paljon, koska ihmiset voi silti tajuta se.
Vaikka nähdä salattu merkkijono ja se näyttää sotku roskat
että ei merkitse mitään, jos he silti täytyy vain kokeilla muutamia salasanoja
tajuta se, niin eivät ole kovin turvallinen.
Joten katselet videota, joka tekee tältä osin.
>> [VIDEOTOISTOSTA]
>> -Kypärä, sinun riiviö.
Mitä on tekeillä?
Mitä teet tyttärelleni?
>> -Saanen esitellä loistava nuori plastiikkakirurgi, tohtori Phillip
Schlotkin, suurin nenä työ mies koko
maailmankaikkeus, ja Beverly Hills.
>> -Your Highness.
>> -Nenä työtä?
En ymmärrä.
Hän on jo ollut nenä työtä.
Se oli Sweet Sixteen läsnä.
>> -Ei.
Se ei ole mitä luulet.
Se on paljon, paljon pahempi.
Jos et anna minulle yhdistelmä ilmasuojan, Dr. Schlotkin tulee
anna tyttäresi takaisin hänen vanhan nenä.
>> -Ei.
Mistä sait sen?
>> -Selvä.
Kerron.
Ei, isä.
Ei, et saa.
>> Olet oikeassa, kultaseni.
Tulen kaipaamaan uusi nenä.
Mutta en kerro hänelle yhdistelmä, ei väliä mitä.
>> -Erittäin hyvin.
Dr. Schlotkin, tee pahin.
>> -Mielelläni.
>> [Työkaluja vain teroitettu]
>> -Ei.
Odota.
Kerron.
>> -Tiesin, että se toimisi.
Selvä.
Anna se minulle.
>> -Yhdistelmä on yksi.
>> -One.
>> -Kaksi.
>> -Kolme.
>> -Neljä.
>> -Viisi.
>> -Joten yhdistelmä on yksi, kaksi, kolme, neljä, viisi.
Se on typerin yhdistelmä Olen koskaan kuullut elämässäni.
Se on sellainen asia idiootti olisi hänen matkatavaroita.
>> -Kiitos, teidän korkeutenne.
>> -Mitä teit?
>> -Käännyin pois seinästä.
>> -Ei et tehnyt.
Olet sammuttanut koko elokuvan.
>> -Minun on painanut väärää nappia.
>> -No, laita se takaisin.
Laittaa elokuva takaisin.
>> -Kyllä, sir.
Kyllä, sir.
>> -Mennään, Arnold.
Tule, Gretchen.
Tietenkin, tiedät olen silti täytyy laskuttaa sinua tästä.
>> [END VIDEOTOISTOSTA]
>> ROB BODEN: Selvä.
Joten nyt, että me puhutaan jo turvallisuus jollain tapaa, nice
pikku elokuvajuliste, joten viime päivää, nämä kysymykset NSA
seurantaa kaiken.
Se voi olla vaikeaa tuntuu et on jonkinlainen yksityisyyden
online-maailma, vaikka en voinut kertoa sinua eniten yksityiskohdista Prism.
Joten siirtymässä Prism, emme aio puhuvan, että nyt
mieti kannettavan tietokoneen.
Joten tänne, haluan vaihtaa minun todellinen tilille,
pikku pingviini.
Joten minulla on salasana asetettu, ja että salasana on mitä haluan sen olevan.
>> Mutta muista, että mitä olen kirjautumisen kanssa, joten tämä login
ajallaan, on jokin ohjelma.
Se on joku ohjelma, joka oli kirjoittanut joitakin henkilö.
Ja niin, että henkilö, jos ne ovat erityisen ilkeä, ne voisivat
ovat sanoneet, kaikki hyvin, joten jos salasana että astun on yhtä kuin minun
Varsinainen salasana tai se on yhtä suuri Joidenkin erityisen salasanan -
David on mahtava tai jotain -
anna heidät sisään
Niin ilkeä ohjelmoija voisi olla pääsy kaikkiin Macit tai
Windows, tai jotain.
>> Niin että ei ole paljon huolta, koska Tarkoitan, tämä on kirjautunut ohjelmaan
joka toimitetaan OS X, satoja tai tuhannet ihmiset ovat
tarkasteli tätä koodia.
Ja niin, jos koodissa jonnekin, sinun sanoa, jos tämä merkkijono vastaa tasavertaisina
David on mahtava, kirjaudu sisään, niin jonkun tulee olemaan, kuten, odota.
Tämä ei ole oikein.
Tämän ei pitäisi olla täällä.
Niin, että yksi tapa saamme asiat olla sellainen turvallinen.
>> Mutta ajattele jopa ohjelmia että kirjoitat.
Sanotaan, että olet kirjoittanut kirjautuminen ohjelmaan.
Joten tämä login ohjelma, jonka kirjoitit, joten ilmeisesti, olet hyvä
ohjelmoija.
Et aio tehdä mitään haittaohjelmia jos x on yhtä vastaa David on mahtava
omaan koodia.
Mutta tämä ohjelma, mitä sinä koostaa tätä ohjelmaa?
Jotain kalahtaa.
Joten mitä jos henkilö, joka sattui kirjoittaa kalahtaa erityistä cased kalahtaa
jotain, jos olen koota kirjaudu ohjelma, kirjoita tämä koodi
osaksi login ohjelma, joka kertoo, jos X vastaa vastaa David on mahtava?
Joten ei ihan vielä, mutta meillä on sama kysymys, jossa kalahtaa, hyvin,
tuhansia, ellei kymmeniä tuhansia ihmiset, ovat tutkineet kalahtaa, on
Katsoin sen riviä koodia ja sanoi: kunnossa, ei mitään pahaa täällä.
Kukaan ei toki tekee mitään tämän ilkeä.
>> Mutta mitä on kalahtaa itse, kuten, mitä jos en koota kalahtaa?
Entä jos minulla on kääntäjä, joka kokoaa Clang, joka lisää osaksi Clang
tämä erityinen hakata joka sanoo, kaikki hyvin, kun minä koota kalahtaa, sitten
suoritettavan Saan pitäisi erityisesti tarkastella sisällä login ohjelman ja insertti
tämä salasana, vastaa tasavertaisina Dave on mahtava?
Niin muista, että kääntäjä itse tarpeen laatia jossain vaiheessa.
Joten jos mitä haluat koota kalahtaa kanssa, itse on ilkeä, niin
voitaisiin kierretään kokonaan tavalla ruodussa.
>> Joten tässä meillä on Ken Thompson ja Dennis Ritchie.
Joten tämä on ikonin kuva.
Dennis Ritchie on oikealla.
Hän on suuri -
melko paljon kirjoitti C. Voit siis kiittää häntä tähän luokkaan.
Ken Thomson on vasemmalla.
Kaksi heistä pohjimmiltaan kirjoitti UNIX.
No, he olivat tärkeimpiä toimijoita UNIX.
Oli joitakin muita.
Joten Ken Thompson, jossain vaiheessa, hän voittaa Turing Award.
Ja Turingin palkinnon, olen aina kuullut se viitattu tällä tavalla, se on
Nobelin tietojenkäsittelytiede.
>> Joten Turing Award, hänen on antaa hän hyväksyy puheessaan.
Ja hän antaa tämän hyvin kuuluisan puheensa nyt nimeltään Mietteitä Luottavainen
Luottamusta, jonka olemme sidoksissa Päälle kurssin verkkosivuilla.
Ja tässä puheenvuorossa, hän sanoo, kaikki hyvin, joten kirjoitin UNIX, ja nyt kaikki
te ihmiset käyttävät UNIX.
Nyt, nyt muistettava, että Linux on suora jälkeläinen UNIX.
OS X: n suoraan käyttää UNIX.
Windows ei niinkään, mutta paljon ideoita otettiin UNIX.
>> Niin hän menee lavalle ja sanoo, okei, minä kirjoitin UNIX.
Ja juuri niin te tiedätte, olen voi kirjautua jokaiseen
ikisen tietokoneissa.
Koska laitoin jotakin näistä erikoistyökaluja, jos x vastaa vastaa Ken Thomson on mahtava,
niin olen voi kirjautua.
Joten ihmiset ovat kuin hyvin, Miten teit sen?
Katselimme login ohjelman ja mikään ei ole siellä.
Hän on kuin, no, minä muutettu kääntäjä kirjautua sisään kirjautuminen ohjelmaan
jotta kirjautuminen ohjelma nyt on että x on yhtä vastaa Ken Thompson
on mahtava.
>> Ja he sanovat, no, se ei ole totta.
Etsimme kääntäjä, ja kääntäjä ei ole riviä
koodia niin.
Hän on kuin, OK, mutta mitä sinä kokoamiseen kääntäjän kanssa?
Ja he ajattelevat, ja hän on, kuten hyvin, Minä olen se, joka antoi sinulle kääntäjä
käytät kääntää kääntäjä, joten olet koota kääntäjä, joka
itsessään on ilkeä, ja tulee rikkoa login ohjelman.
Joten periaatteessa, siinä vaiheessa, siellä on mitenkään voisit katsoa lähde
koodi login ohjelman nähdä, mikä on väärin.
Et voi edes katsoa lähdekoodin kääntäjä
nähdä, mikä on väärin.
>> Sinun täytyy tarkastella koneen koodia, todellinen binary ja
koonnut kääntäjä nähdä, odota, nämä riviä koodia ei pitäisi olla täällä.
Mutta Ken Thompson otti sen askeleen pidemmälle ja sanoi hyvin, on
näitä erityisiä ohjelmia, jotka todella auttaa sinua lukemaan binary ohjelmien,
ja niin jos joku käyttää kyseisen ohjelman lukea binary, he näkisivät nämä
riviä koodia.
Hän muutettu näiden ohjelmien sanoa, kaikki oikea, jos etsit
kääntäjä, älä näytä tätä erityistä asennuspaketit saadaan mahtumaan.
>> Niin sitten sinun täytyy ottaa se askel edelleen ja periaatteessa, joilla voi olla
otettu useita tasoja välillisen, ja jossain vaiheessa, kukaan ei oikeastaan
aiotaan tarkistaa.
Joten Tarinan on, olet aio olla kirjallisesti
Kalahtaa tässä luokassa.
Aiot käyttää kiipeily Kalahtaa paljon tässä luokassa.
Kaikki tiedätte, kalahtaa on ilkeä ohjelma, joka on sabotoi jokainen
yksi ohjelma olet koskaan koottu.
Ja jättää sinut, että hyvin huolestuttavana Huomioithan, nähdään keskiviikkona.
>> [APPLAUSE]
>> SPEAKER 2: Seuraavalla CS50.
>> SPEAKER 3: Etkö uskalla sanoa.
Voit tehdä tämän.
Olet tehnyt tätä ennen, voit tehdä tämän tänään, voit tehdä tämän huomenna.
Olet tehnyt tätä jo vuosia.
Vain mennä sinne ja tehdä tämän.
Voit tehdä tämän.
>> [Musiikki soi]