David Malan: Alle reg. So dit is CS50, en dit is nou die begin van die week drie. So tot nou toe, ons het is die skryf van programme in C wat lyk 'n bietjie iets soos hierdie hier. So ons het 'n paar skerp sluit by die top. Ons het 'n int, hoof, nietig en dan om iets te doen in die middel, sommige bietjie van die kode binne-in van daardie funksie. Maar die sleutel is die feit dat Ons het gesê leemte hier. So nietig, almal van hierdie tyd, spesifiseer dat hierdie program, toe loop, kan slegs uitgevoer word via sy naam. Jy kan nie tik enige ander woorde of getalle na die program se naam wanneer loop dit. So, byvoorbeeld, indien die program was saamgestel in 'n lêer met die naam hallo, wat jy kan doen ./hello, maar dit is dit. Die enigste manier wat jy kan insette tot hierdie program is deur die roeping van 'n funksie. Byvoorbeeld, watter funksie Ons gebruik al tot dusver toevoer van die gebruiker te kry? Publiek: Kry string. David Malan: string te kry, of kry int, of jy gesien het die ander, selfs as jy nie hulle gebruik nie, soos kry lang, lang en dies meer. Maar veronderstel dat ons eintlik wil begin die skryf van programme wat bietjie meer veelsydig, en eerlik, 'n bietjie meer soos die opdragte wat jy het is om, hopelik, 'n bietjie gewoond aan. Soos cd ruimte Dropbox. Dit, natuurlik, veranderinge jou gids, in die veronderstelling jy in John Harvard se huis gids, na jou Dropbox gids. Intussen het 'n opdrag soos hierdie skep 'n nuwe gids genaamd pset2, as jy dalk reeds of sal binnekort vir die probleem sit twee. Maak Hallo, natuurlik, is 'n opdrag wat bou 'n program genaamd hallo van 'n lêer genaamd hallo dot c. En in elkeen van hierdie gevalle, nou, het ons het bied 'n argument oor die sogenaamde command line, die flikkerende vinnige, sodat make weet wat om te bou, en so dat mkdir weet wat die gids te skep, en sodat cd weet waar jy wil gaan. Maar tot nou toe, ons hou sê wat hoof, jou standaard funksie, het 'n leemte uitdrukking binnekant van die hakies, wat beteken dat dit kan geen argumente neem. So begin vandag, wat ons gaan doen is, gaan ons begin ondersteun dinge soos hierdie, selfs. Trouens, in hierdie geval, wat jy tipies tik nie met die hand, Maak het hierdie doen vir ons, is daar nie een, maar een, twee, drie bykomende snare na die program se naam klang. So hoe kry ons dit reg? Wel, begin vandag, in gevalle waar ons wil insette te lewer via die sogenaamde opdrag lyn, ons gaan begin byvoeg hier wat in yellow-- nietig te vervang met int argc komma string argv oop bracket naby bracket. Nou is dit interessant vir 'n paar redes. Een, dit gaan om ons te laat skryf programme wat 'n bietjie meer dinamies. Maar, meer dwingend, dit gaan om oop te maak nou 'n gesprek te wat skikkings kan regtig gebruik word, vir wat 'n string regtig is onder die enjinkap, tot volgende week wanneer ons begin duik in nog dieper oor hoe die masjien is die maak van al hierdie dinge werk. Maar vir nou, laat ons trek, miskien, 'n prentjie. Wanneer jy 'n program skryf met die belangrikste verklaar Op hierdie manier, soos wat hoof neem twee argumente, 'n int and-- wat data tipe is die tweede argument? Publiek: Array. David Malan: Array. So dit lyk met die eerste oogopslag soos dit is 'n string, maar kennis van die vierkantige hakies. Onthou die laaste keer het ons ' die idee van 'n skikking. En skikkings gebruik vierkantige hakies in 'n paar van die konteks. Jy kan die vierkant gebruik hakies om te gaan in 'n skikking en kry 'n bepaalde element, soos bracket 0 of bracket 1 of bracket 2. Maar ons het gesien, indien kortliks verlede week dat jy ook gebruik om hierdie vierkantige hakies te verklaar dat die grootte van 'n skikking, As jy vooraf weet hoeveel ints of hoeveel stringe of wat jy eintlik wil hê. So dit blyk daar se 'n derde konteks hier wat geen getal binne van die vierkantige hakies. As jy spesifiseer nie, want ek het hier, die naam van iets soos argv, wat net 'n fancy manier sê argument vektor, wat is 'n ander fancy manier sê 'n verskeidenheid van argumente, oop bracket naby bracket net beteken dat jy nie noodwendig vooraf weet hoe groot die skikking gaan wees, maar jy weet dit gaan 'n skikking te wees. So as jy nie weet nie die aantal sit nie dit is daar, vir 'n oop bracket naby bracket beteken dat argv is nie 'n string, maar 'n verskeidenheid van snare. So sintakties, as jy terugdink verlede week, dit is baie soortgelyk aan sê iets soos int ouderdomme oop bracket, en dan is daar iets daarna. So wat beteken dit lyk? Kom ons eintlik 'n prentjie teken. So wanneer jy hierdie program met Main nadat twee argumente binne gedefinieer van die hakies, jy wese het ten minste twee stukke geheue aan u oorhandig onder die enjinkap. Een, soos ek sal trek as die reghoek, gaan argc genoem te word. En net so 'n vinnige herhaling, Wat is die data tipe argc? So dit is 'n int. So 'n aantal gaan om te gaan in argc-- beurte uit wat staan ​​vir argument telling. Intussen het ek argv geteken as 'n skikking. En ek weet nie regtig hoe lank dit gaan wees, So vir vandag se doeleindes dot dot dot. Dit kan kry van 'n sekere lengte. Maar ek het die foto minstens vier reghoeke. So argv 'n stuk van die geheue wat winkels string string string dot dot dot, en argc is net een stuk geheue vir 'n heelgetal. So nou, laat ons 'n bietjie meer presies. As as ek snare in hierdie reeks, genaamd argv, ek wil te kry op hulle individueel, net soos verlede week, ons gaan notasie te gebruik soos argv bracket 0 Die eerste ding om te kry 'n skikking. Argv bracket 1 die te kry tweede ding, en so meer. Die sleutel hier is ons nog steeds 0 indexed-- ons nog tel van 0. So laat ons nou eintlik sit iets in hierdie. As ek 'n program genaamd saam te stel hallo van 'n lêer genaamd hallo dot c, en dan loop ek die program met dot streep hallo, Wat het my rekenaar, my laptop, lyk onder die kap die oomblik het ek hardloop dot streep hallo en druk Enter? Wel, dit is dalk wat ons kan beskryf as die inhoud van jou rekenaar se geheue, of RAM-- Random Access Memory. Met ander woorde, die rekenaar, een of ander manier vir jou mettertyd, plaas die nommer 1 in argc, AKA argcount, en dit sit letterlik die string ./hello in argv bracket 0. Ek het geen idee nie, eerlik, wat is in argv bracket 1 of 2 of 3, want as die gebruiker het nie iets getik behalwe ./hello, ons gaan om te aanvaar dat hierdie is waarskynlik vullis waardes, om so te praat. Diegene stukke van die geheue bestaan ​​nie, maar dit is nie vir ons om om te kyk na hulle, want die argcount is net een. Nou, intussen, as ek skryf loop 'n ander program, cd, wat meer behoorlik 'n bevel, in jou flikkerende prompt-- cd ruimte Dropbox-- toe ek hardloop dat doeltreffend, wanneer die cd program uitgevoer word, argc, binnekant van my rekenaar se geheue, is vir die mees kortste tweede die nommer 2. En dan argv bracket o het CD, argv bracket 1 het Dropbox, en dan natuurlik die opdrag voltooi, sodat almal van die geheue wese gaan weg en gebruik word vir iets anders. En dit is hoekom ek sê net 'n split sekonde. Intussen, as ons dit doen mkdir pset2, die prentjie lyk amper dieselfde, maar met verskillende snare binne argv. As ek dit doen klang Dash hallo hallo dot c, dieselfde idee. Meer dinge is gevul in vir argv en argc, natuurlik, is 4. So met ander woorde, Selfs al is hierdie verskeidenheid dalk dot dot dot word, van 'n paar veranderlike lengte, so te sê, jy altyd weet waar die einde van dit is, omdat argc gaan om jou te vertel op watter punt jy hoef te stop kyk na elemente in argv. Jy kan net kyk na vier in totaal in hierdie geval. So laat ons nou 'n blik op, miskien, 'n eenvoudige program. Een wat net sê hallo iemand soos Zamyla. So ek beweer ek gaan 'n program te skryf in net 'n oomblik via wat ek kon doen ./hello ruimte Zamyla, en dan wil ek my program om uit te druk om iets super-eenvoudig soos "hallo, Zamyla." Nou in die verlede het ons getstring gebruik. So in die verlede, selfs al jy nuut is tot ontwikkeling, kans is wat jy kan sweep 'n program wat gebruik maak van getstring en dan gebruik printf hi te sê Zamyla. Maar laat ons nie getstring hierdie tyd gebruik. Laat my plaas gaan in die Appliant en sluit standaard I O dot h. Laat my ook CS50 dot h. Nou int belangrikste, en nou is ek gaan nie te doen vandag nietig. In plaas daarvan, ek gaan int argc te doen string argv oop bracket naby bracket, nie spesifiseer 'n aantal. En nou hier is my sogenaamde te doen. Wat ek nou gaan doen is, ek is gaan 'n bietjie van 'n sprong van geloof te doen, Ek gaan om te aanvaar dat die gebruiker se gaan hierdie program korrek te gebruik, en ek is net gaan om te printf doen hallo,% sn. So niks nuuts nie daar nie. Maar ek wil nou sit alles woord die gebruiker na die program se naam. So as ek dit doen ./hello ruimte Zamyla, ek wil een of ander manier programmaties toegang haal unquote "Zamyla." sodat ek kan gaan in my argument vektor, my verskeidenheid van snare, en indien die opdrag, weer, was ./hello ruimte Zamyla, hoeveel wil ek te sit in argv hier? Publiek: 1. David Malan: 1, want bracket 0 blyk gaan die wees program se naam, soos ons gesien het. So bracket 1 is die eerste woord dat ek, die gebruiker, getik. Ek gaan om voort te gaan en behalwe hierdie. Ek gaan om te gaan in my gids waar ek geplaas is om hierdie lêer. Ek gaan om te doen om hallo 3. Comp IK se OK. ./hello Zamyla Enter. Wat het ek verkeerd gedoen? Ek is gevang deur die verrassing myself vir 'n oomblik is daar. Wat het ek verkeerd gedoen? Publiek: Naam. David Malan: Die lêer se eintlik hello3.c genoem. En ek het dit net vir konsekwentheid, want ons het het hello.c's in die verlede in die aanlyn-kode. So laat regmaak ./hello bracket Dash 3 Zamyla. Betree. En nou het ons 'hallo, Zamyla. Intussen, kan ek dit verander na wees Rob, of eintlik enige ander woord. Maar laat ons kyk na 'n hoek geval. Wat kan jy verwag sal gebeur as Ek tik nie iemand se naam nie? Publiek: Fout. David Malan: 'n fout van 'n soort, miskien. Kom ons kyk. Betree. Null. So printf is eintlik 'n bietjie beskermende ons hier, en letterlik druk oop hakie nul, maar selfs erger dinge kan gebeur. En net om te demonstreer iets wat jy absoluut moet dit nie doen nie, laat ons gaan in hier en begin skeer rond. Reg? As ek weet dat die prentjie in geheue is in wese, argv bracket 1 het Zamyla, argv bracket 0 het ./hello, of ./hello-3. Wat is in hakies 2? So ek kan antwoord dat bevraagteken myself, reg? Ek kan net verander die 1 na 'n 2. Ek kan nou heropstel hallo 3, ./hello3 Kom ons zoom in en druk Enter. Oeps. Geen aanhalingstekens. Interessant. So dit is soort van die koel te sien wat anders is hier. So wat anders is die binnekant van my laptop? Kom ons red met bracket 3. Maak hello3, ./hello-3. Nuuskierig. En nou, laat ons kry regtig bold-- 50. So dit is regtig duik diep in my rekenaar se geheue. 50 indekse in. So maak hallo 3 ./hello-3. Nuuskierig. Alle reg, nou is ek net gaan roekelose te kry. Kom ons gaan na 5000. Alle regte. So laat my heropstel. Maak hello3, ./hello-3. OK. Nou sommige van julle, mag daar 'n gloeilamp gaan af. Hoeveel van julle het gesien hierdie boodskap voor? OK. So, hoekom? Kans are-- en daar is verskillende dinge wat kan veroorsaak dat dit, en duidelik is jy in goeie geselskap het ons duidelik veroorsaak wat genoem 'n segmentering skuld. En 'n lang storie kort vir vandag, ek 'n segment van die geheue aangeraak dat ek nie moet hê. Waar 'n segment beteken net 'n stuk geheue wat ek moet nie. Nou is die rekenaar waarborg dat as ek hardloop ./helloZamyla dat ek kan raak argv wees bracket 0 en argv bracket 1. Maar argc is waarde 2, wat beteken dat ek slegs allowed-- dit is soort van die eer system-- te raak bracket 0 en bracket 1. As ek gaan enige verder, is daar absoluut gaan geheue om daar te wees. My geheue bestaan ​​fisies in die rekenaar. Maar wie weet wat is daar? Trouens, ek hardloop verskeie programme op een slag. Ek kan hê seen-- as ek nie om dit te doen op die Appliant maar op my Mac of PC-- ek dalk gesien die inhoud van 'n e-pos. Ek kan 'n oomblik gesien het boodskap Ek het onlangs gestuur. Enigiets wat kan wees voortslepende om in die geheue kon verkry het deur middel van hierdie arbitrêre vierkante bracket notasie. Of, erger nog, kan jy het een van my wagwoorde dat ek onlangs het getik in, dat 'n program in die geheue gestoor het so om my te kontroleer, en dan net soort van links dit in die geheue totdat ek ophou dat program. En inderdaad, dit is een van die die gevaar en een van die magte van die gebruik van 'n taal soos C. Jy het onbeperkte toegang om die hele inhoud van 'n program se geheue, en wat die slegte ouens kan selfs nie in die cases-- veral wanneer ons kry web ontwikkeling teen die einde van die semester, sal ons weer hierdie topic-- rondom steek, potensieel, iemand se rekenaar geheue en so nuuskierig dinge vind soos ons gesien het daar. Of selfs erger nog, wagwoorde wat hy of sy kan dan gebruik om slegte dinge te doen. So duidelik ek nie gedoen het nie, omdat vreemde dinge begin gebeur. Trouens, dit is 'n program gekraak. Dit sou die ekwivalent Mac OS of Windows 'n program venster net verdwyn. 'N Onverwagse fout het voorgekom. In die opdrag-lyn omgewing sien ons iets soos hierdie. Maar dit is die rede waarom, is ek net raak geheue wat nie aan my behoort. So laat ons verdedig teen dit 'n bietjie in 'n ander manier deur te kyk na hierdie program hier. So, weer, die geraamte wat ons gesien het earlier-- en Ek het dié keer int uitgelig. En al hierdie tyd hoof het inderdaad 'n waarde teruggekeer. Selfs al is die meeste van ons lesing voorbeelde wat ons het nog nie een keer gebruik enigiets wat in die belangrikste. Ons skryf net printf naby krullerige stut en dit is dit. Maar vir gratis, wat die samesteller doen vir jou, effektief, terugkeer 0 vir jou. Draai out-- en dit is 'n bietjie counterintuitive-- dat 0 is goed. Dit maak nie vals per se beteken. 0 is goed, en enige nie-0 waarde, het die wêreld besluit, kan 'n fout dui. So as jy ooit deurmekaar iets op jou rekenaar, of 'n program het net gesterf het op jou en jy 'n paar verkeerde venster gekry op jou skerm en gesê fout negatiewe 49 of foute 23-- sommige oënskynlik arbitrêre value-- wat omdat 'n programmeerder het hard-gekodeerde 'n waarde soos negatiewe 49 of positiewe 23 enige getal voor te stel, waag om te sê, 4 miljard moontlik dinge wat dalk verkeerd in 'n program te gaan. So, hoe kan ek voordeel van hierdie myself? Wel, laat ek maak 'n program wat ek geskryf het in advance, en steek rondom aanlyn genoem hallo 4. En dit is byna identies, behalwe dat sy het 'n bietjie van die fout kontrole. In hierdie geval, het ek weer verklaar hoof as die neem van twee argumente, maar hierdie keer, op die lyn 17, kennisgewing Ek is besig met 'n bietjie van 'n gesonde verstand tjek. Ek is seker te maak dat argc gelyk gelyk 2. Want as dit is, wat beteken dat ek veilig kan raak nie net bracket 0, maar bracket 1. En ek gaan voort en druk, in hierdie geval, Zamyla of Rob of wat ook al woord wat ek getik het. En nou net te kry 'n bietjie meer behoorlike, Ek gaan uitdruklik terug 0 te dui alles is goed. Niks sleg gebeur het. Maar deur die konvensie, ek gaan om te terug 1, of eerlik nie-0 waarde, As iets verkeerd geloop het. Nou is die gebruiker is nie van plan om regtig sien wat aangaan. Inderdaad, indien ek gaan in hierdie gids, ons zoom in en maak hallo 4, ./hello-4 Zamyla optree soos ek verwag. Maar as ek in plaas tik nie enigiets, blyk dit dat niks gebeur nie, maar dit nie crash. En as ek plaas om iets te doen soos Rob is 'n Proctor in Thayer-- deel arbitrêre inligting. Maar kennisgewing argv 1, 2, 3, 4, en 5 moet nou bestaan ​​in die geheue. Dit ook, is nie wat my program verwag, want ek het seker gemaak argc gelyk gelykes 2 of nie. So ek nou verdedig teen hierdie. Nou, as 'n eenkant, ons die programmer-- of eerder ons die users-- nooit sien dat 0 of 1, maar met behulp van 'n instrument genoem Debugger, of ander gereedskap, soos ons sal sien voordat lank, om die programmeerder kan eintlik sien wat kan wees verkeerd gaan binnekant van jou program. So, enige vrae oor argc? Ja. Publiek: Ek het gesien waar hulle het die karakter nie gehad het nie, [onhoorbaar] net gesê string ster d, soos karakter asterisk komma. Is hulle ekwivalent hier? David Malan: Hulle is. So die vraag is, het jy soms gesien programme soos hierdie wat dit nie doen nie sê string argv bracket maar in plaas daarvan sê iets soos kar ster argv bracket. En daar is selfs 'n ander variante wat jy kan sien. Hulle is inderdaad gelyk. Vir nou, ons het hierdie soort van opleiding wiele in die vorm van 'n string in die CS50 biblioteek, maar in net meer as 'n week of so het ons gaan om dit te verwyder obstruksie geheel en al en eintlik kyk na wat die kar en die ster is, en hoe daardie verband hou met die geheue verteenwoordiging meer algemeen. So ons sal terug kom. Ander vrae oor ons argv of argc? Ja. Publiek: Hoekom het dit terug 'n fout [onhoorbaar]? David Malan: Hoekom het dit terug 'n fout only-- oh! In die vorige geval, wanneer ons rondom futzing met die geheue, waarom het dit net weer 'n fout toe ek regtig getik 'n groot aantal? Kort antwoord is, het ons net gelukkig. Oor die algemeen, 'n rekenaar ken geheue in stukke, en dit het my 'n groot genoeg stuk dat Ek het weggekom, sonder om opgemerk, aanraking bracket 2, 3 bracket, bracket 50, maar so gou as ek gestoot my Sterkte, ek het buite die grense van die stuk van die geheue die bedryfstelsel my gegee het. En dit is wanneer dit toegeslaan en het gesê, nee. Segmentering fout. Ja. Publiek: Hoe werk die rekenaar weet wat die waarde van argc? David Malan: Hoe werk die rekenaar weet wat die waarde van argc? Wanneer jy 'n program, die program, uit die aard van die flikkerende vinnige, oorhandig die verskeidenheid van woorde wat getik is op die vinnige, dit was getik op die instruksielyn. En so is dit jou bedryfstelsel stelsel wat in wese vult belangrikste argumente vir jou. So dit is een van die dienste dat jy, soort van die geheim onder die kap van 'n bedryfstelsel. Ander vrae? Ja. Publiek: Wat beteken stort beteken? David Malan: Wat beteken stort beteken? So dit is 'n goeie vraag. En laat my terug te gaan na hierdie gids hier. En jy sal sien dat Ek het 'n nuwe lêer daar. Dit is inderdaad die kern genoem, en dit is eintlik tipies 'n ordentlike grootte lêer. Dit is in wese 'n oorsig van die inhoud van my program se geheue of RAM toe dit neergestort het. En dit sal nuttig wees, potensieel, diagnosties, sodra ons praat in 'n toekomstige lesing en artikel oor ontfouting, want jy kan eintlik nie die ekwivalent van 'n digitale lykskouing op die lêer om te help uitvind wat jy verkeerd is in jou program gedoen het. Ja. Publiek: Is argc 'n opdrag in self, of jy kan noem dit iets? David Malan: Goeie vraag. Is argc 'n opdrag in die self, of jy kan noem dit iets? Dit is beslis nie 'n opdrag. Dit is net 'n veranderlike se noem of 'n argument se naam, en so absoluut ons kon hierdie cat noem, ons kan hierdie bar, wat geneig noem die go-to woorde wat 'n rekenaar te wees wetenskaplike gaan. Maar deur die konvensie, wat ons gebruik argc en argv. Maar dit is net 'n menslike konvensie, niks meer nie. Alle regte. So blyk, ek is vertel 'n bietjie van 'n wit lie-- en eerlik, in die toekoms, sal jy sien het ons vertel van ander wit leuens. Maar vir nou, ons gaan terug te skil een van hierdie. In hierdie geval hier toe ek voorheen hardloop 'n program soos ./hello of ./hello-3 Zamyla, het ons die inhoud van my rekenaar se geheue soek rofweg soos hierdie. Maar onthou wat 'n string is. Wat het ons gesê 'n week gelede wat 'n string is eintlik onder die enjinkap? Publiek: Array van karakters. David Malan: Dit is 'n verskeidenheid van karakters, reg? Sodat ons kan 'n verskeidenheid van 'n snare, maar het op sy beurt 'n string is 'n verskeidenheid van karakters. So as ek regtig wil wees anale wanneer ek trek hierdie foto Ek moet regtig tekening dit 'n bietjie meer soos hierdie, waardeur in elk van hierdie indekse van my argv skikking, Daar is self 'n hele string wat homself in 'n skikking. En nou is die wit leuen ons vandag vertel is dat die prentjie nie lyk baie soos hierdie. Trouens, die klein vierkante is tipies buitekant van die groot reghoeke daar. Maar ons sal terug kom kort voor lank. Maar dit is ./hello agteroorskuinsstreep 0, dat om die spesiale karakter wat afbaken die einde van 'n string, en ons het 'n ander een na Zamyla se naam. So, wat beteken dit? Wel, laat ek gaan voort en oopmaak twee ander voorbeelde wat aanlyn beskikbaar is. Een staan ​​bekend as argv1.c en die ander is argv2. Dit is 'n super-eenvoudige program wat verskil van die verlede programme in dat dit nou ek gebruik argc en argv hier. En nou is ek die integrasie met 'n lus vir in lyn 18 van i = 0 op tot argc. En wat gaan ek doen met hierdie lyn van die kode hier? In Engels. Dit toon duidelik die gebruik van argc. Maar in Engels, wat beteken dit doen as ek hierdie program? Ja? Publiek: Dit gaan druk jou skerm soveel keer as wat jy wil. David Malan: Presies. Dus, wat woorde wat ek tik op die instruksielyn, dit is gaan spoeg hulle by my een per lyn. So laat ons gaan voort en doen dit. Laat my gaan in my gids en doen maak argv1 ./argv1. En nou, laat ons hou dit eenvoudig. Kom ons doen niks op die eerste. Dit het druk een ding, en dit is inderdaad die naam van die program, want dit is in hakies 0. As ek nou sê cat, gaan dit te doen daardie twee, en as ek sê cat bar, dit gaan die drie dinge te sê. Nou is dit 'n bietjie interessant, miskien. Maar onthou dat argv is 'n verskeidenheid van snare, maar 'n string is 'n verskeidenheid van karakters, sodat ons dinge kan neem op 'n kerf en toe te pas dat basiese logika en maak kode wat lyk 'n bietjie meer kriptiese, weliswaar. Maar deur 'n sub- lus, iets soortgelyk wat jy kan onthou van Mario, Byvoorbeeld, as jy het dit op hierdie manier. So nou sien op die lyn 19, ek is weer iterating oor my argumente, vanaf 0 op tot argc. En nou in lyn 21-- Ek is leen 'n truuk van verlede week-- Ek kyk wat is die lengte van argv bracket i. Ek stoor die antwoord in n. En dan is ek die integrasie van J op tot N, waar j geïnisialiseer tot 0. So, konvensie vir tel. Sodra jy wat ek gebruik, as jy 'n geneste lus het, kan jy nie i weer gebruik, anders sal jy afranselen, potensieel, die waarde buite die binneste lus. So ek gebruik j deur konvensie. Ons kan gebruik k. As jy het meer as k, het jy waarskynlik het te veel nes, tipies. Maar nou, let op my printf lyn is effens anders. Ek is nie die druk% s, ek is druk% c, wat natuurlik, is 'n plekhouer vir 'n kar. En nou sien hierdie sintaksis. Nuwe. Ons het nog nie voorheen gesien het nie. Maar logies, dit net beteken kry die et string in argv en kry die JTH wat? Publiek: Character. David Malan: Character in daardie string. So deur die gebruik vierkantige hakies gevolg deur vierkantige hakies, dit is duik eerste in argv se snare, en dan die tweede vierkantige hakies met j duik in die karakters van daardie spesifieke string in argv. En dan, net vir 'n goeie maat, Ek druk van 'n nuwe lyn hier. So nou laat my voort te gaan en oop 'n effens groter venster sodat ons kan sien dit in aksie. Laat my gaan in die gids. En nou doen maak argv-2-- whoops-- argv-2 maak, ./argv 2. Betree. En dit is 'n bietjie hard vertikaal lees, maar dit is inderdaad die naam van die program, gevolg deur 'n leë lyn. Laat my gaan voort en doen cat nou. Net so moeilik is om te lees, maar dit is inderdaad een karakter per lyn druk. En as ek doen bar, dit is nou druk die lyn deur die lyn. So het die afhaal hier is nie soseer dat wow, kyk na hierdie netjiese nuwe truuk waar jy kan kry op die inhoud van 'n skikking se spesifieke karakters, maar eerder hoe ons neem hierdie basiese idees soos kruip in 'n skikking, en dan kruip in 'n skikking wat in daardie reeks, en net die toepassing van die dieselfde idees te effens meer gesofistikeerd voorbeelde. Maar die basiese beginsels regtig nie verander, selfs sedert verlede week. En dit is 'n soort van tydige, in daardie, onthou, in week nul ons gespeel met 'n telefoon boek soos hierdie. En selfs al is dit duidelik fisiese stukkies papier, jy kan soort van dink 'n telefoon boek as 'n skikking. Sekerlik, as jy was om te reimplement hierdie stukke hierdie stukkies papier in 'n rekenaar, waarskynlik sou jy iets gebruik soos 'n skikking almal te stoor name en nommers uit al die pad deur Z. So dit is lekker, want dit laat ons 'n geleentheid, miskien, om te oorweeg hoe jy dalk eintlik iets soos dit te implementeer. Soos met 'n reeks van deure hier. So as ek could-- ons moet een vrywilligers om te kom op op. Kom ons kyk. 'N onbekende gesig miskien, onbekende gesig miskien. Hoe gaan in oranje? Hier. Orange hemp, kom op. Kom ons gaan voort en nou beweeg die deure na die kant, beweeg om hierdie uit die pad vir 'n oomblik. Wat is jou naam? Ajay: David Malan: Ajay. David. Nice om jou te ontmoet. Alle regte. Dus het ons agter hierdie ses deure digitaal op die screen-- of eerder, sewe deure op die screen-- 'n hele klomp van die nommers. En ek het vir jou niks in advance-- ooreengekom? Ajay: Niks in advance. David Malan: Al wat ek wil hê jy moet doen nou is om uit te vind vir my en vir ons, regtig, die nommer 50, een stap op 'n tyd. Ajay: nommer 50? David Malan: Die getal 50. En jy kan wys wat is Agter elkeen van hierdie deure deur eenvoudig te raak met 'n vinger. Damn dit. [Gelag] [Applous] Baie goed gedoen. OK. Ons het 'n pragtige geskenk prys vir jou hier. Jou keuse van films ons verlede week bespreek. Ajay: Ag, man. O, ek het nog nooit gesien Space Balls. David Malan: Space Balls. Alle regte. So hou op net een oomblik. How-- laat ons hierdie 'n ontvanklike moment-- hoe het jy te werk gaan vind die nommer 50? Ajay: ek gekies lukraak. David Malan: So jy gekies lukraak en gelukkig. Ajay: Ja. David Malan: OK. Uitstekend. So nou, het jy nie gekry gelukkig is, wat anders mag agter die deure gebeur het? So as ek gaan voort en openbaar hierdie getalle hier hulle eintlik is in enige volgorde. En die beste wat jy kan hê gedoen, eerlik, is deur uiteindelik In die ergste geval, die keur van hulle almal. So jy het super-lucky, wat is nie wat ons wil 'n algoritme noem. Ja, Geluk. Maar nou let's-- humor my, as jy kan. Kom ons gaan na die blad hier. En hier is die getalle in duidelik wat lyk na 'n ewekansige volgorde te wees nie, en hulle was. Maar as ek nou plaas eis wat agter die deure is getalle wat gesorteer word. Die doel is nou om ook vind ons die nommer 50. Maar doen dit algoritmies, en vertel ons hoe jy gaan oor dit. En as jy dit vind, jy hou van die film. Jy kry dit nie, jy gee dit terug. Ajay: So ek gaan die einde na te gaan eerste, om te bepaal of there's-- [Gelag en applous] David Malan: Hier gaan. Kom ons neem 'n blik op een van Ajay se voorgangers, Sean, wat nie heeltemal so gelukkig nie. OK, so jou taak hier Sean, is die volgende. Ek het agter die verborge deure die getal sewe, maar weggesteek in 'n paar van hierdie deure sowel ander nie-negatiewe getalle. En jou doel is om te dink van hierdie boonste ry van getalle as net 'n skikking. Ons is net 'n reeks van stukke papier met nommers agter hulle. En jou doel is om slegs die gebruik van die top skikking hier, vind my die nommer sewe. En ons is dan gaan kritiseer hoe jy te werk gaan om dit te doen. Vind ons die nommer sewe, asseblief. Nee 5, 19, 13. Dit is nie 'n truuk vraag. 1. Op hierdie punt jou telling is nie baie goeie, sodat jy kan net so goed gaan hou. 3. Gaan op. Om eerlik te wees, kan ek nie help om te wonder wat jy selfs dink oor. SEAN: Ek kan neem van slegs die boonste ry. David Malan: Slegs die boonste ry. So jy het drie links. So vind my 7. [PUBLIEKSWERKING skree VOORSTELLE] So het beide van die was ongelooflik vir baie verskillende redes. So dit is waar ons opgehou het 'n oomblik gelede en die sleutel insig hier is die deure moes nommers agter hulle wat gesorteer is, is die ideale afhaal, want wat is wat jy kan doen fundamenteel beter in hierdie tweede example-- en inderdaad, dit was Sean se eerste poging met ewekansige getalle net soos before-- maar sodra as hierdie getalle word gesorteer, baie soos die telefoon boek, Wat kan jy natuurlik doen? Of hoe kan jy hefboom wat kennis? Ja. Publiek: Jy gaan halfpad [onhoorbaar]. David Malan: Ja. Presies. So Ajay se aanvanklike instink was die einde na te gaan, as ek reg onthou, en dan het ons soort van klaar die voorbeeld vinnig. Maar as ons begin dit meer te doen metodies langs die lyne, maar begin dalk in die middel, want hulle is gesorteer, sodra ons openbaar die nommer 16, het ons dus know-- en laat ons doen presies that-- ons dus weet dat 50, in vandag se geval, het te wees aan die regterkant. So, net soos in week nul wanneer ons die telefoon boek geskeur in die helfte en gooi die helfte van die probleem weg, dieselfde idee hier. Ons kan dit half gooi van die probleem weg. En waarskynlik wat jy dalk algoritmies doen, Sodra jy weet dat 50 moet wees aan die regterkant, as dit op enige plek, is probeer om daar, in die middel van die oorblywende deure. Natuurlik, 50 hoër as 42, so ons kan gooi die oorblywende kwart van die probleem weg, en laastens, identifiseer iets soos 50. Maar net soos met die telefoon boek, hierdie getalle reeds aan ons gegee in gesorteerde volgorde, wat laat ons met die vraag, hoe kan jy dinge in orde gesorteer? En, eerlik, teen watter koste? Dit is een ding om te wees oorhandig die telefoon boek en dan beïndruk jou vriende deur die vind van 'n telefoonnommer regtig vinnig, reg? Skeur 32 bladsye uit 'n te vind persoon uit 4 miljard bladsye, ons gesê het, is die een uiterste voorbeeld. Maar hoeveel keer het dit Verizon dat telefoon boek te sorteer? Hoeveel tyd het dit ons neem hierdie sewe getalle te sorteer? Dit is 'n vraag wat ons het tot dusver heeltemal geïgnoreer. So laat se antwoord op hierdie vraag is nou. En ons is almal uit movies nou, maar ons het 'n paar stres balle. As, sê, agt vrywilligers sal nie omgee by ons hier? Kom ons gaan voort en doen, hoe die vier van julle, drie van julle hier? Kry 'n paar nuwe gesigte. En die vier van julle daar? En se nie vooroordeel now-- laat here-- en nommer agt hier op die einde. Kom op. Alle regte. So wat ons hier vir elkeen van julle is 'n nommer. As jy wil om te gaan voorlê, neem hierdie nommer. Wat is jou naam? Artie: Artie. David Malan: Artie, okay. Jy is nommer 1. Amin: Amin. David Malan: Amin. David. Jy is nommer 2. En gaan voort, as ek die hand jy die velle papier, lyn julle in die voorkant van die musiek staan ​​in dieselfde volgorde as daar. ANDY: Hi, Andy. David Malan: Andy, dit is lekker om te sien. Nommer 3. Jakob Jakob. David Malan: Jakob, nommer 4. Welkom aan boord. GRANT: Grant. David Malan: Grant. Nommer 5. Alanna: Alanna. David Malan: Alanna, nommer 6. FRANCES: Frances. David Malan: Frances, nommer 7. En? RACHEL: Rachel. David Malan: Rachel, nommer 8. Alle regte. Gaan voort en kry jouself in hierdie volgorde. Laat ek een oorblywende musiek staan ​​in die plek. Waar moet jy nie 'n stand? OK. Gaan voort en net sit jou nommers waar die gehoor kan sien hulle op, die musiek staan ​​na buite. En hopelik, ons eerste gesonde verstand tjek here-- 4, 2, 6. O-oh. Wag 'n minuut. Ons het nie 'n 8. Ek het jou nodig om te sit van die voorbeeld een of ander manier. Nee Nee, dis OK. Kom ons kyk. Ons kan dit doen. Staan. Daar gaan ons. Korrek is. Alle regte. So, nou het ons 8, 1, 3 7, 5. OK. Uitstekend. So die vraag aan die hand is, op watter koste, en via watter metode, kan ons eintlik hier sorteer die getalle sodat ons soort van terug kan werk, Uiteindelik, en decide-- is dit regtig indrukwekkend is, is dit werklik doeltreffende, dat ek kan deel en 'n telefoon boek oorwin? Is dit werklik effektief dat Ek kan verdeel en oorwin diegene digitale stukke papier op die bord, As dit dalk gaan ons 'n koste fortuin in die tyd of energie of CPU siklusse eintlik kry om ons data in 'n paar gesorteer einde? So laat ons vra die vraag. So die eerste keer af, hierdie getalle is in pretty much enige volgorde, en ek gaan voor te stel een algoritme of proses waardeur ons hierdie mense kan sorteer. Ek gaan nader hierdie mooi naïef. En ek gaan om te erken dat dit is soort van 'n baie vir my my verstand te draai om die hele stel data in 'n keer. Maar jy weet wat? Ek gaan 'n paar te maak baie eenvoudige marginale kapt. 4 en 2 is buite orde, indien die doel is om te gaan van 1 op tot 8. So weet jy wat? Ek gaan om jou te hê ouens ruil, as jy oorskakel fisies posisies en jou stukkies papier. Nou 4 en 6, dit is in orde. Ek gaan laat die wees. 6 en 8, wat in orde is. Gaan laat hulle wees. 8 and1, buite orde. As jy twee sou nie omgee uitruiling. Nou 8 en 3, indien julle ouens kon ruil. 8 en 7, as jy ouens kan ruil. En 8 en 5, as jy ouens kan ruil. Nou, ek gedoen? Nee, natuurlik nie. Maar ek het die situasie beter, reg? Wat was jou naam nou weer, nommer 8? RACHEL: Rachel. David Malan: So Rachel het effektief geborrel redelik ver, al die pad na die einde van my skikking van getalle hier. En so dat die probleem is soort van opgelos. Nou, duidelik, 2 moet nog beweeg 'n bietjie, en 4 en 6 en 1. Maar dit lyk asof ek het gekry 'n bietjie nader aan die oplossing. So laat ons pas dit dieselfde naïef heuristiese weer. 2 en 4, OK. 4 en 6, OK. 6 en 1, mm-mm. Kom ons ruil. 6 en 3 mm-mm. Kom ons ruil. 6 en 7 is OK. 7 en 5, nope. Kom ons ruil. En nou 7 en 8. En wat is jou naam nou weer? FRANCES: Frances. David Malan: Frances. So nou Frances is in selfs 'n beter posisie, want nou 7 en 8 korrek borrel op die top. So 2 en 4, OK. 4 en 1, laat se omruil. 4 en 3, laat se omruil. 4 en 6, is jy OK. 6 en 5, laat se omruil. En nou die ouens is goed. Ons is amper daar. 2 en 1, buite orde, so ruil. En nou, laat my nie 'n gesonde verstand tjek. 2 en 3, 3 en 4, 4 en 5, 5 en 6, 6 en 7, 8. OK, so ons klaar is. Maar teen watter koste het ek sorteer die getalle hier? Wel, hoeveel stappe gedoen het ek potensieel neem wanneer sorteer hierdie mense? Wel, ons sal terug na die vraag kom. Maar, eerlik, as jy het 'n bietjie verveeld, dis soort van die onthulling in dat dit nie Miskien is die mees doeltreffende algoritme. En inderdaad, eerlik, ek sweet al hoe meer loop heen en weer. Dit het nie voel besonder doeltreffend. So laat ons probeer om iets anders. As jy ouens kan herstel julle vir hierdie agt waardes. Goeie werk. Kom ons neem 'n blik digitaal vir net 'n oomblik voordat ons probeer iets anders, na wat net gebeur. Hier, wat jy oor om te sien ' visualisering van hierdie agt mense waardeur blou en rooi bars verteenwoordig nommers. Die langer die bar, hoe groter die nommer. Hoe korter die bar, hoe kleiner die nommer. En wat jy gaan om te sien, is in ewekansige om meer as agt van hulle. Jy gaan hierdie bars om te sien kry gesorteer volgens dieselfde algoritme of 'n stel instruksies wat Ons sal voortaan noem borrel soort. So sien, elke tweede of so, twee bars verligting in rooi, vergelyk word deur die rekenaar. En dan as die groot bar en die bietjie bar is buite orde, hulle word verruil vir my. En dit is ongelooflik vervelig om dit te sien, beslis, vir baie lank, maar kennis van die takeaway-- groot bars beweeg na regs, bietjie bars beweeg na links. Kom ons staak hierdie proses en bespoedig dit op te wees baie vinniger, so ons kan kry 'n hoë-vlak sin van wat, Inderdaad, is borrel soort doen. Inderdaad, is dit borrelende tot die regterkant van die lys, of die skikking, die groter bars. En omgekeerd, die klein bars is borrel hul pad na die linkerkant, al is dit teen 'n vinniger tempo as wat ons voorheen gedoen het. So, harder te sien met die mens, maar visueel dit is inderdaad wat gebeur het. Maar laat ons probeer om 'n fundamenteel verskillende benadering nou. Kom ons probeer om 'n ander algoritme waarvolgens ons het julle ouens begin in hierdie oorspronklike posisies, wat hierdie orde hier. En laat ons gaan voort nou. En ek gaan om iets te doen nog makliker, reg? In retrospek, uitruiling paarsgewyse weer en weer, amper 'n bietjie slim. Kom ons doen dinge nog meer naïef, waar as ek wil hierdie mense te sorteer, laat my net te hou soek vir die kleinste element. So nou, 4 is die kleinste getal wat ek gesien het. Ek is van plan om dit te onthou. Nee, 2 is beter, en onthou dat. 1 is selfs kleiner. 3, 7, 5. OK. One-- wat is jou naam nou weer? Artie: Artie. David Malan: Artie. So, Artie, voort te gaan. Ek gaan jou uit om die lyn te trek. As jy kon terug te kom hier. En ek moet plek maak vir hom. Ons het 'n besluit punt hier. Hoe kan ons kamer maak vir Artie hier aan die begin waar nommer 1 behoort? Publiek: Shift. David Malan: OK, ons kon almal verskuif. Maar voor 'n optimalisering. Dit voel 'n bietjie irriterend vir my vier mense te vra al die pad af te beweeg. Wat anders kon ek doen? Publiek: Skakel hulle. David Malan: Skakel hulle. En wat is jou naam nou weer? Jakob Jakob. David Malan: Jacob, beweeg. Veel meer doeltreffende net te hê Jacob ruil plekke met Artie, teenoor dwing al vier van hierdie mense, baie dankie, te hul regte posisie. Wat is lekker oor Artie nou, Hy is in sy regte posisie. Kom ons doen dit weer. 2, wat is die kleinste getal wat ek gesien het. 3, 7, 5. OK. 2 is beslis die kleinste. Het nie enige werk te doen. Kom ons doen dit weer. 6. Kleinste? 8. Nee. 4? Oe. Laat my dink aan 4. 3. Laat my dink aan 3. 7, 5. Kleinste getal wat ek het gesien op die pas is 3. As jy wil kom nie. Waar gaan ons om jou te sit? En wat is jou naam? Alanna: Alanna. David Malan: Alanna, ons is gaan hê om jou te sit. Maar dit is meer doeltreffend, om net ruil twee mense, as verskeie mense te hê eintlik systap oor. Nou laat dit weer doen. Ek gaan om te kies 4, so kom uit. En wie gaan om te beweeg? Nommer 8, natuurlik. As ek nou nommer 5, kom uit. Nommer 8 gaan kry weer uitgesit. Ek gaan nou nommer 6 te vind in die plek. 7 in plek. 8 in plek. Wat ons nou net gedoen het, is iets genoem seleksie soort, en as ons dit in beeld, dit is gaan voel 'n bietjie anders. Kom ons gaan voort en uit hierdie spyskaart hier, hierdie visualization-- laat verander hierdie aan- kom op, Firefox. Kom ons verander om dit te seleksie soort. En laat versnel dit soos tevore, en begin die visualisering nou. En hierdie algoritme 'n ander gevoel. Op elke iterasie, eerlik, dit is selfs meer eenvoudig. Ek is net die keuse van die kleinste element. Nou, eerlik, ek het 'n bietjie gelukkig dat tyd, in dat dit gesorteer super-vinnig. Die elemente was ewekansige. Dit is nie, soos ons sal uiteindelik sien, fundamenteel vinniger. Maar laat ons sien 'n derde en finale nader hier na wat aangaan. So laat ons gaan voort en stel julle ouens 'n laaste keer te wees in hierdie volgorde hier. En nou, ek gaan om te 'n bietjie meer slim, net om rond ons algoritmes. Ek gaan om dit te doen. Ek gaan om te gaan nie heen en weer so baie. Om eerlik te wees, ek is moeg van al hierdie omwentelingsrigting. Ek gaan net te neem wat ek gegee aan die begin van die lys, en ek gaan om te sorteer dat daar en dan. So hier is ons. Nommer 4. Ek gaan nommer te voeg 4 in 'n gesorteerde lys. Gedoen. Ek het nou eis, en net dit meer te maak duidelik is, is dit deel van my lys gesorteer. Dit is soort van 'n dom eis nie, maar wel 4 word gesorteer in 'n lys van die grootte een. Nou, ek gaan om te neem op nommer 2. Nommer 2 Ek gaan nou te plaas in die regte plek. So, waar 2? Dit is duidelik dat hier. So gaan voort en terug, as jy kon. En hoekom jy nie ouens net neem nie jou musiek staan ​​saam met jou hierdie tyd. En laat ons met geweld voeg jy in die begin van die lys. So 'n bietjie meer werk. Ek het Jacob om rond te beweeg, En wat is jou naam? Amin: Amin. David Malan: Amin. Maar ten minste het ek nie heen en weer te gaan. Ek is net om dinge soos ek gaan. Ek is net inbring hulle in die regte plek. 6, is dit eintlik redelik maklik. Kom ons plaas jou daar, as jy wou net effens oor te skuif. Nommer 8, ook redelik maklik. Reg daar. Damn dit. Nommer 1 kan ons nie net ruil met Amin hier want dit gaan mors die einde. So ons het 'n bietjie meer slim wees. So, Artie, as jy kon back-up vir 'n oomblik. Kom ons gaan voort en verskuif nou, in teenstelling met ons vorige algoritmes, ruimte vir Artie te maak reg hier aan die begin. So aan die einde van die dag, ek is soort doen wat ek wou vermy het nie. En so my algoritme is 'n soort van omgekeer, intellektueel, van wat dit oorspronklik was. Ek is net besig met die verskuiwing op 'n ander punt. Nou is ek op 3. Ag, damn. Ons het weer meer werk te doen. So laat druk jou uit. Kom ons beweeg 8, 6, 4-- oh oh-- en 3 gaan net daar te gaan. So ten minste effense besparing hierdie tyd. 7, wat nie te veel werk wat gedoen moet word. So as jy wil pop terug, laat ons voeg jou. En laastens, 5, as jy wil terug te pop, ons jy moet skuif, het jy, nie, totdat vyf is in plek. So nou is dit te sien in 'n hoë vlak grafies, Kom ons doen hierdie algoritme visualisering een bykomende tyd. So sal hierdie ons voeg soort noem. Ons sal dit loop net soos vinnig, en begin dit hier. En dit is ook 'n ander gevoel. Dit is soort van beter en beter, maar dit is nooit volmaak totdat ek gaan in en glad in die gapings. Omdat, weer, ek is maar net te neem wat Ek word gegee van links na regs. So ek het nie so gelukkig nie kry dat alles was perfek. Dit is hoekom ons het hierdie klein mispositions dat ons vaste verloop van tyd. So al hierdie algoritmes lyk loop op effens verskillende tempo. In werklikheid, wat sou jy sê is die beste of die vinnigste tot dusver? Borrel soort, die eerste? Seleksie soort, die tweede? Invoeging soort, die derde? Ek hoor dat sommige seleksie spesies. Ander gedagtes? So dit blyk dat al hierdie algoritmes fundamenteel net so doeltreffend as elke other-- of, omgekeerd, net soos ondoeltreffende soos elke ander, want ons kan fundamenteel doen beter as al drie van hierdie algoritmes. En dit is 'n bietjie van 'n wit leuen, ook. wanneer ek sê as doeltreffende of as ondoeltreffende, dit is ten minste vir super-groot waardes van n. Wanneer ons net agt mense hier, of miskien 50 of so bars op die skerm, jy sal absoluut sien verskille tussen dié drie algoritmes. Maar as n, die aantal mense, of die getal van getalle, of die aantal mense wat in die telefoon boek, of die aantal webblaaie in die databasis Google se groter en groter word, ons sal sien dat al drie van hierdie algoritmes is eintlik redelik swak. En ons kan fundamenteel doen beter as dit. Kom ons neem 'n blik, uiteindelik, na wat hierdie algoritmes mag klink soos in die konteks van 'n paar ander sowel deur middel van hierdie visualisering hier wat ons sal stel aan 'n aantal algoritmes. Kom ons gaan voort en geluk ons deelnemers hier, wat almal gesorteer hulself baie goed. As jy wil graag 'n afskeidsgeskenk te neem. Jy kan hou jou nommers sowel. En wat jy sal sien, of liewer hoor, nou, is dat as ons sit klanke elk van hierdie bars en assosieer dit met die sagteware, verskillende frekwensie van klank, kan jy jou gedagtes meer audioly draai rondom wat elkeen van hierdie dinge lyk. Die eerste is invoeging soort [TONES] Dit is borrel soort. [TONES] Seleksie soort. [TONES] Iets genoem merge soort. [TONES] Gnome soort. [TONES] Dit is dit vir CS50. Ons sal jy sien op Woensdag. NARRATOR: En nou, "Diep Gedagtes, "deur Daven Farnham. Hoekom is dit 'n lus vir? Hoekom maak dit beter? Ek wil 'n vyf lus. [Gelag]