DAVID Malan: U redu. Dakle, ovo je CS50, a to je Sada početak tjedna tri. Dakle, do sada, mi smo pisanje programa u C da izgleda malo nešto kao ovo ovdje. Dakle, imamo par Oštar uključuje na vrhu. Imamo int, glavni, praznina, i onda se nešto učiniti u sredini, Neki malo koda unutar te funkcije. No, ključna je bila činjenica da mi smo bili rekavši nevažeće ovdje. Dakle nevažeće, sve ovo vrijeme, navodi se da je ovaj program, kada pokrenete, može se pokrenuti samo putem svoje ime. Ne možete upisati bilo koje druge riječi ili Brojevi Nakon programa u ime kada to trčanje. Tako, na primjer, ako program su sastaviti u datoteci pod nazivom Pozdrav, možete učiniti ./hello, ali to je to. Jedini način da bi mogao dali svoj doprinos ovom programu je pozivom funkcije. Na primjer, ono što je funkcija smo koristili do sada kako bi dobili informacije od korisnika? PUBLIKA: Dobiti niz. DAVID Malan: Da biste dobili niz, ili dobili int, ili ste vidjeli druge, čak i ako ih niste koristili još, kao što se dugo, dugo i slično. Ali pretpostavimo da smo zapravo želim početi pisanje programa koji su malo više svestran, a, iskreno, malo više poput naredbi koje ste dobivam, nadamo se, malo navikli. Kao cd prostora Dropbox. To, naravno, mijenja Vaš imenik, uz pretpostavku ti si u Johna Harvarda kuće katalog, na svoj Dropbox mapu. U međuvremenu, naredba ovako stvara novi katalog pod nazivom pset2, Kao što ste možda već i Uskoro za problem će postavljena dva. Napravite Pozdrav, naravno, je naredba koja gradi program pod nazivom Pozdrav iz datoteke pod nazivom Pozdrav točka c. I u svakoj od tih slučajevi, sada, imali smo pružiti argument o tzv naredbenog retka, treperi brz, tako da je make zna što graditi, i tako da mkdir zna što mape za stvaranje, i tako da se cd zna gdje želite ići. No, do sada, mi stalno govoriš da je glavni, zadani funkcija, ima void izraz unutar tih zagrada, što znači da je to ne mogu poduzimati nikakve argumente. Dakle, počevši od danas, ono što ćemo učiniti je, idemo za početak podržavanje stvari kao što je ovaj još. U stvari, u ovom slučaju, koji vas obično ne ručno upisati, Provjerite je to za nas, ne postoje jedan, ali jedan, dva, tri dodatna žice nakon Program je nazvan jeka. Pa kako ćemo postići? Pa, počevši od danas, U slučajevima u kojima želimo kako bi dali svoj doprinos putem Takozvani naredbenog retka, ćemo početi dodavanjem Evo što je u yellow-- zamjene prazninu s int argc zarezom Niz argv otvorena zagrada blizu nosač. Sada je to interesantno za nekoliko razloga. Jedan od njih, to će neka nam pisati programi koji su malo više dinamike. No, više uvjerljivo, to će otvoriti Sada razgovor kao da se ono nizovi stvarno može može koristiti, za ono nizu Stvarno je ispod haube, do sljedećeg tjedna, kada ćemo početi ronjenje u još dublje kako stroj čineći sve ove stvari poslu. Ali za sada, idemo crtati, možda, slike. Kada napisati program s glavna proglasio na taj način, tako da se glavna traje dva argumenta, int i-- što tip podataka je drugi argument? PUBLIKA: Array. DAVID Malan: Array. Tako to izgleda na prvi pogled kao da je niz, ali primijetiti uglate zagrade. Sjetite se kad smo zadnji put uvedena Pojam niza. I nizovi koristiti uglate zagrade u nekoliko konteksta. Možda ćete koristiti kvadrat nosači ići u niz i dobiti određeni element, kao što je Nosač 0 ili nosač 1 ili 2 nosač. No, vidjeli smo, ako je kratko, prošli tjedan da također koristiti ove uglate zagrade na proglasiti veličine od niza, Ako unaprijed znate koliko ori- ili koliko žice ili što god zapravo žele. Tako ispada postoji treći kontekst ovdje da nema broj unutar od uglate zagrade. Kad ste naveli, kao što sam ja ovdje, ime nešto poput argv, koji je samo fancy način govoreći argument vektor, koji je još jedan fancy način rekavši niz argumenata, otvorena zagrada blizu nosač samo znači da ne mora nužno unaprijed znati koliko je velika Niz će biti, ali znate da će biti niz. Dakle, ako vi ne znate broj ne stavi tamo, za otvoreni nosača uskoj zagrada znači da argv nije niz, ali niz žice. Dakle, sintaktički, ako vas Sjetite se prošlog tjedna, to je vrlo slično rekavši nešto poput int dobi otvorena zagrada, i onda se nešto kasnije. Pa što to izgledati? Idemo zapravo nacrtati. Dakle, kada ste pokrenuti ovaj program s glavnim nakon što je dva argumenta definirani unutar od tih zagrada, što uglavnom imaju najmanje dvije komade memorije predao za vas ispod haube. Jedan od njih, kao što ću privlači kao ovaj pravokutnik, će se zvati argc. I baš kao brzi recap, što je tip podataka argc? Tako da je int. Dakle, broj se događa ići u argc-- okreta da se zalaže za argument računati. U međuvremenu, ja sam nacrtana argv kao polje. A ja stvarno ne znam koliko dugo će to biti, Tako je za današnje potrebe dot dot dot. To bi moglo dobiti neke dužine. Ali ja sam ovdje na slici najmanje četiri pravokutnika. Dakle argv komad memorije koja pohranjuje string string string dot dot dot, i argc je samo jedan komad memorije za cijeli broj. Tako sada, budimo malo precizniji. Ako, kad imam konce U tom nizu, pod nazivom argv, želim da se na njih individualno, baš kao i prošlog tjedna, ćemo koristiti zapis kao argv nosač 0 da se prva stvar niz. Argv nosač 1 dobiti Druga stvar, i tako dalje. Ključ je ovdje da smo još uvijek 0 indexed-- mi smo još uvijek računajući od 0. Tako sada neka je zapravo stavio nešto u tome. Da mi je sastaviti program pod nazivom Pozdrav iz datoteke pod nazivom Pozdrav točka c, i onda sam pokrenuti taj program s točkom slash Pozdrav, ono moje računalo, prijenosno računalo, izgledaju ispod haube Trenutak sam pokrenuti točkica slash bok i udario Unesite? Pa, to je možda što bismo mogli opisati kao sadržaj vašeg računala memorije, ili RAM-- Random Access Memory. Drugim riječima, računalo, nekako za vas magično, stavlja broj 1 u argc, AKA argcount, i to stavlja doslovno string ./hello u argv zagrada 0. Nemam pojma, iskreno rečeno, ono što je argv u držaču 1 ili 2 ili 3, jer ako korisnik nije upisali ništa osim ./hello, ćemo pretpostaviti da se radi o su najvjerojatnije vrijednosti za smeće, da se tako izrazim. Ti komadi memorije postoje, ali to ne ovisi o nama gledati na njih, jer je argcount samo jedan. Sada je, u međuvremenu, ako sam pisati pokrenuti drugi program, CD-a, što je više ispravno naredbe, u svom trepćući prompt-- cd prostora Dropbox-- kad sam pokrenuti da, učinkovito, kad cd program pokrenuti, argc, unutar memorije mog računala, je za najviše najkraća drugi broj 2. A onda argv nosač O je cd, argv nosač 1 ima Dropbox, i onda naravno naredba završi, tako da sve ove memorije u biti odlazi i koristi se za nešto drugo. I to je razlog zašto sam rekao Samo djelić sekunde. U međuvremenu, ako to učinimo mkdir pset2, slika izgleda gotovo isto, ali s različitim žice unutar argv. Ako ja Zveket crtica Pozdrav Pozdrav točka c, ista ideja. Više stvari se popunjava za argv, a argc, naravno, je 4. Dakle, drugim riječima, iako je ovaj niz možda se dot dot dot, nekih promjenjive duljine, da se tako izrazim, ćete uvijek znati gdje je kraj njega je, jer argc će vam reći U kojem trenutku morate prestati gledajući elemenata u argv. Možete gledati samo na četiri ukupno u ovom slučaju. Tako ćemo sada pogledati, možda, jednostavan program. Jedan da je samo rekao 'bok' da netko poput Zamyla. Dakle, tvrdim da ću napisati program U samo nekoliko trenutaka putem koji sam mogao učiniti ./hello prostor Zamyla, a onda želim moj program ispisati nešto super jednostavno poput "Zdravo, Zamyla." Sada smo u prošlosti sam se getstring. Dakle, u prošlosti, čak i ako ti si novi u programiranju, izgledi su mogli ščepati Program koji koristi getstring a zatim koristi printf pozdraviti Zamyla. No, nemojmo koristiti getstring ovaj put. Dopustite mi da umjesto toga ići u Appliant i ne uključuju standardnu ​​sam O dot h. Dopustite mi također uključuju CS50 dot h. Sada int glavni, a sad sam Ne ide to učiniti i danas nevažeće. Umjesto toga, ja ću učiniti int argc Niz argv otvorena zagrada blizu nosač, ne navodeći broj. I sada ovdje je moja tzv učiniti. Ono što ću učiniti sada je, ja sam će učiniti malo skok vjere, Ja ću pretpostaviti da je korisnik će koristiti ovaj program ispravno, i ja sam jednostavno ide učiniti printf Pozdrav,% sn. Dakle, ništa novo. Ali želim sada staviti što god riječ korisnik upiše poslije ime programa. Dakle, ako ja ./hello prostor Zamyla, ja želim nekako programski pristup Citat završen citat "Zamyla." pa sam Možete ići u moju tvrdnju vektor, moj niz žice, a ako zapovjedništvom, opet, bio ./hello prostor Zamyla, ono broj želim staviti u argv ovdje? PUBLIKE: 1. DAVID Malan: 1, jer je Nosač 0 Ispada će biti Naziv programa, kao što smo vidjeli. Dakle nosač 1 je prva riječ I da, korisnik, su upisali. Ja ću ići naprijed i spasiti ovo. Ja ću otići u moju mapu gdje sam stavio ovu sliku. Ja ću učiniti da Hello 3. COMP IO-a u redu. ./hello Zamyla Enter. Što sam učinio krivo? Bio sam uhvaćen od strane iznenađenje ja samo na trenutak tamo. Što sam učinio krivo? PUBLIKA: Ime. DAVID Malan: file-a zapravo zove hello3.c. I ja sam to učinio samo za dosljednost, jer smo imali hello.c-a u prošlosti u online kodu. Tako ćemo riješiti ovu ./hello Nosač crtica 3 Zamyla. Unesite. I sada imamo zdravo, Zamyla. U međuvremenu, ja mogu promijeniti u biti Rob, ili stvarno bilo koja druga riječ. Ali razmotrimo kutak slučaj. Ono što možda očekujete da će se dogoditi ako Ja ne upišete nečijeg imena uopće? PUBLIKA: Pogreška. DAVID Malan: pogreška neke vrste, možda. Da vidimo. Unesite. Null. Pa printf zapravo se Malo zaštitna nas ovdje, i doslovno ispis otvorenih zagrada null, ali čak i gorih stvari mogu dogoditi. I samo da pokažu nešto što je apsolutno ne bi trebalo raditi, idemo u ovdje i početi poking okolo. Zar ne? Ako znam da je slika u Memorija je u biti to, argv nosač 1 ima Zamyla, argv Nosač 0 ima ./hello ili ./hello-3. Ono što je u zagradi 2? Dakle, ja mogu odgovoriti na to ispitivati ​​sebe, zar ne? Ja samo mogu promijeniti 1 do 2. Ja sada mogu kompilirati pozdraviti 3, ./hello3 Idemo povećavanje i pritisnite Enter. Ups. Ne navodni znak. Zanimljivo. Dakle, to je vrsta cool vidjeti što je još ovdje. I što je tu unutar moj laptop? Idemo spasiti ga s nosača 3. Napravite hello3, ./hello-3. Znatiželjan. A sada idemo stvarno bold-- 50. Dakle, to je stvarno duboko ronjenje u memoriji mog računala. 50 indeksi u. Tako bi pozdrav 3 ./hello-3. Znatiželjan. U redu, sad sam samo događa da se ne osvrće. Idemo u 5000. U redu. Pa neka mi kompilirati. Napravite hello3, ./hello-3. U redu. Sada neki od vas, tu bi moglo biti žarulja ide off. Koliko imate vidi ovu poruku prije? U redu. Dakle, zašto? Tečajevi are-- a tu je drugačija stvari koje mogu izazvati ovaj, i jasno da ste u dobro company-- imamo jasno izazvao ono što se naziva greška segmentacije. I ne duljimo za danas, ja dotaknuo segment memorije da ne bi trebali imati. Gdje segmentu samo znači komad memorije koja ne bi trebala imati. Sada računalo garantira da ako ja pokrenuti ./helloZamyla da mogu dotaknuti argv biti nosač 0 i 1 argv nosač. Ali argc je vrijednost 2, to znači da sam ja samo allowed-- to je vrsta čast system-- na dodir Nosač 0 i 1 nosač. Ako sam ići dalje, postoji Apsolutno će biti memoriju postoji. Moj RAM postoji fizički u računalo. No, tko zna što je tamo? Zapravo, ja sam izvodi više Programi u jednom trenutku. Možda imam seen-- da nisam to na Appliant ali na mom Macu ili PC-- Možda imam vidjeli sadržaj e-pošte. Možda sam vidjela trenutak Poruka Nedavno sam poslao. Sve što bi moglo biti zadržavali oko memorije moglo pristupiti putem to proizvoljna trg nosač zapis. Ili, još gore, možda ćete morati pronašao jedan od mojih lozinke da sam nedavno bih upisali u, da Program su pohranjene u memoriji kako da me autentičnost, i onda samo vrsta je ostavio u RAM-u dok nisam prestao taj program. I doista, ovo je jedan od opasnost i jedan ovlasti korištenja jezika poput C Imate nesmetan pristup na cjelokupni sadržaj programa u memoriju, a što loše dečki mogu čak učiniti u tim cases-- pogotovo kad smo doći do web programiranja prema kraju semestra, mi ćemo ponovno ovu topic-- je guranje oko, potencijalno, netko je na računalu, memorije i naći takve neobične stvari kao što smo vidjeli tamo. Ili još gore, ali, lozinke koje je on ili ona tada može koristiti za napraviti loše stvari. Dakle, jasno sam to trebao učiniti to, zbog čudne stvari se počinju dogoditi. Doista, ovo je program pad sustava. To bi bila ekvivalent Mac OS ili Windows Prozor programa jednostavno nestaju. Došlo je do neočekivane pogreške. U naredbenog retka okruženju vidimo nešto poput ovoga. Ali, to je razlog zašto, jednostavno sam se sam dira memorija koja ne pripada meni. Tako ćemo braniti protiv ovo malo na drugačiji način gledajući ovaj program ovdje. Dakle, opet, kostur kako smo vidjeli earlier-- a ja sam istaknuo ovaj put int. I sve to vrijeme glavna ima doista vratio vrijednost. Iako se u većini naših predavanja primjeri nikada nismo nekada vratiti ništa u glavni. Mi samo napisati printf izbliza kovrčava braće i to je to. Ali za besplatno, što prevodilac radili za vas, učinkovito, vraća 0 za vas. Uključuje greda-- i to je malo counterintuitive-- da 0 je dobro. To ne znači lažno po sebi. 0 je dobra, i bilo koji ne-0 vrijednost, svijet je odlučio, može značiti pogrešku. Dakle, ako ste ikada zabrljati nešto gore na vašem računalu, ili programa je upravo umro na vas i ste stečen neke pogrešne prozor na zaslonu, govoreći o pogrešci negativna 49 ili pogreška 23-- Neki naizgled proizvoljna value-- to je jer programer je hard-kodirane vrijednost kao negativna 49 ili pozitivan 23 zastupati bilo koji broj, usudio bih se reći, od 4 milijarde mogućih stvari koje bi mogle poći po zlu u programu. Pa kako bih mogao uzeti Prednost to osobno? Pa, neka mi se otvori program da sam napisao unaprijed, i guranje oko online zove Hello 4. I to je gotovo identična, osim što Njegova je dobio malo provjeru pogrešaka. U ovom slučaju, ja sam opet proglašena Glavna kao uzimanje dva argumenta, ali ovaj put, na liniji 17, obavijest Radim malo ček razum. Ja sam pazeći da argc iznosi iznosi 2. Jer ako je, da znači ja mogu sigurno kontaktu ne samo nosač 0, no nosač 1. I sam ići naprijed i ispisati, U tom slučaju, Zamyla ili Rob ili što god riječ sam upisali van. A sada samo da bi dobili malo više ispravan, Idem izričito vratiti 0 da označi sve je dobro. Ništa loše dogodilo. No, prema konvenciji, idem vratiti 1, ili iskreno bilo ne-0 vrijednost, ako je nešto pošlo po zlu. Sada korisnik ne ide stvarno primijetiti što se događa. Doista, ako idem u ovaj imenik, smo uvećali i ne bi Hello 4, ./hello-4 Zamyla ponaša kao ja očekujem. Ali, ako sam umjesto toga ne upišete ništa, ništa ne čini da se dogodi, ali ona ne pada. A ako sam umjesto toga nešto učiniti kao što je Rob je Proctor u Thayer-- dijeljenja proizvoljne informacije. No, obavijest, argv 1, 2, 3, 4, i 5. Sada bi trebala postojati u sjećanju. To, također, nije ono što moj program očekuje, jer sam provjeriti je li argc iznosi iznosi 2 ili ne. Tako sam sada sam brani protiv toga. Sada, kao što je na stranu, mi programmer-- odnosno smo users-- nikada ne vide da 0 ili 1, ali koristeći alat koji se zove debugger, ili druge alate, kao što ćemo vidjeti prije dugo, programer zapravo može vidjeti što bi moglo biti ide po zlu unutar svog programa. Dakle, bilo kakva pitanja o argc? Da. PUBLIKA: Vidio sam gdje su nisu imali karakter, [nečujan] Samo je rekao niz zvijezda D, poput karakter zvjezdica zarez. Jesu li oni ekvivalent ovdje? DAVID Malan: Oni su. Dakle, pitanje je, imate povremeno vidio programi kao što je ovaj koji to ne kažu niz argv nosač ali umjesto da kažu nešto kao char zvijezda argv nosač. A tu je čak i druge varijante koje ste mogli vidjeti. Oni su doista ekvivalent. Za sada, imamo te svojevrsni trening kotačima na u obliku niza u CS50 knjižnica, ali u nešto više od tjedan dana ili tako ćemo ukloniti da opstrukcija uopce i zapravo pogled na ono što pougljenjenih i zvijezde su, i kako se one odnose na memoriju zastupljenost općenito. Dakle, mi ćemo se vratiti na to. Ostala pitanja o našoj argv ili argc? Da. PUBLIKA: Zašto se vratiti Pogreška [nečujan]? DAVID Malan: Zašto je to učinio vratiti na pogrešku only-- oh! U prethodnom slučaju, kada smo su futzing okolo s memorijom, zašto se samo vratiti na pogrešku kad sam stvarno upisali veliki broj? Kratak odgovor je, samo mi se posrećilo. Općenito govoreći, računalo alocira memoriju u komade, i to mi je dovoljno velika da se komad Imam daleko, bez primijetio, dirljivih konzolom 2, 3 konzoli, Nosač 50, ali čim sam gurnula moja sreća, otišao sam iza Granice komad memorije me operacijski sustav dao. A to je kad ga okomila se i rekao, nema. Segmentacije pogreške. Da. PUBLIKA: Kako se računalo znaju vrijednost argc? DAVID Malan: Kako Računalo znaju vrijednost argc? Kada pokrenete program, taj program, po prirodi trepćući redak, je predao niz Riječi koje su upisali na brz, da je bio upisali na redak. I tako je to vaš operativni sustav koji u suštini popunjava glavnih argumenata za vas. Dakle, to je jedna od usluga koje ste dobili, neka vrsta tajnog ispod haube operativni sustav. Ostala pitanja? Da. PUBLIKA: Što jezgra deponij znači? DAVID Malan: Što jezgra deponij znači? Dakle, to je dobro pitanje. I neka mi se vratiti u Ova mapa ovdje. A vi ćete primijetiti da Imam novu sliku tamo. To doista zove jezgre, a to je zapravo obično pristojne veličine datoteka. To je u biti snimak Sadržaj mog programu memorije ili RAM-a kad je pala. A to će biti korisno, potencijalno, dijagnostički, kada govorimo u budućem predavanju i poglavlje o ispravljanje pogrešaka, zato što zapravo može učiniti ekvivalent digitalni obdukcije na toj datoteci pomoći shvatiti što si učinio krivo u svom programu. Da. PUBLIKA: Je argc naredbe u sama, ili može li to ime ništa? DAVID Malan: Dobro pitanje. Je argc naredbe u sebi, ili može li to ime ništa? To definitivno nije naredba. To je jednostavno varijable Ime ili naziv argument je, i tako apsolutno smo mogli nazvati ovaj Foo, bismo mogli nazvati ovaj bar, koji imaju tendenciju biti go-to riječima da računalnih Znanstvenik ide. No, prema konvenciji, koristimo argc i argv. No, to je samo ljudsko konvencija, ništa više. U redu. Tako ispada, bio sam govorim malo bijelog lie-- i iskreno, u budućnosti, vidjet ćete smo reći druge bijele laži. Ali za sada, idemo oguliti natrag jedan od njih. U ovom slučaju, kada sam ovdje ranije vodio program kao ./hello ili ./hello-3 Zamyla, imali smo sadržaj mog memorije računala izgleda otprilike kao ovo. Ali sjećam se što struna. Što smo rekli prije tjedan dana što Niz zapravo je ispod haube? PUBLIKA: lepezu broj znakova. DAVID Malan: To je Niz broj znakova, zar ne? Tako smo mogli imati niz žice, ali, s druge strane, niz je niz znakova. Dakle, ako ja stvarno želim biti analni kad sam izvući ovu sliku, Stvarno bi trebao biti crtež to malo više kao što je ovaj, pri čemu se u svakom od tih indeksi moje argv polja, Tu je sama cijeli niz koja sama po sebi je u niz. A sada bijela laž mi smo danas govori je da se slika ne izgledaju ovako. U stvari, mali trgovi obično izvan velikih pravokutnika postoji. No, mi ćemo se vratiti na to prije dugo. No, to je ./hello backslash 0, da je posebni znak da markira kraj niza, a mi imamo još jedan za Zamyla ime. Dakle, što to znači? Pa, neka mi ići naprijed i otvoriti još dva primjera koji su dostupni na internetu. Jedan se zove argv1.c a drugi argv2. To je super jednostavan program koji razlikuje se od dosadašnjih programa u koje sada sam pomoću argc i argv ovdje. I sada sam integrirajući s for petlje u skladu je 18, od i = 0 o do argc. A što ću učiniti s ove linije koda ovdje? U engleskom jeziku. To očito pokazuje korištenje argc. No, na engleskom jeziku, što se što učiniti ako sam pokrenuti ovaj program? Da? PUBLIKA: To će ispisati svoje zaslon koliko god puta želite. DAVID Malan: Točno. Dakle, bez obzira riječi koje sam upisati u redak, to je će povratiti ih u mene jedan po retku. Tako ćemo ići naprijed i učiniti. Pustite me u moj imenik i to bi argv1 ./argv1. I sada, neka bude jednostavno. Idemo raditi ništa na prvi. To je ispisati jednu stvar, a to je doista ime programa, jer to je u zagradi 0. Ako ja sada kažem Foo, to će učiniti njih dvojica, a ako kažem Foo bar, to će reći one tri stvari. Sada kada je nešto zanimljivo, možda. No, podsjetiti da argv je niz od žice, ali niz je niz broj znakova, tako da možemo uzeti stvari usjek i primijeniti da osnovni Logika i napraviti kod koji izgleda malo više zagonetan, doduše. No, tako da ugniježđeni petlja, nešto slično onome što možete sjetiti iz Mario, Na primjer, ako ste to učinili na taj način. Tako sada primijetiti na liniji 19, ja sam opet iterating nad mojim argumentima, od 0 o do argc. I sada u skladu 21-- sam posuđivanje trik iz prošle week-- Ja sam provjeru što je Duljina argv nosača i. Ja spremanje taj odgovor u n. A onda sam integrirajući iz j na do n, gdje j je inicijalno 0. Dakle, Konvencija za brojanje. Nakon što sam koristiti, ako imate ugniježđeni petlje, ne mogu koristiti opet, inače ćete izmlatiti, potencijalno, vrijednost izvan unutarnjeg kruga. Dakle, ja sam koristeći j po konvenciji. Možemo koristiti k. Ako imate više od k, vjerojatno imati previše gnijezdi, obično. Ali sada, primijetit moj printf Linija je malo drugačija. Neću ispis% s, ja sam ispis% C, koji, naravno, je rezervirano za char. A sada primijetiti ovu sintaksu. Novi. Nismo ga vidjeli. No, logično, to samo znači dobiti i-tog niza u argv i dobiti što j? PUBLIKA: znakova. DAVID Malan: lik u tom nizu. Tako pomoću uglate zagrade slijedi uglatim zagradama, ovo je prva ronjenja u žice argv-a, i drugi četvornih nosači s j je ronjenje u likovima da se određeni niz u argv. A onda, samo za dobru mjeru, Ja sam ispis novu liniju ovdje. Pa sad neka mi ići naprijed i otvoriti do malo veći prozor tako da možemo vidjeti u akciji. Pusti me u tu mapu. I sada to čine argv-2-- whoops-- bi argv-2, ./argv 2. Unesite. I to je malo teško čitati vertikalno, ali to je doista ime Program, nakon čega slijedi prazan redak. Sada neka mi ići naprijed i učiniti Foo. Isto tako teško čitati, ali to je Doista ispis jednog znaka po retku. A ako ja bar, to je sada ispisati redak po redak. Dakle takeaway ovdje nije toliko da, vau, pogledaj ovo uredan novi trik gdje možete dobiti na sadržaj pojedinih likova niz je, nego kako uzimamo to osnovni ideje poput indeksiranje u nizu, a zatim indeksiranje u Niz koji je u tom nizu, i samo primjenom iste ideje nešto sofisticiranije primjeri. Ali osnove doista ne promijenio, još od prošlog tjedna. Sada je to vrsta pravovremeno, U to, podsjetimo, u tjednu nula igrali smo s telefonskog imenika kao što je ovaj. I iako je to očito fizičke komada papira, možete vrsta sjetiti imenika kao polje. Dakako, ako ste bili na reimplement Ovaj komada tih komada papira u računalu, vjerojatno ti bi koristiti nešto kao niz za pohranu svih onih imena i brojeve sa svim način do Z. Dakle, ovo je lijepo, jer To nam omogućuje priliku, možda, da razmislite kako možete zapravo provesti nešto takvo. Kao što je s nizom vrata ovdje. Dakle, ako sam could-- trebamo jedan dobrovoljno doći gore. Da vidimo. Možda nepoznato lice, možda nepoznato lice. Kako o narančasto? Ovdje. Narančasta košulja, dođi gore. Idemo naprijed i sada potez ova vrata na stranu, premjestiti to zabit za trenutak. Koje je tvoje ime? Ajay: DAVID Malan: Ajay. David. Drago mi je. U redu. Dakle, imamo iza tih šest Vrata opremljen digitalnim screen-- ili, bolje rečeno, sedam vrata na screen-- hrpu brojeva. A ja sam ti ništa u advance-- dogovoreno? Ajay: Ništa unaprijed. DAVID Malan: Sve što želim da učiniš Trenutno je naći za mene, i za nas, Stvarno, broj 50, jedan korak u isto vrijeme. Ajay: Broj 50? DAVID Malan: Broj 50. A možete otkriti što je Iza svakog od ovih vrata jednostavno ga dira prstom. Dovraga. [Smijeh] [Pljesak] Vrlo dobro učinio. U redu. Imamo lijep dar Nagrada za vas ovdje. Vaš odabir filmova smo razgovarali prošlog tjedna. Ajay: O, čovječe. Oh, nikada nisam vidio Spaceballs. DAVID Malan: Spaceballs. U redu. Dakle, držite se na samo jedan trenutak. How-- učinimo to poučljiv moment-- Kako ste to pronalaženje broj 50? Ajay: Izabrao sam nasumce. DAVID Malan: Tako ste izabrali slučajno i posrećilo. Ajay: Da. DAVID Malan: U redu. Izvrsno. Pa sad, imao ti ne postao sretan, što drugo moglo dogoditi iza tih vrata? Dakle, ako sam ići naprijed i otkriti ove brojeve ovdje, oni zapravo su u slučajnim redoslijedom. A najbolje što može imati učinio, iskreno, jest, u konačnici, u najgorem slučaju, pravopisa ih sve. Dakle, imaš super sretni, koji nije ono što bismo nazvati algoritam. Da, čestitamo. Ali sada let's-- Humor me, ako može. Idemo na ovoj kartici ovdje. I tu su brojevi u jasno ono što izgleda kao da se slučajnim redoslijedom, i oni su bili. Ali sada, ako sam umjesto toga tvrde da se iza tih vrata su brojevi koji su poredani. Cilj sada je također nađi nam broj 50. Ali to učiniti algoritamski, a recite nam kako idete o tome. A ako ste ga pronašli, te držati film. Vi ne nalaze da je, ti ga vratiti. Ajay: Tako ću provjeriti krajeve Prvo, kako bi, ako bi se utvrdilo there's-- [Smijeh i pljesak] DAVID Malan: Izvoli. Idemo pogledati jedan Ajay od prethodnika, Sean, koji nije bio tako sretan. U redu, tako da vaš zadatak ovdje, Sean, je sljedeći. Ja sam skriven iza njih Vrata broj sedam, ali sklonjen u nekim od tih vrata kao i drugi ne-negativni brojevi. I vaš cilj je da misli o ovome gornji red brojeva kao samo niz. Mi smo samo slijed komada papira s brojevima iza njih. I vaš cilj je, samo pomoću vrh Niz ovdje, nađi mi broj sedam. I onda se ide na kritike Kako idete o tome radi. Pronađite nas na broj sedam, molim te. Ne 5, 19, 13. To nije trik pitanje. 1. U ovom trenutku vaš rezultat nije vrlo Dobro, pa možda i zadržati ide. 3. Hajde. Iskreno, ja ne mogu pomoći, ali pitam ono što čak razmišljaš o tome. SEAN: Ja mogu uzeti samo iz gornjem redu. DAVID Malan: Samo gornji red. Pa imaš tri lijevo. Dakle, nađi mi 7. [PUBLIKA Krikovi SUGGESTIONS] Dakle, obojica su bila nevjerojatna za vrlo različitih razloga. Dakle, ovo je mjesto gdje smo stao trenutak prije, i ključni uvid ovdje je ova vrata je imao brojeve iza njih koji su bili razvrstani, idealno takeaway za koji je da bi mogao učiniti bitno bolje u ovaj drugi example-- i, štoviše, da je Sean Prvi pokušaj sa slučajnim brojevima baš kao što before-- ali čim jer su ti brojevi poredani, poput telefonskog imenika, Što možete učiniti je očito? Ili kako možeš iskoristiti to znanje? Da. PUBLIKA: Idete na pola puta [nečujan]. DAVID Malan: Da. Točno. Dakle Ajay početni instinkt bio provjeriti krajeve, koliko se sjećam, i onda smo na neki način završio Primjer brzo. Ali, ako smo počeli raditi to više metodički uz one linije, ali s početkom možda u srednje, jer oni su razvrstani, čim se otkrilo broj 16, zato mi znaš-- i neka je učiniti upravo to-- mi Stoga znam da je 50, u današnjem slučaju, ima da se na desnoj strani. Dakle, baš kao iu tjednu kada je nula smo poderao telefonski imenik na pola i bacio pola Problem se, ista ideja ovdje. Možemo baciti ovo poluvrijeme problema daleko. I vjerojatno ti ono mogao učiniti algoritamski, kada znaš da je 50 moraju biti udesno, ako je to bilo, je pokušati tamo, u sredini preostalih vrata. Naravno, 50 veći od 42, pa možemo baciti ovo preostalo Četvrtina problema daleko, i, konačno, identificirati nešto poput 50. No, baš kao i kod telefonski imenik, ti ​​brojevi dobili su nas već u sortirani red, što nam ostavlja s pitanjem, kako vam se se stvari u sortirani bi? I, iskreno, po kojoj cijeni? To je jedna stvar biti predao telefonski imenik a zatim impresionirati svoje prijatelje po pronalaženju telefonski broj jako brzo, zar ne? Puknuće 32 stranice u potragu Osoba iz 4 milijarde stranica, , rekao nam je jedan ekstremni primjer. No, koliko vremena je trebalo Verizon riješiti taj telefonski imenik? Koliko vremena je prošlo nas sortirati tih sedam brojeva? To je pitanje koje smo do sada u potpunosti ignorira. Tako ćemo odgovoriti na to pitanje sada. I mi smo svi iz filmova sada, ali imamo neki stres loptice. Ako, recimo, osam volontera Ne bi mi smetalo da nam se pridružiš ovdje gore? Idemo naprijed i učiniti, kako o četiri od vas, vas troje ovdje? Nabavite neka nova lica. I četiri od vas tamo? I now-- a ne pristranosti neka ovdje-- i broj osam ovamo na kraju. Dođi gore. U redu. Dakle, ono što imamo ovdje svatko od vas je broj. Ako želite ići naprijed, uzeti ovaj broj. Koje je tvoje ime? Artie: Artie. DAVID Malan: Artie, ok. Ti si broj 1. AMIN: Amin. DAVID Malan: Amin. David. Ti si broj 2. I ići naprijed, kao što sam ruku ti listovi papira, postroje sami se ispred glazbe stoji u istom redoslijedu kao i gore. ANDY: Bok, Andy. DAVID Malan: Andy, to je lijepo vidjeti. Broj 3. JAKOV: Jakov. DAVID Malan: Jakov, broj 4. Dobro došli na brodu. GRANT: Grant. DAVID Malan: Grant. Broj 5. Alanna: Alanna. DAVID Malan: Alanna, broj 6. FRANCES: Frances. DAVID Malan: Frances, broj 7. I? Rachel: Rachel. DAVID Malan: Rachel, broj 8. U redu. Idi naprijed i sami u tom cilju. Dopustite mi da stavi jednu preostalih glazbeni stajati na mjestu. Gdje vam je potreban stav? U redu. Samo naprijed, samo stavi svoje brojeve gdje je publika ih možete vidjeti na, glazbeni stajati okrenut prema van. I nadamo se, naš prvi duševne ček ovdje-- 4, 2, 6. Oh-oh. Čekaj malo. Nemamo se 8. Moram te iseliti iz Primjer nekako. Ne Ne, to je u redu. Da vidimo. Možemo to učiniti. Stand by. Tamo idemo. Točan. U redu. Dakle, sada imamo 8, 1, 3 7, 5. U redu. Izvrsno. Dakle, pitanje je na dohvat ruke, na kojoj cijeni, a putem koji način, zapravo možemo razvrstati ove brojeve ovdje tako da možemo vrsta raditi unatrag, u konačnici, i decide-- je to stvarno impresivno, to je stvarno učinkovit, da mogu podijeliti i osvojiti telefonski imenik? Je li to stvarno učinkovit da Mogu podijeli pa vladaj one digitalne komada papira na brodu, ako možda i to će nas koštati sreća na vrijeme ili energije ili CPU ciklusa zapravo dobili naše podatke u neku sortiranog bi? Tako ćemo postaviti to pitanje. Dakle, kao prvo, ovi brojevi su U prilično mnogo slučajnim redoslijedom, i ja ću predložiti jedan algoritam, ili postupak po kojima možemo razvrstati tih ljudi. Idem prići to prilično naivno. A ja ću priznati da je to vrsta puno za mene omotati oko moje srce cijeli skup podataka odjednom. Ali, znate što? Ja ću napraviti neke vrlo jednostavne marginalne popravci. 4 i 2 su u kvaru, ako Cilj nam je da ide od 1 na do 8. Dakle, znate što? Ja ću te imati Dečki mijenjati, ako se prebacite fizički pozicije i Vaši komada papira. Sada 4 i 6, to su u redu. Ja ću ostaviti onima biti. 6 i 8, koji su u cilju. Će ostaviti ih biti. 8 and1, iz reda. Ako vas dvoje ne bi smetalo zamjene. Sada 8 i 3, ako ti dečki mogli zamijeniti. 8 i 7, ako ti dečki mogli zamijeniti. A 8 i 5, ako ti dečki mogli zamijeniti. Sada, ja to učinio? Ne, očito ne. Ali sam napravio Situacija bolje, zar ne? Što je tvoje ime, broj 8? Rachel: Rachel. DAVID Malan: Pa Rachel ima učinkovito upuhavan se prilično daleko, sve do kraja moj niz brojeva ovdje. I tako je taj problem je riješen vrsta. Sada, očito, 2 još uvijek treba pomaknuti malo, i 4 i 6 i 1. Ali čini mi se da su dobivši Malo bliže rješenju. Tako ćemo primijeniti taj isti opet naivno heurističke. 2 i 4, u redu. 4 i 6, u redu. 6 i 1, mm-mm. Idemo swapa. 6 i 3 mm mm. Idemo swapa. 6 i 7 je u redu. 7 i 5, Nope. Idemo swapa. I sada 7 i 8. A kako se ti zoveš? FRANCES: Frances. DAVID Malan: Frances. Dakle, sada je Frances je još bolji položaj, jer je sada 7 i 8 pravilno upuhavan do vrha. Dakle, 2 i 4, u redu. 4 i 1, neka je zamjena. 4 i 3, ajmo swapa. 4 i 6, ti si u redu. 6 i 5, ajmo swapa. I sad ti momci su dobri. Skoro smo stigli. 2 i 1, od reda, tako zamijeniti. I sad neka mi to ček zdravog razuma. 2 i 3, 3 i 4, 4 i 5, 5 i 6, 6 i 7, 8. U redu, tako da smo gotovi. No, po kojoj cijeni zar ne sortirati ove brojeve ovdje? Pa, koliko koraka jesam potencijalno se kada je sortiranje tih ljudi? Pa, mi ćemo se vratiti na to pitanje. Ali, iskreno, ako imaš Malo dosadno, to je vrsta otkriva da to nije bilo Možda najučinkovitiji algoritam. I doista, iskreno, znojim sve više hoda amo-tamo. To se ne osjeća posebno učinkovit. Tako ćemo pokušati nešto drugo. Ako ti dečki mogli vratiti sebi da tih osam vrijednosti. Dobar posao. Idemo pogledati digitalno, za samo Trenutak prije nego što smo probati nešto drugo, na ono što se upravo dogodilo. Ovdje gore, ti ćeš vidjeti Vizualizacija od tih osam ljudi pri čemu plava i crvena barovi predstavljaju brojeve. Viši bar, veći broj. Kraći bar, manji broj. A što ćete vidjeti u slučajnim redoslijedom više od osam od njih. Ti ćeš vidjeti ove barova uzimajući razvrstani prema tom istom algoritmu, ili skup uputa, koje nazvat ćemo odsad mjehurića vrst. Dakle, primijetite, svaki drugi ili tako, Dvije trake su pali crveno, se u odnosu od strane računala. A onda, ako veliki bar i Malo bar su izvan reda, su se zamijenili za mene. A ovo je nevjerojatno dosadan ovo gledati, sigurno, za vrlo dugo, ali primijetiti takeaway-- velike barovi kreće udesno, mali barovi kreće u lijevo. Ajmo prekinuti taj proces i ubrzati ovaj gore da će biti puno brže, tako da možemo dobiti osjećaj visokoj razini onoga što, Doista, Bubble sorta koja se radi. Doista, to je mjehurića do desnoj strani popisa, ili niz od većih barovi. A s druge strane, mali kafići su mjehurića svoj put prema dolje na lijevoj strani, iako bržim tempom nego što je prethodno učinio. Dakle, teže vidjeti s ljudima, ali vizualno to je doista ono što se događa. No, pokušajmo iz temelja drugačiji pristup sada. Pokušajmo drugačije algoritam kojim ćemo vas ima Dečki početi u njih izvorna pozicije, što je taj nalog ovdje. I idemo naprijed sada. A ja ću učiniti nešto još jednostavnije, zar ne? U retrospektivi, opet zamjene parovima i opet, skoro malo pametan. Idemo raditi stvari još naivno, gdje ako želim sortiranje tih ljudi, neka mi samo držati u potrazi za najmanji element. Dakle, upravo sada, 4 Najmanje sam vidio. Ja ću to zapamtiti. Ne, 2 je bolje, i sjetite se da. 1 još je manja. 3, 7, 5. U redu. One-- ono zoveš? Artie: Artie. DAVID Malan: Artie. Dakle, Artie, samo naprijed. Ja ću vas izvući iz linije. Ako bi mogao doći ovamo vratiti. I moram napraviti mjesta za njega. Imamo točku odluke ovdje. Kako bismo mogli napraviti mjesta za Artie ovdje na početku gdje je broj 1 pripada? PUBLIKA: Shift. DAVID Malan: U redu, možemo Mogla je mijenjati sve. Ali predložiti optimizaciju. To se osjeća malo neugodno za mene pitati četiri osobe premjestiti sve na putu prema dolje. Što još mogu učiniti? PUBLIKA: ih Switch. DAVID Malan: ih Switch. A kako se ti zoveš? JAKOV: Jakov. DAVID Malan: Jakov, premjestiti. Mnogo učinkovitiji samo da imaju Jakov Swap mjestima s Artie, za razliku prisiljavajući sve četiri od tih ljudi, puno ti hvala, da njihov točan položaj. Što je lijepo o Artie sada, On je u svom ispravnom položaju. Idemo to učiniti opet. 2, to je najmanji broj sam vidio. 3, 7, 5. U redu. 2 je definitivno najmanji. Ne morate ništa raditi. Idemo to učiniti opet. 6. Najmanji? 8. Nope. 4? Ooh. Dopustite mi da zapamtite 4. 3. Dopustite mi da zapamtite 3. 7, 5. Najmanji broj imam vidjeti na prijevoju je 3. Ako bih došao na van. Gdje ćemo vas? A kako se ti zoveš? Alanna: Alanna. DAVID Malan: Alanna, mi smo će vas morati iseliti. No, to je učinkovitiji, samo zamijeniti dvije osobe, nego imati više ljudi zapravo izbjeći više. Sada ćemo to učiniti opet. Idem za odabir 4, tako da izlazi. A tko će se preseliti? Broj 8, naravno. Ako ja sada naći broj 5, izlazi. Broj 8 će se ponovno istjerani. Ja sam sada će naći broj 6 u mjestu. 7 na mjestu. 8 na mjestu. Ono što smo upravo učinili Trenutno je nešto što se zove izbor sortiranje, a ako smo vizualizirati to, to je ide da se osjećaju malo drugačiji. Idemo naprijed i iz toga Izbornik ovdje, ovo visualization-- ajmo to promijeniti to-- hajde, Firefox. Idemo promijeniti u odabiru vrste. I neka je to ubrzati kao i prije, i početi vizualizaciju sada. I ovaj algoritam ima drugačiji dojam na njega. Na svakoj iteraciji, iskreno, to je još izravnija. Ja sam samo odabirom najmanji element. Sad, iskreno, imam malo sreće da vrijeme, u smislu da razvrstani super-brzo. Elementi su bili slučajni. To nije, kao što ćemo na kraju vidi, bitno brži. No, da vidimo treći i posljednji pristupiti ovdje o tome što se događa. Dakle, idemo naprijed i vratiti vam dečki posljednji put da se u tom bi ovdje. A sada, ja ću biti malo pametniji, Samo obići naše algoritme. Ja ću to učiniti. Idem ne ide natrag i naprijed toliko. Iskreno, ja sam umorna od sve to prijeći. Samo ću uzeti ono što sam obzirom na početku popisa i ja ću sortirati da je tada i tamo. Dakle, tu smo. Broj 4. Idem umetnuti broj 4 u popisu sortirane. Gotovo. Tvrdim sada, a samo da bi se to više Jasno, to je dio mog popisa je riješeno. To je neka vrsta glupe tvrdnje, ali istina 4 sortira u popisu veličine jednog. Sada, ja ću da se na broj 2. Broj 2 ja sada ide na umetnuti u pravom mjestu. Dakle, gdje se 2 pripadaju? Očito, ovdje. Dakle, ići naprijed i vratiti, ako može. A zašto ne dečki samo uzeti Vaša glazba stoji s vama ovaj put. I neka je prisilno umetnuti vas u početku popisa. Dakle, malo više posla. Morao sam se kretati oko Jakova, a kako se ti zoveš? AMIN: Amin. DAVID Malan: Amin. No, barem nisam išla naprijed i natrag. Ja sam samo uzimanje stvari kao što sam ići. Samo sam ih umetanjem na pravom mjestu. 6, to je zapravo prilično jednostavan. Idemo umetanja tamo, ako Samo je htjela da se presele preko nešto. Broj 8, također prilično jednostavan. Tamo. Dovraga. Broj 1 Ne možemo samo zamijeniti s Aminom ovdje, jer to se događa na nered reda. Dakle, moramo biti malo pametniji. Dakle, Artie, ako bi mogao back up za trenutak. Idemo naprijed i pomak sada, Za razliku od naših prethodnih algoritama, kako bi napravili mjesta za Artie ovdje na početku. Dakle, na kraju dana, ja sam vrsta radiš ono što sam htio izbjeći prije. I tako je moj algoritam je svojevrsni od obrnuta, intelektualno, od onoga što je izvorno bio. Samo radim na pomicanje na nekom drugom mjestu. Sada sam na 3. Oh, prokleto. Moramo učiniti više posla opet. Tako ćemo vas izgurati. Idemo 8, 6, 4-- oh Oh- i 3 će ići tamo. Tako barem neznatne uštede ovaj put. 7, ne previše posla koji treba obaviti. Dakle, ako želite da se pop natrag, neka vas ubacite. I na kraju, 5, ako vas želite pop natrag, mi Moramo se mijenjati, te, ti, dok se pet je na mjestu. Tako sada to vidjeti na Visoka razina grafički, učinimo ovaj algoritam Vizualizacija još jednom. Dakle, to ćemo zvati umetanja vrsta. Mi ćemo to raditi jednako brzo, i početi ga ovdje. I to, također, ima drugačiji osjećaj. To je na neki način sve bolje i bolje, ali to nikada nije savršen dok sam otići i glatka u te praznine. Jer, opet, ja sam samo uzimati ono Ja sam se dao s lijeva na desno. Dakle, nisam se tako sretan da je sve bilo savršeno. Zato smo imali to malo mispositions da smo fiksne tijekom vremena. Dakle, sve ove algoritama čini se da trčanje na nešto različitim koraka. U stvari, što bi ti rekao je najbolji ili najbrži do sada? Mjehurić sortirati, prvi? Izbor sortirati, drugi? Umetanje sortiranje, treći? Čujem neke odabira vrste. Ostali misli? Tako ispada da je sve od ovih algoritama su u osnovi jednako učinkovit kao svaka other-- ili, s druge strane, baš kao što neučinkovita kao i svaki drugi, jer možemo napraviti iz temelja bolje od sva tri tih algoritama. I to je malo bijele laži, previše. kad kažem kao učinkovit ili kao neučinkovit, to je barem za super velike vrijednosti n. Kad imamo samo osam ljudi ovdje, ili možda 50-ak barovi na zaslonu, vi apsolutno ćete primijetiti razliku Među tih triju algoritama. No, kao n, broj ljudi, ili broj brojeva, ili broj ljudi na telefon Knjiga ili broj web-stranica u bazi podataka Googleovih dobiva veći i veći, vidjet ćemo da su sve tri od tih algoritmi su zapravo prilično loša. I što možemo učiniti temeljno bolje od toga. Idemo pogledati, konačno, na što ovi algoritmi mogu zvuk kao u kontekst nekoliko drugih kao i preko toga Vizualizacija ovdje koji će nas uvesti u broj algoritama. Idemo naprijed i čestitam Naši polaznici ovdje, svi od kojih sami razvrstani vrlo dobro. Ako želite da se oproštajni dar. Možete zadržati svoje brojeve kao dobro. I što ćete vidjeti, ili bolje čuti, sada, je u tome što smo stavili zvukove se svaki od tih šipki i povezati ga sa softverom, različite frekvencije zvuka, možete zamotati svoj um više audioly oko onoga što je svaki od tih stvari izgledati. Prvi od kojih je umetanje svojevrsni [Tonove] To je neka vrsta balon. [Tonove] Sortiranje Izbor. [Tonove] Nešto što se zove spajanje vrst. [Tonove] Gnome vrst. [Tonove] To je to za CS50. Mi ćemo vas vidjeti u srijedu. Narator: A sada, "Deep Misli: "Po Daven Farnham. Zašto je za petlje? Zašto ne bi to bolje? Htio bih napraviti pet petlju. [Smijeh]