[Powered by Google Translate] [Linggo 2, ipinagpatuloy] [David J. Malan, Harvard University] [Ito ay CS50. - CS50.TV] Ayos lang. Ito ay CS50, at ito ay ang katapusan ng linggo 2. Kung inaasahan mong gutom sa paligid ng oras na ito bukas, alam na namin ay upang magtipun-tipon bilang isang maliit na grupo bukas, Huwebes, 1:15. Mayroon dito ang URL na ito kung nais mong i-RSVP. Space ay limitado, kaya mangyaring patawarin kung ang form ay napuno ng oras na punan ito. Isa pang URL, bagaman, na maaaring maging ng interes ito. Sa loob lamang tungkol sa oras ng isang buwan, ang kurso ang pagpunta sa ginawang magagamit ang lahat ng mga mas malawak sa pamamagitan ng edX, sa pamamagitan ng kung saan ang mga tao sa Internet upang sumunod, umaakit sa kurso medyo aktibong, sa katunayan. Makikita nila gamit ang CS50 Appliance at CS50 Talakayin at karamihan ng iba't ibang mga tool ng software na namin nai-gamit ito semestre. At isa sa mga hakbangin sa nais naming gumawa ng bilang isang eksperimento sa taong ito upang makita lamang kung magkano ang nilalaman maaari naming isalin sa ibang sinasalita at nakasulat na wika. Kaya kung maaaring mayroon ka ng interes sa mga kalahok sa proyektong ito kung saan magbibigay kami ng Ingles mga transcript at subtitle para sa mga aralin sa kurso at shorts at mga seminar at mga seksyon at tulad, kung nagsasalita ka matatas o isulat ang ilang iba pang mga wika matatas, ibig naming umaakit sa proyektong ito kung saan mong gawin sa isa o higit pa ng mga video, -translate ito sa isang wika na alam mo medyo na rin. Upang bigyan ka ng isang pakiramdam ng interface, mayroong ang web-based na interface ng gumagamit na kami gumagamit na lumikha ng mahalagang ng UI tulad nito. Ito sa akin ang pagtuturo ng ilang Halloween nakalipas, at sa kanang bahagi doon sa itim na susunod sa mga selyo ng oras, makikita mo ang iba't-ibang mga bagay na dumating out ng aking bibig sa araw na iyon, at pagkatapos ay sa ibaba nito magagawa mong isalin sa ilang iba pang mga wika kung ano mismo ang pagma-map ay sa pagitan ng, sa kasong ito, Ingles at, sabihin nating, Espanyol. Kaya ito ay talagang isang napaka-user-friendly na tool. Maaari mong i-rewind at fast-forward ang napaka kaagad na may mga shortcut sa keyboard. Kaya kung nais mong makibahagi sa eksperimentong ito at nakita ang iyong mga salita at magbasa sa pamamagitan ng mga potensyal na libo-libong mga tao out doon, mangyaring huwag huwag mag-atubiling upang lumahok. Isang salita tungkol sa mga kuting mula Lunes. Baka nagpadala kami ng isang labis na nakakatakot na mensahe, gawin mapagtanto na, ng mga oras sa opisina iminumungkahi at bilang iminumungkahi sa mga seksyon, ang disenyo ng kurso ay napaka na mga mag-aaral pakikipagtulungan at pakikipag-usap upang gumana sa pamamagitan ng mga hanay ng problema at mga problema nang sabay, at talagang linya lamang ay down sa, muli, ang trabaho mo sa huli isumite dapat iyong sariling. At kaya medyo totoo lang, sa oras ng opisina lubos na normal, lubos na ito na inaasahan kahit, na pakikipag-chat sa ilang mga kaibigan sa susunod sa iyo. Kung siya ay struggling na may ilang mga paksa at ikaw ay tulad, "Oh, well, hayaan mo akong bigyan ka ng isang sulyap ng ilang linya ng code na sinulat ni ko," na ang fine, nangyari iyon, at na napaka kaaya-aya, tingin ko, sa proseso ng pag-aaral. Saan ang linya ay makakakuha tumawid kapag ang ulo ang uri ng tagilid sa paglipas dito para sa malayo masyadong maraming mga segundo o minuto na talagang na lamang isang unblock pagkakataon para sa iyong mga kaibigan, at tiyak na kapag ang mga bagay ay makapag-palitan sa pamamagitan ng email at Dropbox at ang mga tulad ng, doon ay ang linya. Ito sa pamamagitan ng lahat ng paraan kumportable at tingin hinihikayat upang makipag-chat sa mga kaibigan at mga kaklase tungkol sa mga psets at higit pa at mapagtanto na ang huli mo isumite dapat talagang ang produkto ng iyong paglikha at hindi ibang tao. At kaya isa sa mga domain na tukoy na mga problema para sa pset2, na darating ang late bukas gabi, ay sumisid sa mundo ng cryptography, kung saan ay ang sining ng pag-encrypt o scrambling ng impormasyon, at ito huli nauugnay sa mundo ng seguridad. Ngayon, ang seguridad para sa karamihan sa atin ay sa anyo ng mga mekanismo medyo pangmundo. Lahat sa atin ay may username at password, at ang lahat sa atin ay may napaka-masamang username at password, malamang. Kung ang iyong password ay ang parehong sa maramihang mga website, na malamang na hindi ang pinakamahusay na ideya, bilang namin talakayin patungo sa pagtatapos ng semestre. Kung ang iyong password ay nakasulat sa isang sticky tandaan - walang magsisti - sa iyong monitor, na masyadong ay hindi kinakailangan ang pinakamahusay na disenyo ngunit medyo isang karaniwang kababalaghan. At kung hindi ka gumagamit ng cryptography upang i-encrypt ang iyong mga password, ang mga ito ay partikular na mahina. Kaya kung sa tingin mo ay pagiging sobrang matalino sa pamamagitan ng pagkakaroon ng isang nakatagong dokumento ng Word sa isang lugar sa iyong hard drive na may lahat ng iyong mga password ngunit sa isang folder na walang pagpunta sa tumingin sa, na masyadong ay hindi secure na mekanismo. At kaya kung ano pset2 ipakikilala ito sining ng cryptography at scrambling ng impormasyon upang ang mga bagay na tulad ng mga password ang lahat ng mga mas ligtas. Sa konteksto dito ay na may mga hindi secure na data ay isang pagkakataon upang i-encrypt at mang-uayabit ito. At kaya ito, halimbawa, ay isang halimbawa ng isang naka-encrypt na mensahe. Ito aktwal na nagsasabing isang bagay sa Ingles, ngunit ito ay malinaw na hindi ganap na pag halata. At kami na darating buong lupon ngayon sa manunudyo bukod kung ano ang lihim na mensahe dito. Ngunit sa tunay na mundo ng mga computer, mga bagay ay hindi kahit hitsura sila ng Ingles parirala. Halimbawa, ito ay kung ano ang maaari mong makita sa isang karaniwang Linux o Mac o UNIX computer na sa isang file na sabay-sabay kapag oras na tinatawag na ang password ng file. Kasalukuyan ito ay inilipat sa iba pang mga lugar. Ngunit kung titingnan mo sa tamang lugar sa isang sistema, makikita mo ang hindi lamang ang iyong username o ng iba pang mga tao sa system, ngunit makikita mo ang isang naka-encrypt na bersyon ng kanilang mga password. Sa katunayan, ang salitang silid sa ilalim ng lupa doon ay nagmumungkahi na ang mga sumusunod na bagay ay naka-encrypt, at ito serye ng mga tila random na titik at mga character at numero at iba pa maaaring decrypted lamang ng pangkalahatang alam ilang lihim - ng isang lihim na salita, ng isang lihim na numero - at kaya sa katunayan, ang sining ng cryptography sa huli kahulihan babagsak ito sa pinagkakatiwalaan ng uri at alam ng isang bagay na ang ibang tao ay hindi. Kaya makikita namin galugarin ito ng kaunti pang detalye ngayon at sa pset sa darating. At ngayon ng isang salita sa pass / mabibigo. Lalo na ng ilan sa inyo ay dived sa pset1, Appliance, at isang bagong mundo para sa iyong sarili, Napagtanto na mga frustrations at pagkalito at mga teknikal na problema ay lubos na inaasahan, lalo na sa unang pset, kung saan may lamang kaya magkano bagong, lamang sa pagkuha ng pamilyar may ls at cd at lahat ng mga arcane utos at isang bagong kapaligiran, at na hiwalay mula sa aktwal na materyal at mga programa mismo. Kaya Napagtanto masyadong na may mga tiyak na mga oras ng opisina na umiiral bilang isang istraktura ng suporta. Mga seksyon simulan ito darating na Linggo. Ngunit pinaka-mahalaga, kung ikaw ay pakiramdam lamang na hindi ito ang mundo para sa iyo, mapagtanto na ito ay talagang ay lamang tumagal ng oras. At mga hindi para sa pagkakataon na ito taon na ang nakakaraan para sa akin ng pagkuha ng isang klase ng pass / mabigo, totoo lang, hindi ko sana ay kahit nakatakda paa sa silid-aralan. At maaari mong baguhin ito hanggang, sabihin nating, sa ikalimang Lunes ng kurso, kaya kung ikaw ay sa dulo ngayon, nauunawaan natin na kaysa sa ulo sa ilang iba pang mga tubig sa kabuuan, tiyak na isaalang-alang na lamang pagbabago upang pumasa / mabibigo. Muli, hindi talaga ito kultura dito sa Harvard ng pagkuha ng mga bagay pumasa / mabibigo dahil lahat talaga gustong makamit o overachieve, ngunit lantaran, ito ay isang magandang paraan ng sinusubukan ng isang bagay out na maaaring hindi pamilyar sa iyo, at makikita mo paggawa, sa karamihan ng mga kaso, medyo fine, marahil magkano sa iyong sorpresa. At sa mas kongkreto mga tuntunin, kung ano ang tingin ko pumasa / mabibigo pangkalahatan ginagawa, lalo na kung maaari mong naranasan sa pset0, kung inilagay mo sa loob ng 10 oras, 15 oras, 25 oras sa ilang pset at ka banging iyong ulo laban sa pader at nakakakuha ito ng sobrang late sa gabi ngunit nagsagawa ang pset 90% ng paraan at mo lamang ay hindi maaaring malaman kung ang isang bagay, pumasa / mabibigo talagang tumatagal sa gilid ng isang klase tulad nito, kung saan maaari mong pag-uri-uriin ng maligaya sabihin, "Okay, alam ko hindi perpekto, ngunit nagtrabaho ako sa aking puwit sa, ako ay medyo masaya sa kung saan ito napunta, " at iyon ay matugunan ang mga inaasahan para sa pass / mabibigo. Kaya panatilihin na sa isip. Ayos lang. Kaya mga mo na struggled gamitin ang Harvard University Wi-Fi, malaman na may CS50 SSID, isang koneksyon sa Wi-Fi, lumulutang sa paligid na maaaring mayroon ka ng mas mahusay na swerte para sa. Ang isang maliit na tumbalik na ang password para sa ito, kung nais mong upang subukan sa pagkonekta sa para sa mas mahusay na bilis - at ipaalam sa amin kung hindi mas mahusay na - ay 12345, ang lahat ng paraan sa hanggang 8 dahil 8 ay mas ligtas sa 5. Kaya kung kailangan mo ang Wi-Fi password, kumonekta sa CS50 wireless dito, 12345678, at post sa CS50-usapan kung mayroon ka pa ring mga pasulput-sulpot na mga isyu sa pagkakakonekta, at ipapaalam namin ang mga kapangyarihan na ay malaman para sa puwang na ito. Ayos lang. Kaya isang mabilis na teaser, lalo na para sa mga mo na fan lalaki o babae ng lahat ng bagay na Apple. Ano ko utong up mula sa ilang taon na pabalik ang file na ito dito, iUnlock.c, lamang sa uri ng gawing mas kongkreto at mas kumplikado ang ilan sa mga pangunahing programa C namin ang pagsusulat. Kaya ko binuksan ang file na ito, iUnlock.c. Magagamit sa pahina ng aralin para sa ngayon. Sa kaliwang bahagi, makikita mo ang isang mahabang listahan ng mga function. Kaya ang kapwa na sinulat ni ito sinulat ni ng maraming mga pag-andar, higit pa sa pangunahing. Siya ay gumamit ng isang buong grupo ng mga aklatan dito, at kung sisimulan namin ang scroll sa pamamagitan ng, kung ano ito talaga ay ang unang, naniniwala ako, crack para sa orihinal na iPhone. Kapag nais mong jailbreak ang orihinal na iPhone, na kung saan ay nangangahulugan na ang untether ito mula sa AT & T at aktwal na-install ng espesyal na software sa ito at gawin ang mga bagay na Apple ay hindi gusto ng mga tao na gawin, may kinuha ang oras upang malaman kung eksakto kung paano sila ay maaaring samantalahin ng mga flaws software, pagkakamali, bug, sa Apple software, at kaya ay ipinanganak na iUnlock.c-- na kung pinagsama-sama ito sa iyong computer at mai-install ito sa isang iPhone na konektado sa iyong computer sa pamamagitan ng, sabihin nating, isang USB cable, ito ay magbibigay sa iyo ng-administratibo o ugat na mga pribilehiyo sa iyong iPhone at hayaan ang gawin mo medyo magkano ang anumang nais mong. At kaya mayroong nangyaring ito kamangha-manghang cat at mouse laro sa pagitan ng Apple at ang ibang bahagi ng mundo sa partikular na habang ang mga ito, tulad ng maraming mga kumpanya, subukan upang i-lock ang kanilang mga bagay-bagay down sa gayon ay maaari mo lamang gawin sa mga ito kung ano ang iyong nilalayong sila. Ngunit salamat sa mga taong tulad nito at ang pang-unawa ng mababang antas na mga detalye - at sa kasong ito C programming - at ng maraming ng pamilyar na constructs na namin nasimulan ang paglalaro, ikaw ay sa talagang magamit ang hardware sa paraang nakikita mong akma at hindi kinakailangan ang ilang corporate entity. Kaya halimbawa, mayroon akong walang ideya kung ano ang lahat ng ito ay ginagawa, ngunit GetVersion tunog medyo direkta, at Mukhang ito ay isang function na ang taong ito sinulat ni. Ito ay tumatagal ng ilang uri ng integer bilang isang argument, ay hindi bumalik sa anumang, ngunit lumilitaw sa loop na may isang para sa loop dito at kung kundisyon, kung kundisyon pahinga, at sa paanuman nauugnay sa numero ng bersyon kung mag-scroll pababa namin, kahit na ng maraming ng mga keyword na ito ay pagpunta sa bagong. At may isang buong maraming mga function in dito hindi nakakita kami at maaaring hindi kailanman makita sa kabuuan ng semestre. Sa pagtatapos ng araw, ito ay sumusunod sa parehong mga alituntunin at logic na namin ang nagpe-play na may sa gayon malayo. Kaya ito ay malayo masyadong luma sa magpahaginit ang iyong iPhone 3s o 4s o madaling 5s mga araw na ito, ngunit alam na ito ang lahat ng napaka nakuha mula sa mundo na ito na namin ang dived sa. Natin ang isang pagtingin sa isang kaunti pa simpleng halimbawa: ang isang ito, upang warmed up na may ilang syntax at ding ilang iba pang mga uri ng data na namin ang uusapang tungkol sa ngunit hindi talaga nakita sa C. Ito ay isang file na tinatawag positive1.c, at bawat ang mga komento sa itaas, ito lamang hinihingi na ang isang gumagamit ay magbigay ng isang positibong numero. Kaya ito ay isang halimbawa ng do-habang loop, na maganda para sa mga user interactive na programa kung saan kailangan mong sabihin sa user upang gawin ang isang bagay, at kung hindi sila makikipagtulungan ka sumigaw sa kanila o tanggihan ang kanilang mga input. Kaso sa point: ako pagpunta sa gawin ang mga linya 19 sa pamamagitan ng 24 hangga't ang user ay hindi ibinigay sa akin ng isang positibong numero. Ito detalye dito sa linya 18, bakit ko idedeklara n itaas ang buong looping bumuo kumpara sa tabi mismo sa linya 22 kung saan aktwal na ako pakialam upang makakuha n? Oo. [Mag-aaral] Saklaw. >> Oo, kaya ang isyu na ito ang saklaw. At sa mga tuntunin lego, ano ang saklaw sumangguni sa? Oo. >> [Hindi marinig tugon ng mag-aaral] >> Maaari ka nagsasalita ng kaunti louder? [Mag-aaral] Saan maaari mong ma-access ang na variable. >> Perpekto. Kung saan maaari mong ma-access ang isang partikular na variable. At sa pangkalahatan, ang pamantayan sa gayon ay malayo ay na ang saklaw ng ilang mga variable ay tinukoy sa pamamagitan ng ang pinakabagong kulot tirante na nakita mo. At kaya sa kasong ito, kung ginawa ko ang pagkakamali ng deklarasyon n sa linya 22, ang linya na gagana. Gusto ko ng isang int, at ko bang ilagay ang mga ito sa n na variable sa linya 22, ngunit kung aling linya ng code na ngayong magkaroon ng walang ideya kung ano ang ako ng pakikipag-usap tungkol sa? >> [Mag-aaral] 25. [Malan] 25, at lumiliko ang 24 pati na rin dahil sa kasong ito Nabibilang ang labas ng ang kulot tirante. Kaya lamang ng kaunti ng isang istorbo ngunit lalong madaling malutas sa pamamagitan ng simpleng deklarasyon ng variable sa labas ng function na mismo. Susubukan naming makita mamaya maaari kang pumunta isang hakbang karagdagang at maaari mong kahit na makakuha ng isang maliit na tamad. At ito ay hindi inirerekomenda sa pangkalahatan, ngunit maaari mong kahit na makakuha ng mga tamad at ilagay sa isang variable sa buong mundo, kaya magsalita, hindi sa loob ng isang function, hindi sa loob ng isang loop, ngunit sa mismong file, sa labas ng lahat ng mga pag-andar na iyong nakasulat, tulad ng ginawa ko dito sa linya 15. Ito ay karaniwang frowned, ngunit mapagtanto na ito ay isang solusyon sa minsan sa iba pang mga problema, bilang namin ay makakita. Kaya sa ngayon ipapakita namin iwanan ito tulad nito, ngunit sabihin makita kung maaari naming muling isulat ito lamang upang simulan ang pagpapahayag sa ating sarili ng isang maliit na naiiba. Ang program na ito, upang maging malinaw, ay positive1. Hayaan akong magpatuloy dito at sa aking terminal na window positive1, Ipasok. Compiles okay. Ako pagpunta upang patakbuhin ang positive1, pindutin ang Enter. Hinihiling ko na ba ninyo akong bigyan ng isang positibong integer. Sasabihin kong -1. Na ay hindi gumagana. 0, 99. Na mukhang upang gumana. Siguro hindi ang pinaka-mahigpit na pagsubok, ngunit hindi bababa sa isang magaling katinuan check na hindi namin sa kanan track. Kaya ngayon hayaan mo akong sige at buksan bersyon 2 ng ito, at kung ano ay naiiba na? Ipinapatupad ang parehong bagay, ngunit kung ano ang paglukso bilang malinaw iba't ibang oras na ito? Ito bool sa berde. Ito ay naka-highlight sa berde, ang keyword na ito na kilala bilang bool, kung saan ay isang uri ng data. Bakit hindi ito built in sa lahat ng mga bersyon ng C. Kailangan mong isama ang isang tiyak na library. Sa aming kaso, kasama ko CS50 library upang mayroon kaming access sa bool. Ngunit sa ika-18 linya, tila namin upang magkaroon ng isang Boolean halaga dito tinatawag na nagpapasalamat. Ko tinatawag na anumang ito, ngunit ko na tinatawag na ito nagpapasalamat lamang uri ng ihatid ilang semantiko kahulugan. Kaya simula sa linya 18, ako tila hindi nagpapasalamat dahil ang Boolean halaga nagpapasalamat nasimulan sa False sa linya 18. At pagkatapos ay tila kung ano ang nagawa ko na dito sa linya 21 sa pamamagitan ng 23 ay ako na lamang ang uri ng rewritten aking logic. Kaya walang pagtakbo ibang, ngunit sa linya 22 ngayon ko masusuri kung ang int ang user ay mas malaki kaysa sa 0, pagkatapos ko lamang baguhin ang halaga ng nagpapasalamat sa true. At kung bakit ang gagawin ko na? Dahil sa linya 25, tila ako pagpunta upang suriin ang isang kalagayan. Gawin ito sa loop habang nagpapasalamat false. Kaya ko iminungkahi ito bilang isang kahalili sa bersyon 1 dahil ito ay hindi bababa sa isang maliit na mas magaling marahil, ang kaunti pa grawnded sa Ingles. Kaya gawin ang mga sumusunod habang ikaw ay hindi nagpapasalamat o habang nagpapasalamat false. At oras na ito masyadong ko tila hindi pinapahalagahan matandaan kung ano ang user na nai-type sa dahil paunawa walang variable n, kaya aktwal, ang isang maliit na maliit na kasinungalingan doon. Pagtakbo, ang programa bit naiiba sandaling makuha namin sa ilalim ng dahil hindi ako alala kung ano n ay. Subalit Nais kong upang ipakita dito masyadong na kahit na nakakita kami GetInt at GetString ginagamit sa kanang bahagi ng isang equals sign sa gayon ay malayo kaya na tandaan namin ang halaga, technically, na hindi mahigpit na kinakailangan. Kung para sa anumang dahilan hindi mo lang pakialam sa i-save ang halaga, gusto mo lang upang suriin ang halaga, mapapansin na maaari lamang namin magsulat ito bilang GetInt, bukas paren, malapit paren. Na function ay nagbabalik ng halaga, bilang namin ang sinasabi. Ito ay upang bigyan ka ng isang int. At kaya kung sa tingin mo itak ng ito mangyari, kapag type ko sa 99, GetInt nagbabalik ang bilang 99, at kaya conceptually, na parang ang aking code ay aktwal na ito. Kaya kung 99 ay talagang mas malaki kaysa sa 0, pagkatapos ay nagpapasalamat nagiging totoo, linya 25 napagtanto ooh, tapos na kami dahil ako ngayon nagpapasalamat, at sa linya 26, lamang namin sabihin, "Salamat para sa positibong integer!" anumang nangyari ito upang maging. Ngayon sabihin gawin bahagyang sintaktik asukal dito, kaya na magsalita. Natin makita kung maaari naming linisin ang line 25 na ito ikatlong at huling variant sa positive3. Pansinin ang pagkakaiba lamang ngayon ay kung ano ang linya ng code? >> [Mag-aaral] 25. >> [Malan] Oo, 25. At hindi kami talagang nakikita nanlilinlang ito pa, ngunit hindi namin nakita ang exclamation point sa Lunes, kung saan Nagpapahiwatig ng kung ano? >> [Mag-aaral] Hindi. >> Hindi o hindi pagsang-ayon. Kaya tumagal ng Boolean halaga at i-flip ang halaga nito. Totoo nagiging maling, huwad na nagiging totoo. Kaya ito, nais kong ipanukala, kahit na isang maliit na mas madaling maunawaan paraan ng pagsulat ng code dahil ko pa rin initialize nagpapasalamat sa maling, ako pa rin gawin ang mga sumusunod, Ako magse-set nagpapasalamat sa true kapag may oras ang pagdating, ngunit ngayon ay maaari mo ba talagang lamang isalin ang code na ito pasalita kaliwa hanggang kanang, habang (nagpapasalamat!); dahil putok o exclamation point Nagpapahiwatig ang paniwala ng hindi, ito habang hindi nagpapasalamat. Kaya muli, hindi namin ipinakilala ng anumang mga bagong konsepto per se. Usapan natin ang tungkol Booleans pabalik kapag naglaro namin na may scratch, ngunit ngayon Napagtanto Maaari lang namin simulan ang pagsusulat ng aming code sa maraming iba't ibang paraan. Kaya lalo na sa pset1 kung ikaw ay ang uri ng struggling upang malaman kung ang paraan upang magsulat ng ilang mga programa, logro ay hindi sa swerte dahil maaaring maging anumang bilang ng mga solusyon na maaari mong mangyayari kapag. Halimbawa, ito ay may 3 para sa kahit na ang pinakasimpleng ng mga programa. Ayos lang. At ngayon isipin ang sa Lunes iniwanan namin sa ang tala na ito sa mga halaga ng return. Kaya para sa unang pagkakataon namin nagsulat ng programa na hindi lamang magkaroon ng mga pangunahing; ito din ay may sariling pasadyang function na sinulat ni ko dito. Kaya sa linya 31 sa pamamagitan ng 34 naipatupad ko na ang isang kubo function na. Hindi complex. Lang * a * a sa kasong ito. Ngunit kung ano ang mahalaga tungkol dito na ako pagkuha ng input sa form ng isang at ako bumabalik output sa form ng isang * a * a. Kaya ngayon mayroon akong kakayahan, tulad ng ginamit ko sa prinf nag-iisa, upang tawagan ang function na ito sa pamamagitan ng pagtawag sa function na kubo. At ang kubo function na tumatagal ng ilang mga input, at ang kubo function na nagbabalik ilang output. Sa pamamagitan ng kaibahan, printf ginawang isang bagay. Hindi ito ibalik anumang bagay na namin cared tungkol sa, kahit bilang isang bukod nagbabalik ng halaga; mo lang pangkalahatan huwag pansinin ang mga ito. Printf ginawang isang bagay. Ito ay isang bahagi epekto ng pag-print sa screen. Sa pamamagitan ng kaibahan dito, mayroon kaming kubo function, na aktwal na nagbabalik ng isang bagay. Kaya para sa mga pamilyar na ito, ito ay isang medyo tapat ideya. Ngunit para sa mga taong hindi gaanong pamilyar sa ito ideya ng pagpasa sa mga input at pagbalik output, subukan sabihin lamang ng isang bagay na sobrang simple. Ang sinuman kumportableng paparating na sa entablado maikling? Mayroon kang kumportable na may camera sa iyo pati na rin. Oo? Okay. Ano ang iyong pangalan? >> [Mag-aaral] Ken. >> Ken. Ayos lang. Ken, ay sa up. Ken ay isang function ng mga uri dito. Natin magpatuloy at gawin ito. Natin makakuha ng isang maliit magarbong. Masaya akong makilala kayo. Maligayang pagdating sa sentro yugto. Ayos lang. Natin pindutin ang pindutang ito dito. Ayos lang. Kaya dito mayroon kang isang modernong Chalkboard, at kung ano ang Ako ay ang pangunahing function na, halimbawa, at hindi ko magkaroon ng isang iPad sa aking kamay. Hindi ko talaga matandaan kung paano - Well, hindi ko masabi na. Hindi ko talaga may magandang sulat-kamay, at kaya samakatuwid Gusto kong mong i-print ang isang bagay sa screen para sa akin. Ako bilang pangunahing programa, at ako pagpunta sa sabihin mo ito sa pamamagitan ng pagsulat ito sa aking manok sa simula at pagkatapos ay pagpasa sa iyo ng isang input. Ulok Kaya kahit na ehersisyo ito ay, ang paniwala ng mga function at pagtawag ng isang function at nagbabalik ng isang function talagang boils down na ito. Ako pangunahing, lamang ko isinulat printf, quote-magpanipi isang bagay sa screen, Ako nagpapatakbo ng programang ito, at sa lalong madaling printf ay makakakuha ng tinatawag na, ito ay tumatagal ng isang argument o isang parameter minsan sa pagitan ng mga double quote. Narito ang argument na. Ako pagpasa ito sa Ken. Siya ay isang itim na kahon na nakasulat na ilang bilang ng mga taon na ang nakakaraan na tila lamang alam kung paano upang i-print ang mga bagay sa screen. Kaya execute. Iyon ay hindi masama. Napakabuti. Kaya ngayon Ken ay tapos Isinasagawa. Ba siya kailangang ipasa sa akin ng anumang pabalik? Hindi na nasaksihan namin sa gayon ay malayo. Muli, printf ay aktwal na magbalik ng numero, ngunit kami ay pagpunta upang huwag pansinin na sa ngayon dahil hindi namin ito ginamit. Kaya na ito para sa Ken. At kaya ngayon pangunahing kinakailangan sa paglipas ng kontrol ng programa muli dahil na linya ng code, printf, tapos na e-execute. At pumunta kami tungkol sa aming mga paraan, execute anumang iba pang mga linya ay may. Kaya ngayon sabihin subukan ang isang bahagyang naiiba halimbawa. Oras na ito dito sabihin munang i-clear ang screen, at ang oras na ito kami na ang cubing function na, ngunit ang oras na ito, inaasahan ko ng output halaga. Kaya sabihin magpatuloy at gawin ito. Ngayon Mayroon akong isang linya ng code na nagsasabing x nakakakuha ng kubo ng x. Ang linya ng code, manariwa sa diwa, ganito ang hitsura: x = kubo (x); Kaya paano ito upang gumana? Natin sige at bigyan ka ng isang puting screen muli. Ako pagpunta sa isulat ngayon ang halaga ng x, na sa sandaling ito sa oras mangyayari na, sabihin nating, 2 upang panatilihin itong simple. Isinulat ko sa isang piraso ng papel ang halaga ng 2, kung saan ang aking halaga x. Kong ipasa ang mga ito sa Ken. >> At ko lang isulat ang sagot? >> Oo, sabihin isulat ang sagot. Okay. At ngayon siya ay bumalik sa akin ng isang bagay. Perpekto. Nice segue. Kaya ngayon siya kamay ako pabalik ang halaga ng 8 sa kasong ito, at ano ang gagawin ko dito? Aktwal - sabihin makita, makakuha ng karapatang ito. Ano ako pagpunta sa gawin dito? Ngayon ako ang halagang ito at aktwal na-imbak ang mga ito sa mga parehong piraso sa memorya. Ngunit mapansin ako uri ng struggling dito. Ako ng kaunti nalilito dahil kung saan ko aktwal na isulat ang halaga ng x, dahil kung ano lang nagawa ko ang pisikal kamay Ken ng isang piraso ng papel na ay ang halaga 2, na x, at sa katunayan, na tiyak kung ano ang nangyari. Kaya ito lumiliko out na kapag Tinatawag mo ang function at pumasa ka sa isang argument tulad kumusta, mundo o pumasa ka sa isang argumento tulad ng 2, pangkalahatan, ikaw ay pagpasa sa isang kopya ng na argumento. At iba pa tulad ng ko sinulat ni ang bilang 2 dito at ipinasa ito sa Ken, na dapat ibig sabihin na hindi ko pa rin magkaroon ng isang kopya ng ang halaga 2 sa isang lugar dahil sa katunayan, ngayon na nakuha ko na ang halaga 8, kailangan ko upang bumalik sa RAM at aktwal na isulat 8 kung saan sabay-sabay ko ay ang bilang 2. Kaya biswal, tandaan ito paniwala ng pagpasa sa, literal, isang kopya ng halaga. Ken ginagawa ang kanyang bagay, kamay ako pabalik ng isang bagay - sa kasong ito ng halaga tulad ng 8 - at pagkatapos Mayroon akong na gawin ang isang bagay na may halaga na kung gusto ko upang panatilihin ito sa paligid. Kaya lahat ng ito ay bumalik sa lahat ng masyadong pamilyar bago mahaba. Salamat sa iyo kaya magkano para sa demo dito, Ken. [Palakpakan] Mahusay na tapos na. Natin makita kung paano na ganap na nauugnay sa ilang ng function na pagtawag na namin ang paggawa dito. Hayaan akong magpatuloy at dalhin sa amin pabalik sa cubing halimbawa dito. Pansinin na kung gusto namin upang aktwal na simulan ang pagkuha ito karagdagang, kami ay pagpunta sa may upang maging maingat ng ang katunayan na ang bilang ng x na naipasa in dito ay naiiba mula sa kung ano ang aktwal na nakapasa sa sa pag-andar. Kaya muli, ito pass sa pamamagitan ng kopya upang maging lubos na dyermeyn sa sandali lamang. Natin ng isang pagtingin sa isang bagay na ay hindi pa gumagana kanan pa. Ako pagpunta sa sige at buksan ang isang third halimbawa ng maraming surot, na flawed ng kalikasan, at ito ay tinatawag na buggy3 at ito ipinapatupad ng pagpapalit function na. Narito kami ay may isang pangunahing function na na x at y mang nasimulan sa 1 at 2, ayon sa pagkakasunud-sunod. Maaari naming gamitin ang GetInt, ngunit kailangan lang namin ng isang simpleng ehersisyo, kaya hard-code bilang 1 at 2. Sa linya 21 at 22, tila namin i-print ang x at y, 1 sa bawat linya. Pagkatapos ay sa ika-23 linya, inaangkin ko na ako pagpapalit ng mga halagang ito, tuldok, tuldok, tuldok. Ko tila tumawag sa isang function sa linya 24 makipagpalitan ng tinatawag na tumatagal ng 2 argumento. Lubos Ito ay legit para sa mga function sa tumagal ng 2 argumento. Nakakita kami printf gawin ito. Kaya makipagpalitan tila tumatagal x at y, at bilang ang pangalan nito nagmumungkahi, Gusto ko umaasa na ito upang magpalitan ng mga 2 halaga. Kaya inaangkin ko sa linya 25 "Swapped!" at i-print muli ko x at y sa ilalim ng mga palagay na sa katunayan ito ay nai-swapped. Ngunit kung ako aktwal na patakbuhin ang program na ito - hayaan mo akong buksan ang isang terminal na window, hayaan mo akong gumawa buggy3 - bilang ang pangalan ay nagmumungkahi, ito ay hindi pagpunta sa magtapos na rin dahil kapag ako ay pindutin ang Enter, mapapansin na ang x ay 1, y ay 2, at pa sa dulo ng programa, ang mga ito ay pa rin, sa katunayan, ang parehong. Kaya batay sa pagpapakita lamang ngayon sa Ken, kung ano ang aktwal na pagpunta sa? Natin dive sa ito function na makipagpalitan. Sobrang maikling. Ito ay lamang ng ilang linya ng code katagal. Ngunit ano ang pangunahing problema batay sa simpleng kuwento sinabi dito na may Ken? Bakit makipagpalitan pinaghiwa? [Mag-aaral] ka sa pag-iimbak ng kopya, hindi variable. Eksakto. Namin ang pag-iimbak sa isang kopya, hindi variable mismo. Sa ibang salita, makipagpalitan ng tila tumatagal ng 2 argumento, isang int, at mang ito ay tinatawag na at b, at hanggang dito ko na naipasa sa x at y, na ayon sa pagkakasunud-sunod 1 at 2, ngunit hindi ako literal pagpasa sa x, hindi ako literal pagpasa sa y, Pagpasa ako ng isang kopya ng x at kopya ng y. Halos ito na parang kinopya mo at paste sa makipagpalitan ng ang mga halaga na gusto mong aktwal na ito upang manipulahin. Kaya kung iyon ang kaso, kapag ako sa programa ng pagsisimula execute linya 35 pagkatapos 36, kapag nakuha ko sa linya 37, sa puntong ito sa kuwento, kung ano ang halaga ng isang? Sa puntong ito sa kuwento, linya 37, kung ano ang halaga ng isang sa puntong ito? >> [Mag-aaral] 1. [Malan] Dapat itong 1, kanan, dahil x ay nakapasa sa bilang ang unang argumento, at ang function na ito lamang mang pagtawag nito unang argumento ng. Katulad nito y ang pangalawang argumento, at ito mang pagtawag sa pangalawang argumento b. Paghihiwalay sa dalawang bahagi na ito ay aktwal na medyo lamang ipinaliwanag. -Isip tungkol dito. Wala sa amin ay nakamit ang mga tao na sinulat ni printf, kaya tiyak, siya ay walang ideya kung ano ang aming mga variable 30 taon mamaya na tinatawag. Kaya sa isang pagkakaiba sa pagitan ng kung ano tawagan ka ng mga variable sa mga function sumusulat ka at kung ano ang tumawag sa iyo ng mga variable sa mga function ka pagtawag o gamit. Kaya sa ibang salita, ako nakasulat ang aking mga variable bilang ng x at y, ngunit kung ang ibang tao ay nakasulat makipagpalitan ng function na, siya tiyak ay hindi alam kung ano ang aking mga variable na tinatawag na, kaya nauunawaan natin na ito ay kung bakit mayroon kang ito duality ng mga pangalan. Technically, maaari kong gawin ito sa pamamagitan ng pagkakaisa, ngunit sila pa rin ang naipasa sa bilang kopya. Ay ito lamang isang purong pagkakataon aesthetically kung ang taong iyon na sinulat ni makipagpalitan ng gumamit ng parehong pangalan. Kaya sa puntong ito sa kuwento, linya 37, ay 1, b ay 2, at ngayon ko magpatuloy sa swap sa kanila. Una sa lahat, ipaalam sa akin aktwal na gawin ito mas lamang. Hindi ko alam kung ano ang ginagawa ang mga 3 linya ng code. Hayaan akong lamang gawin ito: b = a; a = b; tapos na. Bakit ito sirang, lohikal? Uri ng intuitive bagay, i-right? Kaya isang nagiging b at b nagiging isang, ngunit ang problema ay na sa lalong madaling linya 37 executes, ano ang halaga ng isang at b? Ang parehong, 1, dahil ikaw clobbered, kaya magsalita, ka na nabago b sa katumbas ng. Kaya sabay-sabay line 37 ay pinaandar, na mahusay na, mayroon ka na ngayong 2 kopya ng numero 1 sa loob ng function na ito, kaya pagkatapos kapag sinabi mong sa linya 38 a = b, ka uri ng screwed dahil ka magtatalaga ng 1 sa 1. Mo na ang uri ng nawala ang halaga na iyong cared tungkol sa. Kaya sa orihinal na bersyon ng mga ito, mapansin ang aking ginawa. Ko sa halip ay may isang ikatlong linya ng code na mukhang ganito ang. Dinedeklara ko ng pansamantalang variable. Tmp ay karaniwang pangalan para sa isang pansamantalang variable, at ito ay isang int dahil ito ay may upang tumugma sa kung ano ang gusto kong gumawa ng isang kopya ng. Imbak ng ako ng kopya ng isang loob ng tmp, kaya sa sandaling line 37 ay pinaandar, ang halaga ng isang ay - mabilis katinuan check - 1, ang halaga ng b 2, at ang halaga ng tmp din 1. Kaya ngayon execute ko linya 38. Kapag ang linya 38 executes, tumatagal sa halaga ng b. At b ay 2, kaya ngayon ang 2. Kaya sa puntong ito sa kuwento, 2, b ay 2, at tmp ay 1, na ito ngayon sa lohikal na, maaari naming halaga lamang magsabuwatan tmp sa b at tapos na kami. Kaya namin na malutas ang problema na. Sa kasamaang palad, kapag nagpatakbo ako ng programang ito sa form na ito, hindi ito aktwal na magpalitan ng anumang mga halaga. Ngunit upang maging malinaw, bakit? Naayos ko ang lohikal na problema mula sa sandali lamang ang nakalipas, ngunit muli, kung nagpatakbo ako ng programang ito, x at y hindi magbabago sa pagtatapos ng pagpapatupad ng programa. [Hindi marinig na mag-aaral ng komento] >> Hindi namin ibinalik anumang bagay, kaya na totoo. Ngunit ito ay lumiliko out ang isang bit ng isang problema dito dahil sa gayon malayo, ang tanging bagay na namin upang bumalik ay isang bagay, at ito ay isang paghihigpit ng C. Maaari ka lamang bumalik talaga isang halaga, kung saan ako uri ng natigil dito dahil maaari kong ibalik ang bagong mga halaga ng x o maaari kong ibalik ang bagong mga halaga ng y, ngunit nais ko parehong likod. Kaya bumabalik ay hindi ang simpleng solusyon dito. Ngunit ang problema sa panimula ay kung bakit? Ano ang aktwal na namin swapped? [Mag-aaral] a at b. >> Isang at b. Ngunit isang at b kopya ng x at y, na nangangahulugan lang namin ginawa ang lahat ng ito gumagana, lamang namin na ginugol 3 minuto pakikipag-usap tungkol makipagpalitan ng function na at ang lahat ng 3 ng mga variable na ito, at na mahusay, perpektong tama sa paghihiwalay, ngunit isang at b ang saklaw lamang sa mga linya sa dito. Kaya tulad ng isang loop, kung ikaw idedeklara isang integer i sa loob ng loop, katulad, kung ikaw ay deklarasyon at b sa loob ng isang function na iyong nakasulat, sila bisa lamang sa loob ng na function na, na nangangahulugan na sa lalong madaling makipagpalitan ay tapos execute at pumunta kami mula sa linya 24 sa linya 25, x at y hindi nabago sa lahat. Mo lang nasayang ang isang buong maraming oras sa pagpapalit ng mga kopya ng mga variable. Kaya ito lumiliko out na ang mga solusyon na ito ay aktwal na di-halata. Ito ay hindi pa sapat upang bumalik halaga dahil maaari lamang naming ibalik 1 halaga, at ko talagang gusto upang magpalitan parehong x at y sa parehong oras, kaya kami ay upang bumalik sa. Ngunit sa ngayon, mapagtanto na ang isyu sa panimula nagmula mula sa ang katunayan na ang isang at b kopya at ang mga ito sa kanilang sariling saklaw. Natin subukan upang malutas ito sa ilang mga paraan. Hayaan akong aktwal na mag-scroll pabalik dito at magbukas ng, sabihin nating, ang isang ika-apat na variant ng ito, buggy4. Paano ang tungkol dito? Ito ay isang katulad ngunit simple problema upang tumingin sa bago namin tumagal ng isang ulos sa paglutas nito. Ang program na ito ay tinatawag na pagdagdag, at ito tila initializes x integer sa 1 sa linya 18. Pagkatapos ko i-claim x ay 1, pagkatapos ko i-claim ang "Incrementing ..." Pagkatapos kong tumawag pagdagdag, ngunit sa linya 22 at 23, inaangkin ko ito incremented, Inaangkin ko ang x na ngayon ang anumang ito ay - 2, baka - ngunit programa na ito ay maraming surot. Ano ang problema? Oo. >> [Hindi marinig na mag-aaral tugon] >> Mismong. Kaya x ay ipinahayag, malinaw naman, sa linya 18. Ito ay sa loob ng pangunahing kulot tirante. Kaya ang simpleng sagot dito ay na habang ang x umiiral dito, ito ay hindi umiiral sa linya 32, upang ang programang ito na aktwal na ay hindi kahit makatipon. Ang tagatala kapag ko subukang kino-compile ang code na ito upang sumigaw sa akin tungkol sa ilang hindi nagbigay-alam identifier o isang bagay na epekto. Sa katunayan, sabihin subukan. Ito ay gumawa buggy4. May ito ay. Gamitin ng hindi nagbigay-alam identifier 'x' sa linya 32. At aktwal na, sabihin maging mas tahasang dito ngayon kaya na ito ay kapaki-pakinabang sa opisina oras at sa bahay. Pansinin na ito ay isang maliit na cryptically nakasulat. Ngunit ang katotohanan na kumalatong may yelled sa amin, sinasabi buggy4.c: 32:5, ay talagang kapaki-pakinabang. Nangangahulugan ito na ang error sa linya 32 sa character na posisyon 5. Kaya 1, 2, 3, 4, 5. Iyon ay, sa katunayan, kung saan ang problema ay. At din, masyadong, panatilihin sa isip sa mga oras ng opisina at sa bahay, ako masuwerteng dito. Mayroon akong isang pagkakamali. Ito ay relatibong madaling upang ayusin. Ngunit kung ikaw ay makakuha ng isang buong screen na puno ng napakaraming mga mensahe ng error, muli Napagtanto na ang pinakamababa isa ay maaaring lamang ay nagpapakilala ng ang pinakamataas na isa. Kaya palagi Chase ang iyong mga bug mula sa itaas pababa dahil maaaring may lamang isang uri ng bulaklak chain epekto na nagmumungkahi mayroon kang paraan higit pang mga problema kaysa sa aktwal mong gawin. Kaya kung paano namin maaaring ayusin ito kung ang aking mga layunin ay upang dagdagan ang x? >> [Mag-aaral] Gawing x global. Okay, sa gayon maaari kaming magsagawa ng x global. Natin ang shortcut na ko nagbabala tungkol sa mas maaga, ngunit ano ba, kailangan lang namin ng isang mabilis na-aayos, kaya ay sabihin lamang sabihin int x up dito. Na ginagawang x global. Kaya ngayon pangunahing may access dito at pagdagdag na access dito, at kaya ipaalam sa akin sige at makatipon ito ngayon. Gawing buggy4, ang Enter. Tila upang makatipon ngayon. Natin patakbuhin buggy4. At tila upang aktwal na gumana. Ito ay isa sa mga bagay na ito na bilang sinasabi ko, hindi tulad ng ginagawa ko, bilang ko na gawin dito, dahil sa pangkalahatan, ang aming mga programa ay pagpunta upang makakuha ng mas kawili-wili at mas matagal kaysa sa, at kung ang iyong solusyon sa mga problema sa buhay ay lamang na ilagay ang lahat ng mga variable sa tuktok ng iyong mga file, masyadong mabilis ang programa makakuha ng horrifically mahirap upang pamahalaan. Ito ay nakakakuha ng mas mahirap sa tingin up ng mga bagong variable pangalan, ito ay nakakakuha ng mas mahirap upang maunawaan kung anong variable ay ginagawa kung ano ang, at ito sa pangkalahatan, ito ay hindi isang magandang solusyon. Kaya sabihin gawin ito mas mahusay na. Hindi namin nais na gumamit ng global variable dito. Ko nais upang dagdagan ang mga x, kaya maaari ko malinaw naman - sa pagtatapos ng araw, ito ay uri ng ulok kuwento dahil lang namin gawin ito - ngunit kung hindi ako malaman tungkol na operator o hindi ako ay pinapayagan upang baguhin ito sa pangunahing mismo, kung paano tao ko maaaring ipatupad Ken sa paglipas dito sa oras na ito hindi kubo ngunit dagdagan? Paano ko babaguhin dito ang bagay na ito? Oo. [Mag-aaral] Pass sa x at pagkatapos ay bumalik [hindi marinig] >> Okay, mabuti. Kaya bakit hindi ko pumasa sa x at pagkatapos ay sa halip na ibalik ito, bakit hindi ko lamang ay bumalik x + 1. Isang ilang higit pang mga bagay upang baguhin dito. Ako sa kanan track. Ano pa ang kailangan ko upang i-tweak? Ibang tao. Oo. [Hindi marinig na mag-aaral ng tugon] Kailangan kong baguhin ang return uri ng pagdagdag dahil hindi ito ay walang bisa. Walang bisa ay nangangahulugan na walang ay ibinalik, ngunit malinaw na ito ay ngayon, kaya ito pangangailangan upang baguhin - >> [mag-aaral] int. int upang maging pare-pareho sa anumang aktwal ako bumabalik. Ngayon pa rin ang iba pa ay maraming surot dito. Oo. [Hindi marinig na mag-aaral tugon] >> [Malan] Kaya kailangan kong dagdagan x? [Hindi marinig na mag-aaral tugon] >> [Malan] Ah, kaya kailangan kong ipasa x. Kaya kailangan kong gawin ito dito. >> [Hindi marinig na mag-aaral komento] [Malan] Kaya prototype, mayroon akong upang baguhin ito dito. Kaya ito ay may upang maging isang int, ito ay may upang maging - Hmm, aktwal na ako ay isang bug down na dito. Natin ayusin ang isang unang. Ano ang dapat ito aktwal na? Ito ay nakuha sa isang int isang bagay. Ito ay maaaring maging x, ngunit lantaran, kung sinimulan mo ang pagtawag ng lahat ng iyong mga variable x, ito upang makakuha ng mas at mas malinaw na kung saan. Kaya sabihin lang mang pumili ng ibang pagpapangalan convention para sa aking mga function ng lingkod, ang mga function Sumulat ako. Susubukan naming tumawag ito, o kami maaaring tumawag ito - Sabihin tumawag ito bilang mas tahasang. Kaya pagkatapos kong bumalik anumang bilang plus 1, at ngayon ko bang baguhin ang 1 iba pang mga bagay dito at ng isa pang bagay dito. Ano ang mayroon ako upang baguhin sa linya 21 sa unang? >> [Hindi marinig na mag-aaral tugon] [Malan] Mayroon akong upang italaga ang mga ito sa x. Hindi lamang ko matawagan ang pagdagdag (x). Kailangan ko maalala ang sagot sa pamamagitan ng pagbabago ng halaga ng x sa kaliwang bahagi. At kahit x ngayon ang kaliwa at kanang, na lubos pinong dahil sa kanang bahagi ay makakakuha ng unang pinaandar pagkatapos ay makakakuha plopped sa kaliwang bagay - x sa kasong ito. At pagkatapos ay sa wakas, ito ay isang madaling-aayos ngayon. Ito ay dapat lamang na tumutugma sa kung ano ang pababa sa ibaba, int numero. Kaya isang buong grupo ng mga pagbabago para sa isang talagang bobo function na ngunit kinatawan ng mga bagay na gusto namin nagiging gawin. Kaya't buggy4. Ko na screwed up sa isang lugar. Oh, aking Diyos. Limang mga pagkakamali sa 6-line programa. Kaya kung ano ang mali sa linya 18, karakter 5? Kaya Mayroon akong upang idedeklara ito, int. Natin makita. May isang buong grupo ng mga iba pang mga error. Oh, ang aking Diyos - 19, 18, 21 - ngunit muli, sabihin lang i-clear ang screen, Control L dito, at muling patakbuhin kumalatong. Kaya 5 problema ay talagang lamang na 1. Kaya ngayon sabihin patakbuhin buggy4, ang Enter. Whew, x ay incremented tama. Ayos lang. Anumang mga katanungan sa kung paano dagdagan ang numero? Oo. [Hindi marinig na mag-aaral tanong] >> Magandang katanungan. Paano ay ito na maaari ko lamang baguhin x sa numero at ang programa ay alam kaagad? Muli, sa tingin ng mga ito bilang ito abstraction. Kaya kung ako pangunahing at Ken ay pagdagdag, lantaran, hindi ko pakialam kung ano ang tawag ng Ken ang kanyang iPad. Wala akong pakialam kung ano siya tawag sa anumang bagay na may sa gawin sa kanyang pagpapatupad ng ang pag-andar na ito. Ito ay isang detalye ng pagpapatupad na ako, pangunahing, hindi pakialam tungkol. At kaya lamang pagbabago nito tuloy-tuloy sa loob ng pag-andar - bilang dito at bilang dito - ang lahat ng ito ay tumatagal ng hangga't ako mag-recompile. Ito ay uri ng bang kung sa tingin mo tungkol sa marami sa atin, mga mo na may lisensya sa pagmamaneho na nahimok o kahit na iyong nahimok sa isang kotse, karamihan sa atin ay walang ideya kung paano gumagana ang kotse ng sa ilalim ng hood. At literal, kapag binuksan mo ng hood, karamihan sa atin - kasama ang aking sarili - ay hindi pagpunta sa talagang malaman kung ano ang iyong hinahanap namin sa, uri ng tulad ng maaari mong pakiramdam na may mga bagay-bagay tulad ng sa karapatang ito ngayon. Ngunit hindi namin talagang pakialam kung paano gumagana ang kotse, hindi namin upang pakialam kung ano ang lahat ng rods at pistons at cable sa loob ng kotse ay aktwal na paggawa. Kaya ang isang bagay tulad ng kung ano ang tawagan ka piston ay hindi mahalaga dito sa kasong ito. Parehong ideya. Oo. >> [Hindi marinig na mag-aaral tanong] Kung may higit pang mga paggamit ng variable xa sandali ang nakalipas, , programmer, ay upang baguhin ang mga ito sa lahat ng dako. O maaari kang literal gawin ng File, Menu, at pagkatapos Maghanap, Palitan - isang bagay tulad na - ngunit ikaw ay pagpunta sa may upang gumawa ng mga pagbabagong iyon sa iyong sarili. Mayroon kang upang maging pare-pareho. >> [Mag-aaral] Kung may mga maraming mga variable [hindi marinig] Isang partikular na pagkakasunud-sunod tulad dito, kung ito ay int ibang numero? >> [Mag-aaral] Tama. [Malan] Oo. Order ay mahalaga kapag ikaw ay pagtawag sa function na. Kaya kung ako ay pagtawag pagdagdag dito na may isang bagay na pinaghihiwalay ng isang bagay, may isang direktang sa pagmamapa. Ang unang variable, anumang ang tawag dito, ay ginawa ng isang kopya ng unang argumento sa paglipas dito. Sorry. Na ito ay hindi dapat maging isang panaklong. Ang pangalawang linya ng argumento na ang pangalawang. Kaya order, oo, bagay. Ayos lang. Sorry. Kinuha ko ang mahabang paraan upang makakuha ng doon. Iba pang mga tanong? Ayos lang. Kaya sabihin makita kung hindi namin maaaring pintahan ng isang larawan ng kung ano ang aktwal na pagpunta sa dito sa ilalim ng hood, kaya na magsalita. Ito ay isang parihaba na maaaring kumatawan sa memory ng iyong computer. Kahit na mayroon kang mga ideya kung paano gumagana ang memory o kung paano RAM gawa, hindi bababa sa ipinapalagay na mayroon kang mga bunches nito mga araw na ito. Mayroon kang mga megabytes nito, mayroon kang gigabytes nito, at alam namin mula sa linggo 0 na ang byte ng kung ano? >> [Mag-aaral] 8 bit. 8 bits, i-right? Kaya 8 zeroes at 1. Kaya kung ang iyong computer ay may isang karetela ng RAM, 2 gig ng RAM mga araw na ito, mayroon kang isang bilyong o 2 bilyong bytes ng memory o halos 8 bilyong o 16 bilyong bit sa loob ng iyong computer. Hindi tulad ng ilang mabalahibo Willy Halimbawa, hindi magnetic particle karaniwang ito. Nagiging - sa laptop hindi bababa sa - ito ay solid drive ng estado, SSDs, na lang ay walang paglipat ng bahagi. Lahat ng electronic. Ang lahat ng ito koryente-based. Kaya sa tingin ng parihaba ito bilang lamang kumakatawan sa 1 o 2 gigabytes ng memorya na mayroon kang. Kaya ito ay isang tipak ng memorya. Ang mundo ng computer science uri ng partitioned off chunks ng memory gawin ang iba't-ibang mga bagay. Halimbawa, kung ito ay RAM ng iyong computer, tulad ng iminungkahi ng parihaba doon, ito lumiliko out na sa pamamagitan ng convention, sa tuktok ng iyong RAM, kaya na magsalita, ay kung ano ang tinatawag na teksto segment. Iyon ang mga 0s at 1s na iyong inipon. Kaya kapag kami ay tumingin sa ilalim ng hood sa kung ano ang a.out ay, lahat ng mga 0s at 1s, kapag nagpatakbo ka ng isang programa, mga 0s at 1s load mula sa iyong hard drive sa isang bagay na tinatawag RAM, at sa RAM sila ay inilagay sa itaas. Samantala, mayroon kang iba pang mga bagay: initialize data, uninitialize ng mga data. Yaong 2 swaths ng memory ay tumutukoy sa pangkalahatang variable, na hindi mo madalas gamitin pero minsan kung gagawin mo, sila magtapos hanggang doon pati na rin. Pagkatapos ang ilang iba pang mga bagay-bagay: kapaligiran variable, na hindi namin gastusin sa karaming oras sa, ngunit ang 2 mahalagang mga bagay na bumalik sa buong semestre, stack at magbunton. Kaya ang karamihan ng memory ng iyong computer ay nakareserba kapag tumatakbo ang isang programa para sa isang bagay na tinatawag na stack at isang bagay na tinatawag ang magbunton. Hindi namin makipag-usap tungkol sa magbunton ngayon, ngunit kami ay makipag-usap tungkol sa stack. Stack ay sinadya upang manawagan up ang visual ng dining hall pagkain trays sa Mather House o kung saan man ang mangyari mo kung saan ang kawani ng dining hall linisin ang mga ito araw-araw, sila stack up ang mga ito mula sa sahig sa up, at katulad, sa memory, may ito ideya ng paglalagay ng isang bagay sa isang stack, paglalagay ng isang bagay sa isang stack, paglalagay ng isang bagay sa isang stack. At kung ano ang namin ibig sabihin sa pamamagitan ng ito? Natin mag-zoom in sa lang sa ibabang kalahati ng ang larawang ito, ang RAM ng iyong computer, upang ipanukala ang mga sumusunod. Ito lumiliko out na kapag nagpatakbo ka ng isang programa tulad ng a.out o kumusta - anumang programa na iyong nakasulat - muli, mga 0s at 1s load mula sa iyong hard drive, na kung saan ay pang-matagalang imbakan, mananatili doon kahit na hilahin ang plug, na-load sa RAM. RAM ay mas mabilis kaysa sa mga na hard drive - ito ay mas maliit kaysa sa mga na hard drive - ngunit kung saan nakatira ang mga programa habang nagpapatakbo ka sa kanila. Kaya mong i-double click ang isang programa sa Mac o PC, ito ay load mula sa hard drive sa RAM. Sa lalong madaling ito load sa RAM, ang 0s at 1s go sa tuktok ng paraan, ang tinatawag na segment ng teksto, ngunit pagkatapos ay sa lalong madaling panahon ang iyong programa sa aktwal na nagsisimula sa pagtakbo, ang pangunahing function ay tinatawag na, at pangunahing namin ang iyong nakita, madalas ay may lokal na mga variable, at ito ay may ints at string at char at katulad. Kaya kung ang iyong programa na nakasulat o ang programa na double-click gumamit ng ilang mga variable sa loob ng pangunahing, magtapos ang mga ito sa ibaba ng iyong stack ng memory, kaya na magsalita. Mas concretely, ano ang aktwal ibig sabihin? Ito ay nangangahulugan lamang na kung tayo ay pagpunta sa numero ang mga bytes ng RAM sa iyong computer, mapansin na ito ay maaaring byte bilang 0, maaaring ito ay byte numero 1, 2, 3, 4, 5, 6, ang lahat ng paraan hanggang sa 2 bilyong ay ang lahat ng mga paraan up doon sa itaas. Kaya sa ibang salita, kapag makipag-usap namin tungkol sa RAM o memory sa mga tuntunin ng mga byte ito ay nangangahulugan na ang isang tao ay nagpasya kung ano ang numero ng bawat isa ng mga chunks ng memory. Kaya kapag kailangan mo ng 32 bit para sa isang int o kailangan mong 8 bit para sa isang pansamantalang trabaho, kung saan sila magtapos sa memory? Conceptually, sila lamang magtapos sa ilalim ng bagay na ito tinatawag ng stack. Ngunit kung ano ang kawili-wili ngayon kapag pangunahing tawag ng isang function - ipagpalagay ng isang function na tinatawag na foo, isang arbitrary na pangalan - kung ano ang mangyayari ay pangunahing ay sa ilalim ng ito stack ng memorya; foo ngayon ay ilagay sa tuktok ng pangunahing memorya. Kaya anumang lokal na mga variable na ang foo ay magtapos uri ng conceptually sa itaas sa mga pangunahing. Kung foo tawag ng isa pang function na tinatawag na bar, mga variable magtapos dito. Kung ang bar tawag ibang bagay, dito, dito, dito. Kaya kung ano ang kawili-wiling tungkol sa pagpapatakbo ng isang programa na tawagan ka ng mga function at ng mga function ay tumawag ng mga function at ng mga function ay tumawag ng mga function, bumuo ka ng stack na ito ng mga function sa memory. At lamang nang isang beses sa isang return function na simulan ang pagkuha ng bumalik na memory. Kaya isa sa mga pinakamadaling paraan ng pagka-ubos ng memorya sa isang computer program ay sumulat ng mga function na ay hindi kailanman bumalik. Kaya halimbawa, sabihin ipakita ng mas maraming may isang sinasadya maraming surot programa. Hayaan akong sige at # include , int pangunahing (walang bisa), at ako pagpunta sa gawin habang (2> 1), na marahil ay hindi kailanman babaguhin sa amin, at ipaalam sa akin magpatuloy ngayon at gawin printf. Aktwal na mas mababa ang biswal na kawili-wili. Natin gawin ito. Para int i = 0; i> 0 - sabihin ang pagkakamaling ito - i + +. At sabihin hindi printf dito. Natin magsanay kung ano ang ako ay pangangaral. Natin ay isang paraan ng dito, walang bisa koro, at kami na sabihin int i, at pagkatapos ay ako pagpunta sa sabihin printf - walang, sabihin gawin itong mas kawili-wiling. Natin ang aktwal na hindi i-print ang anumang bagay sa lahat. Sabihin lang gawin ito: koro (i). Ayos lang. Kaya ito ay maraming surot dahil bakit? Nagsasagawa ako ng ito bilang pumunta ko dahil ang programa ay hindi aktwal na gawin ng interes. Ngunit hindi ang layunin. Ang layunin ay upang magsulat ng isang programa na ang pangunahing function na gumagana ang ano, tila? Tawagan mismo. At aktwal na, hindi namin kailangang loop. Natin kahit pasimplehin ito lamang upang hindi mawala sa paningin ng talaga ang pangunahing bug. Pangunahing tawag koro sa kumanta ilang koro, pagkatapos ko ginawang isang bagay bobo at nagkaroon ako ng koro tawag koro dahil ipinapalagay ko ang ibang tao ay pagpunta upang ipatupad ito siguro, at ngayon ito ay hindi pagpunta upang makatipon pa. Kailangan kong gawin kung ano? Kailangan ko ang prototype, tandaan. Kaya kailangan kong magkaroon ng hanggang dito koro ng void (int i); Kaya ngayon kung pumunta ako pababa dito - aktwal na, sabihin gamitin ang mas malaking window. Natin sige at gumawa ng koro. Natin sige at gumawa ng koro. Gamitin ng hindi nagbigay-alam identifier i. Oh, na bobo. Hindi namin kailangan ang argumento. Sabihin lang gawin ito. Nais ko namin ay nagsimula sa ganitong paraan. Na makakakuha ito ng mas madali programa upang magsulat. Doon. Ngayon ipaalam ng pumunta sa aking terminal na window, muling patakbuhin ang kumalatong, at dito namin pumunta. Na talagang mabilis. Ano ang aktwal na lamang ang nangyari, bagaman? Well, ngayon kukunin ko na idagdag ang mga naka-print na linya upang maaari naming makita. Hayaan sabihin sa akin printf ("ako in dito") - walang mga variable. Namin na nakalabas ang mga ito tulad na. Hayaan akong muling palabas ng pelikula gumawa. Hayaan akong muling palabas ng pelikula koro. At ... darating. Panatilihin ang pagpunta. Bilang isang bukod, bakit hindi nag-crash? Ang segmentation fault nangyari napakabilis na bago. [Hindi marinig na mag-aaral tugon] >> Mismong. Kaya ito ay tumatagal ng oras upang i-print, i-right? Mayroon lamang tumatagal ng higit pang trabaho sa bahagi ng computer. At doon ito ay: Segmentation fault. Kaya mapansin lamang kung paano mabilis programa ay tatakbo. Kung hindi ka naka pag-print ng anumang bagay, napakabilis na. Ngunit pa rin namin nakuha ang segmentation fault dahil kung ano ang nangyayari? Kung sa tingin mo tungkol sa kung paano ang memorya ng iyong computer ay inilatag nang, nangyari ito sa pangunahing, ngunit dito sabihin tumawag ito nang sabay-sabay, at sabihin itawag sa koro. At ngayon kung gagawin ko ang aking mga aesthetics karapatan, ito ay lamang pagpunta sa sabihin ng koro, koro, koro, koro, koro, koro, koro, ad nauseum, at kalaunan, kung ano ang mangyari? Kung ang malaking larawan, literal, ito, kung ano ang mangyayari lamang conceptually? Ang stack overruns ang magbunton. O, mas masahol pa, mo lamang malatagan lahat, kabilang ang segment ng teksto, na ang 0s at 1s na kumakatawan sa iyong programa. Sa maikli, ito ay sobrang, sobrang masamang. Ang iyong programa spiraled ng kontrol. Gumagamit ka ng paraan higit pang memory kaysa sa nilayon mo lahat ng dahil sa isang bobo pagkakamali sa kasong ito, o sa kasong ito napaka sadyang gawin ang function sa pagtawag mismo. Ngayon, ito ay hindi lahat ng masama. Pag-andar pagtawag sa kanilang sarili ay aktwal na may dakilang kapangyarihan kapag ginamit mo ito nang tama. Hindi ko ginagamit ito nang tama dito. Kaya ito ay hindi lahat ng masama, ngunit ang katotohanan na ako hindi aktwal na itigil pagtawag aking sarili ay isang pangunahing kahinaan dito ng programang ito. Kaya kung saan ay namin pagpunta sa lahat ng ito? Kung ano talaga ang nangyayari? Kapag Tinatawag ko ang pagdagdag function na tulad namin ay ginagawa sa mga halimbawa, Mayroon akong isang halaga tulad ng 1 na pumasa ako. Pumasa ko sa isang kopya ng numero 1, kaya sumusunod ang mangyayari. Natin pumunta sa halimbawa ng pagdagdag, ang tao na ito karapatan sa paglipas dito. Narito ang kung ano ang aktwal na nangyayari. Kapag tumawag ako ng pagdagdag at pumasa ako sa x, pictorially, kung anong nangyayari sa dito ay ito. Kung mayroon ko ang halaga ng 1 na naka-imbak sa dito at tumawag ako aktwal pagdagdag, na kung saan ay tinatawag na ngayong nang sabay-sabay - iPad ang ibinabato ninyo nga ako dito. Natin tawagan ang pagdagdag na ito, at hindi namin malaman kung ano ang susunod na function ay magiging. Kaya kung ano ang aktwal na nangyayari dito sa isang lugar sa pangunahing Mayroon akong isang tipak ng memory na pag-iimbak ng numero 1. Kapag tumawag ako pagdagdag, gumagamit ako ng isa pang tipak ng memory, ngunit ngayon ay mayroon akong kopya ng 1. Kapag dagdagan ko na halaga, ito ay magiging 2, ngunit pagkatapos ay kung ano ang mangyayari sa lalong madaling babalik pagdagdag? Memory ito ay makakakuha lamang ipinasa pabalik sa operating system, na nangangahulugan na lahat nagawa mo na ay walang kapaki-pakinabang. Ang 1 na orihinal na nilalaman sa pangunahing pa rin ang aktwal na doon. Kaya kung saan ay namin pagpunta na ito? Ito lumiliko out na sa memory mayroon kang ang back-to-likod na pagkakasunud-sunod ng mga byte na maaari mong ilagay ang mga bagay-bagay sa, at ito ay lumiliko out na nakakita kami ng isang bagay na nagsasangkot ng paglalagay ng mga bagay pabalik upang i-back i-back upang i-back. Ano ang isang string na batay sa linggo 1 at ngayon linggo 2? Ito ay isang koleksyon ng mga character. Kaya ito lumiliko tulad ng maaari mong ilagay ang mga numero sa memorya, katulad maaari kang maglagay ng mga character sa memory. At sa sandaling sinimulan namin ang paglalagay ng character sa memory pabalik upang i-back i-back sa likod, ito lumiliko na gamit ang pinakasimpleng ng mga bagay tulad ng isang para sa loop o habang loop, umulit namin mula kaliwa sa kanan sa ang mga character sa isang string at simulan ang masahe mga ito sa ibang mga character sa kabuuan - maaaring maging isang b, b maaaring maging c - kaya na ganap na, maaari naming tumagal ng Ingles na pangungusap na aktwal saysay at i-convert ang bawat isa ng mga titik isa sa isang pagkakataon sa pamamagitan ng paglalakad sa pamamagitan ng memorya ng aming computer kaliwa hanggang kanang upang aktwal na-encrypt. Kaya sabihin ang aming limang minutong pahinga dito, at kapag dumating namin pabalik, sisimulan namin ang prosesong ito ng scrambling ng impormasyon. Ayos lang. Bago namin sumisid sa ilang crypto at mga bagay na ito na tinatawag na array, hayaan mo akong i-pause para sa anumang mga tanong dahil pakiramdam ko tulad ko talagang uri ng muddled ang ilan sa mga paksang iyon. Kaya natin ayusin ngayon kung kaya namin. Uusapang lang namin tungkol sa mga halaga return, usapan natin ang tungkol sa mga argumento, at usapan natin ang tungkol sa paniwala na ito, na magpapadala kami bumalik sa linggo darating, ng pagtingin ng memorya bilang isang buong bungkos ng mga nakasalansan trays, kaya na magsalita, mula sa ibaba sa up, tulad na ang bawat tray na maipo ilagay sa stack ay kumakatawan sa isang function na kasalukuyang tinatawag na. Anumang mga katanungan? Hayaan akong magtanong dito. Ipaalam sa akin pasimplehin ito pabalik sa kung ano ito ay bago ang ilan sa aming mga mas maaga na Q & A. Ang katotohanan na ang pagdagdag may bukas panaklong, int numero, sarado panaklong - kung ano ang int numero kumatawan? [Mag-aaral] isang argument. >> Isang argumento. Okay. Ngunit ano ang isang argument? [Hindi marinig na mag-aaral ng tugon] >> Ano iyon? >> [Mag-aaral] May na pumasa ka. Okay, kaya ang isang bagay na pumasa ka. At mas pangkalahatan, ang input. Kung ikaw ay pagsusulat ng isang function at layunin na function na sa buhay ay upang gawin ang isang bagay ng isang maliit na iba't ibang sa bawat oras na gamitin mo ito, pagkatapos ay ang tanging paraan para sa na mangyari talagang mukhang upang magbigay ng may input gayon ay maaari itong gawin ng isang bagay ibang may na input sa bawat oras. Kaya kailangan mong tukuyin ang dalawang bagay kapag ang isang function na tumatagal ng input. Kailangan mong tukuyin ang pangalan na gusto mong ibigay sa input na pulos para sa iyong sariling kaginhawahan sa gayon ay maaari kang sumangguni dito sa katangian mo ang iyong sarili ay pagsusulat, tulad ng ginawa ko dito sa linya 32. Ngunit kailangan mo ring upang tukuyin ang uri dahil ang C ay isang programming language na nangangailangan lamang na kung nais mo ang isang variable, mayroon kang upang sabihin ang computer kung ano ang uri ng data na ito ay, sa malaking bahagi upang ito alam kung gaano karaming mga bits upang maglaan para sa variable na dahil maaaring ito ay 6 - Paumanhin, hindi ito ay 6. Maaari itong 16, maaari itong maging 8, maaari itong maging 32 kahit 64, ngunit ang computer ay kailangang malaman. Ngayon, ang int sa kaliwang bahagi ay kumakatawan sa kung ano ang, sa pamamagitan ng kaibahan? [Hindi marinig na mag-aaral ng tugon] >> Ano iyon? >> [Mag-aaral] Uri ng function na. Ang uri ng isang function at, higit na partikular, ang uri ng mga output. Kanan. Kaya habang ang mga bagay sa mga panaklong ay kumakatawan sa input nito, kung mayroon man, ang bagay sa kaliwa ay kumakatawan ang output nito. At sa kasong ito, pagdagdag tila nagbabalik ng isang int, at kaya int ang return uri ng function na ito. Ano ang ibig sabihin bumalik? Literal, gamitin mo ang balik sa keyword at pagkatapos ay kung ano ang iyong mga bumabalik sa kanan ng keyword ay isang integer, pagkatapos na talaga ang pare-pareho sa kung ano ang namin ang ipinangako. Hindi mo maaaring gawin ang isang bagay tulad nito - kumusta, mundo - dahil na isang string. Malinaw naman, ito ay hindi isang integer. Kaya sa maikling, pahirapan talaga sa amin, programmer, na ang partikular na kung ano ang kami ay bumabalik at pagkatapos ay tunay na tungkol sa bumabalik ito. Sa konteksto dito ngayon ay na ang memory ng iyong computer ay isang gigabyte, 2 gigabytes - anumang - marahil ito ay higit pa, marahil ito ay mas kaunti, mas ngunit ang computer tumingin ito bilang pagkakaroon ng iba't ibang mga seksyon. Isang bagay na napupunta doon, iba pa napupunta up doon, ibang bagay napupunta sa gitna, at ngayon lang namin simulan na nagsasabi sa kuwento, ngunit gagamitin namin bumalik na ito sa paglipas ng panahon. Sa ngayon, ang tanging piraso ng memorya namin talagang pakialam tungkol sa ang teksto segment dahil na kumakatawan lamang ang 0s at 1s na kumalatong outputted. Kaya kapag nagpatakbo ka ng isang command sa keyboard tulad a.out o i-double click ang isang icon sa Mac OS o Windows, ang iyong programa ay load mula sa iyong hard drive sa RAM at ito plopped sa tuktok ng RAM ng iyong computer, kaya na magsalita. Samantala, bilang tumatakbo ang iyong programa ay nagsisimula at pangunahing ay makakakuha ng tinatawag na sa programa sinulat ni o sa programa ng Microsoft o Apple sinulat ni, ng mga lokal na variable magtapos hanggang pababa doon sa ilalim ng memory ng iyong computer. Ngunit kung ang pangunahing tawag isa pang function na mismo ay variable o mga argument, sila magtapos ang nasa itaas nito. At kung ang function na tawag ng isang bagay, sila magtapos itaas nito, nasa itaas nito, nasa itaas nito. At nang isang beses lamang function na tapos na e-execute ay ang stack ng mga trays, upang magsalita, simulan upang makakuha ng mas mababa at mas mababa. At ito ay kung ano pagkatapos, sa maikling sabi, ay nagpapaliwanag kung bakit kapag tumawag ka kubo o tumawag ka pagdagdag, ka ng pagpasa sa isang kopya ng ang halaga. At kung ano ang nangangahulugan iyon pictorially na literal sumusulat ka ng numero 1 sa ibang bahagi ng memorya, pagbabago na 1 hanggang 2 sa kaso ng pagdagdag o sa isang 8 sa kaso ng kubo at pagkatapos ay ibinabato na memorya ang layo sa lalong madaling ang pagdagdag o ang kubo function na babalik. Tanong. [Mag-aaral] Saan pangkalahatang variable na naka-imbak? Global variable ay naka-imbak sa kung ano ang kasalukuyang tinatawag na nasimulan na data o uninitialized data, pagkakaiba sa kung mayroon kang isang global variable at itinalaga mo agad ito ng halaga may equals sign, nagtatapos sa tuktok doon, at kung sabihin mo lang int x; na walang halaga, ito ay nagtatapos up bahagyang mas mababang RAM sa pamamagitan lamang ng convention. Iba pang mga tanong? Ayos lang. Kaya ang larawang ito ay bumalik dahil makakakuha tayo ng mas malakas na sa kung ano ang maaari naming gawin sa mga computer, ngunit sa ngayon, sabihin may isang maikling panimula sa cryptography, ng isang partikular na uri ng cryptography na hindi malutas ang lahat ng problema sa mundo ngunit hindi malutas ang ilan sa mga ito. Sa kasong ito dito, mayroon kaming isang bagay na tinatawag na lihim-susi cryptography. Sekreto ng-key cryptography, ng pangalan nagmumungkahi, derives nito seguridad mula sa isang lihim. Halimbawa, kung ikaw ay bumalik sa mababang paaralan at ikaw ay pagpasa ng isang maliit na lihim na pag-ibig na sulat sa batang lalaki o babae ikaw ay pagyurak sa, kung gusto mo upang pumasa na tala sa pamamagitan ng madla, malamang na hindi isulat ang tulad ng isang tala sa Ingles o anumang iyong katutubong wika ay. Sa halip, maaari mong i-encrypt ito o maaari mong ipadala ang mga ito ng isang text message na mga araw na ito. Ngunit maaari mong aktwal na ipasa ang mga ito ng tala sa buong silid-aralan. At upang gawin ito nang secure sa paraan na ang iyong mga kaibigan at ang guro hindi alam kung ano ang sumusulat ka, maaari kang makabuo ng isang medyo simpleng algorithm, batang bagaman maaari mong, sa makatarungan mang-uayabit ang mga salita. Kaya sa halip ng pagsusulat ng maaari mong isulat ang b, sa halip na b maaari mong isulat ang c, sa halip na c maaari mong isulat ang d, at iba pa. O maaari kang makabuo ng isang mas sopistikadong pagsasalin ng mga titik sa ibang mga titik. Subalit catch ay ang mga batang lalaki o babae sa kung kanino ka pagpapadala ng talang ito pangangailangan na malaman ang isang bagay, na ano, malinaw naman? >> [Mag-aaral] Ano ka pagpapadala. Ano ang iyong lihim ay, tulad ng kung ano ang na sa pagmamapa sa pagitan ng isang at b ang at c at d's. Ay ito lamang pagdaragdag ng 1 sa bawat isa ng ang mga titik upang pumunta mula sa isang b, b sa c? Mas kumplikado kaysa sa? Kaya ka at ang iyong crush ay kailangang magkaroon ng lihim na impormasyon na ito, ngunit ang uri ng isang catch-22 dito. Kung ito ang unang pagkakataon na iyong pagpapadala ng pag-ibig sulat na ito sa pamamagitan ng klase, paano na batang lalaki o babae upang malaman kung ano ang lihim ang kahit? Kaya lihim-susi crypto ay hindi malutas ang lahat ng problema sa mundo, at may aktwal na relasyon dito na kami bumalik sa patungo sa pagtatapos ng semestre. Katulad nito ang karamihan sa atin hindi alam ng isang tao na gumagana, halimbawa, sa Amazon.com, at pa marami sa atin na marahil bumili ng mga bagay-bagay sa Amazon.com, at kami ay itinuro sa ipagpalagay na ang mga transaksyong e-commerce ay secure na. Ang URL ay malamang sabi ni https, mayroong maaaring ulok maliit na icon na padlock sa isang lugar, may ilang mga uri ng cryptography sa pag-secure ang impormasyon ng iyong credit card sa pagitan mo at Amazon.com. At pa kung cryptography nagsasangkot alam ilang lihim at hindi pa ko alam ang sinuman sa Amazon at tiyak ko na hindi isagawa ang anumang uri ng lihim may isang tao sa Amazon, kung paano ang aking computer o aking browser paggawa nito? Lumiliko out may iba pang mga uri ng cryptography sa kabuuan na malutas ang problemang. Ngunit ngayon, makikita naming tumuon sa simpleng kung saan maaari mong ayusin nang maaga upang malaman ang ilang mga lihim tulad ng +1 o ilang pagmamapa sa pagitan ng isang at b. At ang proseso ng cryptography sa pangkalahatan ay nagsasangkot ito. Mayroon kang ilang mga plain text, itinatanghal dito sa kaliwa, mong patakbuhin ang mga ito sa pamamagitan ng ilang uri ng algorithm o pamamaraan para sa pag-encrypt ito - siguro na lamang nagiging b, b magiging c - at pagkatapos mo magtapos sa ciphertext. Samantala, sa sandaling ang iyong crush natatanggap ito lihim tandaan, siya ay may pagkatapos ay i-decrypt ito sa pamamagitan ng pangkalahatang pagtaliwas na algorithm upang makakuha ng plain text. May mga pisikal na anyo ng mga ito. Halimbawa, ito ay isang maliit na lihim na decoder ring, at ito ay isang ring sa kamalayan na may dalawang dials dito. Sa labas paligid ng bagay na ito, may titik A sa pamamagitan ng Z, bagaman sila sa random na pagkakasunod-sunod, at sa loob, may aktwal na ilang numero tulad na may singsing na ito maaari mong uri ng i-sa labas ngunit hindi sa loob ng upang pumila mga numero sa mga titik. Mula sa isang pelikula na tinatawag na A Christmas Story, makikita mo na maliit Ralphie kaya sabik upang malaman kung anong lihim na mensahe ng Little ulila Annie sa kanya na ay Nakipag-ugnayan, sa tingin ko, sa anyo ng mga numeric na mensahe sa isang kahon ng cereal at mayroon kang upang maipon ang lahat ng mga maliit na card na dumating sa kahon ng cereal, mayroon ka sa mail na ito sa, mayroon kang upang makuha ang lihim na decoder ring sa gayon maaari mong wakas malaman kung ano ang pagma-map sa pagitan ng mga titik at numero o titik at letra. Paano sa isang computer, maaari naming pumunta tungkol sa pagpapatupad o kumakatawan ng mga bagay na tulad nito? Kailangan namin ng isang paraan ng pagpapahayag ng ating sarili ng kaunti pa flexibly kaysa sa aming mga variable sa gayon ngayon pinayagan. Nagkaroon kami ng ints, nagkaroon kami ng char, kami ay may sa kamay at Doubles at ng ilang mga iba, ngunit ang mga indibidwal na mga piraso ng memorya na hindi talaga-daan sa amin upang ipahayag ang mga bagay tulad ng mga salita at mga pangungusap at mga parirala. Sa katunayan, namin ang tinatawag na tulad string bagay, ngunit ipinapangako namin na ito ay talagang lamang pagpapagaan sa CS50 library na kami ay nagbabalak bumalik sa alisan ng balat. At kaya sabihin simulan upang gawin iyon dito. Hayaan akong sige at buksan up ng isang file - lahat ng mga file na ito ay magagamit, gaya ng dati, online - tinatawag array.c upang malutas ang isang problema na hindi nauugnay sa string ngunit na paints ng isang larawan dito kung paano maaari naming gamitin ang isang bagay na tinatawag na isang array. Isang array ay isang uri ng data. Ito ay isang uri ng variable ng uri na may maramihang mga mas maliit na mga uri ng data sa loob nito bumalik upang i-back i-back upang i-back. Kaya halimbawa, kung gusto naming magsulat ng isang maliit na programa na nagbibigay sa iyo ng iyong pagsusulit average para sa isang kurso tulad ng 50 na may 2 pagsusulit, maaari mong napaka madaling isulat ang programang ito batay kahit sa ilan sa materyal huling linggo sa pamamagitan ng paggamit ng GetInt at ng ilang mga variable: int quiz1, int quiz2. At ito ay medyo direkta. Ito ay maaaring 10, 20 linya ng code max ipatupad ang isang programa na nagtatanong sa gumagamit para sa 2 mga marka ng pagsusulit at pagkatapos computes kanilang average sa pamamagitan ng pagdaragdag sa mga ito nang sama-sama, paghahati ng 2, at pagkatapos ay pag-print ang mga resulta. Namin malamang gawin na medyo kaagad ngayon pagkatapos ng ilang bilang ng mga minuto. Ngunit ang problema ay na ipagpalagay na 50 ay may 3 mga pagsusulit o 4. Ipagpalagay na nais mong gamitin ang parehong programa para sa isang klase na nagkaroon lingguhang pagsusulit. -Isip tungkol sa isang klase na lingguhang pagsusulit. Kung may 16 o kaya linggo sa isang semestre, na ngayon ay mayroon kang 16 variable: int quiz1, int quiz2, int quiz3, int quiz4. Sa lalong madaling simulan mo nakikita ang kalabisan, ang pagkopya at paglalagay ng code, dapat itong magsimula sa nais mong mayroong isang mas mahusay na paraan. At thankfully, dahil sa array. Kaya sabihin gawin ito. Una, hayaan mo akong ipakilala ang isang napaka-simpleng bagay na hindi namin ginagamit sa gayon ngayon, ngunit makikita mo ang mga ito paminsan-minsan sa code. Ito ay kung ano ang pangkalahatan ay tinatawag na isang pare-pareho. Kaya ito ay isang pare-pareho sa kamalayan na ang halaga na ito ay hindi kailanman nagbabago. Ang tao convention kapag lumilikha ng isang pare-pareho ay upang gamitin ang lahat ng mga malalaking titik lamang kaya na talaga ito ay nakatayo sa iyong code, at ang mga espesyal na keyword na gamitin mo sa C # tukuyin. Kaya sinasabi namin # tukuyin, pagkatapos ng isang puwang, pagkatapos ay ang salita na gusto mong gamitin para sa pangalan ng pare-pareho at pagkatapos ay ang halaga ng pare-pareho. Mapansin ito ay naiiba mula sa nagtatalaga ng isang bagay sa isang variable. Walang katumbas mag-sign, ang walang semicolon. Ito ay kung ano ang karaniwang kilala bilang isang Preprocessor panuto, ngunit higit pa sa na ng isa pang oras. Sa ngayon, ito ay lumilikha ng isang walang pagbabago na halaga na tinatawag na Pagsusulit na ang aktwal na numerong halaga ay 2. Kaya kahit saan mo ang pagsusulit, Pagsusulit, Pagsusulit sa buong ang file na ito, na lamang ang bilang 2. Kung titingnan ko sa pangunahing ngayon, sabihin makita kung paano ito gumagana. Unang mukhang ng kaunti misteriyoso, ngunit ito ang lahat ng mga bagay-bagay mula sa linggo 1. Magtanong ng gumagamit para sa mga grado. Paano namin gawin ito? Sa linya 22 - ito ay talaga ang makatas bahagi - idedeklara ko ng Float ngunit hindi lamang ng isang solong Float. Ako deklarasyon, sa halip, ang isang hanay ng mga lumulutang-point na halaga. Na variable na tinatawag na grado, tulad ng ipinahiwatig dito, ngunit ang tanging piraso ng bagong syntax pagkatapos ay ang mga square bracket. Ang katotohanan na ang ko ang sinabi Float grado at pagkatapos ay bukas bracket at pagkatapos ay isang numero - mapansin kung ito ay patuloy na ito ay tulad ng ginawa namin ito - ang ibig sabihin nito, "Hey computer, ninyo ako 2 kamay at sabihin sama-sama tumawag sa kanila grado." Ito ay sa kaibahan sa isang mas nakakapagod proseso tulad nito: Float grade1; lumutang grade2; at iba pa. Kaya array ng isang nagbibigay-daan sa amin upang ipatupad ang ideya ngunit higit na mas mababa messily, sa ganitong paraan namin isulat ang 1 linya ng code sa halip ng, sabihin nating, 16 para sa isang 16-linggo na semestre. Hindi ko gusto sa hard-code 2 dahil kung sa tingin mo tungkol dito ngayon lohikal, ipagpalagay na sa susunod na taon CS50 mga pagbabago sa 3 Pagsusulit sa halip at ako ay ang bilang 2 dito, ako ay ang bilang 2 dito, Ay ang bilang 2 ko dito, ang numero 2 dito. Nagiging napaka nakakapagod at mas madali upang sirain at sa aksidenteng baguhin ang 1 halaga sa 3 at makaligtaan ang ilang iba pang mga halaga ng 2. Kaya ako ng pagpunta sa halip abstract ito ang layo at gamitin ito pare-pareho na, bilang ang pangalan nito nagmumungkahi, hindi kailanman ang mga pagbabago. At ngayon, kahit na kung mayroon kaming iba't ibang mga pagsusulit sa taong ito o sa susunod na, Ko na lang ay upang baguhin ito sa isang lugar dito sa itaas. Kaya na ang lahat ng pare-pareho. Samantala, ang bagong tampok ng haka-haka na ng isang array. Kaya ang mga square bracket ay nagbibigay sa akin ang ganito karaming mga kamay at hinahayaan tumawag sa akin sama-sama ang mga ito grado dito. Kaya ngayon sabihin makita kung ano ako pagpunta sa gawin. Narito sa linya 24 sa simula ng isang para sa loop. Ito ay talagang walang magarbong. Lamang ito gamit ang Pagsusulit sa halip ng isang hard-code na numero. Ngunit mayroong walang intellectually ibang doon mula sa nakaraang linggo. Ito lamang printf, kaya printf ("Pagsusulit #% d ng% d:") dahil gusto ko lang i-print ninyo akong bigyan pagsusulit bilang 1 ng 2 at pagkatapos 2 ng 2. Kaya ito ay isang bagay na pulos Aesthetic. Ngunit ngayon ang kawili-wiling bahagi sa linya 27. Upang punan sa isa sa dalawang mga placeholder na may lumulutang-point na halaga, ka na muling gumamit ng mga square bracket. Sa kasong ito, gumagamit ako ng i dahil ang ito para sa loop ay nagsimula sa i katumbas kung ano ang halaga, tila? [Mag-aaral] 0. >> [Malan] 0. Kaya sa unang pag-ulit na ito loop, na parang sinulat ni ko ito sa code, ngunit sa ang pangalawang pag-ulit ng loop na ito, na kahit na sinulat ni ko ito sa aking code. Ngunit ang katotohanan na gumagamit ako ng isang variable ay perpekto dahil, bilang ang pangalan ay nagmumungkahi, ito iba't ibang nito halaga sa bawat pag-ulit, kaya ako pinupunan ito array isang lugar sa isang pagkakataon. Ano ang array na ito hitsura? Ang dahilan iginuhit ko ang napaka-simpleng parihaba sa screen dito bago ay para sa kadahilanang ito. Array isang ay isang tipak ng memorya na sinundan sa pamamagitan ng isa pang tipak ng memory sinundan ng isa pang tipak ng memory at iba pa. Kaya kung ang aking array ng laki 2 dito sa kasong ito, ang lahat ng Gusto ko ang paggawa ng sa pamamagitan ng pag-type sa aking mga marka ng pagsusulit gusto dito - Nakatanggap ako ng 100 sa isang ito at pagkatapos Nakatanggap ako ng 99 sa isang ito - memory na ito ay maaaring hindi kahit gamitin dahil lamang tatanungin ko ang computer para sa isang hanay ng mga laki 2. Yaong mga parisukat ay pa rin doon, sa kanan? Mayroon ka pa ring 2 gigabytes ng RAM kahit na lamang ka humihingi ng 2 kamay. Kaya ang ideya sa likod ng mga array ay computer na iyon lamang tumatagal ng isang tipak ng memory at pagkatapos apportions mas maliit na piraso pabalik upang i-back i-back upang i-back. At sa gayon ay ang lahat ng array ay isang. Isang magkadikit na tipak ng memory sa loob ng kung saan maaari kang maglagay ng mga bagay. Ito ang mangyayari pagkatapos lamang ilang pagbubutas aritmetika. Kung mag-scroll pababa ko dito, ito ay kung saan ako umulit sa ibabaw ng array. Dumating ko na ang kabuuan ng lahat ng mga halaga sa array, at pagkatapos ay gamitin ko ang pag-ikot ng pagpapaandar dito upang aktwal na gawin ang kabuuan na hinati sa pamamagitan ng pagsusulit. Ngunit ipaalam sa akin iwagayway ang aking kamay sa na bilang uri ng sapat na pang-aritmetika sa ngayon. Ngunit ang lahat na ginagawa para sa akin sa huli ay compute ng isang average. Kaya unang pagsusulit kasama ang pangalawang pagsusulit na hinati sa pamamagitan ng 2 at pagkatapos ay pag-print ito bilang isang int. Ngunit natin ngayon paglipat sa ibang halimbawa na tinatawag string1, na paints isang katulad na larawan ngunit gamit ang string. Hayaan akong magpatuloy at pasimplehin ito para sa sandali lamang. Patawarin ang indentation sa ngayon. Abiso sa linya 19 ng halimbawang ito, nakakuha ako ng string mula sa user. Ngunit mapansin kung ano ang susunod na ako ginagawa sa linya 22 pasulong. Iterating aktwal ako mula sa i hanggang sa - at ito ay isang bagong nanlilinlang - strlen, haba ng string. Ito ay isang function na may C na kung pumasa ka ng isang string, ay nagsasabi sa iyo kung gaano karaming mga character ay na string. Iyon lang. At ang katotohanan na ito ay strlen halip ang haba ng string ay dahil lang sa ito ay higit pa maikli at malinaw. Tatlumpung taon na ang nakakaraan, tao ang gumusto na magsulat ng mga bagay pati na succinctly hangga't maaari, kaya nagbigay kami iningatan ng convention na dito. i + + lamang nangangahulugan dagdagan i sa bawat pag-ulit. At ngayon ay mapapansin na ito, na kung saan ay talagang kawili-wili. Sa ika-24 linya, sinasabi ko, "Computer, bigyan ako ng isang character, 8 bit, at tumawag ito c." Ngunit ano ito sa sa kanang bahagi sinasabi? Sa Ingles, ano na kumakatawan? [Mag-aaral] Ang unang character sa array. Eksakto. Bigyan ako ang unang character sa array. O, mas pangkalahatan, magbibigay sa akin ith character sa array. At Napagtanto ito mahalaga ngayon na bilang computer na siyentipiko, aktwal na kami ay pagbibilang mula 0. Hindi mo na kailangang ngayon ang pagpapasya upang simulan ang paggawa nito. Ngayon ay mayroon kang upang kumilos alinsunod sa mga inaasahan ng computer at ang bilang mula 0 dahil [0] ay ang unang character sa isang string, [1] ay ang pangalawang, [2] ay ang ikatlong, at iba pa. Kaya programa na ito, kung makatipon ko ito, ito ay muli string1, kaya gumawa string1, at ngayon ko na patakbuhin ang string1 sa aking terminal na window. Ito ay naghihintay para sa input, kaya ako i-type sa David, Ipasok ang, at ngayon ito ng mga Kopya David lahat sa iba't-ibang linya dahil paunawa kung ano ang ako ginagawa. Ako pag-print ng isang character sa isang pagkakataon. Hindi namin pumunta sa detalye ngayon sa, ngunit ko inalis ang isang sandali ang nakalipas ang pagsusuring ito dito. Ito lumiliko out na kung ang user ay magulo, adversarial, o nalilito, maaari mong aktwal na hindi magbigay ng isang string ng ilang haba. Kung ikaw pindutin ang maling key sa keyboard, maaari mong bigyan ang walang string sa lahat, o kung ikaw ay nakahahamak na, maaari mong subukang i-paste sa isang gigabyte halaga ng isang sanaysay upang punan ang string na ito, at kung ang computer ay nagpapatakbo ng memorya, ito lumiliko out na kami ay pagpunta upang makabalik ito espesyal na halaga na tinatawag na null. Kaya sa ngayon, alam na may ito espesyal na halaga na tinatawag na null na magbibigay-daan sa amin upang suriin kapag hindi namin ng memorya, bukod sa iba pang mga bagay. Ngunit kung buksan ko up ngayon string2, mapansin ang isang pagkakaiba dito. Mapansin ang isang pagkakaiba dito sa string2. Na may string2, ito para sa loop ng kaunti ibang. Hayaan akong tanggalin ang NULLs upang maaari naming makipag-usap tungkol sa mga ibang oras. Ano ang iba't ibang tungkol sa para sa loop oras na ito? Maaari ba akong bumalik sa nakaraang halimbawa. Kaya na bersyon 2, ito ay bersyon 1. 1, 2. 1, 2. Ang strlen tawag ay kung saan? Sa unang bahagi ng para sa loop. Anumang saloobin sa kung bakit ako ginagawa ito? Oo. [Mag-aaral] Kaya hindi mo tawagan ang function na bawat solong oras. [Malan] Kaya hindi namin tawagan ang function na bawat solong oras. Eksakto. Manariwa sa diwa mula sa para sa loop na nila ang napaka-simpleng sabay-sabay uri ng maunawaan na ito ay ang Pinasimulan, kundisyon, at ang pag-update. Ang problema ay na ang kundisyon na ang mangyayari sa bawat pag-ulit ng loop. At kaya sa halimbawang ito dito, kung ano ang masamang tungkol sa mga katotohanan na ito ang aking kondisyon? [Mag-aaral] ka pagtawag strlen. [Malan] ka pagtawag strlen muli at muli at muli. Ngunit sa sandaling nai-type ko sa David, ang haba ng string na 5, at hindi ito upang baguhin sa bawat pag-ulit ng loop dahil ang string na ang pa rin ang D-a-v-i-d. Kaya ito ay isang pahiwatig sa kung ano ang pagpunta sa maging isang ideya na nagiging mahalaga na kilala bilang isang disenyo desisyon kung saan lamang huwag gumawa computer ng hindi kinakailangang trabaho. Tulad ng sneak preview ng pset2, pset2 sa standard edition pagpunta sa tutulan mong aktwal na ipatupad ng ilang bilang ng mga ciphers, ilang bilang ng mga algorithm ng pag-encrypt, sa gayon maaari mong parehong i-encrypt at i-decrypt lihim mensahe tulad ng isang Ralphie doon decoded. Sa Hacker edisyon ng pset2, kami ay pagpunta sa pumunta ng kaunti karagdagang. Kami ay pagpunta sa ipasa mo ang isang file mula sa isang aktwal na sistema ng computer na na naglalaman ng isang buong grupo ng mga username at aktwal na naka-encrypt na password, at ang hamon para sa edisyon ng Hacker na sa magpahaginit mga password at malaman kung ano ang cryptography o kung ano ang lihim ay ginagamit upang aktwal na bumuo ng mga password. At kami ay pagpunta sa gawin ito sa pamamagitan ng paggamit ng isang bagong tampok dito ng C Bibigyan kita lamang ng isang demo ng kilala bilang command-line argumento. Ito lumiliko out, ng ilan sa inyo ay maaaring makikita sa seksiyon o sa mga aklat-aralin, pangunahing ay hindi palaging upang maging walang bisa sa panaklong. Ito lumiliko out na ang pangunahing maaari ring nakasulat tulad nito, may dalawang argumento, argc at argv, kung saan ang argc ay ang bilang ng mga salitang na nag-type ka pagkatapos ng pangalan ng programa sa iyong command line at argv ay ang aktwal na mga salita. At ng mga square bracket doon iminumungkahi, ang argv ay tila isang array. Ito ay pagpunta sa isang string pagkatapos ng isang string pagkatapos ng isang string sa memory. Kaya kung ano ang kami ay pagpunta sa gawin na nagsisimula sa pset 2 ay isang bagay tulad nito. Kung gumawa ako ng argv1, kung saan ay isang halimbawa magpapadala kami bumalik sa Monday, at patakbuhin ito, mapapansin na ito ay hindi mukhang gawin pa. Ito lamang mga Kopya sarili nitong pangalan. Ngunit kung sabihin ko paalam klase, notice na ang programang ito ay tila iterates sa bawat isa ng mga salita na na-type sa prompt. At ang mga paraan sa pamamagitan ng kung saan kami ay makakuha ng access sa mga salita na ang gumagamit ay nai-type sa prompt sa pamamagitan ng pagbabago ng pangunahing nagsisimula ito weekend mula int pangunahing (walang bisa) int pangunahing (argc, argv) at samakatuwid ay ipinanganak command-line na mga argumento. At kapag kumuha ka ng talagang sopistikadong sa, magagawa mong upang sumulat ng mga programa na talagang trippy tulad ng isang ito dito, na napupunta sa itaas at lampas ilan ng ang pag-andar tapos kami na sa gayon ay malayo ngunit lahat ng medyo malakas na. Kaya makikita iwanan namin ito na may ganitong sa screen, at kami ay nakikita mo sa Lunes. [CS50.TV]