1 00:00:00,000 --> 00:00:02,000 [Powered by Google Translate] [Linggo 6] 2 00:00:02,000 --> 00:00:04,000 [David J. Malan] [Harvard University] 3 00:00:04,000 --> 00:00:08,000 [Ito ay CS50.] [CS50.TV] 4 00:00:08,000 --> 00:00:12,000 >> Ito ay CS50, at ito ay ang simula ng Linggo 6, 5 00:00:12,000 --> 00:00:16,000 kaya ng ilang mga bagong tool ay magagamit na ngayon para sa iyo upang samantalahin ng, 6 00:00:16,000 --> 00:00:19,000 ang unang na kung saan ay tinatawag na CS50 Estilo. 7 00:00:19,000 --> 00:00:22,000 Logro ay kung ikaw ay tulad ng sa akin o anumang ng Fellows pagtuturo, 8 00:00:22,000 --> 00:00:26,000 malamang na nakita mo ang isang programa na may estilo hitsura ng kaunti ng isang bagay tulad nito. 9 00:00:26,000 --> 00:00:30,000 Siguro simulan mo paggupit ilang mga sulok late sa gabi, o makikita mo haharapin ang mga ito sa ibang pagkakataon, 10 00:00:30,000 --> 00:00:32,000 at pagkatapos ng tf o CA ay sa panahon ng mga oras ng opisina. 11 00:00:32,000 --> 00:00:34,000 Pagkatapos ito ay mahirap para sa amin upang basahin. 12 00:00:34,000 --> 00:00:38,000 Well, ang code na ito syntactically tamang, at ito makatipon, at ito ay aktwal na patakbuhin. 13 00:00:38,000 --> 00:00:40,000 Ngunit ito ay talagang hindi isang 5 para sa estilo. 14 00:00:40,000 --> 00:00:45,000 >> Ngunit ngayon, kung pumunta kami sa direktoryong ito dito 15 00:00:45,000 --> 00:00:48,000 at mapansin na mayroon akong conditions2.c- 16 00:00:48,000 --> 00:00:55,000 at nagpatakbo ako ito bagong utos, style50, sa file na ito conditions2.c, Ipasok, 17 00:00:55,000 --> 00:00:57,000 mapapansin na ito alam sa akin na ito ay inilarawan sa pangkinaugalian. 18 00:00:57,000 --> 00:01:00,000 Gedit napansin na ang file ay nabago na sa disk, 19 00:01:00,000 --> 00:01:08,000 at kung i-click ko reload, ngayon ang lahat ng iyong mga problema ay awtomatiko. 20 00:01:08,000 --> 00:01:15,000 [Palakpakan] 21 00:01:15,000 --> 00:01:17,000 Na ang isa sa mga bagay na ginawa namin ito weekend. 22 00:01:17,000 --> 00:01:20,000 Mapagtanto na ito ay hindi lubos na pagsisisi dahil may mga code ilang 23 00:01:20,000 --> 00:01:23,000 na hindi lang ito ay upang stylize perpektong, 24 00:01:23,000 --> 00:01:26,000 ngunit Napagtanto ito ngayon ang isang tool na maaari mong samantalahin 25 00:01:26,000 --> 00:01:33,000 kung lamang sa maglinis ang ilan sa mga mas errantly inilagay kulot tirante at ang gusto. 26 00:01:33,000 --> 00:01:36,000 >> Ngunit mas nakakahimok ngayon ay CS50 Check. 27 00:01:36,000 --> 00:01:39,000 Sa CS50 Check, maaari mong aktwal na isagawa ang parehong mga pagsubok sa katumpakan 28 00:01:39,000 --> 00:01:42,000 sa iyong sariling code na ang mga Fellows ng pagtuturo ay magagawang. 29 00:01:42,000 --> 00:01:44,000 Ito ay isang command line utility na ay ngayon sa appliance 30 00:01:44,000 --> 00:01:46,000 sa lalong madaling gawin mo isang update50 ng bawat 31 00:01:46,000 --> 00:01:49,000 pset 4 pagtutukoy, at gamitin ito mahalagang tulad nito. 32 00:01:49,000 --> 00:01:51,000 Patakbuhin mo ang command check50. 33 00:01:51,000 --> 00:01:56,000 Pagkatapos pumasa ka sa isang argument ng linya ng command, o mas karaniwang kilala bilang isang lumipat o isang flag. 34 00:01:56,000 --> 00:01:58,000 Sa pangkalahatan, ang mga bagay na may gitling ay tinatawag na lumipat 35 00:01:58,000 --> 00:02:02,000 sa isang programa ng command line, kaya-c tinutukoy 36 00:02:02,000 --> 00:02:04,000 ang mga tseke na gusto mong patakbuhin. 37 00:02:04,000 --> 00:02:07,000 >> Ang mga pagsubok na gusto mong patakbuhin ang katangi-tangi na kinilala sa pamamagitan ng ang string na ito, 38 00:02:07,000 --> 00:02:10,000 2012/pset4/resize. 39 00:02:10,000 --> 00:02:13,000 Sa ibang salita, ito lamang ay isang arbitrary ngunit natatanging string 40 00:02:13,000 --> 00:02:18,000 na ginagamit namin para makilala ang mga pagsubok na kawastuhan pset 4. 41 00:02:18,000 --> 00:02:21,000 At pagkatapos mong tukuyin ang isang puwang na nakahiwalay na listahan ng mga file na nais mong i-upload 42 00:02:21,000 --> 00:02:24,000 sa CS50 Suriin para sa pagtatasa. 43 00:02:24,000 --> 00:02:29,000 Halimbawa, kung pumunta ako sa aking solusyon dito para resize.c- 44 00:02:29,000 --> 00:02:31,000 hayaan mo akong magbukas ng mas malaking terminal na window- 45 00:02:31,000 --> 00:02:42,000 at pumunta ako magpatuloy at patakbuhin sabihin nating check50-c 2012/pset4/resize, 46 00:02:42,000 --> 00:02:46,000 at pagkatapos kong magpatuloy at tukuyin ang mga pangalan ng file, 47 00:02:46,000 --> 00:02:49,000 resize.c, at pagkatapos ay pindutin ang Enter, compresses, 48 00:02:49,000 --> 00:02:53,000 ito upload, sumusuri, at Nabigo ko lang ng buong bungkos ng mga pagsubok. 49 00:02:53,000 --> 00:02:59,000 Ang isa sa pula sa kaliwang tuktok sabi na resize.c at bmp umiiral. 50 00:02:59,000 --> 00:03:01,000 Na ang test. Na ang tanong na hiniling namin. 51 00:03:01,000 --> 00:03:04,000 At masaya dahil ang sagot ay maling. 52 00:03:04,000 --> 00:03:08,000 Ang puting teksto sa ibaba nito sabi inaasahan bmp.h na umiiral, at lamang na Kasalanan ko. 53 00:03:08,000 --> 00:03:11,000 Nakalimutan ko ang upang i-upload ang mga ito, kaya kailangan ko upang i-upload ang parehong mga file, 54 00:03:11,000 --> 00:03:14,000 resize.c at bmp.h. 55 00:03:14,000 --> 00:03:17,000 Ngunit ngayon mapansin ang lahat ng iba pang mga pagsubok sa dilaw dahil hindi nila patakbuhin, 56 00:03:17,000 --> 00:03:21,000 at kaya ang SMILEY mukha vertical dahil siya alinma'y hindi masaya ni malungkot, 57 00:03:21,000 --> 00:03:25,000 ngunit mayroon kaming sa pagtutumpak na isyu sa pula bago tumakbo ang mga iba pang mga tseke ay. 58 00:03:25,000 --> 00:03:27,000 >> Hayaan akong ayusin ito. 59 00:03:27,000 --> 00:03:30,000 Hayaan akong mag-zoom out at muling patakbuhin ito, oras na ito na may bmp.h din 60 00:03:30,000 --> 00:03:34,000 sa command line, Ipasok, at ngayon kung lahat ng napupunta na rin, 61 00:03:34,000 --> 00:03:38,000 ito upang suriin at pagkatapos ay bumalik sa isang resulta ng hawakan ang iyong hininga- 62 00:03:38,000 --> 00:03:42,000 lahat ng berde, na nangangahulugan na ako ginagawa talagang na rin sa pset 4 sa ngayon. 63 00:03:42,000 --> 00:03:44,000 Maaari mong makita at magpakilala mula sa mapaglarawang teksto dito 64 00:03:44,000 --> 00:03:47,000 kung ano mismo ang ay sumubok kami. 65 00:03:47,000 --> 00:03:49,000 Sinubukan namin ang unang ko ang mga file ay umiiral? 66 00:03:49,000 --> 00:03:51,000 Pagkatapos ay sinubukan namin ang resize.c makatipon? 67 00:03:51,000 --> 00:03:58,000 Pagkatapos sumubok kami ay hindi ito baguhin ang laki ng isang 1x1 pixel BMP kapag n, ang resize kadahilanan, 1. 68 00:03:58,000 --> 00:04:01,000 Ngayon, kung mayroon kang mga ideya kung ano n ay, ikaw ay sa sandaling sumisid sa pset 4, 69 00:04:01,000 --> 00:04:04,000 ngunit lamang ay isang katinuan suriin upang tiyakin na hindi ka pagpapalit ng sukat 70 00:04:04,000 --> 00:04:08,000 isang imahe sa lahat kung ang resize kadahilanan ay 1. 71 00:04:08,000 --> 00:04:14,000 Kung, sa pamamagitan ng kaibahan, resizes isang 1x1 pixel sa isang 1x1 pixel BMP sa 2x2 tama 72 00:04:14,000 --> 00:04:19,000 kapag n ay 2, pagkatapos ay katulad, minahan bumubuo nang naaayon. 73 00:04:19,000 --> 00:04:22,000 >> Sa maikli, ito ay nilalayong, isa, gawin ang tumatawid ng daliri 74 00:04:22,000 --> 00:04:25,000 ng equation tama bago mo isumite ang iyong pset. 75 00:04:25,000 --> 00:04:28,000 -Alam sa iyo nang eksakto kung ano ang iyong tf ay madaling malaman 76 00:04:28,000 --> 00:04:30,000 kapag pumunta tungkol sa pagsusumite ng ilan ng mga set ng problema, 77 00:04:30,000 --> 00:04:34,000 at rin ang paturo pagganyak talaga upang ilagay 78 00:04:34,000 --> 00:04:37,000 ng pagkakataon sa harap mo upang na kapag alam mo ang walang pagsubok 79 00:04:37,000 --> 00:04:39,000 na may mga bug sa iyong code at pagsubok na hindi pumasa sa, 80 00:04:39,000 --> 00:04:43,000 maaari mong ilagay sa mas epektibong oras up harap upang malutas ang mga problema 81 00:04:43,000 --> 00:04:45,000 sa halip na mawala ang mga puntos, makakuha ng feedback mula sa iyong tf, 82 00:04:45,000 --> 00:04:48,000 at pagkatapos ay pumunta, "Ahh," tulad ng dapat kong naisip na out. 83 00:04:48,000 --> 00:04:50,000 Ngayon hindi bababa sa isang tool upang matulungan kang makahanap na. 84 00:04:50,000 --> 00:04:52,000 Hindi ito upang ituro kung saan ay ang bug, ngunit ito ay sabihin sa iyo 85 00:04:52,000 --> 00:04:54,000 kung ano ang palatandaan nito. 86 00:04:54,000 --> 00:04:57,000 >> Ngayon ay nauunawaan ang mga pagsubok na ito ay hindi kinakailangang malawakan. 87 00:04:57,000 --> 00:04:59,000 Lamang dahil makakakuha ka ng isang screen na puno ng berdeng SMILEY mukha 88 00:04:59,000 --> 00:05:02,000 ay hindi nangangahulugan na ang iyong code ay perpekto, ngunit ito nangangahulugan 89 00:05:02,000 --> 00:05:06,000 na nakapasa ito sa ilang mga pagsubok na inireseta ng spec. 90 00:05:06,000 --> 00:05:08,000 Minsan hindi namin ilabas ang mga tseke. 91 00:05:08,000 --> 00:05:10,000 Halimbawa, sinong may kagagawan, isa sa mga aspeto ng pset 4, 92 00:05:10,000 --> 00:05:15,000 ang uri ng disappointing kung kami magbibigay sa iyo ng 93 00:05:15,000 --> 00:05:18,000 ang sagot sa kung ano ito ay, at mayroong isang bilang ng mga paraan upang ipakita ang 94 00:05:18,000 --> 00:05:21,000 na ang tao sa ingay na pula. 95 00:05:21,000 --> 00:05:24,000 Spec ay palaging tinukoy sa hinaharap para sa pset 5 pasulong 96 00:05:24,000 --> 00:05:26,000 kung ano ang sumusuri ang umiiral para sa iyo. 97 00:05:26,000 --> 00:05:28,000 Mapapansin mo ito puting URL sa ibaba. 98 00:05:28,000 --> 00:05:30,000 Sa ngayon, ito ay lamang diagnostic output. 99 00:05:30,000 --> 00:05:33,000 Kung ikaw bisitahin ang URL na iyon, makakakuha ka ng isang buong grupo ng mabaliw, misteriyoso mensahe 100 00:05:33,000 --> 00:05:36,000 na isa kang upang tumingin sa pamamagitan ng, ngunit karamihan ito ay para sa mga tauhan ng 101 00:05:36,000 --> 00:05:41,000 upang maaari naming diagnose at i-debug ang mga bug sa check50 mismo. 102 00:05:41,000 --> 00:05:46,000 >> Nang walang linggal, sabihin ilipat sa kung saan kami tumigil. 103 00:05:46,000 --> 00:05:48,000 CS50 library na kinuha namin para sa ibinigay para sa ilang mga linggo, 104 00:05:48,000 --> 00:05:52,000 ngunit pagkatapos ay noong nakaraang linggo, nagsimula kaming pagbabalat pabalik isa ng ang mga layer nito. 105 00:05:52,000 --> 00:05:55,000 Nagsimula kami bukod string sa pabor ng kung ano ang sa halip? 106 00:05:55,000 --> 00:05:57,000 [Mag-aaral] magpasinda. 107 00:05:57,000 --> 00:05:59,000 Magpasinda *, na kung saan ay magpasinda * lahat ng oras na ito, 108 00:05:59,000 --> 00:06:03,000 ngunit ngayon ay hindi namin upang magpanggap na ito ay isang aktwal na data ng uri ng string. 109 00:06:03,000 --> 00:06:06,000 Sa halip, ito ay isang kasingkahulugan ng mga uri para sa pansamantalang trabaho *, 110 00:06:06,000 --> 00:06:09,000 at ang string ng isang pagkakasunud-sunod ng mga character, 111 00:06:09,000 --> 00:06:14,000 kaya bakit ang kabuluhan upang kumatawan ng mga string bilang magpasinda * s? 112 00:06:14,000 --> 00:06:20,000 Ano ang isang pansamantalang trabaho * kumatawan sa konteksto ng konseptong ito ng isang string? 113 00:06:20,000 --> 00:06:23,000 Oo. >> [Mag-aaral] Ang unang character. 114 00:06:23,000 --> 00:06:25,000 Magandang, ang unang character, ngunit hindi pa ang unang character. 115 00:06:25,000 --> 00:06:27,000 Ng [mga mag-aaral] Address. 116 00:06:27,000 --> 00:06:29,000 Magandang, ang address ng unang character. 117 00:06:29,000 --> 00:06:33,000 Ang lahat na kinakailangan upang kumakatawan sa isang string sa memorya ng isang computer 118 00:06:33,000 --> 00:06:36,000 ay ang natatanging address ng mga unang byte. 119 00:06:36,000 --> 00:06:38,000 Hindi mo na malaman kung gaano katagal ito ay 120 00:06:38,000 --> 00:06:42,000 dahil kung paano maaari mong malaman na ang dynamic? 121 00:06:42,000 --> 00:06:44,000 [Mag-aaral] String haba. 122 00:06:44,000 --> 00:06:48,000 Maaari mong tawagan ang haba ng string, mahusay, ngunit kung paano gumagana ang string haba? 123 00:06:48,000 --> 00:06:50,000 Ano ang gagawin? Oo. 124 00:06:50,000 --> 00:06:52,000 [Mag-aaral] Panatilihin ang pagpunta hanggang sa makuha mo ang mga null karakter. 125 00:06:52,000 --> 00:06:54,000 Oo, eksakto, ito lamang iterates na may para sa loop, habang loop, 126 00:06:54,000 --> 00:06:57,000 anumang mula * sa dulo, at sa dulo ay kinakatawan 127 00:06:57,000 --> 00:07:01,000 ng \ 0, ang tinatawag na nul karakter, nul, 128 00:07:01,000 --> 00:07:05,000 hindi malito null, na kung saan ay isang pointer, 129 00:07:05,000 --> 00:07:07,000 na kung saan ay sa pakikipag-usap muli ngayon. 130 00:07:07,000 --> 00:07:11,000 >> Peeled namin pabalik isang layer ng GetInt, at pagkatapos ay kinuha namin ang isang pagtingin sa GetString, 131 00:07:11,000 --> 00:07:14,000 at isipin ang na ang parehong mga function, o talagang, 132 00:07:14,000 --> 00:07:18,000 GetString, ay gamit ang isang tiyak na function na 133 00:07:18,000 --> 00:07:21,000 upang aktwal na-parse, na, basahin o pag-aralan, ang input ng user. 134 00:07:21,000 --> 00:07:25,000 At kung ano na ang mga bagong function na? 135 00:07:25,000 --> 00:07:27,000 Scanf o sscanf. Aktwal na ito ay sa loob ng ilang iba't ibang mga lasa. 136 00:07:27,000 --> 00:07:31,000 Mayroong scanf, may sscanf, may fscanf. 137 00:07:31,000 --> 00:07:35,000 Sa ngayon, bagaman, sabihin tumutok sa pinaka madali na isinalarawan, 138 00:07:35,000 --> 00:07:38,000 at ipaalam sa akin sige at buksan up sa appliance 139 00:07:38,000 --> 00:07:41,000 isang file na tulad nito, scanf1.c. 140 00:07:41,000 --> 00:07:43,000 Ito ay isang napaka-simpleng programa, 141 00:07:43,000 --> 00:07:46,000 ngunit ang isang bagay na hindi namin nagawa mo na 142 00:07:46,000 --> 00:07:48,000 nang walang tulong ng CS50 library. 143 00:07:48,000 --> 00:07:51,000 Ito ay nakakakuha ng isang int mula sa isang user. Paano ito gumagana? 144 00:07:51,000 --> 00:07:53,000 Well, sa linya 16 doon, 145 00:07:53,000 --> 00:07:56,000 mapansin na idedeklara namin ang isang int tinatawag x, at sa puntong ito sa kuwento, 146 00:07:56,000 --> 00:07:58,000 ano ang halaga ng x? 147 00:07:58,000 --> 00:08:00,000 [Hindi marinig na mag-aaral ng tugon] 148 00:08:00,000 --> 00:08:02,000 [David M.] Kanan, na nakakaalam, ilang basura halaga potensyal na, kaya sa 17, kami lang sabihin sa user 149 00:08:02,000 --> 00:08:06,000 bigyan ako ng isang numero, mangyaring, at hakbang 18 kung saan ito ay nakakakuha ng mga kawili-wiling. 150 00:08:06,000 --> 00:08:11,000 Mukhang Scanf upang humiram ng isang ideya mula sa printf na ito ay gumagamit ng mga code ng format sa mga panipi. 151 00:08:11,000 --> 00:08:13,000 % D ng kurso ng decimal numero. 152 00:08:13,000 --> 00:08:21,000 Ngunit kung bakit ako pagpasa sa & x sa halip ng x? 153 00:08:21,000 --> 00:08:24,000 Ang dating ay tama. Oo. 154 00:08:24,000 --> 00:08:26,000 [Hindi marinig na mag-aaral ng tugon] 155 00:08:26,000 --> 00:08:31,000 Eksakto, kung ang layunin ng programang ito, tulad ng pag-andar GetInt mismo, 156 00:08:31,000 --> 00:08:34,000 ay upang makakuha ng isang int mula sa user Maaari ba akong magpasa ng mga function 157 00:08:34,000 --> 00:08:38,000 ang lahat ng mga variable na gusto ko, ngunit kung hindi ko ipasa ang mga ito sa pamamagitan ng reference 158 00:08:38,000 --> 00:08:41,000 o sa pamamagitan ng address o sa pamamagitan ng pointer, ang lahat ng mga kasingkahulugan para sa mga layuning ngayon, 159 00:08:41,000 --> 00:08:46,000 ang function na ay walang kakayahan upang baguhin ang mga nilalaman ng variable na. 160 00:08:46,000 --> 00:08:49,000 Ito ay pumasa sa isang kopya tulad ng maraming surot na bersyon ng makipagpalitan 161 00:08:49,000 --> 00:08:51,000 na namin ang uusapang tungkol sa ilang beses ngayon. 162 00:08:51,000 --> 00:08:54,000 >> Ngunit sa halip, sa pamamagitan ng paggawa at x, literal ako pagpasa sa kung ano? 163 00:08:54,000 --> 00:08:57,000 [Mag-aaral] Ang address. >> Ang address ng x. 164 00:08:57,000 --> 00:09:01,000 Ito ay tulad ng pagguhit ng isang mapa para sa mga function na tinatawag na scanf at sinasabi dito, 165 00:09:01,000 --> 00:09:04,000 mga ito ay mga direksyon sa isang tipak ng memory sa computer 166 00:09:04,000 --> 00:09:07,000 na maaari kang pumunta-imbak ng ilang integer. 167 00:09:07,000 --> 00:09:10,000 Upang para sa sscanf sa ngayon gawin na 168 00:09:10,000 --> 00:09:13,000 ano operator, ano piraso ng syntax ito upang gamitin 169 00:09:13,000 --> 00:09:19,000 kahit na hindi namin makita ito dahil may ibang tao sinulat ni ang pagpapaganang ito? 170 00:09:19,000 --> 00:09:21,000 Sa ibang salita - kung ano ang na? 171 00:09:21,000 --> 00:09:23,000 [Mag-aaral] X basahin. 172 00:09:23,000 --> 00:09:27,000 Mayroong pagpunta sa ilang pagbabasa, ngunit lamang tungkol sa x dito. 173 00:09:27,000 --> 00:09:30,000 Kung ang scanf ay nakapasa sa address ng x, 174 00:09:30,000 --> 00:09:35,000 syntactically, ano operator ay sumunod na umiiral sa isang lugar 175 00:09:35,000 --> 00:09:38,000 sa loob ng scanf ng pagpapatupad upang scanf 176 00:09:38,000 --> 00:09:42,000 aktwal na magsulat ng isang numero ng 2 sa address na iyon? 177 00:09:42,000 --> 00:09:44,000 Oo, kaya ang *. 178 00:09:44,000 --> 00:09:47,000 Manariwa sa diwa na * aming dereference operator, na mahalagang ibig sabihin nito ay pumunta doon. 179 00:09:47,000 --> 00:09:50,000 >> Sa sandaling iyong ipinasa address, tulad ng kaso dito, 180 00:09:50,000 --> 00:09:53,000 scanf ay marahil-kung namin aktwal na tumingin sa buong source code nito- 181 00:09:53,000 --> 00:09:59,000 paggawa ng * x o ang katumbas sa aktwal na pumunta sa address na iyon at maglagay ng ilang mga halaga doon. 182 00:09:59,000 --> 00:10:02,000 Ngayon, bilang para sa kung paano scanf nakakakuha ng input mula sa keyboard, 183 00:10:02,000 --> 00:10:04,000 iwagayway namin ang aming mga kamay para sa ngayon. 184 00:10:04,000 --> 00:10:07,000 Lamang ipagpalagay na operating system ay nagbibigay-daan sa sscanf makipag-usap 185 00:10:07,000 --> 00:10:11,000 sa keyboard ng user, ngunit sa puntong ito sa ngayon sa linya 19, 186 00:10:11,000 --> 00:10:14,000 kapag lamang namin i-print ang mga x, tila ang kaso 187 00:10:14,000 --> 00:10:17,000 na scanf ilagay int sa x. 188 00:10:17,000 --> 00:10:19,000 Iyon mismo kung paano scanf gumagana, at isipin ang huling linggo 189 00:10:19,000 --> 00:10:25,000 na kung paano GetString at GetInt at ang iba pang mga pamilya ng mga function 190 00:10:25,000 --> 00:10:28,000 huli gumagana, kahit na may bahagyang pagkakaiba tulad sscanf, 191 00:10:28,000 --> 00:10:31,000 na nangangahulugan na i-scan ang isang string sa halip na ang keyboard. 192 00:10:31,000 --> 00:10:33,000 Ngunit sabihin tumagal ng isang pagtingin sa isang maliit na pagkakaiba ng ito. 193 00:10:33,000 --> 00:10:37,000 Sa scanf2, aktwal na ako screwed up. 194 00:10:37,000 --> 00:10:42,000 Ano ang mali-at ko bang itago ang mga komento na nagpapaliwanag ng maraming- 195 00:10:42,000 --> 00:10:47,000 kung ano ang mali sa programang ito, bersyon 2? 196 00:10:47,000 --> 00:10:55,000 Teknikal bilang posibleng oras na ito. 197 00:10:55,000 --> 00:10:57,000 Mukhang medyo magandang. 198 00:10:57,000 --> 00:11:03,000 Mabuti ito indent, ngunit- 199 00:11:03,000 --> 00:11:07,000 okay, kung paano tungkol sa sabihin pungusin ito sa mas maikling tanong? 200 00:11:07,000 --> 00:11:17,000 Linya 16. Ano ang paggawa sa linya 16 sa tumpak na ngunit teknikal na Ingles? 201 00:11:17,000 --> 00:11:20,000 Pagkuha ng kaunti mahirap. Oo, Michael. 202 00:11:20,000 --> 00:11:25,000 [Mag-aaral] ito na tumuturo sa ang unang titik ng isang string. 203 00:11:25,000 --> 00:11:27,000 >> Okay, malapit. Hayaan akong tweak na nang kaunti. 204 00:11:27,000 --> 00:11:33,000 Na tumuturo sa ang unang titik ng isang string, ang deklarasyon ng variable na tinatawag na buffer 205 00:11:33,000 --> 00:11:36,000 na magtuturo sa unang address ng isang string, 206 00:11:36,000 --> 00:11:39,000 o sa halip, na magtuturo higit na partikular sa isang pansamantalang trabaho. 207 00:11:39,000 --> 00:11:42,000 Pansinin na hindi ito aktwal na tumuturo kahit saan dahil walang operator sa pagtatalaga. 208 00:11:42,000 --> 00:11:46,000 Walang katumbas sign, kaya ang lahat ng ginagawa namin ay paglaan ng variable na tinatawag na buffer. 209 00:11:46,000 --> 00:11:49,000 Ito ay nangyayari sa 32 bit dahil ang isang pointer, 210 00:11:49,000 --> 00:11:52,000 at ang nilalaman ng buffer baka kalaunan 211 00:11:52,000 --> 00:11:57,000 ay naglalaman ng isang address ng isang pansamantalang trabaho, ngunit sa ngayon, kung ano ang buffer naglalaman? 212 00:11:57,000 --> 00:11:59,000 Ilang bogus, na nakakaalam, ang ilang mga halaga ng basura, 213 00:11:59,000 --> 00:12:03,000 dahil hindi pa namin tahasang nasimulan ito, kaya hindi namin dapat ipagpalagay anumang. 214 00:12:03,000 --> 00:12:06,000 Okay, kaya ngayon linya 17-ano ang linya 17? 215 00:12:06,000 --> 00:12:08,000 Siguro na magpainit up ito. 216 00:12:08,000 --> 00:12:10,000 Mga Kopya isang string, i-right? 217 00:12:10,000 --> 00:12:12,000 Mga Kopya String mangyaring. 218 00:12:12,000 --> 00:12:15,000 >> Linya 18 uri ng pamilyar na ngayon sa na lamang namin nakita ang isang pagkakaiba ng mga ito 219 00:12:15,000 --> 00:12:18,000 ngunit may isang iba't ibang mga format ng code, kaya sa ika-18 linya, 220 00:12:18,000 --> 00:12:23,000 kami ay nagsasabi sa scanf dito ang address ng isang tipak ng memorya. 221 00:12:23,000 --> 00:12:27,000 Gusto kong mong tumawag sa isang string, tulad ng ipinahiwatig ng% s, 222 00:12:27,000 --> 00:12:32,000 ngunit ang problema ay na hindi namin nagawa ang ilang mga bagay dito. 223 00:12:32,000 --> 00:12:35,000 Ano ang isa sa mga problema? 224 00:12:35,000 --> 00:12:38,000 [Mag-aaral] Ito ay sinusubukang sa dereference null pointer. 225 00:12:38,000 --> 00:12:41,000 Magandang, null o kung hindi man ay hindi kilala na mga payo. 226 00:12:41,000 --> 00:12:45,000 Ka handing scanf ng isang address, ngunit sinabi mo lang ng ilang sandali ang nakalipas 227 00:12:45,000 --> 00:12:49,000 na ang address na ilang basura halaga dahil hindi namin aktwal italaga ito sa anumang bagay, 228 00:12:49,000 --> 00:12:53,000 at kaya sinasabi mo sa scanf mabisa pumunta maglagay ng string dito, 229 00:12:53,000 --> 00:12:56,000 ngunit hindi namin alam kung saan dito pa ay, 230 00:12:56,000 --> 00:12:59,000 kaya hindi namin na aktwal na inilalaan memory para sa buffer. 231 00:12:59,000 --> 00:13:03,000 Bukod dito, kung ano ang hindi mo rin kahit na nagsasabi ng scanf? 232 00:13:03,000 --> 00:13:06,000 Ipagpalagay na ito ay isang tipak ng memorya, at ito ay hindi isang halaga ng basura, 233 00:13:06,000 --> 00:13:09,000 ngunit ka pa rin hindi na nagsasabi scanf bagay na mahalaga. 234 00:13:09,000 --> 00:13:12,000 [Mag-aaral] Saan aktwal na ito ay, ang ampersand. 235 00:13:12,000 --> 00:13:15,000 Ampersand, kaya sa kasong ito, ito ay okay. 236 00:13:15,000 --> 00:13:18,000 Dahil buffer na ipinahayag bilang isang pointer 237 00:13:18,000 --> 00:13:22,000 * piraso ng syntax, hindi namin kailangang gamitin ang ampersand 238 00:13:22,000 --> 00:13:25,000 dahil ito ay isang address, ngunit tingin ko Narinig ko ito dito. 239 00:13:25,000 --> 00:13:27,000 [Mag-aaral] gaano kalaki? 240 00:13:27,000 --> 00:13:29,000 Mabuti, hindi kami ay nagsasabi sa scanf kung gaano kalaki ang buffer ito, 241 00:13:29,000 --> 00:13:32,000 na nangangahulugan na kahit na kung buffer ay isang pointer, 242 00:13:32,000 --> 00:13:35,000 sinasabi namin scanf, ilagay ang isang string dito, 243 00:13:35,000 --> 00:13:38,000 ngunit dito 2 bytes, maaari itong 10 bytes, maaaring ito ay isang megabyte. 244 00:13:38,000 --> 00:13:41,000 Ang Scanf ay walang mga ideya, at dahil ito ay isang tipak ng memory 245 00:13:41,000 --> 00:13:43,000 siguro, ito ay hindi isang string pa. 246 00:13:43,000 --> 00:13:48,000 Lamang ito isang string sa sandaling sumulat ka ng mga character at \ 0 na tipak ng memory. 247 00:13:48,000 --> 00:13:51,000 Ngayon lang ilang tipak ng memorya. 248 00:13:51,000 --> 00:13:55,000 Scanf hindi alam kapag upang itigil ang sulat sa address na iyon. 249 00:13:55,000 --> 00:13:59,000 >> Kung manariwa sa diwa mo ang ilang mga halimbawa sa nakaraan kung saan ko random type sa keyboard 250 00:13:59,000 --> 00:14:03,000 sinusubukan sa pag-apaw ng buffer, at usapan natin sa Biyernes tungkol sa eksakto na. 251 00:14:03,000 --> 00:14:07,000 Kung ang isang kalaban sa paanuman injects sa iyong programa sa isang mas mas malaking salita 252 00:14:07,000 --> 00:14:10,000 o pangungusap o parirala ikaw ay umaasa maaari mong kumalat at maminsala 253 00:14:10,000 --> 00:14:13,000 isang tipak ng memorya, na maaaring magkaroon ng hindi magandang kahihinatnan, 254 00:14:13,000 --> 00:14:15,000 tulad ng pagkuha sa buong programa mismo. 255 00:14:15,000 --> 00:14:17,000 Kailangan naming ayusin ito sa paanuman. 256 00:14:17,000 --> 00:14:20,000 Hayaan akong mag-zoom out at pumunta sa bersyon 3 ng programang ito. 257 00:14:20,000 --> 00:14:22,000 Na ng kaunti mas mahusay. 258 00:14:22,000 --> 00:14:24,000 Sa ang bersyon na ito, mapansin ang pagkakaiba. 259 00:14:24,000 --> 00:14:27,000 Sa ika-16 linya, muli ako deklarasyon ng isang variable na tinatawag na buffer, 260 00:14:27,000 --> 00:14:29,000 ngunit ano ito ngayon? 261 00:14:29,000 --> 00:14:33,000 Isang array ng 16 karakter. 262 00:14:33,000 --> 00:14:36,000 Ito ay mabuti dahil nangangahulugan ito na maaari ko ngayon sabihin ng scanf 263 00:14:36,000 --> 00:14:39,000 dito ay isang aktwal na tipak ng memory. 264 00:14:39,000 --> 00:14:42,000 Maaari ka nang mag-isip ng array bilang payo na ngayon, 265 00:14:42,000 --> 00:14:44,000 kahit na hindi sila aktwal na katumbas. 266 00:14:44,000 --> 00:14:47,000 Makikita nila kumilos naiiba sa iba't ibang konteksto. 267 00:14:47,000 --> 00:14:50,000 Ngunit ito ay tiyak ang kaso na ang buffer ay tumutukoy sa 268 00:14:50,000 --> 00:14:53,000 16 magkadikit char dahil iyon ang array ng 269 00:14:53,000 --> 00:14:55,000 at para sa ilang mga linggo ngayon. 270 00:14:55,000 --> 00:14:59,000 >> Dito, sinasabi ako sa scanf narito ang isang tipak ng memory. 271 00:14:59,000 --> 00:15:01,000 Oras na ito, ito ay talagang isang tipak ng memory, 272 00:15:01,000 --> 00:15:07,000 ngunit bakit pa rin ang programang ito exploitable? 273 00:15:07,000 --> 00:15:11,000 Ano ang mali pa rin? 274 00:15:11,000 --> 00:15:14,000 Ko ang sinabi bigyan ako ng mga 16 bytes ngunit- 275 00:15:14,000 --> 00:15:16,000 [Mag-aaral] Ano kung type sa higit sa 16? 276 00:15:16,000 --> 00:15:20,000 Eksakto, kung ano ang kung ang mga uri ng user sa 17 character o 1700 character? 277 00:15:20,000 --> 00:15:23,000 Sa katunayan, sabihin makita kung hindi namin mai-biyahe sa paglipas ng pagkakamali na ito ngayon. 278 00:15:23,000 --> 00:15:25,000 Ito ay mas mahusay na ngunit hindi perpekto. 279 00:15:25,000 --> 00:15:28,000 Hayaan akong magpatuloy at patakbuhin ang gumawa scanf3 upang makatipon ng programang ito. 280 00:15:28,000 --> 00:15:34,000 Hayaan akong magpatakbo ng scanf3, String mangyaring: kumusta, at tila namin na okay. 281 00:15:34,000 --> 00:15:37,000 Hayaan akong subukan ang isang bahagyang mas mahaba, kumusta doon. 282 00:15:37,000 --> 00:15:42,000 Okay, sabihin ko kumusta doon kung paano ikaw ay ngayon, ang Enter. 283 00:15:42,000 --> 00:15:54,000 Pagkuha ng uri ng masuwerteng dito, sabihin kamustahin doon kung paano ikaw ay. 284 00:15:54,000 --> 00:15:56,000 Diyablo. 285 00:15:56,000 --> 00:16:03,000 Okay, kaya namin nakuha masuwerteng. Hayaan ang mga makita kung hindi namin maaaring ayusin ito. 286 00:16:03,000 --> 00:16:06,000 Hindi, ito ay hindi pagpunta sa ipaalam sa akin kopyahin. 287 00:16:06,000 --> 00:16:09,000 Natin subukan ito muli. 288 00:16:09,000 --> 00:16:12,000 Lahat ng karapatan, tumayo sa pamamagitan ng. 289 00:16:12,000 --> 00:16:20,000 Namin makita kung gaano katagal ang maaari kong magpanggap upang tumuon habang ginagawa ito. 290 00:16:20,000 --> 00:16:23,000 Diyablo. Na sa halip naaangkop, aktwal. 291 00:16:23,000 --> 00:16:26,000 Doon kami. 292 00:16:26,000 --> 00:16:30,000 Point ginawa. 293 00:16:30,000 --> 00:16:34,000 >> Ito, nakakahiya kahit na ito din ay, ito ay din isa sa mga mapagkukunan ng mahusay na pagkalito 294 00:16:34,000 --> 00:16:38,000 kapag pagsulat ng mga programa na may bug dahil manifest nila ang kanilang mga sarili 295 00:16:38,000 --> 00:16:40,000 lamang ito nang isang beses sa isang habang minsan. 296 00:16:40,000 --> 00:16:43,000 Katotohanan ay na kahit na ang iyong code ay ganap na pinaghiwa, 297 00:16:43,000 --> 00:16:46,000 maaaring ito lamang ganap na pinaghiwa-minsan 298 00:16:46,000 --> 00:16:49,000 dahil minsan, mahalagang kung ano ang mangyayari sa operating system allocates 299 00:16:49,000 --> 00:16:52,000 ng kaunti pa sa memory kaysa sa iyo na aktwal na kailangan para sa anumang dahilan, 300 00:16:52,000 --> 00:16:57,000 at kaya wala pang gumagamit ang memorya pagkatapos ng iyong tipak ng 16 na mga character, 301 00:16:57,000 --> 00:17:01,000 kaya kung pumunta sa 17, 18, 19, anumang, hindi tulad ng isang malaking deal. 302 00:17:01,000 --> 00:17:04,000 Ngayon, ang computer, kahit na ito ay hindi pag-crash ng sa puntong iyon, 303 00:17:04,000 --> 00:17:09,000 maaaring kalaunan gamitin byte numero 17 o 18 o 19 para sa iba pa, 304 00:17:09,000 --> 00:17:14,000 kung saan ay ituro ang iyong mga data na inilagay mo doon, kahit na labis mahaba, 305 00:17:14,000 --> 00:17:18,000 ay pagpunta upang makakuha ng mapapatungan potensyal na sa pamamagitan ng ilang mga iba pang mga function na. 306 00:17:18,000 --> 00:17:21,000 Hindi ito nangangahulugang mananatiling buo, 307 00:17:21,000 --> 00:17:23,000 ngunit hindi kinakailangang ito ay magdudulot ng seg kasalanan. 308 00:17:23,000 --> 00:17:26,000 Ngunit sa kasong ito, ibinigay ko sa wakas sapat na mga character 309 00:17:26,000 --> 00:17:29,000 na mahalagang ko Lumagpas sa aking segment ng memorya, at magdaya, 310 00:17:29,000 --> 00:17:33,000 operating system sinabing, "Paumanhin, hindi magandang, segmentation fault." 311 00:17:33,000 --> 00:17:38,000 >> At ipaalam sa makita ngayon kung ano ang nananatiling dito sa aking direktoryo- 312 00:17:38,000 --> 00:17:40,000 mapansin na mayroon akong ang file na ito dito, ang core. 313 00:17:40,000 --> 00:17:42,000 Pansinin na ito ay muli na tinatawag na core dump. 314 00:17:42,000 --> 00:17:46,000 Ito ay mahalagang isang file na naglalaman ng nilalaman ng memorya ng iyong programa 315 00:17:46,000 --> 00:17:48,000 sa punto kung saan ito nag-crash, 316 00:17:48,000 --> 00:17:51,000 at subukan ang isang maliit na halimbawa dito hayaan mo akong pumunta sa dito 317 00:17:51,000 --> 00:17:57,000 at patakbuhin ang gdb sa scanf3 at pagkatapos ay tukuyin ang isang third argument na tinatawag na core, 318 00:17:57,000 --> 00:18:01,000 at mapansin dito na kung ko bang ilista ang mga code, 319 00:18:01,000 --> 00:18:06,000 magagawa naming gaya ng dati may gdb upang simulan ang paglalakad sa pamamagitan ng programang ito, 320 00:18:06,000 --> 00:18:10,000 at maaari ba akong magpatakbo ng ito at sa lalong madaling panahon bilang ko pindutin bilang ang utos ng hakbang sa gdb- 321 00:18:10,000 --> 00:18:13,000 sa lalong madaling pindutin ko ang potensyal na maraming surot linya matapos ang pagta-type sa isang malaking string, 322 00:18:13,000 --> 00:18:16,000 Ko sa aktwal na kilalanin ang mga ito dito. 323 00:18:16,000 --> 00:18:19,000 Higit pa sa ito, bagaman, sa seksyon sa mga tuntunin ng lungkot core 324 00:18:19,000 --> 00:18:22,000 at ang gusto upang maaari mong aktwal sundutin sa paligid sa loob ng dump core 325 00:18:22,000 --> 00:18:27,000 at makita sa kung ano ang linya Nabigo ang programa mo. 326 00:18:27,000 --> 00:18:32,000 Anumang mga katanungan pagkatapos ay sa mga payo at sa mga address? 327 00:18:32,000 --> 00:18:36,000 Dahil ngayon sa, kami ay pagpunta upang simulan ang pagkuha para sa ipinagkaloob na ang mga bagay na ito umiiral 328 00:18:36,000 --> 00:18:40,000 at alam namin kung ano mismo ang mga ito. 329 00:18:40,000 --> 00:18:42,000 Oo. 330 00:18:42,000 --> 00:18:46,000 >> [Mag-aaral] Paano dumating hindi mo maglagay ng isang ampersand tabi sa bahagi- 331 00:18:46,000 --> 00:18:48,000 Magandang tanong. 332 00:18:48,000 --> 00:18:51,000 Paano dumating ako ay hindi maglagay ng isang ampersand sa tabi ng character array ng ginawa ko dati 333 00:18:51,000 --> 00:18:53,000 karamihan sa aming mga halimbawa? 334 00:18:53,000 --> 00:18:55,000 Ang maikling sagot ay array ng kaunti espesyal. 335 00:18:55,000 --> 00:18:59,000 Maaari ka nang tingin ng buffer ng aktwal na pagiging isang address, 336 00:18:59,000 --> 00:19:03,000 at ito lamang kaya mangyayari ang kaso na ang mga square bracket pagtatanda 337 00:19:03,000 --> 00:19:06,000 ay isang kaginhawahan upang maaari naming pumunta sa bracket 0, bracket 1, 338 00:19:06,000 --> 00:19:10,000 bracket 2, nang hindi kinakailangang gamitin ang * pagtatanda. 339 00:19:10,000 --> 00:19:13,000 Na ang isang bit ng isang maliit na kasinungalingan dahil array at pointer 340 00:19:13,000 --> 00:19:17,000 , sa katunayan, Medyo naiiba, ngunit maaaring sila madalas ngunit hindi laging magamit ng salitan. 341 00:19:17,000 --> 00:19:21,000 Sa maikling, kapag ang isang function na ay umaasa ng pointer sa isang tipak ng memorya, 342 00:19:21,000 --> 00:19:24,000 maaari mong ipasa ang mga ito ng isang address na ay ibinalik ng malloc, 343 00:19:24,000 --> 00:19:29,000 at kami na makita ang malloc muli mamaya, o maaari mong ipasa ang mga ito ang pangalan ng isang array. 344 00:19:29,000 --> 00:19:32,000 Hindi mo kailangang gawin ang ampersand may array dahil ang mga ito ay 345 00:19:32,000 --> 00:19:34,000 mahalagang i address. 346 00:19:34,000 --> 00:19:36,000 Iyon ay isang pagbubukod. 347 00:19:36,000 --> 00:19:39,000 Ang mga square bracket gawin silang espesyal na. 348 00:19:39,000 --> 00:19:41,000 >> Puwede bang maglagay ng isang ampersand susunod sa buffer? 349 00:19:41,000 --> 00:19:43,000 Hindi sa kasong ito. 350 00:19:43,000 --> 00:19:46,000 Na hindi gagana dahil, muli, ng kasong ito corner 351 00:19:46,000 --> 00:19:49,000 kung saan ang mga array ay hindi pa aktwal na address. 352 00:19:49,000 --> 00:19:54,000 Ngunit makikita marahil namin bumalik na bago mahaba sa iba pang mga halimbawa. 353 00:19:54,000 --> 00:19:56,000 Natin subukan upang malutas ang isang problema dito. 354 00:19:56,000 --> 00:20:00,000 Mayroon kaming isang istraktura ng data na aming ginagamit para sa ilang oras na kilala bilang isang array. 355 00:20:00,000 --> 00:20:02,000 Kaso sa point, kung ano lamang namin ay may. 356 00:20:02,000 --> 00:20:04,000 Ngunit array ay may ilang mga upsides at downsides. 357 00:20:04,000 --> 00:20:06,000 Array ay magaling bakit? 358 00:20:06,000 --> 00:20:11,000 Ano ang isang bagay na gusto sa iyo ang lawak na gusto mo array-tungkol array? 359 00:20:11,000 --> 00:20:13,000 Ano ang maginhawang tungkol sa mga ito? Ano ang nakapanghihimok? 360 00:20:13,000 --> 00:20:18,000 Bakit namin ipakilala ang mga ito sa unang lugar? 361 00:20:18,000 --> 00:20:20,000 Oo. 362 00:20:20,000 --> 00:20:27,000 [Mag-aaral] Maaari silang mag-imbak ng maraming data, at hindi mo na kailangang gamitin ang isang buong bagay. 363 00:20:27,000 --> 00:20:29,000 Maaari mong gamitin ang isang seksyon. 364 00:20:29,000 --> 00:20:32,000 Mabuti, na may isang array maaari kang mag-imbak ng maraming data, 365 00:20:32,000 --> 00:20:35,000 at hindi mo kinakailangang upang gamitin ang lahat ng ito, kaya maaari mong overallocate, 366 00:20:35,000 --> 00:20:39,000 na maaaring maging maginhawa kung hindi mo alam nang maaga kung gaano karami ng isang bagay sa inaasahan. 367 00:20:39,000 --> 00:20:41,000 >> GetString ay isang perpektong halimbawa. 368 00:20:41,000 --> 00:20:44,000 GetString, na nakasulat sa pamamagitan ng sa amin, ay walang mga ideya kung gaano karaming karakter ang aasahan, 369 00:20:44,000 --> 00:20:48,000 kaya ang katunayan na maaari naming magtalaga ng mga chunks ng magkadikit memory ay mabuti. 370 00:20:48,000 --> 00:20:51,000 Array rin malutas ang isang problema na nakita namin ng ilang linggo na ang nakakaraan ngayon 371 00:20:51,000 --> 00:20:54,000 kung saan ang iyong code ay nagsimulang upang malipat sa isang bagay na napaka mahinang dinisenyo. 372 00:20:54,000 --> 00:20:57,000 Manariwa sa diwa na nilikha ko ang isang mag-aaral ng istraktura na tinatawag na David, 373 00:20:57,000 --> 00:21:00,000 at pagkatapos na talagang isang alternatibong, bagaman, 374 00:21:00,000 --> 00:21:04,000 sa pagkakaroon ng isang variable na tinatawag na pangalan at isa pang variable na tinatawag na, tingin ko, ang bahay, 375 00:21:04,000 --> 00:21:08,000 at isa pang variable na tinatawag na ID dahil sa na kuwento pagkatapos ko nais upang ipakilala ang iba pa 376 00:21:08,000 --> 00:21:11,000 gusto Rob sa programa, kaya pagkatapos ko nagpasya maghintay ng isang minuto, 377 00:21:11,000 --> 00:21:13,000 Kailangan ko upang palitan ang pangalan ng mga variable na ito. 378 00:21:13,000 --> 00:21:16,000 Sabihin tumawag minahan NAME1, ID1, house1. 379 00:21:16,000 --> 00:21:20,000 Sabihin tumawag Rob ng NAME2, house2, ID2. 380 00:21:20,000 --> 00:21:22,000 Ngunit pagkatapos na maghintay ng isang minuto, kung ano ang tungkol sa Tommy? 381 00:21:22,000 --> 00:21:24,000 Pagkatapos kami ay may tatlong higit pang mga variable. 382 00:21:24,000 --> 00:21:27,000 Ipinakilala namin ang ibang tao, apat na hanay ng mga variable. 383 00:21:27,000 --> 00:21:30,000 Ang mundo ay nagsimula upang makakuha ng magulo masyadong mabilis, 384 00:21:30,000 --> 00:21:33,000 kaya ipinakilala namin structs, at kung ano ang nakapanghihimok tungkol sa isang struct? 385 00:21:33,000 --> 00:21:39,000 Ano ang isang C struct sabihin gagawin mo? 386 00:21:39,000 --> 00:21:42,000 Ito ay talagang mahirap ngayon. 387 00:21:42,000 --> 00:21:44,000 Ano? >> [Hindi marinig na mag-aaral tugon] 388 00:21:44,000 --> 00:21:47,000 Oo, partikular, typedef nagpapahintulot sa iyo na lumikha ng isang bagong uri ng data, 389 00:21:47,000 --> 00:21:51,000 at struct, ang struct keyword, ay nagbibigay-daan sa iyo upang encapsulate 390 00:21:51,000 --> 00:21:54,000 conceptually na may kaugnayan piraso ng data nang magkasama 391 00:21:54,000 --> 00:21:56,000 at pagkatapos noon ay tumawag sa kanila ng isang bagay tulad ng isang mag-aaral. 392 00:21:56,000 --> 00:21:58,000 >> Na ay mabuti dahil ngayon maaari naming modelo 393 00:21:58,000 --> 00:22:03,000 higit pa uri ng conceptually pare-pareho ang paniwala ng isang mag-aaral sa isang variable 394 00:22:03,000 --> 00:22:07,000 kaysa mang pagkakaroon ng isa para sa isang string, isa para sa isang ID, at iba pa. 395 00:22:07,000 --> 00:22:10,000 Array ay magaling dahil pinapayagan nila sa amin upang simulan ang paglilinis up ng aming code. 396 00:22:10,000 --> 00:22:13,000 Ngunit ano ang downside ngayon ng isang array? 397 00:22:13,000 --> 00:22:15,000 Ano ang hindi mo maaaring gawin? Oo. 398 00:22:15,000 --> 00:22:17,000 [Mag-aaral] Mayroon kang malaman kung gaano kalaki ito ay. 399 00:22:17,000 --> 00:22:19,000 Mong malaman kung gaano kalaki ito ay, sa gayon ito ay uri ng isang sakit. 400 00:22:19,000 --> 00:22:21,000 Yaong mo may bago programming karanasan alam na sa maraming wika, 401 00:22:21,000 --> 00:22:24,000 tulad ng Java, maaari mong hilingin sa isang tipak ng memorya, partikular na isang array, 402 00:22:24,000 --> 00:22:28,000 kung gaano kalaki ang sa iyo, na may haba, ari-arian, kaya na magsalita, at na talagang maginhawa. 403 00:22:28,000 --> 00:22:32,000 Sa C, hindi kahit ka maaaring tumawag strlen sa isang generic na array 404 00:22:32,000 --> 00:22:35,000 dahil strlen, ng salita ay nagpapahiwatig, ay para lamang sa string, 405 00:22:35,000 --> 00:22:39,000 at maaari mong malaman kung ang haba ng isang string dahil sa ito tao convention 406 00:22:39,000 --> 00:22:43,000 ng pagkakaroon ng \ 0, ngunit isang array, mas generically, ay isang tipak ng memorya. 407 00:22:43,000 --> 00:22:46,000 Kung ito ay isang array ng ints, mayroong pagpunta sa ilang mga espesyal na character 408 00:22:46,000 --> 00:22:48,000 sa dulo naghihintay para sa iyo. 409 00:22:48,000 --> 00:22:50,000 Mong matandaan ang haba ng array. 410 00:22:50,000 --> 00:22:54,000 Isa pang downside ng isang array reared ang ulo nito sa mismong GetString. 411 00:22:54,000 --> 00:22:59,000 Ano ang isa pang downside ng isang array? 412 00:22:59,000 --> 00:23:01,000 Sir, lamang sa iyo at sa akin ngayon. 413 00:23:01,000 --> 00:23:04,000 [Hindi marinig na mag-aaral tugon] >> Ito ay kung ano ang? 414 00:23:04,000 --> 00:23:06,000 Ito ay ipinahayag sa stack. 415 00:23:06,000 --> 00:23:09,000 Okay, ipinahayag sa stack. Bakit hindi mo gusto na? 416 00:23:09,000 --> 00:23:13,000 [Mag-aaral] Dahil ito ay makakakuha reused. 417 00:23:13,000 --> 00:23:15,000 Maipo reused. 418 00:23:15,000 --> 00:23:18,000 Okay, kung ikaw ay gumamit ng isang array upang magtalaga ng memory, 419 00:23:18,000 --> 00:23:21,000 hindi mo maaaring, halimbawa, ibalik ito dahil ito sa stack. 420 00:23:21,000 --> 00:23:23,000 Okay, na dehado. 421 00:23:23,000 --> 00:23:25,000 At kung paano tungkol sa isa pang may isang array? 422 00:23:25,000 --> 00:23:28,000 Sandaling maglaan ka, ikaw uri ng screwed kung kailangan mo ng karagdagang espasyo 423 00:23:28,000 --> 00:23:30,000 kaysa sa array na may. 424 00:23:30,000 --> 00:23:34,000 >> Pagkatapos ay ipinakilala namin, manariwa sa diwa, malloc, na nagbigay sa amin ng kakayahan upang dynamic na magtalaga ng memory. 425 00:23:34,000 --> 00:23:37,000 Ngunit ano kung sinubukan naming ng ibang mundo sa sama-sama? 426 00:23:37,000 --> 00:23:40,000 Paano kung gusto naming malutas ng ilang mga problema 427 00:23:40,000 --> 00:23:45,000 upang namin sa halip na aking panulat nahulog tulog dito- 428 00:23:45,000 --> 00:23:51,000 paano kung gusto namin sa halip sa mahalagang lumikha ng isang mundo na hindi na tulad nito? 429 00:23:51,000 --> 00:23:56,000 Ito ay isang array, at, siyempre, ang ganitong uri ng deteriorates sabay-sabay namin pindutin ang dulo ng array, 430 00:23:56,000 --> 00:24:00,000 at ako ngayon hindi na magkaroon ng espasyo para sa isa pang integer o isa pang character na. 431 00:24:00,000 --> 00:24:03,000 Paano kung namin uri ng preemptively sabihin na rin, bakit hindi namin mamahinga ang mga bisita 432 00:24:03,000 --> 00:24:07,000 ito kinakailangan na ang lahat ng mga chunks ng memory magkadikit na bumalik upang i-back, 433 00:24:07,000 --> 00:24:10,000 at bakit hindi, kapag kailangan ko ng isang int o isang pansamantalang trabaho, 434 00:24:10,000 --> 00:24:12,000 lamang ninyo akong bigyan ng espasyo para sa isa sa mga ito? 435 00:24:12,000 --> 00:24:14,000 At kapag kailangan ko ng isa pang, bigyan ako ng isa pang espasyo, 436 00:24:14,000 --> 00:24:16,000 at kapag kailangan ko ng isa pang, bigyan ako ng isa pang espasyo. 437 00:24:16,000 --> 00:24:19,000 Ang kalamangan na kung saan ngayon na kung ibang tao 438 00:24:19,000 --> 00:24:21,000 tumatagal ang memory sa paglipas dito, hindi sang-ayon. 439 00:24:21,000 --> 00:24:25,000 Kukunin ko ang karagdagang tipak ng memory dito at pagkatapos ay ang isang ito. 440 00:24:25,000 --> 00:24:28,000 >> Ngayon, ang tanging catch dito ay na ito halos nararamdaman tulad ng mayroon akong 441 00:24:28,000 --> 00:24:30,000 isang buong grupo ng mga iba't ibang mga variable. 442 00:24:30,000 --> 00:24:33,000 Ito nararamdaman tulad ng limang iba't ibang mga variable potensyal. 443 00:24:33,000 --> 00:24:36,000 Ngunit ano kung magnakaw namin ng isang ideya mula sa mga string 444 00:24:36,000 --> 00:24:41,000 kung saan sa paanuman namin link mga bagay na ito nang sama-sama conceptually, at paano kung ginawa ko ito? 445 00:24:41,000 --> 00:24:44,000 Ito ang aking napaka-mahina iguguhit arrow. 446 00:24:44,000 --> 00:24:46,000 Ngunit ipagpalagay na ang bawat isa sa mga chunks ng memory 447 00:24:46,000 --> 00:24:52,000 tulis sa isa, at ang tao na ito, na may walang kapatid sa kanyang karapatan, 448 00:24:52,000 --> 00:24:54,000 ay walang tulad arrow. 449 00:24:54,000 --> 00:24:56,000 Ito ay sa katunayan kung ano ang tinatawag na naka-link listahan. 450 00:24:56,000 --> 00:25:00,000 Ito ay isang bagong istraktura ng data na nagbibigay-daan sa amin upang magtalaga ng isang tipak ng memory, 451 00:25:00,000 --> 00:25:03,000 pagkatapos ng isa pang, pagkatapos ng isa pang, pagkatapos ng isa pang, anumang oras nais naming 452 00:25:03,000 --> 00:25:07,000 panahon ng isang programa, at tandaan namin na hindi lahat ng mga ito sa paanuman kaugnay 453 00:25:07,000 --> 00:25:11,000 ng literal chaining iyon nang magkakasama, at ginawa namin na pictorially dito na may isang arrow. 454 00:25:11,000 --> 00:25:15,000 Ngunit sa code, kung ano ay ang mekanismo sa pamamagitan ng na maaari mong sa paanuman kumonekta, 455 00:25:15,000 --> 00:25:20,000 halos tulad ng simula, isang tipak sa ibang tipak? 456 00:25:20,000 --> 00:25:22,000 Maaari kaming gumamit ng pointer, i-right? 457 00:25:22,000 --> 00:25:25,000 Dahil talaga ang arrow na ng pagpunta mula sa tuktok na kaliwang parisukat, 458 00:25:25,000 --> 00:25:31,000 ito tao dito sa isang ito, maaaring maglaman sa loob ng square na ito 459 00:25:31,000 --> 00:25:34,000 hindi lamang ang ilang mga ints, hindi lamang ang ilang mga pansamantalang trabaho, ngunit kung ano kung ako aktwal na inilaan 460 00:25:34,000 --> 00:25:37,000 isang maliit na dagdag na espasyo upang ang ngayon, 461 00:25:37,000 --> 00:25:41,000 sa bawat isa sa aking mga chunks ng memory, kahit na ito ay pagpunta sa gastos sa akin, 462 00:25:41,000 --> 00:25:45,000 ngayon mukhang ng kaunti pa sa hugis-parihaba kung saan isa ng chunks ng memory 463 00:25:45,000 --> 00:25:47,000 ay ginagamit para sa isang numero, tulad ng numero 1, 464 00:25:47,000 --> 00:25:50,000 at pagkatapos ay kung ang tao na ito nag-iimbak ang bilang 2, 465 00:25:50,000 --> 00:25:52,000 ang iba pang mga tipak ng memorya ay ginagamit para sa isang arrow, 466 00:25:52,000 --> 00:25:54,000 o mas concretely, isang pointer. 467 00:25:54,000 --> 00:25:59,000 At ipagpalagay ko imbak ang bilang 3 sa dito habang ginagamit ko ito upang ituro sa tao na, 468 00:25:59,000 --> 00:26:02,000 at ngayon ang tao na ito, sabihin ipagpalagay na gusto ko lang tatlong tulad chunks ng memorya. 469 00:26:02,000 --> 00:26:05,000 Ako gumuhit ng linya sa pamamagitan ng na, na nagpapahiwatig null. 470 00:26:05,000 --> 00:26:07,000 May ay walang karagdagang character. 471 00:26:07,000 --> 00:26:10,000 >> Sa katunayan, ito ay kung paano namin pumunta tungkol sa pagpapatupad 472 00:26:10,000 --> 00:26:12,000 isang bagay na tinatawag na naka-link listahan. 473 00:26:12,000 --> 00:26:18,000 Isang naka-link na listahan ay isang bagong istraktura ng data, at ito ay isang stepping bato patungo sa 474 00:26:18,000 --> 00:26:21,000 mas may interes mga istraktura ng data na nagsisimula sa paglutas ng mga problema 475 00:26:21,000 --> 00:26:23,000 sa kahabaan ng linya ng Facebook-uri ng mga problema at Google-uri problema 476 00:26:23,000 --> 00:26:26,000 kung saan mayroon kang malaking hanay ng data, at hindi na mapuputol ito 477 00:26:26,000 --> 00:26:29,000 upang mag-imbak ang lahat contiguously at gamitin ang isang bagay tulad ng linear paghahanap 478 00:26:29,000 --> 00:26:31,000 o kahit na isang bagay tulad ng binary paghahanap. 479 00:26:31,000 --> 00:26:33,000 Gusto mong mas mahusay na mga panahon ng pagtakbo. 480 00:26:33,000 --> 00:26:37,000 Sa katunayan, isa ng Banal na Grails magpapadala kami makipag-usap tungkol sa ibang pagkakataon sa linggong ito o sa susunod na 481 00:26:37,000 --> 00:26:41,000 ay isang algorithm na tumatakbo ang oras ay pare-pareho. 482 00:26:41,000 --> 00:26:44,000 Sa ibang salita, ito laging tumatagal ang parehong dami ng oras kahit 483 00:26:44,000 --> 00:26:47,000 kung gaano kalaki ang input, at na sa katunayan ay nakapanghihimok, 484 00:26:47,000 --> 00:26:49,000 mas ito kaysa sa isang bagay logarithmic. 485 00:26:49,000 --> 00:26:51,000 Ano ito sa screen dito? 486 00:26:51,000 --> 00:26:55,000 Ang bawat isa ng parihaba ay kung ano mismo ang ko lang iginuhit sa pamamagitan ng kamay. 487 00:26:55,000 --> 00:26:59,000 Subalit ang bagay na ang lahat ng mga paraan sa kaliwa ay isang espesyal na variable. 488 00:26:59,000 --> 00:27:02,000 Ito ay upang maging isang solong pointer dahil ang gotcha 489 00:27:02,000 --> 00:27:04,000 na may naka-link na listahan, ng mga bagay na ito ay tinatawag na, 490 00:27:04,000 --> 00:27:09,000 na mayroon kang mag-hang patungo sa daloy ng mga sasakyan sa isang dulo ng naka-link na listahan. 491 00:27:09,000 --> 00:27:13,000 >> Tulad ng isang string, mayroon kang malaman ang address ng unang magpasinda. 492 00:27:13,000 --> 00:27:15,000 Parehong deal para sa mga naka-link na listahan. 493 00:27:15,000 --> 00:27:19,000 Mong malaman ang address ng unang tipak ng memory 494 00:27:19,000 --> 00:27:25,000 dahil mula doon, maaari mong maabot ang bawat iba pang mga. 495 00:27:25,000 --> 00:27:27,000 Downside. 496 00:27:27,000 --> 00:27:30,000 Ano ang presyo ay namin nagbabayad para sa masaklaw na karunungan ng pagkakaroon ng isang dynamic na 497 00:27:30,000 --> 00:27:34,000 malaki data ng istraktura na kung kailangan namin ng higit pang memory, fine, 498 00:27:34,000 --> 00:27:37,000 lamang magtalaga ng isa pang tipak at gumuhit ng isang pointer mula sa 499 00:27:37,000 --> 00:27:39,000 ang lumang sa bagong buntot ng listahan? 500 00:27:39,000 --> 00:27:41,000 Oo. 501 00:27:41,000 --> 00:27:43,000 [Mag-aaral] tumatagal tungkol sa dalawang beses ng mas maraming espasyo. 502 00:27:43,000 --> 00:27:45,000 Ito ay tumatagal ng dalawang beses ng mas maraming espasyo, kaya na talagang isang downside, at nasaksihan namin ito 503 00:27:45,000 --> 00:27:48,000 tradeoff bago sa pagitan ng oras at espasyo at kakayahang umangkop 504 00:27:48,000 --> 00:27:51,000 kung saan sa ngayon, hindi kailangan namin 32 piraso para sa bawat isa sa mga numerong ito. 505 00:27:51,000 --> 00:27:57,000 Namin talagang kailangan 64, 32 para sa numero at 32 para sa pointer. 506 00:27:57,000 --> 00:27:59,000 Ngunit hey, mayroon akong 2 gigabytes ng RAM. 507 00:27:59,000 --> 00:28:02,000 Ang pagdadagdag ng isa pang 32 bit dito at dito ay mukhang hindi na malaki ng isang pakikitungo. 508 00:28:02,000 --> 00:28:05,000 Ngunit para sa malaking hanay ng data, tiyak na nagdadagdag ng hanggang sa literal dalawang beses bilang magkano. 509 00:28:05,000 --> 00:28:09,000 Ano ang isa pang downside ngayon, o kung ano ang tampok na naming magbigay ng, 510 00:28:09,000 --> 00:28:12,000 kung kumakatawan namin ang listahan ng mga bagay na may naka-link na listahan at hindi isang array? 511 00:28:12,000 --> 00:28:14,000 [Mag-aaral] Hindi ka maaaring pagbagtas ito paurong. 512 00:28:14,000 --> 00:28:16,000 Hindi ka maaaring pagbagtas ito pabalik, kaya ikaw uri ng screwed kung ikaw ay naglalakad 513 00:28:16,000 --> 00:28:19,000 mula kaliwa hanggang kanang gamit ang isang para sa loop o habang loop 514 00:28:19,000 --> 00:28:21,000 at pagkatapos ay natanto, "Oh, gusto ko upang bumalik sa simula ng listahan." 515 00:28:21,000 --> 00:28:26,000 Hindi ka maaaring dahil ang mga payo lamang mula kaliwa papuntang kanan bilang Ipinapahiwatig ng mga arrow. 516 00:28:26,000 --> 00:28:29,000 >> Ngayon, maaari mong tandaan ang simula ng listahan sa isa pang variable, 517 00:28:29,000 --> 00:28:31,000 ngunit na ng pagiging kumplikado upang tandaan. 518 00:28:31,000 --> 00:28:35,000 Isang array, kahit gaano kalayo kang pumunta, maaari mong laging gawin minus, minus, minus, minus 519 00:28:35,000 --> 00:28:37,000 at bumalik mula sa kung saan ka dumating. 520 00:28:37,000 --> 00:28:40,000 Ano ang isa pang downside dito? Oo. 521 00:28:40,000 --> 00:28:43,000 [Hindi marinig na mag-aaral tanong] 522 00:28:43,000 --> 00:28:47,000 Maaari mong, kaya aktwal na iyong lang iminungkahi ng data ng istraktura tinatawag ng doble-link sa listahan, 523 00:28:47,000 --> 00:28:50,000 at sa katunayan, nais mong magdagdag ng isa pang pointer sa bawat isa ng mga parihaba 524 00:28:50,000 --> 00:28:53,000 na napupunta sa iba pang mga direksyon, ang bentahe ng 525 00:28:53,000 --> 00:28:55,000 ngayon ay maaari mong pagbagtas papunta at pabalik, 526 00:28:55,000 --> 00:28:59,000 ngayon ang downside kung saan ka gumagamit ng tatlong beses bilang maraming memorya bilang ginamit namin upang 527 00:28:59,000 --> 00:29:04,000 at din ng pagdaragdag hirap sa mga tuntunin ng code mayroon kang sumulat ito ng tama. 528 00:29:04,000 --> 00:29:08,000 Ngunit ito ay ang lahat marahil napaka-makatwirang tradeoffs, kung ang pagkabaligtad ay mas mahalaga. 529 00:29:08,000 --> 00:29:10,000 Oo. 530 00:29:10,000 --> 00:29:12,000 [Mag-aaral] Hindi mo rin maaaring magkaroon ng isang 2D na naka-link listahan. 531 00:29:12,000 --> 00:29:16,000 Mabuti, hindi ikaw talaga ay maaaring magkaroon ng isang 2D na naka-link na listahan. 532 00:29:16,000 --> 00:29:18,000 Maaari mong. Ito ay hindi halos bilang madaling bilang isang array. 533 00:29:18,000 --> 00:29:21,000 Tulad ng isang array, gawin mo open bracket, closed bracket, bukas bracket, sarado bracket, 534 00:29:21,000 --> 00:29:23,000 at makakakuha ka ng ilang mga 2-dimensional na istraktura. 535 00:29:23,000 --> 00:29:26,000 Maaari mong ipatupad ang 2-dimensional na naka-link na listahan 536 00:29:26,000 --> 00:29:29,000 kung gagawin mo add-bilang iminungkahi-isang third pointer sa bawat isa sa mga bagay na ito, 537 00:29:29,000 --> 00:29:34,000 at kung sa tingin mo tungkol sa isa pang listahan darating sa 3D estilo 538 00:29:34,000 --> 00:29:40,000 mula sa screen sa lahat sa atin, na lamang ng isa pang hanay ng mga uri. 539 00:29:40,000 --> 00:29:45,000 Maaari namin gawin ito, ngunit ito ay hindi kasing simple ng pag-type ng open bracket, square bracket. Oo. 540 00:29:45,000 --> 00:29:48,000 [Hindi marinig na mag-aaral tanong] 541 00:29:48,000 --> 00:29:50,000 Mabuti, kaya ito ay isang tunay na kabayong naninipa. 542 00:29:50,000 --> 00:29:54,000 >> Mga algorithm na kami pined sa paglipas ng, tulad ng oh, binary paghahanap, 543 00:29:54,000 --> 00:29:57,000 maaari kang maghanap ng isang hanay ng mga numero sa board 544 00:29:57,000 --> 00:30:01,000 o phone book upang mas mabilis kung gumamit ka hatiin at lupigin 545 00:30:01,000 --> 00:30:05,000 at binary paghahanap algorithm, ngunit binary paghahanap kinakailangan dalawang pagpapalagay. 546 00:30:05,000 --> 00:30:09,000 Isa, na ang data ay pinagsunod-sunod. 547 00:30:09,000 --> 00:30:11,000 Ngayon, maaari naming baka panatilihin ito pinagsunod-sunod, 548 00:30:11,000 --> 00:30:14,000 kaya marahil na hindi isang alalahanin, ngunit din ang binary paghahanap ipinapalagay 549 00:30:14,000 --> 00:30:18,000 na may random na pag-access sa listahan ng mga numero, 550 00:30:18,000 --> 00:30:21,000 at isang array ay nagpapahintulot sa iyo na magkaroon ng random na access, at sa pamamagitan ng random na pag-access, 551 00:30:21,000 --> 00:30:24,000 Ibig sabihin ko kung bibigyan ka isang array, kung gaano karaming oras ang magdadala sa iyo 552 00:30:24,000 --> 00:30:26,000 upang makakuha ng sa bracket 0? 553 00:30:26,000 --> 00:30:29,000 Isa pagpapatakbo, mo lamang gamitin ang [0] at hindi ka doon. 554 00:30:29,000 --> 00:30:33,000 Gaano karaming mga hakbang aabutin upang makakuha ng sa lokasyon 10? 555 00:30:33,000 --> 00:30:36,000 Isang hakbang, pumunta lamang sa [10] at nandoon ka. 556 00:30:36,000 --> 00:30:40,000 Sa pamamagitan ng kaibahan, paano mo makukuha sa ika-10 na integer sa isang naka-link na listahan? 557 00:30:40,000 --> 00:30:42,000 Mayroon kang magsimula sa simula dahil ka lamang pagtanda 558 00:30:42,000 --> 00:30:45,000 ang simula ng isang naka-link na listahan, tulad ng isang string ay remembered 559 00:30:45,000 --> 00:30:48,000 ng mga address ng mga unang magpasinda, at upang makita na ang ika-10 int 560 00:30:48,000 --> 00:30:53,000 o na ika-10 na character sa isang string, mayroon kang maghanap sa buong sumpain bagay. 561 00:30:53,000 --> 00:30:55,000 >> Muli, hindi namin paglutas ng lahat ng aming mga problema. 562 00:30:55,000 --> 00:31:00,000 Ipinapakilala namin mga bago, ngunit ito talagang depende sa kung ano ang iyong sinusubukan upang mag-disenyo para sa. 563 00:31:00,000 --> 00:31:04,000 Sa mga tuntunin ng pagpapatupad na ito, maaari naming humiram ng isang ideya mula sa mag-aaral na istraktura. 564 00:31:04,000 --> 00:31:07,000 Syntax ay katulad na katulad, maliban ngayon, ang ideya ng kaunti pa sa abstract 565 00:31:07,000 --> 00:31:09,000 sa bahay at pangalan at ID. 566 00:31:09,000 --> 00:31:13,000 Ngunit ipanukala ko na maaari naming magkaroon ng isang data na istraktura sa C 567 00:31:13,000 --> 00:31:17,000 na tinatawag na node, bilang ang huling salita sa slide ay nagmumungkahi, 568 00:31:17,000 --> 00:31:21,000 sa loob ng isang node, at ang node ng isang generic na lalagyan sa computer science. 569 00:31:21,000 --> 00:31:25,000 Karaniwang Ito ay iguguhit bilang isang bilog o isang parisukat o parihaba namin nagawa. 570 00:31:25,000 --> 00:31:27,000 At sa istraktura ng data na ito, mayroon kaming isang int, n, 571 00:31:27,000 --> 00:31:29,000 sa gayon ay ang bilang na nais ko na mag-imbak. 572 00:31:29,000 --> 00:31:36,000 Ngunit ano ang pangalawang linya na ito, struct node * susunod? 573 00:31:36,000 --> 00:31:40,000 Bakit ito tama, o kung ano ang papel ito bagay-play, 574 00:31:40,000 --> 00:31:42,000 kahit ng kaunti misteriyoso sa unang tingin? 575 00:31:42,000 --> 00:31:44,000 Oo. 576 00:31:44,000 --> 00:31:46,000 [Hindi marinig na mag-aaral ng tugon] 577 00:31:46,000 --> 00:31:50,000 Eksakto, kaya * uri ng spoils na ito ng pointer ng uri. 578 00:31:50,000 --> 00:31:53,000 Ang pangalan ng pointer na ito ay mang susunod, 579 00:31:53,000 --> 00:32:00,000 ngunit maaari kaming tinatawag na ito ang anumang gusto naming, ngunit kung ano ang pointer point na ito sa? 580 00:32:00,000 --> 00:32:03,000 [Mag-aaral] node isa pang. >> Mismong, mga punto sa isa pang tulad node. 581 00:32:03,000 --> 00:32:05,000 >> Ngayon, ito ay uri ng isang pagkausyoso ng C. 582 00:32:05,000 --> 00:32:09,000 Manariwa sa diwa na ang C ay basahin ng isang tagatala itaas hanggang sa ibaba, kaliwa papuntang kanan, 583 00:32:09,000 --> 00:32:13,000 na nangangahulugan na kung-ito ay isang maliit na naiiba mula sa kung ano ang ginawa namin sa mga mag-aaral. 584 00:32:13,000 --> 00:32:16,000 Kapag tinukoy na namin ang isang mag-aaral, namin ang aktwal na ay hindi maglagay ng salita doon. 585 00:32:16,000 --> 00:32:18,000 Sinabi lang ito typedef. 586 00:32:18,000 --> 00:32:20,000 Pagkatapos namin ay int id, pangalan ng string, string bahay, 587 00:32:20,000 --> 00:32:23,000 at pagkatapos ay mag-aaral sa ilalim ng struct. 588 00:32:23,000 --> 00:32:26,000 Deklarasyon Ito ay isang maliit na iba't ibang dahil, 589 00:32:26,000 --> 00:32:28,000 muli, ang C tagatala ng kaunti pipi. 590 00:32:28,000 --> 00:32:30,000 Lamang ito upang basahin itaas hanggang sa ibaba, 591 00:32:30,000 --> 00:32:33,000 kaya kung umabot sa 2nd na linya dito 592 00:32:33,000 --> 00:32:37,000 kung saan susunod ay ipinahayag at nakikita, oh, narito ang isang variable na tinatawag na susunod. 593 00:32:37,000 --> 00:32:39,000 Isang pointer sa isang struct node. 594 00:32:39,000 --> 00:32:42,000 Tagatala ay upang mapagtanto kung ano ang struct node? 595 00:32:42,000 --> 00:32:44,000 Hindi ko narinig ng mga bagay na ito bago, 596 00:32:44,000 --> 00:32:47,000 dahil ang salita ng node ay hindi maaaring kung hindi man ay lilitaw 597 00:32:47,000 --> 00:32:49,000 hanggang sa ibaba, kaya ay kalabisan na ito. 598 00:32:49,000 --> 00:32:53,000 Ang iyong sasabihin struct node dito, na maaari mong paikliin sa paglaon 599 00:32:53,000 --> 00:32:56,000 salamat sa typedef pababa dito, ngunit ito ay dahil 600 00:32:56,000 --> 00:33:02,000 namin ay tumutukoy sa istraktura mismo sa loob ng istraktura. 601 00:33:02,000 --> 00:33:05,000 Iyon ang isa gotcha doon. 602 00:33:05,000 --> 00:33:07,000 >> Ilang mga kawili-wiling mga problema ay pagpunta sa pumailanglang. 603 00:33:07,000 --> 00:33:09,000 Mayroon kaming isang listahan ng mga numero. Paano namin isingit ito? 604 00:33:09,000 --> 00:33:11,000 Paano namin ito maghanap? Paano namin tanggalin ang mula dito? 605 00:33:11,000 --> 00:33:13,000 Lalo na ngayon na mayroon kaming upang pamahalaan ang lahat ng mga payo. 606 00:33:13,000 --> 00:33:15,000 Tingin mo pointer uri ng isip-baluktot 607 00:33:15,000 --> 00:33:17,000 kapag mayroon kang isa sa mga ito lamang sinusubukang basahin ang isang int dito. 608 00:33:17,000 --> 00:33:20,000 Ngayon ay mayroon kaming upang manipulahin ang nagkakahalaga ng isang buong listahan. 609 00:33:20,000 --> 00:33:22,000 Bakit hindi namin ang aming 5-minutong break na dito, at pagkatapos ay makikita namin dalhin 610 00:33:22,000 --> 00:33:34,000 ilang mga tao up sa entablado upang gawin eksakto na. 611 00:33:34,000 --> 00:33:36,000 >> C ay mas mas masaya kapag ito kumilos. 612 00:33:36,000 --> 00:33:39,000 Sino ang gusto literal bang unang? 613 00:33:39,000 --> 00:33:41,000 Okay, darating sa up. Mo munang. 614 00:33:41,000 --> 00:33:44,000 Sino ang gusto mong maging 9? Okay, 9. 615 00:33:44,000 --> 00:33:46,000 Paano tungkol sa 9? 17? 616 00:33:46,000 --> 00:33:51,000 Ang isang maliit na grupo dito. 22 at 26 sa hilera na front. 617 00:33:51,000 --> 00:33:53,000 At pagkatapos ay kung paano tungkol sa isang tao doon na tulis sa. 618 00:33:53,000 --> 00:33:57,000 Ikaw ay 34. Okay, 34, ay sa up. 619 00:33:57,000 --> 00:33:59,000 Una ay banda roon. Okay, ang lahat ng apat ng ka guys. 620 00:33:59,000 --> 00:34:01,000 At kung sino ang sinasabi namin para sa 9? 621 00:34:01,000 --> 00:34:04,000 Sino ang aming 9? 622 00:34:04,000 --> 00:34:07,000 Sino ang talagang gustong 9? Lahat ng karapatan, darating, 9. 623 00:34:07,000 --> 00:34:10,000 Narito kami. 624 00:34:10,000 --> 00:34:13,000 34, ipapakita namin nakamit mo banda roon. 625 00:34:13,000 --> 00:34:17,000 Ang unang bahagi ay gumawa ng sarili hitsura na. 626 00:34:17,000 --> 00:34:21,000 26, 22, 17, mabuting. 627 00:34:21,000 --> 00:34:25,000 Kung maaari mong tumayo sa gilid, dahil kami ay pagpunta sa malloc sa isang sandali. 628 00:34:25,000 --> 00:34:29,000 >> Mabuti, mabuti. 629 00:34:29,000 --> 00:34:32,000 Okay, mahusay, kaya sabihin hilingin sa isang ilang mga katanungan dito. 630 00:34:32,000 --> 00:34:34,000 At aktwal na, kung ano ang iyong pangalan? >> Anita. 631 00:34:34,000 --> 00:34:37,000 Anita, okay, darating sa paglipas ng dito. 632 00:34:37,000 --> 00:34:41,000 Anita ay pagpunta upang makatulong sa amin sa uri ng malutas ang isa medyo simpleng tanong sa unang, 633 00:34:41,000 --> 00:34:44,000 na kung paano mo mahanap man o hindi ng isang halaga sa listahan? 634 00:34:44,000 --> 00:34:48,000 Ngayon, mapapansin na ang unang, kinakatawan dito sa pamamagitan ng Lucas, 635 00:34:48,000 --> 00:34:52,000 ng kaunti ibang, at kaya ang kanyang piraso ng papel ay sadyang patagilid 636 00:34:52,000 --> 00:34:55,000 dahil ito ay hindi pa matangkad at hindi tumagal ng maraming mga bits, 637 00:34:55,000 --> 00:34:58,000 kahit technically siya ay ang parehong laki ng papel na lang Pinaikot. 638 00:34:58,000 --> 00:35:01,000 Ngunit siya ay isang maliit na iba't ibang na siya 32 bit lamang para sa isang pointer, 639 00:35:01,000 --> 00:35:05,000 at ang lahat ng mga guys ay 64 bit, kalahati ng kung saan ay ang bilang, kalahati ng kung saan ay isang pointer. 640 00:35:05,000 --> 00:35:08,000 Ngunit ang pointer ay hindi itinatanghal, kaya kung ka guys maaari medyo awkwardly 641 00:35:08,000 --> 00:35:12,000 gamitin ang iyong kaliwang upang ituro sa tao na susunod sa iyo. 642 00:35:12,000 --> 00:35:14,000 At ikaw bilang 34. Ano ang iyong pangalan? 643 00:35:14,000 --> 00:35:16,000 Ari. 644 00:35:16,000 --> 00:35:19,000 Ari, kaya aktwal, pindutin nang matagal ang papel sa iyong kanang kamay, at kaliwang napupunta tuwid down na. 645 00:35:19,000 --> 00:35:21,000 Kumakatawan null ka sa kaliwa. 646 00:35:21,000 --> 00:35:24,000 >> Ngayon ang aming tao larawan ay napaka pare-pareho. 647 00:35:24,000 --> 00:35:26,000 Ito ay talagang kung paano payo gumagana. 648 00:35:26,000 --> 00:35:29,000 At kung maaari mong pumipi ng kaunti ang paraan na ito upang Hindi ako sa iyong paraan. 649 00:35:29,000 --> 00:35:34,000 Anita dito, hanapin sa akin ang bilang 22, 650 00:35:34,000 --> 00:35:40,000 ngunit ipinapalagay ng hadlang ng hindi tao na may hawak na piraso ng papel, 651 00:35:40,000 --> 00:35:43,000 ngunit ito ay isang listahan, at mayroon ka lamang Lucas upang magsimula sa 652 00:35:43,000 --> 00:35:46,000 dahil siya ay literal ang unang pointer. 653 00:35:46,000 --> 00:35:51,000 Ipagpalagay mo ang iyong sarili ng pointer, at kaya masyado kang kakayahan upang tumuro sa isang bagay. 654 00:35:51,000 --> 00:35:56,000 Bakit hindi ka magsimula sa pamamagitan ng pagturo sa kung ano mismo ang Lucas ay pagturo sa? 655 00:35:56,000 --> 00:35:58,000 Mabuti, at hayaan mo akong gumawa ng batas ito sa paglipas dito. 656 00:35:58,000 --> 00:36:04,000 Lamang para sa kapakanan ng talakayan, hayaan mo akong makuha ang isang blangkong pahina dito. 657 00:36:04,000 --> 00:36:06,000 Paano mo ispel ang pangalan? >> Anita. 658 00:36:06,000 --> 00:36:08,000 Okay, Anita. 659 00:36:08,000 --> 00:36:18,000 Sabihin nating node * Anita = Lucas. 660 00:36:18,000 --> 00:36:22,000 Well, hindi namin dapat tawagan ka Lucas. Dapat naming tumawag ka muna. 661 00:36:22,000 --> 00:36:25,000 Bakit ito sa katotohanan na pare-pareho sa katotohanan dito? 662 00:36:25,000 --> 00:36:27,000 Isa, unang Umiiral na. 663 00:36:27,000 --> 00:36:30,000 Una ay inilaan baka sa isang lugar hanggang dito. 664 00:36:30,000 --> 00:36:35,000 Node * unang, at ito ay inilalaan listahan sa paanuman. 665 00:36:35,000 --> 00:36:37,000 Hindi ko alam kung paano na nangyari. Na nangyari bago klase makapagsimula. 666 00:36:37,000 --> 00:36:40,000 Na ito ay naka-link na listahan ng mga tao ay nalikha na. 667 00:36:40,000 --> 00:36:44,000 At ngayon sa puntong ito ang kuwento na ito ay lahat ng pagpunta sa Facebook tila mamaya 668 00:36:44,000 --> 00:36:49,000 sa puntong ito sa kuwento, Anita ay nasimulan katumbas sa unang, 669 00:36:49,000 --> 00:36:51,000 na ay hindi nangangahulugan na ang mga puntos ng Anita sa Lucas. 670 00:36:51,000 --> 00:36:53,000 Sa halip, siya mga punto sa kung ano ang kanyang mga punto sa 671 00:36:53,000 --> 00:36:57,000 dahil ang parehong address na loob ng Lucas sa 32 bit - 1, 2, 3 - 672 00:36:57,000 --> 00:37:01,000 ay ngayon din sa loob ng Anita sa 32 bit - 1, 2, 3. 673 00:37:01,000 --> 00:37:05,000 >> Ngayon mahanap ang 22. Paano mo pumunta tungkol sa paggawa nito? 674 00:37:05,000 --> 00:37:07,000 Ano iyon? >> Point sa anumang. 675 00:37:07,000 --> 00:37:11,000 Ituro sa anumang, kaya sige at kumilos ito bilang pinakamahusay na maaari mong dito. 676 00:37:11,000 --> 00:37:15,000 Magandang, magandang, at ngayon ka na tumuturo sa kung ano ang iyong pangalan na may 22? 677 00:37:15,000 --> 00:37:18,000 Ramon. >> Ramon, kaya Ramon ay may hawak na hanggang 22. 678 00:37:18,000 --> 00:37:20,000 Ngayon nagawa mo na ang tseke. 679 00:37:20,000 --> 00:37:24,000 Ba Ramon == 22, at kung kaya, halimbawa, maaari naming nagbabalik ng tunay. 680 00:37:24,000 --> 00:37:26,000 Hayaan akong-habang ang mga guys tumayo dito medyo awkwardly- 681 00:37:26,000 --> 00:37:32,000 hayaan mo akong gawin ang isang bagay mabilis tulad bool mahanap. 682 00:37:32,000 --> 00:37:37,000 Ako pagpunta sa magpatuloy at sabihin (node ​​* listahan, int n). 683 00:37:37,000 --> 00:37:39,000 Akong karapatan sa iyo guys. Ko na lang ay sumulat ng ilang code. 684 00:37:39,000 --> 00:37:45,000 At ngayon ako pagpunta upang magpatuloy at gawin ito, node * Anita = listahan. 685 00:37:45,000 --> 00:37:51,000 At ako pagpunta sa magpatuloy at sabihin habang (Anita! = Null). 686 00:37:51,000 --> 00:37:57,000 >> Ang talinghaga dito ay nakakakuha ng isang maliit na stretch, ngunit habang (Anita! = Null), ano ang gusto kong gawin? 687 00:37:57,000 --> 00:38:03,000 Kailangan ko ng ilang mga paraan ng tumutukoy sa 688 00:38:03,000 --> 00:38:05,000 integer na Anita ay pagturo sa. 689 00:38:05,000 --> 00:38:08,000 Sa nakaraan, kapag nagkaroon kami istraktura, kung saan ang isang node ay, 690 00:38:08,000 --> 00:38:11,000 ginamit namin ang tuldok pagtatanda, at gusto naming sabihin isang bagay tulad ng 691 00:38:11,000 --> 00:38:15,000 anita.n, ngunit ang problema dito ay na Anita ay hindi isang struct per se. 692 00:38:15,000 --> 00:38:17,000 Ano siya? 693 00:38:17,000 --> 00:38:21,000 Niya ang isang pointer, kaya talaga, kung gusto naming gamitin ang tuldok pagtatanda- 694 00:38:21,000 --> 00:38:23,000 at ito ay pagpunta upang tumingin sadyang isang maliit na misteriyoso- 695 00:38:23,000 --> 00:38:28,000 mayroon kaming upang gawin ang isang bagay tulad ng pumunta sa kaliwang kamay ng anumang Anita ay pagturo sa 696 00:38:28,000 --> 00:38:31,000 at pagkatapos ay makakuha ng patlang na tinatawag n. 697 00:38:31,000 --> 00:38:35,000 Anita ay isang pointer, ngunit kung ano ay * Anita? 698 00:38:35,000 --> 00:38:38,000 Ano ang gagawin mong makita kapag ikaw ay pumunta sa kung ano Anita ay pagturo sa? 699 00:38:38,000 --> 00:38:42,000 Isang struct, node, at isang node, manariwa sa diwa, may isang patlang na tinatawag n 700 00:38:42,000 --> 00:38:47,000 dahil ito, isipin ang, mga 2 mga patlang, susunod at n, 701 00:38:47,000 --> 00:38:50,000 na nakita namin ng ilang sandali ang nakalipas sa dito. 702 00:38:50,000 --> 00:38:53,000 >> Upang aktwal na gayahin ito sa code, 703 00:38:53,000 --> 00:39:02,000 maaari naming gawin ito at sabihin kung ((* Anita). n == n), sa n na Naghahanap ako. 704 00:39:02,000 --> 00:39:04,000 Pansinin na ang function ay naipasa sa bilang mahalaga ako tungkol sa. 705 00:39:04,000 --> 00:39:10,000 Pagkatapos ay maaari kong magpatuloy at gawin ang isang bagay tulad ng return totoo. 706 00:39:10,000 --> 00:39:12,000 Iba Pa, kung na hindi ito ang kaso, ano ang gusto kong gawin? 707 00:39:12,000 --> 00:39:19,000 Paano ko isalin ang sa code kung ano Anita ginawa kaya intuitively sa pamamagitan ng paglalakad sa pamamagitan ng listahan? 708 00:39:19,000 --> 00:39:26,000 Ano ang dapat kong gawin dito upang gayahin Anita paglalaan na hakbang sa kaliwa, na hakbang sa kaliwa? 709 00:39:26,000 --> 00:39:28,000 [Hindi marinig na mag-aaral ng tugon] >> Ano iyon? 710 00:39:28,000 --> 00:39:30,000 [Hindi marinig na mag-aaral ng tugon] 711 00:39:30,000 --> 00:39:34,000 Mabuti, hindi isang masamang ideya, ngunit sa nakaraan, kapag ginawa namin ito, kami tapos Anita + + 712 00:39:34,000 --> 00:39:37,000 dahil na magdagdag ng numero 1 sa Anita, 713 00:39:37,000 --> 00:39:40,000 kung saan ay karaniwang ituro sa susunod na tao, tulad ng Ramon, 714 00:39:40,000 --> 00:39:44,000 o ang taong susunod sa kanya, o sa susunod na sa kanya tao ang linya. 715 00:39:44,000 --> 00:39:49,000 Ngunit hindi masyadong mahusay na dito dahil sa kung ano ang bagay na ito hitsura sa memory? 716 00:39:49,000 --> 00:39:54,000 Hindi na. Mayroon kaming upang huwag paganahin iyon. 717 00:39:54,000 --> 00:40:00,000 Mukhang ito sa memory, at kahit ko ang iginuhit 1 at 2 at 3 malapit sa isa't isa, 718 00:40:00,000 --> 00:40:03,000 kung talaga namin gayahin ito-maaari mong guys, habang na tumuturo sa parehong mga tao, 719 00:40:03,000 --> 00:40:07,000 maaaring ang ilan sa inyo ay kumuha ng isang random na hakbang likod, ang ilan sa isang random na hakbang pasulong? 720 00:40:07,000 --> 00:40:10,000 >> Gulo na ito pa rin ang isang naka-link na listahan, 721 00:40:10,000 --> 00:40:13,000 ngunit ang mga guys na ito ay maaaring saanman sa memorya, 722 00:40:13,000 --> 00:40:15,000 kaya Anita + + ay hindi pagpunta upang gumana kung bakit? 723 00:40:15,000 --> 00:40:19,000 Ano sa lokasyon Anita + +? 724 00:40:19,000 --> 00:40:21,000 Sino ang nakakaalam. 725 00:40:21,000 --> 00:40:24,000 Ito ang ilang iba pang mga halaga na lang kaya ang mangyayari sa interposed 726 00:40:24,000 --> 00:40:28,000 sa lahat ng mga node sa pamamagitan ng pagkakataon dahil hindi namin gamit ang isang array. 727 00:40:28,000 --> 00:40:30,000 Inilalaan namin ang bawat sa mga node indibidwal. 728 00:40:30,000 --> 00:40:32,000 Okay, kung ikaw guys ay maaaring linisin sarili-back up. 729 00:40:32,000 --> 00:40:37,000 Hayaan akong magpanukala na sa halip ng Anita + +, gawin namin sa halip Anita ay nakakakuha- 730 00:40:37,000 --> 00:40:42,000 maayos, bakit hindi namin pumunta sa anumang Anita ay pagturo sa at pagkatapos ay gawin. susunod? 731 00:40:42,000 --> 00:40:45,000 Sa ibang salita, pumunta kami sa Ramon, kung sino ang may hawak ang bilang 22, 732 00:40:45,000 --> 00:40:51,000 at pagkatapos. susunod na parang Anita ay kopyahin kanyang kaliwang kamay pointer. 733 00:40:51,000 --> 00:40:54,000 Ngunit hindi siya ay pumunta mas malayo kaysa Ramon dahil nakita namin 22. 734 00:40:54,000 --> 00:40:56,000 Ngunit iyon ay ang ideya. Ngayon, ito ay isang diyos-kakila-kilabot gulo. 735 00:40:56,000 --> 00:40:59,000 Totoo lang, ang walang kailanman tandaan ang syntax na ito, at kaya thankfully, 736 00:40:59,000 --> 00:41:04,000 ito ay aktwal na maliit na sinadya oh, hindi mo aktwal na makita kung ano ang ko sinulat ni. 737 00:41:04,000 --> 00:41:08,000 Ito ay mas nakakahimok kung magagawa mong. Voila! 738 00:41:08,000 --> 00:41:10,000 >> Likod ng mga eksena, ako ay paglutas ang problema sa ganitong paraan. 739 00:41:10,000 --> 00:41:14,000 Anita, na hakbang sa kaliwa, 740 00:41:14,000 --> 00:41:18,000 una, kami pumunta sa address na Anita ay pagturo sa 741 00:41:18,000 --> 00:41:23,000 at kung saan siya ay mahanap hindi lamang n, na-check lang namin para sa kapakanan ng paghahambing, 742 00:41:23,000 --> 00:41:25,000 ngunit maaari ka ring makahanap ng susunod na - sa kasong ito, 743 00:41:25,000 --> 00:41:28,000 Kaliwang Ramon na tumuturo sa susunod na node sa listahan. 744 00:41:28,000 --> 00:41:32,000 Ngunit ito ay ang diyos-kakila-kilabot gulo na tinutukoy ko mas maaga, 745 00:41:32,000 --> 00:41:34,000 ngunit ito ay lumiliko out C ay nagbibigay-daan sa amin upang gawing simple ito. 746 00:41:34,000 --> 00:41:40,000 Sa halip ng pagsulat (* Anita), maaari naming halip magsulat lamang Anita-> n, 747 00:41:40,000 --> 00:41:45,000 at ang eksaktong parehong bagay pagtakbo, ngunit ito ng maraming mas madaling maunawaan, 748 00:41:45,000 --> 00:41:48,000 at ng maraming mas pare-pareho na may larawan na namin ang pagguhit 749 00:41:48,000 --> 00:41:50,000 lahat ng oras na ito gamit ang mga arrow. 750 00:41:50,000 --> 00:41:57,000 >> Panghuli, kung ano ang kailangan namin gawin sa pagtatapos ng programang ito? 751 00:41:57,000 --> 00:42:00,000 May isang linya ng code natitirang. 752 00:42:00,000 --> 00:42:02,000 Bumalik kung ano? 753 00:42:02,000 --> 00:42:05,000 Maling, dahil kung makuha namin sa pamamagitan ng buo habang loop 754 00:42:05,000 --> 00:42:10,000 at Anita ay, sa katunayan, null, na nangangahulugan na siya nagpunta ang lahat ng mga paraan sa dulo ng listahan 755 00:42:10,000 --> 00:42:12,000 kung saan siya ay pagturo sa-kung ano ang iyong pangalan muli? 756 00:42:12,000 --> 00:42:15,000 Kaliwang Ari. >> Ari, na null. 757 00:42:15,000 --> 00:42:18,000 Anita ay ngayon null, at Napag-alaman kong ka nakatayo dito awkwardly sa limbo 758 00:42:18,000 --> 00:42:21,000 dahil ako pagpunta off sa isang monologo dito, 759 00:42:21,000 --> 00:42:23,000 ngunit gagamitin namin sangkot muli sa sandali lamang. 760 00:42:23,000 --> 00:42:27,000 Anita ay null sa puntong iyon sa kuwento, kaya terminate ang habang loop, 761 00:42:27,000 --> 00:42:30,000 at mayroon kaming upang bumalik false dahil kung nakuha niya ang lahat ng mga paraan upang null pointer ng Ari 762 00:42:30,000 --> 00:42:34,000 pagkatapos ay nagkaroon ng walang bilang na hinahangad niya sa listahan. 763 00:42:34,000 --> 00:42:39,000 Maaari naming linisin ito up masyadong, ngunit ito ay isang medyo magandang pagpapatupad pagkatapos 764 00:42:39,000 --> 00:42:43,000 ng isang function ng traversal, mahanap ang function para sa isang naka-link na listahan. 765 00:42:43,000 --> 00:42:48,000 Pa rin linear sa paghahanap, ngunit ito ay hindi kasing simple ng + + isang pointer 766 00:42:48,000 --> 00:42:52,000 o + + isang i variable dahil ngayon hindi namin maaaring hulaan 767 00:42:52,000 --> 00:42:54,000 kung saan ang bawat isa sa mga node sa memory. 768 00:42:54,000 --> 00:42:57,000 Mayroon kaming sa literal na sundin ang trail ng mga breadcrumbs o, higit na partikular, 769 00:42:57,000 --> 00:43:00,000 payo, upang makakuha ng mula sa isang node sa ibang. 770 00:43:00,000 --> 00:43:02,000 >> Ngayon sabihin subukan ang isa pa. Anita, ang gusto mong bumalik dito? 771 00:43:02,000 --> 00:43:06,000 Bakit hindi namin magpatuloy at magtalaga ng isa pang tao mula sa madla? 772 00:43:06,000 --> 00:43:08,000 Malloc-kung ano ang iyong pangalan? >> Rebecca. 773 00:43:08,000 --> 00:43:10,000 Rebecca. Rebecca ay malloced mula sa madla, 774 00:43:10,000 --> 00:43:13,000 at ngayon siya ay itinatago ang bilang 55. 775 00:43:13,000 --> 00:43:17,000 At ang layunin sa kamay ngayon ay para sa Anita upang ipasok 776 00:43:17,000 --> 00:43:22,000 Rebecca sa naka-link na listahan dito sa naaangkop na lugar nito. 777 00:43:22,000 --> 00:43:24,000 Halika sa paglipas ng dito para sa isang sandali. 778 00:43:24,000 --> 00:43:28,000 Tapos ko na ang isang bagay tulad nito. 779 00:43:28,000 --> 00:43:32,000 Tapos ko na node *. At kung ano ang iyong pangalan muli? 780 00:43:32,000 --> 00:43:34,000 Rebecca. >> Rebecca, okay. 781 00:43:34,000 --> 00:43:41,000 Rebecca nakakakuha ng malloc (sizeof (node)). 782 00:43:41,000 --> 00:43:44,000 Tulad lamang na inilalaan namin ang mga bagay tulad ng mga mag-aaral at watnat sa nakaraan, 783 00:43:44,000 --> 00:43:46,000 kailangan namin ang laki ng node, kaya ngayon Rebecca 784 00:43:46,000 --> 00:43:49,000 ay pagturo sa kung ano? 785 00:43:49,000 --> 00:43:52,000 Rebecca ay may dalawang mga patlang sa loob ng kanyang, isa sa kung saan ay 55. 786 00:43:52,000 --> 00:43:55,000 Natin gawin kung ano, Rebecca-> = 55. 787 00:43:55,000 --> 00:44:00,000 Ngunit Rebecca-> susunod dapat bang ngayon, ang kanyang mga kamay uri na nakakaalam? 788 00:44:00,000 --> 00:44:03,000 Ito ay pagturo sa ilang halaga ng basura, kaya bakit hindi para sa mabuting panukala 789 00:44:03,000 --> 00:44:07,000 namin ng hindi bababa sa gawin ito upang ang kaliwang kamay ay ngayon sa kanyang bahagi. 790 00:44:07,000 --> 00:44:09,000 Ngayon Anita, dalhin ito mula dito. 791 00:44:09,000 --> 00:44:11,000 Mayroon kang Rebecca pagkakaroon ng pag-inilalaan. 792 00:44:11,000 --> 00:44:20,000 Sige at hanapin kung saan dapat naming ilagay Rebecca. 793 00:44:20,000 --> 00:44:25,000 Mabuti, napakabuti. 794 00:44:25,000 --> 00:44:28,000 Okay, mahusay, at ngayon ay kailangan naming sa iyo upang magbigay ng isang bit ng direksyon, 795 00:44:28,000 --> 00:44:30,000 kaya naabot mo na Ari. 796 00:44:30,000 --> 00:44:33,000 Ang kanyang kaliwang null, ngunit Rebecca ay malinaw nabibilang sa kanan, 797 00:44:33,000 --> 00:44:36,000 kaya kung paano namin upang baguhin ito naka-link na listahan 798 00:44:36,000 --> 00:44:38,000 upang ipasok ng Rebecca sa naaangkop na lugar? 799 00:44:38,000 --> 00:44:42,000 Kung maaari mong literal ilipat ang kaliwang kamay ng tao sa paligid tulad ng kinakailangan, 800 00:44:42,000 --> 00:44:48,000 makikita naming ayusin ang problema na paraan. 801 00:44:48,000 --> 00:44:52,000 Okay, mabuti, at samantala, kaliwang Rebecca ngayon sa pamamagitan ng kanyang bahagi. 802 00:44:52,000 --> 00:44:54,000 >> Na ay masyadong madaling. 803 00:44:54,000 --> 00:44:57,000 Subukan nating paglaan-lubos Halos tapos, 20. 804 00:44:57,000 --> 00:44:59,000 Okay, darating sa up. 805 00:44:59,000 --> 00:45:04,000 20 ay inilalaan, kaya ipaalam sa akin sige at sabihin muli dito 806 00:45:04,000 --> 00:45:07,000 lang kami tapos node * Saad. 807 00:45:07,000 --> 00:45:11,000 Mayroon kaming malloc (sizeof (node)). 808 00:45:11,000 --> 00:45:16,000 Naming gawin ang parehong eksaktong syntax bilang ginawa namin bago para sa 20, 809 00:45:16,000 --> 00:45:20,000 at kukunin ko na gawin ang susunod = null, at ngayon ito sa Anita 810 00:45:20,000 --> 00:45:23,000 upang ipasok sa naka-link na listahan, kung maaari mong i-play na eksaktong parehong papel. 811 00:45:23,000 --> 00:45:30,000 Ipatupad. 812 00:45:30,000 --> 00:45:32,000 Okay, mabuti. 813 00:45:32,000 --> 00:45:38,000 Ngayon sa tingin maingat bago simulan mo ang paglipat ng kaliwa mga kamay sa paligid. 814 00:45:38,000 --> 00:45:46,000 Iyo sa pamamagitan ng malayo nakuha ang pinaka-mahirap na papel ngayon. 815 00:45:46,000 --> 00:45:59,000 Kaninong mga kamay ay dapat ilipat muna? 816 00:45:59,000 --> 00:46:02,000 Okay, maghintay, ako marinig ilang hindi. 817 00:46:02,000 --> 00:46:07,000 Kung ang ilang mga tao ay magalang bang upang makatulong na malutas ang isang mahirap na sitwasyon dito. 818 00:46:07,000 --> 00:46:11,000 Kaninong kaliwang dapat ma-update sa unang marahil? Oo. 819 00:46:11,000 --> 00:46:13,000 [Mag-aaral] Saad. 820 00:46:13,000 --> 00:46:15,000 Okay, Saad, bakit, bagaman? 821 00:46:15,000 --> 00:46:17,000 [Hindi marinig na mag-aaral ng tugon] 822 00:46:17,000 --> 00:46:19,000 Mabuti, dahil kung ililipat kung ano ang namin ang iyong pangalan? >> Marshall. 823 00:46:19,000 --> 00:46:22,000 Marshall, kung namin ilipat ang kanyang kamay sa unang pababa null, 824 00:46:22,000 --> 00:46:25,000 ngayon literal namin na naulila apat na tao sa listahang ito 825 00:46:25,000 --> 00:46:29,000 dahil siya ay ang tanging bagay na tumuturo sa Ramon at lahat ng tao sa kaliwa, 826 00:46:29,000 --> 00:46:31,000 kaya nag-a-update na pointer unang ay hindi maganda. 827 00:46:31,000 --> 00:46:33,000 Natin i-undo na. 828 00:46:33,000 --> 00:46:37,000 Mabuti, at ngayon sige at ilipat ang mga naaangkop na kaliwang kamay na tumuturo sa Ramon. 829 00:46:37,000 --> 00:46:39,000 Ito pakiramdam ng isang maliit na paulit-ulit. 830 00:46:39,000 --> 00:46:41,000 Ngayon ay mayroong dalawang tao na tumuturo sa Ramon, ngunit na fine 831 00:46:41,000 --> 00:46:43,000 dahil ngayon kung paano iba pa naming i-update ang listahan? 832 00:46:43,000 --> 00:46:48,000 Ano kabilang banda ay may upang ilipat? 833 00:46:48,000 --> 00:46:53,000 Mahusay na, ngayon nawala namin ang anumang memory? 834 00:46:53,000 --> 00:46:57,000 Hindi, kaya mahusay na, sabihin makita kung hindi namin maaaring masira ito nang isa pang beses. 835 00:46:57,000 --> 00:47:00,000 >> Mallocing ng isang huling oras, bilang 5. 836 00:47:00,000 --> 00:47:04,000 Ang lahat ng mga paraan sa likod, dumating pababa. 837 00:47:04,000 --> 00:47:08,000 Napaka kapana-panabik. 838 00:47:08,000 --> 00:47:15,000 [Palakpakan] 839 00:47:15,000 --> 00:47:17,000 Ano ang iyong pangalan? >> Ron. 840 00:47:17,000 --> 00:47:19,000 Ron, okay, ikaw ay malloced bilang numero 5. 841 00:47:19,000 --> 00:47:23,000 Lamang namin na maisakatuparan ang code na halos kapareho ng mga 842 00:47:23,000 --> 00:47:26,000 sa pamamagitan lamang ng ibang pangalan. 843 00:47:26,000 --> 00:47:28,000 Mahusay na. 844 00:47:28,000 --> 00:47:38,000 Ngayon, Anita, good luck pagpasok ng numero 5 sa listahan ngayon. 845 00:47:38,000 --> 00:47:43,000 Magandang, at? 846 00:47:43,000 --> 00:47:47,000 Mahusay, kaya talaga ito ang ikatlong ng tatlong kabuuang kaso. 847 00:47:47,000 --> 00:47:49,000 Namin unang nagkaroon ng isang tao sa dulo, Rebecca. 848 00:47:49,000 --> 00:47:51,000 Kami ay may isang tao sa gitna. 849 00:47:51,000 --> 00:47:53,000 Ngayon ay mayroon kaming isang tao sa simula, at sa halimbawang ito, 850 00:47:53,000 --> 00:47:56,000 na namin ngayon ay upang i-update ang Lucas sa unang pagkakataon 851 00:47:56,000 --> 00:48:00,000 dahil ang unang elemento sa listahan ay mayroon na ngayong upang tumuro sa isang bagong node, 852 00:48:00,000 --> 00:48:03,000 na, sa pagliko, ay pagturo sa node bilang 9. 853 00:48:03,000 --> 00:48:06,000 >> Ito ay isang hugely mahirap demonstration, ako ba, 854 00:48:06,000 --> 00:48:08,000 kaya isang malaking ikot ng papuri para sa mga guys kung magagawa mong. 855 00:48:08,000 --> 00:48:11,000 Maayos na Natapos. 856 00:48:11,000 --> 00:48:17,000 Iyon lang. Maaari mong panatilihin ang iyong mga piraso ng papel bilang isang maliit na memory. 857 00:48:17,000 --> 00:48:22,000 Ito lumiliko out ang paggawa nito sa code 858 00:48:22,000 --> 00:48:26,000 ay hindi lubos bilang simpleng bilang lamang ang paglipat ng mga kamay sa paligid 859 00:48:26,000 --> 00:48:28,000 at pagturo ng mga payo sa iba't ibang mga bagay. 860 00:48:28,000 --> 00:48:31,000 Ngunit Napagtanto na pagdating panahon upang ipatupad ang isang bagay tulad ng 861 00:48:31,000 --> 00:48:34,000 isang naka-link na listahan o isang variant nito kung kang tumuon sa talagang 862 00:48:34,000 --> 00:48:38,000 mga pangunahing batayan, ang kagat-laki ng mga problema na mayroon ako upang malaman kung, 863 00:48:38,000 --> 00:48:43,000 ito ang kamay na ito o ito kamay, Napagtanto na kung ano ay kung hindi man ay isang medyo kumplikadong programa 864 00:48:43,000 --> 00:48:47,000 maaari, sa katunayan, na bumaba sa medyo simpleng mga bloke ng gusali tulad nito. 865 00:48:47,000 --> 00:48:51,000 >> Natin ang mga bagay sa isang mas sopistikadong direksyon pa rin. 866 00:48:51,000 --> 00:48:53,000 Namin ngayon ang paniwala ng mga naka-link na listahan. 867 00:48:53,000 --> 00:48:57,000 Mayroon din kaming-salamat sa mungkahi pabalik doon-doble na naka-link sa listahan, 868 00:48:57,000 --> 00:49:01,000 na kamukha halos pareho, ngunit ngayon ay mayroon kaming dalawang mga payo sa loob ng struct 869 00:49:01,000 --> 00:49:05,000 sa halip na isa, at kami marahil tumawag sa nakaraan at susunod na ang mga payo 870 00:49:05,000 --> 00:49:08,000 o pakaliwa o pakanan, ngunit namin, sa katunayan, kailangan dalawa sa kanila. 871 00:49:08,000 --> 00:49:10,000 Code ay ng kaunti pa kasangkot. 872 00:49:10,000 --> 00:49:12,000 Anita ay nagkaroon pang trabaho dito sa entablado. 873 00:49:12,000 --> 00:49:15,000 Ngunit maaari naming tiyak na ipatupad na uri ng istraktura. 874 00:49:15,000 --> 00:49:19,000 Sa mga tuntunin ng tumatakbo oras, bagaman, kung ano ang ang oras 875 00:49:19,000 --> 00:49:24,000 para sa Anita ng paghahanap ng numero ng n sa isang naka-link na listahan ngayon? 876 00:49:24,000 --> 00:49:27,000 Pa ring malaking O ng n, kaya hindi na mas mahusay kaysa sa linear paghahanap. 877 00:49:27,000 --> 00:49:29,000 Hindi namin maaaring gawin binary paghahanap, bagaman, muli. 878 00:49:29,000 --> 00:49:34,000 Bakit ay na ang kaso? Hindi ka maaaring tumalon sa paligid. 879 00:49:34,000 --> 00:49:36,000 Kahit na malinaw naman namin makita ang lahat ng mga tao sa entablado, 880 00:49:36,000 --> 00:49:39,000 at Anita maaaring eyeballed ito at sinabi, "Ito ay sa gitna ng listahan," 881 00:49:39,000 --> 00:49:42,000 hindi niya alam na kung siya ay computer program 882 00:49:42,000 --> 00:49:47,000 dahil ang tanging bagay na siya ay may sa aldaba sa sa simula ng sitwasyon 883 00:49:47,000 --> 00:49:50,000 ay Lucas, na ang unang pointer. 884 00:49:50,000 --> 00:49:53,000 Gusto niya kinakailangang sundin ang mga link na iyon, 885 00:49:53,000 --> 00:49:56,000 pagbibilang ang kanyang paraan hanggang siya nahanap na halos gitna, 886 00:49:56,000 --> 00:49:58,000 at kahit pagkatapos, hindi niya na malaman kung kailan niya naabot gitna 887 00:49:58,000 --> 00:50:01,000 maliban kung siya ay napupunta ang lahat ng mga paraan sa dulo upang malaman kung gaano karaming mga may, 888 00:50:01,000 --> 00:50:05,000 backtracks, at masyadong mahirap maliban kung mayroon kang 889 00:50:05,000 --> 00:50:07,000 doble-link sa listahan ng mga uri. 890 00:50:07,000 --> 00:50:10,000 >> Paglutas ng ilang mga problema ngayon, ngunit nagpapakilala iba. 891 00:50:10,000 --> 00:50:12,000 Paano ang tungkol sa isang iba't ibang mga istraktura ng data sa kabuuan? 892 00:50:12,000 --> 00:50:15,000 Ito ay isang litrato ng mga trays sa Mather House, 893 00:50:15,000 --> 00:50:19,000 at sa kasong ito, mayroon kaming isang istraktura ng data na rin namin ang uri ng na-pakikipag-usap tungkol sa. 894 00:50:19,000 --> 00:50:22,000 Usapan natin ang tungkol sa isang stack sa konteksto ng memorya, 895 00:50:22,000 --> 00:50:26,000 at na uri ng sadyang na pinangalanang dahil isang stack sa mga tuntunin ng memory 896 00:50:26,000 --> 00:50:31,000 ay epektibong istraktura ng data na may higit pa at higit pa na mga bagay-bagay layered sa tuktok nito. 897 00:50:31,000 --> 00:50:35,000 Ngunit kawili-wiling bagay tungkol sa isang stack, tulad ng kaso sa katotohanan, 898 00:50:35,000 --> 00:50:38,000 ay na ito ay isang espesyal na uri ng mga istraktura ng data. 899 00:50:38,000 --> 00:50:42,000 Ang istraktura ng data kung saan ang unang elemento sa 900 00:50:42,000 --> 00:50:46,000 ang huling elemento out. 901 00:50:46,000 --> 00:50:50,000 Kung ikaw ay ang unang tray na ilagay papunta sa stack, 902 00:50:50,000 --> 00:50:53,000 ka na sa kasamaang-palad ang huling tray ay dadalhin off ang stack ang, 903 00:50:53,000 --> 00:50:55,000 at na hindi kinakailangan ng isang magandang bagay. 904 00:50:55,000 --> 00:50:58,000 Sa kabaligtaran, maaari mong isipin ang tungkol dito sa iba pang mga paraan sa paligid, 905 00:50:58,000 --> 00:51:02,000 sa huling sa unang out. 906 00:51:02,000 --> 00:51:05,000 >> Ngayon, ang anumang mga sitwasyon ay dumating sa isipan kung saan nagkakaroon ng stack 907 00:51:05,000 --> 00:51:08,000 istraktura ng data kung saan mayroon kang na ari-arian 908 00:51:08,000 --> 00:51:13,000 ng huling sa, unang out, ay talagang Nakakamangha? 909 00:51:13,000 --> 00:51:16,000 Ay na ang isang magandang bagay? Ay na ang isang masamang bagay? 910 00:51:16,000 --> 00:51:19,000 Ito ay talagang isang masamang bagay kung ang mga trays ay hindi lahat ng magkakahawig 911 00:51:19,000 --> 00:51:21,000 at sila ay ang lahat ng mga espesyal na iba't ibang kulay o watnat, 912 00:51:21,000 --> 00:51:24,000 at ang kulay na gusto mo ang lahat ng mga paraan sa ibaba. 913 00:51:24,000 --> 00:51:26,000 Siyempre, hindi ka maaaring makakuha ng na walang mahusay na pagsisikap. 914 00:51:26,000 --> 00:51:28,000 Mayroon kang upang simulan mula sa tuktok at gumagana ang iyong paraan pababa. 915 00:51:28,000 --> 00:51:31,000 Katulad nito, kung ano ang kung ikaw ay isa sa mga lalaki fan 916 00:51:31,000 --> 00:51:34,000 na naghihintay lahat ng gabi na sinusubukan upang makakuha ng isang iPhone at linya up 917 00:51:34,000 --> 00:51:36,000 sa isang lugar na tulad nito? 918 00:51:36,000 --> 00:51:40,000 Hindi magiging gandang kung ang Apple store 919 00:51:40,000 --> 00:51:42,000 ay isang stack ng data ng istraktura? 920 00:51:42,000 --> 00:51:44,000 Yay? Hindi sang-ayong boto? 921 00:51:44,000 --> 00:51:47,000 Ito ay mahusay lamang para sa mga tao na magpapakita sa huling posibleng minuto 922 00:51:47,000 --> 00:51:50,000 at pagkatapos makapag-plucked off queue. 923 00:51:50,000 --> 00:51:52,000 At sa katunayan, ang katotohanan na kaya ako ay hilig upang sabihin ng queue 924 00:51:52,000 --> 00:51:56,000 aktwal na pare-pareho sa kung ano ang gusto namin tumawag sa ganitong uri ng data ng istraktura, 925 00:51:56,000 --> 00:51:59,000 isa sa katotohanan kung saan ang order bagay, 926 00:51:59,000 --> 00:52:02,000 at nais mong ang unang isa sa unang out 927 00:52:02,000 --> 00:52:04,000 kung lamang para sa kapakanan ng tao pagkamakatarungan. 928 00:52:04,000 --> 00:52:07,000 Karaniwan naming tumawag na isang istraktura ng data ng queue. 929 00:52:07,000 --> 00:52:11,000 >> Ito lumiliko bukod sa naka-link na listahan, maaari naming simulan ang paggamit ng mga parehong pangunahing ideya 930 00:52:11,000 --> 00:52:15,000 at simulan ang paglikha ng mga bagong at iba't-ibang uri ng mga solusyon sa mga problema. 931 00:52:15,000 --> 00:52:19,000 Halimbawa, sa kaso ng isang stack, maaari naming kumakatawan sa isang stack 932 00:52:19,000 --> 00:52:22,000 gamit ang isang data na istraktura tulad nito, nais kong ipanukala. 933 00:52:22,000 --> 00:52:26,000 Sa kasong ito, ipinahayag ko ang struct ng, at ko na sinabi sa loob ng istrakturang ito 934 00:52:26,000 --> 00:52:30,000 ay isang hanay ng mga numero at pagkatapos ay isang variable na tinatawag na laki, 935 00:52:30,000 --> 00:52:33,000 at ako na tumawag sa bagay na ito ng stack. 936 00:52:33,000 --> 00:52:35,000 Ngayon, kung bakit ito aktwal na gumagana? 937 00:52:35,000 --> 00:52:43,000 Sa kaso ng isang stack, maaari ko gumuhit ito epektibo sa screen bilang isang array. 938 00:52:43,000 --> 00:52:47,000 Narito ang aking stack. Iyon ang aking numero. 939 00:52:47,000 --> 00:52:50,000 At kami na gumuhit ng mga ito bilang na ito, ito, ito, ito, ito. 940 00:52:50,000 --> 00:52:53,000 At pagkatapos Mayroon akong ilang iba pang mga miyembro ng data dito, 941 00:52:53,000 --> 00:52:58,000 na kung saan ay tinatawag na laki, kaya ito ay sukat, at ito ay numero, 942 00:52:58,000 --> 00:53:02,000 at sama-sama, ang buong iPad dito ay kumakatawan sa isang stack istraktura. 943 00:53:02,000 --> 00:53:07,000 Ngayon, sa pamamagitan ng default, laki na siguro nakuha na nasimulan sa 0, 944 00:53:07,000 --> 00:53:11,000 at kung ano ang sa loob ng hanay ng mga numero simula 945 00:53:11,000 --> 00:53:14,000 kapag ko munang magtalaga ng isang array? 946 00:53:14,000 --> 00:53:16,000 Basura. Sino ang nakakaalam? At hindi ito aktwal na mahalaga. 947 00:53:16,000 --> 00:53:20,000 Hindi mahalaga kung ito ay 1, 2, 3, 4, 5, ganap na random 948 00:53:20,000 --> 00:53:25,000 sa pamamagitan ng malas na naka-imbak sa aking istraktura dahil hangga't alam ko na ang laki ng stack 949 00:53:25,000 --> 00:53:29,000 ay 0, pagkatapos ay alam ko programa, hindi tumingin sa anumang ng mga elemento sa array. 950 00:53:29,000 --> 00:53:31,000 Hindi mahalaga kung ano ang doon. 951 00:53:31,000 --> 00:53:34,000 Huwag tumingin sa kanila, na magiging implikasyon ng isang sukat na 0. 952 00:53:34,000 --> 00:53:38,000 >> Ngunit ngayon ipagpalagay ko sige at ipasok ang isang bagay sa stack. 953 00:53:38,000 --> 00:53:42,000 Gusto kong ipasok ang numero 5, kaya ko bang ilagay ang numero 5 dito, 954 00:53:42,000 --> 00:53:45,000 at pagkatapos ano ang gagawin ko bang ilagay down na dito? 955 00:53:45,000 --> 00:53:48,000 Ngayon Gusto ko aktwal na ilagay ang 1 para sa laki, 956 00:53:48,000 --> 00:53:50,000 at ngayon stack ng laki 1. 957 00:53:50,000 --> 00:53:53,000 Paano kung pumunta ako magpatuloy at ipasok ang numero, sabihin nating, 7 susunod? 958 00:53:53,000 --> 00:53:57,000 Pagkatapos ay makakakuha ng update sa 2, at gagawin namin 9, 959 00:53:57,000 --> 00:54:02,000 at pagkatapos na ito ay makakakuha-update sa 3. 960 00:54:02,000 --> 00:54:05,000 Ngunit ang mga kawili-wiling tampok na ngayon ng stack na ito ay na 961 00:54:05,000 --> 00:54:09,000 Ako dapat upang alisin kung aling mga elemento kung gusto kong mag-pop 962 00:54:09,000 --> 00:54:12,000 isang bagay off ng stack, upang magsalita? 963 00:54:12,000 --> 00:54:14,000 9 ay ang unang bagay na upang pumunta. 964 00:54:14,000 --> 00:54:18,000 Paano dapat ang larawan baguhin kung gusto kong mag-pop ang isang elemento off ang stack, 965 00:54:18,000 --> 00:54:20,000 magkano ng isang tray sa Mather? 966 00:54:20,000 --> 00:54:22,000 Oo >> [Mag-aaral] Itakda ang laki sa 2. 967 00:54:22,000 --> 00:54:27,000 Eksakto, ang lahat ng gagawin ko ay nakatakda laki sa 2, at ano ang gagawin ko gamit ang array? 968 00:54:27,000 --> 00:54:29,000 Hindi ko dapat gawin. 969 00:54:29,000 --> 00:54:32,000 Maaari kong, lamang na anal, maglagay ng 0 doon o ng -1 o isang bagay upang magpahiwatig 970 00:54:32,000 --> 00:54:34,000 na ito ay hindi isang legit halaga, ngunit hindi mahalaga dahil 971 00:54:34,000 --> 00:54:37,000 Ko record sa labas ng ang array mismo kung gaano ito kahaba 972 00:54:37,000 --> 00:54:41,000 kaya na alam ko lamang tumingin sa ang unang dalawang mga elemento sa array na ito. 973 00:54:41,000 --> 00:54:47,000 Ngayon, kung pumunta ako at idagdag ang numero 8 sa array na ito, kung paano ang mga larawan baguhin susunod? 974 00:54:47,000 --> 00:54:50,000 Ito ay magiging 8, at ito ay nagiging 3. 975 00:54:50,000 --> 00:54:52,000 Ako paggupit ng ilang sulok dito. 976 00:54:52,000 --> 00:54:56,000 Ngayon ay mayroon kaming 5, 7, 8, at hindi namin pabalik sa isang sukat ng 3. 977 00:54:56,000 --> 00:54:58,000 Ito ay medyo simple ipatupad, 978 00:54:58,000 --> 00:55:06,000 ngunit kapag kami ikinalulungkot ang design desisyon? 979 00:55:06,000 --> 00:55:09,000 Kailan bagay simulan upang pumunta napaka, napaka-mali? Oo. 980 00:55:09,000 --> 00:55:11,000 [Hindi marinig na mag-aaral ng tugon] 981 00:55:11,000 --> 00:55:13,000 Kapag nais mong upang bumalik at makakuha ng unang elemento na inilagay mo. 982 00:55:13,000 --> 00:55:18,000 >> Ito lumiliko out dito kahit isang stack ay isang array sa ilalim ng hood, 983 00:55:18,000 --> 00:55:21,000 din ang mga istraktura ng data na sinimulan namin ang pakikipag-usap tungkol sa karaniwang kilala bilang 984 00:55:21,000 --> 00:55:25,000 abstract istraktura ng data kung saan kung paano sila ay ipinatupad 985 00:55:25,000 --> 00:55:27,000 ganap na bukod sa punto. 986 00:55:27,000 --> 00:55:31,000 Isang data ng istraktura tulad ng isang stack ay dapat upang magdagdag ng suporta 987 00:55:31,000 --> 00:55:35,000 pagpapatakbo tulad ng push, na pushes isang tray papunta sa stack, 988 00:55:35,000 --> 00:55:39,000 at mga pop, na-aalis ng isang elemento mula sa stack, at na ito. 989 00:55:39,000 --> 00:55:43,000 Kung ikaw ay upang i-download ng ibang tao code na na ipinatupad 990 00:55:43,000 --> 00:55:46,000 bagay na ito ay tinatawag na stack, ang taong iyon ay nakasulat 991 00:55:46,000 --> 00:55:49,000 dalawang function lamang para sa iyo, itulak at pop, na ang tanging layunin sa buhay 992 00:55:49,000 --> 00:55:51,000 ay gawin eksakto na. 993 00:55:51,000 --> 00:55:54,000 Mong o kanya na ipinatupad program na 994 00:55:54,000 --> 00:55:58,000 maaaring naging ganap ang isa upang magpasya kung paano ipatupad 995 00:55:58,000 --> 00:56:00,000 ang mga semantika ng pagtulak at popping sa ilalim ng hood 996 00:56:00,000 --> 00:56:03,000 o ang pag-andar ng pagtulak at popping. 997 00:56:03,000 --> 00:56:07,000 At ginawa ko ang isang medyo hindi makakita sa malayo desisyon dito 998 00:56:07,000 --> 00:56:10,000 sa pamamagitan ng pagpapatupad ng aking stack na may ito simpleng istraktura ng data bakit? 999 00:56:10,000 --> 00:56:12,000 Kapag ang break na istraktura ang data na ito? 1000 00:56:12,000 --> 00:56:18,000 Sa anong punto ko upang bumalik ang isang error kapag ang user na ang tawag push, halimbawa? 1001 00:56:18,000 --> 00:56:20,000 [Mag-aaral] Kung walang mas maraming espasyo. 1002 00:56:20,000 --> 00:56:23,000 Eksakto, kung mayroong hindi mas maraming espasyo, kung Nalampasan ko ang kapasidad, 1003 00:56:23,000 --> 00:56:27,000 na ang lahat ng mga caps dahil ito ay nagmumungkahi na ang ilang uri ng pandaigdigang pare-pareho. 1004 00:56:27,000 --> 00:56:30,000 Well, pagkatapos lamang ako pagpunta sa may upang sabihin, "Paumanhin, hindi ko maaaring itulak ng isa pang halaga 1005 00:56:30,000 --> 00:56:32,000 papunta sa stack, "mas gusto sa Mather. 1006 00:56:32,000 --> 00:56:36,000 >> Sa ilang mga punto, sila ay pagpunta sa pindutin ang tuktok na bahagi ng na maliit na cabinet. 1007 00:56:36,000 --> 00:56:39,000 Walang karagdagang espasyo o kapasidad sa stack, sa puntong ang ilang uri ng error. 1008 00:56:39,000 --> 00:56:42,000 Ang mga ito ay ilagay ang elemento sa ibang lugar, sa tray sa ibang lugar, 1009 00:56:42,000 --> 00:56:44,000 o wala saanman sa lahat. 1010 00:56:44,000 --> 00:56:47,000 Ngayon, na may queue, maaari naming ipatupad ito ng isang maliit na naiiba. 1011 00:56:47,000 --> 00:56:50,000 Queue ay isang maliit na iba't ibang na sa ilalim ng hood, maaari itong ipinatupad 1012 00:56:50,000 --> 00:56:54,000 bilang isang array, ngunit bakit, sa kasong ito, ako pagpapanukala 1013 00:56:54,000 --> 00:56:59,000 ring magkaroon ng ulo elemento na kumakatawan sa pinuno ng listahan, 1014 00:56:59,000 --> 00:57:06,000 sa harap ng listahan, ang unang tao sa linya sa tindahan ng Apple, sa karagdagan sa laki? 1015 00:57:06,000 --> 00:57:14,000 Bakit ko kailangan ng isang karagdagang piraso ng data dito? 1016 00:57:14,000 --> 00:57:16,000 Isipin pabalik sa kung ano ang numero ay 1017 00:57:16,000 --> 00:57:18,000 kung ako na iginuhit tulad ng sumusunod. 1018 00:57:18,000 --> 00:57:21,000 Ipagpalagay na ang na ito ay ngayon isang queue sa halip ng isang stack, 1019 00:57:21,000 --> 00:57:24,000 ang pagkakaiba sa pagiging-tulad ng Apple store-queue ay patas. 1020 00:57:24,000 --> 00:57:27,000 Ang unang tao sa linya sa simula ng listahan, numero 5 sa kasong ito, 1021 00:57:27,000 --> 00:57:30,000 siya na ipaalam muna sa tindahan. 1022 00:57:30,000 --> 00:57:32,000 Natin gawin iyon. 1023 00:57:32,000 --> 00:57:35,000 Ipagpalagay na ang na ito ay ang estado ng aking queue sa sandaling ito sa oras, at ngayon ang Apple store 1024 00:57:35,000 --> 00:57:39,000 bubukas at ang unang tao, bilang 5, ay humantong sa tindahan. 1025 00:57:39,000 --> 00:57:43,000 Paano ko babaguhin ang larawan ngayon ko de-nakapila ang unang tao 1026 00:57:43,000 --> 00:57:47,000 sa harap ng linya? 1027 00:57:47,000 --> 00:57:50,000 Ano iyan? >> [Mag-aaral] Baguhin ang queue. 1028 00:57:50,000 --> 00:57:52,000 Baguhin ang ulo, kaya 5 mawala. 1029 00:57:52,000 --> 00:57:56,000 Sa katotohanan, bilang bagaman-kung paano pinakamahusay na gawin ito? 1030 00:57:56,000 --> 00:58:00,000 Sa katotohanan, na parang ang tao na ito mawala. 1031 00:58:00,000 --> 00:58:03,000 Ano ang numero 7 sa isang aktwal na tindahan? 1032 00:58:03,000 --> 00:58:05,000 Sila ay gumawa ng isang malaking hakbang pasulong. 1033 00:58:05,000 --> 00:58:08,000 >> Ngunit ano na namin dumating sa Pinahahalagahan pagdating sa array 1034 00:58:08,000 --> 00:58:10,000 at paglipat ng mga bagay sa paligid? 1035 00:58:10,000 --> 00:58:12,000 Na uri ng basura ng iyong oras, i-right? 1036 00:58:12,000 --> 00:58:16,000 Bakit kaya anal sa unang tao 1037 00:58:16,000 --> 00:58:21,000 sa simula ng linya sa pisikal ang simula ng tipak ng memory? 1038 00:58:21,000 --> 00:58:23,000 Na ganap na hindi kailangang. Bakit? 1039 00:58:23,000 --> 00:58:26,000 Ano ang maaari kong lamang tandaan sa halip? >> [Hindi marinig na mag-aaral tugon] 1040 00:58:26,000 --> 00:58:30,000 Eksakto, maaari ko lang tandaan na ito ng karagdagang data ng miyembro ng ulo 1041 00:58:30,000 --> 00:58:34,000 na ngayon ang pinuno ng listahan ay hindi na 0, kung saan ito ay ng ilang sandali ang nakalipas. 1042 00:58:34,000 --> 00:58:39,000 Ngayon ito ay talagang numero 1. Sa ganitong paraan, makakakuha ako ng bahagyang pag-optimize. 1043 00:58:39,000 --> 00:58:44,000 Dahil lang ko ang de-nakapila isang tao mula sa linya sa simula ng linya sa Apple store 1044 00:58:44,000 --> 00:58:47,000 ay hindi nangangahulugan na ang lahat sa shift, kung saan manariwa sa diwa ay isang linear na pagpapatakbo. 1045 00:58:47,000 --> 00:58:50,000 Ko sa halip gastusin ng pare-pareho ang oras lamang 1046 00:58:50,000 --> 00:58:53,000 at makamit ang isang mas mabilis na tugon. 1047 00:58:53,000 --> 00:58:56,000 Ngunit ang presyo ako nagbabayad ay kung ano upang makakuha na karagdagang pagganap 1048 00:58:56,000 --> 00:58:58,000 at hindi pagkakaroon upang ilipat ang lahat? 1049 00:58:58,000 --> 00:59:01,000 Oo. >> [Hindi marinig na mag-aaral tugon] 1050 00:59:01,000 --> 00:59:04,000 Maaaring magdagdag ng higit pang mga tao, na rin, ang problema na orthogonal 1051 00:59:04,000 --> 00:59:07,000 sa katotohanan na hindi namin ang paglilipat ng mga tao sa paligid. 1052 00:59:07,000 --> 00:59:11,000 Pa ito sa isang array, gayon man o hindi namin shift ang lahat o hindi- 1053 00:59:11,000 --> 00:59:13,000 oh, tingnan ko kung ano ang ibig mong sabihin, okay. 1054 00:59:13,000 --> 00:59:16,000 Aktwal, Sumasang-ayon ako sa kung ano ang iyong sinasabi na ito nang parang 1055 00:59:16,000 --> 00:59:19,000 ngayon kami ay hindi kailanman gamitin ang simula ng array na ito 1056 00:59:19,000 --> 00:59:22,000 dahil kung alisin ko 5, pagkatapos kong alisin ang 7. 1057 00:59:22,000 --> 00:59:24,000 Ngunit ko lamang inilagay ang mga tao sa kanan. 1058 00:59:24,000 --> 00:59:28,000 >> Nararamdaman tulad ako pag-aaksaya ng espasyo, at kalaunan aking queue disintegrates sa wala sa lahat, 1059 00:59:28,000 --> 00:59:31,000 kaya kami lang tao wraparound, 1060 00:59:31,000 --> 00:59:35,000 at sa tingin namin ng ito array talaga dahil ang ilang mga uri ng pabilog na istraktura, 1061 00:59:35,000 --> 00:59:38,000 ngunit ginagamit namin kung ano ang operator sa C upang gawin na uri ng wraparound? 1062 00:59:38,000 --> 00:59:40,000 [Hindi marinig na mag-aaral tugon] >> Ang modulo operator. 1063 00:59:40,000 --> 00:59:43,000 Ito ay isang maliit na nakakainis na sa tingin sa pamamagitan ng kung paano ang gagawin mo sa wraparound, 1064 00:59:43,000 --> 00:59:46,000 ngunit maaari naming gawin ito, at maaaring namin simulan ang paglalagay ng mga tao sa kung ano ang ginamit sa harap ng linya, 1065 00:59:46,000 --> 00:59:52,000 ngunit hindi namin lamang tandaan na ito ulo variable na talaga ang aktwal na pinuno ng linya. 1066 00:59:52,000 --> 00:59:57,000 Paano kung, sa halip, ang aming layunin sa huli, bagaman, 1067 00:59:57,000 --> 01:00:00,000 ay maghanap ng mga numero, tulad ng ginawa namin dito sa entablado na may Anita, 1068 01:00:00,000 --> 01:00:02,000 ngunit hindi namin talagang gusto ang pinakamahusay na ng lahat ng mga mundo? 1069 01:00:02,000 --> 01:00:05,000 Gusto namin ng karagdagang pagiging sopistikado kaysa array ay nagbibigay-daan sa 1070 01:00:05,000 --> 01:00:09,000 dahil gusto naming ang kakayahan upang dynamic na palaguin ang data na istraktura. 1071 01:00:09,000 --> 01:00:12,000 Ngunit hindi namin nais sa resort sa isang bagay na tulis namin ang 1072 01:00:12,000 --> 01:00:15,000 sa unang panayam ay hindi isang pinakamainam na algorithm, 1073 01:00:15,000 --> 01:00:17,000 na ng linear paghahanap. 1074 01:00:17,000 --> 01:00:21,000 Ito lumiliko out na maaari mong, sa katunayan, makamit 1075 01:00:21,000 --> 01:00:24,000 o hindi bababa sa malapit sa pare-pareho ang oras, kung saan ang isang tao tulad ng Anita, 1076 01:00:24,000 --> 01:00:27,000 kung siya Kino-configure ang kanyang data istraktura hindi sa isang naka-link na listahan, 1077 01:00:27,000 --> 01:00:30,000 hindi isang stack, hindi queue, maaari, sa katunayan, 1078 01:00:30,000 --> 01:00:33,000 makabuo ng mga istraktura ng data na nagbibigay-daan sa kanya upang maghanap ng mga bagay, 1079 01:00:33,000 --> 01:00:37,000 kahit salita, hindi lamang mga numero, sa kung ano ang namin tumawag ng pare-pareho ang oras. 1080 01:00:37,000 --> 01:00:40,000 >> At sa katunayan, naghahanap magpatuloy, isa sa ang mga psets sa ganitong uri ay halos palaging 1081 01:00:40,000 --> 01:00:43,000 isang pagpapatupad ng isang spellchecker, kung saan 1082 01:00:43,000 --> 01:00:46,000 bigyan ka namin muli ng ilang 150,000 na mga salitang Ingles at ang layunin ay upang 1083 01:00:46,000 --> 01:00:51,000 load ang mga sa memory at mabilis na upang sagutin ang mga katanungan ng form 1084 01:00:51,000 --> 01:00:54,000 ay naisulat ng tama ang salitang ito? 1085 01:00:54,000 --> 01:00:58,000 At ito talaga sipsipin kung mayroon kang umulit sa pamamagitan ng lahat ng 150,000 salita upang sagutin na. 1086 01:00:58,000 --> 01:01:02,000 Ngunit, sa katunayan, gagamitin namin makita na maaari naming gawin ito sa napaka, napaka-mabilis na oras. 1087 01:01:02,000 --> 01:01:06,000 At ito upang makasali ang pagpapatupad ng isang bagay na tinatawag na ng hash table, 1088 01:01:06,000 --> 01:01:09,000 at kahit sa unang tingin ito bagay na tinatawag ng hash table ay pagpunta sa 1089 01:01:09,000 --> 01:01:12,000 ipaalam sa amin makamit ang mga sobrang mabilis na oras ng pagtugon, 1090 01:01:12,000 --> 01:01:18,000 ito lumiliko out na may ay sa katunayan ang problema. 1091 01:01:18,000 --> 01:01:23,000 Pagdating panahon upang ipatupad ang bagay na tinatawag na-muli, ako ginagawa itong muli. 1092 01:01:23,000 --> 01:01:25,000 Ako isa lamang dito. 1093 01:01:25,000 --> 01:01:28,000 Pagdating oras sa pagpapatupad na ito bagay na tinatawag ng hash table, 1094 01:01:28,000 --> 01:01:30,000 kami ay pagpunta sa may upang gumawa ng desisyon. 1095 01:01:30,000 --> 01:01:32,000 Gaano kalaki ang dapat bagay na ito aktwal na? 1096 01:01:32,000 --> 01:01:36,000 At kapag sinimulan namin ang pagpasok ng mga numero sa ito hash table, 1097 01:01:36,000 --> 01:01:38,000 paano namin upang mag-imbak ang mga ito sa isang paraan 1098 01:01:38,000 --> 01:01:42,000 namin ang mga ito pabalik ang nang mabilis hangga't nakuha namin sa kanila sa? 1099 01:01:42,000 --> 01:01:45,000 Ngunit gagamitin namin ang bago mahaba na ang tanong na ito ng 1100 01:01:45,000 --> 01:01:48,000 kapag ang kaarawan ng lahat sa klase ay medyo dyermeyn. 1101 01:01:48,000 --> 01:01:51,000 Ito lumiliko out na sa kuwartong ito, Mayroon kami ng ilang daang mga tao, 1102 01:01:51,000 --> 01:01:56,000 kaya ang mga logro na ang dalawang sa atin ang parehong kaarawan marahil ay medyo mataas. 1103 01:01:56,000 --> 01:01:58,000 Paano kung may 40 lamang ng sa amin sa kuwartong ito? 1104 01:01:58,000 --> 01:02:02,000 Ano ang mga logro ng dalawang tao na nagkakaroon ng parehong kaarawan? 1105 01:02:02,000 --> 01:02:04,000 [Mag-aaral] Higit sa 50%. 1106 01:02:04,000 --> 01:02:06,000 Oo, higit sa 50%. Sa katunayan, dinala ko kahit isang chart. 1107 01:02:06,000 --> 01:02:08,000 Ito lumiliko out at talaga ito ng sneak preview- 1108 01:02:08,000 --> 01:02:12,000 kung may 58 lamang ng sa amin sa kuwartong ito, ang posibilidad ng 2 sa atin 1109 01:02:12,000 --> 01:02:16,000 pagkakaroon ng parehong kaarawan hugely mataas, halos 100%, 1110 01:02:16,000 --> 01:02:20,000 at na pagpunta sa maging sanhi ng ang maramihang mga nasaktan para sa amin sa Miyerkules. 1111 01:02:20,000 --> 01:02:24,000 >> Gamit na sinabi, sabihin ipinid dito. Susubukan naming makita sa Miyerkules. 1112 01:02:24,000 --> 01:02:28,000 [Palakpakan] 1113 01:02:28,000 --> 01:02:30,000 [CS50.TV]