1 00:00:00,000 --> 00:00:02,200 [Powered by Google Translate] [Linggo 3] 2 00:00:02,200 --> 00:00:03,950 [David J. Malan - Harvard University] 3 00:00:03,950 --> 00:00:07,140 [Ito ay CS50. - CS50.TV] 4 00:00:07,140 --> 00:00:10,720 Hayaan akong kapong torete sa amin sa direksyon kung saan namin tumigil huling beses, 5 00:00:10,720 --> 00:00:13,890 na nagsisimula sa tingin ng kaunti pa kaysa tungkol sa syntax 6 00:00:13,890 --> 00:00:17,150 at sinusubukang mag-isip ng kaunti mas kaunti tungkol sa lahat ng mga detalye 7 00:00:17,150 --> 00:00:20,630 na tumatagal ng kaunting oras upang mahirati sa klima upang sa gayon ay malayo sa mga tuntunin ng semicolons 8 00:00:20,630 --> 00:00:22,360 at panaklong at kulot tirante, 9 00:00:22,360 --> 00:00:25,630 upang simulan ang pagkuha ng mga bagay ng kaunti sa isang mas mataas na antas ng haka-haka 10 00:00:25,630 --> 00:00:28,800 sa gayon ay ang mga problema na namin ngayon simulan ang paglutas sa susunod na ilang linggo 11 00:00:28,800 --> 00:00:32,340 pagpunta sa may kasangkot higit pa sa mas mataas na antas ng haka-haka problema 12 00:00:32,340 --> 00:00:36,310 at isang bit mas mababa sa syntactical habang ikaw ay makakuha ng iyong mga paa basa 13 00:00:36,310 --> 00:00:40,090 at ang iyong mga kamay sa marumi na may ilang ng syntax mula sa mga nakaraang ilang linggo. 14 00:00:40,090 --> 00:00:43,690 >> Kaya manariwa sa diwa na ang huling linggo ipinakilala namin ang paniwala na ito ng isang array. 15 00:00:43,690 --> 00:00:49,320 At isang array sa Ingles ay inilarawan bilang kung ano? >> [Hindi marinig na mag-aaral tugon] 16 00:00:49,320 --> 00:00:51,710 Paumanhin? 17 00:00:51,710 --> 00:00:54,810 Isang koleksyon ng mga? >> [Hindi marinig na mag-aaral tugon] >> Okay, mabuti. 18 00:00:54,810 --> 00:00:57,820 Isang koleksyon ng mga item. Kaya nakita namin ang mga array sa scratch. 19 00:00:57,820 --> 00:01:01,880 Kung ikaw nangyari upang gamitin para sa pset 0 isa ng scratch sa listahan na maaari mong i-drag ang mga bagay 20 00:01:01,880 --> 00:01:05,410 tulad ng mga dalandan at saging sa, isang imbentaryo ng mga uri, 21 00:01:05,410 --> 00:01:07,100 na uri ng tulad ng kung ano ang isang array. 22 00:01:07,100 --> 00:01:10,980 At pagkatapos ay mas technically, sa konteksto ng isang aktwal na computer, 23 00:01:10,980 --> 00:01:14,730 array ay simpleng magkadikit na tipak ng memorya. 24 00:01:14,730 --> 00:01:18,590 Sa ibang salita, mayroon kang isang byte, isa pang byte, pagkatapos ibang byte, pagkatapos ay isa pang byte, 25 00:01:18,590 --> 00:01:21,330 at kung ikaw ay upang gumuhit ng mga bytes sa isang larawan, 26 00:01:21,330 --> 00:01:24,510 sila na bumalik upang i-back i-back upang i-back. Iyon ay kung ano ang ibig sabihin namin sa pamamagitan ng magkadikit. 27 00:01:24,510 --> 00:01:26,690 >> Kaya byte numero 1, pagkatapos 2, pagkatapos 3. 28 00:01:26,690 --> 00:01:29,680 Hindi ito nangangahulugan dito, hanggang dito, hanggang dito, dito. 29 00:01:29,680 --> 00:01:33,800 Array ay isang magkadikit na tipak ng 0 o higit pa bytes. 30 00:01:33,800 --> 00:01:36,160 Kaya kung ano ang mga ito ay kapaki-pakinabang para? 31 00:01:36,160 --> 00:01:40,090 Manariwa sa diwa namin ay ang ganitong uri ng contrived halimbawa ng mga marka ng pagsusulit ng pag-iimbak ng mga tao sa isang programa 32 00:01:40,090 --> 00:01:42,580 upang makalkula ang average ng iyong pagsusulit para sa ilang mga kurso, 33 00:01:42,580 --> 00:01:46,780 at isipin ang na maaari naming simulan ang pagsusulat ng programang iyon sa pamamagitan ng deklarasyon ng variable quiz1. 34 00:01:46,780 --> 00:01:49,550 Pagkatapos kami isa pang variable na tinatawag na quiz2. 35 00:01:49,550 --> 00:01:52,030 Ngunit kung mayroong 3 pagsusulit sa klase, quiz4. 36 00:01:52,030 --> 00:01:55,710 O kung mayroong ay isang lingguhang pagsusulit, ito ay quiz5, quiz6, quiz7. 37 00:01:55,710 --> 00:01:58,520 Kaya nais mong magkaroon ng lahat ng mga variable na ito na ipinahayag sa loob ng pangunahing 38 00:01:58,520 --> 00:02:00,470 o sa iba pang lugar sa iyong programa, 39 00:02:00,470 --> 00:02:03,870 at ang problema sa diskarte na, madaling bagaman ito ay upang kopyahin lamang at i-paste, 40 00:02:03,870 --> 00:02:06,120 ito lamang napakabilis magiging mahirap gamitin. 41 00:02:06,120 --> 00:02:09,360 Huwag sana iyong aktwal na 30 Pagsusulit o 50 mga pagsusulit. 42 00:02:09,360 --> 00:02:12,080 Kung ito ay tulad ng isang mataas na paaralan ng estilo pang-araw-araw na pop pagsusulit, 43 00:02:12,080 --> 00:02:15,910 pagkatapos mo lamang ridiculously mahaba listahan ng mga variable na ipinahayag, 44 00:02:15,910 --> 00:02:17,780 at ito lamang masyadong mabilis nakakaabala ng control. 45 00:02:17,780 --> 00:02:20,820 Ito ay pangit, mahirap upang mapanatili, kaya mas madali upang gumawa ng typo 46 00:02:20,820 --> 00:02:23,910 kung makakakuha ka ng 1 bilang namali sa isang lugar sa iyong programa. 47 00:02:23,910 --> 00:02:26,800 >> Kaya ipinakilala namin ang paniwala ng isang array sa halip. 48 00:02:26,800 --> 00:02:30,760 At isipin ang na ipinatupad namin ang program na ito sa pamamagitan ng paggawa ng isang maliit na bagay tulad nito. 49 00:02:30,760 --> 00:02:33,950 Hayaan akong pumunta sa Source ngayon 3 Lunes direktoryo 50 00:02:33,950 --> 00:02:37,160 at buksan array, na nakita natin ang huling beses. 51 00:02:37,160 --> 00:02:39,940 At kahit na mayroong ilang mga bagong trick C dito, 52 00:02:39,940 --> 00:02:41,920 kasama ng mga ito ang paniwala ng isang pare-pareho, 53 00:02:41,920 --> 00:02:47,140 isipin ang na namin ipinahayag maramihang mga kamay mahalagang sa pamamagitan ng gamit ang syntax na ito: 54 00:02:47,140 --> 00:02:51,750 Float, pagkatapos ay ang pangalan ng variable, pagkatapos ginamit namin square tirante talagang para sa unang pagkakataon, 55 00:02:51,750 --> 00:02:55,450 at kung ano ang ginawa namin sa loob ng mga parisukat na tirante ay epektibong maglagay ng numero. 56 00:02:55,450 --> 00:02:59,780 Ngunit sa halip ng paglalagay ng numero, ko bang ilagay ito capitalized salita, Pagsusulit. 57 00:02:59,780 --> 00:03:03,220 At kung ano ang pagganyak para sa paglalagay ng capitalized na salita tulad ng mga pagsusulit 58 00:03:03,220 --> 00:03:08,170 at pagkatapos gamit ang nanlilinlang linya 17 dito upang aktwal na bigyan na ang isang numero? 59 00:03:08,170 --> 00:03:11,240 Ano ang pagganyak doon? Oo. 60 00:03:11,240 --> 00:03:13,360 >> [Hindi marinig na mag-aaral tugon] >> Mismong. 61 00:03:13,360 --> 00:03:16,630 Kung gusto naming upang baguhin ang halaga 2, lamang namin upang baguhin ito sa 1 lugar 62 00:03:16,630 --> 00:03:19,680 dahil isaalang-alang - hindi ko matandaan kung ano ang programang ito ginawa eksakto, 63 00:03:19,680 --> 00:03:22,040 ngunit kung ikaw lang sagap mo ang pagsusulit, pagsusulit. 64 00:03:22,040 --> 00:03:24,720 Mo ang pagsusulit, pababa dito mas Pagsusulit. 65 00:03:24,720 --> 00:03:28,180 Kaya kung hindi namin ginawa ito pare-pareho, ang paggamit ng matalim tukuyin, 66 00:03:28,180 --> 00:03:33,320 ay na-type namin 2, pagkatapos ay 2, pagkatapos ay 2, pagkatapos ay 2, na fine. Ito ay tulad ng tamang. 67 00:03:33,320 --> 00:03:36,220 Ngunit ipagpalagay na sa susunod na taon mayroon kaming 3 pagsusulit sa CS50. 68 00:03:36,220 --> 00:03:39,190 Kaya Mayroon akong pumunta at i-update ang code, mayroon akong mag-recompile ito, 69 00:03:39,190 --> 00:03:43,820 ngunit ang problema kung gawin ko ng damit na bobo, tulad Tinatanaw ko 1 pagbanggit ng 2 70 00:03:43,820 --> 00:03:46,750 at kalimutang i-plug sa 3, ang buong programa ay maaaring mahusay na masira. 71 00:03:46,750 --> 00:03:48,720 Kaya lang kami humihingi para sa pag-. 72 00:03:48,720 --> 00:03:53,170 >> Kaya ang paniwala ng isang pare-pareho ang lahat ng tungkol sa factoring ang ilang mga piraso ng data, 73 00:03:53,170 --> 00:03:56,070 kung ito ay isang string o isang pansamantalang trabaho o Float o anumang, 74 00:03:56,070 --> 00:04:00,070 at deklarasyon ito ng 1 lugar sa gayon na maaari mong mas kaagad na baguhin ito sa hinaharap. 75 00:04:00,070 --> 00:04:03,660 At ito rin, lantaran, bit mas madali upang mabasa dahil kung sa tingin mo lamang ng ito ngayon, 76 00:04:03,660 --> 00:04:07,840 ito pagsusulit, o maaari naming kahit na palitan ang pangalan ito ng isang bagay tulad ng NUMBER_OF_QUIZZES 77 00:04:07,840 --> 00:04:09,430 o ng isang bagay na mas tahasang. 78 00:04:09,430 --> 00:04:11,830 Ang code nagiging ng kaunti pa halata sa kung ano ang ginagawa, 79 00:04:11,830 --> 00:04:15,780 at iniisip mo ng kaunti mas mababa kung ano ang numero ng 2 maaaring mangyari sa ibig sabihin. 80 00:04:15,780 --> 00:04:18,920 Kaya ang constant may walang kinalaman sa panimula may array. 81 00:04:18,920 --> 00:04:22,990 Array na ay ipinakilala sa pamamagitan ng mga parisukat na tirante. 82 00:04:22,990 --> 00:04:26,610 >> Kaya mapapansin na sa linya 23, hinihiling namin ang gumagamit, "Ano ang iyong mga marka ng pagsusulit?" 83 00:04:26,610 --> 00:04:31,120 Pagkatapos lamang namin ito loop na tila nagtatanong sa gumagamit para sa kanilang mga grado. Paano? 84 00:04:31,120 --> 00:04:37,460 Ito iterates mula 0 sa 2. At sinasabi ko 2 dahil pagsusulit sa lahat ng caps ay kasalukuyang 2. 85 00:04:37,460 --> 00:04:42,310 Kaya ito iterates mula 0 hanggang sa 2 at pagkatapos ng mga Kopya out Pagsusulit # isang bagay ng isang bagay, 86 00:04:42,310 --> 00:04:45,830 at pagkatapos ito ay gumagamit ng GetFloat upang makakuha ng isang halaga mula sa mga gumagamit. 87 00:04:45,830 --> 00:04:49,050 Kaya mapansin ito lamang ang iba pang mga bagong piraso ng syntax mula sa huling Miyerkules. 88 00:04:49,050 --> 00:04:53,120 Kung gusto mo upang mag-imbak ng isang bagay sa isang partikular na lokasyon sa array na, 89 00:04:53,120 --> 00:04:55,460 ka na muling gamitin ang mga square bracket. 90 00:04:55,460 --> 00:04:57,030 >> Kaya may isang bit ng paghihiwalay sa dalawang bahagi dito. 91 00:04:57,030 --> 00:04:59,040 Ang unang pagkakataon na ginamit mo ang mga square bracket 92 00:04:59,040 --> 00:05:02,250 gamitin mo ito upang tukuyin kung gaano kalaki ang nais mong array na. 93 00:05:02,250 --> 00:05:06,580 Ngunit ito sa tabi konteksto dito kung saan namin muli nagpapatupad ng mga square bracket 94 00:05:06,580 --> 00:05:10,540 ay nangangahulugan na kung saan sa na array ang gusto mong ilagay ang ilang mga halaga? 95 00:05:10,540 --> 00:05:13,650 At ang pagkakaiba dito natukoy na mula sa konteksto. 96 00:05:13,650 --> 00:05:17,130 Mapansin dito kami ay may isang uri ng data, pagkatapos ay mayroon namin ang pangalan ng variable, 97 00:05:17,130 --> 00:05:20,770 mayroon kaming aming mga parisukat na tirante na may isang numero ng loob, semicolon. Iyan na ang lahat. 98 00:05:20,770 --> 00:05:22,290 Kaya na ng deklarasyon. 99 00:05:22,290 --> 00:05:28,390 Ito ay tulad ng kahit na namin ay tapos na isang bagay tulad ng Float grade1; Float grade2; 100 00:05:28,390 --> 00:05:31,730 ngunit muli, ito masyadong mabilis devolves sa paraan masyadong maraming kopya, i-paste, 101 00:05:31,730 --> 00:05:34,260 kaya sa halip lang namin pinasimple ito bilang tulad, 102 00:05:34,260 --> 00:05:38,800 na nangangahulugan na mula ngayon mayroon kami ng grado na maaaring naka-imbak sa bracket 0, 103 00:05:38,800 --> 00:05:41,760 kami ay may isa pang grado na maaaring naka-imbak sa bracket 1, 104 00:05:41,760 --> 00:05:46,890 ngunit kung ano kung ako loko at, halimbawa, ang aking loop napupunta sa ngayon - 105 00:05:46,890 --> 00:05:48,740 halimbawa, gumawa ako ito mas mababa sa o patas sa, 106 00:05:48,740 --> 00:05:50,620 kung saan manariwa sa diwa ay ang pinagmulan ng isang nakaraang bug - 107 00:05:50,620 --> 00:05:55,590 na epektibong ay nangangahulugan na sa ilang mga ikatlong aksidenteng pag-ulit na ito loop 108 00:05:55,590 --> 00:06:00,380 Gamitin ko bracket 2. Epektibo, kung ano ang maaaring mangyari dito? Paumanhin? 109 00:06:00,380 --> 00:06:02,860 [Mag-aaral] Ito ay pagpunta sa mapapalitan. >> Ay pagpunta sa papalitan? 110 00:06:02,860 --> 00:06:04,520 Ano ang gusto papalitan? 111 00:06:04,520 --> 00:06:10,890 Ito literal ay sinasabi na palitan kung ano ang sa lokasyon 2 ang return halaga ng GetFloat. 112 00:06:10,890 --> 00:06:13,690 Ngunit ang problema ay kung gaano kalaki ang array sa puntong ito sa kuwento? 113 00:06:13,690 --> 00:06:17,730 [Hindi marinig na mag-aaral ng tugon] >> array pa rin lamang ng laki 2 114 00:06:17,730 --> 00:06:22,730 dahil ang array, tulad ng anumang variable, ay ipinahayag una, bago namin ito ginamit, 115 00:06:22,730 --> 00:06:27,220 at hindi na namin tinukoy dito dahil sa ito pare-pareho na mayroon akong 2 grado na ako pagpunta sa ilagay. 116 00:06:27,220 --> 00:06:29,930 >> Ngunit tandaan, ang mga siyentipiko ng computer na magbilangan mula 0. 117 00:06:29,930 --> 00:06:33,620 Kaya ang unang lokasyon sa array na bracket 0. 118 00:06:33,620 --> 00:06:40,210 Ang susunod na lokasyon ay 1. Ang bagay na ito ay napaka bahagyang Masyadong malayo sa gilid. 119 00:06:40,210 --> 00:06:42,870 Kaya sa ibang salita, kung aktwal na ako ay may array na ito - 120 00:06:42,870 --> 00:06:46,790 at hayaan mo akong makita kung gaano kahusay ito cooperates dito para sa amin - 121 00:06:46,790 --> 00:06:52,360 kung mayroon akong isang array na lamang ko na iguguhit tulad ng sumusunod 122 00:06:52,360 --> 00:06:56,750 at ko na inilalaan puwang para sa 2 elemento, maaari ko gumuhit ito tulad nito sa memory 123 00:06:56,750 --> 00:06:58,020 kung saan ito malaking puting canvas. 124 00:06:58,020 --> 00:07:00,920 Lang ang RAM ko sa aking computer, isang karetela ng RAM, 2 gig ng RAM, anumang, 125 00:07:00,920 --> 00:07:05,400 ngunit ang 2 kahon ngayon indibidwal na kumakatawan sa isang Float, 32 bit. 126 00:07:05,400 --> 00:07:10,860 Kaya kung ko bang ilagay ang 1 bilang dito tulad ng 1.0, pagkatapos ko bang ilagay ang isa pang numero dito tulad ng 3.2 127 00:07:10,860 --> 00:07:15,280 ngunit gagawin ko bracket 2, na tulad ng paglalagay ng isang bagay dito. 128 00:07:15,280 --> 00:07:17,820 At ng larawan ay nagmumungkahi, mayroong wala doon. 129 00:07:17,820 --> 00:07:20,450 Ito ay uri ng tulad ng lupa walang tao dahil hindi ako tanungin ang operating system 130 00:07:20,450 --> 00:07:23,550 upang bigyan ako ng ikatlong pagsusulit na ito. 131 00:07:23,550 --> 00:07:26,940 Kung ginawa ko nais na ikatlong pagsusulit, dapat ko ay ang pag-iintindi sa kinabukasan 132 00:07:26,940 --> 00:07:31,700 tanungin ang operating system para sa ito sa pamamagitan ng deklarasyon pagsusulit na hindi 2 133 00:07:31,700 --> 00:07:34,210 ngunit sa halip na katumbas ng 3. 134 00:07:34,210 --> 00:07:39,000 >> Kaya sa ibang salita, ang mga larawan na namin epektibong sa kamay ganito ang hitsura dito. 135 00:07:39,000 --> 00:07:42,260 Ito muli ay lupa walang tao. Namin mas mahusay na hindi subukan ang pagsusulat ng mga halaga dito. 136 00:07:42,260 --> 00:07:45,300 Ngunit muli, dahil ang mga siyentipiko computer na mabibilang mula 0, 137 00:07:45,300 --> 00:07:49,520 kapag makipag-usap namin tungkol sa lokasyon na ito sa array, na dapat na lokasyon 0, 138 00:07:49,520 --> 00:07:53,890 ito ay dapat na lokasyon 1, at ito ay hindi kahit na umiiral 139 00:07:53,890 --> 00:07:57,380 dahil ipinapakita lang namin tinanong ang operating system para sa 2 tulad lugar. 140 00:07:57,380 --> 00:08:00,130 Kaya ang mga may bago programming na karanasan mula sa iba pang mga wika 141 00:08:00,130 --> 00:08:04,150 maaaring malaman na hindi ito palagi ang kaso sa array o bagay na tinatawag vectors. 142 00:08:04,150 --> 00:08:06,930 Sa halip, maaari mo lamang panatilihin ang pagdaragdag at pagdaragdag at magdagdag ng mga bagay sa array, 143 00:08:06,930 --> 00:08:10,720 kung saan, lantaran, kami ay na kakayahan sa simula at pa namin mukhang binigyan ito dito 144 00:08:10,720 --> 00:08:15,160 dahil may C programa mas tahasang. 145 00:08:15,160 --> 00:08:17,980 Lamang ito sa iyo at sa computer ngayon, at computer ay lamang gawin 146 00:08:17,980 --> 00:08:19,530 kung ano ang iyong sabihin sa ito upang gawin. 147 00:08:19,530 --> 00:08:24,270 Kaya kung mo lamang sabihin dito upang bigyan ka ng 2 kamay sa pamamagitan ng paraan ng linya 22 dito, 148 00:08:24,270 --> 00:08:27,640 na ang lahat ng ka pagpunta upang makakuha ng pabalik mula sa operating system: puwang para sa 2. 149 00:08:27,640 --> 00:08:34,049 >> Kaya nagiging ang iyong mga programa upang paminsan-minsan maraming surot tungkol sa array. 150 00:08:34,049 --> 00:08:37,520 Ito lamang ang uri ng likas na katangian ng mga hayop kung saan ang lahat sa atin ay maaaring magkamali, 151 00:08:37,520 --> 00:08:42,490 at sa ilang mga punto ay malamang index higit sa hangganan ng iyong array. 152 00:08:42,490 --> 00:08:45,980 At ito lamang ay isang magarbong paraan ng pagsabi ka nagpunta sa bracket ng isang bagay 153 00:08:45,980 --> 00:08:49,970 at isang bagay ay lamang masyadong malaki ng isang numero. Pinuntahan mo lagpas sa mga hangganan ng iyong array. 154 00:08:49,970 --> 00:08:51,530 Ngunit nakabaligtad ngayon ay ito. 155 00:08:51,530 --> 00:08:54,990 Ang ibang bahagi ng programang ito ay talagang ay wala sa panimula gawin sa array. 156 00:08:54,990 --> 00:08:58,180 Lahat ng ito ay tungkol sa ilang simpleng aritmetika para sa mga average ng computing. 157 00:08:58,180 --> 00:09:03,200 Kaya mayroon kaming dito sa ito para sa loop dito unang isang variable na tinatawag na kabuuan na namin initialize sa 0. 158 00:09:03,200 --> 00:09:09,020 Pagkatapos namin umulit mula 0 hanggang sa 2 muli at idagdag namin na variable pagbubuo 159 00:09:09,020 --> 00:09:12,620 ith grado, kaya bracket 0 pagkatapos bracket 1. 160 00:09:12,620 --> 00:09:15,130 At pagkatapos ay bilang na gusto mong gawin sa mababang paaralan upang makalkula ang average, 161 00:09:15,130 --> 00:09:19,420 lamang namin na kabuuan, hatiin ang mga ito sa pamamagitan ng kabuuang bilang ng mga pagsusulit, 162 00:09:19,420 --> 00:09:22,520 at pagkatapos ay para sa magandang panukalang tinatawag naming isang function dito tinatawag na round. 163 00:09:22,520 --> 00:09:28,580 >> Ngayon, bilang isang bukod, ano ang deal na ito parenthetical int sa linya 34? 164 00:09:28,580 --> 00:09:31,730 Maaaring ay nasa seksyon, hindi talaga uusapang tungkol dito pormal dito, 165 00:09:31,730 --> 00:09:35,210 ngunit kung ano ang int na ito sa parens marahil ginagawa? >> [Hindi marinig na mag-aaral tugon] 166 00:09:35,210 --> 00:09:38,500 Oo, ito ay tumutukoy sa Casting o typecasting, 167 00:09:38,500 --> 00:09:41,690 na nangangahulugan paglalaan 1 uri ng data at nagko-convert ang mga ito sa isa pang. 168 00:09:41,690 --> 00:09:45,400 Hindi mo maaaring gawin ito sa lahat ng mga uri ng data dahil minsan ito ay isang bit kakaiba. 169 00:09:45,400 --> 00:09:49,640 Ngunit sa kasong ito, kung ang return halaga ng ikot ng Float 170 00:09:49,640 --> 00:09:53,880 dahil, pagkatapos ang lahat, ako paglalaan ng Float at paghahati nito sa pamamagitan ng isang numero tulad ng 2, 171 00:09:53,880 --> 00:09:55,840 Ako pagpunta upang makakuha muli ng Float. 172 00:09:55,840 --> 00:10:00,760 Ngunit grado tao ng paaralan ay hindi talagang gusto malaman na ang kanilang mga average ay 93.4 173 00:10:00,760 --> 00:10:04,420 dahil makikita nila Napagtanto sila ay kailanman kaya malapit na 95 rounding point. 174 00:10:04,420 --> 00:10:09,540 >> Kaya gusto namin sa halip na gamitin ang int upang isalin ang lahat sa pinakamalapit na int, 175 00:10:09,540 --> 00:10:12,730 kung alin sa kasong ito ay pagpunta sa 94 na walang punto matapos itong. 176 00:10:12,730 --> 00:10:14,530 Sa gayon ay isang maliit na matematika nanlilinlang. 177 00:10:14,530 --> 00:10:17,570 At kami na bumalik sa ang paniwala na ito ng paghahagis dahil ito ang mga implikasyon, 178 00:10:17,570 --> 00:10:21,640 kung hindi mo pa natuklasan na, para sa problema-set 2. 179 00:10:21,640 --> 00:10:25,210 Kaya ang isang array pagkatapos, maaari mong isipin ang - ito ngumiti sa akin ang lahat ng araw. 180 00:10:25,210 --> 00:10:27,830 Mukhang ito kung ikaw gumuhit ng larawan ng, 181 00:10:27,830 --> 00:10:31,460 ngunit ang susi ay sukat na iyon din ang napili mo 182 00:10:31,460 --> 00:10:34,050 kapag hiniling mo ito mula sa operating system. 183 00:10:34,050 --> 00:10:39,460 Anumang mga katanungan pagkatapos ay sa array? Oo. 184 00:10:39,460 --> 00:10:47,080 [Hindi marinig na mag-aaral tanong] 185 00:10:47,080 --> 00:10:49,310 Ah, magandang tanong. 186 00:10:49,310 --> 00:10:53,150 Ang tanong ay kung ano ang mangyayari sa ang null 0 sa array? Ito ay hindi umiiral sa konteksto na ito. 187 00:10:53,150 --> 00:10:57,430 Na umiiral lamang sa konteksto ng mga string, kung saan hindi namin tungkol sa darating sa sandali lamang. 188 00:10:57,430 --> 00:11:02,300 Ngunit para sa isang array, tulad ng sa kasong ito, ang lahat ng makakuha ka kung ano ang hihilingin sa iyo ang operating system para sa. 189 00:11:02,300 --> 00:11:04,050 >> At bilang isang bukod, baka ito ay hindi malinaw, 190 00:11:04,050 --> 00:11:07,030 Panatilihin ko na nagsasabi hinihiling mo ang operating system, tanungin ang operating system. 191 00:11:07,030 --> 00:11:10,090 Isang operating system, tulad ng malamang na alam, Mac OS, Windows, Linux. 192 00:11:10,090 --> 00:11:13,560 Kapag ikaw ay pagtawag sa function tulad GetFloat 193 00:11:13,560 --> 00:11:19,280 o ikaw ay deklarasyon variable tulad ng grado, 194 00:11:19,280 --> 00:11:23,200 sa pagtatapos ng araw epektibong ikaw ay humihingi ng ibang tao upang bigyan ka na memory 195 00:11:23,200 --> 00:11:25,940 sapagkat hindi namin bilang minimithi ng mga programmer 196 00:11:25,940 --> 00:11:28,800 walang ideya kung paano aktwal na makakuha ng pisikal na access sa memorya. 197 00:11:28,800 --> 00:11:31,100 Ngunit may ginagawa: operating system. 198 00:11:31,100 --> 00:11:36,630 Kaya bukod sa pagtatanghal sa amin na may mga kaakit-akit na mga icon at mga menu at mga folder at ang mga tulad ng 199 00:11:36,630 --> 00:11:39,050 na nakikita mo sa iyong desktop, kung ang isang Mac o PC, 200 00:11:39,050 --> 00:11:42,240 operating system ay ang mababang antas ng pangmundo mga bagay, 201 00:11:42,240 --> 00:11:44,680 ang mataas na teknikal na mga bagay-bagay ng pamamahala ng gigabyte 202 00:11:44,680 --> 00:11:48,780 o 2 gigabytes ng memorya na mayroon kang, pamamahala ng CPU na mayroon kang, at iba pa. 203 00:11:48,780 --> 00:11:50,170 Kaya kapag sumusulat ka ng code, 204 00:11:50,170 --> 00:11:53,900 ikaw talaga hooking in sa iyong operating system sa na kahulugan. 205 00:11:53,900 --> 00:11:55,720 Ako pagpunta upang ma-minimize na. Ayos lang. 206 00:11:55,720 --> 00:11:59,980 >> Iba pang mga tanong tungkol sa mga array? 207 00:12:00,330 --> 00:12:02,520 Hindi? Okay. 208 00:12:02,520 --> 00:12:06,680 Kaya transition natural mula sa mga array ay talagang sa isang paksa na ng kaunti pamilyar. 209 00:12:06,680 --> 00:12:09,570 At kami ay tumingin napaka maikling sa huling beses na ito. 210 00:12:09,570 --> 00:12:12,500 Ito ay isang halimbawa ng string mula Miyerkules. 211 00:12:12,500 --> 00:12:15,060 Ang string na ito halimbawa ay isang medyo simpleng programa, 212 00:12:15,060 --> 00:12:18,120 at aktwal ko na pinasimpleng ito sa pamamagitan ng ilang mga linya para sa mga layuning ngayon. 213 00:12:18,120 --> 00:12:22,680 Lahat ng ito ginagawa sa linya 19 ay makakuha ng isang string mula sa gumagamit, nag-iimbak ito sa isang variable na tinatawag na mga. 214 00:12:22,680 --> 00:12:28,670 Pagkatapos sa linya 22 pasulong tila ito ay pag-print na string 1 character sa bawat linya. 215 00:12:28,670 --> 00:12:30,730 Ngunit paano ito ginagawa ito? 216 00:12:30,730 --> 00:12:33,350 Kami ng deklarasyon ng variable i, ang pagtatakda katumbas ng 0, 217 00:12:33,350 --> 00:12:35,770 at ito ay nagiging lumang ugali ngayon. 218 00:12:35,770 --> 00:12:39,270 Hindi namin nakita ito hanggang Miyerkules, ngunit maaari mong uri ng magpakilala mula sa pangalan nito 219 00:12:39,270 --> 00:12:44,610 strlen lamang nagbabalik ano kapag ibinigay s? Ang haba ng string. 220 00:12:44,610 --> 00:12:47,940 Kaya kung pumasa ko ito ng isang string, quote-magpanipi David, 221 00:12:47,940 --> 00:12:51,810 sana ito bumalik sa akin ang bilang 5 dahil sa David. 222 00:12:51,810 --> 00:12:55,600 Upang ang layunin nito sa buhay ay isang string, kung hard code mo 223 00:12:55,600 --> 00:12:58,840 o sa kasong ito ay naka-plug in bilang isang variable, bilang isang argument, 224 00:12:58,840 --> 00:13:01,980 at figure na ito kung ano ang haba ng string na. 225 00:13:01,980 --> 00:13:06,470 >> Kaya dito ngayon kami ay paghiram ilang pagtatanda mula sa nakaraang halimbawa ng pagsusulit. 226 00:13:06,470 --> 00:13:09,390 Na ito ay walang gawin sa kamay, may walang gawin sa pagsusulit, 227 00:13:09,390 --> 00:13:13,100 ngunit ito lumiliko out na ang maliit na maliit na kasinungalingan namin ang nagsasabi sa iyo dahil linggo 1 228 00:13:13,100 --> 00:13:16,330 ay na ang isang string ay hindi talaga umiiral sa C. 229 00:13:16,330 --> 00:13:20,230 Isang string sa pagtatapos ng araw ay talagang isang array lamang. 230 00:13:20,230 --> 00:13:25,140 Ang isang hanay ng mga byte, kaya byte, byte, byte, byte, kung manariwa sa diwa ay 8 bits, 231 00:13:25,140 --> 00:13:28,130 kaya tipak ng memorya, tipak ng memory, tipak ng memory, tipak ng memory. 232 00:13:28,130 --> 00:13:31,210 At ang mga paraan sa pamamagitan ng kung saan ang isang string ay ipinatupad 233 00:13:31,210 --> 00:13:33,070 sa pamamagitan ng paglalagay ng unang character dito, 234 00:13:33,070 --> 00:13:37,470 pagkatapos dito, pagkatapos dito, pagkatapos dito, bumalik upang i-back i-back sa memory ng computer. 235 00:13:37,470 --> 00:13:42,160 Kaya kung nais na baybayin ang isang salita tulad ng HELLO, nais mong ilagay ang 1 character na H, 236 00:13:42,160 --> 00:13:48,240 pagkatapos E, pagkatapos L pagkatapos L, pagkatapos O - 5 character sa kabuuang - isang lugar sa RAM ng iyong computer. 237 00:13:48,240 --> 00:13:52,080 Ngunit key detalye dito ay na sila ay pagpunta sa na bumalik upang i-back i-back sa likod, 238 00:13:52,080 --> 00:13:54,200 sa tabi mismo ng isa't isa. 239 00:13:54,200 --> 00:13:58,820 Kapag kapag sinasabi ko ang mga [i], kung ano sa Ingles ito nagbibigay sa akin? 240 00:14:01,240 --> 00:14:04,550 Ano ang mga [i] kumatawan sa kasong ito? Oo. 241 00:14:04,550 --> 00:14:07,800 >> [Mag-aaral] Ang ith character sa string. >> Mismong. Ang ith character sa string. 242 00:14:07,800 --> 00:14:12,260 Ngayon, ay i pagpunta sa magsimula sa 0 bawat aking para sa loop dito, 243 00:14:12,260 --> 00:14:14,850 ngunit mabuti dahil ang lahat ay nagsisimula pagbibilang mula 0. 244 00:14:14,850 --> 00:14:19,160 Kaya sa mga [0] ay upang kumatawan sa sulat H sa isang salita tulad ng HELLO, 245 00:14:19,160 --> 00:14:24,530 s [1] ay kumakatawan sa isang titik tulad ng E sa isang salita tulad ng HELLO, at iba pa. 246 00:14:24,530 --> 00:14:27,130 At kung ano ang mukhang namin na ginagawa sa bawat pag-ulit ng loop na ito 247 00:14:27,130 --> 00:14:32,780 ay pansamantalang pag-iimbak ang ith character sa isang variable na tinatawag c, na lamang pansamantalang trabaho, 248 00:14:32,780 --> 00:14:35,010 at pagkatapos kami ay pag-print out ang c 249 00:14:35,010 --> 00:14:37,620 kaya na sa pagtatapos ng araw kung ano ang programang ito ay ang mga sumusunod. 250 00:14:37,620 --> 00:14:42,900 Kung pumunta ako sa direktoryo ng pinagmulan at gumawa ako string1 at pumunta ako magpatuloy at patakbuhin string1, 251 00:14:42,900 --> 00:14:51,920 at pagkatapos ko i-type ng isang salita tulad ng HELLO, Ipasok, ang lahat ng ginagawa nito ay print ang 1 character sa isang pagkakataon. 252 00:14:51,920 --> 00:14:54,010 >> Kaya mayroong isang pagkakataon para sa pagpipino dito. 253 00:14:54,010 --> 00:14:58,150 Ako uri ng paggawa ng pang trabaho, kahit mas malinaw siguro ang paraan na ito, kaysa sa kinakailangan. 254 00:14:58,150 --> 00:15:03,270 Aling linya ng code dito ko marahil itapon sa kabuuan? Oo. 255 00:15:03,270 --> 00:15:08,290 Linya 24. Sa linya 24 ako deklarasyon ng variable c. 256 00:15:08,290 --> 00:15:14,320 Pag-iimbak ako ith character ng mga ito, ngunit pagkatapos ay gumagamit ako ng c dito. 257 00:15:14,320 --> 00:15:20,160 Kaya ako gumagamit ng c, kaya Pakiramdam ko ay tulad ng hindi lamang ako makapag magtapon linya 24 layo. 258 00:15:20,160 --> 00:15:23,850 [Hindi marinig na mag-aaral komento] >> Mismong. 259 00:15:23,850 --> 00:15:26,240 Kaya pagdating sa pakikipag-usap tungkol sa disenyo ng mga programa, 260 00:15:26,240 --> 00:15:30,740 mapapansin ang ganitong bahagyang pagpapagaan ng code, na kung saan ay tulad ng nababasa, 261 00:15:30,740 --> 00:15:34,680 ngunit mapagtanto na s isang variable, ang uri ng data ay isang array, 262 00:15:34,680 --> 00:15:38,610 upang s [i] ay lamang pagpunta upang agad na bumalik sa ith character sa string na. 263 00:15:38,610 --> 00:15:40,620 At kung gusto mong i-print ito, na fine. 264 00:15:40,620 --> 00:15:43,680 Mo lamang gamitin% c dahil hindi ka naka pag-print ng isang string, 265 00:15:43,680 --> 00:15:48,520 nagpi-print ka ng isang karakter sa isang string, at ito ay may masyadong ang epekto ng pag-print sa ith karakter. 266 00:15:48,520 --> 00:15:51,390 At isipin ang pagkakaiba lamang talagang mula sa nakaraang linggo na may gamit printf 267 00:15:51,390 --> 00:15:54,220 samantalang sa linggo nakaraan gusto naming gawin ang isang bagay na sobrang simple 268 00:15:54,220 --> 00:15:58,510 tulad ng placeholder ang% s pagkatapos ay ang pangalan ng isang string dito, 269 00:15:58,510 --> 00:16:01,190 ngayon ay hindi namin diving sa ng kaunti mas malalim sa ilalim ng hood at sinasabi, 270 00:16:01,190 --> 00:16:06,090 hindi i-print ang string, i-print ang isang karakter sa ganyang bagay. 271 00:16:06,090 --> 00:16:10,570 >> Upang maaari naming gawin ang isang bagay ng kaunti ibang dito dahil may 1 iba - hindi bug 272 00:16:10,570 --> 00:16:14,090 dahil ang programang ito ay karapatan, ngunit ako sa paggawa ng isang bagay bobo 273 00:16:14,090 --> 00:16:16,810 na nabanggit ko maikling sa Miyerkules. 274 00:16:16,810 --> 00:16:22,680 Ngunit iniisip pabalik, kung paano maaaring mapabuti ang disenyo programang ito kahit pa? Oo. 275 00:16:22,680 --> 00:16:28,280 [Hindi marinig na mag-aaral ng tugon] >> Oh, mabuti. 276 00:16:28,280 --> 00:16:32,120 Kaya isipin ang na ipinakilala namin ang isang ikalawang variable na tinatawag na n huling beses, 277 00:16:32,120 --> 00:16:34,850 na mukhang contradicting sa ating sarili dahil ang aking layunin ng isang segundo na nakalipas 278 00:16:34,850 --> 00:16:37,380 ay lamang itapon ang isang variable bilang hindi kinakailangang, 279 00:16:37,380 --> 00:16:40,700 ngunit isipin ang na sa Miyerkules namin ang aktwal na ginawa ito. 280 00:16:40,700 --> 00:16:46,170 Ko binago ang para sa loop sa aktwal na magkaroon ng isang kuwit dito, pagkatapos n = strlen, 281 00:16:46,170 --> 00:16:52,120 at pagkatapos ay sa paglipas dito ako ginawa i 00:16:57,660 Ano ang pangunahing makamit na ako pagkamit sa pamamagitan ng pagbabago sa aking Pinasimulan na ito 283 00:16:57,660 --> 00:17:01,590 at ang aking kondisyon na ito ngayon? >> [Hindi marinig na mag-aaral tugon] >> Mismong. 284 00:17:01,590 --> 00:17:06,170 Hindi ako recalling strlen muli at muli at muli dahil isipin ang kung paano para sa mga gawa loop. 285 00:17:06,170 --> 00:17:08,790 Kahit na simulan nila upang makakuha ng mas komplikado na anyo, 286 00:17:08,790 --> 00:17:12,480 isipin ang na ang mga bagay bago ang unang semicolon Pinasimulan, kung saan ang mangyayari sa sandaling. 287 00:17:12,480 --> 00:17:14,359 Ang kundisyon, bagaman, sa gitna, 288 00:17:14,359 --> 00:17:17,710 at ito ay makakakuha ng check sa bawat oras na pumunta ka sa pamamagitan ng loop. 289 00:17:17,710 --> 00:17:22,420 >> Kaya ito uri ng bobo na humihiling sa computer sa parehong tanong muli at muli - 290 00:17:22,420 --> 00:17:25,920 Ano ang haba ng HELLO? Ano ang haba ng HELLO? Ano ang haba ng HELLO? - 291 00:17:25,920 --> 00:17:29,740 dahil tulad ng makikita namin makita ngayon at sa Miyerkules, ito ay tiyak na kumuha ng oras, 292 00:17:29,740 --> 00:17:34,320 at ito ay hindi isang mahusay na paggamit ng oras dahil upang malaman kung ang haba ng string 293 00:17:34,320 --> 00:17:37,030 aktwal na tumatagal ng isang bit ng pagsisikap. 294 00:17:37,030 --> 00:17:39,760 Hindi madalian, tulad ng ito ay sa ilang mga wika. 295 00:17:39,760 --> 00:17:43,920 Kaya sa pamamagitan ng pagbabago na ito sa n, ang presyo ako nagbabayad ay ang? 296 00:17:43,920 --> 00:17:45,640 Kami ay nakikita ng trade-off dito. 297 00:17:45,640 --> 00:17:49,460 Ang maaari kong i-save ang oras sa pamamagitan ng hindi na humihiling sa parehong mapahamak tanong muli at muli, 298 00:17:49,460 --> 00:17:51,740 ngunit ito ay pagpunta sa gastos sa akin ng isang bagay, na kung saan ay kung ano? 299 00:17:51,740 --> 00:17:55,050 >> [Mag-aaral] mawalan ka ng isang tiyak na halaga ng memorya. >> Mismong. Ito ay pagpunta sa gastos sa akin ang ilang memory. 300 00:17:55,050 --> 00:17:56,670 Kaya sa kasong ito nagkakahalaga ito sa akin kung ano ang? 301 00:17:56,670 --> 00:18:01,530 Isa pang 32 bit dahil n isang int, tulad ng ipinahiwatig ng salita int dito. 302 00:18:01,530 --> 00:18:03,300 Ngunit ay na okay? 303 00:18:03,300 --> 00:18:05,800 Lantaran, na marahil okay dahil kung sa tingin mo tungkol dito, 304 00:18:05,800 --> 00:18:09,030 ang na string ay, ang mas maraming oras ako pupunta na aksaya 305 00:18:09,030 --> 00:18:11,920 dahil strlen ay pagpunta upang tinatawag na muli at muli at muli 306 00:18:11,920 --> 00:18:13,520 para sa bawat pag-ulit ng loop. 307 00:18:13,520 --> 00:18:18,070 At mga araw na ito, ang aking Mac ay may 2 gig ng RAM, mga araw na ito ng 4 na gig ng RAM minsan. 308 00:18:18,070 --> 00:18:22,420 Tingin ko ang maaari kong bayaran ang 4 ng mga bytes sa aktwal na mapabilis ang mga bagay up. 309 00:18:22,420 --> 00:18:26,590 Ngunit ito ay talaga ng trade-off at ng isang tema sa programming at sa computer science 310 00:18:26,590 --> 00:18:28,320 hindi talaga pagkuha ng anuman nang libre. 311 00:18:28,320 --> 00:18:32,880 Kung nais mong mapabuti ang isang bagay dito, mayroon kang magbayad para sa ito sa kabilang banda sa paanuman. 312 00:18:32,880 --> 00:18:35,880 Space kumpara sa oras sa kasong ito. 313 00:18:35,880 --> 00:18:40,700 >> Kaya ito ay ang lahat ng humahantong patungo sa isang bagay na misteriyoso tulad nito, 314 00:18:40,700 --> 00:18:44,070 kung saan, tulad ng malamang na naisip sa ngayon, aktwal sabi? 315 00:18:44,070 --> 00:18:47,420 [Hindi marinig na mag-aaral ng tugon] >> Oo, kaya ito ay, Maging sigurado sa uminom ang iyong Ovaltine, 316 00:18:47,420 --> 00:18:52,490 aktwal na gumagamit ng isang algorithm na tinatawag ROT13, Rot 1-3, 317 00:18:52,490 --> 00:18:55,500 kung saan ay nangangahulugan lamang i-rotate lahat ng titik 13 lugar, 318 00:18:55,500 --> 00:18:58,720 na nangangahulugan na tumagal A at pagkatapos ay idagdag ang 13 dito at pumunta tuldok, tuldok, tuldok 319 00:18:58,720 --> 00:19:04,640 ang lahat ng mga paraan upang ang ika-13 titik ang layo, gawin ang parehong bagay para sa B at para sa C at para sa D at iba pa. 320 00:19:04,640 --> 00:19:10,850 At kaya kung namin ang aktwal na-convert na ito dito gamit ang isang shift ng 13 mga lugar, 321 00:19:10,850 --> 00:19:14,580 babalikan ka namin sa kung ano ang maliit Ralphie ay may, na, Maging sigurado sa uminom ang iyong Ovaltine. 322 00:19:14,580 --> 00:19:18,160 Ngunit ngayon para sa problema-set 2, sa standard edition ng hindi bababa sa, 323 00:19:18,160 --> 00:19:21,680 mayroon kang uri ng ko ito enciphering iyong sarili, 324 00:19:21,680 --> 00:19:25,990 at mayroon kaming sa paanuman sa input tulad nito at i-encrypt ang mga ito o i-decrypt ito. 325 00:19:25,990 --> 00:19:29,850 >> Kaya kung saan ng mga batayan uri ng ay humahantong sa amin na pagkakataon? 326 00:19:29,850 --> 00:19:32,650 Natin tingnan sa ikatlong halimbawa dito. 327 00:19:32,650 --> 00:19:38,430 Una sa lahat, ito ay tinatawag na ASCII. Ano ang ASCII sumangguni bumalik sa? 328 00:19:38,430 --> 00:19:40,460 Amerikano Standard Code para sa Impormasyon Interchange, 329 00:19:40,460 --> 00:19:43,850 na ay isang talagang mahabang paraan ng sinasabi kung ano? Ano ang ASCII? 330 00:19:43,850 --> 00:19:47,890 [Hindi marinig na mag-aaral ng tugon] >> Ano iyon? >> [Mag-aaral] Ang isang character na mapa. >> A karakter mapa. 331 00:19:47,890 --> 00:19:51,390 Lang ito Maps mga numero sa mga titik dahil ang mundo ay may Standardized 332 00:19:51,390 --> 00:19:55,380 kung ano ang numero ay kumakatawan sa kung ano ang mga titik upang ang lahat sa atin ay maaaring gamitin ng mga computer 333 00:19:55,380 --> 00:19:59,340 at ang aming mga programa lahat lamang tugma pagdating sa pag-print ng mga bagay sa screen. 334 00:19:59,340 --> 00:20:04,680 Kaya isipin ang na 65 mangyayari upang kumatawan A, 97 ang mangyayari upang kumatawan sa lowercase ng. 335 00:20:04,680 --> 00:20:08,510 At kaya ito simpleng programa dito ASCII sinasamantala ng katotohanang iyon - 336 00:20:08,510 --> 00:20:12,770 na ang mundo alam na kabisera ay 65 - at pag-print sa pagma-map. 337 00:20:12,770 --> 00:20:16,320 >> Kaya bago namin sumisid sa ang code na ito, ipaalam sa akin sa halip buksan up ng isang terminal na window. 338 00:20:16,320 --> 00:20:21,550 Ipaalam sa akin magpatuloy at gumawa ang ASCII, at pagkatapos ay sabihin lamang patakbuhin lamang ang bagay na ito sa palayawin ang output. 339 00:20:21,550 --> 00:20:25,960 At ito lamang ito: talagang malaking chart na lamang na nagsasabi sa akin ang lahat ng iba't-ibang mga code 340 00:20:25,960 --> 00:20:27,950 para sa lahat ng iba't-ibang mga titik. 341 00:20:27,950 --> 00:20:32,100 Kaya isang napaka-simpleng programa, ngunit hindi ko magkaroon sa hard code mga 52 linya ng output: 342 00:20:32,100 --> 00:20:34,860 26 uppercase, 26 lowercase. 343 00:20:34,860 --> 00:20:37,790 Sa halip, ginawa ko ito programa na may dalawang mga loop. 344 00:20:37,790 --> 00:20:39,720 Pansinin kung ano ang ginawa ko dito. 345 00:20:39,720 --> 00:20:44,790 Ako iterated mula ay i 65 sa hanggang sa 65 + 26 dahil gusto ko upang i-print ang 26 titik 346 00:20:44,790 --> 00:20:49,860 sa ang Ingles na alpabeto, i + + sa bawat pag-ulit, at ngayon mapapansin ang ganitong muli. 347 00:20:49,860 --> 00:20:52,540 Ang pag-ulit ng aming kaibigan typecasting 348 00:20:52,540 --> 00:20:54,620 kung saan-convert ka ng 1 uri ng data sa isa pang 349 00:20:54,620 --> 00:20:57,480 dahil kung ano ang gusto kong gawin sa partikular na programa? 350 00:20:57,480 --> 00:21:02,650 Gusto kong bilangin ayon sa bilang dahil na kung paano ako lumaki nadaragdagan - 65, 66, 67, at iba pa - 351 00:21:02,650 --> 00:21:04,420 ngunit hindi ko nais upang i-print ang mga numero. 352 00:21:04,420 --> 00:21:08,030 Gusto kong i-print ang sulat na sinundan sa pamamagitan ng bilang. 353 00:21:08,030 --> 00:21:18,640 Gusto kong i-print A: numero, B: numero, ngunit maaari kong gawin ito na may parehong eksaktong variable. 354 00:21:18,640 --> 00:21:21,630 Kaya-print ko c% bilang isang placeholder para sa isang character, 355 00:21:21,630 --> 00:21:25,080 % D bilang isang placeholder para sa isang digit o numero. 356 00:21:25,080 --> 00:21:27,750 Pagkatapos kung ano ang ko plug in para sa mga 2 placeholder? 357 00:21:27,750 --> 00:21:33,960 Ko ang unang plug sa character na katumbas ng i, at pagkatapos ay i-print ko out i mismo. 358 00:21:33,960 --> 00:21:36,400 >> Kaya mapansin ito masyadong lang gumagana. 359 00:21:36,400 --> 00:21:39,320 Tulad ng maaari kong pinalayas mula sa isang Float sa isang int 360 00:21:39,320 --> 00:21:41,750 upang pumunta mula sa isang tunay na numero sa isang integer, 361 00:21:41,750 --> 00:21:46,100 dito ako maaaring pumunta mula sa isang int sa isang pansamantalang trabaho, na ng kaunti kakaiba - 362 00:21:46,100 --> 00:21:48,680 ay hindi masyadong-map papunta sa tunay na mundo - ngunit sa computer 363 00:21:48,680 --> 00:21:51,140 isang pansamantalang trabaho lang bilang sa ilalim ng hood, 364 00:21:51,140 --> 00:21:53,590 kaya kami ay napaka tahasang dito sa computer, na sinasabi, 365 00:21:53,590 --> 00:21:58,920 printf, mag-print na hindi ako bilang 65, i-print ito bilang ang numeric katumbas nito. 366 00:21:58,920 --> 00:22:02,110 At ito ay lumiliko out hindi ko technically kailangan ito. 367 00:22:02,110 --> 00:22:05,020 Ano ako paggawa ng ilang sandali ang nakalipas ay tahasang paghahagis 368 00:22:05,020 --> 00:22:08,760 sa pamamagitan ng pagtukoy kung ano ang uri ng data na gusto ko ang umalis mula sa at sa. 369 00:22:08,760 --> 00:22:11,840 Ngunit mapansin na Mayroon na akong ito placeholder% c 370 00:22:11,840 --> 00:22:14,930 at ang iba pang% c placeholder dito. 371 00:22:14,930 --> 00:22:18,880 Kahit na ito ay hindi int, computer napagtanto na ang isang pansamantalang trabaho, 372 00:22:18,880 --> 00:22:21,080 ito ay isang int sa ilalim ng hood. 373 00:22:21,080 --> 00:22:25,100 >> Kaya kung aktwal na ako mag-recompile ito at muling patakbuhin ang ASCII programa, 374 00:22:25,100 --> 00:22:31,210 mapansin ito pa rin lang gumagana dahil ang computer ay napagtanto na pagsusulatan ito. 375 00:22:31,210 --> 00:22:34,870 Ngayon, ito ay mas mahalaga upang gawin ang tahasang Casting sa mundo ng mga kamay sa mga ints 376 00:22:34,870 --> 00:22:37,460 dahil doon na aktwal na nagsasagawa ka ng isang kinakalkula desisyon: 377 00:22:37,460 --> 00:22:40,140 itapon ang lahat pagkatapos ng decimal point. 378 00:22:40,140 --> 00:22:44,990 Narito mayroong talagang walang itapon dahil ang karakter ng isang numero, 379 00:22:44,990 --> 00:22:48,220 at ang string ng isang array ng mga character. 380 00:22:48,220 --> 00:22:52,530 Kaya kapag ito ay oras sa pagpapatupad ng ilang mga pag-encrypt o decryption, 381 00:22:52,530 --> 00:22:56,770 paano ito na maaari naming aktwal na isalin ang isang bagay tulad ng ito bagay na walang kapararakan sa, 382 00:22:56,770 --> 00:22:58,670 Maging sigurado sa uminom ang iyong Ovaltine? 383 00:22:58,670 --> 00:23:02,700 Ano kung alam namin ngayon - ipaalam sa tumagal ng palagay - na ang key, 384 00:23:02,700 --> 00:23:08,010 ang bilang na kami ay umiikot ang lahat ng mga sulat na ito sa pamamagitan ng, ang bilang 13? 385 00:23:08,010 --> 00:23:11,800 Kaya namin nagpunta mula sa sulat B ang lahat ng mga paraan upang O sa simula ng pangungusap, 386 00:23:11,800 --> 00:23:14,710 Maging sigurado sa uminom ang iyong Ovaltine, dahil kung gagawin ko ang B 387 00:23:14,710 --> 00:23:19,600 at pagkatapos ay pumunta ako C, D, E, F, G, H, ako, J, K, L, M, N, O, 388 00:23:19,600 --> 00:23:23,760 na kung bakit ang pag-encrypt ng sulat ang B naging O 389 00:23:23,760 --> 00:23:26,570 dahil ko lang idinagdag 13 dito. 390 00:23:26,570 --> 00:23:33,460 >> Kaya kung gusto ko upang i-decrypt ito, mahalagang ko gumawa ng O at pagkatapos ay ibawas 13 mula dito. 391 00:23:33,460 --> 00:23:36,880 O, lantaran, dahil mayroong 26 titik sa alpabeto, ito ay kamangha-mangha simetriko, 392 00:23:36,880 --> 00:23:41,260 Maaari rin naming idagdag lamang 13 at babalikan ka namin sa B. sulat 393 00:23:41,260 --> 00:23:44,290 Ngunit kung paano mo pumunta tungkol sa pagpapatupad ng isang bagay tulad nito sa Caesar 394 00:23:44,290 --> 00:23:46,600 o talagang pagmamanipula ng mga string sa pangkalahatan? 395 00:23:46,600 --> 00:23:51,380 Kung ang titik B ay kung ano ang numero? 396 00:23:51,380 --> 00:23:55,290 Ano ang titik B? Kaya 66, sa kanan? 397 00:23:55,290 --> 00:23:59,220 Kaya kung ang titik ay 65 at ang titik B ay 66, 398 00:23:59,220 --> 00:24:03,940 kaya 66, ang lahat ng kailangan kong gawin ay magdagdag ng 13 dito, at ito ay nagbibigay sa akin 79. 399 00:24:03,940 --> 00:24:09,150 At kung pumunta kami sa aming maliit na impostor sheet, 79 katunayan mapa papunta O. 400 00:24:09,150 --> 00:24:11,290 >> Ngunit may isang bit ng isang kaso ng sulok dito. 401 00:24:11,290 --> 00:24:15,170 Ano, sabihin nating, ang sulat sa Z? 402 00:24:15,170 --> 00:24:20,180 Kung gagawin namin ang 66 + 25 upang makakuha ng ang lahat ng mga paraan sa dulo ng alpabeto, hindi namin sa 91. 403 00:24:20,180 --> 00:24:24,520 91 + 13 ay nagbibigay sa akin ng 104, at hulaan kung ano? 404 00:24:24,520 --> 00:24:29,200 104 ay hindi katumbas ng uppercase sulat. 405 00:24:29,200 --> 00:24:31,610 Natin bumalik sa isang maliit na impostor sheet dito. 406 00:24:31,610 --> 00:24:38,070 Kung ako muling patakbuhin ang program na ito sa paunawa appliance, na 104, kung pumunta ako pabalik sa window ng terminal, 407 00:24:38,070 --> 00:24:41,800 104 ay tila lowercase h. 408 00:24:41,800 --> 00:24:46,400 Kaya kailangan namin ng ilang mga pangunahing nanlilinlang dito upang tiyakin na kapag nagsimula kami sa Z 409 00:24:46,400 --> 00:24:50,260 at idagdag namin ang 13 dito hindi namin nais na lamang panatilihin ang forging magpatuloy sa mas malaki at mas malaking mga numero. 410 00:24:50,260 --> 00:24:52,600 Ano ang gagawin namin talagang gusto ko? 411 00:24:52,600 --> 00:24:54,570 Gusto mong I-wrap sa paligid. 412 00:24:54,570 --> 00:25:00,250 >> Kaya ito lumiliko out, bilang nakita mo marahil sa seksyon ngayon o sa spec ng set ng problema mismo 413 00:25:00,250 --> 00:25:05,730 natanto na mayroon ang iba pang mga operator sa C na din ay isang porsyento sign, 414 00:25:05,730 --> 00:25:11,020 ngunit kung saan namin ang ginagamit ng% dito upang tukuyin ang isang placeholder, 415 00:25:11,020 --> 00:25:15,420 malaman na, lalo na para sa mga problema sa set 2, mayroon ding isang bagay tulad nito: 416 00:25:15,420 --> 00:25:18,990 int x = y% z. 417 00:25:18,990 --> 00:25:22,770 Hayaan akong lamang ipakita ito bilang isang napaka-generic na paraan ng ito. 418 00:25:22,770 --> 00:25:25,580 Porsyento ay nangangahulugan na kung ano ang sa isang wika ng programming? >> [Mag-aaral] Modulo. 419 00:25:25,580 --> 00:25:28,790 Modulo, kung saan ay isang magarbong paraan ng sinasabi ang natitira. 420 00:25:28,790 --> 00:25:31,620 Kahit na ang isang bahagyang pagkakaiba na may kahulugan doon, 421 00:25:31,620 --> 00:25:37,210 nangangahulugan ito na hatiin y ng z ngunit hindi bumalik ang mga resulta ng dibisyon na; 422 00:25:37,210 --> 00:25:39,650 sa halip, bumalik ang natitira. 423 00:25:39,650 --> 00:25:47,390 >> Kaya kung y ay aktwal na 3 at z ay aktwal 2, 3 na hinati sa pamamagitan ng 2 1 na may natitira sa 1, 424 00:25:47,390 --> 00:25:51,550 kaya kung ano ang ginagawa ng x aktwal na katumbas sa sitwasyong ito? 1. 425 00:25:51,550 --> 00:25:54,540 Ito ay isang simpleng, mababang antas ideya. 426 00:25:54,540 --> 00:25:56,480 Tumatagal ng kaunting oras upang makakuha ng iyong isip na nakabalot sa paligid nito 427 00:25:56,480 --> 00:25:58,740 dahil marahil ito ay habang ang isang dahil kahit mo ay pinapahalagahan tungkol remainders 428 00:25:58,740 --> 00:26:01,160 at aktwal na gamitin ang mga ito para sa isang bagay mapakay, 429 00:26:01,160 --> 00:26:05,290 ngunit sa kasong ito ang simpleng katotohanan na maaari kang pumunta mula sa isang malaking numero tulad ng 3 430 00:26:05,290 --> 00:26:08,920 sa isang relatibong maliit na bilang tulad ng 2 at pagkatapos ay I-wrap sa paligid epektibo 431 00:26:08,920 --> 00:26:14,160 sa pamamagitan ng paggamit ng ang natitira sa isang mas maliit na halaga tulad ng 1 ay pagpunta sa maging isang napakahalaga nanlilinlang 432 00:26:14,160 --> 00:26:17,690 na maaari naming gamitin ang parehong para sa isang bagay tulad ng Caesar at ang iba pang mga bagay Vigenere 433 00:26:17,690 --> 00:26:22,240 sa problema magtakda ng 2, ngunit ito ay pagpunta sa isang umuulit na nanlilinlang sa buong semestre. 434 00:26:22,240 --> 00:26:24,880 Ito simple, simpleng ideya ng paglalaan ng natitira sa pangkalahatan 435 00:26:24,880 --> 00:26:26,530 pagpunta sa-daan sa amin upang I-wrap sa paligid. 436 00:26:26,530 --> 00:26:31,140 At bilang simulan namin sa paglalaro ng higit pa sa mga array, bilang simulan namin ang paglalaro ng higit pa sa memory mismo, 437 00:26:31,140 --> 00:26:35,800 ito ay upang maging higit pa at higit pa ng isang malakas na nanlilinlang. 438 00:26:35,800 --> 00:26:43,420 >> Kaya anumang mga katanungan pagkatapos ay sa ASCII o ang representasyon ng mga string bilang array? 439 00:26:43,420 --> 00:26:47,430 At isasaalang-alang namin ang mga ito 1 bingaw pa. Oo. 440 00:26:47,430 --> 00:26:52,350 [Hindi marinig na mag-aaral tanong] >> Magandang katanungan. 441 00:26:52,350 --> 00:26:55,370 Ano ang ibig sabihin kapag ang isang variable ay may asterisk sa unahan nito? 442 00:26:55,370 --> 00:26:57,720 Hayaan akong ipagpaliban pagsagot na sa anumang detalye, 443 00:26:57,720 --> 00:27:00,100 ngunit na tumutukoy sa isang paksa na kilala bilang isang pointer. 444 00:27:00,100 --> 00:27:03,440 Payo gawin sa memory, at hindi namin aktwal ngayon 445 00:27:03,440 --> 00:27:06,330 paglalaan ng unang hakbang patungo sa na talakayan, 446 00:27:06,330 --> 00:27:08,600 ngunit sa ngayon, hayaan mo akong magpanggap na ay hindi umiiral ang star 447 00:27:08,600 --> 00:27:15,380 at ipagpapatuloy namin ang pagtawag string string sa halip ng paggamit ng magpasinda *, 448 00:27:15,380 --> 00:27:19,530 kung saan malamang na iyong nakita bago at ko bang ilagay sa screen sa sandali lamang bilang isang teaser. 449 00:27:19,530 --> 00:27:23,010 Kaya makikita namin bumalik sa paraan mas detalyado kaysa marami sa inyo ay marahil gusto. 450 00:27:23,010 --> 00:27:25,760 Sa paglaon, hindi ngayon. Oo. 451 00:27:25,760 --> 00:27:42,810 >> [Hindi marinig na mag-aaral tanong] 452 00:27:42,810 --> 00:27:47,080 Sa anong konteksto mo upang magbigay ng mga mag-sign para sa isang character? >> [Mag-aaral] Oo. 453 00:27:47,080 --> 00:27:52,130 Kaya sa pamamagitan ng default, kapag hindi mo maglagay ng +, lamang positibong numero ay ipinapalagay. 454 00:27:52,130 --> 00:27:55,390 Kaya kung isulat ang numero 1, ito ay isang positibong 1. 455 00:27:55,390 --> 00:27:57,710 Kung iyong aktwal na nais upang tukuyin ang hindi pagsang-ayon ng isang halaga, 456 00:27:57,710 --> 00:28:01,060 mo literal na gawin ang -1 sa iyong keyboard. 457 00:28:01,060 --> 00:28:20,440 Ngunit ito ay marahil hindi ang iyong tanong. >> [Hindi marinig na mag-aaral tugon] 458 00:28:20,440 --> 00:28:22,200 >> Magandang tanong. Okay. 459 00:28:22,200 --> 00:28:24,970 Kaya ito ay may gawin, ipunin ko, may ilang uri ng mga bug pinatakbo mo sa 460 00:28:24,970 --> 00:28:27,640 dahil ikaw ay nagko-convert ng isang integer sa isang character, 461 00:28:27,640 --> 00:28:29,780 ngunit sa paanuman negatibiti nakuha kasangkot, 462 00:28:29,780 --> 00:28:32,380 at kaya ang character na lang dumating ang munged sa paanuman. 463 00:28:32,380 --> 00:28:36,710 Kaya sa ngayon, hayaan mo akong oversimplify ng kaunti hanggang dumating kami pabalik sa ganitong uri ng paksa. 464 00:28:36,710 --> 00:28:39,570 Sa ngayon, sa tingin ng mga bagay ganitong paraan - at ito ay isang oversimplification. 465 00:28:39,570 --> 00:28:43,500 Ngunit sa mundo ng isang integer, mayroon sa iyo kung gaano karaming mga piraso sa iyong pagtatapon? 466 00:28:43,500 --> 00:28:45,190 Mayroon kang 32 na bit. 467 00:28:45,190 --> 00:28:49,030 At kaya ngayon, kami uusapang tungkol sa kabuuang bilang ng mga integer maaari mong samakatuwid ay kumakatawan sa 468 00:28:49,030 --> 00:28:52,430 halos 4 bilyon sa kabuuang dahil mayroon kang 32 bit, 469 00:28:52,430 --> 00:28:55,100 kaya na 2 sa 32, kaya na halos 4 bilyong. 470 00:28:55,100 --> 00:28:58,810 Ngunit nakita namin sa isang linggo o 2 nakalipas na hindi mo talaga magkaroon ng isang hanay ng mga numero 471 00:28:58,810 --> 00:29:01,240 mula sa 0 sa hanggang sa 4 na bilyong. 472 00:29:01,240 --> 00:29:06,340 Hanay ang napupunta sa halip na mula sa halos negatibong 2 bilyong sa positibong 2 bilyong. 473 00:29:06,340 --> 00:29:10,990 Ngunit ito pagkatapos begs ang tanong, paano kinakatawan mo ang paniwala ng mga negatibong 2 bilyong 474 00:29:10,990 --> 00:29:13,260 ipaalam sa nag-iisa negatibong 1? 475 00:29:13,260 --> 00:29:17,960 Sa ngayon, maaari naming oversimplify at lang sabihin na kami ay pagpunta sa gamitin ang pinakakaliwa bit 476 00:29:17,960 --> 00:29:22,380 ng mga 32 bit, at kung ito ay isang 1 ito ay isang negatibong numero, 477 00:29:22,380 --> 00:29:25,090 at kung ito ay isang 0 ito ay isang positibong numero. 478 00:29:25,090 --> 00:29:28,570 Ang problema sa na pinasimpleng representasyon ng mga negatibong numero 479 00:29:28,570 --> 00:29:33,700 ay ang kung sadyang ikaw ay pagiging matalino at sinusubukang i-convert mula sa isang character sa isang numero 480 00:29:33,700 --> 00:29:37,190 o kabaligtaran, walang ganoong bagay bilang isang negatibong karakter. 481 00:29:37,190 --> 00:29:42,550 Sa mundo ng ASCII, na gumagamit ng 8 bit lamang, ang lahat ng 8 ng mga bagay ng mga bit, 482 00:29:42,550 --> 00:29:46,810 at ang pinakakaliwa bit ay walang gawin sa negatibiti. 483 00:29:46,810 --> 00:29:49,670 At lamang maging malinaw, kapag sinabi ko pinakakaliwa bit, 484 00:29:49,670 --> 00:29:54,610 isipin ang na kapag ginawa namin ang aming bit-kaugnay na mga halimbawa sa unang linggo 485 00:29:54,610 --> 00:30:02,570 isipin ang na iginuhit namin ng mga bagay tulad ng 1001101, isang bagay tulad nito. 486 00:30:02,570 --> 00:30:07,210 Kapag sinasabi ko ang pinakakaliwa bit, ko lang ang literal na ibig sabihin ang 1 na sinulat mo ang lahat ng mga paraan sa kaliwa. 487 00:30:07,210 --> 00:30:11,910 Kaya sa mundo ng mga character ay walang paniwala ng negatibiti, 488 00:30:11,910 --> 00:30:16,360 sa gayon ay pinakakaliwa bit aktwal ay isang bagay upang gawin na may ASCII, walang gawin sa negatibiti. 489 00:30:16,360 --> 00:30:19,390 >> Kaya Mukhang - at labas ng konteksto mahirap upang sagutin ang eksaktong - 490 00:30:19,390 --> 00:30:25,840 ngunit sa paanuman, ang iyong code ay nakakalito na pinakakaliwa bit bilang na kumakatawan sa isang negatibong halaga 491 00:30:25,840 --> 00:30:29,160 kapag talagang bahagi ng character sa pinag-uusapan. 492 00:30:29,160 --> 00:30:32,250 At muli, ako oversimplifying dahil ang mga computer ay aktwal na gawin ang isang bagay ng kaunti may interes 493 00:30:32,250 --> 00:30:37,080 pa sa pagbabago na pinakakaliwa bit sa 1 para sa isang negatibong sign kumpara sa isang 0. 494 00:30:37,080 --> 00:30:41,270 Nila sa halip, kung gusto mong malaman sa Google, gamitin ang isang bagay na karaniwang tinatawag na 2 ng pampuno, 495 00:30:41,270 --> 00:30:43,830 na bit mas sopistikadong ng isang diskarte 496 00:30:43,830 --> 00:30:45,490 ngunit ang ideya na ang huli ang parehong. 497 00:30:45,490 --> 00:30:50,530 >> Kaya sa maikling salita, ito ay upang gawin ang katotohanan na ikaw ay masahe isang numero sa isang character 498 00:30:50,530 --> 00:30:53,750 o vice versa ngunit ang iyong code ay hindi nababatid ang katotohanan 499 00:30:53,750 --> 00:30:56,510 1 ng mga bits ay may kabuluhan sa numerong mundo. 500 00:30:56,510 --> 00:30:59,940 Hindi iyon ang kaso sa mundo ng character. 501 00:30:59,940 --> 00:31:04,270 Ngunit ito tunog tulad naayos mo, kung saan pagtalunan ngayon. Iba pang mga tanong. 502 00:31:06,030 --> 00:31:07,110 Okay. 503 00:31:07,110 --> 00:31:11,560 Kaya sa gayon ngayon, lahat ng programa namin ang nakasulat na kinuha input marahil mula sa gumagamit 504 00:31:11,560 --> 00:31:14,330 sa anyo ng mga function tulad GetInt, GetString, 505 00:31:14,330 --> 00:31:16,990 o kung ikaw ay pagbabasa Magpatuloy sa iba't-ibang mga libro o online na mga sanggunian, 506 00:31:16,990 --> 00:31:21,390 ka sarili ay maaaring gumamit ng mga function tulad ng scanf kung saan, lantaran, ginagamit namin sa CS50 library. 507 00:31:21,390 --> 00:31:25,370 Ngunit sa isang linggo o 2, makikita namin aktwal ipakita sa iyo kung paano ang CS50 library ay ipinatupad 508 00:31:25,370 --> 00:31:27,890 upang maaari naming tumagal ng mga gulong ng pagsasanay sama-sama. 509 00:31:27,890 --> 00:31:31,340 >> Ngunit ito lumiliko out may isa pang paraan upang makakuha ng input mula sa isang user. 510 00:31:31,340 --> 00:31:34,670 Sa katunayan, hindi namin ating sarili ay gamit ang command argumento line 511 00:31:34,670 --> 00:31:36,500 para sa isang ilang linggo na ngayon. 512 00:31:36,500 --> 00:31:41,150 Bawat oras na namin tumakbo kalatong o tumakbo namin gawin, 513 00:31:41,150 --> 00:31:45,050 hindi namin na-type lamang kumalatong, Ipasok, hindi pa namin nai-type gawin, Ipasok. 514 00:31:45,050 --> 00:31:49,340 Ano na namin karaniwang nakasulat pagkatapos ng salita kumalatong sa aming terminal sa bintana prompt? 515 00:31:51,110 --> 00:31:52,900 [Mag-aaral] Ang pangalan ng file. >> Ang pangalan ng file, i-right? 516 00:31:52,900 --> 00:31:57,560 Hello.c o mario.c o anuman ang may-katuturang pangalan ng file ay. 517 00:31:57,560 --> 00:32:01,910 At sa na pakiramdam kung ano talaga nagawa mo na naiimpluwensyahan ang pag-uugali ng kumalatong 518 00:32:01,910 --> 00:32:05,750 dahil tiyak na ang mga tao na sinulat ni kumalatong ay walang ideya na maliit gulang ka 519 00:32:05,750 --> 00:32:08,890 ay pagpunta sa magsulat ng isang programa na tinatawag na mario.c taon mamaya. 520 00:32:08,890 --> 00:32:13,150 Kaya nagkaroon sa paanuman maka-impluwensya sa pag-uugali ng programang iyon, 521 00:32:13,150 --> 00:32:18,140 at ang programa kumalatong ay na nakasulat sa isang paraan na maaari itong tanggapin ang input mula sa iyo 522 00:32:18,140 --> 00:32:23,480 sa pamamagitan ng pagdagdag ng mga salita sa prompt bago ang mga hit ng user ang Enter. 523 00:32:23,480 --> 00:32:27,860 >> Kaya ito lumiliko out na para sa ilang oras namin deklarasyon halos lahat ng aming mga programa 524 00:32:27,860 --> 00:32:32,840 upang simulan ang tulad nito - int pangunahing (walang bisa) - at pagkatapos namin ang nawala magpatuloy 525 00:32:32,840 --> 00:32:35,110 at nagsimulang pagsusulat ng aming code. 526 00:32:35,110 --> 00:32:37,910 At maaari naming magkaroon ng ilang mga matalim Kabilang sa tuktok ng file, 527 00:32:37,910 --> 00:32:40,660 ngunit halos lahat ng aming mga programa sa gayon ay malayo sinimulan na may ganitong 528 00:32:40,660 --> 00:32:44,200 kahit na maaari mong nakikita sa seksyon, sa mga libro, online na mga sanggunian 529 00:32:44,200 --> 00:32:46,570 na ito ay hindi sa katunayan na walang bisa. 530 00:32:46,570 --> 00:32:55,820 Isa pang lehitimong paraan para sa mga ito upang tumagal int argc at pagkatapos string ang argv []. 531 00:32:55,820 --> 00:32:57,500 Kaya ngayon kung ano ang ito nagpapahiwatig? 532 00:32:57,500 --> 00:33:01,320 Ito lumiliko out na argc, na kung saan ay isang tao convention - maaari kang tumawag ito foo, 533 00:33:01,320 --> 00:33:03,710 ngunit nais ito ng maraming mas malinaw sa mga mambabasa - 534 00:33:03,710 --> 00:33:09,330 ay argc lamang ng argumento sa pag-andar na tinatawag na pangunahing na kumakatawan sa kung ano ang? 535 00:33:09,330 --> 00:33:12,450 Ano ang argc tumayo para sa mga pamilyar? 536 00:33:12,450 --> 00:33:14,980 >> [Hindi marinig na mag-aaral ng tugon] >> Oo, ang bilang ng mga argumento o argumento count. 537 00:33:14,980 --> 00:33:16,510 Bilang simpleng bilang na. 538 00:33:16,510 --> 00:33:19,160 Gaano karaming mga argumento ay pumasa sa sa programang ito? 539 00:33:19,160 --> 00:33:20,630 Ano ang na ibig sabihin nito? 540 00:33:20,630 --> 00:33:27,090 Kung sa command line tumakbo ko ng isang bagay tulad nito - kumalatong mario.c-- 541 00:33:27,090 --> 00:33:35,440 ang argc kapag ako pindutin ang Enter sa isang halaga ng, medyo confusingly, 2. 542 00:33:35,440 --> 00:33:40,150 Kaya ito lumiliko na argc ang argumento count, 543 00:33:40,150 --> 00:33:46,280 ngunit para sa mga makasaysayang dahilan, ang pangalan ng programa mismo ay kasama sa na bilang ng. 544 00:33:46,280 --> 00:33:51,950 Kaya argc ay 2 kapag ako sinulat ni kumalatong mario.c. 545 00:33:51,950 --> 00:33:54,290 Ano ang argv naglalaman? 546 00:33:54,290 --> 00:33:57,020 Una sa lahat, argv mukhang isang string ngunit hindi pa 547 00:33:57,020 --> 00:33:59,310 dahil ang bilang ng huling Miyerkules at ang lahat ng higit pa ngayon, 548 00:33:59,310 --> 00:34:02,890 mga square bracket magpakilala kung ano? Iyon ay isang array. 549 00:34:02,890 --> 00:34:07,110 Walang numero sa array, at na dapat magkaroon ng kahulugan intuitively 550 00:34:07,110 --> 00:34:10,790 dahil ang mga tao na sinulat ni kumalatong taon na ang nakakaraan tiyak ay walang ideya 551 00:34:10,790 --> 00:34:16,300 kung gaano karaming mga salita ng mga tao tulad ng sa amin ay i-type sa prompt bago pagpindot sa Ipasok. 552 00:34:16,300 --> 00:34:22,280 >> Kaya sa kasong ito dito nila ipinahayag pangunahing ang function ng pagkuha ng isang hanay ng mga argumento, 553 00:34:22,280 --> 00:34:24,590 0 o higit pa sa mga argumento. 554 00:34:24,590 --> 00:34:26,460 Hindi nila alam nang maaga kung gaano karaming mga may, 555 00:34:26,460 --> 00:34:29,690 kaya ay sadyang walang numero sa loob ng mga square bracket. 556 00:34:29,690 --> 00:34:32,750 Ngunit ang katunayan na ang mga square bracket ay may nagsasabi sa computer, 557 00:34:32,750 --> 00:34:34,639 asahan ang isang array. 558 00:34:34,639 --> 00:34:37,489 Argv ay shorthand notation para sa vector ng argumento. 559 00:34:37,489 --> 00:34:39,889 Vector ay isang magarbong paraan ng sinasabi ng array, 560 00:34:39,889 --> 00:34:42,980 at array ay isang magarbong paraan ng sinasabi ng isang listahan o koleksyon. 561 00:34:42,980 --> 00:34:47,360 Kaya ito ay nangangahulugan lamang na kung sumulat ka ng mga pangunahing tulad nito 562 00:34:47,360 --> 00:34:51,100 sa halip na tulad ng kung paano namin na gawin ito para sa nakalipas na ilang linggo, 563 00:34:51,100 --> 00:34:54,699 ngayon ang iyong programa ay may kapangyarihan upang tanggapin ang mga argumento sa command line 564 00:34:54,699 --> 00:34:58,520 sa gayon ay hindi na kailangang mong sumulat sa Mario at pagkatapos ay pindutin ang Enter, 565 00:34:58,520 --> 00:35:01,610 pagkatapos i-type sa isang numero para sa kung gaano karaming mga bloke mataas na nais mong pyramid na, 566 00:35:01,610 --> 00:35:03,100 pagkatapos ay pindutin ang Enter muli. 567 00:35:03,100 --> 00:35:07,720 Hindi namin kailangan upang gamitin ang GetString ito o GetInt o GetFloat para sa na mahalaga. 568 00:35:07,720 --> 00:35:12,370 Maaari lang namin inaasahan sa gumagamit na i-type ang mga salitang iyon sa prompt mismo 569 00:35:12,370 --> 00:35:16,850 tulad lamang ang mga may-akda ng kumalatong nagpasya ito ay talagang nakakainis na programa 570 00:35:16,850 --> 00:35:20,550 kung upang ipunin ang iyong code mo munang-type kumalatong, pindutin ang Enter, 571 00:35:20,550 --> 00:35:24,090 sinabi namin sa gumagamit, mangyaring i-type ang pangalan ng file na nais mong upang makatipon, 572 00:35:24,090 --> 00:35:26,920 pagkatapos namin type sa mario.c at pindutin ang Enter. 573 00:35:26,920 --> 00:35:29,850 Ngunit na eksakto kung ano ang namin ang paggawa sa aming mga gumagamit sa nakalipas na dalawang linggo. 574 00:35:29,850 --> 00:35:33,550 Gamitin namin GetString at naming maghintay hanggang ang programa ay tumatakbo upang i-prompt ang mga ito para sa input. 575 00:35:33,550 --> 00:35:36,710 Na hindi na kailangang ang kaso. 576 00:35:36,710 --> 00:35:41,160 >> Kaya sa halimbawang ito dito, na namin ngayon string argv, 577 00:35:41,160 --> 00:35:43,390 at ito ay masyadong isang oversimplification, 578 00:35:43,390 --> 00:35:45,610 gulong pagsasanay na sa lalong madaling panahon dumating off. 579 00:35:45,610 --> 00:35:50,860 Ito ay ang mas tamang paraan ng pagsulat ito alternatibong deklarasyon ng pangunahing 580 00:35:50,860 --> 00:35:54,740 dahil ito ay lumiliko out na kung ano ang panatilihin namin ang pagtawag ng string aktwal ay isang bituin, 581 00:35:54,740 --> 00:35:58,440 ng asterisk, sa aktwal na kahulugan nito, ngunit ito lamang mukhang kumplikadong, 582 00:35:58,440 --> 00:36:02,600 ito ay nakalilito sa unang, kaya kami pasimplehin pamamagitan lamang paglikha ng isang kasingkahulugan ng mga uri 583 00:36:02,600 --> 00:36:09,340 sa CS50 library na mapa magpasinda * ang mas user-friendly na string ng salita. 584 00:36:09,340 --> 00:36:13,180 >> Kaya sabihin aktwal na subukan ito pagkatapos. Hayaan akong sige at buksan up gedit dito. 585 00:36:13,180 --> 00:36:17,010 Hayaan akong sige at buksan ang argv ng 1. 586 00:36:17,010 --> 00:36:21,620 Ang program na ito ay tila mga Kopya ang argumento, ngunit sa Ingles mga tuntunin, 587 00:36:21,620 --> 00:36:26,290 sa pamamagitan ng pagtingin sa ang code na ito, ano ang higit na partikular? 588 00:36:26,290 --> 00:36:35,910 Kung nagta-type ako sa command a.out foo bar, kung ano ay makakakuha ng naka-print sa aking itim at puting window? 589 00:36:35,910 --> 00:36:41,260 A.out foo bar, pindutin ang Enter. 590 00:36:43,120 --> 00:36:48,300 Sige. Oo. >> [Hindi marinig na mag-aaral tugon] 591 00:36:48,300 --> 00:36:52,730 Mabuti. Kaya a.out, bagong linya, foo, bagong linya, bar, bagong linya. 592 00:36:52,730 --> 00:36:54,980 Bakit ito? Maaari naming tiyak na kumpirmahin sa sandali lamang. 593 00:36:54,980 --> 00:36:56,940 Ito ay uri ng isang malambot na linya ng code. 594 00:36:56,940 --> 00:36:59,560  Ito lamang mga Kopya ng isang bagong linya upang gumawa ng mga bagay prettier sa screen. 595 00:36:59,560 --> 00:37:03,730 Ito ay isang loop na iterating mula 0 sa hanggang sa argc, 596 00:37:03,730 --> 00:37:07,210 at ito ay incrementing sa bawat pag-ulit + +. 597 00:37:07,210 --> 00:37:12,270 Kaya ito ngayon ang sinasabi na i-print ang isang string, tulad ng ipinahiwatig sa pamamagitan ng% s. 598 00:37:12,270 --> 00:37:16,460 Argv [i] ay medyo magkano ang parehong ideya mula sa nakaraang halimbawa. 599 00:37:16,460 --> 00:37:19,580 Ginamit namin upang tumawag sa variable s; ngayon tinatawag, mang, argv. 600 00:37:19,580 --> 00:37:24,270 Nangangahulugan ito na-print ang ith argument na na-type sa command line, 601 00:37:24,270 --> 00:37:28,690 at pagkatapos matapos ang buong bagay na ito ay tapos na, para lamang sa magandang panukalang i-print ang isa pang bagong linya. 602 00:37:28,690 --> 00:37:31,600 >> Kaya sabihin tingnan ang. Hayaan akong buksan ang terminal na window. 603 00:37:31,600 --> 00:37:37,470 Hayaan akong makatipon argv ng 1, at ngayon ay ipaalam sa akin patakbuhin ang argv ng 1, Ipasok. Hmm. Okay. 604 00:37:37,470 --> 00:37:40,850 Natin patakbuhin ang foo bar. Kawili-wili. Baz. 605 00:37:40,850 --> 00:37:42,640 At kung sakaling mo na kung bakit type ko ito, 606 00:37:42,640 --> 00:37:45,010 ito ay din ng bobo convention ng computer science. 607 00:37:45,010 --> 00:37:48,050 Ang mundo ay madalas na kailangang lamang pandiwang placeholder para sa mga salita. 608 00:37:48,050 --> 00:37:50,090 Kaya kung nais mong makipag-usap tungkol sa ilang mga generic na string, 609 00:37:50,090 --> 00:37:53,250 computer na siyentipiko ay may posibilidad upang sabihin sa foo kapag kailangan nila ng isang random na salita, 610 00:37:53,250 --> 00:37:55,530 pagkatapos sabihin nila bar kung kailangan nila ng isang pangalawang random na salita, 611 00:37:55,530 --> 00:37:59,100 pagkatapos sabihin nila baz kung kailangan nila ng isang third salita, pagkatapos sinasabi nila qux kung kailangan nila ng ika-apat na salita, 612 00:37:59,100 --> 00:38:01,520 at pagkatapos ay mayroong isang malaking relihiyon online na debate sa kung ano ay pagkatapos qux, 613 00:38:01,520 --> 00:38:04,940 sa gayon ay maaari mong Google na malaman kung ano ang iba pang arbitrary salita ay dapat na. 614 00:38:04,940 --> 00:38:07,480 Ngunit ang mga ito ay na walang ibig sabihin kung ano pa man, 615 00:38:07,480 --> 00:38:10,100 kahit foo bar, kung ka ng Google na, na na ibig sabihin, 616 00:38:10,100 --> 00:38:12,780 na bahagi ng pinagmulan ng salita dito. 617 00:38:12,780 --> 00:38:17,550 >> Kaya ang lahat ng ito ay ginagawa pagkatapos ay pag-print ng 1 ng mga string na ito sa bawat linya. 618 00:38:17,550 --> 00:38:19,900 Kaya kung ako sa halip, bagaman, nais upang makakuha ng isang maliit na may interes, 619 00:38:19,900 --> 00:38:22,550 ipagpalagay na hindi ko nais upang i-print ang bawat string sa bawat linya; 620 00:38:22,550 --> 00:38:26,220 Nais kong upang i-print ang bawat character mula sa bawat string sa bawat linya. 621 00:38:26,220 --> 00:38:28,550 Paano ko maaaring sa halip gawin iyon? 622 00:38:28,550 --> 00:38:33,720 Ano ang kailangan kong baguhin ang tungkol sa programang ito kung gusto kong i-print ang hindi bawat salita 623 00:38:33,720 --> 00:38:37,290 ngunit gusto kong i-print ang bawat salita ng sulat sa pamamagitan ng sulat sa pamamagitan ng sulat, 624 00:38:37,290 --> 00:38:40,590 pagkatapos ay ang susunod na titik ng salita sa pamamagitan ng sulat sa pamamagitan ng sulat? 625 00:38:40,590 --> 00:38:43,650 Paano namin pagsamahin ang mga ideya na ito nang sa gayon ngayon? Oo. 626 00:38:43,650 --> 00:38:47,390 [Mag-aaral]% c. >> Lahat ng karapatan. Kaya kailangan namin sa isang lugar% c. 627 00:38:47,390 --> 00:38:50,680 Mabuti, dahil hindi ko nais upang i-print ang buong string, gusto kong i-print ang mga character. Ano pa? 628 00:38:50,680 --> 00:38:54,290 >> [Hindi marinig na mag-aaral ng tugon] >> Kawili-wiling. 629 00:38:54,290 --> 00:38:56,860 Kaya kailangan namin ng uri ng ng pangalawang dimensyon dito ngayon 630 00:38:56,860 --> 00:39:02,300 dahil sa tingin ng argv bilang isang array, ngunit ito ay isang array ng mga string. 631 00:39:02,300 --> 00:39:07,170 Ngunit bilang ng, gusto, 15 minuto ang nakalipas, ano ang isang string? Ang isang hanay ng mga character. 632 00:39:07,170 --> 00:39:12,320 Kaya talaga, argv ay isang array ng isang array ng mga character, 633 00:39:12,320 --> 00:39:14,870 isang array ng mga array ng mga character. 634 00:39:14,870 --> 00:39:19,170 Kaya ito lumiliko na maaari naming gamitin lang mas square bracket notations. Kaya sabihin gawin ito. 635 00:39:19,170 --> 00:39:23,650 Sa tuktok ng ito loop sa linya 19, Pupunta ako upang umulit mula i up sa argc, 636 00:39:23,650 --> 00:39:25,760 ngunit pagkatapos ay ako pagpunta sa gawin ito: 637 00:39:25,760 --> 00:39:27,580 para sa - ay hindi ako maaaring gumamit ng i ngayon. 638 00:39:27,580 --> 00:39:30,300 Kailangan ko ng isa pang variable dahil gusto ko upang umulit sa ibabaw ng mga salita 639 00:39:30,300 --> 00:39:32,640 ngunit pagkatapos din sa paglipas ng ang mga titik sa mga salita 640 00:39:32,640 --> 00:39:37,280 kaya ko uri ng vertical axis at sa pahalang axis, uri ng conceptually. 641 00:39:37,280 --> 00:39:43,930 Kaya int j nakakakuha ng 0, Gusto kong gawin ang j bilang hangga't j ay mas mababa sa - at makikita ko linisin ito up sa isang bit. 642 00:39:43,930 --> 00:39:48,410 Paano ko umulit sa ang mga titik sa isang string? Ginawa namin ito ng ilang sandali ang nakalipas. 643 00:39:48,410 --> 00:39:54,670 Strlen ng argv [i]. Mabuti. 644 00:39:54,670 --> 00:39:57,860 At muli, ako ng paggawa ng maliit na kawalan ng kaalaman dito sa pamamagitan ng hindi paglikha ng n o anumang, 645 00:39:57,860 --> 00:39:59,610 ngunit gagamitin namin bumalik iyon. 646 00:39:59,610 --> 00:40:03,270 >> Kaya ngayon j + +. Ngayon ay mayroon akong indent ng karagdagang dito. 647 00:40:03,270 --> 00:40:06,950 Ano ang gagawin ko ngayon ay nais upang i-print sa bawat pag-ulit? 648 00:40:06,950 --> 00:40:09,720 [Hindi marinig na mag-aaral ng tugon] >> Kaya [i] ay magbibigay sa akin ang salitang. 649 00:40:09,720 --> 00:40:12,910 [I] [j], uri ng tulad ng matrix. 650 00:40:12,910 --> 00:40:14,810 Mga may background sa matematika-y, 651 00:40:14,810 --> 00:40:19,340 hindi namin ang uri ng pag-i-index ng palalimin ito matrix o ang hanay ng mga array, 652 00:40:19,340 --> 00:40:21,380 ang 2-dimensional na istraktura. 653 00:40:21,380 --> 00:40:25,070 Kaya ngayon sabihin makita kung ano ang mangyayari dito. Hayaan akong buksan ang aking mas malaking terminal na window. 654 00:40:25,070 --> 00:40:28,170 Hayaan akong muling palabas ng pelikula gumawa ng argv ng 1. 655 00:40:28,170 --> 00:40:33,090 At screwed ko na dito, kung saan ay isang mahusay na aralin dahil nakalimutan ko masyadong upang gawin ito. 656 00:40:33,090 --> 00:40:37,150 Nang kataon lamang deklarasyon 'strlen' C library function sa unsigned-type ang '- 657 00:40:37,150 --> 00:40:40,360 Hindi ko alam kung ano ang natitirang ay nangangahulugan na, ngunit ko nakita ito bago, 658 00:40:40,360 --> 00:40:42,000 nang kataon lamang deklarasyon. 659 00:40:42,000 --> 00:40:45,540 Tuwing nakikita namin ang error na ito, ano ang karaniwang magpahiwatig? 660 00:40:45,540 --> 00:40:48,520 >> [Hindi marinig na mag-aaral ng tugon] >> Nakalimutan ko ang isang library up sa tuktok. Ngunit maghintay ng isang minuto. 661 00:40:48,520 --> 00:40:51,690 Karaniwan ko na screwed up dahil Nakalimutan ko ang CS50 library, ngunit na doon. 662 00:40:51,690 --> 00:40:54,480 Karaniwan ko na screwed up dahil nakalimutan ko na ang standard ko / O. 663 00:40:54,480 --> 00:40:57,960 At lantaran, hindi ko kailangan ito. Hindi namin ginagamit GetString ngayon. 664 00:40:57,960 --> 00:40:59,900 Kaya kung ano ang ako nawawala? 665 00:40:59,900 --> 00:41:04,860 May isa pang library na ngayon ay kailangan naming gamitin paminsan-minsan na tinatawag na string.h, 666 00:41:04,860 --> 00:41:08,980 at ito lamang ang isa pang library na may higit pang mga function na ay hindi sa karaniwang ako / O. 667 00:41:08,980 --> 00:41:11,640 >> Kaya sabihin bumalik sa aking malaking terminal na window. 668 00:41:11,640 --> 00:41:16,670 Okay. Ngayon, letse, hulaan ko ako ay mali. Ako gamit ang CS50 library. 669 00:41:16,670 --> 00:41:18,460 Upang maayos namin ito sa alinman sa 2 paraan. 670 00:41:18,460 --> 00:41:21,510 Maaari naming gawin ang mga gulong ng pagsasanay off ngayon at lamang gawin ito, 671 00:41:21,510 --> 00:41:26,600 o natin ang uri ng panatilihing na pagpapagaan para lamang sa ngayon, i-paste ito pabalik sa, 672 00:41:26,600 --> 00:41:30,180 lutasin ang problema na iyon, at ngayon ay bumalik sa window ng terminal. 673 00:41:30,180 --> 00:41:33,080 Kaya maging malinaw, sa library ng CS50 ay hindi lamang function, 674 00:41:33,080 --> 00:41:36,920 ring string ng keyword, kung saan ay bakit error na nangyari. 675 00:41:36,920 --> 00:41:43,010 >> Kaya dito namin pumunta. Naayos ko parehong ng ang isyu ng library. Enter. Mabuti. 676 00:41:43,010 --> 00:41:49,250 Argv ng 1, foo bar, pindutin ang Enter. Mahusay na. 677 00:41:49,250 --> 00:41:52,830 Kaya ngayon namin ang bawat titik ng bawat salita na naka-print na 1 sa bawat linya, 678 00:41:52,830 --> 00:41:55,290 na hindi gumawa para sa isang kawili-wiling programa, 679 00:41:55,290 --> 00:41:59,350 ngunit paunawa ngayon namin ang kakayahan ng hindi lamang iterating sa paglipas ng mga salita 680 00:41:59,350 --> 00:42:04,090 kundi pati na rin sa mga indibidwal na mga titik sa salita, na parang totoo pamilyar 681 00:42:04,090 --> 00:42:10,330 kahit na ang pinakasimpleng ng mga application tulad ng scrambling titik sa isang string tulad nito. 682 00:42:10,330 --> 00:42:12,410 Natin sige at ang aming 5-minutong break na dito. 683 00:42:12,410 --> 00:42:14,410 At kapag dumating namin pabalik, sisimulan namin ang pakikipag-usap tungkol sa kahusayan 684 00:42:14,410 --> 00:42:17,670 na kung saan maaari naming gawin ang mga bagay na ito nang mas mahusay. 685 00:42:19,370 --> 00:42:21,900 >> Ayos lang. Kami ay bumalik. 686 00:42:21,900 --> 00:42:26,970 Salamat sa isa sa aming mga TFs na gumaganap ng isang maraming ng bananagrams, 687 00:42:26,970 --> 00:42:30,000 namin aktwal ng buong bungkos ng mga karakter sa amin dito ngayon 688 00:42:30,000 --> 00:42:32,520 pisikal incarnated sa mga maliit na plastic piraso, 689 00:42:32,520 --> 00:42:36,910 at ipaalam sa akin ipanukala na ito blangko puting slate narito kumakatawan sa RAM sa aking computer - 690 00:42:36,910 --> 00:42:39,790 laptop, desktop, anumang - at may mukhang ng maraming nito 691 00:42:39,790 --> 00:42:44,090 dahil kung sisimulan namin ang tipak ito RAM sa maliit byte-size na piraso, 692 00:42:44,090 --> 00:42:48,970 sabihin mang sabihin na may isang bagay na kinakatawan ng laki at na malabo - 693 00:42:48,970 --> 00:42:52,430 doon pumunta kami, at sabihin mag-zoom out ng kaunti dito - 694 00:42:52,430 --> 00:42:56,120 sabihin nating ang isang bagay na ang laki ay kumakatawan sa isang solong byte. 695 00:42:56,120 --> 00:43:00,400 Upang maaari naming katunayan umangkop sa isang buong grupo ng mga bytes o mga character sa loob ng memory na ito, 696 00:43:00,400 --> 00:43:02,860 tulad ng iminungkahi ng kamag-anak na laki dito. 697 00:43:02,860 --> 00:43:06,780 >> Kaya ngayon ipagpalagay na ang layunin ay upang magtalaga ng memory para sa isang string. 698 00:43:06,780 --> 00:43:08,680 Paano ito aktwal na gumagana? 699 00:43:08,680 --> 00:43:11,380 Sa programa namin ang pagsusulat, karaniwang namin na gamit GetString, 700 00:43:11,380 --> 00:43:16,300 ngunit ngayon, malinaw, may ito sa iba pang channel sa pamamagitan ng kung saan maaari naming makakuha ng input ng user sa argv 701 00:43:16,300 --> 00:43:18,190 sa pamamagitan ng mga argumento sa linya ng command na. 702 00:43:18,190 --> 00:43:20,580 Ngunit kung ano talaga ang nangyayari sa ilalim ng hood? 703 00:43:20,580 --> 00:43:24,920 Ito lumiliko kung tinatawag naming - sabihin mag-scroll pabalik sa GetString - ang function na GetString 704 00:43:24,920 --> 00:43:28,190 sa library ng CS50, ang user ay sinenyasan para sa isang string, 705 00:43:28,190 --> 00:43:30,780 ang mga uri ng gumagamit sa ilang mga salita - sabihin tumawag ito HELLO. 706 00:43:30,780 --> 00:43:35,410 At kami ay sinasabi para sa nakalipas na ilang linggo na ang return halaga ng GetString 707 00:43:35,410 --> 00:43:37,750 ay sa katunayan isang string, tulad ng salita HELLO. 708 00:43:37,750 --> 00:43:39,660 >> Ngunit ano ang GetString talaga ginagawa? 709 00:43:39,660 --> 00:43:45,230 Habang ang mga uri ng user sa HELLO, Ipasok, GetString ang pag-uunawa, 710 00:43:45,230 --> 00:43:47,930 okay, kung gaano karaming mga character ay ito? Ito ay H-E-L-L-O. 711 00:43:47,930 --> 00:43:52,500 Kaya kailangang maglaan, kailangang hilingin sa operating system - Linux sa kasong ito - 712 00:43:52,500 --> 00:43:55,410 para sa hindi bababa sa 5 bytes upang mag-imbak ng HELLO. 713 00:43:55,410 --> 00:43:59,570 At kung ano ito pagkatapos naaayos gawin sa sandaling ito ay nakakakuha ng bumalik mga 5 bytes mula sa operating system 714 00:43:59,570 --> 00:44:04,120 sa lay out HELLO bumalik upang i-back i-back upang i-back. 715 00:44:04,120 --> 00:44:11,070 At kaya kung ano talaga ang bumalik mula GetString ay isang tipak ng data na ganito ang hitsura. 716 00:44:11,070 --> 00:44:16,850 Ngunit ito ay isang bit hindi tumpak dahil ito ay lumiliko out na ito ay hindi na simple 717 00:44:16,850 --> 00:44:20,310 bilang lamang ang pag-iimbak ng HELLO sa memory ng computer 718 00:44:20,310 --> 00:44:24,140 dahil ipagpalagay na ang aking programa na Sumulat ako sa C pagkatapos tawag GetString muli, 719 00:44:24,140 --> 00:44:28,210 at ang susunod na salita user ang mga uri sa bye, bye. 720 00:44:28,210 --> 00:44:31,300 Well, kailangan ko upang magkasya ang salitang iyon bye sa isang lugar sa memorya. 721 00:44:31,300 --> 00:44:33,790 Hindi ko gumulpi HELLO. 722 00:44:33,790 --> 00:44:37,320 Halimbawa, hindi ko gusto ang computer lang magsimulang Sasapawan nito tulad nito 723 00:44:37,320 --> 00:44:41,400 ang orihinal na salita dahil maaaring ko pa rin gamit ang salitang HELLO sa isang variable 724 00:44:41,400 --> 00:44:43,070 sa iba pang lugar sa aking programa. 725 00:44:43,070 --> 00:44:45,900 >> Kaya B-Y-E ay may upang tapusin sa iba pang lugar sa memorya. 726 00:44:45,900 --> 00:44:50,460 Ngunit convention ay karaniwang na ang susunod na string na maglaan 727 00:44:50,460 --> 00:44:54,940 marahil, ngunit hindi laging, ay pagpunta sa magtapos sa susunod na magagamit na lokasyon ng memorya. 728 00:44:54,940 --> 00:44:57,370 At kung hindi ako tanungin ang operating system para sa anumang memory 729 00:44:57,370 --> 00:45:01,380 simula ng huling beses Tumawag ako GetString, odds ang mga salita Bye 730 00:45:01,380 --> 00:45:05,790 pagpunta sa magtapos karapatan pagkatapos ng salita HELLO sa memory. 731 00:45:05,790 --> 00:45:10,550 Ngunit sa puntong ito, maaari mong marahil makita kung saan ang isang potensyal na problema arises. 732 00:45:10,550 --> 00:45:13,310 Dahil ang susunod na chunks ng memorya, sa susunod na bytes na lamang libreng - 733 00:45:13,310 --> 00:45:18,230 linisin puting slate - sa memory ng computer sa tabi mismo ng HELLO, 734 00:45:18,230 --> 00:45:23,670 ito nararamdaman tulad ng unang string na Tinanong ko maaaring biglang ngayon baguhin 735 00:45:23,670 --> 00:45:26,410 dahil mahalagang ko iyong binago ito sa HELLOBYE 736 00:45:26,410 --> 00:45:31,310 sa halip na sa paanuman demarcing simula ng bye at sa dulo ng HELLO. 737 00:45:31,310 --> 00:45:33,920 >> Kaya ito lumiliko out na kung ano talaga ang nangyayari sa ilalim ng hood, 738 00:45:33,920 --> 00:45:37,570 kung saan maaari mong glimpsed sa online na mga sanggunian o seksyon o mga aklat 739 00:45:37,570 --> 00:45:41,780 o hindi sa lahat pa na may ay talagang isang sinadya paghihiwalay 740 00:45:41,780 --> 00:45:45,890 sa pagitan ng mga salita sa memorya ng isang computer. 741 00:45:45,890 --> 00:45:52,480 At sa katunayan, sa kasong ito dito, sa halip na lamang ilagay bye sa tabi mismo ng HELLO, 742 00:45:52,480 --> 00:45:58,610 sa halip, computer naglalagay ng isang espesyal na character, ang mga espesyal na character na null, kaya na magsalita, 743 00:45:58,610 --> 00:46:03,050 na kung saan ay kinakatawan sa isang marker na may backslash 0. 744 00:46:03,050 --> 00:46:06,700 Kaya mahaba kuwento maikli, isipin ang na ang mga character ay kinakatawan sa ASCII. 745 00:46:06,700 --> 00:46:09,680 ASCII lamang ng pagma-map sa pagitan ng mga numero at titik, 746 00:46:09,680 --> 00:46:13,870 at karamihan ng mga titik simulan ang halos 65 para sa capital A, 747 00:46:13,870 --> 00:46:19,780 ngunit ito lumiliko out maaari mong tiyak na kumakatawan sa bilang 0 bilang isang integer o sa binary, 748 00:46:19,780 --> 00:46:22,690 at ito ay lumiliko mundo nagpasya mahaba, matagal na ang nakalipas, "Alam mo kung ano?" 749 00:46:22,690 --> 00:46:27,550 "Sabihin reserba numero ng 0 bilang hindi kumakatawan sa anumang mga character sa keyboard - 750 00:46:27,550 --> 00:46:30,810 "Walang titik, walang mga numero, walang bantas. 0 ay espesyal na." 751 00:46:30,810 --> 00:46:35,830 "Ito ay ang mga espesyal na character na null, at kami ay pagpunta upang isulat ang mga ito bilang \ 0." 752 00:46:35,830 --> 00:46:41,170 Ang pagkakaiba sa pagiging kung lang namin sinulat ni 0, 0 ng character. 753 00:46:41,170 --> 00:46:45,700 Manariwa sa diwa na may ASCII code para sa 0, para sa 1, 2, 3 754 00:46:45,700 --> 00:46:50,570 dahil ang mga character na 0 ay naiiba mula sa 0 bilang. 755 00:46:50,570 --> 00:46:54,270 At maaari mong makita na kung titingnan mo mula sa linggo 1 kapag muna namin uusapang tungkol sa ASCII, 756 00:46:54,270 --> 00:46:59,130 0 at 1 at 2 at 3 ang lahat ng mga paraan ng hanggang sa 9 ay may kanilang sariling mga ASCII code. 757 00:46:59,130 --> 00:47:02,300 Ang mga ito ay hindi, coincidentally, 0 hanggang 9. Ang mga ito ay ibang-iba. 758 00:47:02,300 --> 00:47:08,770 Kaya 0 lamang ay nangangahulugan "Ako espesyal na," at ang \ 0 mga paraan, literal, "ako hindi 0 karakter." 759 00:47:08,770 --> 00:47:11,360 "Ako ito espesyal na halaga, ang null karakter." 760 00:47:11,360 --> 00:47:16,930 Kaya kailangan ko aktwal na isa pa sa mga ito dahil hindi ako maaaring gumawa ng dalawang beses ang parehong pagkakamali. 761 00:47:16,930 --> 00:47:21,550 >> Kaya matapos ang salita Bye din kami ay pagpunta sa kailangan ng isa pa ng mga null character. 762 00:47:21,550 --> 00:47:27,090 Hayaan akong makakuha ng aking panulat dito at ipaalam sa akin mabilis gumuhit ng isa pang \ 0 763 00:47:27,090 --> 00:47:30,480 kaya pagkatapos kong tanungin ang operating system para sa 2 string 764 00:47:30,480 --> 00:47:33,270 sa pamamagitan ng GetString sinundan sa pamamagitan ng isa pang tawag sa GetString, 765 00:47:33,270 --> 00:47:35,640 ito ay kung ano ang aktwal na sa memory. 766 00:47:35,640 --> 00:47:39,900 Kaya kapag nakakuha ako isang string, talagang ako pagbalik na, 767 00:47:39,900 --> 00:47:43,450 at kapag nakakuha ako ng susunod na string, talagang ako pagbalik na. 768 00:47:43,450 --> 00:47:47,910 Kaya ito begs ang tanong, strlen, una sa lahat, kung ano ang dapat itong bumalik? 769 00:47:47,910 --> 00:47:54,650 Kapag tumawag ako strlen sa string s at mga ay ang salitang HELLO na ang user na nai-type sa, 770 00:47:54,650 --> 00:47:57,800 kung ano ay malinaw naman namin sinasabi ang haba ng HELLO ng ilang minuto ang nakalipas? 771 00:47:57,800 --> 00:48:01,290 Ito ay 5, i-right? H-E-L-L-O. At na talaga kung paano strlen gawa. 772 00:48:01,290 --> 00:48:05,670 Nagbabalik kung ano ang isang normal na tao asahan ang haba ng isang string upang maging. 773 00:48:05,670 --> 00:48:11,030 Ngunit sa katotohanan, kung gaano kalaki ang array ng mga character na pag-iimbak ng halo? 774 00:48:11,030 --> 00:48:12,770 Ito ang aktwal na 6. 775 00:48:12,770 --> 00:48:15,740 Kaya strlen ay hindi banggitin ang katotohanang iyon sa iyo. 776 00:48:15,740 --> 00:48:20,300 Ngunit sa ilalim ng hood computer katunayan gamit 6 bytes upang mag-imbak ng 5-titik na salita, 777 00:48:20,300 --> 00:48:22,380 at ito ay totoo hindi mahalaga kung gaano katagal ang salita ay. 778 00:48:22,380 --> 00:48:26,470 Mayroong palaging pagpunta sa isang espesyal na null pagwawakas ng character sa dulo ng string 779 00:48:26,470 --> 00:48:28,800 upang demarc kabuuang haba nito. 780 00:48:28,800 --> 00:48:33,430 >> Kaya pagkatapos ay kung ikaw ay ngayon ang taong pagpapatupad strlen 20, 30 taon na ang nakalipas, 781 00:48:33,430 --> 00:48:35,520 kung paano mo pumunta tungkol sa pagpapatupad ng strlen mismo? 782 00:48:35,520 --> 00:48:39,980 Namin para sa ipinagkaloob na ito umiiral, tulad lamang namin tumagal para sa ipinagkaloob na printf umiiral, 783 00:48:39,980 --> 00:48:42,850 ngunit kung ang HELLO salita sa pinag-uusapan 784 00:48:42,850 --> 00:48:45,220 at kung ano ang mayroon ako sa memory ay isang bagay na ganito ang hitsura, 785 00:48:45,220 --> 00:48:48,130 kung mayroon kang reimplement strlen dahil hiningi sa inyo na 786 00:48:48,130 --> 00:48:50,260 o dahil, lantaran, hindi mo alam strlen umiral - 787 00:48:50,260 --> 00:48:54,280 mayroon kang sa roll ito sa iyong sariling - kung paano maaari mong ipatupad strlen 788 00:48:54,280 --> 00:48:57,760 kapag bibigyan ng isang bagay na ganito ang hitsura? 789 00:48:57,760 --> 00:49:02,750 Ngayon na alam namin string ay isang array, maaari naming umulit sa paglipas ng bawat isa ng ang mga indibidwal na mga character 790 00:49:02,750 --> 00:49:06,320 gamit ang isang bagay tulad ng - Hayaan ang subukan upang gawin ito sa mabilisang. 791 00:49:06,320 --> 00:49:12,060 >> Hayaan akong pumunta sa appliance. Hayaan akong lumikha ng isang bagong file, strlen.c. 792 00:49:12,060 --> 00:49:19,260 Hayaan akong magpatuloy ngayon at huwag isama stdio.h kaya na kami ay may access sa printf. 793 00:49:19,260 --> 00:49:25,820 Hayaan ang gawin sa akin int pangunahing (walang bisa). Oh. Kukunin ko na lang gawin ito sa aking sarili sa ngayon pagkatapos. [Chuckles] 794 00:49:25,820 --> 00:49:28,300 Salamat sa inyo. 795 00:49:28,300 --> 00:49:31,000 Ito ay kung ano ang ako ginagawa. Ayos lang. 796 00:49:31,000 --> 00:49:34,820 Kaya bago ako naka-on ang screen, ako-type ang lahat ng na. 797 00:49:34,820 --> 00:49:37,550 At ngayon kung ano ang ako pagpunta sa gawin ay ang mga sumusunod: 798 00:49:37,550 --> 00:49:40,360 printf ("Bigyan mo ako isang string:") 799 00:49:40,360 --> 00:49:42,700 Na lang malambot na mga tagubilin. 800 00:49:42,700 --> 00:49:45,700 Ngayon sabihin gawin sa akin = GetString string s. 801 00:49:45,700 --> 00:49:47,260 Ko na kailangang gumawa ng pagbabago ngayon. 802 00:49:47,260 --> 00:49:52,740 Gumagamit ako ng biglang CS50 library, kaya hayaan mo akong magpatuloy at i-type sa cs50.h. 803 00:49:52,740 --> 00:50:00,720 At ngayon sabihin gawin ito: printf ("Ang haba ay:% d, strlen [s] - 804 00:50:00,720 --> 00:50:03,540 at hindi pa tapos ako na. Ano pa ko idagdag sa program na ito? 805 00:50:03,540 --> 00:50:05,740 >> [Mag-aaral] string.h. >> String.h. 806 00:50:05,740 --> 00:50:10,800 Kaya sa ngayon, ginagamit namin ang strlen, kaya sabihin tiyakin tagatala ang nakakaalam kung saan na, 807 00:50:10,800 --> 00:50:12,390 kaya ng kaunti katinuan suriin. 808 00:50:12,390 --> 00:50:16,400 Nakakuha ako ng isang string sa linya 8, at sa linya 9 ako nagpi-print ang haba nito sa% d. 809 00:50:16,400 --> 00:50:19,400 Kaya sabihin sige at buksan ito up. 810 00:50:19,400 --> 00:50:23,380 Namin ang strlen - compiles okay - 811 00:50:23,380 --> 00:50:30,120 strlen - hayaan mo akong mag-zoom in - Ipasok, H-E-L-L-O, ang Enter. Ang haba ay 5. 812 00:50:30,120 --> 00:50:32,730 >> Okay, kaya strlen tila sa trabaho, ngunit ang mundo alam na. 813 00:50:32,730 --> 00:50:37,310 Kaya natin ngayon ipatupad ng strlen ating sarili bilang mga sumusunod. 814 00:50:37,310 --> 00:50:39,490 Hayaan akong ito library ang layo. 815 00:50:39,490 --> 00:50:42,590 Hindi na kami access sa string.h dahil hindi ko kahit alam ito umiiral. 816 00:50:42,590 --> 00:50:45,970 Ngunit na okay dahil ang maaari kong ipatupad strlen aking sarili 817 00:50:45,970 --> 00:50:50,200 at may isang string na tinatawag na input, 818 00:50:50,200 --> 00:50:53,830 at ngayon kailangan ko upang malaman kung ang haba ng string na ito. 819 00:50:53,830 --> 00:50:55,880 Kaya kung paano ang maaari kong gawin ito? 820 00:50:55,880 --> 00:51:00,190 Paano kung gagawin ko - sabihin makita kung paano gawin ito - Ano ang gusto mong gawin? 821 00:51:00,190 --> 00:51:04,130 >> [Hindi marinig na mag-aaral tugon] >> Okay. 822 00:51:04,130 --> 00:51:05,970 Upang maaari naming gawin ito sa isang grupo ng mga paraan. Hayaan akong subukan ang diskarteng ito. 823 00:51:05,970 --> 00:51:10,220 Hayaan akong bigyan ang sarili ko ng isang int variable i, kaya i nagsisimula sa 0. 824 00:51:10,220 --> 00:51:19,380 At hayaan mo akong sabihin ito: habang input [i] ay hindi katumbas sa kung ano? \ 0. 825 00:51:19,380 --> 00:51:23,480 Kaya ito lumiliko out, na ang kaso sa lahat ng char kapag sumusulat sa kanila literal sa isang programa, 826 00:51:23,480 --> 00:51:25,940 mayroon kang upang gamitin ang mga single quote, hindi double quote. 827 00:51:25,940 --> 00:51:29,250 Kaya kung ako ay pagsulat ang titik ng, Gusto ko gawin iyon, ang titik b, gusto kong gawin na. 828 00:51:29,250 --> 00:51:33,440 Ito, sa pamamagitan ng kaibahan, ay isang string, hindi isang indibidwal na character. 829 00:51:33,440 --> 00:51:38,470 >> Kaya gusto ko \ 0 literal. Ano ang gusto kong gawin sa loop na ito? 830 00:51:38,470 --> 00:51:42,650 Aktwal na, kailangan ko ng isa pang variable, kaya int haba nakakakuha ng 0. 831 00:51:42,650 --> 00:51:46,190 Kahit na ikaw ay hindi sigurado kung bakit namin nagsimula ang paraan na ginawa namin, 832 00:51:46,190 --> 00:51:50,110 ngayon na kami ay pagpunta pababa ang kalsada na ito, kung ano ang gusto kong gawin sa linya 9? 833 00:51:50,110 --> 00:51:55,820 haba + + at pagkatapos pababa dito sa linya 10, return haba. 834 00:51:55,820 --> 00:51:58,370 Kaya kung paano ay strlen ipinatupad? 835 00:51:58,370 --> 00:52:00,550 Aktwal na ito ipinatupad malamang na tulad nito. 836 00:52:00,550 --> 00:52:03,470 Siguro tao ang ginamit ng para sa loop, maaaring gawin habang loop - na alam? 837 00:52:03,470 --> 00:52:05,940 Gusto namin talagang tumingin sa ilalim ng hood sa aktwal na source code 838 00:52:05,940 --> 00:52:08,520 sa ilang mga file na tinatawag na string.c marahil. 839 00:52:08,520 --> 00:52:10,480 >> Ngunit dito sabihin isipin ang tungkol sa kung ano ang ako ginagawa. 840 00:52:10,480 --> 00:52:13,640 Ako deklarasyon ng variable tinatawag i, ang pagtatakda katumbas ng 0. 841 00:52:13,640 --> 00:52:17,520 Ako deklarasyon ng isa pang variable na tinatawag na haba, ang pagtatakda katumbas ng 0. 842 00:52:17,520 --> 00:52:25,440 Pagkatapos ako sinasabi habang ith character sa input ay hindi katumbas sa espesyal na character null, \ 0, 843 00:52:25,440 --> 00:52:27,070 dagdagan ang haba. 844 00:52:27,070 --> 00:52:32,550 Ngunit sa lalong madaling ith karakter ay ang espesyal na character, kung ano ang mangyayari sa loop? 845 00:52:32,550 --> 00:52:36,540 Ito maikling circuits. Ito hinto, na nangangahulugan na namin pagkatapos ay agad na bumalik ang haba. 846 00:52:36,540 --> 00:52:40,740 >> Kaya kung hindi ko Nagkamali, sabihin magpatuloy at bumalik sa aking terminal na window. 847 00:52:40,740 --> 00:52:43,550 Hayaan akong mag-recompile. At ako ay magtaas. 848 00:52:43,550 --> 00:52:46,320 Di-katugmang muling deklarasyon ng library function na strlen. 849 00:52:46,320 --> 00:52:48,650 Kaya ako ay sinusubukan upang makakuha ng masyadong matalino para sa aking sariling magandang dito. 850 00:52:48,650 --> 00:52:51,610 Tagatala Ang aktwal na alam na may isang function na tinatawag na strlen 851 00:52:51,610 --> 00:52:55,290 kahit hindi namin kasama library. Iyon ay pinong. Anuman. 852 00:52:55,290 --> 00:52:58,230 Kami ay pagpunta sa makikipagtulungan pagkatapos. Palitan ang pangalan natin ito haba. 853 00:52:58,230 --> 00:53:04,110 Hayaan akong baguhin ang paggamit nito sa haba dito, at ito ay gumawa ng kumalatong mas masaya. 854 00:53:04,110 --> 00:53:08,900 Bilang isang bukod, dahil ang ilan sa mga function ay kaya darn karaniwang - 855 00:53:08,900 --> 00:53:12,390 strlen, prinf - aktwal na sila ay may uri ng espesyal na katayuan. 856 00:53:12,390 --> 00:53:15,310 At kaya kumalatong lang alam ng isang maliit na isang bagay na espesyal na tungkol sa mga ito. 857 00:53:15,310 --> 00:53:18,760 Iyon ay hindi palaging ang kaso sa karamihan ng mga function, kaya na dahilan kung bakit namin Nakakuha yelled sa. 858 00:53:18,760 --> 00:53:21,350 >> Hayaan akong subukan muli. Thankfully, ito nagtrabaho oras na iyon. 859 00:53:21,350 --> 00:53:23,560 Kaya ngayon hayaan mo akong patakbuhin ang aking sariling strlen programa. 860 00:53:23,560 --> 00:53:29,740 Bigyan mo ako ng isang string: H-E-L-L-O, Ipasok. At ako screwed up. 861 00:53:29,740 --> 00:53:34,750 Bakit? >> [Hindi marinig na mag-aaral tugon] >> Mismong. 862 00:53:34,750 --> 00:53:39,180 Kaya Mayroon akong aking sarili dito isang napaka-kaakit-akit na walang-katapusang loop 863 00:53:39,180 --> 00:53:42,270 dahil kahit ako incrementing haba sa bawat pag-ulit, 864 00:53:42,270 --> 00:53:47,860 kung ano ang ako malinaw na hindi ginagawa? Hindi ako incrementing i. Okay. Madaling aayos. Oo? 865 00:53:47,860 --> 00:53:52,430 Okay. No Ngayon ay namin patakbuhin afoul ng ilang mga iba pang mga karaniwang pagkakamali kung saan kailangan ko ng mga bracket. 866 00:53:52,430 --> 00:53:54,430 At lantaran, ang code na ito ay nagsisimula upang tumingin pangit, 867 00:53:54,430 --> 00:53:56,460 sa gayon ay isasaalang-alang namin ang isang ulos sa paglilinis ito up sa isang sandali. 868 00:53:56,460 --> 00:53:58,810 Ngunit ngayon ako incrementing parehong haba at i. 869 00:53:58,810 --> 00:54:02,630 Lantaran, na ako makakita ng isang pagkakataon para sa pagpapabuti dito, ngunit makikita namin bumalik na. 870 00:54:02,630 --> 00:54:05,270 >> Kaya ngayon sabihin tiyakin lamang kami ng hindi bababa sa paggawa ng progreso. 871 00:54:05,270 --> 00:54:08,320 Ito ay nangyari sa ilang mo, at napapabayaan ko banggitin ito nang maaga. 872 00:54:08,320 --> 00:54:12,420 Kapag mo ang kasawian ng isang sitwasyon tulad nito, kung paano mo ayusin ito 873 00:54:12,420 --> 00:54:15,130 maikling ng i-restart ang appliance o sa iyong computer o isara ang window? 874 00:54:15,130 --> 00:54:16,860 Aktwal na madaling. 875 00:54:16,860 --> 00:54:21,680 Control C ay ipadala ito sa maliit na karot simbolo C, at na terminate lang sa karamihan ng mga programa. 876 00:54:21,680 --> 00:54:25,990 Kung mayroon kang isang ganap na hindi maayos walang-katapusang loop na pag-print ng mga bagay na walang hanggan maraming beses, 877 00:54:25,990 --> 00:54:29,960 minsan na maaaring mayroon ka upang maabot Control C isang libong beses upang gawin itong aktwal na marinig ang mga ito. 878 00:54:29,960 --> 00:54:33,910 Kaya lang Napagtanto ngayon dahil hindi ako nagpi-print ang anumang bagay, na medyo madali. 879 00:54:33,910 --> 00:54:37,970 At technically, kapag suffices, ngunit nakukuha ko mawalan ng tiyaga at ako karaniwang pindutin ito na maraming beses. 880 00:54:37,970 --> 00:54:43,400 >> Kaya strlen. Bigyan mo ako ng isang string: HELLO. Ay ito upang gumana ang oras na ito? 881 00:54:44,580 --> 00:54:47,490 Okay. Isa pang karaniwang pagkakamali. Kailangang mag-recompile. 882 00:54:47,490 --> 00:54:50,430 Na ay sinadya, na ang isa. Ayos lang. 883 00:54:50,430 --> 00:54:54,260 Kaya strlen, H-E-L-L-O, ang Enter. Mahusay na. 884 00:54:54,260 --> 00:54:55,910 Kaya ngayon namin ay may strlen sa 5. 885 00:54:55,910 --> 00:54:58,100 Kaya literal namin reimplemented wheel na. 886 00:54:58,100 --> 00:55:02,080 Kaya ngayon sabihin linisin ang up na ito dahil ito ay hindi ako impressed 887 00:55:02,080 --> 00:55:04,080 na ang disenyo ng aking code. 888 00:55:04,080 --> 00:55:07,200 Ano ang maaari naming malinaw na maalis sa programang ito upang linisin ito up? 889 00:55:07,200 --> 00:55:11,840 [Hindi marinig na mag-aaral ng tugon] >> Oo. Literal, kami ay pagpapagamot i at haba identically. 890 00:55:11,840 --> 00:55:16,440 Kaya bakit hindi namin lamang makakuha ng smart at sabihin habang haba? 891 00:55:16,440 --> 00:55:20,450 Sa halip, sabihin lamang tawagan ang haba upang magsimula sa, initialize ito sa 0 892 00:55:20,450 --> 00:55:23,340 dahil sa pamamagitan ng default string ay hindi haba hanggang sa nalaman namin kung ano ito ay. 893 00:55:23,340 --> 00:55:26,160 >> Ngayon ay ginagawa namin ito, at ngayon ito ay isang medyo eleganteng programa. 894 00:55:26,160 --> 00:55:28,660 Isa variable. Nalinis ko ito up, tightened ito. 895 00:55:28,660 --> 00:55:31,980 Kaya ngayon sabihin bumalik sa aking terminal na window. Natin sige at patakbuhin ang. 896 00:55:31,980 --> 00:55:35,670 Gawing strlen. Mukhang mabuti. Patakbuhin ang strlen muli, ang Enter. 897 00:55:35,670 --> 00:55:40,680 Bigyan mo ako ng isang string: HELLO, Ipasok. At tila gumagana tulad ng 5. 898 00:55:40,680 --> 00:55:45,580 Ngayon, upang maging malinaw, kung hindi ako ay nakasulat, halimbawa, HELLO sa 1 string 899 00:55:45,580 --> 00:55:48,840 at pagkatapos bye sa isa pa, maaari naming tiyak na magkaroon ng maramihang mga salita. 900 00:55:48,840 --> 00:55:53,150 Kung ang mga expression na aktwal na gusto ko i-type ay hindi HELLO ngunit, halimbawa, 901 00:55:53,150 --> 00:55:58,920 HELLO mundo, notice na kung ano ang hindi namin ay may sitwasyong ito dito, i-right? 902 00:55:58,920 --> 00:56:00,580 Na maaaring magmungkahi na na 2 string. 903 00:56:00,580 --> 00:56:06,060 Kang tiyak na maaaring magkaroon ng mga character ng space bar, kaya kung namin talagang type sa isang mas mahabang pariralang 904 00:56:06,060 --> 00:56:08,390 tulad ng Hello World, kung ano ang namin talagang sa memory 905 00:56:08,390 --> 00:56:12,730 mukhang isang maliit na bagay tulad na mayroong. 906 00:56:12,730 --> 00:56:18,910 >> Ayos lang. Anumang mga katanungan tungkol sa representasyon sa dito ng string? 907 00:56:18,910 --> 00:56:20,450 Hindi? Ayos lang. 908 00:56:20,450 --> 00:56:25,130 Kaya sinabi ko mas maaga na pagtawag strlen muli at muli sadyang tulad na 909 00:56:25,130 --> 00:56:28,070 ay marahil hindi ang pinakamahusay na ideya dahil ka na ang paggawa ng isang buong maraming trabaho 910 00:56:28,070 --> 00:56:30,280 muli at muli at muli. 911 00:56:30,280 --> 00:56:36,150 Katunayan, kung anong uri ng trabaho ay kinakailangan para sa pag-uunawa ng ang haba ng isang string, tila? 912 00:56:36,150 --> 00:56:40,720 Mayroon kang magsimula sa simula at pagkatapos ay hanapin, hanapin, hanapin, hanapin, hanapin 913 00:56:40,720 --> 00:56:44,930 hanggang sa ikaw ay sa wakas makita na ang mga espesyal na character, sa puntong, ah, ngayon alam ko ang haba. 914 00:56:44,930 --> 00:56:48,040 Kaya mas maaga kapag kami ay strlen tinatawag na muli at muli at muli, 915 00:56:48,040 --> 00:56:52,080 ang dahilan ko iminungkahi na uri ng bobo dahil muli, string na kamukha na. 916 00:56:52,080 --> 00:56:54,880 Hindi ito baguhin sa bawat oras na umulit sa pamamagitan ng ilang loop, 917 00:56:54,880 --> 00:56:56,890 kaya gumagawa ka ng hindi kinakailangang trabaho. 918 00:56:56,890 --> 00:57:00,620 Sa parehong oras na dapat mong malaman, bilang isang bukod, na compiler tulad kumalatong mga araw na ito 919 00:57:00,620 --> 00:57:02,530 ay nabuo sa loob ng maraming taon, 920 00:57:02,530 --> 00:57:05,690 at tagatala manunulat, programmer, medyo na smart. 921 00:57:05,690 --> 00:57:10,170 At kaya ito lumiliko na kumalatong at iba pang mga compiler ay maaaring aktwal na malaman na, 922 00:57:10,170 --> 00:57:13,650 okay, oo, sinulat ni strlen sa iyong kondisyon, 923 00:57:13,650 --> 00:57:17,520 na technically nangangahulugan na kami tatawag ito muli at muli at muli. 924 00:57:17,520 --> 00:57:21,880 Ngunit ang smart compiler ay maaaring aktwal na-optimize ang mga uri ng mga mahihirap na desisyon ng user 925 00:57:21,880 --> 00:57:23,870 ng iyong code sa pagtutumpak ang mga bagay. 926 00:57:23,870 --> 00:57:27,360 >> Kaya lang Napagtanto na minsan tagatala ay mas matalinong kaysa sa amin 927 00:57:27,360 --> 00:57:29,210 at uri ng itago ang ating sariling pagkakamali. 928 00:57:29,210 --> 00:57:31,620 Ngunit tiyak na pagdating sa mga set ng problema at ang mga tulad ng, 929 00:57:31,620 --> 00:57:35,340 huwag iniisip tungkol sa mga sa panimula maling desisyon ng disenyo 930 00:57:35,340 --> 00:57:38,110 potensyal para sa simpleng dahilan na gusto namin ang paggawa ng paraan pang trabaho 931 00:57:38,110 --> 00:57:41,330 kaysa sa aktwal na namin gawin. Ngunit paano higit pang trabaho? 932 00:57:41,330 --> 00:57:44,960 Sa kaso ng Hello World, sabihin simulan upang magbigay ng tuntuning panlahat ang laki ng problema na ito. 933 00:57:44,960 --> 00:57:48,100 Ano ang haba ng problema o ang laki ng problema 934 00:57:48,100 --> 00:57:50,770 kapag ang salitang ang gumagamit na nai-type sa HELLO? 935 00:57:50,770 --> 00:57:53,790 Ito ay tila 5, siguro 6. Plus o minus 1. Anuman. 936 00:57:53,790 --> 00:57:55,680 Kaya malapit lang namin tumawag ito 5. 937 00:57:55,680 --> 00:58:00,480 >> Kaya kung ano ang laki ng problema dito kapag sinusubukan upang malaman kung ang haba ng HELLO? 938 00:58:00,480 --> 00:58:06,790 Ito ay 1, 2, 3, 4, 5, at maaaring 6 para sa huling character, ngunit sabihin ng tuntuning panlahat na bilang n. 939 00:58:06,790 --> 00:58:10,300 Kaya n, lamang ang variable n, ay kung ano ay karaniwang gamitin ang mga siyentipiko computer na 940 00:58:10,300 --> 00:58:13,890 upang ilarawan ang laki ng problema, at ang problema sa kamay ay kung gaano katagal ang HELLO? 941 00:58:13,890 --> 00:58:17,050 Gaano karaming oras ang strlen? 942 00:58:17,050 --> 00:58:21,010 Tumatagal sa pagkakasunud-sunod ng mga hakbang sa n, kung saan ang bawat hakbang ay nangangahulugan na ang pagtingin sa isang character, 943 00:58:21,010 --> 00:58:23,350 tumingin sa isang character, tumingin sa isang character. 944 00:58:23,350 --> 00:58:26,850 At nagkaroon kami ang talakayang ito sa isang habang pabalik, ang bilang ng mga pagpapatakbo ng isang bagay na tumatagal. 945 00:58:26,850 --> 00:58:29,910 Ang unang araw ng klase ay namin ang lahat awkwardly tumayo, 946 00:58:29,910 --> 00:58:32,060 at pagkatapos ay lahat nagsimula pagpapares off sa bawat isa 947 00:58:32,060 --> 00:58:35,990 upang aktwal na bilang ng perpektong gaano karaming mga tao ay sa kuwarto. 948 00:58:35,990 --> 00:58:39,860 At ginawa din namin ng isa pang bagay kung saan kung ginawa ko sa halip ang lumang paraan ng paaralan 949 00:58:39,860 --> 00:58:44,800 ng simula 1, 2, 3, 4, 5, 6 at iba pa, 950 00:58:44,800 --> 00:58:49,360 na masyadong, ang laki ng problema na n laki. May mga n tao sa kuwarto. 951 00:58:49,360 --> 00:58:52,010 Ngunit maaaring mapabilis ko na up, tama? Grade estilo ng paaralan ay maaaring kong simulan ang pagbibilang sa 2s. 952 00:58:52,010 --> 00:58:55,560 2, 4, 6, 8, 10, 12. At na nararamdaman kaya mas mabilis, at sa katunayan ito ay. 953 00:58:55,560 --> 00:59:01,720 Literal dalawang beses bilang mabilis, ngunit muli, kung ang isa pang 400 mga tao lumakad sa kuwartong ito 954 00:59:01,720 --> 00:59:08,250 lahat nang sabay-sabay, ang mga algorithm na iyon ay tumagal ng isa pang 400 o 200 hakbang siguro. 955 00:59:08,250 --> 00:59:13,310 >> Ngunit sa pamamagitan ng kaibahan, kung namin talagang makakuha sa smart at sa halip namin ay may lahat ng iyong bilangin sarili, 956 00:59:13,310 --> 00:59:15,280 isipin ang kung paano ang algorithm na nagtrabaho. 957 00:59:15,280 --> 00:59:17,110 Lahat nakatayo up. Hayaan akong fast-forward na ito. 958 00:59:17,110 --> 00:59:20,430 Lahat nakatayo up, ipinares mo off, pagkatapos ay kalahati ng sa iyo nakaupo pababa, 959 00:59:20,430 --> 00:59:22,510 nakaupo pababa ang kalahati ng sa iyo, ang kalahati ng nakaupo, 960 00:59:22,510 --> 00:59:27,350 at sa bawat pag-ulit ng loop na ito mula sa linggo 0, halved namin ang problema sa kamay 961 00:59:27,350 --> 00:59:30,040 at napunta sa n / 2, pagkatapos n / 4, pagkatapos n / 8. 962 00:59:30,040 --> 00:59:35,350 At ang mga implikasyon ng na ay na kung ang isa pang 400 mga tao maglakad sa room, hindi sang-ayon, 963 00:59:35,350 --> 00:59:40,120 tumagal kami ng 1 pang ikot, hindi 400 higit pang mga round, hindi 200 higit pang round. 964 00:59:40,120 --> 00:59:43,640 At kaya ang kuwento namin sinabi habang pabalik ay upang gawin ang isang maliit na isang bagay na ito. 965 00:59:43,640 --> 00:59:47,750 Ito pulang linya dito ay linear, tuwid, at ito ay may label na bilang n 966 00:59:47,750 --> 00:59:50,250 dahil bilang ang laki ng problema ay lumalaki, 967 00:59:50,250 --> 00:59:54,690 kung ang iyong algorithm o programa kung saan ka paglutas ito ay tumatagal ng n hakbang, 968 00:59:54,690 --> 00:59:58,620 maaari naming Plot ang mga ito bilang isang tuwid na linya kung saan ito ay tumatagal ng mas maraming oras mas malaki ang laki ng problema. 969 00:59:58,620 --> 01:00:03,280 At ang diskarte twosies, pagbibilang 2, 4, 6, 8, pa rin ng isang tuwid na linya, sandali lang mas mahusay. 970 01:00:03,280 --> 01:00:08,440 Ito ay tumatagal ng kaunti mas kaunting oras, kaya ang dilaw na linya sa ibaba ang pulang point ng linya para sa punto. 971 01:00:08,440 --> 01:00:12,580 >> Ngunit mas mahusay ay ang banal na Kopita ng kung ano ang aming tinatawag logarithmic oras 972 01:00:12,580 --> 01:00:14,830 kung saan kahit na muli namin double ang bilang ng mga tao sa room, 973 01:00:14,830 --> 01:00:18,240 double namin ang laki ng telepono na libro mula sa unang araw ng klase, 974 01:00:18,240 --> 01:00:22,310 hindi sang-ayon, ito ay tumatagal ng 1 higit pang mga pahina ng luha, tumatagal ng 1 pang sitting down na 975 01:00:22,310 --> 01:00:25,550 upang malutas ang isang problema na dalawang beses na malaki. 976 01:00:25,550 --> 01:00:27,460 At sa gayon ang pag-uusap na namin ngayon upang simulan ang pagkakaroon ay 977 01:00:27,460 --> 01:00:30,380 kung paano namin aktwal na malutas ang mga problema mahusay 978 01:00:30,380 --> 01:00:32,510 kung isaalang-alang namin ang pinakasimpleng ng mga problema tulad nito? 979 01:00:32,510 --> 01:00:36,210 Ipagpalagay na mayroon kaming 8 pinto sa likod na ang ilang mga numero, 980 01:00:36,210 --> 01:00:39,720 at ang bawat isa sa mga bilang na ito ay hindi pinagsunod-sunod sa anumang paraan, 981 01:00:39,720 --> 01:00:42,830 sila lamang random na integer sa likod ng mga pintuan, 982 01:00:42,830 --> 01:00:47,290 at hinihiling namin ang tanong kung paano mo pumunta tungkol sa paghahanap ang bilang - na nakakaalam - 983 01:00:47,290 --> 01:00:50,250 7 likod mga pinto? 984 01:00:50,250 --> 01:00:53,400 Ano ang gusto mong, ang isang tao, gawin upang mahanap ako ng bilang 7 985 01:00:53,400 --> 01:00:56,810 kung muli sa bawat isa sa mga ito ay pinto at upang makita ang isang halaga na mayroon kang magbukas ng pinto? 986 01:00:56,810 --> 01:00:59,650 Ano ang iyong algorithm ay marahil? 987 01:00:59,650 --> 01:01:05,310 >> [Hindi marinig na mag-aaral tugon] >> Kaya magsimula sa kaliwa at magbukas ng pinto, buksan ang isang pinto, buksan ang isang pinto. 988 01:01:05,310 --> 01:01:08,570 At sa pinakamasama kaso, kung gaano katagal ito upang dalhin sa amin upang mahanap ang numero 7? 989 01:01:08,570 --> 01:01:12,800 At muli, hindi sila pinagsunod-sunod, kaya ito ay hindi kasing-dali ng, maayos, ako pagpunta sa buksan ang 7th pinto. 990 01:01:12,800 --> 01:01:15,240 Maaaring magtagal amin, maximally, 8 hakbang. 991 01:01:15,240 --> 01:01:19,940 Sa pinakamasama kaso, 7 ay random sa pinakadulo ng linya ng mga pinto, 992 01:01:19,940 --> 01:01:22,090 sa gayon ay maaari naming upang subukan ang lahat ng mga pinto n. 993 01:01:22,090 --> 01:01:24,440 Kaya muli dito, mukhang namin upang magkaroon ng isang linear na algorithm. 994 01:01:24,440 --> 01:01:27,030 Sa katunayan, ginawa namin ito lamang ng ilang taon na ang nakalipas. 995 01:01:27,030 --> 01:01:29,910 Isa ng iyong mga predecessors ay hinamon sa tiyak na ito 996 01:01:29,910 --> 01:01:32,050 kung saan hindi namin magkaroon ng isang digital na bersyon, sa halip namin ay nagkaroon ng isang pisara 997 01:01:32,050 --> 01:01:33,780 may ilang mga piraso ng papel na ito. 998 01:01:33,780 --> 01:01:36,940 At kung ano ang naisip ko na gusto kong gawin ay kumuha ng isang mabilis na pagtingin sa kung paano ito nagpunta, 999 01:01:36,940 --> 01:01:40,760 isa ng ang pinakamahusay at marahil pinaka-mahirap na pagkakataon sa entablado 1000 01:01:40,760 --> 01:01:42,530 sa isang demonstration dito mismo sa Sanders. 1001 01:01:42,530 --> 01:01:44,000 Nagkaroon kami ng 2 mga hilera ng mga numero. 1002 01:01:44,000 --> 01:01:47,280 Lamang namin ay pagpunta sa tumingin sa kung ano ang mangyayari dito may Sean para sa pinakatuktok ng mga hilera. 1003 01:01:47,280 --> 01:01:49,660 Maliban kung hindi isa sa kailanman muli boluntaryo sa CS50, 1004 01:01:49,660 --> 01:01:52,010 nagkaroon kami ng pagpapala ng Sean upang panatilihin ito sa camera, 1005 01:01:52,010 --> 01:01:54,670 kaya siya alam na ang daan-daang ng mga tao ay nanonood ito para sa taon na ngayon. 1006 01:01:54,670 --> 01:01:59,500 Ngunit Sean ginawa sa kahanga-hangang trabaho - o ginawa niya - sa aktwal na paghahanap sa amin ng isang partikular na numero. 1007 01:01:59,500 --> 01:02:04,570 >> Kaya sabihin makita kung paano malulutas niya ang algorithm na ito nang sa gayon ay makikita namin ipagpatuloy ang pag-uusap na ito bago mahaba 1008 01:02:04,570 --> 01:02:08,300 kung paano mahanap namin ang mga bagay mahusay. 1009 01:02:08,300 --> 01:02:12,300 [Malan sa video] ako maitago sa likod ng mga pintuan ang bilang 7, 1010 01:02:12,300 --> 01:02:16,710 ngunit nakatago ang layo mula sa ilang ng mga pintuan pati na rin ang iba pang mga hindi-negatibong numero, 1011 01:02:16,710 --> 01:02:19,980 at ang iyong layunin ay sa tingin ng mga ito tuktok na hilera ng mga numero bilang isang array lamang 1012 01:02:19,980 --> 01:02:22,920 o lamang ang pagkakasunud-sunod ng mga piraso ng papel na may mga numero sa likod ng mga ito, 1013 01:02:22,920 --> 01:02:26,960 at ang iyong layunin ay, lamang gamit ang nangungunang array dito, hanapin sa akin ang bilang 7. 1014 01:02:26,960 --> 01:02:30,800 At pagkatapos namin ay pagpunta sa pumupuna kung paano pumunta tungkol sa gawin ito. >> Lahat ng karapatan. 1015 01:02:30,800 --> 01:02:33,880 [Malan] Maghanap ng sa amin ang numero 7, pakiusap. 1016 01:02:36,210 --> 01:02:38,350 [Tawa] 1017 01:02:41,610 --> 01:02:44,460 [Malan] No [tawa] 1018 01:02:45,760 --> 01:02:58,080 5, 19, 13, [tawa]. Hindi isang nanlilinlang tanong. 1019 01:03:00,560 --> 01:03:02,390 1. 1020 01:03:04,560 --> 01:03:06,910 [Tawa] 1021 01:03:06,910 --> 01:03:10,760 Sa puntong ito ang iyong iskor ay hindi napakagandang, kaya maaari mong pati na rin panatilihin ang pagpunta. [Tawa] 1022 01:03:12,490 --> 01:03:14,070 3. 1023 01:03:17,340 --> 01:03:23,480 Pumunta sa. Lantaran, hindi ko maaaring makatulong ngunit magtaka kung ano ang kahit pinag-iisipan mo tungkol sa. [Tawa] 1024 01:03:25,010 --> 01:03:28,870 Tanging ang tuktok na hilera, kaya mayroon kang 3 kaliwa. Kaya mahanap ako ng 7. 1025 01:03:28,870 --> 01:03:45,360 [Mag-aaral murmuring] 1026 01:03:46,270 --> 01:03:49,870 [Malan] 17. 1027 01:03:49,870 --> 01:03:55,460 [Mag-aaral murmuring] 1028 01:03:56,920 --> 01:04:01,550 [Malan] 7! [Palakpakan] 1029 01:04:01,550 --> 01:04:06,080 >> Kaya sa Miyerkules ay namin sumisid sa ito at mas sopistikadong algorithm para sa paghahanap ng mga bagay. 1030 01:04:06,080 --> 01:04:10,200 Sa ngayon, ipapakita namin iniwan mo sa Sean at nakikita mo sa Miyerkules. 1031 01:04:11,280 --> 01:04:13,000 [CS50.TV]