[MUSIC Playing] Rob BODEN: Në rregull. Pra, gjëja e parë e parë, të video nga një fytyrë e njohur. [VIDEO Playback] -Në rregull. Kjo është CS50, dhe kjo është Fillimi i javës tre. Më vjen keq unë nuk mund të jetë atje me ju sot, por më lejoni të prezantoj Vet Rob Boden CS50-së. [END VIDEO rishikim] [Duartrokitje DHE Cheers] Rob BODEN: filmografi në që video është fantastike. Dakord. Pra, së pari, ka një tjetër drekë. Kjo është nesër at 1:15. Nuk ka drekë kjo e premte. Është me Quora. Dhe Tommy nuk është këtu, por një nga populli nuk është ish-kreu CF, Tommy McWilliam. Kështu që ai është një djalë fun. Ju duhet të vijnë. Dakord. Pra, javën e kaluar, kemi filluar duke thyer përveç për atë që një varg të vërtetë është. Ne e kemi njohur që në fillim se kjo është një sekuencë e karaktere. Por javën e kaluar, ne delved në faktin se ajo që është me të vërtetë një sekuencë e karaktere, edhe, ne tani kemi vargjeve të karaktereve. Dhe ne e dimë se një varg, është një koleksion e karaktereve, në fund, ne e kemi këtë bajt veçantë null, kjo backslash 0, që tregon fundin e string. Dhe kështu një varg është një koleksion i karaktere, por ne mund të kemi më shumë se vetëm një grup të karaktereve, ne mund të kemi një rrjet të çdo lloji i gjë që ne duam. Pra, nëse ju kujtohet nga java e fundit, Program Moshat që Davidi futur me të vërtetë shpejt. Pra gjëja e parë që ne jemi duke shkuar për të bërë është kërkojë nga shfrytëzuesi për një numër të plotë, Numri i njerëzve në dhomë. Pasi të kemi këtë numër të plotë, ne jemi duke deklaruar një rrjet. Vini re këtë sintaksë kllapa. Ju jeni do të mësohen me këtë. Pra, ne jemi duke deklaruar një rrjet të numrave të plotë quajtur moshave, dhe ka n integers në këtë grup. Kështu që ky model të drejtë këtu, kjo int 4 i është 0, i është më pak se n, i plus plus, që është gjithashtu do të jetë një model që ju të merrni shumë të përdorur për të. Sepse kjo është shumë e shumë si ju jeni gjithmonë do të iterate mbi vargjeve. Pra, mos harroni se është n Gjatësia e array tonë. Dhe kështu këtu, ne jemi duke kërkuar në mënyrë të përsëritur për moshën e personit i në dhomë. Pas kësaj, ne do të shkojmë poshtë, dhe për çfarëdo arsye arbitrare, ne pastaj shtypura nga sa e vjetër ata do të jetë një vit nga tani. Dhe drejtimin atë program, le të të bëjë moshave, dot moshave çaj. Pra, numri i njerëzve në dhomë, le të themi ka tre. Dhe thonë, personi i parë është 13, tjetër është 26, dhe i fundit është 30. Pra, atëherë ajo do të iterate gjatë atyre tre njerëz, të shtypura nga 14, 27, dhe 31. Pra, mos harroni se kur ne të deklarojë një sërë madhësi n, indekset në se array, array ka vlera dhe Indekset 0, 1, 2, gjatë gjithë rrugës deri n minus 1. Pra, kur ne tha se kishte tre persona në dhomë, dhe ne kemi vënë në këtu përsëritje e parë përmes kësaj loop, unë do të jetë 0. Pra, në indeks 0. Ne jemi caktimin e parë moshe përdorues hyn. Pastaj në një tjetër, ne jemi duke hyrë dytë n përdoruesi hyn, dhe në pranë dy, n fundit. Pra të vini re se një grup i madhësisë tre nuk ka asgjë në indeksin e tre. Kjo nuk është e vlefshme. Dakord. Pra, duke shkuar prapa këtu. Pra, tani që ne e kemi trajtuar me vargjeve, ne kemi disa familjaritet. Tani ne do të lëvizin për në komandën Argumentet e linjës, të cilat do të jenë të shumë e rëndësishme për këtë grup problemit. Pra, deri tani, sa herë që ju keni deklaruar funksionin tuaj kryesor, ne kemi tha pavlefshëm kryesore int. Pra pavlefshme vetëm do të thotë se ne nuk jemi duke kaluar çdo Argumentet për këtë funksion. Tani ne jemi duke shkuar për të parë atë Main mund të marrë disa argumente. Këtu ne i quajmë ato int argc dhe string ARGV kllapa. Kllapa, edhe një herë, duke treguar se ne jemi që kanë të bëjnë me të vargjeve. Kështu që këtu, kllapa string ARGV, ne jemi që kanë të bëjnë me grupe prej vargjesh. Pra argc, që do të tregojë sa argumente ne kemi kaluar në këtë program. Dhe për të parë se çka do të thotë, le të mbyllë këtë. OK. Pra, deri tani, ne kemi drejtuar çdo program si moshave dot slash. Ne gjithashtu mund të, në rreshtin e komandave, e kaluara kalojë argumente, pra termi, komanda Argumentet linjë. Pra, argumenti i parë, përshëndetje botë. Kështu që këtu, argc do të jetë tre. Është numërimin e argumenteve në rreshtin e komandave. Argc është gjithmonë në të paktën 1, që pikë çaj moshave, veten, akuza si një nga argumentet command line. Pastaj përshëndetje është i pari. Nëse moshave dot Slash është 0, atëherë përshëndetje është i pari, dhe bota është dytë command line argumenti. Pra ARGV string, ne jemi duke shkuar për të parë, përmban vargjet, dot plagë moshave, hello, dhe bota. Dhe, me kërkesën e Davidit, ne jemi duke shkuar për të luajtur një video futjen këtë. [VIDEO Playback] -Deri tani në programet ne kemi me shkrim, ne kemi të deklarojë kryesor i pavlefshëm si int kryesore. Dhe të gjithë këtë kohë, që ka pavlefshëm thjesht është specifikuar se Programi nuk ka marrë ndonjë argumente të komandës. Me fjalë të tjera, kur një përdorues shkon një program, ai ose ajo mund të sigurojë komandën Argumentet e linjës nga shkrim shtesë fjalët ose frazat pasi programi të të përmendur në ftim. E pra, në qoftë se ju doni programin tuaj për të marrë argumente command line, një ose më shumë fjalë të tilla, ne kemi nevojë për të zëvendësuar të pavlefshme me një çift të argumenteve. Pra, le ta bëjmë atë. Përfshi CS50.h. Përfshi io.h. standarde Kryesore int. Dhe tani, në vend të pavlefshëm, unë jam duke shkuar për specifikoni një int quajtur argc, dhe një Grup vargjesh quajtur ARGV. Tani, argc dhe ARGV janë thjesht konventat. Ne mund të kanë quajtur këto argumente më çdo gjë që duam. Por ajo që është e rëndësishme është se argc është një int sepse, sipas definicionit, është e do të përmbajë numërimin argumentin, numri i fjalëve në total që përdoruesi ka shtypur në ftim tij ose të saj. ARGV, ndërkohë, argumenti vektor, është do të jetë në fakt një grup magazinimin e të gjitha fjalët që përdoruesi ka shtypur në ftim tij ose të saj. Le të vazhdojë të bëjë diçka tani me një ose më shumë nga këto argumente të komandës. Në veçanti, le të shkojnë përpara dhe të shtypura pavarësisht fjala lloje përdorues emrin e programit në ftim. Kllapa e hapur. Mbylle kllapa. Printf përqind s backslash dhe presje. Dhe tani kam nevojë për të të treguar printf çfarë vlerë në prizë në atë placeholder. Dua fjalën e parë që përdoruesi ka shtypur emrin e programit, dhe kështu që unë jam duke shkuar për të specifikuar ARGV kllapa 1, në afërsi kllapë, pikëpresje. Tani, pse kllapa 1 dhe jo kllapa 0? E pra, ajo rezulton, ruhen automatikisht në ARGV 0 do të jetë Emri aktual programit. Pra, fjala e parë që lloje përdorues pas emri i programit është, duke konventë, do të jetë ruhet në ARGV 1. Le tani përpilojnë dhe të drejtuar këtë program. Bëni ARGV 0, dot çaj ARGV 0. Dhe tani një fjalë si përshëndetje. Shkruani. Dhe nuk kemi atë, përshëndetje. [END VIDEO rishikim] Rob BODEN: Në rregull. Mbylle këtë. Pra, duke marrë një sy në atë program që ne vetëm futur për ne, dhe, vetëm për të treguar, në qoftë se ne të shtypura ARGV 0, të bëjë, tani çfarë është ajo, ARGV 0, dot plagë ARGV 0. Pra, siç pritet, ajo e shtypjes jashtë emrin e programit, pasi ARGV 0 është gjithmonë do të jetë emrin e programit. Por le të bëjmë diçka pak më shumë interesante. Pra, në grupin e problemeve, ju do të jetë futur në këtë funksion, atoi. Pra, çfarë ne përdorim atoi për? Kjo do të kthyer një string në një numër të plotë. Pra, nëse unë të kalojë string, një dy tre, për atoi, që do të konvertohet se me numër i plotë, një dy tre. Pra, ne jemi duke shkuar për të kthyer parë command line argumenti për një numër të plotë, dhe pastaj vetëm të shtypura atë numër të plotë. Pra, në thelb, ne jemi lloj reimplementing getint, vetëm numër i plotë është futur në komandën Linja sesa në programin e interaktive. Prandaj, duke e bërë ARGV 0, le të bëjë ajo në këtu, dhe të mbyllë atë. Pra, duke ARGV 0, dhe le të hyjë numër i plotë, një dy tre katër e dy. Pra, kjo do të shtypura numër i plotë, një dy tre katër e dy. Ka disa hollësitë për atoi që ai do të ndalet të kujdeseni për ndonjë gjë përtej një karakter të vlefshme numerike, por kjo nuk ka rëndësi. Pra, çfarë mendoni ju ndodh po e bëra këtë? Faji Segmentimi. Pra, pse është se? Nëse ju shikoni mbrapa në programin tonë, ne jemi konvertimin ARGV 1, argumentin e parë pas emrin e programit, për një numër të plotë. Por nuk ka asnjë argument kaluar me emrin e programit. Kështu që këtu, ne shohim se kjo është një buggy program, pasi që, në qoftë se ne të përpiqemi për të drejtuar atë pa argumente, ai thjesht do të rrëzimit. Pra, një tjetër model i zakonshëm ju do të shihni është diçka si, nëse argc është më pak shumë se dy, duke treguar se nuk ka pasur paktën emri program dhe a Argumenti i parë, atëherë ne do të bëjmë diçka si printf, nuk mjafton argumente të komandës. Kjo ndoshta nuk është një e mirë për të shtypur, kjo është ndoshta diçka, si ju duhet të shkoni në një numër të plotë në rreshtin e komandave. Unë vetëm do të përfundojë atë atje. Dhe pastaj kthehen 1. Pra, mos harroni që në fund të tonë Programi, në qoftë se do të kthehemi 0, atë gjë e tregon sukses. Dhe kryesor gjithashtu automatikisht kthehet 0 në qoftë se ju nuk e bëni. Pra këtu, ne jemi retuning 1 për të treguar se kjo nuk është sukses. Dhe ju mund të ktheheni çfarë të doni, vetëm, 0 tregon sukses, dhe çdo gjë tjetër që tregon dështim. Pra, le të drejtuar këtë version të gjërave. Deri tani, në qoftë se ne nuk do të hyjë në një command line Argumenti, ajo do të tregoj saktë na, nuk command line mjaftueshme. Nuk e kishte përfunduar dënimin. Tjetër, në qoftë se ne të vërtetë të kalojë atë një të tillë, ajo mund të përfunduar programin. Pra, kjo është se si ju do të përdorni argc në mënyrë për të vërtetuar numrin e argumente command line që janë miratuar në të vërtetë. Pra, le të bëjmë këtë program pak më të komplikuar, dhe të kërkoni në të dytin përsëritje e gjërave. Deri tani, ne jemi jo vetëm shtypjen parë command line argumenti. Këtu, ne jemi iterating nga barabartëve int 0, i është më pak se argc, i plus plus, dhe shtypje ARGV, indeksi i. Pra ky model, përsëri, kjo është e njëjta model si më parë, me përjashtim në vend i quajtur variablin n, ne jemi duke përdorur argc. Pra, kjo është iterating mbi çdo indeks në rrjet, dhe shtypjen e çdo element në atë rrjet. Dhe kështu, kur ne të drejtuar këtë program, mirë, Unë nuk hyjë në çdo command line argumente, kështu që vetëm kopje Emri i programit. Nëse unë të hyjë në një bandë e gjëra, kjo do të printoni një, secili në linjën e vet. OK. Pra, le të marrin këtë hap më tej. Dhe në vend të shtypjes çdo argument të në linjën e vet, le të shtypura çdo Karakteri i çdo argumenti në linjën e vet. Pra, mos harroni se ARGV është një koleksion të strings. Pra, çfarë është një varg, por një grup të karaktereve? Pra kjo do të thotë se ARGV është me të vërtetë një array e një grup të karaktereve. Pra, duke përfituar nga kjo, le të injorojë këtë tani për tani. Le të konsiderojmë vetëm të string ARGV 0. Pra, nëse ne duam të sjellë çdo karakter të ARGV 0 në linjën e vet, atëherë unë dua për të bërë model ne jemi duke përdorur për të, i është pak se gjatësia e vektorit, e cila këtu, është strlen të, kjo është jo atë që unë dua të bëj, string s është e barabartë ARGV 0. Kështu që i është më pak se gjatësia e tona array, e cila në këtë rast është një koleksion i karaktereve, i plus plus. Dhe kështu, siç e pamë javën e kaluar, kjo është ideale në qoftë se ne shkojmë se strlen jashtë e gjendjes, pasi n do të jetë duke shtuar strlen e s çdo herë që ne shkojmë përmes lak, dhe është e nuk do të jetë ndryshuar. Pra, ne do të vënë atë të barabartë me n mbi këtu. OK. Deri tani, ne jemi duke iterating mbi çdo tregues në rrjet. Dhe kështu, në qoftë se ne duam të shtypura çdo karakteri në atë array, c qind është flamuri ne duam të përdorim për karaktere. Dhe tani një i kllapa do të jetë string, indeksi i karakterit, kështu që nëse string ishin përshëndetje. atëherë s 0 do të jetë h, s kllapa 1 do të jetë e, dhe kështu me radhë. Pra, tani ne duam të kombinuar këto dy gjëra. Ne duam për të shtypur çdo karakter e çdo argumenti command line. Pra, ne do të kemi një mbivendosur për lak. Dhe konvencionale, numëruesi i parë është i, e ardhshëm do të jetë j, n do të jetë strlen i ARGV i, i është më pak se n, i plus plus. Dhe tani në vend të shtypjes ARGV i, kështu që ARGV kllapa unë do të indeksit - që do të jetë komandë të vijë i-th Argumenti, ARGV i, j do të të jetë karakteri i jth argumenti i-th. Unë do të të shpëtoj nga kjo e deri këtu tani pasi ne kemi vënë atë në këtë lak. Pra, është e barabartë me String s barabartëve ARGV I, dhe pastaj s kllapa j. E pra, ne nuk kemi nevojë për të deklaruar kjo s variabël. Në vend të kësaj, ne do të kombinohen vetëm këto dy në atë që kemi pasur, ARGV i, j. Gjuha 1: [padëgjueshme]. Rob BODEN: thirrje e mirë. Pra, kjo është e thyer. Nëse unë në fakt u zhvillua atë, ne do të kanë kuptuar këtë. Kështu counter më intereson në këtë të veçantë për loop është j, iterator. Pra, ju do të kandidojë në çështjet, ndoshta një loop pafund, në qoftë se ne nuk e kishte fiksuar atë. Kjo është arsyeja pse ne jemi edhe duke folur për debugging sot. OK. Pra, le të drejtuar këtë program. Dhe le të të vërtetë të shtoni një printf veçantë drejtë këtu që vetëm do të shtypura një tjetër linjë, pasi që kjo do të thotë, kur kemi drejtuar programin, do të ketë një bosh vijë në mes të çdo karakter të çdo komandë linjë argumenti. E pra, ne do të shohim se çfarë do të thotë. Oop. Mori disa bug. Gabim implicite deklaruar Funksioni Biblioteka strlen. Pra, duke shkuar prapa në programin tonë, unë harruar të hash përfshijë string. Pra string do të jetë header fotografi që deklaron funksioni strlen. OK, ajo harton. Tani, le të drejtuar atë. Pra, vetëm atë. Ajo do të shtypura nga tonë Emri i programit, përshëndetje botë. Ajo do të shtypura çdo gjë, çdo karakter, në linjën e vet. OK. Pra, le të vërtetë të marrë këtë një hap më tej. Dhe në vend të përdorimit string, le të mendoni se si ne do të zbatojë vetë tonë funksion strlen. Kështu që unë do të jap menjëherë një nënshkrim funksion. Pra, le të thërrasë në my_strlen, dhe kjo është do të marrë një varg si argument, dhe ne presim që të kthehen Gjatësia e atë varg. Pra, ku është ai tipi? Po. OK. Pra mbani mend nga rrëshqitje më parë se ishte gjithashtu nga java e fundit, që një grup të karaktereve, mirë, një varg, kështu që le të thonë se kjo është string tonë s. Pra, nëse është string, hello, atëherë, H-E-L-L-O, ne memorie, që do të të jetë, dhe atëherë kjo backslash 0 karakter. Deri sa nuk kemi marrë gjatësinë e s? E pra, mashtrim është duke kërkuar për këtë reagim i ashpër në 0 karakter, këtë null terminator. Pra algorithm është duke shkuar të jetë diçka si pak mjaft karaktere se - le të kemi këtë dorë përbëjnë disa counter, le të quajmë këtë gjatësi int. Pra, duke filluar nga këtu, ne jemi do të iterate mbi vargun tonë. Pra, karakteri i parë, është e H, dhe kjo nuk është kthyer çaj 0, kështu që gjatësia është 1. Iterate të karakterit tjetër, E, dhe kjo nuk është backslash 0. Gjatësi është 2. L, 3. L, 4. O, 5. Dhe së fundi, ne kemi arritur backslash 0, dhe kështu që do të thotë, mirë, ky varg është e gjatë. Pra, le të kthehen 5. Pra, në fakt zbatimin që, së pari, Gjatësia ime n është e barabartë me 0, dora ime e djathtë. Dhe ne jemi duke shkuar për iterate - Gjuha 1: [padëgjueshme] Rob BODEN: Oh, të xhiruar. Thirrje e mirë. Boom. Pra Gjatësia n është e barabartë me 0. Deri tani, ndërsa s gjatësia nuk ka të barabartë dhe më pas, backslash 0. Pra mbani mend, këtë backslash 0, ajo është një karakter aktuale, dhe kjo tregon fundi i vargut. Ashtu si, gjithashtu, backslash n është një personazh faktik. Backslash 0 do të tregojë fundi i vargut tonë. Unë nuk dua të vënë atë atje. Dhe ndërsa e indeksuara nga gjatësia nuk është barabartë me terminator zero, atëherë ne jemi vetëm do të ardhura gjatësi. Kështu pra, në fund të programit tonë, Gjatësia është përfundimisht do të jetë 5 në këtë rast. Dhe ne do të kthehemi vetëm gjatësi. OK. Deri tani këtu poshtë, unë nuk e bëj të bëjë my_strlen. Le të përpiloj atë për të siguruar çdo gjë shkon pa probleme. U kam bërë në 2? Apo ishte se 1? Kjo duhet të bëjë. Dakord. Pra, kjo është ARGV 2. Punon ashtu siç ishte parashikuar, edhe pse ishte se e kam bërë atë në? Po. OK. Ky version i gjërave nuk kanë Linja printf ri pas, por kjo nuk e bën asnjë ndryshim. OK. Pra, ka punuar ashtu siç pritet. Tani ne mund të kombinoni këtë hap më më tej, ku njoftimi këtu, mirë, së pari, ne jemi duke grabbing strlen e ARGV i, dhe pastaj ne jemi iterating mbi çdo karakter në atë varg. Pra, në vend të bërë që, ajo që në qoftë se ne vetëm të kombinuar këtë logjikë e pritjes deri sa ne goditi backslash 0 drejtën në këtë për lak? Kështu iterate ndërsa ARGV i, j bën backslash jo të barabartë 0. Pra, le të kandidojë atë më parë. Dakord. Kështu që këtu, kjo gjendje është duke thënë - le të qartë këtë. Deri tani, kjo të jetë ARGV tonë. Kështu që, kur unë vetëm u zhvillua atë program para, ARGV është një koleksion të strings. Dhe kështu, në qoftë se unë të drejtuar atë me dot ARGV çaj 2, hello world, atëherë ARGV vetvete është gjatësi 3, për ARGV zero, hello, dhe bota. Dhe brenda secilit prej këtyre treguesve është, në vetvete një grup, ku kjo do të jetë dot, kjo do të jetë plagë, unë nuk e di në qoftë se ka qenë drejtimin e duhur, unë nuk mendoj se ishte. A-R-V dash, duhet më shumë hapësirë. Le të prerë në këtë grup. A-R-V dash 0, dhe pastaj backslash 0. Dhe pastaj në rrëmujë do të jetë përshëndetje. Le të thonë, H-E backslash 0. Dhe së fundi, W-O backslash 0. Kështu algorithm që ne vetëm shkruar, mbivendosur për sythe, atë që ata janë të duke bërë është, ne së pari duhet kundërvënë i dhe pastaj j. Kjo do të jetë më e lehtë me kodin në ekran, Le të kthehemi në këtë. OK. Kështu që të vëreni se unë është iterator kjo është iterating mbi çdo komandë linjë argumenti. Dhe j është iterating iterator mbi çdo karakter në të cilat command line argumenti. Pra, çfarë është duke bërë këtë printf thellë po, ne kemi printf ARGV 0 0, printf ARGV 0 1, printf ARGV 0 2, 3 0, 0 4, 0 5, 6 0, por tani, ARGV 0 7 do të backslash barabartë 0. Pra, atëherë ne të dalë që për lak, dhe tani i iterates në 1. Dhe tani ne jemi duke shkuar për shtyp ARGV 1 0, ARGV 1 1 - mirë, tani, pasi që unë prerë përshëndetje të shkurtër, ARGV 1 2 është sërish do të jetë backslash 0. Dhe kështu, rritje i dhe të vazhdojë, dhe kështu me radhë, deri sa të shtypura nga të gjitha botërore, dhe ato janë tre command line argumente, dhe ne do të dalë jashtë loop outermost, dhe të përfunduar programin tonë. OK. Pra, le të kthehen këtu. Pra, ju do të fituar disa familjaritet me argumente command line në këtë problem i veçantë vendosur. Tani, debugging. Pra, ju ndoshta e keni pasur për të bërë disa debugging me previous tuaj Problemi vendosur. Dhe një mënyrë shumë e lehtë për debugging, së pari, le të shohim në një program buggy. E pra, duke ecur nëpër këtë program, ne do të kërkojë nga shfrytëzuesi për një numër i plotë, kap se numër i plotë, dhe më pas, në mënyrë arbitrare, ne kemi një lak, ndërsa që është vetëm do të pakësim i është i barabartë deri në 10. Le të supozojmë që unë jam duke hyrë një numër i plotë më i madh se 10. Kështu pakësim i deri sa është e barabartë me 10. Dhe pastaj ne kemi një tjetër lak, ndërsa që, ndërsa unë nuk të barabartë 0, ne jemi do të pakësim i nga 3. Pra, nëse ju shihni qëllimin e bug këtu, është se kjo do pakësim i të të jetë 10, dhe pastaj ky lak, ndërsa vullneti pakësim i nga 10, në 7, në 4, ne 1 në negative 2, të negative 5, etj, në pafundësi negative, pasi që unë do të kurrë nuk të vërtetë të barabartë 0. Dhe pastaj në fund të këtij programi, ne kemi funksionin foo që është ndodh shtyp se i. Pra, ky është një program i shkurtër dhe i parëndësishëm, dhe bug është e qartë, sidomos pas unë vetëm tha se ajo ishte bug. Por qëllimi këtu është, mirë, kjo mund në të vërtetë duken si disa nga tuaj zgjidhje nga pangopur nga ata të fundit Problemi vendosur, dhe ndoshta ju keni disa loop pafund në programin tuaj, dhe ju nuk keni ide çfarë është duke shkaktuar atë. Pra, një teknikë shumë të dobishme debugging është që të vetëm të shtoni printfs të gjithë kodin tuaj. Kështu që këtu unë dua një printf jashtë loop e parë ndërsa. Dhe këtu unë dua një printf, dhe unë do të vetëm të shtypura i. Unë do të bëj edhe më parë, ndërsa loop, i. Jashtë, të dytë ndërsa loop. Edhe një herë, të shtypura brenda e këtu, vlera i. Dhe le të drejtuar këtë. Debug Pra dot çaj. Shkruani një numër të plotë. Le të bëjmë 13. Dhe bum. Ne e shohim se jemi looping pafund brenda lak të dytë, ndërsa. Deri tani ne e dimë se çfarë është bug. Por printf debugging është krejtësisht e madhe, por një herë programet tuaja të merrni më të gjatë dhe më të komplikuara, ka zgjidhje më të sofistikuara të duke u punuar gjëra. Pra, le të hequr të gjitha këto printfs. Dhe le të sigurohemi se nuk e kam thyejnë ndonjë gjë. OK. Pra, programi ne do për të futur quhet Gdb, për GNU Debugger. E pra, në të vërtetë, le të hiqni debug për një të dytë, dhe të bëjë debug përsëri. E pra, në fakt e parë, një mësim i mirë në argumentet e linjës komanduese. Vini re se kjo komandë tingëllimë që është hartimin e çdo gjë është duke u kaluar në rreshtin e komandave, këto argumente të komandës. Pra, saktësisht se si ju do të jetë duke përdorur argumente command line, si ne e bëri para, dhe si ju do në PSET 2, kjo është se si tingëllimë është për përdorimin e tyre. Pra, vini re se ky flamur i parë, dash ggdb3, ajo që është thënë është, tingëllimë, ju duhet të hartojnë me këtë fotografi qëllim që ne do përfundimisht duhet të korrigjoj atë. Pra, për aq kohë sa ju keni se flamurin, atëherë ne mund të gdb debug. Dhe kjo do të hapur deri të Korrigjuesit GNU. Pra, ka shumë të komandave që ju duhet të mësohen për të. E para që ju do të ndoshta menjëherë duhet është drejtuar. Pra, çfarë është e drejtuar do të bëni? Ajo do të fillojë programin tonë. Vraponi në mënyrë, duke filluar programin, programin na kërkon një numër të plotë, 13. Dhe atëherë është looping pafund si pritej, përveç unë hequr printfs, kështu që ne as nuk e shihni se. Exited normalisht. Oh. Është e mundur që ajo përfundoi të gjitha mënyrë rreth, përsëri në - duke injoruar atë. Supozojmë ajo nuk ka dalë normalisht. Ka një përgjigje e komplikuar për këtë. Deri tani, kjo nuk është shumë i dobishëm. Pra, vetëm drejtimin programin tonë brenda kjo Rregullues nuk na ndihmojnë në ndonjë mënyrë, pasi ne mund të kemi bërë vetëm dot zvogëlojë debug nga jashtë gdb. Pra, një komandë që ju do të ndoshta - dhe unë do të lë këtë. Kontrolli-d ose të të lë, të dy punë. Pra, le të hapur atë përsëri. Një tjetër komandë që ju do të ndoshta menjëherë duan të të mësohen për të është Pushim. Pra, ne do të thyejnë në kryesore tani për tani, dhe pastaj unë do të shpjegojë se. E pra, këtu ne shohim ne kemi ngritur një Breakpoint në këtë linjë në debug.c. Pra, çfarë do të thotë pushim është se kur unë shkruani drejtuar, programi do të vazhdojnë duke ecur deri I goditi një Breakpoint. Pra, kur i goditi të kandidojë, programi fillon, dhe pastaj ai e thyen sa më shpejt që të hyn funksionin kryesor. Pushim kryesor do të jetë diçka ju mjaft zakonisht bëni. Dhe tani, të prezantoj për disa komandat më shumë. Vini re këtu, se është e thënë ne theu në përputhje 11, e cila është printf, të hyjë një numër të plotë. Pra komanda tjetër do të jetë se si ne do të shkojmë në linjë tjetër e kodit. Kjo do të na lejojë të hap përmes linjës tonë të programit nga linjë. Pra ardhshëm. Tani linjë 12, ne do për të marrë numër të plotë. Next. Dhe në qoftë se ju vetëm hit Enter përsëri, ajo do të bëj sërish gjëja e fundit që keni kryer. Kështu që unë nuk kam nevojë të tipit tjetër çdo herë. Pra, të hyjë një numër të plotë, 13. Deri tani, linjë 14, ndërsa unë është më e madhe se 10, dhe unë do të bëjë tjetër. Dhe ne shohim ne jemi duke shkuar për pakësim i. Pra, ne jemi duke shkuar për pakësim i përsëri. Deri tani, një tjetër të dobishme komanda është Print. Pra Printo do të shtypura nga vlera e variablit. Le të sjellë nga vlera i i ndryshueshëm. Le të shtypura i. Ajo do të them unë është 11. Tani ne Next përsëri, ndërsa i është më e madhe se 10. Kështu që unë ende e madhe se 10, që nga ajo e 11. i minus minus. Le të shtypura i përsëri. Siç pritej, është 10. Deri tani, të ardhshëm. Është kthim në gjendjen, i është madh se 10, por i është tashmë 10, kështu ajo nuk është më i madh se 10, kështu presim ajo të bjerë nga lak, ndërsa. Dhe tani ne jemi poshtë atë linjë të kodit. Dhe një tjetër komandë, Lista, është vetëm do për të shfaqur mëparshëm dhe të ardhshëm disa rreshta të kodit, në rast ju ka humbur veten. Pra, ne vetëm të dalë këtë lak, ndërsa, dhe tani ne kemi hyrë në këtë ndërsa loop, linjë 18. Kështu, ndërsa unë nuk të barabartë 0. Dhe, tjetër, i barabartë i minus 3, dhe ne do të vini re, ky vetëm do të mbajë. Dhe ne mund të shtypura i. Çdo komandë lloj ka shkurtore. Pra, p është e shkurtër për Print. Pra, ne mund të p i. Vetëm mbani mbajtjen n, ose të vazhdojmë të bëjmë Next. Print i përsëri. Ju shikoni tani është negative 167. Pra, kjo do të zgjasë përjetë, por jo me të vërtetë përgjithmonë, pasi që ju vetëm e pa, ajo në të vërtetë do të përfundojë në një pikë. Kështu që është filluar gdb. Por le të bëjmë një gjë më shumë në gdb. Uh, debug. Pra, në këtë rast të veçantë, loop pafund ka ndodhur të jetë brenda Funksioni kryesor. Dhe tani për tani, vetëm të pranojë atë që unë jam duke shkuar për të lëvizur lak pafund në funksioni foo. Vetëm mos harroni se, në fund të këtij program, mirë, kjo ishte fillimisht duke e quajtur foo, e cila ishte vetëm duke shkuar për të shkruar i. Por tani ne jemi duke bërë thirrje foo, e cila është shkuar për pakësim i deri sa është 0, dhe pastaj të shtypura atë ndryshore. OK. Ruaj këtë. Bëni debug. Dhe tani, gdb debug. OK. Pra, nëse unë vetëm drejtuar atëherë unë nuk jam do të të jetë në gjendje që në fakt hap nëpërmjet tim Programi linjë-nga-line. Pra, le të thyejnë në kryesore, dhe pastaj shtypni kandidojë. Kështu që kalojnë nëpër këtë, printf, të hyjë një numër i plotë, të merrni numër i plotë, 13. Pra, ne jemi duke shkuar për të mbajtur decrementing derisa i është më e madhe se 10. Pastaj ne do të bien me ndërsa loop, dhe të marrë të vijë - le të hapur atë në një dritare të veçantë. Pra, ne decremented deri sa unë nuk ishte më madh se 10, dhe pastaj ne quajtur funksionin, foo. Pra, çfarë ka ndodhur sa më shpejt që unë goditi funksion foo, mirë, unë quajtur foo, dhe atëherë unë nuk kishte kontroll mbi gdb. Pra, sa më shpejt që unë goditi Next në këtë linjë, gjëra vazhdoi deri kjo ka ndodhur, ku programi exited kur - supozojmë se nuk ka ekzistuar përfundimisht. Ti e ke parë atë pauzë për një grimë pse. Pra, pse nuk kam humbur kontrollin mbi programi në atë pikë? E pra, kur unë lloji tjetër, që shkon në literal linjë tjetër e kodit që do të ekzekutojë. Pra pas 21 linja, linja tjetër e kodit që do të kryejë është linjë 22, që është, daljes nga kryesore. Kështu që unë nuk dua të shkojnë vetëm në linjë tjetër e kodit. Unë dua të shkoj në funksion, foo, dhe pastaj edhe hap përmes këto rreshta të kodit. Pra, për këtë, ne kemi një alternativë. Le të lënë atë përsëri. Pushim kryesore. Uh, 1, next, next, 13, next, tjetër, tjetër, me kujdes, para se goditi linjë foo. OK. Deri tani, ne jemi në linjë 21, ku ne e quajmë foo. Ne nuk duam të tipit tjetër, pasi që vetëm do të telefononi foo funksion, dhe shkojnë në vijën e ardhshme të kodit. Ajo që ne duam të përdorim është Hapi. Pra, ka një dallim në mes Hapi dhe Next, ku Hapi hapa në funksionojnë, dhe shkon Next mbi funksionin. Ajo vetëm ekzekuton tërësinë e funksioni dhe mban sipër. Pra Hapi do të na sjellë në funksion, foo. Dhe ne shohim këtu, tani, ne jemi mbrapa në kjo loop ndërsa kjo është, në teori, do të vazhdojë përgjithmonë. Dhe në qoftë se ju goditi Hapi, kur ajo nuk është edhe një funksion për të thirrur, atëherë është identike me Next. Pra, është vetëm kur ju jeni në një linjë që është duke bërë thirrje një funksion atë hap do të ndryshojnë nga Next. Pra Hapi do të na sjellë këtu. Hap, hap, hap, hap, hap, hap, dhe ne vetëm do të loop pafund përgjithmonë. Kështu që ju mund të merrni përdorur për të se si tuaj mënyrë për të identifikuar sythe pafund, është vetëm mbajtjen këtë kyç ENTER për të shih ku ju merrni mbërthyer. Ka mënyra më të mirë për të bërë këtë, por tani për tani, kjo është krejtësisht e mjaftueshme. Dhe stilistikisht, në përputhje me Style 50, unë duhet të ketë bërë këtë. OK. Pra, një komandë e fundit për të futur. E pra, le të gdb debug in Pra, në vend të thyer në kryesore, në qoftë se unë e di funksionin foo është edhe Problemi, atëherë unë mund të ketë vetëm tha: pushim në foo, në vend të kësaj. Le të thonë se unë të thyer në të dy kryesore dhe foo. Kështu që ju mund të vendosni sa më shumë breakpoints si ju dëshironi. Kur unë lloji të kandidojë, kjo do për të ndaluar në - ooh, le të përpiluar, që nga I ndryshuar gjërat. Ju do të shihni këtë linjë, Paralajmërimit, burim Skeda është më e fundit se ekzekutues. Kështu që do të thotë se unë vetëm shkoi në këtu dhe ndryshuar këto të jenë në përputhje me Style 50, por nuk e kam përpiluar programi. Pra Gdb më bën të vetëdijshëm për këtë. Unë do të të lë, të bëjë debug përsëri, goditi gdb debug. OK. Deri tani, përsëri në atë që bëja. Pushim kryesore, foo pushim. Tani në qoftë se unë të drejtuar programin, kështu që është e do të vazhdojë deri hits një Breakpoint. Kjo Breakpoint ndodh me të jetë i pari në kryesore. Tani, në vend që të bëjnë tjetër, tjetër, tjetër, tjetër, tjetër, deri sa unë goditi foo, unë mund të shtypni të vazhdojë, e cila do të vazhdojë deri sa ju goditi Breakpoint ardhshëm. Më duhet të hyjë në numër të plotë të parë. Vazhdo do të vazhdojë deri sa të goditur Breakpoint tjetër, e cila është se Funksioni i foo. Pra Run do të kandidojë deri sa ju goditi një Breakpoint, por ju vetëm shtypni kandidojë kur ju jeni duke filluar programin, dhe më pas, prej atëherë e tutje, është të vazhdojë. Nëse unë vetëm e bëri të thyer kryesor dhe pastaj u zhvillua, ajo do të thyer në kryesore, dhe pastaj të vazhdojë. Që unë nuk kam një pikë pushim në foo, të hyjë në numër i plotë, atëherë tani unë jam i nuk do të thyer në foo. Është vetëm do të pafund loop deri në atë. OK. Pra, kjo është Intro të gdb. Ju duhet të filloni duke e përdorur atë në grupe tuaja me probleme. Ajo mund të jetë shumë e dobishme për të identifikuar mete. Në qoftë se ju në të vërtetë vetëm, linjë-nga-line, shko me anë të kodit tuaj, dhe të krahasojnë atë që është e në të vërtetë ndodh me atë që ju presin të ndodhë, atëherë kjo është goxha e vështirë të humbasë mete tuaj. OK. Pra, javën e kaluar Davidi solli këtë sende sekret-kyç Kriptografia për hera e parë, ku ne nuk duam Fjalëkalimet vetëm të ruhen në tonë kompjuter në një skedar teksti të thjeshtë, ku dikush mund të vijnë mbi dhe vetëm hapur atë dhe lexoni ato. Në mënyrë ideale, ata do të jenë të koduara në një farë mënyre. Dhe në Problem Set 2, ju do të jetë që kanë të bëjnë me një metodë të encryption, apo, edhe, dy metoda, por ata nuk janë aq të mëdha. Nëse ju bëni edicionin e hacker, ju jeni gjithashtu do të merret me decrypting disa gjëra. Pra, çështja tani është, mirë, edhe në qoftë se ne kemi encryption fortë algorithm në botë, në qoftë se ju zgjidhni një regjistrohu veçanërisht i dobët, atëherë ajo nuk do të ju ndihmojë shumë, pasi njerëzit do të jenë ende në gjendje të kuptoj atë. Edhe në qoftë se duke parë të vargut të koduara dhe kjo duket si një rrëmujë e mbeturinave që do të thotë asgjë për ta, në qoftë se ata ende vetëm duhet të provoni një fjalëkalime pak të kuptoj atë, atëherë ju nuk janë shumë të sigurt. Pra, shikuar një video që e thotë. [VIDEO Playback] -Helmetë, ti dreq. Çfarë po ndodh? Çfarë jeni duke bërë për vajzën time? -Më lejoni të prezantoj shkëlqyer kirurg plastike të rinj, Dr Phillip Schlotkin, hundë e madhe punë dikush në të gjithë universit, dhe Beverly Hills. -Madhëria juaj. -Nose punë? Nuk të kuptoj. Ajo tashmë kishte një punë hundë. Kjo ishte një e ëmbël gjashtëmbëdhjetë të pranishëm. -Jo. Kjo nuk është ajo që ju mendoni. Është shumë, shumë më keq. Nëse ju nuk e jepni kombinim të mburojë e ajrit, Dr Schlotkin do jepni vajzën tuaj të kthehet hundën e saj të vjetër. -Jo. Ku e keni marrë këtë? -Në rregull. Do ta tregoj. Do ta tregoj. Jo, babi. Jo, ju nuk duhet. -Ti je e drejtë, e dashur. Unë do të humbasë hundën tuaj të re. Por unë nuk do të them atij kombinim, pa marrë parasysh çfarë. -Shumë mirë. Dr Schlotkin, të bëjë më të keq e juaj. -Ime kënaqësi. [Tools duke u mprehur] -Jo. Prisni. Prisni. Do ta tregoj. Do ta tregoj. -E dija se do të punojë. Dakord. Ma jep mua. -Kombinim është një. -One. -One. -Dy. -Dy. -Dy. -Tre. -Tre. -Tre. -Katër. -Katër. -Katër. -Pesë. -Pesë. -Pesë. -So kombinim është një, dy, tre, katër, pesë. Kjo është kombinimi budalla Kam dëgjuar ndonjëherë në jetën time. Kjo është lloj gjë një idiot do të ketë në bagazhin e tij. Ju-Faleminderit, Madhëria juaj. -Çfarë keni bërë? -I fikur murin. -Jo ju nuk e keni. Ju fikur të gjithë filmin. -Unë duhet të ketë presion butonin e gabuar. -E pra, e vënë atë përsëri në. Vendos filmin prapa. -Po, zotëri. Po, zotëri. -Le të shkojmë, Arnold. Ejani, Gretchen. Sigurisht, ju e dini se unë do ende duhet të ju faturën për këtë. [END VIDEO rishikim] Rob BODEN: Në rregull. Pra, tani që ne jemi tashmë duke folur për sigurisë në disa mënyra, e bukur pak poster film, kështu që në kohëve të fundit ditë, këto çështje me NSA monitorimin e çdo gjë. Ajo mund të jetë e vështirë për të ndjehen si ju kanë një lloj të privatësisë në Online botë, edhe pse unë nuk mund të them ju shumica e detajet e Prism. Pra, duke lëvizur përtej prizëm, ne nuk do për të folur për këtë, tani mendoni për laptopë tuaj. Pra deri këtu, unë dua të kaloni në llogarinë time aktuale, me pinguin tim të vogël. Kështu që unë kam një password caktuar, dhe se regjistrohu është çdo gjë që unë dua që ajo të jetë. Por mos harroni se ajo që unë jam duke prerje-transportim trupash në me të, kështu që kjo login të shpejtë, është një program. Është një program i cili ishte i shkruar nga ndonjë person. Dhe kështu, ai person, nëse ato janë të veçanërisht me qëllim të keq, që të kishte kanë thënë, të gjithë të drejtë, kështu që nëse fjalëkalimi që unë të hyjë është e barabartë me tim regjistrohu aktuale, apo është e barabartë deri në një fjalëkalim të veçantë - David është awesome apo diçka - atëherë le ato in Pra, një programues me qëllim të keq mund të ketë qasje në të gjitha Macs tuaj, ose Dritaret, apo ndonjë gjë. Kështu që nuk është shumë i një shqetësim, pasi, Unë do të thotë, ky është program login që është dërguar me OS X, qindra ose mijëra njerëz kanë shqyrtuar këtë kod. Dhe kështu, në qoftë se, në kodin tuaj diku, ju thonë se nëse kjo është e barabartë me string është e barabartë me David is awesome, login, atëherë dikush është do të jetë, si, prisni. Kjo nuk është e drejtë. Kjo nuk duhet të jetë këtu. Pra, kjo është një mënyrë që ne të merrni gjërat të jetë lloj i sigurt. Por mendoj se për edhe programet e që ju shkruani. Le të thonë se ju ka shkruajtur programin login. Pra, ky program login që ju ka shkruajtur, kështu natyrisht, ju jeni një të mirë programues. Ju nuk do të jeni për të vënë ndonjë qëllim të keq nëse x është e barabartë e barabartë me David është awesome në kodin tuaj. Por ky program, çfarë bëni ju përdorin për të hartuar këtë program? Diçka si tingëllimë. Pra, çfarë nëse personi i cili ka ndodhur të shkruani tingëllimë Speciale cased në tingëllimë diçka si, në qoftë se unë jam hartimin login program, pastaj futni këtë kod në programin e hyrjes që thotë se, në qoftë se x është e barabartë e barabartë me David është awesome? Pra, nuk mjaft ende, por ne kemi të njëjtën nxjerrë këtu, ku tingëllimë, mirë, mijëra, në mos dhjetëra mijëra njerëzit, e kanë shikuar në tingëllimë, kanë shikuar në linjat e saj të kodit dhe tha: të gjithë të drejtë, nuk ka asgjë të keqe këtu. Natyrisht, askush nuk është duke bërë gjë kjo me qëllim të keq. Por ajo që është tingëllimë veten, si, çfarë nëse unë përpilojnë tingëllimë? Çka nëse unë kam disa përpilues që harton tingëllimë që e fut në tingëllimë kjo hack veçantë që thotë, të gjithë të drejtë, kur unë përpilojnë tingëllimë, atëherë ekzekutueshëm të shkoj duhet posaçërisht të shikoni brenda programit login dhe insert kjo fjalëkalimin, është e barabartë me të barabartëve Dave është awesome? Pra mos harroni se compiler tuaj vetë duhet të përpilohet në një pikë. Pra, në qoftë se ajo që ju zgjidhni për të hartuar tingëllimë me, në vetvete është me qëllim të keq, atëherë ju do të mund të dehur të gjithë Mënyra më poshtë vijës. Kështu që këtu, ne kemi Ken Thompson dhe Dennis Ritchie. Pra, kjo është një foto portreti. Dennis Ritchie është në të djathtë. Ai është një i madh - shumë e shumë të shkruajtur C. Pra, ju mund të falënderoj atë për këtë klasë. Ken Thomson është në të majtë. Dy prej tyre në thelb ka shkruajtur UNIX. E pra, ata kanë qenë kontribuuesit kryesor në UNIX. Ka pasur disa të tjerë. Pra Ken Thompson, në një pikë, ai fiton Çmimin Turing. Dhe çmimin Turing, unë kam dëgjuar gjithmonë kjo i referohet në këtë mënyrë, është e Çmimin Nobel e shkencave kompjuterike. Pra, në Çmimin Turing, ai ka për japë fjalimin e tij të pranimit. Ai jep këtë fjalim shumë i njohur tani, i quajtur Reflektime mbi besuar Trust, të cilat ne e kanë lidhur për të në faqen e internetit të kursit. Dhe në këtë fjalim, thotë ai, të gjithë të drejtë, kështu që kam shkruar UNIX, dhe tani të gjithë ju njerëzit janë duke përdorur UNIX. Tani, mos harroni sot se Linux është një pasardhës i drejtpërdrejtë i UNIX. OS X direkt përdor UNIX. Windows-i nuk e bën aq shumë, por shumë e ideve janë marrë nga UNIX. Pra se të ngjitet në skenë dhe thotë, të gjithë të drejtë, kam shkruar UNIX. Dhe vetëm kështu që ju djema e di, unë jam i gjendje të hyni në çdo një të vetme nga kompjuterat tuaj. Që unë vënë një nga këto të veçantë në qoftë se x është e barabartë barabartë Ken Thomson është awesome, atëherë unë jam i lejuar të identifikoheni. Pra, njerëzit janë si, mirë, Si do të bëni këtë? Ne shikuar në programin e hyrjes dhe asgjë nuk është atje. Ai është si, mirë, unë ndryshuar për herë përpiluesit të hyni në program login në mënyrë që programi login tani do të ketë se x është e barabartë është e barabartë me Ken Thompson është awesome. Dhe ata thonë, mirë, kjo nuk është e vërtetë. Ne jemi duke kërkuar në përpiluesit, dhe përpilues nuk ka ndonjë vijë të Kodi si kjo. Ai është si, rregull, por ajo që jeni hartimin përpiluesit me? Dhe ata mendojnë, dhe ai është, si, dhe, Unë jam ai që ta dha përpiluesit ju jeni duke përdorur për të hartuar përpiluesit, kështu ju jeni hartimin e një përpilues, që në vetvete është me qëllim të keq, dhe do të thyejnë programin login. Pra, në thelb, në atë pikë, nuk ka asnjë mënyrë ju mund të shikoni në burim Kodi i programit login për të parë se çfarë është e gabuar. Ju nuk mund të shikoni edhe në Kodi burimor i përpiluesit për të parë se çfarë është e gabuar. Ju do të duhet të shohim në makinë Kodi, binar aktuale e compiler hartuar për të parë, prisni, këto rreshta të kodit nuk duhet të jetë këtu. Por Ken Thompson e mori atë një hap më tej dhe tha, mirë, ka këto programe të veçanta që në fakt ndihmojë të lexoni binare e programeve, dhe kështu që nëse dikush përdorur këtë program për të lexoni binare, ata do të shohin këto rreshta të kodit. Ai modifikuar ato programe për të thënë, të gjithë e drejtë, nëse ju jeni duke kërkuar në përpilues, nuk e tregojnë këtë të veçantë set binar. Pra, atëherë ju duhet të marrë atë një hap më tej dhe në thelb, që mund të ketë Nivelet e marra të shumta të tërthortë, dhe në një moment, askush nuk është në të vërtetë do të jetë i kontrolluar. Pra, morale e tregimit është, ju jeni nuk do të jetë me shkrim Tingëllimë në këtë klasë. Ju jeni do të jetë duke përdorur ngjitje Tingëllimë shumë në këtë klasë. Për të gjithë ju e dini, tingëllimë është një qëllim të keq program që është sabotimin e çdo programi i vetëm që ju keni hartuar ndonjëherë. Dhe të largohet nga ju më shumë se ogurzi vini re, shihemi të mërkurën. [Duartrokitje] Gjuha 2: Në CS50 ardhshëm. Gjuha 3: A nuk ju guxoj të them se. Ju mund ta bëni këtë. Ju keni bërë këtë më parë, ju mund ta bëni këtë sot, ju mund ta bëni këtë nesër. Ju keni qenë bërë këtë për vite me rradhë. Vetëm të shkojnë deri atje dhe të bëjë këtë. Ju mund ta bëni këtë. [MUSIC Playing]