1 00:00:00,000 --> 00:00:03,000 [Powered by Google Translate] [Teden 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 >> V redu, to je CS50, in to je začetek tedna 4, 5 00:00:12,000 --> 00:00:16,000 in to je eden od najpočasnejših možnih algoritmov. 6 00:00:16,000 --> 00:00:19,000 Katera je bilo, da smo samo gledal tam? 7 00:00:19,000 --> 00:00:24,000 To je bilo nekako mehurček, da velik O (n ^ 2) + vsota, 8 00:00:24,000 --> 00:00:28,000 in res nismo edini na tem svetu, da ne ve 9 00:00:28,000 --> 00:00:30,000 kaj bubble sort je ali njen čas delovanja. 10 00:00:30,000 --> 00:00:33,000 Pravzaprav, to je bil intervju z Eric Schmidt iz Googla 11 00:00:33,000 --> 00:00:45,000 in nekdanji senator Barack Obama je le nekaj let nazaj. 12 00:00:45,000 --> 00:00:48,000 >> Zdaj, senator, da ste tukaj na Googlu 13 00:00:48,000 --> 00:00:54,000 in mi je všeč, da razmišljajo o predsedovanju kot razgovor za službo. 14 00:00:54,000 --> 00:00:58,000 Zdaj je težko dobiti službo kot predsednik, in greste skozi mrzlica zdaj. 15 00:00:58,000 --> 00:01:00,000 Prav tako je težko dobiti službo pri Googlu. 16 00:01:00,000 --> 00:01:05,000 Imamo vprašanja, zato vas prosimo naših kandidatov na vprašanja, 17 00:01:05,000 --> 00:01:10,000 in ta je od Larry Schwimmer. 18 00:01:10,000 --> 00:01:14,000 Mislita, da sem hecaš? Prav tukaj. 19 00:01:14,000 --> 00:01:18,000 Kaj je najbolj učinkovit način za razvrščanje milijon 32-bitnih celih števil? 20 00:01:18,000 --> 00:01:21,000 [Smeh] 21 00:01:21,000 --> 00:01:24,000 Dobro 22 00:01:24,000 --> 00:01:26,000 Žal mi je. >> Ne, ne, ne, ne. 23 00:01:26,000 --> 00:01:34,000 Mislim, da je mehurček vrsta bi bila napačna pot. 24 00:01:34,000 --> 00:01:39,000 >> Daj no, kdo mu povedal to? 25 00:01:39,000 --> 00:01:43,000 Prejšnji teden smo se spomnim odmor od kode, vsaj za en dan, 26 00:01:43,000 --> 00:01:46,000 in začeli s poudarkom na nekaterih višjih ravni idej in reševanje problemov na splošno 27 00:01:46,000 --> 00:01:49,000 v okviru iskanja in razvrščanje 28 00:01:49,000 --> 00:01:53,000 in uvedli nekaj, kar nismo slap to ime v zadnjem tednu 29 00:01:53,000 --> 00:01:56,000 ampak asimptotični zapis, Big O, Big Omega, 30 00:01:56,000 --> 00:02:00,000 in včasih Big Theta zapis, in ti so bili le načini 31 00:02:00,000 --> 00:02:02,000 opiše čas delovanja algoritmov, 32 00:02:02,000 --> 00:02:05,000 koliko časa je potrebno, da algoritmom za vožnjo. 33 00:02:05,000 --> 00:02:08,000 >> In morda se spomnite, da ste govorili o trenutnim časom glede na velikost 34 00:02:08,000 --> 00:02:11,000 vložka, ki smo ga na splošno imenujemo n, kar je težava lahko, 35 00:02:11,000 --> 00:02:13,000 kjer je n število oseb v sobi, 36 00:02:13,000 --> 00:02:17,000 število strani v imenik, in smo začeli pisati stvari 37 00:02:17,000 --> 00:02:21,000 kot O (n ^ 2) ali O (n) ali O (n log n) 38 00:02:21,000 --> 00:02:24,000 in tudi če matematika ni povsem izšlo tako popolno 39 00:02:24,000 --> 00:02:28,000 in je bil n ² - n / 2 ali kaj podobnega 40 00:02:28,000 --> 00:02:31,000 pa bi namesto tega preprosto vrgel proč nekaj manjših naročil pogoji, 41 00:02:31,000 --> 00:02:34,000 in motivacija je, da res želimo 42 00:02:34,000 --> 00:02:37,000 nekakšen objektiven način ocenjevanja 43 00:02:37,000 --> 00:02:39,000 izvedbo programov, izvedba algoritmov 44 00:02:39,000 --> 00:02:42,000 da ob koncu dneva, nima veze, na primer, 45 00:02:42,000 --> 00:02:45,000 s hitrostjo računalnika danes. 46 00:02:45,000 --> 00:02:47,000 >> Na primer, če izvajajo mehurček vrste, 47 00:02:47,000 --> 00:02:50,000 ali pa izvaja z zlivanjem ali izbira vrste na računalniku današnjem 48 00:02:50,000 --> 00:02:53,000 2 GHz računalnik in ga zaženete, 49 00:02:53,000 --> 00:02:56,000 in traja nekaj sekund več, naslednje leto pa je 3 GHz 50 00:02:56,000 --> 00:02:59,000 ali bi lahko 4 GHz računalnik in nato trdijo, da "Vau, moj algoritem 51 00:02:59,000 --> 00:03:03,000 Zdaj je dvakrat tako hitro, "čeprav v resnici to očitno ne drži. 52 00:03:03,000 --> 00:03:06,000 To je samo has gotten strojne hitreje, vendar računalnik 53 00:03:06,000 --> 00:03:10,000 ni, zato si resnično želimo, da mečejo stvari, kot so 54 00:03:10,000 --> 00:03:13,000 večkratniki 2 ali večkratniki števila 3, ko gre za opisovanje 55 00:03:13,000 --> 00:03:17,000 kako hitro ali kako počasi algoritem in res samo osredotočiti 56 00:03:17,000 --> 00:03:20,000 na n ali kak dejavnik Pogodbe, 57 00:03:20,000 --> 00:03:24,000 nekateri njihovi moči, kot v primeru vrst iz prejšnjega tedna. 58 00:03:24,000 --> 00:03:27,000 In spomni, da je s pomočjo vrste spajanja 59 00:03:27,000 --> 00:03:31,000 nam je uspelo narediti tako veliko bolje kot neke mehurčke in izbire razvrstite 60 00:03:31,000 --> 00:03:33,000 in celo vstavljanje vrste. 61 00:03:33,000 --> 00:03:36,000 >> Imamo do n log n, in spet, 62 00:03:36,000 --> 00:03:39,000 spomnimo, da log n splošno se nanaša na nekaj, kar raste 63 00:03:39,000 --> 00:03:43,000 počasneje in nato n, tako da n log n doslej je bila dobra 64 00:03:43,000 --> 00:03:45,000 ker je bilo manj kot ² n. 65 00:03:45,000 --> 00:03:47,000 Toda, da bi n log n z neke spajanja 66 00:03:47,000 --> 00:03:51,000 kaj je bil osnovni kalčkov z idejo, da moramo vzvod 67 00:03:51,000 --> 00:03:54,000 da smo tudi vzvod nazaj v tednu 0? 68 00:03:54,000 --> 00:03:58,000 Kako smo rešiti problem razvrščanja spretno z neke spajanja? 69 00:03:58,000 --> 00:04:04,000 Kaj je bil ključ vpogled, morda? 70 00:04:04,000 --> 00:04:07,000 Kdorkoli. 71 00:04:07,000 --> 00:04:09,000 Ok, gremo korak nazaj. 72 00:04:09,000 --> 00:04:11,000 Opišite zlivanjem s svojimi besedami. 73 00:04:11,000 --> 00:04:15,000 Kako pa to deluje? 74 00:04:15,000 --> 00:04:17,000 Ok, bomo vrstico nazaj na teden 0. 75 00:04:17,000 --> 00:04:19,000 Prav, ja. 76 00:04:19,000 --> 00:04:22,000 [Neslišno-student] 77 00:04:22,000 --> 00:04:26,000 Dobro, dobro, zato smo razdelili niz številk v 2 kosov. 78 00:04:26,000 --> 00:04:29,000 Mi razporejene vsako od teh kosov, nato pa smo jih združili, 79 00:04:29,000 --> 00:04:33,000 in smo videli to idejo pred sprejemanja problem, ki je tako velik 80 00:04:33,000 --> 00:04:36,000 in ga sekljanje up na problem, ki je tako velik ali tako velika. 81 00:04:36,000 --> 00:04:38,000 >> Spomnimo primer telefonski imenik. 82 00:04:38,000 --> 00:04:42,000 Spomnimo se samo-štetja algoritem iz tedni 83 00:04:42,000 --> 00:04:45,000 Tako nekako združiti povzelo to psevdokod tukaj. 84 00:04:45,000 --> 00:04:48,000 Ko ste glede n elementov, prvič, da je duševno zdravje preveriti. 85 00:04:48,000 --> 00:04:51,000 Če je n <2, potem ne storiti ničesar na vse 86 00:04:51,000 --> 00:04:55,000 ker če n <2, potem je n očitno 0 ali 1, 87 00:04:55,000 --> 00:04:57,000 in tako, če je 0 ali 1 ni ničesar rešiti. 88 00:04:57,000 --> 00:04:59,000 Končali ste. 89 00:04:59,000 --> 00:05:01,000 Vaš seznam je že površno razvrščeni. 90 00:05:01,000 --> 00:05:04,000 Sicer pa, če imaš 2 ali več elementov, da gredo naprej in jih razdeliti 91 00:05:04,000 --> 00:05:06,000 v 2 polovici, levo in desno. 92 00:05:06,000 --> 00:05:09,000 Razvrščanje vsako od teh polovic in nato spojite razvrščeni polovic. 93 00:05:09,000 --> 00:05:13,000 Toda težava je, da na prvi pogled zdi, kot da smo punting. 94 00:05:13,000 --> 00:05:17,000 To je krožna definicija v tem, da če sem te prosil za razvrščanje teh n elementov 95 00:05:17,000 --> 00:05:22,000 in ti si mi pravi "V redu, v redu, bomo razvrstite tiste n / 2 in tiste, n / 2 elementov" 96 00:05:22,000 --> 00:05:27,000 potem moje naslednje vprašanje, se bo »Prav, kako razvrstiti N / 2 elementov?" 97 00:05:27,000 --> 00:05:30,000 >> Toda zaradi strukture tega programa, 98 00:05:30,000 --> 00:05:33,000 ker je ta osnovna, tako rekoč, 99 00:05:33,000 --> 00:05:39,000 Ta poseben primer, ki pravi, da če je n 00:05:42,000 Ne odgovarjajte z enako krožno odgovor. 101 00:05:42,000 --> 00:05:46,000 Ta proces bo ta cikličnost končala. 102 00:05:46,000 --> 00:05:50,000 Če vas vprašam "Razvrsti ti n elementi", in rečeš: "V redu, razvrstiti te n / 2" 103 00:05:50,000 --> 00:05:53,000 potem pa rečeš: "Dobro, to nekako n / 4, n / 8, n/16" 104 00:05:53,000 --> 00:05:56,000 na koncu se boste delimo z dovolj velikim številom 105 00:05:56,000 --> 00:05:59,000 da boste imeli samo 1 element levo, na kateri točki lahko rečete, 106 00:05:59,000 --> 00:06:02,000 "Tukaj, tukaj je razvrščen en element." 107 00:06:02,000 --> 00:06:06,000 Potem je blišč tega algoritma tukaj je, da izhaja iz dejstva, 108 00:06:06,000 --> 00:06:09,000 da ko imaš vse te sezname razvrščeni posebej, 109 00:06:09,000 --> 00:06:12,000 ki so vse velikosti 1, za katero se zdi, da je neuporabna, 110 00:06:12,000 --> 00:06:15,000 Ko začnete jih združiti in jih združiti 111 00:06:15,000 --> 00:06:19,000 si zgraditi nazadnje kot Rob si v videu na koncu seznama razporejene. 112 00:06:19,000 --> 00:06:22,000 >> Toda ta zamisel sega daleč prek razvrščanja. 113 00:06:22,000 --> 00:06:26,000 Tu je ta ideja vključena v ta program, znan kot rekurzija, 114 00:06:26,000 --> 00:06:29,000 zamisel, po kateri ste program, 115 00:06:29,000 --> 00:06:32,000 in rešiti nekatere težave sami skličejo 116 00:06:32,000 --> 00:06:36,000 ali so se v okviru programskih jezikov, so funkcije, 117 00:06:36,000 --> 00:06:39,000 in da bi rešili težave, vam funkcija se zahteva 118 00:06:39,000 --> 00:06:42,000 znova in znova in znova, vendar pa je funkcija 119 00:06:42,000 --> 00:06:44,000 ne more postaviti si neskončno mnogo krat. 120 00:06:44,000 --> 00:06:47,000 Sčasoma boste morali spodaj ven, če se tako izrazim, 121 00:06:47,000 --> 00:06:49,000 in nekaj težko kodirane osnovni pogoj, ki pravi, da 122 00:06:49,000 --> 00:06:53,000 Na tej točki nehati kliče, tako da je celoten proces 123 00:06:53,000 --> 00:06:56,000 Končno se dejansko ustavil. 124 00:06:56,000 --> 00:06:58,000 Kaj to v resnici pomeni, da recurse? 125 00:06:58,000 --> 00:07:01,000 >> Pa poglejmo, če lahko naredimo preprost, trivialna primer z, recimo, 126 00:07:01,000 --> 00:07:03,000 3 osebe z menoj tu zgoraj na odru, če nekdo je udobno. 127 00:07:03,000 --> 00:07:06,000 1, pridi gor, 2 in 3. 128 00:07:06,000 --> 00:07:09,000 Če 3 želim, da pridejo sem gor. 129 00:07:09,000 --> 00:07:12,000 Če želite stati poleg mene tukaj v vrsti, predvidevam, da je problem na strani 130 00:07:12,000 --> 00:07:15,000 je zelo površno štetje števila ljudi, ki so tukaj. 131 00:07:15,000 --> 00:07:18,000 Ampak odkrito povedano, sem utrujena od vseh teh štetje primerov. 132 00:07:18,000 --> 00:07:21,000 To bo trajalo nekaj časa, 1, 2, in pika, pika, pika. 133 00:07:21,000 --> 00:07:23,000 To bo trajalo večno. 134 00:07:23,000 --> 00:07:25,000 Raje samo punt ta problem skupaj s pomočjo, kako ti je ime? 135 00:07:25,000 --> 00:07:27,000 Sara. >> Sara, vse v redu. 136 00:07:27,000 --> 00:07:29,000 Kelly. >> Kelly in? 137 00:07:29,000 --> 00:07:31,000 >> Willy. >> Willy, Sara, Kelly, in Willy. 138 00:07:31,000 --> 00:07:34,000 Zdaj so me vprašal vprašanje za nekoga, 139 00:07:34,000 --> 00:07:37,000 koliko ljudi je na tej stopnji, in nimam pojma. 140 00:07:37,000 --> 00:07:40,000 To je res dolg seznam, in tako namesto da bom naredil ta trik. 141 00:07:40,000 --> 00:07:43,000 Bom vprašal osebo, poleg mene opraviti večino dela, 142 00:07:43,000 --> 00:07:46,000 in ko je ona naredila počne večina dela 143 00:07:46,000 --> 00:07:49,000 Jaz bom naredil najmanjšo količino dela mogoče in preprosto dodajte 1 144 00:07:49,000 --> 00:07:51,000 da ne glede na njen odgovor je, da gremo. 145 00:07:51,000 --> 00:07:54,000 Bila sem vprašal, koliko ljudi na odru. 146 00:07:54,000 --> 00:07:57,000 Koliko ljudi je na odru na levi strani vas? 147 00:07:57,000 --> 00:08:00,000 Levo od mene? >> Ok, ampak ne varam. 148 00:08:00,000 --> 00:08:04,000 To je dobro, to je res, vendar če želimo nadaljevati s to logiko 149 00:08:04,000 --> 00:08:08,000 predpostavimo, da si podobno želi punt ta problem na levi vas, 150 00:08:08,000 --> 00:08:11,000 Tako kot odgovor neposredno iti naprej in samo mimo denar. 151 00:08:11,000 --> 00:08:14,000 Oh, koliko ljudi je na levi strani meni? 152 00:08:14,000 --> 00:08:16,000 Koliko ljudi je na levi strani? 153 00:08:16,000 --> 00:08:18,000 1. 154 00:08:18,000 --> 00:08:27,000 [Smeh] 155 00:08:27,000 --> 00:08:30,000 Ok, 0, kaj storiti zdaj je Willy 156 00:08:30,000 --> 00:08:33,000 se ste vrnili vaš odgovor v to smer pravi, 0. 157 00:08:33,000 --> 00:08:36,000 Torej, kaj storiti? >> 1. 158 00:08:36,000 --> 00:08:39,000 Ok, tako da ste 1, tako da boste rekli: "V redu, bom dodati 1 159 00:08:39,000 --> 00:08:41,000 da ne glede na število Willy je bil, "da 1 + 0. 160 00:08:41,000 --> 00:08:43,000 Zdaj ste 1 do vaš odgovor na desni je zdaj- 161 00:08:43,000 --> 00:08:45,000 1. Bi >> In moj je 2. 162 00:08:45,000 --> 00:08:48,000 Dobro, da ste ob prejšnji odgovor 1, 163 00:08:48,000 --> 00:08:51,000 doda minimalno količino dela, ki ga želite storiti, kar je +1. 164 00:08:51,000 --> 00:08:55,000 Zdaj imate 2, in jo nato z roko me kateri vrednost? 165 00:08:55,000 --> 00:08:57,000 3, mislim, oprosti, 2. 166 00:08:57,000 --> 00:08:59,000 Dobro. 167 00:08:59,000 --> 00:09:02,000 >> No, smo imeli 0 na levo. 168 00:09:02,000 --> 00:09:05,000 Potem smo imeli 1 in nato dodamo 2, 169 00:09:05,000 --> 00:09:07,000 in zdaj ste se predaja mi številko 2, 170 00:09:07,000 --> 00:09:10,000 in tako sem rekel, v redu, 1, 3. 171 00:09:10,000 --> 00:09:13,000 Tam je res 3 ljudi stoji zraven mene na tej stopnji, 172 00:09:13,000 --> 00:09:16,000 tako da bi jih lahko storili očitno to zelo linearno, 173 00:09:16,000 --> 00:09:19,000 zelo v modi očitno, ampak kaj smo res? 174 00:09:19,000 --> 00:09:21,000 Mi je problem velikosti 3 na začetku. 175 00:09:21,000 --> 00:09:24,000 Nato smo ga pokvaril v težave, velikosti 2, 176 00:09:24,000 --> 00:09:27,000 potem problem velikosti 1 in nato končno osnovna 177 00:09:27,000 --> 00:09:29,000 Res je, oh, nikogar ni tam, 178 00:09:29,000 --> 00:09:33,000 Takrat Willy vrnil dejansko težko kodirane odgovor nekajkrat 179 00:09:33,000 --> 00:09:36,000 in je bila druga pa vrela, vrela, vrela, 180 00:09:36,000 --> 00:09:39,000 in potem z dodajanjem v tem dodatnem 1 1 181 00:09:39,000 --> 00:09:41,000 smo izvajali to osnovno idejo rekurzije. 182 00:09:41,000 --> 00:09:44,000 >> Zdaj, v tem primeru to ni res rešitev problema 183 00:09:44,000 --> 00:09:46,000 vse bolj učinkovito potem smo videli doslej. 184 00:09:46,000 --> 00:09:48,000 Ampak pomislite algoritmov, ki smo jih storili na odru doslej. 185 00:09:48,000 --> 00:09:51,000 Imeli smo 8 listov na tablo, 186 00:09:51,000 --> 00:09:55,000 na video, ko je Sean iskal številko 7, in kaj je res? 187 00:09:55,000 --> 00:09:58,000 No, on ni storil kakršnokoli deli in vladaj. 188 00:09:58,000 --> 00:10:01,000 On ni storil kakršnokoli rekurzije. 189 00:10:01,000 --> 00:10:03,000 Namesto pravkar storil to linearni algoritem. 190 00:10:03,000 --> 00:10:07,000 Toda, ko smo uvedli idejo razvrščenih številk na odru v živo prejšnji teden 191 00:10:07,000 --> 00:10:09,000 Nato smo imeli ta nagon, da bi šel na sredino, 192 00:10:09,000 --> 00:10:13,000 Takrat smo imeli manjšo seznam velikosti 4 ali drugega seznama velikosti 4, 193 00:10:13,000 --> 00:10:17,000 in potem smo imeli točno isti problem, zato smo se ponovi večkrat, ponoviti. 194 00:10:17,000 --> 00:10:19,000 Z drugimi besedami, recursed. 195 00:10:19,000 --> 00:10:24,000 Najlepša hvala za naše 3 prostovoljcev tukaj za prikaz rekurzijo z nami. 196 00:10:24,000 --> 00:10:28,000 >> Poglejmo, če ne moremo narediti to sedaj malo bolj konkretnega, 197 00:10:28,000 --> 00:10:30,000 problemom, ki ga še lahko naredimo zelo enostavno, 198 00:10:30,000 --> 00:10:34,000 ampak ga bomo uporabili kot odskočno desko za izvajanje tega osnovnega pojma. 199 00:10:34,000 --> 00:10:37,000 Če hočem izračunati seštevanja kup številk, 200 00:10:37,000 --> 00:10:39,000 na primer, če se boste peljali po številu 3, 201 00:10:39,000 --> 00:10:42,000 Želim vam vrednosti sigma 3, 202 00:10:42,000 --> 00:10:46,000 tako da vsota 3 + 2 + 1 + 0. 203 00:10:46,000 --> 00:10:48,000 Želim, da bi dobili nazaj odgovor 6, 204 00:10:48,000 --> 00:10:51,000 tako da bomo izvajanje tega sigma funkcijo, ta vsota funkcije 205 00:10:51,000 --> 00:10:54,000 da, še enkrat, se na vhodu, in nato vrne seštevanja 206 00:10:54,000 --> 00:10:57,000 te številke pa vse do 0. 207 00:10:57,000 --> 00:10:59,000 Mi lahko to zelo preprosto, kajne? 208 00:10:59,000 --> 00:11:01,000 Mi lahko to storite z nekakšno zanka strukture, 209 00:11:01,000 --> 00:11:04,000 zato naj gredo naprej in se je to začelo. 210 00:11:04,000 --> 00:11:07,000 >> Vključi stdio.h. 211 00:11:07,000 --> 00:11:09,000 Dovolite mi, da se v glavnem delati tukaj. 212 00:11:09,000 --> 00:11:12,000 Rešimo to kot sigma.c. 213 00:11:12,000 --> 00:11:14,000 Potem bom šel noter, jaz pa bom razglasi int n, 214 00:11:14,000 --> 00:11:18,000 in jaz bom naredil naslednje, medtem ko uporabnik ne sodeluje. 215 00:11:18,000 --> 00:11:22,000 Medtem ko uporabnik ni dal pozitivno število 216 00:11:22,000 --> 00:11:26,000 Naj gredo naprej in jih prosil za GetInt n =, 217 00:11:26,000 --> 00:11:28,000 in mi jim nekaj napotkov o tem, kaj storiti, 218 00:11:28,000 --> 00:11:33,000 Tako printf ("pozitivno celo naš"). 219 00:11:33,000 --> 00:11:39,000 Samo nekaj dokaj preprost, kot je ta, da do takrat, ko smo zadeli linijo 14 220 00:11:39,000 --> 00:11:42,000 zdaj imamo pozitivno celo predvidoma v n. 221 00:11:42,000 --> 00:11:44,000 >> Zdaj pa si poglejmo nekaj storiti z njim. 222 00:11:44,000 --> 00:11:50,000 Naj gredo naprej in izračun seštevanja, tako int vsota = sigma (n). 223 00:11:50,000 --> 00:11:54,000 Sigma je samo vsota, tako da sem samo pisal v Ljubitelj način. 224 00:11:54,000 --> 00:11:56,000 Enostavno bomo rekli sigma tam. 225 00:11:56,000 --> 00:11:58,000 To je vsota, in zdaj bom izpisal rezultat, 226 00:11:58,000 --> 00:12:08,000 printf ("Vsota je% d \ n", vsota). 227 00:12:08,000 --> 00:12:11,000 In potem se bom vrnil 0 za dobro mero. 228 00:12:11,000 --> 00:12:15,000 Naredili smo vse, kar ta program zahteva, razen zanimive strani 229 00:12:15,000 --> 00:12:18,000 ki je dejansko izvajanje sigma funkcijo. 230 00:12:18,000 --> 00:12:22,000 >> Naj grem dol do dna, in mi izjavi funkcije sigma. 231 00:12:22,000 --> 00:12:26,000 Ima naj spremenljivko, ki je za celo vrsto 232 00:12:26,000 --> 00:12:30,000 in kaj tip podatkov ne želim predvidoma vrnil iz sigma? 233 00:12:30,000 --> 00:12:34,000 Int, ker želim, da bi se ujemala z mojimi pričakovanji na spletu 15. 234 00:12:34,000 --> 00:12:37,000 Tukaj me spusti naprej in izvajanje tega 235 00:12:37,000 --> 00:12:41,000 na zelo enostaven način. 236 00:12:41,000 --> 00:12:45,000 >> Gremo naprej in rekli int vsota = 0, 237 00:12:45,000 --> 00:12:47,000 in zdaj bom šel imeti malo za zanke tukaj 238 00:12:47,000 --> 00:12:50,000 , ki je hotel reči kaj takega, 239 00:12:50,000 --> 00:13:01,000 for (int i = 0; i <= številka; i + +) vsota + = i. 240 00:13:01,000 --> 00:13:05,000 In potem se bom vrnil znesek. 241 00:13:05,000 --> 00:13:07,000 Lahko bi to izvaja v vsakem več načinov. 242 00:13:07,000 --> 00:13:09,000 Lahko bi uporabil while zanko. 243 00:13:09,000 --> 00:13:11,000 Lahko bi preskočila uporabo kilometrov spremenljivko, če sem si želela, 244 00:13:11,000 --> 00:13:15,000 ampak na kratko, imamo samo funkcijo, da če nisem Pepe izjavlja vsota je 0. 245 00:13:15,000 --> 00:13:18,000 Potem pa ponovi od 0 gor po številu, 246 00:13:18,000 --> 00:13:23,000 in na vsaki ponovitvi dodaja, da je sedanja vrednost seštevka in se nato vrne vsoto. 247 00:13:23,000 --> 00:13:25,000 >> No, tam je rahlo optimizacija tukaj. 248 00:13:25,000 --> 00:13:29,000 To je verjetno izgubljen korak, ampak tako je bilo. To je v redu za zdaj. 249 00:13:29,000 --> 00:13:32,000 Smo pa vsaj temeljito in gredo 0 vso pot gor. 250 00:13:32,000 --> 00:13:34,000 Ni zelo težko in zelo enostavno, 251 00:13:34,000 --> 00:13:37,000 vendar se izkaže, da je s funkcijo sigma imamo enake možnosti 252 00:13:37,000 --> 00:13:39,000 kot smo tu na odru. 253 00:13:39,000 --> 00:13:42,000 Na odru smo samo prešteti, koliko ljudi je bilo poleg mene, 254 00:13:42,000 --> 00:13:47,000 , ampak če bomo želeli prešteti 3 + 2 + 1 255 00:13:47,000 --> 00:13:51,000 za navzdol, da bi se podobno 0 punt funkcijo 256 00:13:51,000 --> 00:13:55,000 da bom namesto tega opisujejo kot rekurzivno. 257 00:13:55,000 --> 00:13:57,000 Tukaj naredimo hitro sanity preverite in se prepričajte, da nisem Pepe. 258 00:13:57,000 --> 00:14:00,000 >> Vem, da je vsaj ena stvar v tem programu, da nisem naredil narobe. 259 00:14:00,000 --> 00:14:04,000 Ko sem zadeti nastopiti bom dobil kakršno koli kričiš name? 260 00:14:04,000 --> 00:14:06,000 Kaj bom, da bo vpil na okoli? 261 00:14:06,000 --> 00:14:11,000 Ja, pozabil sem prototip, tako da sem s funkcijo, imenovano sigma na liniji 15, 262 00:14:11,000 --> 00:14:16,000 vendar se ni prijavil do linije 22, tako da sem najboljši proaktivno šel gor 263 00:14:16,000 --> 00:14:22,000 in ugotovi, prototip, in bom rekel int sigma (int število), in to je to. 264 00:14:22,000 --> 00:14:24,000 To se izvaja na dnu. 265 00:14:24,000 --> 00:14:27,000 >> Ali pa še en način, da bi lahko rešili tako, 266 00:14:27,000 --> 00:14:30,000 Lahko sem premakniti gor, kar ni slabo, 267 00:14:30,000 --> 00:14:32,000 ampak vsaj ko se programi začeli, da bi dobili dolgo, odkrito povedano, 268 00:14:32,000 --> 00:14:35,000 Mislim, da je nekaj vrednosti v vedno ob glavnem na vrhu 269 00:14:35,000 --> 00:14:38,000 tako da lahko v bralcu odpreti datoteko in nato takoj videli 270 00:14:38,000 --> 00:14:40,000 kaj program počne, ne da iskati po njem 271 00:14:40,000 --> 00:14:42,000 iščem to glavno funkcijo. 272 00:14:42,000 --> 00:14:49,000 Pojdimo v mojo terminalsko okno tukaj, poskusite tako, da sigma sigma, 273 00:14:49,000 --> 00:14:51,000 in sem zajebal tukaj. 274 00:14:51,000 --> 00:14:55,000 Implicitno izjava GetInt funkcije pomeni, da sem pozabil narediti še kaj? 275 00:14:55,000 --> 00:14:57,000 [Neslišno-student] 276 00:14:57,000 --> 00:15:00,000 Dobro, tako da očitno običajna napaka, tako da je dal to gor, 277 00:15:00,000 --> 00:15:04,000 cs50.h, zdaj pa se vrnimo k mojim terminalskem oknu. 278 00:15:04,000 --> 00:15:08,000 >> Jaz bom počistite zaslon, in bom lahko ponovi sigma. 279 00:15:08,000 --> 00:15:11,000 Zdi se, da so pripravljeni. Naj sedaj vodi sigma. 280 00:15:11,000 --> 00:15:15,000 Jaz bom vnesite številko 3, in nisem dobil 6, tako da ni strog pregled, 281 00:15:15,000 --> 00:15:18,000 ampak vsaj tako se zdi, da se dela na prvi pogled, sedaj pa dajmo raztrgati, 282 00:15:18,000 --> 00:15:21,000 in kaj je dejansko vzvod idejo rekurzija, še enkrat, 283 00:15:21,000 --> 00:15:24,000 na zelo preprost kontekstu, zato da čez nekaj tednov 284 00:15:24,000 --> 00:15:27,000 ko smo začeli raziskovati imenitnejše podatkovne strukture, kot nizi 285 00:15:27,000 --> 00:15:30,000 imamo še eno orodje v kompletu, s katerim bi 286 00:15:30,000 --> 00:15:33,000 manipulirajo te podatkovne strukture, kot bomo videli. 287 00:15:33,000 --> 00:15:36,000 To je iterativni pristop, zanka temelječ pristop. 288 00:15:36,000 --> 00:15:39,000 >> Dovolite mi, namesto da bi zdaj to. 289 00:15:39,000 --> 00:15:44,000 Dovolite mi, namesto da bi rekli, da je vsota števila 290 00:15:44,000 --> 00:15:48,000 dol na 0, je res ista stvar kot 291 00:15:48,000 --> 00:15:53,000 številka + sigma (številka - 1). 292 00:15:53,000 --> 00:15:57,000 Z drugimi besedami, tako kot na odru sem punted za vsako od naslednjih oseb z mano, 293 00:15:57,000 --> 00:16:00,000 in jih nato hrani punting, dokler ne bomo na koncu dno na Willy, 294 00:16:00,000 --> 00:16:03,000 ki je moral vrniti težko kodirane kot odgovor 0. 295 00:16:03,000 --> 00:16:07,000 Tukaj zdaj smo podobno punting za sigma 296 00:16:07,000 --> 00:16:10,000 isto funkcijo kot je bilo prvotno imenovan, vendar je ključni vpogled tukaj 297 00:16:10,000 --> 00:16:12,000 je, da bomo brez dvoma sigma enako. 298 00:16:12,000 --> 00:16:14,000 Mi ne gre v n. 299 00:16:14,000 --> 00:16:17,000 Mi smo očitno poteka v številu - 1, 300 00:16:17,000 --> 00:16:20,000 tako nekoliko manjši problem, nekoliko manjši problem. 301 00:16:20,000 --> 00:16:23,000 >> Na žalost, to ni čisto rešitev še ni, in preden bomo rešili 302 00:16:23,000 --> 00:16:26,000 Kaj bi lahko skakali kot očitno na nekatere od vas 303 00:16:26,000 --> 00:16:28,000 Naj gredo naprej in znova uspelo. 304 00:16:28,000 --> 00:16:30,000 Zdi se pripravijo v redu. 305 00:16:30,000 --> 00:16:32,000 Naj ponovitev sigma s 6. 306 00:16:32,000 --> 00:16:37,000 Ops, naj ponovi sigma s 6. 307 00:16:37,000 --> 00:16:42,000 Videli smo že prej, pa čeprav nehote zadnjem času pa tudi. 308 00:16:42,000 --> 00:16:48,000 Zakaj sem dobil to napako Grobni segmentacije? Ja. 309 00:16:48,000 --> 00:16:50,000 [Neslišno-student] 310 00:16:50,000 --> 00:16:53,000 Ni osnovna, in še posebej, kar se je verjetno zgodilo? 311 00:16:53,000 --> 00:16:58,000 To je simptom, kaj vedenje? 312 00:16:58,000 --> 00:17:00,000 Reci malo glasnejši. 313 00:17:00,000 --> 00:17:02,000 [Neslišno-student] 314 00:17:02,000 --> 00:17:05,000 To je neskončna zanka učinkovito in težave z neskončnimi zankami 315 00:17:05,000 --> 00:17:08,000 ko gre za rekurzijo v tem primeru funkcijo klical samega sebe, 316 00:17:08,000 --> 00:17:10,000 kaj se zgodi vsakič, ko pokličete funkcijo? 317 00:17:10,000 --> 00:17:13,000 No, mislim nazaj na kako določeno količino pomnilnika v računalniku. 318 00:17:13,000 --> 00:17:16,000 Rekli smo, da je ta kos pomnilnika se imenuje sklad, ki je na dnu, 319 00:17:16,000 --> 00:17:19,000 in dobi naj vsakič, ko se klic funkcije malo več pomnilnika 320 00:17:19,000 --> 00:17:24,000 na tej tako imenovani sveženj, ki vsebuje to funkcijo opravlja v lokalnih spremenljivk ali parametrov, 321 00:17:24,000 --> 00:17:27,000 tako da, če sigma poziva sigma klice sigma poziva sigma 322 00:17:27,000 --> 00:17:29,000  poziva sigma kje se ta zgodba konča? 323 00:17:29,000 --> 00:17:31,000 >> No, sčasoma prekoračitve skupni znesek 324 00:17:31,000 --> 00:17:33,000 pomnilnika, da imate na voljo za vaš računalnik. 325 00:17:33,000 --> 00:17:37,000 Si prekoračil segment, ki vas naj bi ostali v okviru, 326 00:17:37,000 --> 00:17:40,000 in dobite to napako segmentacije, jedro po dampinških cenah, 327 00:17:40,000 --> 00:17:43,000 in kaj pomeni jedro po dampinških cenah, je, da sem zdaj datoteko, imenovano jedro 328 00:17:43,000 --> 00:17:46,000 ki je datoteka, ki vsebuje ničel in enic 329 00:17:46,000 --> 00:17:49,000 , ki bo dejansko v prihodnje diagnostično uporaben. 330 00:17:49,000 --> 00:17:52,000 Če ni jasno, za vas, če je vaš hrošč 331 00:17:52,000 --> 00:17:54,000 lahko dejansko narediti nekaj forenzično analizo, tako rekoč, 332 00:17:54,000 --> 00:17:58,000 o tej zadevi jedro smetišče, ki je, še enkrat, je samo cel kup ničel in enic 333 00:17:58,000 --> 00:18:02,000 , ki v bistvu predstavlja stanje vašega programa v pomnilniku 334 00:18:02,000 --> 00:18:05,000 Trenutek je strmoglavil na ta način. 335 00:18:05,000 --> 00:18:11,000 >> Pritrditi tukaj je, da ne moremo kar slepo vrniti sigma, 336 00:18:11,000 --> 00:18:14,000 število + sigma za nekoliko manjši problem. 337 00:18:14,000 --> 00:18:16,000 Moramo imeti neke vrste primerjavi z osnovnim tukaj 338 00:18:16,000 --> 00:18:19,000 in kakšna naj bi bila osnovna verjetno? 339 00:18:19,000 --> 00:18:22,000 [Neslišno-student] 340 00:18:22,000 --> 00:18:25,000 Ok, tako dolgo, kot je število pozitivnih moramo pravzaprav vrniti to, 341 00:18:25,000 --> 00:18:29,000 ali povedano drugače, če je število, recimo, <= na 0 342 00:18:29,000 --> 00:18:32,000 Veš kaj, jaz grem naprej in se vrniti 0, 343 00:18:32,000 --> 00:18:36,000 tako kot Willy storil, in sicer, da bom s tem nadaljevala 344 00:18:36,000 --> 00:18:41,000 in se vrniti to, da to ni tako veliko krajši 345 00:18:41,000 --> 00:18:44,000 kot iterativni različici, ki smo stepeno se najprej uporabi za zanke, 346 00:18:44,000 --> 00:18:48,000 ampak obvestilo, da je to neke vrste elegance z njo. 347 00:18:48,000 --> 00:18:51,000 Namesto da bi vrnil nekaj več in izvajanju vseh teh matematike 348 00:18:51,000 --> 00:18:54,000 in dodal stvari z lokalnimi spremenljivkami 349 00:18:54,000 --> 00:18:57,000 ste namesto rekel: "V redu, če je to super enostavno problem, 350 00:18:57,000 --> 00:19:01,000 kot je število <0, naj se takoj vrne 0 ". 351 00:19:01,000 --> 00:19:03,000 >> Ne bomo se trudim, podporo negativne številke, 352 00:19:03,000 --> 00:19:05,000 tako da bom trdo oznako vrednosti 0. 353 00:19:05,000 --> 00:19:08,000 Sicer pa, za izvajanje te ideje seštevek 354 00:19:08,000 --> 00:19:11,000 Vse te številke skupaj lahko učinkovito sprejmejo majhen ugriz 355 00:19:11,000 --> 00:19:14,000 iz tega problema, tako kot smo tukaj na odru, 356 00:19:14,000 --> 00:19:18,000 potem punt preostali del problema na naslednjo osebo, 357 00:19:18,000 --> 00:19:20,000 vendar v tem primeru naslednja oseba si. 358 00:19:20,000 --> 00:19:22,000 To je enako ime funkcije. 359 00:19:22,000 --> 00:19:25,000 Samo mimo je manjši in manjši in manjši težavo, vsakič, 360 00:19:25,000 --> 00:19:28,000 in čeprav še nismo povsem formalizirane stvari v kodo tukaj 361 00:19:28,000 --> 00:19:33,000 To je točno to, kar se je dogajalo v tednu 0 s imeniku. 362 00:19:33,000 --> 00:19:36,000 To je točno to, kar se je dogajalo v zadnjih tednih s Seanom 363 00:19:36,000 --> 00:19:39,000 in z našimi demonstracij iskanju številk. 364 00:19:39,000 --> 00:19:42,000 To je ob problem in ga tako spet in spet. 365 00:19:42,000 --> 00:19:44,000 >> Z drugimi besedami, tam je pot sedaj prevajanja 366 00:19:44,000 --> 00:19:47,000 to resničen svet konstrukt, to višjo raven konstrukt 367 00:19:47,000 --> 00:19:51,000 z deli in vladaj in delaš nekaj znova in znova 368 00:19:51,000 --> 00:19:56,000 v kodi, tako da je to nekaj, kar bomo spet videli čez čas. 369 00:19:56,000 --> 00:20:00,000 Zdaj, ko razveljavi, če ste novi na rekurzije bi si vsaj zdaj razumeš 370 00:20:00,000 --> 00:20:02,000 zakaj je to smešno. 371 00:20:02,000 --> 00:20:05,000 Jaz grem na google.com, 372 00:20:05,000 --> 00:20:17,000 in bom poiskal nekaj nasvetov in trikov rekurzija, vnesite. 373 00:20:17,000 --> 00:20:21,000 Povejte osebi poleg vas, če bi se ne smejim šele zdaj. 374 00:20:21,000 --> 00:20:23,000 Ali ste mislili rekurzijo? 375 00:20:23,000 --> 00:20:25,000 Ste mislili, ah, pa gremo. 376 00:20:25,000 --> 00:20:28,000 Ok, zdaj, da je ostalo vse. 377 00:20:28,000 --> 00:20:30,000 Malo Pirh vgrajeni tam nekje pri Googlu. 378 00:20:30,000 --> 00:20:33,000 Kot prahi, eden od členov nanesemo na spletni strani seveda je 379 00:20:33,000 --> 00:20:36,000 Za danes je le ta mreža različnih algoritmov razvrščanja, 380 00:20:36,000 --> 00:20:39,000 od katerih smo si ogledali prejšnji teden, ampak kaj je lepo o tem vizualizacijo 381 00:20:39,000 --> 00:20:43,000 kot ste poskušali zaviti vaš um okoli različnih stvari, povezane z algoritmi 382 00:20:43,000 --> 00:20:46,000 vem, da lahko zelo enostavno zdaj začeti z različnimi vrstami surovin. 383 00:20:46,000 --> 00:20:50,000 Vhodi vse obrnilo, vložki večinoma razvrščeni, vložki naključno in tako naprej. 384 00:20:50,000 --> 00:20:53,000 Kar poskusite, še enkrat, razlikovati te stvari v glavi 385 00:20:53,000 --> 00:20:57,000 zavedati, da ta naslov URL, na spletni strani je seveda na predavanjih strani 386 00:20:57,000 --> 00:21:00,000 Morda vam lahko pomaga razlog skozi nekatere od teh. 387 00:21:00,000 --> 00:21:05,000 >> Danes smo končno prišli do rešitev tega problema z nekaj časa nazaj, 388 00:21:05,000 --> 00:21:08,000 ki je bil, da je to swap funkcija preprosto ni delovalo, 389 00:21:08,000 --> 00:21:12,000 in kakšen je bil temeljni problem s to funkcijo zamenjave, 390 00:21:12,000 --> 00:21:15,000 katere cilj je bil, še enkrat, da si izmenjujejo vrednost tukaj in tukaj 391 00:21:15,000 --> 00:21:17,000 tako, da se to zgodi? 392 00:21:17,000 --> 00:21:20,000 To ni dejansko delajo. Zakaj? 393 00:21:20,000 --> 00:21:22,000 Ja. 394 00:21:22,000 --> 00:21:28,000 [Neslišno-student] 395 00:21:28,000 --> 00:21:31,000 Točno, razlaga za to bugginess 396 00:21:31,000 --> 00:21:34,000 preprosto zato, ker je bil, ko pokličete funkcije v C 397 00:21:34,000 --> 00:21:38,000 in te funkcije sprejme argumente, kot tu in b, 398 00:21:38,000 --> 00:21:42,000 ste mimo v kopijah koli vrednost si zagotoviti, da bi to funkcijo. 399 00:21:42,000 --> 00:21:46,000 Vi ne zagotavljajo prvotne vrednosti same, 400 00:21:46,000 --> 00:21:49,000 Tako smo videli, je to v okviru buggyc, 401 00:21:49,000 --> 00:21:52,000 buggy3.c, ki je pogledal malo kaj takega. 402 00:21:52,000 --> 00:21:57,000 >> Spomnimo se, da smo imeli x in y initialized za 1 in 2, v tem zaporedju. 403 00:21:57,000 --> 00:21:59,000 Potem smo natisniti, kaj so. 404 00:21:59,000 --> 00:22:03,000 Nato sem trdil, da sem jih zamenjala s pozivom swap x, y. 405 00:22:03,000 --> 00:22:06,000 Ampak problem je bil, da zamenjavam delal, 406 00:22:06,000 --> 00:22:10,000 vendar le v obsegu zamenjave sam deloval. 407 00:22:10,000 --> 00:22:13,000 Takoj, ko bomo zadeli linijo 40 zamenjala navedenim vrednot 408 00:22:13,000 --> 00:22:16,000 vrgli stran, tako da ni nič 409 00:22:16,000 --> 00:22:21,000 v prvotni funkciji je bil glavni dejansko spremenili na vse, 410 00:22:21,000 --> 00:22:26,000 tako da, če menite, da je takrat, kaj to izgleda v smislu našega spomina 411 00:22:26,000 --> 00:22:29,000 če je to leva stran uprave predstavlja- 412 00:22:29,000 --> 00:22:33,000 in bom naredil moj najboljši za vse, da se to, če je to leva stran uprave 413 00:22:33,000 --> 00:22:37,000 pomeni, recimo, RAM in sklad bo rasla gor ta način, 414 00:22:37,000 --> 00:22:43,000 in pokličemo funkcijo kot glavni, glavni in ima 2 lokalnih spremenljivk x in y, 415 00:22:43,000 --> 00:22:48,000 kaj je opisati takšne, kot so x tukaj in kaj je to opisati kot y tukaj, 416 00:22:48,000 --> 00:22:55,000 in kaj je dal v vrednosti 1 in 2, tako da je to tukaj glavni, 417 00:22:55,000 --> 00:22:58,000 in ko glavna zahteva swap funkcija operacijskega sistema 418 00:22:58,000 --> 00:23:02,000 izreka te zamenjave svojo funkcijo plasti spomina na sklad, 419 00:23:02,000 --> 00:23:04,000 svoj posnetek na kup, da se tako izrazim. 420 00:23:04,000 --> 00:23:08,000 Prav tako namenja 32 bitov za te ints. 421 00:23:08,000 --> 00:23:11,000 To se zgodi, da jih pokličete in b, ampak to je povsem samovoljno. 422 00:23:11,000 --> 00:23:13,000 Lahko bi jih imenoval karkoli hoče, ampak kaj se zgodi, ko glavni 423 00:23:13,000 --> 00:23:19,000 poziva k zamenjavi je ob tej 1, postavi kopijo tam, postavi kopijo tam. 424 00:23:19,000 --> 00:23:23,000 >> Tu je 1 druga lokalna spremenljivka v zamenjavo, čeprav imenovan kaj? >> NTU. 425 00:23:23,000 --> 00:23:27,000 Tmp, zato naj dam še 32 bitov tukaj, 426 00:23:27,000 --> 00:23:29,000 in kaj sem naredil v tej funkciji? 427 00:23:29,000 --> 00:23:34,000 Rekel sem, int tmp dobi, tako da je 1, tako da sem to storil, ko smo nazadnje igrali s to npr. 428 00:23:34,000 --> 00:23:39,000 Potem pride b, tako da je b 2, tako da zdaj to postane 2, 429 00:23:39,000 --> 00:23:42,000 in sedaj b dobi temperature, zato je temperatura 1, 430 00:23:42,000 --> 00:23:44,000 sedaj ko je to b. 431 00:23:44,000 --> 00:23:46,000 To je super. Delovalo je. 432 00:23:46,000 --> 00:23:49,000 Potem pa takoj, ko se vrne 433 00:23:49,000 --> 00:23:52,000 swap pomnilnik dejansko izgine, tako da se lahko ponovno je 434 00:23:52,000 --> 00:23:58,000 s kakšno drugo funkcijo v prihodnosti, in glavni je seveda popolnoma nespremenjena. 435 00:23:58,000 --> 00:24:00,000 Moramo priti v osnovi reševanja tega problema, 436 00:24:00,000 --> 00:24:03,000 in danes bomo končno imeli način, kako to, s katerim 437 00:24:03,000 --> 00:24:06,000 lahko uvede nekaj, kar ti kazalec. 438 00:24:06,000 --> 00:24:09,000 Izkaže se, da bomo lahko rešili ta problem 439 00:24:09,000 --> 00:24:12,000 ne pa gre v kopijah x in y 440 00:24:12,000 --> 00:24:18,000 temveč s posredovanjem, v čem, menite, da swap funkcijo? 441 00:24:18,000 --> 00:24:20,000 Ja, kaj je naslov? 442 00:24:20,000 --> 00:24:22,000 Nismo zares govorili o naslovih v veliko podrobnosti, 443 00:24:22,000 --> 00:24:25,000 če pa je ta tabla predstavlja mojega računalnika pomnilnika 444 00:24:25,000 --> 00:24:28,000 Lahko bi vsekakor začeti številčenje bajtov v mojem RAM 445 00:24:28,000 --> 00:24:31,000 in pravijo, je to Bajt # 1, to je bajta # 2, # 3 Bajt, 446 00:24:31,000 --> 00:24:35,000 Bajt # 4, bajt # ... 2 milijard EUR, če imam 2 GB RAM-a, 447 00:24:35,000 --> 00:24:38,000 tako da bi lahko zagotovo prišli do neke poljubno shemo številčnega 448 00:24:38,000 --> 00:24:41,000 za vse posamezne bajtov v pomnilniku mojega računalnika. 449 00:24:41,000 --> 00:24:43,000 >> Kaj če bi namesto, ko sem poklical swap 450 00:24:43,000 --> 00:24:47,000 kot geslo v kopijah x in y 451 00:24:47,000 --> 00:24:51,000 Zakaj ne bi namesto tega poslati v naslovu x tukaj, 452 00:24:51,000 --> 00:24:55,000 naslov y tu, v bistvu poštni naslov 453 00:24:55,000 --> 00:24:59,000 x in y, ker potem zamenjajte, če je sporočil, da 454 00:24:59,000 --> 00:25:01,000 naslova v spomin na x in y, 455 00:25:01,000 --> 00:25:04,000 nato zamenjali, če smo usposobljeni mu malo, 456 00:25:04,000 --> 00:25:07,000 da bi lahko vozite na ta naslov, če se tako izrazim, 457 00:25:07,000 --> 00:25:11,000 x in spremenite številko tam, nato vožnja na naslov y, 458 00:25:11,000 --> 00:25:16,000 spreminjanje števila tam, tudi ko ne dejansko dobili kopije teh vrednot sam, 459 00:25:16,000 --> 00:25:19,000 tako, čeprav smo se pogovarjali o tem, kot da je glavni pomnilnik 460 00:25:19,000 --> 00:25:23,000 in to, kot da swap pomnilnik močan in nevaren del C 461 00:25:23,000 --> 00:25:28,000 je, da lahko vsak dotik funkcija spomina kjerkoli v računalniku, 462 00:25:28,000 --> 00:25:32,000 in to je močna v tem, da lahko narediš zelo fancy stvari z računalniškimi programi v C. 463 00:25:32,000 --> 00:25:36,000 To je nevarno, ker lahko tudi zajebal zelo enostavno. 464 00:25:36,000 --> 00:25:39,000 Dejstvo je, da je eden od najpogostejših načinov za programe, ki v teh dneh je treba izkoristiti 465 00:25:39,000 --> 00:25:42,000 Še vedno je za programer ne zavedaš 466 00:25:42,000 --> 00:25:45,000 da je on ali ona je kar s podatki 467 00:25:45,000 --> 00:25:49,000 mora biti napisana v mesto v pomnilniku, ki ni bilo namenjeno. 468 00:25:49,000 --> 00:25:51,000 >> Na primer, on ali ona izjavi paleto velikosti 10 469 00:25:51,000 --> 00:25:56,000 potem pa se po nesreči poskuša postaviti 11 bajtov v to vrsto pomnilnika, 470 00:25:56,000 --> 00:25:59,000 in začnete dotika delov pomnilnika, ki niso več veljavni. 471 00:25:59,000 --> 00:26:02,000 Samo na sobesedilo to, da nekateri izmed vas ve, da 472 00:26:02,000 --> 00:26:06,000 Programska oprema se bo od vas zahteval serijskih številk ali registrskih ključev, 473 00:26:06,000 --> 00:26:08,000 Photoshop in Word in programi, kot je ta. 474 00:26:08,000 --> 00:26:12,000 Obstajajo razpoke, kot nekateri že veste, na spletu, kjer lahko zaženete malo program, 475 00:26:12,000 --> 00:26:14,000 in voila, ni več prošnja za serijsko številko. 476 00:26:14,000 --> 00:26:16,000 Kako se to dela? 477 00:26:16,000 --> 00:26:21,000 V mnogih primerih se te stvari so enostavno najti na računalnikih 478 00:26:21,000 --> 00:26:24,000 besedilo odseki v dejanskih računalnika ničel in enic 479 00:26:24,000 --> 00:26:28,000 če je ta funkcija, kjer se zahteva serijska številka, 480 00:26:28,000 --> 00:26:31,000 in si prepisati, da je prostor, ali pa program teče 481 00:26:31,000 --> 00:26:33,000 lahko ugotovimo, kje je ključ dejansko skladiščena 482 00:26:33,000 --> 00:26:37,000 z nekaj imenuje razhroščevalnik, in lahko tresk programske opreme na ta način. 483 00:26:37,000 --> 00:26:40,000 To pa ne pomeni, da je to naš cilj za naslednjih nekaj dni, 484 00:26:40,000 --> 00:26:42,000 vendar je prav v realnem svetu posledice. 485 00:26:42,000 --> 00:26:45,000 To je ena zgodi, da za krajo programske opreme, 486 00:26:45,000 --> 00:26:47,000 vendar pa je tudi kompromis celih naprav. 487 00:26:47,000 --> 00:26:50,000 >> V bistvu, ko spletne strani izkoriščajo te dni 488 00:26:50,000 --> 00:26:53,000 in ogrožena in podatki ušli in gesla, ukradeno 489 00:26:53,000 --> 00:26:58,000 to je zelo pogosto povezano s slabim upravljanjem lastnega spomina, 490 00:26:58,000 --> 00:27:01,000 ali, v primeru baz podatkov, pomanjkljivo predvidevanje 491 00:27:01,000 --> 00:27:03,000 kontradiktoren vhod, tako da več o tem v prihodnjih tednih, 492 00:27:03,000 --> 00:27:07,000 vendar za zdaj le skrivaj predogled vrste škode, ki jo lahko naredite 493 00:27:07,000 --> 00:27:11,000 z ne povsem razumeti, kako stvari delujejo pod pokrovom. 494 00:27:11,000 --> 00:27:14,000 Pojdimo o razumevanju, zakaj je pokvarjen ta 495 00:27:14,000 --> 00:27:17,000 z orodjem, da bo postala bolj in bolj uporaben 496 00:27:17,000 --> 00:27:19,000 kot naši programi dobili bolj zapleten. 497 00:27:19,000 --> 00:27:21,000 Do sedaj, ko ste imeli hrošča v programu 498 00:27:21,000 --> 00:27:23,000 kako ste šli pa je odpravljanje napak? 499 00:27:23,000 --> 00:27:25,000 Kakšne so vaše tehnike je sedaj to, ali jih poučuje svojo TF 500 00:27:25,000 --> 00:27:27,000 ali pa samouk? 501 00:27:27,000 --> 00:27:29,000 [Študent] printf. 502 00:27:29,000 --> 00:27:31,000 Printf, da je printf najbrž tvoj prijatelj v tem, da če si želite ogledati 503 00:27:31,000 --> 00:27:33,000 kaj se dogaja v notranjosti vašega programa 504 00:27:33,000 --> 00:27:36,000 ste pravkar postavili printf tukaj printf tukaj printf tukaj. 505 00:27:36,000 --> 00:27:38,000 Potem ga zaženete, in dobiš cel kup stvari na zaslonu 506 00:27:38,000 --> 00:27:43,000 ki jih lahko uporabite, da potem sklepati, kaj se dejansko dogaja narobe v programu. 507 00:27:43,000 --> 00:27:45,000 >> Printf zna biti zelo močna stvar, 508 00:27:45,000 --> 00:27:47,000 ampak to je zelo ročni postopek. 509 00:27:47,000 --> 00:27:49,000 Moraš dati printf tukaj, tukaj printf, 510 00:27:49,000 --> 00:27:51,000 in če ste jo dali v notranjosti zanke bi lahko dobil 100 vrstic 511 00:27:51,000 --> 00:27:53,000 proizvodnje, ki jo potem morali odbirati skozi. 512 00:27:53,000 --> 00:27:58,000 To ni zelo uporabniku prijazen ali interaktivne mehanizem za razhroščevanje programov, 513 00:27:58,000 --> 00:28:00,000 ampak na srečo obstaja alternative. 514 00:28:00,000 --> 00:28:03,000 Obstaja program, na primer, ki se imenuje GDB, GNU Debugger, 515 00:28:03,000 --> 00:28:06,000 kar je nekoliko starinski v tem, kako ga uporabljate. 516 00:28:06,000 --> 00:28:08,000 To je nekoliko zapletena, vendar odkrito povedano, 517 00:28:08,000 --> 00:28:11,000 To je ena od tistih stvari, kjer, če si dal v ta teden in naslednji 518 00:28:11,000 --> 00:28:14,000 dodatna ura razumeti kaj takega gdb 519 00:28:14,000 --> 00:28:18,000 vam bo prihranilo verjetno deset ur na dolgi rok, 520 00:28:18,000 --> 00:28:21,000 tako s tem, da ti dam teaser o tem, kako ta stvar deluje. 521 00:28:21,000 --> 00:28:23,000 >> Jaz sem v terminalskem oknu. 522 00:28:23,000 --> 00:28:26,000 Naj gredo naprej in zbira ta program, buggy3. 523 00:28:26,000 --> 00:28:28,000 To je že do datuma. 524 00:28:28,000 --> 00:28:31,000 Naj deluje kot sva nekaj časa nazaj, in res, je pokvarjen. 525 00:28:31,000 --> 00:28:34,000 Ampak zakaj je to? Mogoče sem zasral swap funkcijo. 526 00:28:34,000 --> 00:28:37,000 Mogoče je, in b. Nisem povsem njihovo premikanje pravilno. 527 00:28:37,000 --> 00:28:39,000 Naj gredo naprej in to je to. 528 00:28:39,000 --> 00:28:43,000 Namesto, da samo teče buggy3 mi namesto zagon tega programa GDB, 529 00:28:43,000 --> 00:28:48,000 in jaz jo bom povedal, da delujejo buggy3, 530 00:28:48,000 --> 00:28:52,000 in bom vključiti argument v ukazni vrstici, Tui-, 531 00:28:52,000 --> 00:28:55,000 mi pa bomo dal to v prihodnje težave pri določilu, da spominjajo. 532 00:28:55,000 --> 00:28:57,000 In sedaj je ta črni in beli vmesnik izstrelil, da ponovno 533 00:28:57,000 --> 00:28:59,000 je malo veliko sprva zato, ker je vse to 534 00:28:59,000 --> 00:29:02,000 informacije o garanciji tukaj, ampak vsaj nekaj je znano. 535 00:29:02,000 --> 00:29:04,000 Na vrhu okna je moja dejanska koda 536 00:29:04,000 --> 00:29:08,000 in če sem se pomaknete gor Naj se pomaknite na sam vrh mojega spisa, 537 00:29:08,000 --> 00:29:11,000 in seveda, tam je buggy3.c in obvestilo na dnu tega okna 538 00:29:11,000 --> 00:29:13,000 Imam GDB uren. 539 00:29:13,000 --> 00:29:16,000 >> To ni isto kot moj običajni John Harvard uren. 540 00:29:16,000 --> 00:29:19,000 To je poziv, da se dogaja, da mi dovolite, da nadzor GDB. 541 00:29:19,000 --> 00:29:21,000 GDB je razhroščevalnik. 542 00:29:21,000 --> 00:29:24,000 Razbubnik je program, ki vam omogoča, da sprehod skozi 543 00:29:24,000 --> 00:29:27,000 izvajanje svojega programa, skladno s po vrsticah, 544 00:29:27,000 --> 00:29:30,000 vzdolž način, da bi kakor koli želite v program, 545 00:29:30,000 --> 00:29:33,000 celo kliče funkcije, ali pa si še pomembneje, 546 00:29:33,000 --> 00:29:35,000 V različnih vrednostih spremenljivke. 547 00:29:35,000 --> 00:29:37,000 Pojdimo naprej in to je to. 548 00:29:37,000 --> 00:29:40,000 Grem naprej in vnesite v teku na poziv GDB je, 549 00:29:40,000 --> 00:29:43,000 tako opazili v spodnjem levem kotu zaslona sem tipkal teči, 550 00:29:43,000 --> 00:29:45,000 in sem zadeti nastopiti, in kaj se je to naredil? 551 00:29:45,000 --> 00:29:50,000 To dobesedno tekel svoj program, vendar nisem dejansko videl veliko iti tukaj 552 00:29:50,000 --> 00:29:55,000 ker sem dejansko ni povedal razhroščevalnika 553 00:29:55,000 --> 00:29:57,000 Za premor v določenem trenutku. 554 00:29:57,000 --> 00:29:59,000 Vtipkate tek zažene program. 555 00:29:59,000 --> 00:30:01,000 Jaz dejansko ne vidim ničesar. Ne morem vplivati. 556 00:30:01,000 --> 00:30:03,000 >> Namesto tega naj to storijo. 557 00:30:03,000 --> 00:30:08,000 Na tej GDB poziv naj namesto tega vnesite prelom, vnesite. 558 00:30:08,000 --> 00:30:10,000 To ni tisto, kar sem mislil, da tip. 559 00:30:10,000 --> 00:30:13,000 Naj namesto tega vnesite prelom glavni. 560 00:30:13,000 --> 00:30:15,000 Z drugimi besedami, Rad bi postavil nekaj, kar ti prelomnih točk, 561 00:30:15,000 --> 00:30:18,000 ki je aptly imenovan, ker bo prekinil ali začasno ustaviti 562 00:30:18,000 --> 00:30:21,000 izvajanje svojega programa, na tem mestu. 563 00:30:21,000 --> 00:30:23,000 Glavna je ime mojega delovanja. 564 00:30:23,000 --> 00:30:25,000 Obvestilo, da je GDB zelo pameten. 565 00:30:25,000 --> 00:30:28,000 To je ugotovil, da je glavni zgodi, da grobo začeti na liniji 18 566 00:30:28,000 --> 00:30:32,000 za buggy3.c, nato pa opazil tukaj na levem 567 00:30:32,000 --> 00:30:34,000 b + je tik ob liniji 18. 568 00:30:34,000 --> 00:30:38,000 To me spominja, da sem nastavite prekinitveno točko na liniji 18. 569 00:30:38,000 --> 00:30:42,000 Ta čas, ko sem tipa teči, grem teči svoj program 570 00:30:42,000 --> 00:30:45,000 do zadene, da prelomne točke, 571 00:30:45,000 --> 00:30:48,000 Tako bo program premor me na liniji 18. 572 00:30:48,000 --> 00:30:50,000 Pa gremo, teci. 573 00:30:50,000 --> 00:30:53,000 Nič se zdi, da se je zgodilo, vendar je oznaka na spodnjem levem 574 00:30:53,000 --> 00:30:58,000 začetni program, buggy3, prekinitvena točka 1 v glavnem v skladu buggy3.c 18. 575 00:30:58,000 --> 00:31:00,000 Kaj lahko storim sedaj? 576 00:31:00,000 --> 00:31:03,000 >> Obvestilo lahko začnem tipkati stvari, kot so tisk, 577 00:31:03,000 --> 00:31:08,000 Ne printf, tiskanje x, in zdaj, da je čudno. 578 00:31:08,000 --> 00:31:11,000 $ 1 je le radovednost, kot bomo videli 579 00:31:11,000 --> 00:31:14,000 vsakič, ko natisnete nekaj dobiš nov $ vrednost. 580 00:31:14,000 --> 00:31:18,000 To je, tako da lahko vrne na prejšnje vrednosti samo v primeru, 581 00:31:18,000 --> 00:31:21,000 vendar za zdaj, kaj print so mi povedali, da je vrednost x v tem trenutku v zgodbi 582 00:31:21,000 --> 00:31:26,000 očitno 134514032. 583 00:31:26,000 --> 00:31:29,000 Kaj? Kje si, da je tudi prišel? 584 00:31:29,000 --> 00:31:31,000 [Neslišno-student] 585 00:31:31,000 --> 00:31:34,000 Pravzaprav, to je tisto, kar imenujemo smeti vrednost, in smo govorili o tem, ne še, 586 00:31:34,000 --> 00:31:37,000 ampak razlog, da si inicializacijo spremenljivk 587 00:31:37,000 --> 00:31:40,000 Očitno je, da imajo neko vrednost, ki jo želite, da imajo. 588 00:31:40,000 --> 00:31:44,000 Ampak ulov je opozoriti, da se lahko ugotovi, spremenljivke 589 00:31:44,000 --> 00:31:46,000 kot sem pred nekaj trenutki v mojem primeru sigma 590 00:31:46,000 --> 00:31:48,000 ne da bi dejansko jim vrednost. 591 00:31:48,000 --> 00:31:50,000 Spomnimo se, kaj sem storil sem v sigma. 592 00:31:50,000 --> 00:31:52,000 Sem izjavil n, ampak kaj vrednostne sem jo dal? 593 00:31:52,000 --> 00:31:56,000 Jih ni, ker sem vedel, da bo v naslednjih nekaj vrstic 594 00:31:56,000 --> 00:31:59,000 GetInt bi poskrbel za problem dajanja vrednosti znotraj n. 595 00:31:59,000 --> 00:32:02,000 >> Toda na tej točki v zgodbo vrstico 11 596 00:32:02,000 --> 00:32:05,000 in linijo 12 in linijo 13 in linijo 14 597 00:32:05,000 --> 00:32:08,000 po teh nekaj vrstic, kaj je vrednost n? 598 00:32:08,000 --> 00:32:10,000 V C preprosto ne vem. 599 00:32:10,000 --> 00:32:14,000 To je na splošno nekaj smeti vrednost, nekaj povsem naključno število 600 00:32:14,000 --> 00:32:17,000 , ki je ostala v bistvu iz neke prejšnje funkcije 601 00:32:17,000 --> 00:32:21,000 bilo teči, tako kot vaš program teče 602 00:32:21,000 --> 00:32:24,000 opozoriti, da je funkcija dobi funkcijo, funkcijo, funkcijo. 603 00:32:24,000 --> 00:32:27,000 Vsi ti okvirji se dajo na pomnilnik, nato pa vrnitev teh funkcij, 604 00:32:27,000 --> 00:32:31,000 in tako kot sem predlagal, z radirko njihov spomin je sčasoma ponovno uporabiti. 605 00:32:31,000 --> 00:32:37,000 No, prav tako se zgodi, da je ta spremenljivka x v tem programu 606 00:32:37,000 --> 00:32:41,000 Zdi se, da so se zadrževali nekaj smeti vrednost kot 134514032 607 00:32:41,000 --> 00:32:44,000 iz neke prejšnje funkcije, ne tisti, ki sem jih napisal. 608 00:32:44,000 --> 00:32:47,000 To je lahko nekaj, kar prihaja učinkovito z operacijskim sistemom, 609 00:32:47,000 --> 00:32:49,000 nekatere funkcije pod pokrovom. 610 00:32:49,000 --> 00:32:52,000 >> Ok, to je v redu, ampak kaj je zdaj napreduje v naslednji vrstici. 611 00:32:52,000 --> 00:32:55,000 Če sem tipa "Next" na moj poziv GDB in sem zadeti nastopiti, 612 00:32:55,000 --> 00:32:58,000 opazili, da poudarjanje poteze navzdol do vrstice 19, 613 00:32:58,000 --> 00:33:01,000 vendar logično izhajalo, da se vrstica 18 614 00:33:01,000 --> 00:33:06,000 se je zdaj končal izvedbo, tako da če še enkrat vtipkajte "print x" 615 00:33:06,000 --> 00:33:10,000 Jaz Zdaj bi morali videti 1, in seveda jaz. 616 00:33:10,000 --> 00:33:14,000 Spet $ stvari je način GDB vas opomnijo 617 00:33:14,000 --> 00:33:17,000 Kaj je zgodovina odtisov, ki ste jih storili. 618 00:33:17,000 --> 00:33:21,000 Zdaj pa mi daj in tiskanje y, in res, y je vrednost nekaterih nor, kot tudi, 619 00:33:21,000 --> 00:33:24,000 vendar pa ni nič hudega, saj v vrstici 19 smo na tem, da jih dodeli 620 00:33:24,000 --> 00:33:27,000 vrednost 2, da mi tip "Next" znova. 621 00:33:27,000 --> 00:33:29,000 In zdaj smo na liniji printf. 622 00:33:29,000 --> 00:33:31,000 Naj jaz tiskanja x. 623 00:33:31,000 --> 00:33:34,000 Naj jaz tiska y. Odkrito povedano, sem že malo utrujen tiskanja tega. 624 00:33:34,000 --> 00:33:38,000 Naj namesto tega vnesite "x" in "prikazni zaslon," y 625 00:33:38,000 --> 00:33:41,000 in zdaj vsakič, ko sem vnesite ukaz v prihodnosti 626 00:33:41,000 --> 00:33:45,000 Sem se spomnil, kaj je x in y, kaj je x in y, kaj je x in y. 627 00:33:45,000 --> 00:33:48,000 >> Ne morem tako, kot praho, tipa "info domačini." 628 00:33:48,000 --> 00:33:50,000 Info je poseben ukaz. 629 00:33:50,000 --> 00:33:52,000 Domačini pomeni, da mi pokaže lokalne spremenljivke. 630 00:33:52,000 --> 00:33:55,000 Samo v primeru, sem pozabil, ali je to noro, zapletena naloga 631 00:33:55,000 --> 00:33:57,000 da sem ali kdo drug napisal info domačini vam bo povedal, 632 00:33:57,000 --> 00:34:00,000 Kaj so vse lokalne spremenljivke znotraj te lokalne funkcije 633 00:34:00,000 --> 00:34:03,000 da bi vas skrbi, če želite, da okoli zbosti. 634 00:34:03,000 --> 00:34:07,000 Zdaj printf gre za izvrševanje, zato naj gredo naprej in samo tip "Next". 635 00:34:07,000 --> 00:34:10,000 Ker smo v tem okolju ne bomo dejansko videli 636 00:34:10,000 --> 00:34:14,000 izvršitev dol, ampak obvestilo, da je že malo pokvarjenimi tukaj. 637 00:34:14,000 --> 00:34:17,000 Ampak opazite, da je nujni zaslon tam, 638 00:34:17,000 --> 00:34:21,000 tako da ni popoln program tukaj, ampak to je v redu, ker sem lahko vedno suniti okrog 639 00:34:21,000 --> 00:34:23,000 pomočjo tiska, če hočem. 640 00:34:23,000 --> 00:34:26,000 >> Naj Type Naslednja enkrat, in zdaj tukaj je zanimivo. 641 00:34:26,000 --> 00:34:29,000 Na tej točki v zgodbo y 2 in x je 1, 642 00:34:29,000 --> 00:34:32,000 kot je bilo predlagano tu in tam, 643 00:34:32,000 --> 00:34:35,000 Razlog je ta samodejno prikazovanje zdaj, ker sem uporabil ukaz 644 00:34:35,000 --> 00:34:40,000 Prikaz x in y zaslon, tako da ko sem Type Naslednja 645 00:34:40,000 --> 00:34:43,000 V teoriji x in y mora postati zamenjali. 646 00:34:43,000 --> 00:34:45,000 Zdaj že vemo, da se to ne bo tako, 647 00:34:45,000 --> 00:34:49,000 ampak bomo videli v trenutku, kako se lahko potopite globlje bomo ugotoviti, zakaj je to res. 648 00:34:49,000 --> 00:34:54,000 Naprej, na žalost, še vedno y 2 x in je še vedno 1, in lahko potrdim toliko. 649 00:34:54,000 --> 00:34:56,000 Tiskanje x, y print. 650 00:34:56,000 --> 00:34:59,000 V resnici je ni zamenjala se je dejansko zgodilo, zato začnimo tole. 651 00:34:59,000 --> 00:35:01,000 Jasno je pokvarjen swap. 652 00:35:01,000 --> 00:35:04,000 Naj namesto tipa "Run" znova. 653 00:35:04,000 --> 00:35:07,000 Naj povem, da želim ponovno zagnati od začetka, začne. 654 00:35:07,000 --> 00:35:09,000 >> Zdaj sem nazaj na liniji 18. 655 00:35:09,000 --> 00:35:11,000 Zdaj opazite x in y vrednosti smeti znova. 656 00:35:11,000 --> 00:35:15,000 Naprej, Naprej, Naprej, naprej. 657 00:35:15,000 --> 00:35:17,000 Če dobim dolgčas, sem lahko samo tip n za zraven. 658 00:35:17,000 --> 00:35:21,000 Lahko ga skrči na najkrajši zaporedje znakov. 659 00:35:21,000 --> 00:35:23,000 Zamenjava je zdaj prekinjena. 660 00:35:23,000 --> 00:35:25,000 Naj se potopite v, tako da namesto tipkanja naslednji, 661 00:35:25,000 --> 00:35:30,000 Zdaj se bom s tipom korak, tako da sem notri okrepitev te funkcije 662 00:35:30,000 --> 00:35:33,000 tako da lahko hodim po njej, tako da sem zadel korak in vnesite. 663 00:35:33,000 --> 00:35:37,000 Obvestilo, da s poudarjanjem skoči dol nižje v mojem programu za linijo 36. 664 00:35:37,000 --> 00:35:39,000 Zdaj, kaj so lokalne spremenljivke? 665 00:35:39,000 --> 00:35:41,000 Info domačini. 666 00:35:41,000 --> 00:35:43,000 Nič samo še zato, ker smo ni prišel do te črte, 667 00:35:43,000 --> 00:35:47,000 tako da gremo naprej in rekli "Naprej." 668 00:35:47,000 --> 00:35:50,000 Zdaj se zdi, da imajo tmp, tiskanje tmp. 669 00:35:50,000 --> 00:35:52,000 Garbage vrednost, kajne? Mislim, da. 670 00:35:52,000 --> 00:35:55,000 Kaj pa tiskanje, tiskanje B, 1 in 2? 671 00:35:55,000 --> 00:35:58,000 V trenutku, takoj ko sem tipa enkrat Naprej 672 00:35:58,000 --> 00:36:02,000 tmp se dogaja, da se na vrednost 1, upajmo, 673 00:36:02,000 --> 00:36:05,000 ker tmp se bo določena z vrednostjo. 674 00:36:05,000 --> 00:36:08,000 >> Zdaj pa dajmo tiskanje, tiskanje b, 675 00:36:08,000 --> 00:36:11,000 zdaj pa natisnite tmp, in to je res 1. 676 00:36:11,000 --> 00:36:14,000 Bom jaz naslednji. Bom jaz naslednji. 677 00:36:14,000 --> 00:36:16,000 Sem končal swap funkcijo. 678 00:36:16,000 --> 00:36:19,000 Še vedno sem v notranjosti pa v skladu 40, tako da naj tiska, 679 00:36:19,000 --> 00:36:22,000 print b, in ne zanima me, kaj je tmp. 680 00:36:22,000 --> 00:36:27,000 Izgleda, da zamenjava prav, ko gre za zamenjavo a in b. 681 00:36:27,000 --> 00:36:31,000 Ampak, če sem zdaj vnesite naslednjo, sem skočil nazaj na linijo 25, 682 00:36:31,000 --> 00:36:34,000 in seveda, če sem tip v x in y tiskanja 683 00:36:34,000 --> 00:36:38,000 oni so še vedno nespremenjena, zato nismo odpravili. 684 00:36:38,000 --> 00:36:41,000 Ampak diagnostično zdaj morda s tem programom GDB 685 00:36:41,000 --> 00:36:44,000 smo vsaj dobil en korak bližje k razumevanju 686 00:36:44,000 --> 00:36:47,000 kaj je narobe, ne da bi legla našo kodo z uvedbo printf tukaj, 687 00:36:47,000 --> 00:36:50,000 printf tukaj, tukaj in printf ga izvaja znova in znova 688 00:36:50,000 --> 00:36:52,000 poskuša ugotoviti, kaj je šlo narobe. 689 00:36:52,000 --> 00:36:55,000 >> Grem, da gredo naprej in nehal od tega skupaj s nehal. 690 00:36:55,000 --> 00:36:57,000 To se dogaja, potem pa rekel, "Vseeno končam?" Da. 691 00:36:57,000 --> 00:37:00,000 Zdaj sem nazaj na moj poziv normalno, in sem naredil z GDB. 692 00:37:00,000 --> 00:37:03,000 Naj omenim, da vam ni treba uporabljati to-TUI zastavo. 693 00:37:03,000 --> 00:37:07,000 V bistvu, če ga izpustite boste dobili v bistvu spodnjo polovico zaslona. 694 00:37:07,000 --> 00:37:11,000 Če sem vnesite prelom glavni in nato zaženite 695 00:37:11,000 --> 00:37:15,000 Še vedno lahko vodijo moj program, ampak kaj bo naredil, je bolj besedilom 696 00:37:15,000 --> 00:37:18,000 Samo pokaži mi trenutno ena vrstica naenkrat. 697 00:37:18,000 --> 00:37:21,000 -Tui, tekstovno uporabniški vmesnik, 698 00:37:21,000 --> 00:37:25,000 samo kaže, da več programa naenkrat, kar je verjetno nekoliko conceptually lažje. 699 00:37:25,000 --> 00:37:27,000 Toda v resnici, lahko sem naredil naslednji, naslednji, naslednji, 700 00:37:27,000 --> 00:37:30,000 in bom videl eno vrstico naenkrat, in če bi res rad videl, kaj se dogaja 701 00:37:30,000 --> 00:37:35,000 Lahko vnesete seznam in videli cel kup sosednjih linij. 702 00:37:35,000 --> 00:37:39,000 >> Tukaj je video, ki smo jih prosil, da gledate na problem postavlja 3 703 00:37:39,000 --> 00:37:43,000 v kateri Nate zajema nekatere zapletenosti gdb, 704 00:37:43,000 --> 00:37:46,000 in to je ena od tistih stvari, po pravici povedano, če nekaj ne-trivialen odstotek vas 705 00:37:46,000 --> 00:37:49,000 Nikoli ne bo dotaknil GDB in da bo slabo 706 00:37:49,000 --> 00:37:53,000 ker dobesedno boste na koncu porabi več časa kasneje ta semester 707 00:37:53,000 --> 00:37:56,000 loviš določitvi bugs potem bi si, če si dal v tej pol ure / uro 708 00:37:56,000 --> 00:38:00,000 Ta teden in naslednji učenje, da bi dobili udobno z gdb. 709 00:38:00,000 --> 00:38:02,000 Printf je bil tvoj prijatelj. 710 00:38:02,000 --> 00:38:05,000 GDB bi zdaj moral biti vaš prijatelj. 711 00:38:05,000 --> 00:38:08,000 >> Vsa vprašanja o gdb? 712 00:38:08,000 --> 00:38:12,000 In tukaj je kratek seznam nekaterih od najbolj močnih in uporabnih ukazov. 713 00:38:12,000 --> 00:38:15,000 Ja. >> Lahko natisnete niz? 714 00:38:15,000 --> 00:38:17,000 Lahko natisnete niz? Absolutno. 715 00:38:17,000 --> 00:38:19,000 Ni nujno, da se samo cela števila. 716 00:38:19,000 --> 00:38:22,000 Če spremenljivka y je niz vtipkaj vs tiskanja. 717 00:38:22,000 --> 00:38:24,000 To vam bo pokazal, kaj je niz spremenljivka. 718 00:38:24,000 --> 00:38:26,000 [Neslišno-student] 719 00:38:26,000 --> 00:38:28,000 To vam bo dala naslov in godalnega sam. 720 00:38:28,000 --> 00:38:32,000 To vam bo pokazal oba. 721 00:38:32,000 --> 00:38:34,000 In zadnja stvar, samo zato, ker so preveč dobro, da bi vedel. 722 00:38:34,000 --> 00:38:37,000 Povratno sledenje in okvir, naj se potopite v to, tokrat zadnjič, 723 00:38:37,000 --> 00:38:39,000 Enako Natančen program z gdb. 724 00:38:39,000 --> 00:38:44,000 Naj gredo naprej in zagon tekstovno različico uporabniškega vmesnika, 725 00:38:44,000 --> 00:38:46,000 Glavni odmor. 726 00:38:46,000 --> 00:38:49,000 Naj gredo naprej in ponovno zaženete. Tukaj sem. 727 00:38:49,000 --> 00:38:55,000 Zdaj pa grem naslednji, naslednji, naslednji, naslednji, naslednji, korak, vnesite. 728 00:38:55,000 --> 00:39:00,000 >> In zdaj, da sem jaz zdaj v zamenjavo namerno, ampak sem kot "Prekleto, kaj je vrednost x?" 729 00:39:00,000 --> 00:39:02,000 Ne morem x več. 730 00:39:02,000 --> 00:39:05,000 Tega ne morem storiti, y, ker oni ne po obsegu. 731 00:39:05,000 --> 00:39:07,000 Oni ne v smislu, ampak ni problema. 732 00:39:07,000 --> 00:39:09,000 Lahko vnesete povratno sledenje. 733 00:39:09,000 --> 00:39:13,000 To mi pokaže vse funkcije, ki so izvedene do tega trenutka. 734 00:39:13,000 --> 00:39:16,000 Obvestilo, da je ena na dnu, glavni, poravna z glavno 735 00:39:16,000 --> 00:39:18,000 da je na dnu naše slike tukaj. 736 00:39:18,000 --> 00:39:22,000 Dejstvo, da je zamenjava nad njim vrstic z zamenjavo je nad njo v spomin tukaj 737 00:39:22,000 --> 00:39:26,000 in če želim priti nazaj na glavno začasno lahko rečem "okvir". 738 00:39:26,000 --> 00:39:30,000 Katera številka? Glavni okvir je # 1. 739 00:39:30,000 --> 00:39:32,000 Grem, da gredo naprej in reči "okvir 1". 740 00:39:32,000 --> 00:39:36,000 >> Zdaj sem se vrnil v glavnem, jaz lahko natisnete x in sem lahko natisnete y, 741 00:39:36,000 --> 00:39:40,000 ampak ne morem natisniti ali b. 742 00:39:40,000 --> 00:39:43,000 Lahko pa, če rečem: "V redu, samo trenutek. Kje je bila zamenjava?" 743 00:39:43,000 --> 00:39:46,000 Naj gredo naprej in rekli "frame 0". 744 00:39:46,000 --> 00:39:48,000 Zdaj sem spet tam, kjer želim biti, in kot prahi, 745 00:39:48,000 --> 00:39:52,000 tam je tudi drugi ukazi, kot če ste res dolgčas tipkanje Naprej, Naprej, Naprej, Naprej, 746 00:39:52,000 --> 00:39:56,000 lahko na splošno povedati stvari, kot so "Naslednjih 10", in da bo korak skozi naslednjih 10 progah. 747 00:39:56,000 --> 00:39:59,000 Napišete lahko tudi "še", ko se res naveličani pospešitvi skozi to. 748 00:39:59,000 --> 00:40:05,000 Še naprej se bo izvajal svoj program brez prekinitve, dokler se ne dotakne drugega odmerka, 749 00:40:05,000 --> 00:40:07,000 ali v zanki ali spustiti v programu. 750 00:40:07,000 --> 00:40:11,000 >> V tem primeru smo nadaljevali do konca, in program izstopilo običajno. 751 00:40:11,000 --> 00:40:13,000 To je fancy način, slabše proces. 752 00:40:13,000 --> 00:40:16,000 Samo vaš program izstopilo običajno. 753 00:40:16,000 --> 00:40:24,000 Več o tem v videu in razhroščevanje seje, ki prihajajo. 754 00:40:24,000 --> 00:40:26,000 To je bilo veliko. 755 00:40:26,000 --> 00:40:35,000 Vzemimo našo 5-minutni odmor tukaj, pa bomo vrnili s konstrukti in datotek. 756 00:40:35,000 --> 00:40:38,000 >> Če ste vrgli v pset ta teden že 757 00:40:38,000 --> 00:40:41,000 boste vedeli, da bomo uporabili v distribucijskem kodo, 758 00:40:41,000 --> 00:40:45,000 izvorne kode, ki jih ponujamo kot izhodišče, nekaj novih tehnik. 759 00:40:45,000 --> 00:40:50,000 Še posebej smo uvedli novo ključno besedo imenovano struct za konstrukcijo, 760 00:40:50,000 --> 00:40:53,000 tako da lahko oblikujemo po meri spremenljivke vrst. 761 00:40:53,000 --> 00:40:57,000 Uvedli smo tudi pojem datoteke, vhod / I, datoteke in izhod, 762 00:40:57,000 --> 00:41:00,000 in to je, da lahko rešimo državo 763 00:41:00,000 --> 00:41:03,000 vašega Izokrenuti sveta v datoteko na disku 764 00:41:03,000 --> 00:41:06,000 tako da lahko poučevanje tovariši in jaz razumem 765 00:41:06,000 --> 00:41:09,000 kaj se dogaja znotraj svojega programa, ne da bi sami igrali 766 00:41:09,000 --> 00:41:11,000 na ducate iger Scramble. 767 00:41:11,000 --> 00:41:13,000 Mi to zmoremo več automatedly. 768 00:41:13,000 --> 00:41:18,000 >> Ta ideja struct rešuje dokaj prepričljiv problem. 769 00:41:18,000 --> 00:41:21,000 Recimo, da želimo izvajati nek program 770 00:41:21,000 --> 00:41:25,000 da nekako beleži podatke o študentih, 771 00:41:25,000 --> 00:41:28,000 in morda imajo učenci, na primer ID, ime 772 00:41:28,000 --> 00:41:31,000 in hiša v mestu, kot je Harvard, tako da so 3 kosi informacij 773 00:41:31,000 --> 00:41:34,000 želimo ohraniti okoli, zato naj gredo naprej in začnite pisati malo program tukaj, 774 00:41:34,000 --> 00:41:38,000 vključiti stdio.h. 775 00:41:38,000 --> 00:41:42,000 Naj ne vključujejo cs50.h. 776 00:41:42,000 --> 00:41:44,000 In potem začnem glavno funkcijo. 777 00:41:44,000 --> 00:41:46,000 Ne bom se ukvarjati z vsemi argumenti v ukazni vrstici, 778 00:41:46,000 --> 00:41:49,000 in tu želim imeti študent, tako da bom povedal 779 00:41:49,000 --> 00:41:54,000 Študent ima ime, tako da bom rekel "niza ime." 780 00:41:54,000 --> 00:41:59,000 Potem bom rekel študent ima tudi ID, tako int id, 781 00:41:59,000 --> 00:42:03,000 in študent ima hišo, tako da sem tudi hotel reči "niz hišo." 782 00:42:03,000 --> 00:42:06,000 Potem bom naročiš ta malo bolj čisto, kot je ta. 783 00:42:06,000 --> 00:42:11,000 Ok, zdaj imam 3 spremenljivke, s katerimi se predstavljajo študenta, tako da "študent". 784 00:42:11,000 --> 00:42:15,000 >> In zdaj hočem, da zapolnijo te vrednosti, zato naj gredo naprej in rekel nekaj podobnega 785 00:42:15,000 --> 00:42:18,000 "Id = 123". 786 00:42:18,000 --> 00:42:21,000 Ime bo dobil Davida. 787 00:42:21,000 --> 00:42:24,000 Recimo hiša bo dobil Mather, 788 00:42:24,000 --> 00:42:31,000 in potem bom naredil nekaj samovoljno kot printf ("% s 789 00:42:31,000 --> 00:42:37,000 , katerega številka je% d, živi v% s. 790 00:42:37,000 --> 00:42:41,000 In zdaj, kaj hočem, da bi zapolnili tukaj, enega za drugim? 791 00:42:41,000 --> 00:42:47,000 Ime, id, hiša; return 0. 792 00:42:47,000 --> 00:42:50,000 V redu, če sem zasral tu nekje 793 00:42:50,000 --> 00:42:54,000 Mislim, da imamo zelo dober program, ki shranjuje 1 študenta. 794 00:42:54,000 --> 00:42:57,000 Seveda pa to ni vse, kar zanimivo. Kaj pa, če želim imeti 2 študente? 795 00:42:57,000 --> 00:42:59,000 To ni nič takega. Ne morem podpreti 2 osebi. 796 00:42:59,000 --> 00:43:03,000 Naj gredo naprej in označite to in pojdi tja, 797 00:43:03,000 --> 00:43:09,000 in lahko rečem, "id = 456", za nekoga, kot Rob, ki živi v Kirkland. 798 00:43:09,000 --> 00:43:12,000 >> Ok, počakaj, pa ne morem poklicati to isto stvar, 799 00:43:12,000 --> 00:43:15,000 in izgleda, da bom moral to kopirati, 800 00:43:15,000 --> 00:43:19,000 zato naj povem, da bo to spremenljivke Davidove, 801 00:43:19,000 --> 00:43:23,000 in kaj mi nekaj izvodov te za rob. 802 00:43:23,000 --> 00:43:27,000 Poklicali bomo ti Rob, vendar se to ne bo delovalo zdaj 803 00:43:27,000 --> 00:43:33,000 ker sem, čakaj, kaj je me spremeni v ID1 name1 in house1. 804 00:43:33,000 --> 00:43:35,000 Rob bo 2, 2. 805 00:43:35,000 --> 00:43:42,000 Imam to spremeniti, tukaj, tukaj, tukaj, tukaj, tukaj, tukaj. 806 00:43:42,000 --> 00:43:45,000 Čakaj, kaj je Tommy? Naredimo to še enkrat. 807 00:43:45,000 --> 00:43:49,000 Seveda, če še vedno misliš, da je to dober način za to, da to ni, 808 00:43:49,000 --> 00:43:52,000 tako copy / paste slabo. 809 00:43:52,000 --> 00:43:55,000 Ampak smo rešili ta teden. 810 00:43:55,000 --> 00:43:59,000 >> Kakšna je bila naša rešitev, če želimo imeti več primerkov iste vrste podatkov? 811 00:43:59,000 --> 00:44:01,000 [Dijaki] matrika. 812 00:44:01,000 --> 00:44:03,000 Matrika, zato naj ne poskušajte očistiti tega. 813 00:44:03,000 --> 00:44:07,000 Dovolite mi, da nekaj prostora zase na vrhu, in mi namesto tega tukaj. 814 00:44:07,000 --> 00:44:12,000 Poklicali bomo te ljudi, namesto tega pa bom rekel "int ids" 815 00:44:12,000 --> 00:44:14,000 in bom podprla 3 od nas za zdaj. 816 00:44:14,000 --> 00:44:18,000 Jaz bom rekel "niz imen," in jaz bom podprla 3 od nas, 817 00:44:18,000 --> 00:44:22,000 in potem bom rekel "niz hiš," in jaz bom podprla 3 od nas. 818 00:44:22,000 --> 00:44:26,000 Sedaj sem namesto Davida dobili svoje lokalne spremenljivke 819 00:44:26,000 --> 00:44:28,000 moremo znebiti teh. 820 00:44:28,000 --> 00:44:30,000 To je dober občutek, da smo za čiščenje to gor. 821 00:44:30,000 --> 00:44:35,000 Ne morem reči, potem David se bo [0] in imena [0] 822 00:44:35,000 --> 00:44:38,000 in hiše [0]. 823 00:44:38,000 --> 00:44:41,000 In potem Rob lahko prav tako shranite na to. 824 00:44:41,000 --> 00:44:46,000 Dajmo to tukaj, da mu bo samovoljno biti ids [1]. 825 00:44:46,000 --> 00:44:50,000 On bo imena [1] 826 00:44:50,000 --> 00:44:53,000 in potem končno, hiše [1]. 827 00:44:53,000 --> 00:44:57,000 >> Še malo dolgočasno, zdaj pa moram, da to ugotovite, 828 00:44:57,000 --> 00:45:03,000 Tako recimo "imena [0] id [0], hiše [0] 829 00:45:03,000 --> 00:45:06,000 in kaj je pluralize to. 830 00:45:06,000 --> 00:45:09,000 IDS, IDS, IDS. 831 00:45:09,000 --> 00:45:12,000 In spet, to počnem, tako da še enkrat, sem se že zateka k copy / paste spet 832 00:45:12,000 --> 00:45:14,000 tako da so možnosti, da je še ena rešitev tukaj. 833 00:45:14,000 --> 00:45:18,000 Jaz verjetno lahko očistite tako nadaljeval še z zanko ali kaj podobnega, 834 00:45:18,000 --> 00:45:21,000 Tako na kratko, da je malo bolje, vendar še vedno počuti kot 835 00:45:21,000 --> 00:45:24,000 Jaz sem se zatečejo k copy / paste, ampak tudi to, Trdim, 836 00:45:24,000 --> 00:45:27,000 v resnici ni bistveno prava rešitev, saj 837 00:45:27,000 --> 00:45:29,000 Kaj pa, če se odločimo, kdaj veš kaj? 838 00:45:29,000 --> 00:45:32,000 Mi bi res bilo shranjevanje e-poštnih naslovov za Davida in Rob 839 00:45:32,000 --> 00:45:34,000 in vsi ostali v tem programu. 840 00:45:34,000 --> 00:45:36,000 Prav tako je treba shranjevanje telefonskih številk. 841 00:45:36,000 --> 00:45:39,000 Prav tako bi morali hraniti kontaktne številke za klic v sili. 842 00:45:39,000 --> 00:45:41,000 Imamo vse te koščke podatkov, ki jih želimo shraniti, 843 00:45:41,000 --> 00:45:43,000 Torej, kako si šel o tem? 844 00:45:43,000 --> 00:45:46,000 >> Če ugotovi, drugi niz na vrhu, nato pa dodate ročno 845 00:45:46,000 --> 00:45:49,000 E-poštni naslov [0], e-mail [1] 846 00:45:49,000 --> 00:45:51,000 Za Davida in Rob in tako naprej. 847 00:45:51,000 --> 00:45:56,000 Vendar pa je res samo predpostavka tega modela 848 00:45:56,000 --> 00:45:59,000 da sem z uporabo častno sistem, da vedo, da 849 00:45:59,000 --> 00:46:03,000 [I] v vsaki izmed številnih nizi 850 00:46:03,000 --> 00:46:06,000 Samo tako se zgodi, da se nanašajo na isto osebo, 851 00:46:06,000 --> 00:46:10,000 tako [0] v ids je številka 123, 852 00:46:10,000 --> 00:46:13,000 in jaz bom prevzela, da so imena [0] 853 00:46:13,000 --> 00:46:16,000 je ista oseba ime in hiše [0] 854 00:46:16,000 --> 00:46:21,000 je ista oseba hišo in tako naprej za vse različne nizi, ki sem ustvarjajo. 855 00:46:21,000 --> 00:46:24,000 Toda opazil, da ni bistvena povezava 856 00:46:24,000 --> 00:46:27,000 med temi 3 kosi informacij, id, ime in hiše, 857 00:46:27,000 --> 00:46:32,000 čeprav podjetje poskušamo modelom v tem programu, ni polja. 858 00:46:32,000 --> 00:46:35,000 Polja so le ta programski način za to. 859 00:46:35,000 --> 00:46:38,000 Kaj res želimo modelirati v našem programu je oseba 860 00:46:38,000 --> 00:46:41,000 kot David, osebo, kot je Rob znotraj katerega 861 00:46:41,000 --> 00:46:46,000 in vključujejo je ime in ID in hiša. 862 00:46:46,000 --> 00:46:49,000 >> Lahko smo nekako izraziti to idejo kapsuliranje 863 00:46:49,000 --> 00:46:52,000 pri čemer oseba, ki ima ID, ime in hišo 864 00:46:52,000 --> 00:46:55,000 in ne zatekajo k res to hack, s katerim smo pravkar 865 00:46:55,000 --> 00:46:58,000 zaupam, da je nosilec nekaj 866 00:46:58,000 --> 00:47:02,000 se sklicuje na isto človeško podjetja v vsakem od teh neskladnih nizi? 867 00:47:02,000 --> 00:47:04,000 Mi lahko dejansko narediti. 868 00:47:04,000 --> 00:47:08,000 Naj gredo nad glavno za zdaj, in mi ustvariti svoj lasten vrste podatkov 869 00:47:08,000 --> 00:47:10,000 za zelo prvič. 870 00:47:10,000 --> 00:47:14,000 Uporabili smo to tehniko v Scramble, 871 00:47:14,000 --> 00:47:17,000 ampak tukaj bom, da gredo naprej in ustvariti vrsto podatkov, 872 00:47:17,000 --> 00:47:19,000 In veš kaj, bom poklical, da študent ali oseba, 873 00:47:19,000 --> 00:47:23,000 in bom uporabila typedef za opredelitev vrste. 874 00:47:23,000 --> 00:47:25,000 Jaz bom rekel, da je to struktura, 875 00:47:25,000 --> 00:47:29,000 in potem je ta struktura bo študenta vrsti, bomo rekli, 876 00:47:29,000 --> 00:47:31,000 čeprav je malo zastarelo za mene. 877 00:47:31,000 --> 00:47:33,000 Bomo rekli "int id". 878 00:47:33,000 --> 00:47:35,000 Bomo rekli "niza ime." 879 00:47:35,000 --> 00:47:37,000 Potem bomo rekli "niz hišo," 880 00:47:37,000 --> 00:47:40,000 tako da zdaj do konca teh nekaj vrstic kode 881 00:47:40,000 --> 00:47:45,000 Pravkar sem učil Jek, da obstaja 882 00:47:45,000 --> 00:47:49,000 Podatkovni tip poleg ints, poleg nizov, poleg podvoji, poleg plovcev. 883 00:47:49,000 --> 00:47:54,000 >> Od tega trenutka v časovnem zaporedju 11, je zdaj nova vrsta podatkov pozval študente, 884 00:47:54,000 --> 00:47:58,000 zdaj pa izjavljam, študentsko spremenljivke kjerkoli želim, 885 00:47:58,000 --> 00:48:01,000 zato naj se pomaknite dol, da bi ljudi. 886 00:48:01,000 --> 00:48:05,000 Zdaj se lahko znebim tega, in sem lahko šel nazaj dol Davidu tukaj, 887 00:48:05,000 --> 00:48:10,000 in za Davida lahko dejansko rečemo, da David, 888 00:48:10,000 --> 00:48:13,000 lahko dobesedno ime spremenljivke po sebi, 889 00:48:13,000 --> 00:48:16,000 se bo študenta tipa. 890 00:48:16,000 --> 00:48:18,000 To lahko izgleda malo čudno, vendar to še ni vse, da je drugačna 891 00:48:18,000 --> 00:48:22,000 razglasi nekaj tako notr ali niz ali lopatico. 892 00:48:22,000 --> 00:48:24,000 Samo tako se zgodi, da se imenuje študent zdaj, 893 00:48:24,000 --> 00:48:28,000 in če želim dati nekaj znotraj te strukture 894 00:48:28,000 --> 00:48:31,000 Zdaj imam uporabiti nov del skladnje, vendar je zelo enostavno, 895 00:48:31,000 --> 00:48:39,000 david.id = 123, david.name = "David" v prestolnici D 896 00:48:39,000 --> 00:48:42,000 in david.house = "Mather" 897 00:48:42,000 --> 00:48:46,000 in sedaj ne morem znebiti te stvari tukaj. 898 00:48:46,000 --> 00:48:51,000 Obvestilo smo zdaj preoblikovali naš program res veliko boljši način 899 00:48:51,000 --> 00:48:54,000 v tem, da zdaj naš program, odraža resničnega sveta. 900 00:48:54,000 --> 00:48:57,000 >> Tam je v realnem svetu pojem osebe ali študenta. 901 00:48:57,000 --> 00:49:02,000 Tu imamo zdaj različice C osebe ali natančneje študenta. 902 00:49:02,000 --> 00:49:05,000 Znotraj te osebe so te značilnosti, 903 00:49:05,000 --> 00:49:10,000 ID, ime in hiše, tako da v bistvu Rob postane ista stvar tukaj, 904 00:49:10,000 --> 00:49:14,000 Tako študent rob, in zdaj rob.id = 456, 905 00:49:14,000 --> 00:49:17,000 rob.name = "Rob". 906 00:49:17,000 --> 00:49:20,000 Dejstvo, da je spremenljivka imenovan Rob je nekako nesmiselno. 907 00:49:20,000 --> 00:49:22,000 Lahko bi ga imenovali x ali y ali z. 908 00:49:22,000 --> 00:49:25,000 Pravkar smo ga poimenovali Rob, da je semantično dosledno, 909 00:49:25,000 --> 00:49:28,000 ampak res je ime notranjosti tem področju sama, 910 00:49:28,000 --> 00:49:30,000 tako da zdaj imam to. 911 00:49:30,000 --> 00:49:33,000 Tudi to ne zanima najboljši dizajn v tem, da sem težko kodirane Davida. 912 00:49:33,000 --> 00:49:35,000 Trdo sem kodirani Rob. 913 00:49:35,000 --> 00:49:39,000 In še vedno zateče k neki kopiraj in prilepi vsakič, ko hočem nove spremenljivke. 914 00:49:39,000 --> 00:49:43,000 Poleg tega moram očitno daje vsako od teh spremenljivk ime, 915 00:49:43,000 --> 00:49:46,000 čeprav sem veliko raje opisujejo te spremenljivke 916 00:49:46,000 --> 00:49:48,000  Več kot generično študentov. 917 00:49:48,000 --> 00:49:52,000 >> Sedaj lahko združila ideje, ki so bili dobro delajo za nas 918 00:49:52,000 --> 00:49:56,000 in namesto tega rekel: "Veš kaj, daj mi spremenljivko z imenom študentov, 919 00:49:56,000 --> 00:50:01,000 in naj bi bilo po velikosti 3 ", tako da zdaj lahko izboljšate to še dodatno, 920 00:50:01,000 --> 00:50:04,000 znebiti ročno prijavljenih Davidu 921 00:50:04,000 --> 00:50:08,000 in sem lahko rekla kaj takega, namesto študentov [0] tukaj. 922 00:50:08,000 --> 00:50:11,000 Ne morem reči, potem študente [0] tukaj 923 00:50:11,000 --> 00:50:14,000 študenti [0] tukaj, in tako naprej, in sem lahko šel okrog 924 00:50:14,000 --> 00:50:16,000 in čiščenje, da se na robu. 925 00:50:16,000 --> 00:50:19,000 Jaz bi tudi šel pa zdaj morda dodal zanko 926 00:50:19,000 --> 00:50:23,000 in uporabo GetString in GetInt dejansko dobil te vrednote od uporabnika. 927 00:50:23,000 --> 00:50:27,000 Lahko bi šla o dodajanju konstantna, saj je to na splošno slaba praksa 928 00:50:27,000 --> 00:50:29,000 na trdi oznako nekaj poljubnega števila kot 3 tukaj 929 00:50:29,000 --> 00:50:33,000 in potem samo ne pozabite, da morate dati največ 3 študentov v njem. 930 00:50:33,000 --> 00:50:36,000 Verjetno bi bilo bolje uporabiti # define na vrhu moje datoteke 931 00:50:36,000 --> 00:50:40,000 in dejavnik, ki ven, tako da res, mi gredo naprej in to posploševati. 932 00:50:40,000 --> 00:50:43,000 >> Naj odprejo primer, ki je med današnjo 933 00:50:43,000 --> 00:50:46,000 Primeri vnaprej, structs1. 934 00:50:46,000 --> 00:50:49,000 To je bolj celovit program, ki uporablja # define tukaj 935 00:50:49,000 --> 00:50:51,000 in pravi, da bomo imeli 3 študente privzeto. 936 00:50:51,000 --> 00:50:54,000 Tukaj sem razglasitvi razreda vredno študentov, 937 00:50:54,000 --> 00:50:57,000 Tako učilnica študentov, in zdaj sem z zanko 938 00:50:57,000 --> 00:51:00,000 samo, da je koda malo bolj elegantno, zapolnijo razred 939 00:51:00,000 --> 00:51:05,000 z močjo uporabnika, tako da izbirate od i = 0 na do študentov, kar je za 3. 940 00:51:05,000 --> 00:51:07,000 In potem sem pozval, si v tej različici 941 00:51:07,000 --> 00:51:10,000  kaj študenta ID, in sem jo dobil z GetInt. 942 00:51:10,000 --> 00:51:13,000 Kaj je ime študenta, potem pa sem dobil z GetString. 943 00:51:13,000 --> 00:51:15,000 Kako je študentsko hišo? Razumem z GetString. 944 00:51:15,000 --> 00:51:19,000 In potem na dnu tukaj sem se odločil zamenjati 945 00:51:19,000 --> 00:51:22,000 kako sem ti tiskanje, in dejansko uporabo zanke, 946 00:51:22,000 --> 00:51:24,000 In kdo sem jaz tisk? 947 00:51:24,000 --> 00:51:27,000 Glede na pripombo bom tiskanje koga v Mather, 948 00:51:27,000 --> 00:51:30,000 in da je tako Rob in Tommy in tako naprej, dejansko Tommy je v Mather. 949 00:51:30,000 --> 00:51:34,000 Tommy in David bodo natisnjeni v tem primeru, ampak kako se to dela? 950 00:51:34,000 --> 00:51:40,000 Nismo videli to funkcijo prej, vendar pa si ugibati, kaj to počne. 951 00:51:40,000 --> 00:51:42,000 Primerja niza. 952 00:51:42,000 --> 00:51:45,000 >> To je malo ni jasno, kako se primerja nize, saj se je izkazalo, 953 00:51:45,000 --> 00:51:49,000 če se vrne 0, ki pomeni niza sta enaka. 954 00:51:49,000 --> 00:51:53,000 Če se vrne -1, ki pomeni enega pride po abecedi pred drugim, 955 00:51:53,000 --> 00:51:57,000 in če se vrne 1, ki pomeni drugo besedo prihaja po abecedi 956 00:51:57,000 --> 00:52:00,000 pred drugo, si lahko ogledate na spletu ali na stran man 957 00:52:00,000 --> 00:52:04,000 natančno vidijo, kako je kateri, ampak vse to se počne sedaj je to govori 958 00:52:04,000 --> 00:52:09,000 če je [i]. hiša je enako "Mather" 959 00:52:09,000 --> 00:52:13,000 potem pojdi naprej in izpisal tako in tako je v Mather. 960 00:52:13,000 --> 00:52:16,000 Ampak tukaj je nekaj, kar še nismo videli, mi pa vam bomo vrnili k temu. 961 00:52:16,000 --> 00:52:21,000 Ne spomnim se, kdaj to storiti v kateri koli od mojih programov. 962 00:52:21,000 --> 00:52:24,000 Brezplačno se očitno nanaša na spomin, sprostitev pomnilnika, 963 00:52:24,000 --> 00:52:31,000 ampak kaj pomnilniško sem očitno sprostitev v to zanko na dnu tega programa? 964 00:52:31,000 --> 00:52:34,000 Izgleda, da sem sprostila ime osebe 965 00:52:34,000 --> 00:52:37,000 in za osebo, hiše, ampak zakaj je to? 966 00:52:37,000 --> 00:52:41,000 >> Izkazalo se je, vseh teh tednih, ki ste ga uporabljali GetString 967 00:52:41,000 --> 00:52:45,000 smo nekako uvajamo napako v vsakem od vaših programov. 968 00:52:45,000 --> 00:52:51,000 GetString za oblikovanje spomina razporedi tako, da se lahko vrne na vaš niza, 969 00:52:51,000 --> 00:52:55,000 tako kot David, ali Rob, potem pa lahko naredite kar hočeš 970 00:52:55,000 --> 00:52:59,000 s tem niza v programu, ker smo rezerviran pomnilnik za vas. 971 00:52:59,000 --> 00:53:02,000 Problem je ves ta čas vsakič, ko pokličete GetString 972 00:53:02,000 --> 00:53:05,000 smo avtorji GetString so bili sprašuje operacijski sistem 973 00:53:05,000 --> 00:53:07,000 da nam malo RAM-a za ta niz. 974 00:53:07,000 --> 00:53:09,000 Daj nam malo RAM-a za to naslednji niz. 975 00:53:09,000 --> 00:53:11,000 Dajte nam nekaj več RAM-a za to naslednji niz. 976 00:53:11,000 --> 00:53:13,000 Kaj pa, programer, nikoli počel 977 00:53:13,000 --> 00:53:15,000 Daje nam, da spomin nazaj, 978 00:53:15,000 --> 00:53:17,000 tako da teh nekaj tednov vse programe ste napisali 979 00:53:17,000 --> 00:53:20,000 imeli kaj se ti spomin preskok, pri čemer so še naprej uporabljate 980 00:53:20,000 --> 00:53:24,000 več pomnilnika vsakič, ko pokličeš GetString, in to je v redu. 981 00:53:24,000 --> 00:53:27,000 Namenoma smo storili v prvih tednih, saj to ni tako zanimivo 982 00:53:27,000 --> 00:53:29,000 morali skrbeti, če je niz prihaja. 983 00:53:29,000 --> 00:53:34,000 Vse kar želim je beseda Rob, da pridejo nazaj, ko uporabnik tipi palcev 984 00:53:34,000 --> 00:53:38,000 >> Toda napredek moramo zdaj začeti pridobivanje bolj prefinjene o tem. 985 00:53:38,000 --> 00:53:42,000 Vsak čas bomo dodeliti pomnilnika bolje sčasoma vrniti. 986 00:53:42,000 --> 00:53:45,000 V nasprotnem primeru v realnem svetu na vaš PC ali Mac boste morda morali občasno izkušen 987 00:53:45,000 --> 00:53:50,000 Simptomi, kjer je računalnik zaustavitev na koncu 988 00:53:50,000 --> 00:53:54,000 ali neumen, predenje žogo plaža je le zasedajo računalnika 989 00:53:54,000 --> 00:53:56,000 Celoten pozornosti in ne morete narediti stvari. 990 00:53:56,000 --> 00:54:00,000 To je mogoče pojasniti s poljubnim številom napak, vendar se v teh možnih napak 991 00:54:00,000 --> 00:54:03,000 so stvari, ki se imenuje spomin pušča, s katerim je nekdo, ki je napisal, da je kos programske opreme 992 00:54:03,000 --> 00:54:07,000 ga uporabljate, ni spomnil, da sprostite pomnilnik 993 00:54:07,000 --> 00:54:10,000 da je on ali ona vprašal operacijski sistem, 994 00:54:10,000 --> 00:54:14,000 ne uporabljate GetString, ker je to stvar CS50, vendar z uporabo podobne funkcije 995 00:54:14,000 --> 00:54:16,000 ki zaprosi za operacijski sistem za spomin. 996 00:54:16,000 --> 00:54:19,000 Če ste ali pa zajebal in dejansko ni nikoli vrnil, da je spomin 997 00:54:19,000 --> 00:54:24,000 simptom, ki se lahko, da program upočasni in zavira in upočasnjuje 998 00:54:24,000 --> 00:54:26,000 če se spomnite, da pokličete brezplačno. 999 00:54:26,000 --> 00:54:28,000 >> Vrnila se bova kdaj in zakaj bi vi imenovali brezplačno, 1000 00:54:28,000 --> 00:54:32,000 pa pojdimo naprej samo za dober ukrep, in poskusite z izvajanjem tega posebnega programa. 1001 00:54:32,000 --> 00:54:35,000 To je bil imenovan structs1, vnesite. 1002 00:54:35,000 --> 00:54:40,000 Naj gredo naprej in zagon 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 in vidimo Davida v Mather, Tommy je v Mather. 1005 00:54:50,000 --> 00:54:53,000 To je le malo sanity pregled, da program deluje. 1006 00:54:53,000 --> 00:54:56,000 No, na žalost, ta program je malo neprijetno, ker 1007 00:54:56,000 --> 00:55:00,000 Naredil sem vse, da se delo, sem tipkal v 9 različnih nizih, zadeti nastopiti, 1008 00:55:00,000 --> 00:55:04,000 je povedal, kdo je bil v Mather, a očitno sem vedel, kdo je bil v Mather že zato, ker sem jo vnesli. 1009 00:55:04,000 --> 00:55:07,000 Bilo bi lepo, če bi vsaj ta program je bolj kot baze podatkov 1010 00:55:07,000 --> 00:55:10,000 in dejansko spomni, kaj sem tipkal v 1011 00:55:10,000 --> 00:55:12,000 tako da ne bo nikoli več treba vnos teh študentov zapisov. 1012 00:55:12,000 --> 00:55:15,000 Mogoče je kot registrarial sistema. 1013 00:55:15,000 --> 00:55:21,000 >> To lahko storimo z uporabo te tehnike, znano kot vhodni datoteki / I, datoteke in izhod, 1014 00:55:21,000 --> 00:55:24,000 zelo splošen način rekel, kadarkoli želite prebrati, ali pisati datoteke 1015 00:55:24,000 --> 00:55:26,000 lahko to storite z določenim naborom funkcij. 1016 00:55:26,000 --> 00:55:29,000 Naj gredo naprej in odpreti ta primer structs2.c, 1017 00:55:29,000 --> 00:55:33,000 , ki je skoraj enaka, vendar pa poglejmo, kaj zdaj počne. 1018 00:55:33,000 --> 00:55:36,000 Na vrhu datoteke Izjavljam razred učencev. 1019 00:55:36,000 --> 00:55:38,000 Nato sem zapolnijo razred z močjo uporabnika, 1020 00:55:38,000 --> 00:55:41,000 Tako ti vrstic kode so natančno kot prej. 1021 00:55:41,000 --> 00:55:45,000 Potem, če sem se pomaknite navzdol, tukaj sem natisniti vsak, ki je v Mather samovoljno kot prej, 1022 00:55:45,000 --> 00:55:47,000 ampak to je zanimiva novost. 1023 00:55:47,000 --> 00:55:51,000 Te vrstice kode so novi in ​​uvajajo nekaj tukaj, 1024 00:55:51,000 --> 00:55:55,000 Datoteko, vsi pokrovčki, in je * tukaj kot dobro. 1025 00:55:55,000 --> 00:55:58,000 Naj prestavili sem, a * tukaj kot dobro. 1026 00:55:58,000 --> 00:56:00,000 >> Ta funkcija še nismo videli, fopen, 1027 00:56:00,000 --> 00:56:03,000 vendar to pomeni datoteko, odprto, tako da je posneto z njimi, 1028 00:56:03,000 --> 00:56:05,000 in to je nekaj, kar bomo vrnili v prihodnjih psets, 1029 00:56:05,000 --> 00:56:10,000 vendar ta postavka tu v bistvu odpre datoteko z imenom baze podatkov, 1030 00:56:10,000 --> 00:56:13,000 in je to posebej odpre tako, da lahko delajo, kar do njega? 1031 00:56:13,000 --> 00:56:15,000 [Neslišno-student] 1032 00:56:15,000 --> 00:56:19,000 V redu, torej "w" samo pomeni, da govori operacijski sistem 1033 00:56:19,000 --> 00:56:21,000 odpreti datoteke, tako da lahko pišem z njim. 1034 00:56:21,000 --> 00:56:23,000 Ne želim, da ga preberete. Ne želim, da samo gledaš. 1035 00:56:23,000 --> 00:56:26,000 Rad bi jo spremenili in dodali stvari, potencialno pa tudi za to, 1036 00:56:26,000 --> 00:56:28,000 in datoteka se bo imenujemo baze. 1037 00:56:28,000 --> 00:56:30,000 To bi lahko imenovali ničesar. 1038 00:56:30,000 --> 00:56:32,000 To bi lahko database.txt. To bi lahko bilo. Db. 1039 00:56:32,000 --> 00:56:37,000 To bi lahko bila beseda kot foo, vendar sem samovoljno odločil, da ime datoteke zbirke podatkov. 1040 00:56:37,000 --> 00:56:42,000 To je malo sanity preverjanje, da se bomo vrnili v zelo podrobno daljšem časovnem obdobju, 1041 00:56:42,000 --> 00:56:47,000 če fp za kazalec datoteke ni enaka NULL pomeni, da je vse v redu. 1042 00:56:47,000 --> 00:56:51,000 >> Skratka, deluje kot fopen včasih ne uspe. 1043 00:56:51,000 --> 00:56:53,000 Morda datoteka ne obstaja. Morda ste iz prostora na disku. 1044 00:56:53,000 --> 00:56:55,000 Morda nimate dovoljenja za to mapo, 1045 00:56:55,000 --> 00:56:58,000 tako da, če fopen vrne null nekaj slabega zgodilo. 1046 00:56:58,000 --> 00:57:02,000 Nasprotno, če fopen ne vrne null vse dobro 1047 00:57:02,000 --> 00:57:04,000 in lahko začnem pisati v to datoteko. 1048 00:57:04,000 --> 00:57:06,000 Tukaj je nov trik. 1049 00:57:06,000 --> 00:57:08,000 To je za zanko, ki je nad vsakim ponavljanjem mojih študentov, 1050 00:57:08,000 --> 00:57:10,000 in to izgleda tako podobni, kar smo počeli, 1051 00:57:10,000 --> 00:57:15,000 vendar je ta funkcija bratranec printf pozval ovrednotenj za datoteke printf, 1052 00:57:15,000 --> 00:57:18,000 in opazili, da je drugačen v samo 2 načina. 1053 00:57:18,000 --> 00:57:20,000 Ena, se začne z f namesto p, 1054 00:57:20,000 --> 00:57:23,000 nato pa svoj prvi argument je očitno, kaj? 1055 00:57:23,000 --> 00:57:25,000 [Dijaki] datotek. >> To je datoteka. 1056 00:57:25,000 --> 00:57:30,000 Ta stvar se imenuje fp, ki jih bomo na koncu draži narazen, kaj datoteka kazalec, 1057 00:57:30,000 --> 00:57:35,000 vendar za zdaj fp preprosto pomeni datoteko, ki sem jo odprli, 1058 00:57:35,000 --> 00:57:41,000 Tako ovrednotenj tukaj pravi tiskanje ID tega uporabnika do spisa, ne na zaslonu. 1059 00:57:41,000 --> 00:57:44,000 Tiskanje ime uporabnika do spisa, ni na zaslonu, 1060 00:57:44,000 --> 00:57:47,000 Hiša na datoteko, ne na zaslonu, nato pa sem, seveda, 1061 00:57:47,000 --> 00:57:50,000 zapre datoteko, nato pa dol brez spomina. 1062 00:57:50,000 --> 00:57:53,000 >> Edina razlika med to različico in različico 1 2 1063 00:57:53,000 --> 00:57:58,000 je uvedba fopen in to datoteko z * 1064 00:57:58,000 --> 00:58:01,000 in ta pojem ovrednotenj, tako da vidimo, kaj je končni rezultat. 1065 00:58:01,000 --> 00:58:03,000 Naj grem v mojo terminalskem oknu. 1066 00:58:03,000 --> 00:58:06,000 Naj teče structs2, vnesite. 1067 00:58:06,000 --> 00:58:09,000 Izgleda, da je vse v redu. Naj ponovitev 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, vnesite. 1070 00:58:19,000 --> 00:58:23,000 Izgleda, da je ravnala enako, če pa sem zdaj naredil ls 1071 00:58:23,000 --> 00:58:28,000 opažati datoteka je tukaj med vso svojo kodo, podatkovne baze, 1072 00:58:28,000 --> 00:58:32,000 tako da je odpreti to, gedit baze podatkov, in pogled na to. 1073 00:58:32,000 --> 00:58:34,000 To ni najbolj seksi formatov. 1074 00:58:34,000 --> 00:58:38,000 Res je en del črte podatkov na vrstico na linijo, 1075 00:58:38,000 --> 00:58:42,000 ampak tiste, ki uporabljajo Excel ali CSV datotek, ločene z vejico vrednosti, 1076 00:58:42,000 --> 00:58:47,000 Jaz bi vsekakor uporabiti ovrednotenj, namesto morda kaj takega 1077 00:58:47,000 --> 00:58:50,000 tako da sem lahko dejansko ustvarijo enakovredno Excelove datoteke 1078 00:58:50,000 --> 00:58:53,000 z ločitvijo stvari z vejicami, ne le novih linij. 1079 00:58:53,000 --> 00:58:56,000 >> V tem primeru, če bi jaz namesto tega uporabljajo vejice namesto nove proge 1080 00:58:56,000 --> 00:59:01,000 Jaz bi dobesedno odpreti to datoteko zbirke podatkov v Excelu, če bi namesto tega je bilo videti takole. 1081 00:59:01,000 --> 00:59:03,000 Skratka, zdaj, ko imamo moč pisati datoteke 1082 00:59:03,000 --> 00:59:07,000 lahko zdaj začnete trajnih podatkov, ohranjanje približno na disku 1083 00:59:07,000 --> 00:59:10,000 tako da lahko hranimo podatke, okoli spet in spet. 1084 00:59:10,000 --> 00:59:14,000 Obvestilo nekaj drugih stvari, ki so zdaj nekoliko bolj seznanjeni. 1085 00:59:14,000 --> 00:59:16,000 Na vrhu te datoteke C imamo typedef 1086 00:59:16,000 --> 00:59:21,000 ker smo želeli ustvariti vrsto podatkov, ki predstavlja besedo, 1087 00:59:21,000 --> 00:59:25,000 tako da je ta vrsta se imenuje Beseda, znotraj te strukture 1088 00:59:25,000 --> 00:59:27,000 to je malo Ljubitelj zdaj. 1089 00:59:27,000 --> 00:59:30,000 Zakaj je beseda sestavljena iz navidez matrike? 1090 00:59:30,000 --> 00:59:33,000 Kaj je beseda samo intuitivno? 1091 00:59:33,000 --> 00:59:35,000 >> To je niz znakov. 1092 00:59:35,000 --> 00:59:37,000 To je zaporedje znakov, back to back to back. 1093 00:59:37,000 --> 00:59:41,000 Črke v vseh kape zgodi, da se bomo poljubno rekli največja dolžina 1094 00:59:41,000 --> 00:59:44,000 vsake besede v slovarju, ki ga uporabljamo za Scramble. 1095 00:59:44,000 --> 00:59:46,000 Zakaj imam 1? 1096 00:59:46,000 --> 00:59:48,000 Null značaj. 1097 00:59:48,000 --> 00:59:51,000 Spomnimo se, ko sva primer Bananagrams smo potrebovali posebno vrednost 1098 00:59:51,000 --> 00:59:55,000 na koncu besede, da bi spremljali 1099 00:59:55,000 --> 00:59:59,000 o tem, kje je dejansko končalo besede, in kot problem niz specifikacij pravi 1100 00:59:59,000 --> 01:00:03,000 Tukaj smo povezuje z dano besedo boolean vrednost, 1101 01:00:03,000 --> 01:00:05,000 zastave, če se tako izrazim, resnična ali neresnična. 1102 01:00:05,000 --> 01:00:09,000 Ali ste našli to besedo že, saj se zavedamo 1103 01:00:09,000 --> 01:00:13,000 res potrebujemo način spomina ne samo, kaj beseda v Scramble 1104 01:00:13,000 --> 01:00:15,000 ampak, ali ti, človek, so ga našli 1105 01:00:15,000 --> 01:00:20,000 tako da če se najde besedo "je" ne moreš kar vnesite vnesite je, vstopiti, vnesite 1106 01:00:20,000 --> 01:00:23,000 in dobili 3 točke, 3 točke, 3 točke, 3 točke. 1107 01:00:23,000 --> 01:00:26,000 Želimo, da bi lahko na črno te besede, ki jih določa bool 1108 01:00:26,000 --> 01:00:29,000 se pravi, če je že našel, in da je zato 1109 01:00:29,000 --> 01:00:31,000 ga vnesli v tej strukturi. 1110 01:00:31,000 --> 01:00:35,000 >> Zdaj, tukaj v Scramble tam je ta druga struct imenuje slovar. 1111 01:00:35,000 --> 01:00:39,000 Odsotni tukaj je beseda typedef ker v tem primeru 1112 01:00:39,000 --> 01:00:43,000 smo morali zaobjeti idejo slovarju, 1113 01:00:43,000 --> 01:00:46,000 in slovar vsebuje cel kup besed, 1114 01:00:46,000 --> 01:00:49,000 kot je vsebovano v tem polju, in koliko od teh besed obstajajo? 1115 01:00:49,000 --> 01:00:51,000 No, karkoli že to imenujemo spremenljivka velikost pravi. 1116 01:00:51,000 --> 01:00:53,000 Vendar pa moramo samo 1 zbirko. 1117 01:00:53,000 --> 01:00:55,000 Ne potrebujemo vrsto podatkov, imenovano slovar. 1118 01:00:55,000 --> 01:00:58,000 Potrebujemo samo eno od njih, da se izkaže v C 1119 01:00:58,000 --> 01:01:03,000 da če ne boste rekli typedef, si rekel struct, nato pa znotraj zavitih oklepajih 1120 01:01:03,000 --> 01:01:05,000 daste spremenljivke, nato pa si dal ime. 1121 01:01:05,000 --> 01:01:09,000 To je razglasila 1 spremenljivko z imenom zbirko 1122 01:01:09,000 --> 01:01:11,000 ki je videti takole. 1123 01:01:11,000 --> 01:01:16,000 Nasprotno, te linije ustvarjajo enkratno podatkovno strukturo, imenovano beseda 1124 01:01:16,000 --> 01:01:19,000 da lahko ustvarite več kopij, tako kot smo ustvarili 1125 01:01:19,000 --> 01:01:22,000 več kopij študentov. 1126 01:01:22,000 --> 01:01:24,000 >> Kaj to končno omogočilo, da storimo? 1127 01:01:24,000 --> 01:01:30,000 Naj grem nazaj v, recimo, enostavnejši primer iz preprostejših časih, 1128 01:01:30,000 --> 01:01:34,000 in mi odpre, recimo, compare1.c. 1129 01:01:34,000 --> 01:01:38,000 Problem pri roki, je dejansko lupine nazaj 1130 01:01:38,000 --> 01:01:41,000 plast niz in začeti vzleta te vrste usposabljanja kolesa 1131 01:01:41,000 --> 01:01:44,000 ker se je izkazalo, da je niz ves ta čas 1132 01:01:44,000 --> 01:01:47,000 je, kot smo obljubili v 1 tednu res samo vzdevek, 1133 01:01:47,000 --> 01:01:51,000 sopomenka od CS50 knjižnico za nekaj, kar je malo več skrivnosten, 1134 01:01:51,000 --> 01:01:53,000 char *, in to smo videli zvezdo doslej. 1135 01:01:53,000 --> 01:01:55,000 To smo videli v kontekstu datotek. 1136 01:01:55,000 --> 01:01:59,000 >> Poglejmo zdaj vidite, zakaj smo se skrivali to podrobnost, že nekaj časa. 1137 01:01:59,000 --> 01:02:02,000 Tukaj je datoteka z imenom compare1.c, 1138 01:02:02,000 --> 01:02:07,000 in je očitno vpraša uporabnika za 2 nizih, s in t, 1139 01:02:07,000 --> 01:02:11,000 in potem poskuša primerjavo teh nizov za enakost v skladu 26, 1140 01:02:11,000 --> 01:02:14,000 in če si enaka pravi: "Vnesli ste isto stvar," 1141 01:02:14,000 --> 01:02:17,000 in če niso enaka pravi: "Ti vnesli različne stvari." 1142 01:02:17,000 --> 01:02:19,000 Naj gredo naprej in zagon programa. 1143 01:02:19,000 --> 01:02:23,000 Naj grem v mojo izvornega imenika, si compare1. To zbrati v redu. 1144 01:02:23,000 --> 01:02:25,000 Naj teče compare1. 1145 01:02:25,000 --> 01:02:27,000 Bom povečavo, vnesite. 1146 01:02:27,000 --> 01:02:29,000 Reci nekaj. Pozdravljeni. 1147 01:02:29,000 --> 01:02:32,000 Jaz bom povedal nekaj več. Pozdravljeni. 1148 01:02:32,000 --> 01:02:34,000 Jaz definitivno nisem tip različne stvari. 1149 01:02:34,000 --> 01:02:37,000 >> Naj poskusim še enkrat. Adijo. 1150 01:02:37,000 --> 01:02:40,000 Zagotovo ne razlikujejo, kaj se dogaja tukaj? 1151 01:02:40,000 --> 01:02:44,000 No, kaj v resnici se primerjajo v skladu 26? 1152 01:02:44,000 --> 01:02:46,000 [Neslišno-student] 1153 01:02:46,000 --> 01:02:49,000 Da, tako se je izkazalo, da je niz, vrsto podatkov, je malo belo laž. 1154 01:02:49,000 --> 01:02:53,000 Niz je char *, ampak kaj je char *? 1155 01:02:53,000 --> 01:02:56,000 Char *, kot pravijo, je kazalec, 1156 01:02:56,000 --> 01:03:00,000 in kazalec učinkovito naslov, 1157 01:03:00,000 --> 01:03:05,000 Vsota mesto v pomnilniku, in če se zgodi, da so vnesli v besedo, kot HALO, 1158 01:03:05,000 --> 01:03:08,000 spomnite iz prejšnjih razpravah godala 1159 01:03:08,000 --> 01:03:16,000 To je tako kot beseda Pozdravljeni. 1160 01:03:16,000 --> 01:03:19,000 Ne pozabite, da lahko zastopa beseda kot Pozdravljeni 1161 01:03:19,000 --> 01:03:22,000 kot niz znakov, kot je ta, 1162 01:03:22,000 --> 01:03:25,000 in nato še s posebnim znakom na koncu imenovana null značaj, 1163 01:03:25,000 --> 01:03:27,000 kot denotacije \. 1164 01:03:27,000 --> 01:03:29,000 Kaj je pravzaprav niz? 1165 01:03:29,000 --> 01:03:32,000 Vedite, da je to več kose pomnilnika 1166 01:03:32,000 --> 01:03:36,000 in v resnici, je konec vsega šele, ko pogledaš skozi celoten niz 1167 01:03:36,000 --> 01:03:38,000 išče zaradi posebnega značaja null. 1168 01:03:38,000 --> 01:03:41,000 Ampak, če je to kos pomnilnika iz spomina mojega računalnika, 1169 01:03:41,000 --> 01:03:44,000 kaj je samovoljno pravijo, da ta niz samo srečo, 1170 01:03:44,000 --> 01:03:47,000 in je dobil v samem začetku RAM mojega računalnika. 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 >> Ko sem rekel kaj takega GetString in jaz String s = GetString 1173 01:04:02,000 --> 01:04:04,000 kaj je bilo res vrnil? 1174 01:04:04,000 --> 01:04:08,000 V teh zadnjih nekaj tednih, je tisto, kar zares shranjeni v ih 1175 01:04:08,000 --> 01:04:13,000 Ni ta niz po sebi, ampak v tem primeru, kaj je bilo shranjeno, je 1176 01:04:13,000 --> 01:04:18,000 številka 0, ker tisto, kar v resnici počne GetString 1177 01:04:18,000 --> 01:04:20,000 se fizično ne vrne niz. 1178 01:04:20,000 --> 01:04:22,000 To sploh ni res, da konceptualno smiselna. 1179 01:04:22,000 --> 01:04:24,000 Kaj pa vrnitev številka. 1180 01:04:24,000 --> 01:04:28,000 Ta številka je naslov Pozdravljeni v spominu, 1181 01:04:28,000 --> 01:04:32,000 in niz je nato, če se lupine nazaj ta sloj, niz v resnici ne obstaja. 1182 01:04:32,000 --> 01:04:35,000 To je le poenostavitev v CS50 knjižnici. 1183 01:04:35,000 --> 01:04:38,000 >> To je res nekaj, kar ti char *. 1184 01:04:38,000 --> 01:04:41,000 Char smiselno, ker tisto, kar je beseda, kot HELLO? 1185 01:04:41,000 --> 01:04:44,000 No, to je niz znakov, niz znakov. 1186 01:04:44,000 --> 01:04:47,000 Char * pomeni naslov značaja, 1187 01:04:47,000 --> 01:04:50,000 kaj to pomeni, da vrne niz? 1188 01:04:50,000 --> 01:04:53,000 Lepo, enostaven način vračanja niz 1189 01:04:53,000 --> 01:04:57,000 je namesto poskušali ugotoviti, kako se vrniti na 5 ali 6 različnih bajtov 1190 01:04:57,000 --> 01:05:01,000 Naj se vrnem na naslov, ki bajt? 1191 01:05:01,000 --> 01:05:03,000 Prvi. 1192 01:05:03,000 --> 01:05:06,000 Z drugimi besedami, naj ti dam naslov znak v spomin. 1193 01:05:06,000 --> 01:05:10,000 To je tisto, char * pomeni, naslov enega samega znaka v pomnilniku. 1194 01:05:10,000 --> 01:05:12,000 Pokličite, da se variabilni s. 1195 01:05:12,000 --> 01:05:15,000 Shranjujte v ih, ki je predvsem naslov, ki sem ga samovoljno dejal 0, 1196 01:05:15,000 --> 01:05:19,000 samo, da se stvari preprosto, v resnici pa je na splošno večje število. 1197 01:05:19,000 --> 01:05:21,000 >> Čakaj malo. 1198 01:05:21,000 --> 01:05:23,000 Če ste le mi dali naslov prvega znaka, kako naj vem, kaj je naslov 1199 01:05:23,000 --> 01:05:25,000 v drugem, tretjem, četrtem in petem? 1200 01:05:25,000 --> 01:05:27,000 [Neslišno-student] 1201 01:05:27,000 --> 01:05:31,000 Vi samo vedeti, kje je konec niza je prek tega priročen trik, 1202 01:05:31,000 --> 01:05:35,000 tako da, ko boste uporabili nekaj podobnega printf, kaj printf dobesedno vzame za svoje trditve, 1203 01:05:35,000 --> 01:05:39,000 opozarjajo, da bomo uporabili to% s ogrado, nato pa preide v 1204 01:05:39,000 --> 01:05:41,000 spremenljivka, ki se skladiščijo niz. 1205 01:05:41,000 --> 01:05:47,000 Kaj ste res mimo, je naslov prvega značaj tega niza. 1206 01:05:47,000 --> 01:05:50,000 Printf nato uporabi za zanke ali while zanko po prejemu tega naslova, 1207 01:05:50,000 --> 01:05:53,000 na primer, 0, tako da mi to zdaj, 1208 01:05:53,000 --> 01:06:02,000 printf ("% s \ n", i); 1209 01:06:02,000 --> 01:06:07,000 Ko sem poklical printf ("% s \ n", i), kaj sem res zagotavlja printf s 1210 01:06:07,000 --> 01:06:13,000 je naslov prvega znaka v oklepajih, ki v tem primeru je samovoljno H. 1211 01:06:13,000 --> 01:06:16,000 >> Kako printf vem, kaj točno želite prikazati na zaslonu? 1212 01:06:16,000 --> 01:06:19,000 Oseba, ki izvaja printf izvaja while zanko ali za zanko 1213 01:06:19,000 --> 01:06:23,000 ki pravi, da se ta znak enak poseben značaj null? 1214 01:06:23,000 --> 01:06:25,000 Če ne, ga natisnete. Kaj pa tole? 1215 01:06:25,000 --> 01:06:28,000 Če ne natisniti, jo natisnite, jo natisnite, ga natisnete. 1216 01:06:28,000 --> 01:06:32,000 Oh, to je nekaj posebnega. Prekinite tiskanje in se vrniti na uporabnika. 1217 01:06:32,000 --> 01:06:35,000 In to dobesedno vse, kar se dogaja pod pokrovom motorja, 1218 01:06:35,000 --> 01:06:38,000 in to je veliko za prebavo v prvi dan v razredu, 1219 01:06:38,000 --> 01:06:43,000 ampak za zdaj je res gradnik vsega razumevanja 1220 01:06:43,000 --> 01:06:46,000 da se je dogajalo na notranji pomnilnik našega računalnika, 1221 01:06:46,000 --> 01:06:49,000 in na koncu bomo to draži narazen z malo pomoči 1222 01:06:49,000 --> 01:06:51,000 eno od naših prijateljev v Stanfordu. 1223 01:06:51,000 --> 01:06:56,000 >> Profesor Nick Parlante na Stanfordu je naredil to čudovito video zaporedje 1224 01:06:56,000 --> 01:06:58,000 iz vseh vrst različnih jezikih, ki so uvedle 1225 01:06:58,000 --> 01:07:00,000 ta mali Claymation znak Binky. 1226 01:07:00,000 --> 01:07:03,000 Glas boste kmalu slišali v samo nekaj Prikradati predogled 2. 1227 01:07:03,000 --> 01:07:05,000 je, da je za Stanford profesor, in ste dobili 1228 01:07:05,000 --> 01:07:07,000 Samo 5 ali 6 sekund tem zdaj, 1229 01:07:07,000 --> 01:07:09,000 ampak to je opomba, na katerem bomo danes sklepajo 1230 01:07:09,000 --> 01:07:11,000 in začel v sredo. 1231 01:07:11,000 --> 01:07:15,000 Dam kazalca Zabava z Binky, predogled. 1232 01:07:15,000 --> 01:07:18,000 [♪ ♪ Glasba] [Profesor Parlante] Hej, Binky. 1233 01:07:18,000 --> 01:07:21,000 Zbudi se. Čas je za zabavo kazalca. 1234 01:07:21,000 --> 01:07:24,000 [Binky] Kaj je to? Več o kazalci? 1235 01:07:24,000 --> 01:07:26,000 Oh, vrlina! 1236 01:07:26,000 --> 01:07:29,000 >> Mi vas bo v sredo. 1237 01:07:29,000 --> 01:07:32,000 [CS50.TV]