[Music kucheza] Rob BODEN: All wa kulia. Kwa hiyo, jambo la kwanza kwanza, video kutoka uso ukoo. [Video avspelning] -All haki. Hii ni CS50, na hii ni mwanzo wa wiki tatu. Samahani sikuweza kuwa pamoja nanyi huko leo, lakini naomba kuanzisha CS50 ya mwenyewe Rob Boden. [Mwisho video avspelning] [Makofi na Cheers] Rob BODEN: Filamu katika kwamba video ni ajabu. Sawa. Hivyo kwanza, kuna mwingine chakula cha mchana. Ni kesho saa 1:15. Hakuna chakula cha mchana ni Ijumaa hii. Ni kwa Quora. Na Tommy si hapa bado, lakini moja ya watu huko mkuu wa zamani wa CF ni, Tommy McWilliam. Hivyo yeye guy furaha. Unapaswa kuja. Sawa. Hivyo wiki iliyopita, tulianza kuvunja mbali juu ya nini string kweli ni. Tumekuwa inajulikana tangu mwanzo kwamba ni mlolongo wa wahusika. Lakini wiki iliyopita, sisi delved katika ukweli kwamba ni nini kweli mlolongo wa wahusika, vizuri, sasa tuna arrays ya wahusika. Na tunajua kwamba kamba, ni safu ya wahusika, mwishoni mwa sana, tuna hii null byte maalum, hii backslash 0, inaonyesha kwamba mwisho wa kamba. Na hivyo string ni safu ya wahusika, lakini tunaweza kuwa na zaidi ya tu safu ya wahusika, tunaweza kuwa na safu ya yoyote aina ya kitu tunataka. Hivyo, kama unakumbuka kutoka wiki iliyopita, Umri mpango huo David ilianzisha kweli haraka. Kitu hivyo kwanza sisi ni kwenda kufanya ni kuuliza user kwa integer, idadi ya watu katika chumba hicho. Mara baada ya sisi kuwa na kwamba integer, sisi ni kutangaza safu. Taarifa hii syntax bracket. Wewe ni kwenda kupata kutumika hiyo. Hivyo sisi ni kutangaza safu ya integers aitwaye milele, na kuna n integers katika safu hii. Hivyo hii mfano haki hapa, hii 4 int i ni sawa na 0, i ni chini ya n, i pamoja na pamoja na kwamba pia ni kwenda kuwa mfano kwamba kupata sana kutumika. Kwa sababu hiyo pretty kiasi gani uko daima kwenda iterate juu ya arrays. Ili kukumbuka kwamba n ni urefu wa safu yetu. Na hivyo hapa, sisi ni mara kwa mara kuuliza kwa umri wa mtu i katika chumba hicho. Baada ya hayo, sisi kwenda chini, na kwa chochote sababu kiholela, sisi kisha magazeti nje umri gani wao wanaenda kuwa mwaka kuanzia sasa. Na kuendesha programu kwamba, hebu kufanya milele, dot kufyeka milele. Hivyo idadi ya watu katika chumba, hebu sema huko ni tatu. Na kusema, mtu wa kwanza ni 13, pili ni 26, na mwisho ni 30. Hivyo basi utakuwa iterate juu ya wale watatu watu, magazeti nje 14, 27, na 31. Basi kumbuka kwamba wakati sisi kutangaza safu ya ukubwa n, fahirisi katika safu, safu ina maadili na fahirisi 0, 1, 2, njia yote hadi n minus 1. Hivyo wakati sisi alisema kulikuwa na watu watatu katika chumba, na sisi kuweka katika hapa iteration kwanza kwa njia hii kitanzi, i ni kwenda 0. Hivyo katika index 0. Sisi ni kumshirikisha kwanza umri mtumiaji inaingia. Kisha katika moja ijayo, sisi ni kuingia pili n mtumiaji inaingia, na katika karibu na mbili, n mwisho. Hivyo taarifa kwamba safu ya ukubwa tatu haina chochote katika ripoti tatu. Hii si halali. Sawa. Kwa hiyo, kurejea hapa. Hivyo sasa kwamba tumekuwa kushughulikiwa na arrays, tuna baadhi ya uzoefu. Sasa tunakwenda kuendelea na amri line hoja, ambayo itakuwa ni ya pretty husika na kuweka tatizo hili. Hivyo hadi sasa, wakati wowote wameweza alitangaza kazi yako kuu, tumekuwa alisema int kuu ni batili. Hivyo utupu tu ina maana kwamba sisi si kupita yoyote hoja ya kazi hii. Sasa tunakwenda kuona kwamba kuu wanaweza kuchukua baadhi ya hoja. Hapa sisi kuwaita int argc na kamba mabano argv. mabano, kwa mara nyingine tena, kuonyesha kwamba sisi ni kushughulika na arrays. Hivyo hapa, mabano kamba argv, sisi ni kushughulika na safu ya masharti. Hivyo argc, ambayo inaenda zinaonyesha jinsi hoja nyingi tumekuwa kupita kwa mpango huu. Na kuona kwamba maana yake ni nini, hebu kuifunga. OK. Hivyo hadi sasa, tumekuwa kukimbia kila mpango kama dot kufyeka milele. Tunaweza pia, kwa amri line, siku za nyuma kupita hoja, hivyo neno, amri line hoja. Hivyo hoja ya kwanza, hello dunia. Hivyo hapa, argc itakuwa tatu. Ni hesabu ya hoja katika mstari amri. Argc ni daima angalau 1, tangu dot kufyeka milele, yenyewe, makosa kama moja ya hoja mstari amri. Kisha hujambo ni ya kwanza. Kama dot slash umri ni 0, basi hujambo ni ya kwanza, na dunia ni pili mstari amri hoja. Hivyo kamba argv, tunakwenda kuona, ina masharti, dot slash milele, hello, na dunia. Na, kwa ombi Daudi, tunakwenda kucheza video kuanzisha hiyo. [Video avspelning] -Up mpaka sasa katika programu tumekuwa imeandikwa, tumekuwa kutangaza kuu kama int kuu ni batili. Na muda wote huu, kwamba utupu ina tu kuwa kubainisha kwamba haina mpango wa kuchukua yoyote hoja mstari amri. Kwa maneno mengine, wakati mtumiaji anaendesha mpango, anaweza kutoa amri line hoja kwa kuandika ziada maneno au misemo baada ya mpango wa jina katika haraka. Naam, kama wewe unataka mpango wako kwa kuchukua hoja mstari amri moja au maneno zaidi hiyo, tunahitaji kuchukua nafasi ya utupu na michache ya hoja. Basi hebu kufanya hivyo. Ni pamoja na CS50.h. Pamoja na kiwango io.h. Int kuu. Na sasa, badala ya batili, mimi nina kwenda bayana int aitwaye argc, na safu ya masharti aitwaye argv. Sasa, argc na argv ni tu mikataba. Tunaweza kuitwa hoja hizi wengi chochote tunataka. Lakini jambo muhimu ni kwamba argc ni int kwa sababu, kwa ufafanuzi, ni kwenda vyenye hoja kuhesabu, idadi ya maneno katika jumla kwamba mtumiaji typed katika yake haraka. argv, wakati huo huo, hoja vector, ni kwenda kweli kuwa safu ya kuhifadhi maneno yote kwamba mtumiaji ina typed katika yake haraka. Hebu kuendelea kufanya kitu sasa kwa moja au zaidi ya haya hoja mstari amri. Hasa, hebu kwenda mbele na magazeti chochote neno aina ya mtumiaji baada ya jina mpango wa katika haraka. Open bracket. Karibu bracket. Asilimia printf s backslash na comma. Na sasa mimi haja ya kuwaambia printf thamani nini kuziba ndani ya kwamba placeholder. Nataka neno la kwanza kwamba mtumiaji ina typed baada ya jina mpango huo, na hivyo mimi nina kwenda kwa kutaja argv bracket 1, karibu mabano, semicolon. Sasa, kwa nini bracket 1 na si bracket 0? Naam, ni zamu nje, moja kwa moja kuhifadhiwa katika argv 0 ni kwenda kuwa mpango wa jina halisi. Hivyo neno la kwanza kwamba aina user baada ya jina mpango wa ni, kwa mkataba huo, kwenda kuwa kuhifadhiwa katika argv 1. Hebu sasa kukusanya na kuendesha mpango huu. Kufanya argv 0, dot slash argv 0. Na sasa neno kama hello. Kuingia. Na huko sisi kuwa nayo, hello. [Mwisho video avspelning] Rob BODEN: All wa kulia. Karibu hiyo. Hivyo kuchukua kuangalia katika mpango kwamba sisi tu ilianzisha kwetu, vizuri, kuonyesha, kama sisi magazeti argv 0, kufanya, sasa ni nini, argv 0, dot slash argv 0. Hivyo, kama ilivyotarajiwa, ni uchapishaji nje Jina la mpango, tangu argv 0 ni daima itakuwa jina ya mpango huo. Lakini hebu kufanya kitu a kidogo zaidi ya kuvutia. Hivyo katika kuweka tatizo, wewe utakuwa na kuletwa na kazi hii, atoi. Basi je, sisi kutumia atoi kwa? Hiyo kwenda kubadilisha kamba integer. Basi, ikiwa mimi kupita kamba, moja mbili, tatu, kwa atoi, kwamba utakuwa kubadilisha kwamba kwa integer, moja mbili tatu. Hivyo sisi ni kwenda kubadilisha kwanza amri line hoja ya integer, na kisha tu magazeti kwamba integer. Hivyo kimsingi, sisi ni aina ya reimplementing GetInt, tu integer ni aliingia kwa amri line badala ya katika mpango interactively. Hivyo basi, na kufanya argv 0, hebu kufanya katika hapa, na kuziba hiyo. Hivyo mbio argv 0, na hebu kuingia integer, moja mbili tatu nne moja mbili. Hivyo utakuwa magazeti integer, moja mbili tatu nne moja mbili. Kuna baadhi ya mambo ya siri kwa atoi kwamba kutakuwa na kuacha kujali juu ya kitu chochote zaidi ya halali numeric tabia, lakini hiyo haina jambo. Basi je, unafikiri hutokea kama mimi kufanya hili? Mkato wa kosa. Hivyo ni kwa nini hiyo? Kama ukiangalia nyuma katika mpango wetu, sisi ni kuwabadili argv 1, hoja ya kwanza baada ya jina mpango, integer. Lakini hakuna hoja kupita baada ya jina mpango. Hivyo hapa, sisi kuona kwamba hii ni buggy mpango, tangu, kama sisi kujaribu kuendesha bila hoja yoyote, itakuwa tu ajali. Hivyo lingine mfano wa kawaida utaona ni kitu kama, kama argc ni chini ya miaka miwili, kuonyesha kwamba kulikuwa na si angalau jina mpango na a Hoja ya kwanza, basi tutaweza kufanya kitu kama printf, si ya kutosha hoja mstari amri. Kwamba pengine si moja nzuri ya magazeti, pengine ni kitu, kama unapaswa kuingia integer katika mstari amri. Mimi itabidi mwisho ni huko. Na kisha kurudi 1. Basi kumbuka kwamba mwishoni mwa wetu mpango, kama sisi kurudi 0, kwamba aina ya inaonyesha mafanikio. Na kuu pia moja kwa moja anarudi 0 kama huna. Hivyo hapa, sisi ni retuning 1 zinaonyesha kwamba si mafanikio. Na unaweza kurejea chochote unataka, tu, 0 inaonyesha mafanikio, na kitu kingine chochote inaonyesha kushindwa. Hivyo basi kukimbia version huu wa mambo. Basi sasa, kama hatuwezi kuingia amri line hoja, kutakuwa na usahihi kuwaambia sisi, si ya kutosha mstari amri. Je, si kumaliza adhabu. Mwingine, kama sisi kweli kupita moja, inaweza kukamilisha mpango. Hivyo hii ni jinsi gani kutumia argc katika ili kuhalalisha idadi ya amri line hoja kwamba ni kweli kupita. Basi hebu kufanya mpango huu kidogo zaidi ngumu, na kuangalia pili iteration ya mambo. Basi sasa, sisi siyo kuchapa tu amri ya kwanza line hoja. Hapa, sisi ni iterating kutoka int i usawa 0, i ni chini ya argc, i pamoja na plus, na uchapishaji argv, index i. Hivyo muundo huu, tena, hii ni sawa mfano kama kabla, ila badala wito variable n, sisi ni kutumia argc. Hivyo hii ni iterating juu ya kila index katika safu, na uchapishaji kila hiki katika safu. Na hivyo, wakati sisi kuendesha mpango huu, vizuri, Mimi hakuingia line amri yoyote hoja, hivyo tu prints mpango jina. Kama mimi kuingia rundo la vitu, kutakuwa na magazeti moja, kila juu ya line yake mwenyewe. OK. Basi hebu kuchukua hatua hii moja zaidi. Na badala ya uchapishaji hoja kila juu ya line yake mwenyewe, hebu magazeti ya kila tabia ya hoja kila juu ya line yake mwenyewe. Ili kukumbuka kwamba argv ni safu ya masharti. Kwa hiyo kile ni kamba, lakini safu ya wahusika? Hivyo hiyo ina maana kwamba argv ni kweli safu ya safu ya wahusika. Hivyo kuchukua faida ya kwamba, hebu kupuuza hii kwa sasa. Hebu tu kufikiria kamba argv 0. Hivyo kama tunataka kuleta kila tabia ya argv 0 juu ya line yake mwenyewe, kisha Mimi nataka kufanya mfano sisi ni kutumika, i ni chini ya urefu wa safu, ambayo hapa, ni strlen ya, hiyo ni si nini nataka kufanya, kamba s argv 0 sawa. Hivyo i ni chini ya urefu wetu safu, ambayo katika kesi hii ni safu ya wahusika, i pamoja na plus. Na hivyo, kama tuliona wiki iliyopita, ni bora kama sisi hoja kwamba strlen nje ya hali, tangu n kuwa na kuongeza strlen ya s kila wakati sisi kwenda kwa njia ya kitanzi, na ni si kwenda kuwa kubadilisha. Hivyo tutaweza kuweka sawa na n zaidi ya hapa. OK. Basi sasa, sisi ni iterating juu ya kila index katika safu. Na hivyo, kama tunataka magazeti ya kila tabia katika safu kwamba, asilimia c ni bendera tunataka kutumia kwa wahusika. Na sasa bracket i ni kwenda kuwa kamba, index tabia i, hivyo kama kamba walikuwa hello. kisha s 0 ni kwenda kuwa h, s bracket 1 itakuwa e, na kadhalika. Hivyo sasa tunataka kuchanganya mambo haya mawili. Tunataka magazeti ya kila tabia ya ya kila hoja ya mstari amri. Hivyo sisi ni kwenda kuwa na Furushi kwa kitanzi. Na conventionally, kukabiliana na kwanza ni i, ya pili ni kwenda kuwa j, n itakuwa strlen ya argv i, i ni chini ya n, i pamoja na plus. Na sasa badala ya uchapishaji argv i, hivyo bracket argv i ni kwenda index - kwamba kinaendelea kuwa i-th amri line hoja, argv i, j ni kwenda kuwa tabia jth ya i-th hoja. Mimi itabidi kujikwamua hii hapa sasa tangu sisi kuiweka katika kitanzi. Hivyo ni sawa na kamba s usawa argv i, na kisha s bracket j. Naam, sisi hawana haja ya kutangaza hii s kutofautiana. Badala yake, tutaweza tu kuchanganya haya mbili katika kile tulikuwa, argv i, j. SPIKA 1: [inaudible]. Rob BODEN: wito Good. Hivyo hii ni kuvunjwa. Kama mimi kwa kweli mbio, tunataka kuwa barabara hii. Hivyo kukabiliana na mimi huduma ya juu katika hii maalum kwa ajili ya kitanzi ni j, iterator. Hivyo ingekuwa kukimbia katika masuala, pengine usio kitanzi, kama sisi alikuwa si fasta kwamba. Hiyo ni kwa nini sisi ni pia kuzungumza kuhusu debugging leo. OK. Basi hebu kuendesha mpango huu. Na hebu kweli kuongeza printf tofauti haki hapa kwamba tu magazeti line nyingine, tangu hii ina maana wakati sisi kuendesha programu, kutakuwa na tupu line katika kati ya kila tabia ya kila amri line hoja. Naam, tutaweza kuona kwamba maana yake ni nini. OOP. Got baadhi ya mdudu. Makosa inamuunga kutangaza kazi maktaba strlen. Hivyo kwenda nyuma katika mpango wetu, mimi alisahau hash ni pamoja na string.h. Hivyo string.h ni kwenda kuwa header faili kwamba anatangaza kazi strlen. OK, inaandaa. Sasa, hebu kukimbia. Hivyo tu. Ni kwenda na magazeti nje yetu jina mpango, hello dunia. Ni kwenda na magazeti kila kitu, kila tabia, juu ya line yake mwenyewe. OK. Basi hebu kweli kuchukua hii hatua moja zaidi. Na badala ya kutumia string.h, hebu kufikiri kuhusu jinsi tunatarajia kutekeleza yetu wenyewe strlen kazi. Kwa hiyo nitakuwa mara moja kutoa kazi sahihi. Basi hebu kuwaita katika my_strlen, na ni kwenda kuchukua kamba kama hoja, na sisi kutarajia kurejea urefu wa kamba hiyo. Kwa hiyo, ambapo ni kwamba guy? Ndiyo. OK. Basi kumbuka kutoka slide awali kwamba naye alikuwa wa wiki iliyopita, kwamba safu ya wahusika, vizuri, kamba, hivyo hebu sema hii ni kamba yetu s. Hivyo kama s ni kamba, hello, basi, H-E-L-L-O, katika kumbukumbu, ambayo inaenda kuwa, na kisha backslash hii 0 tabia. Hivyo ni jinsi gani sisi kupata urefu wa s? Naam, hila ni kuangalia kwa hii kuwepo kwa kuzorota 0 tabia, null hii Terminator. Hivyo algorithm Je kwenda kuwa kitu kama chache wahusika wa kutosha kwamba - hebu kuwa hii mkono kuwakilisha baadhi counter, hebu wito urefu int. Hivyo, kuanzia zaidi ya hapa, sisi ni kwenda iterate juu ya kamba yetu. Hivyo tabia ya kwanza, ni H, na siyo nyuma kufyeka 0, hivyo urefu ni 1. Iterate na tabia ya pili, E, na siyo backslash 0. Urefu ni 2. L, 3. L, 4. O, 5. Na hatimaye, sisi kufikia backslash 0, na hivyo kuwa njia, vizuri, kamba huu ni juu. Basi hebu kurudi 5. Hivyo kweli utekelezaji wa kwamba, kwanza, n yangu urefu sawa na 0, upande wangu wa kulia. Na tunakwenda iterate - SPIKA 1: [inaudible] Rob BODEN: Oh, risasi. Wito nzuri. Boom. Hivyo n urefu sawa na 0. Basi sasa, wakati s urefu haina sawa na kisha, backslash 0. Basi kumbuka, hii backslash 0, ni tabia ya halisi, na inaonyesha mwisho wa kamba. Tu kama, pia, backslash n ni tabia ya halisi. Backslash 0 ni kwenda zinaonyesha mwisho wa kamba yetu. Sitaki kuweka kwamba huko. Na wakati s indexed na urefu ni si sawa na null Terminator, basi sisi ni kwenda tu nyongeza urefu. Basi, mwishoni mwa mpango wetu, urefu ni hatimaye kwenda kuwa 5 katika kesi hii. Na sisi itabidi kurudi urefu. OK. Hivyo sasa hapa chini, mimi si kufanya my_strlen. Hebu kukusanya ni kuhakikisha kila kitu anaendesha vizuri. Ilikuwa mimi kufanya katika 2? Au ni kwamba 1? Kwamba lazima kufanya. Sawa. Hivyo hii ni argv 2. Kazi kama ilivyotarajiwa, ingawa ilikuwa ni kwamba mmoja mimi alifanya hivyo katika? Ndiyo. OK. Hii toleo la mambo hawakuwa na printf mpya line baada ya, lakini haina tofauti yoyote. OK. Hivyo kazi kama ilivyotarajiwa. Sasa tunaweza hata kuchanganya hatua hii moja zaidi, ambapo taarifa hapa, vizuri, kwanza, sisi ni grabbing strlen ya argv i, na kisha sisi ni iterating juu ya kila tabia katika kamba hiyo. Hivyo badala ya kufanya hivyo, nini kama sisi tu kuchanganya mantiki hii ya kusubiri mpaka sisi kugonga backslash 0 haki ndani ya hii kwa kitanzi? Hivyo iterate wakati argv i, j gani backslash si sawa 0. Hivyo basi kukimbia yake ya kwanza. Sawa. Hivyo hapa, hali hii ni kusema - hebu wazi kwamba. Basi sasa, basi hii kuwa argv yetu. Hivyo wakati mimi tu mbio mpango kwamba kabla, argv ni safu ya masharti. Na hivyo, kama mimi kuendesha kwa dot slash argv 2, hello dunia, basi argv yenyewe ni urefu 3, kwa argv sifuri, hello, na dunia. Na ndani ya kila mmoja wa fahirisi hizi ni, yenyewe safu, ambapo hii utakuwa dot, hii itakuwa slash, sijui kama hiyo ilikuwa ni mwelekeo sahihi, mimi sidhani ilivyokuwa. -R-V dash, unahitaji nafasi zaidi. Hebu kukatwa katika safu hii. -R-V dash 0, na kisha backslash 0. Na kisha katika disarray itakuwa hello. Hebu sema, H-E backslash 0. Na hatimaye, W-O backslash 0. Hivyo algorithm kwamba sisi tu aliandika, Furushi kwa tanzi, nini wao ni kufanya ni, sisi kwanza na kukabiliana na i na kisha j. Hii itakuwa rahisi na kanuni juu ya screen, Hebu kwenda nyuma ya hii. OK. Hivyo taarifa kwamba i ni iterator kwamba iterating juu ya kila amri line hoja. Na j ni iterator iterating juu ya tabia ya kila mmoja katika amri line hoja. Kwa hiyo kile printf hii ndani kabisa ni kufanya ni, tuna printf argv 0 0, printf argv 0 1, printf argv 0 2, 0 3, 0 4, 0 5, 0 6, lakini sasa, argv 0 7 ni kwenda backslash sawa 0. Hivyo basi sisi exit kwamba kwa kitanzi, na sasa i iterates 1. Na sasa tunakwenda magazeti argv 1 0, argv 1 1 - vizuri, sasa, tangu mimi kukata hujambo short, argv 1 2 kwa mara nyingine tena kwenda kuwa backslash 0. Na hivyo, nyongeza i na kuendelea, na kadhalika, mpaka sisi magazeti nje yote ya dunia, na wale ni tatu mstari amri hoja, na tutaweza exit nje ya yttersta kitanzi, na kumaliza programu yetu. OK. Basi hebu kurudi hapa. Hivyo itabidi kupata baadhi ya uzoefu na hoja mstari amri juu ya hili tatizo fulani kuweka. Sasa, debugging. Hivyo pengine tayari alikuwa na kufanya baadhi debugging na uliopita yako kuweka tatizo. Na njia moja rahisi sana ya debugging, kwanza, hebu tuangalie mpango buggy. Vizuri, kutembea kwa njia ya mpango huu, tunakwenda kuomba user kwa integer, kunyakua kwamba integer, na kisha, kiholela, tuna wakati kitanzi kwamba ni kwenda tu kuongezwa i mpaka ni sawa na 10. Hebu kudhani tu mimi nina kuingia integer zaidi ya 10. Hivyo kuongezwa i mpaka ni sawa na 10. Na kisha sisi kuwa na mwingine kitanzi wakati kwamba, wakati i haina sawa 0, sisi ni kwenda kuongezwa i na 3. Hivyo kama unaweza kuona dhamira ya mdudu hapa, ni kwamba hii utakuwa kuongezwa i kwa kuwa 10, na kisha hii itakuwa wakati kitanzi decrement i kutoka 10, 7, 4, 1, hasi 2, hasi 5, na kadhalika, kwa infinity hasi, tangu i mapenzi kweli kamwe sawa 0. Na kisha mwishoni mwa mpango huu, tuna foo kazi ambayo ni kwenda juu ya magazeti kuwa i. Hivyo hii ni ya muda mfupi na yasiyo na maana mpango, na mdudu ni dhahiri, hasa baada ya mimi tu alisema nini mdudu mara. Lakini nia hapa ni vizuri, hii inaweza kweli kuangalia kama baadhi ya yako ufumbuzi kutoka tamaa kutoka mwisho kuweka tatizo, na labda huna na baadhi kitanzi usio katika mpango wako, na wewe huna wazo nini kusababisha athari yake. Hivyo muhimu sana debugging mbinu ni kwa kuongeza tu printfs wote juu ya kanuni yako. Hivyo hapa nataka printf nje kwanza kitanzi wakati. Na hapa nataka printf, na mimi itabidi magazeti i. Mimi itabidi hata kufanya kwanza wakati kitanzi, i. Nje, pili kitanzi wakati. Kwa mara nyingine tena, magazeti ndani ya hapa, thamani i. Na hebu kukimbia hii. Hivyo dot slash utatuzi. Kuingia integer. Hebu kufanya 13. Na boom. Tunaona kwamba sisi ni looping usio ndani ya wakati pili kitanzi. Basi sasa sisi kujua nini mdudu ni. Lakini debugging printf ni kubwa kikamilifu, lakini mara moja programu yako kupata tena na ngumu zaidi, kuna ufumbuzi kisasa zaidi kwa kupata mambo kazi. Basi hebu kuondoa printfs hayo yote. Na hebu kuhakikisha mimi si kuvunja chochote. OK. Hivyo mpango tunakwenda kuanzisha inaitwa GDB, kwa GNU Debugger. Vizuri, kwa kweli, hebu kuondoa utatuzi kwa a pili, na kufanya utatuzi tena. Vizuri, kwa kweli kwanza, somo nzuri katika hoja mstari amri. Taarifa kwamba amri hii Clang kwamba ni kuandaa kila kitu ni kuwa alipita katika mstari amri, hizi hoja mstari amri. Hivyo ni jinsi gani wewe ni kwenda kutumia hoja mstari amri, kama sisi walivyofanya zamani, na kama wewe katika pset 2, kwamba ni jinsi gani Clang ni kutumia yao. Hivyo taarifa kwamba hii kwanza flag, dash ggdb3, nini hiyo akisema ni, Clang, unapaswa kukusanya faili hili kwa kusudi sisi hatimaye haja Debug yake. Hivyo muda mrefu kama una kwamba flag, basi tunaweza GDB utatuzi. Na kutakuwa na kufungua GNU Debugger. Hivyo kuna mengi ya amri kwamba unahitaji kupata kutumika. Kwanza moja kwamba itabidi pengine mara moja haja ni kukimbia. Kwa hiyo kile ni kukimbia kwenda kufanya nini? Ni kwenda kuanza programu yetu. Hivyo kukimbia, kuanzisha mpango, mpango anauliza sisi kwa integer, 13. Na kisha ni looping usio kama ilivyotarajiwa, ila mimi kuondolewa printfs, hivyo hatuna hata kuona kwamba. Exited kawaida. Oh. Ni inawezekana kwamba amefungwa wote njia ya kuzunguka, nyuma - kupuuza hiyo. Kudhani kuwa hakuwa exit kawaida. Kuna jibu ngumu hiyo. Basi sasa, si kwamba ni muhimu sana. Hivyo tu kuendesha programu yetu ndani ya debugger hii haina kutusaidia katika yoyote njia, tangu sisi wangefanya tu dot kufyeka utatuzi kutoka nje GDB. Hivyo amri moja kwamba itabidi pengine - na mimi itabidi kuacha hii. Kudhibiti-d au kuacha, wote kazi. Basi hebu kufungua tena. Amri nyingine ambayo pengine utasikia mara moja wanataka kuzoea ni Break. Hivyo tutaweza kuvunja juu ya kuu kwa sasa, na basi mimi itabidi kueleza kwamba. Naam, hapa tunaona sisi kuweka breakpoint katika mstari huu katika debug.c. Kwa hiyo kile mapumziko njia ni kwamba wakati mimi aina ya kukimbia, mpango ni kwenda kuendelea mbio hadi Mimi kugonga breakpoint. Hivyo wakati mimi kugonga kukimbia, mpango kuanza, na kisha inavunja haraka kama inaingia kazi kuu. Kuvunja kuu ni kwenda kuwa kitu wewe pretty kawaida kufanya. Na sasa, kwa kuanzisha wewe kwa baadhi ya amri zaidi. Taarifa hapa, kwamba ni kusema sisi kuvunja katika mstari wa 11, ambayo ni printf, kuingia integer. Hivyo amri ya pili ni kwenda kuwa jinsi sisi kwenda mstari wa pili code. Hii ni kwenda kuruhusu sisi hatua kupitia mpango line yetu kwa line. Hivyo ijayo. Sasa line 12, tunakwenda kupata integer. Next. Na kama wewe tu hit Enter tena, itabidi Rudia jambo la mwisho alivyofanya. Hivyo mimi si haja ya aina ijayo kila wakati. Hivyo kuingia integer, 13. Basi sasa, mstari wa 14, wakati i ni mkubwa ya 10, na mimi itabidi kufanya ijayo. Na tunaona tunakwenda kuongezwa i. Hivyo sisi ni kwenda kwa kuongezwa i tena. Basi sasa, mwingine ni muhimu amri ni Print. Hivyo Print ni kwenda magazeti nje thamani ya kutofautiana. Hebu kuleta thamani ya kutofautiana i. Hebu magazeti i. Ni kwenda kusema i ni 11. Sasa sisi Ifwatayo tena wakati i ni zaidi ya 10. Hivyo i bado ni kubwa kuliko 10, tangu ni 11. i minus minus. Hebu magazeti i tena. Kama ilivyotarajiwa, ni 10. Basi sasa, ijayo. Ni kurejea na hali, i ni zaidi ya 10, lakini i ni sasa 10, hivyo si zaidi ya 10, hivyo tunatarajia kwa kuanguka nje ya kitanzi wakati. Na sasa tuko chini ya kwamba mstari wa kanuni. Na amri nyingine, Orodha, ni kwenda tu kuonyesha uliopita na ujao michache ya mstari wa kanuni, katika kesi waliopotea mwenyewe. Hivyo sisi tu exited kitanzi hii wakati, na sasa tumeingia hii wakati kitanzi, line 18. Hivyo wakati i haina sawa 0. Na, pili, i sawa na i minus 3, na sisi itabidi taarifa, hii itabidi kuendelea. Na tunaweza magazeti i. Kila amri aina ya ina njia za mkato. Hivyo p ni short kwa Print. Hivyo tunaweza p i. Tu kuweka kufanya n, au kuendelea kufanya Next. Magazeti i tena. Unaweza kuona sasa ni hasi 167. Hivyo hii itakuwa kwenda juu ya milele, lakini si kweli milele, tangu wewe tu kuona, ni kweli mwisho wakati fulani. Hivyo kwamba ni Mwanzo GDB. Lakini hebu kufanya jambo moja zaidi katika GDB. Uh, utatuzi. Hivyo, katika kesi hii, usio kitanzi kilichotokea kwa kuwa ndani ya kazi kuu. Na kwa sasa, kukubali tu kwamba mimi nina wanaenda usio kitanzi katika foo kazi. Kumbuka tu kwamba, mwishoni mwa hii mpango, vizuri, hii awali ilikuwa wito foo, ambayo ilikuwa tu kwenda magazeti i. Lakini sasa sisi ni wito foo, ambayo ni kwenda kuongezwa i mpaka ni 0, na kisha magazeti kwamba kutofautiana. OK. Ila hiyo. Kufanya utatuzi. Na sasa, GDB utatuzi. OK. Basi, ikiwa mimi kukimbia tu basi mimi nina si kwenda kuwa na uwezo wa kweli hatua kwa njia yangu mpango line-na-line. Basi hebu kuvunja katika kuu, na basi aina ya kukimbia. Hivyo kwenda kwa njia hii, printf, kuingia integer, kupata integer, 13. Hivyo sisi ni kwenda kuweka decrementing mpaka i ni zaidi ya 10. Kisha tunakwenda kuanguka kwa njia ya wakati kitanzi, na kupata line - hebu kufungua it up katika dirisha tofauti. Hivyo sisi decremented mpaka i alikuwa tena zaidi ya 10, na kisha sisi aitwaye kazi, foo. Hivyo kilichotokea kwa haraka kama mimi hit kazi foo, vizuri, mimi kuitwa foo, na basi mimi tena alikuwa na mamlaka juu ya GDB. Basi kwa haraka kama mimi hit Ifwatayo katika mstari huu, mambo iliendelea hadi hii ilitokea, ambapo mpango exited wakati - kudhani haikuwepo hatimaye. Unaweza kuona ni pause kwa kidogo ingawa. Hivyo kwa nini mimi kupoteza udhibiti wa mpango katika hatua hiyo? Naam, wakati mimi aina ya pili, kwamba huenda halisi mstari wa pili kificho kwamba nitafanya. Hivyo, baada ya line 21, mstari wa pili code kwamba nitafanya ni line 22, ambayo ni, exiting kutoka kuu. Hivyo Sitaki kwenda tu kwa line ya pili ya code. Mimi nataka kwenda katika kazi, foo, na kisha pia hatua kupitia wale mistari ya maadili. Hivyo kwa kuwa, tuna mbadala. Hebu kuacha tena. Kuvunja kuu. Uh, 1, pili, pili, 13, pili, pili, pili, kwa makini, kabla ya sisi kugonga line foo. OK. Basi sasa, tuko katika mstari 21, ambapo sisi kuwaita foo. Hatutaki aina ya pili, tangu kwamba wataita kazi foo, na kwenda mstari wa pili code. Nini tunataka kutumia ni hatua ya. Hivyo kuna tofauti kati ya hatua na Next, ambapo hatua hatua katika kazi, na wa pili huenda juu ya kazi. Ni tu executes ukamilifu wa kazi na anaendelea kwenda. Hivyo hatua ni anaenda kututoa katika kazi, foo. Na sisi kuona hapa, sasa, tuko nyuma katika kitanzi hii wakati kwamba, katika nadharia, kwenda kuendelea milele. Na kama wewe hit Hatua, wakati ni hata kazi ya wito, basi ni kufanana na Next. Hivyo ni tu wakati uko katika line kwamba wito kazi ambayo Hatua ya ni kwenda tofauti na Next. Hivyo Hatua ya kuleta sisi hapa. Hatua, hatua, hatua, hatua, hatua, hatua, na tutaweza tu usio kitanzi milele. Basi unaweza kuzoea kwamba kama yako njia ya kutambua loops usio na mipaka, ni tu kufanya hii Enter muhimu kwa kuona ambapo wewe kukwama. Kuna njia bora ya kufanya hivyo, lakini kwa sasa, kwamba ni kikamilifu kutosha. Na stylistically, kuendana na Sinema 50, mimi wanapaswa aliyefanya hivyo. OK. Hivyo amri moja mwisho kuanzisha. Naam, hebu GDB utatuzi in Hivyo badala ya kuvunja katika kuu, kama mimi kujua foo kazi ni pia tatizo, basi mimi naweza kuwa na haki akasema, kuvunja katika foo, badala yake. Hebu sema mimi kuvunja katika wote kuu na foo. Hivyo unaweza kuweka breakpoints kama wengi kama unataka. Wakati mimi aina kukimbia, ni kwenda kuacha katika - ooh, hebu recompile, tangu Mimi iliyopita mambo. Utaona hii line, Onyo, chanzo file ni zaidi ya hivi karibuni kuliko kutekelezwa. Hivyo hiyo ina maana kwamba mimi tu akaenda katika hapa na iliyopita hizi kuendana na Sinema 50, lakini sikuweza recompile mpango. Hivyo GDB hufanya mimi kufahamu ya kwamba. Mimi itabidi kujiondoa, kufanya utatuzi tena, hit GDB utatuzi. OK. Basi sasa, nyuma kwa nini mimi alikuwa akifanya. Kuvunja kuu, mapumziko foo. Sasa kama mimi kuendesha programu, hivyo ni kwenda kuendelea mpaka hits breakpoint. Breakpoint kinachotokea kwa kuwa wa kwanza katika kuu. Sasa, badala ya kufanya pili, pili, pili, pili, pili, hata mimi kugonga foo, mimi unaweza aina kuendelea, ambayo itaendelea mpaka hit breakpoint ijayo. Mimi na kuingia integer kwanza. Kuendelea itaendelea mpaka mimi hit breakpoint ya pili, ambayo ni kwamba kazi ya foo. Hivyo kukimbia kukimbia mpaka hit breakpoint, lakini wewe tu aina kukimbia wakati wewe ni mapya mpango, na kisha, kutoka hapo juu, ni kuendelea. Kama mimi tu alifanya kuvunja kuu na basi mbio, utakuwa kuvunja katika kuu, na kisha kuendelea. Tangu sina hatua ya mapumziko katika foo, kuingia integer, kisha sasa mimi nina si kwenda kuvunja katika foo. Ni tu kwenda kwa usio kitanzi mpaka hiyo. OK. Hivyo kwamba ni Intro kwa GDB. Unapaswa kuanza kutumia katika seti tatizo lako. Ni inaweza kuwa na manufaa sana kutambua mende. Kama kweli tu, line-na-line, kwenda kwa njia ya kanuni yako, na kulinganisha nini ni kweli kinachotokea na unatarajia nini kutokea, basi ni pretty vigumu miss mende yako. OK. Hivyo wiki iliyopita David kuletwa hadi hii siri muhimu cryptography mambo kwa mara ya kwanza, ambapo hatutaki nywila tu kuhifadhiwa kwenye wetu kompyuta katika baadhi Nakala faili wazi, ambapo mtu anaweza kuja juu na tu kufungua it up na kusoma yao. Kusema ukweli, wangekuwa encrypted katika baadhi ya njia. Na katika tatizo kuweka 2, wewe utakuwa kushughulika kwa njia moja ya kuficha, au, vizuri, njia mbili, lakini wao ni si kubwa sana. Kama wewe kufanya hacker toleo, wewe ni pia kwenda kushughulika na decrypting baadhi ya mambo. Hivyo suala sasa ni vizuri, hata kama tuna encryption nguvu algorithm katika dunia, kama wewe kuchagua password hasa maskini, basi ni si kukusaidia sana, tangu watu bado kuwa na uwezo wa kufikiri nje. Hata kama kuona kamba encrypted na inaonekana kama fujo ya takataka hiyo ina maana kitu kwao, kama wao bado tu haja ya kujaribu nywila chache takwimu ni nje, basi si salama sana. Hivyo kuangalia video kwamba hufanya hatua hiyo. [Video avspelning] -Helmeti, ninyi Fiend. Nini kinaendelea? Unafanya nini kwa binti yangu? -Niruhusu kuanzisha kipaji vijana plastiki upasuaji, Dk Phillip Schlotkin, pua kubwa kazi ya mtu katika eneo lote la ulimwengu, na Beverly Hills. -Wako Mtukufu. -Nose kazi? Sielewi. Yeye tayari alikuwa na pua kazi. Ilikuwa tamu kumi na sita sasa. -No. Ni nini unafikiri. Ni kiasi, mbaya zaidi. Kama huna nipe mchanganyiko ngao hewa, Dk Schlotkin mapenzi kutoa binti wako nyuma pua yake ya zamani. -No. Wapi unaweza kupata kwamba? -All haki. Mimi nitakuambia. Mimi nitakuambia. No, baba. No, lazima si. -You're haki, mpenzi wangu. Mimi itabidi miss pua yako mpya. Lakini mimi si kumwambia macho, bila kujali. -Very vizuri. Dr Schlotkin, kufanya mbaya yako. -My furaha. [Vifaa kikiwa kinanolewa] -No. Kusubiri. Kusubiri. Mimi nitakuambia. Mimi nitakuambia. -I alijua ingekuwa kazi. Sawa. Unipe. -Macho ni moja. -One. -One. -Mbili. -Mbili. -Mbili. -Tatu. -Tatu. -Tatu. Nne. Nne. Nne. -Tano. -Tano. -Tano. -Basi macho ni moja, mbili, tatu, nne, tano. Hiyo ni stupidest mchanganyiko Mimi umewahi kusikia katika maisha yangu. Hiyo ni aina ya kitu idiot ingekuwa juu ya mizigo yake. -Asante, Mtukufu yako. -Je, nini? -I akageuka mbali ukuta. -No wewe wala. Wewe akageuka mbali movie nzima. -I lazima taabu kifungo sahihi. -Naam, kuweka nyuma. Kuweka movie nyuma. -Ndiyo, bwana. Ndiyo, bwana. -Twendeni, Arnold. Haya, na Gretchen. Bila shaka, unajua mimi utakuwa bado na muswada wewe kwa hili. [Mwisho video avspelning] Rob BODEN: All wa kulia. Hivyo sasa kwamba tuko tayari kuzungumza juu ya usalama katika baadhi ya njia, nice kidogo movie bango, hivyo katika siku za karibuni siku, masuala haya na NSA ufuatiliaji kila kitu. Inaweza kuwa vigumu kuhisi kama wewe kuwa na aina fulani ya faragha katika dunia online, ingawa mimi naweza kusema wewe zaidi ya maelezo ya Prism. Hivyo kwa kusonga zaidi ya Prism, sisi siyo kwenda kuwa kuzungumza juu ya kwamba, sasa kufikiri juu ya Laptop yako. Hivyo hapa, nataka kubadili akaunti yangu halisi, na Penguin yangu kidogo. Hivyo nina kuweka password, na kwamba password ni chochote mimi nataka kuwa. Lakini kumbuka kwamba nini mimi magogo katika na, hivyo kuingia hii haraka, ni mpango wa baadhi. Ni baadhi ya mpango huo ilikuwa iliyoandikwa na baadhi mtu. Na hivyo, mtu kwamba, kama ni hasa malicious, hawakuweza wamesema, haki ya wote, hivyo kama password kwamba mimi kuingia ni sawa na yangu password halisi, au ni sawa kwa baadhi password maalum - David ni wa kushangaza au kitu - basi wasitoke Hivyo malicious programu inaweza kuwa na kupata yote ya Macs yako, au Windows, au kitu chochote. Hivyo kwamba ni si mengi ya wasiwasi, tangu, I mean, hii ni programu ya kuingia hiyo kusafirishwa kwa OS X, mamia au maelfu ya watu na upya kanuni hii. Na hivyo, kama, katika kanuni yako mahali fulani, unaweza kusema kama kamba hiki ni sawa na usawa David ni wa kushangaza, kuingia, basi mtu ni kwenda kuwa, kama, kusubiri. Hii siyo haki. Hii haipaswi kuwa hapa. Hivyo kwamba ni njia moja sisi kupata mambo kuwa aina ya salama. Lakini kufikiri juu ya hata programu kwamba kuandika. Hebu sema wewe aliandika mpango wa kuingia. Hivyo mpango huu kuingia kwamba aliandika, hivyo ni wazi, ni vizuri programu. Wewe si kwenda kuweka yoyote malicious kama x sawa na sawa na David ni wa kushangaza katika kanuni yako. Lakini mpango huu, je, kutumia kukusanya mpango huu? Kitu kama Clang. Basi nini kama mtu ambaye kilichotokea kwa kuandika Clang maalum cased katika Clang kitu kama, kama mimi kuandaa kuingia mpango, kisha kuingia kanuni hii katika mpango wa kuingia kwamba anasema, kama x sawa na sawa na David ni wa kushangaza? Hivyo bado kabisa, lakini sisi kuwa sawa kutoa hapa, ambapo Clang, vizuri, maelfu, kama si mamia ya maelfu ya watu, inaonekana katika Clang, na inaonekana katika mistari yake ya kanuni na akasema, yote ya haki, kuna kitu mbaya hapa. Ni wazi, hakuna mmoja anafanya kitu chochote hii mbaya. Lakini nini Clang yenyewe, kama, nini kama mimi kukusanya Clang? Nini kama mimi na baadhi compiler kwamba inaandaa Clang kwamba kuwekeza katika Clang hii hack maalum ambayo anasema, haki ya wote, wakati mimi kukusanya Clang, basi kutekelezwa mimi kupata lazima hasa kuangalia ndani ya mpango wa kuingia na kuingiza password hii, ni sawa na usawa Dave ni wa kushangaza? Ili kukumbuka kwamba compiler yako yenyewe mahitaji ya kukusanywa wakati fulani. Hivyo kama nini wewe kuchagua kukusanya Clang na, yenyewe ni malicious, basi inaweza kuwa Star zima njia ya chini line. Hivyo hapa, tuna Ken Thompson na Dennis Ritchie. Hivyo hii ni iconic photo. Dennis Ritchie ni juu ya haki. Yeye ni kubwa - pretty much aliandika C. Hivyo unaweza kumshukuru kwa ajili ya darasa hili. Ken Thomson juu ya kushoto. wawili kimsingi aliandika UNIX. Naam, walikuwa wachangiaji wakuu katika UNIX. Kulikuwa na baadhi ya watu wengine. Hivyo Ken Thompson, wakati fulani, atashinda tuzo ya Turing. Na tuzo Turing, nimekuwa daima kusikia ni inatazamwa njia hii, ni Tuzo ya Tuzo ya sayansi ya kompyuta. Hivyo katika tuzo Turing, ana kutoa hotuba yake ya kukubali. Na yeye anatoa hotuba hii maarufu sana sasa, iitwayo tafakari juu ya kuamini Trust, ambayo sisi kuwa na uhusiano kwa kwenye tovuti bila shaka. Na katika hotuba hii, anasema, haki ya wote, hivyo niliandika UNIX, na sasa yote ya ninyi watu kwa kutumia UNIX. Sasa, kumbuka leo kwamba Linux ni ukoo wa UNIX. OS X moja kwa moja anatumia UNIX. Windows haina sana, lakini mengi ya mawazo walichukuliwa kutoka UNIX. Basi unaendelea hadi hatua na anasema, yote ya haki, niliandika UNIX. Na hivyo tu guys kujua, mimi nina uwezo wa kuingia ndani ya kila mmoja wa kompyuta yako. Tangu mimi kuweka moja ya haya maalum kama x sawa na sawa na Ken Thomson ni wa kushangaza, basi mimi nina kuruhusiwa kuingia. Hivyo watu ni kama, vizuri, how'd unaweza kufanya hivyo? Sisi inaonekana katika mpango wa kuingia na kitu huko. Yeye ni kama, vizuri, mimi iliyopita compiler kuingia katika mpango wa kuingia ili programu kuingia sasa itakuwa na kwamba x sawa na sawa na Ken Thompson ni ya kutisha. Na wanasema, vizuri, kwamba si kweli. Sisi ni kuangalia compiler, na compiler hana mistari yoyote ya code kama hiyo. Yeye ni kama, OK, lakini nini ni kuandaa compiler na? Na wanafikiri, na yeye, kama, vizuri, Mimi nina aliyetoa compiler unatumia kukusanya compiler, hivyo wewe ni kuandaa compiler, kwamba yenyewe ni malicious, na mapenzi kuvunja mpango wa kuingia. Hivyo kimsingi, katika hatua hiyo, kuna hakuna njia unaweza kuangalia katika chanzo kanuni za mpango wa kuingia kuona nini ni makosa. Unaweza hata kuangalia katika chanzo code ya mkusanyaji kuona nini ni makosa. Ungependa haja ya kuangalia mashine code, binary halisi ya ulioandaliwa compiler kuona, kusubiri, hizi mstari wa kanuni lazima kuwa hapa. Lakini Ken Thompson alichukua hatua moja zaidi na kusema, vizuri, kuna programu hizi maalum kwamba kweli kukusaidia kusoma binary wa mipango, na hivyo kama mtu kutumika mpango kwamba kwa kusoma binary, wangeweza kuona haya mistari ya kificho. Yeye iliyopita programu hizo kwa kusema, kila haki, kama wewe ni kuangalia compiler, hawaonyeshi fulani seti ya binary. Hivyo basi unahitaji kuchukua hatua zaidi na kimsingi, ambayo inaweza kuwa na kuchukuliwa ngazi mbalimbali ya indirection, na wakati fulani, hakuna mtu kweli kwenda kuwa na kuangalia. Hivyo maadili ya hadithi ni, wewe ni si kwenda kuwa kuandika Clang katika darasa hili. Wewe ni kwenda kutumia kupanda Clang mengi katika darasa hili. Kwa ajili ya wote unajua, Clang ni malicious mpango huo ni sabotaging kila mpango moja ve milele ulioandaliwa. Na kuondoka juu ya kwamba ominous sana kumbuka, kuona juu ya Jumatano. [Makofi] SPIKA 2: Katika CS50 ijayo. SPIKA 3: Je, si kuthubutu kusema kwamba. Unaweza kufanya hivyo. Umefanya kosa hii kabla, unaweza kufanya hivyo leo, unaweza kufanya hivyo kesho. Tumekuwa kufanya hivyo kwa miaka. Tu kwenda huko na kufanya hivyo. Unaweza kufanya hivyo. [Music kucheza]