1 00:00:00,000 --> 00:00:02,270 [Powered by Google Translate] [2. týden, pokračování] 2 00:00:02,270 --> 00:00:04,220 [David J. Malan, Harvard University] 3 00:00:04,220 --> 00:00:06,880 [To je CS50. - CS50.TV] 4 00:00:06,880 --> 00:00:10,990 Dobrá. To je CS50, a to je konec 2. týden. 5 00:00:10,990 --> 00:00:14,410 Pokud očekáváte, že hlad po této době zítra, 6 00:00:14,410 --> 00:00:18,620 vím, že budeme svolávat jako malé skupiny zítra, ve čtvrtek, 13:15. 7 00:00:18,620 --> 00:00:21,360 Tam je to URL zde, pokud chcete RSVP. 8 00:00:21,360 --> 00:00:26,740 Prostor je omezený, proto prosím omluvte, pokud byl formulář vyplněn až v době, kdy vyplníte na to. 9 00:00:26,740 --> 00:00:29,300 Další URL, ale, že by mohlo být zajímavé je to. 10 00:00:29,300 --> 00:00:32,369 V téměř za měsíc, kurz se bude k dispozici 11 00:00:32,369 --> 00:00:36,890 všechny obecněji přes EDX, přes které lidé na internetu budou moci sledovat spolu, 12 00:00:36,890 --> 00:00:39,380 zapojit se do kurzu poměrně aktivně, ve skutečnosti. 13 00:00:39,380 --> 00:00:42,270 Budou používat CS50 Appliance a CS50 Diskutovat 14 00:00:42,270 --> 00:00:45,490 a většina z různých softwarových nástrojů, které jsme již používali tento semestr. 15 00:00:45,490 --> 00:00:48,710 A jednou z iniciativ bychom chtěli, aby se na jako experiment v letošním roce 16 00:00:48,710 --> 00:00:51,930 je vidět, kolik obsahu můžeme přeložit 17 00:00:51,930 --> 00:00:53,960 do jiných mluvené a psané jazyky. 18 00:00:53,960 --> 00:00:57,500 Takže pokud byste mohli mít zájem o účast v tomto projektu 19 00:00:57,500 --> 00:01:02,270 kdy budeme poskytovat anglické přepisy a titulky pro kurz je přednáškách 20 00:01:02,270 --> 00:01:05,450 a šortky a semináře a profily a podobně, 21 00:01:05,450 --> 00:01:08,200 pokud mluvíte plynule nebo psát plynně nějaký jiný jazyk, 22 00:01:08,200 --> 00:01:12,290 rádi bychom vtáhnout vás do tohoto projektu, kdy budete mít na jednom nebo více videí, 23 00:01:12,290 --> 00:01:15,200 převést je do jazyka znáte docela dobře. 24 00:01:15,200 --> 00:01:18,700 >> Chcete-li dát vám pocit rozhraní, tam je to web-based uživatelské rozhraní 25 00:01:18,700 --> 00:01:22,090 že budeme používat, že vytvoří v podstatě uživatelské rozhraní, jako je tento. 26 00:01:22,090 --> 00:01:24,290 Toto bylo mi učil některé Halloween před, 27 00:01:24,290 --> 00:01:27,390 a na pravé straně tam v černém vedle těchto časových razítek, 28 00:01:27,390 --> 00:01:31,210 uvidíte různé věci, které vyšly z mých úst, že den, 29 00:01:31,210 --> 00:01:34,850 a pak pod ním budete moci převést do nějakého jiného jazyka 30 00:01:34,850 --> 00:01:38,690 přesně to, co je mapování mezi, v tomto případě, angličtina a, řekněme, španělsky. 31 00:01:38,690 --> 00:01:40,440 Takže je to vlastně velmi uživatelsky příjemný nástroj. 32 00:01:40,440 --> 00:01:43,370 Můžete přetáčet vpřed velmi rychle pomocí klávesových zkratek. 33 00:01:43,370 --> 00:01:47,490 Takže pokud byste chtěli zúčastnit tohoto experimentu a mít vaše slova vidět a číst 34 00:01:47,490 --> 00:01:51,850 by potenciálně tisíce lidí tam, prosím, neváhejte se zúčastnit. 35 00:01:51,850 --> 00:01:54,350 Jedno slovo o kotě od pondělí. 36 00:01:54,350 --> 00:02:00,350 Lest jsme poslali příliš děsivé zprávy, si uvědomit, že, jak úřední hodiny naznačují 37 00:02:00,350 --> 00:02:03,300 a jak částí naznačují, konstrukce předmětu je velmi 38 00:02:03,300 --> 00:02:07,360 k studenti spolupracovat a mluvit do práce přes problémové soubory 39 00:02:07,360 --> 00:02:11,260 a problémy společně, a opravdu linka právě přichází do, 40 00:02:11,260 --> 00:02:16,010 znovu, měl práci, kterou nakonec odeslat být vaše vlastní. 41 00:02:16,010 --> 00:02:18,860 A tak docela upřímně, v úředních hodinách, že je to úplně normální, 42 00:02:18,860 --> 00:02:22,240 je to úplně očekávat ani, bude chatování s nějakým přítelem vedle vás. 43 00:02:22,240 --> 00:02:24,370 >> Jestliže on nebo ona se potýká s nějakým tématem a jste rádi, 44 00:02:24,370 --> 00:02:27,940 "No, dobře, dovolte mi, abych vám pohled některých řádek kódu, který jsem napsal," to je v pořádku, 45 00:02:27,940 --> 00:02:31,250 že se stane, a to je velmi příznivé, myslím, s procesem učení. 46 00:02:31,250 --> 00:02:36,750 Pokud je linka dostane přešel je, když hlava je trochu nakloněná sem na příliš mnoho sekund 47 00:02:36,750 --> 00:02:41,160 nebo min, které opravdu byly právě odblokování příležitost pro svého přítele, 48 00:02:41,160 --> 00:02:44,160 a jistě, kdy se věci vyměňují prostřednictvím e-mailu a Dropbox a podobně, 49 00:02:44,160 --> 00:02:45,640 tam taky je linka. 50 00:02:45,640 --> 00:02:48,620 Takže všemi prostředky cítit pohodlně a cítí se vyzývají, aby chatovat s přáteli 51 00:02:48,620 --> 00:02:52,810 a spolužáci o psets a více a jen si uvědomit, že to, co jste nakonec předloží 52 00:02:52,810 --> 00:02:57,340 by měl opravdu být produkt vaší tvorby a ne někdo jiný. 53 00:02:57,340 --> 00:03:00,490 A tak jeden z domény specifických problémů pro pset2, 54 00:03:00,490 --> 00:03:04,740 který přijde pozdě zítra večer, je ponořit se do světa kryptografie, 55 00:03:04,740 --> 00:03:08,970 která je umění šifrování nebo kódování informace, 56 00:03:08,970 --> 00:03:12,600 a to nakonec se týká světa bezpečnosti. 57 00:03:12,600 --> 00:03:16,560 Nyní, bezpečnost pro většinu z nás přichází v podobě poměrně světských mechanismů. 58 00:03:16,560 --> 00:03:19,050 Každý z nás má uživatelská jména a hesla, 59 00:03:19,050 --> 00:03:23,450 a každý z nás má velmi špatné uživatelská jména a hesla, s největší pravděpodobností. 60 00:03:23,450 --> 00:03:28,240 >> Pokud je heslo stejné na několika webových stránkách, že to asi není nejlepší nápad, 61 00:03:28,240 --> 00:03:30,070 jak budeme diskutovat k semestr konci. 62 00:03:30,070 --> 00:03:34,720 Pokud heslo je napsané na lepicí poznámku - není vtip - na vašem monitoru, 63 00:03:34,720 --> 00:03:38,350 To také není nutně nejlepší design, ale docela běžným jevem. 64 00:03:38,350 --> 00:03:42,470 A pokud si nejste s použitím kryptografie k šifrování hesel, 65 00:03:42,470 --> 00:03:44,210 jsou obzvláště zranitelné. 66 00:03:44,210 --> 00:03:47,270 Takže pokud si myslíte, že jste byl výborný chytrá mající skrytou dokument aplikace Word 67 00:03:47,270 --> 00:03:49,910 někde na pevném disku, který má všechna vaše hesla 68 00:03:49,910 --> 00:03:53,670 ale je to ve složce, která nikdo to bude vypadat v, že příliš není moc bezpečné mechanismus. 69 00:03:53,670 --> 00:03:56,990 A tak to, co pset2 představí je toto umění kryptografie 70 00:03:56,990 --> 00:04:02,010 a míchat informace tak, že věci jako hesla jsou bezpečnější. 71 00:04:02,010 --> 00:04:05,790 Kontext je, že s nezajištěnými údajů 72 00:04:05,790 --> 00:04:07,930 přichází příležitost k šifrování ho a škrábat ho. 73 00:04:07,930 --> 00:04:11,470 A tak to, například, je příklad šifrované zprávě. 74 00:04:11,470 --> 00:04:14,700 To vlastně říká, že něco v angličtině, ale to zjevně není zcela zřejmé. 75 00:04:14,700 --> 00:04:18,279 A my přijdeme kruh dnes šprýmaři odděleně, co to tajný vzkaz zde. 76 00:04:18,279 --> 00:04:23,490 Ale v reálném světě počítačů, věci se ani nepodíval, jako by mohly být anglické věty. 77 00:04:23,490 --> 00:04:28,430 Například, to je to, co můžete najít na standardního Linux nebo Mac nebo počítač se systémem UNIX 78 00:04:28,430 --> 00:04:32,070 v souboru, který byl kdysi nazýván soubor s hesly. 79 00:04:32,070 --> 00:04:34,200 >> V současné době je to už se stěhoval do jiných míst. 80 00:04:34,200 --> 00:04:39,210 Ale když se podíváte na správném místě v systému, uvidíte nejen své uživatelské jméno 81 00:04:39,210 --> 00:04:43,400 nebo jiných lidí na systému, ale uvidíte šifrované verzi své heslo. 82 00:04:43,400 --> 00:04:47,980 Opravdu, slovo krypta se navrhuje, aby následující věci jsou šifrována, 83 00:04:47,980 --> 00:04:52,680 a tato série zdánlivě náhodných písmen a znaků a čísel a tak dále 84 00:04:52,680 --> 00:04:56,480 lze dešifrovat pouze obecně znát nějaké tajemství - 85 00:04:56,480 --> 00:04:58,840 Tajné slovo, tajné číslo - 86 00:04:58,840 --> 00:05:03,160 a tak opravdu, umění kryptografie v konečném důsledku se scvrkává věřit nějakého druhu 87 00:05:03,160 --> 00:05:05,650 a věděl něco, co někdo jiný nemá. 88 00:05:05,650 --> 00:05:10,090 Takže budeme zkoumat to v trochu podrobněji dnes v PSet přijít. 89 00:05:10,090 --> 00:05:12,200 A nyní slovo na Pass / Fail. 90 00:05:12,200 --> 00:05:15,360 Zvlášť když někteří z vás se ponořila do pset1, spotřebiče, 91 00:05:15,360 --> 00:05:19,080 a zcela nový svět pro sebe, uvědomit si, že frustrace a zmatek 92 00:05:19,080 --> 00:05:21,700 a jen technické potíže jsou poměrně lze očekávat, 93 00:05:21,700 --> 00:05:24,180 zejména s prvním Pset, kde je to jen tolik nové, 94 00:05:24,180 --> 00:05:27,730 jen seznámení s ls a cd a všechny tyto tajemné příkazy 95 00:05:27,730 --> 00:05:33,050 a nové prostředí, a to je oddělená od skutečného materiálu a programování sám. 96 00:05:33,050 --> 00:05:36,940 Takže si uvědomit, že i tam jsou určitě úřední hodiny, které existují jako podpůrné struktury. 97 00:05:36,940 --> 00:05:38,880 >> Sekce začít letos v neděli. 98 00:05:38,880 --> 00:05:42,960 Ale co je nejdůležitější, pokud máte pocit, prostě, že to není svět pro tebe, 99 00:05:42,960 --> 00:05:44,710 si uvědomit, že je to opravdu jen nějakou dobu trvat. 100 00:05:44,710 --> 00:05:48,600 A byl to ne pro tuto příležitost před lety pro mne vezme třídy vyhovuje / nevyhovuje, 101 00:05:48,600 --> 00:05:50,990 upřímně, nikdy bych si dokonce nastavit nohu ve třídě. 102 00:05:50,990 --> 00:05:53,690 A můžete změnit až do, řekněme, pátý pondělí kurzu, 103 00:05:53,690 --> 00:05:58,280 takže pokud jste na okraji teď si uvědomit, že spíše než hlava do některých jiných vod dohromady, 104 00:05:58,280 --> 00:06:01,260 si jistě považovat jen změnou k přijetí / zamítnutí. 105 00:06:01,260 --> 00:06:04,570 Opět platí, že to není opravdu to kultura zde na Harvardu braní věcí vyhovuje / nevyhovuje 106 00:06:04,570 --> 00:06:08,670 protože všichni opravdu chce dosáhnout lepších výsledků, nebo, 107 00:06:08,670 --> 00:06:11,130 ale upřímně řečeno, je to skvělý způsob, jak se snaží něco 108 00:06:11,130 --> 00:06:16,720 které nemusí být obeznámeni s vámi, a vy skončíte dělat, ve většině případů, docela dobře, 109 00:06:16,720 --> 00:06:18,210 možná hodně k svému překvapení. 110 00:06:18,210 --> 00:06:20,980 A v Konkrétněji, co si myslím, vyhověl / nevyhověl obecně dělá, 111 00:06:20,980 --> 00:06:22,940 zejména pokud jste si mohli zkušenosti s pset0, 112 00:06:22,940 --> 00:06:26,560 když dáte v 10 hodin, 15 hodin, 25 hodin do nějakého PSet 113 00:06:26,560 --> 00:06:29,920 a ty jsi prostě bouchání hlavou proti zdi a je to čím dál Super pozdě v noci 114 00:06:29,920 --> 00:06:33,950 ale vy jste vzali PSet 90% cesty a vy prostě nemůžete přijít na jednu věc, 115 00:06:33,950 --> 00:06:36,520 vyhověl / nevyhověl opravdu bere zmírnilo třídy, jako je tato, 116 00:06:36,520 --> 00:06:39,100 kde si můžete nějak šťastně říká: "Dobře, já vím, že to není dokonalé, 117 00:06:39,100 --> 00:06:42,350 ale pracoval jsem prdel na to, jsem docela spokojený s tím, kde to skončilo, " 118 00:06:42,350 --> 00:06:44,850 a že bude splňovat očekávání vyhovuje / nevyhovuje. 119 00:06:44,850 --> 00:06:47,540 Takže se mějte na paměti, že. Dobrá. 120 00:06:47,540 --> 00:06:50,520 >> Takže ti z vás, kteří se usilovně snaží využít Harvardskou univerzitu Wi-Fi, 121 00:06:50,520 --> 00:06:54,780 vím, že je tu CS50 SSID, Wi-Fi připojení, vznášející se kolem 122 00:06:54,780 --> 00:06:56,490 že byste mohli mít větší štěstí pro. 123 00:06:56,490 --> 00:07:00,130 Je to trochu paradoxní, že heslo pro to, pokud byste chtěli zkusit připojit k tomuto 124 00:07:00,130 --> 00:07:08,350 pro lepší rychlosti - a dejte nám vědět, pokud to není lepší - je 12345, celou cestu až do 8 125 00:07:08,350 --> 00:07:10,910 protože 8 je bezpečnější než 5. 126 00:07:10,910 --> 00:07:16,910 Takže pokud potřebujete Wi-Fi hesla, připojit se k CS50 bezdrátově tady, 12345678, 127 00:07:16,910 --> 00:07:20,380 a příspěvek na CS50 Diskutovat pokud máte stále přerušované problémy s připojením, 128 00:07:20,380 --> 00:07:25,420 a necháme pravomoci, které budou znát pro tento prostor. Dobrá. 129 00:07:25,420 --> 00:07:32,230 Tak rychlý teaser, zejména pro ty z vás, kteří jsou ventilátor chlapců a dívek všech věcí Apple. 130 00:07:32,230 --> 00:07:37,460 To, co jsem vyhrabal z několik let zpět byla tento soubor zde, iUnlock.c, 131 00:07:37,460 --> 00:07:39,930 jen trochu, aby konkrétnější a složitější 132 00:07:39,930 --> 00:07:42,560 některé z více základních programů v jazyce C jsme psali. 133 00:07:42,560 --> 00:07:46,910 Tak jsem otevřel tento soubor, iUnlock.c. Je k dispozici na stránce přednášky pro dnešek. 134 00:07:46,910 --> 00:07:49,810 Na levé straně se zobrazí dlouhý seznam funkcí. 135 00:07:49,810 --> 00:07:53,230 Takže ten chlapík, který napsal tento sepsal mnoho funkcí, víc než jen hlavní. 136 00:07:53,230 --> 00:07:57,340 Použil spoustu knihoven tady, a pokud začneme rolování, 137 00:07:57,340 --> 00:08:04,890 co to vlastně je, je úplně první, věřím, crack na původní iPhone. 138 00:08:04,890 --> 00:08:09,830 >> Pokud byste chtěli na útěk z vězení původní iPhone, což znamená, že untether to od AT & T 139 00:08:09,830 --> 00:08:13,710 a skutečně nainstalovat speciální software na to a dělat věci, které Apple nechtěl, aby lidé udělali, 140 00:08:13,710 --> 00:08:18,480 někdo vzal čas, aby zjistili, jak přesně by mohl zneužít softwarové chyby, 141 00:08:18,480 --> 00:08:22,690 chyby, chyby v softwaru, Apple, a tak se narodil iUnlock.c-- 142 00:08:22,690 --> 00:08:26,760 , že pokud ji pořídil do svého počítače a nainstalovat jej na iPhone 143 00:08:26,760 --> 00:08:29,430 , který byl připojen k počítači prostřednictvím, řekněme, kabelu USB, 144 00:08:29,430 --> 00:08:32,450 To by vám správce nebo uživatel root oprávnění na vašem iPhone 145 00:08:32,450 --> 00:08:34,620 a nechat si udělat skoro cokoliv chcete. 146 00:08:34,620 --> 00:08:36,400 A tak tam bylo to fascinující hra na kočku a myš 147 00:08:36,400 --> 00:08:39,340 mezi Apple a zbytkem světa, zejména pokud jde, stejně jako mnoho firem, 148 00:08:39,340 --> 00:08:43,350 ve snaze zajistit své věci stanoví, takže můžete dělat jen s tím, co mají v úmyslu. 149 00:08:43,350 --> 00:08:47,360 Ale díky lidem, jako je tento a porozumění nízkoúrovňových detailů - 150 00:08:47,360 --> 00:08:50,830 a v tomto případě C programování - a mnoho známých konstrukcí 151 00:08:50,830 --> 00:08:55,280 že jsme začali hrát s, jste schopni skutečně využívají hardware 152 00:08:55,280 --> 00:08:59,250 způsobem uznáte za vhodné, a ne nutně nějaký právnické osoby. 153 00:08:59,250 --> 00:09:01,600 Tak například, nemám tušení, co to všechno dělá, 154 00:09:01,600 --> 00:09:03,580 ale getVersion zní docela jednoduché, 155 00:09:03,580 --> 00:09:05,710 a vypadá to, že je to funkce, která tato osoba napsala. 156 00:09:05,710 --> 00:09:09,250 To trvá nějakou integer jako argument, nic nevrací, 157 00:09:09,250 --> 00:09:13,710 ale zdá se, smyčky pro smyčce zde a pokud podmínka, pokud stav přestávky, 158 00:09:13,710 --> 00:09:16,770 a nějak souvisí s čísly verzí, pokud jsme se posunout dolů, 159 00:09:16,770 --> 00:09:19,650 i když mnoho z těchto klíčových slov se bude nové. 160 00:09:19,650 --> 00:09:22,590 A je tu spousta funkcí v tu jsme nikdy neviděli a možná nikdy neuvidíš 161 00:09:22,590 --> 00:09:24,350 v průběhu semestru. 162 00:09:24,350 --> 00:09:29,160 >> Na konci dne, to se řídí stejnými pravidly a logiku, že jsme hráli s tím daleko. 163 00:09:29,160 --> 00:09:34,340 Tak tohle je příliš starý na to bezva váš iPhone 3s nebo 4s nebo 5s brzy tyto dny, 164 00:09:34,340 --> 00:09:38,830 ale vím, že je to všechno moc pochází z tohoto světa, že jsme se ponořila do. 165 00:09:38,830 --> 00:09:42,280 Pojďme se podívat na trochu jednoduchý příklad: 166 00:09:42,280 --> 00:09:46,260 tenhle, jen proto, aby si ohřát nějakou syntaxí a také některé další údaje typ 167 00:09:46,260 --> 00:09:48,910 že jsme mluvili o ale opravdu neviděl v C. 168 00:09:48,910 --> 00:09:53,670 To je soubor s názvem positive1.c, a za připomínky nahoře, 169 00:09:53,670 --> 00:09:56,070 to jen požaduje, aby uživatel zajistit kladné číslo. 170 00:09:56,070 --> 00:09:59,910 Takže je to příklad do-while, což je hezké programů uživatelských interaktivní 171 00:09:59,910 --> 00:10:02,070 kde je třeba sdělit uživateli dělat něco, 172 00:10:02,070 --> 00:10:05,530 a pokud nespolupracují jste křičet na ně, nebo odmítnout jejich vstup. 173 00:10:05,530 --> 00:10:10,480 Věc v bodě: budu dělat linky 19 až 24 174 00:10:10,480 --> 00:10:14,620 tak dlouho, dokud uživatel mi nedala kladné číslo. 175 00:10:14,620 --> 00:10:21,340 Tento detail zde na řádku 18, proč jsem určil n nad touto celou konstrukce cyklu 176 00:10:21,340 --> 00:10:26,870 na rozdíl od hned vedle řádku 22, kde jsem vlastně jedno, dostat n? Jo. 177 00:10:26,870 --> 00:10:29,330 [Student] Rozsah. >> Jo, tak to otázka rozsahu. 178 00:10:29,330 --> 00:10:31,770 A v Laicky řečeno, co se rozsahu vztahuje? 179 00:10:34,880 --> 00:10:41,560 Jo. >> [Neslyšitelné Student odpověď] >> Můžeš mluvit trochu hlasitěji? 180 00:10:41,560 --> 00:10:45,440 [Student] Kde můžete přistupovat k této proměnné. >> Perfect. 181 00:10:45,440 --> 00:10:47,610 Kde můžete získat přístup k dané proměnné. 182 00:10:47,610 --> 00:10:50,990 A obecně, pravidlo bylo dosud, že rozsah působnosti některých proměnné 183 00:10:50,990 --> 00:10:56,140 je definována nejnovějších složených závorek, které jste viděli. 184 00:10:56,140 --> 00:11:03,070 >> A tak v tomto případě, když jsem udělal chybu deklarovat n na lince 22, to by linka fungovat. 185 00:11:03,070 --> 00:11:10,840 Já bych si int, a já bych dal to do té proměnné n v řádku 22, 186 00:11:10,840 --> 00:11:17,060 ale řádek kódu by teď netuším, co mluvím? >> [Student] 25. 187 00:11:17,060 --> 00:11:23,840 [Malan] 25, a to dopadá 24 i proto, že v tomto případě to padá mimo složených závorek. 188 00:11:23,840 --> 00:11:28,550 Takže jen trochu na obtíž, ale velmi snadno vyřešit tím, že prostě prohlásil proměnná 189 00:11:28,550 --> 00:11:30,700 mimo funkci samotné. 190 00:11:30,700 --> 00:11:32,760 Uvidíme ještě dnes můžete jít ještě o krok dále 191 00:11:32,760 --> 00:11:34,940 a můžete dokonce získat trochu líný. 192 00:11:34,940 --> 00:11:39,660 A to není možné doporučit obecně, ale dokonce líní 193 00:11:39,660 --> 00:11:44,150 a dát proměnnou globálně, abych tak řekl, a ne uvnitř funkce, ne uvnitř smyčky, 194 00:11:44,150 --> 00:11:49,800 ale v samotném souboru, mimo všechny funkce, které jste napsal, jak jsem to udělal tady na lince 15. 195 00:11:49,800 --> 00:11:55,220 Toto je obecně odsuzována, ale uvědomit je to řešení někdy další problémy, 196 00:11:55,220 --> 00:11:56,910 jak budeme nakonec vidět. 197 00:11:56,910 --> 00:11:59,500 Takže teď necháme to takhle, ale uvidíme, jestli můžeme přepsat toto 198 00:11:59,500 --> 00:12:02,360 jen začít vyjadřovat sami sebe trochu jinak. 199 00:12:02,360 --> 00:12:05,550 Tento program, jen aby bylo jasno, je positive1. 200 00:12:05,550 --> 00:12:11,980 Nech mě jít napřed tady a ve svém terminálovém okně, aby positive1, Enter. 201 00:12:11,980 --> 00:12:15,080 Kompiluje v pořádku. Chystám se spustit positive1, stiskněte klávesu Enter. 202 00:12:15,080 --> 00:12:19,250 Žádám, abyste mi celé kladné číslo. Řeknu -1. To nefungovalo. 203 00:12:19,250 --> 00:12:22,340 0, 99. Zdá se, že funguje. 204 00:12:22,340 --> 00:12:25,310 Možná ne nejpřísnější test, ale alespoň je to pěkné sanity check 205 00:12:25,310 --> 00:12:27,100 že jsme na správné cestě. 206 00:12:27,100 --> 00:12:29,570 >> Takže teď mě nech jít dopředu a otevřete verzi 2 tohoto, 207 00:12:29,570 --> 00:12:32,800 a co je odlišné už? 208 00:12:32,800 --> 00:12:39,030 Provádí se to samé, ale to, co skáče tak, jak je zřetelně jiný tentokrát? 209 00:12:40,790 --> 00:12:47,090 Tento bool zeleně. To je zvýrazněna zeleně, to klíčové slovo známé jako bool, který je datového typu. 210 00:12:47,090 --> 00:12:50,510 To není to, postavený v roce pro všechny verze C. 211 00:12:50,510 --> 00:12:52,650 Musíte zahrnout konkrétní knihovnu. 212 00:12:52,650 --> 00:12:56,460 V našem případě, jsem zahrnul CS50 knihovnu tak, že máme přístup k bool. 213 00:12:56,460 --> 00:12:59,860 Ale v řádku 18, se zdá, že mají logickou hodnotu zde nazývá vděčný. 214 00:12:59,860 --> 00:13:02,190 Mohl jsem volal to něco, ale já jsem to nazval vděčný 215 00:13:02,190 --> 00:13:04,750 jen druh sdělit nějaký sémantický význam. 216 00:13:04,750 --> 00:13:07,700 Tak zpočátku na lince 18, nejsem zřejmě vděčný 217 00:13:07,700 --> 00:13:12,230 protože Boolean hodnota vděčný je inicializován na hodnotu false v řádku 18. 218 00:13:12,230 --> 00:13:16,500 A pak se zdá, to, co jsem tady udělal v řádcích 21 až 23 219 00:13:16,500 --> 00:13:19,200 je, že jsem to prostě přepsat můj logiku. 220 00:13:19,200 --> 00:13:26,100 Takže ne funkčně odlišná, ale v řádku 22 teď zda int uživatel poskytl 221 00:13:26,100 --> 00:13:31,360 je větší než 0, pak jsem jednoduše změnit hodnotu vděčný true. 222 00:13:31,360 --> 00:13:35,590 A proč jsem to udělal? Vzhledem k tomu, v souladu 25, zřejmě budu kontrolovat stav. 223 00:13:35,590 --> 00:13:39,760 Do této smyčky, zatímco vděčná je false. 224 00:13:39,760 --> 00:13:42,960 Tak jsem navrhl to jako alternativu k verzi 1 225 00:13:42,960 --> 00:13:47,050 protože je to alespoň trochu více intuitivní možná, že je to trochu více uzemněný v angličtině. 226 00:13:47,050 --> 00:13:51,980 Takže proveďte následující, když si nejste vděční, nebo když vděčný je false. 227 00:13:51,980 --> 00:13:56,220 A i tentokrát jsem zřejmě nezajímá vzpomenout, co uživatel napsal v 228 00:13:56,220 --> 00:14:00,050 protože oznámení není proměnná n, takže vlastně, malá bílá lež tam. 229 00:14:00,050 --> 00:14:03,290 >> Funkčně, program je trochu jiný, jakmile se dostaneme na dno toho 230 00:14:03,290 --> 00:14:04,960 Protože nejsem si vzpomněl, co n je. 231 00:14:04,960 --> 00:14:09,120 Ale já jsem chtěl ukázat i zde, že i když jsme viděli GetInt 232 00:14:09,120 --> 00:14:13,780 a GetString se používá na pravé straně rovnítka tak daleko 233 00:14:13,780 --> 00:14:17,310 tak, že si pamatujeme hodnotu, technicky, to není nezbytně nutné. 234 00:14:17,310 --> 00:14:20,290 Pokud z nějakého důvodu prostě nezajímá uložit hodnotu, 235 00:14:20,290 --> 00:14:25,540 si jen chcete zkontrolovat hodnotu, zjistíte, že můžeme jednoduše napsat toto jako GetInt, 236 00:14:25,540 --> 00:14:27,320 open paren, close paren. 237 00:14:27,320 --> 00:14:30,570 Tato funkce bude vracet hodnotu, jak jsme říkali. 238 00:14:30,570 --> 00:14:32,220 Bude to vám zpět int. 239 00:14:32,220 --> 00:14:34,460 A tak pokud jste psychicky myslíte že se to stává, 240 00:14:34,460 --> 00:14:38,190 když jsem zadejte 99, GetInt vrátí číslo 99, 241 00:14:38,190 --> 00:14:41,840 a tak koncepčně, je to jako by můj kód byl ve skutečnosti to. 242 00:14:41,840 --> 00:14:45,950 Takže pokud 99 je opravdu větší než 0, pak vděčný stává pravdou, 243 00:14:45,950 --> 00:14:50,810 pak se seřadí 25 uvědomí ooh, už jsme to udělali, protože jsem teď vděčná, 244 00:14:50,810 --> 00:14:53,970 a je v souladu 26, jsme jednoduše říci: "Díky za pozitivní celé číslo!" 245 00:14:53,970 --> 00:14:55,960 co se to stalo, že je. 246 00:14:55,960 --> 00:14:59,140 Nyní se pojďme udělat mírný syntaktický cukr zde, abych tak řekl. 247 00:14:59,140 --> 00:15:04,670 Pojďme se podívat, jestli se nám podaří vyčistit tento řádek 25 s touto třetí a poslední variantě v positive3. 248 00:15:04,670 --> 00:15:13,600 >> Všimněte si, jediný rozdíl je, co řádek kódu? >> [Student] 25. >> [Malan] Jo, 25. 249 00:15:13,600 --> 00:15:17,680 A jsme opravdu viděli tuto trik ještě ne, ale my jsme to vidět vykřičník v pondělí, 250 00:15:17,680 --> 00:15:21,070 který označuje, co? >> [Student] Not. Není >> nebo negace. 251 00:15:21,070 --> 00:15:23,510 Tak se booleovskou hodnotu a otočit jeho hodnotu. 252 00:15:23,510 --> 00:15:25,810 Pravda se stává false, false se stává pravdou. 253 00:15:25,810 --> 00:15:30,420 Takže to, navrhuji, je ještě trochu více intuitivní způsob, jak psát kód 254 00:15:30,420 --> 00:15:33,430 protože jsem stále ještě inicializovat vděčný false, pořád to následující, 255 00:15:33,430 --> 00:15:36,010 Nastavil jsem vděčný na hodnotu true, když přijde čas, 256 00:15:36,010 --> 00:15:40,880 ale nyní můžete opravdu jen přeložit tento kód slovně zleva doprava, 257 00:15:40,880 --> 00:15:45,630 while (vděčná!), protože bang nebo vykřičník označuje pojem není, 258 00:15:45,630 --> 00:15:47,580 takže i když není vděčná. 259 00:15:47,580 --> 00:15:49,900 Takže znovu, jsme nezavedly žádné nové koncepty na sobě. 260 00:15:49,900 --> 00:15:53,730 Mluvili jsme o Booleans zpátky, když jsme hráli s Scratch, 261 00:15:53,730 --> 00:15:56,720 ale uvědomit, nyní můžeme jen začít psát náš kód v mnoha různými způsoby. 262 00:15:56,720 --> 00:16:01,060 Takže zejména v pset1 pokud jste trochu snaží přijít na to, jak psát nějaký program, 263 00:16:01,060 --> 00:16:04,340 Diskusní jste štěstí, protože tam může být libovolný počet řešení 264 00:16:04,340 --> 00:16:06,110 že se může stát na. 265 00:16:06,110 --> 00:16:10,500 Například, je to jen 3 ani pro nejjednodušší programů. Dobrá. 266 00:16:10,500 --> 00:16:14,200 A nyní odvolává na pondělí jsme opustili na tuto notu s návratových hodnot. 267 00:16:14,200 --> 00:16:18,450 Takže poprvé jsme napsali program, který není jen mít hlavní; 268 00:16:18,450 --> 00:16:22,550 má také svou vlastní funkci, která jsem napsal tady. 269 00:16:22,550 --> 00:16:26,810 Takže v souladu 31 až 34 jsem provedla krychle funkci. 270 00:16:26,810 --> 00:16:30,240 Není to složité. Je to jen * a * v tomto případě. 271 00:16:30,240 --> 00:16:34,750 Ale co je důležité, na tom je, že jsem při vstupu ve formě 272 00:16:34,750 --> 00:16:39,180 a já se vracím výstup v podobě * *. 273 00:16:39,180 --> 00:16:43,560 Takže teď mám možnost, stejně jako jsem se prinf osamocený, 274 00:16:43,560 --> 00:16:47,240 na tuto funkci volat voláním krychle funkce. 275 00:16:47,240 --> 00:16:51,970 >> A krychle funkce má nějaký vstup, a krychle vrátí funkce nějaký výstup. 276 00:16:51,970 --> 00:16:56,960 Naopak, printf jen něco udělal. 277 00:16:56,960 --> 00:17:00,840 To se nic nevrací, že jsme záleželo, i když, jak zrušit to vrátí hodnotu; 278 00:17:00,840 --> 00:17:03,110 stačí obvykle ignorovat. 279 00:17:03,110 --> 00:17:06,510 Printf jen něco udělal. To mělo vedlejší účinek tisku na obrazovce. 280 00:17:06,510 --> 00:17:11,770 Naopak zde, máme krychle funkci, která skutečně vrátí něco. 281 00:17:11,770 --> 00:17:15,520 Takže pro ty, kteří znají toto, je to poměrně jednoduché nápad. 282 00:17:15,520 --> 00:17:19,640 Ale pro ty méně obeznámeni s touto myšlenkou předávání na vstupech a dostat zpět výstupy, 283 00:17:19,640 --> 00:17:21,950 Zkusme jen něco super jednoduchý. 284 00:17:21,950 --> 00:17:25,490 Je někdo pohodlný přichází na pódium krátce? 285 00:17:25,490 --> 00:17:28,040 Musíte být pohodlné s kamerou na vás stejně. Jo? Dobře. 286 00:17:28,040 --> 00:17:31,240 Jak se jmenujete? >> [Student] Ken. >> Ken. Dobrá. Ken, jít nahoru. 287 00:17:31,240 --> 00:17:35,050 Ken bude funkce druhů zde. 288 00:17:35,050 --> 00:17:38,720 Pojďme dál a udělat to. Pojďme si trochu fantazie. 289 00:17:38,720 --> 00:17:42,260 Rád Vás vidím. Vítejte na středu zájmu. Dobrá. 290 00:17:42,260 --> 00:17:46,640 Jdeme na toto tlačítko tady. Dobrá. 291 00:17:46,640 --> 00:17:49,820 Tak tady máte moderní tabuli, 292 00:17:49,820 --> 00:17:53,470 a co jsem je hlavní funkce, například, 293 00:17:53,470 --> 00:17:56,460 a já nemám iPad v ruce. 294 00:17:56,460 --> 00:17:59,710 >> Nemám opravdu vzpomenout, jak se - No, nemůžu říct, že. 295 00:17:59,710 --> 00:18:02,480 Já opravdu nemám dobrý rukopis, 296 00:18:02,480 --> 00:18:05,520 a tak proto chci tisknout něco na obrazovce pro mě. 297 00:18:05,520 --> 00:18:12,040 Jsem byl hlavní program, a já budu muset říct to 298 00:18:12,040 --> 00:18:16,720 písemně v mém kuřecím začátku a pak předá vám vstup. 299 00:18:16,720 --> 00:18:20,400 Takže hloupé ačkoli toto cvičení je, pojem funkcí a volání funkce 300 00:18:20,400 --> 00:18:22,400 a vrácení funkci opravdu scvrkává na to. 301 00:18:22,400 --> 00:18:26,260 Já jsem hlavní, jsem právě napsal printf, quote-konec citátu něco na obrazovce, 302 00:18:26,260 --> 00:18:29,110 Jsem spuštění tohoto programu, a jakmile printf volána, 303 00:18:29,110 --> 00:18:32,880 trvá jeden argument, nebo jeden parametr někdy mezi uvozovkami. 304 00:18:32,880 --> 00:18:35,880 Zde je to, že argument. Já předáním do Ken. 305 00:18:35,880 --> 00:18:39,020 Je to černá skříňka písemné určitý počet let ago 306 00:18:39,020 --> 00:18:41,510 , který zřejmě ví, jak tisknout věci na obrazovce. 307 00:18:41,510 --> 00:18:43,150 Tak provést. 308 00:18:49,280 --> 00:18:51,280 To není špatné. Velmi dobrá. 309 00:18:51,280 --> 00:18:55,510 Takže teď Ken se provádí spuštěním. Ví třeba Podej mi něco zpět? 310 00:18:55,510 --> 00:18:57,470 Ne, že jsme viděli doposud. 311 00:18:57,470 --> 00:19:00,460 Opět platí, že printf se skutečně vrátí číslo, ale budeme ignorovat, že pro tuto chvíli 312 00:19:00,460 --> 00:19:03,470 protože jsme nikdy používal to. Tak to je to pro Kena. 313 00:19:03,470 --> 00:19:08,580 A tak teď hlavní přebírá kontrolu programu znovu 314 00:19:08,580 --> 00:19:11,060 proto, že řádek kódu, printf, se provádí spuštěním. 315 00:19:11,060 --> 00:19:14,050 A jdeme o naší cestě, kterou se provádějí bez ohledu na jiné linky jsou tam. 316 00:19:14,050 --> 00:19:17,320 Takže teď zkusme trochu jiný příklad. 317 00:19:17,320 --> 00:19:24,940 Tentokrát zde pojďme se nejprve vymazat obrazovku, a tentokrát budeme dělat Cubing funkci, 318 00:19:24,940 --> 00:19:27,080 ale tentokrát jsem očekávat, že výstupní hodnoty. 319 00:19:27,080 --> 00:19:29,180 >> Tak pojďme do toho a udělat to. 320 00:19:29,180 --> 00:19:35,790 Teď mám řádek kódu, který říká, že x dostane kostku x. 321 00:19:41,370 --> 00:19:46,370 Řádek kódu, stažení, vypadá takto: x = kostka (x); 322 00:19:46,370 --> 00:19:50,930 Tak jak se to bude fungovat? Pojďme dál a dá vám bílou obrazovku znovu. 323 00:19:50,930 --> 00:19:54,070 Chystám se napsat nyní hodnotu x, 324 00:19:54,070 --> 00:20:01,400 které v této chvíli se stane, že je, řekněme, 2, aby to jednoduché. 325 00:20:01,400 --> 00:20:06,150 Napsal jsem na kus papíru hodnota 2, což je moje hodnota x. 326 00:20:06,150 --> 00:20:10,920 Podal jsem ji Ken. >> A já jen napsat odpověď? Jo >>, pojďme stačí napsat odpověď. 327 00:20:12,760 --> 00:20:18,940 Dobře. A teď se musí vrátit mi něco. Perfect. Pěkný SEGUE. 328 00:20:18,940 --> 00:20:23,120 Takže teď podá mi hodnotu 8 v tomto případě, a co s tím mám dělat? 329 00:20:23,120 --> 00:20:28,250 Vlastně - uvidíme, si toto právo. Co mám dělat s tím? 330 00:20:28,250 --> 00:20:33,440 Teď budu brát tuto hodnotu a skutečně ukládat jej ve stejných bitů v paměti. 331 00:20:33,440 --> 00:20:35,170 Ale nevšiml jsem trochu zápasí zde. 332 00:20:35,170 --> 00:20:38,210 Jsem trochu zmatený, protože kam jsem vlastně psát hodnotu x, 333 00:20:38,210 --> 00:20:43,150 protože to, co jsem právě udělal, je fyzicky ručně Ken kus papíru, který měl hodnotu 2, 334 00:20:43,150 --> 00:20:46,590 který byl x, a opravdu, to je přesně to, co se stalo. 335 00:20:46,590 --> 00:20:50,210 Tak to dopadá, že při volání funkce a předáte v argumentu 336 00:20:50,210 --> 00:20:53,290 jako hello, world nebo předáte argument jako 2, 337 00:20:53,290 --> 00:20:57,110 obecně, jste předáním kopie tohoto argumentu. 338 00:20:57,110 --> 00:21:00,730 A tak stejně jako jsem napsal číslo 2 zde a podal ho Ken, 339 00:21:00,730 --> 00:21:04,720 že musí znamenat, že jsem ještě kopii hodnoty 2 někde 340 00:21:04,720 --> 00:21:08,890 protože to opravdu, teď, když jsem se dostal zpět hodnotu 8, musím se vrátit do RAM 341 00:21:08,890 --> 00:21:12,130 a skutečně zapsat 8, kde jsem kdysi měl číslo 2. 342 00:21:12,130 --> 00:21:16,950 Takže vizuálně, zapamatovat si tuto představu předáním, doslova, kopii hodnoty. 343 00:21:16,950 --> 00:21:20,780 >> Ken dělá to jeho věc, podá mi něco - v tomto případě hodnotu jako 8 - 344 00:21:20,780 --> 00:21:24,980 a pak jsem musel udělat něco s touto hodnotou, pokud chci, aby to kolem. 345 00:21:24,980 --> 00:21:29,650 Takže tohle všechno vrátí se až příliš dobře, než dlouhý. 346 00:21:29,650 --> 00:21:34,920 Mockrát vám děkuji za tuto demo zde, Kena. [Potlesk] 347 00:21:34,920 --> 00:21:36,920 Velmi dobře. 348 00:21:36,920 --> 00:21:42,690 Pojďme se podívat, jak to nakonec se vztahuje k některé z volání funkcí, které jsme už tady. 349 00:21:42,690 --> 00:21:47,910 Nech mě jít napřed a přivést nás zpět k Cubing například zde. 350 00:21:47,910 --> 00:21:53,300 Všimněte si, že pokud chceme, aby skutečně začít užívat to dále, 351 00:21:53,300 --> 00:21:57,570 budeme muset být si vědom skutečnosti, že číslo x, která je momentálně prošel v zde 352 00:21:57,570 --> 00:22:01,530 se liší od toho, co je skutečně předán do funkce. 353 00:22:01,530 --> 00:22:05,880 Takže znovu, je toto heslo by kopie se stane docela germane za chvíli. 354 00:22:05,880 --> 00:22:09,580 Pojďme se podívat na něco, co není úplně správně pracovat ještě. 355 00:22:09,580 --> 00:22:13,250 Chystám se jít dopředu a otevřete třetiny buggy příklad, který je vadný povahy, 356 00:22:13,250 --> 00:22:18,550 a je to tzv. buggy3 a implementuje vyměňovat funkci. 357 00:22:18,550 --> 00:22:25,110 Zde máme hlavní funkci, která x a y libovolně inicializován 1 a 2, resp. 358 00:22:25,110 --> 00:22:27,700 Mohli bychom použít GetInt, ale my prostě potřebujeme jednoduché cvičení, 359 00:22:27,700 --> 00:22:30,170 takže je to pevně jako 1 a 2. 360 00:22:30,170 --> 00:22:35,340 V řádcích 21 a 22, my zřejmě vytisknout X a Y, 1 na řádek. 361 00:22:35,340 --> 00:22:39,720 Pak na lince 23, tvrdím já vyměňovat tyto hodnoty, tečka, tečka, tečka. 362 00:22:39,720 --> 00:22:44,170 I zdánlivě zavolat funkci v souladu 24 tzv. swap, který trvá 2 argumenty. 363 00:22:44,170 --> 00:22:48,300 Je to naprosto důvěryhodně pro funkce, aby se 2 argumenty. Viděli jsme printf to už. 364 00:22:48,300 --> 00:22:51,830 >> Takže výměna zřejmě trvá x a y, a jak již název napovídá, 365 00:22:51,830 --> 00:22:54,670 Doufám, že to bude vyměnit tyto 2 hodnoty. 366 00:22:54,670 --> 00:23:00,090 Tak jsem tvrdit, on-line 25 "vyměnil!" a já dotisk x a y 367 00:23:00,090 --> 00:23:03,070 za předpokladu, že jsem opravdu byl vyměnil. 368 00:23:03,070 --> 00:23:06,080 Ale když jsem vlastně tento program spustit - dovolte mi, abych otevřít okno terminálu, 369 00:23:06,080 --> 00:23:09,860 dovolte mi, abych buggy3 - jak již název napovídá, je to neskončí dobře 370 00:23:09,860 --> 00:23:15,770 protože když jsem Enter, zjistíte, že x je 1, y je 2, 371 00:23:15,770 --> 00:23:19,420 a přesto na konci programu, jsou stále ještě ve skutečnosti, stejný. 372 00:23:19,420 --> 00:23:22,960 Takže na základě prokázání právě s Kenem, co se vlastně děje? 373 00:23:22,960 --> 00:23:28,710 Pojďme se ponořit do tohoto swapu funkce. Je to super krátký. Je to jen pár řádků kódu dlouho. 374 00:23:28,710 --> 00:23:34,520 Ale co je to zásadní problém založen na jednoduchém příběhu řekl sem s Kenem? 375 00:23:34,520 --> 00:23:36,670 Proč je výměna vadné? 376 00:23:36,670 --> 00:23:39,660 [Student] Jste ukládání na kopii, ne proměnné. 377 00:23:39,660 --> 00:23:43,980 Přesně tak. Jsme ukládání na kopii, není proměnná sám. 378 00:23:43,980 --> 00:23:47,170 Jinými slovy, swap zřejmě trvá 2 argumenty, int, 379 00:23:47,170 --> 00:23:49,370 a to libovolně nazývá a a b, 380 00:23:49,370 --> 00:23:54,420 a tady jsem prošel v X a Y, které jsou příslušně 1 a 2, 381 00:23:54,420 --> 00:23:58,770 ale já ne doslova kolem x, já ne doslova procházet v y, 382 00:23:58,770 --> 00:24:01,450 Já jsem kolem kopii X a kopie y. 383 00:24:01,450 --> 00:24:04,510 Je to skoro, jako by si zkopírovat a vložit do swapu 384 00:24:04,510 --> 00:24:07,810 hodnoty, které chcete, aby skutečně manipulovat. 385 00:24:07,810 --> 00:24:14,480 Takže pokud je to ten případ, kdy jsem se start programu vykonávající řádek 35 pak 36, 386 00:24:14,480 --> 00:24:18,650 když jsem si na řádku 37, v tomto bodě v příběhu, co je hodnota? 387 00:24:21,040 --> 00:24:25,050 V tomto bodě příběhu, linka 37, jaká je hodnota v tomto bodě? >> [Student] 1. 388 00:24:25,050 --> 00:24:29,280 [Malan] To by mělo být jen 1, vpravo, protože x je předána jako první argument, 389 00:24:29,280 --> 00:24:33,080 a tato funkce prostě svévolně volá svou první argument je. 390 00:24:33,080 --> 00:24:38,200 Podobně je y druhý argument, a to je jen svévolně volá druhý argument b. 391 00:24:38,200 --> 00:24:40,990 >> Tato dichotomie je vlastně docela jednoduché vysvětlení. Přemýšlejte o tom. 392 00:24:40,990 --> 00:24:43,320 Nikdo z nás se setkal osobu, která napsal printf, 393 00:24:43,320 --> 00:24:50,770 tak jistě, on nebo ona nemá tušení, co naše proměnné o 30 let později se chystáte být nazýván. 394 00:24:50,770 --> 00:24:56,650 Takže tam musí být rozdíl mezi tím, co říkáte proměnné ve funkcích píšete 395 00:24:56,650 --> 00:25:02,080 a co říkáte proměnné ve funkcích voláte nebo pomocí. 396 00:25:02,080 --> 00:25:05,340 Takže jinými slovy, napsal jsem své proměnné jako x a y, 397 00:25:05,340 --> 00:25:08,890 ale pokud napsal někdo jiný odkládací funkci, on nebo ona určitě nebude vědět, 398 00:25:08,890 --> 00:25:10,690 co moje proměnné se bude nazýván, 399 00:25:10,690 --> 00:25:13,830 takže si uvědomit, že to je důvod, proč jste tuto dualitu jmen. 400 00:25:13,830 --> 00:25:16,750 Technicky, jsem mohl dělat to náhodou, 401 00:25:16,750 --> 00:25:20,080 ale stále by být předávány jako kopie. 402 00:25:20,080 --> 00:25:23,650 Bylo by to čistě náhoda, esteticky případě, že osoba, která napsala swapu 403 00:25:23,650 --> 00:25:26,150 použil stejné názvy. 404 00:25:26,150 --> 00:25:32,370 Takže v tomto bodě příběhu, linka 37, je 1, b = 2, a teď mám postupovat, aby swap. 405 00:25:32,370 --> 00:25:34,900 Nejprve mi dovolte, abych vlastně dělat to mnohem jednodušeji. 406 00:25:34,900 --> 00:25:36,690 Já nevím, co ty 3 řádky kódu dělají. 407 00:25:36,690 --> 00:25:41,210 Dovolte mi, abych to: b =, = b; udělal. 408 00:25:41,210 --> 00:25:44,690 Proč je tento zlomený, logicky? 409 00:25:46,490 --> 00:25:48,900 Je to druh intuitivní věc, ne? 410 00:25:48,900 --> 00:25:52,560 Tak se stává b a b stává, 411 00:25:52,560 --> 00:25:57,730 ale problém je, že jakmile linka 37 provádí, co je hodnota a b? 412 00:25:57,730 --> 00:26:03,410 Totéž, 1, protože jste clobbered, abych tak řekl, jste změnili b rovnat. 413 00:26:03,410 --> 00:26:08,890 Takže jakmile linka 37 provedl, to je skvělé, máte nyní 2 kopie číslem 1 414 00:26:08,890 --> 00:26:13,350 Uvnitř této funkce, takže pak, když řekneš v souladu 38 = b, 415 00:26:13,350 --> 00:26:17,640 jste trochu šroubované, protože jste právě přiřazení 1-1. 416 00:26:17,640 --> 00:26:20,580 Jste trochu ztratila hodnotu, kterou záleželo. 417 00:26:20,580 --> 00:26:23,220 Takže v původní verzi tohoto, zjistíte, co jsem udělal. 418 00:26:23,220 --> 00:26:26,850 Jsem místo toho měla třetina řádek kódu, který vypadal jako toto. 419 00:26:26,850 --> 00:26:28,580 Prohlašuji, dočasnou proměnnou. 420 00:26:28,580 --> 00:26:32,170 >> Tmp je velmi obecný název pro dočasné proměnné, a to int 421 00:26:32,170 --> 00:26:34,580 proto, že musí odpovídat tomu, co chci udělat kopii. 422 00:26:34,580 --> 00:26:39,770 I uložit kopii uvnitř tmp, tak jednou linka 37 je proveden, 423 00:26:39,770 --> 00:26:45,860 hodnota je - rychlá příčetnost kontrola - 1, hodnota b je 2, 424 00:26:45,860 --> 00:26:48,970 a hodnota tmp je také 1. 425 00:26:48,970 --> 00:26:52,060 Takže teď jsem spustit linku 38. 426 00:26:52,060 --> 00:27:00,540 Jakmile linka 38 provede, má na hodnotu b. A b je 2, takže je nyní 2. 427 00:27:00,540 --> 00:27:05,210 Takže v tomto bodě příběhu, je 2, b je 2, a tmp je 1, 428 00:27:05,210 --> 00:27:11,060 takže teď logicky, můžeme jen plop TMP je hodnota do B a jsme hotovi. 429 00:27:11,060 --> 00:27:12,800 Takže jsme vyřešili tento problém. 430 00:27:12,800 --> 00:27:17,720 Bohužel, když jsem spustit tento program v této podobě, to dělá ne vlastně zaměnit žádné hodnoty. 431 00:27:17,720 --> 00:27:20,100 Ale aby bylo jasno, proč? 432 00:27:23,660 --> 00:27:26,450 Opravil jsem logický problém z před chvílí, 433 00:27:26,450 --> 00:27:31,020 ale zase, když jsem spustit tento program, x a y se nemění 434 00:27:31,020 --> 00:27:33,310 do konce programového popravě. 435 00:27:33,310 --> 00:27:37,220 [Neslyšitelné Student komentář] >> jsme vrátili nic, tak je to pravda. 436 00:27:37,220 --> 00:27:39,670 Ale ukazuje se, že je tu trochu problém, protože tady dosud, 437 00:27:39,670 --> 00:27:44,170 Jediné, co jsme byli schopni se vrátit, je jedna věc, a to je omezení C. 438 00:27:44,170 --> 00:27:49,070 Můžete vrátit pouze skutečně jednu hodnotu, v tom případě jsem trochu trčet 439 00:27:49,070 --> 00:27:53,310 protože jsem se mohl vrátit novou hodnotu x nebo bych mohl vrátit novou hodnotu y, 440 00:27:53,310 --> 00:27:55,190 ale já chci oba zpátky. 441 00:27:55,190 --> 00:27:58,650 Takže návratu není jednoduché řešení zde. 442 00:27:58,650 --> 00:28:01,710 Ale problém zásadně je důvod, proč? Co jsme vlastně vyměnili? 443 00:28:01,710 --> 00:28:04,190 [Student] a, b. >> A b. 444 00:28:04,190 --> 00:28:08,230 Ale i b jsou kopie x a y, což znamená, že jsme právě udělali všechny tyto práce, 445 00:28:08,230 --> 00:28:11,650 jsme trávili právě 3 minut mluvit o virtuální funkci a všechny 3 těchto proměnných, 446 00:28:11,650 --> 00:28:15,420 a to je skvělé, naprosto správný izolaci, 447 00:28:15,420 --> 00:28:20,740 ale A a B je rozsah pouze je v těchto liniích zde. 448 00:28:20,740 --> 00:28:24,790 >> Tak jako pro smyčce, pokud jste deklarovat integer i uvnitř smyčky for, 449 00:28:24,790 --> 00:28:28,760 podobně, pokud jste se prohlašuje, a b uvnitř funkce, které jste napsal, 450 00:28:28,760 --> 00:28:33,320 jsou platné pouze uvnitř této funkce, což znamená, že jakmile swap je provedeno spuštění 451 00:28:33,320 --> 00:28:38,470 a půjdeme ř. 24 až linii 25, x a y se nemění vůbec. 452 00:28:38,470 --> 00:28:42,790 Právě jste zbytečně spoustu času vyměňovat kopie proměnných. 453 00:28:42,790 --> 00:28:47,010 Tak to dopadá, že řešení je to vlastně non-zřejmé. 454 00:28:47,010 --> 00:28:50,670 To není zcela dostačující pro návrat hodnoty, protože se můžeme vrátit pouze 1 hodnotu, 455 00:28:50,670 --> 00:28:53,470 a já opravdu chci vyměnit oba X a Y současně, 456 00:28:53,470 --> 00:28:55,210 takže budeme muset vrátit k tomu. 457 00:28:55,210 --> 00:29:01,020 Ale teď si uvědomit, že problém zásadně odvozen od skutečnosti, že a a b jsou kopie 458 00:29:01,020 --> 00:29:03,630 a jsou ve svém vlastním rozsahu. 459 00:29:03,630 --> 00:29:05,050 Zkusme vyřešit tento nějakým způsobem. 460 00:29:05,050 --> 00:29:11,250 Dovolte mi, abych skutečně přejděte sem a otevřít, řekněme, čtvrtina variantu tohoto, buggy4. 461 00:29:11,250 --> 00:29:13,370 Co třeba tohle? 462 00:29:13,370 --> 00:29:17,810 To je podobný, ale jednodušší problém podívat se na předtím, než jsme se stab na jeho vyřešení. 463 00:29:17,810 --> 00:29:24,190 Tento program se nazývá přírůstek, a to zřejmě inicializuje celé číslo x na 1 v řádku 18. 464 00:29:24,190 --> 00:29:28,150 I pak tvrdí, x je 1, potom jsem si tvrdit, "Zvyšování ..." 465 00:29:28,150 --> 00:29:33,730 Pak jsem zavolat přírůstek, ale pak v řádcích 22 a 23, tvrdím, že to bylo zvýšeno, 466 00:29:33,730 --> 00:29:40,220 Tvrdím x je nyní, co to je - 2, pravděpodobně - ale tento program je buggy. 467 00:29:40,220 --> 00:29:42,610 V čem je problém? 468 00:29:43,440 --> 00:29:50,160 Jo. >> [Neslyšitelné Student odpověď] >> Přesně tak. 469 00:29:50,160 --> 00:29:52,490 Takže x byl vyhlášen, samozřejmě, na řádku 18. 470 00:29:52,490 --> 00:29:54,700 To je uvnitř složených závorek hlavní je. 471 00:29:54,700 --> 00:29:58,440 Takže jednoduchá odpověď je, že zatímco x existuje zde, 472 00:29:58,440 --> 00:30:03,930 neexistuje v souladu 32, takže tento program vlastně se ani sestavit. 473 00:30:03,930 --> 00:30:07,940 Kompilátor když se snažím sestavování tento kód bude na mě křičet 474 00:30:07,940 --> 00:30:14,100 o nějaké nehlášené identifikátoru nebo něco v tom smyslu. Ve skutečnosti, zkusme to. 475 00:30:14,100 --> 00:30:18,470 To je, aby buggy4. Tady to je. 476 00:30:18,470 --> 00:30:22,110 Použití nedeklarovaný identifikátor "x" v souladu 32. 477 00:30:22,110 --> 00:30:25,580 A skutečně, buďme konkrétnější zde dnes tak, že je to užitečné 478 00:30:25,580 --> 00:30:27,580 v úředních hodinách i doma. 479 00:30:27,580 --> 00:30:29,300 >> Všimněte si, že je to trochu záhadně písemná. 480 00:30:29,300 --> 00:30:37,270 Ale skutečnost, že zvonění je na nás řvali, řka buggy4.c: 32:5, je ve skutečnosti užitečné. 481 00:30:37,270 --> 00:30:42,050 To znamená, že je chyba na řádku 32 na znaku 5. 482 00:30:42,050 --> 00:30:46,700 Takže 1, 2, 3, 4, 5. To je, ve skutečnosti, kde je problém. 483 00:30:46,700 --> 00:30:49,790 A také, taky, mějte na paměti, úřední hodiny a doma, budu mít štěstí tady. 484 00:30:49,790 --> 00:30:52,990 Mám jednu chybu. Bude to poměrně snadno opravit. 485 00:30:52,990 --> 00:30:55,990 Ale pokud se dostanete celou obrazovku plnou ohromujících chybových zpráv, 486 00:30:55,990 --> 00:31:00,330 znovu si uvědomit, že nejspodnější jeden by mohl být jen projevem vrchní jednoho. 487 00:31:00,330 --> 00:31:03,450 Takže vždy honit své chyby shora dolů 488 00:31:03,450 --> 00:31:05,820 protože tam může být jen řetěz sedmikráska efekt 489 00:31:05,820 --> 00:31:09,240 že navrhuje máte tak více problémů, než jste vlastně dělat. 490 00:31:09,240 --> 00:31:15,150 Tak jak bychom mohli opravit, pokud je mým cílem zvýšit x? >> [Student] Udělat x globální. 491 00:31:15,150 --> 00:31:17,060 Dobře, takže můžeme x globální. 492 00:31:17,060 --> 00:31:20,480 Pojďme se na zástupce, kterého jsem varoval již dříve, ale sakra, my prostě potřebujeme rychlou opravu, 493 00:31:20,480 --> 00:31:25,730 takže řekněme, že int x tady. To dělá x globální. 494 00:31:25,730 --> 00:31:31,800 Takže teď hlavní má k němu přístup a přírůstek k němu má přístup, 495 00:31:31,800 --> 00:31:34,110 a tak nech mě jít napřed a zkompilovat to teď. 496 00:31:34,110 --> 00:31:37,630 Udělejte buggy4, Enter. Zdá se, že sestavení teď. 497 00:31:37,630 --> 00:31:41,230 Pojďme běžet buggy4. A zdá se, že skutečně funguje. 498 00:31:41,230 --> 00:31:45,150 To je jedna z těch věcí, které je dělají, co říkám, ne jako já, 499 00:31:45,150 --> 00:31:47,010 jak jsem právě udělal zde, protože obecně 500 00:31:47,010 --> 00:31:50,440 naše programy se dostaneme mnohem zajímavější a mnohem déle, než to, 501 00:31:50,440 --> 00:31:56,390 a pokud vaše řešení životních problémů je jen dát všechny proměnné v horní části souboru, 502 00:31:56,390 --> 00:31:59,690 velmi rychle se programy se strašlivě obtížné řídit. 503 00:31:59,690 --> 00:32:02,190 To je těžší vymyslet nové názvy proměnných, 504 00:32:02,190 --> 00:32:05,240 je stále těžší pochopit, co je proměnná dělá to, co, 505 00:32:05,240 --> 00:32:08,460 a tak obecně, to není dobré řešení. 506 00:32:08,460 --> 00:32:10,030 Takže jdeme na to lepší. 507 00:32:10,030 --> 00:32:12,160 Nechceme používat globální proměnnou zde. 508 00:32:12,160 --> 00:32:16,240 >> Já chci zvýšit x, takže jsem mohl samozřejmě - 509 00:32:16,240 --> 00:32:18,670 na konci dne, to je trochu hloupé příběhu protože právě to - 510 00:32:18,670 --> 00:32:24,450 ale když jsem nevěděl o tom provozovatele, nebo jsem nesměl změnit v main sám, 511 00:32:24,450 --> 00:32:30,730 jak jinak bych mohl implementovat Ken tady tentokrát není kostka, ale můžete zvyšovat? 512 00:32:31,380 --> 00:32:33,190 Jak mohu změnit tuto věc tady? Jo. 513 00:32:33,190 --> 00:32:38,480 [Student] Pass v x a pak se vrátit [neslyšitelné] >> Dobře, dobře. 514 00:32:38,480 --> 00:32:41,900 Tak proč bych projít v X a pak se spíše než ji vrátí 515 00:32:41,900 --> 00:32:44,870 proč ne já prostě vrátit x + 1. 516 00:32:44,870 --> 00:32:47,710 Pár dalších věcí, muset změnit zde. Jsem na správné cestě. 517 00:32:47,710 --> 00:32:49,770 Co ještě musím trik? Někdo jiný. Jo. 518 00:32:49,770 --> 00:32:51,740 [Neslyšitelné Student odpověď] 519 00:32:51,740 --> 00:32:54,730 Potřebuji změnit návratový typ přírůstku, protože to není neplatné. 520 00:32:54,730 --> 00:32:57,780 Void nic neznamená se vrátil, ale teď jasně, že je, 521 00:32:57,780 --> 00:32:59,830 tak to musí změnit - >> [studentka] int. 522 00:32:59,830 --> 00:33:02,740 int musí být v souladu s tím, co jsem vlastně vrací. 523 00:33:02,740 --> 00:33:05,180 Nyní něco jiného je stále buggy tady. Jo. 524 00:33:05,180 --> 00:33:08,400 [Neslyšitelné Student odpověď] >> [Malan] Tak jsem třeba zvýšit x? 525 00:33:08,400 --> 00:33:12,080 [Neslyšitelné Student odpověď] >> [Malan] Aha, tak musím projít x. 526 00:33:12,080 --> 00:33:16,660 Tak jsem třeba udělat tady. >> [Neslyšitelné Student komentář] 527 00:33:16,660 --> 00:33:20,050 [Malan] Tak prototyp, musím to změnit tady. 528 00:33:20,050 --> 00:33:22,930 Tak to má stát int, to se musí stát - 529 00:33:22,930 --> 00:33:25,620 hmm, jsem skutečně chybu tady. Pojďme opravit tenhle první. 530 00:33:25,620 --> 00:33:29,590 Co by to vlastně být? Je to být int něco. 531 00:33:29,590 --> 00:33:32,700 Mohlo by to být x, ale upřímně řečeno, pokud začnete volat všechny své proměnné x, 532 00:33:32,700 --> 00:33:35,390 to dostane méně a méně jasné, který je který. 533 00:33:35,390 --> 00:33:39,560 >> Takže řekněme, libovolně vybrat jiný konvence pro mé pomocné funkce, 534 00:33:39,560 --> 00:33:41,940 funkce píšu. Nazveme to, nebo bychom mohli nazvat - 535 00:33:41,940 --> 00:33:45,010 Říkejme tomu číslo ještě jasněji. 536 00:33:45,010 --> 00:33:47,560 Tak jsem se musel vrátit, co je číslo plus 1, 537 00:33:47,560 --> 00:33:50,740 a teď musím změnit 1 další věc, tady a ještě jedna věc tady. 538 00:33:50,740 --> 00:33:54,350 Co mám změnit na řádku 21 jako první? >> [Neslyšitelné Student odpověď] 539 00:33:54,350 --> 00:33:57,610 [Malan] Mám přiřadit ji k x. Nemůžu jen tak zavolat přírůstek (x). 540 00:33:57,610 --> 00:34:01,960 Musím si pamatovat odpověď změnou hodnoty x na levé straně. 541 00:34:01,960 --> 00:34:04,680 A i když x je nyní na levé a pravé, že je naprosto v pořádku 542 00:34:04,680 --> 00:34:08,860 protože pravá strana se provede, první pak dostane svalil do levého věc - 543 00:34:08,860 --> 00:34:10,600 x v tomto případě. 544 00:34:10,600 --> 00:34:12,159 A pak konečně, je to snadné opravit teď. 545 00:34:12,159 --> 00:34:17,230 To by mělo jen odpovídat, co je dole, int číslo. 546 00:34:17,230 --> 00:34:20,570 Takže celá parta změn pro opravdu stupidní funkce 547 00:34:20,570 --> 00:34:24,420 ale zástupce z věcí, které budeme stále chtějí dělat. 548 00:34:24,420 --> 00:34:27,090 Tak, aby buggy4. Já jsem podělal někde. 549 00:34:27,090 --> 00:34:30,139 Ach, můj Bože. Pět chyb v 6-line programu. 550 00:34:30,139 --> 00:34:35,690 Takže to, co se děje na lince 18, znak 5? 551 00:34:35,690 --> 00:34:39,610 Tak jsem si určil, že tento, int. 552 00:34:39,610 --> 00:34:41,920 Pojďme se podívat,. Existuje celá parta dalších chyb. 553 00:34:41,920 --> 00:34:47,010 Ach, můj Bože - 19, 18, 21 - ale opět, řekněme, vymazat obrazovku, Control L tady, 554 00:34:47,010 --> 00:34:49,380 a znovu zvonit. 555 00:34:49,380 --> 00:34:51,340 Takže 5 problémů je vlastně jen, že 1. 556 00:34:51,340 --> 00:34:57,520 Tak teď pojďme běžet buggy4, Enter. Páni, je x byl zvýšen správně. 557 00:34:57,520 --> 00:35:02,720 Dobrá. Jakékoliv dotazy na to, jak zvýšit počty? Jo. 558 00:35:02,720 --> 00:35:09,870 [Neslyšitelné Student otázka] >> Dobrá otázka. 559 00:35:09,870 --> 00:35:14,220 Jak to, že jsem si jen změnit x na číslo a program bude ihned vědět? 560 00:35:14,220 --> 00:35:16,200 >> Opět, myslete na to, jak tuto abstrakci. 561 00:35:16,200 --> 00:35:21,600 Takže když jsem hlavní a Ken je přírůstek, upřímně řečeno, je mi jedno, co Ken volá jeho iPad. 562 00:35:21,600 --> 00:35:26,570 Nezajímá mě, co říká něco, co má co do činění s jeho prováděním této funkce. 563 00:35:26,570 --> 00:35:33,340 Toto je implementační detail, že jsem, hlavní, nemusíte se starat o. 564 00:35:33,340 --> 00:35:38,250 A tak prostě mění důsledně ji uvnitř funkce - číslo sem a číslo zde - 565 00:35:38,250 --> 00:35:40,960 je vše, to trvá tak dlouho, jak jsem překompilovat. 566 00:35:40,960 --> 00:35:44,180 Je to něco jako když si myslíte, že o tom mnozí z nás, ty z vás, řidičských průkazů 567 00:35:44,180 --> 00:35:46,770 kteří řídí, nebo pokud jste dokonce řízený v autě, 568 00:35:46,770 --> 00:35:50,950 většina z nás nemá ponětí, jak auto funguje pod kapotou. 569 00:35:50,950 --> 00:35:54,970 A doslova, když otevřete kapotu, většina z nás - včetně mě - 570 00:35:54,970 --> 00:35:56,940 se nebude opravdu vědět, co se díváme na, 571 00:35:56,940 --> 00:35:59,220 něco jako se můžete cítit s věcmi, jako je tohle teď. 572 00:35:59,220 --> 00:36:01,480 Ale my opravdu nemáme starat, jak auto funguje, 573 00:36:01,480 --> 00:36:05,970 nemáme se starat, co všechno z tyčí a pístů a kabelů uvnitř vozu 574 00:36:05,970 --> 00:36:08,160 vlastně dělají. 575 00:36:08,160 --> 00:36:12,770 Takže něco jako to, co říkáte pístu nezáleží zde v tomto případě. Stejný nápad. 576 00:36:12,770 --> 00:36:25,300 Jo. >> [Neslyšitelné Student otázka] 577 00:36:25,300 --> 00:36:29,180 Pokud existuje více použití variabilního chvíli xa před, 578 00:36:29,180 --> 00:36:32,150 vy, programátor, by musely změnit je všude. 579 00:36:32,150 --> 00:36:36,600 Nebo byste mohli doslova dělat Soubor, Nabídka, a pak Najít, Nahradit - něco takového - 580 00:36:36,600 --> 00:36:39,170 ale budete muset udělat těchto změn sami. 581 00:36:39,170 --> 00:36:47,450 Musíte být v souladu. >> [Student] Pokud existuje více proměnných [neslyšitelné] 582 00:36:47,450 --> 00:36:53,100 Zejména, aby jako tady, kdyby to byla int jiné číslo? >> [Student] Správně. 583 00:36:53,100 --> 00:36:56,590 [Malan] Jo. Objednejte záleží, když voláte funkci. 584 00:36:56,590 --> 00:37:00,050 >> Takže pokud bych se volat přírůstek zde něco něco čárka, 585 00:37:00,050 --> 00:37:01,680 je tu přímé mapování. 586 00:37:01,680 --> 00:37:05,690 První proměnná, jak se to jmenuje, je vyroben kopii prvního argumentu sem. 587 00:37:05,690 --> 00:37:07,760 Promiňte. To by nemělo být závorka. 588 00:37:07,760 --> 00:37:11,490 Druhý argument se seřadí s druhým. Takže pořadí, ano, záleží. Dobrá. 589 00:37:11,490 --> 00:37:17,020 Promiňte. Vzal jsem si dlouhou cestu, aby se tam dostat. Další otázky? Dobrá. 590 00:37:17,020 --> 00:37:20,610 Tak uvidíme, jestli nemůžeme namalovat obraz o tom, co se vlastně děje 591 00:37:20,610 --> 00:37:23,090 pod pokličku, abych tak řekl. 592 00:37:23,090 --> 00:37:26,640 To je obdélník, který by mohl představovat paměti počítače. 593 00:37:26,640 --> 00:37:30,970 I když nemáte tušení, jak paměť funguje a jak funguje RAM, 594 00:37:30,970 --> 00:37:33,940 alespoň předpokládat, že máte kytice z ní v těchto dnech. 595 00:37:33,940 --> 00:37:36,280 Máš megabajtů to, máte gigabajty toho, 596 00:37:36,280 --> 00:37:40,870 a my víme, týden od 0, že byte je právě to, co? >> [Student] 8 bitů. 597 00:37:40,870 --> 00:37:42,950 8 bitů, ne? Takže 8 nuly a 1. 598 00:37:42,950 --> 00:37:45,880 Takže pokud váš počítač má koncert RAM, 2 giga RAM v těchto dnech, 599 00:37:45,880 --> 00:37:55,030 máte miliard 2000000000 bajtů paměti nebo zhruba 8 miliard nebo 16 miliard bitů 600 00:37:55,030 --> 00:37:56,890 uvnitř počítače. 601 00:37:56,890 --> 00:38:00,590 Na rozdíl od malého Chmýřitý například Willy, to není magnetické částice obvykle už. 602 00:38:00,590 --> 00:38:04,450 Stále větší míře - v noteboocích nejméně - to je SSD disky, SSD 603 00:38:04,450 --> 00:38:08,580 že právě nemají žádné pohyblivé části. Je to všechno elektronické. Je to všechno elektřiny založené. 604 00:38:08,580 --> 00:38:14,060 Takže myslíte, že z tohoto obdélníku, jak jen zastupující 1 nebo 2 GB paměti, které máte. 605 00:38:14,060 --> 00:38:16,020 >> Takže je to kus paměti. 606 00:38:16,020 --> 00:38:19,830 Svět počítačové vědě nějak rozdělený off 607 00:38:19,830 --> 00:38:22,950 kousky paměti dělat různé věci. 608 00:38:22,950 --> 00:38:27,190 Například, je-li to vašeho počítače RAM, jak navrhl obdélníku, 609 00:38:27,190 --> 00:38:31,130 ukazuje se, že podle konvence, v horní části paměti RAM, abych tak řekl, 610 00:38:31,130 --> 00:38:33,660 je obecně to, co se nazývá textový segment. 611 00:38:33,660 --> 00:38:36,740 Ti jsou 0s a 1s, které jste sestavili. 612 00:38:36,740 --> 00:38:39,020 Takže když jsme se podíval pod pokličku, co a.out je, 613 00:38:39,020 --> 00:38:41,980 všechny tyto 0s a 1s, při spuštění programu, 614 00:38:41,980 --> 00:38:46,290 ty 0s a 1s jsou načítány z vašeho pevného disku do něčeho s názvem RAM, 615 00:38:46,290 --> 00:38:49,320 a v RAM to dali na vrcholu. 616 00:38:49,320 --> 00:38:52,770 Mezitím, budete mít jiné věci: inicializovat dat, inicializaci dat. 617 00:38:52,770 --> 00:38:57,510 Tyto 2 řádky paměti odkazují na globální proměnné, které nejsou často používají 618 00:38:57,510 --> 00:39:00,760 ale někdy, když to uděláte, skončí tam stejně. 619 00:39:00,760 --> 00:39:04,260 Pak je tu některé další věci: proměnné prostředí, které nebudeme trávit tolik času na, 620 00:39:04,260 --> 00:39:06,860 ale pak 2 důležité věci, které se vrátí v průběhu semestru, 621 00:39:06,860 --> 00:39:08,550 zásobník a halda. 622 00:39:08,550 --> 00:39:12,210 Takže většina z paměti počítače je vyhrazen při spuštění programu 623 00:39:12,210 --> 00:39:15,370 pro takzvaný balíček, a něco, co nazývá haldy. 624 00:39:15,370 --> 00:39:18,840 Nebudeme mluvit o haldy dnes, ale budeme hovořit o zásobníku. 625 00:39:18,840 --> 00:39:24,600 Zásobník je určen k vykouzlit vizuální z jídelny zásobníků haly jídlo v Mather domě 626 00:39:24,600 --> 00:39:28,110 nebo tam, kde se stalo, že tam, kde jídelna pracovníci čistit každý den, 627 00:39:28,110 --> 00:39:30,180 oni vyskládat až od podlahy nahoru, 628 00:39:30,180 --> 00:39:34,550 a podobně, v paměti, že je to myšlenka na něco na zásobníku, 629 00:39:34,550 --> 00:39:36,860 uvedení něco na stacku, uvedení něco na zásobníku. 630 00:39:36,860 --> 00:39:38,240 A co máme na mysli toto? 631 00:39:38,240 --> 00:39:41,860 >> Pojďme zvětšit pouze na dolní polovině obrázku, paměti RAM vašeho počítače, 632 00:39:41,860 --> 00:39:44,330 navrhnout následující. 633 00:39:44,330 --> 00:39:48,170 Ukazuje se, že při spuštění programu, jako je a.out nebo Hello - 634 00:39:48,170 --> 00:39:50,100 bez ohledu na program, je to, že jste napsali - 635 00:39:50,100 --> 00:39:54,020 znovu, 0s a 1s ty jsou načítány z vašeho pevného disku, který je dlouhodobé skladování, 636 00:39:54,020 --> 00:39:57,230 zůstane tam, i když zatáhněte za konektor, vloženého do paměti RAM. 637 00:39:57,230 --> 00:40:00,610 RAM je rychlejší než pevné disky - je to menší, než pevné disky - 638 00:40:00,610 --> 00:40:03,300 ale to je místo, kde žijí programy, zatímco vy používáte je. 639 00:40:03,300 --> 00:40:08,230 Takže jste dvakrát klikněte na program, na Mac nebo PC, je načtena z pevného disku do operační paměti RAM. 640 00:40:08,230 --> 00:40:11,520 Jakmile je načten do paměti RAM, 0s a 1s go na cestě nahoru, 641 00:40:11,520 --> 00:40:16,610 tzv. textu segment, ale pak, jakmile váš program ve skutečnosti spustí, 642 00:40:16,610 --> 00:40:21,360 hlavní funkce je volána, a hlavní, jak jsme viděli, často lokální proměnné, 643 00:40:21,360 --> 00:40:24,870 a to má ints a řetězce a připaluje a podobně. 644 00:40:24,870 --> 00:40:29,180 Takže pokud váš program, který jste napsali, nebo program, který jste poklepání 645 00:40:29,180 --> 00:40:32,970 používá některé proměnné uvnitř of main, 646 00:40:32,970 --> 00:40:37,240 skončí na dně svého stacku paměti, abych tak řekl. 647 00:40:37,240 --> 00:40:39,410 Konkrétněji, co to vlastně znamená? 648 00:40:39,410 --> 00:40:48,450 To prostě znamená, že pokud jsme se chystali počet bajtů paměti RAM v počítači, 649 00:40:48,450 --> 00:40:55,750 si všimnout, že to může být bajt číslo 0, může to být byte číslo 1, 2, 3, 4, 5, 6, 650 00:40:55,750 --> 00:41:01,480 celou cestu až 2 miliardy by se celou cestu tam nahoře. 651 00:41:01,480 --> 00:41:05,880 Takže jinými slovy, když mluvíme o paměti RAM nebo paměti, pokud jde o bytech, 652 00:41:05,880 --> 00:41:11,500 znamená to, že se někdo rozhodl, co očíslovat každý z těchto bloků paměti. 653 00:41:11,500 --> 00:41:16,650 Takže když budete potřebovat 32 bitů pro int nebo budete potřebovat 8 bitů pro char, 654 00:41:16,650 --> 00:41:18,840 kde se jim skončí v paměti? 655 00:41:18,840 --> 00:41:22,350 >> Koncepčně, prostě skončí na konci této věci zvané zásobník. 656 00:41:22,350 --> 00:41:25,870 Ale co je zajímavé, teď je, když hlavní volá funkce - 657 00:41:25,870 --> 00:41:28,750 Předpokládám, že funkci nazvanou foo, jen libovolný název - 658 00:41:28,750 --> 00:41:32,330 co se stane, je hlavní je v dolní části tohoto zásobníku paměti; 659 00:41:32,330 --> 00:41:35,680 foo nyní je kladen na vrcholu hlavní paměti. 660 00:41:35,680 --> 00:41:40,990 Takže nějaké lokální proměnné, které foo má skončit druh pojmově vyšší než v hlavním. 661 00:41:40,990 --> 00:41:47,070 Pokud foo volá jinou funkci nazvanou bar, tyto proměnné skončí tady. 662 00:41:47,070 --> 00:41:50,120 Pokud bar volá něco jiného, ​​zde, zde, zde. 663 00:41:50,120 --> 00:41:53,830 Takže to, co je na tom zajímavé spuštění programu je to, že jak volat funkce 664 00:41:53,830 --> 00:41:57,750 a jelikož tyto funkce volat funkce a jak tyto funkce volat funkce, 665 00:41:57,750 --> 00:42:01,470 si vybudovat tento balík funkcí v paměti. 666 00:42:01,470 --> 00:42:06,890 A jen jednou za funkce vrátí se můžete začít se, že paměť vrátit. 667 00:42:06,890 --> 00:42:10,860 Takže jedním z nejjednodušších způsobů, jak běží z paměti v počítačovém programu 668 00:42:10,860 --> 00:42:14,360 je psát funkce, které se nikdy nevrátí. 669 00:42:14,360 --> 00:42:18,900 Tak například, pojďme prokázat až se úmyslně buggy programu. 670 00:42:18,900 --> 00:42:22,230 Nech mě jít napřed a nenechám # include , 671 00:42:22,230 --> 00:42:25,000 int main (void), 672 00:42:25,000 --> 00:42:32,940 a budu dělat, když (2> 1), který pravděpodobně nebude nikdy měnit na nás, 673 00:42:32,940 --> 00:42:37,560 a nech mě jít napřed teď a dělat printf. 674 00:42:37,560 --> 00:42:40,700 Vlastně, že to bude méně vizuálně zajímavé. Pojďme to. 675 00:42:40,700 --> 00:42:50,240 Pro int i = 0; i> 0 - pojďme udělat stejnou chybu - i + +. 676 00:42:50,240 --> 00:42:52,720 A ať to není printf zde. Pojďme praktikovat to, co jsem kázal. 677 00:42:52,720 --> 00:43:00,190 Pojďme mít metodu tady, void refrén, a řekneme int i, 678 00:43:00,190 --> 00:43:06,830 a pak jsem chtěl říct printf - ne, pojďme udělat to zajímavější. 679 00:43:06,830 --> 00:43:15,790 Pojďme vlastně nevytiskne vůbec nic. Řekněme to: chorus (i). 680 00:43:15,790 --> 00:43:20,390 Dobrá. Tak to je buggy protože proč? 681 00:43:20,390 --> 00:43:23,380 Já jsem to vymyslela, jak jsem jít, protože program není vlastně dělat něco zajímavého. 682 00:43:23,380 --> 00:43:25,320 >> Ale to není cílem. 683 00:43:25,320 --> 00:43:29,630 Cílem je napsat program, jehož hlavní funkcí je co dělá, očividně? 684 00:43:30,720 --> 00:43:32,860 Zavolejte sám. A skutečně, nepotřebujeme smyčku. 685 00:43:32,860 --> 00:43:37,200 Pojďme ještě zjednodušit tím, jen tak, abychom neztratili ze zřetele opravdu základní chybu. 686 00:43:37,200 --> 00:43:39,640 Hlavní vyzývá sbor zpívat nějaký refrén, 687 00:43:39,640 --> 00:43:41,440 pak jsem udělal něco hloupého, a měl jsem refrén refrén volání 688 00:43:41,440 --> 00:43:43,760 protože jsem předpokládal, někdo jiný se bude implementovat možná, 689 00:43:43,760 --> 00:43:47,210 a teď to nebude sestavovat ještě. Musím udělat, co? 690 00:43:47,210 --> 00:43:49,970 Potřebuju prototyp, nezapomeňte. 691 00:43:49,970 --> 00:43:56,110 Tak jsem třeba mít tady void chór (int i); 692 00:43:56,110 --> 00:43:59,210 Takže teď když jdu tady - ve skutečnosti, pojďme použijte větší okno. 693 00:43:59,210 --> 00:44:01,980 Pojďme dál a udělat sbor. 694 00:44:01,980 --> 00:44:06,490 Pojďme dál a udělat sbor. 695 00:44:06,490 --> 00:44:08,370 Použití nehlášené identifikátor i. 696 00:44:08,370 --> 00:44:12,500 Oh, to bylo hloupé. Nepotřebujeme argument. Prostě to. 697 00:44:12,500 --> 00:44:16,370 Přeji si, abychom začali tímto způsobem. Bylo by to mnohem jednodušší program psát. 698 00:44:16,370 --> 00:44:25,590 Tam. Nyní pojďme na moji terminálovém okně, spusťte řinčet, a jdeme na to. 699 00:44:25,590 --> 00:44:28,460 To byl opravdu rychlý. 700 00:44:28,460 --> 00:44:31,150 Co se vlastně právě stalo, když? 701 00:44:31,150 --> 00:44:33,730 No, teď budu přidávat tiskovou linku, takže můžeme vidět. 702 00:44:33,730 --> 00:44:43,490 Dovolte mi, abych printf ("Jsem tady") - žádné proměnné. Necháme to takhle. 703 00:44:43,490 --> 00:44:47,480 Dovolte mi, abych znovu spustit make. Dovolte mi, abych znovu spusťte refrén. 704 00:44:47,480 --> 00:44:57,380 A ... no. Jen tak dál. 705 00:44:57,380 --> 00:44:59,930 Jak stranou, proč se nezhroutil? 706 00:44:59,930 --> 00:45:02,080 Segmentation fault stalo super rychlý předtím. 707 00:45:02,080 --> 00:45:06,570 [Neslyšitelné Student odpověď] >> Přesně tak. Tak to trvá dobu tisku, že jo? 708 00:45:06,570 --> 00:45:08,610 Je to jen má více práce na počítači v rámci. 709 00:45:08,610 --> 00:45:10,620 A je to tady: Segmentation fault. 710 00:45:10,620 --> 00:45:12,340 >> Tak zjistíte, jak rychle programy běží. 711 00:45:12,340 --> 00:45:14,130 Pokud si nejste tisku nic, super rychlý. 712 00:45:14,130 --> 00:45:18,770 Ale my pořád tuto segmentation fault, protože to, co se děje? 713 00:45:18,770 --> 00:45:21,210 Pokud si myslíte, že o tom, jak je váš počítač paměť stanoven, 714 00:45:21,210 --> 00:45:28,740 to se stane být hlavní, ale tady pojďme nazývat refrén, a říkejme této chór. 715 00:45:28,740 --> 00:45:34,550 A teď když to udělám své estetiku právo, je to jen říct chorus, chorus, chorus, 716 00:45:34,550 --> 00:45:40,550 chorus, chorus, chorus, chorus, ad nauseum, a nakonec, co se bude dít? 717 00:45:40,550 --> 00:45:45,630 Pokud velký obrázek, doslova, je to, co se právě děje koncepčně? 718 00:45:46,520 --> 00:45:48,630 Stoh přejíždí haldy. 719 00:45:48,630 --> 00:45:51,940 Nebo ještě hůř, stačí překročení všechno, včetně textového segmentu, 720 00:45:51,940 --> 00:45:54,590 který je 0 a 1, které představují svůj program. 721 00:45:54,590 --> 00:45:57,080 Stručně řečeno, je to prostě super, super špatný. 722 00:45:57,080 --> 00:45:58,830 Váš program se vymkla kontrole. 723 00:45:58,830 --> 00:46:01,220 Používáte způsobem více paměti, než jste zamýšleli 724 00:46:01,220 --> 00:46:03,960 všechno kvůli hloupé chyby v tomto případě, 725 00:46:03,960 --> 00:46:08,040 nebo v tomto případě velmi záměrně provádí funkce volat sebe. 726 00:46:08,040 --> 00:46:09,500 Nyní, to není tak špatné. 727 00:46:09,500 --> 00:46:13,800 Funkce volání se vlastně má velkou sílu, když ji použijete správně. 728 00:46:13,800 --> 00:46:15,800 Osobně jsem nepoužil správně zde. 729 00:46:15,800 --> 00:46:19,780 Takže to není zase tak špatné, ale fakt, že jsem vlastně nikdy přestat volat sám 730 00:46:19,780 --> 00:46:23,520 je základní slabina zde tohoto programu. 731 00:46:23,520 --> 00:46:26,400 Tak kam jdeme s tím vším? Co se vlastně děje? 732 00:46:26,400 --> 00:46:30,340 Když říkám přírůstek funkce, jako jsme dělali v těch příkladech, 733 00:46:30,340 --> 00:46:33,420 Mám hodnotu jako 1, že jsem se projít dovnitř 734 00:46:33,420 --> 00:46:37,570 I předat kopii čísla 1, takže se stane následující. 735 00:46:37,570 --> 00:46:44,240 Pojďme do přírůstku příkladu, ten chlap támhle. 736 00:46:44,240 --> 00:46:46,870 Zde je to, co se vlastně děje. 737 00:46:46,870 --> 00:46:53,400 Když jsem se zavolat přírůstek a já předat x, obrazově, co se děje tady, je to. 738 00:46:53,400 --> 00:46:59,520 >> Pokud budu mít hodnotu 1 uloženou tady a já jsem vlastně volat přírůstek, 739 00:46:59,520 --> 00:47:04,330 která se nyní nazývá sbor - iPad hází mě tady. 740 00:47:04,330 --> 00:47:09,760 Říkejme této přírůstek, a my nevíme, co to další funkce bude. 741 00:47:09,760 --> 00:47:14,840 Takže co se vlastně děje, je tady někde v hlavní mám kus paměti 742 00:47:14,840 --> 00:47:17,000 , který je ukládání číslo 1. 743 00:47:17,000 --> 00:47:19,380 Když říkám, přírůstek, já jsem s použitím jiného kus paměti, 744 00:47:19,380 --> 00:47:21,230 ale teď mám kopii 1. 745 00:47:21,230 --> 00:47:26,660 Když jsem zvyšte tuto hodnotu, to se stává 2, 746 00:47:26,660 --> 00:47:30,560 ale co se stane pak, jakmile přírůstu vrátí? 747 00:47:30,560 --> 00:47:33,630 Tato paměť jen dostane předán zpět do operačního systému, 748 00:47:33,630 --> 00:47:37,450 což znamená, že vše, co jste udělal, je nic užitečného. 749 00:47:37,450 --> 00:47:43,120 1, která byla původně obsažena v main je stále ve skutečnosti neexistují. 750 00:47:43,120 --> 00:47:44,890 Tak kam půjdeme s tím? 751 00:47:44,890 --> 00:47:49,770 Ukazuje se, že v paměti máte tuto back-to-back posloupnost bajtů 752 00:47:49,770 --> 00:47:53,050 které si můžete dát věci do, a ukázalo se, že jsme už viděli něco 753 00:47:53,050 --> 00:47:55,390 která zahrnuje uvedení věci zpět k sobě, aby se zády k sobě. 754 00:47:55,390 --> 00:47:59,860 Co je řetězec založený na týden 1 a teď týden 2? 755 00:48:00,020 --> 00:48:01,980 Je to jen sbírka postav. 756 00:48:01,980 --> 00:48:04,310 Tak to dopadá, stejně jako si můžete dát čísla v paměti, 757 00:48:04,310 --> 00:48:06,990 podobně si můžete dát znaky v paměti. 758 00:48:06,990 --> 00:48:10,530 A jakmile začneme putting znaky v paměti zpět k sobě, aby zády k sobě, 759 00:48:10,530 --> 00:48:13,620 ukazuje se, že s nejjednodušší věci, jako pro vedení nebo smyčky while, 760 00:48:13,620 --> 00:48:17,170 můžeme iterovat zleva doprava přes znaky v řetězci 761 00:48:17,170 --> 00:48:20,600 a začít masírovat do různých postav úplně - 762 00:48:20,600 --> 00:48:23,370 se může stát b, mohl b stát c - 763 00:48:23,370 --> 00:48:27,780 takže nakonec můžeme mít anglickou větu, která skutečně dává smysl 764 00:48:27,780 --> 00:48:30,310 a převést každý z těchto dopisů jeden po druhém 765 00:48:30,310 --> 00:48:34,400 pěšky přes naší paměti počítače zleva doprava skutečně zašifrovat. 766 00:48:34,400 --> 00:48:35,810 Takže pojďme se náš pětiminutovou přestávku tady, 767 00:48:35,810 --> 00:48:40,730 a až se vrátíme, začneme tento proces zakódování informací. 768 00:48:42,020 --> 00:48:43,520 >> Dobrá. 769 00:48:43,520 --> 00:48:48,070 Než jsme se ponořit do nějakého crypto a tyto věci tzv. pole, 770 00:48:48,070 --> 00:48:51,470 dovolte mi, abych pauza pro případné dotazy, protože mám pocit, že jsem opravdu trochu zmatené 771 00:48:51,470 --> 00:48:54,080 některé z těchto témat. Takže pojďme opravit hned, jestli můžeme. 772 00:48:54,080 --> 00:48:58,700 Právě jsme mluvili o návratových hodnot, jsme hovořili o argumenty, 773 00:48:58,700 --> 00:49:03,250 a mluvili jsme o tomto pojmu, který se vrátíme v příštích týdnech, 774 00:49:03,250 --> 00:49:08,720 nahlížení paměti jako celou partou těchto skládané zásobníků, abych tak řekl, 775 00:49:08,720 --> 00:49:12,660 zdola nahoru, tak, že každý zásobník, který se dal na stack 776 00:49:12,660 --> 00:49:16,530 představuje funkci, která je v současné době s názvem. 777 00:49:17,900 --> 00:49:20,260 Nějaké otázky? 778 00:49:20,260 --> 00:49:22,640 Dovolte mi, abych na něco zeptat zde. 779 00:49:22,640 --> 00:49:27,890 Dovolte mi, abych zjednodušit to zpět k tomu, co bylo předtím, než některé z našich dřívějších Q & A. 780 00:49:27,890 --> 00:49:35,570 Skutečnost, že přírůstek má otevřené závorky, int číslo, uzavřená závorka - 781 00:49:35,570 --> 00:49:39,110 co int číslo představuje? 782 00:49:39,110 --> 00:49:42,790 [Student] argument. >> Argument. Dobře. Ale co je to argument? 783 00:49:42,790 --> 00:49:46,370 [Neslyšitelné Student odpověď] >> Co je to? >> [Student] Něco, co vám projít dovnitř 784 00:49:46,370 --> 00:49:49,940 Dobře, tak něco, co vám projít dovnitř a obecněji, je to jen vstup. 785 00:49:49,940 --> 00:49:52,450 Pokud jste psali funkci a tuto funkci je smysl života 786 00:49:52,450 --> 00:49:55,770 je to něco trochu jiného každém použití ji, 787 00:49:55,770 --> 00:50:00,110 pak jediný způsob, jak k tomu může dojít skutečně se zdá být, aby to se vstupem 788 00:50:00,110 --> 00:50:03,510 tak, že to může udělat něco s tím vstupem pokaždé. 789 00:50:03,510 --> 00:50:06,650 >> Takže budete muset zadat dvě věci, když funkce má vstup. 790 00:50:06,650 --> 00:50:09,590 Musíte zadat jméno, které chcete, aby k tomuto vstupu 791 00:50:09,590 --> 00:50:12,700 čistě pro své vlastní pohodlí, takže můžete odkazovat se na to 792 00:50:12,700 --> 00:50:16,540 ve funkci, že vy sami píšete, jak jsem zde v souladu 32. 793 00:50:16,540 --> 00:50:20,800 Ale také je třeba zadat její typ, protože C je programovací jazyk 794 00:50:20,800 --> 00:50:25,940 že jen vyžaduje, že pokud chcete proměnnou, budete muset říct počítači, co datový typ je, 795 00:50:25,940 --> 00:50:30,200 z velké části tak, že to ví, kolik bitů se přidělit pro uvedené proměnné 796 00:50:30,200 --> 00:50:33,020 protože by to mohlo být 6 - sorry, to nebude 6. 797 00:50:33,020 --> 00:50:37,080 To může být 16, může to být 8, může to být 32, a to i 64, 798 00:50:37,080 --> 00:50:39,130 ale počítač potřebuje vědět. 799 00:50:39,130 --> 00:50:43,180 Nyní, int na levé straně představuje to, co naopak? 800 00:50:46,350 --> 00:50:48,850 [Neslyšitelné Student odpověď] >> Co je to? >> [Student] Typ funkce. 801 00:50:48,850 --> 00:50:53,610 Typ funkce, a konkrétněji, typ své produkce. Přesně tak. 802 00:50:53,610 --> 00:50:57,380 Takže vzhledem k tomu, věc v závorce představuje jeho vklad, pokud existují, 803 00:50:57,380 --> 00:50:59,660 věc vlevo představuje jeho výstupu. 804 00:50:59,660 --> 00:51:03,530 A v tomto případě, přírůstek zřejmě vrátí int, 805 00:51:03,530 --> 00:51:07,690 a tak int je návratový typ této funkce. 806 00:51:07,690 --> 00:51:09,340 Co to znamená vrátit? 807 00:51:09,340 --> 00:51:15,090 Doslova, můžete použít klíčové slovo návrat a pak, pokud jste, co jste vrací 808 00:51:15,090 --> 00:51:18,600 vpravo klíčového slova je celé číslo, 809 00:51:18,600 --> 00:51:21,660 pak je to skutečně v souladu s tím, co jsme slíbili. 810 00:51:21,660 --> 00:51:26,410 Dalo by se to udělat něco takového - ahoj, svět - protože to je řetězec. 811 00:51:26,410 --> 00:51:28,860 >> Je zřejmé, že se nejedná o celé číslo. 812 00:51:28,860 --> 00:51:33,140 Takže ve zkratce, zátěž je opravdu na nás, programátor, být konkrétní 813 00:51:33,140 --> 00:51:37,770 na to, co se vracíme a pak vlastně jít o vracení. 814 00:51:37,770 --> 00:51:43,440 Kontext zde nyní je, že počítače paměť je gigabyte, 2 GB - 815 00:51:43,440 --> 00:51:45,920 cokoliv - možná je to víc, možná je to méně, 816 00:51:45,920 --> 00:51:49,050 ale počítač považuje to, že mají různé oddíly. 817 00:51:49,050 --> 00:51:51,200 Něco jde tam, něco jde tam, 818 00:51:51,200 --> 00:51:54,290 různé věci jde ve středu, a dnes jsme prostě začít vyprávět příběh, 819 00:51:54,290 --> 00:51:56,340 ale vrátíme k tomuto v průběhu času. 820 00:51:56,340 --> 00:51:59,980 Pro tuto chvíli, jen kousek paměti opravdu záleží, je text segmentu 821 00:51:59,980 --> 00:52:03,360 proto, že právě představuje 0s a 1s, že zvonění je na výstupu. 822 00:52:03,360 --> 00:52:06,050 Takže při spuštění příkazu na klávesnici, jako a.out 823 00:52:06,050 --> 00:52:09,110 nebo poklepáním na ikonu na Mac OS nebo Windows, 824 00:52:09,110 --> 00:52:11,880 Váš program je nabitý z pevného disku do paměti RAM 825 00:52:11,880 --> 00:52:16,330 a to svalil na vrcholu RAM počítače, abych tak řekl. 826 00:52:16,330 --> 00:52:20,450 Mezitím, jak váš program spustí a hlavní volána 827 00:52:20,450 --> 00:52:23,640 v programu, který psal nebo program Microsoft nebo Apple napsal, 828 00:52:23,640 --> 00:52:27,860 kterýkoli z jejích lokálních proměnných skončí tam dole na dně paměti vašeho počítače. 829 00:52:27,860 --> 00:52:33,230 Ale pokud hlavní vyzývá další funkce, které samo o sobě má proměnné nebo argumenty, které skončily nad ním. 830 00:52:33,230 --> 00:52:36,680 A pokud tato funkce volá něco, oni skončí nad ním, nad ním, nad ním. 831 00:52:36,680 --> 00:52:41,460 >> A pouze jednou funkcí se provádí spuštěním se stoh přihrádek, abych tak řekl, 832 00:52:41,460 --> 00:52:43,240 začít se dostat nižší a nižší. 833 00:52:43,240 --> 00:52:48,250 A to je to, co pak, v kostce, vysvětluje, proč při volání kostku 834 00:52:48,250 --> 00:52:51,550 nebo volejte přírůstek, jste předáním kopie hodnoty. 835 00:52:51,550 --> 00:52:55,520 A co to znamená, obrazově je to, že jste doslova psaní číslo 1 836 00:52:55,520 --> 00:53:00,460 v jiné části paměti, měnící se, že 1-2 v případě přírůstku 837 00:53:00,460 --> 00:53:04,820 nebo na 8 v případě krychle a pak házení, že paměť pryč 838 00:53:04,820 --> 00:53:09,140 jakmile přírůstku nebo vrátí krychle funkce. Otázka. 839 00:53:09,140 --> 00:53:12,900 [Student] Kde jsou globální proměnné uloženy? 840 00:53:12,900 --> 00:53:18,100 Globální proměnné jsou uloženy v tom, co se v současné době nazývá inicializovat data nebo neinicializované dat, 841 00:53:18,100 --> 00:53:21,920 Rozdíl je, pokud máte globální proměnnou a přiřadit ji okamžitě hodnotu 842 00:53:21,920 --> 00:53:24,640 s rovnítko, skončí na vrcholu, 843 00:53:24,640 --> 00:53:29,200 a pokud si jen říct, int x, bez hodnoty, skončí o něco nižší v paměti RAM 844 00:53:29,200 --> 00:53:31,710 prostě konvencí. 845 00:53:31,710 --> 00:53:34,940 Další otázky? Dobrá. 846 00:53:34,940 --> 00:53:37,340 Takže tento obrázek vrátí, jak jsme si silnější 847 00:53:37,340 --> 00:53:39,170 s tím, co můžeme dělat s počítačem, 848 00:53:39,170 --> 00:53:42,720 ale teď, pojďme se krátce intro na kryptografii, 849 00:53:42,720 --> 00:53:46,080 specifický typ kryptografie, která neřeší všechny problémy světa 850 00:53:46,080 --> 00:53:47,720 ale vyřešit některé z nich. 851 00:53:47,720 --> 00:53:51,700 V tomto případě zde máme něco, co nazývá tajný klíč kryptografie. 852 00:53:51,700 --> 00:53:56,410 Secret-klíčová kryptografie, jak již název napovídá, pochází jeho zabezpečení z tajemství. 853 00:53:56,410 --> 00:54:00,690 >> Například, pokud jste byli zpátky na základní škole a jste míjeli malou tajnou milostný dopis 854 00:54:00,690 --> 00:54:04,850 na chlapce nebo dívku jste drtily na, pokud byste chtěli projít, aby na vědomí prostřednictvím publika, 855 00:54:04,850 --> 00:54:08,380 pravděpodobně by se napsat takový poznámku v angličtině nebo jaký je váš rodný jazyk je. 856 00:54:08,380 --> 00:54:13,340 Spíše, můžete zašifrovat, nebo můžete jen poslat textovou zprávu v těchto dnech. 857 00:54:13,340 --> 00:54:15,460 Ale možná ve skutečnosti předat jim vzkaz v celé třídě. 858 00:54:15,460 --> 00:54:18,700 A k tomu bezpečně takovým způsobem, aby vaši přátelé a učitel 859 00:54:18,700 --> 00:54:22,650 Nevím, co píšete, můžete přijít s poměrně jednoduchým algoritmem, 860 00:54:22,650 --> 00:54:25,920 mladý, že jste mohl být, jen tahanice slova. 861 00:54:25,920 --> 00:54:28,130 Takže místo psaní můžete psát b, 862 00:54:28,130 --> 00:54:30,220 místo b můžete psát C, 863 00:54:30,220 --> 00:54:32,140 místo c můžete napsat d, a tak dále. 864 00:54:32,140 --> 00:54:34,360 Nebo byste mohli přijít s sofistikovanější překladu 865 00:54:34,360 --> 00:54:36,720 dopisů do různých písmen. 866 00:54:36,720 --> 00:54:39,740 Ale úlovek je chlapec nebo dívka, které posíláte na vědomí 867 00:54:39,740 --> 00:54:45,020 potřebuje něco vědět, což je to, co, samozřejmě? >> [Student] Co posíláte. 868 00:54:45,020 --> 00:54:49,720 Jaký je váš tajemství je, stejně jako to, co je, že mapování mezi tyto a B a C je a d's. 869 00:54:49,720 --> 00:54:54,650 Je to jen přidává 1 pro každý z dopisů jít z bodu A do B, B na C? 870 00:54:54,650 --> 00:54:56,670 Je to složitější, než to? 871 00:54:56,670 --> 00:55:01,540 >> Takže vy a vaše rozdrtit potřebujete mít tuto tajnou informaci, 872 00:55:01,540 --> 00:55:03,190 ale je tu trochu catch-22 zde. 873 00:55:03,190 --> 00:55:06,830 Pokud je to vůbec poprvé posíláte milostný dopis prostřednictvím třídy, 874 00:55:06,830 --> 00:55:10,720 Jak je to, že chlapec či dívka bude vědět, co je tajemství ještě je? 875 00:55:10,720 --> 00:55:13,930 Takže tajný šifrovací klíč není vyřešit všechny problémy světa, 876 00:55:13,930 --> 00:55:16,320 a je to vlastně vztah, zde se vrátíme k na semestr konci. 877 00:55:16,320 --> 00:55:25,110 Podobně se většina z nás neví někdo, že pracuje, například na Amazon.com, 878 00:55:25,110 --> 00:55:28,190 a přesto mnozí z nás pravděpodobně koupil věci na Amazon.com, 879 00:55:28,190 --> 00:55:31,990 a my jsme se učili předpokládat, že tyto e-commerce transakce jsou bezpečné. 880 00:55:31,990 --> 00:55:36,470 URL pravděpodobně říká https, je to možná hloupá ikona visacího zámku někde, 881 00:55:36,470 --> 00:55:39,930 tam je nějaký druh kryptografie zabezpečení informací o kreditní kartě 882 00:55:39,930 --> 00:55:42,160 mezi vámi a Amazon.com. 883 00:55:42,160 --> 00:55:45,430 A přesto, pokud kryptografie znamená vědět, nějaké tajemství, 884 00:55:45,430 --> 00:55:48,620 a přesto jsem nikoho neznám na Amazon, a já jsem rozhodně nejsou uspořádány jakékoliv tajemství 885 00:55:48,620 --> 00:55:52,710 s někým na Amazon, jak je můj počítač, nebo můj prohlížeč dělat tohle? 886 00:55:52,710 --> 00:55:55,720 Ukazuje se, že je to jiné typy kryptografie celkem, že tento problém vyřešit. 887 00:55:55,720 --> 00:55:57,670 Ale pro dnešek, budeme soustředit na jednoduchá 888 00:55:57,670 --> 00:56:00,290 kde si můžete zařídit v předstihu vědět nějaké tajemství, 889 00:56:00,290 --> 00:56:03,760 jako 1 nebo nějaké mapování mezi tyto a b je. 890 00:56:03,760 --> 00:56:05,840 A proces kryptografie obecně zahrnuje to. 891 00:56:05,840 --> 00:56:08,620 Máte nějaký prostý text, je znázorněno zde na levé straně, 892 00:56:08,620 --> 00:56:12,930 jej spustit přes nějaký druh algoritmu nebo postupu pro šifrování ho - 893 00:56:12,930 --> 00:56:15,100 Možná, že to jen stane b, b stává c - 894 00:56:15,100 --> 00:56:17,490 a pak skončit s ciphertext. 895 00:56:17,490 --> 00:56:20,380 Mezitím, jakmile váš rozdrtit obdrží tuto tajnou poznámku, 896 00:56:20,380 --> 00:56:24,200 on nebo ona má pak dešifrovat to tím, že obecně změny tohoto algoritmu 897 00:56:24,200 --> 00:56:27,190 tak, jak se dostat zpět prostý text. 898 00:56:27,190 --> 00:56:28,960 Tam jsou fyzické inkarnace tohoto. 899 00:56:28,960 --> 00:56:31,680 >> Například, to je malé tajemství dekodér kroužek, 900 00:56:31,680 --> 00:56:35,110 a to je kroužek v tom smyslu, že jsou dva vytočí zde. 901 00:56:35,110 --> 00:56:38,490 Na vnější okraji této věci, je tu písmena A až Z, 902 00:56:38,490 --> 00:56:40,340 i když to v náhodném pořadí, 903 00:56:40,340 --> 00:56:42,880 a na vnitřní straně, je to vlastně některá čísla 904 00:56:42,880 --> 00:56:46,620 takové, že se tohoto kroužku můžete druh obrátit zvenčí, ale ne v 905 00:56:46,620 --> 00:56:49,140 aby se seřadí čísla s písmeny. 906 00:56:49,140 --> 00:56:53,020 Z filmu s názvem Vánoční příběh, budete vidět, že malý Ralphie 907 00:56:53,020 --> 00:56:58,000 byl tak dychtivý zjistit, co Little Orphan Annie tajný vzkaz byl pro něj 908 00:56:58,000 --> 00:57:02,570 které byly předány, myslím, ve formě číselných zpráv na obilovin krabici 909 00:57:02,570 --> 00:57:07,220 a vy jste museli shromažďovat všechny ty malé karty, které byly dodány v krabici obilovin, 910 00:57:07,220 --> 00:57:09,770 jste měli na e-mail je v, museli jste se vrátit tajný dekodér kroužek 911 00:57:09,770 --> 00:57:13,910 takže si můžete konečně zjistit, co je mapování mezi písmeny a číslicemi 912 00:57:13,910 --> 00:57:15,550 nebo písmena a písmena. 913 00:57:15,550 --> 00:57:19,520 Jak v počítači můžeme jít o zavádění nebo zastupující takové věci? 914 00:57:19,520 --> 00:57:22,560 Potřebujeme způsob, jak vyjádřit sebe trochu pružněji 915 00:57:22,560 --> 00:57:25,080 než naše proměnné, doposud dovoleno. 916 00:57:25,080 --> 00:57:29,000 Jsme měli Ints, jsme měli znaky, měli jsme plováky a dvoulůžkových a několika dalšími, 917 00:57:29,000 --> 00:57:34,200 ale ty jsou jednotlivé kusy paměti, které nejsou opravdu nám umožňují vyjádřit věci 918 00:57:34,200 --> 00:57:36,440 jako slov a vět a frází. 919 00:57:36,440 --> 00:57:38,630 Opravdu, jsme jen takové věci, řetězce, 920 00:57:38,630 --> 00:57:42,660 ale slibujeme, že je to opravdu jen zjednodušení v CS50 knihovně 921 00:57:42,660 --> 00:57:45,540 že jsme v úmyslu slupkou zpět. 922 00:57:45,540 --> 00:57:47,500 A tak pojďme začít dělat, že tady. 923 00:57:47,500 --> 00:57:49,840 Nech mě jít dál a otevřít soubor - 924 00:57:49,840 --> 00:57:54,100 Všechny tyto soubory jsou k dispozici, jako obvykle, online - tzv. array.c 925 00:57:54,100 --> 00:57:58,960 vyřešit problém nesouvisí s řetězci, ale že maluje obrázek zde 926 00:57:58,960 --> 00:58:01,520 o tom, jak bychom mohli použít něco jako pole. 927 00:58:01,520 --> 00:58:04,050 >> Pole je datový typ. 928 00:58:04,050 --> 00:58:10,730 Je to typ proměnné druhů, který má více menších datových typů uvnitř ní 929 00:58:10,730 --> 00:58:12,680 zády k sobě, aby se zády k sobě. 930 00:58:12,680 --> 00:58:16,980 Tak například, pokud bychom chtěli napsat malý program, který vám dává váš kvíz průměr 931 00:58:16,980 --> 00:58:19,780 do kurzu jako 50, který má 2 vyslýchá, 932 00:58:19,780 --> 00:58:23,450 můžete velmi snadno napsat tento program založený i na některé z minulého týdne materiálu 933 00:58:23,450 --> 00:58:28,830 pomocí GetInt a pár proměnných: int quiz1, int quiz2. 934 00:58:28,830 --> 00:58:30,550 A je to docela jednoduché. 935 00:58:30,550 --> 00:58:33,500 Možná je to 10, 20 řádky kódu max. provádět program 936 00:58:33,500 --> 00:58:38,940 že žádá uživatele o 2 kvizů skóre a poté vypočítá jejich průměr 937 00:58:38,940 --> 00:58:42,020 přidáním dohromady, dělení 2, a pak tisk výsledků. 938 00:58:42,020 --> 00:58:46,400 Bychom pravděpodobně mohli udělat docela snadno se po nějakém počtu minut. 939 00:58:46,400 --> 00:58:49,450 Ale problém je, že předpokládám, že 50 měl 3 kvízy nebo 4. 940 00:58:49,450 --> 00:58:52,830 Předpokládejme, že jste chtěli použít stejný program pro třídu, která měla týdenní kvízy. 941 00:58:52,830 --> 00:58:55,100 Přemýšlejte o třídy, která se jednou týdně kvízy. 942 00:58:55,100 --> 00:58:58,840 Pokud je 16 nebo tak týdnů v semestru, nyní máte 16 proměnných: 943 00:58:58,840 --> 00:59:03,030 int quiz1, int quiz2, int quiz3, int quiz4. 944 00:59:03,030 --> 00:59:06,870 Jakmile začnete vidět tuto redundanci, tento kopírování a vkládání kódu, 945 00:59:06,870 --> 00:59:09,810 by měla začít, aby se vám, aby tu bylo lepší způsob. 946 00:59:09,810 --> 00:59:13,610 A naštěstí, protože z polí je. Takže jdeme na to. 947 00:59:13,610 --> 00:59:16,700 Za prvé, dovolte mi představit velmi jednoduchou věc, že ​​jsme se nepoužívá tak daleko, 948 00:59:16,700 --> 00:59:18,820 ale uvidíte to občas v kódu. 949 00:59:18,820 --> 00:59:21,270 >> To je to, co se obecně nazývá konstanta. 950 00:59:21,270 --> 00:59:24,410 Takže je to konstanta v tom smyslu, že tato hodnota nikdy se mění. 951 00:59:24,410 --> 00:59:26,450 Lidská konvence při vytváření konstantní 952 00:59:26,450 --> 00:59:30,420 je používají všechna velká písmena jen proto, že to opravdu vyniká v kódu, 953 00:59:30,420 --> 00:59:34,270 a speciální klíčové slovo, které používáte v C je # define. 954 00:59:34,270 --> 00:59:39,970 Takže říkáme # define, pak mezeru, pak slovo, které chcete použít pro konstantní jméno 955 00:59:39,970 --> 00:59:41,730 a pak je hodnota konstanty. 956 00:59:41,730 --> 00:59:44,710 Všimněte se, že se liší od přiřazení něco proměnné. 957 00:59:44,710 --> 00:59:46,430 Není rovnítko, není středník. 958 00:59:46,430 --> 00:59:49,140 To je to, co je všeobecně známo jako preprocesoru směrnice, 959 00:59:49,140 --> 00:59:50,840 ale o tom až jindy. 960 00:59:50,840 --> 00:59:56,350 Pro tuto chvíli, to vytváří neměnný hodnotu s názvem kvízy 961 00:59:56,350 --> 00:59:58,290 jehož skutečná číselná hodnota je 2. 962 00:59:58,290 --> 01:00:02,180 Takže kdekoli vidíte kvízy, kvízy, kvízy v tomto souboru, 963 01:00:02,180 --> 01:00:04,230 že je to jen číslo 2. 964 01:00:04,230 --> 01:00:06,550 Když se podívám na hlavní teď, pojďme se podívat, jak to funguje. 965 01:00:06,550 --> 01:00:09,770 Nejprve to vypadá trochu záhadný, ale je to všechno věci od týdne 1. 966 01:00:09,770 --> 01:00:12,210 Požádejte uživatele, pro stupně. Jak to uděláme? 967 01:00:12,210 --> 01:00:17,350 V řádku 22 - to je opravdu šťavnaté část - Prohlašuji, plovák 968 01:00:17,350 --> 01:00:23,240 ale ne jen jediný plovák. Jsem prohlašuje, spíše pole s plovoucí desetinnou čárkou. 969 01:00:23,240 --> 01:00:27,700 Že proměnná se bude nazýván stupně, jak vyplývá tady, 970 01:00:27,700 --> 01:00:31,420 ale jediný kus nové syntaxi pak jsou tyto hranaté závorky. 971 01:00:31,420 --> 01:00:37,280 Skutečnost, že jsem řekl, float stupně a pak otevřete konzolu a pak řada - 972 01:00:37,280 --> 01:00:40,980 výpovědní lhůty, pokud je to konstanta je to stejně jako jsme to udělali - 973 01:00:40,980 --> 01:00:46,840 to znamená, "Hey počítač, dej mi 2 plováky a pojďme společně nazývají stupně." 974 01:00:46,840 --> 01:00:51,780 >> Toto je v kontrastu k mnohem nudnější procesu, jako je toto: float grade1; 975 01:00:51,780 --> 01:00:54,580 plavat grade2, a tak dále. 976 01:00:54,580 --> 01:00:58,310 Takže pole nám umožňuje realizovat tuto myšlenku, ale mnohem méně ledabyle, 977 01:00:58,310 --> 01:01:04,560 takovým způsobem, že můžeme napsat 1 řádek kódu místo, říci, 16 pro 16 týdnů semestru. 978 01:01:04,560 --> 01:01:09,060 Nechtěl jsem, aby hard-kód 2, protože pokud si myslíte, že o tom teď logicky, 979 01:01:09,060 --> 01:01:12,560 Předpokládám, že příští rok CS50 změny 3 kvízy místo 980 01:01:12,560 --> 01:01:15,010 a měl jsem číslo 2 zde, měl jsem číslo 2 tady, 981 01:01:15,010 --> 01:01:17,210 Měl jsem číslo 2 tady, číslo 2 zde. 982 01:01:17,210 --> 01:01:19,890 To se stává velmi únavné a velmi snadno zkazit 983 01:01:19,890 --> 01:01:26,550 a náhodně změnit hodnotu 1 až 3, a přichází jinou hodnotu 2. 984 01:01:26,550 --> 01:01:30,660 Takže budu místo abstraktní toto pryč a použít tato konstanta, která, 985 01:01:30,660 --> 01:01:32,520 jak již název napovídá, se nikdy nezmění. 986 01:01:32,520 --> 01:01:35,870 A teď bez ohledu na to, zda máme různé kvízy Letos nebo příští rok, 987 01:01:35,870 --> 01:01:39,380 Musím se změnit v jednom místě se zde na vrchol. 988 01:01:39,380 --> 01:01:41,230 Takže to je vše, konstanta je. 989 01:01:41,230 --> 01:01:47,100 Mezitím, nová pojmovým znakem je to, že z pole. 990 01:01:47,100 --> 01:01:55,030 Takže hranaté závorky mi tolik plováky a mě nechá společně nazývají stupně zde. 991 01:01:55,030 --> 01:01:56,720 Takže teď se podíváme, co budu dělat. 992 01:01:56,720 --> 01:01:59,220 Tady v souladu 24 je začátek smyčky for. 993 01:01:59,220 --> 01:02:03,380 >> To je opravdu nic vymyšleného. Je to jen pomocí kvízů místo hard-kódované číslo. 994 01:02:03,380 --> 01:02:06,740 Ale nic intelektuálně jinak, tam z minulého týdne. 995 01:02:06,740 --> 01:02:11,650 To je jen printf, takže printf ("Kvíz #% d% d:") 996 01:02:11,650 --> 01:02:16,670 protože já jen chci vytisknout dej mi kvíz číslo 1 z 2 a pak 2 z 2. 997 01:02:16,670 --> 01:02:18,480 Tak tohle je čistě estetického věc. 998 01:02:18,480 --> 01:02:21,000 Ale zajímavá část je nyní v souladu 27. 999 01:02:21,000 --> 01:02:27,840 Aby bylo možné vyplnit v jednom ze dvou zástupných symbolů s desetinnou hodnotou, 1000 01:02:27,840 --> 01:02:29,640 můžete znovu použít hranaté závorky. 1001 01:02:29,640 --> 01:02:35,170 V tomto případě, já jsem s použitím i proto, že to pro smyčce začala s i rovná, jakou hodnotu, zřejmě? 1002 01:02:35,170 --> 01:02:36,670 [Student] 0. >> [Malan] 0. 1003 01:02:36,670 --> 01:02:40,990 Tak na první iteraci tohoto smyčky, je to, jako jsem napsal v kódu, 1004 01:02:40,990 --> 01:02:46,310 ale na druhé iteraci tohoto smyčky, je to, jako jsem napsal ve svém kódu. 1005 01:02:46,310 --> 01:02:49,970 Ale fakt, že jsem pomocí proměnné je perfektní, protože, jak již název napovídá, 1006 01:02:49,970 --> 01:02:52,600 je to různé její hodnotu na každé iteraci, 1007 01:02:52,600 --> 01:02:55,900 tak jsem vyplnění tohoto pole jeden bod v čase. 1008 01:02:55,900 --> 01:02:57,380 Co to pole vypadá? 1009 01:02:57,380 --> 01:03:01,570 Důvod, proč jsem čerpal super jednoduchý obdélník na obrazovce ještě před Právě z tohoto důvodu. 1010 01:03:01,570 --> 01:03:05,590 Pole je jen kus paměti následuje další kus paměti 1011 01:03:05,590 --> 01:03:08,570 následuje další kus paměti, a tak dále. 1012 01:03:08,570 --> 01:03:13,120 Takže pokud má pole je velikosti 2 v tomto případě tady, všechno, co bude dělat 1013 01:03:13,120 --> 01:03:20,200 zadáním v mých kvizů skóre jako tady - jsem 100 na tohle a pak jsem dostal 99 na tento jeden - 1014 01:03:20,200 --> 01:03:24,970 pak tato paměť nemusí být použit i proto, že jsem se jen zeptal počítač 1015 01:03:24,970 --> 01:03:26,840 pro pole o velikosti 2. 1016 01:03:26,840 --> 01:03:28,600 Tyto čtverce jsou stále tam, že jo? 1017 01:03:28,600 --> 01:03:32,670 Stále máte 2 GB paměti RAM, i když jste jen dotazem na 2 plováky. 1018 01:03:32,670 --> 01:03:36,840 Takže myšlenka polí je, že počítač prostě vezme kus paměti 1019 01:03:36,840 --> 01:03:41,340 a pak rozděluje menší kusy zády k sobě, aby se zády k sobě. 1020 01:03:41,340 --> 01:03:43,310 A tak to je vše, pole je. 1021 01:03:43,310 --> 01:03:47,350 >> Je to souvislá kus paměti uvnitř, které si můžete dát věci. 1022 01:03:47,350 --> 01:03:50,700 To se děje do té doby přece jen trochu nudný aritmetiku. 1023 01:03:50,700 --> 01:03:54,640 Kdybych přejděte tady, to je místo, kde jsem se pak iterovat přes pole. 1024 01:03:54,640 --> 01:03:58,020 I přicházejí s součtu všech hodnot v poli, 1025 01:03:58,020 --> 01:04:02,470 a pak jsem používat kolo funkce zde skutečně udělat součet děleno kvízy. 1026 01:04:02,470 --> 01:04:06,320 Ale dovolte mi, abych mávat ruku na to jako jakýsi dost aritmetiky pro teď. 1027 01:04:06,320 --> 01:04:08,370 Ale všechno, co dělá pro mě nakonec je výpočet průměru. 1028 01:04:08,370 --> 01:04:13,580 Takže první kvíz a druhý kvíz děleno 2 a pak tisk to jako int. 1029 01:04:13,580 --> 01:04:17,280 Ale pojďme teď přechod na jiný příklad s názvem string1, 1030 01:04:17,280 --> 01:04:20,700 který maluje podobný obraz, ale pomocí řetězce. 1031 01:04:20,700 --> 01:04:23,940 Nech mě jít napřed a zjednodušit tím, jen na chvíli. 1032 01:04:23,940 --> 01:04:27,090 Odpusťte odsazení pro teď. 1033 01:04:27,090 --> 01:04:30,870 Oznámení v souladu 19 tohoto příkladu, mám řetězec od uživatele. 1034 01:04:30,870 --> 01:04:34,640 Povšimněme si ale to, co jsem dělal další v řadách 22 vpřed. 1035 01:04:34,640 --> 01:04:41,250 Já jsem vlastně iterace od i do - a to je nový trik - strlen, délka řetězce. 1036 01:04:41,250 --> 01:04:44,880 To je funkce, která přichází s C, že pokud předat řetězec, 1037 01:04:44,880 --> 01:04:47,730 to vám řekne, kolik znaků v tomto řetězci. To je vše. 1038 01:04:47,730 --> 01:04:51,550 A skutečnost, že je to strlen místo řetězce délky je jen proto, že je to stručnější. 1039 01:04:51,550 --> 01:04:55,100 Před třiceti lety, se líbila psát věci jako stručně, jak je to možné, 1040 01:04:55,100 --> 01:04:57,630 takže jsme stále tuto úmluvu zde. 1041 01:04:57,630 --> 01:05:00,660 i + + znamená jen zvyšovat i v každé iteraci. 1042 01:05:00,660 --> 01:05:02,990 A teď si toho všimnout, což je opravdu zajímavé. 1043 01:05:02,990 --> 01:05:09,180 V souladu 24, říkám, "Počítači, dej mi charakter, 8 bitů, a nazývat to c." 1044 01:05:09,180 --> 01:05:12,630 Ale co je to na pravé straně říká? 1045 01:05:13,490 --> 01:05:16,530 V angličtině, co to představuje? 1046 01:05:16,530 --> 01:05:18,730 [Student] První znak v poli. 1047 01:05:18,730 --> 01:05:20,790 Přesně tak. Dej mi první znak v poli. 1048 01:05:20,790 --> 01:05:24,090 Nebo obecněji, dej mi-té znak v poli. 1049 01:05:24,090 --> 01:05:26,100 A uvědomit si, že je to důležité dnes, jako počítačoví vědci, 1050 01:05:26,100 --> 01:05:27,890 jsme vlastně počítat od 0. 1051 01:05:27,890 --> 01:05:29,720 >> Nemáte prostor pro uvážení, nyní začít dělat to. 1052 01:05:29,720 --> 01:05:34,160 Nyní se mají chovat v souladu s počítačem očekávání a počítat z 0 1053 01:05:34,160 --> 01:05:38,180 protože [0] bude první znak v řetězci, 1054 01:05:38,180 --> 01:05:42,150 [1] bude druhý, [2] bude třetí a tak dále. 1055 01:05:42,150 --> 01:05:49,720 Takže tento program, když jsem jej zkompilovat to je opět string1, takže se string1, 1056 01:05:49,720 --> 01:05:54,670 a teď jsem běžet string1 v mém terminálovém okně. 1057 01:05:54,670 --> 01:05:58,330 Je to čekání na vstup, takže budu psát v Davidovi, Enter, 1058 01:05:58,330 --> 01:06:02,540 a teď se vytiskne Davidovi všecko na různých tratích, protože soupis toho, co dělám. 1059 01:06:02,540 --> 01:06:05,820 Já tisku jeden znak v čase. 1060 01:06:05,820 --> 01:06:10,100 Nebudeme zacházet do detailů dnes na to, ale jsem smazal před chvílí této kontroly zde. 1061 01:06:10,100 --> 01:06:15,480 Ukazuje se, že v případě, že uživatel se nechová, nepřátelský, nebo jen zmatený, 1062 01:06:15,480 --> 01:06:20,210 můžete skutečně nedávají řetězec obšírněji. 1063 01:06:20,210 --> 01:06:22,860 Pokud stisknete špatné tlačítko na klávesnici, můžete dát žádnou řetězec vůbec, 1064 01:06:22,860 --> 01:06:26,950 nebo pokud jste škodlivý, můžete zkusit vložit do společnosti GIGABYTE, to stojí eseje 1065 01:06:26,950 --> 01:06:29,290 vyplnit tento řetězec, a v případě, že počítač běží z paměti, 1066 01:06:29,290 --> 01:06:32,710 ukazuje se, že budeme dostat zpět tuto speciální hodnotu s názvem NULL. 1067 01:06:32,710 --> 01:06:35,580 Takže teď, jen vím, že tam je to speciální hodnota zvaná NULL 1068 01:06:35,580 --> 01:06:39,580 že nám umožní zkontrolovat, kdy jsme z paměti, mimo jiné. 1069 01:06:39,580 --> 01:06:45,630 Ale když otevřu se nyní řetězec2, všimnete jeden rozdíl zde. 1070 01:06:45,630 --> 01:06:48,210 Všimněte si, jeden rozdíl tu s string2. 1071 01:06:48,210 --> 01:06:51,340 S string2, to pro smyčce je trochu jiný. 1072 01:06:51,340 --> 01:06:55,010 >> Dovolte mi, abych odstranit NULL, takže můžeme hovořit o těch někdy jindy. 1073 01:06:55,010 --> 01:06:57,800 Jaký je rozdíl asi pro smyčce tentokrát? 1074 01:06:59,620 --> 01:07:01,670 Můžu se vrátit k předchozímu příkladu. 1075 01:07:01,670 --> 01:07:08,580 Tak to je verze 2, toto je verze 1. 1, 2. 1076 01:07:08,580 --> 01:07:11,980 1, 2. 1077 01:07:13,520 --> 01:07:16,660 The strlen volání je kde? 1078 01:07:16,660 --> 01:07:18,860 Je to v první části smyčky for. 1079 01:07:18,860 --> 01:07:21,830 Jakékoli myšlenky, proč to dělám? Jo. 1080 01:07:21,830 --> 01:07:24,560 [Student] Takže se nemusíte volat funkce pokaždé. 1081 01:07:24,560 --> 01:07:26,440 [Malan] Takže nemáme volání funkce pokaždé. Přesně tak. 1082 01:07:26,440 --> 01:07:28,300 Vzpomeňte si na smyček, které jsou super jednoduchý 1083 01:07:28,300 --> 01:07:31,770 jakmile trochu pochopili, že to je inicializace, podmínka, a aktualizace. 1084 01:07:31,770 --> 01:07:34,750 Problémem je, že tento stav se děje na každé iteraci smyčky. 1085 01:07:34,750 --> 01:07:40,010 A tak v tomto příkladu zde, co je špatného na tom, že tento je moje podmínka? 1086 01:07:40,010 --> 01:07:41,830 [Student] Voláš strlen. 1087 01:07:41,830 --> 01:07:44,340 [Malan] Voláš strlen znovu a znovu a znovu. 1088 01:07:44,340 --> 01:07:47,410 Ale poté, co jsem napsal v Davidovi, délka tohoto řetězce je 5, 1089 01:07:47,410 --> 01:07:49,650 a to nebude měnit na každé iteraci smyčky 1090 01:07:49,650 --> 01:07:51,670 protože řetězec je stále D--v-i-d. 1091 01:07:51,670 --> 01:07:55,320 Tak to je náznak, co se děje, aby se stal stále důležitější myšlenka 1092 01:07:55,320 --> 01:08:00,410 známý jako konstrukční rozhodnutí, kde právě nedávají počítač dělat zbytečnou práci. 1093 01:08:00,410 --> 01:08:03,920 >> Stejně jako plížit náhled pset2, pset2 ve standardní edici 1094 01:08:03,920 --> 01:08:07,030 bude výzvou, abyste skutečně provádět určitý počet šifer, 1095 01:08:07,030 --> 01:08:10,410 některé číslo šifrovací algoritmy, takže je možné jak šifrování 1096 01:08:10,410 --> 01:08:13,840 a dešifrovat tajné zprávy hodně jako jedné Ralphie tam dekódovat. 1097 01:08:13,840 --> 01:08:16,810 V hackerské vydání pset2, budeme jít trochu dál. 1098 01:08:16,810 --> 01:08:19,649 Budeme vám předá soubor od skutečného počítačového systému 1099 01:08:19,649 --> 01:08:23,479 , který obsahuje spoustu uživatelských jmen a skutečných zašifrovaných hesel, 1100 01:08:23,479 --> 01:08:26,939 a výzvou pro hackera vydání bude bezva těchto hesel 1101 01:08:26,939 --> 01:08:33,200 a zjistit, co kryptografie nebo co tajné byla použita skutečně generování těchto hesel. 1102 01:08:33,200 --> 01:08:36,109 A budeme-li to provést pomocí nové funkce zde o C 1103 01:08:36,109 --> 01:08:40,630 že ti dám jen demo známý jako argumenty příkazového řádku. 1104 01:08:40,630 --> 01:08:44,229 Ukazuje se, jak si někteří z vás možná viděli v oddílu nebo v učebnicích, 1105 01:08:44,229 --> 01:08:48,260 Hlavním nemusí vždy být neplatné v závorkách. 1106 01:08:48,260 --> 01:08:52,430 Ukazuje se, že hlavní může také být psán jako to, se dvěma argumenty, 1107 01:08:52,430 --> 01:08:56,870 argc a argv, kde argc je počet slov 1108 01:08:56,870 --> 01:09:00,020 které zadáte po programu jménem na příkazovém řádku 1109 01:09:00,020 --> 01:09:03,420 a argv je skutečná slova. 1110 01:09:03,420 --> 01:09:07,540 A jak hranaté závorky tam naznačují, argv je zřejmě pole. 1111 01:09:07,540 --> 01:09:12,210 Je to bude řetězec za řetězec po řetězec v paměti. 1112 01:09:12,210 --> 01:09:16,010 >> Takže to, co budeme moci dělat počínaje PSet 2 je něco jako toto. 1113 01:09:16,010 --> 01:09:21,350 Pokud udělám argv1, což je příklad vrátíme do pondělí, a spusťte jej, 1114 01:09:21,350 --> 01:09:23,370 Všimněte si, že to nevypadá na nic zatím. 1115 01:09:23,370 --> 01:09:25,490 Je to jen vytiskne jeho vlastní jméno. 1116 01:09:25,490 --> 01:09:31,479 Ale když řeknu sbohem třídy, všimněte si, že tento program zřejmě opakuje 1117 01:09:31,479 --> 01:09:35,479 nad každým ze slov, které byly zadány na příkazovém řádku. 1118 01:09:35,479 --> 01:09:41,630 A prostředky, které získáme přístup k slovech, která uživatel zadal na příkazovém řádku 1119 01:09:41,630 --> 01:09:49,160 je změnou Hlavním východiskem tento víkend od int main (void) int main (argc, argv) 1120 01:09:49,160 --> 01:09:52,050 a tak se narodí argumenty příkazového řádku. 1121 01:09:52,050 --> 01:09:57,100 A jakmile se dostanete opravdu sofistikovaný na to, budete moci psát opravdu trippy programy 1122 01:09:57,100 --> 01:09:59,610 jako tenhle tady, který jde nad rámec 1123 01:09:59,610 --> 01:10:03,940 některé funkce, že jsme udělali tak daleko, ale všechno docela silný. 1124 01:10:03,940 --> 01:10:08,950 >> Takže necháme to s tím na obrazovce, a uvidíme se v pondělí. 1125 01:10:17,570 --> 01:10:20,000 >> [CS50.TV]