DAVID Malan: Dobro. Torej je to CS50, in to Zdaj začetek tritedenskega. Torej, do sedaj, ki smo jih je pisanje programov v C da poglej malo kaj takega tukaj. Torej imamo nekaj oster vključuje na vrhu. Imava int, glavni, ničen in potem je nekaj narediti v sredini, nekateri malo kode v notranjosti te funkcije. Vendar je ključ bil dejstvo, da smo bili rekoč ničen tukaj. Zato nična, vse to čas, določa, da ta program, ko teče, lahko delujejo samo preko njenega imena. Ne morete vnesti nobene druge besede ali številke po imenu programa, ko tekmovanje v teku. Tako, na primer, če bi program zbrati v datoteko imenovano zdravo, lahko narediš ./hello, ampak to je to. Edini način, da si lahko prispevati k temu programu je s klicem funkcije. Na primer, kakšno funkcijo smo bili z uporabo doslej dobiti prispevek od uporabnika? OBČINSTVO: Get niz. DAVID Malan: Da bi dobili niz, ali dobili int, ali si videl druge, tudi če jih niste še ni bila uporabljena, kot dobili dolgo, dolgo in podobno. Recimo, da smo dejansko želijo začeti pisanje programov, ki so malo bolj vsestranski, in, odkrito povedano, malo bolj kot ukaze, ki ste jih so dobili, upajmo, malo vajeni. Like cd vesoljske Dropbox. To, seveda, spremembe vaš imenik, ob predpostavki, ste v John Harvard domu imenik, na mapi Dropbox. Medtem, ukaz, kot je ta ustvari novo mapo z imenom pset2, kot ste morda že ali bo kmalu na problem nastaviti dva. Pozdravljeni, da, seveda, je ukaz ki gradi program, imenovan zdravo iz datoteke imenovano zdravo dot c. In v vsaki od njih primeri, zdaj smo imeli zagotoviti argument na tako imenovane ukazni vrstici, utripa hitro, tako da make ve, kaj graditi, in tako da mkdir ve, kaj mapo ustvariti, in da cd ve kamor želite iti. Ampak do sedaj, smo ostali pravijo da je glavna, vaš privzeti funkcija, ima neveljaven izraz znotraj teh oklepajih kar pomeni, da ne morejo sprejeti nobenih argumentov. Torej, od danes naprej, kaj bomo storili je, da bomo začeli podpiranje stvari, kot je to sploh. Dejstvo je, da v tem primeru, ki vas običajno ne ročno vnesti, Da je bil to za nas ne obstajajo enega, ampak ena, dva, tri dodatne strune po programu Imenovala Jek. Torej, kako bomo to dosegli? No, od danes naprej, v primerih, ko želimo da se zagotovi prispevek prek tako imenovani ukazni vrstici, bomo za začetek dodajanja tukaj, kaj je v yellow-- nadomešča praznino z int argc vejico niz argv oklepaj zaklepaj. Zdaj je to zanimivo za nekaj razlogov. Ena, da se dogaja, da nam pišete Programi, ki so malo bolj dinamično. Ampak, bolj očarljivo, da se bo odprlo Zdaj pogovor, da kaj nize lahko resnično se uporabljajo za tisto niz Res je pod pokrovom, do naslednjega tedna, ko smo začeli potapljati v še globlje, kako stroj kar vse te stvari dela. Ampak za zdaj, kaj je pripraviti, morda slika. Ko pišete program z glavno razglasila na ta način, tako da glavna traja dve trditvi, int in-- kakšna vrsta podatkov je drugi argument? OBČINSTVO: Array. DAVID Malan: Array. Tako je videti na prvi pogled, kot da je Niz, ampak obvestilo oglatem oklepaju. Spomnimo, zadnji čas smo uvedli Pojem matrike. In nizi uporabite oglate oklepaje V nekaj kontekstih. Morda ste uporabili kvadrat nosilci, ki gredo v array in dobili določen element, kot je nosilec 0 ali nosilec 1 ali nosilec 2. Vendar smo videli, če na kratko, prejšnji teden, da si tudi uporabo teh oklepajev do razglasi velikosti matrike, če veš vnaprej, koliko ints ali koliko strings ali karkoli dejansko želijo. Tako se izkaže, tam je tretja kontekst tukaj da nima več znotraj V oglatih oklepajih. Ko določite, kot sem že tukaj, ime nekaj podobnega argv, ki je samo fancy način rekoč argument vektor, ki je še en fancy način rekoč niz argumentov, oklepaj zaklepaj samo pomeni, da vam ni nujno vnaprej vedeti, kako velika Niz se bo, ampak veš, da se dogaja, da je matrika. Torej, če ne veste, številka ne dal noter, za oklepaj tesnem nosilec pomeni, da je argv ni niz, ampak niz nizov. Torej skladenjsko, če vas Spomnimo prejšnji teden, je zelo podobna pravi, nekaj podobnega int starosti oklepaj, in potem se je nekaj kasneje. Torej, kaj je tole? Poglejmo resnici narisati sliko. Torej, ko zaženete ta program z glavnimi ko dva argumenta opredeljena v notranjosti teh oklepajih, si v bistvu ima vsaj dve kose spomina izročil za vas pod pokrovom. Ena, saj bom črpa kot pravokotnika, se dogaja, da se imenuje argc. In kakor hitro Rekapitulacija, Kaj je podatkovni tip argc? Torej je int. Torej število se bo iti v argc-- zavojih , da stoji za število argumentov. Medtem Narisal sem argv kot niz. In jaz ne vem kako dolgo bo še, tako za današnje namene dot dot. Morda bi dobili neke dolžine. Vendar sem na sliki najmanj štiri pravokotnike. Torej argv kos pomnilnika, ki shranjuje NIZ niz dot dot, in argc je samo en kos spomin za celo število. Torej sedaj, bodimo malo bolj natančen. Če potem, ko imam strune v tem polju, imenovano argv, želim, da se na njih individualno, tako kot prejšnji teden, bomo uporabili zapis kot argv nosilec 0 da bi dobili prva stvar niz. Argv bracket 1, da bi dobili Druga stvar, in tako naprej. Ključno pa smo še vedno 0 indexed-- smo še vedno šteje od 0. Torej, zdaj pa je pravzaprav dal nekaj na tem. Če bi bil, da pripravi program, imenovan Pozdravi iz datoteke imenovano zdravo dot c, in potem sem teči ta program s piko poševnica zdravo, kaj počne moj računalnik, svoj laptop, videti pod pokrovom trenutek, ko sem teči dot poševnica zdravo in pritisnite tipko Enter? No, to je morda kaj bi lahko opisali kot vsebine računalnika spomin, ali RAM-- Random Access Memory. Z drugimi besedami, računalnik, nekako zate čudežno, postavlja številko 1 v argc, AKA argcount, in ga postavi dobesedno niz ./hello v argv nosilec 0. Nimam pojma, odkrito povedano, kaj je v ARGV nosilec 1 ali 2 ali 3, ker če ima uporabnik ne natipkana karkoli poleg ./hello, bomo predpostavimo, da so ti so najverjetnejše vrednosti za smeti, tako rekoč. Te kose pomnilnika obstajajo, vendar to ni odvisno od nas, pogled na njih, ker argcount je le ena. Zdaj, medtem, če I napisati zagnati drug program, cd, ki je bolj pravilno ukaz, V vašem utripa prompt-- cd prostor Dropbox-- ko sem prost, da učinkovito, ko je program cd teči, argc, Notranjost spomin mojega računalnika, je za Najbolj najkrajše druga številka 2. In potem argv bracket o ima cd, argv nosilec 1 je Dropbox, in potem seveda ukaz dopolnjuje, tako da vse to spomin v bistvu gre proč in se uporablja za nekaj drugega. In zato pravim, samo delček sekunde. Medtem, če bomo mkdir pset2, slika videti skoraj enaka, vendar z različnimi nize znotraj argv. Če naredim Jek pomišljaj Pozdravite Pozdravljeni dot c, ista ideja. Več stvari se izpolni za argv in argc, seveda, je 4. Torej, z drugimi besedami, čeprav ta sklop lahko dot dot, nekaterih spremenljiva dolžina, tako rekoč, boste vedno vedeli, kje je bila konec njega je, ker argc se dogaja, da ti povem na kateri točki boste morali nehati gledaš elementov v argv. Si lahko ogledate le na štirih skupaj v tem primeru. Torej, kaj je sedaj si oglejte, morda preprost program. Tisti, ki samo pozdravi za nekoga, kot Zamyla. Torej trdim, da bom napisati program , v trenutku, prek katerega naj bi storil ./hello prostor Zamyla, in potem hočem moj program natisniti nekaj super-enostavno kot "Zdravo, Zamyla." Zdaj je v preteklosti smo uporabili getstring. Tako v preteklosti, tudi če ste novi v programiranje, verjetnost, da bi lahko zvrnila program, ki uporablja getstring in nato uporabi printf pozdraviti Zamyla. Ampak ne uporabljajte getstring tokrat. Dovolite mi, namesto da bi šel v Appliant in ne vključujejo standardno I O dot h. Dovolite mi, da tudi CS50 dot h. Zdaj int glavni, in zdaj sem Ne boš naredil void danes. Namesto tega bom naredil int argc niz argv oklepaj zaklepaj, ne določa več. In tukaj je moj tako imenovani storiti. Kaj bom storiti zdaj je, da sem naredili malo preskok vere, Jaz bom za domnevo, da je uporabnik bo pravilno uporabljati ta program, in bom enostavno na storiti printf Pozdravljeni,% Sn. Torej, nič novega ni. Ampak želim, da sedaj dajo karkoli beseda uporabnik vnese po imenu programa. Torej, če naredim ./hello prostor Zamyla, I želeli nekako programsko dostop citiram konec citata "Zamyla." zato sem Lahko greš v moj argument vektor, moj nabor nizov, in če je ukaz, Ponovno je bil ./hello prostor Zamyla, kaj več storiti hočem postaviti v argv tukaj? OBČINSTVO: 1. DAVID Malan: 1, ker bracket 0 izkaže, se bo ime programa, kot smo videli. Torej nosilec 1 je prva beseda da I, uporabnik, vnesli. Jaz grem naprej in rešiti to. Jaz grem v mojo mapo kjer sem dajo te datoteke. Bom naredil, da pozdravi 3. OK Comp IO stranke. ./hello Zamyla Enter. Kaj sem naredil narobe? Me je presenetila sam za trenutek tam. Kaj sem naredil narobe? OBČINSTVO: Name. DAVID Malan: datoteka je pravzaprav imenuje hello3.c. In sem to naredil samo za doslednost, ker smo imeli hello.c v mimo v spletni kodo. Torej, dajmo popraviti to ./hello bracket dash 3 Zamyla. Enter. In zdaj imamo zdravo, Zamyla. Medtem, lahko to spremenite v Rob je, ali res vsaka druga beseda. Ampak kaj menijo primera iz kota. Kaj lahko pričakujete, se bo zgodilo, če Ne tip sploh ime kogarkoli? OBČINSTVO: Napaka. DAVID Malan: napaka neke vrste, morda. Pa poglejmo. Enter. Null. Torej printf dejansko pa malo zaščitniški do nas tu, in dobesedno tiskanje odprte paren null, vendar še hujše stvari se lahko zgodi. In samo zato, da dokaže nekaj, kar je nujno ne bi smeli storiti, pojdimo v tukaj in začnite plazim okoli. Prav? Če vem, da je slika v Pomnilnik je v bistvu to, argv bracket 1 ima Zamyla, argv bracket 0 ima ./hello ali ./hello-3. Kaj je v oklepaju 2? Torej lahko jaz odgovorim vprašaj sam, kajne? Jaz lahko samo spremenite 1 do 2. Zdaj lahko prevedem zdravo 3, ./hello3 Naj povečate in pritisnite tipko Enter. Ops. Ne quote znamka. Zanimivo. Torej, to je nekako kul videti, kaj je notri. Torej, kaj je notri moj laptop? Naj ga shranite z držalom 3. Naredite hello3, ./hello-3. Radoveden. In zdaj pojdimo res bold-- 50. Tako, da je res globoko potapljanje v spomin mojega računalnika. 50 indeksi v. Torej, da pozdravi 3 ./hello-3. Radoveden. Dobro, zdaj sem samo bo dobil nepremišljene. Pojdimo na 5.000. V redu. Torej naj prevedem. Naredite hello3, ./hello-3. OK. Zdaj nekateri izmed vas, da bi lahko biti žarnica bo off. Koliko imate videla to sporočilo? OK. Torej, zakaj? Kvota si-- in tam je drugačna Stvari, ki lahko povzroči to, in jasno, da ste v dobri kompanija-- imamo jasno povzročil, kar se imenuje napaka segmentacija. In zgodbo za danes, sem so se dotaknile segment pomnilnika da mi ne bi bilo treba. Kjer je segment, pomeni le kos pomnilnika, ki je ne bi smel imeti. Sedaj računalnik zagotavlja, da če sem teči ./helloZamyla da se lahko dotaknem argv biti nosilec 0 in argv nosilec 1. Vendar argc je vrednost 2, kar pomeni, da sem le dovolim-- je nekako čast system-- na dotik bracket 0 in 1 nosilec. Če bi šli še dlje, tam je absolutno bo spomin tam. Moj RAM obstaja fizično v računalniku. A kdo ve, kaj je tam? Dejansko tečem mnogokratnik programi naenkrat. Morda bom imel seen-- če ne bi bilo tem na Appliant ampak na mojem Mac ali PC-- da imam videti vsebino e-pošte. Mogoče sem videl takojšen Sporočilo Pred kratkim sem poslal. Karkoli, da bi lahko dolgotrajen okrog v spomin bi bila lahko dostopate preko ta samovoljna square bracket zapis. Ali, še huje, morda imate našli enega od mojih gesel da sem pred kratkim vnesli, da Program je shranjen v pomnilniku, tako me avtentikacijo in potem pa nekako levo v RAM, dokler nisem nehal ta program. In res, to je eden od nevarnost in ena pooblastila uporabe jezika, kot je C. Imate neoviran dostop za celotno vsebino pomnilnika programa je, in kaj slabi fantje lahko še storiti v teh cases-- še posebej, ko smo dobite na spletni programiranje proti koncu semestra, se bomo preučiti to topic-- se suniti okrog, lahko, da je nekdo računalnika spomin in našli takšne stvari radovedne kot smo videli tam. Ali še celo slabše, gesel, ki se je ali ona lahko nato uporabite za delajo slabe stvari. Torej, očitno ti ne bi smel tega storiti, ker čudne stvari začnejo dogajati. Dejansko, to je program razpada. To bi bilo enakovredno Mac OS ali Windows okno programa samo izginjajo. Prišlo je do nepričakovane napake. V okolju, v ukazni vrstici bomo videli kaj takega. Toda zato se bom preprostim dotikom spomin, ki ne pripadajo meni. Torej, kaj je braniti pred a malo drugače ga je videti na tem programu tukaj. Torej, še enkrat, skeleton da smo videli earlier-- in sem opozoril na časovno int. In ves ta čas je bil glavni dejansko vrnil vrednost. Čeprav je v večini naših predavanju Primeri, ki smo jih nekoč uporabljali nikoli vrne ničesar glavni. Pravkar smo napisali printf blizu curly brace in to je to. Toda zastonj, kaj prevajalnik delal za vas, učinkovito, se vrača 0 za vas. Izkazalo out-- in to je malo counterintuitive-- da je 0 dobro. To ne pomeni napačne po sebi. 0 je dobro, in vsak ne-0 vrednost, se je svet odločil, da lahko pomenilo napako. Torej, če ste kdaj zamočil nekaj, kar na vašem računalniku, ali je program, je umrl na vas in ste gotten nekaj napačno okno na zaslonu, češ napaka Negativni 49 ali napaka 23-- nekateri navidezno samovoljno value-- da je ker je programer težko kodirane- vrednost kot negativna ali pozitivna 49 23. da predstavlja poljubno število, si trditi, 4 milijarde možnih stvari da bi lahko šlo narobe v programu. Torej, kako lahko vzamem Prednost tega sam? No, naj odprejo program da sem napisal vnaprej, in suniti okrog spletu imenuje Halo 4. In to je skoraj identična, razen da Njegova dobil malo napak preverjanje. V tem primeru, sem spet razglasila Glavni kot ob dva argumenta, vendar tokrat na liniji 17, obvestilo Delam malo preverjanje razumnosti. Sem kar prepričan, da argc enaka enaka 2. Ker če je, da pomeni, da sem lahko varno dotakniti ne le nosilec 0, temveč nosilec 1. In sem šel naprej in natisniti, V tem primeru, ali Zamyla Rob ali karkoli beseda sem tipkal ven. In sedaj, samo da dobijo malo bolj pravilno, Bom izrecno vrnitev 0, ki nakazuje, da je vse dobro. Nič slabega se je zgodilo. Ampak po dogovoru, grem na vrne 1, ali povedano katerokoli non-vrednost 0, če je kaj narobe. Zdaj se uporabnik ne bo res opazili, kaj se dogaja. Pravzaprav, če sem šel v ta imenik, smo povečate in ne predstavljajo pozdravi 4, ./hello-4 Zamyla obnaša kot pričakujem. Ampak, če bom namesto tega ne vnesete kaj, nič ne zdi, da se zgodi, vendar pa ne sesuje. In če sem namesto nekaj kot Rob je Proctor v Thayer-- delitev samovoljno informacije. Toda obvestilo, argv 1, 2, 3, 4, in 5, naj bi zdaj obstajala v spomin. Tudi to je, kaj ne moj program pričakuje, ker sem preverjala, ali argc enaka enak 2 ali ne. Torej sem zdaj branil proti temu. Zdaj, kot prahi, smo programmer-- oziroma smo users-- ni videti, da 0 ali 1, vendar z uporabo orodje, imenovano razhroščevalnik, ali druga orodja, kot bomo videli pred dolgo, programer lahko dejansko videli, kaj bi bilo narobe znotraj vašega programa. Torej, kakršna koli vprašanja o argc? Ja. OBČINSTVO: Videl sem, kjer so niso imeli značaj, [neslišno] pravkar rekel niz zvezda d, kot znak zvezdica comma. So enakovredna tukaj? DAVID Malan: So. Torej, vprašanje je, imate občasno opazili programi kot je ta, da ne pravijo niz argv nosilec ampak nekaj reči kot char zvezda argv nosilec. In tu je še druga variante, ki jih lahko vidite. So res enakovredni. Za zdaj imamo to vrste koles za usposabljanje na v obliki niza v CS50 knjižnica, vendar samo v enem tednu ali pa tako, da bomo odstranili, da obstrukcija v celoti in dejansko Poglejte, kaj je char in zvezda so, in kako tiste, nanašajo na spomin zastopanje na splošno. Torej se bomo vrnili na to. Druga vprašanja o naši argv ali argc? Ja. OBČINSTVO: Zakaj se je vrnil napaka [neslišno]? DAVID Malan: Zakaj je to storil vrne napako only-- oh! V prejšnjem primeru, ko smo so futzing okrog s spominom, zakaj je le vrnil napako ko sem tipkal res veliko številko? Kratek odgovor je, da smo samo srečo. Na splošno gledano, računalnik dodeljuje pomnilnik v koščkih, in to mi je dovolj velik kos, ki Imam stran, ne da bi opazil, dotika nosilca 2, nosilec 3, Nosilec 50, ampak takoj, ko sem potisnil moja sreča, sem šel preko Meje kos pomnilnika operacijski sistem mi je dal. In to je, ko je vpet in rekel, no. Segmentacija napake. Ja. OBČINSTVO: Kako računalnik izvedeli vrednost argc? DAVID Malan: Kako Računalnik izvedeli vrednost argc? Ko zaženete program, da program po naravi utripajočo poziv je izročil niz Besede, ki so bili napisani na poziv, ki je bil tipkal na poziv. In tako je operacijski Sistem, ki v bistvu poseli glavnih argumentov za vas. Torej, to je ena od storitev, da boste dobili, nekako na skrivaj Pod pokrovom operacijski sistem. Druga vprašanja? Ja. OBČINSTVO: Kaj core dump pomeni? DAVID Malan: Kaj core dump pomeni? Torej, to je dobro vprašanje. In me spusti nazaj v ta imenik tukaj. In opazili boste, da Imam novo datoteko tam. To je res imenuje jedro, in to je pravzaprav tipično dostojno velikih datotek. To je v bistvu posnetek vsebina pomnilnika mojega programa ali RAM, ko je strmoglavilo. In to bo koristno, potencialno diagnostično, ko govorimo v prihodnjem predavanju in poglavje o odpravljanje napak, ker lahko dejansko narediti enakovredno digitalnega obdukciji o datoteki, ki pomagajo ugotoviti, kaj ste naredili narobe v vašem programu. Ja. OBČINSTVO: Je argc ukaza v sam, ali ga lahko poimenujete kaj? DAVID Malan: Dobro vprašanje. Je argc ukaz sam po sebi, ali lahko to ime kaj? To je definitivno ni ukaz. To je preprosto spremenljivka je ime ali ime argument je, in tako popolnoma smo Lahko pokličete to foo, bi lahko to imenujemo bar, ki težijo da je go-to besede, ki računalniških znanstvenik gre. Ampak po dogovoru, ki jih uporabljamo argc in argv. Ampak to je samo človek Konvencija, nič več. V redu. Tako se izkaže, da sem bil povedal nekaj belega lie-- in odkrito povedano, v prihodnosti, boste videli smo že povedali druge bele laži. Ampak za zdaj, gremo lupiti nazaj eno od teh. V tem primeru tukaj, ko prej sem tekel program, kot ./hello ali ./hello-3 Zamyla smo imeli vsebino my pomnilnika računalnika videti približno tako kot to. Ampak se spomni, kaj je niz. Kaj smo rekli pred tednom dni, kar Niz je dejansko pod pokrovom? OBČINSTVO: Array znakov. DAVID Malan: To je niz znakov, kajne? Torej, morda imamo celo paleto strune, vendar v zameno, niz je niz znakov. Torej, če si res želim, da bi anal, ko rišem sliko, Moram res risanje je malo več, kot je ta, pri čemer je v vsaki od teh indeksi mojega argv array, je sama cel niz ki je sama v matriki. In zdaj bela laž smo danes povedali je, da slike ne pogled čisto tako. V resnici, malo kvadratov običajno zunaj velikih pravokotnikov tam. Ampak se bomo vrnili na to kmalu. Ampak to je ./hello Nagibnica 0, da bi poseben znak, ki razmejuje konec niza, in imamo še eno po Ime Zamyla je. Torej, kaj to pomeni? No, naj gredo naprej in odprli še dva primera , ki so na voljo na spletu. Ena se imenuje argv1.c in drugi je argv2. To je program, super-preprosta, da je drugačna od prejšnjih programov s tem, da zdaj sem s pomočjo argc in argv tukaj. In zdaj sem povezovanje z zanko v vrstico 18, od i = 0 za do argc. In kaj bom naredil s to vrstico kode tukaj? V angleščini. To očitno kaže uporabo argc. Ampak v angleščini, kar počne to storiti, če sem teči ta program? Ja? OBČINSTVO: To se dogaja, da natisnete Zaslon tolikokrat, kot želite. DAVID Malan: Točno tako. Torej, ne glede besed I vnesite ob pozivu, da je bo Izprazniti jim name enega v vsako vrstico. Torej, gremo naprej in to. Dovolite mi, da gre v mojem imeniku in ne bi argv1 ./argv1. In zdaj, kaj je naj bo enostavno. Naredimo ničesar na prvi. Je to storil natisnete eno stvar, in to je dejansko ime programa, ker je to v oklepaju 0. Če bom zdaj rekel, foo, da bo storil tista dva, in če rečem, foo bar, to bo rekel, te tri stvari. Zdaj, da je nekoliko zanimivo, morda. Vendar pa opozarjajo, da je argv je množica nizov, ampak niz je niz znakov, tako da bomo lahko stvari zarezo in velja, da je osnovna logika in da kodo, ki zgleda malo bolj skrivnosten, seveda. Vendar ga ima ugnezdena loop, nekaj podobnega s tem, kar boste morda spomnite iz Mario, na primer, če ste to storili na ta način. Torej, zdaj opazili na liniji 19, sem Ponovno ponavljanjem preko mojih argumentov, od 0 na do argc. In zdaj je v skladu 21-- sem zadolževanja trik iz zadnjega week-- Jaz sem preverjanje, kaj je dolžina argv konzole i. Jaz shranjevanje ta odgovor v n. In potem sem vključevanju iz j na do n, kjer je j inicializirano na 0. Torej, konvencija o štetju. Ko ste že uporabljali i, če imate nested loop, vam ne morem ponovno uporabiti, sicer boste piąi prek potencialno vrednost zunaj notranje zanke. Torej, jaz sem z uporabo j po dogovoru. Mi lahko uporabite k. Če imate več kot k, ste verjetno imajo preveč gnezdenje, tipično. Toda zdaj, opazil moj printf linija je nekoliko drugačna. Nisem tiskanje% s, sem tiskanje% c, kar seveda je ograda za char. In zdaj opazil to sintakso. Novo. Nismo ga videli. Vendar pa je logično, to samo pomeni, dobil i-niz v argv in dobili j kaj? OBČINSTVO: Character. DAVID Malan: Character v tem nizu. Torej, z uporabo oglatih oklepajev sledi oglatih oklepajih, to je potapljanje prvi v nizih argv je, in nato drugi oklepaje z j je potapljanje v črkah da zlasti niz v argv. In potem, samo za dober ukrep, Jaz tiskanje novo linijo tukaj. Torej, zdaj pa grem naprej in odprite do nekoliko večje okno tako da bomo lahko videli v akciji. Dovolite mi, da gredo v to mapo. In zdaj se naredim argv-2-- whoops-- da argv-2, ./argv 2. Enter. In to je malo težko brati navpično, ampak to je res ime Program, sledi prazno vrstico. Zdaj pa grem naprej in to foo. Podobno težko brati, vendar je dejansko tiskanje znakov na vrstico. In če naredim bar, to je zdaj tiskanje tiste po vrsticah. Torej takeaway tukaj ni toliko da, wow, poglej ta čeden nov trik kjer lahko dobite na vsebino posebnih znakov matrike je, ampak kako sva ob teh osnovnih Ideje, kot so indeksiranje v matriko, in nato indeksiranje v matrika, da je bila v tem polju, in samo ob uporabi istih zamisli nekoliko bolj zapletene primere. Ampak osnove res ni , celo od prejšnjega tedna. Zdaj je to nekako pravočasno, s tem, da se spomni, na ničelni teden smo igrali z imenika, kot je ta. In čeprav je to seveda fizikalne kosov papirja, lahko nekako misliti telefonski imenik, kot matrike. Seveda, če bi reimplement ta kosov teh kosov papirja v računalniku, verjetno bi uporabili nekaj kot array shranjevanje vseh tistih, ki Imena in številke od A do konca skozi Z. je torej to lepo, ker to nam omogoča priložnost, morda, da razmisli, kako bi lahko dejansko izvajajo nekaj takega. Kot z vrsto vrat tukaj. Torej, če sem lahko-- potrebujemo eno prostovoljno, da pridejo gor. Pa poglejmo. Neznan obraz morda, neznan obraz morda. Kaj pravite na oranžno? Tukaj. Orange shirt, pridi gor. Pojdimo zdaj in premik ta vrata na rob, premakniti ti iz poti za trenutek. Kako ti je ime? Ajay: DAVID Malan: Ajay. David. Lepo, da sva se spoznala. V redu. Tako da imamo v ozadju teh šestih Vrata na digitalno s screen-- ali, bolje rečeno, sedem vrata na screen-- cel kup številk. In jaz sem ti povedal nič v advance-- dogovorili? Ajay: Nič vnaprej. DAVID Malan: Vse, kar želim, da narediš Zdaj je treba najti zame in za nas, res, številka 50, en korak naenkrat. Ajay: številka 50? DAVID Malan: Številka 50. In lahko pokažejo, kaj je zadaj vsaka od teh vrat preprosto z dotikom s prstom. Prekleto. [Smeh] [APLAVZ] Zelo dobro opravljeno. OK. Imamo lepo darilo Nagrada za vas tukaj. Tvoja izbira filmov smo razpravljali prejšnji teden. Ajay: Oh, človek. Oh, še nikoli nisem videl Spaceballs. DAVID Malan: Spaceballs. V redu. Tako imajo na samo enem trenutku. Kako-- naredimo to teachable moment-- kako ste se lotili poiskati številko 50? Ajay: sem izbral naključno. DAVID Malan: Torej ste se odločili naključno in srečo. Ajay: Da. DAVID Malan: OK. Odlično. Torej, zdaj, če ne bi gotten srečo, kaj morda se je zgodilo za temi vrati? Torej, če grem naprej in razkrivajo te številke tukaj, dejansko so v naključnem vrstnem redu. In najbolje, kar bi lahko imelo storiti, odkrito povedano, je s končno v najslabšem primeru pa jih vse preverjanju. Torej imaš super srečo, ki ni tisto, kar bi pravimo algoritem. Ja, čestitke. Toda zdaj Pojdimo-- humor me, če bi lahko. Pojdimo v tem zavihku tukaj. In tu so številke v jasno kaj izgleda naključnem vrstnem redu, in so. Ampak zdaj, če sem namesto zahtevek da je za temi vrati so številke, ki so razvrščena. Odslej je tudi nas najdete številko 50. Ampak to algorithmically in nam povejte, kako boste o tem. In če boste ugotovili, da obdržite film. Vam ne zdi, da si ga dal nazaj. Ajay: Torej bom preveril konce prvič, da se ugotovi, če there's-- [Smeh in aplavz] DAVID Malan: Tukaj imaš. Oglejmo si na eni predhodniki Ajay je, Sean, ki ni bil tako zelo srečen. OK, tako da vaša naloga tukaj, Sean, je naslednje. Sem se skriva za temi vrata številka sedem, ampak spravljen v nekaterih od teh vrat kot tudi druge ne-negativne številke. In vaš cilj je, da si to top row številk le kot matrike. Mi smo samo zaporedje kosov papirja s številkami stojijo za njimi. In vaš cilj je, le z vrha matrika tu našli mi številko sedem. In smo se potem dogaja, da kritika kako iti na to početje. Poiščite nas na številko sedem, prosim. Število 5, 19, 13. To ni trik vprašanje. 1. Na tej točki je vaša ocena ni zelo dobro, da si lahko tudi naprej. 3. Pojdi. Odkrito povedano, ne morem pomagati, ampak se sprašujem, kaj si sploh razmišljal. SEAN: Jaz lahko samo iz zgornji vrstici. DAVID Malan: Samo zgornja vrstica. Torej imaš tri levo. Torej mi našli 7. [PUBLIKA Kriki PREDLOGI] Torej, tako tistih, ki so bili neverjetno najrazličnejših razlogov. Torej, to je, če smo končali pred nekaj trenutki, in ključ vpogled tukaj je bila ta vrata so imeli številke za njimi, ki so bile razporejene, ideal takeaway, za katere je, da bi vam bistveno bolje ta druga Primer-- in seveda, da je bil Sean Prvi poskus z naključnimi številkami prav tako before-- ampak takoj saj so razporejene te številke, podobno kot v telefonskem imeniku, Kaj lahko seveda storite? Ali pa, kako lahko izkoristite to znanje? Ja. OBČINSTVO: Greste na pol poti [neslišno]. DAVID Malan: Ja. Točno tako. Torej Prvi odziv Ajay je bil preveriti konce, kot se spomnim, in potem nekako končan Primer hitro. Ampak, če smo začeli to storiti več metodično v tej smeri, vendar začenši morda v srednji, ker oni so razporejene, takoj, ko bomo razkrili Številka 16, zato smo veš-- in kaj je naredil točno to-- mi Zato vem, da je 50 let, v današnjem primeru, je dobil, da je na desni strani. Torej tako kot v nič, ko tednu smo strgal imenika na pol in vrgel polovico problem proč, ista ideja tukaj. Mi lahko vrgel ta polčas problema proč. In verjetno tisto, kar vas lahko storite z algoritmom, ko veš, da mora biti 50 na desni strani, če je to kjerkoli, poskušati tam, v sredini preostalih vrat. Seveda, 50 je višja kot 42, tako da bomo lahko vrgel to preostalo četrtina problema proč, in nazadnje, ugotoviti nekaj takega kot 50 let. Ampak tako kot pri telefonski imenik, te številke je bila dana, da nas že v razvrščenega.Vse nalog, ki nas pušča z vprašanjem, kako si narediti priti stvari v razvrščeni naročila? In, odkrito povedano, za kakšno ceno? To je ena stvar, ki se izročil imenik in potem očarati svoje prijatelje z iskanjem telefonska številka res hitro, kajne? Solzenje 32 strani, da bi našli Oseba iz 4 milijarde strani, smo rekli, je bil eden skrajen primer. Toda, koliko časa je trajalo, Verizon rešiti ta imenik? Koliko časa pa nam bo za razvrščanje teh sedem številk? To je vprašanje, ki smo jih doslej povsem prezrta. Torej, kaj je odgovor na to vprašanje zdaj. In vsi smo iz filmov zdaj, vendar imamo nekaj stresnih kroglice. Če, recimo, osem prostovoljcev Bi se nam ne bi pridružil tu gor? Pojdimo naprej in to, kako o štiri od vas, vi trije tu? Dobili nekaj novih obrazov. In štiri od vas tam? In sedaj-- Ne pristranskosti pustite tu-- in Številka osem sem na koncu. Pridi gor. V redu. Torej, kaj imamo tukaj vsak od vas je več. Če želite, da gredo naprej, da to številko. Kako ti je ime? Artie: Artie. DAVID Malan: Artie, v redu. Ti si številka 1. AMIN: Amin. DAVID Malan: Amin. David. Ti si številka 2. In iti naprej, kot sem roko ti listi papirja, vrstico sebe up pred glasbe stoji v istem vrstnem redu, kot je tam. ANDY: Zdravo, Andy. DAVID Malan: Andy, to je lepo, da te vidim. Številka 3. JACOB: Jacob. DAVID Malan: Jacob, številka 4. Dobrodošli na krovu. GRANT: Grant. DAVID Malan: Grant. Številka 5. Alanna: Alanna. DAVID Malan: Alanna, številka 6. FRANCES: Frances. DAVID Malan: Frances, številka 7. In? RACHEL: Rachel. DAVID Malan: Rachel, številka 8. V redu. Pojdi naprej in se dobili v tem vrstnem redu. Naj mi dajo eno preostalih glasba stati na mestu. Kje rabiš stojalo? OK. Pojdi naprej in samo dal svoje številke kjer je občinstvo jih lahko vidite na, glasba stati obrnjen navzven. In upajmo, da naša prva sanity check tu-- 4, 2, 6. Oh-oh. Počakaj malo. Ne bomo imeli 8. Moram vam izselijo iz Primer nekako. Število Ne, je že v redu. Pa poglejmo. To lahko storimo. Stati. Takole. Pravilna. V redu. Torej, zdaj imamo 8, 1, 3, 5, 7. OK. Odlično. Torej vprašanje, na strani pa je na kakšno ceno, in po katerih metoda, lahko te številke dejansko rešiti tukaj tako da bomo lahko nekako deluje nazaj, na koncu, in decide-- je res impresivno, je res učinkovita, da lahko delijo in osvojiti telefonski imenik? Je res učinkovit, da Jaz lahko razdeli in vladaj ti digitalni kosov papirja na krovu, če morda gre za nas je stal fortune časovno ali energetskih ali CPE bi dejansko dobili naše podatke v nekem urejenem vrstnem redu? Torej, kaj je vprašati to vprašanje. Torej, najprej off, so te številke V zal veliko naključnem vrstnem redu, in bom predlagala en algoritem, ali postopek , s katerim bomo lahko ti ljudje razvrstiti. Bom približati to precej naivno. In bom prepozna da je to neke vrste veliko za mene zaviti svoj um okoli cel nabor podatkov naenkrat. Ampak veš kaj? Jaz grem, da bi nekaj zelo preproste obrobne popravke. 4 in 2 v okvari, če Cilj je, da gredo od 1. dne do 8.. Torej, veste kaj? Jaz te bom imela Fantje zamenjajte, če preklopite fizično pozicije in vaše kosov papirja. Sedaj 4 in 6, so v vrstnem redu. Bom zapustil tiste biti. 6 in 8, te so v redu. Zapustilo jih je. 8 in1, deluje. Če vidva ne bi motilo zamenjavo. Zdaj 8 in 3, če bi vi zamenjali. 8 in 7, če bi vi zamenjali. In 8 in 5, če bi vi zamenjali. Zdaj sem naredil? Ne, seveda ne. Vendar sem naredil stanje boljše, kajne? Kaj je bilo že ime, številka 8? RACHEL: Rachel. DAVID Malan: Torej Rachel ima učinkovito vrela precej daleč, vse do konca Moja tabela številk tukaj. In tako se ta problem nekako rešiti. Zdaj je jasno, 2 še vedno potrebuje premakniti malo, in 4 in 6 in 1. Ampak sem se zdi, da so gotten malo bližje rešitvi. Torej se ta ista spet naivno hevristično. 2 in 4, OK. 4 in 6, OK. 6 in 1 mm-mm. Kaj je swap. 6 in 3 mm-mm. Kaj je swap. 6 in 7 je v redu. 7 in 5, Nope. Kaj je swap. In zdaj 7 in 8. In kaj je že ime? FRANCES: Frances. DAVID Malan: Frances. Torej, zdaj Frances je še boljši položaj, ker zdaj 7 in 8 pravilno mehurčkih do vrha. Torej, 2 in 4, OK. 4 in 1, swap dajmo. 4 in 3, swap dajmo. 4 in 6, da si v redu. 6 in 5, swap dajmo. In zdaj ti fantje so dobri. Skoraj smo že tam. 2 in 1, v okvari, tako zamenjali. In zdaj mi ne preverjanje prištevnosti. 2 in 3, 3 in 4, 4 in 5, 5 in 6, 6 in 7, 8. OK, tako da sva končala. Ampak za kakšno ceno pa sem Te številke razvrstiti tukaj? No, koliko korakov Sem potencialno sprejeti pri sortiranju ti ljudje? No, se bomo vrnili na to vprašanje. Ampak, odkrito povedano, če imaš malo dolgčas, da je vrsta razkrivajo, da to ni bilo morda najučinkovitejši algoritem. In res, odkrito povedano, potim vse bolj hojo naprej in nazaj. Da ni zdelo posebej učinkovita. Torej poskusimo nekaj drugega. Če bi vidva ponastavitev Sami teh osmih vrednosti. Dobro delo. Oglejmo pogled digitalno, za samo Trenutek, preden smo poskusili nekaj drugega, kaj se je pravkar zgodilo. Tu gor, boste kmalu videli vizualizacija teh osmih ljudi pri čemer modra in rdeča stolpci predstavljajo številke. Višji bar, večje število. Krajši bar, manjše število. In kaj boste videli, je v random da več kot osem od njih. Boste videli te palice pridobivanje razporejene po isti algoritem, ali niz navodil, ki bomo poklical odslej bubble sort. Tako obvestilo, vsak drugi ali tako, dva bara se zasveti v rdeči barvi, se primerjajo z računalnikom. In nato, če velik bar in mali bar v okvari, se jih zamenjali za mene. Zdaj je to zelo dolgočasno gledati to, seveda, zelo dolgo, ampak obvestilo takeaway-- velike palice, ki se gibljejo v desno, malo palice, ki se gibljejo v levo. Dajmo prekiniti ta proces in pospeši to gor da je veliko hitrejši, tako da bomo lahko dobili občutek na visoki ravni o tem, kaj, res, bubble sort počne. Pravzaprav, to je prepihavanje do na desni strani seznama, ali matrika, večji bari. In obratno, mali palice so prepihavanje svojo pot navzdol v levo, čeprav hitreje kot smo že storili. Torej, težje videti z ljudmi, ampak vizualno, da je res kaj se je dogajalo. Ampak poskusimo bistveno drugačen pristop zdaj. Poskusimo drugačen algoritem, s katerim vas bomo imeli fantje začeli v teh prvotnih pozicije, ki je bila ta nalog tukaj. In pojdimo naprej zdaj. In bom naredil nekaj še lažje, kajne? Če pogledam nazaj, znova zamenjala parne in spet, skoraj malo pameten. Naredimo stvari še bolj naivno, kjer je, če želim rešiti ti ljudje, Naj kar naprej išče za najmanjši element. Torej sedaj, 4 je Najmanj sem videl. Bom zapomnil. Ne, 2 je bolje, in ne pozabite, da. 1 je še manjša. 3, 7, 5. OK. One-- kaj je že ime? Artie: Artie. DAVID Malan: Artie. Torej, Artie, pojdi. Jaz te bom izvleči iz linije. Če bi lahko prišel nazaj. In moram narediti prostor za njega. Imamo sklep pod točko tukaj. Kako lahko naredimo prostor Artie tukaj na začetku, kjer številka 1 pripada? OBČINSTVO: Shift. DAVID Malan: OK, smo lahko premakne vse. Vendar predlaga optimizacijo. Da se počuti malo siten za mene vprašati štiri ljudi premakniti vso pot navzdol. Kaj drugega bi lahko naredil? OBČINSTVO: jih Switch. DAVID Malan: jih Switch. In kaj je že ime? JACOB: Jacob. DAVID Malan: Jacob, premakniti. Veliko bolj učinkovit samo, da so Zamenjave lokacije Jacob z Artie, v nasprotju z silijo Vse štiri od teh ljudi, najlepša hvala, da njihov pravilen položaj. Kaj je zdaj lepo o Artie, on je v svojem pravilnem položaju. Naredimo to še enkrat. 2, da je najmanjše število sem jih videl. 3, 7, 5. OK. 2 je definitivno najmanjši. Ne bi bilo treba storiti ničesar. Pa dajmo še enkrat. 6. Najmanjša? 8. Nope. 4? Ooh. Naj se spomnim 4. 3. Naj se spomnim 3. 7, 5. Najmanjše število Imam gledati na to priložnost je 3. Če želite, da pridejo ven. Kam gremo, da vas čaka? In kako ti je ime? Alanna: Alanna. DAVID Malan: Alanna, smo bo moral, da vam izselijo. Ampak to je bolj učinkovito, samo zamenjali dve osebi, kot da imajo več ljudi dejansko Bočni konec. Zdaj pa to še enkrat. Grem, da izberete 4, tako da pridejo ven. In kdo bo premaknil? Številka 8, seveda. Če bi zdaj našli številko 5, pridi ven. Številka 8 se dogaja, da se spet izselili. Jaz zdaj grem, da bi našli številko 6 v mestu. 7 prosto. 8 v mestu. Kaj sva naredila zdaj nekaj, kar se imenuje izbor sort, in če bomo vizualizirati to, da je dogaja, da se počutijo malo drugačna. Pojdimo naprej in iz tega Meni tukaj, to visualization-- kaj je to spremenili da-- daj no, Firefox. Spremenimo to izbora vrste. In kaj je to pospešiti, kot prej, in začeti vizualizacijo zdaj. In to algoritem drugačen občutek za njo. Na vsaki ponovitvi, odkrito povedano, to je še bolj enostavna. Jaz sem samo izbiro najmanjši element. Zdaj pa, odkrito povedano, sem malo srečen, da časa, s tem, da razporejene zelo hiter. Elementi, ki so bili naključno. To ni, kot se bomo sčasoma glej, bistveno hitreje. Ampak poglejmo, tretja in zadnja pristop tu, kaj se dogaja. Torej, gremo naprej in vam ponastavi fantje eno končno čas, da se v tem, da tukaj. In zdaj, bom za biti malo bolj pameten, samo zaokrožujejo algoritmov. Jaz bom to naredil. Bom ne gredo in nazaj toliko. Odkrito povedano, sem utrujen vse to prečenje. Jaz bom samo, da bi tisto, kar sem glede na začetku seznama, in bom, da razvrstite da takrat in tam. Torej, tukaj smo. Številka 4. Bom vstavite številko 4 v razvrščeni seznamu. Končano. Trdim, zdaj, in samo, da je to bolj Jasno, ta del mojega seznama razporejene. To je nekako neumno zahtevka, ampak res 4 je razvrščen v seznam velikosti enega. Zdaj pa grem, da na številko 2. Številka 2 sem zdaj dogaja, da vstavite v pravem mestu. Torej, če ne 2 pripada? Očitno je, da sem. Torej, pojdi naprej in korak nazaj, če bi lahko. In zakaj ne bi vi vzemite vaša glasba stoji z vami tokrat. In naj na silo vstavite v začetku seznama. Torej, malo več dela. Moral sem premakniti Jacoba okoli, in kako ti je ime? AMIN: Amin. DAVID Malan: Amin. Ampak vsaj nisem šel naprej in nazaj. Jaz sem samo pokazal stvari, kot sem šel. Jaz sem jih samo vstavite na pravem mestu. 6, to je dejansko zelo enostavno. Naj te vstavite tam, če Hotel sem, da se premaknete skozi rahlo. Številka 8, prav tako zelo enostavno. Točno tam. Prekleto. Številka 1 ne moremo preprosto zamenjali z Amin tukaj, ker to se dogaja za nered naročila. Torej moramo biti malo bolj pameten. Torej, Artie, če bi lahko back up za trenutek. Pojdimo naprej in premik zdaj, za razliko od naših prejšnjih algoritmov, da bi naredili prostor za Artie prav tu na začetku. Torej, na koncu dneva, sem nekako to, kar sem si želel, da bi se izognili prej. In tako je moj algoritem je neke of obrnil, intelektualno, od tistega, kar je bilo prvotno. Jaz samo opravljam prestavljanje na drugo točko. Zdaj sem na 3. Oh, prekleto. Moramo storiti še enkrat več dela. Torej, kaj je porinil ven. Pojdimo 8, 6, 4-- oh Oh-- in 3 bo šel tam. Torej vsaj rahlih prihrankov tokrat. 7, ni preveč dela, ki jih je treba storiti. Torej, če želite, da pop nazaj, pa vas vstaviti. In nenazadnje, 5, če vas želite pop nazaj, Potrebujemo vas premakne, vas, ti, dokler petih je na mestu. Torej, zdaj, da se to pri Visoka raven grafično, Naredimo ta algoritem vizualizacija en dodaten čas. Torej se to, kar imenujemo vstavljanja vrste. Mi bomo teči enako hitro, in ga začnete tukaj. In to, preveč, ima drugačen občutek. To je nekako boljši in bolje, vendar ni nikoli popolna dokler ne grem in gladka v teh vrzeli. Ker, še enkrat, jaz sem samo pokazal, kaj Jaz pa sem dal od leve proti desni. Torej nisem dobil tako srečen da je bilo vse popolno. Zato smo imeli ti malo mispositions da smo osnovna sčasoma. Torej vseh teh algoritmov zdi teči na nekoliko različno hitro. V resnici, ki bi rekli, da je Najbolj ali najhitrejši do sedaj? Bubble sort, prvi? Izbor sort, druga? Insertion sort, tretji? Slišal sem nekaj izbor sort. Druge misli? Tako se izkaže, da vsi od teh algoritmov so v osnovi enako učinkovit kot vsak other-- ali, nasprotno, prav tako kot neučinkovita kot medsebojno saj lahko naredimo bistveno boljši od vseh treh teh algoritmov. In to je malo belo laž, preveč. ko sem rekel, kot učinkovita ali kot neučinkovita, da je vsaj za super-velike vrednosti n. Ko imamo le osem ljudi tukaj, ali morda 50 ali tako bari na zaslonu, boste popolnoma opazili razlike med temi tremi algoritmov. Vendar, kot je n število ljudi, ali več številk, ali število oseb v telefonu knjigo, ali je število spletnih strani v Googlovi zbirki podatkov dobi večji in večji, bomo videli, da so vsi trije od teh algoritmi so pravzaprav zelo slaba. In lahko naredimo bistveno boljši od tega. Oglejmo pogled, končno, kaj bi lahko ti algoritmi zveni kot v kontekst nekaj drugih kot tudi s pomočjo tega vizualizacija tukaj ki nam bo predstavil število algoritmov. Pojdimo naprej in čestitam naši udeleženci tukaj, od katerih sami razporejene zelo dobro. Če želite vzeti poslovilno darilo. Lahko obdržite vaše številke, kot dobro. In kaj boste videli, ali bolje slišati, zdaj, je, da je, kot smo dal zvoke za vsakega od teh palic in ga poveže s programsko opremo, drugačno frekvenco zvoka, lahko ogradite vaš um več audioly okoli, kaj vsaka od teh stvari izgledal. Prvi od katerih je vstavljanja sortiranje [TONES] To je bubble sort. [TONES] Izbira sort. [TONES] Nekaj, kar ti merge sort. [TONES] Gnome sort. [TONES] To je to za CS50. Vas bomo videli v sredo. NARRATOR: In zdaj, "Deep Misli, "po Daven Farnham. Zakaj je za zanko? Zakaj ne bi bilo bolje? Sem narediti pet zanko. [Smeh]