1 00:00:00,000 --> 00:00:03,000 [Powered by Google Translate] [Týždeň 4] 2 00:00:03,000 --> 00:00:05,000 [David J. Malan] [Harvard University] 3 00:00:05,000 --> 00:00:08,000 [To je CS50.] [CS50.TV] 4 00:00:08,000 --> 00:00:12,000 >> Dobre, to je CS50, a to je začiatok 4. týždni 5 00:00:12,000 --> 00:00:16,000 a to je jeden z najpomalšie možných algoritmov triedenia. 6 00:00:16,000 --> 00:00:19,000 Ktorý z nich je to, že sme práve videli tam? 7 00:00:19,000 --> 00:00:24,000 To bolo bublina radenie, aby veľké O (n ^ 2) + súčet, 8 00:00:24,000 --> 00:00:28,000 a naozaj nie sme jediní, kto v tomto svete zrejme vedia, 9 00:00:28,000 --> 00:00:30,000 čo bublina sort alebo jeho hrací čas. 10 00:00:30,000 --> 00:00:33,000 Naozaj, to bol rozhovor s Ericom Schmidtom z Google 11 00:00:33,000 --> 00:00:45,000 a bývalý senátor Barack Obama len pred niekoľkými rokmi. 12 00:00:45,000 --> 00:00:48,000 >> Teraz, senátor, si tu na Google, 13 00:00:48,000 --> 00:00:54,000 a som rád, že predsedníctvo ako pohovoru. 14 00:00:54,000 --> 00:00:58,000 Teraz, je ťažké dostať prácu ako prezident, a ty ideš cez nástrahami teraz. 15 00:00:58,000 --> 00:01:00,000 Je tiež ťažké získať prácu na Google. 16 00:01:00,000 --> 00:01:05,000 Máme otázky, a žiadame naše kandidátov otázky, 17 00:01:05,000 --> 00:01:10,000 a toto je od Larry Schwimmer. 18 00:01:10,000 --> 00:01:14,000 Vy myslíte, že si robím srandu? Je to priamo tu. 19 00:01:14,000 --> 00:01:18,000 Aká je najúčinnejší spôsob, ako triediť milión 32-bit celé číslo? 20 00:01:18,000 --> 00:01:21,000 [Smiech] 21 00:01:21,000 --> 00:01:24,000 No- 22 00:01:24,000 --> 00:01:26,000 Je mi to ľúto. >> Nie, nie, nie, nie. 23 00:01:26,000 --> 00:01:34,000 Myslím, že bublina druh bude zlý spôsob, ako ísť. 24 00:01:34,000 --> 00:01:39,000 >> Poď, ktorý mu povedal, toto? 25 00:01:39,000 --> 00:01:43,000 Minulý týždeň sme pripomenúť si pauzu od kódu, aspoň na jeden deň, 26 00:01:43,000 --> 00:01:46,000 a začal so zameraním na niektoré vyššej úrovni myšlienok a riešení problémov všeobecne 27 00:01:46,000 --> 00:01:49,000 v rámci vyhľadávania a radenie, 28 00:01:49,000 --> 00:01:53,000 a sme zaviedli niečo, čo sme nemali Slap tento názov minulý týždeň, 29 00:01:53,000 --> 00:01:56,000 ale asymptotickej notácie, Big O, Big Omega, 30 00:01:56,000 --> 00:02:00,000 a niekedy Big Theta zápis, a tie boli jednoduchý spôsob 31 00:02:00,000 --> 00:02:02,000 popísať čas behu algoritmov, 32 00:02:02,000 --> 00:02:05,000 ako dlho to trvá, než algoritmus spustiť. 33 00:02:05,000 --> 00:02:08,000 >> A vy si možno spomenú, že si hovoril o dobe chodu z hľadiska veľkosti 34 00:02:08,000 --> 00:02:11,000 vstupu, ktorý sme zvyčajne nazývame n, bez ohľadu na problém môže byť, 35 00:02:11,000 --> 00:02:13,000 , Kde n je počet osôb v miestnosti, 36 00:02:13,000 --> 00:02:17,000 počet stránok v telefónnom zozname, a začali sme písať veci 37 00:02:17,000 --> 00:02:21,000 ako O (n ^ 2) alebo O (n), alebo O (n log n), 38 00:02:21,000 --> 00:02:24,000 a to aj keď matematika nebola úplne fungovať tak dokonale 39 00:02:24,000 --> 00:02:28,000 a to bolo n ² - n / 2 alebo niečo také 40 00:02:28,000 --> 00:02:31,000 by sme namiesto toho len zahodiť niektoré z nižších rádov, 41 00:02:31,000 --> 00:02:34,000 a motivácia je, že naozaj chceme 42 00:02:34,000 --> 00:02:37,000 druh objektívneho spôsobu hodnotenia 43 00:02:37,000 --> 00:02:39,000 výkon programov alebo vykonávania algoritmov 44 00:02:39,000 --> 00:02:42,000 že na konci dňa nemá nič spoločné, napríklad, 45 00:02:42,000 --> 00:02:45,000 s rýchlosti vášho počítača dnes. 46 00:02:45,000 --> 00:02:47,000 >> Napríklad, ak sa rozhodnete bubliny triedenie, 47 00:02:47,000 --> 00:02:50,000 alebo sa rozhodnete zlúčiť radenia alebo výber druhu na dnešnom počítači, 48 00:02:50,000 --> 00:02:53,000 2 GHz počítač, a spustiť ho, 49 00:02:53,000 --> 00:02:56,000 a to trvá určitý počet sekúnd, budúci rok je tu 3 GHz 50 00:02:56,000 --> 00:02:59,000 alebo 4 GHz počítač, a tie by sa potom tvrdiť, že "Wow, môj algoritmus 51 00:02:59,000 --> 00:03:03,000 je teraz dvakrát tak rýchlo, "keď v skutočnosti to zjavne nie je tento prípad. 52 00:03:03,000 --> 00:03:06,000 Je to len hardvér dostal rýchlejšie, ale váš počítač 53 00:03:06,000 --> 00:03:10,000 nie je, a tak sme naozaj chcete vyhodiť veci, ako je 54 00:03:10,000 --> 00:03:13,000 násobky 2 alebo násobky 3, pokiaľ ide o opis 55 00:03:13,000 --> 00:03:17,000 ako rýchlo alebo ako pomaly algoritmus je a naozaj sústrediť len 56 00:03:17,000 --> 00:03:20,000 na n alebo nejaký faktor tejto zmluvy, 57 00:03:20,000 --> 00:03:24,000 časť výkonu jeho ako v prípade druhov z minulého týždňa. 58 00:03:24,000 --> 00:03:27,000 A pripomínajú, že s pomocou druhu korešpondencie 59 00:03:27,000 --> 00:03:31,000 sme boli schopní urobiť oveľa lepšie, než bublina radiť a výberu zoradiť 60 00:03:31,000 --> 00:03:33,000 a dokonca aj vkladanie sort. 61 00:03:33,000 --> 00:03:36,000 >> Máme sa na n log n, a znova, 62 00:03:36,000 --> 00:03:39,000 Pripomínam, že log n všeobecne sa odkazuje na niečo, čo rastie 63 00:03:39,000 --> 00:03:43,000 pomalšie potom n, tak n log n doteraz bola dobrá 64 00:03:43,000 --> 00:03:45,000 pretože to bolo menšie, než ² n 65 00:03:45,000 --> 00:03:47,000 Ale k dosiahnutiu n log n s radiť zlučovacie 66 00:03:47,000 --> 00:03:51,000 čo bolo základné zárodok myšlienky, že sme museli využiť 67 00:03:51,000 --> 00:03:54,000 že sme tiež zadlužuje späť v týždni 0? 68 00:03:54,000 --> 00:03:58,000 Ako sme riešiť problém radenie chytro s radiť zlučovacie? 69 00:03:58,000 --> 00:04:04,000 Aký bol kľúčový vhľad, snáď? 70 00:04:04,000 --> 00:04:07,000 Každý, kto vôbec. 71 00:04:07,000 --> 00:04:09,000 Dobre, poďme o krok späť. 72 00:04:09,000 --> 00:04:11,000 Popíšte zlúčiť druh vlastnými slovami. 73 00:04:11,000 --> 00:04:15,000 Ako to funguje? 74 00:04:15,000 --> 00:04:17,000 Dobre, budeme veslovať staré týždenných 0. 75 00:04:17,000 --> 00:04:19,000 Dobre, jo. 76 00:04:19,000 --> 00:04:22,000 [Nepočuteľné-študent] 77 00:04:22,000 --> 00:04:26,000 Dobre, dobre, tak sme sa rozdelili pole čísel do 2 kusy. 78 00:04:26,000 --> 00:04:29,000 Sme zoradené každý z týchto kusov, a potom sme zlúčili je, 79 00:04:29,000 --> 00:04:33,000 a my sme videli túto myšlienku pred branie problém, ktorý je takto veľký 80 00:04:33,000 --> 00:04:36,000 a sekanie je, ako sa na problém, ktorý je to veľké alebo to veľké. 81 00:04:36,000 --> 00:04:38,000 >> Pripomeňme telefónneho zoznamu príklad. 82 00:04:38,000 --> 00:04:42,000 Spomeňte si na vlastný algoritmus počítanie od týždne, 83 00:04:42,000 --> 00:04:45,000 tak zlúčiť radiť bol zhrnutý v tomto pseudokódu tu. 84 00:04:45,000 --> 00:04:48,000 Keď ste rovnako n prvkov, najprv to bol zdravý rozum skontrolovať. 85 00:04:48,000 --> 00:04:51,000 Ak n <2, potom nerobia vôbec nič 86 00:04:51,000 --> 00:04:55,000 pretože ak n <2, potom n je zrejme 0 alebo 1, 87 00:04:55,000 --> 00:04:57,000 a tak ak je to buď 0 alebo 1 nič vyriešiť. 88 00:04:57,000 --> 00:04:59,000 To je všetko. 89 00:04:59,000 --> 00:05:01,000 Váš zoznam je už triviálne zoradený. 90 00:05:01,000 --> 00:05:04,000 Ale inak, ak máte 2 alebo viac prvkov ísť dopredu a rozdeliť ich 91 00:05:04,000 --> 00:05:06,000 do 2 polovice, ľavú a pravú. 92 00:05:06,000 --> 00:05:09,000 Zoradiť každej z týchto polovíc, a potom zlúčiť zoradené polovice. 93 00:05:09,000 --> 00:05:13,000 Ale problém je, že na prvý pohľad to pocit, ako by sme to plaviť. 94 00:05:13,000 --> 00:05:17,000 To je kruhová definícia v tom, že ak som vás požiadal, aby ste zoradiť tieto n prvkov 95 00:05:17,000 --> 00:05:22,000 a vy mi hovoríte, "Dobre, fajn, budeme triediť tie n / 2 a tie n / 2 prvkov," 96 00:05:22,000 --> 00:05:27,000 potom moja ďalšia otázka bude "Fajn, ako si zotrieďiť n / 2 prvkov?" 97 00:05:27,000 --> 00:05:30,000 >> Ale pretože štruktúry tohto programu, 98 00:05:30,000 --> 00:05:33,000 pretože tam je tento základný prípad, aby som tak povedal, 99 00:05:33,000 --> 00:05:39,000 tento osobitný prípad, ktorý hovorí, že ak je n 00:05:42,000 Neodpovedajte s rovnakým kruhovú odpoveď. 101 00:05:42,000 --> 00:05:46,000 Tento proces, bude tento cyklová nakoniec skončí. 102 00:05:46,000 --> 00:05:50,000 Keď sa ťa spýtam "Ako tieto n prvky," a vy hovoríte, "Fine, triediť tieto n / 2," 103 00:05:50,000 --> 00:05:53,000 potom povieš: "Dobre, trochu to n / 4, n / 8, n/16," 104 00:05:53,000 --> 00:05:56,000 nakoniec budete deliť dosť veľký počet 105 00:05:56,000 --> 00:05:59,000 že budete mať len 1 prvok doľava, na ktorom mieste si môžete povedať, 106 00:05:59,000 --> 00:06:02,000 "Tu, tu je zoradená jeden prvok." 107 00:06:02,000 --> 00:06:06,000 Potom lesk tohto algoritmu tu je odvodená od skutočnosti 108 00:06:06,000 --> 00:06:09,000 , Že akonáhle budete mať všetky tieto jednotlivo triedené zoznamy, 109 00:06:09,000 --> 00:06:12,000 z ktorých všetky sú veľkosti 1, čo sa zdá byť zbytočné, 110 00:06:12,000 --> 00:06:15,000 akonáhle začnete zlúčenie a zlúčenie 111 00:06:15,000 --> 00:06:19,000 si vybudovať konečne ako Rob robil vo videu konečne sú zoradené zoznam. 112 00:06:19,000 --> 00:06:22,000 >> Ale táto myšlienka siaha ďaleko za hranice triedenie. 113 00:06:22,000 --> 00:06:26,000 Tam je tento nápad zakotvený v tomto programe známeho ako rekurzia, 114 00:06:26,000 --> 00:06:29,000 nápad, ktorým ste program, 115 00:06:29,000 --> 00:06:32,000 a vyriešiť nejaký problém si hovoríš, 116 00:06:32,000 --> 00:06:36,000 alebo dať do súvislosti programovacích jazykov, ktoré sú funkcie, 117 00:06:36,000 --> 00:06:39,000 a za účelom vyriešenie problému, môžete funkcie hovoríš 118 00:06:39,000 --> 00:06:42,000 znova a znova a znova, ale funkcia 119 00:06:42,000 --> 00:06:44,000 nemožno volať sami nekonečne veľakrát. 120 00:06:44,000 --> 00:06:47,000 Nakoniec budete musieť dna, aby som tak povedal, 121 00:06:47,000 --> 00:06:49,000 a máte nejaké pevne základnú podmienku, ktorá hovorí, že 122 00:06:49,000 --> 00:06:53,000 V tomto bode prestať hovoriť si tak, aby celý proces 123 00:06:53,000 --> 00:06:56,000 Nakoniec sa v skutočnosti zastaviť. 124 00:06:56,000 --> 00:06:58,000 Čo to vlastne znamená, aby recurse? 125 00:06:58,000 --> 00:07:01,000 >> Poďme sa pozrieť, či môžeme urobiť jednoduchý, triviálne príklad, povedzme, 126 00:07:01,000 --> 00:07:03,000 3 osoby so mnou tu na javisku, keď niekto je pohodlné. 127 00:07:03,000 --> 00:07:06,000 1, poď hore, 2 a 3. 128 00:07:06,000 --> 00:07:09,000 Ak 3 chcieť prísť sem. 129 00:07:09,000 --> 00:07:12,000 Ak chcete postaviť hneď vedľa mňa tu v rade, predpokladám, že problém na dosah ruky 130 00:07:12,000 --> 00:07:15,000 je veľmi triviálne spočítať počet ľudí, ktorí sú tu. 131 00:07:15,000 --> 00:07:18,000 Ale úprimne povedané, som unavená zo všetkých týchto počítanie príkladov. 132 00:07:18,000 --> 00:07:21,000 To bude nejaký čas trvať, 1, 2, a bodka, bodka, bodka. 133 00:07:21,000 --> 00:07:23,000 Bude to trvať večne. 134 00:07:23,000 --> 00:07:25,000 Ja by som radšej punt tento problém úplne pomocou-Ako sa voláte? 135 00:07:25,000 --> 00:07:27,000 Sara. >> Sara, v poriadku. 136 00:07:27,000 --> 00:07:29,000 Kelly. >> Kelly a? 137 00:07:29,000 --> 00:07:31,000 >> Willy. >> Willy, Sara, Kelly, a Willy. 138 00:07:31,000 --> 00:07:34,000 Práve teraz som sa pýtal niekto 139 00:07:34,000 --> 00:07:37,000 koľko ľudí je na tejto scéne, a ja nemám potuchy. 140 00:07:37,000 --> 00:07:40,000 To je naozaj dlhý zoznam, a tak namiesto toho budem robiť tento trik. 141 00:07:40,000 --> 00:07:43,000 Idem sa spýtať osobu vedľa mňa robiť väčšinu práce, 142 00:07:43,000 --> 00:07:46,000 a akonáhle sa vykonáva robí väčšinu práce 143 00:07:46,000 --> 00:07:49,000 Budem robiť čo najmenšie množstvo práce je možné, a stačí pridať 1 144 00:07:49,000 --> 00:07:51,000 na akúkoľvek jej odpoveď je, tak je to tu. 145 00:07:51,000 --> 00:07:54,000 Bol som požiadaný, koľko ľudí je na javisku. 146 00:07:54,000 --> 00:07:57,000 Koľko ľudí je na javisku vľavo z vás? 147 00:07:57,000 --> 00:08:00,000 Ľavá mne? >> Dobre, ale nebudú podvádzať. 148 00:08:00,000 --> 00:08:04,000 To je dobre, to je pravda, ale ak chceme pokračovať v tejto logiky 149 00:08:04,000 --> 00:08:08,000 predpokladajme, že si podobne chcete punt tento problém na ľavej strane vás, 150 00:08:08,000 --> 00:08:11,000 takže skôr než odpovede priamo do toho pustite a len prejsť do mínusu. 151 00:08:11,000 --> 00:08:14,000 Ach, koľko ľudí je na ľavej strane ma? 152 00:08:14,000 --> 00:08:16,000 Ako mnoho ľudí sú umiestnené na ľavej? 153 00:08:16,000 --> 00:08:18,000 1. 154 00:08:18,000 --> 00:08:27,000 [Smiech] 155 00:08:27,000 --> 00:08:30,000 Dobre, tak 0, takže to, čo teraz Willy urobil 156 00:08:30,000 --> 00:08:33,000 je, že ste sa vrátil vašu odpoveď týmto smerom hovorí 0. 157 00:08:33,000 --> 00:08:36,000 Teraz, čo by ste mali robiť? >> 1. 158 00:08:36,000 --> 00:08:39,000 Dobre, takže ty si 1, takže si povedal, "Dobre, budem pridávať 1 159 00:08:39,000 --> 00:08:41,000 na akúkoľvek Willyho gróf, "tak 1 + 0. 160 00:08:41,000 --> 00:08:43,000 Teraz ste 1 tak, aby vaša odpoveď na pravej strane je teraz- 161 00:08:43,000 --> 00:08:45,000 1. >> A ja by som byť 2. 162 00:08:45,000 --> 00:08:48,000 Dobré, takže berieš predchádzajúca odpoveď 1, 163 00:08:48,000 --> 00:08:51,000 pridanie minimálne množstvo práce, ktorú chcete urobiť, čo je +1. 164 00:08:51,000 --> 00:08:55,000 Teraz máte 2, a potom mi podať ktorej hodnota? 165 00:08:55,000 --> 00:08:57,000 3, myslím, prepáč, 2. 166 00:08:57,000 --> 00:08:59,000 Dobré. 167 00:08:59,000 --> 00:09:02,000 >> No, mali sme 0 vľavo. 168 00:09:02,000 --> 00:09:05,000 Potom sme mali 1, a potom pridáme 2, 169 00:09:05,000 --> 00:09:07,000 a teraz si podal mi číslo 2, 170 00:09:07,000 --> 00:09:10,000 a tak som povedal, v poriadku, 1, 3. 171 00:09:10,000 --> 00:09:13,000 Tam je naozaj 3 ľudia stojaci vedľa mňa na tejto scéne, 172 00:09:13,000 --> 00:09:16,000 takže môžeme zrejme urobil veľmi lineárne, 173 00:09:16,000 --> 00:09:19,000 veľmi v móde zrejmé, ale čo sme naozaj? 174 00:09:19,000 --> 00:09:21,000 Vzali sme si problém veľkosti 3 pôvodne. 175 00:09:21,000 --> 00:09:24,000 Potom sme roztriedili do problému veľkosti 2, 176 00:09:24,000 --> 00:09:27,000 potom problém veľkosti 1, a nakoniec referenčné prípad 177 00:09:27,000 --> 00:09:29,000 Bolo to naozaj, oh, tam nikto nie je, 178 00:09:29,000 --> 00:09:33,000 na ktorom mieste Willy vrátil účinne pevne odpoveď niekoľkokrát, 179 00:09:33,000 --> 00:09:36,000 a druhý bol potom bublala hore, bublala nahor, bublala up, 180 00:09:36,000 --> 00:09:39,000 a potom pridaním do tohto jedného dodatočného 1 181 00:09:39,000 --> 00:09:41,000 Vytvorili sme túto základnú myšlienku rekurzie. 182 00:09:41,000 --> 00:09:44,000 >> Teraz, v tomto prípade je to naozaj vyriešiť problém 183 00:09:44,000 --> 00:09:46,000 akékoľvek účinnejšie ako sme videli doteraz. 184 00:09:46,000 --> 00:09:48,000 Ale premýšľať o algoritmoch sme urobili na javisku tak ďaleko. 185 00:09:48,000 --> 00:09:51,000 Mali sme 8 kusov papiera na tabuľu, 186 00:09:51,000 --> 00:09:55,000 na videu, kedy Sean hľadal číslo 7, a čo urobil naozaj? 187 00:09:55,000 --> 00:09:58,000 No, on to neurobil nejaký druh rozdeľuj a panuj. 188 00:09:58,000 --> 00:10:01,000 Neurobil akékoľvek rekurzie. 189 00:10:01,000 --> 00:10:03,000 Skôr to práve urobil tento lineárny algoritmus. 190 00:10:03,000 --> 00:10:07,000 Ale keď sme zaviedli myšlienku zoradené čísel na javisku žiť minulý týždeň 191 00:10:07,000 --> 00:10:09,000 potom sme mali tento inštinkt ísť do stredu, 192 00:10:09,000 --> 00:10:13,000 na ktorom mieste sme mali menší zoznam veľkosti 4 alebo inom zozname veľkosti 4, 193 00:10:13,000 --> 00:10:17,000 a potom sme mali presne rovnaký problém, tak sme opakovali, opakoval, opakoval. 194 00:10:17,000 --> 00:10:19,000 Inými slovami, recursed. 195 00:10:19,000 --> 00:10:24,000 Ďakujem moc sa do nášho 3 dobrovoľníkov tu pre demonštráciu rekurzia s nami. 196 00:10:24,000 --> 00:10:28,000 >> Poďme sa pozrieť, či nemôžeme to teraz trochu konkrétnejšie, 197 00:10:28,000 --> 00:10:30,000 rieši problém, ktorý sme opäť mohli robiť celkom ľahko, 198 00:10:30,000 --> 00:10:34,000 ale budeme používať ako odrazový mostík k realizácii tohto základnú myšlienku. 199 00:10:34,000 --> 00:10:37,000 Ak chcem spočítať súčty veľa čísel, 200 00:10:37,000 --> 00:10:39,000 napríklad, ak si prejsť v počte 3, 201 00:10:39,000 --> 00:10:42,000 Chcem vám hodnotu sigma 3, 202 00:10:42,000 --> 00:10:46,000 takže súčet 3 + 2 + 1 + 0. 203 00:10:46,000 --> 00:10:48,000 Chcem sa dostať späť odpoveď 6, 204 00:10:48,000 --> 00:10:51,000 takže budeme vykonávať túto sigma funkciu, to zhrnutie funkcie 205 00:10:51,000 --> 00:10:54,000 že opäť berie na vstupe, a potom vráti zhrnutie 206 00:10:54,000 --> 00:10:57,000 z tohto počtu celú cestu až na 0. 207 00:10:57,000 --> 00:10:59,000 Mohli by sme to pekné jednoducho, že? 208 00:10:59,000 --> 00:11:01,000 Mohli by sme to urobiť s nejakým druhom slučky štruktúry, 209 00:11:01,000 --> 00:11:04,000 tak nechajte ma ísť dopredu a dostať to začalo. 210 00:11:04,000 --> 00:11:07,000 >> Zahrnúť stdio.h. 211 00:11:07,000 --> 00:11:09,000 Dovoľte mi, aby som sa sám do hlavnej pracovať s tady. 212 00:11:09,000 --> 00:11:12,000 Poďme uložiť ako sigma.c. 213 00:11:12,000 --> 00:11:14,000 Potom som ísť sem, a budem deklarovať int n, 214 00:11:14,000 --> 00:11:18,000 a ja budem robiť nasledujúce, zatiaľ čo používateľ nespolupracuje. 215 00:11:18,000 --> 00:11:22,000 Kým používateľ mi nedala kladné číslo 216 00:11:22,000 --> 00:11:26,000 nechaj ma ísť napred a prinútili je pre n = GetInt, 217 00:11:26,000 --> 00:11:28,000 a dovoľte mi, aby som im nejaké inštrukcie o tom, čo robiť, 218 00:11:28,000 --> 00:11:33,000 takže printf ("Positive integer prosím"). 219 00:11:33,000 --> 00:11:39,000 Len niečo relatívne jednoduchého, ako to tak, že v čase, keď sme narazili riadok 14 220 00:11:39,000 --> 00:11:42,000 teraz máme kladné číslo pravdepodobne v n 221 00:11:42,000 --> 00:11:44,000 >> Teraz sa poďme urobiť niečo s tým. 222 00:11:44,000 --> 00:11:50,000 Nechaj ma ísť dopredu a počítať súčty, takže int sum = sigma (n). 223 00:11:50,000 --> 00:11:54,000 Sigma je len zhrnutie, takže som len písať to v milovník spôsobom. 224 00:11:54,000 --> 00:11:56,000 Budeme jednoducho hovoriť sigma tam. 225 00:11:56,000 --> 00:11:58,000 To je suma, a teraz idem vytlačiť výsledok, 226 00:11:58,000 --> 00:12:08,000 printf ("Súčet je% d \ n", sum). 227 00:12:08,000 --> 00:12:11,000 A potom sa vrátim 0 pre správnu mieru. 228 00:12:11,000 --> 00:12:15,000 Urobili sme všetko, čo tento program vyžaduje okrem zaujímavej časti, 229 00:12:15,000 --> 00:12:18,000 ktorý je skutočne realizovať sigma funkciu. 230 00:12:18,000 --> 00:12:22,000 >> Nechajte ma ísť sem dole až na dno, a dovoľte mi, aby som určil funkciu sigma. 231 00:12:22,000 --> 00:12:26,000 Má to vziať premennú, ktorá je typu integer, 232 00:12:26,000 --> 00:12:30,000 a aké dáta typu nechcem vrátiť pravdepodobne z sigma? 233 00:12:30,000 --> 00:12:34,000 Int, pretože chcem, aby to tak, aby zodpovedala moje očakávania na linke 15. 234 00:12:34,000 --> 00:12:37,000 V tú nechajte ma ísť dopredu a vykonanie tohto 235 00:12:37,000 --> 00:12:41,000 v celkom priamočiaro. 236 00:12:41,000 --> 00:12:45,000 >> Poďme ďalej a povedať, int sum = 0, 237 00:12:45,000 --> 00:12:47,000 a teraz idem mať málo pre sláčiky tu 238 00:12:47,000 --> 00:12:50,000 že sa to povedať niečo také, 239 00:12:50,000 --> 00:13:01,000 for (int i = 0; I <= číslo; i + +) súčet + = i 240 00:13:01,000 --> 00:13:05,000 A potom budem vracať sumu. 241 00:13:05,000 --> 00:13:07,000 Som mohol robiť to v mnohých spôsobmi. 242 00:13:07,000 --> 00:13:09,000 Mohol som použil while. 243 00:13:09,000 --> 00:13:11,000 Mohol som preskočil pomocou súčtu premenné, či som naozaj chcel, 244 00:13:11,000 --> 00:13:15,000 ale v krátkej, len musíme funkciu, že keď som nemal flákať prehlasuje súčet je 0. 245 00:13:15,000 --> 00:13:18,000 Potom sa opakuje z 0 na hore cez čísla, 246 00:13:18,000 --> 00:13:23,000 a na každej iterácii je dodáva, že aktuálnu hodnotu súčtu a vráti súčet. 247 00:13:23,000 --> 00:13:25,000 >> Teraz je tu mierne optimalizácia tu. 248 00:13:25,000 --> 00:13:29,000 To je pravdepodobne zbytočná krok, ale budiž. To je v poriadku pre túto chvíľu. 249 00:13:29,000 --> 00:13:32,000 Sme ich aspoň dôkladné a bude 0 celú cestu hore. 250 00:13:32,000 --> 00:13:34,000 Nie je príliš tvrdý a veľmi jednoduché, 251 00:13:34,000 --> 00:13:37,000 ale ukazuje sa, že s touto funkciou sigma máme rovnakú možnosť 252 00:13:37,000 --> 00:13:39,000 ako sme to urobili tu na javisku. 253 00:13:39,000 --> 00:13:42,000 Na javisku sme práve počítal, koľko ľudí bolo vedľa mňa, 254 00:13:42,000 --> 00:13:47,000 ale ak by sme chceli spočítať 3 + 2 + 1 255 00:13:47,000 --> 00:13:51,000 na až do 0 by sme mohli podobne punt na funkciu 256 00:13:51,000 --> 00:13:55,000 že budem namiesto toho popisovať ako rekurzívne. 257 00:13:55,000 --> 00:13:57,000 Tu poďme sa rýchlo zdravý rozum skontrolovať a uistite sa, že som to neurobil flákať. 258 00:13:57,000 --> 00:14:00,000 >> Viem, že je tu aspoň jedna vec v tomto programe, ktoré som urobil zle. 259 00:14:00,000 --> 00:14:04,000 Keď som narazila zadajte budem sa dostať akýkoľvek druh na mňa jačať? 260 00:14:04,000 --> 00:14:06,000 Čo budem sa kričal na o? 261 00:14:06,000 --> 00:14:11,000 Jo, zabudol som prototyp, takže som pomocou funkcie nazýva sigma on-line 15, 262 00:14:11,000 --> 00:14:16,000 ale to nie je vyhlásený až riadku 22, tak som možno aktívne ísť sem 263 00:14:16,000 --> 00:14:22,000 a vyhlásiť prototyp, a poviem int sigma (int number), a to je všetko. 264 00:14:22,000 --> 00:14:24,000 Je vykonávaná na dne. 265 00:14:24,000 --> 00:14:27,000 >> Alebo iný spôsob, ako by som mohol vyriešiť tento problém, 266 00:14:27,000 --> 00:14:30,000 Mohol by som funkciu presunúť tam, čo nie je zlé, 267 00:14:30,000 --> 00:14:32,000 ale aspoň, keď sú vaše programy začnú sa dostať dlho, úprimne povedané, 268 00:14:32,000 --> 00:14:35,000 Myslím, že je to nejaké hodnoty vždy s hlavným hore 269 00:14:35,000 --> 00:14:38,000 takže v čitateľovi môže otvoriť súbor a potom okamžite vidieť 270 00:14:38,000 --> 00:14:40,000 čo program robí, bez toho aby museli hľadať cez neho 271 00:14:40,000 --> 00:14:42,000 hľadá pre túto hlavnú funkciu. 272 00:14:42,000 --> 00:14:49,000 Poďme dole do môjho okna terminálu tu, skúste robiť sigma sigma robiť, 273 00:14:49,000 --> 00:14:51,000 a ja som podelal tady taky. 274 00:14:51,000 --> 00:14:55,000 Implicitné vyhlásenie o funkcie GetInt znamená, že som zabudol na to, čo iné? 275 00:14:55,000 --> 00:14:57,000 [Nepočuteľné-študent] 276 00:14:57,000 --> 00:15:00,000 Dobré, tak zrejme častý omyl, takže poďme dať tejto udalosti tu, 277 00:15:00,000 --> 00:15:04,000 cs50.h, a teraz sa vráťme k môjmu terminálovom okne. 278 00:15:04,000 --> 00:15:08,000 >> Budem vymazať obrazovku, a ja znova spustite, aby sigma. 279 00:15:08,000 --> 00:15:11,000 Zdá sa, že sa zostavujú. Dovoľte mi, aby som teraz spustiť sigma. 280 00:15:11,000 --> 00:15:15,000 Budem zadajte číslo 3, a ja som si 6, takže nie je prísne kontroly, 281 00:15:15,000 --> 00:15:18,000 ale aspoň sa zdá, že bude pracovať na prvý pohľad, ale teraz poďme to rip seba, 282 00:15:18,000 --> 00:15:21,000 a poďme skutočne využívajú myšlienku rekurzia, znovu, 283 00:15:21,000 --> 00:15:24,000 vo veľmi jednoduchom kontexte tak, aby za pár týždňov 284 00:15:24,000 --> 00:15:27,000 keď začneme skúmať milovník dátových štruktúr, ako pole 285 00:15:27,000 --> 00:15:30,000 máme ďalší nástroj v toolkit, s ktorým sa 286 00:15:30,000 --> 00:15:33,000 manipulovať tieto dátové štruktúry ako uvidíme. 287 00:15:33,000 --> 00:15:36,000 To je iteratívny prístup, slučka prístup založený. 288 00:15:36,000 --> 00:15:39,000 >> Dovoľte mi, aby som namiesto toho teraz urobiť. 289 00:15:39,000 --> 00:15:44,000 Dovoľte mi, aby som namiesto toho povedal, že súčtom počtov 290 00:15:44,000 --> 00:15:48,000 dole k 0 je naozaj to isté ako 291 00:15:48,000 --> 00:15:53,000 Číslo + sigma (číslo - 1). 292 00:15:53,000 --> 00:15:57,000 Inými slovami, rovnako ako na stupne Aj punted pre každý z ľudí vedľa mňa, 293 00:15:57,000 --> 00:16:00,000 a podľa poradia držal plaviť až sme konečne svojho dna na Willyho, 294 00:16:00,000 --> 00:16:03,000 kto mal vrátiť pevne odpoveď ako 0. 295 00:16:03,000 --> 00:16:07,000 Tu sme podobne plaviť na sigma 296 00:16:07,000 --> 00:16:10,000 rovnakú funkciu ako bol pôvodne nazývaný, ale kľúčový vhľad tu 297 00:16:10,000 --> 00:16:12,000 je to, že nie sme volať sigma identicky. 298 00:16:12,000 --> 00:16:14,000 Sme neprechádza v n 299 00:16:14,000 --> 00:16:17,000 Sme jednoznačne prechádza v rade - 1, 300 00:16:17,000 --> 00:16:20,000 tak o niečo menší problém, o niečo menší problém. 301 00:16:20,000 --> 00:16:23,000 >> Bohužiaľ, to nie je tak úplne riešenie doteraz, a ako sme sa opraviť 302 00:16:23,000 --> 00:16:26,000 Čo by mohlo byť skákať tak, ako zrejmé, na niektoré z vás 303 00:16:26,000 --> 00:16:28,000 nechaj ma ísť napred a znova robiť. 304 00:16:28,000 --> 00:16:30,000 Zdá sa, že zostaviť v poriadku. 305 00:16:30,000 --> 00:16:32,000 Dovoľte mi, aby som znovu spustiť sigma s 6. 306 00:16:32,000 --> 00:16:37,000 Jejda, dovoľte mi, aby som znova spustite sigma s 6. 307 00:16:37,000 --> 00:16:42,000 Videli sme to predtým, hoci náhodne poslednej dobe tiež. 308 00:16:42,000 --> 00:16:48,000 Prečo som si tento tajomnú Segmentation fault? Jo. 309 00:16:48,000 --> 00:16:50,000 [Nepočuteľné-študent] 310 00:16:50,000 --> 00:16:53,000 Nie je base-case, a konkrétnejšie, čo sa asi stalo? 311 00:16:53,000 --> 00:16:58,000 To je príznakom aké správanie? 312 00:16:58,000 --> 00:17:00,000 Povedz to trochu hlasnejšie. 313 00:17:00,000 --> 00:17:02,000 [Nepočuteľné-študent] 314 00:17:02,000 --> 00:17:05,000 Je to nekonečná slučka efektívne, a problém s nekonečnými slučkami 315 00:17:05,000 --> 00:17:08,000 keď zahŕňajú rekurziu v tomto prípade, funkcia volať seba, 316 00:17:08,000 --> 00:17:10,000 čo sa stane zakaždým, keď zavolať funkciu? 317 00:17:10,000 --> 00:17:13,000 No, myslím, že späť k tomu, ako je stanovené pamäte v počítači. 318 00:17:13,000 --> 00:17:16,000 Povedali sme, že je to kus pamäte tzv stack, ktorý je na dne, 319 00:17:16,000 --> 00:17:19,000 a zakaždým, keď budete volať funkcie trochu viac pamäte dostane dal 320 00:17:19,000 --> 00:17:24,000 na tzv zásobníka obsahujúceho túto funkciu je lokálne premenné alebo parametre, 321 00:17:24,000 --> 00:17:27,000 takže ak sigma volá sigma sigma volaní volanie sigma 322 00:17:27,000 --> 00:17:29,000  vyzýva sigma, kde tento príbeh skončí? 323 00:17:29,000 --> 00:17:31,000 >> No, to nakoniec prekročení celková čiastka 324 00:17:31,000 --> 00:17:33,000 pamäti, že máte k dispozícii k počítaču. 325 00:17:33,000 --> 00:17:37,000 Môžete obsadiť segment, ktorý ste mal zostať vo vnútri, 326 00:17:37,000 --> 00:17:40,000 a získajte tento Segmentation fault, core dumpingové, 327 00:17:40,000 --> 00:17:43,000 a čo core dumpingové znamená, že teraz máte súbor s názvom core 328 00:17:43,000 --> 00:17:46,000 čo je súbor obsahujúci núl a jedničiek 329 00:17:46,000 --> 00:17:49,000 že skutočne v budúcnosti bude diagnosticky užitočné. 330 00:17:49,000 --> 00:17:52,000 Ak to nie je zrejmé na vás, kde sa vaša chyba je 331 00:17:52,000 --> 00:17:54,000 môžete skutočne urobiť trochu forenznej analýzy, aby som tak povedal, 332 00:17:54,000 --> 00:17:58,000 na tento súbor core dump, ktorá je opäť len celá partia núl a jedničiek 333 00:17:58,000 --> 00:18:02,000 ktoré v podstate predstavuje stav vášho programu do pamäti 334 00:18:02,000 --> 00:18:05,000 v okamihu, keď sa zrútil týmto spôsobom. 335 00:18:05,000 --> 00:18:11,000 >> Oprava je, že nemôžeme len tak slepo vrátiť sigma, 336 00:18:11,000 --> 00:18:14,000 číslo + Sigma trochu menší problém. 337 00:18:14,000 --> 00:18:16,000 Musíme mať nejaký základné veci tu, 338 00:18:16,000 --> 00:18:19,000 a čo by referenčný prípad, pravdepodobne? 339 00:18:19,000 --> 00:18:22,000 [Nepočuteľné-študent] 340 00:18:22,000 --> 00:18:25,000 Dobre, tak dlho, kým je číslo kladné by sme sa mali skutočne vráti to, 341 00:18:25,000 --> 00:18:29,000 alebo inak povedané, ak je číslo, povedzme, <= k 0 342 00:18:29,000 --> 00:18:32,000 Vieš čo, ja pôjdem napred a vrátiť 0, 343 00:18:32,000 --> 00:18:36,000 podobne ako Willy urobil, a iný, budem pokračovať 344 00:18:36,000 --> 00:18:41,000 a vrátiť to, takže to nie je, že oveľa kratšia 345 00:18:41,000 --> 00:18:44,000 ako iteratívny verzie, ktoré sme šľahačkou ako prvý pomocou slučky for, 346 00:18:44,000 --> 00:18:48,000 ale všimnite si, že je to druh elegancie k nej. 347 00:18:48,000 --> 00:18:51,000 Namiesto návrate nejaké číslo a prevedenie všetkých týchto matematiku 348 00:18:51,000 --> 00:18:54,000 a pridaním veci s lokálnymi premennými 349 00:18:54,000 --> 00:18:57,000 ste miesto toho povedal: "Dobre, ak je to super jednoduchý problém, 350 00:18:57,000 --> 00:19:01,000 ako je číslo <0, dovoľte mi, aby som sa hneď vrátiť 0. " 351 00:19:01,000 --> 00:19:03,000 >> Nebudeme sa obťažovať podporu záporné čísla, 352 00:19:03,000 --> 00:19:05,000 takže budem pevný kód hodnotu 0. 353 00:19:05,000 --> 00:19:08,000 Ale inak, realizovať túto myšlienku sčítania 354 00:19:08,000 --> 00:19:11,000 všetky z týchto čísel dohromady môžete účinne vziať malý kúsok 355 00:19:11,000 --> 00:19:14,000 z problému, rovnako ako sme to urobili tu na javisku, 356 00:19:14,000 --> 00:19:18,000 potom pramice zvyšok problému na ďalšie osoby, 357 00:19:18,000 --> 00:19:20,000 , Ale v tomto prípade, že ďalšia osoba sami. 358 00:19:20,000 --> 00:19:22,000 Je to rovnako pomenované funkcie. 359 00:19:22,000 --> 00:19:25,000 Len prejsť to menšie a menšie a menšie problém zakaždým, 360 00:19:25,000 --> 00:19:28,000 a aj keď sme sa úplne formalizované veci v kóde tu 361 00:19:28,000 --> 00:19:33,000 To je presne to, čo sa deje v týždni 0 sa v telefónnom zozname. 362 00:19:33,000 --> 00:19:36,000 To je presne to, čo sa deje v posledných týždňoch sa Seanom 363 00:19:36,000 --> 00:19:39,000 a s našimi ukážkami vyhľadávania čísel. 364 00:19:39,000 --> 00:19:42,000 Trvá to nejaký problém a delenie to znova a znova. 365 00:19:42,000 --> 00:19:44,000 >> Inými slovami, existuje spôsob, ako teraz prekladanie 366 00:19:44,000 --> 00:19:47,000 tento reálny svet konštrukt, to vyššia úroveň konštrukt 367 00:19:47,000 --> 00:19:51,000 z rozdeľ a panuj a robiť niečo znovu a znovu 368 00:19:51,000 --> 00:19:56,000 v kóde, takže to je niečo, čo budeme vidieť znova v priebehu času. 369 00:19:56,000 --> 00:20:00,000 Teraz, rovnako ako stranou, ak ste nový rekurzia, mali by ste aspoň chápem 370 00:20:00,000 --> 00:20:02,000 prečo je to smiešne. 371 00:20:02,000 --> 00:20:05,000 Chystám sa ísť na google.com, 372 00:20:05,000 --> 00:20:17,000 a budem hľadať niekoľko tipov a trikov na rekurzia, zadajte. 373 00:20:17,000 --> 00:20:21,000 Povedzte osoby vedľa vás, či sa nesmeje práve teraz. 374 00:20:21,000 --> 00:20:23,000 Mali ste na mysli rekurziu? 375 00:20:23,000 --> 00:20:25,000 Mali ste na mysli-ah, tam ideme. 376 00:20:25,000 --> 00:20:28,000 Dobre, teraz to zvyšok každého. 377 00:20:28,000 --> 00:20:30,000 Trochu Veľkonočné vajíčko vložené niekde v Google. 378 00:20:30,000 --> 00:20:33,000 Ako stranou, jeden z článkov my sme dali na ihrisku internetových stránkach 379 00:20:33,000 --> 00:20:36,000 pre dnešok je len táto sieť rôznych algoritmov triedenia, 380 00:20:36,000 --> 00:20:39,000 z ktorých niektoré sme sa pozreli na minulý týždeň, ale to, čo je pekné o tejto vizualizácie 381 00:20:39,000 --> 00:20:43,000 ako ste sa snaží zabaliť svoju myseľ okolo rôznych vecí súvisiacich s algoritmami 382 00:20:43,000 --> 00:20:46,000 viete, že môžete veľmi ľahko teraz začať s rôznymi typmi vstupov. 383 00:20:46,000 --> 00:20:50,000 Vstupy všetky zvrátiť, vstupy väčšinou sú zoradené, vstupy náhodné a tak ďalej. 384 00:20:50,000 --> 00:20:53,000 Ak sa pokúsite znova, rozlíšiť tieto veci vo vašej mysli 385 00:20:53,000 --> 00:20:57,000 uvedomiť, že táto URL na ihrisku stránkach na prednášky stránke 386 00:20:57,000 --> 00:21:00,000 vám môžu pomôcť dôvodom cez niektoré z nich. 387 00:21:00,000 --> 00:21:05,000 >> Dnes sme sa konečne dostať k riešeniu tohto problému z chvíľu späť, 388 00:21:05,000 --> 00:21:08,000 ktorý bol, že táto odkladacia funkcie jednoducho nefunguje, 389 00:21:08,000 --> 00:21:12,000 a to, čo bolo zásadný problém s touto funkciou swapu, 390 00:21:12,000 --> 00:21:15,000 ktorého cieľom bola opäť vymeniť hodnotu tu a tu 391 00:21:15,000 --> 00:21:17,000 také, že sa tak stane? 392 00:21:17,000 --> 00:21:20,000 To nebolo v skutočnosti fungovať. Prečo? 393 00:21:20,000 --> 00:21:22,000 Jo. 394 00:21:22,000 --> 00:21:28,000 [Nepočuteľné-študent] 395 00:21:28,000 --> 00:21:31,000 Presne, vysvetlenie pre tento bugginess 396 00:21:31,000 --> 00:21:34,000 proste bolo preto, že keď budete volať funkcie v C 397 00:21:34,000 --> 00:21:38,000 a tie funkcie trvať argumenty, ako a, b tu, 398 00:21:38,000 --> 00:21:42,000 ste okoloidúci v kópiách akúkoľvek hodnotu ste poskytovania tejto funkcii. 399 00:21:42,000 --> 00:21:46,000 Nie ste poskytuje pôvodné hodnoty sami, 400 00:21:46,000 --> 00:21:49,000 takže videl v kontexte buggyc, 401 00:21:49,000 --> 00:21:52,000 buggy3.c, ktorý vyzeral trochu niečo takého. 402 00:21:52,000 --> 00:21:57,000 >> Pripomeňme si, že sme mali x a y inicializovaná na 1 a 2, resp. 403 00:21:57,000 --> 00:21:59,000 Potom sme vytlačiť to, čo oni boli. 404 00:21:59,000 --> 00:22:03,000 Potom som tvrdil, že som bol vymieňať je volaním swap x, y. 405 00:22:03,000 --> 00:22:06,000 Ale problém bol, že odkladanie pracoval, 406 00:22:06,000 --> 00:22:10,000 ale iba v rozsahu swapu fungovať sám. 407 00:22:10,000 --> 00:22:13,000 Akonáhle sme narazili riadok 40 týmto vymenili hodnoty 408 00:22:13,000 --> 00:22:16,000 boli vyhodené, a tak nič 409 00:22:16,000 --> 00:22:21,000 v pôvodnej funkcie bola hlavná vlastne nezmenil, 410 00:22:21,000 --> 00:22:26,000 takže ak si myslíte, že vtedy, čo to vyzerá, pokiaľ ide o našej pamäti 411 00:22:26,000 --> 00:22:29,000 v prípade, že ľavá strana dosky predstavuje- 412 00:22:29,000 --> 00:22:33,000 a ja budem robiť moje najlepšie pre každého vidieť, v prípade, že ľavá strana tabule 413 00:22:33,000 --> 00:22:37,000 predstavuje, povedzme, RAM, a zásobník bude rast na up týmto spôsobom, 414 00:22:37,000 --> 00:22:43,000 a zavoláme funkciu ako hlavný, a hlavné má 2 lokálne premenné, x a y, 415 00:22:43,000 --> 00:22:48,000 poďme popísať tie, ktoré sú x tu, a poďme popisovať tieto ako y tu, 416 00:22:48,000 --> 00:22:55,000 a poďme dať v hodnotách 1 a 2, tak toto je hlavné, 417 00:22:55,000 --> 00:22:58,000 a keď hlavné volá swap funkcie operačného systému 418 00:22:58,000 --> 00:23:02,000 dáva SWAP funkcie vlastnej pás pamäte na zásobníku, 419 00:23:02,000 --> 00:23:04,000 vlastný rám vo fronte, aby som tak povedal. 420 00:23:04,000 --> 00:23:08,000 Je tiež prideľuje 32 bitov pre tieto ints. 421 00:23:08,000 --> 00:23:11,000 Stáva sa to nazvať, a b, ale to je úplne náhodné. 422 00:23:11,000 --> 00:23:13,000 Mohlo by ich povolal, čo chce, ale čo sa stane, keď hlavný 423 00:23:13,000 --> 00:23:19,000 vyzýva swap je to berie túto 1, dá kópiu tam, dá kópiu tam. 424 00:23:19,000 --> 00:23:23,000 >> K dispozícii je 1 ďalšie lokálne premennú v swapu, keď volal, čo? >> Tmp. 425 00:23:23,000 --> 00:23:27,000 Tmp, tak mi dovoľte dať si ďalších 32 bitov tu, 426 00:23:27,000 --> 00:23:29,000 a čo som urobil v tejto funkcii? 427 00:23:29,000 --> 00:23:34,000 Povedal som int tmp dostane, tak má 1, tak som to urobil, keď sme naposledy hrali v tomto príklade. 428 00:23:34,000 --> 00:23:39,000 Potom sa dostane b, takže b je 2, takže teraz to bude 2, 429 00:23:39,000 --> 00:23:42,000 a teraz b dostane teplota, takže teplota je 1, 430 00:23:42,000 --> 00:23:44,000 tak teraz b stáva toto. 431 00:23:44,000 --> 00:23:46,000 To je skvelé. Fungovalo to. 432 00:23:46,000 --> 00:23:49,000 Ale potom, akonáhle sa funkcia vráti 433 00:23:49,000 --> 00:23:52,000 swapu pamäte v skutočnosti zmizne, takže to môže byť znovu 434 00:23:52,000 --> 00:23:58,000 inú funkciu v budúcnosti, a hlavné je, samozrejme, úplne bez zmeny. 435 00:23:58,000 --> 00:24:00,000 Potrebujeme spôsob, ako zásadne vyriešenie tohto problému, 436 00:24:00,000 --> 00:24:03,000 a dnes budeme mať konečne spôsob, ako to dosiahnuť, keď 437 00:24:03,000 --> 00:24:06,000 môžeme predstaviť niečo ako ukazovateľ. 438 00:24:06,000 --> 00:24:09,000 Ukazuje sa, že môžeme vyriešiť tento problém 439 00:24:09,000 --> 00:24:12,000 nie je odovzdaním kópie x a y 440 00:24:12,000 --> 00:24:18,000 ale tým, že podstúpi v čo, myslíš, na odkladaciu funkciu? 441 00:24:18,000 --> 00:24:20,000 Jo, čo o adrese? 442 00:24:20,000 --> 00:24:22,000 Sme naozaj hovoril o adresách v veľa podrobne, 443 00:24:22,000 --> 00:24:25,000 ale ak to tabule predstavuje môjho pamäti počítača 444 00:24:25,000 --> 00:24:28,000 by sme mohli určite začať číslovanie bytov v mojom RAM 445 00:24:28,000 --> 00:24:31,000 a povedať to je byte # 1, to je byte # 2, byte # 3, 446 00:24:31,000 --> 00:24:35,000 byte # 4, byte # ... 2000000000 keď mám 2 GB pamäte RAM, 447 00:24:35,000 --> 00:24:38,000 takže sme mohli určite prísť s nejakým ľubovoľným schémy číslovania 448 00:24:38,000 --> 00:24:41,000 pre všetky jednotlivé byty v mojej pamäti počítača. 449 00:24:41,000 --> 00:24:43,000 >> Čo keď namiesto toho, keď som hovor odkladacia 450 00:24:43,000 --> 00:24:47,000 skôr ako prejsť v kópiách x a y 451 00:24:47,000 --> 00:24:51,000 prečo by som miesto odovzdať adresu x tu, 452 00:24:51,000 --> 00:24:55,000 adresa y tu, v podstate poštová adresa 453 00:24:55,000 --> 00:24:59,000 x a y, pretože potom swap, keď je informovaný 454 00:24:59,000 --> 00:25:01,000 na adresu v pamäti X a Y, 455 00:25:01,000 --> 00:25:04,000 potom swap, ak sme cvičili ho trochu, 456 00:25:04,000 --> 00:25:07,000 mohol potenciálne viesť na túto adresu, aby som tak povedal, 457 00:25:07,000 --> 00:25:11,000 x, a zmeniť číslo tam, potom cesta na adresu y, 458 00:25:11,000 --> 00:25:16,000 zmeniť číslo tam, aj keď nie v skutočnosti získať kópie týchto hodnôt sám, 459 00:25:16,000 --> 00:25:19,000 takže aj keď sme o tom hovorili ako hlavnej pamäte 460 00:25:19,000 --> 00:25:23,000 a toto ako bytia swapu pamäte silný a nebezpečný časť C 461 00:25:23,000 --> 00:25:28,000 je to, že každý funkcia môže dotknúť pamäte kdekoľvek v počítači, 462 00:25:28,000 --> 00:25:32,000 a to je silný v tom, že môžete robiť veľmi efektné veci s počítačovými programami v C. 463 00:25:32,000 --> 00:25:36,000 To je nebezpečné, pretože môžete tiež pokaziť veľmi ľahko. 464 00:25:36,000 --> 00:25:39,000 V skutočnosti, na jeden z najčastejších spôsobov, ako programy v týchto dňoch byť využité 465 00:25:39,000 --> 00:25:42,000 Stále je pre programátor neuvedomuje 466 00:25:42,000 --> 00:25:45,000 že on alebo ona je umožniť dátové 467 00:25:45,000 --> 00:25:49,000 byť napísaný v mieste v pamäti, že nebol určený. 468 00:25:49,000 --> 00:25:51,000 >> Napríklad, on alebo ona prehlasuje, pole o veľkosti 10 469 00:25:51,000 --> 00:25:56,000 ale potom náhodne snaží dať 11 bajtov do tejto matice v pamäti, 470 00:25:56,000 --> 00:25:59,000 a začnete dotýkať častí pamäte, ktoré už nie sú platné. 471 00:25:59,000 --> 00:26:02,000 Len pre kontextové to, niektorí z vás vedia, že 472 00:26:02,000 --> 00:26:06,000 softvér často vás vyzve na zadanie sériového čísla alebo registračných kľúčov, 473 00:26:06,000 --> 00:26:08,000 Photoshop a Word a programy, ako je táto. 474 00:26:08,000 --> 00:26:12,000 Existujú trhliny, ako si niektorí z vás vedia, on-line, kde môžete spustiť malý program, 475 00:26:12,000 --> 00:26:14,000 a voila, nič viac žiadosť o poradové číslo. 476 00:26:14,000 --> 00:26:16,000 Ako je to, že pracuje? 477 00:26:16,000 --> 00:26:21,000 V mnohých prípadoch sa tieto veci jednoducho nájsť v počítačoch 478 00:26:21,000 --> 00:26:24,000 textové segmenty v počítači skutočných núl a jedničiek 479 00:26:24,000 --> 00:26:28,000 kde je táto funkcia, kde je požadované sériové číslo, 480 00:26:28,000 --> 00:26:31,000 a prepísať priestor, alebo keď je program spustený 481 00:26:31,000 --> 00:26:33,000 môžete zistiť, kde je kľúč skutočne uložený 482 00:26:33,000 --> 00:26:37,000 pomocou niečo ako debugger, a môžete bezva softvér týmto spôsobom. 483 00:26:37,000 --> 00:26:40,000 To je však neznamená, že toto je naším cieľom pre ďalšie dva dni, 484 00:26:40,000 --> 00:26:42,000 ale má veľmi reálne následky. 485 00:26:42,000 --> 00:26:45,000 Že jeden sa stane zapojiť krádeže softvéru, 486 00:26:45,000 --> 00:26:47,000 ale je tu aj kompromis celých strojov. 487 00:26:47,000 --> 00:26:50,000 >> V skutočnosti, keď webové stránky v týchto dňoch sú využívané 488 00:26:50,000 --> 00:26:53,000 a ohrozená a dáta sú deravý a heslá sú ukradnuté 489 00:26:53,000 --> 00:26:58,000 Tento veľmi často súvisí so zlým riadením niečí pamäte, 490 00:26:58,000 --> 00:27:01,000 alebo, v prípade databáz, neschopnosť predvídať 491 00:27:01,000 --> 00:27:03,000 kontradiktórne vstup, tak o tom viac v najbližších týždňoch, 492 00:27:03,000 --> 00:27:07,000 ale teraz len plížiť náhľad druhu škôd, ktoré môžete urobiť 493 00:27:07,000 --> 00:27:11,000 tým, že úplne pochopiť, ako veci fungujú pod pokrievku. 494 00:27:11,000 --> 00:27:14,000 Poďme o pochopenie, prečo je chybný 495 00:27:14,000 --> 00:27:17,000 s nástrojom, ktorý bude stále viac a viac užitočné 496 00:27:17,000 --> 00:27:19,000 ako naše programy sa zložitejšie. 497 00:27:19,000 --> 00:27:21,000 Tak ďaleko, keď ste mali chybu v programe 498 00:27:21,000 --> 00:27:23,000 ako ste odišla o ladenie to? 499 00:27:23,000 --> 00:27:25,000 Čo vaše techniky boli tak ďaleko, či už učil svoje TF 500 00:27:25,000 --> 00:27:27,000 alebo len samouk? 501 00:27:27,000 --> 00:27:29,000 [Študent] printf. 502 00:27:29,000 --> 00:27:31,000 Printf, takže printf bol pravdepodobne tvoj priateľ v tom, že ak chcete vidieť 503 00:27:31,000 --> 00:27:33,000 čo sa deje vo vnútri vášho programu 504 00:27:33,000 --> 00:27:36,000 stačí dať printf tu, printf tu, printf tu. 505 00:27:36,000 --> 00:27:38,000 Potom ho spustíte, a dostanete veľa vecí na obrazovke 506 00:27:38,000 --> 00:27:43,000 , Ktoré môžete použiť, aby potom odvodiť, čo sa vlastne deje zle vo vašom programe. 507 00:27:43,000 --> 00:27:45,000 >> Printf má tendenciu byť veľmi silná vec, 508 00:27:45,000 --> 00:27:47,000 ale je to veľmi manuálny proces. 509 00:27:47,000 --> 00:27:49,000 Musíte dať printf tu, printf tu, 510 00:27:49,000 --> 00:27:51,000 a ak ste to vnútri slučky môžete dostať 100 riadkov 511 00:27:51,000 --> 00:27:53,000 výstupu, ktorý potom musí preosiať cez. 512 00:27:53,000 --> 00:27:58,000 Nie je to ako veľmi užívateľsky príjemný alebo interaktívne mechanizmus pre ladenie programov, 513 00:27:58,000 --> 00:28:00,000 ale našťastie existuje alternatívy. 514 00:28:00,000 --> 00:28:03,000 Tam je program, napríklad, volal GDB, GNU Debugger, 515 00:28:03,000 --> 00:28:06,000 čo je trochu tajomný v tom, ako ho použiť. 516 00:28:06,000 --> 00:28:08,000 Je to trochu zložitejšie, ale úprimne povedané, 517 00:28:08,000 --> 00:28:11,000 to je jedna z tých vecí, kde, ak si dať v tomto týždni a ďalšie 518 00:28:11,000 --> 00:28:14,000 ďalšie hodina pochopiť niečo ako GDB 519 00:28:14,000 --> 00:28:18,000 to vám ušetrí pravdepodobne aj desiatky hodín v dlhodobom horizonte, 520 00:28:18,000 --> 00:28:21,000 tak s tým, dovoľte mi, aby som vám ukážku, ako tá vec funguje. 521 00:28:21,000 --> 00:28:23,000 >> Som v terminálovom okne. 522 00:28:23,000 --> 00:28:26,000 Nechaj ma ísť napred a skompilovať tento program, buggy3. 523 00:28:26,000 --> 00:28:28,000 Je to už aktuálne. 524 00:28:28,000 --> 00:28:31,000 Dovoľte mi, aby som ho spustiť rovnako ako sme to urobili na chvíľu späť, a naozaj, je rozbiť. 525 00:28:31,000 --> 00:28:34,000 Ale prečo je to? Možno som podelal odkladacie funkciu. 526 00:28:34,000 --> 00:28:37,000 Možno, že je to a, b Tak nejako neviem, pohybujúce sa okolo nich správne. 527 00:28:37,000 --> 00:28:39,000 Nechaj ma ísť ďalej a robiť to. 528 00:28:39,000 --> 00:28:43,000 Skôr než len spustiť buggy3 dovoľte mi, aby som miesto spustenie tohto programu GDB, 529 00:28:43,000 --> 00:28:48,000 a ja poviem to spustiť buggy3, 530 00:28:48,000 --> 00:28:52,000 a budem zahŕňať príkazového riadku argumentu,-TUI, 531 00:28:52,000 --> 00:28:55,000 a dáme to v budúcich problémov pri špec pripomenúť. 532 00:28:55,000 --> 00:28:57,000 A teraz táto čierna a biela rozhranie objavilo sa, že opäť, 533 00:28:57,000 --> 00:28:59,000 je trochu ohromujúci na prvý, pretože tam je všetko 534 00:28:59,000 --> 00:29:02,000 Informácie o záruke tu, ale aspoň je tu niečo spájalo. 535 00:29:02,000 --> 00:29:04,000 V hornej časti okna je môj skutočný kód, 536 00:29:04,000 --> 00:29:08,000 a keď som prechádzať sem dovoľte mi, aby som prejdite na samom vrchole môjho súboru, 537 00:29:08,000 --> 00:29:11,000 a naozaj, tam je buggy3.c, a všimnite si, v dolnej časti tohto okna 538 00:29:11,000 --> 00:29:13,000 Mám GDB riadku. 539 00:29:13,000 --> 00:29:16,000 >> To nie je rovnaká ako normálnemu John Harvard riadku. 540 00:29:16,000 --> 00:29:19,000 To je výzva, čo sa deje, aby mi dovolil riadiť GDB. 541 00:29:19,000 --> 00:29:21,000 GDB je debugger. 542 00:29:21,000 --> 00:29:24,000 Debugger je program, ktorý vám umožní prejsť 543 00:29:24,000 --> 00:29:27,000 prevedenie vášho programu riadok po riadku po riadku, 544 00:29:27,000 --> 00:29:30,000 pozdĺž spôsobom robiť, čo chcete s programom, 545 00:29:30,000 --> 00:29:33,000 aj volanie funkcií, alebo hľadáte, je ešte dôležitejšie, 546 00:29:33,000 --> 00:29:35,000 Na rôznych premenné hodnoty. 547 00:29:35,000 --> 00:29:37,000 Poďme ďalej a urobiť to. 548 00:29:37,000 --> 00:29:40,000 Chystám sa ísť dopredu a zadajte behu na riadku gdb je, 549 00:29:40,000 --> 00:29:43,000 tak zistíte v ľavom dolnom rohu na obrazovke som napísal bežať, 550 00:29:43,000 --> 00:29:45,000 a ja som stlačte klávesu Enter, a čo to bolo? 551 00:29:45,000 --> 00:29:50,000 Je to doslova bežal môj program, ale ja som robil nie vlastne vidieť veľa ďalej tu 552 00:29:50,000 --> 00:29:55,000 preto, že som vlastne povedal ladiaci 553 00:29:55,000 --> 00:29:57,000 pozastaviť v určitom okamihu v čase. 554 00:29:57,000 --> 00:29:59,000 Len zadaním beh spustí program. 555 00:29:59,000 --> 00:30:01,000 Nemám vlastne nič vidieť. Nemôžem s ním manipulovať. 556 00:30:01,000 --> 00:30:03,000 >> Namiesto toho nechajte ma to urobiť. 557 00:30:03,000 --> 00:30:08,000 V tomto GDB riadku, dajte mi miesto zadajte pauzu, zadajte. 558 00:30:08,000 --> 00:30:10,000 To nie je to, čo som chcel napísať. 559 00:30:10,000 --> 00:30:13,000 Poďme namiesto toho napíšte prestávka hlavné. 560 00:30:13,000 --> 00:30:15,000 Inými slovami, chcem nastaviť niečo, čo nazýva zarážka, 561 00:30:15,000 --> 00:30:18,000 ktorý je vhodne pomenovaný pretože to sa zlomí alebo pozastavenie 562 00:30:18,000 --> 00:30:21,000 vykonávanie programu na príslušnom mieste. 563 00:30:21,000 --> 00:30:23,000 Hlavné je názov mojej funkcie. 564 00:30:23,000 --> 00:30:25,000 Všimnite si, že GDB je celkom šikovný. 565 00:30:25,000 --> 00:30:28,000 To prišiel na to, že hlavné stane, kto hrubo na riadku 18 566 00:30:28,000 --> 00:30:32,000 z buggy3.c, a potom zistíte tu vľavo hore 567 00:30:32,000 --> 00:30:34,000 b + je hneď vedľa riadku 18. 568 00:30:34,000 --> 00:30:38,000 To je mi pripomenul, že som si nastaviť zarážku na riadku 18. 569 00:30:38,000 --> 00:30:42,000 Tentoraz, keď som typ beh, budem bežať môj program 570 00:30:42,000 --> 00:30:45,000 až kým nenarazí, že zarážku, 571 00:30:45,000 --> 00:30:48,000 takže program bude pauza pre mňa na riadku 18. 572 00:30:48,000 --> 00:30:50,000 Ideme na to, spustiť. 573 00:30:50,000 --> 00:30:53,000 Nič Zdá sa, že sa stalo, ale s výpovednou lehotou vľavo dole 574 00:30:53,000 --> 00:30:58,000 spustenie programu, buggy3, breakpoint 1 v hlavnej na riadku buggy3.c 18. 575 00:30:58,000 --> 00:31:00,000 Čo môžem robiť? 576 00:31:00,000 --> 00:31:03,000 >> Všimnite si, môžem začať písať veci, ako je tlač, 577 00:31:03,000 --> 00:31:08,000 nie je printf, tlač x, a teraz to je divné. 578 00:31:08,000 --> 00:31:11,000 $ 1 je len zvedavosť, ako uvidíme 579 00:31:11,000 --> 00:31:14,000 pri každej tlači niečo, čo ste si nový $ hodnotu. 580 00:31:14,000 --> 00:31:18,000 To je tak, že môžete sa vrátiť späť na predchádzajúce hodnoty len v prípade, 581 00:31:18,000 --> 00:31:21,000 ale teraz to, čo na plátne mi hovorí, je, že hodnota x v tomto bode príbehu 582 00:31:21,000 --> 00:31:26,000 je zrejme 134514032. 583 00:31:26,000 --> 00:31:29,000 Čo? Kde sa to dokonca pochádzať z? 584 00:31:29,000 --> 00:31:31,000 [Nepočuteľné-študent] 585 00:31:31,000 --> 00:31:34,000 Naozaj, toto je to, čo budeme hovoriť na odpadky hodnotu, a my sme nehovorili o tom ešte, 586 00:31:34,000 --> 00:31:37,000 ale z dôvodu, že by ste ju inicializovať premenné 587 00:31:37,000 --> 00:31:40,000 je samozrejme tak, že majú nejakú hodnotu, ktorú chcete ich mať. 588 00:31:40,000 --> 00:31:44,000 Ale úlovok je pripomenúť, že môžete deklarovať premenné 589 00:31:44,000 --> 00:31:46,000 ako som to urobil pred chvíľou v mojom sigma napríklad 590 00:31:46,000 --> 00:31:48,000 bez toho by sa skutočne dáva im hodnotu. 591 00:31:48,000 --> 00:31:50,000 Spomeňte si, čo som urobil tu v sigma. 592 00:31:50,000 --> 00:31:52,000 Vyhlásil som n, ale akú cenu som dať? 593 00:31:52,000 --> 00:31:56,000 Žiadne, pretože som vedel, že v najbližších niekoľkých riadkov 594 00:31:56,000 --> 00:31:59,000 GetInt sa bude starať o probléme uvedenie hodnoty vnútri n 595 00:31:59,000 --> 00:32:02,000 >> Ale v tomto bode v príbehu riadku 11 596 00:32:02,000 --> 00:32:05,000 a riadok 12 a riadok 13 a riadok 14 597 00:32:05,000 --> 00:32:08,000 počas tých niekoľkých riadkov, čo je hodnota n? 598 00:32:08,000 --> 00:32:10,000 V jazyku C si jednoducho neviem. 599 00:32:10,000 --> 00:32:14,000 Je to všeobecne nejaký smetiarske hodnota, niektoré úplne náhodné číslo 600 00:32:14,000 --> 00:32:17,000 , Ktorý je v podstate ostali z niektorej predchádzajúcej funkcie 601 00:32:17,000 --> 00:32:21,000 ktoré prebehli, tak váš program beží 602 00:32:21,000 --> 00:32:24,000 Pripomínam, že funkcia dostane funkcie, funkcie, funkcie. 603 00:32:24,000 --> 00:32:27,000 Všetky tieto snímky si dať na pamäti, a potom tie funkcie návrate, 604 00:32:27,000 --> 00:32:31,000 a rovnako ako som navrhol s gumou ich pamäť je nakoniec znovu použiť. 605 00:32:31,000 --> 00:32:37,000 No, to len tak sa stane, že táto premenná x v tomto programe 606 00:32:37,000 --> 00:32:41,000 Zdá sa, že obsahuje nejaké odpadky hodnotu ako 134514032 607 00:32:41,000 --> 00:32:44,000 z nejakého predchádzajúcej funkcie, nie ten, ktorý som napísal. 608 00:32:44,000 --> 00:32:47,000 Mohlo by to byť niečo, čo prichádza účinne s operačným systémom, 609 00:32:47,000 --> 00:32:49,000 niektoré funkcie pod kapotou. 610 00:32:49,000 --> 00:32:52,000 >> Dobre, to je v poriadku, ale poďme sa teraz postúpiť na ďalší riadok. 611 00:32:52,000 --> 00:32:55,000 Ak som typ "next" na mojej GDB riadku a ja stlačte klávesu Enter, 612 00:32:55,000 --> 00:32:58,000 Všimnite si, že zvýraznenie sa presunie dole na riadok 19, 613 00:32:58,000 --> 00:33:01,000 ale logické implikácie je, že linka 18 614 00:33:01,000 --> 00:33:06,000 Teraz po spustení, takže keď som zase písať "print x" 615 00:33:06,000 --> 00:33:10,000 Mal by som teraz vidieť 1, a naozaj, ja. 616 00:33:10,000 --> 00:33:14,000 Opäť, $ veci je spôsob, ako GDB vám pripomenie 617 00:33:14,000 --> 00:33:17,000 čo histórie tlače, že ste urobil. 618 00:33:17,000 --> 00:33:21,000 Teraz ma nechaj ísť ďalej a vytlačiť y, a naozaj, y je nejaký blázon hodnota rovnako, 619 00:33:21,000 --> 00:33:24,000 ale žiadny veľký problém, pretože v súlade 19 sa chystáme prideliť 620 00:33:24,000 --> 00:33:27,000 hodnota 2, tak mi dovoľte zadajte "next" znova. 621 00:33:27,000 --> 00:33:29,000 A teraz sme na printf riadku. 622 00:33:29,000 --> 00:33:31,000 Dovoľte mi, aby som to tlačové x. 623 00:33:31,000 --> 00:33:34,000 Dovoľte mi, aby som to tlačovú y. Úprimne povedané, ja začínam trochu unavený z tlače to. 624 00:33:34,000 --> 00:33:38,000 Dovoľte mi, aby som namiesto toho napíšte "displeja X" a "displeja y," 625 00:33:38,000 --> 00:33:41,000 a teraz zakaždým, keď som zadajte príkaz v budúcnosti 626 00:33:41,000 --> 00:33:45,000 Budem pripomenul, čo je x a y, čo je x a y, čo je x a y. 627 00:33:45,000 --> 00:33:48,000 >> Môžem tiež, ako vyňatie pôdy z produkcie, typ "info Locals." 628 00:33:48,000 --> 00:33:50,000 Info je špeciálny príkaz. 629 00:33:50,000 --> 00:33:52,000 Miestne znamená, že mi ukazuje lokálne premenné. 630 00:33:52,000 --> 00:33:55,000 Len v prípade, keď zabudnem, alebo je to blázon, komplikovaná funkcie 631 00:33:55,000 --> 00:33:57,000 že ja alebo niekto iný napísal info obyvatelia vám povie, 632 00:33:57,000 --> 00:34:00,000 aké sú všetky lokálne premenné vnútri tejto lokálnej funkcie 633 00:34:00,000 --> 00:34:03,000 ktoré by vás mohli záleží, ak chcete hrabať okolo. 634 00:34:03,000 --> 00:34:07,000 Teraz, printf sa chystá vykonať, tak nechajte ma ísť dopredu a len typu "next". 635 00:34:07,000 --> 00:34:10,000 Vzhľadom k tomu, že sme v tomto prostredí sme v skutočnosti videl to 636 00:34:10,000 --> 00:34:14,000 vykonávať sem, ale všimnete, že to začína byť trochu rozbité tu. 637 00:34:14,000 --> 00:34:17,000 Všimnime si ale, že to prevažujúci obrazovku tam, 638 00:34:17,000 --> 00:34:21,000 takže to nie je ideálne program tu, ale to je v poriadku, pretože som si vždy hrabať okolo 639 00:34:21,000 --> 00:34:23,000 pomocou tlače, keď chcem. 640 00:34:23,000 --> 00:34:26,000 >> Dovoľte mi, aby som zadajte ďalšie zase, a teraz je tu zaujímavá časť. 641 00:34:26,000 --> 00:34:29,000 V tomto bode príbehu y je 2, a x je 1, 642 00:34:29,000 --> 00:34:32,000 ako navrhuje tu, a znova, 643 00:34:32,000 --> 00:34:35,000 Dôvod, prečo sa automaticky zobrazuje je teraz, pretože som použil príkaz 644 00:34:35,000 --> 00:34:40,000 Displej x a y displej, takže vo chvíli, keď píšem ďalšie 645 00:34:40,000 --> 00:34:43,000 v Teória X a Y by sa mal stať vymenil. 646 00:34:43,000 --> 00:34:45,000 Teraz už vieme, že to nebude ten prípad, 647 00:34:45,000 --> 00:34:49,000 ale uvidíme za chvíľu, ako môžeme ponoriť hlbšie sa zistiť, prečo to je pravda. 648 00:34:49,000 --> 00:34:54,000 Ďalšie, a bohužiaľ, y je stále 2 a x je stále 1, a môžem potvrdiť, ako moc. 649 00:34:54,000 --> 00:34:56,000 Tlač x, y tlače. 650 00:34:56,000 --> 00:34:59,000 Skutočne, žiadny odkladanie sa skutočne stalo, takže poďme začať to znova. 651 00:34:59,000 --> 00:35:01,000 Je zrejmé, swap je rozbité. 652 00:35:01,000 --> 00:35:04,000 Poďme namiesto toho napíšte "Spustiť". 653 00:35:04,000 --> 00:35:07,000 Dovoľte mi povedať áno, chcem reštartovať od začiatku, zadajte. 654 00:35:07,000 --> 00:35:09,000 >> Teraz som späť na riadku 18. 655 00:35:09,000 --> 00:35:11,000 Teraz všimnete x a y sú odpadky hodnoty znovu. 656 00:35:11,000 --> 00:35:15,000 Ďalej, ďalší, ďalší, ďalší. 657 00:35:15,000 --> 00:35:17,000 Keby som nudiť môžem tiež len typ N pre ďalšie. 658 00:35:17,000 --> 00:35:21,000 Môžete ho skrátiť na najkratšiu možnú postupnosť znakov. 659 00:35:21,000 --> 00:35:23,000 Swap je teraz rozdelené. 660 00:35:23,000 --> 00:35:25,000 Poďme ponor, takže miesto písania ďalšie, 661 00:35:25,000 --> 00:35:30,000 teraz budem písať krok tak, že som posilnenie vnútri tejto funkcie 662 00:35:30,000 --> 00:35:33,000 takže môžem prejsť, takže som narazila krok a potom zadajte. 663 00:35:33,000 --> 00:35:37,000 Všimnite si, že upozorňovať na skoky stanovuje nižšie v mojom programe na riadok 36. 664 00:35:37,000 --> 00:35:39,000 Tak aké sú lokálne premenné? 665 00:35:39,000 --> 00:35:41,000 Info Locals. 666 00:35:41,000 --> 00:35:43,000 Nič zatiaľ, pretože sme nedostali k tejto priamke, 667 00:35:43,000 --> 00:35:47,000 tak poďme ďalej a hovoriť "next". 668 00:35:47,000 --> 00:35:50,000 Teraz sa zdá, že majú TMP, tlač tmp. 669 00:35:50,000 --> 00:35:52,000 Garbage hodnota, nie? Myslím, že áno. 670 00:35:52,000 --> 00:35:55,000 Ako asi vytlačiť, tlačové B, 1 a 2? 671 00:35:55,000 --> 00:35:58,000 V okamihu, keď som typ next znova 672 00:35:58,000 --> 00:36:02,000 tmp bude trvať na hodnotu 1, dúfajme, 673 00:36:02,000 --> 00:36:05,000 pretože tmp sa bude priradená hodnota. 674 00:36:05,000 --> 00:36:08,000 >> Teraz poďme si vytlačiť, tlačové b, 675 00:36:08,000 --> 00:36:11,000 ale teraz tlačiť tmp, a to je naozaj 1. 676 00:36:11,000 --> 00:36:14,000 Nechaj ma robiť ďalej. Nechaj ma robiť ďalej. 677 00:36:14,000 --> 00:36:16,000 Dokončil som odkladacie funkciu. 678 00:36:16,000 --> 00:36:19,000 Som stále vo vnútri nej v riadku 40, tak mi dovoľte tlače, 679 00:36:19,000 --> 00:36:22,000 print b, a je mi jedno, čo tmp je. 680 00:36:22,000 --> 00:36:27,000 Vyzerá to, že swap je správne, pokiaľ ide o zámenu a a b 681 00:36:27,000 --> 00:36:31,000 Ale keď som teraz písať ďalej, som skočiť späť na riadok 25, 682 00:36:31,000 --> 00:36:34,000 a samozrejme, ak zadám do x a y tlače 683 00:36:34,000 --> 00:36:38,000 sú stále bez zmeny, takže sme ani opravený problém. 684 00:36:38,000 --> 00:36:41,000 Ale diagnosticky teraz možno s týmto programom GDB 685 00:36:41,000 --> 00:36:44,000 sme aspoň dostali o krok bližšie k pochopeniu 686 00:36:44,000 --> 00:36:47,000 čo sa deje zle, bez toho aby museli vrhu náš kód tým, že printf tu, 687 00:36:47,000 --> 00:36:50,000 printf tu, printf tu a potom ju spustiť znovu a znovu 688 00:36:50,000 --> 00:36:52,000 sa snaží prísť na to, čo sa deje zle. 689 00:36:52,000 --> 00:36:55,000 >> Chystám sa ísť dopredu a ukončite z toho úplne s ukončite. 690 00:36:55,000 --> 00:36:57,000 Bude to potom povedať, "Quit vlastne je?" Áno. 691 00:36:57,000 --> 00:37:00,000 Teraz som späť v mojom bežnom riadku, a ja som urobil pomocou GDB. 692 00:37:00,000 --> 00:37:03,000 Ako stranou, nemusíte používať tento-Tui vlajkou. 693 00:37:03,000 --> 00:37:07,000 V skutočnosti, ak ho vynecháte dostanete v podstate dolnú polovicu obrazovky. 694 00:37:07,000 --> 00:37:11,000 Keby som zadajte prestávka hlavné a potom spustite 695 00:37:11,000 --> 00:37:15,000 Aj stále môžete spustiť svoj program, ale čo to bude robiť je viac textovo 696 00:37:15,000 --> 00:37:18,000 Len mi ukáž aktuálny riadok jeden po druhom. 697 00:37:18,000 --> 00:37:21,000 -Tui, textová užívateľské rozhranie, 698 00:37:21,000 --> 00:37:25,000 Len ukazuje viac programu naraz, čo je asi trochu koncepčne jednoduchšie. 699 00:37:25,000 --> 00:37:27,000 Ale naozaj, môžem len robiť ďalej, budúci, ďalší, 700 00:37:27,000 --> 00:37:30,000 a ja idem vidieť jeden riadok naraz, a ak chcem naozaj vidieť, čo sa deje 701 00:37:30,000 --> 00:37:35,000 Môžem písať zoznam a uvidíte veľa susedných riadkov. 702 00:37:35,000 --> 00:37:39,000 >> Tam je video, ktoré sme požiadali, aby sa budete pozerať na problém sady 3 703 00:37:39,000 --> 00:37:43,000 , V ktorom Nate zahŕňa niektoré zložitosti GDB, 704 00:37:43,000 --> 00:37:46,000 a to je jedna z tých vecí, úprimne, kde niektorí non-triviálne percento z vás 705 00:37:46,000 --> 00:37:49,000 Nikdy sa nedotýkajte GDB, a že bude zlé 706 00:37:49,000 --> 00:37:53,000 pretože doslova skončí tráviť viac času v priebehu tohto semestra 707 00:37:53,000 --> 00:37:56,000 naháňa chyby, potom by ste, ak ste vložili do tejto polhodine / hod 708 00:37:56,000 --> 00:38:00,000 tento týždeň a učenia sa dostať pohodlne s GDB. 709 00:38:00,000 --> 00:38:02,000 Printf bol tvoj priateľ. 710 00:38:02,000 --> 00:38:05,000 GDB by teraz mala byť tvoj priateľ. 711 00:38:05,000 --> 00:38:08,000 >> Akékoľvek otázky týkajúce sa GDB? 712 00:38:08,000 --> 00:38:12,000 A tu je stručný prehľad niektorých z najmocnejších a užitočné príkazy. 713 00:38:12,000 --> 00:38:15,000 Jo. >> Možno vytlačiť reťazec? 714 00:38:15,000 --> 00:38:17,000 Môžete vytlačiť reťazec? Absolútne. 715 00:38:17,000 --> 00:38:19,000 Nemusí to byť len celé čísla. 716 00:38:19,000 --> 00:38:22,000 Ak je premenná y je reťazec stačí zadať tlač s 717 00:38:22,000 --> 00:38:24,000 To vám ukáže, čo sa tento reťazec premenná je. 718 00:38:24,000 --> 00:38:26,000 [Nepočuteľné-študent] 719 00:38:26,000 --> 00:38:28,000 To vám dá adresu a reťazec sám. 720 00:38:28,000 --> 00:38:32,000 To vám ukáže, ako. 721 00:38:32,000 --> 00:38:34,000 A posledná vec, len preto, že sa jedná o dobré vedieť taky. 722 00:38:34,000 --> 00:38:37,000 Backtrace a rám, dovoľte mi, aby som sa ponoriť do tohto jedného minule, 723 00:38:37,000 --> 00:38:39,000 rovnaký presný program s GDB. 724 00:38:39,000 --> 00:38:44,000 Nechaj ma ísť napred a spustiť textovú verziu užívateľského rozhrania, 725 00:38:44,000 --> 00:38:46,000 rozbiť hlavné. 726 00:38:46,000 --> 00:38:49,000 Nechaj ma ísť napred a znovu spustiť. Tu som. 727 00:38:49,000 --> 00:38:55,000 Teraz ma nechaj ísť nabudúce, nabudúce, nabudúce, nabudúce, nabudúce, krok, zadajte. 728 00:38:55,000 --> 00:39:00,000 >> A teraz, že som teraz v swapu zámerne, ale ja na to: "Sakra, čo bola hodnota x?" 729 00:39:00,000 --> 00:39:02,000 Nemôžem x už. 730 00:39:02,000 --> 00:39:05,000 Nemôžem y, pretože to nie je v pôsobnosti. 731 00:39:05,000 --> 00:39:07,000 Sú to v kontexte, ale žiadny problém. 732 00:39:07,000 --> 00:39:09,000 Môžem písať backtrace. 733 00:39:09,000 --> 00:39:13,000 To ukazuje mi všetky funkcie, ktoré boli vykonané až do tohto bodu v čase. 734 00:39:13,000 --> 00:39:16,000 Všimnite si, že jeden na dne, hlavné, zoradia sa hlavné 735 00:39:16,000 --> 00:39:18,000 je na spodnej strane našom obrázku tu. 736 00:39:18,000 --> 00:39:22,000 Skutočnosť, že swap je nad ňou vedenie s odkladacou že nad ním v pamäti tú, 737 00:39:22,000 --> 00:39:26,000 a keď chcem vrátiť na hlavnú dočasne môžem povedať "rám." 738 00:39:26,000 --> 00:39:30,000 Aké číslo? Hlavné je rám # 1. 739 00:39:30,000 --> 00:39:32,000 Chystám sa ísť dopredu a povedať: "frame 1." 740 00:39:32,000 --> 00:39:36,000 >> Teraz som späť v hlavnom, a môžem tlačiť x, a môžem vytlačiť y, 741 00:39:36,000 --> 00:39:40,000 ale nemôžem vytlačiť alebo b 742 00:39:40,000 --> 00:39:43,000 Ale môžem, keď poviem: "Dobre, počkajte. Kde je swap?" 743 00:39:43,000 --> 00:39:46,000 Nechaj ma ísť ďalej a povedať, "frame 0". 744 00:39:46,000 --> 00:39:48,000 Teraz som tam, kde chcem byť, a ako stranou, 745 00:39:48,000 --> 00:39:52,000 je tu ďalšie príkazy taky, ako keď ste naozaj nudiť písanie ďalší, ďalší, ďalší, ďalší, 746 00:39:52,000 --> 00:39:56,000 možno všeobecne povedať, veci ako "ďalší 10," a že sa bude pohybovať po ďalších 10 riadkov. 747 00:39:56,000 --> 00:39:59,000 Môžete tiež napísať "pokračovať", keď naozaj vám dosť s krokovým cez to. 748 00:39:59,000 --> 00:40:05,000 Pokračovať bude spustite program bez prerušenia, kým nenarazí ďalšie zarážku, 749 00:40:05,000 --> 00:40:07,000 či už v slučke alebo nižšia dole vo vašom programe. 750 00:40:07,000 --> 00:40:11,000 >> V tomto prípade sa pokračuje až do konca, a program ukončený normálne. 751 00:40:11,000 --> 00:40:13,000 To je ozdobný spôsob, nižšia proces. 752 00:40:13,000 --> 00:40:16,000 Len váš program ukončený normálne. 753 00:40:16,000 --> 00:40:24,000 Viac o ktoré vo videu a ladenie zasadnutí prísť. 754 00:40:24,000 --> 00:40:26,000 To bolo veľa. 755 00:40:26,000 --> 00:40:35,000 Poďme vziať našu 5-minút prestávku tu, a vrátime sa structs a súbory. 756 00:40:35,000 --> 00:40:38,000 >> Ak ste sa ponorila do tohto týždňa PSet už 757 00:40:38,000 --> 00:40:41,000 budete vedieť, že budeme používať v distribučnom kódu, 758 00:40:41,000 --> 00:40:45,000 zdrojový kód, ktorý sme Vám poskytli ako východiskový bod, niektoré nové techniky. 759 00:40:45,000 --> 00:40:50,000 Najmä, sme zaviedli tento nový kľúčové názvom štruktúra, pre konštrukciu, 760 00:40:50,000 --> 00:40:53,000 takže môžeme vytvoriť vlastné premenné druhov. 761 00:40:53,000 --> 00:40:57,000 Zaviedli sme tiež pojem súboru I / O, súboru vstup a výstup, 762 00:40:57,000 --> 00:41:00,000 a to je tak, že sa môže uložiť stav 763 00:41:00,000 --> 00:41:03,000 svojho Scramble palube do súboru na disku 764 00:41:03,000 --> 00:41:06,000 tak, aby učebné chlapi a chápem 765 00:41:06,000 --> 00:41:09,000 čo sa deje vo vnútri vášho programu, bez toho aby ste museli ručne hrať 766 00:41:09,000 --> 00:41:11,000 desiatky hier zhonu. 767 00:41:11,000 --> 00:41:13,000 Môžeme to urobiť viac automatedly. 768 00:41:13,000 --> 00:41:18,000 >> Táto myšlienka struct rieši pomerne presvedčivé problém. 769 00:41:18,000 --> 00:41:21,000 Predpokladajme, že chceme zaviesť nejaký program 770 00:41:21,000 --> 00:41:25,000 že nejako udržuje informácie o študentoch, 771 00:41:25,000 --> 00:41:28,000 a študenti môžu mať, napríklad, ID, názov 772 00:41:28,000 --> 00:41:31,000 a dom na mieste, ako je Harvard, takže sa jedná 3 kusy informácií 773 00:41:31,000 --> 00:41:34,000 Chceme udržať okolo, tak mi dovoľte pokračovať a začať písať trochu program tu, 774 00:41:34,000 --> 00:41:38,000 patrí stdio.h. 775 00:41:38,000 --> 00:41:42,000 Dovoľte mi, aby som to patrí cs50.h. 776 00:41:42,000 --> 00:41:44,000 A potom začať svoj hlavnú funkciu. 777 00:41:44,000 --> 00:41:46,000 Nebudem obťažovať so žiadnymi argumentmi príkazového riadku, 778 00:41:46,000 --> 00:41:49,000 a tu chcem mať študenta, takže som chcel povedať 779 00:41:49,000 --> 00:41:54,000 Študent má meno, tak som chcel povedať, "názov reťazca." 780 00:41:54,000 --> 00:41:59,000 Potom som chcel povedať, študent tiež má ID, takže int id, 781 00:41:59,000 --> 00:42:03,000 a študent má dom, tak som tiež chcel povedať "reťazec dom." 782 00:42:03,000 --> 00:42:06,000 Potom som si objednať to trochu čistejšie takhle. 783 00:42:06,000 --> 00:42:11,000 Dobre, teraz mám 3 premenné, s ktorými sa predstavujú študenta, tak "študenta." 784 00:42:11,000 --> 00:42:15,000 >> A teraz chcem naplniť tieto hodnoty, tak nechajte ma ísť napred a povedal niečo ako 785 00:42:15,000 --> 00:42:18,000 "Id = 123". 786 00:42:18,000 --> 00:42:21,000 Meno dostane Davida. 787 00:42:21,000 --> 00:42:24,000 Povedzme, že dom dostane Mather, 788 00:42:24,000 --> 00:42:31,000 a potom budem robiť niečo svojvoľne ako printf ("% s, 789 00:42:31,000 --> 00:42:37,000 ktorého ID je% d, žije v% s 790 00:42:37,000 --> 00:42:41,000 A teraz, čo chcem pripojiť tu, jednu po druhej? 791 00:42:41,000 --> 00:42:47,000 Meno, id, dom; return 0. 792 00:42:47,000 --> 00:42:50,000 Dobre, ak som to podelal niekde tu 793 00:42:50,000 --> 00:42:54,000 Myslím, že máme celkom dobrý program, ktorý ukladá jeden študent. 794 00:42:54,000 --> 00:42:57,000 Samozrejme, že to nie je tak zaujímavé. Čo keď chcem mať 2 študentov? 795 00:42:57,000 --> 00:42:59,000 To nie je veľký problém. Môžem podporiť 2 ľudí. 796 00:42:59,000 --> 00:43:03,000 Nechaj ma ísť napred a zdôrazniť to a ísť sem dole, 797 00:43:03,000 --> 00:43:09,000 a môžem povedať, "id = 456" pre niekoho, ako je Rob, ktorý žije v Kirkland. 798 00:43:09,000 --> 00:43:12,000 >> Dobre, počkajte, ale nemôžem volať je to isté, 799 00:43:12,000 --> 00:43:15,000 a vyzerá to, že budem musieť kopírovať to, 800 00:43:15,000 --> 00:43:19,000 tak mi dovoľte povedať, že sa bude jednať o Dávidovi premenné, 801 00:43:19,000 --> 00:43:23,000 a dovoľte mi, aby som niektoré kópie týchto pre Roba. 802 00:43:23,000 --> 00:43:27,000 Zavoláme to Rob, ale to nebude fungovať hneď 803 00:43:27,000 --> 00:43:33,000 preto, že som-počkať, zmeňme ma ID1, name1 a house1. 804 00:43:33,000 --> 00:43:35,000 Rob bude 2, 2. 805 00:43:35,000 --> 00:43:42,000 Musím zmeniť tu, tu, tu, tu, tu, tu. 806 00:43:42,000 --> 00:43:45,000 Počkajte, čo Tommy? Poďme to urobiť znova. 807 00:43:45,000 --> 00:43:49,000 Samozrejme, ak si stále myslíte, že je to dobrý spôsob, ako robiť to, nie je to, 808 00:43:49,000 --> 00:43:52,000 takže kopírovať / vložiť zlé. 809 00:43:52,000 --> 00:43:55,000 Ale my sme to vyriešil pred týždňom. 810 00:43:55,000 --> 00:43:59,000 >> Čo bolo naše riešenie, keď sme chceli mať viac inštancií rovnakého dátového typu? 811 00:43:59,000 --> 00:44:01,000 [Študenti] poľa. 812 00:44:01,000 --> 00:44:03,000 Pole, takže skúsim vyčistiť toto hore. 813 00:44:03,000 --> 00:44:07,000 Dovoľte mi, aby som určitý priestor pre seba v hornej časti, a dovoľte mi, aby som namiesto toho to tu. 814 00:44:07,000 --> 00:44:12,000 Ak budeme si týchto ľudí, a namiesto toho budem hovoriť "int id," 815 00:44:12,000 --> 00:44:14,000 a budem podporovať 3 z nás teraz. 816 00:44:14,000 --> 00:44:18,000 Ja poviem "názvy reťazcov," a ja podporovať 3 z nás, 817 00:44:18,000 --> 00:44:22,000 a potom som chcel povedať, "reťazec domy," a budem podporovať 3 z nás. 818 00:44:22,000 --> 00:44:26,000 Teraz tu miesto David dostať svoje vlastné lokálne premenné 819 00:44:26,000 --> 00:44:28,000 môžeme zbaviť tých. 820 00:44:28,000 --> 00:44:30,000 Že sa cíti dobre, že sme čistenie to až. 821 00:44:30,000 --> 00:44:35,000 Potom môžem povedať, David bude [0] a názvy [0] 822 00:44:35,000 --> 00:44:38,000 a domy [0]. 823 00:44:38,000 --> 00:44:41,000 A potom Rob môžeme podobne ušetriť na túto tému. 824 00:44:41,000 --> 00:44:46,000 Poďme dať to sem, takže to bude ľubovoľne bude ids [1]. 825 00:44:46,000 --> 00:44:50,000 On to bude mena [1], 826 00:44:50,000 --> 00:44:53,000 a potom konečne domy [1]. 827 00:44:53,000 --> 00:44:57,000 >> Stále trochu nudné, a teraz musím prísť na to, 828 00:44:57,000 --> 00:45:03,000 takže povedzme "mena [0], id [0], domy [0], 829 00:45:03,000 --> 00:45:06,000 a poďme pluralize to. 830 00:45:06,000 --> 00:45:09,000 IDS, IDS, IDS. 831 00:45:09,000 --> 00:45:12,000 A opäť, robím to, tak znova, som už uchyľovať kopírovať / vložiť znova, 832 00:45:12,000 --> 00:45:14,000 takže šance sú tam iné riešenie tu. 833 00:45:14,000 --> 00:45:18,000 Ja si asi vyčistiť to ešte vyššie, sa slučkou, alebo niečo také, 834 00:45:18,000 --> 00:45:21,000 Takže v skratke, je to trochu lepšie, ale stále sa cíti ako 835 00:45:21,000 --> 00:45:24,000 Ja sa uchyľovať k kopírovať / vložiť, ale aj to, tvrdím, 836 00:45:24,000 --> 00:45:27,000 nie je naozaj zásadne správne riešenie, pretože 837 00:45:27,000 --> 00:45:29,000 čo keď niekedy sa rozhodneme viete čo? 838 00:45:29,000 --> 00:45:32,000 By sme mali byť uloženie e-mailovej adresy pre Davida a Rob 839 00:45:32,000 --> 00:45:34,000 a všetci ostatní v tomto programe. 840 00:45:34,000 --> 00:45:36,000 Mali by sme tiež ukladať telefónne čísla. 841 00:45:36,000 --> 00:45:39,000 Mali by sme tiež ukladať čísla tiesňového kontakt. 842 00:45:39,000 --> 00:45:41,000 Máme všetky tieto kúsky dát, ktoré chcete uložiť, 843 00:45:41,000 --> 00:45:43,000 tak ako sa vám ísť o tom, že? 844 00:45:43,000 --> 00:45:46,000 >> Môžete deklarovať ďalšie pole v hornej časti, a potom ručne pridať 845 00:45:46,000 --> 00:45:49,000 e-mailová adresa [0], e-mailová adresa [1] 846 00:45:49,000 --> 00:45:51,000 Dávidovi a Rob a tak ďalej. 847 00:45:51,000 --> 00:45:56,000 Ale je to naozaj len predpoklad, z ktorého tento design 848 00:45:56,000 --> 00:45:59,000 že som pomocou česť systém vedieť, že 849 00:45:59,000 --> 00:46:03,000 [I] v každej z niekoľkých polí 850 00:46:03,000 --> 00:46:06,000 len tak náhodou odkazovať na rovnakú osobu, 851 00:46:06,000 --> 00:46:10,000 takže [0] v IDS je číslo 123, 852 00:46:10,000 --> 00:46:13,000 a budem predpokladať, že mená [0] 853 00:46:13,000 --> 00:46:16,000 je tá istá osoba meno a domy [0] 854 00:46:16,000 --> 00:46:21,000 je tá istá osoba dom a tak ďalej pre všetky z rôznych polí, ktoré som vytvárajú. 855 00:46:21,000 --> 00:46:24,000 Všimnime si ale, že to nie je zásadný väzba 856 00:46:24,000 --> 00:46:27,000 medzi tie 3 kusy informácií, id, meno a dom, 857 00:46:27,000 --> 00:46:32,000 aj keď účtovná jednotka sa snažíme vzoru v tomto programe nie je pole. 858 00:46:32,000 --> 00:46:35,000 Polia sú práve tento programový spôsob, ako to dosiahnuť. 859 00:46:35,000 --> 00:46:38,000 Čo naozaj chceme modelovať v našom programe, je osoba, 860 00:46:38,000 --> 00:46:41,000 podobne ako David, človek ako Rob vnútri, ktoré 861 00:46:41,000 --> 00:46:46,000 alebo zapuzdrenie je meno a ID a dom. 862 00:46:46,000 --> 00:46:49,000 >> Môžeme nejako vyjadriť túto myšlienku zapuzdrenie 863 00:46:49,000 --> 00:46:52,000 keď človek má ID, meno a dom 864 00:46:52,000 --> 00:46:55,000 a nie sa uchýliť k naozaj hack, kedy sme len 865 00:46:55,000 --> 00:46:58,000 verím, že konzola niečo 866 00:46:58,000 --> 00:47:02,000 odkazuje na rovnaký ľudskej entity v každej z týchto rôznorodých polí? 867 00:47:02,000 --> 00:47:04,000 Môžeme skutočne urobiť. 868 00:47:04,000 --> 00:47:08,000 Nechaj ma ísť nad hlavným teraz, a dovoľte mi, aby som vytvoriť svoj vlastný dátový typ 869 00:47:08,000 --> 00:47:10,000 pre naozaj prvýkrát. 870 00:47:10,000 --> 00:47:14,000 Využili sme túto techniku ​​v Scramble, 871 00:47:14,000 --> 00:47:17,000 ale tu budem pokračovať a vytvoriť dátový typ, 872 00:47:17,000 --> 00:47:19,000 a viete čo, budem to nazývať študent alebo osoba, 873 00:47:19,000 --> 00:47:23,000 a budem používať typedef pre definíciu typu. 874 00:47:23,000 --> 00:47:25,000 Chystám sa povedať, že je to štruktúra, 875 00:47:25,000 --> 00:47:29,000 a potom táto štruktúra bude typu študenta, budeme hovoriť, 876 00:47:29,000 --> 00:47:31,000 aj keď je to trochu z teraz pre mňa. 877 00:47:31,000 --> 00:47:33,000 Povieme "int id." 878 00:47:33,000 --> 00:47:35,000 Povieme "názov reťazca." 879 00:47:35,000 --> 00:47:37,000 Potom budeme hovoriť "string dom," 880 00:47:37,000 --> 00:47:40,000 tak odteraz do konca týchto pár riadkov kódu 881 00:47:40,000 --> 00:47:45,000 Práve som učil rinčanie, že existuje 882 00:47:45,000 --> 00:47:49,000 dátový typ okrem ints, okrem reťazcov, okrem zdvojnásobí, okrem plaváky. 883 00:47:49,000 --> 00:47:54,000 >> Od tejto chvíle v časovej línii 11, je teraz nový dátový typ nazvaný študentov, 884 00:47:54,000 --> 00:47:58,000 a teraz môžem vyhlásiť, študentské premennú kdekoľvek chcem, 885 00:47:58,000 --> 00:48:01,000 tak mi dovoľte prejdite sem ľudí. 886 00:48:01,000 --> 00:48:05,000 Teraz môžem zbaviť toho, a môžem ísť späť dole k Dávidovi tu, 887 00:48:05,000 --> 00:48:10,000 a pre Davida môžem skutočne povedať, že David, 888 00:48:10,000 --> 00:48:13,000 môžeme doslova pomenovať premenné po sebe, 889 00:48:13,000 --> 00:48:16,000 bude typu študenta. 890 00:48:16,000 --> 00:48:18,000 To by mohlo vyzerať trochu divne, ale to nie je všetko, že rôzne 891 00:48:18,000 --> 00:48:22,000 od vyhlásenia niečo ako int alebo reťazec alebo plaváku. 892 00:48:22,000 --> 00:48:24,000 To len tak sa stane, byť nazývaný študenta teraz, 893 00:48:24,000 --> 00:48:28,000 a keď chcem, aby niečo vo vnútri tejto štruktúry 894 00:48:28,000 --> 00:48:31,000 Teraz mám použiť nový kus syntaxe, ale je to celkom jednoduché, 895 00:48:31,000 --> 00:48:39,000 david.id = 123, david.name = "David" v hlavnom D, 896 00:48:39,000 --> 00:48:42,000 a david.house = "Mather," 897 00:48:42,000 --> 00:48:46,000 a teraz môžem zbaviť tejto veci tu. 898 00:48:46,000 --> 00:48:51,000 Všimnite si, že sme teraz prerobila náš program naozaj oveľa lepšie 899 00:48:51,000 --> 00:48:54,000 v tom, že teraz náš program kopíruje reálny svet. 900 00:48:54,000 --> 00:48:57,000 >> Tam je real-svet pojem osoby alebo študenta. 901 00:48:57,000 --> 00:49:02,000 Tu máme teraz verzii C osoby alebo presnejšie študenta. 902 00:49:02,000 --> 00:49:05,000 Vnútri tejto osoby sú tieto rozhodujúce vlastnosti, 903 00:49:05,000 --> 00:49:10,000 ID, názov a dom, tak Rob podstate stáva to isté tu dole, 904 00:49:10,000 --> 00:49:14,000 tak študenti rob, a teraz rob.id = 456, 905 00:49:14,000 --> 00:49:17,000 rob.name = "Rob." 906 00:49:17,000 --> 00:49:20,000 Skutočnosť, že premenná sa nazýva Rob je trochu nezmyselné. 907 00:49:20,000 --> 00:49:22,000 Mohli sme hovorili, že je x alebo y alebo z. 908 00:49:22,000 --> 00:49:25,000 Práve sme sa volal to Rob byť sémanticky konzistentné, 909 00:49:25,000 --> 00:49:28,000 ale v skutočnosti meno je vo vnútri tejto oblasti sám, 910 00:49:28,000 --> 00:49:30,000 takže teraz mám toto. 911 00:49:30,000 --> 00:49:33,000 To tiež nie je cítiť sa ako najlepší dizajn v tom, že som pevný kódované David. 912 00:49:33,000 --> 00:49:35,000 Ja som pevný kódované Roba. 913 00:49:35,000 --> 00:49:39,000 A ešte musím uchýliť k nejakej skopírujte a vložte zakaždým Chcem nové premenné. 914 00:49:39,000 --> 00:49:43,000 Navyše som si zrejme mal každý z týchto premenných meno, 915 00:49:43,000 --> 00:49:46,000 aj keď by som oveľa radšej popisovať tieto premenné 916 00:49:46,000 --> 00:49:48,000  viac druhovo ako študenti. 917 00:49:48,000 --> 00:49:52,000 >> Teraz môžeme zlúčiť myšlienky, ktoré funguje dobre pre nás 918 00:49:52,000 --> 00:49:56,000 a namiesto toho povedal: "Vieš čo, daj mi premennú s názvom študentov, 919 00:49:56,000 --> 00:50:01,000 a poďme sa to byť o veľkosti 3, "takže teraz môžem upresniť to ďalej, 920 00:50:01,000 --> 00:50:04,000 zbaviť ručne deklarované David, 921 00:50:04,000 --> 00:50:08,000 a môžem namiesto toho povedal niečo ako študentov [0] tu. 922 00:50:08,000 --> 00:50:11,000 Potom môžem povedať, študentov [0] tu, 923 00:50:11,000 --> 00:50:14,000 študenti [0] tu, a tak ďalej, a môžem ísť okolo 924 00:50:14,000 --> 00:50:16,000 a vyčistiť, aby sa pre Roba. 925 00:50:16,000 --> 00:50:19,000 Mohol by som tiež ísť o teraz možná pridaním slučky 926 00:50:19,000 --> 00:50:23,000 a pomocou GetString a GetInt skutočne dostať tieto hodnoty od užívateľa. 927 00:50:23,000 --> 00:50:27,000 Mohol by som ísť o pridanie konštanta, pretože to je všeobecne zlá prax 928 00:50:27,000 --> 00:50:29,000 na pevný kód niektoré ľubovoľné číslo ako 3 tu 929 00:50:29,000 --> 00:50:33,000 a potom už len na pamäti, že by ste mali dať viac ako 3 študentov v ňom. 930 00:50:33,000 --> 00:50:36,000 Bolo by asi bolo lepšie použiť # define v hornej časti môjho súboru 931 00:50:36,000 --> 00:50:40,000 a faktor, ktorý sa, tak naozaj, nechajte ma ísť napred a zovšeobecniť toto. 932 00:50:40,000 --> 00:50:43,000 >> Dovoľte mi, aby som otvoriť príklad, ktorý je medzi dnešnej 933 00:50:43,000 --> 00:50:46,000 Príklady vopred, structs1. 934 00:50:46,000 --> 00:50:49,000 To je viac kompletný program, ktorý používa # define sem 935 00:50:49,000 --> 00:50:51,000 a hovorí, že budeme mať 3 študentov v predvolenom nastavení. 936 00:50:51,000 --> 00:50:54,000 Tu som sa prehlasuje, že triedny cenu študentov, 937 00:50:54,000 --> 00:50:57,000 takže učebňa študentov, a teraz som s použitím slučky 938 00:50:57,000 --> 00:51:00,000 len preto, aby sa kód trochu viac elegantný, naplniť triedu 939 00:51:00,000 --> 00:51:05,000 s vstup užívateľa, tak určiť iteráciou od i = 0 až na študentov, čo je 3. 940 00:51:05,000 --> 00:51:07,000 A potom som vyzve užívateľa v tejto verzii 941 00:51:07,000 --> 00:51:10,000  Čo je študenta ID, a ja si to s GetInt. 942 00:51:10,000 --> 00:51:13,000 Čo je na meno študenta, a potom som si to s GetString. 943 00:51:13,000 --> 00:51:15,000 Čo je na študenta dom? Chápem to s GetString. 944 00:51:15,000 --> 00:51:19,000 A potom v dolnej tu som sa rozhodol zmeniť 945 00:51:19,000 --> 00:51:22,000 ako som tlač týchto, a skutočne používať slučky, 946 00:51:22,000 --> 00:51:24,000 A kto som ja tlač? 947 00:51:24,000 --> 00:51:27,000 Podľa komentármi som tlač nikoho v Mather, 948 00:51:27,000 --> 00:51:30,000 a je to tak Roba a Tommym a tak ďalej, vlastne Tommy je v Mather. 949 00:51:30,000 --> 00:51:34,000 Tommy a David by byť vytlačené v tomto prípade, ale ako je to pracuje? 950 00:51:34,000 --> 00:51:40,000 Nevideli sme túto funkciu skôr, ale hádať o tom, čo to robí. 951 00:51:40,000 --> 00:51:42,000 Porovná reťazca. 952 00:51:42,000 --> 00:51:45,000 >> Je to trochu iné ako zrejmé, ako sa porovnáva reťazca, pretože sa ukazuje, 953 00:51:45,000 --> 00:51:49,000 ak sa vráti 0 to znamená, že reťazce sú zhodné. 954 00:51:49,000 --> 00:51:53,000 Ak sa vráti -1 to znamená, že niekto príde abecedne skôr ako ten druhý, 955 00:51:53,000 --> 00:51:57,000 a ak je to vráti 1 to znamená, že ďalšie slovo príde abecedne 956 00:51:57,000 --> 00:52:00,000 skôr ako ten druhý, a môžete sa pozrieť na internete alebo v manuálové stránky 957 00:52:00,000 --> 00:52:04,000 presne zistiť, akým spôsobom je ktorý, ale toto všetko je teraz robí, je to hovorí 958 00:52:04,000 --> 00:52:09,000 v prípade, že [i]. dom sa rovná "Mather" 959 00:52:09,000 --> 00:52:13,000 potom ísť dopredu a vytlačiť tak, a tak je v Mather. 960 00:52:13,000 --> 00:52:16,000 Ale tu je to niečo, čo sme ešte nevideli, a vrátime k tomu. 961 00:52:16,000 --> 00:52:21,000 Nespomínam si, že by bolo potrebné vykonať v niektorej z mojich programov. 962 00:52:21,000 --> 00:52:24,000 Zdarma je zrejme odkazuje na pamäti, uvoľnenie pamäte, 963 00:52:24,000 --> 00:52:31,000 ale čo pamäte som zrejme uvoľní v tejto slučky v spodnej časti tohto programu? 964 00:52:31,000 --> 00:52:34,000 Vyzerá to, že som uvoľnenie meno osoby 965 00:52:34,000 --> 00:52:37,000 a osoba je dom, ale prečo je to? 966 00:52:37,000 --> 00:52:41,000 >> Ukázalo sa, že vo všetkých týchto týždňov, ktoré ste doteraz používali GetString 967 00:52:41,000 --> 00:52:45,000 sme trochu bolo zavedenie chybu v každom z vašich programov. 968 00:52:45,000 --> 00:52:51,000 GetString pamäťou návrhu prideľuje tak, aby sa mohli vrátiť k vám reťazca, 969 00:52:51,000 --> 00:52:55,000 ako David, alebo Rob, a potom môžete robiť, čo chcete, 970 00:52:55,000 --> 00:52:59,000 s týmto reťazcom vo vašom programe, pretože sme vyhradené pamäť pre vás. 971 00:52:59,000 --> 00:53:02,000 Problém je všetko tentoraz pri každom volaní GetString 972 00:53:02,000 --> 00:53:05,000 my, autori GetString, sa pýta, operačný systém 973 00:53:05,000 --> 00:53:07,000 aby nám trochu RAM pre tohto reťazca. 974 00:53:07,000 --> 00:53:09,000 Dajte nám trochu RAM pre túto ďalšiu reťazca. 975 00:53:09,000 --> 00:53:11,000 Dajte nám trochu viac pamäte RAM pre túto ďalšiu reťazca. 976 00:53:11,000 --> 00:53:13,000 Čo ste, programátor, nikdy robil 977 00:53:13,000 --> 00:53:15,000 dáva nám, že pamäť späť, 978 00:53:15,000 --> 00:53:17,000 tak pre tých niekoľko týždňov všetky programy, ktoré ste napísali 979 00:53:17,000 --> 00:53:20,000 mali, čo sa nazýva pamäťový skok, ktorým sa naďalej používať 980 00:53:20,000 --> 00:53:24,000 viac a viac pamäte zakaždým, keď budete volať GetString, a to je v poriadku. 981 00:53:24,000 --> 00:53:27,000 Zámerne sme sa tomu, že v prvých týždňoch, pretože to nie je tak zaujímavé 982 00:53:27,000 --> 00:53:29,000 mať na starosti o tom, kde je reťazec pochádza. 983 00:53:29,000 --> 00:53:34,000 Všetko, čo chcem, je slovo, Rob sa vrátil keď používateľ zadá ju dovnútra 984 00:53:34,000 --> 00:53:38,000 >> Ale dopredu teraz musíme začať sa viac dômyselný o tom. 985 00:53:38,000 --> 00:53:42,000 Kedykoľvek sa alokovať pamäť môžeme lepšie nakoniec odovzdať ho späť. 986 00:53:42,000 --> 00:53:45,000 Inak v reálnom svete na vašom počítači Mac alebo PC môžete mať občas skúsených 987 00:53:45,000 --> 00:53:50,000 príznaky, kde je počítač brúsenie k zastaveniu nakoniec 988 00:53:50,000 --> 00:53:54,000 alebo hlúpy točiace plážová lopta práve okupuje počítač je 989 00:53:54,000 --> 00:53:56,000 Celá pozornosť a nemôžete robiť veci. 990 00:53:56,000 --> 00:54:00,000 To sa dá vysvetliť tým, ľubovoľný počet chýb, ale medzi tie prípadné chyby 991 00:54:00,000 --> 00:54:03,000 sú veci, tzv úniky pamäti, kedy niekto, kto písal ten kus softvéru 992 00:54:03,000 --> 00:54:07,000 Používate nepamätal na voľnej pamäte 993 00:54:07,000 --> 00:54:10,000 že on alebo ona požiadala operačný systém pre, 994 00:54:10,000 --> 00:54:14,000 nepoužívate GetString, pretože to CS50 vec, ale pomocou podobné funkcie 995 00:54:14,000 --> 00:54:16,000 že požiadať operačný systém pre pamäte. 996 00:54:16,000 --> 00:54:19,000 Ak vy alebo oni skrutku a nikdy skutočne vráti, že pamäť 997 00:54:19,000 --> 00:54:24,000 príznak, ktorý môže byť, že program, spomaľuje a spomaľuje a spomaľuje 998 00:54:24,000 --> 00:54:26,000 ak si spomeniete, volať zadarmo. 999 00:54:26,000 --> 00:54:28,000 >> Vrátime sa, kedy a prečo by ste volať zadarmo, 1000 00:54:28,000 --> 00:54:32,000 ale poďme toho len dobré opatrenia a pokúste sa spustiť tento konkrétny program. 1001 00:54:32,000 --> 00:54:35,000 Toto bolo nazývané structs1, zadajte. 1002 00:54:35,000 --> 00:54:40,000 Nechaj ma ísť napred a spustiť structs1, 123, David Mather, 1003 00:54:40,000 --> 00:54:47,000 456, Rob Kirkland, 789, 1004 00:54:47,000 --> 00:54:50,000 Tommy Mather, a vidíme Davida v Mather, Tommy je v Mather. 1005 00:54:50,000 --> 00:54:53,000 To je len malý rozum skontrolujte, či program pracuje. 1006 00:54:53,000 --> 00:54:56,000 Teraz, bohužiaľ, tento program je trochu frustrujúce v tom, že 1007 00:54:56,000 --> 00:55:00,000 Ja som všetko, čo práca, som napísal v 9 rôznych reťazcov, stlačte klávesu Enter, 1008 00:55:00,000 --> 00:55:04,000 Bolo mi povedané, kto bol v Mather, ale samozrejme som vedel, kto bol v Mather už preto, že som ju zadali. 1009 00:55:04,000 --> 00:55:07,000 Bolo by pekné, keby aspoň tento program je viac ako databáza 1010 00:55:07,000 --> 00:55:10,000 a vlastne si pamätá, čo som napísal v 1011 00:55:10,000 --> 00:55:12,000 takže som nikdy musieť zadávať tieto záznamy o študentoch. 1012 00:55:12,000 --> 00:55:15,000 Možno je to ako registrarial systému. 1013 00:55:15,000 --> 00:55:21,000 >> Môžeme to urobiť pomocou tejto techniky známej ako súbor I / O, súboru vstup a výstup, 1014 00:55:21,000 --> 00:55:24,000 veľmi všeobecný spôsob, ako povedať, kedykoľvek budete chcieť čítať alebo zapisovať súbory 1015 00:55:24,000 --> 00:55:26,000 môžete to urobiť s určitou sadu funkcií. 1016 00:55:26,000 --> 00:55:29,000 Nechaj ma ísť napred a otvorte tento príklad structs2.c, 1017 00:55:29,000 --> 00:55:33,000 ktorá je takmer totožná, ale uvidíme, čo to teraz robí. 1018 00:55:33,000 --> 00:55:36,000 V hornej časti súboru Prehlasujem triedu študentov. 1019 00:55:36,000 --> 00:55:38,000 Potom som naplniť triedy s vstup užívateľa, 1020 00:55:38,000 --> 00:55:41,000 takže tie riadky kódu sú presne ako predtým. 1021 00:55:41,000 --> 00:55:45,000 Potom keď som nalistujte tu vytlačiť každý, kto je v Mather ľubovoľne ako predtým, 1022 00:55:45,000 --> 00:55:47,000 ale to je zaujímavá nová funkcia. 1023 00:55:47,000 --> 00:55:51,000 Tieto riadky kódu sú nové, a oni predstaví tu niečo, 1024 00:55:51,000 --> 00:55:55,000 OBRÁZOK, všetky veľké písmená, a to má * tu rovnako. 1025 00:55:55,000 --> 00:55:58,000 Dovoľte mi prejsť to tu, a * tu tiež. 1026 00:55:58,000 --> 00:56:00,000 >> Táto funkcia sme nevideli, fopen, 1027 00:56:00,000 --> 00:56:03,000 ale to znamená súbor otvorený, takže sa poďme prelistovať nich, 1028 00:56:03,000 --> 00:56:05,000 a to je niečo, čo sa vrátime v najbližších psets, 1029 00:56:05,000 --> 00:56:10,000 ale táto linka tu v podstate otvorí súbor s názvom databázy, 1030 00:56:10,000 --> 00:56:13,000 a to konkrétne otvorí to takým spôsobom, že môže robiť to, čo do nej? 1031 00:56:13,000 --> 00:56:15,000 [Nepočuteľné-študent] 1032 00:56:15,000 --> 00:56:19,000 Dobre, tak "w" jednoducho znamená, že to hovorí operačný systém 1033 00:56:19,000 --> 00:56:21,000 otvorenie tohto súboru takým spôsobom, že nemôžem zapisovať. 1034 00:56:21,000 --> 00:56:23,000 Nechcem si ho prečítať. Nechcem, aby na neho len pozrú. 1035 00:56:23,000 --> 00:56:26,000 Chcem to zmeniť a pridať veci potenciálne k nemu, 1036 00:56:26,000 --> 00:56:28,000 a súbor sa bude nazývaný databázy. 1037 00:56:28,000 --> 00:56:30,000 To by mohlo byť nazývaný nič. 1038 00:56:30,000 --> 00:56:32,000 To by mohlo byť database.txt. To by mohlo byť. Db. 1039 00:56:32,000 --> 00:56:37,000 To by mohlo byť slovo ako foo, ale ja som svojvoľne zvolila názov súboru databázy. 1040 00:56:37,000 --> 00:56:42,000 To je trochu rozumu kontrola, či sa vrátime do veľmi podrobne v priebehu času, 1041 00:56:42,000 --> 00:56:47,000 ak fp, pre tento súbor ukazovateľ, nie je rovnaký NULL to znamená, že je všetko v poriadku. 1042 00:56:47,000 --> 00:56:51,000 >> Dlhý príbeh krátky, funkcie ako fopen niekedy nedarí. 1043 00:56:51,000 --> 00:56:53,000 Možno súbor neexistuje. Možno ste z disku. 1044 00:56:53,000 --> 00:56:55,000 Možno nemáte oprávnenie k tejto zložke, 1045 00:56:55,000 --> 00:56:58,000 takže ak fopen vráti null niečo zlé stalo. 1046 00:56:58,000 --> 00:57:02,000 Naopak, ak fopen nevráti null všetko je v poriadku 1047 00:57:02,000 --> 00:57:04,000 a môžem začať písať do tohto súboru. 1048 00:57:04,000 --> 00:57:06,000 Tu je nový trik. 1049 00:57:06,000 --> 00:57:08,000 To je pre slučky, ktorý je iterácia nad každým z mojich študentov, 1050 00:57:08,000 --> 00:57:10,000 a to vyzerá tak podobné tomu, čo sme robili predtým, 1051 00:57:10,000 --> 00:57:15,000 ale táto funkcia je bratranec printf vyzvala fprintf pre súbor printf, 1052 00:57:15,000 --> 00:57:18,000 a všimnite si, že je to iný iba vo 2 spôsobmi. 1053 00:57:18,000 --> 00:57:20,000 Jeden, začína f miesto p, 1054 00:57:20,000 --> 00:57:23,000 ale potom jeho prvý argument je zrejme to, čo? 1055 00:57:23,000 --> 00:57:25,000 [Študenti] súboru. >> Je to súbor. 1056 00:57:25,000 --> 00:57:30,000 To, čomu sa hovorí fp, ktoré budeme nakoniec šprýmař oddelene, čo súbor je ukazovateľ, 1057 00:57:30,000 --> 00:57:35,000 ale teraz fp predstavuje len súbor, ktorý som otvoril, 1058 00:57:35,000 --> 00:57:41,000 tak fprintf tu hovorí vytlačiť tento návod ID do súboru, nie na obrazovke. 1059 00:57:41,000 --> 00:57:44,000 Vytlačte meno užívateľa do súboru, nie na obrazovke, 1060 00:57:44,000 --> 00:57:47,000 dom do súboru, nie na obrazovke, a potom tu dole, samozrejme, 1061 00:57:47,000 --> 00:57:50,000 zatvorte súbor, a potom sem bez pamäti. 1062 00:57:50,000 --> 00:57:53,000 >> Jediný rozdiel medzi touto verziou 2 a verzia 1 1063 00:57:53,000 --> 00:57:58,000 je zavedenie funkcie fopen, a to súbor s príponou * 1064 00:57:58,000 --> 00:58:01,000 a tento pojem fprintf, takže sa poďme pozrieť, čo konečný výsledok je. 1065 00:58:01,000 --> 00:58:03,000 Nechaj ma ísť do môjho terminálovom okne. 1066 00:58:03,000 --> 00:58:06,000 Dovoľte mi, aby som bežať structs2, zadajte. 1067 00:58:06,000 --> 00:58:09,000 Vyzerá to, že je všetko v poriadku. Poďme spustite structs2. 1068 00:58:09,000 --> 00:58:15,000 123, David Mather, 456, Rob Kirkland, 1069 00:58:15,000 --> 00:58:19,000 789, Tommy Mather, zadajte. 1070 00:58:19,000 --> 00:58:23,000 Vyzerá to, že sa správal rovnako, ale keď som teraz robiť ls 1071 00:58:23,000 --> 00:58:28,000 upozornenie, čo súbor, je tu medzi všetkými mojom kódu, databázy, 1072 00:58:28,000 --> 00:58:32,000 takže sa poďme otvoriť, gedit databázy, a pozri sa na to. 1073 00:58:32,000 --> 00:58:34,000 Nie je to sexy formátov súborov. 1074 00:58:34,000 --> 00:58:38,000 Je to naozaj jeden kus dátové linky na linku na riadok, 1075 00:58:38,000 --> 00:58:42,000 ale tí z vás, ktorí používajú aplikácie Excel alebo CSV súborov, oddelených čiarkou hodnoty, 1076 00:58:42,000 --> 00:58:47,000 Mohol som samozrejme použil fprintf miesto toho možno urobiť niečo také 1077 00:58:47,000 --> 00:58:50,000 takže som mohol skutočne vytvoriť ekvivalent súboru programu Excel 1078 00:58:50,000 --> 00:58:53,000 oddelením veci s čiarkami, nie len nové linky. 1079 00:58:53,000 --> 00:58:56,000 >> V tomto prípade, ak by som mal namiesto toho používať čiarky namiesto nových liniek 1080 00:58:56,000 --> 00:59:01,000 Mohol by som doslova otvoriť tento súbor databázy v programe Excel, ak som miesto, aby to vyzeralo takto. 1081 00:59:01,000 --> 00:59:03,000 Stručne povedané, teraz, že máme silu písať k súborom 1082 00:59:03,000 --> 00:59:07,000 teraz môžeme začať pretrvávajúce údaje, držať to asi na disk 1083 00:59:07,000 --> 00:59:10,000 takže môžeme uchovávať informácie okolo znova a znova. 1084 00:59:10,000 --> 00:59:14,000 Všimnite si pár ďalších vecí, ktoré sú v súčasnej dobe trochu známejší. 1085 00:59:14,000 --> 00:59:16,000 V hornej časti tohto súboru C máme typedef 1086 00:59:16,000 --> 00:59:21,000 pretože sme chceli vytvoriť dátový typ, ktorý predstavuje slovo, 1087 00:59:21,000 --> 00:59:25,000 tak tento typ sa nazýva slovo, a vnútri tejto štruktúry 1088 00:59:25,000 --> 00:59:27,000 je to trochu obsiahlejší teraz. 1089 00:59:27,000 --> 00:59:30,000 Prečo je slovo skladajúci sa z zdanlivo poľa? 1090 00:59:30,000 --> 00:59:33,000 Čo je slovo len intuitívne? 1091 00:59:33,000 --> 00:59:35,000 >> Je to pole znakov. 1092 00:59:35,000 --> 00:59:37,000 Je to postupnosť znakov, chrbtom k sebe k sebe. 1093 00:59:37,000 --> 00:59:41,000 LISTY vo všetkých uzáverov sa stane, že sme svojvoľne povedať, maximálna dĺžka 1094 00:59:41,000 --> 00:59:44,000 akékoľvek slovo v slovníku, že sme pomocou pre Scramble. 1095 00:59:44,000 --> 00:59:46,000 Prečo mám 1? 1096 00:59:46,000 --> 00:59:48,000 Null znak. 1097 00:59:48,000 --> 00:59:51,000 Pripomeňme, keď sme si príklad Bananagrams sme potrebovali osobitnú hodnotu 1098 00:59:51,000 --> 00:59:55,000 na konci slova, aby sa sledovať 1099 00:59:55,000 --> 00:59:59,000 , Kde slová skutočne skončil, a ako problém set špecifikácia hovorí 1100 00:59:59,000 --> 01:00:03,000 tu sme spájali s dané slovo logickú hodnotu, 1101 01:00:03,000 --> 01:00:05,000 vlajka, aby som tak povedal, true alebo false. 1102 01:00:05,000 --> 01:00:09,000 Našli ste toto slovo už preto, že si uvedomujeme, 1103 01:00:09,000 --> 01:00:13,000 Naozaj potrebujeme spôsob, ako si pamätať nielen to, čo slovo je v Scramble 1104 01:00:13,000 --> 01:00:15,000 ale či alebo nie vy, človek, našli ho 1105 01:00:15,000 --> 01:00:20,000 takže ak zistíte, že slovo "len", môžete nielen zadajte, zadajte, že, zadajte, že, zadajte 1106 01:00:20,000 --> 01:00:23,000 a získať 3 body, 3 body, 3 body, 3 body. 1107 01:00:23,000 --> 01:00:26,000 Chceme byť schopní na blacklist, že slovo nastavením bool 1108 01:00:26,000 --> 01:00:29,000 na hodnotu true, ak ste už našiel, a tak to je dôvod, prečo sme 1109 01:00:29,000 --> 01:00:31,000 zapuzdrené to v tejto štruktúre. 1110 01:00:31,000 --> 01:00:35,000 >> Teraz, tu v Scramble tam je to iné struct hovorí slovník. 1111 01:00:35,000 --> 01:00:39,000 Neprítomnosť tu je slovo typedef, pretože v tomto prípade 1112 01:00:39,000 --> 01:00:43,000 sme potrebovali k zapuzdrenie myšlienku slovníka, 1113 01:00:43,000 --> 01:00:46,000 a slovník obsahuje veľa slov, 1114 01:00:46,000 --> 01:00:49,000 ako vyplýva z tohto poľa, a koľko z týchto slov sú tam? 1115 01:00:49,000 --> 01:00:51,000 No, nech je táto premenná nazýva veľkosť hovorí. 1116 01:00:51,000 --> 01:00:53,000 Ale my to jednoducho potrebujeme jeden slovník. 1117 01:00:53,000 --> 01:00:55,000 Nepotrebujeme dátový typ zvaný slovník. 1118 01:00:55,000 --> 01:00:58,000 Potrebujeme len jeden z nich, tak to dopadá v C 1119 01:00:58,000 --> 01:01:03,000 že ak nechcete povedať typedef, stačí povedať struct, potom vnútri zložených zátvoriek 1120 01:01:03,000 --> 01:01:05,000 môžete dať svoje premenné, potom dal meno. 1121 01:01:05,000 --> 01:01:09,000 Toto je prehlasuje jeden variabilný s názvom slovník 1122 01:01:09,000 --> 01:01:11,000 , Ktorá vyzerá takto. 1123 01:01:11,000 --> 01:01:16,000 Naopak, tieto riadky sú vytváranie opakovane použiteľných dátovú štruktúru nazvanú slovo 1124 01:01:16,000 --> 01:01:19,000 že môžete vytvoriť viac kópií, rovnako ako sme vytvorili 1125 01:01:19,000 --> 01:01:22,000 viac kópií študentov. 1126 01:01:22,000 --> 01:01:24,000 >> Čo to v konečnom dôsledku nám umožňujú robiť? 1127 01:01:24,000 --> 01:01:30,000 Nechaj ma ísť späť do, povedzme, jednoduchší príklad z jednoduchších časov, 1128 01:01:30,000 --> 01:01:34,000 a dovoľte mi, aby som otvoriť, povedzme, compare1.c. 1129 01:01:34,000 --> 01:01:38,000 Problém je tu po ruke, je skutočne šupkou späť 1130 01:01:38,000 --> 01:01:41,000 vrstva reťazca a začnete off týchto školení kola 1131 01:01:41,000 --> 01:01:44,000 pretože sa ukázalo, že reťazec celú dobu 1132 01:01:44,000 --> 01:01:47,000 je, ako sme sľúbili v týždni 1 naozaj len prezývku, 1133 01:01:47,000 --> 01:01:51,000 synonymum od CS50 knižnice po niečom, čo vyzerá trochu tajomná, 1134 01:01:51,000 --> 01:01:53,000 char *, a my sme videli túto hviezdu pred. 1135 01:01:53,000 --> 01:01:55,000 Videli sme to v rámci súborov. 1136 01:01:55,000 --> 01:01:59,000 >> Poďme sa teraz, prečo sme sa skrýval tento detail nejakú dobu. 1137 01:01:59,000 --> 01:02:02,000 Tu je súbor s názvom compare1.c, 1138 01:02:02,000 --> 01:02:07,000 a to zrejme žiada užívateľa o 2 reťazca, s a t, 1139 01:02:07,000 --> 01:02:11,000 a potom sa snažia porovnávať tieto reťazce pre rovnosť v súlade 26, 1140 01:02:11,000 --> 01:02:14,000 a ak sú rovnaké, že hovorí: "Zadali ste to isté," 1141 01:02:14,000 --> 01:02:17,000 a ak to nie je rovné to hovorí, "Zadali ste rôzne veci." 1142 01:02:17,000 --> 01:02:19,000 Nechaj ma ísť napred a spustiť tento program. 1143 01:02:19,000 --> 01:02:23,000 Nechaj ma ísť do môjho zdrojového adresára, aby sa compare1. Je zostavený v poriadku. 1144 01:02:23,000 --> 01:02:25,000 Dovoľte mi, aby som bežať compare1. 1145 01:02:25,000 --> 01:02:27,000 Budem priblížite, zadajte. 1146 01:02:27,000 --> 01:02:29,000 Povedz niečo. HELLO. 1147 01:02:29,000 --> 01:02:32,000 Poviem niečo znova. HELLO. 1148 01:02:32,000 --> 01:02:34,000 Rozhodne som nemal písať rôzne veci. 1149 01:02:34,000 --> 01:02:37,000 >> Skúsim to znova. BYE BYE. 1150 01:02:37,000 --> 01:02:40,000 Rozhodne nie iný, takže to, čo sa tu deje? 1151 01:02:40,000 --> 01:02:44,000 No, čo sa naozaj byť porovnané v súlade 26? 1152 01:02:44,000 --> 01:02:46,000 [Nepočuteľné-študent] 1153 01:02:46,000 --> 01:02:49,000 Áno, tak to ukazuje, že reťazec, dátový typ, je tak trochu lož. 1154 01:02:49,000 --> 01:02:53,000 Reťazec je char *, ale to, čo je char *? 1155 01:02:53,000 --> 01:02:56,000 Char *, ako sa hovorí, je ukazovateľ, 1156 01:02:56,000 --> 01:03:00,000 a ukazovateľ je skutočne adresa, 1157 01:03:00,000 --> 01:03:05,000 čiastka umiestnenie v pamäti, a ak ste náhodou zadali v slove, ako HELLO, 1158 01:03:05,000 --> 01:03:08,000 stiahnuť z minulých diskusií reťazcov 1159 01:03:08,000 --> 01:03:16,000 to je ako slovo HELLO. 1160 01:03:16,000 --> 01:03:19,000 Pamätajte si, že slovo ako Hello môže byť reprezentovaná 1161 01:03:19,000 --> 01:03:22,000 ako pole znakov, ako je tento 1162 01:03:22,000 --> 01:03:25,000 a potom so zvláštnym charakterom na konci nazýva nulový znak, 1163 01:03:25,000 --> 01:03:27,000 ako \ vyjadruje,. 1164 01:03:27,000 --> 01:03:29,000 Čo je vlastne reťazec? 1165 01:03:29,000 --> 01:03:32,000 Všimnite si, že toto je viac kusy pamäti, 1166 01:03:32,000 --> 01:03:36,000 a v skutočnosti, je to skončí len známy, akonáhle sa pozriete do celého reťazca 1167 01:03:36,000 --> 01:03:38,000 hľadá pre špeciálne nulový znak. 1168 01:03:38,000 --> 01:03:41,000 Ale ak je to kus pamäte z môjho počítača pamäte, 1169 01:03:41,000 --> 01:03:44,000 poďme ľubovoľne povedať, že tento reťazec jednoducho šťastie, 1170 01:03:44,000 --> 01:03:47,000 a to mám umiestnený na samom začiatku môjho počítača RAM. 1171 01:03:47,000 --> 01:03:54,000 To je bajt 0, 1, 2, 3, 4, 5, 6 ... 1172 01:03:54,000 --> 01:04:02,000 >> Keď poviem, že niečo ako GetString a ja string s = GetString 1173 01:04:02,000 --> 01:04:04,000 čo sa naozaj sa vrátil? 1174 01:04:04,000 --> 01:04:08,000 U týchto posledných niekoľkých týždňoch, je to, čo naozaj byť uložené v s 1175 01:04:08,000 --> 01:04:13,000 nie je tento reťazec sama o sebe, ale v tomto prípade to, čo je uložené, je 1176 01:04:13,000 --> 01:04:18,000 číslo 0, pretože to, čo GetString vlastne robí 1177 01:04:18,000 --> 01:04:20,000 je nie je fyzicky vráti reťazec. 1178 01:04:20,000 --> 01:04:22,000 To nie je vlastne ani robiť koncepčný zmysel. 1179 01:04:22,000 --> 01:04:24,000 Čo to urobí, návrat je číslo. 1180 01:04:24,000 --> 01:04:28,000 Toto číslo je adresa HELLO v pamäti, 1181 01:04:28,000 --> 01:04:32,000 a reťazec je potom, keď sa šupkou späť táto vrstva, reťazec v skutočnosti neexistuje. 1182 01:04:32,000 --> 01:04:35,000 Je to len zjednodušenie v CS50 knižnici. 1183 01:04:35,000 --> 01:04:38,000 >> To je naozaj niečo, čo nazýva char *. 1184 01:04:38,000 --> 01:04:41,000 Char dáva zmysel, pretože to, čo je slovo, ako HELLO? 1185 01:04:41,000 --> 01:04:44,000 No, to je séria znakov, rad znakov. 1186 01:04:44,000 --> 01:04:47,000 Char * znamená adresu charakteru, 1187 01:04:47,000 --> 01:04:50,000 tak čo to znamená vrátiť reťazec? 1188 01:04:50,000 --> 01:04:53,000 Pekný, jednoduchý spôsob, ako vrátiť reťazec 1189 01:04:53,000 --> 01:04:57,000 je skôr než sa snažiť prísť na to, ako som sa vrátiť do 5 alebo 6 rôznych bajtov 1190 01:04:57,000 --> 01:05:01,000 dovoľte mi vrátiť sa na adresu, ktorá byte? 1191 01:05:01,000 --> 01:05:03,000 Prvý z nich. 1192 01:05:03,000 --> 01:05:06,000 Inými slovami, dovoľte mi, aby som vám adresu znaku v pamäti. 1193 01:05:06,000 --> 01:05:10,000 To je to, čo char * predstavuje, adresa jediného znaku v pamäti. 1194 01:05:10,000 --> 01:05:12,000 Volať, že premenné s 1195 01:05:12,000 --> 01:05:15,000 Skladujte v s, že konkrétnu adresu, ktorú som svojvoľne povedal je 0, 1196 01:05:15,000 --> 01:05:19,000 len aby to jednoduché, ale v skutočnosti je to všeobecne väčší počet. 1197 01:05:19,000 --> 01:05:21,000 >> Počkajte chvíľku. 1198 01:05:21,000 --> 01:05:23,000 Ak ste len, že mi adresu prvého znaku, ako môžem vedieť, čo je adresa 1199 01:05:23,000 --> 01:05:25,000 druhého znaku, tretej, štvrtej a piatej? 1200 01:05:25,000 --> 01:05:27,000 [Nepočuteľné-študent] 1201 01:05:27,000 --> 01:05:31,000 Tie len vedieť, kde na konci reťazca je prostredníctvom tohto šikovného triku, 1202 01:05:31,000 --> 01:05:35,000 takže keď použiť niečo ako printf, čo printf doslova berie ako svoj argument, 1203 01:05:35,000 --> 01:05:39,000 pripomenúť, že používame tento% s zástupný symbol, a potom odovzdať 1204 01:05:39,000 --> 01:05:41,000 premenná, ktorá je ukladanie reťazec. 1205 01:05:41,000 --> 01:05:47,000 Čo ste naozaj absolvovaní je adresa prvého znaku tohto reťazca. 1206 01:05:47,000 --> 01:05:50,000 Printf potom používa na vedenie alebo slučky while obdržaním tejto adresy, 1207 01:05:50,000 --> 01:05:53,000 Napríklad, 0, tak nech ma k tomu teraz, 1208 01:05:53,000 --> 01:06:02,000 printf ("% s \ n", s); 1209 01:06:02,000 --> 01:06:07,000 Keď hovorím printf ("% s \ n", s); to, čo som naozaj poskytuje printf s 1210 01:06:07,000 --> 01:06:13,000 je adresa prvého znaku v s, ktorý je v tomto prípade je ľubovoľné H. 1211 01:06:13,000 --> 01:06:16,000 >> Ako printf vedieť, čo presne sa má zobraziť na obrazovke? 1212 01:06:16,000 --> 01:06:19,000 Osoba, ktorá vykonáva printf zavedený while alebo pre sláčiky 1213 01:06:19,000 --> 01:06:23,000 , Ktorý hovorí, to postava rovnať špeciálny nulový znak? 1214 01:06:23,000 --> 01:06:25,000 Ak nie, vytlačte ju. A čo táto? 1215 01:06:25,000 --> 01:06:28,000 Ak ho vytlačiť, vytlačte ho, tlačiť, vytlačiť. 1216 01:06:28,000 --> 01:06:32,000 Oh, toto je zvláštne. Zastavte tlač a vráťte sa do užívateľa. 1217 01:06:32,000 --> 01:06:35,000 A to je doslova všetko, čo sa deje pod kapotou, 1218 01:06:35,000 --> 01:06:38,000 a to je veľa stráviť v prvý deň triedy, 1219 01:06:38,000 --> 01:06:43,000 ale teraz je to naozaj stavebným kameňom pochopenie všetkého 1220 01:06:43,000 --> 01:06:46,000 že sa deje na vnútornej strane našej pamäti počítača, 1221 01:06:46,000 --> 01:06:49,000 a nakoniec budeme dráždiť Tento aparthotel s malou pomocou 1222 01:06:49,000 --> 01:06:51,000 od jedného z našich priateľov na Stanforde. 1223 01:06:51,000 --> 01:06:56,000 >> Profesor Nick Parlante na Stanforde urobil tento úžasný video sekvencie 1224 01:06:56,000 --> 01:06:58,000 zo všetkých druhov rôznych jazykoch, ktoré zaviedli 1225 01:06:58,000 --> 01:07:00,000 tento malý Claymation charakter Binky. 1226 01:07:00,000 --> 01:07:03,000 Hlas, ktorý sa chystáte počuť len niekoľko sekúnd prepašovať náhľad 1227 01:07:03,000 --> 01:07:05,000 je to, že z Stanford profesor, a dostaneš 1228 01:07:05,000 --> 01:07:07,000 iba 5 alebo 6 sekúnd tohto práva teraz, 1229 01:07:07,000 --> 01:07:09,000 ale je to poznámka, na ktorom sa budeme uzatvárať dnes 1230 01:07:09,000 --> 01:07:11,000 a začať v stredu. 1231 01:07:11,000 --> 01:07:15,000 Dám vám ukazovateľ zábava s Binkym, preview. 1232 01:07:15,000 --> 01:07:18,000 [♪ Music ♪] [Profesor Parlante] Ahoj, Binky. 1233 01:07:18,000 --> 01:07:21,000 Prebuď sa. Je čas na ukazovateľ zábavu. 1234 01:07:21,000 --> 01:07:24,000 [Binky] Čo je to? Ďalšie informácie o ukazovateli? 1235 01:07:24,000 --> 01:07:26,000 Oh, dobrota! 1236 01:07:26,000 --> 01:07:29,000 >> Uvidíme sa v stredu. 1237 01:07:29,000 --> 01:07:32,000 [CS50.TV]