[Glazba svira] ROB Boden: U redu. Dakle, prva stvar prvi, video iz poznato lice. [VIDEO PLAYBACK] -U redu. Ovo je CS50, a to je Početak trećeg tjedna. Žao mi je što ne mogu biti s vama i danas, ali dopustite mi da vas upoznam CS50 vlastiti Rob Boden. [END video reprodukciju] [Pljesak i klicanje] ROB Boden: filmografija u taj video je fantastičan. U redu. Dakle, prvo, postoji još jedan ručak. To je sutra u 1:15. Nema Ručak ovog petka. To je s Quora. I Tommy nije ovdje, ali jedan od ljudi tamo je bivši šef CF, Tommy McWilliam. Dakle, on je zabavan tip. Trebao bi doći. U redu. Tako je prošlog tjedna, počeli smo raspada o tome što je zapravo niz. Znali smo od početka da to je niz znakova. No, prošli tjedan, zaronili smo u stvari da je ono što je stvarno slijed likovi, dobro, sada imamo nizovi znakova. A mi znamo da vrpca, to je niz znakova, na samom kraju, imamo posebnu null bajt, to kosih crta 0, koji pokazuje kraj string. I tako niz je niz likovi, ali možemo imati više od Samo niz likova, možemo imati niz bilo tip što želimo. Dakle, ako se prisjetimo od prošlog tjedna, Vijek program koji David uveo jako brzo. Dakle, prvo što ćemo učiniti je pitati korisnik za cijeli broj, broj ljudi u sobi. Nakon što smo taj cijeli broj, mi smo progla niz. Obavijest ovaj nosač sintaksu. Ti ćeš se naviknuti na to. Tako smo progla niz brojeva zove dobi, a tu su n cijeli brojevi u ovom polju. Tako je ovaj uzorak upravo ovdje, ovo 4 int i jednaka je 0, i manji je od nje, i plus plus, koje se također će biti uzorak da ste vrlo priviknuti. Jer to je uglavnom kako ste Uvijek ću ponoviti preko polja. Dakle, ne zaboravite da je n duljina naše polje. I evo, mi opetovano traže za uzrast od osoba koju sam u sobi. Nakon toga ćemo ići prema dolje, a za sve što proizvoljna razlog, onda bismo ispisati koliko su stari idete biti za godinu dana. I cijeli taj program, neka je bi dobi, dot Slash dobi. Dakle, broj ljudi u sobi, recimo da postoje tri. I kažu, prva osoba koja je 13, Sljedeći je 26, a posljednja je 30. Pa onda ću ponoviti je u tri ljudi, ispisati 14., 27. i 31.. Dakle, ne zaboravite da kada izjavljujemo Niz veličine n, indeksi u koje polje, polje ima vrijednosti i indeksi 0, 1, 2, sve do nje minus 1. Dakle, kada smo rekli bilo je troje ljudi u sobi, a mi smo stavili ovdje prva iteracija kroz to petlje, i što će biti 0. Tako je u indeksu 0. Mi se dodjeljuje prvi dobi korisnik unese. Tada se u sljedeću, ulazimo Drugi n korisnik unese, au uz dva, posljednji n. Dakle, primijetite da je niz veličini tri nema ništa u indeksu tri. To ne vrijedi. U redu. Dakle, ide natrag ovdje. Dakle, sada kada smo se bavila polja, imamo neke upoznatost. Sada ćemo prijeći na naredbu argumente, koji će biti prilično relevantni za ovaj problem skupa. Tako je do sada, kad god sam proglasila svoju glavnu funkciju, mi smo rekao int main void. Dakle void samo znači da mi ne prolaze bilo Argumenti za tu funkciju. Sada ćemo vidjeti da je glavna možete poduzeti neke argumente. Ovdje ćemo ih zvati int argc i gudački argv nosači. Nosači, opet, ukazuje da smo se bave polja. Pa evo, niz argv zagrade, mi smo koja se bavi nizom nizova. Dakle argc, koji će ukazati koliko argumenata imamo prošao na ovom programu. A kako bi vidjeli što to znači, neka se zatvori to. OK. Dakle, do sada smo se izvoditi svaki Program poput dot kosih dobi. Možemo također, na zapovjednoj liniji, pokraj pass argumente, dakle termin, naredba linija argumenata. Dakle, prvi argument, hello world. Pa evo, argc će biti tri. To je broj od argumenata na zapovjednoj liniji. Argc uvijek najmanje 1 od točke slash dobi, sama, broji kao jedan od Argumenti naredbenog retka. Zatim pozdraviti je na prvom mjestu. Ako dot slash dobi je nultoga, a zatim Zdravo je prvi, a svijet je Drugi argument naredbenog retka. Tako niz argv, idemo vidjeti, sadrži konce, dot crtu dobi, hello, i svijet. I, prema Davidovom zahtjev, idemo igrati video uvođenja toga. [VIDEO PLAYBACK] -Do sada u programima koje smo napisao, mi smo proglasiti Glavni kao int main void. A sve ovo vrijeme, da je nevažeće ima jednostavno je navodeći da Program ne odgovara argumente naredbenog retka. Drugim riječima, kada korisnik pokrene Program, on ili ona može dati naredbu argumente pisanjem dodatnog riječi ili fraze nakon što je Program ime na upit. Pa, ako želite da vaš program uzeti argumente naredbenog retka, jedan ili više takvih riječi, moramo zamijeniti poništiti s nekoliko argumenata. Tako ćemo učiniti. Uključi CS50.h. Uključuju standardnu ​​io.h. Int main. I sada, umjesto void, idem navesti int argc zove, i Niz žice pod nazivom argv. Sada, argc i argv su jednostavno konvencije. Mogli smo pozvani ovi argumenti najviše što god želimo. No, ono što je važno jest da je argc int jer je, po definiciji, ona je će sadržavati računati argument, broj riječi u ukupnom da Korisnik je upisali na njegovu ili njezinu redak. argv, u međuvremenu, argument vektor, je će zapravo biti niz spremanje sve riječi koje je korisnik upisali na njegovu ili njezinu redak. Idemo nastaviti raditi nešto danas s jednim ili više od tih argumente naredbenog retka. Konkretno, idemo naprijed i print god riječ korisnik upiše Nakon imena programa na upitu. Otvorena zagrada. Zatvori nosač. Printf posto s kosih crta i zarez. I sad moram reći printf što vrijednost priključiti u tom rezervirano mjesto. Želim prve riječi koje korisnik ima upisali po imenu programa, pa ću navesti argv bracket 1, u neposrednoj blizini zagrada, zarez. Sada, zašto nosač 1, a ne bracket 0? Pa, što se ispostavilo, automatski pohraniti u argv 0 će biti Stvarni ime programa. Dakle, prva riječ da korisnik upiše nakon što je ime programa je, prema konvencija, će biti pohranjene u argv 1. Idemo sada sastaviti i pokrenuti ovaj program. Provjerite argv 0, dot kose crte argv 0. A sada riječ poput 'bok. Upišite. I tamo smo ga, pozdravi. [END video reprodukciju] ROB Boden: U redu. Zatvorite to. Dakle, uzimanje pogledati taj program koji samo smo upoznati s nama, dobro, samo pokazati, ako želimo ispisati argv 0, da, sada što je to, argv 0, dot slash argv 0. Dakle, kao što se očekuje, to je ispis naziv programa, budući argv 0 je Uvijek će biti naziv programa. Ali neka je učiniti nešto malo više zanimljiv. Tako je u problemu setu, vi ćete biti upoznati s ovom funkcije, atoi. Dakle, ono što mi koristimo atoi za? To će se pretvoriti string u cijeli broj. Dakle, ako sam proći niz, jedan, dva, tri, da atoi, koji će se pretvoriti da na cijeli broj, jedan, dva, tri. Tako ćemo pretvoriti prva naredbenog retka argument u cijeli broj, i onda samo ispisati taj prirodni broj. Tako je u osnovi, mi smo vrsta reimplementing getint, samo cijeli je ušao na zapovijed linije, umjesto u programu interaktivno. Dakle, što argv 0, neka je učiniti je ovdje, i zatvoriti to. Dakle radi argv 0, i neka je ući cijeli broj, jedan, dva, tri i četiri jedan dva. Dakle, to će ispisati prirodni broj, jedan dva tri četiri jedan dva. Postoje neke nijanse na atoi da to će prestati brinuti o bilo čemu izvan valjanog numeričkog karaktera, , ali to nije važno. Dakle, što mislite dogodi ako sam to učiniti? Segmentacija kriv. Pa zašto je to tako? Ako se osvrnemo na naš program, mi smo pretvaranje argv 1, prvi argument nakon ime programa, na cijeli broj. No, ne postoji argument prošao nakon što je naziv programa. Pa evo, vidimo da je to buggy Program, jer, ako ćemo pokušati pokrenuti bez ikakvih argumenata, samo će se srušiti. Tako je još jedan zajednički uzorak vidjet ćete je nešto slično, ako argc je manje od dvije, što pokazuje da nije bilo barem naziv programa i Prvi argument, onda ćemo nešto učiniti kao i printf, nije dovoljno argumente naredbenog retka. To je vjerojatno nije dobar za ispis, to je vjerojatno nešto poput trebali unijeti cijeli broj na zapovjednoj liniji. Samo ću ga završiti tamo. A onda se vratiti jednoga. Dakle, ne zaboravite da je na kraju našeg Program, ako ćemo se vratiti 0, koja vrsta pokazuje uspjeh. A glavna je također automatski vraća 0 ako to ne učinite. Pa evo, mi smo retuning 1 za označavanje da to nije uspjeh. A možete se vratiti što god želite, Samo, 0 označava uspjeh, a sve drugo pokazuje neuspjeh. Tako ćemo pokrenuti ovu verziju stvari. Pa sad, ako mi ne unesete naredbenog retka argument, to će točno reći nas, nije dovoljno naredbenog retka. Nije dovršio rečenicu. Inače, ako mi zapravo to prođe jedan, to može završiti program. Dakle, ovo je način na koji će koristiti argc u Kako bi provjerili broj argumente naredbenog retka koji zapravo prošlo. Tako ćemo napraviti ovaj program malo više komplicirano, i pogled na sekundu iteracija stvari. Tako sada, mi smo ne samo ispis Prvi argument naredbenog retka. Evo, mi smo iterating od int i jednakima 0, i manji od argc, i plus plus, a tisak argv, indeks i. Tako je ovaj uzorak, opet, to je ista uzorak kao ranije, osim što je umjesto pozivanja varijablu n, mi koristimo argc. Dakle, ovo je iterating preko svake indeksa u nizu, a ispis svaka element u tom polju. I tako, kad smo pokrenuti ovaj program, dobro, Nisam unijeti bilo naredbenog retka argumenti, tako da samo ispisuje naziv programa. Ako uđem hrpu stvari, to ću ispisati jednu, svaki na svom liniji. OK. Tako ćemo uzeti ovaj korak dalje. I umjesto ispisa svaki argument na vlastitu liniju, neka je ispisati svaki karakter svakog argumenta na vlastitu liniju. Dakle, ne zaboravite da je argv Niz od žice. Dakle, ono što je string, ali niz znakova? Dakle, to znači da argv stvarno Niz od niza znakova. Dakle iskorištavanjem da, neka je ignorirati to za sada. Ajmo uzeti u obzir niz argv 0. Dakle, ako želimo dovesti svaki karakter argv 0 na svojoj liniji, onda želim učiniti uzorak smo navikli, i je manje od duljine polja, koja je ovdje, je strlen od, kako je nije ono što želim učiniti, string s jednako argv 0. Tako sam je manji od duljine od naših polje, koji je u ovom slučaju niz znakova, i plus plus. I tako, kao što smo vidjeli prošlog tjedna, što je idealno ako se krećemo da strlen izvan stanja, od nje se dodavanjem strlen od s. svaki put idemo kroz petlju, a to je neće biti promjena. Dakle, mi ćemo ga jednako n nad ovdje postaviti. OK. Tako sada, mi smo iterating tijekom svaki indeks u polju. I tako, ako želimo ispisati svaki lik u toj polja, posto je c zastava želimo koristiti za likove. I sada sam nosač će biti string, indeks znak i, pa ako Niz bili bok. onda je 0 će biti H, s nosača 1 će biti E, i tako dalje. Dakle, sada želimo kombinirati ove dvije stvari. Želimo ispisati svaki lik svakog naredbenog retka argument. Tako ćemo imati ugniježđeni for petlje. I konvencionalno, prvi brojač Ja se, pored će biti j, n će biti strlen od argv sam, manji od nje, i plus plus. I sad umjesto da tiska argv I, tako argv nosač i ide na indeksu - da će biti i-ti naredbenog retka argument, argv i, j će biti j karakter i-ti argument. Ja ću se riješiti ovog ovdje sada budući da smo ga stavili u tu petlju. Tako je ekvivalent String s jednakima argv ja, a onda je nosač j. Pa, mi ne trebamo da se proglasi ova varijabla je. Umjesto toga, samo ćemo iskombiniramo dva u ono što smo imali, argv I, J. ZVUČNIK 1: [nečujan]. ROB Boden: Dobra odluka. Dakle, ovo je slomljen. Ako sam zapravo ga je vodio, mi bi Shvatili su to. Dakle, brojač mi je stalo u ovom za petlja je j, iterator. Tako da bi upasti u probleme, Vjerojatno beskonačnu petlju, ako smo nije fiksna to. Zato smo i pričamo O ispravljanje pogrešaka i danas. OK. Tako ćemo pokrenuti ovaj program. I neka je zapravo dodati zasebnu printf Ovdje koja će samo ispisati druga linija, jer to znači kad smo pokrenuti program, bit će prazna linija između svakog karaktera svaki argument komandne linije. Pa, vidjet ćemo što to znači. Oop. Imam neki bug. Pogreška implicitno proglašenje biblioteka funkcija strlen. Dakle, ide natrag u naš program, mi zaboravio hash uključuju string.h. Dakle string.h će biti header file koji izjavljuje funkcija strlen. OK, ona prikuplja. Sada, neka je na njoj. Pa upravo to. To će se ispisati na našim naziv programa, hello world. To će ispisati svaku stvar, svaki karakter, na vlastitu liniju. OK. Pa neka je zapravo uzeti jedan korak dalje. I umjesto da koristi string.h, neka je razmišljati o tome kako ćemo provesti sami strlen funkcija. Dakle, ja ću odmah dati Funkcija potpis. Tako ćemo nazvati my_strlen, i to je će poduzeti niz kao argument, i očekujemo da će se vratiti Dužina tog niza. Dakle, gdje je taj tip? Da. OK. Pa sjećate iz ranijoj slici koja je također bio od prošlog tjedna, da Niz likova, dobro, string, pa recimo da je ovo naš niz e. Dakle, ako je je string, 'bok, a zatim, H-E-L-L-O, u znak sjećanja, koja će se biti, a onda je to znak obrnute kose 0 znakova. Pa kako ćemo dobiti duljinu s? Pa, trik je u potrazi za to zazor 0 karakter, ovaj null terminator. Dakle, algoritam je idući biti nešto poput neke dovoljno znakova da - popijmo ova ruka predstavljaju neke brojač, nazovimo ovu dužinu int. Dakle, počevši od ovdje, da smo će se ponoviti preko našeg niza. Dakle, prvi znak, to je H, i nije vratio udarac 0, pa Duljina je 1. Ponoviti na sljedeći znak, E, a to nije obrnute kose crte 0. Duljina je 2. L, 3. L, 4. O, 5. I na kraju, dolazimo do obrnute kose crte 0, i tako to znači, dobro, ovaj niz je gotova. Tako ćemo se vratiti pet. Tako zapravo provedbi da, prvo, moja dužina je n = 0, moja desna ruka. A mi ćemo ponoviti - ZVUČNIK 1: [nečujan] ROB Boden: Oh, pucati. Dobra odluka. Boom. Dakle duljinom n = 0. Tako sada, dok je dužina ne jednaka, a zatim, kosih crta 0. Dakle, ne zaboravite, ovo kosu crtu 0, to je stvarni lik, a to ukazuje kraj niza. Baš kao što je, također, backslash n je stvarni lik. Backslash 0 će se naznačiti Kraj našeg niza. Ne želim staviti da postoji. I dok s valutnom klauzulom po duljini nije jednaka je null terminator, a zatim Samo ćemo povećavati dužinu. Dakle, na kraju našeg programa, Duljina na kraju će biti 5 u ovom slučaju. A mi ćemo se vratiti duljinu. OK. Tako sada ovdje, ne znam učiniti my_strlen. Idemo ga sastaviti kako bi bili sigurni sve teče glatko. Radila sam u 2? Ili je to bio 1? To bi trebalo učiniti. U redu. Dakle, ovo je argv 2. Radovi prema planu, iako je da je jedan sam to učinio u? Da. OK. Ova verzija stvari nisu imali printf nova linija nakon, ali to ne čini nikakvu razliku. OK. Tako je radio kako treba. Sada možemo čak kombinirati ovaj jedan korak dalje, gdje je obavijest ovdje, dobro, Prvo, mi smo grabbing strlen od argv ja, a onda smo iterating više svaki lik u tom nizu. Dakle, umjesto da radi, što ako smo Samo kombinirati ovu logiku čeka sve dok se ostvario obrnute kose crte 0 pravo u ovaj za petlje? Tako ponoviti dok argv i, j ne nije jednako backslash 0. Tako ćemo ga pokrenuti prvi. U redu. Dakle, ovdje, to stanje je rekao - neka je jasno da je. Tako sada, neka to bude naša argv. Pa kad sam samo uletio taj program prije, argv je niz žice. I tako, ako sam ga pokrenuti s dot slash argv 2, hello world, onda argv Sama je dužina 3, za argv nula, hello, i svijet. A unutar svake od ovih indeksa je, Sama polje, gdje će ovo biti dot, to će biti udarac, ne znam je li to pravi smjer, ja ne mislim da je to bio. -R-V crtica, treba više prostora. Prestanimo se u ovom polju. -R-V crtica 0, a zatim backslash 0. A onda je u rasulu će pozdraviti. Recimo, H-E kosu crtu 0. I na kraju, W-O backslash 0. Dakle, algoritam koji smo upravo napisao, uklopljeni za petlje, što oni događaj je, prvo moramo suprotstavio sam se i zatim j. To će biti lakše s kodom na screen, Vratimo se to. OK. Dakle, primijetite da sam je iteratora da je iterating preko svake naredbe linija argument. A j iteratora Ponavljanje tijekom svakog lika u koji naredbenog retka argument. Pa što je to unutarnja printf radi je, mi smo printf argv 0 0, printf argv 0 1, printf argv 0 2, 0 3, 4 0, 0 5, 6 0, ali sada, argv 0 7 ide jednaka backslash 0. Onda smo izašli da za petlje, i sad ja iterates na 1. A sada idemo u tisku argv 1 0, argv 1 1 - dobro, sad, budući da sam rezati bok kratko, argv 1 2 ponovno će biti backslash 0. I tako, povećajte ja i nastaviti, te tako dalje, sve dok ne ispišete sve svijet, a to su tri naredbenog retka argumente, a mi ćemo izlaz iz Najudaljeniji petlje, a završiti naš program. OK. Tako ćemo se vratiti ovdje. Tako ćete dobiti neke upoznatost s argumente naredbenog retka na to Poseban je problem postaviti. Sada, ispravljanje pogrešaka. Tako ste vjerojatno već su morali učiniti Neki ispravljanje pogrešaka s prethodnim Problem postaviti. I jedan vrlo jednostavan način za ispravljanje pogrešaka, Prvo, pogledajmo buggy programa. Pa, šetnji kroz ovaj program, ćemo pitati korisnik za cijeli broj, zgrabite cijeli broj, a zatim, proizvoljno, imamo while petlja koja se samo ide na opadanje I dok je jednako 10. Neka samo Pretpostavimo Ulazim broj veći od 10. Dakle dekrementirati i dok je jednako 10. I onda imamo još jedan while petlja da, a ja ne jednaka 0, mi smo ide ja dekrementirati po tri. Dakle, ako vidite namjeru buga ovdje, to je da će ovo dekrementirati sam biti 10, a onda je to dok petlja će opadanje I, od 10 do 7, do 4, na 1, za negativne 2, na negativni 5, i tako dalje, na negativne beskonačnosti, jer ja ću Nikad zapravo jednaka 0.. I onda na kraju ovog programa, imamo Foo funkciju koja je ide na ispis iz koje ja. Dakle, ovo je kratak i beznačajan programa, i bug je očito, pogotovo nakon što sam upravo rekao je ono što je bug. No namjera ovdje je, dobro, to bi moglo zapravo izgledaju neke od vaših rješenja iz pohlepni od prošle Problem set, a možda nemate Neki klapa u svom programu, a vi nemate pojma što je uzrok. Dakle, vrlo korisno za ispravljanje pogrešaka tehnika je samo dodati printfs cijelom kodu. Dakle, ovdje želim printf izvan Prvi while petlja. I ovdje želim printf, a ja ću samo ispisati i. Čak ću učiniti prvi while petlja, ja. Vani, druga while petlja. Još jednom, ispisati unutar odavde, vrijednost i.. I neka je pokrenuti ovo. Dakle dot slash debug. Unesite cijeli broj. Učinimo 13. I bum. Vidimo da su beskonačne petlje unutar drugog, dok petlja. Dakle, sada znamo što je bug. Ali printf ispravljanje pogrešaka je savršeno super, ali jednom vaši programi dobiti duži i složeniji, postoje više sofisticirana rješenja za uzimajući stvari rade. Tako ćemo ukloniti sve ove printfs. I pobrinite se da nisam razbiti ništa. OK. Dakle Program idemo upoznati se zove GDB, za GNU Debugger. Pa, zapravo, neka je ukloniti debug za Drugi, i napraviti ispravljanje opet. Pa, zapravo je prvi, dobra lekcija u argumente naredbenog retka. Uočite da je ovo Dong naredba koja je sastavljanju sve se prošli na zapovjednoj liniji, to argumente naredbenog retka. Dakle, točno kako ćete se pomoću argumente naredbenog retka, kao što smo i prije, i kao što će u pset 2, to je kako Dong se njima koristi. Dakle, primijetite da je ova prva zastava, crtica ggdb3, što to govori jest, Dong, trebali sastaviti ovu datoteku s Namjera da ćemo s vremenom treba ga debug. Dakle, dok god imate tu zastavu, Tada možemo GDB ispravljanje. I to će otvoriti GNU Debugger. Dakle, postoji mnogo naredbi što vam je potrebno da se navikne. Prvo jedan koji vjerojatno ćete odmah trebate je Run. Dakle, ono što je vožnja će učiniti? Bit će to početak našeg programa. Dakle trčanje, počevši program, program nas pita za broj, 13 godina. A onda je beskonačna petlje kao Očekuje se, osim što sam uklonio printfs, tako da ni ne vidi. Izašao normalno. Oh. Moguće je da je omotana obrnuto, natrag - ignoriranje toga. Pretpostavimo da nisu izašli normalno. Tu je komplicirano odgovor na to. Pa sad, to nije vrlo korisno. Dakle, samo trčanje naš program unutar to debugger ne nam pomoći u bilo način, jer smo mogli samo učinio dot slash ispravljanje izvana GDB. Dakle, jedna naredba da vjerojatno ćete - i ja ću prestati to. Kontrola-d ili prestati, oba posla. Tako ćemo ga ponovno otvoriti. Druga naredba da ćete vjerojatno odmah žele Naviknut je Break. Tako ćemo razbiti na glavni za sada, a onda ću objasniti. Pa, ovdje smo vidjeli smo postavili prijelomna točka na toj liniji u debug.c. Pa što pauza znači da kada sam tipa trčanje, program će nastaviti prikazivati ​​sve dok Udario sam prijelomna točka. Dakle, kada sam pogodio trčanje, program počinje, , a zatim se lomi čim to ulazi u glavnu funkciju. Break glavni će biti nešto što prilično obično učiniti. I sada, da vas upoznam na neke više naredbi. Obavijest ovdje, da govori mi razlomi na liniju 11, koja je printf, unesite cijeli broj. Tako će naredba Sljedeća će biti kako idemo u sljedeći redak koda. To će nam omogućiti da korak Kroz naš program redak po redak. Zato sljedeći. Sada linije 12, idemo dobiti cijeli broj. Next. A ako samo pritisnite Enter opet, to ću Ponovi posljednju stvar si učinio. Tako da ne trebate upisati Sljedeći svaki put. Dakle, unesite cijeli broj, 13. Tako sada, linije 14, dok sam veći od 10, a ja ću učiniti. A vidimo da ćemo ja opadanje. Tako ćemo opet opadanje. Tako sada, još jedan koristan naredba ispisa. Dakle Ispis će ispisati vrijednost u varijable. Idemo izvedem vrijednost promjenjivog ja. Idemo ja ispisati. To će reći da je 11. Sada smo opet Next, dok I je veći od 10. Dakle, ja je još uvijek veći od 10, jer je 11. Ja minus minus. Idemo opet ispisati. Kao što se očekivalo, što je 10. Pa sad, iduće. To ide natrag u stanje, i je veći od 10, ali ja je sada 10, pa to nije veći od 10, tako da očekujemo to bi ispasti iz while petlje. I sad smo ispod te linije koda. I još jedna naredba, popis, samo ide prikazati natrag i naprijed nekoliko linija koda, u slučaju da se izgubio. Tako smo upravo izašli ovu while petlja, i sada smo ušli u ovaj while petlja, linija 18. Dakle, dok sam nije jednak 0. I, pored, i jednako ja minus tri, a mi ćemo primijetiti, to ću zadržati ide. I možemo ispisati i. Svaka naredba vrsta ima prečace. Dakle, p je kratica za Print. Tako možemo P Ja. Samo imajte drži n, ili zadržati radi Next. Ponovno ispisati i. Vidite sada je negativna 167. Dakle, to će trajati vječno, ali ne stvarno zauvijek, jer ste upravo vidjeli, to zapravo će završiti u nekom trenutku. Dakle, koja je na početku GDB. No, idemo napraviti još jednu stvar u GDB. Uh, debug. Dakle, u ovom konkretnom slučaju, klapa dogodilo da se unutar Glavna funkcija. A za sada, samo prihvatiti da je to sam useliti beskonačnu petlju u Funkcija foo. Dovoljno se sjetiti da je, na kraju to Program, dobro, ovo je izvorno nazivajući Foo, koji je bio pravedan će se ispisati. Ali sada smo pozivom Foo, što je će dekrementirati sam dok je 0, a zatim ispisati tu varijablu. OK. Spremi to. Napravite ispravljanje. I sada, gdb debug. OK. Dakle, ako sam samo pokrenuti onda ja ne idem biti u mogućnosti da se zapravo korak kroz moje Program linije-by-line. Tako ćemo razbiti na glavni, a zatim upisati trčanje. Dakle, proći kroz to, printf, unesite cijeli broj, dobiti cijeli broj, 13. Tako ćemo zadržati decrementing I dok je veći od 10. Onda ćemo pasti kroz while petlja, i doći na liniju - idemo ga otvoriti u zasebnom prozoru. Tako smo se smanjuju dok sam bio više nema veći od 10, a zatim ćemo zove funkciju, Foo. Dakle, ono što se dogodilo čim sam pogodio Funkcija Foo, dobro, nazvao sam foo, te tada više nisam imala kontrolu nad GDB. Dakle, čim sam pogodio Dalje na ovoj liniji, stvari i dalje dok se to dogodilo, gdje je program izašao kada - Pretpostavljam da nije postojao na kraju. Vidjeli ste ga stanka za malo ipak. Pa zašto sam izgubila kontrolu nad Program u tom trenutku? Pa, kad sam upisati sljedeći, koji ide na Doslovni sljedeća linija koda koji će izvršiti. Dakle, nakon što je linija 21, pored linija koda koji će izvršavati je linija 22, koji je, izlazeći iz glavna. Dakle, ja ne želim da se samo ići u sljedeći redak koda. Želim ići na funkcije, Foo, , a zatim i korak kroz ta linija koda. Pa za to, imamo alternativu. Idemo opet prestati da. Break glavna. Uh, 1, pored, pokraj, 13, sljedeći, next, next, pažljivo, Prije nego što smo pogodak linije foo. OK. Tako sada, mi smo na liniji 21, gdje smo pozvati foo. Mi ne želimo upisati sljedeći, budući da je samo će pozvati funkciju foo, te idi na sljedeću liniju koda. Ono što želimo je iskoristiti korak. Dakle, postoji razlika između koraka i Next, gdje Korak uđe funkcionirati, i ide Sljedeća preko funkcije. To samo izvršava u cijelosti funkcija i ide dalje. Dakle korak će nam donijeti u funkciji, Foo. I ovdje vidimo, sad, vratili smo se na to dok petlja koja je, u teoriji, će trajati vječno. A ako hit korak, kada to nije ni Funkcija nazvati, onda je identičan Next. Dakle, to je samo kada ste na liniji koja poziva funkciju koja Korak će se razlikovati od iduće. Dakle korak će nas dovesti ovdje. Korak, korak, korak, korak, korak, korak i Samo ćemo klapa zauvijek. Dakle, možda ćete se naviknuti na to kao svoj način utvrđivanja beskonačne petlje, je samo drži ovu Enter za vidjeti gdje zapnete. Ima boljih načina kako to učiniti, ali za sada, to je savršeno dovoljna. I stilski, u skladu s stilom 50, trebala sam to učinio. OK. Tako posljednji naredba uvesti. Pa, neka je GDB ispravljanje u. Dakle, umjesto razbijanje na glavni, ako sam Znam funkciju foo je također Problem, onda sam mogao imati samo rekao je, slomiti na foo, umjesto. Recimo da sam razbiti na glavni i Foo. Na taj način možete postaviti onoliko prijelomnih točaka kao što želite. Kad sam tipa trčanje, to se događa da se zaustavi na - ooo, neka je kompilirati, budući Promijenio sam stvari. Vidjet ćete ovu liniju, upozorenje izvor datoteka je novija od izvršne. Dakle, to znači da sam se upravo ovdje i promijenio to u skladu s stilom 50, ali nisam kompilirati Program. Dakle GDB čini mi svjesni toga. Prestat ću, napraviti ispravljanje opet, pogodio gdb ispravljanje. OK. Pa sad, natrag na ono što radim. Break glavnu, prijelom foo. Sada, ako sam pokrenuti program, pa je će se nastaviti dok se ne pogodi prijelomna točka. To prijelomna točka se događa biti prvi na glavni. Sada, umjesto da radi naprijed, naprijed, naprijed, next, next, dok sam pogodio Foo, ja može upisati nastavak, koji će se nastaviti dok ne pogoditi sljedeći prijelomna točka. Moram ući u cijeli broj prvi. Nastaviti će se nastaviti sve dok ne pogodim sljedeća točka prekida, što je to funkcija foo. Dakle Run će se izvoditi do te pogodak prijelomna točka, ali samo upisati vožnji kada ti si pokretanja programa, a zatim, od tada, to je i dalje. Ako sam upravo učinio razbiti glavni i tada vodio, to će razbiti na Glavni, a zatim nastaviti. Budući da sam ne imati break na foo, unesite cijeli broj, onda sada sam Ne ide razbiti na foo. To samo ide do beskonačno petlje do toga. OK. Dakle, to je Uvod u GDB. Trebali bi početi koristiti u tvoj problem setovima. To može biti vrlo korisno identificirati bugova. Ako vam je zapravo samo, liniju-po-line, idite kroz svoj kod, i usporedite ono što je zapravo događa s tim što očekujete da se dogodi, onda je prilično teško propustiti svoje greške. OK. Tako je prošlog tjedna David odrastao to Tajna-key kriptografiju stvari za Prvi put, u kojem ne želimo Lozinke samo biti pohranjeni na našim Računalo na neki običan tekst datoteke, gdje je netko može doći i samo otvorite ga i pročitati ih. U idealnom slučaju, oni će biti kodiran na neki način. I u problem Skupine 2, vi ćete se bave s jedne metode enkripcije, ili, dobro, dvije metode, ali oni nisu tako velike. Ako to ne učinite haker izdanje, ti si također će se baviti dešifriranja neke stvari. Dakle, pitanje je sad, dobro, čak i ako imamo najjaču šifriranje algoritam u svijetu, ako se odlučite Posebno loša password, onda neće ti puno pomoći, jer ljudi će i dalje biti u mogućnosti to shvatiti. Čak i ako vidim šifrirani niz i to izgleda kao nered smeća to ne znači ništa za njih, ako oni još samo treba isprobati nekoliko lozinke to shvatiti, onda nisu baš siguran. Tako gledajući video koji čini tu točku. [VIDEO PLAYBACK] -Helmet, što đavo. Što se dešava? Što radiš s mojom kćerkom? -Dopustite mi da predstaviti briljantni Mladi plastični kirurg, dr. Phillip Schlotkin, najveći nos posao čovjek u cjelokupnom svemir, i Beverly Hills. -Vaša Visosti. -Nos posao? Ne razumijem. Već je imao operaciju nosa. Bilo je slatko šesnaest prisutna. -Br. To nije ono što mislite. To je puno, puno gore. Ako ne daj mi kombinacija za zračni štit, Dr. Schlotkin će dati svoju kćer natrag svoju staru nos. -Br. Odakle vam to? -U redu. Ja ću reći. Ja ću reći. Ne, tata. Ne, ne moraš. -Ti si u pravu, draga moja. Ja ću propustiti svoj novi nos. No, neću mu reći kombinaciju, bez obzira na sve. -Vrlo dobro. Dr. Schlotkin, učiniti vaš najgori. -Moje zadovoljstvo. [Alati su izoštriti] -Br. Čekaj. Čekaj. Ja ću reći. Ja ću reći. -Znao sam da će to raditi. U redu. Daj mi to. -Kombinacija je jedna. -Jedan. -Jedan. -Dvije. -Dvije. -Dvije. -Tri. -Tri. -Tri. -Four. -Four. -Four. -Pet. -Pet. -Pet. -Dakle, kombinacija je jedan, dva, tri, četiri, pet. To je najgluplja kombinacija Sam ikada čuo u životu. To je nešto što je idiot će imati na svojoj prtljazi. -Hvala vam, vaša visosti. -Što si učinio? -Ja okrenuo se od zida. -Ne, nisi. Vi isključen cijeli film. -Mora da sam pritisnuo krivi gumb. -Pa, stavio ga na leđa. Stavite film na leđa. -Da, gospodine. Da, gospodine. -Idemo, Arnold. Dođite, Gretchen. Naravno, znam da ću i dalje moram vam naplatiti za to. [END video reprodukciju] ROB Boden: U redu. Dakle, sad kad smo već govorimo o sigurnost, na neki način, lijepo Malo movie poster, tako da u posljednjih dana, ovi problemi s NSA praćenje sve. To može biti teško da se osjećaju kao ti imaju nekakvu privatnost u Online svijet, iako sam nije mogao reći što većina pojedinosti prizmi. Dakle, kreće izvan prizme, nećemo da se govori o tome, sada misle o svom prijenosnom računalu. Tako se ovdje, želim prebaciti na moj stvarni račun, s mojim malim pingvina. Dakle imam lozinka postavljena, a to lozinka je sve što želim da bude. No, imajte na umu da ono što sam prijavom u sa, tako da je ovo za prijavu brz, je neki program. To je neki program koji je napisao neke osobe. I tako, ta osoba, ako su Posebno zlonamjerni, što su mogli su rekli, u redu, tako da ako je lozinka da uđem jednak mom Stvarni password, ili je jednaka na neku posebnu lozinku - David je strašan ili nešto - onda ih pustiti unutra Dakle zlonamjerni programer mogao imati pristup svim svojim Macovima, ili Windows, ili bilo što. Dakle, to nije mnogo briga, jer, Mislim, ovo je za prijavu programa koji je isporučen s OS X, stotine ili tisuće ljudi imaju pregledao ovaj kod. I tako, ako je, u kodu negdje, reci, ako ovaj niz jednako dosegne David je strašan, prijava, onda je netko će biti, kao što je, čekati. To nije u redu. To ne bi trebao biti ovdje. Dakle, to je jedan od načina da se stvari biti vrsta siguran. No, razmišljam o čak programa da ste napisali. Recimo da je napisao program za prijavu. Dakle, ovo za prijavu programa koje je napisao, tako očito, da ste dobri programer. Vi ne ide staviti bilo zlonamjernih ako je x jednako jednako David je strašan u kodu. No ovaj program, što učiniti koristiti sastaviti ovaj program? Nešto kao jeka. Pa što ako je osoba koja se dogodilo pisati Zveket specijalnu proučavao u Dong nešto slično, ako sam sastavljanju programa, prijavite se, a zatim unesite ovaj kod u prijavu programa koji kaže, ako x jednaka jednaka David je strašan? Dakle, nije baš još, ali mi imamo isti izdati ovdje, gdje je Dong, dobro, tisuće, ako ne i više desetaka tisuća ljudi, znanstvenici su promatrali Dong, imaju pogledala svojim linija koda i rekao, sve u redu, nema ništa loše ovdje. Očito, nitko ne radi ništa ovaj zlonamjerni. No, ono što je sama Dong, kao što su, što ako sam sastaviti Dong? Što ako imam neki prevodilac da sastavlja zveket koji se umeće u Dong ovaj posebni hack da kaže, sve u redu, kad sam sastaviti Dong, a zatim izvršnu sam se posebno trebali gledati unutar prijavu programa i umetkom ovu lozinku, jednako dosegne Dave je strašan? Dakle, ne zaboravite da je i sam sastavljač treba biti sastavljen u nekom trenutku. Dakle, ako je ono što se odlučite za sastaviti Zveket sa, sama je zlonamjeran, onda mogla biti pijan cijelo način niz liniju. Pa evo, imamo Ken Thompson i Dennis Ritchie. Dakle, ovo je kultni fotografiju. Dennis Ritchie je na desnoj strani. On je veliki - prilično je napisao C. Tako možete mu zahvaliti za ovu klasu. Ken Thompson je na lijevoj strani. Njih dvojica su u osnovi je napisao UNIX. Pa, oni su bili glavni suradnici u UNIX. Tu su bili neki drugi. Dakle Ken Thompson, u nekom trenutku, osvaja Turingov nagradu. I Turing nagrade, uvijek sam čuo to upućuje na ovaj način, to je Nobelova nagrada za računalne znanosti. Tako je Turing Award, on mora dati svom govoru. A on daje ovaj vrlo poznati govor Sada, pod nazivom Razmišljanja o uzdajući se Povjerenje koje smo povezani Da bi se na web stranici kolegija. I u ovom govoru, on je, kaže, sve u redu, pa sam pisao UNIX, a sada sve ti ljudi koriste UNIX. Sada, ne zaboravite danas da je Linux izravni potomak UNIX. OS X izravno koristi UNIX. Windows ne toliko, ali puno ideje su uzeti iz UNIX. Dakle, što se popne na pozornicu i kaže: sve u redu, napisao sam UNIX. I samo da vi momci znate, ja sam mogućnosti prijaviti se na svaki do jednog od svojih računala. Budući da sam stavio jedan od tih posebnih ako x jednako jednako Ken Thomson je strašan, onda sam dopustio da se prijavite. Dakle, ljudi su kao, dobro, Kako si to učinio? Mi smo gledali na programu prijavu i ništa ne postoji. On je kao, dobro, modificirani sam prevodilac prijaviti u program za prijavu , tako da je program za prijavu danas će imati da je x jednako jednako Ken Thompson je strašan. A oni kažu, dobro, to nije istina. Gledamo u prevodilac, i prevodilac nema linije Kod tako. On je kao, u redu, ali što si ti sastavljanju prevodilac sa? I oni misle, a on je, kao, dobro, Ja sam onaj koji ti je dao prevodilac koju koristite sastaviti prevodilac, pa što su sastavljanje prevodilac, koji Sama je zlonamjeran, te će razbiti program za prijavu. Tako je u osnovi, u tom trenutku, postoji ni na koji način biste mogli pogledati izvor kod programa za prijavu vidjeti što nije u redu. Ne mogu ni pogledati u izvorni kod prevodilac vidjeti što nije u redu. Ti bi trebao gledati na stroju code, binarnom od sastavio prevodilac vidjeti, čekati, to linija koda ne bi trebao biti ovdje. No, Ken Thompson je trebalo jedan korak dalje i rekao, dobro, postoje ovi posebni programi koji zapravo će vam pomoći da pročitate binarni programa, pa ako netko koristi taj program pročitati binarni, oni će ih vidjeti linija koda. On mijenjati one programe za reći, sve Dobro, ako ste u potrazi na prevodilac, ne pokazuju to posebno Skup binarno. Pa onda morate uzeti korak dalje iu osnovi, koji bi mogli imati uzeti više razina zaobilazak, te u nekom trenutku, nitko je zapravo će biti ček. Dakle pouka ove priče je, ti si neće biti pisanja Zveket u ovoj klasi. Ti si idući u biti koristeći penjanje Zveket puno u ovoj klasi. Za sve što znate, Dong je zlonamjeran Program koji je sabotira svaki jedan program ste ikada sastavio. I da vas ostaviti na tome vrlo zloslutna umu, vidimo se u srijedu. [PLJESAK] ZVUČNIK 2: Na sljedećem CS50. Zvučnik 3: Da se nisi usudio to reći. To možete učiniti. Vi ste to učinili prije, to možete učiniti Danas, možete to učiniti sutra. Vi ste to radili godinama. Dovoljno je otići tamo i to učiniti. To možete učiniti. [Glazba svira]