[Muusika mängib] ROB Boden: Olgu. Niisiis, esimene asi, esimene video alates tuttav nägu. [VIDEO PLAYBACK] Olgu. See on CS50, ja see on alguse nädal kolm. Vabandust, et ma ei saa olla koos teiega täna, kuid lubage mul tutvustada CS50 enda Rob Boden. [END VIDEO PLAYBACK] [APLAUS JA Terviseks] ROB Boden: filmograafia sisse et video on fantastiline. Hea küll. Nii et esimene, seal on teine ​​lõuna. See on homme kell 01:15. Pole lunch see reede. On koos Quora. Ja Tommy pole siin veel, aga üks inimesed on endine juht CF, Tommy McWilliam. Nii et ta on tore poiss. Sa peaksid tulema. Hea küll. Nii eelmisel nädalal alustasime murdumas mida string tegelikult on. Me oleme tuntud juba algusest peale, et see märgijada. Kuid eelmisel nädalal, me süvenes asjaolu seda, mis on tegelikult jada tegelased, samuti on meil nüüd massiive tähemärki. Ja me teame, et string on massiiv märke, päris lõpus, meil see eriline null byte, see kurakriips 0, mis näitab, et lõpuks string. Ja nii string on massiiv märki, kuid meil on rohkem kui lihtsalt massiivi tähtedega saame massiivi iga tüüpi asi, mida me soovime. Niisiis, kui te mäletate eelmisel nädalal Ages programmi, David tutvustas tõesti kiiresti. Nii et esimene asi, mida me teeme, on küsi kasutaja täisarv, inimeste arvu ruumis. Kui meil on see täisarv, me kuulutab massiivi. Pange tähele, see sulg süntaks. Sa lähed harjuda. Nii et me kuulutab massiivi täisarvud kutsus vanuses ja on n täisarvu massiivi. Nii et see muster siin, see 4 int i on 0, i on väiksem kui n, i pluss pluss, et on ka saab olema mudel et sa saad väga harjunud. Kuna see on päris palju, kuidas sa oled alati saab Käi massiivid. Seega pidage meeles, et n on pikkus meie massiivi. Ja siin me oleme korduvalt esitanud vanusele isikule i ruumis. Pärast seda, kui me minna alla ja võtta mis tahes suvalise põhjusel me siis printida, kui vanad nad lähevad olema aasta pärast. Ja töötab see programm, olgem teha vanuses dot kaldkriipsuga aegade. Nii inimeste arvu ruumis, Ütleme et on kolm. Ja öelda, esimene inimene, kes on 13, järgmine on 26, ja viimane on 30. Nii siis ma Käi need kolm inimesed, printida välja 14, 27, ja 31. Seega pidage meeles, et kui me tunnistada massiivi suurusest n, indeksid, mis massiiv, massiivi väärtusi ja indeksid 0, 1, 2, kõik viis kuni n miinus 1. Nii et kui me ütlesime, oli kolm inimest ruumis, ja me paneme siia esimese iteratsiooni kaudu loop, i saab olema 0. Nii indeks 0. Oleme määrates esimese vanusest kasutaja sisestab. Siis järgmise üks, me sisenemist teine ​​n kasutaja sisestab ja Järgmise kahe, viimane n. Nii teate, et massiivi suurus kolm ei ole midagi indeksis kolm. See ei ole õige. Hea küll. Nii, minnes tagasi siin. Nüüd, kui oleme tegelenud massiivid meil on mõned tuttavad. Nüüd me ei kavatse liikuda käsk argumente, mis saab olema päris oluline selle probleemi komplekt. Seega seni, kui olete tunnistada oma põhifunktsiooni, oleme ütles int main tühine. Nii void lihtsalt tähendab, et me ei paneks ühtegi argumente selle funktsiooni. Nüüd me näeme, et peamine võib võtta mõned argumendid. Siin me kutsume neid int argc ja string argv sulgudes. Sulgudes jällegi näitab et me tegeleme massiivid. Nii et siin, string argv sulgudes, me oleme tegelevad massiivi stringe. Nii argc, et läheb näidata kui palju argumente me oleme läbinud selle programmi. Ja näha, mida see tähendab, Paneme selle. OK. Nii siiani oleme joosta iga programmi nagu dot kaldkriipsuga aegade. Saame ka, mida käsurea, varem edasi argumendid, seega perspektiivis käsk argumente. Nii et esimene argument, tere. Nii et siin, argc oleks kolm. See arv on argumendid at käsureal. Argc on alati vähemalt 1, kuna täpp kaldkriips vanuses ise, loeb üks käsurea argumente. Siis tere on esimene. Kui dot kaldkriipsuga vanuses on nullis, siis Tema on esimene ja maailm teine ​​käsurea argument. Nii string argv, me näeme, sisaldab stringid, dot kaldkriipsuga vanuses, tere ja maailma. Ja Taaveti palve, me mängida video sisse, et. [VIDEO PLAYBACK] -Siiani programmides me oleme kirjutanud, oleme kuulutada Peamine nagu int main tühine. Ja kõik see aeg, et tühine on lihtsalt on täpsustada, et programm ei võta käsurea argumente. Teisisõnu, kui kasutaja käivitab programmi, siis ta võib anda käsk argumente kirjutades täiendavaid sõnad või fraasid pärast programmi nimi käsureale. Noh, kui sa tahad oma programmi võtab käsurea argumente, ühe või rohkem selliseid sõnu, peame asendama tühine paar argumenti. Teeme seda. Kaasa CS50.h. Kaasa standard io.h. Int main. Ja nüüd, selle asemel void, ma lähen täpsustada int nimega argc ja massiivi stringe kutsutakse argv. Nüüd argc ja argv on lihtsalt konventsioonidega. Võinuks me neid argumente Kõige midagi tahame. Aga oluline on see, et argc on int kuna määratlusest, on läheb sisaldama argument loota, Sõnade arv kokku, et kasutaja on kirjutate tema kiire. argv, vahepeal argument vektor on läheb tegelikult array ladustamiseks kõik need sõnad, mis on kasutajal kirjutate tema kiire. Lähme edasi teha midagi nüüd ühe või enama nimetatud käsurea argumente. Eriti, lähme edasi ja print mis iganes sõna kasutaja liigid pärast programmi nimi käsureale. Sulg. Sulg. Printf protsenti s kurakriips ja koma. Ja nüüd ma pean ütlema printf millist väärtust pistik, et kohatäide. Ma tahan, et esimene sõna, mis on kasutajal tipitud pärast programmi nimi, ja nii ma lähen täpsustada argv bracket 1 lähedal sulgudes semikooloniga. Nüüd, miks osad 1 ja mitte sulg 0? Noh, tuli välja, salvestatakse automaatselt aastal argv 0 saab olema Programmi tegelik nimi. Nii et esimene sõna, et kasutaja tüübid pärast programmi nimi on, mida Tavapäraselt läheb salvestatud argv 1. Olgem nüüd koguda ja käivitada see programm. Tee argv 0, dot kaldkriipsuga argv 0. Ja nüüd sõna nagu tere. Enter. Ja seal on meil siis, tere. [END VIDEO PLAYBACK] ROB Boden: Olgu. Sulgege see. Nii võttes pilk, et programm, mis me lihtsalt tutvustas meile hästi, lihtsalt näidata, kui me printida argv 0, teha, nüüd Mis on see, argv 0, dot kaldkriipsuga argv 0. Niisiis, nagu oodati, et see prindib välja Programmi nimi, sest argv 0 on alati saab olema Programmi nimetus. Aga teeme midagi veidi huvitavamaks. Nii et probleem komplekti, saate tutvustatakse seda funktsiooni, atoi. Niisiis, mida me kasutame atoi eest? See saab teisendada string täisarv. Nii et kui ma pass string, üks, kaks, kolm, et atoi, et vilja, et täisarvuni, üks, kaks, kolm. Nii et me ei kavatse muuta esimese käsureaargumenti täisarv, ja siis lihtsalt printida, et täisarv. Ühesõnaga, me oleme omamoodi reimplementing getint, lihtsalt täisarv sisestatakse käsk line asemel programmis interaktiivselt. Niisiis, tegemist argv 0, teeme see siin, ja sulgege see. Nii töötab argv 0 ja olgem sisestada täisarv, üks kaks kolm neli üks kaks. Nii, et see prinditakse täisarv, üks kaks kolm neli üks kaks. Leidub nüansid et atoi et See peatab hooliv midagi kaugemale kehtiv numbrist, kuid see ei ole oluline. Mis sa arvad, juhtub kui ma seda teen? Segmenteerimine süü. Miks see nii on? Kui te vaatate tagasi meie programmi me oleme konverteeriva argv 1 esimene argument pärast programmi nimi, et täisarv. Aga ei ole argument vastu pärast programmi nimi. Nii et siin me näeme, et see on lollakas programm, sest kui me üritame seda juhtida ilma argumente, see lihtsalt krahhi. Nii üks ühine muster näete on midagi, kui argc on vähem kui kaks, mis näitab, et seal ei olnud vähemalt programmi nimi ja Esimene argument, siis me teeme midagi nagu printf, ei piisa käsurea argumente. See ilmselt ei ole hea printida, see on ilmselt midagi, nagu tuleb sisestada täisarv at käsureal. Ma lihtsalt lõpetada seal. Ja siis tagasi 1. Nii mäleta et meie lõpp programm, kui me tagasi 0, et mingisugune näitab edu. Ja peamine ka automaatselt 0, kui sa seda ei tee. Nii et siin me oleme virittämistä 1 näitamiseks et see ei ole edu. Ja siis saad tagasi, mida tahad, lihtsalt, 0 näitab, edu ja midagi näitab riket. Teeme käivitada versioon asjad. Nüüd, kui me ei sisesta käsurida argument, siis see õigesti öelda meile ei piisa käsurea. Ei lõpeta lause. Sest kui me tegelikult andke seda üks, see võib programm lõpule viia. Nii see on, kuidas sa kasutad argc sisse et kontrollida arvu käsurea argumente, mis antakse tegelikult edasi. Seega teeme seda programmi veidi rohkem keeruline, ja pilk teine iteratsiooni asju. Nüüd, me mitte ainult printimist kõigepealt käsurea argument. Siin me iterating alates int i võrdsete 0, i on väiksem kui argc, i pluss pluss, ja trükkimine argv, indeks i. Nii et see muster jällegi see on sama mustriga nagu enne, välja arvatud asemel helistaja muutuja n, mida me kasutame argc. Nii et see on iterating üle iga indeks massiivi ning iga printimist element selles massiivis. Ja nii, kui võtame selle programmi, noh, Ma ei sisestanud ühtegi käsurida argumente, nii see lihtsalt pildid programmi nimi. Kui ma sisestada hunnik asju, siis see printida üks iga oma rida. OK. Võtame selle ühe sammu edasi. Ja printimise asemel iga argument oma rida, lähme printida iga märgi iga argument oma rida. Seega pidage meeles, et argv on massiivi stringe. Mis on string, kuid array tähemärki? See tähendab, et argv on tõesti array array tähemärki. Nii ära, et eirame seda nüüd. Lihtsalt kaaluma string argv 0. Nii et kui me tahame, et tuua iga iseloomu argv 0 omal rida, siis ma tahan teha muster me oleme harjunud, i väiksem pikkus massiivi mis siin on strlen kohta, mis on mitte seda, mida ma tahan teha, string s võrdub argv 0. Niisiis i on väiksem kui pikkus meie massiiv, mis antud juhul on massiiv märke, i pluss pluss. Ja nii, nagu me nägime eelmisel nädalal, see on ideaalne kui astume et strlen väljaspool seisundi, kuna n on plaanis lisada strlen s iga kord kui läheme silmusest läbi, ja see on ei kavatse olla muutuv. Nii me seada võrdne n siia. OK. Nüüd, me iterating üle iga indeks array. Ja nii, kui me tahame, et printida iga märk, et massiivi protsenti c on lipu tahame kasutada jaoks märke. Ja nüüd sulg i saab olema string, indeks iseloomu i, nii et kui string oli tere. siis s 0 saab olema h, s sulg 1 on e, ja nii edasi. Nüüd me tahame ühendada need kaks asja. Me tahame, et trükkida iga märk iga käsurea argument. Nii et me ei kavatse olla nested loop. Ja tavaliselt esimene counter on i, järgmine saab olema j, n on strlen of argv i, i on väiksem kui n, i pluss pluss. Ja nüüd selle asemel trükkida argv i nii, argv sulg i läheb index - et see saab olema i-nda käsurea argument, argv i, j läheb olema nda iseloomu i-nda argumendi. Ma vabaneda sellest siin nüüd kuna me seda ellu, et loop. Nii vastab string s võrdsete argv i ja siis s sulg j. Noh, meil ei ole vaja deklareerida Selle muutuja s. Selle asemel, me lihtsalt ühendada need kahe sisse, mis meil oli, ARGV i, j. SPEAKER 1: [kuuldamatu]. ROB Boden: Hea kõne. Nii et see on katki. Kui ma tegelikult jooksis ta, oleksime on seda mõistnud. Nii counter hoolin Käesoleva eelkõige silmus on j, iteraatoris. Nii et sa oleks sattunud küsimusi ilmselt lõputu silmuse, kui me ei olnud fikseeritud, et. Sellepärast me ka räägime umbes silumine täna. OK. Teeme programmi käivitada. Ja olgem tegelikult lisada eraldi printf siin, et lihtsalt printida teine ​​rida, sest see tähendab, et kui me käivitada programmi, siis tuleb tühi line vahel iga iseloomu iga käsurea argument. Noh, eks me näeme, mida see tähendab. OOP. Sain mõned bug. Viga vaikimisi kuulutatakse raamatukogu funktsioon strlen. Nii läheb tagasi meie programmi I unustasin hash sisaldama string. Nii string.h saab olema päisefailist mis kinnitab funktsioon strlen. OK, see on koondatud. Nüüd saab kasutada seda. Nii lihtsalt see. See saab välja printida meie Programmi nimi, tere. See saab printida iga asi, iga iseloomu, on oma rida. OK. Nii et tegelikult on seda üks samm edasi. Ja selle asemel string, olgem mõtle, kui me rakendada oma strlen funktsioon. Nii et ma kohe annan funktsioon allkirja. Teeme kõne my_strlen, ja see on kavatseme stringi argument, ja me ootame, et naasta pikkus, et string. Nii, kus see kutt? Jah. OK. Nii mäletan varasemast slaidile oli ka eelmisel nädalal, et array tähemärki hästi, string, ütleme, et see on meie string s. Nii et kui te ei string, tere siis H-E-L-L-O, mälu, mis läheb olema, ja siis see kurakriips 0 iseloomu. Niisiis, kuidas me saame pikkus s? Trikk on otsinud seda loks 0 iseloomu, see null terminaator. Nii algoritmi läheb olema näiteks mõne piisavalt märke, mis - ajame selle poolt on mõningad counter, olgem nimetame seda int pikkus. Niisiis, alates siin, me oleme läheb Käi meie string. Nii et esimene märk, see on H, ja see ei ole tagurpidi kaldkriipsu 0, seega pikkus on 1. Käi järgmine sümbol, E, ja see ei ole Längkriipsu 0. Pikkus on 2. L, 3. L, 4. O, 5. Ja lõpuks jõuame kurakriips 0, ja nii, et vahend, noh, Selle stringi üle. Teeme tagasi 5. Nii tegelikult rakendatakse, et esiteks minu n pikkus võrdub 0, minu paremal käel. Ja me ei kavatse kinnitada, - SPEAKER 1: [kuuldamatu] ROB Boden: Oh, tulistada. Hea kõne. Boom. Nii n pikkus on 0. Nüüd, kui te pikkus ei võrdne ja siis kurakriips 0. Seega pidage meeles, see kurakriips 0, siis on tegelikku olemust, ja see näitab, stringi lõpuni. Just nagu ka kurakriips n on tegelik iseloom. Längkriipsu 0 läheb näidata lõpuks meie string. Ma ei taha panna, et on olemas. Ja kui te indekseeritud pikkus ei ole võrdne null terminaator, siis me lihtsalt juurdekasvu pikkus. Niisiis, lõpus meie programmi pikkus on lõpuks läheb olema 5 antud juhul. Ja me lihtsalt tagasi pikkus. OK. Nüüd siin, ma ei teha my_strlen. Olgem kompileerida veenduda kõik jookseb sujuvalt. Kas ma teen 2? Või oli see 1? See peaks seda tegema. Hea küll. Nii et see on argv 2. Töötab nii nagu oodatud, kuigi oli see, et üks ma tegin seda? Jah. OK. See versioon asjad ei ole printf uus liin pärast, kuid see ei tee mingit vahet. OK. Nii töötas ootuspäraselt. Nüüd saame isegi ühendada see üks samm kaugemale, kui teade siit, noh, Esiteks me haarates strlen of argv i, ja siis me iterating üle iga märk, et string. Selle asemel, et teeme seda, mis siis, kui me lihtsalt ühendada see loogika ootab kuni me hit kurakriips 0 õigus sellesse kohta loop? Nii itereerima samas argv i, j ei ei võrdu kurakriips 0. Teeme kestab see esimene. Hea küll. Nii et siin, see tingimus on öelda - olgem selge, et. Nüüd, see olgu meie argv. Nii et kui ma jooksin, et programm enne, argv on massiivi stringe. Ja nii, kui ma saan seda dot kaldkriipsuga argv 2, tere, siis argv iseenesest on pikkus 3 jaoks argv null, tere ja maailma. Ja sees kummagi indeksid on ise massiiv, kus see saab olema dot, see saab olema kaldkriips, ma ei tea kui see oli õiges suunas, I ei usu, et see oli. -R-V kriips, on vaja rohkem ruumi. Olgem lõigatakse see massiiv. -R-V kriips 0 ja seejärel kurakriips 0. Ja siis koristamata on tere. Oletame, H-E kurakriips 0. Ja lõpuks, W-O kurakriips 0. Nii algoritm, et me lihtsalt kirjutas, nested jaoks silmuseid, mida nad teeme, peame me ennekõike võidelda i ja siis j. See oleks lihtsam koodi ekraan, Lähme tagasi selle. OK. Nii teate, et ma ei iteraatoris see iterating üle iga käsk line argument. Ja j on iteraatoris iterating üle iga märk, et käsurea argument. Nii et mida see sisemine printf teeb on meil printf argv 0 0 printf argv 0 1 printf argv 0 2 0 3 0 4 0 5 0 6, kuid nüüd, argv 0 7 läheb võrdne kurakriips 0. Siis me väljuda, et loop, ja nüüd ma korratakse kuni 1. Ja nüüd me läheme print argv 1 0, argv 1 1 - Noh, kuna ma lõikasin hello lühike, argv 1 2 taas läheb kurakriips 0. Ja nii juurdekasvu i ja jätkata ja nii edasi, kuni me välja printida kõik maailmas, ja need on kolm käsurea argumente ja me väljuda äärepoolseimate loop, ja lõpeta meie programm. OK. Teeme siia tagasi tulla. Nii saate omandada mõned tuttavad käsurea argumente selle eriti lahendamist. Nüüd, silumine. Nii siis ilmselt on juba pidanud tegema mõned silumine oma eelmist lahendamist. Ja üks väga lihtne viis silumine, Esiteks vaatame lollakas programmi. Noh, jalgsi läbi selle programmi, me küsida kasutaja täisarv, ostke et täisarv, ja siis, omavoliliselt on meil samas silmus, mis lihtsalt läheb kahandab i kuni see on võrdne 10. Oletame, et ma sisenemist täisarv suurem kui 10. Nii kahandab i kuni see on võrdne 10. Ja siis on meil veel kuigi loop et kuigi ma ei ole võrdne 0, me oleme läheb kahandab i poolt 3. Nii et kui näete kavatsuste bug siin on see, et see siis kahandab I olema 10 ja siis kui silmus dekremendi i 10, 7, 4, 1, Negatiivse 2, negatiivsete 5, ja nii edasi, negatiivne lõpmatus, sest ma tegelikult kunagi võrdne 0. Ja siis lõpuks on see programm, meil foo funktsioon, mis on toimub välja printida, et i. Nii et see on lühike ja väga väikese programmi ja viga on ilmne, eriti kui ma lihtsalt räägitakse, mis viga oli. Aga tahtlus siin on, noh, see võiks tegelikult välja näeb mõne oma lahendusi ahne viimasest lahendamist, ja võib-olla sa ei pea mõned lõputult oma programmi, ja sul pole aimugi, Mis põhjustab seda. Nii väga kasulik silumine tehnika on lihtsalt lisada printfs kogu oma koodi. Nii et siin ma tahan printf väljaspool Esimene samas silmus. Ja siin ma tahan printf, ja ma lihtsalt printida i. Ma isegi ei esimene samas silmus, i. Õues, teine ​​samas silmus. Taas printida sees siit väärtus i. Ja olgem käivitada. Nii dot kaldkriipsuga siluda. Sisestage täisarv. Teeme 13. Ja buumi. Me näeme, et meil on lõpmatu silmukoiminen sees teise samas silmus. Nüüd me teame, mis viga on. Aga printf silumine on täiesti suurepärane, aga kui teie programmi saada pikem ja keerulisem on keerukamaid lahendusi saada asjad töötavad. Teeme kõrvaldada kõik need printfs. Ja olgem veendumaks, et ma ei teinud seda midagi katki. OK. Nii programmi me tutvustada nimetatakse GDB, GNU siluri. Noh, tegelikult, olgem eemaldada silumise jaoks teine, ja teha silumise uuesti. Noh, tegelikult esimene, hea õppetund käsurea argumente. Pange tähele, et see rõkkama käsk, mis on koostamise kõik on möödas käsurida, need käsurea argumente. Niisiis, kuidas täpselt ei kavatse olla kasutades käsurea argumente, nagu me oli enne, ja kui te sisse Erksa 2, mis on, kuidas rõkkama kasutab neid. Nii teate, et see esimene lipp, kriips ggdb3, mida see ütleb on, rõkkama, sa peaksid koostama selle faili tahtlus, et me lõpuks vaja siluda ta. Nii kaua, kui teil on, et lipp, siis saame GDB siluda. Ja see saab avada GNU siluri. Seega on palju käske et teil on vaja harjuda. Esiteks üks, mis teil ilmselt kohe on vaja joosta. Niisiis, mida juhivad teha kavatsed? See saab alustada oma programmi. Nii kestab, alates programmi, küsib meilt täisarv, 13. Ja siis on see lõpmatu silmukoiminen kui eeldatakse, välja arvatud I eemaldatud printfs, et me isegi ei näe seda. Lahkutakse tavaliselt. Oh. On võimalik, et see on pakitud kõik teistpidi tagasi - ignoreerides seda. Oletame, et tal ei väljuda tavaliselt. On keeruline vastust. Nüüd, see ei ole väga kasulik. Nii lihtsalt töötab meie programmi sees see siluri ei aita meid igal Muide, kuna me oleks lihtsalt teha dot kärpida siluda välistest GDB. Nii üks käsk, mis Sa ilmselt - ja ma lõpetan selle. Kontroll-d või sulgeda, nii töö. Teeme avada see uuesti. Teine käsk, mis on teil tõenäoliselt kohe taha harjuda ei Break. Nii et me murrame peamiste nüüd, ja siis ma seletan seda. Noh, siin näeme me seada murdepunkti selles rida debug.c. Mis siis break tähendab, et kui ma kirjuta run programm läheb jätkab sõitu kuni I hit murdepunkti. Nii et kui ma tabanud perspektiivis programm käivitub, ja siis see puruneb, niipea kui see siseneb põhiülesanne. Break peamine saab olema midagi sa päris sageli teha. Ja nüüd, et tutvustada teile et mõned käsud. Pange tähele siin, et see on selge, et me purunesid liin 11, mis on printf sisestada täisarv. Nii käsk Järgmine saab olema, kuidas me minna järgmisele rida koodi. See läheb meile võimaluse astuda meie programmi rida-realt. Nii et järgmine. Nüüd joon 12, me saada täisarv. Next. Ja kui sa lihtsalt vajuta Enter uuesti, siis see Redo viimane asi, mida tegin. Nii et ma ei pea kirjutama Järgmine iga kord. Nii sisestada täisarv, 13. Nüüd, joon 14, kui i on suurem kui 10, ja ma teen järgmine. Ja me näeme, et me läheme kahandab i. Nii et me läheme kahandab i uuesti. Nüüd, teise kasulik käsk Prindi. Nii Print läheb välja trükkida väärtus muutuja. Toome välja väärtus muutuja i. Olgem printida i. See saab öelda, et ma ei 11. Nüüd Järgmine kord, kui i on suurem kui 10. Nii et ma ikkagi suurem kui 10, kuna see on 11. i miinus miinus. Olgem printida i uuesti. Nagu oodatud, on 10. Nüüd kõrval. See läheb tagasi tingimusel, i suurem kui 10, kuid mul on nüüd 10, nii et see ei ole suurem kui 10, nii et ootame see kukkuda samas silmus. Ja nüüd me oleme allpool seda rida koodi. Ja teine ​​käsk List, lihtsalt läheb kuvada eelmise ja järgmise paar rida koodi, on Kui sa kaotasid ise. Nii et me lihtsalt lahkus see samas loop, ja nüüd oleme jõudnud selle samas loop, joon 18. Niisiis, kui ma ei võrdu 0. Ja seejärel, i võrdub i miinus 3, ja me teate, see muudkui läheb. Ja meil on võimalik printida i. Iga käsu omamoodi on otseteed. Seega p on lühike Print. Seega saame p i. Pea kellel n, või hoida seda Next. Trüki i uuesti. Näed nüüd on see negatiivne 167. Nii see läheb igavesti, kuid mitte tõesti igavesti, sest sa lihtsalt nägin seda tegelikult lõpeb mingil ajahetkel. Nii et on hakanud GDB. Aga teeme ühe asja GDB. Uh, siluda. Niisiis, sel juhul, lõputu silmuse juhtus olema sees põhiülesanne. Ja nüüd, ainult nõustuda, et ma olen kavatse minna lõputult sisse foo funktsioon. Lihtsalt meeles pidada, et lõpus seda programm, noh, see oli algselt kutsudes suva, mis oli lihtsalt trükkimineku i. Aga nüüd me kutsudes suva, mis on läheb kahandab i kuni see on 0, ja seejärel printida, et muutuja. OK. Säästa seda. Tee siluda. Ja nüüd, gdb siluda. OK. Seega kui ma joosta siis ma ei kavatse saab tegelikult läbiastumise minu programmi rida-realt. Teeme poolita peamine, ja siis kirjuta perspektiivis. Nii et minge läbi selle, printf, sisestage täisarv, saada täisarv, 13. Nii et me hoida decrementing kuni i on suurem kui 10. Siis me läbi kukkuda samas loop, ja saada liin - olgem selle avada eraldi aknas. Nii me decremented kuni ma ei olnud enam suurem kui 10 ja siis nimetatakse funktsiooni foo. Mis siis juhtus nii kiiresti kui ma tabanud funktsioon suva, noh, ma helistasin suva, ja siis ei pidanud ma enam üle GDB. Seega niipea, kui ma tabanud Next selles rida, asjad jätkata kuni see juhtus, kus programmi väljuda - eeldada, et see ei olnud lõpuks. Sa nägid seda pausi natuke küll. Nii et miks ma kaotan kontrolli programm sel hetkel? Noh, kui ma tüüp kõrval, mis läheb sõnasõnaline järgmine rida koodi mis täidab. Nii et pärast rida 21, siis järgmine rida koodi võttev on line 22, mis on väljuva peamine. Nii et ma ei taha lihtsalt minna Järgmise koodirida. Ma tahan minna funktsioon, foo, ja siis ka sammult läbi nende rida koodi. Nii, et meil on alternatiiv. Olgem quit uuesti. Break peamine. Uh, 1, järgmine, järgmine, 13, järgmine, Järgmine, järgmine, hoolikalt, enne kui me tabanud rida suva. OK. Nüüd, me oleme real 21, kui me kutsume suva. Me ei taha, et järgmisena, sest see lihtsalt helistada funktsiooni foo ja minna järgmisele rida koodi. Mida me tahame kasutada, on samm. Nii et seal on vahe etapp ja Next, kus Step astub toimida ja Järgmine läheb üle funktsioon. See lihtsalt täidab kogu funktsioon ja peab minema. Nii samm läheb toob meile arvesse funktsiooni foo. Ja me näeme siin, nüüd oleme tagasi see samas silmus, mis on teoreetiliselt jätkub igavesti. Ja kui vajutad etapp, kui see ei ole isegi funktsioon helistada, siis on identne Next. Nii et see on ainult siis, kui sa oled line, et nõuab funktsiooni, et sammu läheb erineda Next. Nii samm viib meid siia. Samm, samm, samm, samm, samm, samm, ja Me lihtsalt lõputult igavesti. Nii võite harjuda, et teie välja selgitada lõpmatu silmad, on lihtsalt hoides seda sisestusklahvi vaata, kui te jänni. On paremaid viise seda teha, kuid nüüd, see on täiesti piisav. Ja stiililiselt, et need vastaksid Style 50, ma oleks seda teinud. OK. Nii et üks viimase käsu tutvustada. Noh, gdb siluda sisse Selle asemel, et murda juures peamine, kui ma tean foo funktsioon on ka probleem, siis ma oleks lihtsalt ütles, poolita foo asemel. Ütleme, et ma murdumine nii põhi-ja foo. Niisiis saab nii palju murdepunktid kui soovite. Kui ma kirjutada perspektiivis, siis läheb peatuma - ooh, lähme kompileerida, sest Muutsin asju. Näete seda joont, Hoiatus, allikas fail on hilisemad kui käivitatav. See tähendab, et ma lihtsalt läksin siin ja muuta need vastavaks, Style 50, aga ma ei kompileeri programmi. Nii GDB paneb mind teadlikud. Ma lahkun, teha silumise jälle hit gdb siluda. OK. Nüüd, tagasi, mida ma tegin. Break peamine, break suva. Nüüd, kui ma käivitada programmi, nii et see on jätkub kuni tabamust murdepunkti. See murdepunkti juhtub olla esimene juures peamine. Nüüd, selle asemel et teha järgmine, järgmine, järgmine, Järgmine, järgmine, kuni ma tabanud suva, ma tippida jätkata, mis jätkab kuni vajutad taas murdepunkti. Ma pean sisestama täisarv esimene. Jätka jätkub kuni I hit Järgmine murdepunkti, mis seisneb selles, et funktsiooni foo. Nii Run kestab kuni vajutad murdepunkt, aga sa ainult kirjutad käivitumise sa oled hakanud programmi ja seejärel sellest ajast alates, see jätkub. Kui ma just tegin murda põhi-ja siis jooksis see murran juures Peamine ja seejärel jätkata. Kuna mul ei ole murdepunkt at suva, sisestada täisarv, siis nüüd olen ei kavatse murda at suva. See lihtsalt läheb lõpmatusse loop kuni seda. OK. Nii et see tutvustus GDB. Sa peaksid kasutama hakata Teie probleem komplekti. See võib olla väga kasulik, selgitada vead. Kui sa tegelikult lihtsalt rida-realt, minge läbi oma kood, ja võrrelda, mida on tegelikult juhtub see, mida te ootate juhtuma, siis on päris raske jäta oma vead. OK. Nii eelmisel nädalal David tõid selle saladus-võtme krüptograafia kraami Esmakordselt kui me ei taha, paroolid lihtsalt hoitakse meie arvuti mõnes tekstifaili, kus keegi ei tule ja lihtsalt selle avada ja lugeda. Ideaalis peaksid nad krüpteeritud mingil moel. Ja Ülesanded 2, siis saad tegelevad üks meetod krüpteerimine või, noh, kaks meetodit, kuid nad ei ole nii suur. Kui sa häkker väljaanne, oled ka läheb tegelevad krüpteerimiseks mõned asjad. Seega küsimus on praegu hästi, isegi kui meil on tugevaim krüpteerimise algoritm maailmas, kui valite eriti halb salasõna, siis on ei aita sind väga palju, sest inimesed on endiselt võimalik, et sellest aru saada. Isegi kui näeme krüptitud string ja tundub jama prügi mis ei tähenda neile midagi, kui nad veel on vaja proovida mõned paroolid et sellest aru saada, siis ei ole väga turvaline. Nii vaadates video, mis teeb sel hetkel. [VIDEO PLAYBACK] -Helmet, sa paharet. Mis toimub? Mida sa teed, et mu tütar? -Lubage mul tutvustada hiilgav noor plastist kirurg dr Phillip Schlotkin suurimaks nina töö mees kogu universum ja Beverly Hills. -Teie Kõrgeausus. -Nina? Ma ei saa aru. Ta oli juba nina. See oli magus kuusteist kohal. -Nr. See ei ole see, mida sa arvad. See on palju, palju hullem. Kui te ei ütle mulle, et air shield dr Schlotkin tahe anna oma tütart tagasi oma vana nina. -Nr. Kust sa selle said? Olgu. Ma ütlen. Ma ütlen. Ei, isa. Ei, sa ei tohi. -Sul on õigus, mu kallis. Ma igatsen su uus nina. Aga ma ei ütle talle, kombinatsioon, ükskõik mida. -Väga hea. Dr Schlotkin, tee oma halvim. Mu rõõm. [Töövahendid teritatud] -Nr. Oota. Oota. Ma ütlen. Ma ütlen. Ma teadsin, et see töötaks. Hea küll. Anna see mulle. -Kombinatsioon on üks. -One. -One. Kaks. Kaks. Kaks. Kolm. Kolm. Kolm. Neli. Neli. Neli. Viis. Viis. Viis. -Nii kombinatsioon on see, kaks, kolm, neli, viis. See on kõige lollim kombinatsioon Ma kunagi kuulnud olen. See on selline asi, idioot oleks oma pagasi. -Tänan teid, teie kõrgeausus. Mida sa tegid? -Keerasin maha seina. -Ei, sa ei teinud seda. Sa välja lülitatud kogu filmi. Ma vist vale nupp. Noh, pane see tagasi. Pane film tagasi. -Jah, sir. Jah, sir. Lähme, Arnold. Tule, Gretchen. Muidugi, sa tead, et ma ikka pean teile arve selle eest. [END VIDEO PLAYBACK] ROB Boden: Olgu. Nüüd, et me oleme juba rääkinud turvalisus mõnes mõttes kena vähe filmi plakat, nii et viimastel päeva, need teemad on NSA järelevalve kõike. See võib olla raske tunne, nagu sa on mingisugune privaatsuse online maailmas, kuigi ma ei saa öelda, sa kõige üksikasjadest PRISM. Nii liigub kaugemale PRISM, me ei kavatse et rääkida, et nüüd mõtle oma sülearvuti. Nii siin, ma tahan minna minu tegelik konto minu väike pingviin. Nii et mul on määratud parool ja et parool, mida tahan, et see oleks. Kuid pidage meeles, et see, mida ma metsaraie sisse, nii et see login kiire, on mõned programmi. See on mingi programm, mis oli kirjutas mõned isik. Ja nii, et inimene, kui nad on eriti pahatahtlikud, võiksid nad on öelnud, kõik korras, nii et kui parool et ma sisestan võrdub minu tegelik parool, või see on võrdne et mingi eriline password - David on fantastiline või midagi - siis lase neid sisse Nii pahatahtlik programmeerija võiks olla juurdepääs kõikidele oma Mac või Windows, või midagi. Nii et ei ole palju muret, sest Ma mõtlen, et see on login programmi mis on tarnitud OS X sadu või tuhandeid inimesi vaadatakse see kood. Ja nii, kui, oma koodi kuskil, siis öelda, kui see string on võrdne võrdsete David on fantastiline, login, siis keegi on saab olema, nagu, oota. See ei ole õige. See ei peaks siin olema. Nii et üks viis, kuidas me asju olema selline turvaline. Aga mõtle isegi programmid mis sa kirjutad. Oletame, et sa kirjutasid login programmi. Nii et see login programmi, mis sa kirjutasid, Nii et ilmselt sa oled hea programmeerija. Sa ei kavatse panna pahatahtlik kui x võrdub võrdub David on fantastiline oma koodi. Aga see programm, mida sa kasutada kompileerida selle programmiga? Midagi rõkkama. Mis siis, kui isik, kes juhtus kirjuta rõkkama eriline ääretule rõkkama midagi, kui ma koostamisel sisene programm, siis sisestage see kood sisse login programm, mis ütleb, et kui x võrdub võrdub David on fantastiline? Nii et mitte päris veel, aga meil on sama asjas, kus rõkkama, noh, tuhandeid, kui mitte tuhandeid inimesed, oleme otsinud rõkkama, on vaatasin oma rida koodi ja ütles: Olgu, pole midagi paha siin. Ilmselt keegi ei tee midagi see pahatahtlik. Aga mis on rõkkama ise, nagu, Mis siis, kui ma kompileerida rõkkama? Mis siis, kui mul on koostaja, et koostab rõkkama mis lisab arvesse rõkkama seda erilist hack, mis ütleb, eks, kui ma kompileerida rõkkama, siis käivitatava saan peaks spetsiaalselt otsima sees login programm ja sisesta Parooli võrdne võrdsete Dave on fantastiline? Seega pidage meeles, et teie tõlkija ise On vaja koostada mingil ajahetkel. Nii et kui see, mida te otsustate koostada rõkkama koos, ise on pahatahtlik, siis võiks keeras kogu viis sätestatakse rida. Nii et siin on meil Ken Thompson ja Dennis Ritchie. Nii et see on ikooniks foto. Dennis Ritchie on õige. Ta on suurte - päris palju kirjutas C. Nii saate Tänan teda selle klassi. Ken Thomson on vasakul. Kaks neist põhiliselt kirjutas UNIX. Noh, need olid peamised toetajad UNIX. Seal olid mõned teised. Nii Ken Thompson, mingil hetkel, ta võidab Turingi auhinna. Ja Turingi auhinna, olen alati kuulnud see viidata sel moel, et see on Nobeli arvutiteadus. Nii et Turingi auhinna, peab ta anda oma tänukõnes. Ja ta annab see väga kuulsa kõne nüüd nimega Mõtteid usaldamine Trust, mis me oleme seotud et kursuse kodulehel. Ja selles kõnes ütleb ta, et kõik on korras, Ma kirjutasin UNIX, ja nüüd on kõik te inimesed kasutavad UNIX. Nüüd, pea meeles, täna, et Linux on otsene järeltulija UNIX. OS X otse kasutab UNIX. Windows ei ole nii palju, kuid palju ideid võeti UNIX. Nii ta läheb kuni lavale ja ütleb, Olgu, ma kirjutasin UNIX. Ja just nii, et te teate, ma olen sisse logida iga ühe ühes arvutis. Kuna panin mõnda nendest spetsiaalseid kui x võrdub võrdub Ken Thomson on fantastiline, siis mul on lubatud sisse logida. Nii et inimesed on nagu, noh, Kuidas sa seda tegid? Vaatasime login programmi ja midagi on seal. Ta on nagu, noh, ma muutsin koostaja sisse login programmi nii et login programmi nüüd on et x võrdub võrdub Ken Thompson on fantastiline. Ja nad ütlevad, noh, see pole tõsi. Otsime koostaja ja kompilaator ei ole mingit rida kood niimoodi. Ta on nagu OK, aga mida sa koostamise kompilaator? Ja nad arvavad, ja ta on nagu hästi, Mina olen see, kes andis sulle koostaja te kasutate kompileerida koostaja, nii kompileerid koostaja, et ise on pahatahtlik ning peavad murda login programmi. Ühesõnaga, sel hetkel, seal on no kuidas sa võiksid vaadata allikat kood sisselogimisprogrammi et näha, mis on valesti. Sa isegi ei vaata lähtekoodi kompilaator et näha, mis on valesti. Sa oleks vaja vaadata masin kood, tegelik binaarne kohta koostatud kogumiku koostaja, et näha, oota, need rida koodi ei tohiks siin olla. Aga Ken Thompson oli see üks samm edasi ja ütles ka, seal on neid erilisi programme, mis tegelikult aitab teil lugeda binaarne programmide ja nii kui keegi kasutada, et programmi loe binaarne, nad näeksid neid rida koodi. Ta muudeti nende programmide öelda, kõik Hästi, kui te vaatate koostaja, ei näita seda eriti kogum binaarne. Siis pead võtma, et sammu edasi ja põhimõtteliselt, millel võib olla võtta mitmel tasandil indirection, ning mingil hetkel, keegi on tegelikult saab olema kontroll. Nii loo moraal on, et sa oled ei kavatse kirjalikult Rõkkama selles klassis. Sa kavatsed kasutada ronimine Rõkkama palju selles klassis. Sest kõik, mida tean, rõkkama on pahatahtlik programm, mis on tühjaks iga ühe programmi olete kunagi koostatud. Ja jäta sind sellel väga pahaendeline tähele, näeme kolmapäeval. [APLAUS] SPEAKER 2: Järgmisel CS50. SPEAKER 3: Kas sa ei julge öelda. Sa suudad seda. Sa oled seda varem teinud, siis saad seda teha täna, siis saad seda teha homme. Sa oled teinud seda juba aastaid. Lihtsalt mine sinna ja tee seda. Sa suudad seda. [Muusika mängib]