[Powered by Google Translate] [Linggo 3] [David J. Malan - Harvard University] [Ito ay CS50. - CS50.TV] Hayaan akong kapong torete sa amin sa direksyon kung saan namin tumigil huling beses, na nagsisimula sa tingin ng kaunti pa kaysa tungkol sa syntax at sinusubukang mag-isip ng kaunti mas kaunti tungkol sa lahat ng mga detalye na tumatagal ng kaunting oras upang mahirati sa klima upang sa gayon ay malayo sa mga tuntunin ng semicolons at panaklong at kulot tirante, upang simulan ang pagkuha ng mga bagay ng kaunti sa isang mas mataas na antas ng haka-haka sa gayon ay ang mga problema na namin ngayon simulan ang paglutas sa susunod na ilang linggo pagpunta sa may kasangkot higit pa sa mas mataas na antas ng haka-haka problema at isang bit mas mababa sa syntactical habang ikaw ay makakuha ng iyong mga paa basa at ang iyong mga kamay sa marumi na may ilang ng syntax mula sa mga nakaraang ilang linggo. Kaya manariwa sa diwa na ang huling linggo ipinakilala namin ang paniwala na ito ng isang array. At isang array sa Ingles ay inilarawan bilang kung ano? >> [Hindi marinig na mag-aaral tugon] Paumanhin? Isang koleksyon ng mga? >> [Hindi marinig na mag-aaral tugon] >> Okay, mabuti. Isang koleksyon ng mga item. Kaya nakita namin ang mga array sa scratch. Kung ikaw nangyari upang gamitin para sa pset 0 isa ng scratch sa listahan na maaari mong i-drag ang mga bagay tulad ng mga dalandan at saging sa, isang imbentaryo ng mga uri, na uri ng tulad ng kung ano ang isang array. At pagkatapos ay mas technically, sa konteksto ng isang aktwal na computer, array ay simpleng magkadikit na tipak ng memorya. Sa ibang salita, mayroon kang isang byte, isa pang byte, pagkatapos ibang byte, pagkatapos ay isa pang byte, at kung ikaw ay upang gumuhit ng mga bytes sa isang larawan, sila na bumalik upang i-back i-back upang i-back. Iyon ay kung ano ang ibig sabihin namin sa pamamagitan ng magkadikit. Kaya byte numero 1, pagkatapos 2, pagkatapos 3. Hindi ito nangangahulugan dito, hanggang dito, hanggang dito, dito. Array ay isang magkadikit na tipak ng 0 o higit pa bytes. Kaya kung ano ang mga ito ay kapaki-pakinabang para? 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 upang makalkula ang average ng iyong pagsusulit para sa ilang mga kurso, at isipin ang na maaari naming simulan ang pagsusulat ng programang iyon sa pamamagitan ng deklarasyon ng variable quiz1. Pagkatapos kami isa pang variable na tinatawag na quiz2. Ngunit kung mayroong 3 pagsusulit sa klase, quiz4. O kung mayroong ay isang lingguhang pagsusulit, ito ay quiz5, quiz6, quiz7. Kaya nais mong magkaroon ng lahat ng mga variable na ito na ipinahayag sa loob ng pangunahing o sa iba pang lugar sa iyong programa, at ang problema sa diskarte na, madaling bagaman ito ay upang kopyahin lamang at i-paste, ito lamang napakabilis magiging mahirap gamitin. Huwag sana iyong aktwal na 30 Pagsusulit o 50 mga pagsusulit. Kung ito ay tulad ng isang mataas na paaralan ng estilo pang-araw-araw na pop pagsusulit, pagkatapos mo lamang ridiculously mahaba listahan ng mga variable na ipinahayag, at ito lamang masyadong mabilis nakakaabala ng control. Ito ay pangit, mahirap upang mapanatili, kaya mas madali upang gumawa ng typo kung makakakuha ka ng 1 bilang namali sa isang lugar sa iyong programa. Kaya ipinakilala namin ang paniwala ng isang array sa halip. At isipin ang na ipinatupad namin ang program na ito sa pamamagitan ng paggawa ng isang maliit na bagay tulad nito. Hayaan akong pumunta sa Source ngayon 3 Lunes direktoryo at buksan array, na nakita natin ang huling beses. At kahit na mayroong ilang mga bagong trick C dito, kasama ng mga ito ang paniwala ng isang pare-pareho, isipin ang na namin ipinahayag maramihang mga kamay mahalagang sa pamamagitan ng gamit ang syntax na ito: Float, pagkatapos ay ang pangalan ng variable, pagkatapos ginamit namin square tirante talagang para sa unang pagkakataon, at kung ano ang ginawa namin sa loob ng mga parisukat na tirante ay epektibong maglagay ng numero. Ngunit sa halip ng paglalagay ng numero, ko bang ilagay ito capitalized salita, Pagsusulit. At kung ano ang pagganyak para sa paglalagay ng capitalized na salita tulad ng mga pagsusulit at pagkatapos gamit ang nanlilinlang linya 17 dito upang aktwal na bigyan na ang isang numero? Ano ang pagganyak doon? Oo. [Hindi marinig na mag-aaral tugon] >> Mismong. Kung gusto naming upang baguhin ang halaga 2, lamang namin upang baguhin ito sa 1 lugar dahil isaalang-alang - hindi ko matandaan kung ano ang programang ito ginawa eksakto, ngunit kung ikaw lang sagap mo ang pagsusulit, pagsusulit. Mo ang pagsusulit, pababa dito mas Pagsusulit. Kaya kung hindi namin ginawa ito pare-pareho, ang paggamit ng matalim tukuyin, ay na-type namin 2, pagkatapos ay 2, pagkatapos ay 2, pagkatapos ay 2, na fine. Ito ay tulad ng tamang. Ngunit ipagpalagay na sa susunod na taon mayroon kaming 3 pagsusulit sa CS50. Kaya Mayroon akong pumunta at i-update ang code, mayroon akong mag-recompile ito, ngunit ang problema kung gawin ko ng damit na bobo, tulad Tinatanaw ko 1 pagbanggit ng 2 at kalimutang i-plug sa 3, ang buong programa ay maaaring mahusay na masira. Kaya lang kami humihingi para sa pag-. Kaya ang paniwala ng isang pare-pareho ang lahat ng tungkol sa factoring ang ilang mga piraso ng data, kung ito ay isang string o isang pansamantalang trabaho o Float o anumang, at deklarasyon ito ng 1 lugar sa gayon na maaari mong mas kaagad na baguhin ito sa hinaharap. At ito rin, lantaran, bit mas madali upang mabasa dahil kung sa tingin mo lamang ng ito ngayon, ito pagsusulit, o maaari naming kahit na palitan ang pangalan ito ng isang bagay tulad ng NUMBER_OF_QUIZZES o ng isang bagay na mas tahasang. Ang code nagiging ng kaunti pa halata sa kung ano ang ginagawa, at iniisip mo ng kaunti mas mababa kung ano ang numero ng 2 maaaring mangyari sa ibig sabihin. Kaya ang constant may walang kinalaman sa panimula may array. Array na ay ipinakilala sa pamamagitan ng mga parisukat na tirante. Kaya mapapansin na sa linya 23, hinihiling namin ang gumagamit, "Ano ang iyong mga marka ng pagsusulit?" Pagkatapos lamang namin ito loop na tila nagtatanong sa gumagamit para sa kanilang mga grado. Paano? Ito iterates mula 0 sa 2. At sinasabi ko 2 dahil pagsusulit sa lahat ng caps ay kasalukuyang 2. Kaya ito iterates mula 0 hanggang sa 2 at pagkatapos ng mga Kopya out Pagsusulit # isang bagay ng isang bagay, at pagkatapos ito ay gumagamit ng GetFloat upang makakuha ng isang halaga mula sa mga gumagamit. Kaya mapansin ito lamang ang iba pang mga bagong piraso ng syntax mula sa huling Miyerkules. Kung gusto mo upang mag-imbak ng isang bagay sa isang partikular na lokasyon sa array na, ka na muling gamitin ang mga square bracket. Kaya may isang bit ng paghihiwalay sa dalawang bahagi dito. Ang unang pagkakataon na ginamit mo ang mga square bracket gamitin mo ito upang tukuyin kung gaano kalaki ang nais mong array na. Ngunit ito sa tabi konteksto dito kung saan namin muli nagpapatupad ng mga square bracket ay nangangahulugan na kung saan sa na array ang gusto mong ilagay ang ilang mga halaga? At ang pagkakaiba dito natukoy na mula sa konteksto. Mapansin dito kami ay may isang uri ng data, pagkatapos ay mayroon namin ang pangalan ng variable, mayroon kaming aming mga parisukat na tirante na may isang numero ng loob, semicolon. Iyan na ang lahat. Kaya na ng deklarasyon. Ito ay tulad ng kahit na namin ay tapos na isang bagay tulad ng Float grade1; Float grade2; ngunit muli, ito masyadong mabilis devolves sa paraan masyadong maraming kopya, i-paste, kaya sa halip lang namin pinasimple ito bilang tulad, na nangangahulugan na mula ngayon mayroon kami ng grado na maaaring naka-imbak sa bracket 0, kami ay may isa pang grado na maaaring naka-imbak sa bracket 1, ngunit kung ano kung ako loko at, halimbawa, ang aking loop napupunta sa ngayon - halimbawa, gumawa ako ito mas mababa sa o patas sa, kung saan manariwa sa diwa ay ang pinagmulan ng isang nakaraang bug - na epektibong ay nangangahulugan na sa ilang mga ikatlong aksidenteng pag-ulit na ito loop Gamitin ko bracket 2. Epektibo, kung ano ang maaaring mangyari dito? Paumanhin? [Mag-aaral] Ito ay pagpunta sa mapapalitan. >> Ay pagpunta sa papalitan? Ano ang gusto papalitan? Ito literal ay sinasabi na palitan kung ano ang sa lokasyon 2 ang return halaga ng GetFloat. Ngunit ang problema ay kung gaano kalaki ang array sa puntong ito sa kuwento? [Hindi marinig na mag-aaral ng tugon] >> array pa rin lamang ng laki 2 dahil ang array, tulad ng anumang variable, ay ipinahayag una, bago namin ito ginamit, at hindi na namin tinukoy dito dahil sa ito pare-pareho na mayroon akong 2 grado na ako pagpunta sa ilagay. Ngunit tandaan, ang mga siyentipiko ng computer na magbilangan mula 0. Kaya ang unang lokasyon sa array na bracket 0. Ang susunod na lokasyon ay 1. Ang bagay na ito ay napaka bahagyang Masyadong malayo sa gilid. Kaya sa ibang salita, kung aktwal na ako ay may array na ito - at hayaan mo akong makita kung gaano kahusay ito cooperates dito para sa amin - kung mayroon akong isang array na lamang ko na iguguhit tulad ng sumusunod at ko na inilalaan puwang para sa 2 elemento, maaari ko gumuhit ito tulad nito sa memory kung saan ito malaking puting canvas. Lang ang RAM ko sa aking computer, isang karetela ng RAM, 2 gig ng RAM, anumang, ngunit ang 2 kahon ngayon indibidwal na kumakatawan sa isang Float, 32 bit. 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 ngunit gagawin ko bracket 2, na tulad ng paglalagay ng isang bagay dito. At ng larawan ay nagmumungkahi, mayroong wala doon. Ito ay uri ng tulad ng lupa walang tao dahil hindi ako tanungin ang operating system upang bigyan ako ng ikatlong pagsusulit na ito. Kung ginawa ko nais na ikatlong pagsusulit, dapat ko ay ang pag-iintindi sa kinabukasan tanungin ang operating system para sa ito sa pamamagitan ng deklarasyon pagsusulit na hindi 2 ngunit sa halip na katumbas ng 3. Kaya sa ibang salita, ang mga larawan na namin epektibong sa kamay ganito ang hitsura dito. Ito muli ay lupa walang tao. Namin mas mahusay na hindi subukan ang pagsusulat ng mga halaga dito. Ngunit muli, dahil ang mga siyentipiko computer na mabibilang mula 0, kapag makipag-usap namin tungkol sa lokasyon na ito sa array, na dapat na lokasyon 0, ito ay dapat na lokasyon 1, at ito ay hindi kahit na umiiral dahil ipinapakita lang namin tinanong ang operating system para sa 2 tulad lugar. Kaya ang mga may bago programming na karanasan mula sa iba pang mga wika maaaring malaman na hindi ito palagi ang kaso sa array o bagay na tinatawag vectors. Sa halip, maaari mo lamang panatilihin ang pagdaragdag at pagdaragdag at magdagdag ng mga bagay sa array, kung saan, lantaran, kami ay na kakayahan sa simula at pa namin mukhang binigyan ito dito dahil may C programa mas tahasang. Lamang ito sa iyo at sa computer ngayon, at computer ay lamang gawin kung ano ang iyong sabihin sa ito upang gawin. Kaya kung mo lamang sabihin dito upang bigyan ka ng 2 kamay sa pamamagitan ng paraan ng linya 22 dito, na ang lahat ng ka pagpunta upang makakuha ng pabalik mula sa operating system: puwang para sa 2. Kaya nagiging ang iyong mga programa upang paminsan-minsan maraming surot tungkol sa array. Ito lamang ang uri ng likas na katangian ng mga hayop kung saan ang lahat sa atin ay maaaring magkamali, at sa ilang mga punto ay malamang index higit sa hangganan ng iyong array. At ito lamang ay isang magarbong paraan ng pagsabi ka nagpunta sa bracket ng isang bagay at isang bagay ay lamang masyadong malaki ng isang numero. Pinuntahan mo lagpas sa mga hangganan ng iyong array. Ngunit nakabaligtad ngayon ay ito. Ang ibang bahagi ng programang ito ay talagang ay wala sa panimula gawin sa array. Lahat ng ito ay tungkol sa ilang simpleng aritmetika para sa mga average ng computing. Kaya mayroon kaming dito sa ito para sa loop dito unang isang variable na tinatawag na kabuuan na namin initialize sa 0. Pagkatapos namin umulit mula 0 hanggang sa 2 muli at idagdag namin na variable pagbubuo ith grado, kaya bracket 0 pagkatapos bracket 1. At pagkatapos ay bilang na gusto mong gawin sa mababang paaralan upang makalkula ang average, lamang namin na kabuuan, hatiin ang mga ito sa pamamagitan ng kabuuang bilang ng mga pagsusulit, at pagkatapos ay para sa magandang panukalang tinatawag naming isang function dito tinatawag na round. Ngayon, bilang isang bukod, ano ang deal na ito parenthetical int sa linya 34? Maaaring ay nasa seksyon, hindi talaga uusapang tungkol dito pormal dito, ngunit kung ano ang int na ito sa parens marahil ginagawa? >> [Hindi marinig na mag-aaral tugon] Oo, ito ay tumutukoy sa Casting o typecasting, na nangangahulugan paglalaan 1 uri ng data at nagko-convert ang mga ito sa isa pang. Hindi mo maaaring gawin ito sa lahat ng mga uri ng data dahil minsan ito ay isang bit kakaiba. Ngunit sa kasong ito, kung ang return halaga ng ikot ng Float dahil, pagkatapos ang lahat, ako paglalaan ng Float at paghahati nito sa pamamagitan ng isang numero tulad ng 2, Ako pagpunta upang makakuha muli ng Float. Ngunit grado tao ng paaralan ay hindi talagang gusto malaman na ang kanilang mga average ay 93.4 dahil makikita nila Napagtanto sila ay kailanman kaya malapit na 95 rounding point. Kaya gusto namin sa halip na gamitin ang int upang isalin ang lahat sa pinakamalapit na int, kung alin sa kasong ito ay pagpunta sa 94 na walang punto matapos itong. Sa gayon ay isang maliit na matematika nanlilinlang. At kami na bumalik sa ang paniwala na ito ng paghahagis dahil ito ang mga implikasyon, kung hindi mo pa natuklasan na, para sa problema-set 2. Kaya ang isang array pagkatapos, maaari mong isipin ang - ito ngumiti sa akin ang lahat ng araw. Mukhang ito kung ikaw gumuhit ng larawan ng, ngunit ang susi ay sukat na iyon din ang napili mo kapag hiniling mo ito mula sa operating system. Anumang mga katanungan pagkatapos ay sa array? Oo. [Hindi marinig na mag-aaral tanong] Ah, magandang tanong. Ang tanong ay kung ano ang mangyayari sa ang null 0 sa array? Ito ay hindi umiiral sa konteksto na ito. Na umiiral lamang sa konteksto ng mga string, kung saan hindi namin tungkol sa darating sa sandali lamang. 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. At bilang isang bukod, baka ito ay hindi malinaw, Panatilihin ko na nagsasabi hinihiling mo ang operating system, tanungin ang operating system. Isang operating system, tulad ng malamang na alam, Mac OS, Windows, Linux. Kapag ikaw ay pagtawag sa function tulad GetFloat o ikaw ay deklarasyon variable tulad ng grado, sa pagtatapos ng araw epektibong ikaw ay humihingi ng ibang tao upang bigyan ka na memory sapagkat hindi namin bilang minimithi ng mga programmer walang ideya kung paano aktwal na makakuha ng pisikal na access sa memorya. Ngunit may ginagawa: operating system. 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 na nakikita mo sa iyong desktop, kung ang isang Mac o PC, operating system ay ang mababang antas ng pangmundo mga bagay, ang mataas na teknikal na mga bagay-bagay ng pamamahala ng gigabyte o 2 gigabytes ng memorya na mayroon kang, pamamahala ng CPU na mayroon kang, at iba pa. Kaya kapag sumusulat ka ng code, ikaw talaga hooking in sa iyong operating system sa na kahulugan. Ako pagpunta upang ma-minimize na. Ayos lang. Iba pang mga tanong tungkol sa mga array? Hindi? Okay. Kaya transition natural mula sa mga array ay talagang sa isang paksa na ng kaunti pamilyar. At kami ay tumingin napaka maikling sa huling beses na ito. Ito ay isang halimbawa ng string mula Miyerkules. Ang string na ito halimbawa ay isang medyo simpleng programa, at aktwal ko na pinasimpleng ito sa pamamagitan ng ilang mga linya para sa mga layuning ngayon. 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. Pagkatapos sa linya 22 pasulong tila ito ay pag-print na string 1 character sa bawat linya. Ngunit paano ito ginagawa ito? Kami ng deklarasyon ng variable i, ang pagtatakda katumbas ng 0, at ito ay nagiging lumang ugali ngayon. Hindi namin nakita ito hanggang Miyerkules, ngunit maaari mong uri ng magpakilala mula sa pangalan nito strlen lamang nagbabalik ano kapag ibinigay s? Ang haba ng string. Kaya kung pumasa ko ito ng isang string, quote-magpanipi David, sana ito bumalik sa akin ang bilang 5 dahil sa David. Upang ang layunin nito sa buhay ay isang string, kung hard code mo o sa kasong ito ay naka-plug in bilang isang variable, bilang isang argument, at figure na ito kung ano ang haba ng string na. Kaya dito ngayon kami ay paghiram ilang pagtatanda mula sa nakaraang halimbawa ng pagsusulit. Na ito ay walang gawin sa kamay, may walang gawin sa pagsusulit, ngunit ito lumiliko out na ang maliit na maliit na kasinungalingan namin ang nagsasabi sa iyo dahil linggo 1 ay na ang isang string ay hindi talaga umiiral sa C. Isang string sa pagtatapos ng araw ay talagang isang array lamang. Ang isang hanay ng mga byte, kaya byte, byte, byte, byte, kung manariwa sa diwa ay 8 bits, kaya tipak ng memorya, tipak ng memory, tipak ng memory, tipak ng memory. At ang mga paraan sa pamamagitan ng kung saan ang isang string ay ipinatupad sa pamamagitan ng paglalagay ng unang character dito, pagkatapos dito, pagkatapos dito, pagkatapos dito, bumalik upang i-back i-back sa memory ng computer. Kaya kung nais na baybayin ang isang salita tulad ng HELLO, nais mong ilagay ang 1 character na H, pagkatapos E, pagkatapos L pagkatapos L, pagkatapos O - 5 character sa kabuuang - isang lugar sa RAM ng iyong computer. Ngunit key detalye dito ay na sila ay pagpunta sa na bumalik upang i-back i-back sa likod, sa tabi mismo ng isa't isa. Kapag kapag sinasabi ko ang mga [i], kung ano sa Ingles ito nagbibigay sa akin? Ano ang mga [i] kumatawan sa kasong ito? Oo. [Mag-aaral] Ang ith character sa string. >> Mismong. Ang ith character sa string. Ngayon, ay i pagpunta sa magsimula sa 0 bawat aking para sa loop dito, ngunit mabuti dahil ang lahat ay nagsisimula pagbibilang mula 0. Kaya sa mga [0] ay upang kumatawan sa sulat H sa isang salita tulad ng HELLO, s [1] ay kumakatawan sa isang titik tulad ng E sa isang salita tulad ng HELLO, at iba pa. At kung ano ang mukhang namin na ginagawa sa bawat pag-ulit ng loop na ito ay pansamantalang pag-iimbak ang ith character sa isang variable na tinatawag c, na lamang pansamantalang trabaho, at pagkatapos kami ay pag-print out ang c kaya na sa pagtatapos ng araw kung ano ang programang ito ay ang mga sumusunod. Kung pumunta ako sa direktoryo ng pinagmulan at gumawa ako string1 at pumunta ako magpatuloy at patakbuhin string1, 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. Kaya mayroong isang pagkakataon para sa pagpipino dito. Ako uri ng paggawa ng pang trabaho, kahit mas malinaw siguro ang paraan na ito, kaysa sa kinakailangan. Aling linya ng code dito ko marahil itapon sa kabuuan? Oo. Linya 24. Sa linya 24 ako deklarasyon ng variable c. Pag-iimbak ako ith character ng mga ito, ngunit pagkatapos ay gumagamit ako ng c dito. Kaya ako gumagamit ng c, kaya Pakiramdam ko ay tulad ng hindi lamang ako makapag magtapon linya 24 layo. [Hindi marinig na mag-aaral komento] >> Mismong. Kaya pagdating sa pakikipag-usap tungkol sa disenyo ng mga programa, mapapansin ang ganitong bahagyang pagpapagaan ng code, na kung saan ay tulad ng nababasa, ngunit mapagtanto na s isang variable, ang uri ng data ay isang array, upang s [i] ay lamang pagpunta upang agad na bumalik sa ith character sa string na. At kung gusto mong i-print ito, na fine. Mo lamang gamitin% c dahil hindi ka naka pag-print ng isang string, nagpi-print ka ng isang karakter sa isang string, at ito ay may masyadong ang epekto ng pag-print sa ith karakter. At isipin ang pagkakaiba lamang talagang mula sa nakaraang linggo na may gamit printf samantalang sa linggo nakaraan gusto naming gawin ang isang bagay na sobrang simple tulad ng placeholder ang% s pagkatapos ay ang pangalan ng isang string dito, ngayon ay hindi namin diving sa ng kaunti mas malalim sa ilalim ng hood at sinasabi, hindi i-print ang string, i-print ang isang karakter sa ganyang bagay. Upang maaari naming gawin ang isang bagay ng kaunti ibang dito dahil may 1 iba - hindi bug dahil ang programang ito ay karapatan, ngunit ako sa paggawa ng isang bagay bobo na nabanggit ko maikling sa Miyerkules. Ngunit iniisip pabalik, kung paano maaaring mapabuti ang disenyo programang ito kahit pa? Oo. [Hindi marinig na mag-aaral ng tugon] >> Oh, mabuti. Kaya isipin ang na ipinakilala namin ang isang ikalawang variable na tinatawag na n huling beses, na mukhang contradicting sa ating sarili dahil ang aking layunin ng isang segundo na nakalipas ay lamang itapon ang isang variable bilang hindi kinakailangang, ngunit isipin ang na sa Miyerkules namin ang aktwal na ginawa ito. Ko binago ang para sa loop sa aktwal na magkaroon ng isang kuwit dito, pagkatapos n = strlen, at pagkatapos ay sa paglipas dito ako ginawa i > [Hindi marinig na mag-aaral tugon] >> Mismong. Hindi ako recalling strlen muli at muli at muli dahil isipin ang kung paano para sa mga gawa loop. Kahit na simulan nila upang makakuha ng mas komplikado na anyo, isipin ang na ang mga bagay bago ang unang semicolon Pinasimulan, kung saan ang mangyayari sa sandaling. Ang kundisyon, bagaman, sa gitna, at ito ay makakakuha ng check sa bawat oras na pumunta ka sa pamamagitan ng loop. Kaya ito uri ng bobo na humihiling sa computer sa parehong tanong muli at muli - Ano ang haba ng HELLO? Ano ang haba ng HELLO? Ano ang haba ng HELLO? - dahil tulad ng makikita namin makita ngayon at sa Miyerkules, ito ay tiyak na kumuha ng oras, at ito ay hindi isang mahusay na paggamit ng oras dahil upang malaman kung ang haba ng string aktwal na tumatagal ng isang bit ng pagsisikap. Hindi madalian, tulad ng ito ay sa ilang mga wika. Kaya sa pamamagitan ng pagbabago na ito sa n, ang presyo ako nagbabayad ay ang? Kami ay nakikita ng trade-off dito. Ang maaari kong i-save ang oras sa pamamagitan ng hindi na humihiling sa parehong mapahamak tanong muli at muli, ngunit ito ay pagpunta sa gastos sa akin ng isang bagay, na kung saan ay kung ano? [Mag-aaral] mawalan ka ng isang tiyak na halaga ng memorya. >> Mismong. Ito ay pagpunta sa gastos sa akin ang ilang memory. Kaya sa kasong ito nagkakahalaga ito sa akin kung ano ang? Isa pang 32 bit dahil n isang int, tulad ng ipinahiwatig ng salita int dito. Ngunit ay na okay? Lantaran, na marahil okay dahil kung sa tingin mo tungkol dito, ang na string ay, ang mas maraming oras ako pupunta na aksaya dahil strlen ay pagpunta upang tinatawag na muli at muli at muli para sa bawat pag-ulit ng loop. 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. Tingin ko ang maaari kong bayaran ang 4 ng mga bytes sa aktwal na mapabilis ang mga bagay up. Ngunit ito ay talaga ng trade-off at ng isang tema sa programming at sa computer science hindi talaga pagkuha ng anuman nang libre. Kung nais mong mapabuti ang isang bagay dito, mayroon kang magbayad para sa ito sa kabilang banda sa paanuman. Space kumpara sa oras sa kasong ito. Kaya ito ay ang lahat ng humahantong patungo sa isang bagay na misteriyoso tulad nito, kung saan, tulad ng malamang na naisip sa ngayon, aktwal sabi? [Hindi marinig na mag-aaral ng tugon] >> Oo, kaya ito ay, Maging sigurado sa uminom ang iyong Ovaltine, aktwal na gumagamit ng isang algorithm na tinatawag ROT13, Rot 1-3, kung saan ay nangangahulugan lamang i-rotate lahat ng titik 13 lugar, na nangangahulugan na tumagal A at pagkatapos ay idagdag ang 13 dito at pumunta tuldok, tuldok, tuldok 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. At kaya kung namin ang aktwal na-convert na ito dito gamit ang isang shift ng 13 mga lugar, babalikan ka namin sa kung ano ang maliit Ralphie ay may, na, Maging sigurado sa uminom ang iyong Ovaltine. Ngunit ngayon para sa problema-set 2, sa standard edition ng hindi bababa sa, mayroon kang uri ng ko ito enciphering iyong sarili, at mayroon kaming sa paanuman sa input tulad nito at i-encrypt ang mga ito o i-decrypt ito. Kaya kung saan ng mga batayan uri ng ay humahantong sa amin na pagkakataon? Natin tingnan sa ikatlong halimbawa dito. Una sa lahat, ito ay tinatawag na ASCII. Ano ang ASCII sumangguni bumalik sa? Amerikano Standard Code para sa Impormasyon Interchange, na ay isang talagang mahabang paraan ng sinasabi kung ano? Ano ang ASCII? [Hindi marinig na mag-aaral ng tugon] >> Ano iyon? >> [Mag-aaral] Ang isang character na mapa. >> A karakter mapa. Lang ito Maps mga numero sa mga titik dahil ang mundo ay may Standardized kung ano ang numero ay kumakatawan sa kung ano ang mga titik upang ang lahat sa atin ay maaaring gamitin ng mga computer at ang aming mga programa lahat lamang tugma pagdating sa pag-print ng mga bagay sa screen. Kaya isipin ang na 65 mangyayari upang kumatawan A, 97 ang mangyayari upang kumatawan sa lowercase ng. At kaya ito simpleng programa dito ASCII sinasamantala ng katotohanang iyon - na ang mundo alam na kabisera ay 65 - at pag-print sa pagma-map. Kaya bago namin sumisid sa ang code na ito, ipaalam sa akin sa halip buksan up ng isang terminal na window. Ipaalam sa akin magpatuloy at gumawa ang ASCII, at pagkatapos ay sabihin lamang patakbuhin lamang ang bagay na ito sa palayawin ang output. At ito lamang ito: talagang malaking chart na lamang na nagsasabi sa akin ang lahat ng iba't-ibang mga code para sa lahat ng iba't-ibang mga titik. Kaya isang napaka-simpleng programa, ngunit hindi ko magkaroon sa hard code mga 52 linya ng output: 26 uppercase, 26 lowercase. Sa halip, ginawa ko ito programa na may dalawang mga loop. Pansinin kung ano ang ginawa ko dito. Ako iterated mula ay i 65 sa hanggang sa 65 + 26 dahil gusto ko upang i-print ang 26 titik sa ang Ingles na alpabeto, i + + sa bawat pag-ulit, at ngayon mapapansin ang ganitong muli. Ang pag-ulit ng aming kaibigan typecasting kung saan-convert ka ng 1 uri ng data sa isa pang dahil kung ano ang gusto kong gawin sa partikular na programa? Gusto kong bilangin ayon sa bilang dahil na kung paano ako lumaki nadaragdagan - 65, 66, 67, at iba pa - ngunit hindi ko nais upang i-print ang mga numero. Gusto kong i-print ang sulat na sinundan sa pamamagitan ng bilang. Gusto kong i-print A: numero, B: numero, ngunit maaari kong gawin ito na may parehong eksaktong variable. Kaya-print ko c% bilang isang placeholder para sa isang character, % D bilang isang placeholder para sa isang digit o numero. Pagkatapos kung ano ang ko plug in para sa mga 2 placeholder? Ko ang unang plug sa character na katumbas ng i, at pagkatapos ay i-print ko out i mismo. Kaya mapansin ito masyadong lang gumagana. Tulad ng maaari kong pinalayas mula sa isang Float sa isang int upang pumunta mula sa isang tunay na numero sa isang integer, dito ako maaaring pumunta mula sa isang int sa isang pansamantalang trabaho, na ng kaunti kakaiba - ay hindi masyadong-map papunta sa tunay na mundo - ngunit sa computer isang pansamantalang trabaho lang bilang sa ilalim ng hood, kaya kami ay napaka tahasang dito sa computer, na sinasabi, printf, mag-print na hindi ako bilang 65, i-print ito bilang ang numeric katumbas nito. At ito ay lumiliko out hindi ko technically kailangan ito. Ano ako paggawa ng ilang sandali ang nakalipas ay tahasang paghahagis sa pamamagitan ng pagtukoy kung ano ang uri ng data na gusto ko ang umalis mula sa at sa. Ngunit mapansin na Mayroon na akong ito placeholder% c at ang iba pang% c placeholder dito. Kahit na ito ay hindi int, computer napagtanto na ang isang pansamantalang trabaho, ito ay isang int sa ilalim ng hood. Kaya kung aktwal na ako mag-recompile ito at muling patakbuhin ang ASCII programa, mapansin ito pa rin lang gumagana dahil ang computer ay napagtanto na pagsusulatan ito. Ngayon, ito ay mas mahalaga upang gawin ang tahasang Casting sa mundo ng mga kamay sa mga ints dahil doon na aktwal na nagsasagawa ka ng isang kinakalkula desisyon: itapon ang lahat pagkatapos ng decimal point. Narito mayroong talagang walang itapon dahil ang karakter ng isang numero, at ang string ng isang array ng mga character. Kaya kapag ito ay oras sa pagpapatupad ng ilang mga pag-encrypt o decryption, paano ito na maaari naming aktwal na isalin ang isang bagay tulad ng ito bagay na walang kapararakan sa, Maging sigurado sa uminom ang iyong Ovaltine? Ano kung alam namin ngayon - ipaalam sa tumagal ng palagay - na ang key, ang bilang na kami ay umiikot ang lahat ng mga sulat na ito sa pamamagitan ng, ang bilang 13? Kaya namin nagpunta mula sa sulat B ang lahat ng mga paraan upang O sa simula ng pangungusap, Maging sigurado sa uminom ang iyong Ovaltine, dahil kung gagawin ko ang B at pagkatapos ay pumunta ako C, D, E, F, G, H, ako, J, K, L, M, N, O, na kung bakit ang pag-encrypt ng sulat ang B naging O dahil ko lang idinagdag 13 dito. Kaya kung gusto ko upang i-decrypt ito, mahalagang ko gumawa ng O at pagkatapos ay ibawas 13 mula dito. O, lantaran, dahil mayroong 26 titik sa alpabeto, ito ay kamangha-mangha simetriko, Maaari rin naming idagdag lamang 13 at babalikan ka namin sa B. sulat Ngunit kung paano mo pumunta tungkol sa pagpapatupad ng isang bagay tulad nito sa Caesar o talagang pagmamanipula ng mga string sa pangkalahatan? Kung ang titik B ay kung ano ang numero? Ano ang titik B? Kaya 66, sa kanan? Kaya kung ang titik ay 65 at ang titik B ay 66, kaya 66, ang lahat ng kailangan kong gawin ay magdagdag ng 13 dito, at ito ay nagbibigay sa akin 79. At kung pumunta kami sa aming maliit na impostor sheet, 79 katunayan mapa papunta O. Ngunit may isang bit ng isang kaso ng sulok dito. Ano, sabihin nating, ang sulat sa Z? Kung gagawin namin ang 66 + 25 upang makakuha ng ang lahat ng mga paraan sa dulo ng alpabeto, hindi namin sa 91. 91 + 13 ay nagbibigay sa akin ng 104, at hulaan kung ano? 104 ay hindi katumbas ng uppercase sulat. Natin bumalik sa isang maliit na impostor sheet dito. Kung ako muling patakbuhin ang program na ito sa paunawa appliance, na 104, kung pumunta ako pabalik sa window ng terminal, 104 ay tila lowercase h. Kaya kailangan namin ng ilang mga pangunahing nanlilinlang dito upang tiyakin na kapag nagsimula kami sa Z at idagdag namin ang 13 dito hindi namin nais na lamang panatilihin ang forging magpatuloy sa mas malaki at mas malaking mga numero. Ano ang gagawin namin talagang gusto ko? Gusto mong I-wrap sa paligid. Kaya ito lumiliko out, bilang nakita mo marahil sa seksyon ngayon o sa spec ng set ng problema mismo natanto na mayroon ang iba pang mga operator sa C na din ay isang porsyento sign, ngunit kung saan namin ang ginagamit ng% dito upang tukuyin ang isang placeholder, malaman na, lalo na para sa mga problema sa set 2, mayroon ding isang bagay tulad nito: int x = y% z. Hayaan akong lamang ipakita ito bilang isang napaka-generic na paraan ng ito. Porsyento ay nangangahulugan na kung ano ang sa isang wika ng programming? >> [Mag-aaral] Modulo. Modulo, kung saan ay isang magarbong paraan ng sinasabi ang natitira. Kahit na ang isang bahagyang pagkakaiba na may kahulugan doon, nangangahulugan ito na hatiin y ng z ngunit hindi bumalik ang mga resulta ng dibisyon na; sa halip, bumalik ang natitira. 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, kaya kung ano ang ginagawa ng x aktwal na katumbas sa sitwasyong ito? 1. Ito ay isang simpleng, mababang antas ideya. Tumatagal ng kaunting oras upang makakuha ng iyong isip na nakabalot sa paligid nito dahil marahil ito ay habang ang isang dahil kahit mo ay pinapahalagahan tungkol remainders at aktwal na gamitin ang mga ito para sa isang bagay mapakay, ngunit sa kasong ito ang simpleng katotohanan na maaari kang pumunta mula sa isang malaking numero tulad ng 3 sa isang relatibong maliit na bilang tulad ng 2 at pagkatapos ay I-wrap sa paligid epektibo sa pamamagitan ng paggamit ng ang natitira sa isang mas maliit na halaga tulad ng 1 ay pagpunta sa maging isang napakahalaga nanlilinlang na maaari naming gamitin ang parehong para sa isang bagay tulad ng Caesar at ang iba pang mga bagay Vigenere sa problema magtakda ng 2, ngunit ito ay pagpunta sa isang umuulit na nanlilinlang sa buong semestre. Ito simple, simpleng ideya ng paglalaan ng natitira sa pangkalahatan pagpunta sa-daan sa amin upang I-wrap sa paligid. At bilang simulan namin sa paglalaro ng higit pa sa mga array, bilang simulan namin ang paglalaro ng higit pa sa memory mismo, ito ay upang maging higit pa at higit pa ng isang malakas na nanlilinlang. Kaya anumang mga katanungan pagkatapos ay sa ASCII o ang representasyon ng mga string bilang array? At isasaalang-alang namin ang mga ito 1 bingaw pa. Oo. [Hindi marinig na mag-aaral tanong] >> Magandang katanungan. Ano ang ibig sabihin kapag ang isang variable ay may asterisk sa unahan nito? Hayaan akong ipagpaliban pagsagot na sa anumang detalye, ngunit na tumutukoy sa isang paksa na kilala bilang isang pointer. Payo gawin sa memory, at hindi namin aktwal ngayon paglalaan ng unang hakbang patungo sa na talakayan, ngunit sa ngayon, hayaan mo akong magpanggap na ay hindi umiiral ang star at ipagpapatuloy namin ang pagtawag string string sa halip ng paggamit ng magpasinda *, kung saan malamang na iyong nakita bago at ko bang ilagay sa screen sa sandali lamang bilang isang teaser. Kaya makikita namin bumalik sa paraan mas detalyado kaysa marami sa inyo ay marahil gusto. Sa paglaon, hindi ngayon. Oo. [Hindi marinig na mag-aaral tanong] Sa anong konteksto mo upang magbigay ng mga mag-sign para sa isang character? >> [Mag-aaral] Oo. Kaya sa pamamagitan ng default, kapag hindi mo maglagay ng +, lamang positibong numero ay ipinapalagay. Kaya kung isulat ang numero 1, ito ay isang positibong 1. Kung iyong aktwal na nais upang tukuyin ang hindi pagsang-ayon ng isang halaga, mo literal na gawin ang -1 sa iyong keyboard. Ngunit ito ay marahil hindi ang iyong tanong. >> [Hindi marinig na mag-aaral tugon] Magandang tanong. Okay. Kaya ito ay may gawin, ipunin ko, may ilang uri ng mga bug pinatakbo mo sa dahil ikaw ay nagko-convert ng isang integer sa isang character, ngunit sa paanuman negatibiti nakuha kasangkot, at kaya ang character na lang dumating ang munged sa paanuman. Kaya sa ngayon, hayaan mo akong oversimplify ng kaunti hanggang dumating kami pabalik sa ganitong uri ng paksa. Sa ngayon, sa tingin ng mga bagay ganitong paraan - at ito ay isang oversimplification. Ngunit sa mundo ng isang integer, mayroon sa iyo kung gaano karaming mga piraso sa iyong pagtatapon? Mayroon kang 32 na bit. At kaya ngayon, kami uusapang tungkol sa kabuuang bilang ng mga integer maaari mong samakatuwid ay kumakatawan sa halos 4 bilyon sa kabuuang dahil mayroon kang 32 bit, kaya na 2 sa 32, kaya na halos 4 bilyong. Ngunit nakita namin sa isang linggo o 2 nakalipas na hindi mo talaga magkaroon ng isang hanay ng mga numero mula sa 0 sa hanggang sa 4 na bilyong. Hanay ang napupunta sa halip na mula sa halos negatibong 2 bilyong sa positibong 2 bilyong. Ngunit ito pagkatapos begs ang tanong, paano kinakatawan mo ang paniwala ng mga negatibong 2 bilyong ipaalam sa nag-iisa negatibong 1? Sa ngayon, maaari naming oversimplify at lang sabihin na kami ay pagpunta sa gamitin ang pinakakaliwa bit ng mga 32 bit, at kung ito ay isang 1 ito ay isang negatibong numero, at kung ito ay isang 0 ito ay isang positibong numero. Ang problema sa na pinasimpleng representasyon ng mga negatibong numero ay ang kung sadyang ikaw ay pagiging matalino at sinusubukang i-convert mula sa isang character sa isang numero o kabaligtaran, walang ganoong bagay bilang isang negatibong karakter. Sa mundo ng ASCII, na gumagamit ng 8 bit lamang, ang lahat ng 8 ng mga bagay ng mga bit, at ang pinakakaliwa bit ay walang gawin sa negatibiti. At lamang maging malinaw, kapag sinabi ko pinakakaliwa bit, isipin ang na kapag ginawa namin ang aming bit-kaugnay na mga halimbawa sa unang linggo isipin ang na iginuhit namin ng mga bagay tulad ng 1001101, isang bagay tulad nito. 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. Kaya sa mundo ng mga character ay walang paniwala ng negatibiti, sa gayon ay pinakakaliwa bit aktwal ay isang bagay upang gawin na may ASCII, walang gawin sa negatibiti. Kaya Mukhang - at labas ng konteksto mahirap upang sagutin ang eksaktong - ngunit sa paanuman, ang iyong code ay nakakalito na pinakakaliwa bit bilang na kumakatawan sa isang negatibong halaga kapag talagang bahagi ng character sa pinag-uusapan. At muli, ako oversimplifying dahil ang mga computer ay aktwal na gawin ang isang bagay ng kaunti may interes pa sa pagbabago na pinakakaliwa bit sa 1 para sa isang negatibong sign kumpara sa isang 0. Nila sa halip, kung gusto mong malaman sa Google, gamitin ang isang bagay na karaniwang tinatawag na 2 ng pampuno, na bit mas sopistikadong ng isang diskarte ngunit ang ideya na ang huli ang parehong. Kaya sa maikling salita, ito ay upang gawin ang katotohanan na ikaw ay masahe isang numero sa isang character o vice versa ngunit ang iyong code ay hindi nababatid ang katotohanan 1 ng mga bits ay may kabuluhan sa numerong mundo. Hindi iyon ang kaso sa mundo ng character. Ngunit ito tunog tulad naayos mo, kung saan pagtalunan ngayon. Iba pang mga tanong. Okay. Kaya sa gayon ngayon, lahat ng programa namin ang nakasulat na kinuha input marahil mula sa gumagamit sa anyo ng mga function tulad GetInt, GetString, o kung ikaw ay pagbabasa Magpatuloy sa iba't-ibang mga libro o online na mga sanggunian, ka sarili ay maaaring gumamit ng mga function tulad ng scanf kung saan, lantaran, ginagamit namin sa CS50 library. Ngunit sa isang linggo o 2, makikita namin aktwal ipakita sa iyo kung paano ang CS50 library ay ipinatupad upang maaari naming tumagal ng mga gulong ng pagsasanay sama-sama. Ngunit ito lumiliko out may isa pang paraan upang makakuha ng input mula sa isang user. Sa katunayan, hindi namin ating sarili ay gamit ang command argumento line para sa isang ilang linggo na ngayon. Bawat oras na namin tumakbo kalatong o tumakbo namin gawin, hindi namin na-type lamang kumalatong, Ipasok, hindi pa namin nai-type gawin, Ipasok. Ano na namin karaniwang nakasulat pagkatapos ng salita kumalatong sa aming terminal sa bintana prompt? [Mag-aaral] Ang pangalan ng file. >> Ang pangalan ng file, i-right? Hello.c o mario.c o anuman ang may-katuturang pangalan ng file ay. At sa na pakiramdam kung ano talaga nagawa mo na naiimpluwensyahan ang pag-uugali ng kumalatong dahil tiyak na ang mga tao na sinulat ni kumalatong ay walang ideya na maliit gulang ka ay pagpunta sa magsulat ng isang programa na tinatawag na mario.c taon mamaya. Kaya nagkaroon sa paanuman maka-impluwensya sa pag-uugali ng programang iyon, at ang programa kumalatong ay na nakasulat sa isang paraan na maaari itong tanggapin ang input mula sa iyo sa pamamagitan ng pagdagdag ng mga salita sa prompt bago ang mga hit ng user ang Enter. Kaya ito lumiliko out na para sa ilang oras namin deklarasyon halos lahat ng aming mga programa upang simulan ang tulad nito - int pangunahing (walang bisa) - at pagkatapos namin ang nawala magpatuloy at nagsimulang pagsusulat ng aming code. At maaari naming magkaroon ng ilang mga matalim Kabilang sa tuktok ng file, ngunit halos lahat ng aming mga programa sa gayon ay malayo sinimulan na may ganitong kahit na maaari mong nakikita sa seksyon, sa mga libro, online na mga sanggunian na ito ay hindi sa katunayan na walang bisa. Isa pang lehitimong paraan para sa mga ito upang tumagal int argc at pagkatapos string ang argv []. Kaya ngayon kung ano ang ito nagpapahiwatig? Ito lumiliko out na argc, na kung saan ay isang tao convention - maaari kang tumawag ito foo, ngunit nais ito ng maraming mas malinaw sa mga mambabasa - ay argc lamang ng argumento sa pag-andar na tinatawag na pangunahing na kumakatawan sa kung ano ang? Ano ang argc tumayo para sa mga pamilyar? [Hindi marinig na mag-aaral ng tugon] >> Oo, ang bilang ng mga argumento o argumento count. Bilang simpleng bilang na. Gaano karaming mga argumento ay pumasa sa sa programang ito? Ano ang na ibig sabihin nito? Kung sa command line tumakbo ko ng isang bagay tulad nito - kumalatong mario.c-- ang argc kapag ako pindutin ang Enter sa isang halaga ng, medyo confusingly, 2. Kaya ito lumiliko na argc ang argumento count, ngunit para sa mga makasaysayang dahilan, ang pangalan ng programa mismo ay kasama sa na bilang ng. Kaya argc ay 2 kapag ako sinulat ni kumalatong mario.c. Ano ang argv naglalaman? Una sa lahat, argv mukhang isang string ngunit hindi pa dahil ang bilang ng huling Miyerkules at ang lahat ng higit pa ngayon, mga square bracket magpakilala kung ano? Iyon ay isang array. Walang numero sa array, at na dapat magkaroon ng kahulugan intuitively dahil ang mga tao na sinulat ni kumalatong taon na ang nakakaraan tiyak ay walang ideya kung gaano karaming mga salita ng mga tao tulad ng sa amin ay i-type sa prompt bago pagpindot sa Ipasok. Kaya sa kasong ito dito nila ipinahayag pangunahing ang function ng pagkuha ng isang hanay ng mga argumento, 0 o higit pa sa mga argumento. Hindi nila alam nang maaga kung gaano karaming mga may, kaya ay sadyang walang numero sa loob ng mga square bracket. Ngunit ang katunayan na ang mga square bracket ay may nagsasabi sa computer, asahan ang isang array. Argv ay shorthand notation para sa vector ng argumento. Vector ay isang magarbong paraan ng sinasabi ng array, at array ay isang magarbong paraan ng sinasabi ng isang listahan o koleksyon. Kaya ito ay nangangahulugan lamang na kung sumulat ka ng mga pangunahing tulad nito sa halip na tulad ng kung paano namin na gawin ito para sa nakalipas na ilang linggo, ngayon ang iyong programa ay may kapangyarihan upang tanggapin ang mga argumento sa command line sa gayon ay hindi na kailangang mong sumulat sa Mario at pagkatapos ay pindutin ang Enter, pagkatapos i-type sa isang numero para sa kung gaano karaming mga bloke mataas na nais mong pyramid na, pagkatapos ay pindutin ang Enter muli. Hindi namin kailangan upang gamitin ang GetString ito o GetInt o GetFloat para sa na mahalaga. Maaari lang namin inaasahan sa gumagamit na i-type ang mga salitang iyon sa prompt mismo tulad lamang ang mga may-akda ng kumalatong nagpasya ito ay talagang nakakainis na programa kung upang ipunin ang iyong code mo munang-type kumalatong, pindutin ang Enter, sinabi namin sa gumagamit, mangyaring i-type ang pangalan ng file na nais mong upang makatipon, pagkatapos namin type sa mario.c at pindutin ang Enter. Ngunit na eksakto kung ano ang namin ang paggawa sa aming mga gumagamit sa nakalipas na dalawang linggo. Gamitin namin GetString at naming maghintay hanggang ang programa ay tumatakbo upang i-prompt ang mga ito para sa input. Na hindi na kailangang ang kaso. Kaya sa halimbawang ito dito, na namin ngayon string argv, at ito ay masyadong isang oversimplification, gulong pagsasanay na sa lalong madaling panahon dumating off. Ito ay ang mas tamang paraan ng pagsulat ito alternatibong deklarasyon ng pangunahing dahil ito ay lumiliko out na kung ano ang panatilihin namin ang pagtawag ng string aktwal ay isang bituin, ng asterisk, sa aktwal na kahulugan nito, ngunit ito lamang mukhang kumplikadong, ito ay nakalilito sa unang, kaya kami pasimplehin pamamagitan lamang paglikha ng isang kasingkahulugan ng mga uri sa CS50 library na mapa magpasinda * ang mas user-friendly na string ng salita. Kaya sabihin aktwal na subukan ito pagkatapos. Hayaan akong sige at buksan up gedit dito. Hayaan akong sige at buksan ang argv ng 1. Ang program na ito ay tila mga Kopya ang argumento, ngunit sa Ingles mga tuntunin, sa pamamagitan ng pagtingin sa ang code na ito, ano ang higit na partikular? Kung nagta-type ako sa command a.out foo bar, kung ano ay makakakuha ng naka-print sa aking itim at puting window? A.out foo bar, pindutin ang Enter. Sige. Oo. >> [Hindi marinig na mag-aaral tugon] Mabuti. Kaya a.out, bagong linya, foo, bagong linya, bar, bagong linya. Bakit ito? Maaari naming tiyak na kumpirmahin sa sandali lamang. Ito ay uri ng isang malambot na linya ng code.  Ito lamang mga Kopya ng isang bagong linya upang gumawa ng mga bagay prettier sa screen. Ito ay isang loop na iterating mula 0 sa hanggang sa argc, at ito ay incrementing sa bawat pag-ulit + +. Kaya ito ngayon ang sinasabi na i-print ang isang string, tulad ng ipinahiwatig sa pamamagitan ng% s. Argv [i] ay medyo magkano ang parehong ideya mula sa nakaraang halimbawa. Ginamit namin upang tumawag sa variable s; ngayon tinatawag, mang, argv. Nangangahulugan ito na-print ang ith argument na na-type sa command line, at pagkatapos matapos ang buong bagay na ito ay tapos na, para lamang sa magandang panukalang i-print ang isa pang bagong linya. Kaya sabihin tingnan ang. Hayaan akong buksan ang terminal na window. Hayaan akong makatipon argv ng 1, at ngayon ay ipaalam sa akin patakbuhin ang argv ng 1, Ipasok. Hmm. Okay. Natin patakbuhin ang foo bar. Kawili-wili. Baz. At kung sakaling mo na kung bakit type ko ito, ito ay din ng bobo convention ng computer science. Ang mundo ay madalas na kailangang lamang pandiwang placeholder para sa mga salita. Kaya kung nais mong makipag-usap tungkol sa ilang mga generic na string, computer na siyentipiko ay may posibilidad upang sabihin sa foo kapag kailangan nila ng isang random na salita, pagkatapos sabihin nila bar kung kailangan nila ng isang pangalawang random na salita, pagkatapos sabihin nila baz kung kailangan nila ng isang third salita, pagkatapos sinasabi nila qux kung kailangan nila ng ika-apat na salita, at pagkatapos ay mayroong isang malaking relihiyon online na debate sa kung ano ay pagkatapos qux, sa gayon ay maaari mong Google na malaman kung ano ang iba pang arbitrary salita ay dapat na. Ngunit ang mga ito ay na walang ibig sabihin kung ano pa man, kahit foo bar, kung ka ng Google na, na na ibig sabihin, na bahagi ng pinagmulan ng salita dito. Kaya ang lahat ng ito ay ginagawa pagkatapos ay pag-print ng 1 ng mga string na ito sa bawat linya. Kaya kung ako sa halip, bagaman, nais upang makakuha ng isang maliit na may interes, ipagpalagay na hindi ko nais upang i-print ang bawat string sa bawat linya; Nais kong upang i-print ang bawat character mula sa bawat string sa bawat linya. Paano ko maaaring sa halip gawin iyon? Ano ang kailangan kong baguhin ang tungkol sa programang ito kung gusto kong i-print ang hindi bawat salita ngunit gusto kong i-print ang bawat salita ng sulat sa pamamagitan ng sulat sa pamamagitan ng sulat, pagkatapos ay ang susunod na titik ng salita sa pamamagitan ng sulat sa pamamagitan ng sulat? Paano namin pagsamahin ang mga ideya na ito nang sa gayon ngayon? Oo. [Mag-aaral]% c. >> Lahat ng karapatan. Kaya kailangan namin sa isang lugar% c. Mabuti, dahil hindi ko nais upang i-print ang buong string, gusto kong i-print ang mga character. Ano pa? [Hindi marinig na mag-aaral ng tugon] >> Kawili-wiling. Kaya kailangan namin ng uri ng ng pangalawang dimensyon dito ngayon dahil sa tingin ng argv bilang isang array, ngunit ito ay isang array ng mga string. Ngunit bilang ng, gusto, 15 minuto ang nakalipas, ano ang isang string? Ang isang hanay ng mga character. Kaya talaga, argv ay isang array ng isang array ng mga character, isang array ng mga array ng mga character. Kaya ito lumiliko na maaari naming gamitin lang mas square bracket notations. Kaya sabihin gawin ito. Sa tuktok ng ito loop sa linya 19, Pupunta ako upang umulit mula i up sa argc, ngunit pagkatapos ay ako pagpunta sa gawin ito: para sa - ay hindi ako maaaring gumamit ng i ngayon. Kailangan ko ng isa pang variable dahil gusto ko upang umulit sa ibabaw ng mga salita ngunit pagkatapos din sa paglipas ng ang mga titik sa mga salita kaya ko uri ng vertical axis at sa pahalang axis, uri ng conceptually. 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. Paano ko umulit sa ang mga titik sa isang string? Ginawa namin ito ng ilang sandali ang nakalipas. Strlen ng argv [i]. Mabuti. At muli, ako ng paggawa ng maliit na kawalan ng kaalaman dito sa pamamagitan ng hindi paglikha ng n o anumang, ngunit gagamitin namin bumalik iyon. Kaya ngayon j + +. Ngayon ay mayroon akong indent ng karagdagang dito. Ano ang gagawin ko ngayon ay nais upang i-print sa bawat pag-ulit? [Hindi marinig na mag-aaral ng tugon] >> Kaya [i] ay magbibigay sa akin ang salitang. [I] [j], uri ng tulad ng matrix. Mga may background sa matematika-y, hindi namin ang uri ng pag-i-index ng palalimin ito matrix o ang hanay ng mga array, ang 2-dimensional na istraktura. Kaya ngayon sabihin makita kung ano ang mangyayari dito. Hayaan akong buksan ang aking mas malaking terminal na window. Hayaan akong muling palabas ng pelikula gumawa ng argv ng 1. At screwed ko na dito, kung saan ay isang mahusay na aralin dahil nakalimutan ko masyadong upang gawin ito. Nang kataon lamang deklarasyon 'strlen' C library function sa unsigned-type ang '- Hindi ko alam kung ano ang natitirang ay nangangahulugan na, ngunit ko nakita ito bago, nang kataon lamang deklarasyon. Tuwing nakikita namin ang error na ito, ano ang karaniwang magpahiwatig? [Hindi marinig na mag-aaral ng tugon] >> Nakalimutan ko ang isang library up sa tuktok. Ngunit maghintay ng isang minuto. Karaniwan ko na screwed up dahil Nakalimutan ko ang CS50 library, ngunit na doon. Karaniwan ko na screwed up dahil nakalimutan ko na ang standard ko / O. At lantaran, hindi ko kailangan ito. Hindi namin ginagamit GetString ngayon. Kaya kung ano ang ako nawawala? May isa pang library na ngayon ay kailangan naming gamitin paminsan-minsan na tinatawag na string.h, at ito lamang ang isa pang library na may higit pang mga function na ay hindi sa karaniwang ako / O. Kaya sabihin bumalik sa aking malaking terminal na window. Okay. Ngayon, letse, hulaan ko ako ay mali. Ako gamit ang CS50 library. Upang maayos namin ito sa alinman sa 2 paraan. Maaari naming gawin ang mga gulong ng pagsasanay off ngayon at lamang gawin ito, o natin ang uri ng panatilihing na pagpapagaan para lamang sa ngayon, i-paste ito pabalik sa, lutasin ang problema na iyon, at ngayon ay bumalik sa window ng terminal. Kaya maging malinaw, sa library ng CS50 ay hindi lamang function, ring string ng keyword, kung saan ay bakit error na nangyari. Kaya dito namin pumunta. Naayos ko parehong ng ang isyu ng library. Enter. Mabuti. Argv ng 1, foo bar, pindutin ang Enter. Mahusay na. Kaya ngayon namin ang bawat titik ng bawat salita na naka-print na 1 sa bawat linya, na hindi gumawa para sa isang kawili-wiling programa, ngunit paunawa ngayon namin ang kakayahan ng hindi lamang iterating sa paglipas ng mga salita kundi pati na rin sa mga indibidwal na mga titik sa salita, na parang totoo pamilyar kahit na ang pinakasimpleng ng mga application tulad ng scrambling titik sa isang string tulad nito. Natin sige at ang aming 5-minutong break na dito. At kapag dumating namin pabalik, sisimulan namin ang pakikipag-usap tungkol sa kahusayan na kung saan maaari naming gawin ang mga bagay na ito nang mas mahusay. Ayos lang. Kami ay bumalik. Salamat sa isa sa aming mga TFs na gumaganap ng isang maraming ng bananagrams, namin aktwal ng buong bungkos ng mga karakter sa amin dito ngayon pisikal incarnated sa mga maliit na plastic piraso, at ipaalam sa akin ipanukala na ito blangko puting slate narito kumakatawan sa RAM sa aking computer - laptop, desktop, anumang - at may mukhang ng maraming nito dahil kung sisimulan namin ang tipak ito RAM sa maliit byte-size na piraso, sabihin mang sabihin na may isang bagay na kinakatawan ng laki at na malabo - doon pumunta kami, at sabihin mag-zoom out ng kaunti dito - sabihin nating ang isang bagay na ang laki ay kumakatawan sa isang solong byte. Upang maaari naming katunayan umangkop sa isang buong grupo ng mga bytes o mga character sa loob ng memory na ito, tulad ng iminungkahi ng kamag-anak na laki dito. Kaya ngayon ipagpalagay na ang layunin ay upang magtalaga ng memory para sa isang string. Paano ito aktwal na gumagana? Sa programa namin ang pagsusulat, karaniwang namin na gamit GetString, ngunit ngayon, malinaw, may ito sa iba pang channel sa pamamagitan ng kung saan maaari naming makakuha ng input ng user sa argv sa pamamagitan ng mga argumento sa linya ng command na. Ngunit kung ano talaga ang nangyayari sa ilalim ng hood? Ito lumiliko kung tinatawag naming - sabihin mag-scroll pabalik sa GetString - ang function na GetString sa library ng CS50, ang user ay sinenyasan para sa isang string, ang mga uri ng gumagamit sa ilang mga salita - sabihin tumawag ito HELLO. At kami ay sinasabi para sa nakalipas na ilang linggo na ang return halaga ng GetString ay sa katunayan isang string, tulad ng salita HELLO. Ngunit ano ang GetString talaga ginagawa? Habang ang mga uri ng user sa HELLO, Ipasok, GetString ang pag-uunawa, okay, kung gaano karaming mga character ay ito? Ito ay H-E-L-L-O. Kaya kailangang maglaan, kailangang hilingin sa operating system - Linux sa kasong ito - para sa hindi bababa sa 5 bytes upang mag-imbak ng HELLO. At kung ano ito pagkatapos naaayos gawin sa sandaling ito ay nakakakuha ng bumalik mga 5 bytes mula sa operating system sa lay out HELLO bumalik upang i-back i-back upang i-back. At kaya kung ano talaga ang bumalik mula GetString ay isang tipak ng data na ganito ang hitsura. Ngunit ito ay isang bit hindi tumpak dahil ito ay lumiliko out na ito ay hindi na simple bilang lamang ang pag-iimbak ng HELLO sa memory ng computer dahil ipagpalagay na ang aking programa na Sumulat ako sa C pagkatapos tawag GetString muli, at ang susunod na salita user ang mga uri sa bye, bye. Well, kailangan ko upang magkasya ang salitang iyon bye sa isang lugar sa memorya. Hindi ko gumulpi HELLO. Halimbawa, hindi ko gusto ang computer lang magsimulang Sasapawan nito tulad nito ang orihinal na salita dahil maaaring ko pa rin gamit ang salitang HELLO sa isang variable sa iba pang lugar sa aking programa. Kaya B-Y-E ay may upang tapusin sa iba pang lugar sa memorya. Ngunit convention ay karaniwang na ang susunod na string na maglaan marahil, ngunit hindi laging, ay pagpunta sa magtapos sa susunod na magagamit na lokasyon ng memorya. At kung hindi ako tanungin ang operating system para sa anumang memory simula ng huling beses Tumawag ako GetString, odds ang mga salita Bye pagpunta sa magtapos karapatan pagkatapos ng salita HELLO sa memory. Ngunit sa puntong ito, maaari mong marahil makita kung saan ang isang potensyal na problema arises. Dahil ang susunod na chunks ng memorya, sa susunod na bytes na lamang libreng - linisin puting slate - sa memory ng computer sa tabi mismo ng HELLO, ito nararamdaman tulad ng unang string na Tinanong ko maaaring biglang ngayon baguhin dahil mahalagang ko iyong binago ito sa HELLOBYE sa halip na sa paanuman demarcing simula ng bye at sa dulo ng HELLO. Kaya ito lumiliko out na kung ano talaga ang nangyayari sa ilalim ng hood, kung saan maaari mong glimpsed sa online na mga sanggunian o seksyon o mga aklat o hindi sa lahat pa na may ay talagang isang sinadya paghihiwalay sa pagitan ng mga salita sa memorya ng isang computer. At sa katunayan, sa kasong ito dito, sa halip na lamang ilagay bye sa tabi mismo ng HELLO, sa halip, computer naglalagay ng isang espesyal na character, ang mga espesyal na character na null, kaya na magsalita, na kung saan ay kinakatawan sa isang marker na may backslash 0. Kaya mahaba kuwento maikli, isipin ang na ang mga character ay kinakatawan sa ASCII. ASCII lamang ng pagma-map sa pagitan ng mga numero at titik, at karamihan ng mga titik simulan ang halos 65 para sa capital A, ngunit ito lumiliko out maaari mong tiyak na kumakatawan sa bilang 0 bilang isang integer o sa binary, at ito ay lumiliko mundo nagpasya mahaba, matagal na ang nakalipas, "Alam mo kung ano?" "Sabihin reserba numero ng 0 bilang hindi kumakatawan sa anumang mga character sa keyboard - "Walang titik, walang mga numero, walang bantas. 0 ay espesyal na." "Ito ay ang mga espesyal na character na null, at kami ay pagpunta upang isulat ang mga ito bilang \ 0." Ang pagkakaiba sa pagiging kung lang namin sinulat ni 0, 0 ng character. Manariwa sa diwa na may ASCII code para sa 0, para sa 1, 2, 3 dahil ang mga character na 0 ay naiiba mula sa 0 bilang. At maaari mong makita na kung titingnan mo mula sa linggo 1 kapag muna namin uusapang tungkol sa ASCII, 0 at 1 at 2 at 3 ang lahat ng mga paraan ng hanggang sa 9 ay may kanilang sariling mga ASCII code. Ang mga ito ay hindi, coincidentally, 0 hanggang 9. Ang mga ito ay ibang-iba. Kaya 0 lamang ay nangangahulugan "Ako espesyal na," at ang \ 0 mga paraan, literal, "ako hindi 0 karakter." "Ako ito espesyal na halaga, ang null karakter." Kaya kailangan ko aktwal na isa pa sa mga ito dahil hindi ako maaaring gumawa ng dalawang beses ang parehong pagkakamali. Kaya matapos ang salita Bye din kami ay pagpunta sa kailangan ng isa pa ng mga null character. Hayaan akong makakuha ng aking panulat dito at ipaalam sa akin mabilis gumuhit ng isa pang \ 0 kaya pagkatapos kong tanungin ang operating system para sa 2 string sa pamamagitan ng GetString sinundan sa pamamagitan ng isa pang tawag sa GetString, ito ay kung ano ang aktwal na sa memory. Kaya kapag nakakuha ako isang string, talagang ako pagbalik na, at kapag nakakuha ako ng susunod na string, talagang ako pagbalik na. Kaya ito begs ang tanong, strlen, una sa lahat, kung ano ang dapat itong bumalik? Kapag tumawag ako strlen sa string s at mga ay ang salitang HELLO na ang user na nai-type sa, kung ano ay malinaw naman namin sinasabi ang haba ng HELLO ng ilang minuto ang nakalipas? Ito ay 5, i-right? H-E-L-L-O. At na talaga kung paano strlen gawa. Nagbabalik kung ano ang isang normal na tao asahan ang haba ng isang string upang maging. Ngunit sa katotohanan, kung gaano kalaki ang array ng mga character na pag-iimbak ng halo? Ito ang aktwal na 6. Kaya strlen ay hindi banggitin ang katotohanang iyon sa iyo. Ngunit sa ilalim ng hood computer katunayan gamit 6 bytes upang mag-imbak ng 5-titik na salita, at ito ay totoo hindi mahalaga kung gaano katagal ang salita ay. Mayroong palaging pagpunta sa isang espesyal na null pagwawakas ng character sa dulo ng string upang demarc kabuuang haba nito. Kaya pagkatapos ay kung ikaw ay ngayon ang taong pagpapatupad strlen 20, 30 taon na ang nakalipas, kung paano mo pumunta tungkol sa pagpapatupad ng strlen mismo? Namin para sa ipinagkaloob na ito umiiral, tulad lamang namin tumagal para sa ipinagkaloob na printf umiiral, ngunit kung ang HELLO salita sa pinag-uusapan at kung ano ang mayroon ako sa memory ay isang bagay na ganito ang hitsura, kung mayroon kang reimplement strlen dahil hiningi sa inyo na o dahil, lantaran, hindi mo alam strlen umiral - mayroon kang sa roll ito sa iyong sariling - kung paano maaari mong ipatupad strlen kapag bibigyan ng isang bagay na ganito ang hitsura? Ngayon na alam namin string ay isang array, maaari naming umulit sa paglipas ng bawat isa ng ang mga indibidwal na mga character gamit ang isang bagay tulad ng - Hayaan ang subukan upang gawin ito sa mabilisang. Hayaan akong pumunta sa appliance. Hayaan akong lumikha ng isang bagong file, strlen.c. Hayaan akong magpatuloy ngayon at huwag isama stdio.h kaya na kami ay may access sa printf. Hayaan ang gawin sa akin int pangunahing (walang bisa). Oh. Kukunin ko na lang gawin ito sa aking sarili sa ngayon pagkatapos. [Chuckles] Salamat sa inyo. Ito ay kung ano ang ako ginagawa. Ayos lang. Kaya bago ako naka-on ang screen, ako-type ang lahat ng na. At ngayon kung ano ang ako pagpunta sa gawin ay ang mga sumusunod: printf ("Bigyan mo ako isang string:") Na lang malambot na mga tagubilin. Ngayon sabihin gawin sa akin = GetString string s. Ko na kailangang gumawa ng pagbabago ngayon. Gumagamit ako ng biglang CS50 library, kaya hayaan mo akong magpatuloy at i-type sa cs50.h. At ngayon sabihin gawin ito: printf ("Ang haba ay:% d, strlen [s] - at hindi pa tapos ako na. Ano pa ko idagdag sa program na ito? [Mag-aaral] string.h. >> String.h. Kaya sa ngayon, ginagamit namin ang strlen, kaya sabihin tiyakin tagatala ang nakakaalam kung saan na, kaya ng kaunti katinuan suriin. Nakakuha ako ng isang string sa linya 8, at sa linya 9 ako nagpi-print ang haba nito sa% d. Kaya sabihin sige at buksan ito up. Namin ang strlen - compiles okay - strlen - hayaan mo akong mag-zoom in - Ipasok, H-E-L-L-O, ang Enter. Ang haba ay 5. Okay, kaya strlen tila sa trabaho, ngunit ang mundo alam na. Kaya natin ngayon ipatupad ng strlen ating sarili bilang mga sumusunod. Hayaan akong ito library ang layo. Hindi na kami access sa string.h dahil hindi ko kahit alam ito umiiral. Ngunit na okay dahil ang maaari kong ipatupad strlen aking sarili at may isang string na tinatawag na input, at ngayon kailangan ko upang malaman kung ang haba ng string na ito. Kaya kung paano ang maaari kong gawin ito? Paano kung gagawin ko - sabihin makita kung paano gawin ito - Ano ang gusto mong gawin? [Hindi marinig na mag-aaral tugon] >> Okay. Upang maaari naming gawin ito sa isang grupo ng mga paraan. Hayaan akong subukan ang diskarteng ito. Hayaan akong bigyan ang sarili ko ng isang int variable i, kaya i nagsisimula sa 0. At hayaan mo akong sabihin ito: habang input [i] ay hindi katumbas sa kung ano? \ 0. Kaya ito lumiliko out, na ang kaso sa lahat ng char kapag sumusulat sa kanila literal sa isang programa, mayroon kang upang gamitin ang mga single quote, hindi double quote. Kaya kung ako ay pagsulat ang titik ng, Gusto ko gawin iyon, ang titik b, gusto kong gawin na. Ito, sa pamamagitan ng kaibahan, ay isang string, hindi isang indibidwal na character. Kaya gusto ko \ 0 literal. Ano ang gusto kong gawin sa loop na ito? Aktwal na, kailangan ko ng isa pang variable, kaya int haba nakakakuha ng 0. Kahit na ikaw ay hindi sigurado kung bakit namin nagsimula ang paraan na ginawa namin, ngayon na kami ay pagpunta pababa ang kalsada na ito, kung ano ang gusto kong gawin sa linya 9? haba + + at pagkatapos pababa dito sa linya 10, return haba. Kaya kung paano ay strlen ipinatupad? Aktwal na ito ipinatupad malamang na tulad nito. Siguro tao ang ginamit ng para sa loop, maaaring gawin habang loop - na alam? Gusto namin talagang tumingin sa ilalim ng hood sa aktwal na source code sa ilang mga file na tinatawag na string.c marahil. Ngunit dito sabihin isipin ang tungkol sa kung ano ang ako ginagawa. Ako deklarasyon ng variable tinatawag i, ang pagtatakda katumbas ng 0. Ako deklarasyon ng isa pang variable na tinatawag na haba, ang pagtatakda katumbas ng 0. Pagkatapos ako sinasabi habang ith character sa input ay hindi katumbas sa espesyal na character null, \ 0, dagdagan ang haba. Ngunit sa lalong madaling ith karakter ay ang espesyal na character, kung ano ang mangyayari sa loop? Ito maikling circuits. Ito hinto, na nangangahulugan na namin pagkatapos ay agad na bumalik ang haba. Kaya kung hindi ko Nagkamali, sabihin magpatuloy at bumalik sa aking terminal na window. Hayaan akong mag-recompile. At ako ay magtaas. Di-katugmang muling deklarasyon ng library function na strlen. Kaya ako ay sinusubukan upang makakuha ng masyadong matalino para sa aking sariling magandang dito. Tagatala Ang aktwal na alam na may isang function na tinatawag na strlen kahit hindi namin kasama library. Iyon ay pinong. Anuman. Kami ay pagpunta sa makikipagtulungan pagkatapos. Palitan ang pangalan natin ito haba. Hayaan akong baguhin ang paggamit nito sa haba dito, at ito ay gumawa ng kumalatong mas masaya. Bilang isang bukod, dahil ang ilan sa mga function ay kaya darn karaniwang - strlen, prinf - aktwal na sila ay may uri ng espesyal na katayuan. At kaya kumalatong lang alam ng isang maliit na isang bagay na espesyal na tungkol sa mga ito. Iyon ay hindi palaging ang kaso sa karamihan ng mga function, kaya na dahilan kung bakit namin Nakakuha yelled sa. Hayaan akong subukan muli. Thankfully, ito nagtrabaho oras na iyon. Kaya ngayon hayaan mo akong patakbuhin ang aking sariling strlen programa. Bigyan mo ako ng isang string: H-E-L-L-O, Ipasok. At ako screwed up. Bakit? >> [Hindi marinig na mag-aaral tugon] >> Mismong. Kaya Mayroon akong aking sarili dito isang napaka-kaakit-akit na walang-katapusang loop dahil kahit ako incrementing haba sa bawat pag-ulit, kung ano ang ako malinaw na hindi ginagawa? Hindi ako incrementing i. Okay. Madaling aayos. Oo? Okay. No Ngayon ay namin patakbuhin afoul ng ilang mga iba pang mga karaniwang pagkakamali kung saan kailangan ko ng mga bracket. At lantaran, ang code na ito ay nagsisimula upang tumingin pangit, sa gayon ay isasaalang-alang namin ang isang ulos sa paglilinis ito up sa isang sandali. Ngunit ngayon ako incrementing parehong haba at i. Lantaran, na ako makakita ng isang pagkakataon para sa pagpapabuti dito, ngunit makikita namin bumalik na. Kaya ngayon sabihin tiyakin lamang kami ng hindi bababa sa paggawa ng progreso. Ito ay nangyari sa ilang mo, at napapabayaan ko banggitin ito nang maaga. Kapag mo ang kasawian ng isang sitwasyon tulad nito, kung paano mo ayusin ito maikling ng i-restart ang appliance o sa iyong computer o isara ang window? Aktwal na madaling. Control C ay ipadala ito sa maliit na karot simbolo C, at na terminate lang sa karamihan ng mga programa. Kung mayroon kang isang ganap na hindi maayos walang-katapusang loop na pag-print ng mga bagay na walang hanggan maraming beses, minsan na maaaring mayroon ka upang maabot Control C isang libong beses upang gawin itong aktwal na marinig ang mga ito. Kaya lang Napagtanto ngayon dahil hindi ako nagpi-print ang anumang bagay, na medyo madali. At technically, kapag suffices, ngunit nakukuha ko mawalan ng tiyaga at ako karaniwang pindutin ito na maraming beses. Kaya strlen. Bigyan mo ako ng isang string: HELLO. Ay ito upang gumana ang oras na ito? Okay. Isa pang karaniwang pagkakamali. Kailangang mag-recompile. Na ay sinadya, na ang isa. Ayos lang. Kaya strlen, H-E-L-L-O, ang Enter. Mahusay na. Kaya ngayon namin ay may strlen sa 5. Kaya literal namin reimplemented wheel na. Kaya ngayon sabihin linisin ang up na ito dahil ito ay hindi ako impressed na ang disenyo ng aking code. Ano ang maaari naming malinaw na maalis sa programang ito upang linisin ito up? [Hindi marinig na mag-aaral ng tugon] >> Oo. Literal, kami ay pagpapagamot i at haba identically. Kaya bakit hindi namin lamang makakuha ng smart at sabihin habang haba? Sa halip, sabihin lamang tawagan ang haba upang magsimula sa, initialize ito sa 0 dahil sa pamamagitan ng default string ay hindi haba hanggang sa nalaman namin kung ano ito ay. Ngayon ay ginagawa namin ito, at ngayon ito ay isang medyo eleganteng programa. Isa variable. Nalinis ko ito up, tightened ito. Kaya ngayon sabihin bumalik sa aking terminal na window. Natin sige at patakbuhin ang. Gawing strlen. Mukhang mabuti. Patakbuhin ang strlen muli, ang Enter. Bigyan mo ako ng isang string: HELLO, Ipasok. At tila gumagana tulad ng 5. Ngayon, upang maging malinaw, kung hindi ako ay nakasulat, halimbawa, HELLO sa 1 string at pagkatapos bye sa isa pa, maaari naming tiyak na magkaroon ng maramihang mga salita. Kung ang mga expression na aktwal na gusto ko i-type ay hindi HELLO ngunit, halimbawa, HELLO mundo, notice na kung ano ang hindi namin ay may sitwasyong ito dito, i-right? Na maaaring magmungkahi na na 2 string. Kang tiyak na maaaring magkaroon ng mga character ng space bar, kaya kung namin talagang type sa isang mas mahabang pariralang tulad ng Hello World, kung ano ang namin talagang sa memory mukhang isang maliit na bagay tulad na mayroong. Ayos lang. Anumang mga katanungan tungkol sa representasyon sa dito ng string? Hindi? Ayos lang. Kaya sinabi ko mas maaga na pagtawag strlen muli at muli sadyang tulad na ay marahil hindi ang pinakamahusay na ideya dahil ka na ang paggawa ng isang buong maraming trabaho muli at muli at muli. Katunayan, kung anong uri ng trabaho ay kinakailangan para sa pag-uunawa ng ang haba ng isang string, tila? Mayroon kang magsimula sa simula at pagkatapos ay hanapin, hanapin, hanapin, hanapin, hanapin hanggang sa ikaw ay sa wakas makita na ang mga espesyal na character, sa puntong, ah, ngayon alam ko ang haba. Kaya mas maaga kapag kami ay strlen tinatawag na muli at muli at muli, ang dahilan ko iminungkahi na uri ng bobo dahil muli, string na kamukha na. Hindi ito baguhin sa bawat oras na umulit sa pamamagitan ng ilang loop, kaya gumagawa ka ng hindi kinakailangang trabaho. Sa parehong oras na dapat mong malaman, bilang isang bukod, na compiler tulad kumalatong mga araw na ito ay nabuo sa loob ng maraming taon, at tagatala manunulat, programmer, medyo na smart. At kaya ito lumiliko na kumalatong at iba pang mga compiler ay maaaring aktwal na malaman na, okay, oo, sinulat ni strlen sa iyong kondisyon, na technically nangangahulugan na kami tatawag ito muli at muli at muli. Ngunit ang smart compiler ay maaaring aktwal na-optimize ang mga uri ng mga mahihirap na desisyon ng user ng iyong code sa pagtutumpak ang mga bagay. Kaya lang Napagtanto na minsan tagatala ay mas matalinong kaysa sa amin at uri ng itago ang ating sariling pagkakamali. Ngunit tiyak na pagdating sa mga set ng problema at ang mga tulad ng, huwag iniisip tungkol sa mga sa panimula maling desisyon ng disenyo potensyal para sa simpleng dahilan na gusto namin ang paggawa ng paraan pang trabaho kaysa sa aktwal na namin gawin. Ngunit paano higit pang trabaho? Sa kaso ng Hello World, sabihin simulan upang magbigay ng tuntuning panlahat ang laki ng problema na ito. Ano ang haba ng problema o ang laki ng problema kapag ang salitang ang gumagamit na nai-type sa HELLO? Ito ay tila 5, siguro 6. Plus o minus 1. Anuman. Kaya malapit lang namin tumawag ito 5. Kaya kung ano ang laki ng problema dito kapag sinusubukan upang malaman kung ang haba ng HELLO? Ito ay 1, 2, 3, 4, 5, at maaaring 6 para sa huling character, ngunit sabihin ng tuntuning panlahat na bilang n. Kaya n, lamang ang variable n, ay kung ano ay karaniwang gamitin ang mga siyentipiko computer na upang ilarawan ang laki ng problema, at ang problema sa kamay ay kung gaano katagal ang HELLO? Gaano karaming oras ang strlen? Tumatagal sa pagkakasunud-sunod ng mga hakbang sa n, kung saan ang bawat hakbang ay nangangahulugan na ang pagtingin sa isang character, tumingin sa isang character, tumingin sa isang character. At nagkaroon kami ang talakayang ito sa isang habang pabalik, ang bilang ng mga pagpapatakbo ng isang bagay na tumatagal. Ang unang araw ng klase ay namin ang lahat awkwardly tumayo, at pagkatapos ay lahat nagsimula pagpapares off sa bawat isa upang aktwal na bilang ng perpektong gaano karaming mga tao ay sa kuwarto. At ginawa din namin ng isa pang bagay kung saan kung ginawa ko sa halip ang lumang paraan ng paaralan ng simula 1, 2, 3, 4, 5, 6 at iba pa, na masyadong, ang laki ng problema na n laki. May mga n tao sa kuwarto. Ngunit maaaring mapabilis ko na up, tama? Grade estilo ng paaralan ay maaaring kong simulan ang pagbibilang sa 2s. 2, 4, 6, 8, 10, 12. At na nararamdaman kaya mas mabilis, at sa katunayan ito ay. Literal dalawang beses bilang mabilis, ngunit muli, kung ang isa pang 400 mga tao lumakad sa kuwartong ito lahat nang sabay-sabay, ang mga algorithm na iyon ay tumagal ng isa pang 400 o 200 hakbang siguro. Ngunit sa pamamagitan ng kaibahan, kung namin talagang makakuha sa smart at sa halip namin ay may lahat ng iyong bilangin sarili, isipin ang kung paano ang algorithm na nagtrabaho. Lahat nakatayo up. Hayaan akong fast-forward na ito. Lahat nakatayo up, ipinares mo off, pagkatapos ay kalahati ng sa iyo nakaupo pababa, nakaupo pababa ang kalahati ng sa iyo, ang kalahati ng nakaupo, at sa bawat pag-ulit ng loop na ito mula sa linggo 0, halved namin ang problema sa kamay at napunta sa n / 2, pagkatapos n / 4, pagkatapos n / 8. At ang mga implikasyon ng na ay na kung ang isa pang 400 mga tao maglakad sa room, hindi sang-ayon, tumagal kami ng 1 pang ikot, hindi 400 higit pang mga round, hindi 200 higit pang round. At kaya ang kuwento namin sinabi habang pabalik ay upang gawin ang isang maliit na isang bagay na ito. Ito pulang linya dito ay linear, tuwid, at ito ay may label na bilang n dahil bilang ang laki ng problema ay lumalaki, kung ang iyong algorithm o programa kung saan ka paglutas ito ay tumatagal ng n hakbang, 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. At ang diskarte twosies, pagbibilang 2, 4, 6, 8, pa rin ng isang tuwid na linya, sandali lang mas mahusay. Ito ay tumatagal ng kaunti mas kaunting oras, kaya ang dilaw na linya sa ibaba ang pulang point ng linya para sa punto. Ngunit mas mahusay ay ang banal na Kopita ng kung ano ang aming tinatawag logarithmic oras kung saan kahit na muli namin double ang bilang ng mga tao sa room, double namin ang laki ng telepono na libro mula sa unang araw ng klase, hindi sang-ayon, ito ay tumatagal ng 1 higit pang mga pahina ng luha, tumatagal ng 1 pang sitting down na upang malutas ang isang problema na dalawang beses na malaki. At sa gayon ang pag-uusap na namin ngayon upang simulan ang pagkakaroon ay kung paano namin aktwal na malutas ang mga problema mahusay kung isaalang-alang namin ang pinakasimpleng ng mga problema tulad nito? Ipagpalagay na mayroon kaming 8 pinto sa likod na ang ilang mga numero, at ang bawat isa sa mga bilang na ito ay hindi pinagsunod-sunod sa anumang paraan, sila lamang random na integer sa likod ng mga pintuan, at hinihiling namin ang tanong kung paano mo pumunta tungkol sa paghahanap ang bilang - na nakakaalam - 7 likod mga pinto? Ano ang gusto mong, ang isang tao, gawin upang mahanap ako ng bilang 7 kung muli sa bawat isa sa mga ito ay pinto at upang makita ang isang halaga na mayroon kang magbukas ng pinto? Ano ang iyong algorithm ay marahil? [Hindi marinig na mag-aaral tugon] >> Kaya magsimula sa kaliwa at magbukas ng pinto, buksan ang isang pinto, buksan ang isang pinto. At sa pinakamasama kaso, kung gaano katagal ito upang dalhin sa amin upang mahanap ang numero 7? At muli, hindi sila pinagsunod-sunod, kaya ito ay hindi kasing-dali ng, maayos, ako pagpunta sa buksan ang 7th pinto. Maaaring magtagal amin, maximally, 8 hakbang. Sa pinakamasama kaso, 7 ay random sa pinakadulo ng linya ng mga pinto, sa gayon ay maaari naming upang subukan ang lahat ng mga pinto n. Kaya muli dito, mukhang namin upang magkaroon ng isang linear na algorithm. Sa katunayan, ginawa namin ito lamang ng ilang taon na ang nakalipas. Isa ng iyong mga predecessors ay hinamon sa tiyak na ito kung saan hindi namin magkaroon ng isang digital na bersyon, sa halip namin ay nagkaroon ng isang pisara may ilang mga piraso ng papel na ito. At kung ano ang naisip ko na gusto kong gawin ay kumuha ng isang mabilis na pagtingin sa kung paano ito nagpunta, isa ng ang pinakamahusay at marahil pinaka-mahirap na pagkakataon sa entablado sa isang demonstration dito mismo sa Sanders. Nagkaroon kami ng 2 mga hilera ng mga numero. Lamang namin ay pagpunta sa tumingin sa kung ano ang mangyayari dito may Sean para sa pinakatuktok ng mga hilera. Maliban kung hindi isa sa kailanman muli boluntaryo sa CS50, nagkaroon kami ng pagpapala ng Sean upang panatilihin ito sa camera, kaya siya alam na ang daan-daang ng mga tao ay nanonood ito para sa taon na ngayon. Ngunit Sean ginawa sa kahanga-hangang trabaho - o ginawa niya - sa aktwal na paghahanap sa amin ng isang partikular na numero. 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 kung paano mahanap namin ang mga bagay mahusay. [Malan sa video] ako maitago sa likod ng mga pintuan ang bilang 7, ngunit nakatago ang layo mula sa ilang ng mga pintuan pati na rin ang iba pang mga hindi-negatibong numero, at ang iyong layunin ay sa tingin ng mga ito tuktok na hilera ng mga numero bilang isang array lamang o lamang ang pagkakasunud-sunod ng mga piraso ng papel na may mga numero sa likod ng mga ito, at ang iyong layunin ay, lamang gamit ang nangungunang array dito, hanapin sa akin ang bilang 7. At pagkatapos namin ay pagpunta sa pumupuna kung paano pumunta tungkol sa gawin ito. >> Lahat ng karapatan. [Malan] Maghanap ng sa amin ang numero 7, pakiusap. [Tawa] [Malan] No [tawa] 5, 19, 13, [tawa]. Hindi isang nanlilinlang tanong. 1. [Tawa] Sa puntong ito ang iyong iskor ay hindi napakagandang, kaya maaari mong pati na rin panatilihin ang pagpunta. [Tawa] 3. Pumunta sa. Lantaran, hindi ko maaaring makatulong ngunit magtaka kung ano ang kahit pinag-iisipan mo tungkol sa. [Tawa] Tanging ang tuktok na hilera, kaya mayroon kang 3 kaliwa. Kaya mahanap ako ng 7. [Mag-aaral murmuring] [Malan] 17. [Mag-aaral murmuring] [Malan] 7! [Palakpakan] Kaya sa Miyerkules ay namin sumisid sa ito at mas sopistikadong algorithm para sa paghahanap ng mga bagay. Sa ngayon, ipapakita namin iniwan mo sa Sean at nakikita mo sa Miyerkules. [CS50.TV]