[Speel van musiek] ROB BODEN: Alle reg. So, in die eerste ding wat eerste, video van 'n bekende gesig. [Video speel] -Alle regte. Dit is CS50, en dit is die begin van die week, drie. Ek is jammer ek kon nie daar wees saam met jou vandag, maar laat my in te voer CS50 se eie Rob Boden. [Einde video speel] [Applous en CHEERS] ROB BODEN: Die filmografie in dat die video is fantasties. Alle regte. So die eerste, daar is nog 'n middagete. Dit is môre by 01:15. Daar is geen middagete hierdie Vrydag. Dit is met Quora. En Tommy is nie hier nie, maar een van die mense daar is voormalige hoof CF, Tommy McWilliam. So hy is 'n prettige man. Jy moet kom. Alle regte. So verlede week, het ons begin uitmekaar breek oor wat 'n string werklik is. Ons het sedert die begin bekend dat dit is 'n reeks van karakters. Maar verlede week, het ons beweeg in die feit dat dit wat is regtig 'n reeks van karakters, wel, ons het nou ' skikkings van die karakters. En ons weet dat 'n string, dit is 'n verskeidenheid van die karakters, heel aan die einde, ons het hierdie spesiale nul byte, hierdie backslash 0, wat dui op die einde van die string. En so 'n string is 'n verskeidenheid van karakters, maar ons kan nie meer as net 'n verskeidenheid van die karakters, Ons kan 'n verskeidenheid van enige het tipe ding wat ons wil hê. So, as jy onthou van verlede week, die Ouderdomme program wat Dawid ingestel regtig vinnig. So die eerste ding wat ons gaan doen, is om vra die gebruiker vir 'n heelgetal is, die aantal mense in die kamer. Sodra ons daardie getal, ons verklaar 'n skikking. Let op hierdie bracket sintaksis. Jy gaan om gewoond te raak aan daardie. So ons is 'n verskeidenheid van heelgetalle verklaar genoem ouderdomme, en daar is n heelgetalle in hierdie reeks. So hierdie patroon reg hier, hierdie 4 int Ek is gelyk aan 0, i minder as n, i plus plus, wat ook gaan om 'n patroon te wees dat jy baie gebruik om te. Want dit is pretty much hoe jy altyd gaan Itereer oor skikkings. So onthou dat n die lengte van ons verskeidenheid. En so hier het ons herhaaldelik gevra vir die ouderdom van persoon wat ek in die kamer. Na dit, sal ons aftrek en vir watter arbitrêre rede, het ons dan druk hoe oud hulle gaan na 'n jaar van nou af. En hardloop die program, laat maak ouderdomme, dot streep ouderdomme. So aantal mense in die kamer, Kom ons sê daar is drie. En sê, die eerste persoon is 13, volgende is 26, en die laaste is 30. So dan sal dit Itereer oor die drie mense, uit te druk 14, 27 en 31. So onthou dat wanneer ons verklaar 'n verskeidenheid van grootte n, die indekse in daardie skikking, die skikking het waardes en indekse 0, 1, 2, al die pad tot N minus 1. So wanneer ons sê daar was drie mense in die kamer, en ons sit hier die eerste iterasie deur hierdie lus, is ek gaan wees 0. So in indeks 0. Ons is die toeken van die eerste ouderdom van die gebruiker. Toe ek in die volgende een, is ons die invoer van die tweede n die gebruiker, en in langs twee, die laaste n. So sien dat 'n skikking van die grootte drie nie iets in die indeks drie. Dit is nie geldig nie. Alle regte. So, gaan terug hier. So nou dat ons met skikkings gehandel het, Ons het 'n paar bekendheid. Nou gaan ons aan te beweeg na opdrag line argumente, wat gaan wees mooi relevant vir hierdie probleem stel. So tot nou toe, wanneer jy het verklaar jou hoof funksie, het ons gesê int belangrikste leemte. So nietig beteken net dat ons is nie verby argumente aan hierdie funksie. Nou gaan ons wat hoof te sien kan 'n paar argumente. Hier noem ons int argc en string bevat SPASIES hakies. Die hakies, weer, wat aandui dat ons te doen het met skikkings. So hier, string bevat SPASIES hakies, ons is die hantering van 'n verskeidenheid van snare. So argc, wat gaan om aan te dui hoeveel argumente wat ons het geslaag om hierdie program. En om te sien wat dit beteken, laat se sluit hierdie. OK. So tot nou toe, het ons elke hardloop program soos dot streep ouderdomme. Ons kan ook op die opdrag lyn, verby slaag argumente, dus die term, opdrag line argumente. So het die eerste argument, hallo wêreld. So hier is, sal argc drie. Dit is die telling van die argumente op die opdrag lyn. Argc is altyd ten minste 1, sedert dot streep ouderdomme, self, tel dit as een van die command line argumente. Dan hallo is die eerste. As dot streep ouderdomme is die nulde, dan hallo is die eerste, en die wêreld is die tweede opdrag lyn argument. So het die string bevat SPASIES, ons gaan om te sien, bevat die snare, dot streep ouderdomme, hallo, en die wêreld. En, deur David se versoek, ons gaan 'n video wat die bekendstelling om te speel. [Video speel] -Tot nou in programme wat ons het geskryf is, het ons verklaar hoof as int belangrikste leemte. En al hierdie tyd, daardie leemte het bloot spesifiseer dat die program nie enige neem command line argumente. Met ander woorde, wanneer 'n gebruiker loop 'n program, kan hy of sy voorsien opdrag line argumente deur die skryf van bykomende woorde of frases na die program se noem op die instruksielyn. Wel, as jy doen wat jy wil om jou program te neem command line argumente, een of meer sulke woorde, ons moet vervang leemte met 'n paar van die argumente. So laat ons dit doen. Sluit CS50.h. Sluit in standaard io.h. Int hoof. En nou, in plaas van leemte, ek gaan spesifiseer 'n int genoem argc, en 'n verskeidenheid van snare genoem bevat SPASIES. Nou, argc en bevat SPASIES is eenvoudig konvensies. Ons kon hierdie argumente genoem het die meeste enigiets wat ons wil hê. Maar wat belangrik is, is dat argc is 'n int, want per definisie, is dit gaan die argument telling te bevat, die aantal woorde in totaal wat die gebruiker getik op sy of haar onmiddellike. bevat SPASIES, intussen, argument vektor, is gaan eintlik 'n skikking te stoor wees al die woorde wat die gebruiker getik op sy of haar onmiddellike. Kom ons gaan nou iets te doen met een of meer van hierdie command line argumente. In die besonder, laat ons gaan voort en druk watter woord die gebruiker na die program se naam op die instruksielyn. Open bracket. Close bracket. Printf persent s backslash en komma. En nou het ek nodig printf watter waarde te vertel aan te sluit in dat bevat. Ek wil die eerste woord wat die gebruiker getik nadat die program se naam, en so ek gaan om te spesifiseer bevat SPASIES bracket 1, naby hakies, kommapunt. Nou, hoekom bracket 1 en nie bracket 0? Wel dit blyk, outomaties gestoor in bevat SPASIES 0 gaan wees om die program se werklike naam. Dus is die eerste woord wat die gebruiker na die program se naam is, deur konvensie, gaan wees gestoor in bevat SPASIES 1. Kom ons nou saam te stel en hierdie program. Maak bevat SPASIES 0, dot streep bevat SPASIES 0. En nou 'n woord soos Hello. Betree. En daar het ons dit, hallo. [Einde video speel] ROB BODEN: Alle reg. Maak dit. So 'n blik op die program wat Ons het net aan ons voorgestel, goed, net om te wys, as ons druk bevat SPASIES 0, maak, nou Wat is dit, bevat SPASIES 0, dot streep bevat SPASIES 0. So, as wat verwag is, is dit die druk van die naam van die program, aangesien bevat SPASIES 0 is altyd gaan wees om die naam van die program. Maar laat ons iets doen 'n bietjie meer interessant. So in die probleem stel, sal jy bekendgestel aan hierdie funksie, atoi. So wat doen ons gebruik atoi vir? Dit gaan sit 'n string na 'n heelgetal. So as ek verby die string, een twee drie, te atoi, sal daardie skakel wat na die getal, een twee drie. So ons gaan die eerste om te skakel command line argument tot 'n heelgetal, en dan net druk wat heelgetal. So basies, is ons soort reimplementing getint, net die heelgetal is wat by die opdrag lyn in plaas van in die program interaktief. So dan, wat bevat SPASIES 0, kom ons doen dit in hier, en sluit dit. So hardloop bevat SPASIES 0, en laat ons betree die integer, een twee drie vier een twee. So dit sal die heelgetal druk, een twee drie vier een twee. Daar is 'n paar subtiele wat aan atoi dit sal ophou omgee oor enige iets buite 'n geldige numeriese karakter, maar dit maak nie saak. So, wat dink jy gebeur As ek dit doen? Segmentering skuld. So hoekom is dit? As jy terug kyk op ons program, ons is omskakeling bevat SPASIES 1, die eerste argument na die program se naam, tot 'n heelgetal. Maar daar is geen argument geslaag na die program se naam. So hier is, sien ons dat dit 'n karretjie program, aangesien, as ons probeer om dit uit te voer sonder enige argumente, dit sal net crash. So 'n algemene patroon wat jy sien is iets soos, as argc minder as twee, wat aandui dat daar was nie ten minste die program naam en 'n eerste argument, dan sal ons iets doen soos printf, nie genoeg command line argumente. Dit is waarskynlik nie 'n goeie een om te druk, dit is waarskynlik iets soos jy moet 'n heelgetal tree op die opdrag lyn. Ek sal net die einde van dit daar. En dan terug 1. So onthou dat aan die einde van ons program, as ons terugkeer 0, dat die soort van dui sukses. En die belangrikste ook outomaties terugkeer 0 as jy dit nie doen nie. So hier is ons gestemd 1 aan te dui dat dit is nie 'n sukses. En jy kan terugkeer wat jy wil, net, 0 dui sukses, en iets anders dui mislukking. So laat ons hardloop hierdie weergawe van die dinge. So nou, as ons nie gaan nie 'n command line argument, dit sal korrek vertel ons nie genoeg command line. Het nie klaar is met die vonnis. Want as ons eintlik gee dit een, dit kan die program te voltooi. So dit is hoe jy argc sou gebruik in Om die aantal te bekragtig command line argumente wat eintlik geslaag. So kom ons maak hierdie program 'n bietjie meer ingewikkeld, en kyk na die tweede iterasie van dinge. So nou, ons is nie net die druk van die eerste opdrag lyn argument. Hier is ons iterating van int i gelykes 0, i minder as argc, i plus plus, en druk bevat SPASIES, indeks i. So hierdie patroon, weer, dit is dieselfde patroon as voorheen, behalwe in plaas van die roeping van die veranderlike n, gebruik ons ​​argc. So dit is iterating oor elke indeks in die skikking, en die druk van elke element in die skikking. En so, wanneer ons hierdie program, goed, Ek het nie 'n command line argumente, so dit is net druk die program se naam. As ek 'n klomp van die dinge, dit sal druk een, elk op sy eie lyn. OK. So laat neem hierdie 'n stap verder. En in plaas van die druk van elke argument op sy eie lyn, laat se druk elke karakter van elke argument op sy eie lyn. So onthou dat bevat SPASIES is 'n verskeidenheid van snare. So, wat is 'n string, maar 'n verskeidenheid van die karakters? So dit beteken dat bevat SPASIES is regtig 'n verskeidenheid van 'n verskeidenheid van die karakters. So neem voordeel van daardie, laat se ignoreer vir nou. Laat ons net kyk na die string bevat SPASIES 0. So as ons wil elke karakter te bring bevat SPASIES 0 op sy eie lyn, dan wil ek die patroon wat ons gewoond is om te doen, ek is minder as die lengte van die skikking, wat hier is, is strlen van, dis nie wat ek wil doen, string s gelyk bevat SPASIES 0. So ek is minder as die lengte van ons skikking, wat in hierdie geval is 'n skikking van die karakters, i plus plus. En so, soos ons verlede week gesien het, is dit die ideale As ons beweeg wat buite strlen van die toestand, sal sedert n byvoeg die StrLen van s elke keer as ons gaan deur die lus, en dit is nie gaan om te verander. So sal ons dit gelyk is aan n hier stel. OK. So nou, ons iterating oor elke indeks in die skikking. En so, as ons wil elke te druk karakter in die skikking, persent c is die vlag wat ons wil gebruik vir karakters. En nou 'n bracket ek gaan wees om die string, indeks karakter i, so as die string was hallo. dan is 0 gaan h te wees, s bracket 1 sal wees e, en so aan. So nou wil ons te kombineer Hierdie twee dinge. Ons wil elke karakter te druk van elke opdrag lyn argument. So ons gaan te hê 'n geneste for-lus. En konvensionele, die eerste counter EK, die volgende gaan j te wees, n sal die StrLen van bevat SPASIES ek, i minder as n, i plus plus. En nou in plaas van die druk bevat SPASIES i, so bevat SPASIES bracket ek gaan na die lys - wat gaan die i-de command line te wees argument, bevat SPASIES i, j gaan wees om die karakter van JTH die i-de argument. Ek sal ontslae te raak van hierdie tot nou hier want ons het dit in daardie lus. So is gelykstaande aan string s gelykes bevat SPASIES i, en dan is bracket j. Wel, ons het nie nodig om te verklaar hierdie veranderlike is. In plaas daarvan, sal ons net kombineer hierdie twee in wat ons gehad het, bevat SPASIES i, j. Spreker 1: [onhoorbaar]. ROB BODEN: Goeie oproep. So dit is gebreek. As ek eintlik gehardloop het, sou ons het besef dit. So die toonbank ek omgee in hierdie besonder vir lus is j, die Iterator. So jy sou gehardloop het in kwessies, waarskynlik 'n oneindige lus, as ons het nie 'n vaste dit. Dit is hoekom ons ook praat Vandag oor die opsporing. OK. So laat ons hierdie program. En laat ons eintlik voeg 'n aparte printf hier wat net sal druk 'n ander lyn, want dit beteken wanneer ons hardloop die program, sal daar 'n leë wees lyn tussen elke karakter van elke opdrag lyn argument. Wel, ons sal sien wat dit beteken. Oop. Het 'n paar fout. Fout onvoorwaardelik verklaar biblioteek funksie strlen. So gaan terug in ons program, het ek vergeet om te hash sluit string.h. So string.h gaan wees om die kop lêer wat verklaar die funksie strlen. OK, dit stel. Nou, laat ons voer dit uit. So net dat. Dit gaan om uit te druk ons program se naam, hallo wêreld. Dit gaan elke ding om te druk, elke karakter, op sy eie lyn. OK. So laat ons eintlik neem hierdie 'n stap verder. En in plaas van die gebruik van string.h, laat dink oor hoe ons wil implementeer ons eie strlen funksie. So ek sal onmiddellik gee 'n funksie handtekening. So kom ons noem in my_strlen, en dit is gaan 'n string te neem as 'n argument, en ons verwag om terug te keer die lengte van die string. So, waar is die man? Ja. OK. So onthou van die vorige skyfie wat was ook van verlede week, wat 'n verskeidenheid van die karakters, wel, 'n string, so kom ons sê dit is ons string s. So as s is die string, hallo, dan, H-E-L-L-O, in die geheue, wat gaan wees, en dan is dit backslash 0 karakter. So hoe kry ons die lengte van s? Wel, die truuk soek vir hierdie teenreaksie 0 karakter, hierdie null Terminator. So het die algoritme gaan iets soos min te wees genoeg karakters wat - laat ons hierdie kant verteenwoordig 'n paar counter, kom ons noem dit int lengte. So, begin van hier, ons is gaan Itereer oor ons tou. Dus is die eerste karakter, dit is H, en dit is nie terug streep 0, so die lengte is 1. Itereer na die volgende karakter, E, en dit is nie agteroorskuisstreep 0. Lengte is 2. L, 3. L, 4. O, 5. En uiteindelik, kom ons backslash 0, en so dit beteken dat, wel, hierdie string is verby. So laat ons terugkeer 5. So eintlik die uitvoering van die eerste, my n lengte is gelyk aan 0, my regterhand. En ons gaan Itereer - Spreker 1: [onhoorbaar] ROB BODEN: O, skiet. Goeie oproep. Boom. So n lengte is gelyk aan 0. So nou, terwyl s lengte nie gelyk en dan, backslash 0. So onthou, hierdie backslash 0, is dit 'n werklike karakter, en dit dui die einde van die string. Net soos, ook backslash n 'n werklike karakter. Agteroorskuisstreep 0 gaan om aan te dui die einde van ons reeks. Ek wil nie dat daar te vestig. En terwyl s geïndekseer deur lengte is nie gelyk aan die nul terminator, dan ons is maar net gaan om lengte te inkrementeer. So dan, aan die einde van ons program, lengte uiteindelik gaan wees 5 in hierdie geval. En ons sal net terug lengte. OK. So nou hier, ek doen nie doen my_strlen. Kom ons stel dit om seker te maak alles vlot verloop. Was ek doen in 2? Of was dit 1? Dit moet doen. Alle regte. So is dit bevat SPASIES 2. Werk as wat verwag is, hoewel was dat die een wat ek het dit in? Ja. OK. Hierdie weergawe van die dinge het nie die printf nuwe lyn na, maar dit nie 'n verskil maak. OK. So het as wat verwag is. Nou kan ons selfs kombineer hierdie een stap verder, waar kennis hier, wel, Eerstens, ons is die StrLen van bevat SPASIES gryp Ek, en dan is ons iterating oor elke karakter in die string. So in plaas van om dit te doen, wat as ons net kombineer die logika van wag totdat ons getref backslash 0 reg in hierdie lus? So Itereer terwyl bevat SPASIES i, j doen nie gelyk backslash 0. So laat loop dit die eerste keer. Alle regte. So hier is, is hierdie toestand te sê - laat dit duidelik dat. So nou, laat dit ons bevat SPASIES. So toe ek net hardloop die program voor, bevat SPASIES is 'n verskeidenheid van snare. En so, as ek loop dit met dot streep bevat SPASIES 2, Hello World, dan is die bevat SPASIES self is lengte van 3, vir bevat SPASIES nul, hallo, en die wêreld. En binnekant van elk van hierdie indekse is, self 'n skikking, waar dit sal wees dot, dit sal streep wees, weet ek nie As dit was die regte rigting, ek dink nie dit was nie. A-R-V Dash, het meer ruimte nodig. Kom ons sny in die skikking. A-R-V Dash 0, en dan backslash 0. En dan in wanorde sal wees hallo. Kom ons sê, H-E backslash 0. En uiteindelik, W-O backslash 0. So het die algoritme wat ons het net geskryf het, Die geneste vir loops, wat hulle doen, is, moet ons eers die werk i en dan j. Dit sou makliker met 'n kode op die wees skerm, Kom terug te gaan nie. OK. So sien dat ek is die Iterator dis iterating oor elke opdrag lyn argument. En j is die Iterator iterating oor elke karakter in daardie command line argument. So, wat hierdie innerlike printf doen is, het ons printf bevat SPASIES 0 0, printf bevat SPASIES 0 1, printf bevat SPASIES 0 2, 3 0, 0 4, 0 5, 0 6, maar nou, bevat SPASIES 0 7 gaan gelyk backslash 0. So het ons verlaat dat lus, en nou kan ek iterate 1. En nou gaan ons te druk bevat SPASIES 1 0, bevat SPASIES 1 1 - Wel, nou, aangesien Ek sny hallo kort, bevat SPASIES 1 2 is weer aan die gang te wees backslash 0. En so, inkrementeer i en voort te gaan, en so aan, totdat ons druk al wêreld, en dit is drie command line argumente, en ons sal uitgang uit die buitenste lus, en klaar is met ons program. OK. So laat ons terug te kom hier. So sal jy 'n paar vertroudheid met kry command line argumente op hierdie spesifieke probleem stel. Nou, debugging. So het jy waarskynlik reeds te doen gehad sommige debugging met jou vorige probleem stel. En 'n baie maklike manier om ontfouting, Eerstens, laat ons kyk na 'n karretjie program. Wel, loop deur middel van hierdie program, ons gaan die gebruiker vir 'n om te vra integer, gryp wat heelgetal, en dan, arbitrêr, ons het 'n rukkie lus wat gaan net decrement Ek totdat dit gelyk aan 10. Laat ons net aanvaar wat ek invoer 'n heelgetal groter as 10. So decrement i totdat dit gelyk aan 10. En dan het ons nog 'n rukkie lus dat, terwyl ek nie gelyk 0, ons is gaan ek te decrement deur 3. So as jy sien die bedoeling van die fout hier, is dit dat hierdie sal decrement i te 10 wees, en dan is dit terwyl lus decrement i van 10 tot 7, 4, 1, negatiewe 2, negatiewe 5, en so aan, te negatief oneindig, want ek sal nooit werklik gelyk 0. En dan aan die einde van hierdie program, ons het die cat funksie wat gaan oor die druk dat ek. So, dit is 'n kort en triviale program, en die fout is voor die hand liggend, veral nadat ek net gesê wat die fout was. Maar die bedoeling hier is, wel, dit dalk eintlik lyk soos 'n paar van jou oplossings van gulsige van die laaste probleem stel, en miskien is jy nie ' sommige oneindige lus in jou program, en jy het geen idee wat dit veroorsaak het. So 'n baie nuttige opsporing tegniek is om net printfs oor jou kode. So hier Ek wil 'n printf buite eerste while loop. En hier wil ek 'n printf, en ek sal net druk ek. Ek sal selfs die eerste doen terwyl lus, i. Buite, tweede, terwyl lus. Weereens, druk binne van hier, die waarde i. En laat loop nie. So dot streep debug. Tik 'n heelgetal. Kom ons doen 13. En boom. Ons sien dat ons oneindige herhaling binnekant van die tweede, terwyl lus. So nou weet ons wat die fout is. Maar printf debugging is perfek groot, maar wanneer jou programme kry langer en meer ingewikkeld is, is daar meer gesofistikeerde oplossings te Aan die dinge werk. So laat verwyder al hierdie printfs. En laat ons seker maak ek het nie breek nie. OK. So het die program ons gaan bekend te stel word genoem GDB, vir GNU Debugger. Wel, eintlik, laat verwyder debug vir 'n tweede, en maak debug weer. Wel, eintlik die eerste, 'n goeie les in command line argumente. Let daarop dat hierdie klang opdrag wat opstel van alles wat geslaag op die opdrag lyn, is hierdie command line argumente. So presies hoe jy gaan word met behulp command line argumente, soos ons gedoen het voor, en as jy wil in PSET 2, dit is hoe klang is met behulp van hulle. So sien dat hierdie eerste vlag Dash ggdb3, wat dit gaan sê is, klang, Jy moet hierdie lêer saam te stel met die bedoeling dat ons sal uiteindelik nodig het om dit te ontfout. So lank as wat jy het dat die vlag, Dan kan ons GDB debug. En dit sal oopmaak om die GNU Debugger. So is daar 'n klomp opdragte wat jy nodig het om gewoond te raak. Eerste een wat jy sal waarskynlik onmiddellik moet word uitgevoer. So, wat is hardloop gaan doen? Dit gaan ons program te begin. So loop, begin program, die program ons vra vir 'n heelgetal, 13. En dan is dit oneindig herhaling as verwag, behalwe as ek verwyder die printfs, sodat ons nie eens sien nie dat. Opgewonde normaalweg. Oh. Dit is moontlik dat dit toegedraai al die manier om, terug na - ignoreer nie. Aanvaar dit nie normaalweg verlaat. Daar is 'n ingewikkelde antwoord op daardie. So nou, dit is nie baie nuttig. Dus net die bestuur van ons program binnekant van hierdie debugger nie help nie in enige manier, want ons kon net gedoen dot streep debug van buite GDB. So het die een opdrag wat Jy sal waarskynlik - en ek sal ophou nie. Control-d of afsluit, albei werk. So laat dit oop te weer. Nog 'n opdrag wat jy sal waarskynlik onmiddellik wil gewoond te raak aan is breek. So ons sal breek op die hoof vir nou, en dan sal ek verduidelik dat. Wel, hier sien ons ons 'n breekpunt in hierdie lyn in debug.c. So, wat breek beteken, is dat wanneer ek tik termyn, is die program gaan voortgaan hardloop totdat Ek druk 'n breekpunt. So toe ek hardloop, die program begin, en dan is dit so gou as dit breek gaan die belangrikste funksie. Breek hoof gaan om iets te wees jy mooi algemeen doen nie. En nou, julle bekend te stel sommige meer instruksies. Let hier, dat dit sê ons gebreek by lyn 11, wat printf, tik 'n heelgetal. So het die opdrag Volgende gaan wees hoe ons gaan na die volgende lyn van kode. Dit gaan ons toelaat om te stap deur middel van ons program reël vir reël. So volgende. Nou lyn 12, ons gaan Die heelgetal te kry. Volgende. En as jy net getref weer Tik, sal dit oordoen die laaste ding wat jy gedoen het. So ek hoef nie te tik volgende elke keer. So tree 'n heelgetal, 13. So nou, lyn 14, terwyl ek groter as 10, en ek sal volgende te doen. En ons sien ons gaan i te Trek '. So ons gaan i weer decrement. So nou, nog 'n nuttige opdrag Print. So Print gaan om uit te druk die waarde van die veranderlike. Kom ons bring die waarde veranderlike i. Kom ons druk ek. Dit gaan om te sê ek is 11. Nou Volgende weer ons terwyl Ek is meer as 10. So ek is nog groter as 10, want dit is 11. Ek minus minus. Kom ons druk ek weer. Soos verwag, is dit 10. So nou, volgende. Is dit terug na die toestand gaan, ek is meer as 10, maar ek is nou 10, so dit is nie groter as 10, so ons verwag dit om te val uit die lus. En nou is ons onder die lyn van die kode. En 'n ander opdrag, lys, net gaan die vorige en die volgende te vertoon paar reëls van die kode, in Indien jy jouself verloor. So het ons net opgewonde dit terwyl lus, En nou het ons in hierdie while loop, lyn 18. Dus, terwyl ek nie gelyk 0. En, Volgende, ek is gelyk aan i minus 3, en ons sal sien, dit sal net gaan hou. En ons kan druk i. Elke opdrag soort het kortpaaie. So p is kort vir Print. So kan ons p i. Hou net vashou n, of hou doen Volgende. Druk ek weer. Jy sien nou is dit negatiewe 167. So sal dit gaan vir ewig, maar nie werklik vir ewig, want jy het net gesien, is dit eintlik sal eindig op 'n punt. So wat begin GDB. Maar laat ons doen een ding in GDB. Uh, ontfout. So, in hierdie spesifieke geval, die oneindige lus toevallig binnekant van die belangrikste funksie. En nou, aanvaar net dat dat ek gaan die oneindige lus om te beweeg in die cat funksie. Onthou net dat, aan die einde van hierdie program, goed, dit was oorspronklik roep cat, wat was net gaan ek te druk. Maar nou is ons roeping cat, wat gaan decrement i totdat dit 0, en druk dan daardie veranderlike. OK. Behalwe dat. Maak debug. En nou, gdb debug. OK. So as ek net hardloop dan is ek nie van plan om in staat wees om werklik stap vir stap deur my program lyn-vir-lyn. So laat breek by die hoof, en dan tik hardloop. So gaan deur middel van hierdie, printf, tree 'n heelgetal, kry die getal, 13. So ons gaan decrementing te hou totdat ek meer as 10 is. Dan gaan ons val deur die terwyl loop, en jy na die lyn - laat se oop te maak in 'n aparte venster. So het ons decremented totdat ek was nie meer meer as 10, en dan het ons genoem die funksie, cat. So, wat so gou as ek getref gebeur funksie cat, goed, ek het cat, en dan het ek nie meer beheer oor GDB. So gou as ek getref Volgende op hierdie lyn, dinge het voortgeduur totdat dit gebeur het, waar die program opgewonde toe - neem dit nie uiteindelik bestaan ​​nie. Jy het dit breek vir 'n bietjie al. So hoekom het ek verloor beheer oor die program wat by die punt? Wel, as ek tik die volgende, wat gaan aan die letterlike volgende lyn van die kode wat sal voer. So na lyn 21, die volgende lyn van die kode wat sal voer is lyn 22, wat is, die verlaat van die hoof. So ek wil nie net gaan na die volgende lyn van die kode. Ek wil om te gaan in die funksie, cat, en dan ook deur diegene reëls van die kode. So vir wat, ons het 'n alternatief. Kom ons hou dit weer. Breek hoof. Uh, 1, volgende, volgende, 13, volgende, volgende, volgende, noukeurig, voor ons lyn cat. OK. So nou, ons is op lyn 21, waar ons 'n beroep cat. Ons wil nie die volgende te tik, aangesien dit sal net noem die funksie cat, en gaan na die volgende lyn van kode. Wat ons wil hê om te gebruik is die eerste stap. So daar is 'n verskil tussen Stap en volgende jaar, waar Stap stappe in die funksioneer, en Volgende gaan oor die funksie. Dit voer net die geheel van die funksie en hou gaan. So stap is om ons te bring in die funksie, cat. En ons hier sien, nou, ons is terug by die dit terwyl lus wat is, in teorie, vir ewig gaan bly. En as jy getref stap, wanneer dit is nie eens 'n funksie te roep nie, dan is dit identies aan Volgende. So dit is net wanneer jy op 'n lyn wat roep 'n funksie wat Stap gaan verskil van Volgende. So stap sal ons hier te bring. Stap, stap, stap, stap, stap, stap, en Ons sal net oneindige lus vir ewig. So kan jy gewoond raak aan dat as jou manier van die identifisering van oneindige lusse, is net hou hierdie Voer sleutel tot sien waar jy vashaak. Daar is beter maniere om dit te doen nie, maar Vir nou, dit is perfek voldoende. En stilisties, om te voldoen aan Style 50, moet ek dit gedoen het. OK. So 'n laaste opdrag te stel. Wel, laat ons GDB debug in So in plaas van die breek by die hoof, as ek weet wat die cat funksie is ook die probleem is, dan kan ek net gesê, breek op cat, plaas. Kom ons sê ek breek op beide hoof-en cat. So jy kan stel soveel inspeksiepunte as jy wil. Toe ek tik hardloop, gaan dit om te stop by die - ooh, laat ons heropstel, aangesien Ek verander dinge. Jy sal hierdie lyn, Waarskuwing, Bron sien lêer is meer onlangs as uitvoerbaar nie. So dit beteken dat ek net gaan in hier en verander hierdie te voldoen aan Style 50, maar ek het nie hercompileren die program. So GDB maak my bewus van wat. Ek sal ophou, maak debug weer getref gdb debug. OK. So nou, terug na wat ek kon doen. Breek hoof, breek cat. Nou as ek hardloop die program, so dit is gaan voort totdat treffers van 'n breekpunt. Dit breekpunt gebeur wees die eerste een by die hoof. Nou, in plaas van om die volgende, volgende, volgende, volgende, volgende, totdat ek getref cat, ek kan tik voortgaan, wat sal voortgaan totdat jy getref die volgende breekpunt. Ek het die integriteit na die eerste tree. Gaan voort sal voortgaan totdat ek die volgende breekpunt, en dit is dat funksie van cat. So Run hardloop totdat jy getref 'n breekpunt, maar jy tik slegs uitgevoer word wanneer jy begin die program, en dan, Van toe af is, is dit steeds. As ek net gedoen breek hoof-en dan hardloop, sal dit breek op hoof, en dan voort te gaan. Want ek het nie 'n breek punt cat, Tik die getal, dan nou is ek gaan nie te breek op cat. Dit is net gaan tot oneindige lus totdat dit. OK. So dit is Intro te GDB. Jy moet begin om dit te gebruik in jou probleem stelle. Dit kan baie nuttig wees foute te identifiseer. As jy eintlik net, lyn-vir-lyn, gaan deur jou kode, en vergelyk wat eintlik met wat jy verwag om te gebeur, dan is dit redelik moeilik om jou foute te mis. OK. So verlede week Dawid het hierdie geheime-sleutel kriptografie dinge vir die eerste keer, waar ons wil nie wagwoorde net op gestoor word ons rekenaar in 'n paar eenvoudige teks lêer, waar iemand kan oor en kom net oop te maak en te lees. Ideaal gesproke sou hulle geïnkripteer in een of ander manier. En in Probleem Stel 2, sal jy doen word met 'n metode van kodering, of, wel, twee metodes, maar hulle is nie so groot nie. As jy nie die hacker uitgawe, jy ook gaan wees wat met decrypten 'n paar dinge. So die probleem is nou, wel, selfs al Ons het die sterkste enkripsiemetodes algoritme in die wêreld, as jy kies om 'n veral swak wagwoord, dan is dit sal nie help nie baie nie, aangesien mense sal steeds in staat wees om dit uit te vind. Selfs as die sien van die geïnkripteer string en dit lyk soos 'n gemors van vullis dit beteken niks vir hulle as hulle nog net 'n paar wagwoorde te probeer om dit uit te vind, dan is jy is nie baie veilig is. So kyk na 'n video wat maak die punt. [Video speel] -Helm, jy monster. Wat gaan aan? Wat doen jy aan my dogter? -Laat my die briljante te stel jong plastiese chirurg, Dr Phillip Schlotkin, die grootste neus werk man in die hele heelal, en Beverly Hills. -U Hoogheid. -Neus-job? Ek verstaan ​​nie. Sy het reeds 'n neus-job. Dit was 'n lieflike sestien teenwoordig. -No. Dit is nie wat jy dink. Dit is baie, baie erger. As jy nie gee my die kombinasie die lug skild, Dr Schlotkin sal gee jou dogter terug haar ou neus. -No. Waar het jy dit? -Alle regte. Ek sal jou vertel. Ek sal jou vertel. Nee, pappa. Nee, jy moet nie. -Jy het gelyk, my liewe. Ek sal jou nuwe neus mis. Maar ek sal hom nie vertel die kombinasie, maak nie saak wat. -Baie goed. Dr Schlotkin, doen jou ergste. -My plesier. [TOOLS geslyp] -No. Wag nie. Wag nie. Ek sal jou vertel. Ek sal jou vertel. -Ek het geweet dit sou werk. Alle regte. Gee dit aan my. -Die kombinasie is een. -One. -One. Twee-en-. Twee-en-. Twee-en-. Drie. Drie. Drie. Vier-. Vier-. Vier-. Vyf-. Vyf-. Vyf-. -So die kombinasie is een, twee, drie, vier, vyf. Dit is die domste kombinasie Wat ek ooit in my lewe gehoor het. Dit is die soort van ding wat 'n idioot sou hê op sy bagasie. -Dankie, jou Hoogheid. -Wat het jy gedoen? -Ek het die muur af. -Nee, jy het nie. Jy afgeskakel die hele film. -Ek moet gedruk het die verkeerde knoppie. Wel, sit dit terug op. Sit die film weer op. -Ja, meneer. Ja, meneer. -Laat ons gaan, Arnold. Kom, Gretchen. Natuurlik, jy weet ek sal nog steeds het jy te hef vir hierdie. [Einde video speel] ROB BODEN: Alle reg. So nou dat ons reeds praat sekuriteit in sommige maniere, mooi bietjie film plakkaat, so in die afgelope dae, hierdie kwessies met die NSA monitering alles. Dit kan moeilik wees om te voel soos jy 'n soort van privaatheid in die aanlyn wêreld, maar ek kon nie sê jy die meeste van die besonderhede van PRISM. So beweeg buite prisma, ons gaan nie om te praat oor wat nou dink oor jou laptop. So hier, Ek wil om te skakel my werklike rekening met my klein pikkewyn. So ek het 'n wagwoord in te stel, en dat wagwoord is wat ek wil om dit te wees. Maar onthou dat wat ek aan te meld met, so hierdie inskrywing vinnige, is 'n program. Dit is 'n program wat geskryf deur 'n persoon. En so, daardie persoon, indien hulle veral kwaadwillige, kon hulle gesê het, alles reg, so as die wagwoord dat ek kan ingaan, is gelyk aan my werklike wagwoord, of is dit gelyk om 'n spesiale wagwoord - David is awesome of iets - dan laat hulle in So 'n kwaadwillige programmeerder kan hê toegang tot al jou Mac, of Vensters, of enigiets. So dit is nie veel van 'n bron van kommer, aangesien, Ek bedoel, dit is login program dit is verskeep met OS X, honderde of duisende mense hersien hierdie kode. En so, as, in jou kode iewers, jy sê as hierdie string gelyk gelykes David is awesome, aanteken, dan is iemand se gaan wees, soos, wag. Dit is nie reg nie. Dit moet nie hier wees nie. So dit is een manier waarop ons dinge soort veilig wees. Maar dink selfs programme wat jy skryf. Kom ons sê jy die login program geskryf het. So hierdie aanmelding program wat jy geskryf het, so natuurlik, jy is 'n goeie programmeerder. Jy gaan nie enige kwaadwillige te sit As x is gelyk aan gelyk David is awesome in jou kode. Maar hierdie program, wat jy doen gebruik van hierdie program op te stel? Iets soos klang. So, wat as die persoon wat gebeur skryf klang spesiale cased in klang iets soos, as ek die opstel van die login program, en gee dan die kode in die aanteken program wat sê, as x gelyk is gelyk aan David is awesome? So nie heeltemal nie, maar ons het dieselfde probleem hier, waar klang, goed, duisende, indien nie duisende van mense, het gekyk na klang, het kyk na die reëls van die kode en gesê: Alle reg, daar is niks sleg hier. Dit is duidelik dat niemand doen enigiets wat hierdie kwaadwillige. Maar wat is klang self, soos, Wat as ek stel klang? Wat as ek 'n paar samesteller dat stel klang dat voeg in klang hierdie spesiale hack wat sê, alles reg, toe ek stel klang, dan is die uitvoerbare Ek kry moet spesiaal kyk binnekant van die login program en voeg hierdie wagwoord, gelyk gelykes Dave is awesome? So onthou dat jou samesteller self moet opgestel word op 'n sekere punt. So as wat jy kies klang te stel met self is kwaadwillige, dan is jy kan geskroef word om die hele pad af die lyn. So hier het ons Ken Thompson en Dennis Ritchie. So, dit is 'n ikoniese foto. Dennis Ritchie is aan die regterkant. Hy is 'n groot - pretty much C. geskryf sodat jy kan bedank hom vir hierdie klas. Ken Thomson is aan die linkerkant. Die twee van hulle het basies geskryf UNIX. Wel, hulle was groot bydraers in UNIX. Daar was 'n paar ander. So Ken Thompson, op 'n sekere punt, hy wen die Turing-toekenning. En die Turing-toekenning, ek het nog altyd gehoor dit verwys op hierdie manier, dit is die Nobelprys Rekenaarwetenskap. So aan die Turing-toekenning, hy het om te gee sy aanvaardingstoespraak. En hy gee die baie bekende toespraak nou, genoem Reflections on Vertrou Trust, wat ons verbind om op die kursus webblad. En in hierdie toespraak, sê hy, alles reg, so ek UNIX geskryf het, en nou al Julle mense is met behulp van UNIX. Nou, onthou vandag dat Linux is 'n direkte afstammeling van UNIX. OS X direk gebruik UNIX. Windows nie so veel nie, maar 'n baie van idees is geneem uit UNIX. So het hy gaan op die verhoog en sê: Alle reg, ek het UNIX. En net so julle ouens weet, ek is staat aan te meld in elke enkele een van jou rekenaars. Sedert ek een van hierdie spesiale as x gelyk is gelyk aan Ken Thomson is awesome, dan is ek toegelaat om aan te meld. So mense is soos, wel, Hoe het jy dit doen? Ons kyk na die login program en niks is daar. Hy is soos, wel, ek verander die samesteller om aan te meld in die login program sodat die login program sal nou dat x gelyk is gelyk aan Ken Thompson is awesome. En hulle sê, wel, dit is nie waar nie. Ons is op soek na die samesteller, en die samesteller geen lyne van 'n kode soos dit. Hy is soos, OK, maar wat is jy die samestelling van die samesteller met? En hulle dink, en hy is, soos, wel, Ek is die een wat jy die opsteller het jy met behulp van die vertaler te stel, sodat jy die opstel van 'n vertaler, wat self is kwaadwillige, en sal breek die login program. So basies, op daardie punt, is daar geen manier wat jy kan kyk na die bron kode van die login program om te sien wat verkeerd is. Jy kan nie eens in die bron-kode van die opsteller om te sien wat verkeerd is. Jy sal moet kyk na die masjien kode, die werklike binêre van die saamgestel vertaler te sien, wag, hierdie reëls van die kode moet nie hier wees nie. Maar Ken Thompson het dit 'n stap verder en sê, goed, daar is hierdie spesiale programme wat eintlik help jy lees die binêre programme, en so as iemand gebruik die program te lees die binêre, sou hulle sien dat hierdie reëls van die kode. Hy verander die programme om te sê, al reg, as jy kyk na die samesteller, nie hierdie spesifieke wys nie stel van binêre. So dan moet jy neem dat 'n stap verder en basies, kan dit 'n geneem van verskeie vlakke van indirection, en op 'n sekere punt, niemand is eintlik gaan word nagaan. So het die moraal van die storie is, is jy nie gaan om te skryf Klang in hierdie klas. Jy gaan word met behulp klim Klang 'n baie in hierdie klas. Vir al wat jy weet, klang is 'n kwaadwillige program wat saboteer elke enkele program wat jy ooit saamgestel. En om jou te verlaat op daardie onheilspellende daarop, jy sien op Woensdag. [Applous] Spreker 2: By die volgende CS50. SPREKER 3: Moenie jy waag om te sê dat. Jy kan dit doen. Jy het dit gedoen voor, kan jy dit doen Vandag, kan jy dit doen môre. Jy het om dit te doen vir die jaar. Gaan net daar en doen dit. Jy kan dit doen. [Speel van musiek]