1 00:00:00,000 --> 00:00:11,200 2 00:00:11,200 --> 00:00:12,580 >> David MALAN: Ang lahat ng mga karapatan, maligayang pagdating pabalik. 3 00:00:12,580 --> 00:00:13,290 Ito ay CS50. 4 00:00:13,290 --> 00:00:15,130 Ito ang simula ng pitong linggo. 5 00:00:15,130 --> 00:00:18,890 Kaya ito Matagal na, kaya naisip ko na kami ay kumuha ng isang ipoipo tour ng kung saan namin 6 00:00:18,890 --> 00:00:20,760 tumigil at kung saan namin ngayon ng pagpunta. 7 00:00:20,760 --> 00:00:23,310 >> Kaya bagay na ito dito ay maaaring may sanhi angst ng ilan sa unang. 8 00:00:23,310 --> 00:00:27,680 Ngunit sana, ikaw ay nagsisimula sa mahirati sa klima sa kung ano ito Nagpapahiwatig dito - 9 00:00:27,680 --> 00:00:32,670 star na kumakatawan sa isang pointer, na siyang lamang kung ano, sa mga tuntunin lego pa ni? 10 00:00:32,670 --> 00:00:33,400 Kaya ito ay isang address. 11 00:00:33,400 --> 00:00:35,490 >> Kaya ito ang address ng isang bagay sa memorya. 12 00:00:35,490 --> 00:00:38,260 At nagsimula kaming mag-alis ng balat sa likod ng mga layer isang pares ng mga linggo na ang nakaraan, mga bagay na gusto 13 00:00:38,260 --> 00:00:41,800 GetString at iba pang mga pag-andar gaya lahat ng oras na ito ay nai-pagbabalik 14 00:00:41,800 --> 00:00:46,010 address ng mga bagay sa memory, tulad ng address ng unang character in 15 00:00:46,010 --> 00:00:46,990 ilang sequence. 16 00:00:46,990 --> 00:00:50,360 >> Kaya rin naming ipinakilala valgrind, na ikaw ay magsisimulang upang gamitin para sa problemang ito 17 00:00:50,360 --> 00:00:53,380 set, lalo na para sa susunod na problema set pati na rin. 18 00:00:53,380 --> 00:00:54,980 At valgrind kung ano ang ipinapakita para sa amin? 19 00:00:54,980 --> 00:00:57,520 20 00:00:57,520 --> 00:01:01,020 Ito sumusuri para sa paglabas memory, at ito din sumusuri para sa pang-aabuso ng memorya. 21 00:01:01,020 --> 00:01:05,890 >> Maaari itong, may ilang mga bagay na maaaring mangyari, kung nakakita iyong code ay pagpunta sa pindutin ang memorya 22 00:01:05,890 --> 00:01:07,100 na lang ito dapat hindi. 23 00:01:07,100 --> 00:01:10,410 Kaya hindi kinakailangang isang tumagas, ngunit kung pumunta sa ibayo ng hangganan ng ilang 24 00:01:10,410 --> 00:01:14,730 array, at ikaw talaga tumakbo valgrind at mang-upat na pag-uugali habang 25 00:01:14,730 --> 00:01:17,870 valgrind ay tumatakbo sa iyong programa ay tumatakbo sa loob nito, makakakuha ka ng 26 00:01:17,870 --> 00:01:21,460 mga mensahe tulad nito - "Di-wasto ang sumulat ng laki 4, "kung saan, isipin ang isang pares ng mga 27 00:01:21,460 --> 00:01:25,880 linggo na ang nakaraan nilalayong na ako ay nagkaroon aksidenteng gusto sa isang int masyadong malayo 28 00:01:25,880 --> 00:01:27,250 lagpas sa mga hangganan ng isang array. 29 00:01:27,250 --> 00:01:30,790 At kaya laki 4 nangangahulugan dito ang laki ng partikular na int. 30 00:01:30,790 --> 00:01:35,260 >> Kaya tumagal ng muling pagtiyak sa ang katunayan na ang valgrind ng output, ang format ng mga ito, 31 00:01:35,260 --> 00:01:36,170 lamang ang mabangis. 32 00:01:36,170 --> 00:01:40,180 Ito ay talagang mahirap upang makita sa pamamagitan ng gulo para sa mga kawili-wiling impormasyon. 33 00:01:40,180 --> 00:01:42,910 Kaya kung ano ang ginawa namin dito lamang ang sipi ang ilan sa mga pares ng mga karagdagang 34 00:01:42,910 --> 00:01:43,850 kagiliw-giliw na mga linya. 35 00:01:43,850 --> 00:01:46,760 Ngunit mapagtanto na 80% ng valgrind ni output ay pagpunta sa maging isang bit ng isang 36 00:01:46,760 --> 00:01:47,650 kaguluhan ng isip. 37 00:01:47,650 --> 00:01:52,820 >> Hanapin lamang para sa mga pattern tulad ng mga ito - Di-wasto ang karapatan, hindi wastong basahin, 40 bytes 38 00:01:52,820 --> 00:01:56,690 at ilang bilang ng mga bloke ay siguradong nawala, mga keyword tulad na. 39 00:01:56,690 --> 00:02:01,920 At kung ano ang makikita mo sana ay makita ang ilang mga uri ng trace ng kung ano ang gumana 40 00:02:01,920 --> 00:02:03,340 pagkakamali ay talagang in 41 00:02:03,340 --> 00:02:07,195 Sa kasong ito dito, sa kung ano ang linya ng ang aking code ay ang error sa malas? 42 00:02:07,195 --> 00:02:09,729 43 00:02:09,729 --> 00:02:14,130 >> 26 sa isang file na tinatawag na memory.c, na noon ay mga halimbawa kami ay naglalaro na may 44 00:02:14,130 --> 00:02:14,890 sa oras. 45 00:02:14,890 --> 00:02:16,460 Kaya marahil ito ay hindi sa malloc. 46 00:02:16,460 --> 00:02:18,630 Ito ay marahil sa aking code sa halip. 47 00:02:18,630 --> 00:02:20,910 Kaya naming makita ito muli at muli bago ang haba. 48 00:02:20,910 --> 00:02:24,080 >> Kaya scanf, ito ay dumating up sa isang pares ng mga form kaya sa ngayon. 49 00:02:24,080 --> 00:02:26,410 Nakakita kami sscanf daglian. 50 00:02:26,410 --> 00:02:28,330 Ito ay isang bagay ng isang bilang ng mga dived ka sa sa iyong 51 00:02:28,330 --> 00:02:29,535 paghahanda para sa pagsusulit. 52 00:02:29,535 --> 00:02:33,130 At scanf ay ang tunay na mga CS50 aklatan ay ginagamit sa ilalim ng 53 00:02:33,130 --> 00:02:36,560 hood para sa lubos ng ilang oras sa pagkakasunud-sunod upang makakuha ng input mula sa user. 54 00:02:36,560 --> 00:02:40,420 >> Halimbawa, kung ilipat ko sa ibabaw ng mga CS50 appliance dito, hayaan mo akong magbukas ng isang 55 00:02:40,420 --> 00:02:45,315 Halimbawa ngayon na tinatawag na scanf-0.c At ito ay napaka-simple. 56 00:02:45,315 --> 00:02:46,590 Ito ay lamang ng ilang linya ng code. 57 00:02:46,590 --> 00:02:50,880 Ngunit ito ay nagpapakita kung paano talaga getInt ay na nagtatrabaho sa lahat ng oras na ito. 58 00:02:50,880 --> 00:02:54,710 >> Sa programang ito dito, sa linya 16 , Notice na idedeklara ako sa isang int. 59 00:02:54,710 --> 00:02:57,270 Kaya walang pointer, walang nakapagtataka doon, lamang sa isang int. 60 00:02:57,270 --> 00:03:00,330 Pagkatapos, sa linya 17, ako ang prompt gumagamit para sa isang numero, mangyaring. 61 00:03:00,330 --> 00:03:02,930 Pagkatapos, sa huli 18, gagamitin ko ang scanf dito. 62 00:03:02,930 --> 00:03:06,910 At ako tinukoy, uri ng tulad ng printf, na ako umaasang quote 63 00:03:06,910 --> 00:03:08,110 magpanipi i porsiyento. 64 00:03:08,110 --> 00:03:10,920 >> Kaya porsiyento i, siyempre, Nagpapahiwatig ng isang int. 65 00:03:10,920 --> 00:03:14,580 Ngunit mapansin kung ano ang pangalawang argumento sa scanf ay. 66 00:03:14,580 --> 00:03:17,350 Paano mo ilarawan ang pangalawang argumento pagkatapos ng comma? 67 00:03:17,350 --> 00:03:19,450 Ano iyon? 68 00:03:19,450 --> 00:03:20,670 >> Ito ang address ng x. 69 00:03:20,670 --> 00:03:25,490 Kaya ito ay kapaki-pakinabang dahil sa pamamagitan ng pagbibigay scanf may address ng x, ano ang ibig 70 00:03:25,490 --> 00:03:29,560 na bigyang kapangyarihan na pagpapaandar upang gawin? 71 00:03:29,560 --> 00:03:33,010 Hindi lamang pumunta doon, ngunit din gawin kung ano? 72 00:03:33,010 --> 00:03:34,060 >> Gumawa ng isang pagbabago sa mga ito. 73 00:03:34,060 --> 00:03:38,080 Dahil maaari kang pumunta doon, ito ay isang uri ng tulad ng isang mapa sa isang lokasyon sa memorya. 74 00:03:38,080 --> 00:03:41,900 At kaya hangga't magbigay sa iyo scanf, o anumang mga function na may tulad na isang mapa, na 75 00:03:41,900 --> 00:03:45,840 function na ay maaaring pumunta doon, at hindi lamang tumingin sa ang halaga, ngunit maaari din ito 76 00:03:45,840 --> 00:03:49,670 palitan na halaga, na kung saan ay kapaki-pakinabang kung sa layunin sa buhay ng scanf ay upang 77 00:03:49,670 --> 00:03:53,060 i-scan ang input mula sa user, partikular mula sa keyboard. 78 00:03:53,060 --> 00:03:57,830 At f ang Nagpapahiwatig na-format, tulad ng printf, f ang Nagpapahiwatig ng isang format na 79 00:03:57,830 --> 00:03:58,930 string na nais mong i-print. 80 00:03:58,930 --> 00:04:04,430 >> Kaya sa maikling, ito linya 18 lang sabi, subukan na basahin sa isang int mula sa gumagamit 81 00:04:04,430 --> 00:04:10,420 keyboard at mag-imbak ito sa loob ng x, sa kahit anong address x mangyayari sa mabuhay sa. 82 00:04:10,420 --> 00:04:14,860 At pagkatapos ay bilang wakas, line 19 lang sabi, salamat para sa int, sa kasong ito. 83 00:04:14,860 --> 00:04:15,940 >> Kaya ipaalam sa akin sige at gawin ito. 84 00:04:15,940 --> 00:04:18,570 Kaya gumawa scanf 0. 85 00:04:18,570 --> 00:04:20,130 Hayaan akong sige at mag-zoom in 86 00:04:20,130 --> 00:04:22,960 Kukunin ko pumunta at patakbuhin ito sa tuldok iwa scanf 0. 87 00:04:22,960 --> 00:04:24,020 Numero, pakiusap? 88 00:04:24,020 --> 00:04:24,720 50. 89 00:04:24,720 --> 00:04:25,730 Salamat para sa 50. 90 00:04:25,730 --> 00:04:27,270 Kaya ito ay medyo simple. 91 00:04:27,270 --> 00:04:28,160 >> Ngayon kung ano ang hindi ito ginagawa? 92 00:04:28,160 --> 00:04:29,940 Hindi ito ginagawa ng isang buong buwig ng error checking. 93 00:04:29,940 --> 00:04:33,000 Halimbawa, kung hindi ako makikipagtulungan, at hindi ko type sa isang numero, ngunit 94 00:04:33,000 --> 00:04:37,860 sa halip akong magsulat ng isang bagay tulad ng "kumusta," ito lamang ay uri ng kakaiba. 95 00:04:37,860 --> 00:04:41,130 At kaya ang isa sa mga bagay na ang CS50 library ay ginagawa para sa amin para sa ilang mga 96 00:04:41,130 --> 00:04:43,440 ang tagal na reprompting at reprompting. 97 00:04:43,440 --> 00:04:49,320 >> Ang retry isipin ang parirala ay nasa cs50.c, at iyon ang dahilan na getInt sa 98 00:04:49,320 --> 00:04:51,670 ang CS50 library ay talagang isang buong tungkos ng mga linya ang haba, dahil kami 99 00:04:51,670 --> 00:04:53,190 naghahanap ng mga bagay-bagay bobo na katulad nito. 100 00:04:53,190 --> 00:04:55,730 Ang ibig user ang hindi nagbibigay sa sa amin, sa katunayan, isang int? 101 00:04:55,730 --> 00:04:57,910 Ang ibig niya bigyan kami ng isang bagay tulad ng isang alpabetikong letra? 102 00:04:57,910 --> 00:05:01,410 Kung gayon, nais naming detect na at sumigaw sa kanila. 103 00:05:01,410 --> 00:05:03,915 >> Ngunit ang mga bagay na makakuha ng mas maraming mga kagiliw-giliw sa susunod na halimbawa. 104 00:05:03,915 --> 00:05:09,840 Kung pumunta ako sa scanf-1.c, ano ang isa bagay na nagbago sa panimula sa 105 00:05:09,840 --> 00:05:11,135 ito susunod na halimbawa? 106 00:05:11,135 --> 00:05:13,690 107 00:05:13,690 --> 00:05:16,010 Gumagamit ako ng pansamantalang trabaho *, siyempre, sa halip ng int. 108 00:05:16,010 --> 00:05:19,210 >> Kaya ito ay kagiliw-giliw na, dahil pansamantalang trabaho *, pagkuhang muli, ay talagang lamang ang 109 00:05:19,210 --> 00:05:20,190 parehong bagay bilang string. 110 00:05:20,190 --> 00:05:23,840 Kaya ito nararamdaman tulad marahil ito ay isang napakabilis simpleng pagpapatupad ng GetString. 111 00:05:23,840 --> 00:05:26,010 Ngunit ko na peeled likod ng layer ng CS50 library, kaya ako 112 00:05:26,010 --> 00:05:27,550 pagtawag na ito pansamantalang trabaho * ngayon. 113 00:05:27,550 --> 00:05:30,070 Kaya natin makita kung saan, kung saanman, pumunta kami mali. 114 00:05:30,070 --> 00:05:30,840 >> Line 17 - 115 00:05:30,840 --> 00:05:33,950 Kong muli sabihin, mangyaring akong bigyan ng isang bagay, sa kasong ito, ang isang string. 116 00:05:33,950 --> 00:05:37,940 At pagkatapos ay sa susunod na linya, tumawag ako scanf, muli, na nagbibigay ito ng isang format ng code, 117 00:05:37,940 --> 00:05:39,310 subalit oras na ito s porsiyento. 118 00:05:39,310 --> 00:05:41,900 At pagkatapos ng oras na ito, ako nagbibigay ito buffer. 119 00:05:41,900 --> 00:05:43,550 >> Ngayon mapansin, hindi ko ginagamit ang ampersand. 120 00:05:43,550 --> 00:05:47,120 Ngunit kung bakit ay marahil na OK dito? 121 00:05:47,120 --> 00:05:49,760 Dahil kung ano ang buffer pa? 122 00:05:49,760 --> 00:05:50,770 Ito ay mayroon ng isang pointer. 123 00:05:50,770 --> 00:05:51,650 Ito ay mayroon ng isang address. 124 00:05:51,650 --> 00:05:54,510 >> At sabihin ang salitang ito "lituhin," ipaalam sa akin tumawag lamang ito s, halimbawa, para sa 125 00:05:54,510 --> 00:05:55,050 pagiging simple. 126 00:05:55,050 --> 00:05:58,250 Ngunit ko na tinatawag na ito buffer dahil sa pangkalahatan, sa programming, kung mayroon kang isang 127 00:05:58,250 --> 00:06:02,130 tipak ng memorya, na isang string talaga lamang ay, maaari mong tawagan ito ng buffer. 128 00:06:02,130 --> 00:06:04,460 Ito ay isang lugar upang mag-imbak ng impormasyon. 129 00:06:04,460 --> 00:06:07,400 >> Katulad ng mga bagay tulad ng YouTube, kapag sila buffering, kaya na magsalita, na 130 00:06:07,400 --> 00:06:10,270 Nangangahulugan lamang ito ay pag-download ng mga piraso mula sa sa internet at pag-iimbak ng mga ito sa isang 131 00:06:10,270 --> 00:06:14,160 lokal na array, isang lokal na tipak ng memory kaya na mapapanood mo ito sa ibang pagkakataon nang 132 00:06:14,160 --> 00:06:16,830 ito laktaw o nagha-hang sa ka habang nagpe-play muli. 133 00:06:16,830 --> 00:06:20,930 >> Kaya mayroong isang problema dito kahit na, dahil ako na nagsasabi sa scanf, asahan ang 134 00:06:20,930 --> 00:06:22,320 string mula sa user. 135 00:06:22,320 --> 00:06:24,410 Narito ang address ng isang tipak ng memory. 136 00:06:24,410 --> 00:06:26,180 Ilagay ang string na doon. 137 00:06:26,180 --> 00:06:31,230 Bakit bound na bigyan amin problema, bagaman? 138 00:06:31,230 --> 00:06:33,490 >> Ano iyan? 139 00:06:33,490 --> 00:06:35,510 Pinapayagan ba akong i-access na bahagi ng memorya? 140 00:06:35,510 --> 00:06:36,250 Alam mo, hindi ko alam. 141 00:06:36,250 --> 00:06:39,210 Dahil si buffer na-initialize sa anumang bagay? 142 00:06:39,210 --> 00:06:39,820 Hindi talaga. 143 00:06:39,820 --> 00:06:43,090 At kaya kung ano ang aming na-pagtawag isang basura halaga, na 144 00:06:43,090 --> 00:06:44,040 ay hindi isang pormal na salita. 145 00:06:44,040 --> 00:06:49,200 Ito lamang ay nangangahulugan na wala kaming ideya kung ano ang mga piraso ay sa loob ng apat na bytes 146 00:06:49,200 --> 00:06:51,240 Ko na inilaan bilang buffer. 147 00:06:51,240 --> 00:06:52,450 >> Hindi ko pa na tinatawag malloc. 148 00:06:52,450 --> 00:06:53,940 Tiyak ko na hindi tinatawag GetString. 149 00:06:53,940 --> 00:06:56,380 Kaya kung sino ang nakakaalam kung ano ang aktwal na sa loob ng buffer? 150 00:06:56,380 --> 00:07:00,550 At sinasabi pa scanf nang walang taros, pumunta doon at inilagay ang anumang mga user na-type. 151 00:07:00,550 --> 00:07:04,460 >> Kaya kung ano ay malamang na maging sanhi ng sa aming mga code kung namin patakbuhin ito? 152 00:07:04,460 --> 00:07:05,700 Malamang isang segfault. 153 00:07:05,700 --> 00:07:07,970 Siguro hindi, ngunit marahil isang segfault. 154 00:07:07,970 --> 00:07:10,620 At sinasabi ko siguro dahil hindi minsan gawin mo, paminsan-minsan 155 00:07:10,620 --> 00:07:11,380 hindi mo makakuha ng isang segfault. 156 00:07:11,380 --> 00:07:14,280 Minsan mo lang makakuha ng masuwerteng, ngunit gayunman ito ay pagpunta sa maging 157 00:07:14,280 --> 00:07:15,340 isang bug sa aming programa. 158 00:07:15,340 --> 00:07:17,060 >> Kaya ipaalam sa akin sige at sumulat ng libro na ito. 159 00:07:17,060 --> 00:07:18,280 Pupunta ako sa gawin ito sa lumang paraan ng paaralan. 160 00:07:18,280 --> 00:07:23,825 Kaya kalatungin gitling 0, scanf-1, scanf-1.c, ang Enter. 161 00:07:23,825 --> 00:07:24,720 Oops, masyadong luma paaralan. 162 00:07:24,720 --> 00:07:26,550 Tayo'y makita. 163 00:07:26,550 --> 00:07:28,440 Saan ako pupunta? 164 00:07:28,440 --> 00:07:29,700 Oh, pansamantalang trabaho * buffer. 165 00:07:29,700 --> 00:07:33,595 166 00:07:33,595 --> 00:07:35,130 Oh, salamat sa iyo - 167 00:07:35,130 --> 00:07:36,930 I-save, OK - 168 00:07:36,930 --> 00:07:37,690 napaka old school. 169 00:07:37,690 --> 00:07:38,900 Ang lahat ng mga karapatan, ito Matagal na. 170 00:07:38,900 --> 00:07:41,720 >> Kaya lang ako nai-save ang file pagkatapos ng paggawa na pansamantalang 171 00:07:41,720 --> 00:07:42,700 baguhin ng ilang sandali ang nakalipas. 172 00:07:42,700 --> 00:07:46,090 At ngayon ko pa inipon ito manu-manong na may kalatungin. 173 00:07:46,090 --> 00:07:49,500 At ngayon pupuntahan ko sige at magpatakbo ng scanf-1, ang Enter. 174 00:07:49,500 --> 00:07:50,290 String mangyaring. 175 00:07:50,290 --> 00:07:51,600 Kukunin ko i-type sa "kumusta." 176 00:07:51,600 --> 00:07:54,070 >> At ngayon, narito kung saan, lantaran, printf Maaari ay isang maliit na nakakainis. 177 00:07:54,070 --> 00:07:56,020 Hindi ito aktwal na pagpunta sa segfault sa kasong ito. 178 00:07:56,020 --> 00:07:59,860 Printf ay isang maliit na espesyal dahil ito kaya super karaniwang ginagamit na 179 00:07:59,860 --> 00:08:03,570 mahalagang printf ay ginagawa amin ng isang pabor at napagtatanto, 180 00:08:03,570 --> 00:08:04,830 hindi iyon isang wastong pointer. 181 00:08:04,830 --> 00:08:09,080 Hayaan akong dalhin ito sa sarili ko lang i-print out sa mga panaklong null, kahit 182 00:08:09,080 --> 00:08:13,340 bagaman ito ay hindi kinakailangan kung ano namin ang aming sarili sa inaasahan. 183 00:08:13,340 --> 00:08:16,940 >> Kaya hindi namin maaaring talagang madali magbuod isang segfault may ito, ngunit malinaw na ito 184 00:08:16,940 --> 00:08:18,600 ay hindi ang pag-uugali Nais kong. 185 00:08:18,600 --> 00:08:19,800 Kaya kung ano ang mga simpleng solusyon? 186 00:08:19,800 --> 00:08:25,650 Well, sa scanf-2, hayaan mo akong magpanukala na sa halip ng mga aktwal na lamang paglaan ng isang 187 00:08:25,650 --> 00:08:30,100 pansamantalang trabaho *, hayaan mo akong maging isang maliit na mas matalinong tungkol sa ito, at ipaalam sa akin magtalaga ng buffer 188 00:08:30,100 --> 00:08:32,940 bilang isang pagkakasunod-sunod ng 16 karakter. 189 00:08:32,940 --> 00:08:34,200 >> Kaya ang maaari kong gawin ito sa ilang mga paraan. 190 00:08:34,200 --> 00:08:35,610 Maaari ko talagang gamitin ang malloc. 191 00:08:35,610 --> 00:08:38,980 Ngunit maaari ba akong bumalik sa dalawang linggo kapag Ko lang kailangan ang maramihang mga 192 00:08:38,980 --> 00:08:39,620 character. 193 00:08:39,620 --> 00:08:40,860 Ito lamang ay isang array. 194 00:08:40,860 --> 00:08:44,870 Kaya ipaalam sa akin sa halip muling tukuyin buffer upang maging isang array ng 16 mga character. 195 00:08:44,870 --> 00:08:47,340 >> At ngayon, kapag pumasa ako sa buffer - 196 00:08:47,340 --> 00:08:49,940 at ito ay isang bagay na ginawa namin hindi makipag-usap tungkol sa dalawang linggo - 197 00:08:49,940 --> 00:08:53,730 ngunit maaari mong ituring ang isang array bilang bagaman ito ay isang address. 198 00:08:53,730 --> 00:08:56,390 Technically, bilang nasaksihan namin, ang mga ito ay Medyo naiiba. 199 00:08:56,390 --> 00:09:01,290 Ngunit scanf hindi tututol kung pumasa ka ito ang pangalan ng isang array, dahil kung ano 200 00:09:01,290 --> 00:09:05,030 Kalatungin ay gagawin para sa atin ay mahalagang tratuhin ang mga pangalan ng array na bilang 201 00:09:05,030 --> 00:09:08,280 address ng tipak ng 16 bytes. 202 00:09:08,280 --> 00:09:09,550 >> Kaya ito ay mas mahusay. 203 00:09:09,550 --> 00:09:12,110 Ito ay nangangahulugan na ngayon maaari ko sana gawin ang mga sumusunod. 204 00:09:12,110 --> 00:09:16,800 Hayaan akong mag-zoom out para sa isang sandali at gawin gumawa scanf-2, pinagsama-sama ang OK. 205 00:09:16,800 --> 00:09:19,390 Ngayon ipaalam sa akin huwag Nakakuha slash scanf-2. 206 00:09:19,390 --> 00:09:22,430 String mangyaring. "Hello." At ito tila gumagana oras na ito. 207 00:09:22,430 --> 00:09:26,020 >> Ngunit maaari isang tao ipanukala ang isang sitwasyong kung saan hindi pa rin ito maaaring gumana? 208 00:09:26,020 --> 00:09:28,550 Oo? 209 00:09:28,550 --> 00:09:30,640 Isang bagay na mas mahaba sa 16 character. 210 00:09:30,640 --> 00:09:32,020 At talagang, maaari naming maging medyo mas tumpak. 211 00:09:32,020 --> 00:09:36,540 Isang bagay na mas mahaba sa 15 character, dahil ba talagang kailangan namin upang panatilihin sa isip 212 00:09:36,540 --> 00:09:39,920 na kailangan namin na backslash zero nang kataon lamang sa dulo ng string, 213 00:09:39,920 --> 00:09:42,950 na kung saan ay isang bukod scanf kalooban karaniwan alagaan para sa amin. 214 00:09:42,950 --> 00:09:46,210 >> Kaya ipaalam sa akin gawin ang isang bagay tulad ng - 215 00:09:46,210 --> 00:09:48,040 minsan lang namin makakaya iwanan ito tulad na. 216 00:09:48,040 --> 00:09:50,630 OK, kaya na namin ngayon ang sapilitan ang aming segmentation fault. 217 00:09:50,630 --> 00:09:51,000 Bakit? 218 00:09:51,000 --> 00:09:54,940 Dahil ako nai-type sa higit sa 15 mga character, at kaya na namin talaga 219 00:09:54,940 --> 00:09:58,280 hinawakan memory na ako talaga hindi dapat magkaroon. 220 00:09:58,280 --> 00:10:00,180 >> Kaya kung ano talaga ang solusyon dito? 221 00:10:00,180 --> 00:10:02,210 Well, kung ano kung kailangan namin ng mas mahabang string? 222 00:10:02,210 --> 00:10:03,960 Well, siguro namin gawin itong 32 bytes. 223 00:10:03,960 --> 00:10:05,160 Well, paano kung hindi iyon sapat ang haba? 224 00:10:05,160 --> 00:10:06,040 Paano ang tungkol sa 64 bytes? 225 00:10:06,040 --> 00:10:07,080 Paano kung hindi iyon sapat ang haba? 226 00:10:07,080 --> 00:10:09,640 Paano ang tungkol sa 128 o 200 bytes? 227 00:10:09,640 --> 00:10:12,660 Ano ba talagang ay ang solusyon dito sa pangkalahatang mga kaso, kung hindi namin alam sa 228 00:10:12,660 --> 00:10:14,460 advance kung ano ang user pupuntahan type? 229 00:10:14,460 --> 00:10:20,000 230 00:10:20,000 --> 00:10:23,050 >> Ito ay lamang uri ng isang malaking sakit sa puwit, upang maging matapat, na kung saan ay kung bakit ang 231 00:10:23,050 --> 00:10:29,050 CS50 library ay may ilang mga linya dosenang code na sama-sama ipatupad 232 00:10:29,050 --> 00:10:32,390 GetString string sa isang paraan na ginagawa namin hindi kailangang alam nang maaga kung ano ang 233 00:10:32,390 --> 00:10:33,430 user ay pagpunta sa i-type. 234 00:10:33,430 --> 00:10:37,370 Sa partikular, kung tumingin ka pabalik sa cs50.c mula sa dalawang linggo ang nakalipas, makikita mo ang 235 00:10:37,370 --> 00:10:40,480 GetString na talagang gumagana hindi gumamit scanf sa ganitong paraan. 236 00:10:40,480 --> 00:10:43,720 Sa halip, ito bumabasa ng isang character sa isang pagkakataon. 237 00:10:43,720 --> 00:10:46,010 >> Dahil ang isang magaling na bagay tungkol sa pagbabasa sa isang character ay aming makakaya 238 00:10:46,010 --> 00:10:48,490 ginagarantiya ng ating sarili na laging may hindi bababa sa isang pansamantalang trabaho. 239 00:10:48,490 --> 00:10:51,740 Maaari ko lang magpahayag ng isang pansamantalang trabaho, at pagkatapos gumawa mga tunay na sanggol hakbang na ito upang lamang 240 00:10:51,740 --> 00:10:54,380 basahin ang isang character sa sa isang oras mula sa keyboard. 241 00:10:54,380 --> 00:10:58,240 At pagkatapos ay, kung ano ang makikita mo ang GetString ibig ay sa tuwing ito ay naubusan ng, 242 00:10:58,240 --> 00:11:02,280 sabihin nating, 16 byte ng memorya, ginagamit nito malloc, o isang pinsan hinggil dito, upang 243 00:11:02,280 --> 00:11:06,810 magtalaga ng higit pang memory, pagkopya sa lumang memory papunta sa bago, at pagkatapos ay pag-crawl 244 00:11:06,810 --> 00:11:09,900 kasama, sa pagkuha ng isang character sa isang pagkakataon, at kapag ito ay naubusan ng na 245 00:11:09,900 --> 00:11:13,370 tipak ng memory, throws ito ang layo, grabs isang mas malaking tipak ng memory, kinokopya lumang 246 00:11:13,370 --> 00:11:14,750 sa bago, at umuulit. 247 00:11:14,750 --> 00:11:18,480 At ito ay tunay na isang sakit na talaga ipatupad ang isang bagay na simple bilang 248 00:11:18,480 --> 00:11:19,710 pagkuha ng input mula sa isang user. 249 00:11:19,710 --> 00:11:21,090 >> Kaya maaari mong gamitin ang scanf. 250 00:11:21,090 --> 00:11:22,430 Maaari mong gamitin ang iba pang mga katulad na pag-andar. 251 00:11:22,430 --> 00:11:25,420 At may maraming mga aklat-aralin at mga online na halimbawa gawin, ngunit ang mga ito ay ang lahat ng 252 00:11:25,420 --> 00:11:27,210 mahina laban sa mga problema tulad nito. 253 00:11:27,210 --> 00:11:29,550 At sa huli, nagsisimula ng segfault ay uri ng nakakainis. 254 00:11:29,550 --> 00:11:30,680 Ito ay hindi mabuti para sa mga gumagamit. 255 00:11:30,680 --> 00:11:33,560 >> Ngunit sa pinakamasama kaso, kung ano ang ibig ito sa panimula ilagay ang iyong mga 256 00:11:33,560 --> 00:11:37,160 code nanganganib na? 257 00:11:37,160 --> 00:11:39,250 Ang ilang mga uri ng pag-atake, potensyal na. 258 00:11:39,250 --> 00:11:41,680 Usapan natin ang tungkol sa isa tulad atake - umaapaw ng stack. 259 00:11:41,680 --> 00:11:44,660 Ngunit sa pangkalahatan, kung ikaw ay papayagang apaw buffer ng, tulad ng ginawa namin isang 260 00:11:44,660 --> 00:11:48,070 dalawang linggo ang nakalipas, sa pamamagitan lamang ng pagsusulat higit sa "halo" sa stack, mo 261 00:11:48,070 --> 00:11:52,330 Maaari katunayan pumalit, potensyal, isang computer, o hindi bababa sa makakuha ng mga data na 262 00:11:52,330 --> 00:11:53,510 ay hindi nabibilang sa iyo. 263 00:11:53,510 --> 00:11:55,970 >> Kaya sa maikling salita, ito ang dahilan kung bakit mayroon kaming mga pagsasanay wheels. 264 00:11:55,970 --> 00:11:59,090 Ngunit ngayon, magsisimula kami upang gumawa ng mga ito off, bilang aming mga programa sa hindi na kailangan, 265 00:11:59,090 --> 00:12:00,610 kinakailangan, input mula sa user. 266 00:12:00,610 --> 00:12:03,960 Ngunit sa kaso ng mga problema itakda anim, iyong input ay darating mula sa isang malaking 267 00:12:03,960 --> 00:12:07,520 diksyunaryo file na may ilang 150 kakaiba libong mga salita. 268 00:12:07,520 --> 00:12:10,330 >> Kaya hindi mo na kailangang mag-alala tungkol sa di-makatwirang pag-input ng user. 269 00:12:10,330 --> 00:12:13,720 Kami ay magbibigay sa iyo ng ilang mga pagpapalagay tungkol sa file na iyon. 270 00:12:13,720 --> 00:12:20,340 Ang anumang mga katanungan sa payo o scanf o input ng user sa pangkalahatan? 271 00:12:20,340 --> 00:12:24,450 >> Ang lahat ng mga karapatan, sa gayon ang isang mabilis na pagtingin pagkatapos sa isa trailing topic mula sa dalawang linggo na ang nakaraan. 272 00:12:24,450 --> 00:12:28,590 At iyon ay ang pagkaunawa ng isang struct. 273 00:12:28,590 --> 00:12:34,180 Hindi na - ito paniwala ng isang struct, na noon ay kung ano? 274 00:12:34,180 --> 00:12:35,430 Ano ang sinabi struct gawin para sa amin? 275 00:12:35,430 --> 00:12:39,280 276 00:12:39,280 --> 00:12:39,860 >> Tukuyin - 277 00:12:39,860 --> 00:12:41,710 paumanhin? 278 00:12:41,710 --> 00:12:42,820 Tukuyin ang isang variable na uri. 279 00:12:42,820 --> 00:12:44,410 Kaya-uri-uriin ng. 280 00:12:44,410 --> 00:12:46,180 Talaga kami ng pagsasama-sama ng dalawang mga paksa. 281 00:12:46,180 --> 00:12:49,510 Kaya may typedef, isipin ang na aming makakaya magpahayag ng isang uri ng ating sariling, tulad ng isang 282 00:12:49,510 --> 00:12:51,500 kasingkahulugan, tulad ng string para sa pansamantalang trabaho *. 283 00:12:51,500 --> 00:12:56,200 Ngunit gamit ang typedef at struct, aming makakaya lumikha ng tunay ang aming sariling mga istraktura ng data. 284 00:12:56,200 --> 00:12:59,600 >> Halimbawa, kung pumunta ako pabalik sa gedit dito para sa sandali lamang, at pumunta ako nang maaga 285 00:12:59,600 --> 00:13:08,230 at gawin ang isang bagay tulad ng, hayaan mo akong i-save ang ito bilang, sabihin nating, structs.c 286 00:13:08,230 --> 00:13:10,840 pansamantala, lang ako pupunta upang sige at isama 287 00:13:10,840 --> 00:13:14,360 standardio.h, int pangunahing walang bisa. 288 00:13:14,360 --> 00:13:18,960 At pagkatapos ay i-in dito, ipagpalagay na nais ko magsulat ng isang programa na nag-iimbak 289 00:13:18,960 --> 00:13:21,840 maraming mga mag-aaral mula sa maraming bahay, halimbawa. 290 00:13:21,840 --> 00:13:24,430 Kaya ito ay tulad ng isang registrarial database ng ilang mga pag-uuri. 291 00:13:24,430 --> 00:13:29,550 >> Kaya kung kailangan ko ang pangalan ng isa mag-aaral, ko maaaring gawin ang isang bagay tulad ng pansamantalang trabaho * pangalan, 292 00:13:29,550 --> 00:13:31,570 at kailangan kong gawin ang isang bagay tulad ng - 293 00:13:31,570 --> 00:13:34,410 talaga, gamitin natin ang CS50 library para lamang ng ilang sandali upang gawin ang isang 294 00:13:34,410 --> 00:13:38,380 medyo simple, upang maaari naming humiram mga dose-dosenang mga linya ng code. 295 00:13:38,380 --> 00:13:39,340 At sabihin lamang panatilihin itong simple. 296 00:13:39,340 --> 00:13:42,610 Susubukan naming panatilihin itong string, at ngayon GetString. 297 00:13:42,610 --> 00:13:47,420 >> Kaya inaangkin ko na ngayon ko na naka-imbak sa pangalan ng ilang mga mag-aaral, at ang bahay ng 298 00:13:47,420 --> 00:13:50,240 ilang mag-aaral, simpleng paggamit variable tulad ng ginawa namin at sa linggo isa. 299 00:13:50,240 --> 00:13:52,370 Ngunit ipagpalagay ko ngayon ay nais upang suportahan ang maraming mag-aaral. 300 00:13:52,370 --> 00:13:58,460 Ang lahat ng mga karapatan, sa gayon ang aking mga instincts ay upang gawin string NAME2, nakakakuha GetString, string 301 00:13:58,460 --> 00:14:01,370 house2 nakakakuha GetString. 302 00:14:01,370 --> 00:14:05,850 At pagkatapos ay ang aming third-aaral, sabihin gawin NAME3 GetString. 303 00:14:05,850 --> 00:14:09,170 >> Ang lahat ng mga karapatan, kaya ito ay kitang-kita na sana iyo bilang uri ng bobo, 304 00:14:09,170 --> 00:14:11,580 dahil ang prosesong ito ay talagang hindi kailanman pagpunta sa magtapos, at lamang ito ng pagpunta sa 305 00:14:11,580 --> 00:14:13,130 mapapalitaw ang aking mga code hitsura mas masahol pa at mas masahol at mas masahol pa. 306 00:14:13,130 --> 00:14:14,810 Ngunit kami malulutas ito masyadong sa dalawang linggo. 307 00:14:14,810 --> 00:14:19,450 Ano ang aming mga relatibong malinis na solusyon kapag nagkaroon kami ng maraming mga variable ng 308 00:14:19,450 --> 00:14:23,580 parehong uri ng data na may kaugnayan sa lahat, ngunit hindi namin ginawa gusto ito mabangis gulo 309 00:14:23,580 --> 00:14:26,870 katulad ng mga variable na may pangalang? 310 00:14:26,870 --> 00:14:30,060 Ano ang ginagawa namin sa halip? 311 00:14:30,060 --> 00:14:31,260 >> Kaya sa tingin ko Narinig ko ang ilang mga lugar. 312 00:14:31,260 --> 00:14:32,590 Nagkaroon kami ng isang array. 313 00:14:32,590 --> 00:14:37,110 Kung nais mong maramihang mga kaso ng isang bagay, bakit hindi namin linisin ang lahat 314 00:14:37,110 --> 00:14:39,540 up lang at sabihin, magbigay sa akin array na tinatawag na mga pangalan? 315 00:14:39,540 --> 00:14:41,640 >> At sa ngayon, sabihin na hard code 3. 316 00:14:41,640 --> 00:14:44,450 At pagkatapos ay bigyan ako ng isa pang array na tinatawag na mga bahay, at ipaalam sa akin para 317 00:14:44,450 --> 00:14:45,800 ngayon mahirap code 3. 318 00:14:45,800 --> 00:14:49,220 At massively ko na nalinis up ang Nagkamali na ko lang ginawa. 319 00:14:49,220 --> 00:14:52,400 Ngayon, pa rin ako ng hard code 3, ngunit kahit 3 mga dynamic na maaaring nanggaling mula sa 320 00:14:52,400 --> 00:14:54,350 gumagamit, o argv, o mga katulad. 321 00:14:54,350 --> 00:14:55,720 Kaya ito ay mas malinis. 322 00:14:55,720 --> 00:15:00,100 >> Ngunit kung ano ang tungkol sa mga nakakainis na ito ay na ngayon, kahit na isang pangalan ay sa paanuman 323 00:15:00,100 --> 00:15:02,280 sa panimula naka-link sa bahay ng mag-aaral - 324 00:15:02,280 --> 00:15:04,720 ito ay isang mag-aaral na ko talaga nais upang kumatawan - 325 00:15:04,720 --> 00:15:08,080 Ako ay mayroon na ngayong dalawang array na parallel sa kamalayan na ang mga ito ay 326 00:15:08,080 --> 00:15:13,930 parehong sukat, at mga pangalan ng bracket 0 siguro mga mapa sa bahay bracket 0, 327 00:15:13,930 --> 00:15:16,600 at mga pangalan ng bracket 1 mapa sa bahay bracket 1. 328 00:15:16,600 --> 00:15:19,280 Sa madaling salita, mag-aaral na ang mga buhay sa na bahay, at na ang ibang mag-aaral 329 00:15:19,280 --> 00:15:20,530 sa buhay na ang ibang bahay. 330 00:15:20,530 --> 00:15:23,720 Ngunit tiyak na ito ay maaaring maging mga tapos kahit na higit pa nang malinis. 331 00:15:23,720 --> 00:15:24,990 >> Well, kaya nito, sa katunayan. 332 00:15:24,990 --> 00:15:28,730 At ipaalam sa akin sige at buksan up structs.h, at bibigyan ka 333 00:15:28,730 --> 00:15:31,130 tingnan ang ideya dito. 334 00:15:31,130 --> 00:15:34,905 Pansinin na na nagamit ko typedef, bilang ka alluded sa isang sandali ang nakalipas na idedeklara ang aming 335 00:15:34,905 --> 00:15:35,570 sariling data uri. 336 00:15:35,570 --> 00:15:39,660 Ngunit din ako gamit ang ibang mga keyword tinatawag struct kung saan ay nagbibigay sa akin ng isang bagong 337 00:15:39,660 --> 00:15:40,790 istraktura ng data. 338 00:15:40,790 --> 00:15:43,980 >> At ang data na istraktura inaangkin ko ay pagpunta upang magkaroon ng dalawang mga bagay sa loob ng 339 00:15:43,980 --> 00:15:47,060 ito - isang string na tinatawag na pangalan, at isang string na tinatawag na bahay. 340 00:15:47,060 --> 00:15:49,820 At ang pangalan ng pupuntahan ko ibigay sa ang data na istraktura ay pagpunta 341 00:15:49,820 --> 00:15:51,005 na tinatawag na mag-aaral. 342 00:15:51,005 --> 00:15:54,030 Kaya kong tumawag ito anumang nais ko, ngunit ito magkakahulugang gumawa 343 00:15:54,030 --> 00:15:55,810 kahulugan sa akin sa aking isip. 344 00:15:55,810 --> 00:15:59,160 >> Kaya ngayon, kung ko bang buksan up ng isang mas mahusay na bersyon ng programa ko nagsimula pagsulat 345 00:15:59,160 --> 00:16:00,390 doon, ipaalam sa akin mag-scroll sa tuktok. 346 00:16:00,390 --> 00:16:03,190 At mayroong ilang mga karagdagang linya ng code dito, ngunit hayaan mo akong tumuon para sa 347 00:16:03,190 --> 00:16:04,160 sa sandaling ito sa isa. 348 00:16:04,160 --> 00:16:07,790 Ko na ipinahayag ng isang pare-pareho ang tinatawag na mag-aaral at hard code 3 para sa ngayon. 349 00:16:07,790 --> 00:16:11,110 Ngunit ngayon, pansinin kung paano malinis ang aking code ay nagsisimula upang makakuha ng. 350 00:16:11,110 --> 00:16:15,030 >> Sa line 22, ako idedeklara hanay ng mga mag-aaral. 351 00:16:15,030 --> 00:16:18,760 At mapapansin na ang mag-aaral ay tila ngayon ay isang uri ng data. 352 00:16:18,760 --> 00:16:23,360 Dahil sa tuktok ng file na ito, mapansin Nagsama ako ng header na file 353 00:16:23,360 --> 00:16:24,820 na aking nakuha up sandali lamang ang nakalipas. 354 00:16:24,820 --> 00:16:28,820 At header na file pa lang ay nagkaroon ang kahulugan ng isang mag-aaral. 355 00:16:28,820 --> 00:16:32,470 >> Kaya ngayon, lumikha ako ng aking sariling pasadyang data uri na ang mga may-akda ng C taon 356 00:16:32,470 --> 00:16:33,890 ang nakalipas ay hindi isipin nang maaga. 357 00:16:33,890 --> 00:16:34,570 Pero walang problema. 358 00:16:34,570 --> 00:16:35,870 Ang maaari kong gawin itong aking sarili. 359 00:16:35,870 --> 00:16:39,050 Kaya ito ay isang array na tinatawag na mga mag-aaral, bawat isa sa ang mga miyembro 360 00:16:39,050 --> 00:16:41,100 ay isang mag-aaral na kaayusan. 361 00:16:41,100 --> 00:16:44,270 At gusto ko ang tatlo sa mga sa array. 362 00:16:44,270 --> 00:16:46,030 >> At ngayon, kung ano ang natitira sa ng programang ito gawin? 363 00:16:46,030 --> 00:16:47,550 Kailangan ko ng isang bagay na medyo arbitrary. 364 00:16:47,550 --> 00:16:51,450 Kaya mula sa mga online 24 pasulong, Ako umulit 0-3. 365 00:16:51,450 --> 00:16:54,000 Pagkatapos kong tanungin ang user para sa Pangalan ng mag-aaral. 366 00:16:54,000 --> 00:16:56,110 At pagkatapos kong gamitin GetString tulad ng dati. 367 00:16:56,110 --> 00:16:59,410 Pagkatapos hilingin ko para sa bahay ng mag-aaral, at gagamitin ko GetString tulad ng dati. 368 00:16:59,410 --> 00:17:01,780 >> Ngunit notice - bahagyang bagong piraso ng syntax - 369 00:17:01,780 --> 00:17:07,010 Maaari ko pa rin bang i-index ang i-th mag-aaral, ngunit paano ko makuha sa tukoy na data 370 00:17:07,010 --> 00:17:08,354 patlang sa loob ng struct? 371 00:17:08,354 --> 00:17:11,770 Well, kung ano ang tila ang bagong piraso ng syntax? 372 00:17:11,770 --> 00:17:13,339 Ito ay lamang ang tuldok operator. 373 00:17:13,339 --> 00:17:14,510 >> Hindi kami talaga nakita ito bago. 374 00:17:14,510 --> 00:17:17,819 Nakita mo ito sa pset limang kung ikaw dived sa na may bitmap file. 375 00:17:17,819 --> 00:17:22,372 Ngunit tuldok lang ang ibig sabihin nito sa loob ng mga ito struct o maramihang mga patlang, bigyan tuldok 376 00:17:22,372 --> 00:17:24,510 pangalan, o ninyo akong bigyan tuldok bahay. 377 00:17:24,510 --> 00:17:28,690 Nangangahulugan iyon na pumunta sa loob ng struct at makakuha ng mga partikular na mga patlang. 378 00:17:28,690 --> 00:17:30,200 >> Ano ang ginagawa ang mga natitira sa programang ito gawin? 379 00:17:30,200 --> 00:17:31,190 Ito ay hindi lahat na sexy. 380 00:17:31,190 --> 00:17:34,640 Pansinin na ako umulit 0-3 muli, at ako lumikha lamang ng isang Ingles 381 00:17:34,640 --> 00:17:40,500 parirala tulad nang sa gayon at sa gayon ay sa tulad at tulad ng bahay, pagpasa sa tuldok pangalan mula 382 00:17:40,500 --> 00:17:43,320 ang i-th mag-aaral at ang kanilang mga bahay pati na rin. 383 00:17:43,320 --> 00:17:47,560 >> At pagkatapos ay bilang wakas, ngayon ay magsisimula kami upang makakuha anal tungkol dito, ngayon na kami ay 384 00:17:47,560 --> 00:17:49,580 pamilyar sa kung ano ang malloc at iba pang mga pag-andar na- 385 00:17:49,580 --> 00:17:50,570 paggawa ng lahat oras na ito. 386 00:17:50,570 --> 00:17:54,220 Bakit ako kailangang mag-magbakante parehong pangalan at bahay, kahit na ako 387 00:17:54,220 --> 00:17:56,960 Hindi tumawag malloc? 388 00:17:56,960 --> 00:17:58,020 >> GetString ginawa. 389 00:17:58,020 --> 00:18:00,930 At iyon ay ang marumi kaunti lihim para sa ilang mga linggo, ngunit may GetString 390 00:18:00,930 --> 00:18:03,530 Na-tagas memory lahat ng dako ng ilagay ang lahat ng semestre kaya sa ngayon. 391 00:18:03,530 --> 00:18:05,990 At valgrand kalooban sa wakas ibunyag ito sa amin. 392 00:18:05,990 --> 00:18:10,730 >> Ngunit ito ay hindi isang malaking pakikitungo, dahil alam ko na ako lang ang magbakante pangalan 393 00:18:10,730 --> 00:18:15,750 at ang bahay, kahit na technically, upang maging sobrang, sobrang safe, ang dapat kong maging 394 00:18:15,750 --> 00:18:17,890 paggawa ng ilang error check dito. 395 00:18:17,890 --> 00:18:19,040 Ano ang iyong mga instincts na nagsasabi sa iyo? 396 00:18:19,040 --> 00:18:22,480 Ano ang dapat kong i-check para sa bago magbakante ko kung ano ay isang 397 00:18:22,480 --> 00:18:25,470 string, aka kung saan ang isang pansamantalang trabaho *? 398 00:18:25,470 --> 00:18:33,460 >> Dapat ko talagang ma-check kung ang mga mag-aaral bracket pangalan i tuldok ay hindi 399 00:18:33,460 --> 00:18:34,840 katumbas null. 400 00:18:34,840 --> 00:18:40,400 Pagkatapos ay magkakaroon ito maging ang OK upang sige at ng libreng na pointer, at pareho o ang iba pang mga 401 00:18:40,400 --> 00:18:41,160 isa pati na rin. 402 00:18:41,160 --> 00:18:46,860 Kung mag-aaral bracket i tuldok bahay ay hindi katumbas ng null, ito ngayon ay maprotektahan 403 00:18:46,860 --> 00:18:52,520 laban sa mga sulok kaso kung saan GetString nagbabalik ng isang bagay tulad ng null. 404 00:18:52,520 --> 00:18:57,310 At nakita namin ng ilang sandali ang nakalipas, printf kalooban protektahan sa amin up dito lamang sa pamamagitan ng sinasabi 405 00:18:57,310 --> 00:18:58,990 null, na kung saan ay pagpunta sa hitsura kakaiba. 406 00:18:58,990 --> 00:19:02,340 Ngunit hindi bababa sa hindi ito segfault, tulad ng nakita natin. 407 00:19:02,340 --> 00:19:05,990 >> Well, ipaalam sa akin gawin ang isa iba pang mga bagay dito. structs-0 ay uri ng isang ugok programa 408 00:19:05,990 --> 00:19:09,700 dahil ipasok ko ang lahat ng data na ito, at pagkatapos ay ito ay nawala sa sandaling ang programa ay nagtatapos. 409 00:19:09,700 --> 00:19:10,940 Ngunit ipaalam sa akin sige at gawin ito. 410 00:19:10,940 --> 00:19:12,830 Hayaan akong gumawa ng terminal window ng kaunti mas malaking. 411 00:19:12,830 --> 00:19:17,000 Hayaan akong gumawa structs-1, na ay isang bagong bersyon ng mga ito. 412 00:19:17,000 --> 00:19:18,520 >> Magtatagal ako mag-zoom sa ilang sandali. 413 00:19:18,520 --> 00:19:21,620 At ngayon hayaan mo akong tumakbo tuldok iwa structs-1. 414 00:19:21,620 --> 00:19:22,590 Pangalan ng mag-aaral - 415 00:19:22,590 --> 00:19:31,500 David Mather, sabihin gawin Rob Kirkland, sabihin gawin Lauren Leverett. 416 00:19:31,500 --> 00:19:33,650 Ano ang mga kagiliw-giliw na ngayon ay notice - 417 00:19:33,650 --> 00:19:35,540 at ako lamang alam ito dahil Ako ay nagsulat sa programa - 418 00:19:35,540 --> 00:19:38,930 mayroong isang file na ngayon sa aking kasalukuyang direktoryo na tinatawag na students.csv. 419 00:19:38,930 --> 00:19:40,420 Ang ilan sa iyo ay maaaring nakakita mga sa tunay na mundo. 420 00:19:40,420 --> 00:19:42,980 >> Ano ang isang CSV file? 421 00:19:42,980 --> 00:19:44,170 Pinaghihiwalay ng kuwit ang mga halaga. 422 00:19:44,170 --> 00:19:46,670 Ito ay uri ng tulad ng isang mahinang tao bersyon ng isang Excel file. 423 00:19:46,670 --> 00:19:50,580 Ito ay isang talaan ng mga hilera at mga hanay na maaari mong buksan sa isang programa tulad ng Excel, 424 00:19:50,580 --> 00:19:51,800 o Number sa Mac. 425 00:19:51,800 --> 00:19:55,180 >> At kung ako buksan ang file na ito dito sa gedit, paunawa - at ang mga numero ay hindi doon. 426 00:19:55,180 --> 00:19:57,360 Na lamang na nagsasabi sa gedit sa akin mga numero ng linya. 427 00:19:57,360 --> 00:19:59,740 Pansinin sa unang linya ng ito file ay David at Mather. 428 00:19:59,740 --> 00:20:01,450 Ang susunod na linya ay Rob kuwit Kirkland. 429 00:20:01,450 --> 00:20:04,170 At ang ikatlong linya ay Lauren comma Leverett. 430 00:20:04,170 --> 00:20:05,480 >> Kaya kung ano ang aking nilikha? 431 00:20:05,480 --> 00:20:09,580 Ngayon ko na isinulat ng isang C programa na Maaari epektibong makabuo ng mga spreadsheet 432 00:20:09,580 --> 00:20:11,840 na pwedeng buksan sa isang programa tulad ng Excel. 433 00:20:11,840 --> 00:20:15,520 Hindi lahat ng nakahihimok na isang hanay ng data, ngunit kung ikaw ay may mas malaking chunks ng 434 00:20:15,520 --> 00:20:18,440 data na iyong aktwal na nais upang manipulahin at gumawa ng mga graph at ang 435 00:20:18,440 --> 00:20:21,260 i, ito ay marahil isa paraan upang lumikha ng data na iyon. 436 00:20:21,260 --> 00:20:25,370 Dagdag pa rito, CSVs ay aktwal na super common para lamang sa pag-iimbak ng data simple - 437 00:20:25,370 --> 00:20:28,940 Yahoo Finance, halimbawa, kung ikaw ay makakuha stock quote sa pamamagitan ng kanilang tinaguriang 438 00:20:28,940 --> 00:20:33,180 API, ang libreng serbisyo na nagbibigay-daan sa iyo makakuha ng kasalukuyang up-to-the-date stock 439 00:20:33,180 --> 00:20:35,650 quote para sa mga kumpanya, sila bigyan ang data pabalik sa 440 00:20:35,650 --> 00:20:37,800 sobrang simple CSV na format. 441 00:20:37,800 --> 00:20:39,380 >> Kaya kung paano ginawa namin iyon? 442 00:20:39,380 --> 00:20:42,530 Well mapansin, karamihan sa mga programang ito ni halos pareho. 443 00:20:42,530 --> 00:20:46,870 Ngunit mapansin pababa dito, sa halip na pag-print ang mga mag-aaral sa labas, sa linya 35 444 00:20:46,870 --> 00:20:51,040 pasulong, inaangkin ko na ako ang pag-save mag-aaral na disk, kaya pag-save ng file. 445 00:20:51,040 --> 00:20:53,630 >> Kaya mapansin ako deklarasyon ng FILE * - 446 00:20:53,630 --> 00:20:57,260 ngayon, ito ang uri ng isang anomalya sa C. Para sa anumang dahilan, FILE ang lahat ng caps, 447 00:20:57,260 --> 00:21:00,690 na kung saan ay hindi tulad ng karamihan sa iba pang mga uri ng data sa C. Ngunit ito ay isang built-in 448 00:21:00,690 --> 00:21:02,320 data uri, FILE *. 449 00:21:02,320 --> 00:21:05,900 At ako deklarasyon ng pointer sa isang file, ay kung paano maaari mong isipin na. 450 00:21:05,900 --> 00:21:08,070 >> fopen nangangahulugan open file. 451 00:21:08,070 --> 00:21:09,470 Ano ang file na nais mong buksan? 452 00:21:09,470 --> 00:21:12,620 Gusto kong magbukas ng isang file na kalooban ko mang tumawag students.csv. 453 00:21:12,620 --> 00:21:14,480 Kaya kong tumawag sa anumang bagay na gusto ko. 454 00:21:14,480 --> 00:21:15,200 >> At pagkatapos gumawa ng isang hula. 455 00:21:15,200 --> 00:21:18,960 Ano ang ipinapakita ng pangalawang argumento sa fopen marahil ibig sabihin nito? 456 00:21:18,960 --> 00:21:21,480 Kanan, w para sa write, ng dati maging r para read. 457 00:21:21,480 --> 00:21:24,120 Mayroong para sa Magkabit kung gustong idagdag hilera at hindi 458 00:21:24,120 --> 00:21:25,200 patungan ang buong bagay. 459 00:21:25,200 --> 00:21:28,005 >> Ngunit ko lang nais na lumikha ng file na ito sabay-sabay, kaya makikita ko bang gamitin ang quote magpanipi w. 460 00:21:28,005 --> 00:21:31,880 At alam ko na lamang mula sa pagkakaroon ng basahin ang babasahin, o mga tao na pahina. 461 00:21:31,880 --> 00:21:35,100 Kung ang file ay hindi null - sa ibang salita, kung walang nangyaring mali doon - 462 00:21:35,100 --> 00:21:37,820 hayaan mo akong umulit sa ibabaw ng mga mag-aaral 0-3. 463 00:21:37,820 --> 00:21:40,410 >> At ngayon mapansin mayroong isang bagay kailanman kaya bahagyang naiiba 464 00:21:40,410 --> 00:21:42,110 tungkol sa 41 linya dito. 465 00:21:42,110 --> 00:21:42,960 Ito ay hindi printf. 466 00:21:42,960 --> 00:21:46,530 Ito ay fprintf para sa file printf. 467 00:21:46,530 --> 00:21:47,790 Kaya ito ay pagpunta sa sumulat sa file na. 468 00:21:47,790 --> 00:21:48,860 Aling mga file? 469 00:21:48,860 --> 00:21:53,630 Ang isa na ang pointer tinukoy mo bilang ang unang argumento. 470 00:21:53,630 --> 00:21:55,940 >> Pagkatapos naming tukuyin ang isang format na string. 471 00:21:55,940 --> 00:21:59,660 Pagkatapos naming tukuyin kung ano string gusto naming plug in sa unang mga porsiyento, at 472 00:21:59,660 --> 00:22:04,320 pagkatapos ng isa pang variable o ang pangalawang s porsiyento. 473 00:22:04,320 --> 00:22:06,760 Pagkatapos naming isara ang file na may fclose. 474 00:22:06,760 --> 00:22:09,380 Kaysa magbakante ko ang memory tulad ng dati, bagaman Ang dapat kong bumalik sa at magdagdag 475 00:22:09,380 --> 00:22:10,540 ilan sa mga pagsusuri para sa null. 476 00:22:10,540 --> 00:22:12,090 >> At na ito. 477 00:22:12,090 --> 00:22:16,960 fopen, fprintf, fclose ay nagbibigay sa akin ang kakayahan upang lumikha ng mga file na teksto. 478 00:22:16,960 --> 00:22:19,640 Ngayon, makakakita ka ng problema sa hanay ng limang, na kung saan ay nagsasangkot ng mga imahe, ikaw ay gumagamit ng 479 00:22:19,640 --> 00:22:20,990 binary file sa halip. 480 00:22:20,990 --> 00:22:24,200 Ngunit sa panimula, ang ideya ay pareho, kahit na ang mga function bibigyan ka 481 00:22:24,200 --> 00:22:28,710 makita ay Medyo naiiba. 482 00:22:28,710 --> 00:22:32,580 >> Kaya ipoipo tour, ngunit makakakuha ka ng lahat ng masyadong pamilyar sa file I/O-- 483 00:22:32,580 --> 00:22:34,960 input at output - may pset limang. 484 00:22:34,960 --> 00:22:38,607 At anumang mga katanungan tungkol sa paunang pangunahing kaalaman dito? 485 00:22:38,607 --> 00:22:39,857 Oo? 486 00:22:39,857 --> 00:22:41,880 487 00:22:41,880 --> 00:22:43,710 >> Paano kapag sinubukan mong mag-magbakante isang null halaga? 488 00:22:43,710 --> 00:22:48,880 Naniniwala akong, maliban kung libre na nakuha ng isang maliit na mas user-friendly, maaari mong 489 00:22:48,880 --> 00:22:49,890 potensyal na segfault. 490 00:22:49,890 --> 00:22:54,160 Pasadong ito ay walang bisa dahil sa hindi magandang gawin ko hindi Naniniwala libreng bothers upang suriin para sa iyo, 491 00:22:54,160 --> 00:22:57,330 dahil ito ay potensyal na maging isang basura ng oras para sa mga ito upang gawin ang kanyang sarili para sa 492 00:22:57,330 --> 00:22:59,022 lahat ng tao sa mundo. 493 00:22:59,022 --> 00:23:00,590 Magandang katanungan, bagaman. 494 00:23:00,590 --> 00:23:04,300 >> Ang lahat ng mga karapatan, kaya ito uri ng makakakuha sa amin sa isang kawili-wiling paksa. 495 00:23:04,300 --> 00:23:07,010 Ang tema ng problema set lima ay forensics. 496 00:23:07,010 --> 00:23:08,420 Hindi bababa sa na ang isang bahagi ng problema sa set. 497 00:23:08,420 --> 00:23:12,030 Forensics sa pangkalahatan ay tumutukoy sa pagbawi ng impormasyon na maaari o 498 00:23:12,030 --> 00:23:14,110 hindi maaaring natanggal kusa. 499 00:23:14,110 --> 00:23:18,680 At kaya naisip ko na gusto kong bigyan ka ng isang mabilis lasa ng kung ano ang talagang pagpunta sa lahat 500 00:23:18,680 --> 00:23:21,230 oras na ito sa ilalim ng hood ng iyong computer. 501 00:23:21,230 --> 00:23:23,960 >> Halimbawa, kung mayroon ka sa loob ng iyong laptop o sa iyong desktop computer ng isang 502 00:23:23,960 --> 00:23:28,040 hard drive, ito ay alinman sa isang mekanikal aparato na talagang spins - 503 00:23:28,040 --> 00:23:31,650 may paikot na bagay na tinatawag na platters na hitsura medyo gusto ko kung ano ang 504 00:23:31,650 --> 00:23:34,540 lamang ay nagkaroon ng hanggang sa screen dito, bagaman ito ay nagiging lumang paaralan. 505 00:23:34,540 --> 00:23:37,370 Ito ay isang tatlong-at-a-half-inch hard drive. 506 00:23:37,370 --> 00:23:40,070 At tatlong at kalahating pulgada ay tumutukoy sa may mga bagay na kapag nag-install mo ito 507 00:23:40,070 --> 00:23:40,890 sa isang computer. 508 00:23:40,890 --> 00:23:44,890 >> Marami sa mga ka guys sa iyong mga laptop ngayon may solid-estado drive, o SSDs, 509 00:23:44,890 --> 00:23:46,260 na may na walang paglipat ng mga bahagi. 510 00:23:46,260 --> 00:23:49,170 Ang mga ito ay higit na katulad ng RAM at mas mababa tulad ng mga mekanikal na aparato. 511 00:23:49,170 --> 00:23:51,450 Ngunit ang mga ideya ay pa rin ang parehong, tiyak na bilang ng mga ito 512 00:23:51,450 --> 00:23:52,790 upang itakda ang problema limang. 513 00:23:52,790 --> 00:23:57,400 >> At kung sa tingin mo tungkol sa ngayon ng isang hard drive Kinakatawan ng pagiging isang bilog, na 514 00:23:57,400 --> 00:23:58,930 Kukunin ko gumuhit ganito dito. 515 00:23:58,930 --> 00:24:02,290 Kapag lumikha ka ng isang file sa iyong computer, maging ito man ay isang SSD, o sa 516 00:24:02,290 --> 00:24:06,610 kasong ito, ang isang mas lumang paaralan hard drive, file na binubuo ng maramihang mga piraso. 517 00:24:06,610 --> 00:24:10,510 Sabihin natin na ito ang 0 at 1, ang maramihang mga 0s at 1s. 518 00:24:10,510 --> 00:24:11,660 Kaya ito ay ang aking buong hard drive. 519 00:24:11,660 --> 00:24:13,225 Ito ay tila isang medyo malaki file. 520 00:24:13,225 --> 00:24:18,080 At ito ay gumagamit ng up ng 0s at 1s sa na bahagi ng pisikal na platter. 521 00:24:18,080 --> 00:24:19,750 >> Well, ano ang pisikal na bahagi? 522 00:24:19,750 --> 00:24:25,310 Well, ito lumiliko out na sa isang hard drive, hindi bababa sa na may ganitong uri, mayroong 523 00:24:25,310 --> 00:24:27,340 mga maliliit na maliit na magnetic particle. 524 00:24:27,340 --> 00:24:32,630 At sila ay mahalagang mayroon hilaga at south pole sa kanila, upang kung ikaw 525 00:24:32,630 --> 00:24:35,710 i-on ang isa sa mga magnetic particle sa ganitong paraan, maaari mong sabihin na ito 526 00:24:35,710 --> 00:24:36,720 kumakatawan sa isang 1. 527 00:24:36,720 --> 00:24:39,340 At kung ito ay baligtad sa timog hilaga, maaari mong sabihin na ito 528 00:24:39,340 --> 00:24:40,390 kumakatawan sa isang 0. 529 00:24:40,390 --> 00:24:43,660 >> Kaya sa tunay na pisikal na mundo, na paano maaari mong kumatawan ng isang bagay sa 530 00:24:43,660 --> 00:24:45,670 binary estado ng 0 at 1. 531 00:24:45,670 --> 00:24:46,720 Kaya na ang lahat ng mga file ay isang. 532 00:24:46,720 --> 00:24:49,300 Mayroong ang maramihang mga magnetic particle na ito ang kanilang paraan o 533 00:24:49,300 --> 00:24:51,920 sa ganitong paraan, paglikha ng mga pattern ng 0s at 1s. 534 00:24:51,920 --> 00:24:56,760 >> Ngunit ito lumiliko out kapag nag-save ka ng file, ilang impormasyon ay naka-save nang hiwalay. 535 00:24:56,760 --> 00:25:00,000 Kaya ito ay isang maliit na mesa, isang direktoryo, kaya na magsalita. 536 00:25:00,000 --> 00:25:05,810 At Tatawag ako ang hanay na ito pangalan, at Tatawag ako ang hanay na lokasyon. 537 00:25:05,810 --> 00:25:08,850 >> At pupuntahan ko sabihin, ipagpalagay ito ang aking resume. 538 00:25:08,850 --> 00:25:14,050 Aking resume.doc ay naka-imbak sa lokasyon, sabihin nating 123. 539 00:25:14,050 --> 00:25:15,390 Ako palaging pumunta para sa na numero. 540 00:25:15,390 --> 00:25:18,810 Ngunit magkasiya ito upang sabihin na lang bang sa RAM, maaari kang kumuha ng hard drive 541 00:25:18,810 --> 00:25:22,350 na ang isang gigabyte o 200 gigabytes o isang terabyte, at maaari mong 542 00:25:22,350 --> 00:25:23,750 bilang ang lahat ng mga bytes. 543 00:25:23,750 --> 00:25:26,480 Maaari mong numero ang lahat ng chunks ng 8 bits. 544 00:25:26,480 --> 00:25:29,030 >> Kaya naming sabihin na ito ay 123 lokasyon. 545 00:25:29,030 --> 00:25:32,070 Kaya direktoryong ito sa loob ng aking mga operating Naaalala ng sistema na ang aking 546 00:25:32,070 --> 00:25:34,250 resume ay sa 123 lokasyon. 547 00:25:34,250 --> 00:25:36,850 Ngunit ito ay makakakuha ng kawili-wiling kapag tinanggal mo ang isang file. 548 00:25:36,850 --> 00:25:37,820 >> Kaya halimbawa - 549 00:25:37,820 --> 00:25:40,790 at thankfully, karamihan ng mundo ay nahuli sa ito - kung ano ang mangyayari kapag 550 00:25:40,790 --> 00:25:45,040 i-drag mo ang isang file sa iyong Basura Mac OS o iyong Windows Recycle Bin? 551 00:25:45,040 --> 00:25:48,290 552 00:25:48,290 --> 00:25:50,510 Ano ang layunin ng paggawa na? 553 00:25:50,510 --> 00:25:53,860 Ito ay malinaw naman upang makakuha ng mapupuksa ang mga file, ngunit kung ano ang ipinapakita ng kilos ng pag-drag at 554 00:25:53,860 --> 00:25:57,550 pag-drop sa iyong Basurahan o ang iyong Recycle Bin gawin sa isang computer? 555 00:25:57,550 --> 00:25:59,230 >> Talagang wala, talaga. 556 00:25:59,230 --> 00:26:00,320 Ito ay tulad ng isang folder. 557 00:26:00,320 --> 00:26:01,800 Ito ay isang espesyal na folder, upang maging sigurado. 558 00:26:01,800 --> 00:26:04,460 Ngunit ang ibig talagang tanggalin ang file? 559 00:26:04,460 --> 00:26:06,780 >> Well, walang, dahil ang ilan sa iyo marahil naging tulad ng, oh mapahamak, ikaw ay hindi 560 00:26:06,780 --> 00:26:07,420 ibig sabihin upang gawin iyon. 561 00:26:07,420 --> 00:26:09,130 Kaya mong i-double click ang Basurahan o Recycle Bin. 562 00:26:09,130 --> 00:26:11,630 Nag-poked sa paligid at na-recover ang mga file sa pamamagitan lamang ng pag-drag nito 563 00:26:11,630 --> 00:26:12,110 sa labas ng doon. 564 00:26:12,110 --> 00:26:14,420 Kaya malinaw, ito ay hindi kinakailangang pagtanggal nito. 565 00:26:14,420 --> 00:26:15,990 >> OK, ikaw ay mas madunong kaysa sa na. 566 00:26:15,990 --> 00:26:18,860 Alam mo na lamang ng pag-drag ito papunta sa Basurahan o Recycle Bin ay hindi nangangahulugan na 567 00:26:18,860 --> 00:26:19,930 ka tinatanggalan ng laman ang basurahan. 568 00:26:19,930 --> 00:26:24,110 Kaya kang pumunta ng hanggang sa ang menu, at sasabihin sa iyo Walang laman na Basura o Empty Recycle Bin. 569 00:26:24,110 --> 00:26:25,360 Pagkatapos, anong mangyayari? 570 00:26:25,360 --> 00:26:29,070 571 00:26:29,070 --> 00:26:32,530 >> Oo, sa gayon ito ay tinanggal na mas kaya. 572 00:26:32,530 --> 00:26:37,660 Ngunit lahat ng iyon ay mangyayari ito. 573 00:26:37,660 --> 00:26:45,350 Ang computer na kung saan forgets resume.doc noon. 574 00:26:45,350 --> 00:26:47,400 >> Ngunit kung ano ay hindi nagbago sa malas sa larawan? 575 00:26:47,400 --> 00:26:51,390 576 00:26:51,390 --> 00:26:55,570 Ang bits, ang 0s at 1s na sinasabi ko ay sa site ng ilang mga pisikal na aspeto ng 577 00:26:55,570 --> 00:26:56,280 ang hardware. 578 00:26:56,280 --> 00:26:57,110 Ang mga ito ay pa rin doon. 579 00:26:57,110 --> 00:26:58,930 Ito ay lamang ang computer ay may nakalimutan kung ano sila. 580 00:26:58,930 --> 00:27:03,160 >> Kaya mahalagang ito ay napalaya ng file bit sa gayon ay maaari silang ma-reused. 581 00:27:03,160 --> 00:27:06,940 Ngunit hindi hanggang sa lumikha ka ng higit pang mga file, at higit pang mga file, at higit pang mga file kalooban 582 00:27:06,940 --> 00:27:12,150 probabilistically, mga 0s at 1s, mga magnetic particle, makapag-reused, 583 00:27:12,150 --> 00:27:16,220 nakabaligtad o kanang bahagi up, para sa iba pang mga file, 0s at 1s. 584 00:27:16,220 --> 00:27:17,980 >> Kaya mayroon kang ang window na ito ng panahon. 585 00:27:17,980 --> 00:27:19,860 At ito ay hindi na predictable haba, talaga. 586 00:27:19,860 --> 00:27:22,240 Ito ay depende sa laki ng iyong hard biyahe at kung gaano karaming mga file na mayroon ka at 587 00:27:22,240 --> 00:27:23,490 kung paano mabilis na gumawa ka ng mga bago. 588 00:27:23,490 --> 00:27:27,050 Ngunit mayroong window na ito ng oras sa panahon ng na file na isa pa ring ganap na ganap 589 00:27:27,050 --> 00:27:27,770 maibabalik muli. 590 00:27:27,770 --> 00:27:31,050 >> Kaya kung sakaling gamitin ang mga programa tulad ng McAfee o Norton upang subukan upang mabawi ang 591 00:27:31,050 --> 00:27:35,680 data, ang lahat ng kanilang ginagawa ay sinusubukang i- mabawi ito tinaguriang direktoryo upang 592 00:27:35,680 --> 00:27:37,340 maisip kung saan ang iyong mga file ay. 593 00:27:37,340 --> 00:27:40,605 At minsan ay Norton at sasabihin, file ay 93% makuha. 594 00:27:40,605 --> 00:27:42,020 Well, ano ang na ibig sabihin nito? 595 00:27:42,020 --> 00:27:45,690 Iyon ay nangangahulugan lamang na ang ilang mga iba pang mga file coincidentally napunta paggamit, sabihin nating, 596 00:27:45,690 --> 00:27:48,920 mga bits out sa iyong orihinal na file. 597 00:27:48,920 --> 00:27:51,950 >> Kaya kung ano ay aktwal na kasangkot sa pagbawi ng data? 598 00:27:51,950 --> 00:27:55,720 Well, kung wala kang isang bagay tulad ng Norton pre-install sa iyong computer, 599 00:27:55,720 --> 00:27:59,510 ang pinakamahusay na maaari mong gawin kung minsan ay tumingin sa buong hard drive naghahanap para sa 600 00:27:59,510 --> 00:28:00,510 pattern ng mga piraso. 601 00:28:00,510 --> 00:28:05,350 At ang isa sa mga tema ng problema set lima ay na kayo ay maghanap sa 602 00:28:05,350 --> 00:28:09,570 katumbas ng isang hard drive, isang forensic imahe ng isang compact flash card mula sa isang 603 00:28:09,570 --> 00:28:13,660 digital camera, naghahanap para sa 0s at 1s na karaniwang, na may mataas na 604 00:28:13,660 --> 00:28:16,720 bagay na maaaring mangyari, ay kumakatawan sa magsimula ng isang imahe JPEG. 605 00:28:16,720 --> 00:28:21,120 >> At ka guys ay maaaring mabawi ang mga larawang iyon sa pamamagitan ng ipagpalagay, kung makikita ko ang pattern na ito ng 606 00:28:21,120 --> 00:28:24,380 bits sa forensic imahe, na may mataas na posibilidad, na nagmamarka 607 00:28:24,380 --> 00:28:25,650 sa simula ng isang JPEG. 608 00:28:25,650 --> 00:28:29,520 At kung makita ko ang mga parehong pattern muli, na marahil ay nagmamarka ng simula ng 609 00:28:29,520 --> 00:28:32,440 isa pang JPEG, at isa pa JPEG, at isa pang JPEG. 610 00:28:32,440 --> 00:28:34,970 At ito ay karaniwang kung paano data pagbawi gagana. 611 00:28:34,970 --> 00:28:37,870 Ano ang maganda tungkol sa mga JPEG ay kahit na ang format ng file mismo ay medyo 612 00:28:37,870 --> 00:28:44,400 complex, simula ng bawat tulad file ay talagang walang kinikilingan na makikilalang 613 00:28:44,400 --> 00:28:47,370 at simple, bilang nang nakikita mo, kung ikaw ay hindi pa. 614 00:28:47,370 --> 00:28:50,270 >> Kaya natin ng malapitan hitsura sa ilalim ang hood bilang sa kung ano mismo ang nangyaring 615 00:28:50,270 --> 00:28:53,360 pagpunta sa, at kung ano ang mga 0s at 1s ay, upang bigyan ka ng isang bit higit pa sa isang 616 00:28:53,360 --> 00:28:55,330 konteksto para sa partikular na hamon. 617 00:28:55,330 --> 00:28:55,510 >> [Video playback] 618 00:28:55,510 --> 00:28:58,700 >> -Kung saan ang iyong PC nag-iimbak ng pinaka- ng kanyang permanenteng data. 619 00:28:58,700 --> 00:29:03,390 Upang gawin na, ang data mula sa paglalakbay RAM kasama ang software na signal na sabihin 620 00:29:03,390 --> 00:29:06,110 ang hard drive kung paano i-imbak ang data na iyon. 621 00:29:06,110 --> 00:29:09,410 Ang mahirap circuits biyahe isalin mga signal sa boltahe 622 00:29:09,410 --> 00:29:10,870 pagbabagu-bago. 623 00:29:10,870 --> 00:29:14,970 Ang mga ito, siya namang, kontrolin ang hard drive ni paglipat ng mga bahagi, ang ilan sa mga ilang 624 00:29:14,970 --> 00:29:17,910 paglipat ng mga bahagi naiwan sa modernong computer. 625 00:29:17,910 --> 00:29:22,130 >> Ang ilan sa mga signal na kontrolin ang isang motor na spins metal-pinahiran platters. 626 00:29:22,130 --> 00:29:25,470 Ang iyong data ay aktwal na naka-imbak sa mga platters. 627 00:29:25,470 --> 00:29:28,610 Iba pang mga signal ilipat ang basahin / isulat ulo upang basahin o 628 00:29:28,610 --> 00:29:30,710 magsulat ng data sa platters. 629 00:29:30,710 --> 00:29:35,450 Ito makinarya kaya tumpak na ang isang tao buhok ay hindi kahit na pumasa sa pagitan ng mga 630 00:29:35,450 --> 00:29:37,280 ulo at Umiikot na platters. 631 00:29:37,280 --> 00:29:40,316 Ngunit, ang lahat ng ito ay gumagana sa mga bilis ng nakakikilabot. 632 00:29:40,316 --> 00:29:40,660 >> [END-playback ng video] 633 00:29:40,660 --> 00:29:42,190 >> David MALAN: Mag-zoom in ng kaunti mas malalim na ngayon sa kung ano ang 634 00:29:42,190 --> 00:29:44,360 talaga sa mga platters. 635 00:29:44,360 --> 00:29:44,720 >> [Video playback] 636 00:29:44,720 --> 00:29:47,660 >> -Tingnan natin kung ano ang aming lamang Nakita sa mabagal na kilos. 637 00:29:47,660 --> 00:29:51,710 Kapag ang isang maikling pulso ng koryente ay ipinadala sa basahin / isulat ang ulo, kung flips 638 00:29:51,710 --> 00:29:54,650 sa isang maliit na maliit electromagnetic para sa isang bahagi ng isang segundo. 639 00:29:54,650 --> 00:29:58,970 Ang pang-akit ay lumilikha ng isang patlang, na mga pagbabago sa polarity ng isang maliit na maliit, maliit na maliit 640 00:29:58,970 --> 00:30:02,850 bahagi ng metal particle na sako bawat platter ibabaw. 641 00:30:02,850 --> 00:30:05,940 >> Ang isang pattern serye ng mga maliliit na, nasingil-up na lugar sa disk 642 00:30:05,940 --> 00:30:08,470 ay kumakatawan sa isang solong bit ng data sa mga numero ng binary 643 00:30:08,470 --> 00:30:10,530 system na ginagamit ng mga computer. 644 00:30:10,530 --> 00:30:13,775 Ngayon, kung ang kasalukuyang ay nagpadala ng isang paraan sa pamamagitan ng read / write head, ang lugar na 645 00:30:13,775 --> 00:30:15,970 ay polarized sa isa direksyon. 646 00:30:15,970 --> 00:30:17,950 Kung ang kasalukuyang ay ipinadala sa tapat na direksyon, ang 647 00:30:17,950 --> 00:30:19,930 polariseysyon ay baligtad. 648 00:30:19,930 --> 00:30:22,370 >> Paano makakakuha ka ng data off ang hard disk? 649 00:30:22,370 --> 00:30:24,090 Lamang baligtarin ang proseso. 650 00:30:24,090 --> 00:30:26,550 Kaya ito ang mga particle sa disk na makuha ang kasalukuyang sa 651 00:30:26,550 --> 00:30:27,960 basahin / isulat ang ulo gumagalaw. 652 00:30:27,960 --> 00:30:30,700 Ilagay ang sama-sama ng milyun-milyong mga magnetized segment, at 653 00:30:30,700 --> 00:30:32,160 mayroon ka ng isang file. 654 00:30:32,160 --> 00:30:36,060 >> Ngayon, ang mga piraso ng isang solong file maaari ay nakakalat sa lahat sa ibabaw ng isang biyahe ni 655 00:30:36,060 --> 00:30:39,970 platters, uri ng tulad ng gulo ng mga papeles sa iyong mesa. 656 00:30:39,970 --> 00:30:43,500 Kaya isang espesyal na file dagdag Sinusubaybayan ng kung saan lahat ng bagay ay. 657 00:30:43,500 --> 00:30:45,985 Huwag na nais mong kayo ay nagkaroon ng isang bagay tulad na? 658 00:30:45,985 --> 00:30:46,470 >> [END-playback ng video] 659 00:30:46,470 --> 00:30:47,820 >> David MALAN: OK, marahil hindi. 660 00:30:47,820 --> 00:30:52,070 Kaya kung gaano karaming ng ka guys lumago up sa mga ito? 661 00:30:52,070 --> 00:30:53,970 OK, kaya mas kaunting at mas kaunting mga kamay sa bawat taon. 662 00:30:53,970 --> 00:30:56,550 Ngunit Natutuwa akong ikaw ay hindi bababa sa pamilyar sa kanila, sapagkat ito at ang aming sariling 663 00:30:56,550 --> 00:31:00,520 aklat demo, sadly, ang mga namamatay na isang napaka- pabagalin kamatayan dito ng pagpapalagayang-loob. 664 00:31:00,520 --> 00:31:04,010 >> Ngunit ito ay kung ano ang ko, hindi bababa sa, pabalik sa mataas na paaralan, ginamit na paggamit para sa pag-backup. 665 00:31:04,010 --> 00:31:08,110 At ito ay kamangha-manghang, dahil ikaw maaaring iimbak 1.4 megabytes sa 666 00:31:08,110 --> 00:31:08,930 ang partikular na disk. 667 00:31:08,930 --> 00:31:12,260 At ito ay ang mataas na bersyon density, tulad ng ipinahiwatig ng HD, na mayroong 668 00:31:12,260 --> 00:31:14,240 ibig sabihin bago HD video ngayon. 669 00:31:14,240 --> 00:31:16,400 >> Standard density ay 800 kilobytes. 670 00:31:16,400 --> 00:31:18,640 At bago na, mayroong 400-kilobyte mga disk. 671 00:31:18,640 --> 00:31:23,120 At bago na, mayroong 5 at 1/4 inch disk, na kung saan ay tunay na tumbahin, 672 00:31:23,120 --> 00:31:25,680 at isang maliit na mas malawak at taller kaysa sa mga bagay na ito dito. 673 00:31:25,680 --> 00:31:29,150 Ngunit maaari ka talaga makita ang mga tinaguriang tumbahin aspeto ng mga disk. 674 00:31:29,150 --> 00:31:32,630 >> At pagtakbo, ang mga ito ay aktwal na medyo katulad sa hard drive ng sa 675 00:31:32,630 --> 00:31:33,570 hindi bababa sa ganitong uri. 676 00:31:33,570 --> 00:31:37,270 Muli, SSDs sa mas bagong computer gumana medyo naiiba. 677 00:31:37,270 --> 00:31:41,530 Ngunit kung ililipat mo na ang maliit na tab metal, Maaari mo talaga makita ang isang maliit na cookie, 678 00:31:41,530 --> 00:31:42,560 o pinggan. 679 00:31:42,560 --> 00:31:43,830 >> Ito ay hindi metal tulad ng isang ito. 680 00:31:43,830 --> 00:31:46,000 Isa na ito ay aktwal na ang ilang mga mas mura plastic na materyal. 681 00:31:46,000 --> 00:31:46,750 At maaari mong uri ng pagkakawag ito. 682 00:31:46,750 --> 00:31:50,310 At trully mo na lang wiped off ang ilang mga bilang ng bits o magnetic particle 683 00:31:50,310 --> 00:31:51,220 mula sa disk. 684 00:31:51,220 --> 00:31:52,710 >> Kaya thankfully, wala sa mga ito. 685 00:31:52,710 --> 00:31:55,790 Kung bagay na nasa mga paraan - at takpan ang iyong mga mata at doon sa iyong kapwa - 686 00:31:55,790 --> 00:31:58,865 Maaari mo lamang uri ng hilahin ito buong upak off tulad na. 687 00:31:58,865 --> 00:32:01,900 Subalit mayroong isang maliit na spring, kaya maging kamalayan ng na kasama ng iyong mga mata. 688 00:32:01,900 --> 00:32:03,620 Kaya ngayon ikaw ay tunay na isang tumbahin disk. 689 00:32:03,620 --> 00:32:07,090 >> At kung ano ang tungkol sa kahanga-hangang ito ay na in bilang magkano ang bilang na ito ay isang 690 00:32:07,090 --> 00:32:10,830 maliit na-scale na representasyon ng isang mas malaking hard drive, ang mga bagay na ito ay sukdulang, 691 00:32:10,830 --> 00:32:11,590 sobrang simple. 692 00:32:11,590 --> 00:32:15,170 Kung kurutin sa ilalim ng ito, ngayon na metal na bagay ay off, at alisan ng balat 693 00:32:15,170 --> 00:32:20,990 buksan ang mga ito, ang lahat ng mayroon ang dalawang piraso ng nadama at ng tinatawag na disk tumbahin 694 00:32:20,990 --> 00:32:22,930 may isang piraso ng metal sa loob. 695 00:32:22,930 --> 00:32:25,990 >> At doon napupunta kalahati ng ang aking mga laman ng disk. 696 00:32:25,990 --> 00:32:27,540 May napupunta isa pang kalahati ng mga ito. 697 00:32:27,540 --> 00:32:31,375 Ngunit iyon lamang ang lahat ng iyon ay Umiikot na loob ng iyong computer sa nakalipas na panahon. 698 00:32:31,375 --> 00:32:35,220 699 00:32:35,220 --> 00:32:38,310 >> At muli, upang ilagay ito sa pananaw, gaano kalaki ang karamihan sa iyong 700 00:32:38,310 --> 00:32:39,560 matapang na nag-mamaneho nang mga araw na ito? 701 00:32:39,560 --> 00:32:41,960 702 00:32:41,960 --> 00:32:46,230 500 gigabytes, isang terabyte, marahil sa isang desktop computer, 2 terabytes, 3 703 00:32:46,230 --> 00:32:47,630 terabytes, 4 terabytes, tama? 704 00:32:47,630 --> 00:32:52,480 Ito ay isa megabyte, bigyan o kumuha, na hindi maaaring kahit na umaangkop sa isang tipikal na MP3 705 00:32:52,480 --> 00:32:55,310 ngayon mga araw na ito, o ilang katulad ng musika file. 706 00:32:55,310 --> 00:32:59,500 >> Kaya ng kaunti souvenir para sa iyo ngayon, at rin upang makatulong contextualize ano 707 00:32:59,500 --> 00:33:03,570 lilikha kami paglalaan para sa ipinagkaloob ngayon sa problema itakda limang. 708 00:33:03,570 --> 00:33:04,820 Kaya iyon ay inyo upang panatilihin. 709 00:33:04,820 --> 00:33:07,340 710 00:33:07,340 --> 00:33:13,370 Kaya hayaan mo akong lumipat sa kung saan magiging gumagastos ng susunod na pset pati na rin. 711 00:33:13,370 --> 00:33:18,470 Kaya ngayon namin na-set ang pahinang ito para sa - oh, isang pares ng mga anunsyo ng mabilis. 712 00:33:18,470 --> 00:33:21,730 >> Ito Biyernes, kung gusto mong sumali CS50 para sa tanghalian, pumunta sa karaniwang lugar, 713 00:33:21,730 --> 00:33:23,610 cs50.net/rsvp. 714 00:33:23,610 --> 00:33:25,100 At huling proyekto - 715 00:33:25,100 --> 00:33:28,520 kaya ang bawat syllabus, aming na-post ang huling proyekto na pagtutukoy. 716 00:33:28,520 --> 00:33:31,410 Napag-alaman na iyon ay hindi nangangahulugan na ito ay dahil lalo na sa lalong madaling panahon. 717 00:33:31,410 --> 00:33:33,990 Ito ay nai-post, talaga, lamang upang makakuha ng mo guys pag-iisip tungkol dito. 718 00:33:33,990 --> 00:33:37,620 At sa katunayan, isang napaka-makabuluhang porsyento ng iyong ibibigay ay tackling 719 00:33:37,620 --> 00:33:40,780 huling proyekto sa materyal na namin hindi pa kahit na nakuha na sa klase, 720 00:33:40,780 --> 00:33:42,730 ngunit ito ay mas maaga sa susunod na linggo. 721 00:33:42,730 --> 00:33:45,530 >> Abiso, bagaman, na ang spec para sa mga tawag ng ilang iba't ibang mga bahagi ng 722 00:33:45,530 --> 00:33:46,190 huling proyekto. 723 00:33:46,190 --> 00:33:49,590 Ang una, sa loob ng ilang linggo, ay isang pre-proposal, isang magandang kaswal na e-mail sa 724 00:33:49,590 --> 00:33:52,760 ang iyong tf na sabihin sa kanya kung ano o ikaw ay nag-iisip tungkol sa para sa iyong proyekto, na may 725 00:33:52,760 --> 00:33:53,650 walang commitment. 726 00:33:53,650 --> 00:33:56,710 Panukala sa iyong magiging partikular na pangako, na sinasabi, dito, ito ay kung ano ang 727 00:33:56,710 --> 00:33:57,770 Gusto kong gawin para sa aking proyekto. 728 00:33:57,770 --> 00:33:58,250 Ano sa tingin ninyo? 729 00:33:58,250 --> 00:33:58,650 Masyadong malaki? 730 00:33:58,650 --> 00:33:59,145 Masyadong maliit? 731 00:33:59,145 --> 00:34:00,330 Ito ba ay napapamahalaang? 732 00:34:00,330 --> 00:34:02,230 At nakita mo ang spec para sa karagdagang detalye. 733 00:34:02,230 --> 00:34:05,060 >> Dalawang linggo pagkatapos na ay ang katayuan ulat, na kung saan ay isang katulad 734 00:34:05,060 --> 00:34:08,260 kaswal na email sa iyong tf sasabihin lamang kung paano malayo sa likod ikaw ay nasa iyong panghuling 735 00:34:08,260 --> 00:34:12,360 proyekto pagpapatupad, na sinusundan ng ang CS50 Hackathon na kung saan ang lahat ng tao 736 00:34:12,360 --> 00:34:17,520 ay inimbitahan, na kung saan ay magiging isang kaganapan mula sa 20:00 sa isa gabi hanggang 07:00 737 00:34:17,520 --> 00:34:19,150 AM sa susunod na umaga. 738 00:34:19,150 --> 00:34:22,560 Pizza, na maaaring ko pa nabanggit sa linggo zero, Wil ihain sa 9:00, 739 00:34:22,560 --> 00:34:24,120 Chinese food sa 01:00. 740 00:34:24,120 --> 00:34:27,929 At kung hindi mo pa rin gising sa 5:00, magpapadala kami magdadala sa iyo sa IHOP para sa almusal. 741 00:34:27,929 --> 00:34:31,310 >> Kaya ang Hackathon ay isa sa mga mas di malilimutang karanasan sa klase. 742 00:34:31,310 --> 00:34:35,290 Pagkatapos ang pagpapatupad ay dapat bayaran, at pagkatapos ay ang climactic CS50 Fair. 743 00:34:35,290 --> 00:34:38,070 Higit pang mga detalye sa lahat ng mga sa linggo na dumating. 744 00:34:38,070 --> 00:34:40,739 >> Ngunit sabihin bumalik sa isang bagay lumang paaralan - 745 00:34:40,739 --> 00:34:41,920 muli, isang array. 746 00:34:41,920 --> 00:34:45,040 Kaya array ay isang magaling, sapagkat ito malulutas nito problema tulad ng nakita natin lamang 747 00:34:45,040 --> 00:34:49,290 ilang sandali ang nakalipas may mga istraktura mag-aaral pagkuha ng kaunti sa labas ng kontrol kung namin 748 00:34:49,290 --> 00:34:52,405 nais na magkaroon ng mag-aaral ng isa, dalawang mag-aaral, tatlong mag-aaral, mag-aaral na tuldok tuldok tuldok, 749 00:34:52,405 --> 00:34:54,400 ilang arbitrary na numero ng mga mag-aaral. 750 00:34:54,400 --> 00:34:58,850 >> Kaya array, ng ilang linggo ang nakalipas, sa swooped at nalutas ang lahat ng aming mga problema ng hindi 751 00:34:58,850 --> 00:35:03,340 pag-alam nang maaga kung gaano karaming mga bagay ng ilang mga uri maaari naming gusto. 752 00:35:03,340 --> 00:35:07,390 At nakakita kami na structs ay maaaring makatulong sa amin higit pang ayusin ang aming mga code at panatilihing 753 00:35:07,390 --> 00:35:11,660 conceptually katulad na variable, tulad ng isang pangalan at ng bahay, sama-sama, kaya na namin 754 00:35:11,660 --> 00:35:15,570 maaaring tratuhin ang mga ito bilang isa entity, sa loob kung saan mayroong mga mas maliit na piraso. 755 00:35:15,570 --> 00:35:17,810 >> Ngunit array ay may ilang mga disadvantages. 756 00:35:17,810 --> 00:35:19,780 Ano ang ilan sa mga disadvantages nakita kaming 757 00:35:19,780 --> 00:35:22,320 may array kaya ngayon? 758 00:35:22,320 --> 00:35:23,450 Ano iyan? 759 00:35:23,450 --> 00:35:28,130 Fixed laki - kaya kahit na maaari mong magagawang magtalaga ng memory para sa isang 760 00:35:28,130 --> 00:35:32,310 array, sa sandaling alam mo kung gaano karaming mga mag-aaral mayroon ka, kung gaano karaming mga character na mayroon kang 761 00:35:32,310 --> 00:35:35,460 mula sa gumagamit, sa oras na iyong inilaan ang array, mo na ang uri ng lagyan ng kulay 762 00:35:35,460 --> 00:35:36,740 ang iyong sarili sa isang sulok. 763 00:35:36,740 --> 00:35:40,600 >> Dahil hindi ka maaaring magpasok ng mga bagong elemento sa gitna ng isang array. 764 00:35:40,600 --> 00:35:43,660 Hindi ka maaaring magpasok ng higit pang mga elemento sa dulo ng isang array. 765 00:35:43,660 --> 00:35:47,750 Talagang, kailangan mong resort sa paglikha ng isang buong bagong array, bilang namin tinalakay, 766 00:35:47,750 --> 00:35:49,320 pagkopya sa lumang sa bagong. 767 00:35:49,320 --> 00:35:52,610 At muli, iyon ay ang sakit ng ulo na GetString deal na may para sa iyo. 768 00:35:52,610 --> 00:35:56,170 >> Ngunit muli, kahit na hindi ka maaaring magpasok ng isang bagay sa gitna ng array 769 00:35:56,170 --> 00:35:58,200 kung ang rate ay hindi ganap na puno. 770 00:35:58,200 --> 00:36:03,010 Halimbawa, kung ito array dito ng laki anim lamang ay may limang bagay na nasa loob nito, 771 00:36:03,010 --> 00:36:06,080 na rin, maaari mo lamang magtamtak isang bagay papunta sa dulo. 772 00:36:06,080 --> 00:36:08,200 Ngunit ano kung nais mong magpasok ng isang bagay sa gitna ng 773 00:36:08,200 --> 00:36:11,280 array, kahit na maaaring mayroon limang out ng anim na mga bagay sa loob nito? 774 00:36:11,280 --> 00:36:14,250 >> Well, kung ano ang ginagawa namin kapag nagkaroon kami lahat sa aming mga boluntaryo ng tao onstage sa 775 00:36:14,250 --> 00:36:15,110 nakaraang linggo? 776 00:36:15,110 --> 00:36:18,710 Kung gusto naming ilagay ang isang tao dito, alinman sa ang mga taong ito kung paano upang ilipat ito 777 00:36:18,710 --> 00:36:22,540 paraan, o ang mga taong ito kung paano upang ilipat ito paraan, at iyon ay naging mahal. 778 00:36:22,540 --> 00:36:26,950 Ang paglilipat ng mga tao sa loob ng isang array nagtapos ang pagdaragdag ng up at nagkakahalaga ng 779 00:36:26,950 --> 00:36:31,240 oras sa amin, kaya marami sa aming mga n squared panahon ng pagtakbo tulad ng pagpapasok ng uri, para sa 780 00:36:31,240 --> 00:36:32,550 Halimbawa, sa pinakamasama kaso. 781 00:36:32,550 --> 00:36:36,520 Kaya array ay mahusay, ngunit mayroon kang i- alam nang maaga kung gaano kalaki ang gusto mo ang mga ito. 782 00:36:36,520 --> 00:36:38,030 >> Kaya OK, narito ang isang solusyon. 783 00:36:38,030 --> 00:36:43,860 Kung hindi ko alam nang maaga kung gaano karaming mga mag-aaral ay maaaring ba akong magkaroon, at alam ko isang beses 784 00:36:43,860 --> 00:36:47,870 Magpasya ko, kahit na, ako natigil na may maraming mga mag-aaral, bakit hindi ko na lang lagi 785 00:36:47,870 --> 00:36:51,740 magtalaga ng dalawang beses ng mas maraming espasyo bilang ay maaaring sa tingin ko kailangan ko? 786 00:36:51,740 --> 00:36:54,450 Iyan ba ay hindi isang makatwirang solusyon? 787 00:36:54,450 --> 00:36:58,240 >> Realistically, Hindi sa tingin ko na kami ay pagpunta sa kailangan ng higit sa 50 mga puwang ng 788 00:36:58,240 --> 00:37:02,190 sa isang array para sa isang medium-size na klase, kaya sabihin lamang paglilikom. 789 00:37:02,190 --> 00:37:07,040 Magtatagal ako gumawa ng 100 mga puwang sa aking array, lamang upang maaari naming siguradong makuha ang 790 00:37:07,040 --> 00:37:10,330 bilang ng mga mag-aaral na inaasahan kong maging sa ilang mga medium-size na class. 791 00:37:10,330 --> 00:37:14,320 Kaya bakit hindi lamang paglilikom at maglaan mas memory, karaniwan, para sa isang array 792 00:37:14,320 --> 00:37:16,290 kaysa sa tingin mo na maaari mong kahit na kailangan? 793 00:37:16,290 --> 00:37:20,190 Ano ito simpleng pushback sa na ideya? 794 00:37:20,190 --> 00:37:21,440 >> Lamang ka pag-aaksaya memory. 795 00:37:21,440 --> 00:37:25,350 Literal bawat programa sumulat ka pagkatapos siguro ay gumagamit ng dalawang beses bilang magkano ang memorya ng 796 00:37:25,350 --> 00:37:26,680 ang talagang kailangan. 797 00:37:26,680 --> 00:37:28,990 At na lamang ay hindi pakiramdam tulad ng isang lalo eleganteng solusyon. 798 00:37:28,990 --> 00:37:31,990 Higit pa rito, ito lamang ay nababawasan ang posibilidad ng isang problema. 799 00:37:31,990 --> 00:37:35,300 Kung mangyari sa iyo na magkaroon ng isang popular na kurso isa semestre at mayroon kang 101 800 00:37:35,300 --> 00:37:39,610 mga mag-aaral, ang iyong programa ay pa rin sa panimula nakaharap sa parehong isyu. 801 00:37:39,610 --> 00:37:44,280 >> Kaya thankfully, mayroong isang solusyon upang ad na ito ang lahat ng aming mga problema sa anyo 802 00:37:44,280 --> 00:37:46,790 ng mga istraktura ng data na mas kumplikado kaysa sa mga bago 803 00:37:46,790 --> 00:37:47,970 nasaksihan namin kaya sa ngayon. 804 00:37:47,970 --> 00:37:50,530 Ito, inaangkin ko, ay isang naka-link na listahan. 805 00:37:50,530 --> 00:37:51,920 Ito ay isang listahan ng mga numero ng - 806 00:37:51,920 --> 00:37:54,970 9, 17, 22, 26, at 34 - 807 00:37:54,970 --> 00:38:00,120 na nai-link nang magkasama sa pamamagitan ng paraan ng kung ano ang ko na iginuhit ng mga arrow. 808 00:38:00,120 --> 00:38:03,580 >> Sa ibang salita, kung Nais kong kumatawan isang array, maaari kong gawin 809 00:38:03,580 --> 00:38:04,910 isang bagay na katulad nito. 810 00:38:04,910 --> 00:38:07,310 At makikita ko bang ilagay ito sa overhead sa loob lamang ng ilang sandali. 811 00:38:07,310 --> 00:38:09,970 Maaari kong gawin - 812 00:38:09,970 --> 00:38:12,520 kumusta, ang lahat ng karapatan. 813 00:38:12,520 --> 00:38:14,470 Stand sa pamamagitan ng. 814 00:38:14,470 --> 00:38:17,360 Bagong computer dito, malinaw - 815 00:38:17,360 --> 00:38:18,090 lahat ng karapatan. 816 00:38:18,090 --> 00:38:21,730 >> Kaya kung mayroon akong mga numerong ito sa array - 817 00:38:21,730 --> 00:38:28,880 9, 17, 22, 26, 24 - 818 00:38:28,880 --> 00:38:30,530 hindi kinakailangan upang masukat. 819 00:38:30,530 --> 00:38:33,730 Ang lahat ng mga karapatan, kaya dito ay ang aking array - 820 00:38:33,730 --> 00:38:34,980 oh aking diyos. 821 00:38:34,980 --> 00:38:38,700 822 00:38:38,700 --> 00:38:40,395 Ang lahat ng mga karapatan, kaya dito ay ang aking array. 823 00:38:40,395 --> 00:38:44,110 824 00:38:44,110 --> 00:38:45,050 Oh aking diyos. 825 00:38:45,050 --> 00:38:48,820 >> [Tawa] 826 00:38:48,820 --> 00:38:49,440 >> David MALAN: magpanggap. 827 00:38:49,440 --> 00:38:52,330 Ito'y masyadong magkano ang pagsisikap upang bumalik at ayusin na, kaya doon - 828 00:38:52,330 --> 00:38:54,290 26. 829 00:38:54,290 --> 00:38:57,650 Kaya mayroon kaming ito array ng 9, 17, 22, 26, at 34. 830 00:38:57,650 --> 00:39:00,260 Para sa mga mo makita ang nakakahiyang pagkakamali ko lang ginawa, 831 00:39:00,260 --> 00:39:00,830 Mayroon bang ito ay. 832 00:39:00,830 --> 00:39:04,490 >> Kaya inaangkin ko na ito ay isang napaka mahusay na solusyon. 833 00:39:04,490 --> 00:39:07,310 Ko na inilalaan ng maraming mga ints bilang Kailangan ko - isa, dalawa, tatlo, 834 00:39:07,310 --> 00:39:09,100 apat, lima, o anim - 835 00:39:09,100 --> 00:39:11,660 at pagkatapos ko na naka-imbak ang mga numero sa loob ng array na ito. 836 00:39:11,660 --> 00:39:15,220 Ngunit ipagpalagay, pagkatapos, gusto kong isingit ng halaga tulad ng mga numero ng 8? 837 00:39:15,220 --> 00:39:16,100 Well, kung saan ay ito pumunta? 838 00:39:16,100 --> 00:39:18,530 Ipagpalagay na gusto kong isingit isang numero tulad ng 20. 839 00:39:18,530 --> 00:39:19,790 Well, kung saan ay ito pumunta? 840 00:39:19,790 --> 00:39:23,160 Mayroon bang isang lugar sa gitna, o ang bilang 35 ay may upang pumunta 841 00:39:23,160 --> 00:39:24,010 sa isang lugar sa dulo. 842 00:39:24,010 --> 00:39:25,320 Ngunit Ako lahat nang puwang. 843 00:39:25,320 --> 00:39:29,120 >> At kaya ito ay isang pangunahing hamon ng array na ay ang solusyon. 844 00:39:29,120 --> 00:39:32,280 I-claim ng ilang sandali ang nakalipas, GetString malulutas nito ang problemang ito. 845 00:39:32,280 --> 00:39:37,380 Kung nais mong isingit 1/6 na numero sa array na ito, kung ano ang hindi bababa sa isang 846 00:39:37,380 --> 00:39:40,090 solusyon maaari mong umasa sa para sigurado, tulad ng ginagawa namin sa GetString? 847 00:39:40,090 --> 00:39:44,340 848 00:39:44,340 --> 00:39:46,030 Ano iyan? 849 00:39:46,030 --> 00:39:48,190 >> Well, gawin itong mas malaki na ay mas madaling sinabi kaysa sa tapos na. 850 00:39:48,190 --> 00:39:52,810 Hindi kinakailangan namin magagawa ang array mas malaki, ngunit kung ano ang maaari naming gawin? 851 00:39:52,810 --> 00:39:56,570 Gumawa ng isang bagong array na mas malaki, laki ng 6, o marahil size 10, kung gusto naming 852 00:39:56,570 --> 00:40:00,490 upang makakuha ng maaga ng mga bagay, at pagkatapos ay kopyahin ang lumang array sa bago, at pagkatapos ay 853 00:40:00,490 --> 00:40:01,680 magbakante ang lumang array. 854 00:40:01,680 --> 00:40:05,770 >> Ngunit ano ang tumatakbo oras ngayon ng na proseso? 855 00:40:05,770 --> 00:40:09,870 Ito ay malaki ng O n, dahil ang pagkopya ay pagpunta sa gastos sa iyo ng ilang mga yunit ng 856 00:40:09,870 --> 00:40:13,480 oras, kaya hindi kaya mainam kung kami ay may sa magtalaga ng isang bagong array, na kung saan ay pagpunta 857 00:40:13,480 --> 00:40:15,610 upang ubusin dalawang beses bilang magkano pansamantalang memory. 858 00:40:15,610 --> 00:40:16,660 Kopyahin lumang sa bagong - 859 00:40:16,660 --> 00:40:18,800 Ibig kong sabihin, ito lamang ay isang sakit ng ulo, na ay, muli, kung bakit kami ay sumulat 860 00:40:18,800 --> 00:40:19,920 GetString para sa iyo. 861 00:40:19,920 --> 00:40:21,380 >> Kaya kung ano ang maaari naming gawin sa halip? 862 00:40:21,380 --> 00:40:25,000 Well, kung ano kung ang aming data istraktura talaga ay may gaps sa ito? 863 00:40:25,000 --> 00:40:30,790 Ipagpalagay na ako mamahinga ang aking mga layunin ng pagkakaroon ng magkadikit chunks ng memorya, kung saan 9 864 00:40:30,790 --> 00:40:34,500 ay sa tabi mismo ng 17, na kung saan ay sa tabi mismo ng 22, at iba pa. 865 00:40:34,500 --> 00:40:39,570 >> At ipagpalagay na 9 ay maaaring maging sa paglipas dito sa RAM, at 17 ay maaaring sa paglipas dito sa RAM, 866 00:40:39,570 --> 00:40:40,990 at 22 ay maaaring sa paglipas dito sa RAM. 867 00:40:40,990 --> 00:40:43,610 Sa ibang salita, hindi ko kailangan ang mga ito kahit na i-back-back na ngayon. 868 00:40:43,610 --> 00:40:47,850 Ko na lang ay upang kahit papaano thread ng karayom sa pamamagitan ng bawat isa sa mga numero, o bawat 869 00:40:47,850 --> 00:40:51,010 ng mga nodes, dahil kakailanganin naming tawagan ang parihaba bilang ko na iginuhit sa kanila, upang 870 00:40:51,010 --> 00:40:55,670 matandaan kung paano makapunta sa huling tulad node mula sa unang. 871 00:40:55,670 --> 00:40:59,940 >> Kaya kung ano ang programming ang bumuo nasaksihan namin medyo kamakailan na kung saan ako 872 00:40:59,940 --> 00:41:03,030 maaaring ipatupad na thread, o iginuguhit dito, na kung saan ang maaari kong 873 00:41:03,030 --> 00:41:05,430 ipatupad ang mga arrow? 874 00:41:05,430 --> 00:41:06,500 Kaya payo, tama? 875 00:41:06,500 --> 00:41:09,560 Kung maglaan ako hindi lamang isang int, ngunit isang node - at sa pamamagitan ng 876 00:41:09,560 --> 00:41:10,810 node, ko lang ang ibig sabihin ng lalagyan. 877 00:41:10,810 --> 00:41:12,900 At biswal, ibig sabihin ako ng isang parihaba. 878 00:41:12,900 --> 00:41:16,420 Kaya node isang wari ay kailangang upang maglaman ng dalawang halaga - 879 00:41:16,420 --> 00:41:21,490 ang int mismo, at pagkatapos, tulad ng ipinahiwatig sa pamamagitan ng ibabang kalahati ng mga parihaba, 880 00:41:21,490 --> 00:41:23,010 sapat na puwang para sa isang int. 881 00:41:23,010 --> 00:41:26,130 >> Kaya lang iniisip maaga dito, kung paano malaki ay node na ito, ito 882 00:41:26,130 --> 00:41:27,170 lalagyan na pinag-uusapan? 883 00:41:27,170 --> 00:41:29,250 Gaano karaming bytes para sa int? 884 00:41:29,250 --> 00:41:31,310 Siguro 4, kung ito ay katulad ng dati. 885 00:41:31,310 --> 00:41:33,270 At pagkatapos ay kung gaano karaming mga byte para ang pointer? 886 00:41:33,270 --> 00:41:33,650 4. 887 00:41:33,650 --> 00:41:37,940 Kaya ito lalagyan, o ito node, ay pagpunta sa maging isang 8-byte na istraktura. 888 00:41:37,940 --> 00:41:41,760 Oh, at iyan ay isang masaya na pagkakatulad lang namin ipinakilala ang pagkaunawa ng 889 00:41:41,760 --> 00:41:44,400 isang struct, o isang C istraktura. 890 00:41:44,400 --> 00:41:48,890 >> Kaya inaangkin ko na gusto kong gumawa ng isang hakbang patungo ito na mas sopistikadong 891 00:41:48,890 --> 00:41:52,560 pagpapatupad ng isang listahan ng mga numero, isang naka-link na listahan ng mga numero, kailangan kong gawin ang isang 892 00:41:52,560 --> 00:41:56,920 kaunti pa pag-iisip up harap at ipinapahayag hindi lamang sa isang int, ngunit isang struct 893 00:41:56,920 --> 00:41:58,620 na Tatawag ako, conventionally dito, node. 894 00:41:58,620 --> 00:42:01,630 Maaari naming tumawag ito anumang bagay na gusto namin, ngunit node ay magiging pampakay ng maraming 895 00:42:01,630 --> 00:42:03,560 ng mga bagay na sisimulan namin ang pagtingin sa ngayon. 896 00:42:03,560 --> 00:42:06,480 >> Sa loob ng na node ay isang int n. 897 00:42:06,480 --> 00:42:09,350 At pagkatapos ay ang syntax na ito, ang kaunti kakaiba sa unang tingin - 898 00:42:09,350 --> 00:42:12,960 struct node * susunod. 899 00:42:12,960 --> 00:42:16,900 Well pictorially, ano iyon? 900 00:42:16,900 --> 00:42:21,000 Iyon ay sa ilalim na kalahati ng ang parihaba na aming nakita 901 00:42:21,000 --> 00:42:22,730 sandali lamang ang nakalipas. 902 00:42:22,730 --> 00:42:27,600 >> Ngunit bakit ako sinasabi struct node * na taliwas sa lamang node *? 903 00:42:27,600 --> 00:42:31,370 Dahil kung pointer na nakaturo ang sa isa pang node, ito lamang ang 904 00:42:31,370 --> 00:42:32,760 address ng isang node. 905 00:42:32,760 --> 00:42:35,630 Iyon ay pare-pareho sa kung ano na namin napag-usapan tungkol sa mga payo kaya sa ngayon. 906 00:42:35,630 --> 00:42:39,690 Ngunit bakit, kung inaangkin ko ang istraktura na ito ay tinatawag na node, kailangan kong sabihin struct 907 00:42:39,690 --> 00:42:42,660 node loob dito? 908 00:42:42,660 --> 00:42:43,190 >> Mismong. 909 00:42:43,190 --> 00:42:46,490 Ito ay uri ng isang ugok katotohanan ng C. Ang typedef, kaya na magsalita, ay hindi 910 00:42:46,490 --> 00:42:47,220 nangyari pa. 911 00:42:47,220 --> 00:42:48,510 C ay sobrang literal. 912 00:42:48,510 --> 00:42:51,050 Ito bumabasa ng iyong code sa tuktok ibaba, kaliwa hanggang kanang. 913 00:42:51,050 --> 00:42:54,930 At hanggang sa ito ay umabot na tuldok-kuwit sa bottom line, hulaan kung ano ang hindi 914 00:42:54,930 --> 00:42:57,590 umiiral bilang isang uri ng data? 915 00:42:57,590 --> 00:42:59,060 Node, quote magpanipi node. 916 00:42:59,060 --> 00:43:03,050 >> Ngunit dahil sa ang higit pa masyadong masalita deklarasyon ginawa ko sa unang linya - 917 00:43:03,050 --> 00:43:05,340 typedef struct node - 918 00:43:05,340 --> 00:43:08,790 dahil iyon ay dumating una, bago ang kulot tirante, na ang uri ng mga tulad ng 919 00:43:08,790 --> 00:43:11,800 pre-educating kalatungin na, mo malaman kung ano ang, ninyo ako ng struct 920 00:43:11,800 --> 00:43:13,570 tinatawag struct node. 921 00:43:13,570 --> 00:43:16,270 Lantaran, hindi ko gusto pagtawag bagay struct node, struct node lahat 922 00:43:16,270 --> 00:43:17,090 sa buong aking code. 923 00:43:17,090 --> 00:43:20,660 Ngunit kukunin ko na lang gamitin ito nang isang beses, lamang loob, sa gayon ay maaari ko nang epektibo 924 00:43:20,660 --> 00:43:25,010 lumikha ng isang uri ng pabilog na sanggunian, hindi isang pointer sa sarili ko per se, ngunit isang 925 00:43:25,010 --> 00:43:29,400 pointer sa isa pang ng ang isang kaparehong uri. 926 00:43:29,400 --> 00:43:32,330 >> Kaya ito lumiliko out na sa isang istraktura ng data tulad nito, mayroong ilang 927 00:43:32,330 --> 00:43:34,470 operasyon na maaaring maging ng interes sa amin. 928 00:43:34,470 --> 00:43:37,460 Maaari naming nais upang ipasok sa isang listahan na tulad nito. 929 00:43:37,460 --> 00:43:39,850 Maaari naming gusto mong tanggalin ang mula sa isang listahan na tulad nito. 930 00:43:39,850 --> 00:43:43,490 Maaari naming nais upang maghanap sa listahan para sa isang halaga, o sa mas pangkalahatang paraan, pagtawid. 931 00:43:43,490 --> 00:43:46,410 At pagdaraan lamang ang isang magarbong paraan ng sinasabi ng mga pagsisimula sa kaliwa at ilipat ang lahat ng 932 00:43:46,410 --> 00:43:47,650 mga paraan sa kanan. 933 00:43:47,650 --> 00:43:52,640 >> At notice, kahit na may ito bahagyang higit pa sopistikadong istraktura ng data, sabihin 934 00:43:52,640 --> 00:43:56,510 ipanukala sa akin na maaari naming humiram ng ilang mga ang ideya ng nakalipas na dalawang linggo at 935 00:43:56,510 --> 00:43:58,410 ipatupad ang isang function na tinatawag na maghanap ganito. 936 00:43:58,410 --> 00:44:01,360 Ito ay pagpunta sa bumalik totoo o hindi totoo, na nagpapahiwatig, oo o 937 00:44:01,360 --> 00:44:03,390 walang, n ay nasa listahan. 938 00:44:03,390 --> 00:44:05,960 Ang pangalawang argumento ay isang pointer sa listahan ng sarili nito, kaya isang 939 00:44:05,960 --> 00:44:07,920 pointer sa isang node. 940 00:44:07,920 --> 00:44:10,350 >> Ang lahat ng mga pupuntahan ko pagkatapos gawin ay idedeklara isang pansamantalang variable. 941 00:44:10,350 --> 00:44:12,730 Susubukan naming tumawag ito ptr sa pamamagitan ng convention, para pointer. 942 00:44:12,730 --> 00:44:15,220 At magtalaga ko ito katumbas ng simula ng listahan. 943 00:44:15,220 --> 00:44:16,680 >> At ngayon mapansin ang habang loop. 944 00:44:16,680 --> 00:44:20,640 Kaya't hangga't pointer ay hindi kapantay sa null, pupuntahan ko check. 945 00:44:20,640 --> 00:44:24,520 Ay pointer arrow n katumbas ng sa n na nakapasa sa? 946 00:44:24,520 --> 00:44:26,410 At maghintay ng isang minuto - bagong piraso ng syntax. 947 00:44:26,410 --> 00:44:29,324 Ano ang arrow lahat ng isang biglaang? 948 00:44:29,324 --> 00:44:30,574 Oo? 949 00:44:30,574 --> 00:44:34,200 950 00:44:34,200 --> 00:44:34,810 >> Mismong. 951 00:44:34,810 --> 00:44:38,860 Kaya samantalang ng ilang minuto ang nakalipas, ginamit namin ang tuldok notasyon upang ma-access ang isang bagay 952 00:44:38,860 --> 00:44:43,080 sa loob ng isang struct ang, kung ang variable mo ay hindi ang struct 953 00:44:43,080 --> 00:44:47,420 mismo, ngunit isang pointer sa isang struct, thankfully, isang piraso ng syntax na 954 00:44:47,420 --> 00:44:48,620 sa wakas ay ginagawang madaling maunawaan kahulugan. 955 00:44:48,620 --> 00:44:52,360 Arrow Ang ibig sabihin nito upang sundin ang pointer, tulad ng ating mga arrow karaniwang ibig sabihin 956 00:44:52,360 --> 00:44:56,570 pictorially, at pumunta sa data field sa loob. 957 00:44:56,570 --> 00:44:59,700 Kaya arrow ay ang parehong bagay bilang tuldok, ngunit mo itong gamitin kapag mayroon kang isang pointer. 958 00:44:59,700 --> 00:45:05,270 >> Kaya lang sa paglalagom pagkatapos, kung ang patlang na n sa loob ng struct tinatawag pointer 959 00:45:05,270 --> 00:45:07,760 katumbas ay katumbas n, nagbabalik ng tunay. 960 00:45:07,760 --> 00:45:11,970 Kung hindi man, ang linyang ito dito - pointer ay katumbas ng pointer susunod. 961 00:45:11,970 --> 00:45:17,540 Kaya kung ano ito ay paggawa, paunawa, ay kung ako ako ay kasalukuyang nagtuturo sa struct 962 00:45:17,540 --> 00:45:21,430 na naglalaman ng 9, at 9 ay hindi ang bilang Naghahanap ako - ipagpalagay Naghahanap ako 963 00:45:21,430 --> 00:45:22,830 para n katumbas ng 50 - 964 00:45:22,830 --> 00:45:25,930 Pupunta ako sa update ang aking pansamantalang pointer upang hindi ituro sa node na ito 965 00:45:25,930 --> 00:45:31,190 ngayon, ngunit ang pointer ng arrow sa tabi, na ay pagpunta sa ilagay up ako dito. 966 00:45:31,190 --> 00:45:34,270 >> Ngayon, napagtanto ko ay isang ipoipo pagpapakilala. 967 00:45:34,270 --> 00:45:37,380 Sa Miyerkules, ipapakita namin talagang gawin ito na may ilang mga kawani na tao at may ilan pa 968 00:45:37,380 --> 00:45:38,900 code sa isang mas mabagal na bilis. 969 00:45:38,900 --> 00:45:42,990 Ngunit napagtanto, ngayon ginagawa namin ang aming data kaayusan na mas kumplikado upang ang aming 970 00:45:42,990 --> 00:45:45,780 mga algorithm ay maaaring makakuha ng mas mahusay, na ay magiging bagay na kailangan para sa 971 00:45:45,780 --> 00:45:50,500 pset anim, kapag kami sa load, muli, mga 150,000 mga salita, ngunit kailangan na gawin ito 972 00:45:50,500 --> 00:45:55,650 mahusay, at may perpektong, lumikha ng programa na tumatakbo para sa aming mga gumagamit ay hindi sa 973 00:45:55,650 --> 00:46:00,460 linear, hindi sa n squared, ngunit sa pare-pareho ang oras, sa tamang-tama. 974 00:46:00,460 --> 00:46:02,300 >> Gagamitin namin ang nakikita mo sa Miyerkules. 975 00:46:02,300 --> 00:46:07,240 >> Tagapagsalita: Sa susunod na CS50, David forgets kanyang base kaso. 976 00:46:07,240 --> 00:46:12,770 >> David MALAN: At na kung paano mo ipadala mga text message na may C. Ano ang - 977 00:46:12,770 --> 00:46:14,020 >> [Iba't-ibang mga TEXT MESSAGE NOTIFICATION tunog] 978 00:46:14,020 --> 00:46:19,734