1 00:00:07,360 --> 00:00:09,360 [Powered by Google Translate] Natin makipag-usap tungkol sa mga array. 2 00:00:09,360 --> 00:00:12,780 Kaya bakit namin nais na gumamit ng array? 3 00:00:12,780 --> 00:00:17,210 Well sabihin nating mayroon kang isang programa na kailangan upang mag-imbak ng mga 5 ID ng mag-aaral. 4 00:00:17,210 --> 00:00:21,270 Maaaring mukhang makatwirang sa 5 hiwalay na variable. 5 00:00:21,270 --> 00:00:24,240 Para sa mga kadahilanan na namin makita sa isang bit, sisimulan namin ang pagbibilang mula 0. 6 00:00:24,240 --> 00:00:30,700 Ang mga variable na kakailanganin naming int id0, int id1, at iba pa. 7 00:00:30,700 --> 00:00:34,870 Anumang logic na gusto namin upang gumanap sa isang mag-aaral ID ay kailangang kopyahin at ilagay 8 00:00:34,870 --> 00:00:36,870 para sa bawat isa ng mga mag-aaral ID. 9 00:00:36,870 --> 00:00:39,710 Kung gusto naming upang suriin kung saan ang mga mag-aaral mangyari sa CS50, 10 00:00:39,710 --> 00:00:43,910 ipapakita muna namin ang kailangan upang suriin kung id0 kumakatawan sa mag-aaral sa kurso. 11 00:00:43,910 --> 00:00:48,070 Pagkatapos gawin ang parehong para sa susunod na mag-aaral, kakailanganin naming upang kopyahin at i-paste ang code para sa id0 12 00:00:48,070 --> 00:00:54,430 at palitan ang lahat ng mga mga pangyayari ng id0 may id1 at iba pa para sa id2, 3, at 4. 13 00:00:54,430 --> 00:00:57,560 >> Sa lalong madaling marinig mo na kailangan namin upang kopyahin at i-paste, 14 00:00:57,560 --> 00:01:00,440 dapat mong simulan ang iniisip na mayroong isang mas mahusay na solusyon. 15 00:01:00,440 --> 00:01:05,360 Ngayon kung ano ang kung Napagtanto mong hindi mo kailangan ng 5 ID mag-aaral kundi 7? 16 00:01:05,360 --> 00:01:09,570 Kailangan mo upang bumalik sa iyong source code at idagdag sa isang id5, isang id6, 17 00:01:09,570 --> 00:01:14,260 at kopyahin at i-paste ang logic para sa pagsusuri kung ang mga ID nabibilang sa klase para sa ang 2 bagong ID na. 18 00:01:14,260 --> 00:01:19,600 May ay walang pagkonekta ng lahat ng mga ID, at kaya walang paraan ng humihiling sa 19 00:01:19,600 --> 00:01:22,040 programa upang gawin ito para sa mga ID 0 hanggang 6. 20 00:01:22,040 --> 00:01:26,120 Na rin ngayon ay nauunawaan mo mayroon kang 100 ID ng mag-aaral. 21 00:01:26,120 --> 00:01:30,770 Ito ay nagsisimula sa tila mas mababa kaysa sa perpektong kailangang hiwalay ipinapahayag ang bawat isa sa mga ID, 22 00:01:30,770 --> 00:01:33,760 at kopyahin at i-paste ang anumang logic para sa mga bagong ID. 23 00:01:33,760 --> 00:01:38,380 Ngunit marahil kami ay tinutukoy, at ginagawa namin ito para sa lahat ng 100 mga mag-aaral. 24 00:01:38,380 --> 00:01:42,240 Ngunit ano kung hindi mo alam kung gaano karaming mga mag-aaral na may aktwal na mga? 25 00:01:42,240 --> 00:01:47,320 May ilan lang n mag-aaral at ang iyong programa ay upang tanungin ang user kung ano na n. 26 00:01:47,320 --> 00:01:50,250 Uh oh. Ito ay hindi gagana nang napakahusay. 27 00:01:50,250 --> 00:01:53,820 Iyong programa ay gagana lamang para sa ilang mga pare-pareho ang bilang ng mga mag-aaral. 28 00:01:53,820 --> 00:01:57,520 >> Paglutas ng lahat ng mga problemang ito ang kagandahan ng array. 29 00:01:57,520 --> 00:01:59,930 Kaya ano ang isang array? 30 00:01:59,930 --> 00:02:04,480 Sa ilang mga wika ng programming ng isang uri ng array ay maaaring gawin ng kaunti pang, 31 00:02:04,480 --> 00:02:09,960 ngunit dito makikita naming tumuon sa pangunahing istraktura ng data ng array tulad ng makikita mo ang mga ito sa C. 32 00:02:09,960 --> 00:02:14,030 Isang array ay isang malaking block ng memory. Iyan na ang lahat. 33 00:02:14,030 --> 00:02:17,770 Kapag sinabi naming kami ay may isang array ng 10 integer, na lamang nangangahulugan na mayroon kaming ilang mga bloke 34 00:02:17,770 --> 00:02:20,740 ng memorya na ay malaki sapat na upang i-hold ang 10 hiwalay na integer. 35 00:02:29,930 --> 00:02:33,410 Ipagpalagay na ang isang integer 4 bytes, nangangahulugan ito na ang isang array ng 10 integer 36 00:02:33,410 --> 00:02:37,180 ay isang tuloy-tuloy na bloke ng mga 40 bytes sa memorya. 37 00:02:42,660 --> 00:02:46,280 Kahit na gumagamit ka ng maraming interes array, kung saan hindi namin ay pumunta sa dito, 38 00:02:46,280 --> 00:02:49,200 pa ito sa isang malaking block ng memory. 39 00:02:49,200 --> 00:02:51,840 Ang maraming interes pagtatanda ay lamang ng kaginhawahan. 40 00:02:51,840 --> 00:02:55,640 Kung mayroon kang 3 ng 3 maraming interes array ng integer, 41 00:02:55,640 --> 00:03:00,650 ang iyong programa ay talagang lamang ituturing ng ito bilang isang malaking block ng 36 bytes. 42 00:03:00,650 --> 00:03:05,460 Ang kabuuang bilang ng mga integer ay 3 beses 3, at integer bawat tumatagal ng hanggang 4 bytes. 43 00:03:05,460 --> 00:03:07,750 >> Natin ng isang pagtingin sa isang pangunahing halimbawa. 44 00:03:07,750 --> 00:03:10,660 Maaari naming makita dito 2 iba't ibang mga paraan ng deklarasyon ng mga array. 45 00:03:15,660 --> 00:03:18,580 Namin magkomento ang 1 sa kanila para sa programa upang makatipon 46 00:03:18,580 --> 00:03:20,900 dahil ipinapahayag namin x nang dalawang beses. 47 00:03:20,900 --> 00:03:25,140 Padadalhan ka namin ng isang pagtingin sa ilan sa mga pagkakaiba sa pagitan ng 2 uri ng pagdeklara sa isang bit. 48 00:03:25,140 --> 00:03:28,560 Parehong ng mga linya ay magpahayag ng isang hanay ng mga laki N, 49 00:03:28,560 --> 00:03:30,740 kung saan # namin na tukuyin N bilang 10. 50 00:03:30,740 --> 00:03:34,460 Maaaring namin lamang bilang madaling ay humiling ang user para sa isang positibong integer 51 00:03:34,460 --> 00:03:37,250 at ginagamit na integer bilang isang numero ng mga elemento sa aming array. 52 00:03:37,250 --> 00:03:41,960 Gusto bago ang aming mga mag-aaral ID Halimbawa, ito ay uri ng tulad ng deklarasyon ng 10 ganap na nakahiwalay 53 00:03:41,960 --> 00:03:49,000 haka-haka variable; x0, x1, x2, at iba pa hanggang sa xN-1. 54 00:03:57,270 --> 00:04:00,840 Pagbalewala sa mga linya kung saan idedeklara namin ang array, mapansin buo ang mga square bracket 55 00:04:00,840 --> 00:04:02,090 sa loob ng para sa loop. 56 00:04:02,090 --> 00:04:09,660 Kapag namin magsulat ng isang bagay tulad ng x [3], na kung saan kukunin ko na lang basahin bilang x bracket 3, 57 00:04:09,660 --> 00:04:13,090 maaari mong isipin nito gusto pagtatanong para sa haka-haka x3. 58 00:04:13,090 --> 00:04:17,519 Pansinin kaysa sa isang hanay ng mga laki N, nangangahulugan ito na ang bilang sa loob ng mga bracket, 59 00:04:17,519 --> 00:04:22,630 kung saan kami tatawag sa index, maaaring maging anumang bagay mula 0 hanggang N-1, 60 00:04:22,630 --> 00:04:25,660 na kabuuang mga indeks ng N. 61 00:04:25,660 --> 00:04:28,260 >> Mag-isip tungkol sa kung paano ito ay aktwal na gumagana 62 00:04:28,260 --> 00:04:31,260 tandaan na ang array ay isang malaking block ng memory. 63 00:04:31,260 --> 00:04:37,460 Ipagpalagay na ang isang integer 4 bytes, ang buong array x 40 byte bloke ng memorya. 64 00:04:37,460 --> 00:04:41,360 Kaya x0 ay tumutukoy sa unang 4 bytes ng bloke. 65 00:04:45,810 --> 00:04:49,230 X [1] ay tumutukoy sa susunod na 4 bytes at iba pa. 66 00:04:49,230 --> 00:04:53,760 Nangangahulugan ito na ang simula ng x lahat sa programa na kailangan upang subaybayan ang mga. 67 00:04:55,660 --> 00:04:59,840 Kung nais mong gamitin ang x [400], at pagkatapos ay ang programa ay alam na ito ay katumbas 68 00:04:59,840 --> 00:05:03,460 sa 1,600 bytes lamang pagkatapos ng simula ng x. 69 00:05:03,460 --> 00:05:08,780 Where'd makuha namin 1,600 bytes mula sa? Ito ay 400 beses lamang 4 bytes bawat integer. 70 00:05:08,780 --> 00:05:13,170 >> Bago lumipat sa, ito ay napakahalaga upang mapagtanto na sa C 71 00:05:13,170 --> 00:05:17,080 walang pagpapatupad ng index na ginagamit namin sa array. 72 00:05:17,080 --> 00:05:23,180 Aming malaking bloke ay 10 integer lamang ang haba, ngunit walang ay sumigaw sa amin kung sumulat namin x [20] 73 00:05:23,180 --> 00:05:26,060 o kahit na x [-5]. 74 00:05:26,060 --> 00:05:28,240 Index ay hindi kahit isang numero. 75 00:05:28,240 --> 00:05:30,630 Maaari itong maging anumang arbitrary expression. 76 00:05:30,630 --> 00:05:34,800 Sa programa gamitin namin ang mga variable na i mula sa para sa loop sa index sa array. 77 00:05:34,800 --> 00:05:40,340 Ito ay isang karaniwang pattern, looping mula sa i = 0 sa haba ng array, 78 00:05:40,340 --> 00:05:43,350 at pagkatapos ay i gamit bilang ang index para sa array. 79 00:05:43,350 --> 00:05:46,160 Sa ganitong paraan epektibo ng loop sa buong array, 80 00:05:46,160 --> 00:05:50,600 at maaari mong alinman sa italaga sa bawat lugar sa array o gamitin ito para sa ilang mga kalkulasyon. 81 00:05:50,600 --> 00:05:53,920 >> Sa unang para sa loop, i nagsisimula sa 0, 82 00:05:53,920 --> 00:05:58,680 at kaya ay italaga ang 0 spot sa array, ang halaga 0 beses 2. 83 00:05:58,680 --> 00:06:04,370 Pagkatapos i palugit, at magtalaga namin ang unang puwesto sa array ang halaga ng 1 beses 2. 84 00:06:04,370 --> 00:06:10,170 Pagkatapos i palugit muli at kaya sa hanggang hanggang sa magtalaga namin upang iposisyon ang N-1 sa array 85 00:06:10,170 --> 00:06:13,370 ang halaga ng N-1 beses 2. 86 00:06:13,370 --> 00:06:17,810 Kaya lumikha kami ng isang array na may unang 10 kahit numero. 87 00:06:17,810 --> 00:06:21,970 Siguro Tabla sana ay bit mas mahusay na pangalan para sa mga variable kaysa x, 88 00:06:21,970 --> 00:06:24,760 ngunit na ibinigay bagay ang layo. 89 00:06:24,760 --> 00:06:30,210 Ang pangalawang para sa loop pagkatapos lamang ng mga Kopya ang halaga na namin ang naka-imbak sa loob ng array. 90 00:06:30,210 --> 00:06:33,600 >> Natin subukang patakbuhin ang programa sa parehong mga uri ng mga pagdeklara ng array 91 00:06:33,600 --> 00:06:36,330 at tingnan sa output ng programa. 92 00:06:51,450 --> 00:06:57,020 Bilang malayo bilang maaari naming makita, ang programa behaves sa parehong paraan para sa parehong mga uri ng pagdeklara. 93 00:06:57,020 --> 00:07:02,230 Natin ring kumuha ng isang pagtingin sa kung ano ang mangyayari kung namin baguhin ang unang loop hindi tumigil sa N 94 00:07:02,230 --> 00:07:05,040 ngunit sa halip sabihin ng 10,000. 95 00:07:05,040 --> 00:07:07,430 Paraan higit sa dulo ng array. 96 00:07:14,700 --> 00:07:17,210 Oops. Siguro nakita mo ito bago. 97 00:07:17,210 --> 00:07:20,440 Segmentation fault ay nangangahulugan Nag-crash ang iyong programa. 98 00:07:20,440 --> 00:07:24,430 Magsisimula ka nakikita ito kapag hinawakan mo ang mga lugar ng memory, hindi mo dapat pagpindot. 99 00:07:24,430 --> 00:07:27,870 Narito kami ay pagpindot sa 10,000 lugar higit sa simula ng x, 100 00:07:27,870 --> 00:07:31,920 kung saan talaga ay isang lugar sa memorya na hindi namin dapat na nakadikit. 101 00:07:31,920 --> 00:07:37,690 Kaya ang karamihan sa atin malamang na hindi sinasadyang ilagay 10,000 sa halip ng N, 102 00:07:37,690 --> 00:07:42,930 ngunit kung ano kung gagawin namin ng isang bagay na mas banayad na tulad ng sinasabi write mas mababa sa o katumbas ng N 103 00:07:42,930 --> 00:07:46,830 sa para sa kundisyon loop na iba sa mas mababa kaysa sa N. 104 00:07:46,830 --> 00:07:50,100 Tandaan lamang na ang isang array ay may mga indeks mula 0 hanggang N-1, 105 00:07:50,100 --> 00:07:54,510 na nangangahulugan na ang index N ay higit sa dulo ng array. 106 00:07:54,510 --> 00:07:58,050 Ang programa ay hindi maaaring pag-crash ng sa kasong ito, ngunit pa rin ito ng isang error. 107 00:07:58,050 --> 00:08:01,950 Sa katunayan, ang error na ito ay kaya karaniwang na ito ay may ito sariling pangalan, 108 00:08:01,950 --> 00:08:03,970 isang off ng 1 error. 109 00:08:03,970 --> 00:08:05,970 >> Iyon ay para sa mga ang mga pangunahing kaalaman. 110 00:08:05,970 --> 00:08:09,960 Kaya ano ang mga pangunahing pagkakaiba sa pagitan ng 2 uri ng mga pagdeklara ng array? 111 00:08:09,960 --> 00:08:13,960 Ang isang pagkakaiba ay kung saan napupunta ang malaking bloke ng memorya. 112 00:08:13,960 --> 00:08:17,660 Sa unang deklarasyon, na Tatawag ako ang bracket-array uri, 113 00:08:17,660 --> 00:08:20,300 bagaman ito ay hindi nangangahulugang isang maginoo pangalan, 114 00:08:20,300 --> 00:08:22,480 ito pumunta sa stack. 115 00:08:22,480 --> 00:08:27,450 Sapagkat sa pangalawang, na Tatawag ako ang pointer-array uri, ito ay pumunta sa magbunton. 116 00:08:27,450 --> 00:08:32,480 Nangangahulugan ito na kapag ang mga function na babalik, ang bracket array ay awtomatikong deallocated, 117 00:08:32,480 --> 00:08:36,419 kung saan tulad ng kailangan mong Tahasang tumawag libreng sa array pointer 118 00:08:36,419 --> 00:08:38,010 kung mayroon ka ng isang memory mahayag. 119 00:08:38,010 --> 00:08:42,750 Bukod pa rito, ang bracket array ay hindi tunay na isang variable. 120 00:08:42,750 --> 00:08:45,490 Ito ay mahalaga. Ito ay isang simbolo. 121 00:08:45,490 --> 00:08:49,160 Maaari mong isipin na ito bilang patuloy na tagatala pinili para sa iyo. 122 00:08:49,160 --> 00:08:52,970 Ito ay nangangahulugan na hindi namin maaaring gawin ang isang bagay tulad ng x + + sa mga uri ng bracket, 123 00:08:52,970 --> 00:08:56,240 kahit na ito ay perpektong bisa sa mga uri ng pointer. 124 00:08:56,240 --> 00:08:58,270 >> Ang uri ng pointer ay isang variable. 125 00:08:58,270 --> 00:09:01,510 Para sa uri ng pointer, mayroon kaming 2 hiwalay na mga bloke ng memorya. 126 00:09:01,510 --> 00:09:06,060 Ang variable na x mismo ay naka-imbak sa stack at ay lamang ng isang pointer, 127 00:09:06,060 --> 00:09:08,620 ngunit ang malaking bloke ng memorya ay naka-imbak sa magbunton. 128 00:09:08,620 --> 00:09:11,010 Nag-iimbak Ang variable na x sa stack ang address 129 00:09:11,010 --> 00:09:14,010 ng malaking bloke ng memorya sa magbunton. 130 00:09:14,010 --> 00:09:17,370 Isang implikasyon ng mga ito ay kasama ang laki ng operator. 131 00:09:17,370 --> 00:09:22,480 Kung hihilingin mo para sa laki ng array bracket, ito ay magbibigay sa iyo ang laki ng malaking bloke ng memorya, 132 00:09:22,480 --> 00:09:24,620 isang bagay tulad ng 40 bytes, 133 00:09:24,620 --> 00:09:26,920 ngunit kung hihilingin sa iyo para sa laki ng pointer uri ng array, 134 00:09:26,920 --> 00:09:32,740 ito ay magbibigay sa iyo ang laki ng variable x sarili nito, na sa appliance ay malamang may 4 bytes. 135 00:09:32,740 --> 00:09:36,530 Gamit ang pointer-array uri, ito ay imposible upang direktang humingi 136 00:09:36,530 --> 00:09:38,530 ang laki ng malaking bloke ng memorya. 137 00:09:38,530 --> 00:09:42,530 Ito ay hindi karaniwang magkano sa isang paghihigpit ng dahil napaka namin bihirang gusto ang laki 138 00:09:42,530 --> 00:09:46,980 ng malaking bloke ng memorya, at karaniwang namin makalkula ang mga ito kung kailangan namin ito. 139 00:09:46,980 --> 00:09:51,490 >> Panghuli, ang bracket array ay mangyayari upang bigyan kami ng isang shortcut para sa Sinisimulan ng isang array. 140 00:09:51,490 --> 00:09:56,130 Natin makita kung paano namin maaaring isulat ang unang 10 kahit integer gamit ang shortcut initilization. 141 00:10:11,220 --> 00:10:14,470 Gamit ang pointer array, may ay hindi isang paraan upang gawin ang isang shortcut tulad nito. 142 00:10:14,470 --> 00:10:18,120 Ito ay isang panimula sa kung ano ang maaari mong gawin sa array. 143 00:10:18,120 --> 00:10:20,990 Magpakita ang mga ito sa halos bawat programa na magsulat. 144 00:10:20,990 --> 00:10:24,390 Sana maaari mo na ngayong makita ang isang mas mahusay na paraan ng paggawa ng mag-aaral halimbawa ng mga ID 145 00:10:24,390 --> 00:10:26,710 mula sa simula ng video. 146 00:10:26,710 --> 00:10:29,960 >> Ang pangalan ko ay Rob Bowden, at ito ay CS50.