1 00:00:00,000 --> 00:00:03,000 [Powered by Google Translate] [Linggo 4] 2 00:00:03,000 --> 00:00:05,000 [David J. Malan] [Harvard University] 3 00:00:05,000 --> 00:00:08,000 [Ito ay CS50.] [CS50.TV] 4 00:00:08,000 --> 00:00:12,000 >> Karapatan lahat, ito ay CS50, at ito ay ang simula ng linggo 4, 5 00:00:12,000 --> 00:00:16,000 at ito ay isa sa pinakamabagal na posibleng pag-uuri algorithm. 6 00:00:16,000 --> 00:00:19,000 Aling isa ay ito na lang namin pinanood doon? 7 00:00:19,000 --> 00:00:24,000 Na-uri-uriin ng bubble, upang malaki O (n ^ 2) + kabuuan, 8 00:00:24,000 --> 00:00:28,000 at sa katunayan ay hindi lang kami ang mga sa mundong ito mukhang malaman 9 00:00:28,000 --> 00:00:30,000 ano bubble-uuri o nito tumatakbo oras. 10 00:00:30,000 --> 00:00:33,000 Sa katunayan, ito ay isang pakikipanayam sa Eric Schmidt ng Google 11 00:00:33,000 --> 00:00:45,000 at dating senador Barack Obama ng ilang taon na ang nakakaraan. 12 00:00:45,000 --> 00:00:48,000 >> Ngayon, Senator, ikaw dito sa Google, 13 00:00:48,000 --> 00:00:54,000 at gusto kong mag-isip ng pagkapangulo bilang isang pakikipanayam sa trabaho. 14 00:00:54,000 --> 00:00:58,000 Ngayon, mahirap upang makakuha ng isang trabaho bilang pangulo, at ikaw ay pagpunta sa pamamagitan ng mga kahirapan sa ngayon. 15 00:00:58,000 --> 00:01:00,000 Ring mahirap upang makakuha ng trabaho sa Google. 16 00:01:00,000 --> 00:01:05,000 Mayroon kaming mga tanong, at hinihiling namin ang aming mga katanungan kandidato, 17 00:01:05,000 --> 00:01:10,000 at ang isang ito ay mula sa Larry Schwimmer. 18 00:01:10,000 --> 00:01:14,000 Mong guys tingin ko kidding? Dito mismo. 19 00:01:14,000 --> 00:01:18,000 Ano ang pinaka-mahusay na paraan upang pag-uri-uriin ang isang milyong 32-bit integer? 20 00:01:18,000 --> 00:01:21,000 [Tawa] 21 00:01:21,000 --> 00:01:24,000 Well- 22 00:01:24,000 --> 00:01:26,000 Ikinalulungkot ko. >> Hindi, hindi, hindi, hindi. 23 00:01:26,000 --> 00:01:34,000 Tingin ko ang bubble-uuri ay maling paraan upang pumunta. 24 00:01:34,000 --> 00:01:39,000 >> Halika sa, na sinabi sa kanya na ito? 25 00:01:39,000 --> 00:01:43,000 Huling linggo na manariwa sa diwa namin kinuha ng pahinga mula sa code, hindi bababa sa para sa isang araw, 26 00:01:43,000 --> 00:01:46,000 at nagsimulang tumutuon sa ilang mga mas mataas na mga antas ng ideya at problema sa paglutas sa mas pangkalahatang 27 00:01:46,000 --> 00:01:49,000 sa konteksto ng paghahanap at pag-uuri-uri, 28 00:01:49,000 --> 00:01:53,000 at ipinakilala namin ang isang bagay na hindi namin sampal ang pangalan na ito sa nakaraang linggo, 29 00:01:53,000 --> 00:01:56,000 ngunit asymptotic notation, ang Big O, ang Big Omega, 30 00:01:56,000 --> 00:02:00,000 at kung minsan ang Big pagtatanda Theta, at mga ito ay simpleng paraan 31 00:02:00,000 --> 00:02:02,000 naglalarawan ang oras ng mga algorithm, 32 00:02:02,000 --> 00:02:05,000 kung gaano karaming oras na aabutin para sa isang algorithm upang tumakbo. 33 00:02:05,000 --> 00:02:08,000 >> At maaari mong isipin ang na uusapang mo tungkol sa ang oras sa mga tuntunin ng laki 34 00:02:08,000 --> 00:02:11,000 ng input, na namin pangkalahatan tumawag n, anumang ang problema ay maaaring, 35 00:02:11,000 --> 00:02:13,000 kung saan ang n ay ang bilang ng mga tao sa room, 36 00:02:13,000 --> 00:02:17,000 ang bilang ng mga pahina sa isang libro ng telepono, at nagsimula kaming na magsulat ng mga bagay ang 37 00:02:17,000 --> 00:02:21,000 tulad ng O (n ^ 2) o O (n) o O (n log n), 38 00:02:21,000 --> 00:02:24,000 at kahit na ang matematika ay hindi pa ehersisyo ang kaya perpektong 39 00:02:24,000 --> 00:02:28,000 at n ² - n / 2 o isang bagay tulad na 40 00:02:28,000 --> 00:02:31,000 gusto namin sa halip lang itapon ilang ng mas mababang mga tuntunin ng order, 41 00:02:31,000 --> 00:02:34,000 at ang pagganyak sa may namin talagang gusto 42 00:02:34,000 --> 00:02:37,000 uri ng layunin na paraan ng pagsusuri ng 43 00:02:37,000 --> 00:02:39,000 ang pagganap ng mga programa o ang pagganap ng mga algorithm 44 00:02:39,000 --> 00:02:42,000 na sa pagtatapos ng araw ay walang kinalaman sa, halimbawa, 45 00:02:42,000 --> 00:02:45,000 ang bilis ng iyong computer ngayon. 46 00:02:45,000 --> 00:02:47,000 >> Halimbawa, kung ikaw ipatupad ang bubble-uuri, 47 00:02:47,000 --> 00:02:50,000 o ipatupad-sumanib-uuri o pagpili-uuri sa computer ngayon, 48 00:02:50,000 --> 00:02:53,000 ng 2 computer na GHz, at patakbuhin mo ito, 49 00:02:53,000 --> 00:02:56,000 at ito ay tumatagal ng ilang bilang ng mga segundo, sa susunod na taon may 3 GHz 50 00:02:56,000 --> 00:02:59,000 o 4 na computer GHz, at maaaring pagkatapos claim na "Wow, algorithm aking 51 00:02:59,000 --> 00:03:03,000 ngayon ay dalawang beses nang mas mabilis, "kapag sa katotohanan na malinaw naman hindi kaso. 52 00:03:03,000 --> 00:03:06,000 Lang hardware na nakuha ng mas mabilis, ngunit ang iyong computer 53 00:03:06,000 --> 00:03:10,000 ay hindi, at sa gayon ba talagang itapon ang mga bagay tulad ng 54 00:03:10,000 --> 00:03:13,000 multiple ng 2 o multiple ng 3 pagdating sa naglalarawan 55 00:03:13,000 --> 00:03:17,000 kung gaano kabilis o kung paano mabagal algorithm ang isang at talagang lamang tumuon 56 00:03:17,000 --> 00:03:20,000 sa n o ilang mga kadahilanan nito, 57 00:03:20,000 --> 00:03:24,000 ilang kapangyarihan nito tulad ng sa kaso ng uri mula sa nakaraang linggo. 58 00:03:24,000 --> 00:03:27,000 At isipin ang na sa tulong ng pagsasama-uuri 59 00:03:27,000 --> 00:03:31,000 nagawa naming upang gawin ito mas mas mahusay kaysa sa bubble-uuri at pagpili-uuri 60 00:03:31,000 --> 00:03:33,000 at kahit pagpapasok ng-uuri. 61 00:03:33,000 --> 00:03:36,000 >> Nakuha namin pababa sa n log n, at muli, 62 00:03:36,000 --> 00:03:39,000 isipin ang na log n sa pangkalahatan ay tumutukoy sa isang bagay na lumalaki 63 00:03:39,000 --> 00:03:43,000 mas mabagal pagkatapos n, kaya n log n sa gayon ay malayo ay mabuti 64 00:03:43,000 --> 00:03:45,000 dahil ito ay mas mababa kaysa sa n ². 65 00:03:45,000 --> 00:03:47,000 Ngunit upang makamit n log n sa pagsasama-uuri 66 00:03:47,000 --> 00:03:51,000 kung ano ang pangunahing mikrobiyo ng isang ideya na nagkaroon kami pakikinabangan 67 00:03:51,000 --> 00:03:54,000 na rin naming magagamit sa linggo 0? 68 00:03:54,000 --> 00:03:58,000 Paano mo cleverly namin na matugunan ang mga problema ng pag-uuri-uri sa pagsasama-uuri? 69 00:03:58,000 --> 00:04:04,000 Ano ang key na pananaw, marahil? 70 00:04:04,000 --> 00:04:07,000 Sinuman sa lahat. 71 00:04:07,000 --> 00:04:09,000 Okay, sabihin tumagal ng isang hakbang pabalik. 72 00:04:09,000 --> 00:04:11,000 Ilarawan ang sumanib-uuri sa iyong sariling mga salita. 73 00:04:11,000 --> 00:04:15,000 Paano ito gumagana? 74 00:04:15,000 --> 00:04:17,000 Okay, makikita namin ang hilera pabalik sa linggo 0. 75 00:04:17,000 --> 00:04:19,000 Okay, oo. 76 00:04:19,000 --> 00:04:22,000 [Hindi marinig na mag-aaral] 77 00:04:22,000 --> 00:04:26,000 Okay, mahusay, kaya hinati namin ang hanay ng mga numero sa 2 piraso. 78 00:04:26,000 --> 00:04:29,000 Pinagsunod-sunod namin sa bawat ng mga piraso, at pagkatapos Pinagsama namin ang mga ito, 79 00:04:29,000 --> 00:04:33,000 at nakakita kami ng ideya na ito bago ng paglalaan ng problema na ito malaki 80 00:04:33,000 --> 00:04:36,000 at pagpuputol ito sa isang problema na ito malaki o ito malaki. 81 00:04:36,000 --> 00:04:38,000 >> Manariwa sa diwa ang halimbawa ng aklat ng telepono. 82 00:04:38,000 --> 00:04:42,000 Manariwa sa diwa ang self-nadaragdagan algorithm mula sa linggo na nakalipas, 83 00:04:42,000 --> 00:04:45,000 kaya sumanib-uuri ay summarized sa pamamagitan ng ito pseudocode dito. 84 00:04:45,000 --> 00:04:48,000 Kapag binibigyan ka n elemento, unang ito ay katinuan suriin. 85 00:04:48,000 --> 00:04:51,000 Kung n <2 pagkatapos ay hindi gawin sa lahat 86 00:04:51,000 --> 00:04:55,000 dahil kung n <2 pagkatapos n malinaw naman sa 0 o 1, 87 00:04:55,000 --> 00:04:57,000 at kaya kung ito ay alinman sa 0 o 1 may walang kinalaman upang ayusin. 88 00:04:57,000 --> 00:04:59,000 Tapos ka na. 89 00:04:59,000 --> 00:05:01,000 Ang iyong listahan ay trivially pinagsunod-sunod. 90 00:05:01,000 --> 00:05:04,000 Ngunit kung hindi man ay kung mayroon kang 2 o higit pang mga elemento sige at hatiin ang mga ito 91 00:05:04,000 --> 00:05:06,000 sa 2 halves, kaliwa at kanan. 92 00:05:06,000 --> 00:05:09,000 -Uri-uriin ang bawat isa sa mga halves, at pagkatapos ay sumanib ang pinagsunod-sunod halves. 93 00:05:09,000 --> 00:05:13,000 Ngunit ang problema dito ay na sa unang tingin ito nararamdaman tulad namin ay punting. 94 00:05:13,000 --> 00:05:17,000 Ito ay isang pabilog na kahulugan sa na kung tatanungin ko ang mong upang pag-uri-uriin ang mga elemento ng n 95 00:05:17,000 --> 00:05:22,000 at ikaw ay nagsasabi sa akin "Ang lahat ng mga karapatan, fine, magpapadala kami-uri-uriin ang mga elementong iyon n / 2 at mga n / 2," 96 00:05:22,000 --> 00:05:27,000 pagkatapos ay ang aking susunod na tanong ay pagpunta sa "Fine, kung paano mo ayusin ang n / 2 elemento?" 97 00:05:27,000 --> 00:05:30,000 >> Ngunit dahil sa ang istraktura ng programang ito, 98 00:05:30,000 --> 00:05:33,000 dahil may base kaso na ito, kaya na magsalita, 99 00:05:33,000 --> 00:05:39,000 ito espesyal na kaso na nagsasabing kung n 00:05:42,000 Huwag tumugon kasama na parehong pabilog na sagot. 101 00:05:42,000 --> 00:05:46,000 Ang prosesong ito, ang cyclicity ito ay malaon magtapos. 102 00:05:46,000 --> 00:05:50,000 Kung hihilingin ko sa iyo "-uri-uriin ang mga ito n mga elemento," at sabihin mo, "Fine, uri-uriin ang mga n / 2," 103 00:05:50,000 --> 00:05:53,000 sinabi mong, "Fine,-uri-uriin ang mga n / 4, n / 8, n/16," 104 00:05:53,000 --> 00:05:56,000 kalaunan mong hatiin sa pamamagitan ng isang malaking sapat na bilang 105 00:05:56,000 --> 00:05:59,000 na magkakaroon ka lamang 1 kaliwa ng elemento, kung saan maaari mong sabihin, 106 00:05:59,000 --> 00:06:02,000 "Narito, narito ang isang pinagsunod-sunod na single na elemento." 107 00:06:02,000 --> 00:06:06,000 Pagkatapos ang kinang ng algorithm na ito up dito upang makakuha ng mula sa katotohanang 108 00:06:06,000 --> 00:06:09,000 na sa sandaling mayroon ka ng lahat ng mga indibidwal pinagsunod-sunod na listahan, 109 00:06:09,000 --> 00:06:12,000 lahat ng mga ito ng laki 1, na tila na maging walang silbi, 110 00:06:12,000 --> 00:06:15,000 sa sandaling sinimulan mo pinagsasama ang mga ito at pinagsasama ang mga ito 111 00:06:15,000 --> 00:06:19,000 bumuo ka wakas bilang Rob ginawa sa video ng wakas pinagsunod-sunod sa listahan. 112 00:06:19,000 --> 00:06:22,000 >> Ngunit ideya na ito ay umaabot malayo sa pag-uuri. 113 00:06:22,000 --> 00:06:26,000 May ay ang ideya na ito na naka-embed sa programang ito na kilala bilang recursion, 114 00:06:26,000 --> 00:06:29,000 ang ideya na kung saan ikaw ay isang programa, 115 00:06:29,000 --> 00:06:32,000 at upang malutas ang ilang mga problema tawagan mo ang iyong sarili, 116 00:06:32,000 --> 00:06:36,000 o ilagay sa konteksto ng mga wika ng programming ikaw ay isang function, 117 00:06:36,000 --> 00:06:39,000 at upang malutas ang isang problema, ang function na tawagan ang iyong sarili 118 00:06:39,000 --> 00:06:42,000 muli at muli at muli, ngunit mo ang function na 119 00:06:42,000 --> 00:06:44,000 hindi maaaring tumawag ang iyong sarili walang hanggan maraming beses. 120 00:06:44,000 --> 00:06:47,000 Kalaunan mayroon kang ibaba ang, kaya na magsalita, 121 00:06:47,000 --> 00:06:49,000 at ilang mga hard-code base kondisyon na nagsasabing 122 00:06:49,000 --> 00:06:53,000 sa puntong ito tumigil sa pagtawag sa iyong sarili kaya na ang buong proseso 123 00:06:53,000 --> 00:06:56,000 sa wakas ay sa katunayan itigil. 124 00:06:56,000 --> 00:06:58,000 Ano ang talagang ibig sabihin, sa recurse? 125 00:06:58,000 --> 00:07:01,000 >> Natin makita, kung maaari naming gawin ang isang simple, trivia Halimbawa, sabihin nating, 126 00:07:01,000 --> 00:07:03,000 3 tao sa akin hanggang dito sa entablado, kung ang isang tao ay kumportable. 127 00:07:03,000 --> 00:07:06,000 1, ay sa up, 2 at 3. 128 00:07:06,000 --> 00:07:09,000 Kung ikaw 3 gusto upang makabuo dito. 129 00:07:09,000 --> 00:07:12,000 Kung nais mong tumayo sa tabi mismo sa akin dito sa isang linya, ipagpalagay na ang mga problema sa kamay 130 00:07:12,000 --> 00:07:15,000 ay napaka trivially bilangin ang bilang ng mga tao na dito. 131 00:07:15,000 --> 00:07:18,000 Subalit lantaran, ako pagod ng lahat ng mga pagbibilang halimbawa. 132 00:07:18,000 --> 00:07:21,000 Ito ay pagpunta sa tumagal ng ilang oras, 1, 2, at tuldok, tuldok, tuldok. 133 00:07:21,000 --> 00:07:23,000 Ito ay pagpunta sa tumagal magpakailanman. 134 00:07:23,000 --> 00:07:25,000 Gusto ko na lamang tumikin ang problema na ito nang sama-sama sa tulong ng kung ano ang iyong pangalan? 135 00:07:25,000 --> 00:07:27,000 Sara. >> Sara, ang lahat ng karapatan. 136 00:07:27,000 --> 00:07:29,000 Kelly. >> Kelly at? 137 00:07:29,000 --> 00:07:31,000 >> Willy. >> Willy, Sara, Kelly, at Willy. 138 00:07:31,000 --> 00:07:34,000 Sa ngayon ako ay tanungin ang tanong ng isang tao 139 00:07:34,000 --> 00:07:37,000 kung gaano karaming mga tao ay sa yugtong ito, at mayroon akong mga ideya. 140 00:07:37,000 --> 00:07:40,000 Ito ay isang talagang mahabang listahan, at kaya sa halip ako pagpunta sa gawin ito nanlilinlang. 141 00:07:40,000 --> 00:07:43,000 Ako pagpunta sa hilingin sa tao na susunod sa akin upang gawin ang karamihan ng trabaho, 142 00:07:43,000 --> 00:07:46,000 at sa sandaling siya ay tapos na paggawa ng karamihan ng trabaho 143 00:07:46,000 --> 00:07:49,000 Ako pagpunta sa gawin ang hindi bababa sa halaga ng trabaho na posibleng at magdagdag ng 1 144 00:07:49,000 --> 00:07:51,000 sa anumang kanyang sagot, kaya dito namin pumunta. 145 00:07:51,000 --> 00:07:54,000 Ko na tinanong kung gaano karaming mga tao sa entablado. 146 00:07:54,000 --> 00:07:57,000 Gaano karaming mga tao sa entablado sa kaliwa ng sa iyo? 147 00:07:57,000 --> 00:08:00,000 Sa kaliwa ko? >> Okay, ngunit hindi impostor. 148 00:08:00,000 --> 00:08:04,000 Iyon ay mabuti, na tama, ngunit kung gusto naming ipagpatuloy ang logic 149 00:08:04,000 --> 00:08:08,000 sabihin ipinapalagay na gusto mo katulad sa tumikin ang problemang ito sa kaliwa ng, 150 00:08:08,000 --> 00:08:11,000 kaya sa halip na sagot nang direkta sige at lang makapasa sa pera. 151 00:08:11,000 --> 00:08:14,000 Oh, kung gaano karaming mga tao ang sa kaliwa ko? 152 00:08:14,000 --> 00:08:16,000 Gaano karaming mga tao ang sa kaliwa? 153 00:08:16,000 --> 00:08:18,000 1. 154 00:08:18,000 --> 00:08:27,000 [Tawa] 155 00:08:27,000 --> 00:08:30,000 Okay, kaya 0, kaya kung ano ngayon Willy nagawa 156 00:08:30,000 --> 00:08:33,000 ay ibinalik iyong sagot direksyon na ito sinasabi 0. 157 00:08:33,000 --> 00:08:36,000 Ngayon, kung ano ang dapat mong gawin? >> 1. 158 00:08:36,000 --> 00:08:39,000 Okay, kaya ikaw ang 1, kaya sabihin mo, "Lahat ng karapatan, ako na magdagdag ng 1 159 00:08:39,000 --> 00:08:41,000 sa anumang Willy ng count ay, "kaya 1 + 0. 160 00:08:41,000 --> 00:08:43,000 Ka na ngayon ng 1 sa gayon ang iyong sagot sa kanan na ngayon ang 161 00:08:43,000 --> 00:08:45,000 1. >> At minahan ay 2. 162 00:08:45,000 --> 00:08:48,000 Mabuti, kaya ka paglalaan ng nakaraang sagot ng 1, 163 00:08:48,000 --> 00:08:51,000 sa pagdaragdag ng kaunting halaga ng trabaho na gusto mong gawin, na +1. 164 00:08:51,000 --> 00:08:55,000 Mayroon ka na ngayong 2, at pagkatapos mo ipasa sa akin kung aling halaga? 165 00:08:55,000 --> 00:08:57,000 3, Ibig kong sabihin, paumanhin, 2. 166 00:08:57,000 --> 00:08:59,000 Mabuti. 167 00:08:59,000 --> 00:09:02,000 >> Well, nagkaroon kami 0 sa kaliwa. 168 00:09:02,000 --> 00:09:05,000 Pagkatapos namin ay may 1, at pagkatapos namin magdagdag ng 2, 169 00:09:05,000 --> 00:09:07,000 at ngayon ka handing sa akin ang bilang 2, 170 00:09:07,000 --> 00:09:10,000 at sa gayon ako sinasabi, okay, +1, 3. 171 00:09:10,000 --> 00:09:13,000 Mayroong sa katunayan 3 tao nakatayo sa tabi sa akin sa yugtong ito, 172 00:09:13,000 --> 00:09:16,000 kaya maaaring malinaw naman namin nagawa ito napaka linearly, 173 00:09:16,000 --> 00:09:19,000 Sobra sa halatang paraan, ngunit kung ano ang namin talagang gawin? 174 00:09:19,000 --> 00:09:21,000 Kinuha namin simula ng problema ng laki 3. 175 00:09:21,000 --> 00:09:24,000 Pagkatapos namin sinira ito sa isang problema ng laki 2, 176 00:09:24,000 --> 00:09:27,000 pagkatapos ng problema ng 1 laki, at pagkatapos ay sa wakas ang base kaso 177 00:09:27,000 --> 00:09:29,000 ay talaga, oh, walang isa doon, 178 00:09:29,000 --> 00:09:33,000 sa puntong Willy ibinalik epektibong isang hard-code answer ng ilang beses, 179 00:09:33,000 --> 00:09:36,000 at ang pangalawang isa ay pagkatapos bubbled up, bubbled up, bubbled up, 180 00:09:36,000 --> 00:09:39,000 at pagkatapos ay sa pamamagitan ng pagdaragdag sa isang karagdagang 1 181 00:09:39,000 --> 00:09:41,000 naipatupad namin ang pangunahing ideya ng recursion. 182 00:09:41,000 --> 00:09:44,000 >> Ngayon, sa kasong ito ay hindi ito talagang malutas ang isang problema 183 00:09:44,000 --> 00:09:46,000 anumang mas epektibo pagkatapos ay nasaksihan namin sa gayon malayo. 184 00:09:46,000 --> 00:09:48,000 Ngunit sa tingin tungkol sa mga algorithm na ginawa namin sa entablado sa gayon ngayon. 185 00:09:48,000 --> 00:09:51,000 Nagkaroon kami ng 8 piraso ng papel sa Chalkboard, 186 00:09:51,000 --> 00:09:55,000 sa video kapag Sean ay naghahanap para sa bilang 7, at kung ano ay siya talagang gawin? 187 00:09:55,000 --> 00:09:58,000 Well, hindi siya ginawa anumang uri ng hatiin at lupigin. 188 00:09:58,000 --> 00:10:01,000 Hindi niya gawin ang anumang uri ng recursion. 189 00:10:01,000 --> 00:10:03,000 Sa halip siya lang ginawa ito linear algorithm. 190 00:10:03,000 --> 00:10:07,000 Ngunit kapag ipinakilala namin ang ideya ng pinagsunod-sunod na mga numero sa entablado nakatira noong nakaraang linggo 191 00:10:07,000 --> 00:10:09,000 pagkatapos namin ay ang likas na ugali na ito ng pagpunta sa gitna, 192 00:10:09,000 --> 00:10:13,000 sa puntong kami ay may isang mas maliit na listahan ng mga laki 4 o isa pang listahan ng mga laki 4, 193 00:10:13,000 --> 00:10:17,000 at pagkatapos namin ay ang eksaktong parehong problema, kaya namin paulit-ulit, paulit-ulit, paulit-ulit. 194 00:10:17,000 --> 00:10:19,000 Sa ibang salita, hindi namin recursed. 195 00:10:19,000 --> 00:10:24,000 Maraming salamat sa inyo sa aming 3 boluntaryo dito para sa nagpapakita ng recursion sa amin. 196 00:10:24,000 --> 00:10:28,000 >> Natin makita kung hindi namin ito ng kaunti pa kongkreto na ngayon, 197 00:10:28,000 --> 00:10:30,000 paglutas ng problema na muli kami maaaring gawin medyo madali, 198 00:10:30,000 --> 00:10:34,000 ngunit gagamitin namin ang mga ito bilang isang stepping bato sa pagpapatupad ng pangunahing ideya na ito. 199 00:10:34,000 --> 00:10:37,000 Kung gusto ko upang makalkula ang kabuuan ng isang bungkos ng mga numero, 200 00:10:37,000 --> 00:10:39,000 halimbawa, kung pumasa ka sa numero 3, 201 00:10:39,000 --> 00:10:42,000 Gusto kong upang ibigay sa iyo ang halaga ng palatandaan 3, 202 00:10:42,000 --> 00:10:46,000 kaya ang kabuuan ng 3 + 2 + 1 + 0. 203 00:10:46,000 --> 00:10:48,000 Gusto ko upang makabalik ang sagot 6, 204 00:10:48,000 --> 00:10:51,000 kaya makikita namin ipatupad ito palatandaan na ang function, ito pagbubuo function na 205 00:10:51,000 --> 00:10:54,000 na, muli, tumatagal sa input, at pagkatapos ay bumalik ang pagbubuo 206 00:10:54,000 --> 00:10:57,000 ng numerong iyon ang lahat ng mga paraan down sa 0. 207 00:10:57,000 --> 00:10:59,000 Maaari naming gawin ito medyo lamang, i-right? 208 00:10:59,000 --> 00:11:01,000 Maaari naming gawin ito na may ilang mga uri ng looping istraktura, 209 00:11:01,000 --> 00:11:04,000 kaya hayaan mo akong magpatuloy at makakuha ng ito nagsimula. 210 00:11:04,000 --> 00:11:07,000 >> Isama stdio.h. 211 00:11:07,000 --> 00:11:09,000 Hayaan akong makakuha ng aking sarili sa pangunahing gumagana sa dito. 212 00:11:09,000 --> 00:11:12,000 Sabihin i-save ang bilang sigma.c. 213 00:11:12,000 --> 00:11:14,000 Pagkatapos ako pagpunta sa pumunta sa dito, at ako pagpunta upang idedeklara isang int n, 214 00:11:14,000 --> 00:11:18,000 at ako pagpunta sa gawin ang mga sumusunod habang ang gumagamit ay hindi makikipagtulungan. 215 00:11:18,000 --> 00:11:22,000 Habang ang gumagamit ay hindi ibinigay sa akin ng isang positibong numero 216 00:11:22,000 --> 00:11:26,000 hayaan mo akong magpatuloy at prompt ang mga ito para sa n = GetInt, 217 00:11:26,000 --> 00:11:28,000 at hayaan mo akong bigyan sila ng ilang mga tagubilin kung ano ang gagawin, 218 00:11:28,000 --> 00:11:33,000 kaya printf ("Positibong integer mangyaring"). 219 00:11:33,000 --> 00:11:39,000 Lamang ng isang bagay na medyo simple tulad nito kaya ng oras namin maabot ang linya 14 220 00:11:39,000 --> 00:11:42,000 namin ngayon ay isang positibong integer baka sa n. 221 00:11:42,000 --> 00:11:44,000 >> Ngayon sabihin gawin ang isang bagay dito. 222 00:11:44,000 --> 00:11:50,000 Hayaan akong magpatuloy at compute ang pagbubuo, kaya int sum = palatandaan (n). 223 00:11:50,000 --> 00:11:54,000 Sigma lamang ang kabuuan, kaya lang Sumusulat ako ito sa ang may interes na paraan. 224 00:11:54,000 --> 00:11:56,000 Lang namin tumawag ito palatandaan doon. 225 00:11:56,000 --> 00:11:58,000 Iyon ang kabuuan, at ngayon ako pagpunta sa i-print ang resulta, 226 00:11:58,000 --> 00:12:08,000 printf ("kabuuan ay% d, \ n", kabuuan). 227 00:12:08,000 --> 00:12:11,000 At pagkatapos ay kukunin ko na bumalik ng 0 para sa mahusay na sukatan. 228 00:12:11,000 --> 00:12:15,000 Gawin namin ang lahat na ito ay nangangailangan ng programa maliban sa mga kawili-wiling bahagi, 229 00:12:15,000 --> 00:12:18,000 na sa aktwal na ipatupad ang palatandaan function na. 230 00:12:18,000 --> 00:12:22,000 >> Ipaalam sa akin pumunta down dito hanggang sa ibaba, at ipaalam sa akin na idedeklara ang function na palatandaan. 231 00:12:22,000 --> 00:12:26,000 Ito ay nakuha sa isang variable na ng uri ng integer, 232 00:12:26,000 --> 00:12:30,000 at kung anong uri ng data ang gusto ko upang bumalik baka mula palatandaan? 233 00:12:30,000 --> 00:12:34,000 Int, dahil gusto ko ito upang tumugma sa aking mga inaasahan sa linya 15. 234 00:12:34,000 --> 00:12:37,000 In dito hayaan mo akong magpatuloy at ipatupad ang 235 00:12:37,000 --> 00:12:41,000 sa isang medyo tapat na paraan. 236 00:12:41,000 --> 00:12:45,000 >> Natin sige at sabihin int sum = 0, 237 00:12:45,000 --> 00:12:47,000 at ngayon ako pagpunta sa pumunta magkaroon ng isang maliit na para sa loop dito 238 00:12:47,000 --> 00:12:50,000 na sabihin na ang isang bagay tulad nito, 239 00:12:50,000 --> 00:13:01,000 para sa (int i = 0; ko <= numero; i + +) kabuuan + = i. 240 00:13:01,000 --> 00:13:05,000 At pagkatapos ay ako pagpunta upang bumalik sa kabuuan. 241 00:13:05,000 --> 00:13:07,000 Ko ipinapatupad ito sa anumang bilang ng mga paraan. 242 00:13:07,000 --> 00:13:09,000 Ko ay gumamit ng isang habang loop. 243 00:13:09,000 --> 00:13:11,000 Ko nilaktawan gamit ang kabuuan variable kung ko talagang gusto, 244 00:13:11,000 --> 00:13:15,000 ngunit sa maikling salita, namin lamang magkaroon ng isang function na kung ako ay hindi loko declares kabuuan ay 0. 245 00:13:15,000 --> 00:13:18,000 Pagkatapos ito iterates mula 0 sa up sa pamamagitan ng numero, 246 00:13:18,000 --> 00:13:23,000 at sa bawat pag-ulit nagdadagdag na kasalukuyang halaga sa kabuuan at pagkatapos ay bumalik kabuuan. 247 00:13:23,000 --> 00:13:25,000 >> Ngayon, may kaunting pag-optimize dito. 248 00:13:25,000 --> 00:13:29,000 Marahil ito ay isang nasayang na hakbang, ngunit kaya ito. Iyon ay pinong sa ngayon. 249 00:13:29,000 --> 00:13:32,000 Humihingi kami ng hindi bababa sa pagiging maingat at pagpunta 0 ang lahat ng mga paraan sa up. 250 00:13:32,000 --> 00:13:34,000 Hindi napakahirap at medyo direkta, 251 00:13:34,000 --> 00:13:37,000 ngunit ito lumiliko out na may function na palatandaan kami ay may pare-parehong pagkakataon 252 00:13:37,000 --> 00:13:39,000 namin ginawa dito sa entablado. 253 00:13:39,000 --> 00:13:42,000 Sa entablado binibilang lang namin kung gaano karaming mga tao ang tabi sa akin, 254 00:13:42,000 --> 00:13:47,000 ngunit sa halip kung gusto naming bilangin ang bilang 3 + 2 + 1 255 00:13:47,000 --> 00:13:51,000 sa down sa 0 maaari naming parehong tumikin sa isang function 256 00:13:51,000 --> 00:13:55,000 na ko sa halip ilarawan bilang recursive. 257 00:13:55,000 --> 00:13:57,000 Dito sabihin ay isang mabilis katinuan suriin at tiyakin ako hindi loko. 258 00:13:57,000 --> 00:14:00,000 >> Alam ko mayroong hindi bababa sa isang bagay sa programang ito na aking ginawa mali. 259 00:14:00,000 --> 00:14:04,000 Kapag ako ay pindutin ang enter ako pagpunta upang makakuha ng anumang uri ng sumisigaw sa akin? 260 00:14:04,000 --> 00:14:06,000 Ano ako pagpunta na yelled sa tungkol sa? 261 00:14:06,000 --> 00:14:11,000 Oo, nakalimutan ko ang prototype, kaya gumagamit ako ng isang function na tinatawag na palatandaan sa linya 15, 262 00:14:11,000 --> 00:14:16,000 ngunit hindi ito ipinahayag hanggang linya 22, kaya ko mahusay na maagap na pumunta dito 263 00:14:16,000 --> 00:14:22,000 at ipinapahayag ng prototype, at Sasabihin kong int palatandaan (int numero), at na ito. 264 00:14:22,000 --> 00:14:24,000 Ito ay ipinatupad sa ibaba. 265 00:14:24,000 --> 00:14:27,000 >> O isa pang paraan na maaari kong malutas ito, 266 00:14:27,000 --> 00:14:30,000 Maaari ko bang ilipat ang function na up doon, na kung saan ay hindi masama, 267 00:14:30,000 --> 00:14:32,000 ngunit hindi bababa sa kapag ang iyong mga programa ay magsisimulang upang makakuha ng mahaba, lantaran, 268 00:14:32,000 --> 00:14:35,000 Tingin ko ang ilang halaga sa palaging pagkakaroon ng pangunahing sa tuktok 269 00:14:35,000 --> 00:14:38,000 sa gayon ikaw sa reader buksan ang file at pagkatapos ay agad na makita 270 00:14:38,000 --> 00:14:40,000 kung ano ang programa ay ginagawa nang hindi na kinakailangang upang maghanap dito 271 00:14:40,000 --> 00:14:42,000 naghahanap para sa pangunahing function na. 272 00:14:42,000 --> 00:14:49,000 Natin pumunta pababa sa aking terminal na window dito, subukan ang paggawa ng palatandaan gumawa ng mga palatandaan, 273 00:14:49,000 --> 00:14:51,000 at screwed ko dito. 274 00:14:51,000 --> 00:14:55,000 Implicit deklarasyon ng function na GetInt ay nangangahulugan nakalimutan ko na ang gawin ano pa? 275 00:14:55,000 --> 00:14:57,000 [Hindi marinig na mag-aaral] 276 00:14:57,000 --> 00:15:00,000 Mabuti, kaya tila ng isang pangkaraniwang pagkakamali, kaya sabihin ilagay ito up dito, 277 00:15:00,000 --> 00:15:04,000 cs50.h, at ngayon sabihin bumalik sa aking terminal na window. 278 00:15:04,000 --> 00:15:08,000 >> Kukunin ko na i-clear ang screen, at makikita ko muling palabas ng pelikula gumawa ng palatandaan. 279 00:15:08,000 --> 00:15:11,000 Mukhang na pinagsama-sama. Hayaan akong ngayon patakbuhin ang palatandaan. 280 00:15:11,000 --> 00:15:15,000 Kukunin ko na-type sa bilang 3, at ako ay makakuha ng 6, kaya hindi isang mahigpit na check, 281 00:15:15,000 --> 00:15:18,000 ngunit hindi bababa sa tila nagtatrabaho sa unang tingin, ngunit ngayon sabihin punitin-hatiin ang mga ito, 282 00:15:18,000 --> 00:15:21,000 at sabihin aktwal na magamit ang ideya ng recursion, muli, 283 00:15:21,000 --> 00:15:24,000 sa isang napaka-simpleng konteksto upang sa ng ilang linggo 'oras 284 00:15:24,000 --> 00:15:27,000 kapag nagsimula kami tuklasin may interes istraktura ng data kaysa sa array 285 00:15:27,000 --> 00:15:30,000 kami ay may isa pang tool sa toolkit kung saan 286 00:15:30,000 --> 00:15:33,000 manipulahin ang mga istraktura ng data bilang makikita namin makita. 287 00:15:33,000 --> 00:15:36,000 Ito ang umuulit diskarte, ang mga loop diskarteng batay sa. 288 00:15:36,000 --> 00:15:39,000 >> Hayaan akong sa halip ngayon gawin ito. 289 00:15:39,000 --> 00:15:44,000 Hayaan akong sa halip sabihin na ang pagbubuo ng numero 290 00:15:44,000 --> 00:15:48,000 pababa sa 0 talaga ang parehong bagay tulad ng 291 00:15:48,000 --> 00:15:53,000 bilang + palatandaan (numero - 1). 292 00:15:53,000 --> 00:15:57,000 Sa ibang salita, tulad ng sa entablado ko punted sa bawat isa ng ang mga tao na susunod sa akin, 293 00:15:57,000 --> 00:16:00,000 at sila ay pinananatiling punting hanggang sa wakas namin bottomed out sa Willy, 294 00:16:00,000 --> 00:16:03,000 na nagkaroon upang bumalik ang isang hard-code na sagot tulad 0. 295 00:16:03,000 --> 00:16:07,000 Dito ngayon katulad namin ang punting sa palatandaan 296 00:16:07,000 --> 00:16:10,000 ang parehong function na bilang ay orihinal na tinatawag na, ngunit ang key pananaw dito 297 00:16:10,000 --> 00:16:12,000 na hindi namin pagtawag palatandaan identically. 298 00:16:12,000 --> 00:16:14,000 Hindi namin pagpasa sa n. 299 00:16:14,000 --> 00:16:17,000 Malinaw kami ng pagpasa sa numero - 1, 300 00:16:17,000 --> 00:16:20,000 kaya bahagyang mas maliit problema, bahagyang mas maliit na problema. 301 00:16:20,000 --> 00:16:23,000 >> Sa kasamaang-palad, ito ay hindi pa isang solusyon, at bago maayos namin 302 00:16:23,000 --> 00:16:26,000 kung ano ang maaaring paglukso na halata sa ilan sa inyo 303 00:16:26,000 --> 00:16:28,000 hayaan mo akong magpatuloy at muling patakbuhin ang gumawa. 304 00:16:28,000 --> 00:16:30,000 Mukhang upang makatipon okay. 305 00:16:30,000 --> 00:16:32,000 Hayaan akong muling palabas ng pelikula ang palatandaan na may 6. 306 00:16:32,000 --> 00:16:37,000 Whoops, hayaan mo akong muling palabas ng pelikula ang palatandaan na may 6. 307 00:16:37,000 --> 00:16:42,000 Nasaksihan namin ito dati, kahit na aksidenteng huling beses pati na rin. 308 00:16:42,000 --> 00:16:48,000 Bakit ako nakakuha ito misteriyoso segmentation fault? Oo. 309 00:16:48,000 --> 00:16:50,000 [Hindi marinig na mag-aaral] 310 00:16:50,000 --> 00:16:53,000 Walang base kaso, at higit na partikular, kung ano ang malamang na nangyari? 311 00:16:53,000 --> 00:16:58,000 Ito ay isang sintomas ng kung ano ang pag-uugali? 312 00:16:58,000 --> 00:17:00,000 Ito sinasabi ng kaunti louder. 313 00:17:00,000 --> 00:17:02,000 [Hindi marinig na mag-aaral] 314 00:17:02,000 --> 00:17:05,000 Ito ay isang walang-katapusang loop epektibo, at ang mga problema sa walang-katapusang loop 315 00:17:05,000 --> 00:17:08,000 kapag sangkot na sila ng recursion sa kasong ito, ang function na ng pagtawag mismo, 316 00:17:08,000 --> 00:17:10,000 kung ano ang mangyayari bawat oras na tumawag ka ng isang function? 317 00:17:10,000 --> 00:17:13,000 Well, sa tingin pabalik sa kung paano namin inilatag ang memory sa isang computer. 318 00:17:13,000 --> 00:17:16,000 Sinabi namin na may ito tipak ng memory na tinatawag na stack na sa ibaba, 319 00:17:16,000 --> 00:17:19,000 at sa bawat oras na tawagan ka ng isang function ng kaunti pa sa memory ay makakakuha ng ilagay 320 00:17:19,000 --> 00:17:24,000 sa tinatawag na stack na naglalaman ng mga lokal na mga variable na function na o mga parameter, 321 00:17:24,000 --> 00:17:27,000 kaya kung ang tawag ng palatandaan ang mga tawag palatandaan palatandaan tawag palatandaan 322 00:17:27,000 --> 00:17:29,000  tawag palatandaan kung saan ang kuwentong ito ng pagtatapos? 323 00:17:29,000 --> 00:17:31,000 >> Well, kalaunan overruns ang kabuuang halaga 324 00:17:31,000 --> 00:17:33,000 ng memorya na mayroon kang magagamit sa iyong computer. 325 00:17:33,000 --> 00:17:37,000 Malatagan ang segment na kayo ay dapat manatili sa loob, 326 00:17:37,000 --> 00:17:40,000 at makakakuha ka ng segmentation fault na ito, core dumped, 327 00:17:40,000 --> 00:17:43,000 at kung ano ang core dumped ay nangangahulugan na ako ngayon ay isang file na tinatawag na core 328 00:17:43,000 --> 00:17:46,000 kung saan ay isang file na naglalaman ng mga zero at mga 329 00:17:46,000 --> 00:17:49,000 na aktwal na sa hinaharap ay diagnostically kapaki-pakinabang. 330 00:17:49,000 --> 00:17:52,000 Kung ito ay hindi halata sa iyo kung saan ay ang iyong bug 331 00:17:52,000 --> 00:17:54,000 Maaari aktwal mong gawin ang isang bit ng forensic pagtatasa, kaya na magsalita, 332 00:17:54,000 --> 00:17:58,000 sa ang file na ito ng core dump, na, muli, lamang ng buong bungkos ng mga zero at mga 333 00:17:58,000 --> 00:18:02,000 na mahalagang kumakatawan sa estado ng iyong programa sa memorya 334 00:18:02,000 --> 00:18:05,000 sandali ang nag-crash sa ganitong paraan. 335 00:18:05,000 --> 00:18:11,000 >> Ang aayos dito ay na hindi lamang namin maaaring nang walang taros bumalik palatandaan, 336 00:18:11,000 --> 00:18:14,000 ang bilang + palatandaan ng isang bahagyang mas maliit problema. 337 00:18:14,000 --> 00:18:16,000 Kailangan namin na magkaroon ng ilang mga uri ng base kaso dito, 338 00:18:16,000 --> 00:18:19,000 at ano ang dapat marahil ang pangunahing kaso? 339 00:18:19,000 --> 00:18:22,000 [Hindi marinig na mag-aaral] 340 00:18:22,000 --> 00:18:25,000 Okay, kaya mahaba bilang numero ay positibo dapat naming aktwal na bumalik ito, 341 00:18:25,000 --> 00:18:29,000 o ilagay ang isa pang paraan, kung ang numero, sabihin nating, <= sa 0 342 00:18:29,000 --> 00:18:32,000 alam mo kung ano, kukunin ko na magpatuloy at bumalik 0, 343 00:18:32,000 --> 00:18:36,000 magkano tulad Willy ginawa, at iba pa, ako pagpunta sa magpatuloy 344 00:18:36,000 --> 00:18:41,000 at ibalik ang, kaya ito ay hindi na mas maikli 345 00:18:41,000 --> 00:18:44,000 kaysa sa umuulit bersyon na namin whipped unang gamit ang isang para sa loop, 346 00:18:44,000 --> 00:18:48,000 ngunit mapapansin na ang ganitong uri ng kagandahan nito. 347 00:18:48,000 --> 00:18:51,000 Sa halip na bumabalik ilang numero at magsagawa ng lahat ng ito matematika 348 00:18:51,000 --> 00:18:54,000 at pagdaragdag ng mga bagay sa mga lokal na mga variable 349 00:18:54,000 --> 00:18:57,000 sa halip ka sinasabi "Okay, kung ito ay isang napakadaling problema, 350 00:18:57,000 --> 00:19:01,000 tulad ng numero ng <0, hayaan mo akong agad na bumalik sa 0. " 351 00:19:01,000 --> 00:19:03,000 >> Hindi namin pagpunta sa abala ang pagsuporta ng mga negatibong numero, 352 00:19:03,000 --> 00:19:05,000 kaya ako pupunta sa hard code ang halaga ng 0. 353 00:19:05,000 --> 00:19:08,000 Ngunit kung hindi man, upang ipatupad ang ideya ng summing 354 00:19:08,000 --> 00:19:11,000 lahat ng mga bilang na ito ay sama-sama mabisa mong kumuha ng isang maliit na kagat 355 00:19:11,000 --> 00:19:14,000 ng problema, tulad ng ginawa namin dito sa entablado, 356 00:19:14,000 --> 00:19:18,000 pagkatapos tumikin ang lahat ng problema sa susunod na tao, 357 00:19:18,000 --> 00:19:20,000 ngunit sa kasong ito ang susunod na tao ay ang iyong sarili. 358 00:19:20,000 --> 00:19:22,000 Identically na pinangalanang function na. 359 00:19:22,000 --> 00:19:25,000 Lamang pumasa ito sa isang mas maliit at mas maliit at mas maliit na problema sa bawat oras, 360 00:19:25,000 --> 00:19:28,000 at kahit na mayroon kaming hindi pa formalized na bagay sa code dito 361 00:19:28,000 --> 00:19:33,000 ito ay eksakto kung ano ang nangyayari sa linggo 0 sa mga libro ng telepono. 362 00:19:33,000 --> 00:19:36,000 Ito ay eksakto kung ano ang nangyayari sa nakaraang linggo na may Sean 363 00:19:36,000 --> 00:19:39,000 at sa aming mga demonstrations ng paghahanap para sa mga numero. 364 00:19:39,000 --> 00:19:42,000 Ito ay paglalaan ng problema at paghahati itong muli at muli. 365 00:19:42,000 --> 00:19:44,000 >> Sa ibang salita, may isang paraan ngayon ng sa pagsalin 366 00:19:44,000 --> 00:19:47,000 ito real bumuo ng mundo, ang mas mataas na antas bumuo 367 00:19:47,000 --> 00:19:51,000 ng hatiin at lupigin at paggawa ng isang bagay muli at muli 368 00:19:51,000 --> 00:19:56,000 sa code, kaya ito ay isang bagay na namin makita muli sa paglipas ng panahon. 369 00:19:56,000 --> 00:20:00,000 Ngayon, bilang isang bukod, kung ikaw ay bago sa recursion ay dapat kang hindi bababa sa maunawaan ngayon 370 00:20:00,000 --> 00:20:02,000 kung bakit ito ay nakatatawa. 371 00:20:02,000 --> 00:20:05,000 Ako pagpunta sa pumunta sa google.com, 372 00:20:05,000 --> 00:20:17,000 at ako pagpunta upang maghanap para sa ilang mga tip at trick sa recursion, ipasok. 373 00:20:17,000 --> 00:20:21,000 Sabihin ang mga tao na susunod sa iyo kung hindi sila ay tumatawa ngayon lang. 374 00:20:21,000 --> 00:20:23,000 Ibig mo bang sabihin recursion? 375 00:20:23,000 --> 00:20:25,000 Ibig mo bang sabihin ah, doon kami. 376 00:20:25,000 --> 00:20:28,000 Okay, ngayon na ang kabuuan ng lahat. 377 00:20:28,000 --> 00:20:30,000 Ang isang maliit na Easter itlog naka-embed sa isang lugar doon sa Google. 378 00:20:30,000 --> 00:20:33,000 Bilang isang bukod, isa ng ang mga link na inilalagay namin sa website ng kurso 379 00:20:33,000 --> 00:20:36,000 para sa araw na lamang ang grid na ito ng iba't-ibang mga pag-uuri algorithm, 380 00:20:36,000 --> 00:20:39,000 ilan sa kung saan namin tumingin sa nakaraang linggo, ngunit kung ano ang magaling tungkol sa visualization 381 00:20:39,000 --> 00:20:43,000 habang sinusubukan mong I-wrap ang iyong isip sa paligid ng iba't-ibang mga bagay na may kaugnayan sa algorithm 382 00:20:43,000 --> 00:20:46,000 alam na maaari mong napaka madali na ngayong magsimula sa iba't ibang mga uri ng mga input. 383 00:20:46,000 --> 00:20:50,000 Ang input lahat ng reverse, ang mga input sa karamihan pinagsunod-sunod, ang input random at iba pa. 384 00:20:50,000 --> 00:20:53,000 Habang sinusubukan mong, muli, makilala ang mga bagay na ito sa iyong isip 385 00:20:53,000 --> 00:20:57,000 Napag-alaman na ang URL na ito sa website ng kurso sa pahina ng aralin 386 00:20:57,000 --> 00:21:00,000 maaaring makatulong sa iyo dahilan sa pamamagitan ng ilan sa mga. 387 00:21:00,000 --> 00:21:05,000 >> Ngayon namin sa wakas makakuha upang malutas ang problemang ito mula sa isang habang pabalik, 388 00:21:05,000 --> 00:21:08,000 kung saan ay na makipagpalitan ng function na ito ay hindi gumagana, 389 00:21:08,000 --> 00:21:12,000 at kung ano ang pangunahing problema sa function na ito makipagpalitan ng, 390 00:21:12,000 --> 00:21:15,000 ang layunin ng kung saan ay, muli, upang makipagpalitan ng halaga dito at dito 391 00:21:15,000 --> 00:21:17,000 tulad na ito mangyayari? 392 00:21:17,000 --> 00:21:20,000 Ito ay hindi aktwal na gumana. Bakit? 393 00:21:20,000 --> 00:21:22,000 Oo. 394 00:21:22,000 --> 00:21:28,000 [Hindi marinig na mag-aaral] 395 00:21:28,000 --> 00:21:31,000 Eksakto, ang paliwanag para sa bugginess 396 00:21:31,000 --> 00:21:34,000 lamang ay dahil kapag tumawag ka ng mga function sa C 397 00:21:34,000 --> 00:21:38,000 at mga function tumagal ng mga argumento, tulad ng isang at b dito, 398 00:21:38,000 --> 00:21:42,000 ikaw ay pagpasa sa mga kopya ng anumang halaga nagbibigay ka ng na function na. 399 00:21:42,000 --> 00:21:46,000 Hindi mo pagbibigay ng mga orihinal na halaga ang kanilang mga sarili, 400 00:21:46,000 --> 00:21:49,000 kaya nakita namin ito sa konteksto ng buggyc, 401 00:21:49,000 --> 00:21:52,000 buggy3.c, na mukhang isang maliit na bagay tulad nito. 402 00:21:52,000 --> 00:21:57,000 >> Manariwa sa diwa na nagkaroon kami x at y nasimulan sa 1 at 2, ayon sa pagkakasunud-sunod. 403 00:21:57,000 --> 00:21:59,000 Pagkatapos namin naka-print kung ano sila ay. 404 00:21:59,000 --> 00:22:03,000 Pagkatapos ay inaangkin ko na ako pagpapalit ito sa pamamagitan ng pagtawag makipagpalitan ng x, y. 405 00:22:03,000 --> 00:22:06,000 Ngunit ang problema ay na ang pagpapalit nagtrabaho, 406 00:22:06,000 --> 00:22:10,000 ngunit lamang sa saklaw ng makipagpalitan gumana mismo. 407 00:22:10,000 --> 00:22:13,000 Sa lalong madaling namin maabot ang linya 40 mga swapped halaga 408 00:22:13,000 --> 00:22:16,000 ay itinapon ang layo, at kaya walang 409 00:22:16,000 --> 00:22:21,000 sa orihinal na function na pangunahing ay talagang nagbago sa lahat, 410 00:22:21,000 --> 00:22:26,000 kaya kung sa tingin mo bumalik sa kung ano ang mukhang sa mga tuntunin ng aming memory 411 00:22:26,000 --> 00:22:29,000 kung ito kaliwang bahagi ng board kumakatawan- 412 00:22:29,000 --> 00:22:33,000 at makikita ko ang aking makakaya para sa lahat upang makita ito-kung ang kaliwang bahagi ng board 413 00:22:33,000 --> 00:22:37,000 kumakatawan sa, sabihin nating, iyong RAM, at stack ang binabalak na palaguin sa up sa ganitong paraan, 414 00:22:37,000 --> 00:22:43,000 at tawagan kami ng isang function na tulad ng pangunahing, at pangunahing may 2 lokal na variable, x at y, 415 00:22:43,000 --> 00:22:48,000 sabihin ilarawan ang mga bilang x dito, at sabihin ilarawan ang mga ito bilang y dito, 416 00:22:48,000 --> 00:22:55,000 at ipaalam sa ay ilagay sa ang halaga 1 at 2, kaya ito dito ay pangunahing, 417 00:22:55,000 --> 00:22:58,000 at kapag ang pangunahing tawag sa makipagpalitan ng function na operating system 418 00:22:58,000 --> 00:23:02,000 nagbibigay sa makipagpalitan ng function na sarili nitong swath ng memory sa stack, 419 00:23:02,000 --> 00:23:04,000 sarili nitong frame sa stack, kaya na magsalita. 420 00:23:04,000 --> 00:23:08,000 Din ito allocates 32 bit para sa mga ints. 421 00:23:08,000 --> 00:23:11,000 Ito ay nangyayari na tumawag sa kanila at b, ngunit na lubos na arbitrary. 422 00:23:11,000 --> 00:23:13,000 Maaaring tinatawag kanila anumang ito nais, ngunit kung ano ang mangyayari kapag pangunahing 423 00:23:13,000 --> 00:23:19,000 tawag makipagpalitan ng ito ay tumatagal ito 1, Inilalagay ng isang kopya doon, naglalagay ng kopya doon. 424 00:23:19,000 --> 00:23:23,000 >> May 1 iba pang lokal na variable sa makipagpalitan ng, bagaman, na tinatawag na ano? >> Tmp. 425 00:23:23,000 --> 00:23:27,000 Tmp, kaya hayaan mo akong bigyan ang aking sarili ng isa pang 32 bit dito, 426 00:23:27,000 --> 00:23:29,000 at kung ano ang gagawin ko sa function na? 427 00:23:29,000 --> 00:23:34,000 Sinabi ko int tmp nakakakuha ng, kaya may 1, kaya ginawa ko ito kapag namin huling play sa halimbawang ito. 428 00:23:34,000 --> 00:23:39,000 Pagkatapos nai-b, kaya b ay 2, kaya ngayon ito ay magiging 2, 429 00:23:39,000 --> 00:23:42,000 at ngayon b nakakakuha ng Temp, kaya Temp ay 1, 430 00:23:42,000 --> 00:23:44,000 ito ngayon b nagiging ito. 431 00:23:44,000 --> 00:23:46,000 Mabuti iyan. Ito nagtrabaho. 432 00:23:46,000 --> 00:23:49,000 Ngunit sa lalong madaling bilang ang return ng function na 433 00:23:49,000 --> 00:23:52,000 memory makipagpalitan ng epektibong mawala sa gayon ay maaari itong reused 434 00:23:52,000 --> 00:23:58,000 sa pamamagitan ng ilang mga iba pang mga function sa hinaharap, at pangunahing ay malinaw naman ganap na hindi nabago. 435 00:23:58,000 --> 00:24:00,000 Kailangan namin ang isang paraan ng sa panimula paglutas sa problemang ito, 436 00:24:00,000 --> 00:24:03,000 at ngayon makikita namin sa wakas may isang paraan ng paggawa nito kung saan 437 00:24:03,000 --> 00:24:06,000 maaari naming ipakilala ng isang bagay na tinatawag na pointer. 438 00:24:06,000 --> 00:24:09,000 Ito lumiliko out na maaari naming malutas ang problemang ito 439 00:24:09,000 --> 00:24:12,000 hindi sa pamamagitan ng pagpasa sa mga kopya ng x at y 440 00:24:12,000 --> 00:24:18,000 ngunit sa halip sa pamamagitan ng pagpasa sa kung ano ang, ang iyong tingin, sa function na makipagpalitan ng? 441 00:24:18,000 --> 00:24:20,000 Oo, kung ano ang tungkol sa mga address? 442 00:24:20,000 --> 00:24:22,000 Hindi namin talagang uusapang tungkol sa mga address sa maraming detalye, 443 00:24:22,000 --> 00:24:25,000 ngunit kung ang pisara ito ay kumakatawan sa memorya ng aking computer 444 00:24:25,000 --> 00:24:28,000 maaari kaming tiyak na simulan ang numero ang mga bytes sa aking RAM 445 00:24:28,000 --> 00:24:31,000 at sabihin ito ay byte # 1, ito ay byte # 2, byte # 3, 446 00:24:31,000 --> 00:24:35,000 byte # 4, byte # ... 2 bilyong kung mayroon akong 2 gigabytes ng RAM, 447 00:24:35,000 --> 00:24:38,000 sa gayon ay maaari kaming tiyak na may ilang arbitrary na numero scheme 448 00:24:38,000 --> 00:24:41,000 para sa lahat ng mga indibidwal na bytes sa memorya ng aking computer. 449 00:24:41,000 --> 00:24:43,000 >> Paano kung sa halip kapag tumawag ako makipagpalitan ng 450 00:24:43,000 --> 00:24:47,000 kaysa pass sa mga kopya ng x at y 451 00:24:47,000 --> 00:24:51,000 bakit hindi ko sa halip pumasa sa address ng x dito, 452 00:24:51,000 --> 00:24:55,000 ang address ng y dito, mahalagang ang postal address 453 00:24:55,000 --> 00:24:59,000 ng x at y dahil pagkatapos magpalitan, kung siya ay alam 454 00:24:59,000 --> 00:25:01,000 ng address sa memorya ng x at y, 455 00:25:01,000 --> 00:25:04,000 pagkatapos magpalitan, kung sinanay namin siya ng kaunti, 456 00:25:04,000 --> 00:25:07,000 maaaring siya potensyal na humimok sa address na iyon, kaya na magsalita, 457 00:25:07,000 --> 00:25:11,000 x, at baguhin ang bilang doon, pagkatapos ay humimok sa address ng y, 458 00:25:11,000 --> 00:25:16,000 baguhin ang numero doon, kahit habang hindi aktwal na pagkuha ng mga kopya ng mga halaga sa kanyang sarili, 459 00:25:16,000 --> 00:25:19,000 kaya kahit usapan natin ang tungkol ito bilang pangunahing ng memory 460 00:25:19,000 --> 00:25:23,000 at ang memorya ng ito bilang makipagpalitan ng makapangyarihang at sa mapanganib na bahagi ng C 461 00:25:23,000 --> 00:25:28,000 ay na ang anumang mga function na maaaring hawakan ng memory saanman sa computer, 462 00:25:28,000 --> 00:25:32,000 at ito ay malakas na sa na maaari mong gawin ang mga napaka magarbong mga bagay na may mga programa sa computer sa C. 463 00:25:32,000 --> 00:25:36,000 Ito ay mapanganib dahil maaari ka ring magtaas napaka madaling. 464 00:25:36,000 --> 00:25:39,000 Sa katunayan, ang isa sa mga pinaka-karaniwang paraan para sa mga programa sa mga araw na ito na pinagsamantalahan 465 00:25:39,000 --> 00:25:42,000 pa rin ay para sa isang programmer hindi mapagtanto 466 00:25:42,000 --> 00:25:45,000 na siya ay nagpapahintulot sa data 467 00:25:45,000 --> 00:25:49,000 nakasulat sa isang lokasyon sa memorya na hindi nilayon. 468 00:25:49,000 --> 00:25:51,000 >> Halimbawa, siya declares isang hanay ng mga laki 10 469 00:25:51,000 --> 00:25:56,000 ngunit pagkatapos aksidenteng sinusubukan upang ilagay ang 11 bytes sa na array ng memorya, 470 00:25:56,000 --> 00:25:59,000 at simulan mo ng pagpindot ng mga bahagi ng memorya na hindi na wasto. 471 00:25:59,000 --> 00:26:02,000 Lamang sa contextual ito, ang ilan sa inyo ay maaaring malaman na 472 00:26:02,000 --> 00:26:06,000 software ay madalas prompt para sa mga serial number o mga susi sa pagpaparehistro, 473 00:26:06,000 --> 00:26:08,000 Photoshop at Salita at mga programang tulad nito. 474 00:26:08,000 --> 00:26:12,000 May umiiral basag, ng ilan sa inyo alam, online na kung saan maaari kang magpatakbo ng isang maliit na programa, 475 00:26:12,000 --> 00:26:14,000 at voila, walang karagdagang kahilingan para sa isang serial number. 476 00:26:14,000 --> 00:26:16,000 Paano ay na gumagana? 477 00:26:16,000 --> 00:26:21,000 Sa maraming mga kaso ang mga bagay na ito ay simpleng paghahanap sa computer 478 00:26:21,000 --> 00:26:24,000 segment ng teksto sa aktwal na mga zero ng computer at mga 479 00:26:24,000 --> 00:26:28,000 kung saan ay na function na kung saan ang mga serial number ay hiniling, 480 00:26:28,000 --> 00:26:31,000 at patungan mo sa puwang na iyon, o habang tumatakbo ang programa 481 00:26:31,000 --> 00:26:33,000 maaari mong malaman kung saan ang key ay aktwal na naka-imbak 482 00:26:33,000 --> 00:26:37,000 paggamit ng isang bagay na tinatawag debugger, at maaari mong magpahaginit software na paraan. 483 00:26:37,000 --> 00:26:40,000 Na ito ay hindi sabihin na ito ay ang aming layunin para sa susunod na ilang mga araw, 484 00:26:40,000 --> 00:26:42,000 ngunit ito ay napaka-real-mundo na ramifications. 485 00:26:42,000 --> 00:26:45,000 Na ang isa ang mangyayari sa sangkot ang pagnanakaw ng software, 486 00:26:45,000 --> 00:26:47,000 ngunit mayroon ding kompromiso ng buong machine. 487 00:26:47,000 --> 00:26:50,000 >> Sa katunayan, kapag ang mga website mga araw na ito ay pinagsamantalahan 488 00:26:50,000 --> 00:26:53,000 at nakompromiso at ang data ay leaked at password ninakaw 489 00:26:53,000 --> 00:26:58,000 ito napakadalas nauugnay sa mahihirap na pamamahala ng isang memory, 490 00:26:58,000 --> 00:27:01,000 o, sa kaso ng mga database, hindi inaasahan 491 00:27:01,000 --> 00:27:03,000 adversarial input, kaya higit pa sa na sa linggo darating, 492 00:27:03,000 --> 00:27:07,000 ngunit sa ngayon lamang sneak preview ng uri ng pinsala na maaari mong gawin 493 00:27:07,000 --> 00:27:11,000 sa pamamagitan ng hindi masyadong-unawa kung paano gumagana ang mga bagay sa ilalim ng hood. 494 00:27:11,000 --> 00:27:14,000 Natin ang tungkol sa pag-unawa sa kung bakit ito ay nasira 495 00:27:14,000 --> 00:27:17,000 gamit ang isang tool na ay magiging mas at mas kapaki-pakinabang 496 00:27:17,000 --> 00:27:19,000 ng aming mga programa makakuha ng mas kumplikadong. 497 00:27:19,000 --> 00:27:21,000 Kaya malayo kapag nagkaroon ka ng isang bug sa iyong programa 498 00:27:21,000 --> 00:27:23,000 kung paano mo nawala tungkol sa pag-debug ito? 499 00:27:23,000 --> 00:27:25,000 Ano ang iyong diskarte ay sa gayon ngayon, kung itinuro ng iyong tf 500 00:27:25,000 --> 00:27:27,000 o self-itinuro? 501 00:27:27,000 --> 00:27:29,000 [Mag-aaral] Printf. 502 00:27:29,000 --> 00:27:31,000 Printf, kaya printf ay marahil iyong kaibigan sa na kung nais mong makita ang 503 00:27:31,000 --> 00:27:33,000 ano ang nangyayari sa loob ng iyong programa 504 00:27:33,000 --> 00:27:36,000 mo lang ilagay printf dito, printf dito, printf dito. 505 00:27:36,000 --> 00:27:38,000 Pagkatapos mong patakbuhin ito, at makakakuha ka ng isang buong grupo ng mga bagay-bagay sa screen 506 00:27:38,000 --> 00:27:43,000 na maaari mong gamitin upang pagkatapos mahulo kung ano ang aktwal na pagpunta mali sa iyong programa. 507 00:27:43,000 --> 00:27:45,000 >> Printf may kaugaliang na maging isang makapangyarihang bagay, 508 00:27:45,000 --> 00:27:47,000 ngunit ito ay isang mano-manong proseso. 509 00:27:47,000 --> 00:27:49,000 Mayroon kang maglagay ng printf dito, printf dito, 510 00:27:49,000 --> 00:27:51,000 at kung ilagay mo ito sa loob ng isang loop maaari kang makakuha ng 100 na linya 511 00:27:51,000 --> 00:27:53,000 ng output na pagkatapos mo magbistay pamamagitan. 512 00:27:53,000 --> 00:27:58,000 Ito ay hindi isang napaka-user-friendly o interactive na mekanismo para sa pag-debug ng mga programa, 513 00:27:58,000 --> 00:28:00,000 ngunit thankfully mayroong umiiral na mga alternatibo. 514 00:28:00,000 --> 00:28:03,000 May isang programa, halimbawa, na tinatawag na GDB, ang GNU Debugger, 515 00:28:03,000 --> 00:28:06,000 kung saan ay isang maliit na arcane sa kung paano mo ito gamitin. 516 00:28:06,000 --> 00:28:08,000 Ito ay isang maliit na kumplikado, ngunit lantaran, 517 00:28:08,000 --> 00:28:11,000 ito ay isa sa mga bagay na kung saan kung inilagay mo sa linggong ito at sa tabi 518 00:28:11,000 --> 00:28:14,000 ang dagdag na oras upang maunawaan ang isang bagay tulad ng GDB 519 00:28:14,000 --> 00:28:18,000 ito ay i-save ang mga malamang sampu-sampung ng mga oras sa katagalan, 520 00:28:18,000 --> 00:28:21,000 ito na iyon, hayaan mo akong bigyan ka ng isang teaser ng kung paano gumagana ang bagay na ito. 521 00:28:21,000 --> 00:28:23,000 >> Ako sa aking terminal na window. 522 00:28:23,000 --> 00:28:26,000 Hayaan akong magpatuloy at ipunin ang programang ito, buggy3. 523 00:28:26,000 --> 00:28:28,000 Nang hanggang sa petsa. 524 00:28:28,000 --> 00:28:31,000 Hayaan akong patakbuhin ito lamang tulad ng ginawa namin habang pabalik, at sa katunayan, ito ay pinaghiwa. 525 00:28:31,000 --> 00:28:34,000 Ngunit bakit ito? Siguro ako screwed ang makipagpalitan ng function na. 526 00:28:34,000 --> 00:28:37,000 Siguro ito at b. Hindi ako medyo gumagalaw ito nang tama. 527 00:28:37,000 --> 00:28:39,000 Hayaan akong magpatuloy at gawin ito. 528 00:28:39,000 --> 00:28:43,000 Sa halip na lamang patakbuhin buggy3 ipaalam sa akin sa halip na patakbuhin ang program na ito GDB, 529 00:28:43,000 --> 00:28:48,000 at ako pagpunta upang sabihin dito na tumakbo buggy3, 530 00:28:48,000 --> 00:28:52,000 at ako pagpunta upang isama ang isang linya ng argumento ng utos, na tui, 531 00:28:52,000 --> 00:28:55,000 at maglalagay kami ng ito sa hinaharap na mga problema sa spec ipaalala sa. 532 00:28:55,000 --> 00:28:57,000 At ngayon ang black and white na interface pop up na, muli, 533 00:28:57,000 --> 00:28:59,000 ng kaunti napakalaki sa unang dahil mayroong lahat ng ito 534 00:28:59,000 --> 00:29:02,000 warranty impormasyon pababa dito, ngunit hindi bababa sa isang bagay na pamilyar. 535 00:29:02,000 --> 00:29:04,000 Sa tuktok ng window ang aking aktwal na code, 536 00:29:04,000 --> 00:29:08,000 at kung mag-scroll ko dito ipaalam sa akin na mag-scroll sa pinakatuktok ng aking mga file, 537 00:29:08,000 --> 00:29:11,000 at sa katunayan, may buggy3.c, at abiso sa ibaba ng window na ito 538 00:29:11,000 --> 00:29:13,000 Mayroon akong ang ang GDB prompt na ito. 539 00:29:13,000 --> 00:29:16,000 >> Ito ay hindi ang parehong bilang aking normal John Harvard prompt. 540 00:29:16,000 --> 00:29:19,000 Ito ay isang prompt na upang payagan ang sa akin upang makontrol GDB. 541 00:29:19,000 --> 00:29:21,000 GDB ay isang debugger. 542 00:29:21,000 --> 00:29:24,000 Debugger ay isang program na nagbibigay-daan sa kang maglakad sa pamamagitan 543 00:29:24,000 --> 00:29:27,000 pagpapatupad ng iyong linya ng programa sa pamamagitan ng linya sa pamamagitan ng linya, 544 00:29:27,000 --> 00:29:30,000 sa kahabaan ng paraan sa paggawa ng anumang nais mo sa programa, 545 00:29:30,000 --> 00:29:33,000 kahit pagtawag ng mga function, o naghahanap, mas mahalaga, 546 00:29:33,000 --> 00:29:35,000 sa halaga ng iba't-ibang variable. 547 00:29:35,000 --> 00:29:37,000 Natin magpatuloy at gawin ito. 548 00:29:37,000 --> 00:29:40,000 Ako pagpunta sa magpatuloy at i-type sa run sa GDB ng prompt, 549 00:29:40,000 --> 00:29:43,000 kaya mapapansin sa ibabang kaliwa ng screen na nai-type ko patakbuhin ang, 550 00:29:43,000 --> 00:29:45,000 at ako pindutin ang enter, at kung ano ang na gawin? 551 00:29:45,000 --> 00:29:50,000 Tumakbo ito literal aking programa, ngunit hindi ko ay aktwal na makita ang mas pumunta sa dito 552 00:29:50,000 --> 00:29:55,000 dahil hindi ko aktwal na sinabi sa debugger 553 00:29:55,000 --> 00:29:57,000 i-pause sa isang partikular na sandali sa oras. 554 00:29:57,000 --> 00:29:59,000 Lang mag-type run tumatakbo sa programa. 555 00:29:59,000 --> 00:30:01,000 Hindi ko aktwal na makita ang anumang. Hindi ko maaaring manipulahin ang mga ito. 556 00:30:01,000 --> 00:30:03,000 >> Sa halip ipaalam sa akin gawin ito. 557 00:30:03,000 --> 00:30:08,000 Sa ang GDB prompt na ito, ipaalam sa akin sa halip na i-type ang pahinga, ipasok. 558 00:30:08,000 --> 00:30:10,000 Iyon ay hindi kung ano ang ko nilalayong i-type. 559 00:30:10,000 --> 00:30:13,000 Natin sa halip type break na pangunahing. 560 00:30:13,000 --> 00:30:15,000 Sa ibang salita, gusto kong i-set ng isang bagay na tinatawag na breakpoint, 561 00:30:15,000 --> 00:30:18,000 kung saan ay aptly na may pangalang dahil ito ay masira o i-pause 562 00:30:18,000 --> 00:30:21,000 pagpapatupad ng iyong programa sa partikular na lugar. 563 00:30:21,000 --> 00:30:23,000 Main ang pangalan ng aking function na. 564 00:30:23,000 --> 00:30:25,000 Pansinin na GDB medyo na smart. 565 00:30:25,000 --> 00:30:28,000 Ito ay naisip na ang pangunahing mangyayari upang simulan ang halos sa linya 18 566 00:30:28,000 --> 00:30:32,000 ng buggy3.c, at pagkatapos ay mapansin dito sa kaliwang tuktok 567 00:30:32,000 --> 00:30:34,000 b + sa tabi mismo sa linya 18. 568 00:30:34,000 --> 00:30:38,000 Na nagpapaalala sa akin na-set ko ang isang breakpoint sa linya 18. 569 00:30:38,000 --> 00:30:42,000 Oras na ito kapag ako ay nag-type run, ako pagpunta sa patakbuhin ang aking programa 570 00:30:42,000 --> 00:30:45,000 hanggang mga hit na breakpoint, 571 00:30:45,000 --> 00:30:48,000 kaya ang programa ay i-pause para sa akin sa linya 18. 572 00:30:48,000 --> 00:30:50,000 Narito kami, patakbuhin. 573 00:30:50,000 --> 00:30:53,000 Walang lumilitaw na nangyari, ngunit paunawa sa ibaba ang natitira 574 00:30:53,000 --> 00:30:58,000 simula ng programa, buggy3, breakpoint 1 sa pangunahing sa buggy3.c linya 18. 575 00:30:58,000 --> 00:31:00,000 Ano ang maaari kong gawin ngayon? 576 00:31:00,000 --> 00:31:03,000 >> Mapansin ang maaari kong simulan ang pag-type ng mga bagay tulad ng naka-print, 577 00:31:03,000 --> 00:31:08,000 hindi printf, x ng naka-print, at ngayon na kakaiba. 578 00:31:08,000 --> 00:31:11,000 Ang $ 1 ay-usisa, dahil kakailanganin namin nakikita 579 00:31:11,000 --> 00:31:14,000 sa bawat oras na-print ka ng isang bagay na makakakuha ka ng isang bagong $ halaga. 580 00:31:14,000 --> 00:31:18,000 Na sa gayon ay maaari kang sumangguni bumalik sa nakaraang halaga kung sakali, 581 00:31:18,000 --> 00:31:21,000 ngunit sa ngayon kung ano ang naka-print ay nagsasabi sa akin na ang halaga ng x sa puntong ito sa kuwento 582 00:31:21,000 --> 00:31:26,000 ay tila 134,514,032. 583 00:31:26,000 --> 00:31:29,000 Ano? Saan na kahit nanggaling? 584 00:31:29,000 --> 00:31:31,000 [Hindi marinig na mag-aaral] 585 00:31:31,000 --> 00:31:34,000 Sa katunayan, ito ay kung ano ang makikita namin tumawag sa isang halaga ng basura, at hindi kami uusapang tungkol sa, 586 00:31:34,000 --> 00:31:37,000 ngunit ang dahilan na initialize variable 587 00:31:37,000 --> 00:31:40,000 malinaw naman kaya na mayroon silang ilang mga halaga na gusto mo ang mga ito upang magkaroon ng. 588 00:31:40,000 --> 00:31:44,000 Subalit catch ay isipin ang na maaari mong ipinapahayag ang mga variable 589 00:31:44,000 --> 00:31:46,000 tulad ng ginawa ko ng ilang sandali ang nakalipas sa aking palatandaan halimbawa 590 00:31:46,000 --> 00:31:48,000 nang hindi aktwal na nagbibigay sa kanila ng halaga. 591 00:31:48,000 --> 00:31:50,000 Manariwa sa diwa kung ano ang ginawa ko sa paglipas dito sa palatandaan. 592 00:31:50,000 --> 00:31:52,000 Ko ipinahayag n, ngunit kung ano ang halaga ay ko bigyan ito? 593 00:31:52,000 --> 00:31:56,000 Wala, dahil ako alam na sa susunod na ilang mga linya 594 00:31:56,000 --> 00:31:59,000 Ay tumagal ng GetInt-aalaga ng problema ng paglalagay ng halaga sa loob ng n. 595 00:31:59,000 --> 00:32:02,000 >> Ngunit sa puntong ito sa kuwento ng linya 11 596 00:32:02,000 --> 00:32:05,000 at line 12 at linya 13 at linya 14 597 00:32:05,000 --> 00:32:08,000 buong mga ilang linya kung ano ang halaga ng n? 598 00:32:08,000 --> 00:32:10,000 Sa C mo lamang ay hindi alam. 599 00:32:10,000 --> 00:32:14,000 Ito ang pangkalahatang ilang mga halaga ng basura, ang ilang mga ganap na random na numero 600 00:32:14,000 --> 00:32:17,000 na natira mahalagang mula sa ilang nakaraang function na 601 00:32:17,000 --> 00:32:21,000 pagkakaroon ng pag-tumakbo, kaya habang tumatakbo ang iyong programa 602 00:32:21,000 --> 00:32:24,000 isipin ang na function na ay nakakakuha ng function, function, ang function. 603 00:32:24,000 --> 00:32:27,000 Lahat ng mga frame makapag ilagay sa memory, at pagkatapos ay mga function return, 604 00:32:27,000 --> 00:32:31,000 at tulad ng iminungkahing ko na may pambura ang kanilang memorya ay malaon reused. 605 00:32:31,000 --> 00:32:37,000 Well, ito ay kaya mangyayari na ito variable x sa programang ito 606 00:32:37,000 --> 00:32:41,000 mukhang naglalaman ng ilang mga halaga ng basura tulad 134514032 607 00:32:41,000 --> 00:32:44,000 mula sa ilang nakaraang function na, hindi na aking sinulat ni. 608 00:32:44,000 --> 00:32:47,000 Ito ay maaaring maging isang bagay ay epektibo na may operating system, 609 00:32:47,000 --> 00:32:49,000 ilang function na sa ilalim ng hood. 610 00:32:49,000 --> 00:32:52,000 >> Okay, na fine, ngunit sabihin ngayon advance sa susunod na linya. 611 00:32:52,000 --> 00:32:55,000 Kung type ko "sa tabi ng" sa aking GDB prompt at ako pindutin ang enter, 612 00:32:55,000 --> 00:32:58,000 mapapansin na ang mga highlight gumagalaw pababa sa linya 19, 613 00:32:58,000 --> 00:33:01,000 ngunit ang lohikal na implikasyon ay na linya 18 614 00:33:01,000 --> 00:33:06,000 na ngayon tapos execute, kaya kung type ko muli "print x" 615 00:33:06,000 --> 00:33:10,000 Dapat kong makita ngayon ang 1, at sa katunayan, gagawin ko. 616 00:33:10,000 --> 00:33:14,000 Muli, ang $ bagay ay isang paraan ng GDB nagpapaalala sa iyo 617 00:33:14,000 --> 00:33:17,000 kung ano ang kasaysayan ng mga print na nagawa mo na. 618 00:33:17,000 --> 00:33:21,000 Ngayon ipaalam sa akin sige at i-print ang y, at sa katunayan, y ay ilang mabaliw halaga pati na rin, 619 00:33:21,000 --> 00:33:24,000 ngunit hindi sang-ayon dahil sa linya 19 kami upang italaga ito 620 00:33:24,000 --> 00:33:27,000 ang halaga 2, kaya hayaan mo akong i-type ang "susunod" muli. 621 00:33:27,000 --> 00:33:29,000 At ngayon kami sa printf linya. 622 00:33:29,000 --> 00:33:31,000 Hayaan ang gawin sa akin ng mga x naka-print. 623 00:33:31,000 --> 00:33:34,000 Hayaan ang gawin sa akin ng naka-print na y. Lantaran, nakakakuha ako ng isang maliit na pagod ng pag-print ito. 624 00:33:34,000 --> 00:33:38,000 Hayaan akong sa halip na i-type ang "display x" at "display y," 625 00:33:38,000 --> 00:33:41,000 at ngayon tuwing type ko sa isang utos sa hinaharap 626 00:33:41,000 --> 00:33:45,000 Ako mapaalalahanan ng kung ano ang x at y, ano ang x at y, kung ano ang x at y. 627 00:33:45,000 --> 00:33:48,000 >> Ko na din, bilang isang bukod, i-type sa "lokal impormasyon." 628 00:33:48,000 --> 00:33:50,000 Info ay isang espesyal na command. 629 00:33:50,000 --> 00:33:52,000 Lokal ay nangangahulugan na ito ay nagpapakita sa akin ang mga lokal na variable. 630 00:33:52,000 --> 00:33:55,000 Kung sakaling kakailanganin ko kalimutan o ito ay isang mabaliw, kumplikadong function na 631 00:33:55,000 --> 00:33:57,000 na ako o ibang tao sinulat ni lokal impormasyon ay magsasabi sa iyo 632 00:33:57,000 --> 00:34:00,000 kung ano ang lahat ng mga lokal na mga variable sa loob ng lokal na function na 633 00:34:00,000 --> 00:34:03,000 na maaari kang pakialam tungkol sa kung nais mong sundutin sa paligid. 634 00:34:03,000 --> 00:34:07,000 Ngayon, printf ay tungkol sa upang maisagawa, kaya ipaalam sa akin sige at lamang uri "sa tabi." 635 00:34:07,000 --> 00:34:10,000 Dahil hindi namin sa environment na ito hindi namin aktwal na nakikita ang mga ito 636 00:34:10,000 --> 00:34:14,000 execute pababa dito, ngunit mapansin nakakakuha ito ng isang maliit na luray dito. 637 00:34:14,000 --> 00:34:17,000 Ngunit mapansin ito override screen doon, 638 00:34:17,000 --> 00:34:21,000 kaya hindi isang perpektong programa dito, ngunit na okay lang dahil ko laging sundutin sa paligid 639 00:34:21,000 --> 00:34:23,000 gamit ang naka-print kung gusto ko. 640 00:34:23,000 --> 00:34:26,000 >> Ipaalam sa akin type susunod muli, at ngayon dito ang mga kawili-wiling bahagi. 641 00:34:26,000 --> 00:34:29,000 Sa puntong ito sa kuwento y ay 2, at x 1, 642 00:34:29,000 --> 00:34:32,000 bilang iminungkahing dito, at muli, 643 00:34:32,000 --> 00:34:35,000 ang dahilan na ito ay awtomatikong ipinapakita ngayon ay dahil ginamit ko ang command 644 00:34:35,000 --> 00:34:40,000 display x at display y, kaya sandali type ko sa tabi 645 00:34:40,000 --> 00:34:43,000 sa teorya x at y ay dapat maging swapped. 646 00:34:43,000 --> 00:34:45,000 Ngayon, alam namin na na hindi ang kaso, 647 00:34:45,000 --> 00:34:49,000 ngunit gagamitin namin makita sa isang sandali kung paano namin sumisid ng mas malalim upang malaman kung bakit na totoo. 648 00:34:49,000 --> 00:34:54,000 Susunod, at sa kasamaang-palad, y pa rin ang 2 at x ay 1 pa rin, at maaari ko makukumpirma ng mas maraming. 649 00:34:54,000 --> 00:34:56,000 Print x, naka-print y. 650 00:34:56,000 --> 00:34:59,000 Sa katunayan, walang pagpapalit ay aktwal na naganap, kaya sabihin simulan ito sa paglipas ng. 651 00:34:59,000 --> 00:35:01,000 Malinaw makipagpalitan ay nasira. 652 00:35:01,000 --> 00:35:04,000 Natin sa halip na i-type ang "run" muli. 653 00:35:04,000 --> 00:35:07,000 Hayaan akong sabihin ninyo ang oo, gusto kong i-restart ang mga ito mula sa simula, ipasok. 654 00:35:07,000 --> 00:35:09,000 >> Ngayon ako back up sa linya 18. 655 00:35:09,000 --> 00:35:11,000 Ngayon mapansin x at y ang mga halaga ng basura muli. 656 00:35:11,000 --> 00:35:15,000 Susunod, susunod, susunod, susunod. 657 00:35:15,000 --> 00:35:17,000 Kung nakukuha ko nababato ko din i-type lamang n para sa susunod. 658 00:35:17,000 --> 00:35:21,000 Maaari mong pagpapaiksi dito sa pinakamaikling posibleng pagkakasunud-sunod ng mga character. 659 00:35:21,000 --> 00:35:23,000 Swap ngayon nasira. 660 00:35:23,000 --> 00:35:25,000 Natin makisalamuha, kaya sa halip na i-type ang susunod, 661 00:35:25,000 --> 00:35:30,000 ngayon ako pagpunta sa type ng hakbang upang ang ako stepping sa loob ng function na ito 662 00:35:30,000 --> 00:35:33,000 sa gayon ay maaari ba akong maglakad sa pamamagitan nito, kaya ko pindutin hakbang at pagkatapos ay ilagay. 663 00:35:33,000 --> 00:35:37,000 Pansinin na highlight jumps down na mas mababa sa aking programa sa linya 36. 664 00:35:37,000 --> 00:35:39,000 Ngayon kung ano ang mga lokal na mga variable? 665 00:35:39,000 --> 00:35:41,000 Info lokal. 666 00:35:41,000 --> 00:35:43,000 Wala pa dahil hindi namin nakuha na linya, 667 00:35:43,000 --> 00:35:47,000 kaya sabihin sige at sabihin "sa tabi." 668 00:35:47,000 --> 00:35:50,000 Ngayon mukhang namin tmp, naka-print tmp. 669 00:35:50,000 --> 00:35:52,000 Basura halaga, i-right? Tingin ko ito. 670 00:35:52,000 --> 00:35:55,000 Paano tungkol-print, naka-print na b, 1 at 2? 671 00:35:55,000 --> 00:35:58,000 Sa isang sandali, sa lalong madaling ko type susunod muli 672 00:35:58,000 --> 00:36:02,000 tmp ay pagpunta sa isang halaga ng 1, sana, 673 00:36:02,000 --> 00:36:05,000 dahil tmp ay pagpunta sa itinalaga ang halaga ng isang. 674 00:36:05,000 --> 00:36:08,000 >> Ngayon sabihin ko i-print ang a, b naka-print, 675 00:36:08,000 --> 00:36:11,000 ngunit ngayon ay i-print ang tmp, at sa katunayan 1. 676 00:36:11,000 --> 00:36:14,000 Hayaan ang gawin sa akin susunod. Hayaan ang gawin sa akin susunod. 677 00:36:14,000 --> 00:36:16,000 Tapos ko na makipagpalitan ng function na. 678 00:36:16,000 --> 00:36:19,000 Ako pa rin sa loob nito sa linya 40, kaya hayaan mo akong mag-print ng, 679 00:36:19,000 --> 00:36:22,000 naka-print na b, at hindi ko pakialam kung ano ang tmp ay. 680 00:36:22,000 --> 00:36:27,000 Mukhang makipagpalitan ng tama pagdating sa pagpapalit at b. 681 00:36:27,000 --> 00:36:31,000 Ngunit kung ako ngayon type susunod, tumalon ako pabalik sa linya 25, 682 00:36:31,000 --> 00:36:34,000 at siyempre, kung nagta-type ako sa x at naka-print na y 683 00:36:34,000 --> 00:36:38,000 sila pa rin hindi nagbabago, kaya hindi namin maayos ang problema. 684 00:36:38,000 --> 00:36:41,000 Ngunit diagnostically ngayon marahil na may GDB programa na ito 685 00:36:41,000 --> 00:36:44,000 namin ang hindi bababa sa nakuha ng isang hakbang na mas malapit sa unawa 686 00:36:44,000 --> 00:36:47,000 kung ano ang nangyayari mali nang hindi kinakailangang magkalat ang aming code sa pamamagitan ng paglalagay ng printf dito, 687 00:36:47,000 --> 00:36:50,000 printf dito, printf dito at pagkatapos ay tumatakbo itong muli at muli 688 00:36:50,000 --> 00:36:52,000 pagsubok upang malaman kung ano ang nangyayari mali. 689 00:36:52,000 --> 00:36:55,000 >> Ako pagpunta sa sige at mag-quit ng ito nang sama-sama na may mag-quit. 690 00:36:55,000 --> 00:36:57,000 Ito ay pagpunta sa pagkatapos ay sabihin, "Mag-quit pa rin?" Oo. 691 00:36:57,000 --> 00:37:00,000 Ngayon ako pabalik sa aking normal prompt, at tapos ako na gamit GDB. 692 00:37:00,000 --> 00:37:03,000 Bilang isang bukod, hindi mo na kailangang gamitin ang-tui bandila. 693 00:37:03,000 --> 00:37:07,000 Sa katunayan, kung ligtaan mo ito makakakuha ka ng mahalagang ang ibabang kalahati ng screen. 694 00:37:07,000 --> 00:37:11,000 Kung ako pagkatapos ay i-type pahinga pangunahing at pagkatapos patakbuhin 695 00:37:11,000 --> 00:37:15,000 Ko pa rin patakbuhin ang aking mga programa, ngunit kung ano ito ay mas textually 696 00:37:15,000 --> 00:37:18,000 lamang ipakita sa akin ang kasalukuyang isang linya sa isang pagkakataon. 697 00:37:18,000 --> 00:37:21,000 Ang-tui, tekstuwal user interface, 698 00:37:21,000 --> 00:37:25,000 lamang nagpapakita sa iyo ng higit pa ng programa nang sabay-sabay, na kung saan ay marahil ng isang bit conceptually madali. 699 00:37:25,000 --> 00:37:27,000 Ngunit sa katunayan, maaari ko lang gawin susunod, susunod, susunod, 700 00:37:27,000 --> 00:37:30,000 at ako pagpunta upang makita ang isang linya sa isang pagkakataon, at kung gusto ko talagang upang makita kung ano ang nangyayari sa 701 00:37:30,000 --> 00:37:35,000 Ang maaari kong i-type ang listahan at makita ang isang buong grupo ng mga kalapit na mga linya. 702 00:37:35,000 --> 00:37:39,000 >> May isang video na namin ang hiniling mong panoorin para sa problema nagtatakda 3 703 00:37:39,000 --> 00:37:43,000 kung saan Nate sumasaklaw sa ilang ng intricacies ng GDB, 704 00:37:43,000 --> 00:37:46,000 at ito ay isa sa mga bagay, totoo lang, kung saan ang ilang di-trivia porsyento ng sa iyo 705 00:37:46,000 --> 00:37:49,000 hindi kailanman ay pindutin GDB, at iyon ay isang masamang bagay 706 00:37:49,000 --> 00:37:53,000 dahil literal ay magtapos paggastos mas maraming oras sa ibang pagkakataon ito semestre 707 00:37:53,000 --> 00:37:56,000 habol pababa bug pagkatapos ay sa iyo kung inilagay mo sa oras na kalahati / oras 708 00:37:56,000 --> 00:38:00,000 ito linggo at susunod na pag-aaral upang makakuha ng komportable sa GDB. 709 00:38:00,000 --> 00:38:02,000 Printf iyong kaibigan. 710 00:38:02,000 --> 00:38:05,000 GDB dapat ngayon ang iyong kaibigan. 711 00:38:05,000 --> 00:38:08,000 >> Anumang mga katanungan sa GDB? 712 00:38:08,000 --> 00:38:12,000 At narito ang isang mabilis na listahan ng ilan sa ang pinaka-makapangyarihang at kapaki-pakinabang na mga utos. 713 00:38:12,000 --> 00:38:15,000 Oo. >> Maaari mong i-print ang isang string? 714 00:38:15,000 --> 00:38:17,000 Maaari mong i-print ang isang string? Ganap. 715 00:38:17,000 --> 00:38:19,000 Ito ay hindi lamang na ang mga integer. 716 00:38:19,000 --> 00:38:22,000 Kung ang isang variable s ay lamang ng uri sa naka-print na mga string. 717 00:38:22,000 --> 00:38:24,000 Ito ay ipakita sa iyo kung ano na ang variable ng string ay. 718 00:38:24,000 --> 00:38:26,000 [Hindi marinig na mag-aaral] 719 00:38:26,000 --> 00:38:28,000 Ito ay magbibigay sa iyo ang address at ang string mismo. 720 00:38:28,000 --> 00:38:32,000 Ito ay ipakita sa iyo ang parehong. 721 00:38:32,000 --> 00:38:34,000 At isa huling bagay, dahil lang sa ito ay mahusay na malaman masyadong. 722 00:38:34,000 --> 00:38:37,000 Backtrace at frame, hayaan mo akong sumisid sa ito isang huling oras, 723 00:38:37,000 --> 00:38:39,000 parehong eksaktong programa sa GDB. 724 00:38:39,000 --> 00:38:44,000 Hayaan akong magpatuloy at patakbuhin ang tekstuwal bersyon ng interface ng gumagamit, 725 00:38:44,000 --> 00:38:46,000 lumalabag sa pangunahing. 726 00:38:46,000 --> 00:38:49,000 Hayaan akong magpatuloy at patakbuhin muli. Narito Ako. 727 00:38:49,000 --> 00:38:55,000 Ngayon hayaan mo akong pumunta susunod, susunod, susunod, susunod, susunod, hakbang, ipasok. 728 00:38:55,000 --> 00:39:00,000 >> At ngayon, ipagpalagay na ako ngayon sa makipagpalitan sadyang, ngunit ako tulad ng "mapahamak, kung ano ang halaga ng x?" 729 00:39:00,000 --> 00:39:02,000 Hindi ko maaaring gawin x ito. 730 00:39:02,000 --> 00:39:05,000 Hindi ko maaaring gawin y dahil hindi nila hindi sa saklaw. 731 00:39:05,000 --> 00:39:07,000 Ang mga ito ay hindi sa konteksto, ngunit walang problema. 732 00:39:07,000 --> 00:39:09,000 Ang maaari kong i-type ang backtrace. 733 00:39:09,000 --> 00:39:13,000 Na nagpapakita sa akin ang lahat ng mga pagpapaandar na maisakatuparan hanggang sa puntong ito sa panahon. 734 00:39:13,000 --> 00:39:16,000 Pansinin na ang isa sa ibaba, pangunahing, ang mga linya na may pangunahing 735 00:39:16,000 --> 00:39:18,000 pagiging sa ilalim ng aming mga larawan dito. 736 00:39:18,000 --> 00:39:22,000 Ang katotohanan na makipagpalitan sa itaas ng mga ito linya up may makipagpalitan ng pagiging nasa itaas nito sa memory dito, 737 00:39:22,000 --> 00:39:26,000 at kung gusto ko upang makabalik sa pangunahing pansamantalang ko sabihin ang "frame." 738 00:39:26,000 --> 00:39:30,000 Ano number? Main frame # 1. 739 00:39:30,000 --> 00:39:32,000 Ako pagpunta sa sige at sabihin ang "frame 1." 740 00:39:32,000 --> 00:39:36,000 >> Ngayon ako pabalik sa pangunahing, at ang maaari kong i-print x, at ang maaari kong i-print y, 741 00:39:36,000 --> 00:39:40,000 ngunit hindi ako makapag-print o b. 742 00:39:40,000 --> 00:39:43,000 Ngunit maaari ko kung sinasabi ko, "Okay, maghintay ng isang minuto. Saan ang makipagpalitan?" 743 00:39:43,000 --> 00:39:46,000 Hayaan akong magpatuloy at sabihin ang "frame 0." 744 00:39:46,000 --> 00:39:48,000 Ngayon ako pabalik kung saan gusto kong maging, at bilang isang tabi, 745 00:39:48,000 --> 00:39:52,000 may iba pang mga utos masyadong, tulad ng kung ikaw talaga ka nakakakuha nababato pagta-type susunod, susunod, susunod, susunod, 746 00:39:52,000 --> 00:39:56,000 maaari mong pangkalahatang sabihin ng mga bagay tulad ng "susunod na 10," at na hakbang sa pamamagitan ng susunod na 10 na linya. 747 00:39:56,000 --> 00:39:59,000 Maaari mo ring isulat ang "magpatuloy" kapag ikaw ay talagang makapag-fed up sa stepping sa pamamagitan nito. 748 00:39:59,000 --> 00:40:05,000 Magpatuloy patakbuhin ang iyong programa nang tuluy-tuloy hanggang ito hit sa isa pang breakpoint, 749 00:40:05,000 --> 00:40:07,000 kung sa isang loop o babaan sa iyong programa. 750 00:40:07,000 --> 00:40:11,000 >> Sa kasong ito na namin ipinagpatuloy sa dulo, at programa ang lumabas normal. 751 00:40:11,000 --> 00:40:13,000 Ito ay isang magarbong paraan, bulok na proseso. 752 00:40:13,000 --> 00:40:16,000 Lamang ang iyong programa lumabas normal. 753 00:40:16,000 --> 00:40:24,000 Higit pa sa na sa video at sa pag-debug ng mga sesyon sa darating. 754 00:40:24,000 --> 00:40:26,000 Na ng maraming. 755 00:40:26,000 --> 00:40:35,000 Sabihin ang aming 5-minutong break na dito, at magbabalik kami sa mga structs at mga file. 756 00:40:35,000 --> 00:40:38,000 >> Kung ikaw ay dived sa pset sa linggong ito na 757 00:40:38,000 --> 00:40:41,000 malalaman mo na ginagamit namin sa code ng pamamahagi, 758 00:40:41,000 --> 00:40:45,000 pinagmulan ng code na nagbibigay kami sa iyo bilang isang panimulang punto, ang ilang mga bagong diskarte. 759 00:40:45,000 --> 00:40:50,000 Sa partikular, ipinakilala namin ang bagong keyword na ito na tinatawag na struct, istraktura, 760 00:40:50,000 --> 00:40:53,000 upang maaari naming lumikha ng na-customize na mga variable ng uri. 761 00:40:53,000 --> 00:40:57,000 Din namin ipinakilala ang paniwala ng file I / O, file input at output, 762 00:40:57,000 --> 00:41:00,000 at ito ay upang maaari naming i-save ang estado 763 00:41:00,000 --> 00:41:03,000 ng iyong mang-uayabit board sa isang file sa disc 764 00:41:03,000 --> 00:41:06,000 sa gayon ay ang mga Fellows ng pagtuturo at ako ay maaaring maunawaan 765 00:41:06,000 --> 00:41:09,000 kung ano ang nangyayari sa loob ng iyong programa nang hindi na kinakailangang upang mano-manong i-play 766 00:41:09,000 --> 00:41:11,000 dose-dosenang ng mga laro ng mang-uayabit. 767 00:41:11,000 --> 00:41:13,000 Maaari naming gawin ito mas automatedly. 768 00:41:13,000 --> 00:41:18,000 >> Ito ideya ng isang struct malulutas nito ang patas nakapanghihimok problema. 769 00:41:18,000 --> 00:41:21,000 Ipagpalagay na gusto naming ipatupad ng ilang programa 770 00:41:21,000 --> 00:41:25,000 na sa paanuman Sinusubaybayan ng impormasyon sa mga mag-aaral, 771 00:41:25,000 --> 00:41:28,000 at ang mga mag-aaral ay maaaring magkaroon ng, halimbawa, ng isang ID, pangalan 772 00:41:28,000 --> 00:41:31,000 at ng bahay sa isang lugar tulad ng Harvard, kaya ito ay 3 piraso ng impormasyon 773 00:41:31,000 --> 00:41:34,000 gusto naming panatilihin sa paligid, kaya ipaalam sa akin sige at simulan ang pagsusulat ng isang maliit na programa dito, 774 00:41:34,000 --> 00:41:38,000 isama stdio.h. 775 00:41:38,000 --> 00:41:42,000 Hayaan ang gawin sa akin isama cs50.h. 776 00:41:42,000 --> 00:41:44,000 At pagkatapos ay simulan ang aking pangunahing function na. 777 00:41:44,000 --> 00:41:46,000 Hindi ko ay abala sa anumang argumento command line, 778 00:41:46,000 --> 00:41:49,000 at dito ay nais kong magkaroon ng isang mag-aaral, kaya ako pagpunta sa sabihin 779 00:41:49,000 --> 00:41:54,000 ang mag-aaral ay may isang pangalan, kaya ako pagpunta sa sabihin "string ang pangalan." 780 00:41:54,000 --> 00:41:59,000 Pagkatapos ako pagpunta sa sabihin natin na ang mag-aaral ay mayroon ding isang ID, kaya int id, 781 00:41:59,000 --> 00:42:03,000 at ang mag-aaral ay may isang bahay, kaya din ako pagpunta sa sabihin "string bahay." 782 00:42:03,000 --> 00:42:06,000 Pagkatapos ay kukunin ko na mag-order ng mga ito ng kaunti pa nang malinis tulad nito. 783 00:42:06,000 --> 00:42:11,000 Okay, ngayon mayroon akong 3 variable na kumakatawan sa isang mag-aaral, kaya "isang mag-aaral." 784 00:42:11,000 --> 00:42:15,000 >> At ngayon, gusto kong i-populate ang mga halagang ito, kaya hayaan mo akong magpatuloy at sabihin ang isang bagay tulad ng 785 00:42:15,000 --> 00:42:18,000 "Id = 123." 786 00:42:18,000 --> 00:42:21,000 Pangalan ay pagpunta upang makakuha ng David. 787 00:42:21,000 --> 00:42:24,000 Sabihin nating bahay ay pagpunta upang makakuha ng Mather, 788 00:42:24,000 --> 00:42:31,000 at pagkatapos ay ako pagpunta sa gawin ang isang bagay mang tulad printf ("% s, 789 00:42:31,000 --> 00:42:37,000 na ang ID ay% d, nakatira sa% s. 790 00:42:37,000 --> 00:42:41,000 At ngayon, ano ang gusto kong plug in dito, isa pagkatapos ng isa? 791 00:42:41,000 --> 00:42:47,000 Pangalan, id, bahay; return 0. 792 00:42:47,000 --> 00:42:50,000 Okay, maliban kung ako screwed up sa isang lugar dito 793 00:42:50,000 --> 00:42:54,000 Tingin ko kami ay may isang medyo magandang programa na nag-iimbak ng isang mag-aaral. 794 00:42:54,000 --> 00:42:57,000 Siyempre, ito ay hindi lahat na kawili-wili. Paano kung gusto kong 2 mga mag-aaral? 795 00:42:57,000 --> 00:42:59,000 Na hindi sang-ayon. Maaari kong suportahan ang 2 tao. 796 00:42:59,000 --> 00:43:03,000 Hayaan akong magpatuloy at i-highlight ito at pumunta dito, 797 00:43:03,000 --> 00:43:09,000 at maaari ba akong sabihin "id = 456" para sa isang tao tulad ng Rob nakatira sa Kirkland. 798 00:43:09,000 --> 00:43:12,000 >> Okay, maghintay, ngunit Hindi ko matawagan ang mga ito ang parehong bagay, 799 00:43:12,000 --> 00:43:15,000 at mukhang ako pagpunta upang kopyahin ito, 800 00:43:15,000 --> 00:43:19,000 kaya hayaan sabihin sa akin na ang mga ito ay ni David ang variable, 801 00:43:19,000 --> 00:43:23,000 at hayaan mo akong makakuha ng ilang mga kopya sa mga ito para sa Rob. 802 00:43:23,000 --> 00:43:27,000 Kami tatawag sa mga Rob ngunit ito ay hindi pagpunta sa trabaho ngayon 803 00:43:27,000 --> 00:43:33,000 dahil ko-maghintay, sabihin baguhin sa akin sa mga id1, NAME1 at house1. 804 00:43:33,000 --> 00:43:35,000 Rob ay 2, 2. 805 00:43:35,000 --> 00:43:42,000 Mayroon akong upang baguhin ito dito, dito, dito, dito, dito, dito. 806 00:43:42,000 --> 00:43:45,000 Maghintay, kung ano ang tungkol sa Tommy? Natin gawin ito muli. 807 00:43:45,000 --> 00:43:49,000 Malinaw kung sa tingin mo pa rin na ito ay isang mahusay na paraan ng paggawa nito, hindi, 808 00:43:49,000 --> 00:43:52,000 kaya kopyahin / ilagay masamang. 809 00:43:52,000 --> 00:43:55,000 Ngunit malulutas namin ito sa isang linggo na ang nakalipas. 810 00:43:55,000 --> 00:43:59,000 >> Ano ang aming solusyon kapag gusto naming magkaroon ng maramihang mga kaso ng ang parehong uri ng data? 811 00:43:59,000 --> 00:44:01,000 [Mag-aaral] isang array. 812 00:44:01,000 --> 00:44:03,000 Array isang, kaya hayaan mo akong subukan upang linisin ito up. 813 00:44:03,000 --> 00:44:07,000 Hayaan akong gumawa ng ilang mga kuwarto para sa aking sarili sa tuktok, at ipaalam sa akin sa halip gawin ito dito. 814 00:44:07,000 --> 00:44:12,000 Susubukan naming tawagan ang mga taong ito, at sa halip ako pagpunta sa sabihin "int id," 815 00:44:12,000 --> 00:44:14,000 at ako pagpunta upang suportahan ang 3 sa atin sa ngayon. 816 00:44:14,000 --> 00:44:18,000 Ako pagpunta upang sabihin ang "pangalan ng string," at makikita ko sinusuportahan 3 sa atin, 817 00:44:18,000 --> 00:44:22,000 at pagkatapos ay ako na sabihing "bahay string," at ako pagpunta upang suportahan ang 3 sa atin. 818 00:44:22,000 --> 00:44:26,000 Ngayon in dito sa halip ng David nakakakuha ng kanyang sariling lokal na mga variable 819 00:44:26,000 --> 00:44:28,000 maaari naming makakuha ng mapupuksa ng mga. 820 00:44:28,000 --> 00:44:30,000 Iyon nararamdaman mahusay na namin ang paglilinis up ito. 821 00:44:30,000 --> 00:44:35,000 Ko sabihin David ay pagpunta sa [0] at pangalan [0] 822 00:44:35,000 --> 00:44:38,000 at bahay [0]. 823 00:44:38,000 --> 00:44:41,000 At pagkatapos Rob maaari naming parehong i-save sa. 824 00:44:41,000 --> 00:44:46,000 Natin ilagay ito down na dito, kaya siya ay pagpunta sa mang id [1]. 825 00:44:46,000 --> 00:44:50,000 Ang kanyang pagpunta sa maging ang mga pangalan [1], 826 00:44:50,000 --> 00:44:53,000 at pagkatapos ay bilang wakas, ang mga bahay [1]. 827 00:44:53,000 --> 00:44:57,000 >> Pa rin ng kaunti nakakapagod, at ngayon ay mayroon akong upang malaman ito, 828 00:44:57,000 --> 00:45:03,000 kaya sabihin nating "pangalan [0], id [0], bahay [0], 829 00:45:03,000 --> 00:45:06,000 at sabihin gawing maramihan ito. 830 00:45:06,000 --> 00:45:09,000 Mga id, id, id. 831 00:45:09,000 --> 00:45:12,000 At muli, ako ginagawa ito, kaya muli, na ako resorting upang kopyahin / ilagay muli, 832 00:45:12,000 --> 00:45:14,000 kaya ang mga logro ay ang isa pang solusyon dito. 833 00:45:14,000 --> 00:45:18,000 Maaari ko marahil linisin ito up pa sa isang loop o ng isang bagay tulad na, 834 00:45:18,000 --> 00:45:21,000 kaya sa maikling salita, ito ay isang maliit na mas mahusay na ngunit pa rin nararamdaman tulad ng 835 00:45:21,000 --> 00:45:24,000 Ako resorting kopyahin / ilagay, ngunit kahit na ito, inaangkin ko, 836 00:45:24,000 --> 00:45:27,000 ay hindi talagang sa panimula ang tamang solusyon dahil 837 00:45:27,000 --> 00:45:29,000 paano kung minsan magpasya namin alam mo kung ano? 838 00:45:29,000 --> 00:45:32,000 Dapat namin talagang na-sa pag-iimbak ng mga email address para sa David at Rob 839 00:45:32,000 --> 00:45:34,000 at ang iba sa programang ito. 840 00:45:34,000 --> 00:45:36,000 Dapat din namin iimbak ang mga numero ng telepono. 841 00:45:36,000 --> 00:45:39,000 Dapat din namin-imbak ang mga numerong pang-emergency contact. 842 00:45:39,000 --> 00:45:41,000 Mayroon kaming lahat ng mga piraso ng data na gusto namin na mag-imbak, 843 00:45:41,000 --> 00:45:43,000 kaya kung paano mo pumunta tungkol sa paggawa na? 844 00:45:43,000 --> 00:45:46,000 >> Idedeklara ka ng isa pang hanay sa itaas, at pagkatapos mong mano-manong magdagdag ng 845 00:45:46,000 --> 00:45:49,000 ng isang email address [0], email address [1] 846 00:45:49,000 --> 00:45:51,000 para sa David at Rob at iba pa. 847 00:45:51,000 --> 00:45:56,000 Ngunit mayroong talagang lamang ng isang palagay pinagbabatayan ito disenyo 848 00:45:56,000 --> 00:45:59,000 na ako gamit ang karangalan system upang malaman na 849 00:45:59,000 --> 00:46:03,000 [I] sa bawat isa ng ilang array 850 00:46:03,000 --> 00:46:06,000 lamang kaya ang mangyayari sumangguni sa parehong tao, 851 00:46:06,000 --> 00:46:10,000 kaya [0] sa id ay numero 123, 852 00:46:10,000 --> 00:46:13,000 at ako pagpunta sa ipagpalagay na ang pangalan [0] 853 00:46:13,000 --> 00:46:16,000 pangalan ng parehong tao at bahay [0] 854 00:46:16,000 --> 00:46:21,000 bahay ang parehong tao at iba pa para sa lahat ng iba't-ibang mga array na ako lilikha. 855 00:46:21,000 --> 00:46:24,000 Ngunit mapansin na walang saligan Linkage 856 00:46:24,000 --> 00:46:27,000 kabilang ang mga 3 piraso ng impormasyon, id, pangalan at bahay, 857 00:46:27,000 --> 00:46:32,000 kahit ang entity na sinusubukan naming modelo sa programang ito ay hindi array. 858 00:46:32,000 --> 00:46:35,000 Array ito program na paraan ng paggawa nito. 859 00:46:35,000 --> 00:46:38,000 Ano talaga namin nais na modelo sa aming programa ay isang tao 860 00:46:38,000 --> 00:46:41,000 tulad ng David, isang tao tulad ng Rob sa loob kung saan 861 00:46:41,000 --> 00:46:46,000 o encapsulating ay isang pangalan at ID at ng bahay. 862 00:46:46,000 --> 00:46:49,000 >> Maaari namin sa paanuman ipahayag ito ideya ng encapsulation 863 00:46:49,000 --> 00:46:52,000 kung saan ang isang tao ay may isang ID, pangalan at ng bahay 864 00:46:52,000 --> 00:46:55,000 at hindi resort talaga ito paupahang karomata kung saan lang namin 865 00:46:55,000 --> 00:46:58,000 pinagkakatiwalaan na isang bagay na bracket 866 00:46:58,000 --> 00:47:02,000 tumutukoy sa parehong tao na entity sa bawat isa ng mga disparate array? 867 00:47:02,000 --> 00:47:04,000 Maaari naming aktwal na gawin ito. 868 00:47:04,000 --> 00:47:08,000 Ipaalam sa akin pumunta sa itaas pangunahing sa ngayon, at hayaan mo akong lumikha ng aking sariling uri ng data 869 00:47:08,000 --> 00:47:10,000 para talagang sa unang pagkakataon. 870 00:47:10,000 --> 00:47:14,000 Ginamit namin sa diskarteng ito sa mang-uayabit, 871 00:47:14,000 --> 00:47:17,000 ngunit dito ako pagpunta upang magpatuloy at lumikha ng isang uri ng data, 872 00:47:17,000 --> 00:47:19,000 at alam mo kung ano, ako na tumawag ito ng mag-aaral o tao, 873 00:47:19,000 --> 00:47:23,000 at ako pagpunta sa gamitin typedef para tukuyin ang isang uri. 874 00:47:23,000 --> 00:47:25,000 Ako pagpunta upang sabihin na ito ay isang istraktura, 875 00:47:25,000 --> 00:47:29,000 at pagkatapos ay ang istraktura na ito ay ng uri ng mag-aaral, namin sabihin, 876 00:47:29,000 --> 00:47:31,000 kahit na ito ay isang maliit na napetsahan ngayon para sa akin. 877 00:47:31,000 --> 00:47:33,000 Susubukan naming sabihin ang "int id." 878 00:47:33,000 --> 00:47:35,000 Susubukan naming sabihin ang "string ang pangalan." 879 00:47:35,000 --> 00:47:37,000 Pagkatapos ay magpapadala kami sabihin ang "string bahay," 880 00:47:37,000 --> 00:47:40,000 na ito ngayon sa pamamagitan ng pagtatapos ng mga ilang linya ng code 881 00:47:40,000 --> 00:47:45,000 Ko itinuro kumalatong na may umiiral 882 00:47:45,000 --> 00:47:49,000 isang uri ng data bukod ints, bukod sa mga string, bukod sa doubles, bukod sa kamay. 883 00:47:49,000 --> 00:47:54,000 >> Ng panahon na ito sa time line 11, ngayon ay isang bagong uri ng data na tinatawag na mga mag-aaral, 884 00:47:54,000 --> 00:47:58,000 at ngayon ko ipinapahayag ng isang mag-aaral variable kahit saan gusto kong, 885 00:47:58,000 --> 00:48:01,000 kaya hayaan mag-scroll pababa sa akin dito sa mga tao. 886 00:48:01,000 --> 00:48:05,000 Ngayon ay maaari ko mapupuksa ng ito, at maaari ba akong bumalik down sa David dito, 887 00:48:05,000 --> 00:48:10,000 at para sa David ko talagang sabihin na David, 888 00:48:10,000 --> 00:48:13,000 maaari naming literal pangalanan ang variable pagkatapos aking sarili, 889 00:48:13,000 --> 00:48:16,000 pagpunta sa ng uri ng mag-aaral. 890 00:48:16,000 --> 00:48:18,000 Ito ay maaaring tumingin ng kaunti kakaiba, ngunit ito ay hindi ang lahat ng iba't-ibang 891 00:48:18,000 --> 00:48:22,000 mula sa deklarasyon ng isang bagay bilang isang int o isang string o isang Float. 892 00:48:22,000 --> 00:48:24,000 Ito lang kaya ang mangyayari sa tinatawag na mag-aaral sa ngayon, 893 00:48:24,000 --> 00:48:28,000 at kung gusto ko upang ilagay ang isang bagay sa loob ng istrakturang ito 894 00:48:28,000 --> 00:48:31,000 Ako ay mayroon na ngayong gumamit ng isang bagong piraso ng syntax, ngunit medyo direkta, 895 00:48:31,000 --> 00:48:39,000 david.id = 123, david.name = "David" sa kabisera D, 896 00:48:39,000 --> 00:48:42,000 at david.house = "Mather," 897 00:48:42,000 --> 00:48:46,000 at ngayon ako makakakuha ng mapupuksa ng mga bagay na ito dito. 898 00:48:46,000 --> 00:48:51,000 Mapansin ngayon Binago namin ang disenyo ng aming programa sa talagang isang mas mas mahusay na paraan 899 00:48:51,000 --> 00:48:54,000 in na ngayon ang aming programa salamin sa tunay na mundo. 900 00:48:54,000 --> 00:48:57,000 >> May isang real-world na paniwala ng isang tao o ng isang mag-aaral. 901 00:48:57,000 --> 00:49:02,000 Narito mayroon kami ngayon ng C bersyon ng isang tao o higit na partikular ng isang mag-aaral. 902 00:49:02,000 --> 00:49:05,000 Sa loob ng taong iyon ang mga may-kaugnay na mga katangian, 903 00:49:05,000 --> 00:49:10,000 ID, pangalan at bahay, kaya Rob mahalagang magiging ang parehong bagay dito, 904 00:49:10,000 --> 00:49:14,000 kaya mag-aaral pagnakawan, at ngayon rob.id = 456, 905 00:49:14,000 --> 00:49:17,000 rob.name = "Rob." 906 00:49:17,000 --> 00:49:20,000 Ang katotohanan na variable ay tinatawag na Rob uri ng walang kahulugan. 907 00:49:20,000 --> 00:49:22,000 Namin ang tinatawag na ito x o y o z. 908 00:49:22,000 --> 00:49:25,000 Lamang namin na may pangalang Rob ito sa magkakahulugang mga pare-pareho, 909 00:49:25,000 --> 00:49:28,000 ngunit talagang pangalan sa loob ng patlang na iyon mismo, 910 00:49:28,000 --> 00:49:30,000 kaya ngayon ay mayroon akong ito. 911 00:49:30,000 --> 00:49:33,000 Ito masyadong ay hindi pakiramdam tulad ng ang pinakamahusay na disenyo na mahirap ko ang code David. 912 00:49:33,000 --> 00:49:35,000 Mahirap ko na code Rob. 913 00:49:35,000 --> 00:49:39,000 At Mayroon pa akong sa resort sa ilang kopya at i-paste sa bawat oras na gusto ko ng bagong variable. 914 00:49:39,000 --> 00:49:43,000 Dagdag pa rito, mayroon akong tila bigyan ang bawat isa sa mga variable na ito ng pangalan, 915 00:49:43,000 --> 00:49:46,000 kahit gusto ko magkano sa halip na ilarawan ang mga variable na ito 916 00:49:46,000 --> 00:49:48,000  mas generically bilang mga mag-aaral. 917 00:49:48,000 --> 00:49:52,000 >> Ngayon ay maaari naming pagsamahin ang mga ideya na mahusay na gumagana para sa amin 918 00:49:52,000 --> 00:49:56,000 at sa halip ay sabihin, "alam mo kung ano, ibigay sa akin ang isang variable na tinatawag na mga mag-aaral, 919 00:49:56,000 --> 00:50:01,000 at sabihin ito ng laki 3, "kaya ngayon ko pinuhin ito nang higit pa, 920 00:50:01,000 --> 00:50:04,000 mapupuksa ng nang manu-mano ang ipinahayag David, 921 00:50:04,000 --> 00:50:08,000 at maaari ko sa halip sabihin ang isang bagay tulad ng mga mag-aaral [0] dito. 922 00:50:08,000 --> 00:50:11,000 Ko sabihin ang mga mag-aaral [0] dito, 923 00:50:11,000 --> 00:50:14,000 mag-aaral [0] dito, at iba pa, at ako ay maaaring pumunta sa paligid 924 00:50:14,000 --> 00:50:16,000 at linisin na para sa Rob. 925 00:50:16,000 --> 00:50:19,000 Maaaring ko ring pumunta tungkol sa ngayon marahil pagdaragdag ng isang loop 926 00:50:19,000 --> 00:50:23,000 at gamit ang GetString at GetInt sa aktwal na makakuha ng mga halagang ito mula sa user. 927 00:50:23,000 --> 00:50:27,000 Maaari kong pumunta tungkol sa pagdaragdag ng isang pare-pareho dahil ito ay masamang kasanayan 928 00:50:27,000 --> 00:50:29,000 sa hard code ilang arbitrary na numero tulad ng 3 dito mismo 929 00:50:29,000 --> 00:50:33,000 at pagkatapos lamang tandaan na dapat mong ilagay ang hindi hihigit sa 3 mga mag-aaral sa loob nito. 930 00:50:33,000 --> 00:50:36,000 Marahil ito ang mas mahusay na gamitin ang # tukuyin sa tuktok ng aking mga file 931 00:50:36,000 --> 00:50:40,000 at salik na out, kaya sa katunayan, hayaan mo akong magpatuloy at magbigay ng tuntuning panlahat na ito. 932 00:50:40,000 --> 00:50:43,000 >> Hayaan akong buksan ang isang halimbawa na kabilang ngayon 933 00:50:43,000 --> 00:50:46,000 halimbawa nang maaga, structs1. 934 00:50:46,000 --> 00:50:49,000 Ito ay isang mas kumpletong program na gumagamit ng # tukuyin dito 935 00:50:49,000 --> 00:50:51,000 at sabi namin ay pagpunta sa may 3 mga mag-aaral sa pamamagitan ng default. 936 00:50:51,000 --> 00:50:54,000 Narito ako deklarasyon nagkakahalaga ng isang klase ng mga mag-aaral, 937 00:50:54,000 --> 00:50:57,000 kaya ng isang silid-aralan ng mga mag-aaral, at ngayon gumagamit ako ng isang loop 938 00:50:57,000 --> 00:51:00,000 lamang ang code ng kaunti pa sa eleganteng, populate ng klase 939 00:51:00,000 --> 00:51:05,000 sa input ng user, kaya umulit mula sa i = 0 sa hanggang sa mag-aaral, na kung saan ay 3. 940 00:51:05,000 --> 00:51:07,000 At pagkatapos ko prompt ang user sa ang bersyon na ito 941 00:51:07,000 --> 00:51:10,000  kung ano ang ID ng mag-aaral, at nakukuha ko ito sa GetInt. 942 00:51:10,000 --> 00:51:13,000 Ano ang pangalan ng mag-aaral, at pagkatapos ay ako makakakuha ng ito sa GetString. 943 00:51:13,000 --> 00:51:15,000 Ano ang bahay ng mag-aaral? Nakukuha ko may GetString. 944 00:51:15,000 --> 00:51:19,000 At pagkatapos ay sa ibaba dito ko lang nagpasya upang baguhin 945 00:51:19,000 --> 00:51:22,000 kung paano pag-print ako ng mga out at aktwal na gumamit ng loop, 946 00:51:22,000 --> 00:51:24,000 at kung sino ako pag-print? 947 00:51:24,000 --> 00:51:27,000 Ayon sa komento ako pag-print ng sinuman sa Mather, 948 00:51:27,000 --> 00:51:30,000 at na ito kaya Rob at Tommy at iba pa-aktwal Tommy sa Mather. 949 00:51:30,000 --> 00:51:34,000 Tommy at David ay ipi-print sa kasong ito, ngunit paano ito gumagana? 950 00:51:34,000 --> 00:51:40,000 Hindi namin nakita ang function na ito bago, ngunit tumagal ng hula sa kung ano ang ginagawa. 951 00:51:40,000 --> 00:51:42,000 Inihahambing string. 952 00:51:42,000 --> 00:51:45,000 >> Ito ay isang maliit na hindi-halata kung paano ito ikinukumpara string dahil ito ay lumiliko out 953 00:51:45,000 --> 00:51:49,000 kung ito nagbabalik 0 ito ay nangangahulugan na ang mga string ay katumbas. 954 00:51:49,000 --> 00:51:53,000 Kung ito ay nagbabalik ng -1 na nangangahulugang ang isa ay ayon sa alpabeto bago ang isa, 955 00:51:53,000 --> 00:51:57,000 at kung ito nagbabalik +1 na nangangahulugang ang iba pang mga salita ay ayon sa alpabeto 956 00:51:57,000 --> 00:52:00,000 bago ang isa, at maaari kang tumingin sa online o sa tao ng pahina 957 00:52:00,000 --> 00:52:04,000 upang makita ang eksakto kung aling paraan ay kung saan, ngunit ang lahat ng ito ay ngayon paggawa ay ito sinasabi 958 00:52:04,000 --> 00:52:09,000 kung ang [i]. bahay ay katumbas ng "Mather" 959 00:52:09,000 --> 00:52:13,000 pagkatapos ay magpatuloy at i-print ang kaya at kaya sa Mather. 960 00:52:13,000 --> 00:52:16,000 Ngunit narito ang isang bagay na hindi namin nakita bago, at magpapadala kami bumalik sa. 961 00:52:16,000 --> 00:52:21,000 Hindi ko isipin ang na kinakailangang gawin ito sa anumang ng aking mga programa. 962 00:52:21,000 --> 00:52:24,000 Libreng ay tila tumutukoy sa memory, pagbabakante memory, 963 00:52:24,000 --> 00:52:31,000 ngunit kung ano ang memory ako tila pagbabakante sa loop sa ilalim ng programang ito? 964 00:52:31,000 --> 00:52:34,000 Mukhang ako pagbabakante ng pangalan ng isang tao 965 00:52:34,000 --> 00:52:37,000 at bahay ng isang tao, ngunit kung bakit ay na? 966 00:52:37,000 --> 00:52:41,000 >> Lumiliko out sa lahat ng mga linggo na na ginagamit mo GetString 967 00:52:41,000 --> 00:52:45,000 namin ang uri ng nagpapakilala ng isang bug sa bawat isa ng iyong mga programa. 968 00:52:45,000 --> 00:52:51,000 GetString sa pamamagitan ng disenyo allocates memory upang maaari itong bumalik sa iyo ng isang string, 969 00:52:51,000 --> 00:52:55,000 tulad ng David, o Rob, at pagkatapos ay gawin ang anumang nais mong 970 00:52:55,000 --> 00:52:59,000 may na string sa iyong programa dahil kami ay reserbado memory para sa iyo. 971 00:52:59,000 --> 00:53:02,000 Ang problema ay lahat oras na ito sa bawat oras na tawagan ka GetString 972 00:53:02,000 --> 00:53:05,000 namin, ang mga may-akda ng GetString, ay humihiling sa operating system 973 00:53:05,000 --> 00:53:07,000 upang bigyan kami ng isang bit ng RAM para sa string. 974 00:53:07,000 --> 00:53:09,000 Bigyan kami ng isang bit ng RAM para sa susunod na string. 975 00:53:09,000 --> 00:53:11,000 Bigyan kami ng ilang karagdagang RAM para sa susunod na string. 976 00:53:11,000 --> 00:53:13,000 Ano, programmer, hindi pa ginagawa 977 00:53:13,000 --> 00:53:15,000 pagbigay sa amin na memory likod, 978 00:53:15,000 --> 00:53:17,000 ito para sa mga ilang linggo ang lahat ng programa na nakasulat 979 00:53:17,000 --> 00:53:20,000 nagkaroon ng kung ano ang tinatawag na memory hakbang kung saan sila panatilihin gamit 980 00:53:20,000 --> 00:53:24,000 higit pa at higit pa memory sa bawat oras na tumawag ka GetString, at na fine. 981 00:53:24,000 --> 00:53:27,000 Gawin namin sadyang na sa unang linggo dahil ito ay hindi na kawili-wili 982 00:53:27,000 --> 00:53:29,000 upang mag-alala tungkol sa kung saan string ay nagmumula sa. 983 00:53:29,000 --> 00:53:34,000 Ang gusto mo ay salita Rob upang bumalik kapag ang user ang mga uri ito. 984 00:53:34,000 --> 00:53:38,000 >> Ngunit gumagalaw pasulong na namin ngayon upang simulan ang pagkuha ng mas sopistikadong tungkol sa. 985 00:53:38,000 --> 00:53:42,000 Anumang oras na maglaan namin memorya mas mahusay naming kalaunan ay ipasa ang mga ito pabalik. 986 00:53:42,000 --> 00:53:45,000 Kung hindi man sa tunay na mundo sa iyong Mac o PC na maaaring mayroon ka paminsan-minsan karanasan 987 00:53:45,000 --> 00:53:50,000 sintomas kung saan ang iyong computer ay paggiling sa isang pagagil kalaunan 988 00:53:50,000 --> 00:53:54,000 o bobo Umiikot na bola beach lamang sumasakop sa computer 989 00:53:54,000 --> 00:53:56,000 buong pansin at hindi ka maaaring gumawa ng mga bagay. 990 00:53:56,000 --> 00:54:00,000 Na maaaring ipinaliwanag sa pamamagitan ng anumang bilang ng mga bug, ngunit kabilang sa mga posibleng bug 991 00:54:00,000 --> 00:54:03,000 ay mga bagay na tinatawag na memory paglabas kung saan ang isang tao na sinulat ni na piraso ng software 992 00:54:03,000 --> 00:54:07,000 na iyong ginagamit ay hindi tandaan na libreng memorya 993 00:54:07,000 --> 00:54:10,000 na siya nagtanong ang operating system para sa, 994 00:54:10,000 --> 00:54:14,000 hindi gumagamit ng GetString, dahil na CS50 bagay, ngunit ang paggamit ng mga katulad na function 995 00:54:14,000 --> 00:54:16,000 na magtanong ang operating system para sa memory. 996 00:54:16,000 --> 00:54:19,000 Kung ikaw o sila magtaas at hindi aktwal na ibalik na memory 997 00:54:19,000 --> 00:54:24,000 isang sintomas ng na maaaring na ang programa ng slows at slows at slows down na 998 00:54:24,000 --> 00:54:26,000 maliban kung tandaan mo na tumawag sa libreng. 999 00:54:26,000 --> 00:54:28,000 >> Darating kami pabalik sa kung kailan at bakit gusto mong tumawag libreng, 1000 00:54:28,000 --> 00:54:32,000 ngunit sabihin magpatuloy para sa mabuting panukala at subukang patakbuhin ang partikular na programa. 1001 00:54:32,000 --> 00:54:35,000 Ito ay tinatawag na structs1, ipasok. 1002 00:54:35,000 --> 00:54:40,000 Hayaan akong magpatuloy at patakbuhin structs1, 123, David Mather, 1003 00:54:40,000 --> 00:54:47,000 456, Rob Kirkland, 789, 1004 00:54:47,000 --> 00:54:50,000 Tommy Mather, at nakikita namin ang David sa Mather, Tommy sa Mather. 1005 00:54:50,000 --> 00:54:53,000 Ito ay lamang ng kaunti katinuan check na gumagana ang programa. 1006 00:54:53,000 --> 00:54:56,000 Ngayon, sa kasamaang-palad, ang program na ito ay isang maliit na nakakabigo sa na 1007 00:54:56,000 --> 00:55:00,000 Ko ang lahat ng mga gawa na, ako type sa 9 iba't ibang string, pindutin ang enter, 1008 00:55:00,000 --> 00:55:04,000 ay sinabi na sa Mather, gayon pa man malinaw naman alam ko na sa Mather na dahil-type ko ito. 1009 00:55:04,000 --> 00:55:07,000 Ito ay hindi bababa sa gandang kung ang programa ito ay higit pa tulad ng isang database 1010 00:55:07,000 --> 00:55:10,000 at aktwal Naaalala kung ano ang nai-type ko sa 1011 00:55:10,000 --> 00:55:12,000 kaya hindi ko muling i-input ang mga talaan ng mag-aaral na ito. 1012 00:55:12,000 --> 00:55:15,000 Siguro ito tulad ng isang registrarial system. 1013 00:55:15,000 --> 00:55:21,000 >> Maaari naming gawin ito gamit ang diskarteng na kilala bilang file I / O, file input at output, 1014 00:55:21,000 --> 00:55:24,000 generic na paraan ng sinasabi ng anumang oras na nais mo upang basahin ang mga file o sumulat ng mga file 1015 00:55:24,000 --> 00:55:26,000 maaari mong gawin ito na may isang tiyak na hanay ng mga function. 1016 00:55:26,000 --> 00:55:29,000 Hayaan akong sige at buksan ito halimbawa structs2.c, 1017 00:55:29,000 --> 00:55:33,000 na kung saan ay halos magkakahawig, ngunit sabihin makita kung ano ito ngayon. 1018 00:55:33,000 --> 00:55:36,000 Sa tuktok ng file idedeklara ko ang isang klase ng mga mag-aaral. 1019 00:55:36,000 --> 00:55:38,000 Pagkatapos ko-populate ang klase sa input ng user, 1020 00:55:38,000 --> 00:55:41,000 kaya ang mga linya ng code ay eksakto bang bago. 1021 00:55:41,000 --> 00:55:45,000 Pagkatapos kung mag-scroll down na ko dito-print ko ang lahat na sa Mather mang bang bago, 1022 00:55:45,000 --> 00:55:47,000 ngunit ito ay isang kawili-wiling bagong tampok. 1023 00:55:47,000 --> 00:55:51,000 Mga linya ng code bago, at ipakilala sila ng isang bagay dito, 1024 00:55:51,000 --> 00:55:55,000 FILE, ang lahat ng mga caps, at ito ay may * in dito pati na rin. 1025 00:55:55,000 --> 00:55:58,000 Hayaan ang ilipat sa akin ito sa paglipas dito, isang * sa paglipas dito pati na rin. 1026 00:55:58,000 --> 00:56:00,000 >> Function na ito ay hindi namin nakita bago, fopen, 1027 00:56:00,000 --> 00:56:03,000 ngunit ito ay nangangahulugan na file bukas, kaya sabihin sagap sa pamamagitan ng mga, 1028 00:56:03,000 --> 00:56:05,000 at ito ay isang bagay na makikita namin bumalik sa hinaharap psets, 1029 00:56:05,000 --> 00:56:10,000 ngunit ang line dito mahalagang ay nagbukas ng isang file na tinatawag na database, 1030 00:56:10,000 --> 00:56:13,000 at partikular na ito ay bubukas ito sa isang paraan na maaari itong gawin kung ano ito? 1031 00:56:13,000 --> 00:56:15,000 [Hindi marinig na mag-aaral] 1032 00:56:15,000 --> 00:56:19,000 Karapatan, kaya "w" lamang ay nangangahulugan na ito ay nagsasabi sa operating system 1033 00:56:19,000 --> 00:56:21,000 buksan ang file na ito sa isang paraan na maaari kong isulat dito. 1034 00:56:21,000 --> 00:56:23,000 Hindi ko nais na basahin ang mga ito. Hindi ko nais na tingnan lamang ito. 1035 00:56:23,000 --> 00:56:26,000 Gusto kong baguhin ang mga ito at magdagdag ng mga bagay-bagay potensyal nito, 1036 00:56:26,000 --> 00:56:28,000 at ang file ay pagpunta sa tinatawag na database. 1037 00:56:28,000 --> 00:56:30,000 Ma-tinatawag na kahit ano. 1038 00:56:30,000 --> 00:56:32,000 Ito ay maaaring database.txt. Ito ay maaaring. Db. 1039 00:56:32,000 --> 00:56:37,000 Maaaring ito ay isang salita tulad ng foo, ngunit pinili ko mang pangalanan ang file database. 1040 00:56:37,000 --> 00:56:42,000 Ito ay isang kaunti katinuan check na namin bumalik sa mahusay na detalye sa paglipas ng panahon, 1041 00:56:42,000 --> 00:56:47,000 kung fp, para sa file pointer, hindi katumbas null na nangangahulugang lahat na rin. 1042 00:56:47,000 --> 00:56:51,000 >> Long kuwento maikli, ang mga function tulad fopen minsan mabibigo. 1043 00:56:51,000 --> 00:56:53,000 Siguro ang file ay hindi umiiral. Siguro nasa labas ka ng disc space. 1044 00:56:53,000 --> 00:56:55,000 Siguro hindi mo pahintulot sa folder na iyon, 1045 00:56:55,000 --> 00:56:58,000 kaya kung fopen nagbabalik null isang bagay masamang nangyari. 1046 00:56:58,000 --> 00:57:02,000 Sa kabaligtaran, kung fopen ay hindi nagbabalik ng null lahat na rin 1047 00:57:02,000 --> 00:57:04,000 at ang maaari kong simulan ang pagsusulat sa file na ito. 1048 00:57:04,000 --> 00:57:06,000 Narito ang isang bagong nanlilinlang. 1049 00:57:06,000 --> 00:57:08,000 Ito ay isang para sa loop na iterating sa paglipas ng bawat ng aking mga mag-aaral, 1050 00:57:08,000 --> 00:57:10,000 at ito hitsura kaya katulad sa kung ano ang ginawa namin bago, 1051 00:57:10,000 --> 00:57:15,000 ngunit ang function na ito ay isang pinsan ng printf tinatawag fprintf para sa file printf, 1052 00:57:15,000 --> 00:57:18,000 at mapansin ang mga ito naiiba sa 2 paraan lamang. 1053 00:57:18,000 --> 00:57:20,000 Isa, nagsisimula ito sa f halip ng p, 1054 00:57:20,000 --> 00:57:23,000 ngunit pagkatapos ay ang unang argumento nito ay tila kung ano? 1055 00:57:23,000 --> 00:57:25,000 [Mag-aaral] File. >> Ito ay isang file. 1056 00:57:25,000 --> 00:57:30,000 Ito bagay na tinatawag na fp, na makikita namin kalaunan manunudyo bukod sa kung ano ang isang file pointer ay, 1057 00:57:30,000 --> 00:57:35,000 ngunit sa ngayon fp lamang kumakatawan sa file na binuksan ko, 1058 00:57:35,000 --> 00:57:41,000 fprintf dito ay sinasabi na i-print ang ID ng gumagamit na ito sa ang file, hindi sa screen. 1059 00:57:41,000 --> 00:57:44,000 I-print ang pangalan ng user sa file, hindi sa screen, 1060 00:57:44,000 --> 00:57:47,000 bahay sa file, hindi sa screen, at pagkatapos ay down na dito, malinaw naman, 1061 00:57:47,000 --> 00:57:50,000 isara ang file, at pagkatapos ay down na dito libreng ang memorya. 1062 00:57:50,000 --> 00:57:53,000 >> Ang tanging pagkakaiba sa pagitan ng ito sa bersyon 2 at bersyon 1 1063 00:57:53,000 --> 00:57:58,000 ay ang pagpapakilala ng fopen at ang FILE na ito ng * 1064 00:57:58,000 --> 00:58:01,000 at ito paniwala ng fprintf, kaya sabihin makita kung ano ang resulta. 1065 00:58:01,000 --> 00:58:03,000 Hayaan akong pumunta sa aking terminal na window. 1066 00:58:03,000 --> 00:58:06,000 Hayaan akong patakbuhin ang structs2, ipasok. 1067 00:58:06,000 --> 00:58:09,000 Mukhang lahat na rin. Natin muling palabas ng pelikula structs2. 1068 00:58:09,000 --> 00:58:15,000 123, David Mather, 456, Rob Kirkland, 1069 00:58:15,000 --> 00:58:19,000 789, Tommy Mather, ipasok. 1070 00:58:19,000 --> 00:58:23,000 Mukhang ito sumusunod sa parehong, ngunit kung gawin ko ngayon ls 1071 00:58:23,000 --> 00:58:28,000 mapansin kung ano ang file ay in dito kabilang ang lahat ng aking code, database, 1072 00:58:28,000 --> 00:58:32,000 kaya sabihin buksan na, gedit ng database, at pagtingin sa na. 1073 00:58:32,000 --> 00:58:34,000 Ito ay hindi ang sexiest ng mga format ng file. 1074 00:58:34,000 --> 00:58:38,000 Ito talaga ay isang piraso ng data na linya sa bawat linya sa bawat linya, 1075 00:58:38,000 --> 00:58:42,000 ngunit ang mga mo na gumagamit ng mga file sa Excel o CSV, comma separated values, 1076 00:58:42,000 --> 00:58:47,000 Maaaring ko tiyak na ginagamit fprintf sa halip maaaring gawin ang isang bagay tulad nito 1077 00:58:47,000 --> 00:58:50,000 sa gayon na maaari kong aktwal na lumikha ng katumbas ng isang Excel file 1078 00:58:50,000 --> 00:58:53,000 sa pamamagitan ng naghihiwalay ng mga bagay na may mga kuwit, hindi lamang mga bagong linya. 1079 00:58:53,000 --> 00:58:56,000 >> Sa kasong ito kung sa halip ko gumamit ng kuwit sa halip ng mga bagong linya 1080 00:58:56,000 --> 00:59:01,000 Maaaring literal ko mabuksan ang database file sa Excel kung sa halip ay ginawa ko ito ganito ang hitsura. 1081 00:59:01,000 --> 00:59:03,000 Sa maikli, ngayon na kami ay may kapangyarihan na magsulat sa mga file 1082 00:59:03,000 --> 00:59:07,000 Maaari namin ngayon simulan Patuloy ang data, nang pinapanatili ito sa disc 1083 00:59:07,000 --> 00:59:10,000 upang maaari naming panatilihin ang impormasyon sa paligid muli at muli. 1084 00:59:10,000 --> 00:59:14,000 Mapansin ng ilang mga iba pang mga bagay na ngayon ng kaunti pang pamilyar. 1085 00:59:14,000 --> 00:59:16,000 Sa tuktok ng file na ito C mayroon kaming typedef 1086 00:59:16,000 --> 00:59:21,000 dahil gusto naming lumikha ng isang uri ng data na kumakatawan sa isang salita, 1087 00:59:21,000 --> 00:59:25,000 kaya ang uri na ito ay tinatawag na salita, at sa loob ng istrakturang ito 1088 00:59:25,000 --> 00:59:27,000 medyo may interes ngayon. 1089 00:59:27,000 --> 00:59:30,000 Bakit ang isang salita binubuo ng tila isang array? 1090 00:59:30,000 --> 00:59:33,000 Ano ang isang salita lamang intuitively? 1091 00:59:33,000 --> 00:59:35,000 >> Ang isang hanay ng mga character. 1092 00:59:35,000 --> 00:59:37,000 Ito ay isang pagkakasunud-sunod ng mga character bumalik upang i-back upang i-back. 1093 00:59:37,000 --> 00:59:41,000 Mga titik sa lahat ng caps mangyayari na namin mang sabihin sa maximum na haba 1094 00:59:41,000 --> 00:59:44,000 ng anumang salita sa diksyunaryo na ginagamit namin para mang-uayabit. 1095 00:59:44,000 --> 00:59:46,000 Bakit ako magkaroon ng +1? 1096 00:59:46,000 --> 00:59:48,000 Ang null karakter. 1097 00:59:48,000 --> 00:59:51,000 Manariwa sa diwa kapag ginawa namin ang Bananagrams Halimbawa kinailangan naming ng isang espesyal na halaga 1098 00:59:51,000 --> 00:59:55,000 sa dulo ng salita upang subaybayan 1099 00:59:55,000 --> 00:59:59,000 kung saan aktwal na natapos ang mga salita, at ng problema detalye ng set sabi 1100 00:59:59,000 --> 01:00:03,000 dito kami ay uugnay sa isang ibinigay na salita sa isang boolean na halaga, 1101 01:00:03,000 --> 01:00:05,000 bandila, kaya na magsalita, totoo o hindi. 1102 01:00:05,000 --> 01:00:09,000 Nakita mo ang salitang ito ay, dahil Napagtanto namin 1103 01:00:09,000 --> 01:00:13,000 kailangan namin talagang isang paraan ng pag-alala hindi lamang kung ano ang isang salita sa mang-uayabit 1104 01:00:13,000 --> 01:00:15,000 ngunit mo man o hindi, ang mga tao, ay natagpuan ito 1105 01:00:15,000 --> 01:00:20,000 upang kung nahanap mo ang salitang "ng" hindi lamang mo maaaring i-type ang mga, ipasok, ang, ipasok, ang, ipasok 1106 01:00:20,000 --> 01:00:23,000 at makakuha ng 3 puntos, 3 puntos, 3 puntos, 3 puntos. 1107 01:00:23,000 --> 01:00:26,000 Nais naming sa talaang-itim na salita sa pamamagitan ng pagtatakda ng isang bool 1108 01:00:26,000 --> 01:00:29,000 sa true kung natagpuan ito, at sa gayon ay ang dahilan kung bakit namin 1109 01:00:29,000 --> 01:00:31,000 encapsulated ito sa istraktura na ito. 1110 01:00:31,000 --> 01:00:35,000 >> Ngayon, pababa dito sa mang-uayabit may ito sa iba pang struct na tinatawag na diksyunaryo. 1111 01:00:35,000 --> 01:00:39,000 Absent dito ay ang salitang typedef dahil sa kasong ito 1112 01:00:39,000 --> 01:00:43,000 kailangan namin upang encapsulate ang ideya ng isang diksyunaryo, 1113 01:00:43,000 --> 01:00:46,000 at diksyunaryo ay naglalaman ng isang buong grupo ng mga salita, 1114 01:00:46,000 --> 01:00:49,000 bilang ipinahiwatig sa pamamagitan ng array na ito, at kung gaano karaming ng mga salitang iyon ay doon? 1115 01:00:49,000 --> 01:00:51,000 Well, anumang Sinasabi ng ito variable na tinatawag na laki. 1116 01:00:51,000 --> 01:00:53,000 Ngunit kailangan lang namin ng isang diksyunaryo. 1117 01:00:53,000 --> 01:00:55,000 Hindi namin kailangan ang isang uri ng data na tinatawag diksyunaryo. 1118 01:00:55,000 --> 01:00:58,000 Kailangan lang namin ang isa sa mga ito, kaya lumiliko out sa C 1119 01:00:58,000 --> 01:01:03,000 na kung hindi mo sasabihin ng typedef, sabihin mo lang struct, pagkatapos ay sa loob ng mga kulot tirante 1120 01:01:03,000 --> 01:01:05,000 inilagay mo ang iyong mga variable, at pagkatapos ay inilagay mo ang pangalan. 1121 01:01:05,000 --> 01:01:09,000 Ito ay deklarasyon isang variable na tinatawag na diksyunaryo 1122 01:01:09,000 --> 01:01:11,000 na ganito ang hitsura. 1123 01:01:11,000 --> 01:01:16,000 Sa pamamagitan ng kaibahan, ang mga linya na ito ay lumilikha ng isang magagamit muli istraktura ng data na tinatawag na salita 1124 01:01:16,000 --> 01:01:19,000 na maaari kang lumikha ng maramihang kopya ng, tulad ng aming ginawa ang 1125 01:01:19,000 --> 01:01:22,000 maramihang mga kopya ng mga mag-aaral. 1126 01:01:22,000 --> 01:01:24,000 >> Ano ang huli-daan sa amin upang gawin? 1127 01:01:24,000 --> 01:01:30,000 Hayaan akong bumalik sa, sabihin nating, ng isang mas simpleng halimbawa mula sa simple beses, 1128 01:01:30,000 --> 01:01:34,000 at hayaan mo akong magbukas ng, sabihin nating, compare1.c. 1129 01:01:34,000 --> 01:01:38,000 Ang problema dito sa kamay sa aktwal na alisan ng balat pabalik 1130 01:01:38,000 --> 01:01:41,000 ang layer ng isang string at simulan ang pagkuha off ang mga gulong ng pagsasanay 1131 01:01:41,000 --> 01:01:44,000 dahil ito ay lumiliko na isang string lahat oras na ito 1132 01:01:44,000 --> 01:01:47,000 ay bilang aming ipinangako sa linggo 1 sa talagang lamang ng isang palayaw, 1133 01:01:47,000 --> 01:01:51,000 isang kasingkahulugan mula sa CS50 library para sa isang bagay na mukhang ng kaunti pa misteriyoso, 1134 01:01:51,000 --> 01:01:53,000 magpasinda *, at kami nakikita star na ito bago. 1135 01:01:53,000 --> 01:01:55,000 Nakita namin ito sa konteksto ng mga file. 1136 01:01:55,000 --> 01:01:59,000 >> Natin na ngayong makita kung bakit kami ay itinatago ang detalye na ito para sa ilang oras na ngayon. 1137 01:01:59,000 --> 01:02:02,000 Narito ang isang file na tinatawag na compare1.c, 1138 01:02:02,000 --> 01:02:07,000 at tila nagtatanong ng user para sa 2 string, s at t, 1139 01:02:07,000 --> 01:02:11,000 at pagkatapos sinusubukan upang ihambing ang mga string para sa pagkakapantay-pantay sa linya 26, 1140 01:02:11,000 --> 01:02:14,000 at kung sila ay pantay-pantay ang sinasabi nito, "Ikaw-type ang parehong bagay," 1141 01:02:14,000 --> 01:02:17,000 at kung sila ay hindi katumbas sinasabi nito, "Ikaw-type iba't ibang mga bagay." 1142 01:02:17,000 --> 01:02:19,000 Hayaan akong magpatuloy at patakbuhin ang program na ito. 1143 01:02:19,000 --> 01:02:23,000 Hayaan akong pumunta sa aking pinagmulan direktoryo, gumawa ng compare1. Ito inipon okay. 1144 01:02:23,000 --> 01:02:25,000 Hayaan akong magpatakbo ng compare1. 1145 01:02:25,000 --> 01:02:27,000 Kong mag-zoom in, ipasok. 1146 01:02:27,000 --> 01:02:29,000 Sabihing isang bagay. HELLO. 1147 01:02:29,000 --> 01:02:32,000 Sasabihin kong ang isang bagay muli. HELLO. 1148 01:02:32,000 --> 01:02:34,000 Tiyak ko ay hindi type iba't-ibang mga bagay. 1149 01:02:34,000 --> 01:02:37,000 >> Hayaan akong subukan ito muli. Bye bye. 1150 01:02:37,000 --> 01:02:40,000 Talagang hindi ibang, kaya kung anong nangyayari sa dito? 1151 01:02:40,000 --> 01:02:44,000 Well, kung ano ang talagang na kumpara sa linya 26? 1152 01:02:44,000 --> 01:02:46,000 [Hindi marinig na mag-aaral] 1153 01:02:46,000 --> 01:02:49,000 Oo, kaya lumiliko na ang isang string, uri ng data, uri ng isang maliit na kasinungalingan. 1154 01:02:49,000 --> 01:02:53,000 String ay isang pansamantalang trabaho *, ngunit kung ano ay isang pansamantalang trabaho *? 1155 01:02:53,000 --> 01:02:56,000 Ang isang pansamantalang trabaho *, bilang sinasabi nila, ay isang pointer, 1156 01:02:56,000 --> 01:03:00,000 at ang pointer ng epektibong ng isang address, 1157 01:03:00,000 --> 01:03:05,000 isang kabuuan ng lokasyon sa memorya, at kung mangyari mo nai-type sa isang salita tulad ng HELLO, 1158 01:03:05,000 --> 01:03:08,000 isipin ang mula sa mga nakaraang talakayan ng string 1159 01:03:08,000 --> 01:03:16,000 ito ay tulad ng salita HELLO. 1160 01:03:16,000 --> 01:03:19,000 Tandaan na maaaring katawanin ang isang salita tulad ng HELLO 1161 01:03:19,000 --> 01:03:22,000 bilang isang hanay ng mga character tulad nito 1162 01:03:22,000 --> 01:03:25,000 at pagkatapos gamit ang isang espesyal na character sa dulo tinatawag na null karakter, 1163 01:03:25,000 --> 01:03:27,000 bilang ang \ Nagpapahiwatig. 1164 01:03:27,000 --> 01:03:29,000 Ano ang aktwal na string ng? 1165 01:03:29,000 --> 01:03:32,000 Pansinin na ito ay maramihang mga chunks ng memory, 1166 01:03:32,000 --> 01:03:36,000 at sa katunayan, ang mga dulo ng lamang kilala sa sandaling tumingin ka sa pamamagitan ng ang buong string 1167 01:03:36,000 --> 01:03:38,000 naghahanap para sa mga espesyal na character null. 1168 01:03:38,000 --> 01:03:41,000 Ngunit kung ito ay isang tipak ng memorya mula sa memorya ng aking computer, 1169 01:03:41,000 --> 01:03:44,000 sabihin mang sabihin na ang string na ito Naging masuwerteng, 1170 01:03:44,000 --> 01:03:47,000 at Nakakuha ito ilagay sa pinakadulo simula ng RAM ng aking computer. 1171 01:03:47,000 --> 01:03:54,000 Ito ay byte 0, 1, 2, 3, 4, 5, 6 ... 1172 01:03:54,000 --> 01:04:02,000 >> Kapag sinabi ko ng isang bagay tulad ng GetString at gawin ko ang string s = GetString 1173 01:04:02,000 --> 01:04:04,000 kung ano talaga ang ibinalik? 1174 01:04:04,000 --> 01:04:08,000 Para sa mga nakalipas na ilang linggo, kung ano ang talagang na naka-imbak sa mga 1175 01:04:08,000 --> 01:04:13,000 hindi ang string na ito per se, ngunit sa kasong ito kung ano ang naka-imbak 1176 01:04:13,000 --> 01:04:18,000 ang numero ng 0 dahil sa kung ano ang GetString sa aktwal na ginagawa 1177 01:04:18,000 --> 01:04:20,000 ay hindi ito ay pisikal bumalik ng isang string. 1178 01:04:20,000 --> 01:04:22,000 Na hindi kahit na talagang gumawa ng haka-haka kahulugan. 1179 01:04:22,000 --> 01:04:24,000 Ano ang ginagawa nito return ay isang numero. 1180 01:04:24,000 --> 01:04:28,000 Na numero ay ang address ng HELLO sa memorya, 1181 01:04:28,000 --> 01:04:32,000 at string s pagkatapos, kung namin pamalikaskasan bumalik ang layer na ito, string ay hindi talaga umiiral. 1182 01:04:32,000 --> 01:04:35,000 Lamang ng pagpapagaan sa CS50 library. 1183 01:04:35,000 --> 01:04:38,000 >> Ito ay talagang isang bagay na tinatawag na magpasinda *. 1184 01:04:38,000 --> 01:04:41,000 Magpasinda saysay dahil kung ano ang isang salita, tulad ng HELLO? 1185 01:04:41,000 --> 01:04:44,000 Well, ito ay isang serye ng mga karakter, ang isang serye ng mga character. 1186 01:04:44,000 --> 01:04:47,000 Magpasinda * ay nangangahulugang ang address ng isang character, 1187 01:04:47,000 --> 01:04:50,000 kaya kung ano ang ibig sabihin upang bumalik ng isang string? 1188 01:04:50,000 --> 01:04:53,000 Ang isang magaling, simpleng paraan ng ibinabalik ang isang string 1189 01:04:53,000 --> 01:04:57,000 ay sa halip na subukan upang malaman kung paano ako bumalik sa 5 o 6 iba't ibang mga byte 1190 01:04:57,000 --> 01:05:01,000 hayaan mo akong bumalik sa address kung saan byte? 1191 01:05:01,000 --> 01:05:03,000 Ang unang isa. 1192 01:05:03,000 --> 01:05:06,000 Sa ibang salita, hayaan mo akong ibigay sa iyo ang address ng isang character sa memory. 1193 01:05:06,000 --> 01:05:10,000 Iyon ay kung ano ang magpasinda * ay kumakatawan, ang address ng isang solong character sa memory. 1194 01:05:10,000 --> 01:05:12,000 Tumawag na variable s. 1195 01:05:12,000 --> 01:05:15,000 Store sa mga na partikular na address, na sinabi ko mang ay 0, 1196 01:05:15,000 --> 01:05:19,000 lamang upang panatilihing simple ang mga bagay, ngunit sa katotohanan ito ay sa pangkalahatan ng mas malaking bilang. 1197 01:05:19,000 --> 01:05:21,000 >> Maghintay ng isang minuto. 1198 01:05:21,000 --> 01:05:23,000 Kung ka lamang pagbibigay sa akin ang address ng unang character, paano ko malalaman kung ano ang address 1199 01:05:23,000 --> 01:05:25,000 ng ikalawang karakter, ang ikatlong, ang ika-apat at ikalimang? 1200 01:05:25,000 --> 01:05:27,000 [Hindi marinig na mag-aaral] 1201 01:05:27,000 --> 01:05:31,000 Mo lamang malaman kung saan ang dulo ng string ay sa pamamagitan ng paraan ng ito madaling gamiting nanlilinlang, 1202 01:05:31,000 --> 01:05:35,000 kaya kapag gumamit ka ng isang bagay tulad ng printf, ano printf literal tumatagal ng bilang nito argument, 1203 01:05:35,000 --> 01:05:39,000 isipin ang na ginagamit namin placeholder na ito% s, at pagkatapos ay ka pumasa sa 1204 01:05:39,000 --> 01:05:41,000 ang variable na pag-iimbak ng isang string. 1205 01:05:41,000 --> 01:05:47,000 Ano ikaw talaga ang pagpasa ang address ng unang character ng na string. 1206 01:05:47,000 --> 01:05:50,000 Printf pagkatapos ay gumagamit ng para sa loop o habang loop sa oras ng pagtanggap ng address na iyon, 1207 01:05:50,000 --> 01:05:53,000 halimbawa, 0, kaya ipaalam sa gawin sa akin ito ngayon, 1208 01:05:53,000 --> 01:06:02,000 printf ("% s \ n"); 1209 01:06:02,000 --> 01:06:07,000 Kapag tumawag ako printf ("% s \ n" s); kung ano talaga ako nagbibigay ng printf may 1210 01:06:07,000 --> 01:06:13,000 ang address ng unang character sa mga, na sa kasong ito arbitrary H. 1211 01:06:13,000 --> 01:06:16,000 >> Paano gumagana ang printf malaman kung ano ang eksaktong upang ipakita sa screen? 1212 01:06:16,000 --> 01:06:19,000 Ang taong ipinatupad printf ipinatupad ng habang loop o para sa loop 1213 01:06:19,000 --> 01:06:23,000 na nagsasabing ang mga character na ito ay katumbas ng espesyal na character null? 1214 01:06:23,000 --> 01:06:25,000 Kung hindi, i-print ito. Paano tungkol sa isang ito? 1215 01:06:25,000 --> 01:06:28,000 Kung hindi i-print ito, i-print ito, i-print ito, i-print ito. 1216 01:06:28,000 --> 01:06:32,000 Oh, ang isang ito ay espesyal. Ihinto ang pag-print at bumalik sa gumagamit. 1217 01:06:32,000 --> 01:06:35,000 At na ang lahat ng literal na nangyayari sa ilalim ng hood, 1218 01:06:35,000 --> 01:06:38,000 at na ng maraming digest sa unang araw ng klase, 1219 01:06:38,000 --> 01:06:43,000 ngunit sa ngayon talaga ang gusali bloke ng lahat ng pang-unawa 1220 01:06:43,000 --> 01:06:46,000 na nangyayari sa loob ng memory ng aming computer, 1221 01:06:46,000 --> 01:06:49,000 at kalaunan makikita namin manunudyo ito bukod na may kaunting tulong 1222 01:06:49,000 --> 01:06:51,000 mula sa isa sa aming mga kaibigan sa Stanford. 1223 01:06:51,000 --> 01:06:56,000 >> Propesor Nick Parlante sa Stanford ay gawin ito kahanga-hangang sequence ng video 1224 01:06:56,000 --> 01:06:58,000 mula sa lahat ng mga uri ng mga iba't ibang mga wika na ipinakilala 1225 01:06:58,000 --> 01:07:00,000 ito maliit Claymation karakter Binky. 1226 01:07:00,000 --> 01:07:03,000 Ang tinig na ikaw ay tungkol sa upang marinig sa loob lamang ng ilang segundo sneak preview 1227 01:07:03,000 --> 01:07:05,000 ay ng isang Stanford propesor, at nakakakuha ka ng 1228 01:07:05,000 --> 01:07:07,000 lamang sa 5 o 6 na segundo ng karapatang ito ngayon, 1229 01:07:07,000 --> 01:07:09,000 ngunit ito ay tandaan kung saan makikita namin pagtibayin ngayon 1230 01:07:09,000 --> 01:07:11,000 at magsimula sa Miyerkules. 1231 01:07:11,000 --> 01:07:15,000 Bigyan mo ako ng pointer Kasayahan na may Binky, ang preview. 1232 01:07:15,000 --> 01:07:18,000 [♪ Music ♪] [Propesor Parlante] Hey, Binky. 1233 01:07:18,000 --> 01:07:21,000 Wake up. Oras para sa pointer masaya. 1234 01:07:21,000 --> 01:07:24,000 [Binky] Ano iyan? Alamin ang tungkol sa mga payo? 1235 01:07:24,000 --> 01:07:26,000 Oh, mabait! 1236 01:07:26,000 --> 01:07:29,000 >> Makikita natin sa Miyerkules. 1237 01:07:29,000 --> 01:07:32,000 [CS50.TV]