[MUSIC PLAYBACK] ROB BODEN: Dobre. Takže, prvá vec, prvá, video od známu tvár. [PLAYBACK] -Dobre. To je CS50, a to je štart troch týždňov. Prepáč, že som nemohol byť s tebou dnes, ale dovoľte mi predstaviť CS50 vlastné Rob Boden. [END VIDEO PLAYBACK] [Potleskom a CHEERS] ROB BODEN: filmografie v že video je fantastické. Dobrá. Tak za prvé, je tu ešte jeden obed. Je to zajtra v 01:15. Neexistuje žiadny obede v piatok. Je s Quora. A Tommy je tu ešte nie je, ale jeden z ľudia, tam je bývalý šéf CF, Tommy McWilliam. Takže je to zábava chlap. Tie by mali prísť. Dobrá. Takže minulý týždeň, sme začali rozpadá o tom, čo reťazec skutočne je. Poznáme od začiatku, že je to postupnosť znakov. Ale minulý týždeň, sme sa ponorili do skutočnosti, že to, čo je v skutočnosti sekvencia postavy, dobre, máme teraz pole znakov. A my vieme, že reťazec, je to pole znakov, na samom konci, máme tento špeciálny nulový bajt, to spätné lomítko 0, ktorá označuje koniec reťazec. A tak reťazec je pole znaky, ale môže mať viac ako len pole znakov, môžeme mať rad ktoréhokoľvek typ, čo chceme. Takže, ak si spomínate z minulého týždňa, Vek program, ktorý predstavil David veľmi rýchlo. Takže prvá vec, ktorú budeme robiť, je požiadať užívateľa o celé číslo, počet ľudí v miestnosti. Akonáhle budeme mať, že celé číslo, budeme deklarovať pole. Všimnite si túto syntax konzoly. Budeš si zvyknúť na to. Takže budeme deklarovať pole celých čísel volal veku, a tam sú n celé čísla v tomto poli. Takže tento vzor tu, je to 4 int i sa rovná 0, i je menšie ako n, i a a, že je tiež bude vzor že vám veľmi zvyknutí. Vzhľadom k tomu, že je dosť veľa, ako ste vždy bude iterovat cez pole. Tak si uvedomiť, že n je dĺžka nášho poľa. A tak tu sme opakovane žiadajú na veku osoby aj v miestnosti. Potom, ideme dole, a bez ohľadu na ľubovoľná dôvod, prečo sme sa potom vytlačiť koľko idú byť odo dneška za rok. A spustenie tohto programu, poďme aby veku, bodka lomítko veku. Takže počet ľudí v miestnosti, povedzme, že sú tam tri. A hovoria, že prvá osoba 13, Ďalšie je 26 a posledný 30. Takže to bude iterovat cez tie tri ľudí, vytlačiť 14, 27, a 31. Takže si pamätajte, že keď sme sa vyhlásiť pole veľkosti n, indexy v tom, že pole, pole obsahuje hodnoty a indexy 0, 1, 2, celú cestu až n mínus 1. Takže, keď sme povedali, že boli traja ľudia v miestnosti, a dáme sem Prvá iterácia cez tento slučky, aj bude 0. Takže v indexe 0.. Sme priradenie prvý vekom užívateľ zadá. Potom v ďalšej, sme zadanie Druhá n používateľ zadá, a vedľa dvoch, posledný n Takže si všimnúť, že rad veľkosti tri nemá nič v indexe tri. Toto nie je platný. Dobrá. Takže, ide sem. Takže teraz, že sme sa zaoberal polí, máme nejaké znalosti. Teraz sa budeme pohybovať na povel linka argumenty, ktoré sa bude celkom relevantné k tomuto problému sade. Takže až do teraz, keď ste deklaroval svoju hlavnú funkciu, máme povedal int main void. Takže void jednoducho znamená, že nie sme absolvovanie niektorého argumenty k tejto funkcii. Teraz budeme vidieť, že hlavným môže trvať niekoľko argumentov. Tu im hovoríme int argc a reťazec argv zátvorky. Držiaky, opäť s uvedením že máme čo do činenia s poľami. Tak tu, string argv držiaky, sme rokovaní s poľa reťazcov. Takže argc, že ​​to bude ukazovať koľko argumenty máme odovzdaný do tohto programu. A vidieť, čo to znamená, poďme zatvorte toto. OK. Takže až do teraz, sme bežať každý program, ako je bodka lomítko vekových kategórií. Môžeme tiež na príkazovom riadku, okolo odovzdať argumenty, teda termín, príkaz linka argumenty. Takže prvý argument, hello world. Tak tu, argc bude tri. Je to počet argumentov na príkazovom riadku. Argc je vždy aspoň 1, pretože dot lomítko veku, sám, sa počíta ako jeden z argumenty príkazového riadku. Potom ahoj je prvý. Ak dot slash veku je zeroth, potom ahoj je prvý, a svet je Druhý argument riadok príkaz. Takže reťazec argv, budeme vidieť, obsahuje reťazcov, bodka lomítko veku, ahoj a svet. A tým, že žiadosť Davida, ideme video prehrať zavádzajúce, že. [PLAYBACK] -Až teraz v programoch sme napísal, že sme vyhlásiť Hlavný ako int main void. A celú tú dobu, že void má proste bolo určujúce, že Program neponesie argumenty príkazového riadku. Inými slovami, keď užívateľ spustí Program, on alebo ona môže poskytnúť príkazu argumenty sú podľa písať ďalšie slová alebo slovné spojenia po programe je meno na príkazovom riadku. No, ak chceš svoj program na prijať argumenty príkazového riadku, jeden alebo viac takých slov, musíme nahradiť stratu s niekoľkými argumentmi. Tak poďme na to. Zahrnúť CS50.h. Zahrnúť štandardné io.h. Int main. A teraz, namiesto toho, void, budem zadať int argc názvom, a Pole reťazcov zvaných argv. Teraz, argc a argv sú jednoducho konvencie. Mohli sme nazývajú tieto argumenty väčšina čokoľvek chceme. Ale čo je dôležité je, že argc je int, pretože podľa definície je bude obsahovať počet argumentov, počet slov, že celkom užívateľ zadal na jeho alebo jej výzvu. argv, medzitým, argument, vektor, je bude v skutočnosti byť poľa skladovanie všetky slová, ktoré má užívateľ napísaný na jeho alebo jej výzvu. Poďme pokračovať urobiť niečo teraz s jedným alebo viacerými z týchto argumenty príkazového riadku. Najmä, poďme do toho a tlač bez ohľadu na slovo užívateľ zadá po názve programu na príkazovom riadku. Otvorte držiak. Zatvorte držiak. Printf percent je spätné lomítko a čiarka. A teraz musím povedať, printf, akú hodnotu zapojiť do tohto zástupného symbolu. Chcem prvé slovo, ktoré má užívateľ napísal po názvu programu, a tak budem špecifikovať argv držiak 1, v blízkosti zátvorka, bodkočiarka. A teraz, prečo držiak 1 a nie držiak 0? No, to dopadá, automaticky uloží v argv 0 bude Skutočný názov programu. Takže prvé slovo, ktoré užívateľ zadá Po názov programu je tým, že konvencie, bude uložené v argv 1. Poďme sa teraz zostaviť a spustiť tento program. Uistite sa argv 0, bodka lomítko argv 0. A teraz slovo ako ahoj. Enter. A tu to máme, ahoj. [END VIDEO PLAYBACK] ROB BODEN: Dobre. Zatvorte to. Takže sa podrobnejšie pozrieme na tomto programe, ktorý sme práve predstavil k nám, dobre, len ukázať, ak tlačíme argv 0, robiť, teraz čo je to, argv 0, bodka lomítko argv 0. Tak, ako sa očakávalo, je to vytlačiť meno programu, pretože argv 0 je vždy bude názov programu. Ale poďme robiť niečo bit zaujímavejšie. Takže problému nastavenie, budete predstavil na túto funkciu, atoi. Tak čo budeme používať atoi pre? To bude konvertovať reťazec na celé číslo. Takže keď som odovzdať reťazec, jeden, dva, tri, k atoi, že budete prevádzať, ktoré na celé číslo, jeden, dva, tri. Takže budeme konvertovať prvý argument riadok príkaz na celé číslo, a potom už len vytlačiť, že celé číslo. Takže v podstate, že sme trochu reimplementing vezmi_int, len číslo je zadané v príkaze linka miesto v programe interaktívne. Tak, aby argv 0, poďme robiť je to tu, a zavrieť to. Takže beh argv 0, a poďme vstúpiť číslo, jeden, dva, tri štyri jedna dve. Takže to bude tlačiť celé číslo, jeden dva tri štyri jedna dve. Tam sú niektoré nuansy, aby atoi, že bude to prestať sa starať o nič za platný číselný znak, ale to nevadí. Tak čo si myslíte, že sa stane či som to urobiť? Segmentation fault. Tak prečo je to? Ak sa pozriete späť na nášho programu sme prevod argv 1, prvý argument po názvu programu, na celé číslo. Ale nie je tam žiadny argument odovzdaný po názvu programu. Takže tu vidíme, že sa jedná o kočík programu, pretože, keď sa budeme snažiť, aby ho spustiť bez argumentov, to bude len pád. Takže ďalší spoločný vzor uvidíte je niečo ako, ak argc je menej ako dva, čo naznačuje, že nebol aspoň názov programu a Prvý argument, potom budeme robiť niečo ako printf, nestačí argumenty príkazového riadku. To asi nie je dobrý pre tlač, je to asi niečo, ako by ste mali zadať číslo na príkazovom riadku. Budem jednoducho skončiť tam. A potom sa vráťte 1. Takže si pamätajte, že na konci nášho programu, ak sa vráti 0, že druh indikuje úspech. A hlavné tiež automaticky vracia 0, ak nechcete. Tak tu sme preladenie 1 uviesť že to nie je úspech. A môžete sa vrátiť čo chcete, len, 0 znamená úspech, a niečo signalizuje poruchu. Takže poďme spustiť túto verziu vecí. Takže teraz, ak sa nám nepodarí zadať príkazový riadok Argument, že to správne povedať, nám, nestačí príkazového riadku. Nedokončil vetu. Inak, ak sme skutočne prejsť to jedno, môže dokončiť program. Tak to je, ako by ste používať argc v pre overenie počtu argumenty príkazového riadku, ktoré skutočne prešiel. Takže poďme urobiť tento program trochu viac zložité, a pozrite sa na druhý iterácie vecí. Takže teraz nie sme len tlač Prvý argument riadok príkaz. Tu sme iterácie z int aj rovnými 0, i je menšie ako argc, i a plus, a tlač argv, index i Takže tento model, opäť sa jedná o rovnaký vzor ako predtým, s výnimkou toho, volanie premenné n, budeme používať argc. Tak to je iterácie každý index v poli, a každý tlač má v tomto poli. A tak, keď sme sa spustiť tento program, tak, Nechcel som zadať ľubovoľný príkaz argumenty, tak to len tlačí názov programu. Ak zadám veľa vecí, to bude vytlačiť jeden, každý na samostatnom riadku. OK. Takže poďme o krok ďalej. A namiesto tlače každý argument na samostatnom riadku, poďme tlačiť každý charakter každého argumentu na vlastnom riadku. Takže si pamätajte, že argv je pole reťazcov. Takže to, čo je reťazec, ale rad znakov? Takže to znamená, že argv je naozaj pole z poľa znakov. A tak, že s využitím, poďme ignorovať to teraz. Povedzme zvážiť reťazec argv 0. Takže ak chceme, aby každý znak argv 0 na samostatnom riadku, potom chcem, urobiť vzor sme zvyknutí, aj je menšia, než je dĺžka poľa, ktorý tu, je strlen z, to je nie je to, čo chcem robiť, reťazec s sa rovná argv 0. Tak som je menšia ako dĺžka našej pole, ktoré je v tomto prípade je pole znakov, aj plus plus. A tak, ako sme videli minulý týždeň, je to ideálne ak sa pohybujeme, že strlen mimo stavu, sa od n pridávať strlen S zakaždým, keď ideme slučkou, a to nebude meniť. Takže budeme nastaviť rovné n sem. OK. Takže teraz, sme iterácie každý index v poli. A tak, ak chceme tlačiť každý charakter v tomto poli, percenta c je vlajky chceme použiť pre znaky. A teraz držiak aj bude reťazec, index znak i, takže ak string boli ahoj. potom s 0 bude h, S príchytkou 1 bude e, a tak ďalej. Takže teraz chceme spojiť Tieto dve veci. Chceme tlačiť každý znak každý argument príkazového riadku. Takže budeme mať vnorené slučky for. A zvyčajne, prvý čítač je aj, ďalšia sa bude j, n bude strlen z argv aj, aj je menšie ako n, aj plus plus. A teraz, namiesto tlače argv aj tak, argv držiak aj bude index - že to bude i-ty príkazového riadku Argument, argv i, j bude je j-tý znak argument, i-ty. Zbavím sa toho tu teraz od dáme to do tej slučky. Takže je ekvivalentná reťazec s rovnými argv i, a potom je držiak j No, my nepotrebujeme deklarovať táto premenná y. Namiesto toho sme len spojiť tieto dva do toho, čo sme mali, argv Aj, J. SPEAKER 1: [nepočuteľné]. ROB BODEN: Dobrý nápad. Takže je to rozbité. Ak som vlastne bežal, by sa si to uvedomiť. Takže počítadlo mi záleží v tomto najmä pre slučka je j, iterátor. Takže by ste naraziť na otázky, pravdepodobne nekonečná slučka, ak sa nestanovila, že. To je dôvod, prečo sme tiež hovorili o ladenie dnes. OK. Takže poďme spustiť tento program. A poďme vlastne pridať samostatný printf tu, že bude len vytlačiť ďalší riadok, pretože to znamená, že keď sme spustenie programu, bude tam prázdna čiara medzi každým charakteru každý riadok argumentu príkazu. No, uvidíme, čo to znamená. OOP. Mám nejakú chybu. Chyba implicitne vyhlásil Knižnica funkcií strlen. Takže sa vracia do nášho programu, som zabudli hash patrí string.h. Takže string.h bude hlavičkový súbor, ktorý prehlasuje, Funkcie strlen. OK, to skompiluje. Teraz, poďme ho spustiť. Tak práve to. Bude to vytlačiť naše názov programu, hello world. Bude to vytlačiť každú vec, každý znak, na samostatnom riadku. OK. Takže poďme vlastne vziať o krok ďalej. A namiesto použitia string.h, poďme premýšľať o tom, ako by sme realizovať naše vlastné strlen funkcie. Tak som si hneď dať funkcia podpis. Takže poďme zavolať my_strlen, a to bude trvať reťazec ako argument, a očakávame, že sa vráti dĺžka tohto reťazca. Tak, kde je ten chlap? Áno. OK. Takže nezabudnite od skoršieho snímky, ktorý bol tiež z minulého týždňa, že rad postáv, dobre, reťazec, takže povedzme, že je to náš reťazec s Takže ak s je reťazec, ahoj, a potom, H-E-L-L-O, pamäti, že sa to byť, a potom to spätné lomítko 0 znak. Tak ako sa dostaneme dĺžku s? No, trik hľadá tento vôľa, 0 povahu, tento null terminátor. Takže algoritmus bude byť niečo ako málo dosť postáv, ktoré - Poďme si to ručne predstavujú jedny čítač, hovorme túto dĺžku int. Takže, od tu, my sme bude iterácii nášho reťazca. Takže prvý znak, to je H, a nie je to spätné lomítko 0, takže dĺžka je 1. Iterovat na ďalší znak, E, a to ani spätné lomítko 0. Dĺžka je 2. L, 3. L, 4.. O, 5. A konečne sa dostávame spätné lomítko 0, a tak to znamená, dobre, Tento reťazec je u konca. Takže poďme sa vrátiť päť. Takže vlastne vykonáva jednak tým, že môj dĺžky n sa rovná 0, moja pravá ruka. A budeme iterovat - SPEAKER 1: [nepočuteľné] ROB BODEN: Oh, strieľať. Dobrý nápad. Boom. Takže dĺžka n rovné 0. Takže teraz, keď s dĺžka nie je rovné a potom, spätné lomítko 0. Takže pamätajte, že toto spätné lomítko 0, je Skutočný znak, a znamená to, že koniec reťazca. Rovnako ako aj spätné lomítko n je aktuálny znak. Spätné lomítko 0 sa chystá uviesť koniec nášho reťazca. Nechcem, aby to dať tam. A zatiaľ čo s indexované podľa dĺžky nie je rovná null zakončenie, potom sme len tak zvýšiť dĺžku. Takže na konci nášho programu, Dĺžka sa nakoniec bude byť 5 v tomto prípade. A budeme len vracať dĺžku. OK. Takže teraz tu, vôbec sa mi nepáči to my_strlen. Poďme skompilovať, aby sa ubezpečil, všetko beží hladko. Som robil vo 2? Alebo to bol 1? To by malo stačiť. Dobrá. Tak toto je argv 2. Funguje ako sa očakávalo, aj keď bolo to, že ten, čo som to urobil v? Áno. OK. Táto verzia, čo nemal printf nový riadok potom, ale to nie je žiadny rozdiel. OK. Takže pracoval, ako sa očakávalo. Teraz môžeme aj kombinovať jeden krok ďalej, kde Oznámenie tu, dobre, Najprv sme schmatol strlen z argv i, a potom sme iterácie každá postava v tomto reťazci. Takže namiesto toho, aby robil to, čo keby sme Len kombinovať logiku čakania až sme narazili spätné lomítko 0 práva do tejto slučky for? Takže iterovat kým argv i, j robí nie je rovné spätné lomítko 0. Takže prvá je spustiť. Dobrá. Tak tu je táto podmienka hovorí - Poďme jasné, že. Takže teraz, nech je to naša argv. Takže, keď som bežal tento program skôr, argv je pole reťazcov. A tak, keď som ho spustiť s bodkou lomítkom argv 2, hello world, potom argv sám o sebe je dĺžka 3, pre argv nula, ahoj a svet. A v každej z týchto indexov je, Samotný pole, kde to bude bodka, bude to lomítko, ja neviem, v prípade, že je správny smer, som Nemyslím, že to bolo. -R-V pomlčka, potrebujú viac priestoru. Poďme nakrájame na tomto poli. -R-V pomlčka 0, a potom spätné lomítko 0. A potom v neporiadku bude ahoj. Povedzme, že H-E spätné lomítko 0. A konečne, W-O lomka 0. Takže algoritmus, ktorý sme práve napísali, vnorené cykly for, čo sú zač robí, je, musíme najprv čeliť aj a potom j To by bolo jednoduchšie, s kódom na obrazovka, Vráťme sa k tomu. OK. Tak zistíte, že aj je iterátor, ktorý je iterácie každý príkaz argument riadok. A j je iterátor Iterácia na každý znak v tom, že argument riadok príkaz. Takže čo to najvnútornejšie printf robí je, sme printf argv 0 0, printf argv 0 1 printf argv 0 2, 0 3, 0 4, 0 5, 0 6, ale teraz, argv 0 7 sa chystá rovná spätné lomítko 0. Tak sme sa ukončiť, že pre sláčiky, a teraz som sa opakuje na 1. A teraz ideme k tlači argv 1 0, argv 1 1 - No, teraz, keď som rez ahoj krátka, argv 1 2 opäť bude spätné lomítko 0. A tak, aj zvýšiť, a pokračovať, a tak ďalej, kým sa vytlačiť všetky svet, a to sú tri príkazového riadku argumenty, a budeme ukončiť z vonkajšie slučka, a dokončiť náš program. OK. Takže poďme sa sem vrátiť. Takže budete získať nejaké vedomosti s argumenty príkazového riadku pre tento osobitný problém nastaviť. Teraz, ladenie. Takže ste asi už musel urobiť niektoré ladiace s vašou predchádzajúce problém nastaviť. A ešte jedna veľmi jednoduchý spôsob, ako ladenie, Najprv sa poďme pozrieť na buggy programu. No, prechádzky tohto programu, budeme žiadať užívateľa o integer, chytiť, že celé číslo, a potom, ľubovoľne, máme while, ktorý sa práve chystá decrement i, kým je to rovná 10. Poďme sa len predpokladať, že som zadanie celé číslo väčšie ako 10. Takže decrement aj tak, aby to rovná 10. A potom máme ďalšie while že, keď som sa nerovná 0, máme bude decrement aj o 3. Takže ak uvidíte zámer chyby tu je to, že tento bude decrement aj na byť 10, a potom to, kým slučka úbytok aj z 10 na 7, až 4 na 1, k negatívnemu 2, aby negatívne 5, a tak ďalej, na negatívne nekonečna, pretože aj bude Nikdy vlastne rovná 0. A potom na konci tohto programu, máme funkciu foo, ktorý je ide o tlači, že i Tak to je krátka a triviálne program a chyba je zrejmé, zvlášť potom, čo som povedal to, čo chyba je. Ale zámer tu je dobre, to by mohlo skutočne vyzerať ako niektoré z vašich riešenie od chamtivý od posledného problém nastaviť, a možno to mať niektoré nekonečná slučka v programe, a nemáte tušenie, čo to spôsobuje. Takže veľmi užitočné pre ladenie technika je jednoducho pridať printfs celého kódu. Takže tu chcem printf mimo Prvý cyklus while. A tu chcem printf, a ja si len vytlačiť i Budem ešte urobiť ako prvé, zatiaľ čo slučka, i Vonku, druhý cyklus while. Opäť, tlačiť vnútri odtiaľ, hodnota i A poďme spustiť to. Takže bodka lomítko ladenie. Zadajte celé číslo. Poďme urobiť 13. A boom. Vidíme, že sme nekonečné smyčkování vnútri druhej, zatiaľ čo slučky. Takže teraz vieme, čo je chyba. Ale printf ladenie je úplne skvelý, ale akonáhle sa vaše programy sa dlhšie a zložitejšie, existujú sofistikovanejšie riešenie ako veci pracujú. Takže poďme odstrániť všetky tieto printfs. A poďme sa uistite, ja nie niečo pokaziť. OK. Takže program, budeme predstaviť sa nazýva GDB, GNU Debugger. No, vlastne, poďme odstrániť ladenie pre druhej, a aby ladiť znova. No, vlastne prvá, dobrá lekcia V argumenty príkazového riadku. Všimnite si, že tento Clang príkaz, ktorý je zostavovanie všetko je odovzdaný na príkazovom riadku, tieto argumenty príkazového riadku. Tak, ako presne sa bude používať argumenty príkazového riadku, ako sme predtým, a ako budete v pset 2, to je ako Clang je ich použitie. Tak zistíte, že to prvý príznak, pomlčka ggdb3, čo že to hovorím, kovový zvuk, mali by ste skompilovať tento súbor s zámer, že sme sa nakoniec je potrebné ju ladiť. Takže ak budete mať tú vlajku, potom môžeme GDB ladenie. A to bude otvárať GNU Debugger. Takže tam je veľa príkazov že je potrebné si zvyknúť. Prvý z nich, že budete pravdepodobne ihneď potrebujete, je Run. Takže to, čo je spustiť robiť? Bude to začiatok nášho programu. Tak utekaj, začína program, program pýta sa nás na celé číslo, 13. A potom je to nekonečná smyčkování ako Očakáva sa, s výnimkou som odstránil printfs, takže nemáme ani vidieť. Vystúpil normálne. Oh. Je možné, že je to všetko zabalené cesta okolo, späť na - ignorovať to. Predpokladajme, že nevystúpil normálne. K dispozícii je zložité odpoveď. Takže teraz, že to nie je moc užitočné. Tak práve beží náš program vnútri Tento debugger sa nám nepomôže v žiadnom spôsobom, pretože sme mohli práve urobil bodka lomítko ladenie zvonku GDB. Takže jeden príkaz, ktorý pravdepodobne budete - a ja budem skončiť to. Ovládanie-d alebo ukončiť, a to ako prácu. Takže poďme otvoriť ho znova. Ďalší príkaz, ktorý budete pravdepodobne okamžite chcete zvyknúť si je prestávka. Takže budeme rozbiť na hlavnú teraz, a potom budem vysvetľovať, že. No, tu vidíme my nastaviť zarážku na tomto riadku debug.c. Takže to, čo zlom znamená, že keď som typ beh, program bude pokračovať v jazde, až kým Udrel som zarážku. Takže, keď som narazila na príkaz Spustiť, spustí program, a potom sa zlomí, akonáhle to vstupuje do hlavnej funkcie. Prestávka hlavné bude niečo ste celkom bežne robiť. A teraz vám predstaviť niektorých ďalších príkazov. Všimnite si tu, že hovorí my zlomil na riadku 11, ktorý je printf, zadajte celé číslo. Takže príkaz Ďalšie bude, ako ideme na ďalší riadok kódu. To sa deje, aby sme mohli kroku v našej programovej riadok po riadku. Takže nabudúce. Teraz linka 12, ideme získať celé číslo. Ďalšie. A ak ste jednoducho stlačiť Enter znova, bude to opakovať posledná vec, ktorú urobil. Takže nemám potrebu písať Ďalšie zakaždým. Takže zadať číslo, 13. Takže teraz, linka 14, a zároveň aj väčší ako 10, a ja budem robiť ďalej. A vidíme, že budeme decrement i Takže budeme aj decrement znova. Takže teraz, ďalšie užitočné príkaz Tlač. Takže tlače sa bude tlačiť hodnota premennej. Poďme sa vydať na hodnotu premennej i Poďme tlačiť i Bude to povedať, že som ich 11. Teraz sme znovu na Ďalšie a zároveň i je väčší než 10. Tak som to ešte väčší než 10, pretože je to 11. i mínus mínus. Poďme si vytlačiť aj znova. Ako sa dalo očakávať, je to 10. Takže teraz, nabudúce. Bude to späť do stavu, aj je vyšší ako 10, ale ja ich teraz 10, tak že to nie je väčšie ako 10, takže očakávame, že to vypadnúť z cyklu while. A teraz sme pod tento riadok kódu. A ďalší príkaz, List, sa práve chystá Pre zobrazenie predchádzajúcej a ďalšie pár riadkov kódu, v prípade, že ste stratili sami. Takže sme jednoducho vystúpil tento while, a teraz sme vstúpili do tejto kým slučka, linka 18. Takže keď som sa nerovná 0. A ďalšie, aj rovná aj mínus 3, a my budeme Všimnite si, tak to jednoducho ďalej. A môžeme vytlačiť aj Každý príkaz druh má klávesové skratky. Tak p je skratka pre tlač. Takže môžeme p i Len držte n, alebo aby robil Ďalšie. Vytlačiť aj znova. Vidíte, teraz je to negatívny 167. Takže to bude trvať večne, ale nie naozaj navždy, pretože ste práve videli, je bude skutočne skončí na nejakom mieste. Tak to je začiatok GDB. Ale poďme urobiť ešte jednu vec v GDB. Uh, ladenie. Takže, v tomto konkrétnom prípade, nekonečná slučka sa stalo, že vo vnútri hlavnou funkciou. A teraz, jednoducho prijať, že som bude pohybovať nekonečnú slučku do funkcie foo. Len si uvedomiť, že na konci tohto Program, dobre, to bolo pôvodne volá foo, ktorý bol práve bude tlačiť i Ale teraz sme volá foo, ktorý je bude decrement som, až je to 0, a vytlačiť túto premennú. OK. Okrem toho, že. Vykonajte ladenie. A teraz, gdb ladenie. OK. Takže keď som spustiť potom sa nebudem byť schopný skutočne krokovať my programu riadok po riadku. Takže poďme rozbiť na hlavnej, a potom zadajte príkaz Spustiť. Tak choď cez to, printf, zadajte číslo, dostanete číslo, 13. Takže budeme držať znižujúce kým aj je väčší než 10. Potom ideme do prepadnúť while, a dostať sa do vedenia - poďme otvoriť v samostatnom okne. Tak sme zmenšená, kým som bol už nie väčší ako 10, a potom sme sa nazýva funkcia, foo. Takže to, čo sa stalo, akonáhle som narazila Funkcie foo, tak som zavolal foo, a Potom som už nemal kontrolu nad GDB. Takže akonáhle som narazila Ďalšie na tomto riadku, veci pokračuje, kým sa to stalo, kde program vystúpil, keď - predpokladať, že neexistovala nakoniec. Videl si, že pauza na chvíľu hoci. Tak prečo som stratil kontrolu nad Program v tomto bode? No, keď som typ vedľa, že ide doslovný ďalší riadok kódu, ktorý bude vykonávať. Takže po riadku 21, ďalší riadok kódu že bude vykonávať je linka 22, čo znamená, že opustenie hlavné. Takže nechcem, aby len tak na ďalší riadok kódu. Chcem ísť do funkcie, foo, a potom tiež krokovať tieto riadky kódu. Takže to, že máme alternatívu. Poďme prestať to znova. Prestávka hlavné. Uh, 1, ďalší, ďalší, 13, ďalšie, ďalšie, ďalšie, starostlivo, predtým, než sme narazili riadok foo. OK. Takže teraz sme na riadku 21, kde hovoríme foo. Nechceme písať ďalej, pretože to bude len volanie funkcie foo, a prejsť na ďalší riadok kódu. Čo chceme použiť, je krok. Takže tam je rozdiel medzi krokom a ďalší, kde krok kroky do fungovať, a ďalšie jede cez funkciu. Je to len robí celistvosť funkcie a udržuje v chode. Takže krok sa chystá priviesť nás do funkcie foo. A vidíme tu, teraz, sme späť na Tento while to, teoreticky, bude pokračovať navždy. A ak ste hit krok, keď to nie je ani funkcie pre volanie, potom je to identické Ďalšie. Takže je to len vtedy, keď ste na riadok, ktorý volá funkciu, ktorá Step sa bude líšiť od Next. Takže krok nám prinesie tu. Krok, krok, krok, krok, krok, krok, a Budeme sa nekonečná slučka navždy. Takže ste mohli zvyknúť, že vaše spôsob identifikácie nekonečnej slučky, je len držať túto klávesu Enter na vidieť, kde narazíte. Existujú lepšie spôsoby, ako to urobiť, ale teraz, že je úplne dostačujúce. A štylisticky, aby zodpovedal štýlu 50, mal som to urobil. OK. Takže jeden posledný príkaz predstaviť. Dobre, poďme gdb ladenie palcov Takže namiesto toho, lámanie na hlavnú, keď som poznať funkciu foo je tiež problém, potom by som mohol mať len povedal, rozbiť na foo, namiesto toho. Povedzme, že som sa rozbiť na hlavné aj foo. Takže si môžete nastaviť toľko zarážky ako budete chcieť. Keď som sa napísať slovo pes, to sa deje zastaviť na - ooh, poďme překompilovat, pretože Zmenil som veci. Uvidíte tento riadok, varovanie, zdroj súbor je novší ako spustiteľného súboru. Takže to znamená, že som išiel sem a zmenil to, aby zodpovedali štýlu 50, ale ja som překompilovat programu. Takže GDB ma vedomý. Odídem, aby ladiť znova, hit gdb ladenie. OK. Takže teraz, späť k tomu, čo som robil. Prestávka hlavné, prerušenie foo. Teraz, keď som spustení programu, takže je to bude pokračovať, kým hity breakpoint. To breakpoint sa stane byť prvý v hlavnej. A teraz, namiesto toho, aby robil ďalšie, ďalšie, ďalšie, ďalšie, ďalšie, až som narazila foo, som môžete písať aj naďalej, čo bude pokračovať kým nenarazíte na ďalšiu zarážku. Musím najprv zadať celé číslo. Pokračovať bude pokračovať, kým som trafil ďalšie breakpoint, čo je skutočnosť, že funkcie foo. Takže Run pobeží, kým nenarazíte breakpoint, ale stačí len zadať príkaz Spustiť, keď ste spustenie programu, a potom, od tej doby, je to aj naďalej. Keby som to urobil rozbiť hlavné a potom bežal, bude to zlomiť na hlavné, a potom pokračovať. Vzhľadom k tomu, nemám bod zlomu na foo, Zadajte celé číslo, potom teraz som nebude rozbiť na foo. Je to jednoducho bude nekonečno slučky, kým to. OK. Tak to je úvod do GDB. Tie by mali začať používať vo vašich problémov sád. To môže byť veľmi užitočné, identifikovať chyby. Ak ste vlastne len, line-by-line, prejdite prostredníctvom kódu, a porovnať, čo je vlastne deje s tým, čo môžete očakávať aby sa to stalo, potom je to celkom ťažko prehliadnuť vaše chyby. OK. Takže minulý týždeň David vyrastal v tomto tajný kľúč kryptografia veci pre prvýkrát, kedy nechceme Heslá len byť uložené na našich Počítač v niektorých textového súboru, kde niekto môže prísť a len otvorte ju a prečítajte si ich. V ideálnom prípade by sa šifrované nejakým spôsobom. A Problem Set 2, budete sa zaoberať s jedného spôsobu šifrovanie, alebo, no, dve metódy, ale nie sú tak veľké. Ak máte robiť hacker vydanie, ste tiež bude rokovania s dešifrovanie nejaké veci. Takže otázka teraz je, dobre, a to aj v prípade, Máme najsilnejšie šifrovanie algoritmus na svete, ak sa rozhodnete konkrétne chudobné heslo, potom to vám nepomôže moc, pretože ľudia budú môcť na to prísť. Aj keď videl zašifrovaný reťazec a vyzerá to, že neporiadok z odpadkov to znamená, že nič pre nich, v prípade, že ešte stačí vyskúšať niekoľko hesiel na to prísť, potom nie sú príliš bezpečné. Takže sledujete video, ktoré je tento bod. [PLAYBACK] -Prilba, vám diabol. Čo sa deje? Čo robíte s mojou dcérou? -Dovoľte mi predstaviť brilantné mladý plastický chirurg, Dr Phillip Schlotkin, najväčší nos práce človek v celej vesmír, a Beverly Hills. -Vaša Výsosť. -Nose práce? Nerozumiem. Ona už mala nos. Bol to sladký šestnásť prítomný. -No. Nie je to to, čo si myslíte. Je to oveľa, oveľa horšie. Ak nechcete mi dať kombinácii so vzduch štít, Dr Schlotkin bude dať svoju dcéru späť svoj starý nos. -No. Kde si to zobral? -Dobre. Poviem. Poviem. Nie, tati. Nie, to nesmieš. -Máš pravdu, má drahá. Budem si ujsť nové nos. Ale ja som sa mu to povedať kombináciu, bez ohľadu na to, čo. -Veľmi dobre. Dr Schlotkin, robiť to najhoršie. -Rado sa stalo. [NÁSTROJE SÚ nabrúsené] -No. Počkajte. Počkajte. Poviem. Poviem. Som vedel, že to bude fungovať. Dobrá. Dajte mi ho. -Kombinácia je jedna. -One. -One. -Two. -Two. -Two. -Tri. -Tri. -Tri. -Four. -Four. -Four. -Five. -Five. -Five. -Tak kombinácia je, dva, tri, štyri, päť. To je ten najhlúpejší kombinácia Čo som kedy v živote počul. To je ten druh vecí idiot bude mať na jeho batožine. -Ďakujem vám, Vaša Výsosť. -Čo si to urobil? Som vypol múru. -Nie, nie. Si vypol celý film. -Musel som stlačil zlé tlačidlo. -No, dal ju späť. Vložte film späť. -Áno, pane. Áno, pane. -Poďme, Arnold. No, Gretchen. Samozrejme, že vieš, že som to ešte musieť účtovať za to. [END VIDEO PLAYBACK] ROB BODEN: Dobre. Takže teraz, že sme už hovorili o bezpečnosť v niektorých ohľadoch, pekná malý filmový plagát, takže v posledných rokoch dní, tieto problémy s NSA sledovanie všetko. To môže byť ťažké cítiť, ako ste vy mať nejaký súkromia v on-line svete, aj keď som nevedel si väčšina detailov PRISM. Takže pohybuje nad PRISM, nejdeme je potrebné o tom hovoriť, teraz premýšľať o svojom notebooku. Tak tu, chcem prejsť k môjmu skutočnému účtu, s mojím malým tučniakom. Takže mám nastavené heslo, a že heslo je, čo chcem, aby to bolo. Ale pamätajte si, že to, čo som prihlásenie v s, takže to login výzva, je nejaký program. Je nejaký program, ktorý bol napísal nejakú osobou. A tak, že osoba, ak sú zvlášť nebezpečný, mohli už bolo povedané, v poriadku, takže ak heslo že som sa vstúpiť, je rovná môj aktuálne heslo, alebo je to rovnaká na niektoré špeciálne hesla - David je úžasný, alebo tak niečo - nechajte ich ďalej Takže škodlivý programátor môže mať prístup ku všetkým vašim Mac, alebo Windows, alebo tak niečo. Takže to nie je moc obavy, pretože, Myslím, že je to login programu , Ktorý je dodávaný s OS X, stovky alebo tisíce ľudí, ktorí majú preskúmať tento kód. A tak, ak v kóde niekde, ste povedať, či tento reťazec rovná rovná David je úžasný, login, potom niekto bude, rovnako ako, počkajte. To nie je v poriadku. To by nemalo byť tu. Takže to je jeden spôsob, ako dostať veci byť celkom bezpečné. Ale myslieť aj programov že píšete. Povedzme, že ste napísal program login. Tak to login program, ktorý ste napísal, tak samozrejme, že ste dobrý programátor. Nebudeš dať akýkoľvek škodlivý ak x rovná sa rovná David je úžasné do vášho kódu. Ale tento program, čo si použiť skompilovať tento program? Niečo ako Clang. Takže to, čo v prípade, že osoba, ktorá sa stalo napísať zvonenie špeciál prejímané v Clang niečo podobné, keď som zostavovaní prihlásiť programu, zadajte tento kód do prihlasovacieho programu, ktorý hovorí, ak x sa rovná rovná Dávid je úžasné? Takže nie je ešte dosť, ale máme rovnaký vydávať tu, kde kovový zvuk, dobre, tisíce, ak nie desiatky tisíc ľudia, sa pozrel na Clang, majú Pozrel sa na svoje riadkov kódu a povedal, v poriadku, nič zlého tu. Je zrejmé, že nikto sa robí nič to škodlivý. Ale to, čo je zvonenie sám, ako, čo keď som zostaviť zvonenie? Čo keď mám nejaký kompilátor, ktorý zostavuje zvonenie, ktoré vloží do Clang Tento špeciálny hack, ktorý hovorí, všetko v poriadku, keď som sa zostaviť zvonenie, potom spustiteľný by som sa mala špeciálne vyzerať vnútri prihlasovacie programu a vložkou toto heslo, rovná sa rovná Dave je úžasné? Takže si pamätajte, že váš kompilátor sám musí byť zostavený na nejakom mieste. Takže či to, čo sa rozhodnete zostaviť zvonenie s, je sám o sebe škodlivý, potom by mohol byť zaskrutkovaný celý cesta v rade. Takže tu máme Ken Thompson a Dennis Ritchie. Tak toto je kultový fotografie. Dennis Ritchie je na pravej strane. Je major - skoro napísal C. Tak môžete ďakujem mu za túto triedu. Ken Thomson je na ľavej strane. Dvaja z nich v podstate napísal UNIX. No, oni boli hlavnými prispievateľmi v Unixu. Tam boli niektoré ďalšie. Takže Ken Thompson, na nejakom mieste, vyhráva Turing Award. A ocenenie Turing, vždy som počul je odvolával sa na túto cestu, je to Nobelova cena za počítačovej vedy. Takže na Turing Award, má na dať jeho ďakovnej reči. A dáva tomuto veľmi slávny prejav Teraz, s názvom Úvahy o dôverujúci Dôvera, ktorú sme spojili Ak chcete na stránkach kurzu. A v tejto reči, on hovorí, všetko v poriadku, tak som napísal UNIX, a teraz všetci si ľudia používate UNIX. Teraz si uvedomte, že dnes je Linux priamy potomok UNIX. OS X priamo používa UNIX. Windows nie je tak moc, ale veľa myšlienok boli prevzaté zo systému UNIX. Takže pôjde až do fázy, a hovorí, v poriadku, som napísal UNIX. A rovnako tak vy viete, že som môcť prihlásiť do každej jeden z vašich počítačov. Pretože som si jeden z týchto špeciálnych ak x rovná sa rovná Ken Thomson je úžasné, potom som dovolené sa prihlásiť. Takže ľudia sú ako, no, Ako si to urobil? Pozreli sme sa na prihlasovacie programe a nič tam. Je to ako, no, som upravil kompilátor prihlásiť prihlasovacie programu takže prihlásenie Program teraz bude mať že x sa rovná rovná Ken Thompson je úžasné. A oni hovoria, dobre, že to nie je pravda. Pozeráme sa na kompilátora, a Kompilátor nemá žiadne riadky Kód takto. Je to ako, OK, ale to, čo ste kompilácia kompilátora sa? A myslí si, a je to, ako, no, Ja som ten, kto ti dal kompilátor ktorú používate pre kompiláciu kompilátora, tak ste kompiláciu kompilátor, ktorý sama o sebe je škodlivý, a bude prerušiť program login. Takže v podstate, v tomto bode, tam je žiadny spôsob, ako by ste sa mohli pozrieť na zdroje Kód prihlasovacie programu vidieť, čo je zle. Dalo by sa dokonca pozrieť do zdrojový kód kompilátora vidieť, čo je zle. Budete musieť pozrieť na stroji kód, skutočný binárne zo zostavený kompilátor vidieť, počkajte, to riadky kódu by tu byť. Ale Ken Thompson to vzal jeden krok ďalej a povedal, dobre, tam sú Tieto špeciálne programy, ktoré skutočne pomôže vám čítať binárne programov, a tak ak niekto používa tento program, čítať binárne, by vidieť tieto riadkov kódu. Bol upravený tie programy, ktoré hovoria, všetko Dobrá, keď sa pozeráte na kompilátor, neukazujú to najmä sada binárne. Takže potom je potrebné vziať, že krok ďalej a v podstate, ktoré by mohli mať prijaté viac úrovní nepriame, a na nejakom mieste, nikto ich vlastne bude kontrola. Takže poučenie z príbehu je, že ste nebude písať Zvonenie v tejto triede. Budeš používať lezenie Zvonenie veľa v tejto triede. Pre všetky viete, Clang je škodlivý program, ktorý je sabotovať každý jediný program, ktorý som kedy zostavil. A nechať na tom veľmi neblahé na vedomie, že sa uvidíme v stredu. [APPLAUSE] Reproduktora 2: V ďalšom CS50. SPEAKER 3: Neopováž sa hovoriť, že. Môžete to urobiť. Vy ste to urobil skôr, môžete to urobiť dnes, môžete to urobiť zajtra. Vy ste robil to niekoľko rokov. Stačí ísť tam a urobiť. Môžete to urobiť. [MUSIC PLAYBACK]